From: R. Steve McKown Date: Tue, 8 Dec 2009 23:09:56 +0000 (-0700) Subject: Pristine nesc-1.3.0. X-Git-Tag: upstream/1.3.0 X-Git-Url: https://oss.titaniummirror.com/gitweb/?p=nesc.git;a=commitdiff_plain;h=57d4530c4d6814fa25338a00cc65b95938c723b6 Pristine nesc-1.3.0. --- 57d4530c4d6814fa25338a00cc65b95938c723b6 diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..60549be --- /dev/null +++ b/COPYING @@ -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. + + + Copyright (C) 19yy + + 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. + + , 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. diff --git a/COPYRIGHT b/COPYRIGHT new file mode 100644 index 0000000..fc2fc6f --- /dev/null +++ b/COPYRIGHT @@ -0,0 +1,28 @@ +The nesC compiler is derived from RC and the GNU C Compiler. It is thus + Copyright (C) 1987, 88, 89, 92-7, 1998 Free Software Foundation, Inc. + Copyright (C) 2000-2001 The Regents of the University of California. + Copyright (C) 2002-2006 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. + +-- + +The Java classes that provide support for reading nesC's XML output are + Copyright (c) 2004-2006 Intel Corporation + +These file are distributed under the terms in the attached INTEL-LICENSE +file. If you do not find this file, copies can be found by writing to +Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, +94704. Attention: Intel License Inquiry. diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..0c9a88a --- /dev/null +++ b/INSTALL @@ -0,0 +1,25 @@ +To build nesC: in this directory +./configure [--prefix=/lib/ncc/editor-modes//readme.txt + +To use nesC with TinyOS, you need to install the ncc, mig, etc TinyOS +frontends for nesC. These are found in tinyos-1.x/tools/src/ncc (for TinyOS +1.x) and in tinyos-2.x/tools (for TinyOS 2.x). Please follow the +installation directions you find there. + +To use nesC with the Atmel AVR processors or the TI MSP processors you +need the avr-gcc and msp430-gcc packages, and the corresponding GNU +binutils (avr-binutils and msp430-binutils respectively). + +You can use the patched versions of these binutils that allow $ in +symbol names, available from http://www.tinyos.net/dist-2.0.0 (check +http://www.tinyos.net/download.html to see if newer versions are +available), or you can pass the -fnesc-separator=__ option to nescc (ncc +if using TinyOS) to use __ rather than $ in generated code. See the +nescc man page for details. diff --git a/INTEL-LICENSE b/INTEL-LICENSE new file mode 100644 index 0000000..add289e --- /dev/null +++ b/INTEL-LICENSE @@ -0,0 +1,28 @@ +Intel Open Source License + +Copyright (c) 2002 Intel Corporation +All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + Neither the name of the Intel Corporation nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR ITS +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..2921812 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,28 @@ +AUTOMAKE_OPTIONS = foreign + +SUBDIRS = libcpp libiberty src doc tools + +# gcc directories aren't automake-friendly +DIST_SUBDIRS = src doc tools +gcc_SUBDIRS = include libcpp libiberty + +src: libcpp libiberty + +EXTRA_DIST = \ + COPYING \ + COPYRIGHT \ + INSTALL \ + INTEL-LICENSE \ + README \ + config-aux/acx.m4 \ + config-aux/codeset.m4 \ + config-aux/gettext-sister.m4 \ + config-aux/move-if-change \ + config-aux/no-executables.m4 \ + config-aux/warnings.m4 + +dist-hook: + for i in $(gcc_SUBDIRS); do \ + (cd $$i; make distclean); \ + tar cf - -X $$i/.distignore $$i | tar xf - -C $(distdir); \ + done diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 0000000..209579d --- /dev/null +++ b/Makefile.in @@ -0,0 +1,599 @@ +# Makefile.in generated by automake 1.10 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +subdir = . +DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(top_srcdir)/configure COPYING INSTALL \ + config-aux/config.guess config-aux/config.rpath \ + config-aux/config.sub config-aux/depcomp config-aux/install-sh \ + config-aux/missing config-aux/mkinstalldirs +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(SHELL) $(top_srcdir)/config-aux/mkinstalldirs +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + { test ! -d $(distdir) \ + || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -fr $(distdir); }; } +DIST_ARCHIVES = $(distdir).tar.gz +GZIP_ENV = --best +distuninstallcheck_listfiles = find . -type f -print +distcleancheck_listfiles = find . -type f -print +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EXEEXT = @EXEEXT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build_alias = @build_alias@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host_alias = @host_alias@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pathperl = @pathperl@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +subdirs = @subdirs@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = foreign +SUBDIRS = libcpp libiberty src doc tools + +# gcc directories aren't automake-friendly +DIST_SUBDIRS = src doc tools +gcc_SUBDIRS = include libcpp libiberty +EXTRA_DIST = \ + COPYING \ + COPYRIGHT \ + INSTALL \ + INTEL-LICENSE \ + README \ + config-aux/acx.m4 \ + config-aux/codeset.m4 \ + config-aux/gettext-sister.m4 \ + config-aux/move-if-change \ + config-aux/no-executables.m4 \ + config-aux/warnings.m4 + +all: all-recursive + +.SUFFIXES: +am--refresh: + @: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \ + cd $(srcdir) && $(AUTOMAKE) --foreign \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + $(am__remove_distdir) + test -d $(distdir) || mkdir $(distdir) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + distdir=`$(am__cd) $(distdir) && pwd`; \ + top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$top_distdir" \ + distdir="$$distdir/$$subdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + distdir) \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook + -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r $(distdir) +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) + +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 + $(am__remove_distdir) + +dist-tarZ: distdir + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__remove_distdir) + +dist-shar: distdir + shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz + $(am__remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__remove_distdir) + +dist dist-all: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir); chmod a+w $(distdir) + mkdir $(distdir)/_build + mkdir $(distdir)/_inst + chmod a-w $(distdir) + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && cd $(distdir)/_build \ + && ../configure --srcdir=.. --prefix="$$dc_install_base" \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck + $(am__remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' +distuninstallcheck: + @cd $(distuninstallcheck_dir) \ + && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-exec-am: + +install-html: install-html-recursive + +install-info: install-info-recursive + +install-man: + +install-pdf: install-pdf-recursive + +install-ps: install-ps-recursive + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ + install-strip + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am am--refresh check check-am clean clean-generic \ + ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \ + dist-hook dist-shar dist-tarZ dist-zip distcheck distclean \ + distclean-generic distclean-tags distcleancheck distdir \ + distuninstallcheck dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags \ + tags-recursive uninstall uninstall-am + + +src: libcpp libiberty + +dist-hook: + for i in $(gcc_SUBDIRS); do \ + (cd $$i; make distclean); \ + tar cf - -X $$i/.distignore $$i | tar xf - -C $(distdir); \ + done +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/README b/README new file mode 100644 index 0000000..531b3cc --- /dev/null +++ b/README @@ -0,0 +1,286 @@ +This is version 1.3.0 of the nesC compiler. + +Installation instructions are in INSTALL. + +Changes in nesC 1.3.0 +===================== +- C preprocessor is integrated into nesC, which should significantly speed + up compilation (esp. on Windows) + +- support for the Deputy type-safety-for-C system (see + deputy.cs.berkeley.edu). To use Deputy, you add type annotations to + your nesC code, then compile with the -fnesc-deputy flag. A bunch of + small changes to nesC support the use of deputy. + + Flags to nescc: + -fnesc-deputy: use Deputy in this compilation. You need to have + a version of Deputy customized for use with nesC installed for + this to work. + -fnesc-deputy-args: extra arguments to pass to Deputy. + -fnesc-default-safe/-fnesc-default-unsafe: the default safety for + C functions and nesC modules (with no option specified, + -fnesc-default-unsafe is assumed) + + Type annotations: NONULL, COUNT(...), etc (see the Deputy-for-nesC + documentation for full details), which are actually macros which + expand to nesC attributes (@nonnull(), @count(...), etc. Using macros + allows Deputy-annotated code to be used with earlier versions of nesC. + + Type annotations in nesdoc comments: to reduce clutter for non-Deputy + users, Deputy's annotations can be placed within a nesdoc comment + rather than in a function signature (which then looks like a regular + C signature): + /** ... @param 'int *@count(n) x' x is an array of n ints ... */ + void f(int *x, int n); + is the same as + void f(int *@count(n) x, int n); + Macros can be used in the comment, so the above could also be + /** ... @param 'int *COUNT(n) x' x is an array of n ints ... */ + void f(int *x, int n); + where COUNT(expr) expands to @count(expr). + +- internal support (in nesc1) for Deputy based on @deputy_scope() and + @macro("NAME") attributes, and a -fnesc-genprefix= option. + +- @macro() and -fnesc-genprerix= may be useful in other contexts too: + if a nesC attribute declaration has an @macro() attribute: + struct @myattr @macro("MYMACRO") { int x; char *y; }; + then uses of @myattr in nesC source are output as calls to MYMACRO in + nesC's intermediate C output. For instance + int x @myattr(23, "fun"); + becomes + int x MYMACRO(23, "fun"); + The -fnesc-genprefix= adds to the start of the generated C + output, e.g., it could be a #define definition for MYMACRO, or a + #include of a file with appropriate definitions. + +- wide strings in XML output now show up as arrays of bytes (and follow + the target's byte-level representation of wide strings) + +- ability to process a C file through nesC (this provides support in C for + external types, atomic statements and unique), as follows: + nescc -x nesc .c + This forces nescc to pass the C file .c through the nesC compiler + (normally it would be sent to the regular C compiler), which will process + the nesC extensions and then compile the generated C code with the regular + C compiler (or whatever compiler was specified with -fnesc-gcc=...) + +- inside a module, you can now write void f(void) or void f() interchangeably + + +Changes in nesC 1.2.9 +===================== +- added uniqueN constant function to allocated N consecutive numbers +- fix -fnesc-separator +- bug fixes + +Changes in nesC 1.2.8a +====================== +- bug fixes + +Changes in nesC 1.2.8 +===================== +- -fnesc-cppdir option to save preprocessed output +- -fnesc-separator option to change symbol separator from $ in generated code +- little-endian bitfields now supported in network types (thanks to + Matti Juhani Ã–hman for the approach and some of the code) +- internal errors try to report current source location (can be helpful in + tracking down problems, but only works for errors that occur during parsing) +- updated vim mode from Cory Sharp (cory@moteiv.com) +- bug fixes + +Changes in nesC 1.2.7a +====================== +- nescc-diff removed (it was unsupported, ran only on AVR, and depends on guile + being installed to work) + +Changes in nesC 1.2.7 +===================== +- gcc's mode attribute support (this requires a new word_size specification + in the env target) +- bug fixes + +Changes in nesC 1.2.6 +===================== +- external types now support bitfields (big-endian only - mixing bit-field + endianness within a struct would be extremely confusing and/or tricky) +- -conly option to just compile to C +- better struct/union layout code, which requires a slightly more detailed + target machine description (see src/machine.h) +- #pragma statements are saved and dumped at the end of the generated C code + (if you or your compiler uses #pragma, you'll probably have to move these + somewhere else; however, this cannot be done without understanding of + the pragma itself; hence the nesC compiler leaves this process to a + user-supplied tool) +- bug fixes + +Changes in nesC 1.2.5 +===================== +- nescc-mig now generates C (ncg has supported C since 1.1.2) +- add __builtin_offsetof keyword to make recent gcc's happy, + and update the gcc-specific asm syntax to reflect recent + gcc changes +- allow types defined in interface files to be used immediately in generic + interface arguments (e.g., interface Timer, where TMilli is + defined in Timer.nc) +- updates to automatic inlining - code should be slightly smaller +- @spontaneous() attribute is automatically added to the __nesc_XXX + functions used by the compiler +- atomic optimisation (experimental): if you specify -fnesc-optimize-atomic, + two optimisations are performed: + o outermost atomics call __nesc_disable/enable_interrupt, which can assume + that interrupts are initially enabled + o "simple" atomic statements have no overhead (interrupts are not disabled) + simple atomic statements are those: + - with no accesses to shared state + - or, at most one access to one byte of shared state +- bug fixes + +Changes in nesC 1.2.4 +===================== +- bug fixes + +Changes in nesC 1.2.3 +===================== +- provide network type information in nesC dump output +- bug fixes + +Changes in nesC 1.2.2 +===================== +- nescc-wiring tool to check wiring constraints - see man page for details +- python mig, ncg support +- XML schema update (should now match nesC dump output) +- Java code now made available in compiled form as nesc.jar (rather than + in source form) +- bug fixes + +Changes in nesC 1.2.1 +===================== +- external types (nx_...) can now be passed as parameters and returned as + results +- updates to XML dump information to support nesdoc + in particular, remember typedef names +- bug fixes + +Changes in nesC 1.2 +=================== +- generic components and interfaces. See doc/user/generics-1.2.txt. + nesdoc does not support generic components and interfaces (this should be + supported in the next release). +- configuration implementations and component specifications can now + include type and constant declarations; configuration implementations + can refer to these types and constants. These changes are described + alongside the generic component changes, in doc/user/generics-1.2.txt. +- attributes (Java 1.5-style). See doc/user/attributes.txt. +- binary components. See doc/user/binary-components.txt. +- external types, a revamp of nesC 1.1.3's network types. See + doc/user/network-types.txt. +- "includes" is deprecated - use #include instead; note that you + must use #ifndef/#define/#endif for #include'd files in the usual + C style. +- macros in included files now work in ways that are similar to C + (as long as you use #include instead of includes). +- support for compiling task/post into an interface + wiring: this + allows the scheduler to be implemented as a component. +- return can be used in atomic statements (implicitly terminating + the atomic statement). +- the patched AVR assembler has been unbundled from nesC. +- the ncc, mig and nesdoc scripts have been unbundled from nesC (they + are now distributed with the other TinyOS tools). + +Changes in nesC 1.1.3 +===================== +- network types: platform-independent types to support heterogeneous + networking. See doc/network-types.txt. +- support passing assembler options for nesC programs with -Wa, as usual w/ gcc +- support -I- correctly (see gcc manual) +- initialiser bug fix (some initialisers crashed nesC) + +Changes in nesC 1.1.2 +===================== +- Misc bug fixes (in particular, work around latest-cygwin weirdness which + causes file corruption) +- Recognise the gcc noinline attribute and don't automatically inline such + functions (patch contributed by Klaus Madsen, nesc@hjernemadsen.org) +- Mac OS X support; avr-gcc not needed when compiling nesC +- Support gcc's -I- idiom to prevent searching current dir for components, + interfaces, etc. +- 64-bit platform support: compile with -DLARGE_ADDRESSES, and + edit the MEMSLICE1 constant in src/libcompat.regions.c to be the number + of unused high-order bits on your platform +- ncg supports C (note that there's no C mig support yet) + +Changes in nesC 1.1.1 +===================== +- Support for platforms and sensorboards in directories other than + tos/platforms and tos/sensorboards: a platform or sensorboard + can be used if its directory is specified with an explicit -I directive + (see doc/ncc.html for details). +- support for Tython +- support -Wparentheses (warnings on statements like 'if (var = value) ...', + and other similar C pitfalls) +- nesC editing modes for emacs, vim and kde (kate, kwrite, kdevelop): + these are in tools/editor-modes, and get installed to + /lib/ncc/editor-modes. Read the appropriate readme.txt file + for installation directions +- msp430 and env targets (env gets the machine specification from an + environment variable and is intended to ease implementation of new + platforms, see doc/envtarget.html for details) +- new hwevent, atomic_hwevent attributes to tell nesC which functions + are interrupt entry points (hwevent: interrupt entry point, invoked + with interrupts enabled; atomic_hwevent: interrupt entry point, invoked + with interrupts disabled) - these should ease porting to new platforms +- new keywords (future use): abstract, component, extends, generic, new +- A few small bug fixes + +Changes in nesC 1.1 +=================== +- Support for new language features: + o atomic sections + o compile-time data race detection + o explicit marking of asynchronous (aka interrupt) code (async keyword on + commands and events) + o automatic combining of results of multiply-wired functions + o initialisers now supported on module variables + o uniqueCount() function to complement unique(), returning + the number of uses of the latter (useful for dimensioning arrays...) + +- new nesC warning flags/changes: + o -W[no-]unexpected-docstring is now -Wnesc-docstring, and defaults to off + o -W[no-]nesc-fnptr: warn for uses of function pointers + o -W[no-]nesc-data-race: turn on[off] compile-time data race detection + o -W[no-]nesc-async: warn [bug in alpha: error] if asynchronous code calls + synchronous code + o -W[no-]nesc-combine: warn when multiply wired functions do not have + a combining function defined on the result type. See tos.h for the + the combining function definition for result_t + o -Wnesc-all: same as -Wnesc-data-race -Wnesc-async -Wnesc-fnptr and + -Wnesc-combine + +- The NESC preprocessor symbol is defined to XYZ, where X is the major + version, Y the minor and Z the patchlevel. So nesc 1.1 defines NESC as 110 + +- Tool chain changes: + o ncc has been split into two files: ncc and nescc + TinyOS-specific code is in ncc, nescc is a "generic" nesC compiler + (nescc does not automatically include tos.h, and does not automatically + add the TinyOS directory structure to the search path) + o the -fnesc-include= option includes a C file before compiling + the requested component (used by ncc to include tos.h...) + You can specify several -fnesc-include=... options + o A hardware platform X can now more easily be added: + - create directory .../tos/platforms/X + - place a .platform file in .../tos/platforms/X. Look at existing + .platform files for inspiration. + o A sensor board Y can add directories to the search path if there is + a .sensor file in the .../tos/sensorboards/Y directory + (as with .platform, .sensor is just perl code so can modify the + variables used by ncc to achieve whatever effect is necessary) + o set-mote-id works for programs greater than 64K + +- New tool to extract (enum) constants from C code: ncg. Usage is similar + to mig. +- Debugging on mica supports with the Atmel JTAG ICE and the AvarICE + project (at http://sourceforge.net/projects/avarice) + +- Some improved error messages, miscellaneous bug fixes diff --git a/aclocal.m4 b/aclocal.m4 new file mode 100644 index 0000000..ce67b57 --- /dev/null +++ b/aclocal.m4 @@ -0,0 +1,862 @@ +# generated automatically by aclocal 1.10 -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006 Free Software Foundation, Inc. +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +m4_if(m4_PACKAGE_VERSION, [2.61],, +[m4_fatal([this file was generated for autoconf 2.61. +You have another version of autoconf. If you want to use that, +you should regenerate the build system entirely.], [63])]) + +# Copyright (C) 2002, 2003, 2005, 2006 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.10' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.10], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. +# This function is AC_REQUIREd by AC_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +[AM_AUTOMAKE_VERSION([1.10])dnl +_AM_AUTOCONF_VERSION(m4_PACKAGE_VERSION)]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to +# `$srcdir', `$srcdir/..', or `$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is `.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[dnl Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50])dnl +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 8 + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ(2.52)dnl + ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 9 + +# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "GCJ", or "OBJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +ifelse([$1], CC, [depcc="$CC" am_compiler_list=], + [$1], CXX, [depcc="$CXX" am_compiler_list=], + [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], UPC, [depcc="$UPC" am_compiler_list=], + [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE(dependency-tracking, +[ --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +#serial 3 + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[for mf in $CONFIG_FILES; do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed 10q "$mf" | grep '^#.*generated by automake' > /dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done +done +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each `.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 12 + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.60])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) + AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) +AM_MISSING_PROG(AUTOCONF, autoconf) +AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) +AM_MISSING_PROG(AUTOHEADER, autoheader) +AM_MISSING_PROG(MAKEINFO, makeinfo) +AM_PROG_INSTALL_SH +AM_PROG_INSTALL_STRIP +AC_REQUIRE([AM_PROG_MKDIR_P])dnl +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_CC], + defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_CXX], + defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES(OBJC)], + [define([AC_PROG_OBJC], + defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl +]) +]) + + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $1 | $1:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) + +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"} +AC_SUBST(install_sh)]) + +# Copyright (C) 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 3 + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo done +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# We grep out `Entering directory' and `Leaving directory' +# messages which can occur if `w' ends up in MAKEFLAGS. +# In particular we don't look at `^make:' because GNU make might +# be invoked under some other name (usually "gmake"), in which +# case it prints its new name instead of `make'. +if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then + am__include=include + am__quote= + _am_result=GNU +fi +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then + am__include=.include + am__quote="\"" + _am_result=BSD + fi +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 5 + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it supports --run. +# If it does, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + AC_MSG_WARN([`missing' script is too old or missing]) +fi +]) + +# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_MKDIR_P +# --------------- +# Check for `mkdir -p'. +AC_DEFUN([AM_PROG_MKDIR_P], +[AC_PREREQ([2.60])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, +dnl while keeping a definition of mkdir_p for backward compatibility. +dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. +dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of +dnl Makefile.ins that do not define MKDIR_P, so we do our own +dnl adjustment using top_builddir (which is defined more often than +dnl MKDIR_P). +AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl +case $mkdir_p in + [[\\/$]]* | ?:[[\\/]]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 3 + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# ------------------------------ +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) + +# _AM_SET_OPTIONS(OPTIONS) +# ---------------------------------- +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 4 + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftest.file +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftest.file` + fi + rm -f conftest.file + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi + + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT(yes)]) + +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor `install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in `make install-strip', and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be `maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Copyright (C) 2006 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputing VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of `v7', `ustar', or `pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. +AM_MISSING_PROG([AMTAR], [tar]) +m4_if([$1], [v7], + [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], + [m4_case([$1], [ustar],, [pax],, + [m4_fatal([Unknown tar format])]) +AC_MSG_CHECKING([how to create a $1 tar archive]) +# Loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' +_am_tools=${am_cv_prog_tar_$1-$_am_tools} +# Do not fold the above two line into one, because Tru64 sh and +# Solaris sh will not grok spaces in the rhs of `-'. +for _am_tool in $_am_tools +do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; + do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi +done +rm -rf conftest.dir + +AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) +AC_MSG_RESULT([$am_cv_prog_tar_$1])]) +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + diff --git a/config-aux/acx.m4 b/config-aux/acx.m4 new file mode 100644 index 0000000..c8a32c9 --- /dev/null +++ b/config-aux/acx.m4 @@ -0,0 +1,597 @@ +# Autoconf M4 include file defining utility macros for complex Canadian +# cross builds. + +dnl #### +dnl # _GCC_TOPLEV_NONCANONICAL_BUILD +dnl # $build_alias or canonical $build if blank. +dnl # Used when we would use $build_alias, but empty is not OK. +AC_DEFUN([_GCC_TOPLEV_NONCANONICAL_BUILD], +[AC_REQUIRE([AC_CANONICAL_BUILD]) []dnl +case ${build_alias} in + "") build_noncanonical=${build} ;; + *) build_noncanonical=${build_alias} ;; +esac +]) []dnl # _GCC_TOPLEV_NONCANONICAL_BUILD + +dnl #### +dnl # _GCC_TOPLEV_NONCANONICAL_HOST +dnl # $host_alias, or $build_noncanonical if blank. +dnl # Used when we would use $host_alias, but empty is not OK. +AC_DEFUN([_GCC_TOPLEV_NONCANONICAL_HOST], +[AC_REQUIRE([_GCC_TOPLEV_NONCANONICAL_BUILD]) []dnl +case ${host_alias} in + "") host_noncanonical=${build_noncanonical} ;; + *) host_noncanonical=${host_alias} ;; +esac +]) []dnl # _GCC_TOPLEV_NONCANONICAL_HOST + +dnl #### +dnl # _GCC_TOPLEV_NONCANONICAL_TARGET +dnl # $target_alias or $host_noncanonical if blank. +dnl # Used when we would use $target_alias, but empty is not OK. +AC_DEFUN([_GCC_TOPLEV_NONCANONICAL_TARGET], +[AC_REQUIRE([_GCC_TOPLEV_NONCANONICAL_HOST]) []dnl +case ${target_alias} in + "") target_noncanonical=${host_noncanonical} ;; + *) target_noncanonical=${target_alias} ;; +esac +]) []dnl # _GCC_TOPLEV_NONCANONICAL_TARGET + +dnl #### +dnl # ACX_NONCANONICAL_BUILD +dnl # Like underscored version, but AC_SUBST's. +AC_DEFUN([ACX_NONCANONICAL_BUILD], +[AC_REQUIRE([_GCC_TOPLEV_NONCANONICAL_BUILD]) []dnl +AC_SUBST(build_noncanonical) +]) []dnl # ACX_NONCANONICAL_BUILD + +dnl #### +dnl # ACX_NONCANONICAL_HOST +dnl # Like underscored version, but AC_SUBST's. +AC_DEFUN([ACX_NONCANONICAL_HOST], +[AC_REQUIRE([_GCC_TOPLEV_NONCANONICAL_HOST]) []dnl +AC_SUBST(host_noncanonical) +]) []dnl # ACX_NONCANONICAL_HOST + +dnl #### +dnl # ACX_NONCANONICAL_TARGET +dnl # Like underscored version, but AC_SUBST's. +AC_DEFUN([ACX_NONCANONICAL_TARGET], +[AC_REQUIRE([_GCC_TOPLEV_NONCANONICAL_TARGET]) []dnl +AC_SUBST(target_noncanonical) +]) []dnl # ACX_NONCANONICAL_TARGET + +dnl #### +dnl # GCC_TOPLEV_SUBDIRS +dnl # GCC & friends build 'build', 'host', and 'target' tools. These must +dnl # be separated into three well-known subdirectories of the build directory: +dnl # build_subdir, host_subdir, and target_subdir. The values are determined +dnl # here so that they can (theoretically) be changed in the future. They +dnl # were previously reproduced across many different files. +dnl # +dnl # This logic really amounts to very little with autoconf 2.13; it will +dnl # amount to a lot more with autoconf 2.5x. +AC_DEFUN([GCC_TOPLEV_SUBDIRS], +[AC_REQUIRE([_GCC_TOPLEV_NONCANONICAL_TARGET]) []dnl +AC_REQUIRE([_GCC_TOPLEV_NONCANONICAL_BUILD]) []dnl + +# post-stage1 host modules use a different CC_FOR_BUILD so, in order to +# have matching libraries, they should use host libraries: Makefile.tpl +# arranges to pass --with-build-libsubdir=$(HOST_SUBDIR). +# However, they still use the build modules, because the corresponding +# host modules (e.g. bison) are only built for the host when bootstrap +# finishes. So: +# - build_subdir is where we find build modules, and never changes. +# - build_libsubdir is where we find build libraries, and can be overridden. + +# Prefix 'build-' so this never conflicts with target_subdir. +build_subdir="build-${build_noncanonical}" +AC_ARG_WITH(build-libsubdir, +[ --with-build-libsubdir=[DIR] Directory where to find libraries for build system], +build_libsubdir="$withval", +build_libsubdir="$build_subdir") +# --srcdir=. covers the toplevel, while "test -d" covers the subdirectories +if ( test $srcdir = . && test -d gcc ) \ + || test -d $srcdir/../host-${host_noncanonical}; then + host_subdir="host-${host_noncanonical}" +else + host_subdir=. +fi +# No prefix. +target_subdir=${target_noncanonical} +AC_SUBST([build_libsubdir]) []dnl +AC_SUBST([build_subdir]) []dnl +AC_SUBST([host_subdir]) []dnl +AC_SUBST([target_subdir]) []dnl +]) []dnl # GCC_TOPLEV_SUBDIRS + + +#### +# _NCN_TOOL_PREFIXES: Some stuff that oughtta be done in AC_CANONICAL_SYSTEM +# or AC_INIT. +# These demand that AC_CANONICAL_SYSTEM be called beforehand. +AC_DEFUN([_NCN_TOOL_PREFIXES], +[ncn_tool_prefix= +test -n "$host_alias" && ncn_tool_prefix=$host_alias- +ncn_target_tool_prefix= +test -n "$target_alias" && ncn_target_tool_prefix=$target_alias- +]) []dnl # _NCN_TOOL_PREFIXES + +#### +# NCN_STRICT_CHECK_TOOLS(variable, progs-to-check-for,[value-if-not-found],[path]) +# Like plain AC_CHECK_TOOLS, but require prefix if build!=host. + +AC_DEFUN([NCN_STRICT_CHECK_TOOLS], +[AC_REQUIRE([_NCN_TOOL_PREFIXES]) []dnl +AC_ARG_VAR([$1], [$1 for the host]) + +if test -n "[$]$1"; then + ac_cv_prog_$1=[$]$1 +elif test -n "$ac_cv_prog_$1"; then + $1=$ac_cv_prog_$1 +fi + +if test -n "$ac_cv_prog_$1"; then + for ncn_progname in $2; do + AC_CHECK_PROG([$1], [${ncn_progname}], [${ncn_progname}], , [$4]) + done +fi + +for ncn_progname in $2; do + if test -n "$ncn_tool_prefix"; then + AC_CHECK_PROG([$1], [${ncn_tool_prefix}${ncn_progname}], + [${ncn_tool_prefix}${ncn_progname}], , [$4]) + fi + if test -z "$ac_cv_prog_$1" && test $build = $host ; then + AC_CHECK_PROG([$1], [${ncn_progname}], [${ncn_progname}], , [$4]) + fi + test -n "$ac_cv_prog_$1" && break +done + +if test -z "$ac_cv_prog_$1" ; then + ifelse([$3],[], [set dummy $2 + if test $build = $host ; then + $1="[$]2" + else + $1="${ncn_tool_prefix}[$]2" + fi], [$1="$3"]) +fi +]) []dnl # NCN_STRICT_CHECK_TOOLS + +#### +# NCN_STRICT_CHECK_TARGET_TOOLS(variable, progs-to-check-for,[value-if-not-found],[path]) +# Like CVS Autoconf AC_CHECK_TARGET_TOOLS, but require prefix if build!=target. + +AC_DEFUN([NCN_STRICT_CHECK_TARGET_TOOLS], +[AC_REQUIRE([_NCN_TOOL_PREFIXES]) []dnl +AC_ARG_VAR([$1], patsubst([$1], [_FOR_TARGET$], [])[ for the target]) + +if test -n "[$]$1"; then + ac_cv_prog_$1=[$]$1 +elif test -n "$ac_cv_prog_$1"; then + $1=$ac_cv_prog_$1 +fi + +if test -n "$ac_cv_prog_$1"; then + for ncn_progname in $2; do + AC_CHECK_PROG([$1], [${ncn_progname}], [${ncn_progname}], , [$4]) + done +fi + +if test -z "$ac_cv_prog_$1" && test -n "$with_build_time_tools"; then + for ncn_progname in $2; do + AC_MSG_CHECKING([for ${ncn_progname} in $with_build_time_tools]) + if test -x $with_build_time_tools/${ncn_progname}; then + ac_cv_prog_$1=$with_build_time_tools/${ncn_progname} + AC_MSG_RESULT(yes) + break + else + AC_MSG_RESULT(no) + fi + done +fi + +if test -z "$ac_cv_prog_$1"; then + for ncn_progname in $2; do + if test -n "$ncn_target_tool_prefix"; then + AC_CHECK_PROG([$1], [${ncn_target_tool_prefix}${ncn_progname}], + [${ncn_target_tool_prefix}${ncn_progname}], , [$4]) + fi + if test -z "$ac_cv_prog_$1" && test $build = $target ; then + AC_CHECK_PROG([$1], [${ncn_progname}], [${ncn_progname}], , [$4]) + fi + test -n "$ac_cv_prog_$1" && break + done +fi + +if test -z "$ac_cv_prog_$1" ; then + ifelse([$3],[], [set dummy $2 + if test $build = $target ; then + $1="[$]2" + else + $1="${ncn_target_tool_prefix}[$]2" + fi], [$1="$3"]) +else + $1="$ac_cv_prog_$1" +fi +]) []dnl # NCN_STRICT_CHECK_TARGET_TOOLS + + +# Backported from Autoconf 2.5x; can go away when and if +# we switch. Put the OS path separator in $PATH_SEPARATOR. +AC_DEFUN([ACX_PATH_SEP], [ +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi +]) + + +AC_DEFUN([ACX_TOOL_DIRS], [ +AC_REQUIRE([ACX_PATH_SEP]) +if test "x$exec_prefix" = xNONE; then + if test "x$prefix" = xNONE; then + gcc_cv_tool_prefix=$ac_default_prefix + else + gcc_cv_tool_prefix=$prefix + fi +else + gcc_cv_tool_prefix=$exec_prefix +fi + +# If there is no compiler in the tree, use the PATH only. In any +# case, if there is no compiler in the tree nobody should use +# AS_FOR_TARGET and LD_FOR_TARGET. +if test x$host = x$build && test -f $srcdir/gcc/BASE-VER; then + gcc_version=`cat $srcdir/gcc/BASE-VER` + gcc_cv_tool_dirs="$gcc_cv_tool_prefix/libexec/gcc/$target_noncanonical/$gcc_version$PATH_SEPARATOR" + gcc_cv_tool_dirs="$gcc_cv_tool_dirs$gcc_cv_tool_prefix/libexec/gcc/$target_noncanonical$PATH_SEPARATOR" + gcc_cv_tool_dirs="$gcc_cv_tool_dirs/usr/lib/gcc/$target_noncanonical/$gcc_version$PATH_SEPARATOR" + gcc_cv_tool_dirs="$gcc_cv_tool_dirs/usr/lib/gcc/$target_noncanonical$PATH_SEPARATOR" + gcc_cv_tool_dirs="$gcc_cv_tool_dirs$gcc_cv_tool_prefix/$target_noncanonical/bin/$target_noncanonical/$gcc_version$PATH_SEPARATOR" + gcc_cv_tool_dirs="$gcc_cv_tool_dirs$gcc_cv_tool_prefix/$target_noncanonical/bin$PATH_SEPARATOR" +else + gcc_cv_tool_dirs= +fi + +if test x$build = x$target && test -n "$md_exec_prefix"; then + gcc_cv_tool_dirs="$gcc_cv_tool_dirs$md_exec_prefix$PATH_SEPARATOR" +fi + +]) []dnl # ACX_TOOL_DIRS + +# ACX_HAVE_GCC_FOR_TARGET +# Check if the variable GCC_FOR_TARGET really points to a GCC binary. +AC_DEFUN([ACX_HAVE_GCC_FOR_TARGET], [ +cat > conftest.c << \EOF +#ifdef __GNUC__ + gcc_yay; +#endif +EOF +if ($GCC_FOR_TARGET -E conftest.c | grep gcc_yay) > /dev/null 2>&1; then + have_gcc_for_target=yes +else + GCC_FOR_TARGET=${ncn_target_tool_prefix}gcc + have_gcc_for_target=no +fi +rm conftest.c +]) + +# ACX_CHECK_INSTALLED_TARGET_TOOL(VAR, PROG) +# Searching for installed target binutils. We need to take extra care, +# else we may find the wrong assembler, linker, etc., and lose. +# +# First try --with-build-time-tools, if specified. +# +# For build != host, we ask the installed GCC for the name of the tool it +# uses, and accept it if it is an absolute path. This is because the +# only good choice for a compiler is the same GCC version that is being +# installed (or we couldn't make target libraries), and we assume that +# on the host system we'll have not only the same GCC version, but also +# the same binutils version. +# +# For build == host, search the same directories that the installed +# compiler will search. We used to do this for the assembler, linker, +# and nm only; for simplicity of configuration, however, we extend this +# criterion to tools (such as ar and ranlib) that are never invoked by +# the compiler, to avoid mismatches. +# +# Also note we have to check MD_EXEC_PREFIX before checking the user's path +# if build == target. This makes the most sense only when bootstrapping, +# but we also do so when build != host. In this case, we hope that the +# build and host systems will have similar contents of MD_EXEC_PREFIX. +# +# If we do not find a suitable binary, then try the user's path. + +AC_DEFUN([ACX_CHECK_INSTALLED_TARGET_TOOL], [ +AC_REQUIRE([ACX_TOOL_DIRS]) +AC_REQUIRE([ACX_HAVE_GCC_FOR_TARGET]) +if test -z "$ac_cv_path_$1" ; then + if test -n "$with_build_time_tools"; then + AC_MSG_CHECKING([for $2 in $with_build_time_tools]) + if test -x $with_build_time_tools/$2; then + $1=`cd $with_build_time_tools && pwd`/$2 + ac_cv_path_$1=[$]$1 + AC_MSG_RESULT([$ac_cv_path_$1]) + else + AC_MSG_RESULT(no) + fi + elif test $build != $host && test $have_gcc_for_target = yes; then + $1=`$GCC_FOR_TARGET --print-prog-name=$2` + test [$]$1 = $2 && $1= + test -n "[$]$1" && ac_cv_path_$1=[$]$1 + fi +fi +if test -z "$ac_cv_path_$1" && test -n "$gcc_cv_tool_dirs"; then + AC_PATH_PROG([$1], [$2], [], [$gcc_cv_tool_dirs]) +fi +if test -z "$ac_cv_path_$1" ; then + NCN_STRICT_CHECK_TARGET_TOOLS([$1], [$2]) +else + $1=$ac_cv_path_$1 +fi +]) []dnl # ACX_CHECK_INSTALLED_TARGET_TOOL + +### +# AC_PROG_CPP_WERROR +# Used for autoconf 2.5x to force AC_PREPROC_IFELSE to reject code which +# triggers warnings from the preprocessor. Will be in autoconf 2.58. +# For now, using this also overrides header checks to use only the +# preprocessor (matches 2.13 behavior; matching 2.58's behavior is a +# bit harder from here). +# Eventually autoconf will default to checking headers with the compiler +# instead, and we'll have to do this differently. + +AC_DEFUN([AC_PROG_CPP_WERROR], +[AC_REQUIRE([AC_PROG_CPP])dnl +m4_define([AC_CHECK_HEADER],m4_defn([_AC_CHECK_HEADER_OLD])) +ac_c_preproc_warn_flag=yes])# AC_PROG_CPP_WERROR + +# Test for GNAT. +# We require the gnatbind program, and a compiler driver that +# understands Ada. We use the user's CC setting, already found. +# +# Sets the shell variable have_gnat to yes or no as appropriate, and +# substitutes GNATBIND and GNATMAKE. +AC_DEFUN([ACX_PROG_GNAT], +[AC_REQUIRE([AC_CHECK_TOOL_PREFIX]) +AC_REQUIRE([AC_PROG_CC]) +AC_CHECK_TOOL(GNATBIND, gnatbind, no) +AC_CHECK_TOOL(GNATMAKE, gnatmake, no) +AC_CACHE_CHECK([whether compiler driver understands Ada], + acx_cv_cc_gcc_supports_ada, +[cat >conftest.adb <&1 || echo failure` +if test x"$errors" = x && test -f conftest.$ac_objext; then + acx_cv_cc_gcc_supports_ada=yes +fi +rm -f conftest.*]) + +if test x$GNATBIND != xno && test x$GNATMAKE != xno && test x$acx_cv_cc_gcc_supports_ada != xno; then + have_gnat=yes +else + have_gnat=no +fi +]) + +dnl 'make compare' can be significantly faster, if cmp itself can +dnl skip bytes instead of using tail. The test being performed is +dnl "if cmp --ignore-initial=2 t1 t2 && ! cmp --ignore-initial=1 t1 t2" +dnl but we need to sink errors and handle broken shells. We also test +dnl for the parameter format "cmp file1 file2 skip1 skip2" which is +dnl accepted by cmp on some systems. +AC_DEFUN([ACX_PROG_CMP_IGNORE_INITIAL], +[AC_CACHE_CHECK([how to compare bootstrapped objects], gcc_cv_prog_cmp_skip, +[ echo abfoo >t1 + echo cdfoo >t2 + gcc_cv_prog_cmp_skip='tail +16c $$f1 > tmp-foo1; tail +16c $$f2 > tmp-foo2; cmp tmp-foo1 tmp-foo2' + if cmp t1 t2 2 2 > /dev/null 2>&1; then + if cmp t1 t2 1 1 > /dev/null 2>&1; then + : + else + gcc_cv_prog_cmp_skip='cmp $$f1 $$f2 16 16' + fi + fi + if cmp --ignore-initial=2 t1 t2 > /dev/null 2>&1; then + if cmp --ignore-initial=1 t1 t2 > /dev/null 2>&1; then + : + else + gcc_cv_prog_cmp_skip='cmp --ignore-initial=16 $$f1 $$f2' + fi + fi + rm t1 t2 +]) +do_compare="$gcc_cv_prog_cmp_skip" +AC_SUBST(do_compare) +]) + +dnl See whether we can include both string.h and strings.h. +AC_DEFUN([ACX_HEADER_STRING], +[AC_CACHE_CHECK([whether string.h and strings.h may both be included], + gcc_cv_header_string, +[AC_TRY_COMPILE([#include +#include ], , gcc_cv_header_string=yes, gcc_cv_header_string=no)]) +if test $gcc_cv_header_string = yes; then + AC_DEFINE(STRING_WITH_STRINGS, 1, [Define if you can safely include both and .]) +fi +]) + +dnl See if stdbool.h properly defines bool and true/false. +dnl Check whether _Bool is built-in. +AC_DEFUN([ACX_HEADER_STDBOOL], +[AC_CACHE_CHECK([for working stdbool.h], + ac_cv_header_stdbool_h, +[AC_TRY_COMPILE([#include ], +[bool foo = false;], +ac_cv_header_stdbool_h=yes, ac_cv_header_stdbool_h=no)]) +if test $ac_cv_header_stdbool_h = yes; then + AC_DEFINE(HAVE_STDBOOL_H, 1, + [Define if you have a working header file.]) +fi +AC_CACHE_CHECK(for built-in _Bool, gcc_cv_c__bool, +[AC_TRY_COMPILE(, +[_Bool foo;], +gcc_cv_c__bool=yes, gcc_cv_c__bool=no) +]) +if test $gcc_cv_c__bool = yes; then + AC_DEFINE(HAVE__BOOL, 1, [Define if the \`_Bool' type is built-in.]) +fi +]) + +dnl See if hard links work and if not, try to substitute $1 or simple copy. +AC_DEFUN([ACX_PROG_LN], +[AC_MSG_CHECKING(whether ln works) +AC_CACHE_VAL(acx_cv_prog_LN, +[rm -f conftestdata_t +echo >conftestdata_f +if ln conftestdata_f conftestdata_t 2>/dev/null +then + acx_cv_prog_LN=ln +else + acx_cv_prog_LN=no +fi +rm -f conftestdata_f conftestdata_t +])dnl +if test $acx_cv_prog_LN = no; then + LN="ifelse([$1],,cp,[$1])" + AC_MSG_RESULT([no, using $LN]) +else + LN="$acx_cv_prog_LN" + AC_MSG_RESULT(yes) +fi +AC_SUBST(LN)dnl +]) + +dnl GCC_TARGET_TOOL(PROGRAM, TARGET-VAR, HOST-VAR, IN-TREE-TOOL, LANGUAGE) +AC_DEFUN([GCC_TARGET_TOOL], +[AC_MSG_CHECKING(where to find the target $1) +if test "x${build}" != "x${host}" ; then + if expr "x[$]$2" : "x/" > /dev/null; then + # We already found the complete path + ac_dir=`dirname [$]$2` + AC_MSG_RESULT(pre-installed in $ac_dir) + else + # Canadian cross, just use what we found + AC_MSG_RESULT(pre-installed) + fi +else + ifelse([$4],,, + [ok=yes + case " ${configdirs} " in + *" patsubst([$4], [/.*], []) "*) ;; + *) ok=no ;; + esac + ifelse([$5],,, + [case ,${enable_languages}, in + *,$5,*) ;; + *) ok=no ;; + esac]) + if test $ok = yes; then + # An in-tree tool is available and we can use it + $2='$$r/$(HOST_SUBDIR)/$4' + AC_MSG_RESULT(just compiled) + el])if expr "x[$]$2" : "x/" > /dev/null; then + # We already found the complete path + ac_dir=`dirname [$]$2` + AC_MSG_RESULT(pre-installed in $ac_dir) + elif test "x$target" = "x$host"; then + # We can use an host tool + $2='$($3)' + AC_MSG_RESULT(host tool) + else + # We need a cross tool + AC_MSG_RESULT(pre-installed) + fi +fi +AC_SUBST($2)]) + + +dnl Locate a program and check that its version is acceptable. +dnl ACX_PROG_CHECK_VER(var, name, version-switch, +dnl version-extract-regexp, version-glob) +AC_DEFUN([ACX_CHECK_PROG_VER],[ + AC_CHECK_PROG([$1], [$2], [$2]) + if test -n "[$]$1"; then + # Found it, now check the version. + AC_CACHE_CHECK([for modern $2], + [gcc_cv_prog_$2_modern], + [ac_prog_version=`eval [$]$1 $3 2>&1 | + sed -n 's/^.*patsubst([[$4]],/,\/).*$/\1/p'` + + [case $ac_prog_version in + '') gcc_cv_prog_$2_modern=no;; + $5) gcc_cv_prog_$2_modern=yes;; + *) gcc_cv_prog_$2_modern=no;; + esac] + ]) + else + gcc_cv_prog_$2_modern=no + fi + if test $gcc_cv_prog_$2_modern = no; then + $1="${CONFIG_SHELL-/bin/sh} $ac_aux_dir/missing $2" + fi +]) + +dnl Support the --with-pkgversion configure option. +dnl ACX_PKGVERSION(default-pkgversion) +AC_DEFUN([ACX_PKGVERSION],[ + AC_ARG_WITH(pkgversion, + AS_HELP_STRING([--with-pkgversion=PKG], + [Use PKG in the version string in place of "$1"]), + [case "$withval" in + yes) AC_MSG_ERROR([package version not specified]) ;; + no) PKGVERSION= ;; + *) PKGVERSION="($withval) " ;; + esac], + PKGVERSION="($1) " + ) + AC_SUBST(PKGVERSION) +]) + +dnl Support the --with-bugurl configure option. +dnl ACX_BUGURL(default-bugurl) +AC_DEFUN([ACX_BUGURL],[ + AC_ARG_WITH(bugurl, + AS_HELP_STRING([--with-bugurl=URL], + [Direct users to URL to report a bug]), + [case "$withval" in + yes) AC_MSG_ERROR([bug URL not specified]) ;; + no) BUGURL= + ;; + *) BUGURL="$withval" + ;; + esac], + BUGURL="$1" + ) + case ${BUGURL} in + "") + REPORT_BUGS_TO= + REPORT_BUGS_TEXI= + ;; + *) + REPORT_BUGS_TO="<$BUGURL>" + REPORT_BUGS_TEXI=@uref{`echo "$BUGURL" | sed 's/@/@@/g'`} + ;; + esac; + AC_SUBST(REPORT_BUGS_TO) + AC_SUBST(REPORT_BUGS_TEXI) +]) diff --git a/config-aux/codeset.m4 b/config-aux/codeset.m4 new file mode 100644 index 0000000..59535eb --- /dev/null +++ b/config-aux/codeset.m4 @@ -0,0 +1,23 @@ +# codeset.m4 serial AM1 (gettext-0.10.40) +dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +AC_DEFUN([AM_LANGINFO_CODESET], +[ + AC_CACHE_CHECK([for nl_langinfo and CODESET], am_cv_langinfo_codeset, + [AC_TRY_LINK([#include ], + [char* cs = nl_langinfo(CODESET);], + am_cv_langinfo_codeset=yes, + am_cv_langinfo_codeset=no) + ]) + if test $am_cv_langinfo_codeset = yes; then + AC_DEFINE(HAVE_LANGINFO_CODESET, 1, + [Define if you have and nl_langinfo(CODESET).]) + fi +]) diff --git a/config-aux/config.guess b/config-aux/config.guess new file mode 100755 index 0000000..396482d --- /dev/null +++ b/config-aux/config.guess @@ -0,0 +1,1500 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, +# Inc. + +timestamp='2006-07-02' + +# This file 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., 51 Franklin Street - Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Originally written by Per Bothner . +# Please send patches to . Submit a context +# diff and a properly formatted ChangeLog entry. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# The plan is that this can be called by configure scripts if you +# don't specify an explicit build system type. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; set_cc_for_build= ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep __ELF__ >/dev/null + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit ;; + *:SolidBSD:*:*) + echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; + arm:riscos:*:*|arm:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + i86pc:SunOS:5.*:*) + echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && + dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`$dummy $dummyarg` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos${UNAME_RELEASE} + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[45]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then + eval $set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + grep __LP64__ >/dev/null + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) + case ${UNAME_MACHINE} in + pc98) + echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + amd64) + echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + esac + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + i*:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + x86:Interix*:[3456]*) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + EM64T:Interix*:[3456]*) + echo x86_64-unknown-interix${UNAME_RELEASE} + exit ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + arm*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + cris:Linux:*:*) + echo cris-axis-linux-gnu + exit ;; + crisv32:Linux:*:*) + echo crisv32-axis-linux-gnu + exit ;; + frv:Linux:*:*) + echo frv-unknown-linux-gnu + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + mips:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips + #undef mipsel + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mipsel + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips + #else + CPU= + #endif + #endif +EOF + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' + /^CPU/{ + s: ::g + p + }'`" + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips64 + #undef mips64el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mips64el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips64 + #else + CPU= + #endif + #endif +EOF + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' + /^CPU/{ + s: ::g + p + }'`" + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + or32:Linux:*:*) + echo or32-unknown-linux-gnu + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-gnu + exit ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-gnu + exit ;; + i*86:Linux:*:*) + # The BFD linker knows what the default object file format is, so + # first see if it will tell us. cd to the root directory to prevent + # problems with other programs or directories called `ld' in the path. + # Set LC_ALL=C to ensure ld outputs messages in English. + ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ + | sed -ne '/supported targets:/!d + s/[ ][ ]*/ /g + s/.*supported targets: *// + s/ .*// + p'` + case "$ld_supported_targets" in + elf32-i386) + TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" + ;; + a.out-i386-linux) + echo "${UNAME_MACHINE}-pc-linux-gnuaout" + exit ;; + coff-i386) + echo "${UNAME_MACHINE}-pc-linux-gnucoff" + exit ;; + "") + # Either a pre-BFD a.out linker (linux-gnuoldld) or + # one that does not give us useful --help. + echo "${UNAME_MACHINE}-pc-linux-gnuoldld" + exit ;; + esac + # Determine whether the default compiler is a.out or elf + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + #ifdef __ELF__ + # ifdef __GLIBC__ + # if __GLIBC__ >= 2 + LIBC=gnu + # else + LIBC=gnulibc1 + # endif + # else + LIBC=gnulibc1 + # endif + #else + #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) + LIBC=gnu + #else + LIBC=gnuaout + #endif + #endif + #ifdef __dietlibc__ + LIBC=dietlibc + #endif +EOF + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' + /^LIBC/{ + s: ::g + p + }'`" + test x"${LIBC}" != x && { + echo "${UNAME_MACHINE}-pc-linux-${LIBC}" + exit + } + test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } + ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i386. + echo i386-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo ${UNAME_MACHINE}-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + case $UNAME_PROCESSOR in + unknown) UNAME_PROCESSOR=powerpc ;; + esac + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NSE-?:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +eval $set_cc_for_build +cat >$dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix\n"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + c34*) + echo c34-convex-bsd + exit ;; + c38*) + echo c38-convex-bsd + exit ;; + c4*) + echo c4-convex-bsd + exit ;; + esac +fi + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/config-aux/config.rpath b/config-aux/config.rpath new file mode 100755 index 0000000..937edf5 --- /dev/null +++ b/config-aux/config.rpath @@ -0,0 +1,548 @@ +#! /bin/sh +# Output a system dependent set of variables, describing how to set the +# run time search path of shared libraries in an executable. +# +# Copyright 1996-2003 Free Software Foundation, Inc. +# Taken from GNU libtool, 2001 +# Originally by Gordon Matzigkeit , 1996 +# +# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. +# +# The first argument passed to this file is the canonical host specification, +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld +# should be set by the caller. +# +# The set of defined variables is at the end of this script. + +# Known limitations: +# - On IRIX 6.5 with CC="cc", the run time search patch must not be longer +# than 256 bytes, otherwise the compiler driver will dump core. The only +# known workaround is to choose shorter directory names for the build +# directory and/or the installation directory. + +# All known linkers require a `.a' archive for static linking (except M$VC, +# which needs '.lib'). +libext=a +shrext=.so + +host="$1" +host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + +# Code taken from libtool.m4's AC_LIBTOOL_PROG_COMPILER_PIC. + +wl= +if test "$GCC" = yes; then + wl='-Wl,' +else + case "$host_os" in + aix*) + wl='-Wl,' + ;; + mingw* | pw32* | os2*) + ;; + hpux9* | hpux10* | hpux11*) + wl='-Wl,' + ;; + irix5* | irix6* | nonstopux*) + wl='-Wl,' + ;; + newsos6) + ;; + linux*) + case $CC in + icc|ecc) + wl='-Wl,' + ;; + ccc) + wl='-Wl,' + ;; + esac + ;; + osf3* | osf4* | osf5*) + wl='-Wl,' + ;; + sco3.2v5*) + ;; + solaris*) + wl='-Wl,' + ;; + sunos4*) + wl='-Qoption ld ' + ;; + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + wl='-Wl,' + ;; + sysv4*MP*) + ;; + uts4*) + ;; + esac +fi + +# Code taken from libtool.m4's AC_LIBTOOL_PROG_LD_SHLIBS. + +hardcode_libdir_flag_spec= +hardcode_libdir_separator= +hardcode_direct=no +hardcode_minus_L=no + +case "$host_os" in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + openbsd*) + with_gnu_ld=no + ;; +esac + +ld_shlibs=yes +if test "$with_gnu_ld" = yes; then + case "$host_os" in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs=no + fi + ;; + amigaos*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can use + # them. + ld_shlibs=no + ;; + beos*) + if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + cygwin* | mingw* | pw32*) + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + netbsd*) + ;; + solaris* | sysv5*) + if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + sunos4*) + hardcode_direct=yes + ;; + *) + if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + esac + if test "$ld_shlibs" = yes; then + # Unlike libtool, we use -rpath here, not --rpath, since the documented + # option of GNU ld is called -rpath, not --rpath. + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + fi +else + case "$host_os" in + aix3*) + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + else + aix_use_runtimelinking=no + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + esac + fi + hardcode_direct=yes + hardcode_libdir_separator=':' + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct=yes + else + # We have old collect2 + hardcode_direct=unsupported + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + esac + fi + # Begin _LT_AC_SYS_LIBPATH_AIX. + echo 'int main () { return 0; }' > conftest.c + ${CC} ${LDFLAGS} conftest.c -o conftest + aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` + if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` + fi + if test -z "$aix_libpath"; then + aix_libpath="/usr/lib:/lib" + fi + rm -f conftest.c conftest + # End _LT_AC_SYS_LIBPATH_AIX. + if test "$aix_use_runtimelinking" = yes; then + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + else + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + fi + fi + ;; + amigaos*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # see comment about different semantics on the GNU ld section + ld_shlibs=no + ;; + bsdi4*) + ;; + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec=' ' + libext=lib + ;; + darwin* | rhapsody*) + if $CC -v 2>&1 | grep 'Apple' >/dev/null ; then + hardcode_direct=no + fi + ;; + dgux*) + hardcode_libdir_flag_spec='-L$libdir' + ;; + freebsd1*) + ld_shlibs=no + ;; + freebsd2.2*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + freebsd2*) + hardcode_direct=yes + hardcode_minus_L=yes + ;; + freebsd*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + hpux9*) + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + hpux10* | hpux11*) + if test "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*) + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=no + ;; + ia64*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=no + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + *) + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + irix5* | irix6* | nonstopux*) + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + netbsd*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + newsos6) + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + openbsd*) + hardcode_direct=yes + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + else + case "$host_os" in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + osf3*) + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + osf4* | osf5*) + if test "$GCC" = yes; then + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + # Both cc and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + hardcode_libdir_separator=: + ;; + sco3.2v5*) + ;; + solaris*) + hardcode_libdir_flag_spec='-R$libdir' + ;; + sunos4*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + ;; + sysv4) + case $host_vendor in + sni) + hardcode_direct=yes # is this really true??? + ;; + siemens) + hardcode_direct=no + ;; + motorola) + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + ;; + sysv4.3*) + ;; + sysv4*MP*) + if test -d /usr/nec; then + ld_shlibs=yes + fi + ;; + sysv4.2uw2*) + hardcode_direct=yes + hardcode_minus_L=no + ;; + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) + ;; + sysv5*) + hardcode_libdir_flag_spec= + ;; + uts4*) + hardcode_libdir_flag_spec='-L$libdir' + ;; + *) + ld_shlibs=no + ;; + esac +fi + +# Check dynamic linker characteristics +# Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER. +libname_spec='lib$name' +case "$host_os" in + aix3*) + ;; + aix4* | aix5*) + ;; + amigaos*) + ;; + beos*) + ;; + bsdi4*) + ;; + cygwin* | mingw* | pw32*) + shrext=.dll + ;; + darwin* | rhapsody*) + shrext=.dylib + ;; + dgux*) + ;; + freebsd1*) + ;; + freebsd*) + ;; + gnu*) + ;; + hpux9* | hpux10* | hpux11*) + case "$host_cpu" in + ia64*) + shrext=.so + ;; + hppa*64*) + shrext=.sl + ;; + *) + shrext=.sl + ;; + esac + ;; + irix5* | irix6* | nonstopux*) + case "$host_os" in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;; + *) libsuff= shlibsuff= ;; + esac + ;; + esac + ;; + linux*oldld* | linux*aout* | linux*coff*) + ;; + linux*) + ;; + netbsd*) + ;; + newsos6) + ;; + nto-qnx) + ;; + openbsd*) + ;; + os2*) + libname_spec='$name' + shrext=.dll + ;; + osf3* | osf4* | osf5*) + ;; + sco3.2v5*) + ;; + solaris*) + ;; + sunos4*) + ;; + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + ;; + sysv4*MP*) + ;; + uts4*) + ;; +esac + +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' +escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"` +shlibext=`echo "$shrext" | sed -e 's,^\.,,'` +escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` + +sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <. Submit a context +# diff and a properly formatted ChangeLog entry. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ + uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray) + os= + basic_machine=$1 + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ + | bfin \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | mcore \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64vr | mips64vrel \ + | mips64orion | mips64orionel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | mt \ + | msp430 \ + | nios | nios2 \ + | ns16k | ns32k \ + | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | score \ + | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu | strongarm \ + | tahoe | thumb | tic4x | tic80 | tron \ + | v850 | v850e \ + | we32k \ + | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ + | z8k) + basic_machine=$basic_machine-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12) + # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + ms1) + basic_machine=mt-unknown + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ + | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nios-* | nios2-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tron-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ + | xstormy16-* | xtensa-* \ + | ymp-* \ + | z8k-*) + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16c) + basic_machine=cr16c-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sde) + basic_machine=mipsisa32-sde + os=-elf + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; + tic55x | c55x*) + basic_machine=tic55x-unknown + os=-coff + ;; + tic6x | c6x*) + basic_machine=tic6x-unknown + os=-coff + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ + | -openbsd* | -solidbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -kaos*) + os=-kaos + ;; + -zvmoe) + os=-zvmoe + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + score-*) + os=-elf + ;; + spu-*) + os=-elf + ;; + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-haiku) + os=-haiku + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/config-aux/depcomp b/config-aux/depcomp new file mode 100755 index 0000000..ca5ea4e --- /dev/null +++ b/config-aux/depcomp @@ -0,0 +1,584 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2006-10-15.18 + +# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006 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., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva . + +case $1 in + '') + echo "$0: No command. Try \`$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by `PROGRAMS ARGS'. + object Object file output by `PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputing dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. +## Unfortunately, FreeBSD c89 acceptance of flags depends upon +## the command line argument order; so add the flags where they +## appear in depend2.am. Note that the slowdown incurred here +## affects only configure: in makefiles, %FASTDEP% shortcuts this. + for arg + do + case $arg in + -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; + *) set fnord "$@" "$arg" ;; + esac + shift # fnord + shift # $arg + done + "$@" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz +## The second -e expression handles DOS-style file names with drive letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the `deleted header file' problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. + tr ' ' ' +' < "$tmpdepfile" | +## Some versions of gcc put a space before the `:'. On the theory +## that the space means something, we add a space to the output as +## well. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like `#:fec' to the end of the + # dependency line. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ + tr ' +' ' ' >> $depfile + echo >> $depfile + + # The second pass generates a dummy entry for each header file. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> $depfile + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts `$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'` + tmpdepfile="$stripped.u" + if test "$libtool" = yes; then + "$@" -Wc,-M + else + "$@" -M + fi + stat=$? + + if test -f "$tmpdepfile"; then : + else + stripped=`echo "$stripped" | sed 's,^.*/,,'` + tmpdepfile="$stripped.u" + fi + + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + + if test -f "$tmpdepfile"; then + outname="$stripped.o" + # Each line is of the form `foo.o: dependent.h'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" + sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +icc) + # Intel's C compiler understands `-MD -MF file'. However on + # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c + # ICC 7.0 will fill foo.d with something like + # foo.o: sub/foo.c + # foo.o: sub/foo.h + # which is wrong. We want: + # sub/foo.o: sub/foo.c + # sub/foo.o: sub/foo.h + # sub/foo.c: + # sub/foo.h: + # ICC 7.1 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using \ : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | + sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp2) + # The "hp" stanza above does not work with aCC (C++) and HP's ia64 + # compilers, which have integrated preprocessors. The correct option + # to use with these is +Maked; it writes dependencies to a file named + # 'foo.d', which lands next to the object file, wherever that + # happens to be. + # Much of this is similar to the tru64 case; see comments there. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir.libs/$base.d + "$@" -Wc,+Maked + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + "$@" +Maked + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" + # Add `dependent.h:' lines. + sed -ne '2,${; s/^ *//; s/ \\*$//; s/$/:/; p;}' "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" "$tmpdepfile2" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in `foo.d' instead, so we check for that too. + # Subdirectories are respected. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + + if test "$libtool" = yes; then + # With Tru64 cc, shared objects can also be used to make a + # static library. This mechanism is used in libtool 1.4 series to + # handle both shared and static libraries in a single compilation. + # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. + # + # With libtool 1.5 this exception was removed, and libtool now + # generates 2 separate objects for the 2 libraries. These two + # compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 + tmpdepfile2=$dir$base.o.d # libtool 1.5 + tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 + tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.o.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + tmpdepfile4=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + # That's a tab and a space in the []. + sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test $1 != '--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for `:' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. + "$@" $dashmflag | + sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + tr ' ' ' +' < "$tmpdepfile" | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test $1 != '--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no + for arg in "$@"; do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix="`echo $object | sed 's/^.*\././'`" + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + sed '1,2d' "$tmpdepfile" | tr ' ' ' +' | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test $1 != '--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E | + sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | + sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o, + # because we must use -o when running libtool. + "$@" || exit $? + IFS=" " + for arg + do + case "$arg" in + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" + echo " " >> "$depfile" + . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/config-aux/gettext-sister.m4 b/config-aux/gettext-sister.m4 new file mode 100644 index 0000000..e8e6b66 --- /dev/null +++ b/config-aux/gettext-sister.m4 @@ -0,0 +1,80 @@ +# intl sister-directory configuration rules. +# + +# The idea behind this macro is that there's no need to repeat all the +# autoconf probes done by the intl directory - it's already done them +# for us. In fact, there's no need even to look at the cache for the +# answers. All we need to do is nab a few pieces of information. +# The intl directory is set up to make this easy, by generating a +# small file which can be sourced as a shell script; then we produce +# the necessary substitutions and definitions for this directory. + +AC_DEFUN([ZW_GNU_GETTEXT_SISTER_DIR], +[# If we haven't got the data from the intl directory, +# assume NLS is disabled. +USE_NLS=no AC_SUBST(USE_NLS) +LIBINTL= AC_SUBST(LIBINTL) +LIBINTL_DEP= AC_SUBST(LIBINTL_DEP) +INCINTL= AC_SUBST(INCINTL) +XGETTEXT= AC_SUBST(XGETTEXT) +GMSGFMT= AC_SUBST(GMSGFMT) +POSUB= AC_SUBST(POSUB) + +if test -f ifelse([$1],,[../intl],[$1])/config.intl; then + . ifelse([$1],,[../intl],[$1])/config.intl +fi +AC_MSG_CHECKING([whether NLS is requested]) +if test x"$USE_NLS" != xyes; then + AC_MSG_RESULT(no) +else + AC_MSG_RESULT(yes) + AC_DEFINE(ENABLE_NLS, 1, + [Define to 1 if translation of program messages to the + user's native language is requested.]) + + AC_MSG_CHECKING(for catalogs to be installed) + # Look for .po and .gmo files in the source directory. + CATALOGS= AC_SUBST(CATALOGS) + XLINGUAS= + for cat in $srcdir/po/*.gmo $srcdir/po/*.po; do + # If there aren't any .gmo files the shell will give us the + # literal string "../path/to/srcdir/po/*.gmo" which has to be + # weeded out. + case "$cat" in *\**) + continue;; + esac + # The quadruple backslash is collapsed to a double backslash + # by the backticks, then collapsed again by the double quotes, + # leaving us with one backslash in the sed expression (right + # before the dot that mustn't act as a wildcard). + cat=`echo $cat | sed -e "s!$srcdir/po/!!" -e "s!\\\\.po!.gmo!"` + lang=`echo $cat | sed -e "s!\\\\.gmo!!"` + # The user is allowed to set LINGUAS to a list of languages to + # install catalogs for. If it's empty that means "all of them." + if test "x$LINGUAS" = x; then + CATALOGS="$CATALOGS $cat" + XLINGUAS="$XLINGUAS $lang" + else + case "$LINGUAS" in *$lang*) + CATALOGS="$CATALOGS $cat" + XLINGUAS="$XLINGUAS $lang" + ;; + esac + fi + done + LINGUAS="$XLINGUAS" + AC_MSG_RESULT($LINGUAS) + + dnl Set up some additional variables which our po/Make-in files + dnl may need. + + dnl For backward compatibility. Some Makefiles may be using these. + DATADIRNAME=share + AC_SUBST(DATADIRNAME) + INSTOBJEXT=.mo + AC_SUBST(INSTOBJEXT) + GENCAT=gencat + AC_SUBST(GENCAT) + CATOBJEXT=.gmo + AC_SUBST(CATOBJEXT) +fi]) diff --git a/config-aux/install-sh b/config-aux/install-sh new file mode 100755 index 0000000..4fbbae7 --- /dev/null +++ b/config-aux/install-sh @@ -0,0 +1,507 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2006-10-14.15 + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. + +nl=' +' +IFS=" "" $nl" + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit="${DOITPROG-}" +if test -z "$doit"; then + doit_exec=exec +else + doit_exec=$doit +fi + +# Put in absolute file names if you don't have them in your path; +# or use environment vars. + +mvprog="${MVPROG-mv}" +cpprog="${CPPROG-cp}" +chmodprog="${CHMODPROG-chmod}" +chownprog="${CHOWNPROG-chown}" +chgrpprog="${CHGRPPROG-chgrp}" +stripprog="${STRIPPROG-strip}" +rmprog="${RMPROG-rm}" +mkdirprog="${MKDIRPROG-mkdir}" + +posix_glob= +posix_mkdir= + +# Desired mode of installed file. +mode=0755 + +chmodcmd=$chmodprog +chowncmd= +chgrpcmd= +stripcmd= +rmcmd="$rmprog -f" +mvcmd="$mvprog" +src= +dst= +dir_arg= +dstarg= +no_target_directory= + +usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: +-c (ignored) +-d create directories instead of installing files. +-g GROUP $chgrpprog installed files to GROUP. +-m MODE $chmodprog installed files to MODE. +-o USER $chownprog installed files to USER. +-s $stripprog installed files. +-t DIRECTORY install into DIRECTORY. +-T report an error if DSTFILE is a directory. +--help display this help and exit. +--version display version info and exit. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG +" + +while test $# -ne 0; do + case $1 in + -c) shift + continue;; + + -d) dir_arg=true + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + --help) echo "$usage"; exit $?;; + + -m) mode=$2 + shift + shift + case $mode in + *' '* | *' '* | *' +'* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -s) stripcmd=$stripprog + shift + continue;; + + -t) dstarg=$2 + shift + shift + continue;; + + -T) no_target_directory=true + shift + continue;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac +done + +if test $# -ne 0 && test -z "$dir_arg$dstarg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dstarg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dstarg" + shift # fnord + fi + shift # arg + dstarg=$arg + done +fi + +if test $# -eq 0; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call `install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +if test -z "$dir_arg"; then + trap '(exit $?); exit' 1 2 13 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + +for src +do + # Protect names starting with `-'. + case $src in + -*) src=./$src ;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dstarg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + + dst=$dstarg + # Protect names starting with `-'. + case $dst in + -*) dst=./$dst ;; + esac + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + if test -n "$no_target_directory"; then + echo "$0: $dstarg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dst=$dstdir/`basename "$src"` + dstdir_status=0 + else + # Prefer dirname, but fall back on a substitute if dirname fails. + dstdir=` + (dirname "$dst") 2>/dev/null || + expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$dst" : 'X\(//\)[^/]' \| \ + X"$dst" : 'X\(//\)$' \| \ + X"$dst" : 'X\(/\)' \| . 2>/dev/null || + echo X"$dst" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q' + ` + + test -d "$dstdir" + dstdir_status=$? + fi + fi + + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 + + if (umask $mkdir_umask && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writeable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + ls_ld_tmpdir=`ls -ld "$tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/d" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null + fi + trap '' 0;; + esac;; + esac + + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else + + # The umask is ridiculous, or mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. + + case $dstdir in + /*) prefix=/ ;; + -*) prefix=./ ;; + *) prefix= ;; + esac + + case $posix_glob in + '') + if (set -f) 2>/dev/null; then + posix_glob=true + else + posix_glob=false + fi ;; + esac + + oIFS=$IFS + IFS=/ + $posix_glob && set -f + set fnord $dstdir + shift + $posix_glob && set +f + IFS=$oIFS + + prefixes= + + for d + do + test -z "$d" && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true + fi + fi + fi + + if test -n "$dir_arg"; then + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 + else + + # Make a couple of temp file names in the proper directory. + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + + # Copy the file name to the temp name. + (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ + && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ + && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ + && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # Now rename the file to the real destination. + { $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null \ + || { + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + if test -f "$dst"; then + $doit $rmcmd -f "$dst" 2>/dev/null \ + || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null \ + && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }; }\ + || { + echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + else + : + fi + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + } || exit 1 + + trap '' 0 + fi +done + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/config-aux/missing b/config-aux/missing new file mode 100755 index 0000000..1c8ff70 --- /dev/null +++ b/config-aux/missing @@ -0,0 +1,367 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. + +scriptversion=2006-05-10.23 + +# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006 +# Free Software Foundation, Inc. +# Originally by Fran,cois Pinard , 1996. + +# 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., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 +fi + +run=: +sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' +sed_minuso='s/.* -o \([^ ]*\).*/\1/p' + +# In the cases where this matters, `missing' is being run in the +# srcdir already. +if test -f configure.ac; then + configure_ac=configure.ac +else + configure_ac=configure.in +fi + +msg="missing on your system" + +case $1 in +--run) + # Try to run requested program, and just exit if it succeeds. + run= + shift + "$@" && exit 0 + # Exit code 63 means version mismatch. This often happens + # when the user try to use an ancient version of a tool on + # a file that requires a minimum version. In this case we + # we should proceed has if the program had been absent, or + # if --run hadn't been passed. + if test $? = 63; then + run=: + msg="probably too old" + fi + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an +error status if there is no known handling for PROGRAM. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + --run try to run the given command, and emulate it if it fails + +Supported PROGRAM values: + aclocal touch file \`aclocal.m4' + autoconf touch file \`configure' + autoheader touch file \`config.h.in' + autom4te touch the output file, or create a stub one + automake touch all \`Makefile.in' files + bison create \`y.tab.[ch]', if possible, from existing .[ch] + flex create \`lex.yy.c', if possible, from existing .c + help2man touch the output file + lex create \`lex.yy.c', if possible, from existing .c + makeinfo touch the output file + tar try tar, gnutar, gtar, then tar without non-portable flags + yacc create \`y.tab.[ch]', if possible, from existing .[ch] + +Send bug reports to ." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: Unknown \`$1' option" + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 + ;; + +esac + +# Now exit if we have it, but it failed. Also exit now if we +# don't have it and --version was passed (most likely to detect +# the program). +case $1 in + lex|yacc) + # Not GNU programs, they don't have --version. + ;; + + tar) + if test -n "$run"; then + echo 1>&2 "ERROR: \`tar' requires --run" + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + exit 1 + fi + ;; + + *) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + # Could not run --version or --help. This is probably someone + # running `$TOOL --version' or `$TOOL --help' to check whether + # $TOOL exists and not knowing $TOOL uses missing. + exit 1 + fi + ;; +esac + +# If it does not exist, or fails to run (possibly an outdated version), +# try to emulate it. +case $1 in + aclocal*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acinclude.m4' or \`${configure_ac}'. You might want + to install the \`Automake' and \`Perl' packages. Grab them from + any GNU archive site." + touch aclocal.m4 + ;; + + autoconf) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`${configure_ac}'. You might want to install the + \`Autoconf' and \`GNU m4' packages. Grab them from any GNU + archive site." + touch configure + ;; + + autoheader) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acconfig.h' or \`${configure_ac}'. You might want + to install the \`Autoconf' and \`GNU m4' packages. Grab them + from any GNU archive site." + files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` + test -z "$files" && files="config.h" + touch_files= + for f in $files; do + case $f in + *:*) touch_files="$touch_files "`echo "$f" | + sed -e 's/^[^:]*://' -e 's/:.*//'`;; + *) touch_files="$touch_files $f.in";; + esac + done + touch $touch_files + ;; + + automake*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. + You might want to install the \`Automake' and \`Perl' packages. + Grab them from any GNU archive site." + find . -type f -name Makefile.am -print | + sed 's/\.am$/.in/' | + while read f; do touch "$f"; done + ;; + + autom4te) + echo 1>&2 "\ +WARNING: \`$1' is needed, but is $msg. + You might have modified some files without having the + proper tools for further handling them. + You can get \`$1' as part of \`Autoconf' from any GNU + archive site." + + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo "#! /bin/sh" + echo "# Created by GNU Automake missing as a replacement of" + echo "# $ $@" + echo "exit 0" + chmod +x $file + exit 1 + fi + ;; + + bison|yacc) + echo 1>&2 "\ +WARNING: \`$1' $msg. You should only need it if + you modified a \`.y' file. You may need the \`Bison' package + in order for those modifications to take effect. You can get + \`Bison' from any GNU archive site." + rm -f y.tab.c y.tab.h + if test $# -ne 1; then + eval LASTARG="\${$#}" + case $LASTARG in + *.y) + SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" y.tab.c + fi + SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" y.tab.h + fi + ;; + esac + fi + if test ! -f y.tab.h; then + echo >y.tab.h + fi + if test ! -f y.tab.c; then + echo 'main() { return 0; }' >y.tab.c + fi + ;; + + lex|flex) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.l' file. You may need the \`Flex' package + in order for those modifications to take effect. You can get + \`Flex' from any GNU archive site." + rm -f lex.yy.c + if test $# -ne 1; then + eval LASTARG="\${$#}" + case $LASTARG in + *.l) + SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" lex.yy.c + fi + ;; + esac + fi + if test ! -f lex.yy.c; then + echo 'main() { return 0; }' >lex.yy.c + fi + ;; + + help2man) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a dependency of a manual page. You may need the + \`Help2man' package in order for those modifications to take + effect. You can get \`Help2man' from any GNU archive site." + + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo ".ab help2man is required to generate this page" + exit 1 + fi + ;; + + makeinfo) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.texi' or \`.texinfo' file, or any other file + indirectly affecting the aspect of the manual. The spurious + call might also be the consequence of using a buggy \`make' (AIX, + DU, IRIX). You might want to install the \`Texinfo' package or + the \`GNU make' package. Grab either from any GNU archive site." + # The file to touch is that specified with -o ... + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -z "$file"; then + # ... or it is the one specified with @setfilename ... + infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` + file=`sed -n ' + /^@setfilename/{ + s/.* \([^ ]*\) *$/\1/ + p + q + }' $infile` + # ... or it is derived from the source name (dir/f.texi becomes f.info) + test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info + fi + # If the file does not exist, the user really needs makeinfo; + # let's fail without touching anything. + test -f $file || exit 1 + touch $file + ;; + + tar) + shift + + # We have already tried tar in the generic part. + # Look for gnutar/gtar before invocation to avoid ugly error + # messages. + if (gnutar --version > /dev/null 2>&1); then + gnutar "$@" && exit 0 + fi + if (gtar --version > /dev/null 2>&1); then + gtar "$@" && exit 0 + fi + firstarg="$1" + if shift; then + case $firstarg in + *o*) + firstarg=`echo "$firstarg" | sed s/o//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + case $firstarg in + *h*) + firstarg=`echo "$firstarg" | sed s/h//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + fi + + echo 1>&2 "\ +WARNING: I can't seem to be able to run \`tar' with the given arguments. + You may want to install GNU tar or Free paxutils, or check the + command line arguments." + exit 1 + ;; + + *) + echo 1>&2 "\ +WARNING: \`$1' is needed, and is $msg. + You might have modified some files without having the + proper tools for further handling them. Check the \`README' file, + it often tells you about the needed prerequisites for installing + this package. You may also peek at any GNU archive site, in case + some other package would contain this missing \`$1' program." + exit 1 + ;; +esac + +exit 0 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/config-aux/mkinstalldirs b/config-aux/mkinstalldirs new file mode 100755 index 0000000..259dbfc --- /dev/null +++ b/config-aux/mkinstalldirs @@ -0,0 +1,158 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy + +scriptversion=2005-06-29.22 + +# Original author: Noah Friedman +# Created: 1993-05-16 +# Public domain. +# +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +errstatus=0 +dirmode= + +usage="\ +Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ... + +Create each directory DIR (with mode MODE, if specified), including all +leading file name components. + +Report bugs to ." + +# process command line arguments +while test $# -gt 0 ; do + case $1 in + -h | --help | --h*) # -h for help + echo "$usage" + exit $? + ;; + -m) # -m PERM arg + shift + test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } + dirmode=$1 + shift + ;; + --version) + echo "$0 $scriptversion" + exit $? + ;; + --) # stop option processing + shift + break + ;; + -*) # unknown option + echo "$usage" 1>&2 + exit 1 + ;; + *) # first non-opt arg + break + ;; + esac +done + +for file +do + if test -d "$file"; then + shift + else + break + fi +done + +case $# in + 0) exit 0 ;; +esac + +# Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and +# mkdir -p a/c at the same time, both will detect that a is missing, +# one will create a, then the other will try to create a and die with +# a "File exists" error. This is a problem when calling mkinstalldirs +# from a parallel make. We use --version in the probe to restrict +# ourselves to GNU mkdir, which is thread-safe. +case $dirmode in + '') + if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then + echo "mkdir -p -- $*" + exec mkdir -p -- "$@" + else + # On NextStep and OpenStep, the `mkdir' command does not + # recognize any option. It will interpret all options as + # directories to create, and then abort because `.' already + # exists. + test -d ./-p && rmdir ./-p + test -d ./--version && rmdir ./--version + fi + ;; + *) + if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 && + test ! -d ./--version; then + echo "mkdir -m $dirmode -p -- $*" + exec mkdir -m "$dirmode" -p -- "$@" + else + # Clean up after NextStep and OpenStep mkdir. + for d in ./-m ./-p ./--version "./$dirmode"; + do + test -d $d && rmdir $d + done + fi + ;; +esac + +for file +do + case $file in + /*) pathcomp=/ ;; + *) pathcomp= ;; + esac + oIFS=$IFS + IFS=/ + set fnord $file + shift + IFS=$oIFS + + for d + do + test "x$d" = x && continue + + pathcomp=$pathcomp$d + case $pathcomp in + -*) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + else + if test ! -z "$dirmode"; then + echo "chmod $dirmode $pathcomp" + lasterr= + chmod "$dirmode" "$pathcomp" || lasterr=$? + + if test ! -z "$lasterr"; then + errstatus=$lasterr + fi + fi + fi + fi + + pathcomp=$pathcomp/ + done +done + +exit $errstatus + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/config-aux/move-if-change b/config-aux/move-if-change new file mode 100755 index 0000000..ff74a55 --- /dev/null +++ b/config-aux/move-if-change @@ -0,0 +1,22 @@ +#!/bin/sh +# Like mv $1 $2, but if the files are the same, just delete $1. +# Status is zero if successful, nonzero otherwise. + +usage="$0: usage: $0 SOURCE DEST" + +case $# in +2) ;; +*) echo "$usage" >&2; exit 1;; +esac + +for arg in "$1" "$2"; do + case $arg in + -*) echo "$usage" >&2; exit 1;; + esac +done + +if test -r "$2" && cmp -s "$1" "$2"; then + rm -f "$1" +else + mv -f "$1" "$2" +fi diff --git a/config-aux/no-executables.m4 b/config-aux/no-executables.m4 new file mode 100644 index 0000000..c4d0b70 --- /dev/null +++ b/config-aux/no-executables.m4 @@ -0,0 +1,69 @@ +# GCC_NO_EXECUTABLES +# ----------------- +# FIXME: The GCC team has specific needs which the current Autoconf +# framework cannot solve elegantly. This macro implements a dirty +# hack until Autoconf is able to provide the services its users +# need. +# +# Several of the support libraries that are often built with GCC can't +# assume the tool-chain is already capable of linking a program: the +# compiler often expects to be able to link with some of such +# libraries. +# +# In several of these libraries, workarounds have been introduced to +# avoid the AC_PROG_CC_WORKS test, that would just abort their +# configuration. The introduction of AC_EXEEXT, enabled either by +# libtool or by CVS autoconf, have just made matters worse. +# +# Unlike the previous AC_NO_EXECUTABLES, this test does not +# disable link tests at autoconf time, but at configure time. +# This allows AC_NO_EXECUTABLES to be invoked conditionally. +AC_DEFUN_ONCE([GCC_NO_EXECUTABLES], +[m4_divert_push([KILL]) + +AC_BEFORE([$0], [_AC_COMPILER_EXEEXT]) +AC_BEFORE([$0], [AC_LINK_IFELSE]) + +m4_define([_AC_COMPILER_EXEEXT], +AC_LANG_CONFTEST([AC_LANG_PROGRAM()]) +# FIXME: Cleanup? +AS_IF([AC_TRY_EVAL(ac_link)], [gcc_no_link=no], [gcc_no_link=yes]) +if test x$gcc_no_link = xyes; then + # Setting cross_compile will disable run tests; it will + # also disable AC_CHECK_FILE but that's generally + # correct if we can't link. + cross_compiling=yes + EXEEXT= +else + m4_defn([_AC_COMPILER_EXEEXT])dnl +fi +) + +m4_define([AC_LINK_IFELSE], +if test x$gcc_no_link = xyes; then + AC_MSG_ERROR([Link tests are not allowed after [[$0]].]) +fi +m4_defn([AC_LINK_IFELSE])) + +dnl This is a shame. We have to provide a default for some link tests, +dnl similar to the default for run tests. +m4_define([AC_FUNC_MMAP], +if test x$gcc_no_link = xyes; then + if test "x${ac_cv_func_mmap_fixed_mapped+set}" != xset; then + ac_cv_func_mmap_fixed_mapped=no + fi +fi +if test "x${ac_cv_func_mmap_fixed_mapped}" != xno; then + m4_defn([AC_FUNC_MMAP]) +fi) + +m4_divert_pop()dnl +])# GCC_NO_EXECUTABLES + +# Use the strongest available test out of AC_TRY_COMPILE and AC_TRY_LINK. +AC_DEFUN([GCC_TRY_COMPILE_OR_LINK], +[if test x$gcc_no_link = xyes; then + AC_TRY_COMPILE([$1], [$2], [$3], [$4]) +else + AC_TRY_LINK([$1], [$2], [$3], [$4]) +fi]) diff --git a/config-aux/warnings.m4 b/config-aux/warnings.m4 new file mode 100644 index 0000000..d3358b6 --- /dev/null +++ b/config-aux/warnings.m4 @@ -0,0 +1,108 @@ +# Autoconf include file defining macros related to compile-time warnings. + +# Copyright 2004, 2005, 2007 Free Software Foundation, Inc. + +#This file is part of GCC. + +#GCC 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. + +#GCC 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 GCC; see the file COPYING. If not, write to the Free +#Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA +#02110-1301, USA. + +# ACX_PROG_CC_WARNING_OPTS(WARNINGS, [VARIABLE = WARN_CFLAGS) +# Sets @VARIABLE@ to the subset of the given options which the +# compiler accepts. +AC_DEFUN([ACX_PROG_CC_WARNING_OPTS], +[AC_REQUIRE([AC_PROG_CC])dnl +m4_pushdef([acx_Var], [m4_default([$2], [WARN_CFLAGS])])dnl +AC_SUBST(acx_Var)dnl +m4_expand_once([acx_Var= +],m4_quote(acx_Var=))dnl +save_CFLAGS="$CFLAGS" +for option in $1; do + AS_VAR_PUSHDEF([acx_Woption], [acx_cv_prog_cc_warning_$option]) + AC_CACHE_CHECK([whether $CC supports $option], acx_Woption, + [CFLAGS="$option" + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],[])], + [AS_VAR_SET(acx_Woption, yes)], + [AS_VAR_SET(acx_Woption, no)]) + ]) + AS_IF([test AS_VAR_GET(acx_Woption) = yes], + [acx_Var="$acx_Var${acx_Var:+ }$option"]) + AS_VAR_POPDEF([acx_Woption])dnl +done +CFLAGS="$save_CFLAGS" +m4_popdef([acx_Var])dnl +])# ACX_PROG_CC_WARNING_OPTS + +# ACX_PROG_CC_WARNING_ALMOST_PEDANTIC(WARNINGS, [VARIABLE = WARN_PEDANTIC) +# Append to VARIABLE "-pedantic" + the argument, if the compiler is GCC +# and accepts all of those options simultaneously, otherwise to nothing. +AC_DEFUN([ACX_PROG_CC_WARNING_ALMOST_PEDANTIC], +[AC_REQUIRE([AC_PROG_CC])dnl +m4_pushdef([acx_Var], [m4_default([$2], [WARN_PEDANTIC])])dnl +AC_SUBST(acx_Var)dnl +m4_expand_once([acx_Var= +],m4_quote(acx_Var=))dnl +AS_VAR_PUSHDEF([acx_Pedantic], [acx_cv_prog_cc_pedantic_$1])dnl +AS_IF([test "$GCC" = yes], +[AC_CACHE_CHECK([whether $CC supports -pedantic $1], acx_Pedantic, +[save_CFLAGS="$CFLAGS" +CFLAGS="-pedantic $1" +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],[])], + [AS_VAR_SET(acx_Pedantic, yes)], + [AS_VAR_SET(acx_Pedantic, no)]) +CFLAGS="$save_CFLAGS"]) +AS_IF([test AS_VAR_GET(acx_Pedantic) = yes], + [acx_Var="$acx_Var${acx_Var:+ }-pedantic $1"]) +]) +AS_VAR_POPDEF([acx_Pedantic])dnl +m4_popdef([acx_Var])dnl +])# ACX_PROG_CC_WARNING_ALMOST_PEDANTIC + +# ACX_PROG_CC_WARNINGS_ARE_ERRORS([x.y.z], [VARIABLE = WERROR]) +# sets @VARIABLE@ to "-Werror" if the compiler is GCC >=x.y.z, or if +# --enable-werror-always was given on the command line, otherwise +# to nothing. +# If the argument is the word "manual" instead of a version number, +# then @VARIABLE@ will be set to -Werror only if --enable-werror-always +# appeared on the configure command line. +AC_DEFUN([ACX_PROG_CC_WARNINGS_ARE_ERRORS], +[AC_REQUIRE([AC_PROG_CC])dnl +m4_pushdef([acx_Var], [m4_default([$2], [WERROR])])dnl +AC_SUBST(acx_Var)dnl +m4_expand_once([acx_Var= +],m4_quote(acx_Var=))dnl +AC_ARG_ENABLE(werror-always, + AS_HELP_STRING([--enable-werror-always], + [enable -Werror despite compiler version]), +[], [enable_werror_always=no]) +AS_IF([test $enable_werror_always = yes], + [acx_Var="$acx_Var${acx_Var:+ }-Werror"]) + m4_if($1, [manual],, + [AS_VAR_PUSHDEF([acx_GCCvers], [acx_cv_prog_cc_gcc_$1_or_newer])dnl + AC_CACHE_CHECK([whether $CC is GCC >=$1], acx_GCCvers, + [set fnord `echo $1 | tr '.' ' '` + shift + AC_PREPROC_IFELSE( +[#if __GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__ \ + < [$]1 * 10000 + [$]2 * 100 + [$]3 +#error insufficient +#endif], + [AS_VAR_SET(acx_GCCvers, yes)], + [AS_VAR_SET(acx_GCCvers, no)])]) + AS_IF([test AS_VAR_GET(acx_GCCvers) = yes], + [acx_Var="$acx_Var${acx_Var:+ }-Werror"]) + AS_VAR_POPDEF([acx_GCCvers])]) +m4_popdef([acx_Var])dnl +])# ACX_PROG_CC_WARNINGS_ARE_ERRORS diff --git a/configure b/configure new file mode 100755 index 0000000..99bfc20 --- /dev/null +++ b/configure @@ -0,0 +1,4707 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.61 for nesc 1.3.0. +# +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + + + +# PATH needs CR +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +as_nl=' +' +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + { (exit 1); exit 1; } +fi + +# Work around bugs in pre-3.0 UWIN ksh. +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + + +# Name of the executable. +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# CDPATH. +$as_unset CDPATH + + +if test "x$CONFIG_SHELL" = x; then + if (eval ":") 2>/dev/null; then + as_have_required=yes +else + as_have_required=no +fi + + if test $as_have_required = yes && (eval ": +(as_func_return () { + (exit \$1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = \"\$1\" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test \$exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=\$LINENO + as_lineno_2=\$LINENO + test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && + test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } +") 2> /dev/null; then + : +else + as_candidate_shells= + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + case $as_dir in + /*) + for as_base in sh bash ksh sh5; do + as_candidate_shells="$as_candidate_shells $as_dir/$as_base" + done;; + esac +done +IFS=$as_save_IFS + + + for as_shell in $as_candidate_shells $SHELL; do + # Try only shells that exist, to save several forks. + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { ("$as_shell") 2> /dev/null <<\_ASEOF +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + +: +_ASEOF +}; then + CONFIG_SHELL=$as_shell + as_have_required=yes + if { "$as_shell" 2> /dev/null <<\_ASEOF +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + +: +(as_func_return () { + (exit $1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = "$1" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test $exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } + +_ASEOF +}; then + break +fi + +fi + + done + + if test "x$CONFIG_SHELL" != x; then + for as_var in BASH_ENV ENV + do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var + done + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} +fi + + + if test $as_have_required = no; then + echo This script requires a shell more modern than all the + echo shells that I found on your system. Please install a + echo modern shell, or manually run the script under such a + echo shell if you do have one. + { (exit 1); exit 1; } +fi + + +fi + +fi + + + +(eval "as_func_return () { + (exit \$1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = \"\$1\" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test \$exitcode = 0") || { + echo No shell found that supports shell functions. + echo Please tell autoconf@gnu.org about your system, + echo including any error possibly output before this + echo message +} + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in +-n*) + case `echo 'x\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + *) ECHO_C='\c';; + esac;; +*) + ECHO_N='-n';; +esac + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir +fi +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + + +exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} + +# Identity of this package. +PACKAGE_NAME='nesc' +PACKAGE_TARNAME='nesc' +PACKAGE_VERSION='1.3.0' +PACKAGE_STRING='nesc 1.3.0' +PACKAGE_BUGREPORT='' + +ac_subst_vars='SHELL +PATH_SEPARATOR +PACKAGE_NAME +PACKAGE_TARNAME +PACKAGE_VERSION +PACKAGE_STRING +PACKAGE_BUGREPORT +exec_prefix +prefix +program_transform_name +bindir +sbindir +libexecdir +datarootdir +datadir +sysconfdir +sharedstatedir +localstatedir +includedir +oldincludedir +docdir +infodir +htmldir +dvidir +pdfdir +psdir +libdir +localedir +mandir +DEFS +ECHO_C +ECHO_N +ECHO_T +LIBS +build_alias +host_alias +target_alias +INSTALL_PROGRAM +INSTALL_SCRIPT +INSTALL_DATA +am__isrc +CYGPATH_W +PACKAGE +VERSION +ACLOCAL +AUTOCONF +AUTOMAKE +AUTOHEADER +MAKEINFO +install_sh +STRIP +INSTALL_STRIP_PROGRAM +mkdir_p +AWK +SET_MAKE +am__leading_dot +AMTAR +am__tar +am__untar +subdirs +CC +CFLAGS +LDFLAGS +CPPFLAGS +ac_ct_CC +EXEEXT +OBJEXT +DEPDIR +am__include +am__quote +AMDEP_TRUE +AMDEP_FALSE +AMDEPBACKSLASH +CCDEPMODE +am__fastdepCC_TRUE +am__fastdepCC_FALSE +pathperl +LIBOBJS +LTLIBOBJS' +ac_subst_files='' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS' +ac_subdirs_all='src libiberty libcpp' + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` + eval enable_$ac_feature=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` + eval enable_$ac_feature=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package | sed 's/[-.]/_/g'` + eval with_$ac_package=\$ac_optarg ;; + + -without-* | --without-*) + ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package | sed 's/[-.]/_/g'` + eval with_$ac_package=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) { echo "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + { echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } +fi + +# Be sure to have absolute directory names. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; } +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + { echo "$as_me: error: Working directory cannot be determined" >&2 + { (exit 1); exit 1; }; } +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + { echo "$as_me: error: pwd does not report name of working directory" >&2 + { (exit 1); exit 1; }; } + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$0" || +$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$0" : 'X\(//\)[^/]' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +echo X"$0" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 + { (exit 1); exit 1; }; } +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2 + { (exit 1); exit 1; }; } + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures nesc 1.3.0 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/nesc] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of nesc 1.3.0:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +nesc configure 1.3.0 +generated by GNU Autoconf 2.61 + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by nesc $as_me 1.3.0, which was +generated by GNU Autoconf 2.61. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + echo "PATH: $as_dir" +done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; + 2) + ac_configure_args1="$ac_configure_args1 '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + ac_configure_args="$ac_configure_args '$ac_arg'" + ;; + esac + done +done +$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } +$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + cat <<\_ASBOX +## ---------------- ## +## Cache variables. ## +## ---------------- ## +_ASBOX + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 +echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + *) $as_unset $ac_var ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + cat <<\_ASBOX +## ----------------- ## +## Output variables. ## +## ----------------- ## +_ASBOX + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + cat <<\_ASBOX +## ------------------- ## +## File substitutions. ## +## ------------------- ## +_ASBOX + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + cat <<\_ASBOX +## ----------- ## +## confdefs.h. ## +## ----------- ## +_ASBOX + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + echo "$as_me: caught signal $ac_signal" + echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer explicitly selected file to automatically selected ones. +if test -n "$CONFIG_SITE"; then + set x "$CONFIG_SITE" +elif test "x$prefix" != xNONE; then + set x "$prefix/share/config.site" "$prefix/etc/config.site" +else + set x "$ac_default_prefix/share/config.site" \ + "$ac_default_prefix/etc/config.site" +fi +shift +for ac_site_file +do + if test -r "$ac_site_file"; then + { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 +echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special + # files actually), so we avoid doing that. + if test -f "$cache_file"; then + { echo "$as_me:$LINENO: loading cache $cache_file" >&5 +echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { echo "$as_me:$LINENO: creating cache $cache_file" >&5 +echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 +echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 +echo "$as_me: former value: $ac_old_val" >&2;} + { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 +echo "$as_me: current value: $ac_new_val" >&2;} + ac_cache_corrupted=: + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 +echo "$as_me: error: changes in the environment can compromise the build" >&2;} + { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } +fi + + + + + + + + + + + + + + + + + + + + + + + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +ac_aux_dir= +for ac_dir in config-aux "$srcdir"/config-aux; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in config-aux \"$srcdir\"/config-aux" >&5 +echo "$as_me: error: cannot find install-sh or install.sh in config-aux \"$srcdir\"/config-aux" >&2;} + { (exit 1); exit 1; }; } +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + + +am__api_version='1.10' + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +{ echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; } +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in + ./ | .// | /cC/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + done + done + ;; +esac +done +IFS=$as_save_IFS + + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ echo "$as_me:$LINENO: result: $INSTALL" >&5 +echo "${ECHO_T}$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ echo "$as_me:$LINENO: checking whether build environment is sane" >&5 +echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6; } +# Just in case +sleep 1 +echo timestamp > conftest.file +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftest.file` + fi + rm -f conftest.file + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" >&5 +echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" >&2;} + { (exit 1); exit 1; }; } + fi + + test "$2" = conftest.file + ) +then + # Ok. + : +else + { { echo "$as_me:$LINENO: error: newly created file is older than distributed files! +Check your system clock" >&5 +echo "$as_me: error: newly created file is older than distributed files! +Check your system clock" >&2;} + { (exit 1); exit 1; }; } +fi +{ echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. echo might interpret backslashes. +# By default was `s,x,x', remove it if useless. +cat <<\_ACEOF >conftest.sed +s/[\\$]/&&/g;s/;s,x,x,$// +_ACEOF +program_transform_name=`echo $program_transform_name | sed -f conftest.sed` +rm -f conftest.sed + +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` + +test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 +echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} +fi + +{ echo "$as_me:$LINENO: checking for a thread-safe mkdir -p" >&5 +echo $ECHO_N "checking for a thread-safe mkdir -p... $ECHO_C" >&6; } +if test -z "$MKDIR_P"; then + if test "${ac_cv_path_mkdir+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done +done +IFS=$as_save_IFS + +fi + + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + test -d ./--version && rmdir ./--version + MKDIR_P="$ac_install_sh -d" + fi +fi +{ echo "$as_me:$LINENO: result: $MKDIR_P" >&5 +echo "${ECHO_T}$MKDIR_P" >&6; } + +mkdir_p="$MKDIR_P" +case $mkdir_p in + [\\/$]* | ?:[\\/]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_AWK+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AWK="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { echo "$as_me:$LINENO: result: $AWK" >&5 +echo "${ECHO_T}$AWK" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; } +set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } + SET_MAKE= +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 +echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} + { (exit 1); exit 1; }; } + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='nesc' + VERSION='1.3.0' + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"} + +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_STRIP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { echo "$as_me:$LINENO: result: $STRIP" >&5 +echo "${ECHO_T}$STRIP" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_STRIP="strip" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 +echo "${ECHO_T}$ac_ct_STRIP" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +# Always define AMTAR for backward compatibility. + +AMTAR=${AMTAR-"${am_missing_run}tar"} + +am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' + + + + + + +subdirs="$subdirs src libiberty libcpp" + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + +# Provide some information about the compiler. +echo "$as_me:$LINENO: checking for C compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (ac_try="$ac_compiler --version >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler --version >&5") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler -v >&5") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler -V >&5") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 +echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; } +ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` +# +# List of possible output files, starting from the most likely. +# The algorithm is not robust to junk in `.', hence go to wildcards (a.*) +# only as a last resort. b.out is created by i960 compilers. +ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out' +# +# The IRIX 6 linker writes into existing files which may not be +# executable, retaining their permissions. Remove them first so a +# subsequent execution test works. +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { (ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi + +{ echo "$as_me:$LINENO: result: $ac_file" >&5 +echo "${ECHO_T}$ac_file" >&6; } +if test -z "$ac_file"; then + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: C compiler cannot create executables +See \`config.log' for more details." >&5 +echo "$as_me: error: C compiler cannot create executables +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; } +fi + +ac_exeext=$ac_cv_exeext + +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ echo "$as_me:$LINENO: checking whether the C compiler works" >&5 +echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; } +# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 +# If not cross compiling, check that we can run a simple program. +if test "$cross_compiling" != yes; then + if { ac_try='./$ac_file' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { echo "$as_me:$LINENO: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + fi + fi +fi +{ echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } + +rm -f a.out a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 +echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; } +{ echo "$as_me:$LINENO: result: $cross_compiling" >&5 +echo "${ECHO_T}$cross_compiling" >&6; } + +{ echo "$as_me:$LINENO: checking for suffix of executables" >&5 +echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; } +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest$ac_cv_exeext +{ echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 +echo "${ECHO_T}$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +{ echo "$as_me:$LINENO: checking for suffix of object files" >&5 +echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; } +if test "${ac_cv_objext+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 +echo "${ECHO_T}$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; } +if test "${ac_cv_c_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_compiler_gnu=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; } +GCC=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; } +if test "${ac_cv_prog_cc_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + CFLAGS="" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 +echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; } +if test "${ac_cv_prog_cc_c89+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_c89=$ac_arg +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { echo "$as_me:$LINENO: result: none needed" >&5 +echo "${ECHO_T}none needed" >&6; } ;; + xno) + { echo "$as_me:$LINENO: result: unsupported" >&5 +echo "${ECHO_T}unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;; +esac + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo done +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 +echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6; } +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# We grep out `Entering directory' and `Leaving directory' +# messages which can occur if `w' ends up in MAKEFLAGS. +# In particular we don't look at `^make:' because GNU make might +# be invoked under some other name (usually "gmake"), in which +# case it prints its new name instead of `make'. +if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then + am__include=include + am__quote= + _am_result=GNU +fi +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then + am__include=.include + am__quote="\"" + _am_result=BSD + fi +fi + + +{ echo "$as_me:$LINENO: result: $_am_result" >&5 +echo "${ECHO_T}$_am_result" >&6; } +rm -f confinc confmf + +# Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + + +depcc="$CC" am_compiler_list= + +{ echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 +echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6; } +if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 +echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + + +# Extract the first word of "perl", so it can be a program name with args. +set dummy perl; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_path_pathperl+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $pathperl in + [\\/]* | ?:[\\/]*) + ac_cv_path_pathperl="$pathperl" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_pathperl="$as_dir/$ac_word$ac_exec_ext" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + + ;; +esac +fi +pathperl=$ac_cv_path_pathperl +if test -n "$pathperl"; then + { echo "$as_me:$LINENO: result: $pathperl" >&5 +echo "${ECHO_T}$pathperl" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + +if test -z "$pathperl" ; then + { { echo "$as_me:$LINENO: error: I can't find perl" >&5 +echo "$as_me: error: I can't find perl" >&2;} + { (exit 1); exit 1; }; }; +fi + +ac_config_files="$ac_config_files Makefile doc/Makefile tools/Makefile tools/nescc-mig tools/nescc-ncg tools/nescc tools/nescc-diff tools/nescc-wiring tools/java/Makefile tools/java/net/Makefile tools/java/net/tinyos/Makefile tools/java/net/tinyos/nesc/Makefile tools/java/net/tinyos/nesc/wiring/Makefile tools/java/net/tinyos/nesc/dump/Makefile tools/java/net/tinyos/nesc/dump/xml/Makefile" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 +echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + *) $as_unset $ac_var ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + test "x$cache_file" != "x/dev/null" && + { echo "$as_me:$LINENO: updating cache $cache_file" >&5 +echo "$as_me: updating cache $cache_file" >&6;} + cat confcache >$cache_file + else + { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 +echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# Transform confdefs.h into DEFS. +# Protect against shell expansion while executing Makefile rules. +# Protect against Makefile macro expansion. +# +# If the first sed substitution is executed (which looks for macros that +# take arguments), then branch to the quote section. Otherwise, +# look for a macro that doesn't take arguments. +ac_script=' +t clear +:clear +s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g +t quote +s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g +t quote +b any +:quote +s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g +s/\[/\\&/g +s/\]/\\&/g +s/\$/$$/g +H +:any +${ + g + s/^\n// + s/\n/ /g + p +} +' +DEFS=`sed -n "$ac_script" confdefs.h` + + +ac_libobjs= +ac_ltlibobjs= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi + +: ${CONFIG_STATUS=./config.status} +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 +echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >$CONFIG_STATUS <<_ACEOF +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false +SHELL=\${CONFIG_SHELL-$SHELL} +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + + + +# PATH needs CR +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +as_nl=' +' +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + { (exit 1); exit 1; } +fi + +# Work around bugs in pre-3.0 UWIN ksh. +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + + +# Name of the executable. +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# CDPATH. +$as_unset CDPATH + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in +-n*) + case `echo 'x\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + *) ECHO_C='\c';; + esac;; +*) + ECHO_N='-n';; +esac + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir +fi +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 + +# Save the log message, to keep $[0] and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by nesc $as_me 1.3.0, which was +generated by GNU Autoconf 2.61. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF +# Files that config.status was made for. +config_files="$ac_config_files" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTIONS] [FILE]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + +Configuration files: +$config_files + +Configuration commands: +$config_commands + +Report bugs to ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF +ac_cs_version="\\ +nesc config.status 1.3.0 +configured by $0, generated by GNU Autoconf 2.61, + with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" + +Copyright (C) 2006 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +# If no file are specified by the user, then we need to provide default +# value. By we need to know if files were specified by the user. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + echo "$ac_cs_version"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + CONFIG_FILES="$CONFIG_FILES $ac_optarg" + ac_need_defaults=false;; + --he | --h | --help | --hel | -h ) + echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) { echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$ac_config_targets $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF +if \$ac_cs_recheck; then + echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 + CONFIG_SHELL=$SHELL + export CONFIG_SHELL + exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; + "tools/Makefile") CONFIG_FILES="$CONFIG_FILES tools/Makefile" ;; + "tools/nescc-mig") CONFIG_FILES="$CONFIG_FILES tools/nescc-mig" ;; + "tools/nescc-ncg") CONFIG_FILES="$CONFIG_FILES tools/nescc-ncg" ;; + "tools/nescc") CONFIG_FILES="$CONFIG_FILES tools/nescc" ;; + "tools/nescc-diff") CONFIG_FILES="$CONFIG_FILES tools/nescc-diff" ;; + "tools/nescc-wiring") CONFIG_FILES="$CONFIG_FILES tools/nescc-wiring" ;; + "tools/java/Makefile") CONFIG_FILES="$CONFIG_FILES tools/java/Makefile" ;; + "tools/java/net/Makefile") CONFIG_FILES="$CONFIG_FILES tools/java/net/Makefile" ;; + "tools/java/net/tinyos/Makefile") CONFIG_FILES="$CONFIG_FILES tools/java/net/tinyos/Makefile" ;; + "tools/java/net/tinyos/nesc/Makefile") CONFIG_FILES="$CONFIG_FILES tools/java/net/tinyos/nesc/Makefile" ;; + "tools/java/net/tinyos/nesc/wiring/Makefile") CONFIG_FILES="$CONFIG_FILES tools/java/net/tinyos/nesc/wiring/Makefile" ;; + "tools/java/net/tinyos/nesc/dump/Makefile") CONFIG_FILES="$CONFIG_FILES tools/java/net/tinyos/nesc/dump/Makefile" ;; + "tools/java/net/tinyos/nesc/dump/xml/Makefile") CONFIG_FILES="$CONFIG_FILES tools/java/net/tinyos/nesc/dump/xml/Makefile" ;; + + *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= + trap 'exit_status=$? + { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status +' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || +{ + echo "$me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} + +# +# Set up the sed scripts for CONFIG_FILES section. +# + +# No need to generate the scripts if there are no CONFIG_FILES. +# This happens for instance when ./config.status config.h +if test -n "$CONFIG_FILES"; then + +_ACEOF + + + +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + cat >conf$$subs.sed <<_ACEOF +SHELL!$SHELL$ac_delim +PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim +PACKAGE_NAME!$PACKAGE_NAME$ac_delim +PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim +PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim +PACKAGE_STRING!$PACKAGE_STRING$ac_delim +PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim +exec_prefix!$exec_prefix$ac_delim +prefix!$prefix$ac_delim +program_transform_name!$program_transform_name$ac_delim +bindir!$bindir$ac_delim +sbindir!$sbindir$ac_delim +libexecdir!$libexecdir$ac_delim +datarootdir!$datarootdir$ac_delim +datadir!$datadir$ac_delim +sysconfdir!$sysconfdir$ac_delim +sharedstatedir!$sharedstatedir$ac_delim +localstatedir!$localstatedir$ac_delim +includedir!$includedir$ac_delim +oldincludedir!$oldincludedir$ac_delim +docdir!$docdir$ac_delim +infodir!$infodir$ac_delim +htmldir!$htmldir$ac_delim +dvidir!$dvidir$ac_delim +pdfdir!$pdfdir$ac_delim +psdir!$psdir$ac_delim +libdir!$libdir$ac_delim +localedir!$localedir$ac_delim +mandir!$mandir$ac_delim +DEFS!$DEFS$ac_delim +ECHO_C!$ECHO_C$ac_delim +ECHO_N!$ECHO_N$ac_delim +ECHO_T!$ECHO_T$ac_delim +LIBS!$LIBS$ac_delim +build_alias!$build_alias$ac_delim +host_alias!$host_alias$ac_delim +target_alias!$target_alias$ac_delim +INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim +INSTALL_SCRIPT!$INSTALL_SCRIPT$ac_delim +INSTALL_DATA!$INSTALL_DATA$ac_delim +am__isrc!$am__isrc$ac_delim +CYGPATH_W!$CYGPATH_W$ac_delim +PACKAGE!$PACKAGE$ac_delim +VERSION!$VERSION$ac_delim +ACLOCAL!$ACLOCAL$ac_delim +AUTOCONF!$AUTOCONF$ac_delim +AUTOMAKE!$AUTOMAKE$ac_delim +AUTOHEADER!$AUTOHEADER$ac_delim +MAKEINFO!$MAKEINFO$ac_delim +install_sh!$install_sh$ac_delim +STRIP!$STRIP$ac_delim +INSTALL_STRIP_PROGRAM!$INSTALL_STRIP_PROGRAM$ac_delim +mkdir_p!$mkdir_p$ac_delim +AWK!$AWK$ac_delim +SET_MAKE!$SET_MAKE$ac_delim +am__leading_dot!$am__leading_dot$ac_delim +AMTAR!$AMTAR$ac_delim +am__tar!$am__tar$ac_delim +am__untar!$am__untar$ac_delim +subdirs!$subdirs$ac_delim +CC!$CC$ac_delim +CFLAGS!$CFLAGS$ac_delim +LDFLAGS!$LDFLAGS$ac_delim +CPPFLAGS!$CPPFLAGS$ac_delim +ac_ct_CC!$ac_ct_CC$ac_delim +EXEEXT!$EXEEXT$ac_delim +OBJEXT!$OBJEXT$ac_delim +DEPDIR!$DEPDIR$ac_delim +am__include!$am__include$ac_delim +am__quote!$am__quote$ac_delim +AMDEP_TRUE!$AMDEP_TRUE$ac_delim +AMDEP_FALSE!$AMDEP_FALSE$ac_delim +AMDEPBACKSLASH!$AMDEPBACKSLASH$ac_delim +CCDEPMODE!$CCDEPMODE$ac_delim +am__fastdepCC_TRUE!$am__fastdepCC_TRUE$ac_delim +am__fastdepCC_FALSE!$am__fastdepCC_FALSE$ac_delim +pathperl!$pathperl$ac_delim +LIBOBJS!$LIBOBJS$ac_delim +LTLIBOBJS!$LTLIBOBJS$ac_delim +_ACEOF + + if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 79; then + break + elif $ac_last_try; then + { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed` +if test -n "$ac_eof"; then + ac_eof=`echo "$ac_eof" | sort -nru | sed 1q` + ac_eof=`expr $ac_eof + 1` +fi + +cat >>$CONFIG_STATUS <<_ACEOF +cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b end +_ACEOF +sed ' +s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g +s/^/s,@/; s/!/@,|#_!!_#|/ +:n +t n +s/'"$ac_delim"'$/,g/; t +s/$/\\/; p +N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n +' >>$CONFIG_STATUS >$CONFIG_STATUS <<_ACEOF +:end +s/|#_!!_#|//g +CEOF$ac_eof +_ACEOF + + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/ +s/:*\${srcdir}:*/:/ +s/:*@srcdir@:*/:/ +s/^\([^=]*=[ ]*\):*/\1/ +s/:*$// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF +fi # test -n "$CONFIG_FILES" + + +for ac_tag in :F $CONFIG_FILES :C $CONFIG_COMMANDS +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5 +echo "$as_me: error: Invalid tag $ac_tag." >&2;} + { (exit 1); exit 1; }; };; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 +echo "$as_me: error: cannot find input file: $ac_f" >&2;} + { (exit 1); exit 1; }; };; + esac + ac_file_inputs="$ac_file_inputs $ac_f" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input="Generated from "`IFS=: + echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure." + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + fi + + case $ac_tag in + *:-:* | *:-) cat >"$tmp/stdin";; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + { as_dir="$ac_dir" + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 +echo "$as_me: error: cannot create directory $as_dir" >&2;} + { (exit 1); exit 1; }; }; } + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= + +case `sed -n '/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p +' $ac_file_inputs` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF + sed "$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s&@configure_input@&$configure_input&;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" $ac_file_inputs | sed -f "$tmp/subs-1.sed" >$tmp/out + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && + { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&5 +echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&2;} + + rm -f "$tmp/stdin" + case $ac_file in + -) cat "$tmp/out"; rm -f "$tmp/out";; + *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;; + esac + ;; + + + :C) { echo "$as_me:$LINENO: executing $ac_file commands" >&5 +echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed 10q "$mf" | grep '^#.*generated by automake' > /dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || +echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + { as_dir=$dirpart/$fdir + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 +echo "$as_me: error: cannot create directory $as_dir" >&2;} + { (exit 1); exit 1; }; }; } + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done +done + ;; + + esac +done # for ac_tag + + +{ (exit 0); exit 0; } +_ACEOF +chmod +x $CONFIG_STATUS +ac_clean_files=$ac_clean_files_save + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || { (exit 1); exit 1; } +fi + +# +# CONFIG_SUBDIRS section. +# +if test "$no_recursion" != yes; then + + # Remove --cache-file and --srcdir arguments so they do not pile up. + ac_sub_configure_args= + ac_prev= + eval "set x $ac_configure_args" + shift + for ac_arg + do + if test -n "$ac_prev"; then + ac_prev= + continue + fi + case $ac_arg in + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* \ + | --c=*) + ;; + --config-cache | -C) + ;; + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + ;; + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + ;; + *) + case $ac_arg in + *\'*) ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + ac_sub_configure_args="$ac_sub_configure_args '$ac_arg'" ;; + esac + done + + # Always prepend --prefix to ensure using the same prefix + # in subdir configurations. + ac_arg="--prefix=$prefix" + case $ac_arg in + *\'*) ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + ac_sub_configure_args="'$ac_arg' $ac_sub_configure_args" + + # Pass --silent + if test "$silent" = yes; then + ac_sub_configure_args="--silent $ac_sub_configure_args" + fi + + ac_popdir=`pwd` + for ac_dir in : $subdirs; do test "x$ac_dir" = x: && continue + + # Do not complain, so a configure script can configure whichever + # parts of a large source tree are present. + test -d "$srcdir/$ac_dir" || continue + + ac_msg="=== configuring in $ac_dir (`pwd`/$ac_dir)" + echo "$as_me:$LINENO: $ac_msg" >&5 + echo "$ac_msg" >&6 + { as_dir="$ac_dir" + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 +echo "$as_me: error: cannot create directory $as_dir" >&2;} + { (exit 1); exit 1; }; }; } + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + cd "$ac_dir" + + # Check for guested configure; otherwise get Cygnus style configure. + if test -f "$ac_srcdir/configure.gnu"; then + ac_sub_configure=$ac_srcdir/configure.gnu + elif test -f "$ac_srcdir/configure"; then + ac_sub_configure=$ac_srcdir/configure + elif test -f "$ac_srcdir/configure.in"; then + # This should be Cygnus configure. + ac_sub_configure=$ac_aux_dir/configure + else + { echo "$as_me:$LINENO: WARNING: no configuration information is in $ac_dir" >&5 +echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2;} + ac_sub_configure= + fi + + # The recursion is here. + if test -n "$ac_sub_configure"; then + # Make the cache file name correct relative to the subdirectory. + case $cache_file in + [\\/]* | ?:[\\/]* ) ac_sub_cache_file=$cache_file ;; + *) # Relative name. + ac_sub_cache_file=$ac_top_build_prefix$cache_file ;; + esac + + { echo "$as_me:$LINENO: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5 +echo "$as_me: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;} + # The eval makes quoting arguments work. + eval "\$SHELL \"\$ac_sub_configure\" $ac_sub_configure_args \ + --cache-file=\"\$ac_sub_cache_file\" --srcdir=\"\$ac_srcdir\"" || + { { echo "$as_me:$LINENO: error: $ac_sub_configure failed for $ac_dir" >&5 +echo "$as_me: error: $ac_sub_configure failed for $ac_dir" >&2;} + { (exit 1); exit 1; }; } + fi + + cd "$ac_popdir" + done +fi + diff --git a/configure.in b/configure.in new file mode 100644 index 0000000..12f5aeb --- /dev/null +++ b/configure.in @@ -0,0 +1,57 @@ +# This file is part of the nesC compiler. +# +# This file is derived from the RC Compiler. It is thus +# Copyright (C) 2000-2001 The Regents of the University of California. +# Changes for nesC are +# Copyright (C) 2002 Intel Corporation +# +# The attached "nesC" software is provided to you under the terms and +# conditions of the GNU General Public License Version 2 as published by the +# Free Software Foundation. +# +# nesC 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 nesC; see the file COPYING. If not, write to +# the Free Software Foundation, 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +dnl -*- m4 -*- + +# force autoconf 2.5 on Debian systems +AC_PREREQ(2.50) + +AC_INIT(nesc, 1.3.0) +AC_CONFIG_AUX_DIR(config-aux) + +AM_INIT_AUTOMAKE + +AC_CONFIG_SUBDIRS(src libiberty libcpp) + +AC_PROG_CC + +AC_PATH_PROG(pathperl, perl) +if test -z "$pathperl" ; then + AC_MSG_ERROR(I can't find perl); +fi + +AC_OUTPUT( + Makefile + doc/Makefile + tools/Makefile + tools/nescc-mig + tools/nescc-ncg + tools/nescc + tools/nescc-diff + tools/nescc-wiring + tools/java/Makefile + tools/java/net/Makefile + tools/java/net/tinyos/Makefile + tools/java/net/tinyos/nesc/Makefile + tools/java/net/tinyos/nesc/wiring/Makefile + tools/java/net/tinyos/nesc/dump/Makefile + tools/java/net/tinyos/nesc/dump/xml/Makefile +) diff --git a/doc/COPYING-DOC b/doc/COPYING-DOC new file mode 100644 index 0000000..4a0fe1c --- /dev/null +++ b/doc/COPYING-DOC @@ -0,0 +1,397 @@ + GNU Free Documentation License + Version 1.2, November 2002 + + + Copyright (C) 2000,2001,2002 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + +0. PREAMBLE + +The purpose of this License is to make a manual, textbook, or other +functional and useful document "free" in the sense of freedom: to +assure everyone the effective freedom to copy and redistribute it, +with or without modifying it, either commercially or noncommercially. +Secondarily, this License preserves for the author and publisher a way +to get credit for their work, while not being considered responsible +for modifications made by others. + +This License is a kind of "copyleft", which means that derivative +works of the document must themselves be free in the same sense. It +complements the GNU General Public License, which is a copyleft +license designed for free software. + +We have designed this License in order to use it for manuals for free +software, because free software needs free documentation: a free +program should come with manuals providing the same freedoms that the +software does. But this License is not limited to software manuals; +it can be used for any textual work, regardless of subject matter or +whether it is published as a printed book. We recommend this License +principally for works whose purpose is instruction or reference. + + +1. APPLICABILITY AND DEFINITIONS + +This License applies to any manual or other work, in any medium, that +contains a notice placed by the copyright holder saying it can be +distributed under the terms of this License. Such a notice grants a +world-wide, royalty-free license, unlimited in duration, to use that +work under the conditions stated herein. The "Document", below, +refers to any such manual or work. Any member of the public is a +licensee, and is addressed as "you". You accept the license if you +copy, modify or distribute the work in a way requiring permission +under copyright law. + +A "Modified Version" of the Document means any work containing the +Document or a portion of it, either copied verbatim, or with +modifications and/or translated into another language. + +A "Secondary Section" is a named appendix or a front-matter section of +the Document that deals exclusively with the relationship of the +publishers or authors of the Document to the Document's overall subject +(or to related matters) and contains nothing that could fall directly +within that overall subject. (Thus, if the Document is in part a +textbook of mathematics, a Secondary Section may not explain any +mathematics.) The relationship could be a matter of historical +connection with the subject or with related matters, or of legal, +commercial, philosophical, ethical or political position regarding +them. + +The "Invariant Sections" are certain Secondary Sections whose titles +are designated, as being those of Invariant Sections, in the notice +that says that the Document is released under this License. If a +section does not fit the above definition of Secondary then it is not +allowed to be designated as Invariant. The Document may contain zero +Invariant Sections. If the Document does not identify any Invariant +Sections then there are none. + +The "Cover Texts" are certain short passages of text that are listed, +as Front-Cover Texts or Back-Cover Texts, in the notice that says that +the Document is released under this License. A Front-Cover Text may +be at most 5 words, and a Back-Cover Text may be at most 25 words. + +A "Transparent" copy of the Document means a machine-readable copy, +represented in a format whose specification is available to the +general public, that is suitable for revising the document +straightforwardly with generic text editors or (for images composed of +pixels) generic paint programs or (for drawings) some widely available +drawing editor, and that is suitable for input to text formatters or +for automatic translation to a variety of formats suitable for input +to text formatters. A copy made in an otherwise Transparent file +format whose markup, or absence of markup, has been arranged to thwart +or discourage subsequent modification by readers is not Transparent. +An image format is not Transparent if used for any substantial amount +of text. A copy that is not "Transparent" is called "Opaque". + +Examples of suitable formats for Transparent copies include plain +ASCII without markup, Texinfo input format, LaTeX input format, SGML +or XML using a publicly available DTD, and standard-conforming simple +HTML, PostScript or PDF designed for human modification. Examples of +transparent image formats include PNG, XCF and JPG. Opaque formats +include proprietary formats that can be read and edited only by +proprietary word processors, SGML or XML for which the DTD and/or +processing tools are not generally available, and the +machine-generated HTML, PostScript or PDF produced by some word +processors for output purposes only. + +The "Title Page" means, for a printed book, the title page itself, +plus such following pages as are needed to hold, legibly, the material +this License requires to appear in the title page. For works in +formats which do not have any title page as such, "Title Page" means +the text near the most prominent appearance of the work's title, +preceding the beginning of the body of the text. + +A section "Entitled XYZ" means a named subunit of the Document whose +title either is precisely XYZ or contains XYZ in parentheses following +text that translates XYZ in another language. (Here XYZ stands for a +specific section name mentioned below, such as "Acknowledgements", +"Dedications", "Endorsements", or "History".) To "Preserve the Title" +of such a section when you modify the Document means that it remains a +section "Entitled XYZ" according to this definition. + +The Document may include Warranty Disclaimers next to the notice which +states that this License applies to the Document. These Warranty +Disclaimers are considered to be included by reference in this +License, but only as regards disclaiming warranties: any other +implication that these Warranty Disclaimers may have is void and has +no effect on the meaning of this License. + + +2. VERBATIM COPYING + +You may copy and distribute the Document in any medium, either +commercially or noncommercially, provided that this License, the +copyright notices, and the license notice saying this License applies +to the Document are reproduced in all copies, and that you add no other +conditions whatsoever to those of this License. You may not use +technical measures to obstruct or control the reading or further +copying of the copies you make or distribute. However, you may accept +compensation in exchange for copies. If you distribute a large enough +number of copies you must also follow the conditions in section 3. + +You may also lend copies, under the same conditions stated above, and +you may publicly display copies. + + +3. COPYING IN QUANTITY + +If you publish printed copies (or copies in media that commonly have +printed covers) of the Document, numbering more than 100, and the +Document's license notice requires Cover Texts, you must enclose the +copies in covers that carry, clearly and legibly, all these Cover +Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on +the back cover. Both covers must also clearly and legibly identify +you as the publisher of these copies. The front cover must present +the full title with all words of the title equally prominent and +visible. You may add other material on the covers in addition. +Copying with changes limited to the covers, as long as they preserve +the title of the Document and satisfy these conditions, can be treated +as verbatim copying in other respects. + +If the required texts for either cover are too voluminous to fit +legibly, you should put the first ones listed (as many as fit +reasonably) on the actual cover, and continue the rest onto adjacent +pages. + +If you publish or distribute Opaque copies of the Document numbering +more than 100, you must either include a machine-readable Transparent +copy along with each Opaque copy, or state in or with each Opaque copy +a computer-network location from which the general network-using +public has access to download using public-standard network protocols +a complete Transparent copy of the Document, free of added material. +If you use the latter option, you must take reasonably prudent steps, +when you begin distribution of Opaque copies in quantity, to ensure +that this Transparent copy will remain thus accessible at the stated +location until at least one year after the last time you distribute an +Opaque copy (directly or through your agents or retailers) of that +edition to the public. + +It is requested, but not required, that you contact the authors of the +Document well before redistributing any large number of copies, to give +them a chance to provide you with an updated version of the Document. + + +4. MODIFICATIONS + +You may copy and distribute a Modified Version of the Document under +the conditions of sections 2 and 3 above, provided that you release +the Modified Version under precisely this License, with the Modified +Version filling the role of the Document, thus licensing distribution +and modification of the Modified Version to whoever possesses a copy +of it. In addition, you must do these things in the Modified Version: + +A. Use in the Title Page (and on the covers, if any) a title distinct + from that of the Document, and from those of previous versions + (which should, if there were any, be listed in the History section + of the Document). You may use the same title as a previous version + if the original publisher of that version gives permission. +B. List on the Title Page, as authors, one or more persons or entities + responsible for authorship of the modifications in the Modified + Version, together with at least five of the principal authors of the + Document (all of its principal authors, if it has fewer than five), + unless they release you from this requirement. +C. State on the Title page the name of the publisher of the + Modified Version, as the publisher. +D. Preserve all the copyright notices of the Document. +E. Add an appropriate copyright notice for your modifications + adjacent to the other copyright notices. +F. Include, immediately after the copyright notices, a license notice + giving the public permission to use the Modified Version under the + terms of this License, in the form shown in the Addendum below. +G. Preserve in that license notice the full lists of Invariant Sections + and required Cover Texts given in the Document's license notice. +H. Include an unaltered copy of this License. +I. Preserve the section Entitled "History", Preserve its Title, and add + to it an item stating at least the title, year, new authors, and + publisher of the Modified Version as given on the Title Page. If + there is no section Entitled "History" in the Document, create one + stating the title, year, authors, and publisher of the Document as + given on its Title Page, then add an item describing the Modified + Version as stated in the previous sentence. +J. Preserve the network location, if any, given in the Document for + public access to a Transparent copy of the Document, and likewise + the network locations given in the Document for previous versions + it was based on. These may be placed in the "History" section. + You may omit a network location for a work that was published at + least four years before the Document itself, or if the original + publisher of the version it refers to gives permission. +K. For any section Entitled "Acknowledgements" or "Dedications", + Preserve the Title of the section, and preserve in the section all + the substance and tone of each of the contributor acknowledgements + and/or dedications given therein. +L. Preserve all the Invariant Sections of the Document, + unaltered in their text and in their titles. Section numbers + or the equivalent are not considered part of the section titles. +M. Delete any section Entitled "Endorsements". Such a section + may not be included in the Modified Version. +N. Do not retitle any existing section to be Entitled "Endorsements" + or to conflict in title with any Invariant Section. +O. Preserve any Warranty Disclaimers. + +If the Modified Version includes new front-matter sections or +appendices that qualify as Secondary Sections and contain no material +copied from the Document, you may at your option designate some or all +of these sections as invariant. To do this, add their titles to the +list of Invariant Sections in the Modified Version's license notice. +These titles must be distinct from any other section titles. + +You may add a section Entitled "Endorsements", provided it contains +nothing but endorsements of your Modified Version by various +parties--for example, statements of peer review or that the text has +been approved by an organization as the authoritative definition of a +standard. + +You may add a passage of up to five words as a Front-Cover Text, and a +passage of up to 25 words as a Back-Cover Text, to the end of the list +of Cover Texts in the Modified Version. Only one passage of +Front-Cover Text and one of Back-Cover Text may be added by (or +through arrangements made by) any one entity. If the Document already +includes a cover text for the same cover, previously added by you or +by arrangement made by the same entity you are acting on behalf of, +you may not add another; but you may replace the old one, on explicit +permission from the previous publisher that added the old one. + +The author(s) and publisher(s) of the Document do not by this License +give permission to use their names for publicity for or to assert or +imply endorsement of any Modified Version. + + +5. COMBINING DOCUMENTS + +You may combine the Document with other documents released under this +License, under the terms defined in section 4 above for modified +versions, provided that you include in the combination all of the +Invariant Sections of all of the original documents, unmodified, and +list them all as Invariant Sections of your combined work in its +license notice, and that you preserve all their Warranty Disclaimers. + +The combined work need only contain one copy of this License, and +multiple identical Invariant Sections may be replaced with a single +copy. If there are multiple Invariant Sections with the same name but +different contents, make the title of each such section unique by +adding at the end of it, in parentheses, the name of the original +author or publisher of that section if known, or else a unique number. +Make the same adjustment to the section titles in the list of +Invariant Sections in the license notice of the combined work. + +In the combination, you must combine any sections Entitled "History" +in the various original documents, forming one section Entitled +"History"; likewise combine any sections Entitled "Acknowledgements", +and any sections Entitled "Dedications". You must delete all sections +Entitled "Endorsements". + + +6. COLLECTIONS OF DOCUMENTS + +You may make a collection consisting of the Document and other documents +released under this License, and replace the individual copies of this +License in the various documents with a single copy that is included in +the collection, provided that you follow the rules of this License for +verbatim copying of each of the documents in all other respects. + +You may extract a single document from such a collection, and distribute +it individually under this License, provided you insert a copy of this +License into the extracted document, and follow this License in all +other respects regarding verbatim copying of that document. + + +7. AGGREGATION WITH INDEPENDENT WORKS + +A compilation of the Document or its derivatives with other separate +and independent documents or works, in or on a volume of a storage or +distribution medium, is called an "aggregate" if the copyright +resulting from the compilation is not used to limit the legal rights +of the compilation's users beyond what the individual works permit. +When the Document is included in an aggregate, this License does not +apply to the other works in the aggregate which are not themselves +derivative works of the Document. + +If the Cover Text requirement of section 3 is applicable to these +copies of the Document, then if the Document is less than one half of +the entire aggregate, the Document's Cover Texts may be placed on +covers that bracket the Document within the aggregate, or the +electronic equivalent of covers if the Document is in electronic form. +Otherwise they must appear on printed covers that bracket the whole +aggregate. + + +8. TRANSLATION + +Translation is considered a kind of modification, so you may +distribute translations of the Document under the terms of section 4. +Replacing Invariant Sections with translations requires special +permission from their copyright holders, but you may include +translations of some or all Invariant Sections in addition to the +original versions of these Invariant Sections. You may include a +translation of this License, and all the license notices in the +Document, and any Warranty Disclaimers, provided that you also include +the original English version of this License and the original versions +of those notices and disclaimers. In case of a disagreement between +the translation and the original version of this License or a notice +or disclaimer, the original version will prevail. + +If a section in the Document is Entitled "Acknowledgements", +"Dedications", or "History", the requirement (section 4) to Preserve +its Title (section 1) will typically require changing the actual +title. + + +9. TERMINATION + +You may not copy, modify, sublicense, or distribute the Document except +as expressly provided for under this License. Any other attempt to +copy, modify, sublicense or distribute the Document 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. + + +10. FUTURE REVISIONS OF THIS LICENSE + +The Free Software Foundation may publish new, revised versions +of the GNU Free Documentation 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. See +http://www.gnu.org/copyleft/. + +Each version of the License is given a distinguishing version number. +If the Document specifies that a particular numbered version of this +License "or any later version" applies to it, you have the option of +following the terms and conditions either of that specified version or +of any later version that has been published (not as a draft) by the +Free Software Foundation. If the Document does not specify a version +number of this License, you may choose any version ever published (not +as a draft) by the Free Software Foundation. + + +ADDENDUM: How to use this License for your documents + +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and +license notices just after the title page: + + Copyright (c) YEAR YOUR NAME. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.2 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. + A copy of the license is included in the section entitled "GNU + Free Documentation License". + +If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, +replace the "with...Texts." line with this: + + with the Invariant Sections being LIST THEIR TITLES, with the + Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. + +If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. + +If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of +free software license, such as the GNU General Public License, +to permit their use in free software. diff --git a/doc/COPYRIGHT b/doc/COPYRIGHT new file mode 100644 index 0000000..e8fbdad --- /dev/null +++ b/doc/COPYRIGHT @@ -0,0 +1,7 @@ +All documentation in this directory is + Copyright (C) 2002-2005 Intel Corporation + +Permission is granted to copy, distribute and/or modify these documents +under the terms of the GNU Free Documentation License, Version 1.2; +with no Invariant Sections, no Front-Cover Texts, and no Back-Cover +Texts. A copy of the license is included in the file COPYING-DOC. diff --git a/doc/INDEX b/doc/INDEX new file mode 100644 index 0000000..727c69d --- /dev/null +++ b/doc/INDEX @@ -0,0 +1,12 @@ +- README summarises the changes in nesC since version 1.0 +- ref.pdf is the nesC reference manual +- the user directory contains introductions to the new nesC 1.2 features +- the dump directory contains the schema definition for nesC's XML + information dump facility (see user/attributes.txt) +- nesc-debugging.html describes how to debug nesC code using gdb +- mica-debugging.html describes how to use the Atmel JTAG interface to + debug mica-family motes +- envtarget.html describes the "env" target which can be used to quickly + port nesC to a new target platform which already supports gcc +- nescc.1 and nescc-mig.1 are man pages for the nesC compiler and the + message interface generator tool diff --git a/doc/Makefile.am b/doc/Makefile.am new file mode 100644 index 0000000..6c08d7c --- /dev/null +++ b/doc/Makefile.am @@ -0,0 +1,43 @@ +AUTOMAKE_OPTIONS = foreign + +nccdatadir=$(datadir)/ncc +nccdocdir=$(nccdatadir)/doc +userdocdir=$(nccdocdir)/user +dumpdocdir=$(nccdocdir)/dump +dbgdocdir=$(nccdocdir)/debugging_files + + +dist_man_MANS = nescc.1 nescc-mig.1 nescc-ncg.1 nescc-wiring.1 + +nccdoc_DATA = \ + COPYING-DOC \ + COPYRIGHT \ + INDEX \ + OVERVIEW \ + ../README \ + mica-debugging.html \ + envtarget.html \ + nesc-debugging.html \ + ref.pdf + +dbgdoc_DATA = \ + $(wildcard debugging_files/*.jpg) + +dumpdoc_DATA = \ + $(wildcard dump/*.dsd) + +userdoc_DATA= \ + $(wildcard user/*.txt) + +EXTRA_DIST = \ + ref.tex \ + $(nccdoc_DATA) \ + $(userdoc_DATA) \ + $(dumpdoc_DATA) \ + $(dbgdoc_DATA) + +update-ref: + pdflatex ref.tex + bibtex ref + pdflatex ref.tex + pdflatex ref.tex diff --git a/doc/Makefile.in b/doc/Makefile.in new file mode 100644 index 0000000..66c99dd --- /dev/null +++ b/doc/Makefile.in @@ -0,0 +1,470 @@ +# Makefile.in generated by automake 1.10 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +subdir = doc +DIST_COMMON = $(dist_man_MANS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/config-aux/mkinstalldirs +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +man1dir = $(mandir)/man1 +am__installdirs = "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(dbgdocdir)" \ + "$(DESTDIR)$(dumpdocdir)" "$(DESTDIR)$(nccdocdir)" \ + "$(DESTDIR)$(userdocdir)" +NROFF = nroff +MANS = $(dist_man_MANS) +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +dbgdocDATA_INSTALL = $(INSTALL_DATA) +dumpdocDATA_INSTALL = $(INSTALL_DATA) +nccdocDATA_INSTALL = $(INSTALL_DATA) +userdocDATA_INSTALL = $(INSTALL_DATA) +DATA = $(dbgdoc_DATA) $(dumpdoc_DATA) $(nccdoc_DATA) $(userdoc_DATA) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EXEEXT = @EXEEXT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build_alias = @build_alias@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host_alias = @host_alias@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pathperl = @pathperl@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +subdirs = @subdirs@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = foreign +nccdatadir = $(datadir)/ncc +nccdocdir = $(nccdatadir)/doc +userdocdir = $(nccdocdir)/user +dumpdocdir = $(nccdocdir)/dump +dbgdocdir = $(nccdocdir)/debugging_files +dist_man_MANS = nescc.1 nescc-mig.1 nescc-ncg.1 nescc-wiring.1 +nccdoc_DATA = \ + COPYING-DOC \ + COPYRIGHT \ + INDEX \ + OVERVIEW \ + ../README \ + mica-debugging.html \ + envtarget.html \ + nesc-debugging.html \ + ref.pdf + +dbgdoc_DATA = \ + $(wildcard debugging_files/*.jpg) + +dumpdoc_DATA = \ + $(wildcard dump/*.dsd) + +userdoc_DATA = \ + $(wildcard user/*.txt) + +EXTRA_DIST = \ + ref.tex \ + $(nccdoc_DATA) \ + $(userdoc_DATA) \ + $(dumpdoc_DATA) \ + $(dbgdoc_DATA) + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign doc/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-man1: $(man1_MANS) $(man_MANS) + @$(NORMAL_INSTALL) + test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" + @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ + l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ + for i in $$l2; do \ + case "$$i" in \ + *.1*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ + else file=$$i; fi; \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + case "$$ext" in \ + 1*) ;; \ + *) ext='1' ;; \ + esac; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed -e 's/^.*\///'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \ + done +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ + l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ + for i in $$l2; do \ + case "$$i" in \ + *.1*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + case "$$ext" in \ + 1*) ;; \ + *) ext='1' ;; \ + esac; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed -e 's/^.*\///'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \ + rm -f "$(DESTDIR)$(man1dir)/$$inst"; \ + done +install-dbgdocDATA: $(dbgdoc_DATA) + @$(NORMAL_INSTALL) + test -z "$(dbgdocdir)" || $(MKDIR_P) "$(DESTDIR)$(dbgdocdir)" + @list='$(dbgdoc_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(dbgdocDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(dbgdocdir)/$$f'"; \ + $(dbgdocDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(dbgdocdir)/$$f"; \ + done + +uninstall-dbgdocDATA: + @$(NORMAL_UNINSTALL) + @list='$(dbgdoc_DATA)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(dbgdocdir)/$$f'"; \ + rm -f "$(DESTDIR)$(dbgdocdir)/$$f"; \ + done +install-dumpdocDATA: $(dumpdoc_DATA) + @$(NORMAL_INSTALL) + test -z "$(dumpdocdir)" || $(MKDIR_P) "$(DESTDIR)$(dumpdocdir)" + @list='$(dumpdoc_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(dumpdocDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(dumpdocdir)/$$f'"; \ + $(dumpdocDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(dumpdocdir)/$$f"; \ + done + +uninstall-dumpdocDATA: + @$(NORMAL_UNINSTALL) + @list='$(dumpdoc_DATA)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(dumpdocdir)/$$f'"; \ + rm -f "$(DESTDIR)$(dumpdocdir)/$$f"; \ + done +install-nccdocDATA: $(nccdoc_DATA) + @$(NORMAL_INSTALL) + test -z "$(nccdocdir)" || $(MKDIR_P) "$(DESTDIR)$(nccdocdir)" + @list='$(nccdoc_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(nccdocDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(nccdocdir)/$$f'"; \ + $(nccdocDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(nccdocdir)/$$f"; \ + done + +uninstall-nccdocDATA: + @$(NORMAL_UNINSTALL) + @list='$(nccdoc_DATA)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(nccdocdir)/$$f'"; \ + rm -f "$(DESTDIR)$(nccdocdir)/$$f"; \ + done +install-userdocDATA: $(userdoc_DATA) + @$(NORMAL_INSTALL) + test -z "$(userdocdir)" || $(MKDIR_P) "$(DESTDIR)$(userdocdir)" + @list='$(userdoc_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(userdocDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(userdocdir)/$$f'"; \ + $(userdocDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(userdocdir)/$$f"; \ + done + +uninstall-userdocDATA: + @$(NORMAL_UNINSTALL) + @list='$(userdoc_DATA)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(userdocdir)/$$f'"; \ + rm -f "$(DESTDIR)$(userdocdir)/$$f"; \ + done +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(MANS) $(DATA) +installdirs: + for dir in "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(dbgdocdir)" "$(DESTDIR)$(dumpdocdir)" "$(DESTDIR)$(nccdocdir)" "$(DESTDIR)$(userdocdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: install-dbgdocDATA install-dumpdocDATA install-man \ + install-nccdocDATA install-userdocDATA + +install-dvi: install-dvi-am + +install-exec-am: + +install-html: install-html-am + +install-info: install-info-am + +install-man: install-man1 + +install-pdf: install-pdf-am + +install-ps: install-ps-am + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-dbgdocDATA uninstall-dumpdocDATA uninstall-man \ + uninstall-nccdocDATA uninstall-userdocDATA + +uninstall-man: uninstall-man1 + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic distclean \ + distclean-generic distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am \ + install-dbgdocDATA install-dumpdocDATA install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-man1 install-nccdocDATA install-pdf install-pdf-am \ + install-ps install-ps-am install-strip install-userdocDATA \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ + pdf-am ps ps-am uninstall uninstall-am uninstall-dbgdocDATA \ + uninstall-dumpdocDATA uninstall-man uninstall-man1 \ + uninstall-nccdocDATA uninstall-userdocDATA + + +update-ref: + pdflatex ref.tex + bibtex ref + pdflatex ref.tex + pdflatex ref.tex +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/doc/OVERVIEW b/doc/OVERVIEW new file mode 100644 index 0000000..3bb74b4 --- /dev/null +++ b/doc/OVERVIEW @@ -0,0 +1,11 @@ +- ref.pdf is the nesC reference manual +- the user directory contains introductions to the new nesC 1.2 features +- the dump directory contains the schema definition for nesC's XML + information dump facility (see user/attributes.txt) +- nesc-debugging.html describes how to debug nesC code using gdb +- mica-debugging.html describes how to use the Atmel JTAG interface to + debug mica-family motes +- envtarget.html describes the "env" target which can be used to quickly + port nesC to a new target platform which already supports gcc +- nescc.1 and nescc-mig.1 are man pages for the nesC compiler and the + message interface generator tool diff --git a/doc/debugging_files/complete-setup.jpg b/doc/debugging_files/complete-setup.jpg new file mode 100644 index 0000000..3c4d056 Binary files /dev/null and b/doc/debugging_files/complete-setup.jpg differ diff --git a/doc/debugging_files/jtagpod.jpg b/doc/debugging_files/jtagpod.jpg new file mode 100644 index 0000000..1c68a54 Binary files /dev/null and b/doc/debugging_files/jtagpod.jpg differ diff --git a/doc/debugging_files/micamod.jpg b/doc/debugging_files/micamod.jpg new file mode 100644 index 0000000..d3372e6 Binary files /dev/null and b/doc/debugging_files/micamod.jpg differ diff --git a/doc/debugging_files/progboard.jpg b/doc/debugging_files/progboard.jpg new file mode 100644 index 0000000..539621b Binary files /dev/null and b/doc/debugging_files/progboard.jpg differ diff --git a/doc/dump/attributes.dsd b/doc/dump/attributes.dsd new file mode 100644 index 0000000..12d4739 --- /dev/null +++ b/doc/dump/attributes.dsd @@ -0,0 +1,94 @@ + + + Many attribute names have the same format everywhere + (some contents may choose to place further restrictions). + Declare those global rules here. + Attributes which rely on these rules will have no `stringtype ref' + Currently: name, qname, ref, size, alignment, value, scoped, loc + + A unique identifier for the entity denoted by this element. For + instance, a "variable-ref" and a "variable" denoting the same C + variable will have the same unique value for their ref attribute. + + + + + + + + + + + + + + + + + + + The name of a nesC component or interface. This is guaranteed to be + unique, so serves as an identifier. The name of generic component + instantiations represents their instantiation "path", e.g., generic + module Foo instantiated in configuration Bar is Bar.Foo, and generic + module Foo instantiated in generic configuration Baz, itself instantiated + in configuration Main is Main.Baz.Foo + + + + + + + + + + Present on entities (e.g., variables) that are non-global + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A source code location. + + + + + + + + + + diff --git a/doc/dump/basic.dsd b/doc/dump/basic.dsd new file mode 100644 index 0000000..e9ee56c --- /dev/null +++ b/doc/dump/basic.dsd @@ -0,0 +1,363 @@ + + + XML specifications for basic elements: + - references to declarable entities (variables, constants, functions, + typedefs, interfaces, interface definitions, components, enums, + structs, unions) + - types + - values (regular constants and structured values from C {} initialisers) + - attributes + - documentation strings + + + A reference to a component or to an interface definition + + + + + + + + The qname uniquely identifies the interface definition or component. + + + + + + + + + An instance of a component or interface. The number attribute + is present for real instances of generic components. + + + + + + + + + + + + A simple value. Contains constant value (might be V:) and its type + + + + + + + + + + + + + + A structured value (from a C { ... } initialiser). + All of these have a type as their first element. + + + + + + + + + Enforce the "type as first element" rule + + + + + + + + + + + + + + + + A struct or union value (from a C { ... } initialiser), the + structured-elements are the initialised fields (unitialised fields + are just absent). + + + + + + + + + + + + + + + + + + + + + + + + + + + + An array value (from a C { ... } initialiser), the + array-elements are the initialised array elements (unitialised elements + are just absent). + + + + + + + + + + + + + + + + + + + + + + + + + + + + A nesC type. Purposefully does not contain type-error (bug + indicator). All have size and alignment attributes (though these + may be V:). + + + + + + + + + + + + + + + + + + + Every type has a size and alignment attribute, and, optionally, + the name of the typedef this type corresponds to (we can't just have + a typedef-ref, as that would cause confusion with type-var). + + + + + + + + The network attribute is present for network base types. Its + value is the network base type name. + + + + + + + + + + The typename element is just a reference to a typedef + + + + + + + + + + Base types just include the C base type name + + + + + + + + + + + + + + + Integer and complex integer types may have an unsigned attribute + + + + + + + + + + + Types that contain a single embedded type + + + + + + + + + + + + + + Qualified types contain an empty attribute for each qualifier present + + + + + + + + + + + Array types include a number of elements. An unspecified number + of elements is represented as a non-constant value for the elements + attribute. + + + + + + + + + + Function types may be varargs or oldstyle. They contain a type + list (arguments) and a return type. + + + + + + + + + + + + + + + + + + + + + + + + Tag types contain a tag reference + + + + + + + + + + Interface types contain an interface reference + + + + + + + + + + Component types contain an internal component reference. + These are the type of a component name inside a configuration, i.e., + the type of X in `components Y as X'. Note that `components Y' is + just a shortcut for `components Y as Y', the two Y's are in different + namespaces. + + + + + + + + + + Type variables contain a reference to a typedef (whose type is + itself this type) + + + + + + + + + + An attribute with its initialiser + + + + + + + + + A documentation string + + + + + A short string is always present, a long one is optional. + + + + + + + + nesdoc strings have arbitrary contents + + + + + + + + + + + diff --git a/doc/dump/cobject.dsd b/doc/dump/cobject.dsd new file mode 100644 index 0000000..a10c85c --- /dev/null +++ b/doc/dump/cobject.dsd @@ -0,0 +1,189 @@ + + + A reference to a C object, i.e., a variable, constant, function, + typedef, interface, or component-within-a-configuration. The "ref" + attribute uniquely identifiers the particular object. + + + + + + + + + + + + + + + + + + + Definition of a C object, i.e., a variable, constant, function, + typedef, interface, or component-within-a-configuration. The "ref" + attribute uniquely identifiers the particular object. + + + + + + + + + + + + + + + Parameter names may be omitted in declarations + + + Order of these elements is unimportant + + + + + + + + + + Lists of C objects + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Order of these elements is unimportant + + Which interface definition this is an instance of. + + + The actual functions for this instance of the interface. + + + + Parameters for parameterised interfaces + + + + + + + + + + + + + + + + + + + + + + + + + + + Generic component arguments are constants with no value + --> the cst attribute is optional + + + + + + + + Commands and events have one of the following attributes. + + + + Safe functions (Deputy enabled) have the following attribute. + + + + Function parameters. Absent for old-style functions and + built-in functions. + + + Parameters of parameterised functions (as in void foo[...](...)) + + + Present for commands and events from actual interfaces + (but not for those in interface definitions) + + + + + + commands and events in specifications have a provided attribute + + + + + + + + + + + + + + + + diff --git a/doc/dump/common.dsd b/doc/dump/common.dsd new file mode 100644 index 0000000..7b08c9f --- /dev/null +++ b/doc/dump/common.dsd @@ -0,0 +1,68 @@ + + + nesC elements can be contained in nothing (global scope), a + component, or a function + + + + + + + + + + + Attribute list. + + + + + Argument list + + + + + + + + + + + + + + + Parameter list + + + + + + + + variables are regular function arguments, constants and + typedefs are used for generic component arguments. + + + + + + + + + + + + Parameters of parameterised functions (void foo[...](...)) + + + + + + + + + + diff --git a/doc/dump/component.dsd b/doc/dump/component.dsd new file mode 100644 index 0000000..fe538c1 --- /dev/null +++ b/doc/dump/component.dsd @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + Uniquely identifies the component. + + + + + Present if the component is not, or not fully, instantiated + + + Safe components (Deputy enabled) have the following attribute. + + + Order of these elements is unimportant + + What generic component this is an instance of. + + + + Present for generic components + + + + + + + + + + + + + + + + Configurations may contain a wiring graph + + + + + + + + + + + + + diff --git a/doc/dump/interfacedef.dsd b/doc/dump/interfacedef.dsd new file mode 100644 index 0000000..a780bd0 --- /dev/null +++ b/doc/dump/interfacedef.dsd @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + Order of these elements is unimportant + + Parameters of generic interfaces. + + + + + + + + + + + + + diff --git a/doc/dump/nesc.dsd b/doc/dump/nesc.dsd new file mode 100644 index 0000000..1f352c9 --- /dev/null +++ b/doc/dump/nesc.dsd @@ -0,0 +1,37 @@ + + + DSD2 schema for nesC XML dump + + + + + + + + Top-level elements + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/dump/regexps.dsd b/doc/dump/regexps.dsd new file mode 100644 index 0000000..5b7780e --- /dev/null +++ b/doc/dump/regexps.dsd @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + A regular expression for a nesC identifier + + + + + + + + + + + + + A regular expression for a nesC identifier path separated by `.' + (used, e.g., for component instance names) + + + + + + + + + + + + + A regular expression for a C base type (e.g., unsigned long) + + + + + + + + + + + + + The regular expression for an integer + + + + + + + + + + The regular expression for a real number + + + + + + + + + + + + + + + + + + + + A boolean value (we mostly use presence of an attribute to + indicate boolean properites, but there are a few exceptions which + use this stringtype instead - mostly to denote binary properties + (used vs provided, e.g.) rather than options + + + + + The regular expression for the "ref" attribute used to refer + to uniquely identify definitions of various items + + + + + + + + + + The regular expression for an empty string + + + + + The regular expression for a nesC constant. This has the + following basic format X:val, where X represents the kind of + constant and val it's value. X is I for integers, F for floats, + S for strings, U for unknown, and V for variable (not constant) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Regular expression for a file location (and an optional instantiation + path for locations in generic components) + + + Occasionally, some locations are unknown (e.g., for predefined + nesC attributes) + + + + Line number, never actually negative + + An optional generic component instantiation path + + + + + + + + + Filename + + + + + + + diff --git a/doc/dump/tag.dsd b/doc/dump/tag.dsd new file mode 100644 index 0000000..c7968ad --- /dev/null +++ b/doc/dump/tag.dsd @@ -0,0 +1,127 @@ + + + A reference to a tag (enum, struct, union, external struct and union) + + + + + + + + + + + + + + + + + + + There is no location if there is no actual definition of the tag + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Present when there is an actual definition. + + + May be in a container, may have attributes + + + + + + Non-enums contain a field list + + + + + + + + + + + + + + + + + + + + + The ref uniquely identifies the field amongst all fields. + + + + + There's either a size or bit-size attribute + + + + + + + + Enforce size or bit-size attribute in field rule + + + + + + + + + + + + Enums contain a representation type + + + + + + + diff --git a/doc/dump/wiring.dsd b/doc/dump/wiring.dsd new file mode 100644 index 0000000..d989218 --- /dev/null +++ b/doc/dump/wiring.dsd @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + Location attributes are present in user-level wiring, absent + in function-level wirings. + + + + + + + + + + + A from and to in a wiring just refers to a declaration of + an interface or function, with optional arguments for parameterized + interfaces. + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/envtarget.html b/doc/envtarget.html new file mode 100644 index 0000000..193b97e --- /dev/null +++ b/doc/envtarget.html @@ -0,0 +1,57 @@ + + +env target and nesc1 + + + +The env target allows the nesC compiler to be configured for a new +platform without requiring source code changes. It allows specification of +a target's data layout rules. + +
If -fnesc-target=env option is passed to nescc, +the compilation uses +a machine specification described in the environment variable +NESC_MACHINE, such as
export +NESC_MACHINE="long_double=8,4"
A +particular order to the keynames in NESC_MACHINE is not necessary. +The table below is a complete list of possible key names for +NESC_MACHINE, a short description of their values, and their +default if unspecified:
+ + +
Keyname Value Default +
pcc_bitfield_type_matters bool false +
empty_field_boundary bit align 8 +
structure_size_boundary bit align 8 +
word_size size 1 +
pointer size,align 2,1 +
float size,align 4,1 +
double size,align 4,1 +
long_double size,align 4,1 +
short size,align 2,1 +
int size,align 2,1 +
long size,align 4,1 +
long_long size,align 8,1 +
int1248_align align,align,align,align 1,1,1,1 +
wchar_size_size size,size 2,2 +
char_wchar_signed bool,bool true,true +
+ +
+ +For reference and easy cut+paste, here is the full default specification for +NESC_MACHINE:
export +NESC_MACHINE="pcc_bitfield_type_matters=false word_size=1 pointer=2,1 float=4,1 +double=4,1 long_double=4,1 short=2,1 int=2,1 long=4,1 long_long=8,1 +int1248_align=1,1,1,1 wchar_size_size=2,2 char_wchar_signed=true,true +empty_field_boundary=8 structure_size_boundary=8" +
+ +The curiously named wchar_size_size is the sizes of wchar_t +and size_t respectively. See the gcc internal documentation +(`info gccint') for more information on +pcc_bitfield_type_matters, empty_field_boundary and +structure_size_boundary. + + + diff --git a/doc/mica-debugging.html b/doc/mica-debugging.html new file mode 100644 index 0000000..26ce2e2 --- /dev/null +++ b/doc/mica-debugging.html @@ -0,0 +1,97 @@ + + + + Debugging TinyOS 1.x code with AVR JTAG ICE + + +

Debugging nesC code with the AVR JTAG ICE

+Note: we do not currently support the JTAG ICE mkII from Atmel. + +

The Atmel ATMEGA 128 processor offers in-circuit debugging through its +JTAG interface. This document explains how to setup your environment to +allow gdb to be used with mica motes.  A separate document, here, describes how to debug nesC +programs with gdb (this applies to both JTAG debugging on motes and +tossim-based debugging on PCs). This document also gives an example of a +debugging session using the JTAG ICE.
+
+A number of separate elements are needed for JTAG debugging on motes: +

    +
  • Tools: The following tools are needed, they are all +included in the 1.1 distribution of TinyOS: +
      +
    • C compiler for the AVR: avr-binutils version 2.13.2.1 or +later, avr-gcc version 3.3 or later, avr-libc.
      +
    • +
    • nesc version 1.1 or later.
    • +
    • avr-gdb or avr-insight, preferably the version distributed +with TinyOS 1.1 (this version has a number of bug fixes).
      +
    • +
    • avarice version 2.0.20030805cvs or later.
      +
    • +
    +
  • +
  • JTAG ICE pod. This beast can be purchased from Atmel, and looks +as follows:
    +
  • +
  • A programming board with a JTAG connector. This is included on +recent (mica2, mib510) programming boards. You will have to add it +yourself to the older mica programming boards. The finished picture will +look like this:
    +
  • +
  • A mica mote equipped with the Atmega 128 processor, a mica2dot or +a mica2. On the Mica boards you may have to remove a resistor r33, as +shown in the picture:
    +
    +Note that on the newer generations of Micas removal of that resistor +may not be necessary. With a ohmmeter check the resistance between the + positive terminal of the battery and the pin on the Atmel Atmega 128 + corresponding to port A pin 7; if the resistance is large (10kohms) + then you may not need to remove the resistor.
  • +
  • You cannot be using a sensorboard that uses the ADC4-ADC7 (aka +PF4-PF7) pins as these are the pins used for JTAG, and you must ensure +that the JTAG enable fuse bit (bit 6 of the high fuse byte) is clear. +You can clear this bit by passing the --wr_fuse_h=19 option to uisp, +e.g., if using parallel port programming:
    +    uisp +-dprog=dapa --wr_fuse_h=19
    +
    +or, if using the MIB510 serial programming board,
    +    uisp +-dprog=mib510 -dserial=/dev/ttysN -dpart=ATmega128 --wr_fuse_h=19
    +
    +Note that you may have to disable JTAG when using +sensorboards that use ADC4-ADC7, by passing the --wr_fuse_h=59 option to uisp.
    +
  • +
  • A free serial port to connect the JTAG ICE pod. You must set the +AVARICE_ARGS environment variable to contain the string "-j <serial port device name>" +(e.g., -j /dev/ttyS0).
    +
  • +
+Once you have built up this bit of infrastructure, your setup might +look something like this:
+ At that point you should +be able to simply compile your nesC application (make sure you're +compiling with debugging support (-g flag), the easiest is to include +the word debug in your make +command line). Connect the pod to your serial port, turn the pod +on, turn the mote on, and from a shell window you should be able to do +something like the following: +
 
cd ~/trunk/tinyos-1.x/apps/CntToLeds
make clean; make mica debug
export AVARICE_ARGS='-j COM1' # a cygwin example, /dev/ttyS0 on Linux (and should work on cygwin too)
ice-gdb build/mica/main.exe
+This should start the avarice (the PC-side of the JTAG setup), which +understands the GDB remote debugging protocol, and gdb itself. It will +load the program onto the mote, and stop the execution in the +initialization. At that point you should have all the familiar GDB hooks +at your disposal: breakpoints, displaying memory, registers, etc. You +could also use the ice-insight command if you prefer a more graphical +debugging environment. Please refer to the man pages for ice-gdb and +ice-insight for more options. +
+
Robert Szewczyk, +13 Mar 2003, David Gay, +21 August 2003
+ + diff --git a/doc/nesc-debugging.html b/doc/nesc-debugging.html new file mode 100644 index 0000000..87eca34 --- /dev/null +++ b/doc/nesc-debugging.html @@ -0,0 +1,271 @@ + + + + + Debugging nesC code with gdb + + + +

Debugging nesC code in GDB

+gdb does not (yet!) have a nesC-specific mode. Instead, in gdb you are +effectively debugging the C code generated by the nesC compiler. +However, the nesC compiler includes #line directives in the code it +generates, so single-stepping through nesC code will display the correct +nesC source code, and breakpoints can be set based on the line numbers +and file names of nesC components. The situation for variable, +function, command and event names is however not as straightforward. If +you wish to refer to one of these, you must use its name in the +generated C code, as explained below.
+
+When debugging tossim code, life is further complicated by the fact +that the generated C code emulates multiple motes. Thus all module +variables (but not global variables in C files) become arrays, indexed +by mote id (if the variable was itself an array, the mote id is the +first dimension). At any point in time, the "current" mote is found in tos_state.current_node.
+
+By default, nesC does a lot of inlining, which makes debugging tricky. +In most cases, pass the -g -O1 +-fnesc-no-inline options to nesC to produce code that is easier +to debug (the debug option +to the standard TinyOS Makefile does this). If you have a problem which +requires debugging fully optimised code, just include -g and prepare for a slightly +painful experience... (the debugopt +to the standard TinyOS Makefile does this).
+

Mapping from nesC names to C names

+Types, variables and functions in C files (included via the includes statement) are left +unchanged in the generated C code, except if they correspond to a nesC +keyword. In this last case, the name is prefixed with __nesc_keyword_, so components +becomes __nesc_keyword_components.
+
+A module variable (top-level data declarations in modules)  X in module M is called M$X +in the generated C code.
+
+A function F in module M is called M$F +in the generated C code.
+
+Local variable names in modules are left unchanged in the generated C +code.
+
+A command or event C in module M is called M$C +in the generated C code.
+
+A command or event C of +interface instance I in module M is called M$I$C in the generated C code.
+
+To complicate matters a little, gdb does not directly accept $ in +function names in break +(set a breakpoint) statements. Instead, you must precede the function +name with a *, e.g, b +*BlinkM$StdControl$init. Note that this sets a breakpoint on the +first instruction of the function (normally part of the function +preamble setting up the function's stack frame) rather than on the first +executable statement of the function. As a result, gdb may not +correctly display argument values, etc, until you single-step into the +function body.
+

Example

+This example debugs the CntToLeds application from TinyOS on a mica +mote, using on-chip debugging with a JTAG ICE pod (see this document for instructions on setting the +JTAG ICE up):
+
+We compile the application with debugging and no inlining by passing +the TinyOS-specific debug +option to make:
+
[dgay@barnowl +CntToLeds]$ make mica debug
+    compiling +CntToLeds to a mica binary
+ncc -o build/mica/main.exe -O1 -g +-fnesc-no-inline -board=micasb -target=mica -I%T/lib/Counters -Wall +-Wshadow -DDEF_TOS_AM_GROUP=0x42 -Wnesc-all -finline-limit=100000 +-fnesc-cfile=build/mica/app.c  CntToLeds.nc -lm
+    compiled +CntToLeds to build/mica/main.exe
+            +2588 bytes in ROM
+              +46 bytes in RAM
+avr-objcopy --output-target=srec +build/mica/main.exe build/mica/main.srec
+
+
+We start ice-gdb to download and debug CntToLeds:
+
[dgay@barnowl +CntToLeds]$ ice-gdb build/mica/main.exe
+AVaRICE version 2.0.20030821cvs, +Aug 21 2003 15:36:04
+ 
+JTAG config starting.
+Hardware Version: 0xc0
+Software Version: 0x69
+Reported JTAG device ID: 0x9702
+Configured for device ID: 0x9702 +atmega128
+LockBits -> 0xff
+ 
+Reading Fuse Bytes:
+  Extended Fuse byte -> +0xfd
+      +High Fuse byte -> 0x19
+       +Low Fuse byte -> 0xfe
+JTAG config complete.
+Downloading FLASH image to +target......................
+ 
+Download complete.
+Waiting for connection on port +6423.
+GNU gdb cvs-pre6.0-tinyos
+Copyright 2003 Free Software +Foundation, Inc.
+GDB is free software, covered by +the GNU General Public License, and you are
+welcome to change it and/or +distribute copies of it under certain conditions.
+Type "show copying" to see the +conditions.
+There is absolutely no warranty +for GDB.  Type "show warranty" for details.
+This GDB was configured as +"--host=i686-pc-linux-gnu --target=avr"...
+Connection opened by host +127.0.0.1, port 33805.
+0x00000000 in __vectors ()
+
+
+
The program is stopped. We set a breakpoint at the Timer.fired +event in the Counter module. Note the *:
+
+
(gdb) +b *Counter$Timer$fired
+Hardware assisted breakpoint 1 at +0x826: file /home/dgay/motes/tinyos-1.x/tos/lib/Counters/Counter.nc, +line 67.
+
+
+
And let the program continue:
+
(gdb) c
+Continuing.
+ 
+Breakpoint 1, Counter$Timer$fired +() at /home/dgay/motes/tinyos-1.x/tos/lib/Counters/Counter.nc:67
+67          +state++;
+
+
+
The breakpont was reached. We continue again...
+
+
(gdb) +c
+Continuing.
+ 
+Breakpoint 1, Counter$Timer$fired +() at /home/dgay/motes/tinyos-1.x/tos/lib/Counters/Counter.nc:67
+67          +state++;
+
+
+
Let's examine the state variable of the Counter module:
+
+
(gdb) +p Counter$state
+$1 = 1
+
+
+
And then follow where the IntOutput.output command takes us.
+
+
(gdb) +n
+68          +return call IntOutput.output(state);
+(gdb) s
+Counter$IntOutput$output +(arg_0x84fde28=2) at +/home/dgay/motes/tinyos-1.x/tos/interfaces/IntOutput.nc:52
+52        +command result_t output(uint16_t value);
+
+
+
The debugger shows us the command in the interface, we must step +again to reach our destination:
+
+
(gdb) +s
+IntToLedsM$IntOutput$output +(value=2) at +/home/dgay/motes/tinyos-1.x/tos/lib/Counters/IntToLedsM.nc:70
+70          +if (value & 1) call Leds.redOn();
+
+
+
The names of local variables (and function parameters) are +unchanged:
+
+
(gdb) +p value
+$2 = 2
+
+
+
That's all folks!
+
+
(gdb) +quit
+
+
+ + diff --git a/doc/nescc-mig.1 b/doc/nescc-mig.1 new file mode 100644 index 0000000..f80c72c --- /dev/null +++ b/doc/nescc-mig.1 @@ -0,0 +1,230 @@ +.TH nescc-mig 1 "April 27, 2004" +.LO 1 +.SH NAME + +nescc-mig - message interface generator for nesC +.SH SYNOPSIS + +\fBnescc-mig\fR [any nescc option] [tool-specific options] + [\fB-o\fR \fIoutput-file\fR] [\fB-nescc=\fIdriver\fR] + \fItool\fR \fImsg-format-file\fR \fImessage-type\fR +.SH DESCRIPTION + +\fBnescc-mig\fR is a tool to generate code to process nesC messages (which +are specified by C types). The \fItool\fR argument specifies what tool +should be generated, the \fImessage-type\fR specifies the C type of the +message you wish to process and \fImsg-format-file\fR specifies a nesC file +which uses that type. The message type must be defined with \fBstruct +\fImessage-type\fR, \fBnx_struct \fImessage-type\fR, \fBunion +\fImessage-type\fR, \fBnx_union \fImessage-type\fR. + +When used with types whose layout is platform-dependent (i.e., not defined +with \fBnx_struct\fR or \fBnx_union\fR), it is important to specify the +correct \fBnescc\fR target architecture option +(\fB-fnesc-target=\fI...\fR). If you are invoking \fBnescc-mig\fR +indirectly via \fBmig\fR, you can use the \fBncc\fR \fB-target=\fI...\fR +option instead. + +If an enum constant named \fBAM_\fImessage_type\fR (with \fImessage_type\fR +capitalized) is found, then the value of that constant is assumed to be the +active message type for \fImessage-type\fR. If you need access to other +constants from your nesC application, please consult the \fBnescc-ncg\fR man +page. + +The current tools are \fBjava\fR, \fBcsharp\fR, \fBpython\fR and \fBC\fR, which +generate java, C#, python and C code to encode and decode messages. +.SH OPTIONS +You can pass any \fBnescc\fR option, as well as +.TP +\fB-o \fIoutput-file\fR +Specify the file in which to output the generated code. +.TP +\fB-nescc=\fIdriver\fR +Use \fIdriver\fR instead of \fBnescc\fR to extract type layout information. +For example, if you specify \fB-nescc=ncc\fR, you can use \fBnescc-mig\fR +to extract type information from TinyOS applications (which are normally +compiled with \fBncc\fR). +.TP +tool-specific options +See below. + +.SH JAVA TOOL + +This tool generates a java class to encode or decode a nesC message, +basing itself on the net.tinyos.message infrastructure. It accepts the +following options: +.TP +\fB-java-classname=\fIfull-class-name\fR +This option is required and specifies the package and name of the generated +class. If the \fIfull-class-name\fR has no '.', then no package directive is +included in the output. +.TP +\fB-java-extends=\fIclass-name\fR +Specify the class the generated class will extend. The default is +\fBnet.tinyos.message.Message\fR. +.PP +For each field +\fIfname\fR of structure \fImessage-type\fR, there are the following methods +(the bit offset and size methods are useful for structures containing +bitfields): +.IP * +\fBget_\fIfname\fR: get field's value +.IP * +\fBset_\fIfname\fR: set field's value +.IP * +\fBoffsetBits_\fIfname\fR: return bit offset of field in \fImessage-type\fR +.IP * +\fBoffset_\fIfname\fR: return byte offset of field in \fImessage-type\fR +.IP * +\fBsizeBits_\fIfname\fR: return size in bits of field (not for arrays) +.IP * +\fBsize_\fIfname\fR: return size in bytes of field (not for arrays) +(absent if \fIfname\fR is a bitfield) +.IP * +\fBisSigned_\fIfname\fR: return true if \fIfname\fR is of a signed type +.IP * +\fBisArray_\fIfname\fR: return true if \fIfname\fR is an array +.PP +Embedded structures in \fImessage-type\fR are expanded, using _ to +separate the structure name and its fields. + +A number of extra methods are present for fields that are arrays: +.IP * +\fBgetElement_\fIfname\fR: get an element of the array +.IP * +\fBsetElement_\fIfname\fR: set an element of the array +.IP * +\fBelementSize_\fIfname\fR: return size in bytes of array elements +.IP * +\fBelementSizeBits_\fIfname\fR: return size in bits of array elements +.IP * +\fBnumDimensions_\fIfname\fR: return number of dimensions of the array +.IP * +\fBnumElements_\fIfname\fR: return number of elements of the array for a given +dimension (left-most dimension is numbered 0) - the dimension is optional +for 1-dimensional arrays +.IP * +\fBtotalSize_\fIfname\fR: return size in bytes of the array (absent if the array +is variable-size) +.IP * +\fBtotalSizeBits_\fIfname\fR: return size in bits of the array (absent if the array +is variable-size) +.PP +If the array is 1-dimensional and the elements are one byte, then the +following methods exist: +.IP * +\fBgetString_\fIfname\fR: build a Java string from the array assuming it contains +a C-style null-terminated string +.IP * +\fBsetString_\fIfname\fR: set the array to a C-style null-terminated string given +a java string +.PP +The \fBgetElement_...\fR, \fBsetElement_...\fR, \fBoffset_...\fR and +\fBoffsetBits_...\fR methods take one argument per array dimension. These +methods report errors if the array index is out of bounds. If an array has +a maximum size of 0, mig assumes it represents a variable-size array and +does not check the corresponding array index. + +The data for a message is stored in an array, with explicit base and length +information. The constructors can either allocate this array, receive it as +an explicit argument or extract if from another message. The base and +length can also be optionally passed to these constructors. + +The optional length argument overrides the default size of +sizeof(message-type); this is useful for variable-size messages. The use of +an explicit base is helpful for messages embedded in other messages. + +The generated class also has an amType() method which returns the message's +active message type, or -1 if no AM_\fImessage_type\fR constant was found. +.SH C# TOOL +This tool generates a C# class to encode or decode a nesC message. It +accepts the following options: +.TP +\fB-csharp-classname=\fIfull-class-name\fR +This option is required and specifies the namespace and name of the generated +class. If the \fIfull-class-name\fR has no '.', then no namespace directive is +included in the output. +.TP +\fB-csharp-extends=\fIclass-name\fR +Specify the class the generated class will extend. The default is +\fBtinyos.message.Message\fR. + +The methods in the generated class are the same as for the Java tool. +.SH PYTHON TOOL +This tool generates a Python class to encode or decode a nesC message. +It accepts the following options: +.TP +\fB-python-classname=\fIfull-class-name\fR +This option is required and specifies the name of the generated +class. +.TP +\fB-python-extends=\fIclass-name\fR +Specify the class the generated class will extend. The default is +\fBtinyos.message.Message.Message\fR. + +The methods in the generated class are the same as for the Java tool. +.SH C TOOL +This tool generates a C header file (\fB.h\fR) with constants describing +the type's layout, and a C module (\fB.c\fR) with functions to get and +set each field. You must pass the \fB.h\fR file's name to \fBnescc-mig\fR +using \fB-o\fR. + +The C tool accepts the following option: +.TP +\fB-c-prefix=\fIprefix\fR +This option specifies the \fIprefix\fR to attach to the generated +constants and functions. If omitted, \fImessage-type\fR is used. +.PP +For each non-array field +\fIfname\fR of structure \fImessage-type\fR, the following +functions and constants are generated: +.IP * +\fIprefix\fB_\fIfname\fB_get\fR(): get field's value +.IP * +\fIprefix\fB_\fIfname\fB_set\fR(): get field's value +.IP * +\fIprefix\fB_\fIfname\fB_OFFSETBITS\fR: bit offset of field +.IP * +\fIprefix\fB_\fIfname\fB_OFFSET\fR: byte offset of field +.IP * +\fIprefix\fB_\fIfname\fB_SIZEBITS\fR: size in bits of field +.IP * +\fIprefix\fB_\fIfname\fB_SIZE\fR: size in bytes of field +.PP +For each array field \fIfname\fR of structure \fImessage-type\fR, the following +functions and constants are generated: +.IP * +\fIprefix\fB_\fIfname\fB_get()\fR: get field's value +.IP * +\fIprefix\fB_\fIfname\fB_set()\fR: get field's value +.IP * +\fIprefix\fB_\fIfname\fB_offsetbits()\fR: bit offset of array element +.IP * +\fIprefix\fB_\fIfname\fB_offset()\fR: byte offset of array element +.IP * +\fIprefix\fB_\fIfname\fB_ELEMENTSIZEBITS\fR: size in bits of array element +.IP * +\fIprefix\fB_\fIfname\fB_ELEMENTSIZE\fR: size in bytes of array element +.IP * +\fIprefix\fB_\fIfname\fB_NUMELEMENTS\fR: number of elements in array (absent for variable-sized arrays) +.IP * +\fIprefix\fB_\fIfname\fB_NUMELEMENTS_\fIi\fR: size of \fIi\fRth array dimension +.PP +Embedded structures in \fImessage-type\fR are expanded, using _ to +separate the structure name and its fields. A field of an array of +embedded structures is considered to be an array. + +.SH ERRORS + +\fBnescc-mig\fR reports an error if \fBnescc\fR cannot compile +\fImsg-format-file\fR, if \fImessage-type\fR isn't found or if it contains +pointers. +.SH SEE ALSO + +The generated code for the various tools refer to libraries that are distributed +with the TinyOS operating system. Please refer to that project's documentation +for more information. + +.IR mig (1), +.IR nescc (1), +.IR nescc-ncg (1) diff --git a/doc/nescc-ncg.1 b/doc/nescc-ncg.1 new file mode 100644 index 0000000..e89517f --- /dev/null +++ b/doc/nescc-ncg.1 @@ -0,0 +1,98 @@ +.TH nescc-ncg 1 "April 27, 2004" +.LO 1 +.SH NAME + +nescc-ncg - extract constants from nesC files +.SH SYNOPSIS + +\fBnescc-ncg\fR [any nescc option] [tool-specific options] + [\fB-o\fR \fIoutput-file\fR] [\fB-nescc=\fIdriver\fR] + \fItool\fR \fInesC-file\fR \fIfilenames-or-constant-names...\fR +.SH DESCRIPTION + +\fBnescc-ncg\fR is a tool to extract constants from nesC files for use with +other applications. It is typically used in conjunction with +\fBnescc-mig\fR (which generates code to process nesC messages) to extract +constants that are used in particular messages (e.g., constants +representing various commands). + +The \fItool\fR argument specifies what tool should be generated, the +\fInesC-file\fR specifies a nesC file which uses the constants you want to +extract. If your constants are all in a single .h file that does not +depend on any other files, then you can specify the .h file directly as the +\fImsg-format-file\fR. Note that if some of your constants are defined +with \fBunique(...)\fR or \fBuniqueCount(...)\fR, you must specify your +whole application as the \fInesC-file\fR, or you will not get the +correct constant values. + +Each \fIfilenames-or-constant-names\fR is either a constant name (if it +consists only of letters, numbers and _) or a filename. In the former case, +the specified constant will be extracted, in the latter case all constants +from the specified C file will be extracted. Only constants declared in C +files will be found by \fBnescc-ncg\fR. + +The current tools are \fBjava\fR, \fBpython\fR and \fBC\fR, which +generate java, python and C code that contains the values of the +requested constants. +.SH OPTIONS +You can pass any \fBnescc\fR option, as well as +.TP +\fB-o \fIoutput-file\fR +Specify the file in which to output the generated code. +.TP +\fB-nescc=\fIdriver\fR +Use \fIdriver\fR instead of \fBnescc\fR to extract constants. +For example, if you specify \fB-nescc=ncc\fR, you can use \fBnescc-ncg\fR +to extract constants from TinyOS applications (which are normally +compiled with \fBncc\fR). +.TP +tool-specific options +See below. +.SH JAVA TOOL + +This tool generates a java class with the values of the requested constants. +These constants will be \fBpublic final static\fR and have a type chosen +from \fBbyte, short, char, int, long\fR (the chosen type will be the +first one in this list that can hold the constants value - this reduces +the need for casts). + +The java tool accepts the following options: +.TP +\fB-java-classname=\fIfull-class-name\fR +This option is required and specifies the package and name of the generated +class. If the \fIfull-class-name\fR has no '.', then no package directive is +included in the output. +.TP +\fB-java-extends=\fIclass-name\fR +Specify the class the generated class will extend. The default is +\fBObject\fR. +.SH PYTHON TOOL + +This tool generates a Python class with the values of the requested constants. +These constants will be class (rather than instance) variables. + +The Python tool accepts the following options: +.TP +\fB-python-classname=\fIfull-class-name\fR +This option is required and specifies the name of the generated +class. +.TP +\fB-python-extends=\fIclass-name\fR +Specify the class the generated class will extend. The default is +is to not inherit. +.SH C TOOL +This tool generates a C header file with the values of the +requested constants (defined as \fBenum\fR constants). + +The C tool accepts the following option: +.TP +\fB-c-prefix=\fIprefix\fR +This option specifies a \fIprefix\fR to attach to the generated +constants. +.SH ERRORS + +\fBnescc-ncg\fR reports an error if ncc cannot compile \fInesC-file\fR. +.SH SEE ALSO + +.IR nescc (1), +.IR nescc-mig (1) diff --git a/doc/nescc-wiring.1 b/doc/nescc-wiring.1 new file mode 100644 index 0000000..27b0fb2 --- /dev/null +++ b/doc/nescc-wiring.1 @@ -0,0 +1,55 @@ +.TH nescc-wiring 1 "January 4, 2006" +.LO 1 +.SH NAME + +nescc-wiring - check wiring of nesC program +.SH SYNOPSIS + +\fBnescc-wiring \fInesc-xml-file\fR + +.SH DESCRIPTION + +\fBnescc-wiring\fR is a tool to verify that wiring constraints specified on +individual components are respected in a nesC program. These wiring +constraints can specify that an interface provided or used by a component +must be wired at least once, at most once, or exactly once. If no +wiring constraints are violated, nescc-wiring terminates with an exit status +of 0. Otherwise, appropriate error messages are printed and nescc-wiring +terminates with a non-zero exit status. + +Wiring constraints are specified by placing \fB@atmostonce()\fR, +\fB@atleastonce()\fR and \fB@exactlyonce()\fR attributes on the +relevant interfaces. For instance, writing + + module Fun { + provides interface Init @atleastonce(); + ... + +ensures that programs using module \fBFun\fR must wire its \fBInit\fR +interface at least once. + +Specifically, when the annotation is placed on a provided interface, there +must be the specified number of paths in the wiring graph from any module +to that interface. If the annotations are placed on a used interface, +there must be the specified number of paths in the wiring graph from +the interface to any module. + +To use this wiring check tool, you must declare the \fB@atmostonce()\fR, +\fB@atleastonce()\fR and \fB@exactlyonce()\fR attributes in some global +header file as follows: + + struct @atleastonce() { }; + struct @atmostonce() { }; + struct @exactlyonce() { }; + +and you must pass the following options to \fBnescc\fR to create the +XML file that you pass to \fBnescc-wiring\fR: + + -fnesc-dump=wiring + -fnesc-dump='interfaces(!abstract())' + -fnesc-dump='referenced(interfacedefs, components)' + -fnesc-dumpfile=\fInesc-xml-file\fR + +.SH SEE ALSO + +.IR nescc (1) diff --git a/doc/nescc.1 b/doc/nescc.1 new file mode 100644 index 0000000..a3d2671 --- /dev/null +++ b/doc/nescc.1 @@ -0,0 +1,207 @@ +.TH nescc 1 "April 27, 2004" +.LO 1 +.SH NAME +nescc - nesC compiler +.SH SYNOPSIS + +\fBnescc\fR [\fB-gcc=\fIgcc-name\fR] [\fB-fnesc-target=\fIarchitecture\fR] + [\fB-docdir=\fIdir\fR] [\fB-topdir=\fIdir\fR] [\fB-graphviz=y\fI|\fBn\fR] + [\fB-fnesc-simulate\fR] + [\fB-fnesc-nido-tosnodes=\fIn\fR] [\fB-fnesc-nido-motenumber=\fIexpression\fR] + [\fB-conly\fR] [\fB-fnesc-cfile=\fIfile\fR] + [\fB-fnesc-cppdir=\fIdirectory\fR] [\fB-fnesc-separator=\fIseparator\fR] + [\fB-fnesc-no-inline\fR] [\fB-fnesc-optimize-atomic\fR] + [\fB--version\fR] [\fB-fnesc-verbose\fR] [\fB-Wnesc-\fI...\fR] + [\fB-fnesc-dump=\fIspecification\fR] [\fB-fnesc-dumpfile=\fIfile\fR] + [\fB-fnesc-scheduler=\fIspecification\fR] + [any gcc option] \fIfiles\fR... +.SH DESCRIPTION + +\fBnescc\fR is an extension to \fBgcc\fR that knows how to compile nesC +applications. If invoked on regular C files, it behaves exactly like +\fBgcc\fR. When invoked on a nesC component or interface (\fB.nc\fR +extension) file it compiles and links (except if the usual \fB-c\fR, +\fB-S\fR, \fB-E\fR or \fB-fsyntax-only\fR options are used) that component +with the other files specified on the command line. +.SH OPTIONS + +\fBnescc\fR accepts all \fBgcc\fR options, and some additional nesC +specific options: +.TP +\fB-gcc=\fIgcc-name\fR +Specify which gcc compiler to use to compile and link any C files, either +explicitly specified, or generated as the output of the nesC-to-C compiler. +This option supports cross-compilation of nesC code (the usual mode of +operation...). +.TP +\fB-fnesc-target=\fIarchitecture\fR +Specify the target architecture to compile for. Currently supported +platforms are \fBavr\fR (the Atmel AVR family), \fBmsp430\fR (the TI MSP430 +family) and \fBself\fR (the machine the nesC compiler is running on). +If you use the \fBenv\fR target, the architecture details are read from +the \fBNESC_MACHINE\fR environment variable. See the separate env target +documentation for details. +.TP +\fB-docdir=\fIdir\fR +Generate documentation for the compiled component in directory \fIdir\fR. +.TP +\fB-topdir=\fIdir\fR +Specify directory paths that should be stripped from the source file names +when generating "package names" for the documentation files. +.TP +\fB-graphviz=y\fR|\fBn\fR +Explicitly enable or disable the use of the graphviz tool in the generated +documentation. Without this option, graphviz is enabled iff the \fBdot\fR +program is found in the current path. Use of graphviz requires \fBdot\fR. The +documentation generation tool checks the version of \fBdot\fR, and enables +client-side image maps, if supported. +.TP +\fB-fnesc-simulate\fR +Compile for a simulation environment. +.TP +\fB-fnesc-nido-tosnodes=\fIn\fR, \fB-fnesc-nido-motenumber=\fIexpression\fR +When \fB-fnesc-simulate\fR is specified, the nesC program is compiled for a +simulation environment, where a single executable will simulate \fIn\fR +nodes. Specifically, in the generated code, each global variable becomes an +\fIn\fR element array, and all accesses to global variables are indexed +with \fIexpression\fR. +.TP +\fB-conly\fR +Just compile to C, leaving the generated source code for top-level-component +\fIcomp.nc\fR in C file \fIcomp.c\fR (except if the \fB-fnesc-cfile\fR +option is specified). +.TP +\fB-fnesc-cfile=\fIfile\fR +Specify a file in which to save the C code generated when compiling a +component. Note: if you specify two components on the command line, then +the C code from the second one will overwrite the C code from the first. +.TP +\fB-fnesc-cppdir=\fIdirectory\fR +Save all preprocessing results in \fIdirectory\fR. The directory is created +if it doesn't exist. This can be helpful to track down preprocessor-related +compilation problems. You probably want to ensure that \fIdirectory\fR is +empty when you call \fBnescc\fR, to make it obvious which files where +preprocessed as part of the current compilation. +.TP +\fB-fnesc-separator=\fIseparator\fR +Set separator used to create symbol names in the generated C code (default $). +The compiler needs to generate unique names to denote, e.g., a module +variable. It does this by concatenating various symbol names to ensure that +it generates unique names. For instance, variable \fBbar\fR in module +\fBMaz\fR becomes a global C variable \fBMaz$bar\fR in the compiler output. +Some C compilers do not like $ in symbol names, so you can specify a +different separator, e.g., \fB__\fR (leading to generated symbols like +\fBMaz__bar\fR). + +You will get a compile-time warning if any symbol in the program being +compiled contains the separator you specify (the presence of the +separator in a symbol could lead to the generation of incorrect code). +The separator can however start or end a symbol. +.TP +\fB-fnesc-no-inline\fR +Disabled the automatic inlining of all small functions, and of all functions +with a single call site. +.TP +\fB-fnesc-optimize-atomic\fR +Optimize atomic statements [EXPERIMENTAL]: reduce or remove the overhead +of atomic statements in simple cases (e.g., single-byte reads). +.TP +\fB--version\fR +Print the version of \fBnescc\fR and of the selected gcc compiler +(see \fB-gcc\fR). +.TP +\fB-fnesc-include=\fIheader-file\fR +Include the specified file before compiling a nesC component. Behaves +as if \fBincludes \fIheader-file\fB;\fR was included at the start of +that component. +.TP +\fB-fnesc-dump=\fIspecification\fR +Output information on the compiled programs structure, and in particular +its user-specified attributes. For more details, see the separate nesC +dump documentation. +.TP +\fB-fnesc-dumpfile=\fIfile\fR +Where to output the information requested by \fB-fnesc-dump\fR. Defaults to +stdout. +.TP +\fB-fnesc-verbose\fR +Be more verbose than \fB-v\fR. +.TP +\fB-fnesc-scheduler=\fIcomponent\fR,\fIunique-string\fR,\fIinterface-name\fR,\fIinterface-definition\fR,\fIrun-event\fR,\fIpost-command\fR +By default, nesC compiles uses of \fBtask void \fItaskname\fB() ...\fR to +\fBvoid \fItaskname\fB()\fR, and \fBpost \fItaskname()\fR to +\fBTOS_post(\fItaskname\fB)\fR. + +With this option, each task gets its own \fIinterface-definition\fR +interface, the task implementation is transformed into a \fIrun-event\fR +event and posts becomes a call to the \fIpost-command\fR command. This +per-task interface is automatically connected to the parameterised +\fIinterface-name\fR interface of scheduler component \fIcomponent\fR. The +parameter id for the connection is chosen with +\fBunique("\fIunique-string\fB")\fR. +.PP +There are a number of warnings specific to nesC, specified with +\fB-Wnesc-\fR (all these warnings are off by +default): +.TP +\fB-Wnesc-fnptr\fR +Warn when function pointers are used (use of function pointers is +deprecated in nesC and leads to inaccurate data race detection). +.TP +\fB-Wnesc-async\fR +Warn when interrupt handlers call commands or events not annotated with +\fBasync\fR. +.TP +\fB-Wnesc-data-race\fR +Warn about potential data races. +.TP +\fB-Wnesc-combine\fR +Warn when configuration wiring leads to "fan-out" and the function return +type does not have a combining function defined. +.TP +\fB-Wnesc-docstring\fR +Warn when unexpected documentation strings (starting with \fB/**\fR) are +seen. +.TP +\fB-Wnesc-all\fR +Turns on \fB-Wnesc-fnptr\fR, \fB-Wnesc-async\fR, \fB-Wnesc-combine\fR +and\fB-Wnesc-data-race\fR. +.TP +\fB-Wnesc-error\fR +Turns the \fB-Wnesc-fnptr\fR, \fB-Wnesc-async\fR, \fB-Wnesc-combine\fR and +\fB-Wnesc-data-race\fR warnings into errors. +.PP +When compiling a nesC component, the nesC compiler recognizes the gcc C +language (\fB-f...\fR) and warning (\fB-W...\fR) options. The \fB-S\fR, +\fB-c\fR and \fB-o\fR options work as usual, the \fB-x\fR option accepts +\fBnesc\fR. The \fB-v\fR option causes the nesC compiler to print out the +paths of all components and interfaces that are loaded. Directories can be +added to nesC\fRs search path with \fB-I\fR. +.SH EXAMPLES + +If you wish to compile a component Bar.nc to a C file, you can do: +.IP +nescc -c -o /dev/null -fnesc-cfile=Bar.c Bar.nc +.SH PREPROCESSOR SYMBOLS + +\fBnescc\fR defines the following preprocessor symbol: +.TP +\fBNESC\fR (since v1.1) +set to XYZ where x.yz is the nesC version +.SH ENVIRONMENT VARIABLES + +.TP +.B NESCPATH +A colon separated list of additional search directories for +nesC components. +.SH SEE ALSO + +.IR gcc (1), +platform-specific gcc +.SH NOTES + +The warnings for the new nesC 1.1 features (see \fB-Wnesc-all\fR) are off +by default to increase compatibility with nesC 1.0 code. To match the +language specification in the nesC 1.1 reference manual, you should compile +with \fB-Wnesc-all\fR and \fB-Wnesc-error\fR. These options will become the +default in future releases. diff --git a/doc/ref.pdf b/doc/ref.pdf new file mode 100644 index 0000000..c5cf3e2 Binary files /dev/null and b/doc/ref.pdf differ diff --git a/doc/ref.tex b/doc/ref.tex new file mode 100644 index 0000000..72846c5 --- /dev/null +++ b/doc/ref.tex @@ -0,0 +1,2638 @@ +% Not in ref manual (implementation restriction rather than language feature): +% no initialisers on module variables (future support) +% (but vars w/ attribute C are not module vars) + +\documentclass[11pt,letterpaper]{article} + +\usepackage{fullpage} +\usepackage{xspace} +\usepackage{hyperref} + +\newcommand{\kw}[1]{{\tt #1}} +\newcommand{\code}[1]{{\tt #1}} +\newcommand{\file}[1]{{\tt #1}} +\newcommand{\nesc}{nesC\xspace} +\newcommand{\tinyos}{TinyOS\xspace} +\newcommand{\opt}{$_{\mbox{opt}}$\xspace} +\newcommand{\FSE}{\mathcal{F}} +\newcommand{\connect}{\mathcal{C}} + +\parskip 0.15cm +\parindent 0cm + +\newcommand{\grammarshift}{\vspace*{-.7cm}} +\newcommand{\grammarindent}{\hspace*{2cm}\= \\ \kill} + +\begin{document} + +\title{\nesc 1.2 Language Reference Manual} +\author{David Gay, Philip Levis, David Culler, Eric Brewer} +\date{August 2005} + +\maketitle + +\section{Introduction} + +\nesc is an extension to C~\cite{kandr} designed to embody the structuring +concepts and execution model of \tinyos~\cite{tinyos}. \tinyos is an +event-driven operating system designed for sensor network nodes that have +very limited resources (e.g., 8K bytes of program memory, 512 bytes of +RAM). \tinyos has been reimplemented in \nesc. This manual describes v1.2 of +\nesc, changes from v1.0 and v1.1 are summarised in Section~\ref{sec:changes}. + +The basic concepts behind \nesc are: +\begin{itemize} +\item Separation of construction and composition: programs are built out of +\emph{components}, which are assembled (``wired'') to form whole +programs. Components define two scopes, one for their specification +(containing the names of their \emph{interfaces}) and one for +their implementation. Components have internal concurrency in the form of +\emph{tasks}. Threads of control may pass into a component through its +interfaces. These threads are rooted either in a task or a hardware +interrupt. + +\item Specification of component behaviour in terms of set of +\emph{interfaces}. Interfaces may be provided or used by the component. The +provided interfaces are intended to represent the functionality that the +component provides to its user, the used interfaces represent the +functionality the component needs to perform its job. + +\item Interfaces are bidirectional: they specify a set of functions to be +implemented by the interface's provider (\emph{commands}) and a set to be +implemented by the interface's user (\emph{events}). This allows a single +interface to represent a complex interaction between components (e.g., +registration of interest in some event, followed by a callback when +that event happens). This is critical because all lengthy commands in +\tinyos (e.g. send packet) are non-blocking; their completion is +signaled through an event (send packet done). The interface forces a +component that calls the ``send packet'' command to provide an +implementation for the ``send packet done'' event. + +Typically commands call ``downwards'', i.e., from application components to +those closer to the hardware, while events call ``upwards''. Certain primitive +events are bound to hardware interrupts (the nature of this binding is +system-dependent, so is not described further in this reference manual). + +\item Components are statically linked to each other via their interfaces. +This increases runtime efficiency, encourages robust design, and allows for +better static analysis of programs. + +\item \nesc is designed under the expectation that code will be generated +by whole-program compilers. This allows for better code generation and +analysis. An example of this is nesC's compile-time data race detector. + +\item The concurrency model of \nesc is based on run-to-completion tasks, +and interrupt handlers which may interrupt tasks and each other. The \nesc +compiler signals the potential data races caused by the interrupt handlers. +\end{itemize} + +This document is a reference manual for \nesc rather than a tutorial. The +\tinyos tutorial\footnote{Available with the \tinyos distribution at +http://webs.cs.berkeley.edu} presents a gentler introduction to \nesc. + +The rest of this document is structured as follows: +Section~\ref{sec:changes} summarises the new features in \nesc since v1.0. +Section~\ref{sec:notation} presents the notation used in the reference +manual, and Section~\ref{sec:scoping} the scoping and naming rules of +\nesc. Sections~\ref{sec:interface} and~\ref{sec:component} present +interfaces and components, while +Sections~\ref{sec:module},~\ref{sec:binary} and~\ref{sec:configuration} +explain how components are implemented. Section~\ref{sec:concurrency} +presents \nesc's concurrency model and data-race +detection. Sections~\ref{sec:attributes},~\ref{sec:external-types} +and~\ref{sec:misc} cover the extensions to C allowed in \nesc +programs. Section~\ref{sec:app} explains how C files, \nesc interfaces and +components are assembled into an application and how \nesc programs +interact with the preprocessor and linker. Finally, +Appendix~\ref{sec:grammar} fully defines \nesc's grammar (as an extension +to the C grammar from Appendix~A of Kernighan and Ritchie (K\&R) +~\cite[pp234--239]{kandr}), and Appendix~\ref{sec:glossary} gives a +glossary of terms used in this reference manual. + +\section{Changes} +\label{sec:changes} + +The changes from \nesc 1.1 to 1.2 are: +\begin{itemize} +\item Generic interfaces: interfaces can now take type parameters +(allowing, e.g., a single interface definition for a queue of any type of +values). + +\item Generic components: components can now be instantiated (at +compile-time), and can take constant and type arguments (e.g., a generic queue +component would take type and queue size arguments). + +\item Component specifications can include type and enum constant +declarations; component selections and wiring statements can be +interspersed in configurations; configuration implementations can refer to +the types and enum constants of the components they include. + +\item Binary components: programs can now use components defined in +binary form. The same functionality supports encapsulating a set of +components as a single binary component for use in other programs. + +\item External types: types with a platform-independent representation +and no alignment representation can now be defined in nesC (these +are useful, e.g., for defining packet representations). + +\item Attributes: declarations may be decorated with attributes. +Information on attribute use may be extracted for use in external +programs. Details on this extraction process is beyond the scope +of this language reference manual; see the nesC compiler documentation +for details. Some predefined attributes have meaning to the nesC +compiler. Use of \kw{\_\_attribute\_\_} for nesC-specific features +is deprecated (for details on these deprecated usages, see Section~10.3 +of the nesC 1.1 reference manual). + +\item \kw{includes} is deprecated and components can be preceded by +arbitrary C declarations and macros. As a result, \kw{\#include} behaves +in a more comprehensible fashion. For details on \kw{includes}, see +Section~9 of the nesC 1.1 reference manual. + +\item \kw{return} can be used within \kw{atomic} statements (the atomic +statement is implicitly terminated by the \kw{return}). +\end{itemize} + +The changes from \nesc 1.0 to 1.1 are: +\begin{enumerate} +\item \kw{atomic} statements. These simplify implementation of concurrent +data structures, and are understood by the new compile-time data-race +detector. + +\item Compile-time data-race detection gives warnings for variables that +are potentially accessed concurrently by two interrupt handlers, or an +interrupt handler and a task. + +\item Commands and events which can safely be executed by interrupt +handlers must be explicitly marked with the \kw{async} storage class +specifier. + +\item The results of calls to commands or events with ``fan-out'' are +automatically combined by new type-specific combiner functions. + +\item \code{uniqueCount} is a new \emph{constant function} +(Section~\ref{sec:constant-functions}) which counts uses of \code{unique}. + +\item The \kw{NESC} preprocessor symbol indicates the language version. It +is at least 110 for \nesc 1.1, at least 120 for \nesc 1.2. + +\end{enumerate} + +\section{Notation} +\label{sec:notation} + +The \texttt{typewriter} font is used for \nesc code and for +filenames. Single symbols in italics, with optional subscripts, are used to +refer to \nesc entities, e.g., ``component $K$'' or ``value $v$''. + +Explanations of \nesc constructs are presented along with the corresponding +grammar fragments. In these fragments, we sometimes use \ldots to represent +elided productions (irrelevant to the construct at +hand). Appendix~\ref{sec:grammar} presents the full \nesc grammar. + +Several examples use the \code{uint8\_t} and \code{uint16\_t} types (from +the C99 standard \file{inttypes.h} file) and the standard TinyOS +\code{result\_t} type (which represents success vs failure of an operation). + +The grammar of \nesc is an extension the ANSI C grammar. We chose to base +our presentation on the ANSI C grammar from Appendix~A of Kernighan and +Ritchie (K\&R) ~\cite[pp234--239]{kandr}. Words in \emph{italics} are +non-terminals and non-literal terminals, \kw{typewriter} words and symbols +are literal terminals. The subscript \emph{opt} indicates optional +terminals or non-terminals. In some cases, we change some ANSI C grammar +rules. We indicate this as follows: \emph{also} indicates additional +productions for existing non-terminals, \emph{replaced by} indicates +replacement of an existing non-terminal. We do not repeat the productions +from the C grammar here, but Appendix~\ref{sec:grammar} lists and +summarises the C grammar rules used by \nesc. + + +\section{Scopes and Name Spaces in \nesc} +\label{sec:scoping} + +\nesc includes the standard C name spaces: \emph{object}, which includes +variables, functions, typedefs, and enum-constants; \emph{label} for +\kw{goto} labels; \emph{tag} for \kw{struct}, \kw{union}, \kw{enum} tags. +It adds an additional \emph{component} name space for component and +interface definitions. For simplicity, we assume that each scope contains +all four name spaces, though language restrictions mean that many of these +name spaces are empty (e.g., all component and interface definitions are +global, so the \emph{component} name space is empty in all but the global +scope). + +\nesc follows the standard C scoping rules, with the following +additions: +\begin{itemize} +\item Each interface definition introduces two scopes. The \emph{interface +parameter scope} is nested in the global scope and contains the parameters +of generic interface definitions. The \emph{interface scope} is nested in +the interface parameter scope and contains the interface's commands and +events. + +\item Each component definition introduces three new scopes. The +\emph{component parameter scope} is nested in the global scope and contains +the parameters of generic component definitions. The \emph{specification +scope} is nested in the component parameter scope and contains the +component's specification elements. + +The \emph{implementation scope} is nested in the specification scope. For +configurations, the implementation scope contains the names by which this +component refers to its included components +(Section~\ref{sec:config-components}). For modules, the implementation +scope holds the tasks, C declarations and definitions that form the +module's body. These declarations, etc may introduce their own nested +scopes within the implementation scope, following the usual C scoping +rules. +\end{itemize} +As usual in C, scopes must not have multiple definitions of the same +name within the same name space. + +\section{Interface and Component Specification} +\label{sec:interface} + +A \nesc \emph{interface definition} specifies a bi-directional interaction +between two components, known as the \emph{provider} and +\emph{user}. Interactions via interfaces are specified by two sets of +functions: \emph{commands} are function calls from the user to the provider +component, \emph{events} are function calls from the provider to the user +component. In many cases, the provider component is providing some service +(e.g., sending messages over the radio) and commands represent requests, +events responses. + +An interface definition has a unique name, optional C type parameters, and +contains declarations for its command and event functions. An interface +definition with type parameters is called a \emph{generic interface +definition}. + +An \emph{interface type} is a reference to an interface definition and, if +the referenced definition is generic, corresponding type +arguments. Components can only be connected via two interfaces with the +same type. + +A component's \emph{specification} is the set of interfaces that it +provides and uses. Each provided or used interface has a name and an +interface type. Component specifications can also contain \emph{bare} +commands and events (i.e., not contained in an interface), \kw{typedef}s +and tagged type declarations; to simplify the exposition we defer +discussion of these to Sections~\ref{sec:bare} and~\ref{sec:spec-other}. + +For instance, the following source code +\begin{quote} \begin{verbatim} +interface SendMsg { // send a radio message + command result_t send(uint16_t address, uint8_t length, TOS_MsgPtr msg); + event result_t sendDone(TOS_MsgPtr msg, result_t success); +} + +interface Init { // a generic interface definition + command void doit(t x); +} + +module Simple { + provides interface Init as MyInit; + uses interface SendMsg as MyMessage; +} ... +\end{verbatim} \end{quote} +shows two interface definitions, \code{SendMsg} and \code{Init}, and the +specification of the \code{Simple} component. The specification of +\code{Simple} has two elements: \code{MyInit}, a provided interface of type +\code{Init} and \code{MyMessage} a used interface of type +\code{SendMsg}. \code{Simple} must implement the \code{MyInit.doit} command +and the \code{MyMessage.sendDone} event. It can call the +\code{MyMessage.send} command. + +The rest of this section covers interface definitions, interface types and +component specifications in detail. The sections on component definition +(Section~\ref{sec:component}) and implementations +(Sections~\ref{sec:module} and~\ref{sec:configuration}) explain how +commands and events are called and implemented, and how components are +linked together through their interfaces. + +\subsection{Interface Definitions} + +Interface definitions have the following syntax: +\begin{quote} \grammarshift +\em \begin{tabbing} +\grammarindent +interface-definition:\\ +\> \kw{interface} identifier type-parameters\opt\kw{\{} declaration-list \kw{\}} +\end{tabbing} +\end{quote} +Interface definitions have a name (\emph{identifier}) with global +scope. This name belongs to the component name space +(Section~\ref{sec:scoping}), so interface definitions must have a name +distinct from other interface definitions and from components, however they +do not conflict with regular C declarations. + +The \emph{type-parameters} is a list of optional C type parameters +for this interface definition: +\begin{quote} \grammarshift +\em \begin{tabbing} +\grammarindent +type-parameters:\\ +\> \kw{<} type-parameter-list \kw{>}\\ +\\ +type-parameter-list:\\ +\> identifier\\ +\> type-parameter-list \kw{,} identifier +\end{tabbing} +\end{quote} +These parameters belong to the object name space of the interface's +parameter scope (Section~\ref{sec:scoping}) and are therefore visible in +the \emph{declaration-list}. See Section~\ref{sec:type-parameters} for how +type parameters interact with C's type system (in brief, these type +parameters can be used like \kw{typedef}'d types). An interface definition +with type parameters is called a \emph{generic interface definition}. + +The \emph{declaration-list} of an interface definition specifies a set of +commands and events. It must consist of function declarations with the +\kw{command} or \kw{event} storage class: +\begin{quote} \grammarshift +\em \begin{tabbing} +\grammarindent +storage-class-specifier: \emph{also one of}\\ +\> \kw{command} \kw{event} \kw{async}\\ +\end{tabbing} +\end{quote} +The optional \kw{async} keyword indicates that the command or event can be +executed in an interrupt handler (see Section~\ref{sec:concurrency}). The +interface's commands and events belong to the object name space of the +interface's scope (Section~\ref{sec:scoping}). + + +The example code above showed two simple interface definitions +(\code{SendMsg} and \code{Init}). The following +\begin{quote} \begin{verbatim} +interface Queue { + async command void push(t x); + async command t pop(); + async command bool empty(); + async command bool full(); +} +\end{verbatim} \end{quote} +defines a generic interface \code{Queue} with a single type parameter, +defining four commands which can be executed in an interrupt handler. + +\subsection{Interface Types} + +An interface type is specified by giving the name of an interface +definition and, for generic interface definitions, any required type +arguments: +\begin{quote} \grammarshift +\em \begin{tabbing} +\grammarindent +interface-type: \\ +\> \kw{interface} identifier type-arguments\opt\\ +\\ +type-arguments:\\ +\> \kw{<} type-argument-list \kw{>}\\ +\\ +type-argument-list:\\ +\> type-name\\ +\> type-argument-list \kw{,} type-name +\end{tabbing} \end{quote} +There must be as many types in \emph{type-arguments} as there are +parameters in the interface definition's type parameter list. +Type arguments can not be incomplete or of function or array type. + +Two interface types are the same if they refer to the same interface +definition and their corresponding type arguments (if any) are of the same +C type. Example interface types are \kw{interface SendMsg} and +\kw{interface Queue}. + +\subsection{Component Specification} +\label{sec:component-spec} + +The first part of a component's definition (see Section~\ref{sec:component}) +is its \emph{specification}, a declaration of provided or used +specification elements, where each element is an interface, +a bare command or event (Section~\ref{sec:bare}) or a declaration +(Section~\ref{sec:spec-other}): +\begin{quote} \grammarshift \em \begin{tabbing} +\grammarindent +component-specification:\\ +\> \kw{\{} uses-provides-list \kw{\}}\\ +\\ +uses-provides-list:\\ +\> uses-provides\\ +\> uses-provides-list uses-provides\\ +\\ +uses-provides:\\ +\> \kw{uses} specification-element-list\\ +\> \kw{provides} specification-element-list\\ +\\ +specification-element-list:\\ +\> specification-element\\ +\> \kw{\{} specification-elements \kw{\}}\\ +\\ +specification-elements:\\ +\> specification-element\\ +\> specification-elements specification-element\\ +\end{tabbing} \end{quote} +There can be multiple \kw{uses} and \kw{provides} directives in a component +specification. Multiple used or provided specification elements can be +grouped in a single directive by surrounding them with \{ and \}. For +instance, these two specifications are identical: + +\begin{quote} \begin{verbatim} +module A1 { module A1 { + uses interface X; uses { + uses interface Y; interface X; +} ... interface Y; + } + } ... +\end{verbatim} \end{quote} + +An interface declaration has an interface type and an optional name: +\begin{quote} \grammarshift \em \begin{tabbing} +\grammarindent +specification-element:\\ +\> interface-type instance-name\opt instance-parameters\opt\\ +\> \ldots\\ +\\ +instance-name:\\ +\> \kw{as} identifier\\ +\\ +instance-parameters:\\ +\> \kw{[} parameter-type-list \kw{]} +\end{tabbing} \end{quote} +If the name is omitted, the interface's name is the same as the name of the +interface definition specified by the interface type: \code{interface +SendMsg} means the same thing as \code{interface SendMsg as SendMsg} and +\code{interface Queue} is the same as \code{interface Queue as +Queue}. A specification can contain independent interfaces of the +same interface type, e.g., +\begin{quote} +\begin{verbatim} +provides interface X as X1; +uses interface X as X2; +\end{verbatim} +\end{quote} +The interface names belong to the object name space of the specification's +scope (Section~\ref{sec:scoping}), thus there is no confusion between +interface names and interface definition names (the latter are in the +component name space). + +An interface declaration without \emph{instance-parameters} (e.g., +\code{interface X as Y}) declares a single interface to this +component. A declaration with \emph{instance-parameters} (e.g., +\code{interface SendMsg S[uint8\_t id]}) declares a \emph{parameterised +interface}, corresponding to multiple interfaces to this component, one for +each distinct tuple of parameter values (so \code{interface SendMsg as +S[uint8\_t id, uint8\_t id2]} declares 256 * 256 interfaces of type +\code{SendMsg}). The types of the \emph{parameters} must be integral types +(\kw{enum}s are not allowed at this time). + +The specification for \code{AMStandard}, a component that dispatches +messages received from the serial port and the radio to the application +based on the ``active message id'' stored in the message, and sends +messages to the radio or serial port depending on the selected destination +address, is typical of many TinyOS system components: +\begin{quote} \begin{verbatim} +module AMStandard { + provides { + interface StdControl; + + // The interface are parameterised by the active message id + interface SendMsg[uint8_t id]; + interface ReceiveMsg[uint8_t id]; + } + uses { + interface StdControl as RadioControl; + interface SendMsg as RadioSend; + interface ReceiveMsg as RadioReceive; + + interface StdControl as SerialControl; + interface SendMsg as SerialSend; + interface ReceiveMsg as SerialReceive; + } +} ... +\end{verbatim} \end{quote} +It provides or uses nine interfaces: +\begin{itemize} +\item The provided interface \code{StdControl} of type \code{StdControl} +supports initialisation of \code{AMStandard}. +\item The provided parameterised interfaces of type \code{SendMsg} and +\code{ReceiveMsg} (named \code{SendMsg} and +\code{ReceiveMsg} respectively) support dispatching of received +messages and sending of messages with a particular active message id +\item The used interfaces control, send and receive messages from the radio +and serial port respectively (another TinyOS component, the +\code{GenericComm} configuration wires \code{AMStandard} to the lower-level +components providing radio and serial port networking). +\end{itemize} + +\subsection{Bare Commands and Events} +\label{sec:bare} + +Commands or events can be included directly as specification elements by +including a standard C function declaration with +\kw{command} or \kw{event} as its storage class specifier: +\begin{quote} \grammarshift \em \begin{tabbing} +\grammarindent +specification-element:\\ +\> declaration\\ +\> \ldots\\ +\\ +storage-class-specifier: \emph{also one of}\\ +\> \kw{command} \kw{event} \kw{async}\\ +\end{tabbing} \end{quote} +It is a compile-time error if the \emph{declaration} is not a function +declaration with the \kw{command} or \kw{event} storage class. As in +interfaces, \kw{async} indicates that the command or event can be called +from an interrupt handler. These bare command and events belong to the +object name space of the specification's scope (Section~\ref{sec:scoping}). + +As with interface declarations, bare commands (bare events) can have instance +parameters; these are placed before +the function's regular parameter list, e.g., \code{command void +send[uint8\_t id](int x)}: +\begin{quote} \grammarshift \em \begin{tabbing} +\grammarindent +direct-declarator: \emph{also}\\ +\> direct-declarator instance-parameters \kw{(} parameter-type-list \kw{)}\\ +\> \ldots +\end{tabbing} \end{quote} + +If instance parameters are present, the declaration specifies a \emph{bare, +parameterised command} (\emph{bare, parameterised event}). Note that +instance parameters are not allowed on commands or events inside interface +definitions. + +Module \code{M} of Figure~\ref{fig:wiring} +(Section~\ref{sec:wiring-semantics}) shows an example of a component +specification with a bare command. + +\subsection{Other Declarations in Specifications} +\label{sec:spec-other} + +A component specification can also include regular declarations (these +belong to the specification scope): +\begin{quote} \grammarshift \em \begin{tabbing} +\grammarindent +uses-provides: \emph{also}\\ +\> declaration\\ +\end{tabbing} \end{quote} + +These declarations must be either \kw{typedef}s, or tagged type +declarations. For example, +\begin{quote} \begin{verbatim} +module Fun { + typedef int fun_t; + enum { MYNUMBER = 42 }; +} +implementation { ... } +\end{verbatim} +\end{quote} + +Note that declaration of an \kw{enum} implicitly places enum constants +in the component's specification scope. + + +\subsection{Command and Event Terminology} + +We say that a bare command (event) $F$ provided in the specification of +component $K$ is \emph{provided command (event)} $F$ of $K$; similarly, a +bare command (event) used in the specification of component $K$ is +\emph{used command (event)} $F$ of $K$. + +A command $F$ in a provided interface $X$ of component $K$ is +provided command $X.F$ of $K$; a command $F$ in a used interface +$X$ of $K$ is used command $X.F$ of $K$; an event $F$ in a provided +interface $X$ of $K$ is used event $X.F$ of $K$; and an event $F$ +in a used interface $X$ of $K$ is provided event $X.F$ of $K$ +(note the reversal of used and provided for events due to the bidirectional +nature of interfaces). + +We use Greek letters $\alpha, \beta, \ldots$ to refer to any command or +event of a component when the distinction between bare commands (events) +and commands (events) in interfaces is not relevant. Commands or events +$\alpha$ of $K$ are parameterised if the specification element to which they +correspond is parameterised. + +We will often simply refer to the ``command or event $\alpha$ of $K$'' when +the used/provided distinction is not relevant. + +\section{Component Definition} +\label{sec:component} + +A \nesc component definition has a name, optional arguments, a +specification and an implementation: +\begin{quote} \grammarshift \em \begin{tabbing} +\grammarindent +component:\\ +\> comp-kind identifier comp-parameters\opt component-specification implementation\opt\\ +\\ +comp-kind:\\ +\> \kw{module}\\ +\> \kw{configuration}\\ +\> \kw{component}\\ +\> \kw{generic module}\\ +\> \kw{generic configuration}\\ +\\ +implementation:\\ +\> module-implementation\\ +\> configuration-implementation +\end{tabbing} \end{quote} + +The component name belongs to the component name space of the global scope, +hence must be distinct from other components and from interface +definitions. There are three ways a component can be implemented: +\emph{modules} are components which are implemented with C code +(Section~\ref{sec:module}), \emph{binary components} are components which +are only available in binary form (Section~\ref{sec:binary}), and +\emph{configurations} are components which are implemented by assembling +other components (Section~\ref{sec:configuration}). + +Components with parameters are called \emph{generic components}, they must +be instantiated in a configuration before they can be used +(Section~\ref{sec:configuration}). Components without parameters exist as a +single instance which is implicitly instantiated. The component's +definition must reflect these distinctions (the \emph{comp-kind} rule): for +instance, a generic module \code{A} is defined with \code{generic module +A() \{}\ldots, a non-generic configuration \code{B} is defined with +\code{configuration B \{}\ldots Binary components cannot be generic. + +\subsection{Generic Components} +\label{sec:generic-components} + +Generic component parameter lists are similar to function parameter lists, +but allow for type parameters by (re)using the \kw{typedef} keyword: +\begin{quote} \grammarshift \em \begin{tabbing} +\grammarindent +comp-parameters:\\ +\> \kw{(} component-parameter-list \kw{)}\\ +\\ +component-parameter-list:\\ +\> component-parameter\\ +\> component-parameter-list \kw{,} component-parameter\\ +\\ +component-parameter:\\ +\> parameter-declaration\\ +\> \kw{typedef} identifier +\end{tabbing} \end{quote} +The parameters belong to the object name space of the component's parameter +scope (Section~\ref{sec:scoping}), and are hence visible both in the +component's specification and implementation. Non-type parameters must be +of arithmetic or \code{char[]} type. These parameters can be used as +follows: +\begin{itemize} +\item Type parameters can be used as if the argument was of some unknown +\kw{typedef}'d type. Additionally, type parameters can be restricted to +integral or numerical types, allowing integral or numerical operations to +be used on the type. For more details, see +Section~\ref{sec:type-parameters}. +\item Non-type parameters are constants of some unknown value (for more +details, see Section~\ref{sec:constant-folding}); they can be used in any +constant expression. They cannot be assigned to. +\end{itemize} + +An instantiation with arguments $a_1, \ldots, a_n$ of generic component $X$ +with parameters $p_1, \ldots, p_n$ behaves like a new, non-generic component +with the specification and implementation of $X$ where all uses of +parameter $p_i$ have been replaced by the corresponding $a_i$ value or +type.\footnote{The most straightforward implementation of these semantics +for generic modules is to duplicate $X$'s code. In some cases (e.g., no +arguments to $X$), a \nesc compiler might be able to share code between the +instances of $X$ at some runtime cost.} Section~\ref{sec:load-component} +details when generic components get instantiated. + + +\subsection{Examples} + +Some examples (with simple specifications): +\begin{quote} +\begin{verbatim} +module A { provides interface X; } ... +component B { uses interface X } // no implementation for binary components! +generic configuration B() { uses interface Y; } ... +generic module AQueue(int n, typedef t) { provides interface Queue; } ... +\end{verbatim} +\end{quote} +\code{A} is a simple module, \code{B} a generic configuration with no +arguments but which can be instantiated multiple times, \code{AQueue} +a generic module implementing an \code{n} entry queue with elements of +type \code{t}. Note how \code{AQueue} instantiates the generic interface +\code{Queue} with its type parameter \code{t}. + +\section{Component Implementation: Modules} +\label{sec:module} + +Modules implement a component specification with C code: +\begin{quote} \grammarshift \em \begin{tabbing} +\grammarindent +module-implementation:\\ +\> \kw{implementation} \kw{\{} translation-unit \kw{\}}\\ +\end{tabbing} \end{quote} +where \emph{translation-unit} is a list of C declarations and definitions +(see K\&R~\cite[pp234--239]{kandr}). + +The top-level declarations of the module's \emph{translation-unit} belong +to the module's implementation scope (Section~\ref{sec:scoping}). These +declarations have indefinite extent and can be: any standard C declaration +or definition, a task declaration or definition (placed in the object name +space), a command or event implementation. + +\subsection{Implementing the Module's Specification} + +The \emph{translation-unit} must implement all provided commands +(events) $\alpha$ of the module (i.e., all commands in provided +interfaces, all events in used interfaces, and all bare, provided +commands and events). A module can call any of its commands and +signal any of its events. + +These command and event implementations are specified with the following C +syntax extensions: +\begin{quote} \grammarshift \em \begin{tabbing} +\grammarindent +storage-class-specifier: \emph{also one of}\\ +\> \kw{command} \kw{event} \kw{async}\\ +\\ +declaration-specifiers: \emph{also}\\ +\> \kw{default} declaration-specifiers\\ +\\ +direct-declarator: \emph{also}\\ +\> identifier \kw{.} identifier \\ +\> direct-declarator interface-parameters \kw{(} parameter-type-list \kw{)}\\ +\end{tabbing} \end{quote} +The implementation of non-parameterised command or event $\alpha$ has the +syntax of a C function definition for $\alpha$ (note the extension to +\emph{direct-declarator} to allow \code{.} in function names) with storage +class \kw{command} or \kw{event}. Additionally, the \kw{async} keyword must +be included iff it was included in $\alpha$'s declaration. For example, in +a module that provides interface \code{Send} of type \kw{SendMsg} (shown at +the start of Section~\ref{sec:interface}): +\begin{quote} \begin{verbatim} +command result_t Send.send(uint16_t address, uint8_t length, TOS_MsgPtr msg) { + ... + return SUCCESS; +} +\end{verbatim} \end{quote} + +The implementation of parameterised command or event $\alpha$ with +instance parameters $P$ has the syntax of a C function definition for +$\alpha$ with storage class \kw{command} or \kw{event} where the +function's regular parameter list is prefixed with the parameters $P$ +within square brackets. These instance parameter declarations +$P$ belong to $\alpha$'s function-parameter scope and have the same +extent as regular function parameters. For example, in a module that +provides interface \code{Send[uint8\_t id]} of type \kw{SendMsg}: +\begin{quote} \begin{verbatim} +command result_t Send.send[uint8_t id](uint16_t address, uint8_t length, + TOS_MsgPtr msg) { + ... + return SUCCESS; +} +\end{verbatim} \end{quote} + +Compile-time errors are reported when: +\begin{itemize} +\item There is no implementation for a provided command or event. +\item The type signature, optional interface parameters and presence or +absence of the \kw{async} keyword of a command or event does not match that +given in the module's specification. +\end{itemize} + +\subsection{Calling Commands and Signaling Events} + +The following extensions to C syntax are used to call events and signal +commands: +\begin{quote} \grammarshift \em \begin{tabbing} +\grammarindent +postfix-expression:\\ +\> postfix-expression \kw{[} argument-expression-list \kw{]}\\ +\> call-kind\opt primary \kw{(} argument-expression-list\opt \kw{)}\\ +\> \ldots +\\\\ +call-kind: \emph{one of}\\ +\> \kw{call} \kw{signal} \kw{post} +\end{tabbing} \end{quote} + +A non-parameterised command $\alpha$ is called with \code{call +$\alpha$(...)}, a non-parameterised event $\alpha$ is signaled with +\code{signal $\alpha$(...)}. For instance, in a module that uses interface +\code{Send} of type \kw{SendMsg}: \code{call Send.send(1, sizeof(Message), +\&msg1)}. + +A parameterised command $\alpha$ (respectively, an event) with $n$ +instance parameters of type $\tau_1, \ldots, \tau_n$ is called with +instance arguments $e_1, \ldots, e_n$ as follows: \code{call +$\alpha$[$e_1, \ldots, e_n$](...)} (respectively, \code{signal +$\alpha$[$e_1, \ldots, e_n$](...)}). Interface argument $e_i$ +must be assignable to type $\tau_i$; the actual interface argument value +is the value of $e_i$ cast to type $\tau_i$. For instance, in a module that uses +interface \code{Send[uint8\_t id]} of type \kw{SendMsg}: + +\begin{quote} \begin{verbatim} + int x = ...; + call Send.send[x + 1](1, sizeof(Message), &msg1); +\end{verbatim} \end{quote} + +Execution of commands and events is immediate, i.e., \kw{call} and +\kw{signal} behave similarly to function calls. The actual command or event +implementations executed by a \code{call} or \code{signal} expression +depend on the wiring statements in the program's configurations. These +wiring statements may specify that 0, 1 or more implementations are to be +executed. When more than 1 implementation is executed, we say that the +module's command or event has ``fan-out''. + +A module can specify a default implementation for a used command or +event $\alpha$ (a compile-time error occurs if a default +implementation is supplied for a provided command or event). Default +implementations are executed when $\alpha$ is not connected to any +command or event implementation (see +Section~\ref{sec:wiring-semantics}). A default command or event is +defined by prefixing a command or event implementation with the +\kw{default} keyword: +\begin{quote} \grammarshift \em \begin{tabbing} +\grammarindent +declaration-specifiers: \emph{also}\\ +\> \kw{default} declaration-specifiers\\ +\end{tabbing} \end{quote} +For instance, in a in a module that uses interface \code{Send} of type +\kw{SendMsg}: +\begin{quote} \begin{verbatim} +default command result_t Send.send(uint16_t address, uint8_t length, + TOS_MsgPtr msg) { + return SUCCESS; +} +/* call is allowed even if interface Send is not connected */ +... call Send.send(1, sizeof(Message), &msg1) ... +\end{verbatim} \end{quote} + +Section~\ref{sec:wiring-semantics} specifies what command or event +implementations are actually executed and what result gets returned by +\code{call} and \code{signal} expressions. + +\subsection{Tasks} + +A task is an independent locus of control defined by a function of +storage class \kw{task} returning \kw{void} and with no arguments: +\code{task void myTask() \{ ... \}}.\footnote{\nesc functions with no +arguments are declared with \code{()}, not \code{(void)}. See +Section~\ref{sec:misc-void}.} A task can also have a forward declaration, e.g., +\code{task void myTask();}. + +Tasks are posted for later execution by prefixing a call to the task +with \kw{post}, e.g., \code{post myTask()}. Post returns immediately; +its return value is 1 if the task was successfully posted, 0 +otherwise. The type of a post expression is \code{unsigned char}. +\begin{quote} \grammarshift \em \begin{tabbing} +\grammarindent +storage-class-specifier: \emph{also one of}\\ +\> \kw{task}\\ +\\ +call-kind: \emph{also one of}\\ +\> \kw{post} +\end{tabbing} \end{quote} +Section~\ref{sec:concurrency}, which presents \nesc's concurrency +model, explains when tasks get executed. + +\subsection{Atomic statements} + +Atomic statements: +\begin{quote} \grammarshift \em \begin{tabbing} +\grammarindent +atomic-stmt: \\ +\> \kw{atomic} statement\\ +\end{tabbing} \end{quote} +guarantee that the statement is executed ``as-if'' no other +computation occurred simultaneously, and furthermore any values stored +inside an atomic statement are visible inside all subsequent atomic +statements. Atomic statements are used to implement mutual exclusion, for +updates to concurrent data structures, etc. The following example +uses \kw{atomic} to prevent concurrent execution of \code{do\_something}: +\begin{verbatim} + bool busy; // global + + void f() { // called from an interrupt handler + bool available; + + atomic { + available = !busy; + busy = TRUE; + } + if (available) do_something; + atomic busy = FALSE; + } +\end{verbatim} + +Atomic sections should be short, though this is not currently enforced in +any way. Except for \kw{return} statements, control may only flow +``normally'' in or out of on atomic statement: any \kw{goto}, \kw{break} or +\kw{continue} that jumps in or out of an atomic statement is an error. A +\kw{return} statement is allowed inside an atomic statement; at runtime +the atomic section ends after evaluating the returned expression (if any) +but before actually returning from the function. + +Section~\ref{sec:concurrency} discusses the relation between \kw{atomic}, +\nesc's concurrency model, and the data-race detector. + +\section{Component Implementation: Binary Components} +\label{sec:binary} + +Binary components are declared with the \kw{component} keyword and +have no \kw{implementation} section. Instead, program's using binary +components must be linked with an object file providing the binary +component's implementation --- this object file might be the result +of compiling a different \nesc program. + +This object file must provide definitions for the provided commands +and events of the binary component, and can call its used commands +and events. For more details on external linkage rules for \nesc, +see Section~\ref{sec:linkage}. + +Note that \kw{default} commands and events (see Sections~\ref{sec:module} +and~\ref{sec:wiring-semantics}) do not work across binary component +boundaries --- the used commands and events of a binary component must +be fully wired. + +\section{Component Implementation: Configurations} +\label{sec:configuration} + +Configurations implement a component specification by selecting regular +components or instantiating generic components, and then connecting +(``wiring'') these components together. The implementation section of a +configuration consists of a list of configuration elements: +\begin{quote} \grammarshift \em \begin{tabbing} +\grammarindent +configuration-implementation:\\ +\> \kw{implementation} \kw{\{} configuration-element-list\opt \kw{\}}\\ +\\ +configuration-element-list:\\ +\> configuration-element\\ +\> configuration-element-list configuration-element\\ +\\ +configuration-element:\\ +\> components\\ +\> connection\\ +\> declaration\\ +\\ +\end{tabbing} \end{quote} + +A \emph{components} element specifies the components that are used to build +this configuration (Section~\ref{sec:config-components}), a +\emph{connection} specifies a single wiring statement +(Section~\ref{sec:wiring}), and a \emph{declaration} can declare a +\kw{typedef} or tagged type (other C declarations are compile-time errors) +(Section~\ref{sec:config-decls}). + +A configuration $C$'s wiring statements connects two sets of specification +elements: +\begin{itemize} +\item $C$'s specification elements. In this section, we refer to these as +\emph{external} specification elements. +\item The specification elements of the components referred to instantiated +in $C$. We refer to these as \emph{internal} specification elements. +\end{itemize} + +\subsection{Included components} +\label{sec:config-components} + +A \emph{components} elements specifies some components used to build this +configuration. These can be: +\begin{itemize} +\item A non-generic component $X$. Non-generic components are implicitly +instantiated, references to $X$ in different configurations all +refer to the same component. + +\item An instantiation of a generic component $Y$. Instantiations of $Y$ in +different configurations, or multiple instantiations in the same +configuration represent different components (see +Section~\ref{sec:generic-components}). +\end{itemize} + +The syntax of \emph{components} is as follows: +\begin{quote} \grammarshift \em \begin{tabbing} +\grammarindent +components:\\ +\> \kw{components} component-line \kw{;}\\ +\\ +component-line:\\ +\> component-ref instance-name\opt\\ +\> component-line \kw{,} component-ref instance-name\opt\\ +\\ +instance-name:\\ +\> \kw{as} identifier\\ +\\ +component-ref:\\ +\> identifier\\ +\> \kw{new} identifier \kw{(} component-argument-list \kw{)}\\ +\\ +component-argument-list:\\ +\> component-argument\\ +\> component-argument-list \kw{,} component-argument\\ +\\ +component-argument:\\ +\> expression\\ +\> type-name +\end{tabbing} \end{quote} +Each \emph{component-ref} specifies a non-generic component $X$ by simply +giving its name (a compile-time error occurs if $X$ is generic) and +a generic component $Y$ with $\kw{new} Y(args)$ (a compile-time error occurs +if $Y$ is not generic). The arguments to $Y$ must match the number of +parameters of $Y$'s definition, and: +\begin{itemize} +\item If the parameter is a type parameter, then the argument must be +a type which is not incomplete, or of function or array type. +\item If the parameter is of type \code{char[]}, the argument must be +a string constant. +\item If the parameter is of arithmetic type, the argument must be a +constant whose value is in the range of the parameter type. +\end{itemize} + +Within a \emph{connection}, a component specified in +\emph{components} is referred to by: +\begin{itemize} +\item The name explicitly specified by the \code{X as Y} syntax +(\emph{instance-name}). Use of \kw{as} is necessary, e.g., when +instantiating the same generic component more than once in a given +configuration. +\item The name of the component definition (\code{components new X(), Y;} is +the same as \code{components new X() as X, Y as Y;}). +\end{itemize} +The names specified by \emph{components} elements belong to the object name +space of the component's implementation scope (Section~\ref{sec:scoping}). + +This \code{NoWiring} configuration: +\begin{quote} +\begin{verbatim} +configuration NoWiring { } +implementation { + components A, new AQueue(10, int); + components new AQueue(20, float) as SecondQueue; +} +\end{verbatim} +\end{quote} +selects component \code{A}, and instantiates generic component +\code{AQueue} twice. The two instances of \code{AQueue} are known as +\code{AQueue} and \code{SecondQueue} within \code{NoWiring}. + +\subsection{Wiring} +\label{sec:wiring} + +Wiring is used to connect specification elements (interfaces, commands, +events) together. This section and the next (Section~\ref{sec:implicit}) +define the syntax and compile-time rules for +wiring. Section~\ref{sec:wiring-semantics} details how a program's wiring +statements dictate which functions get called by the \kw{call} and +\kw{signal} expressions found in modules. +\begin{quote} \grammarshift \em \begin{tabbing} +\grammarindent +connection:\\ +\> endpoint \kw{=} endpoint\\ +\> endpoint \kw{->} endpoint\\ +\> endpoint \kw{<-} endpoint\\ +\\ +endpoint:\\ +\> identifier-path \\ +\> identifier-path \kw{[} argument-expression-list \kw{]}\\ +\\ +identifier-path:\\ +\> identifier\\ +\> identifier-path \kw{.} identifier\\ +\end{tabbing} \end{quote} + + +Wiring statements connect two \emph{endpoints}. The +\emph{identifier-path} of an \emph{endpoint} specifies a specification +element (either internal or external). The +\emph{argument-expression-list} optionally specifies instance +arguments. We say that an endpoint is parameterised if its +specification element is parameterised and the endpoint has no +arguments. A compile-time error occurs if an endpoint has +arguments and any of the following is true: +\begin{itemize} +\item Some arguments is not a constant expression. +\item The endpoint's specification element is not parameterised. +\item There are more (or less) arguments than there are parameters +on the specification element. +\item The argument's values are not in range for the specification element's +parameter types. +\end{itemize} + +A compile-time error occurs if the \emph{identifier-path} of an +\emph{endpoint} is not of one the three following forms: +\begin{itemize} +\item $X$, where $X$ names an external specification element. +\item $K.X$ where $K$ is a component from the \emph{component-list} and +$X$ is a specification element of $K$. +\item $K$ where $K$ is a some component name from the +\emph{component-list}. This form is used in implicit connections, +discussed in Section~\ref{sec:implicit}. This form cannot be used when +arguments are specified. + +Note that a component name can hide an external specification element, +preventing the element from being wired: +\begin{quote} +\begin{verbatim} +configuration AA { provides interface X as Y; } +implementation { + components Z as Y, Z2 as Y2; + + Y /* refers to component Z, not interface X */ -> Y2.A; +} +\end{verbatim} +\end{quote} +Hiding specification elements will always result in a compile-time error as +external specification elements must all be wired. +\end{itemize} + +There are three wiring statements in \nesc: +\begin{itemize} +\item \emph{endpoint}$_1$ \code{=} \emph{endpoint}$_2$ \ (equate wires): +Any connection involving an external specification element. These +effectively make two specification elements equivalent. + +Let $S_1$ be the specification element of \emph{endpoint}$_1$ and $S_2$ +that of \emph{endpoint}$_2$. One of the following two conditions must hold +or a compile-time error occurs: +\begin{itemize} +\item $S_1$ is internal, $S_2$ is external (or vice-versa) and $S_1$ and +$S_2$ are both provided or both used, +\item $S_1$ and $S_2$ are both external and one is provided and the other used. +\end{itemize} + +\item \emph{endpoint}$_1$ \code{->} \emph{endpoint}$_2$ \ (link wires): A +connection between two internal specification elements. Link wires always +connect a used specification element specified by \emph{endpoint}$_1$ to a +provided one specified by \emph{endpoint}$_2$ . If these two conditions do +not hold, a compile-time error occurs. + +\item \emph{endpoint}$_1$ \code{<-} \emph{endpoint}$_2$ is equivalent to +\emph{endpoint}$_2$ \code{->} \emph{endpoint}$_1$. +\end{itemize} + +In all three kinds of wiring, the two specification elements specified must +be compatible, i.e., they must both be commands, or both be events, or both +be interfaces. Also, if they are commands (or events), then they +must both have the same function signature. If they are interfaces +they must have the same interface type. If these conditions do not hold, +a compile-time error occurs. + +If one endpoint is parameterised, the other must be too and must have the +same parameter types; otherwise a compile-time error occurs. + +A configuration's external specification elements must all be wired or +a compile-time error occurs. However, internal specification elements +may be left unconnected (these may be wired in another configuration, +or they may be left unwired if the modules have the appropriate +\kw{default} event or command implementations, see +Section~\ref{sec:wiring-semantics}). + +\subsection{Implicit Connections} +\label{sec:implicit} + +It is possible to write \code{$K_1$ <- $K_2$.$X$} or \code{$K_1$.$X$ <- +$K_2$} (and the same with \kw{=}, or \kw{->}). This syntax iterates through +the specification elements of $K_1$ (resp. $K_2$) to find a specification +element $Y$ such that \code{$K_1$.$Y$ <- $K_2$.$X$} (resp. \code{$K_1$.$X$ +<- $K_2$.$Y$}) forms a valid connection. If exactly one such $Y$ can +be found, then the connection is made, otherwise a compile-time error +occurs. + +For instance, with: +\begin{quote} \begin{verbatim} +module M1 { module M2 { + provides interface StdControl; uses interface StdControl as SC; +} ... } ... + + configuration C { } + implementation { + components M1, M2; + M2.SC -> M1; + } +\end{verbatim} \end{quote} +The \code{M2.SC -> M1} line is equivalent to \code{M2.SC -> M1.StdControl}. + +\subsection{Declarations in Configurations} +\label{sec:config-decls} + +As we saw above, like component specifications +(Section~\ref{sec:spec-other}), configurations can include \kw{typedef} and +tagged type declarations. These declarations belong to the configuration's +implementation scope. + +Additionally, a configuration can refer to the \kw{typedef}s and enum +constants of the components that it includes. To support this, the +syntax for referring to \kw{typedef}s is extended as follows: +\begin{quote} \grammarshift \em \begin{tabbing} +\grammarindent +typedef-name: \emph{also one of}\\ +\> identifier \kw{.} identifier +\end{tabbing} \end{quote} +where the first identifier must refer to one of the configuration's +components with an appropriate \kw{typedef} in its +specification. Similarly, enum constants are referenced by extending C's +field-reference syntax to allow the object to be the name of one of the +configuration's components. + +For example: +\begin{quote} \begin{verbatim} +module M { + typedef int t; + enum { MAGIC = 54 }; +} ... + +configuration C { } +implementation { + components M as Someone; + + typedef Someone.t Ct; + enum { GREATERMAGIC = Someone.MAGIC + 1 }; +} +\end{verbatim} \end{quote} + +\subsection{Examples} + +The first example shows all possible wiring cases (comments within the +example): +\begin{quote} +\begin{verbatim} +configuration All { + provides interface A as ProvidedA1; + provides interface A as ProvidedA2; + provides interface A as ProvidedA3; + uses interface A as UsedA1; +} +implementation { + components new MyComponent() as Comp1, new MyComponent() as Comp2; + + // equate our interface ProvidedA1 with MyA provided by Comp1 + ProvidedA1 = Comp1.MyA; + + // the same, for ProvidedA2 and MyA of Comp2. We rely on the implicit + // connection to avoid naming MyA + ProvidedA2 = Comp2; + + // An equate wire connecting ProvidedA3 with UsedA1. We're just passing + // the interface through + ProvidedA3 = UsedA1; + + // Link some B interfaces together: + Comp1.UsedB -> Comp2.MyB; // fully explicit connection + Comp1 -> Comp2.MyB; // implicit equivalent of above line + Comp1 <- Comp2.UsedB; // implicit equivalent of Comp2.UsedB -> Comp1.MyB +} + +generic module MyComponent() { + provides interface A as MyA; + provides interface B as MyB; + uses interface B as UsedB; +} implementation { ... } +\end{verbatim} +\end{quote} + +The same specification element may be connected multiple times, e.g.,: +\begin{quote} \begin{verbatim} +configuration C { + provides interface X; +} implementation { + components C1, C2; + + X = C1.X; + X = C2.X; +} +\end{verbatim} \end{quote} +In this example, the multiple wiring will lead to multiple signalers +(``fan-in'') for the events in interface \code{X} and for multiple +functions being executed (``fan-out'') when commands in interface \code{X} +are called. Note that multiple wiring can also happen when two +configurations independently wire the same interface, e.g., the +following example wires \code{C2.Y} twice: +\begin{quote} \begin{verbatim} +configuration C { } configuration D { } +implementation { implementation { + components C1, C2; components C3, C2; + + C1.Y -> C2.Y; C3.Y -> C2.Y; +} } +\end{verbatim} \end{quote} + +\subsection{Wiring Semantics} +\label{sec:wiring-semantics} + +We first explain the semantics of wiring in the absence of parameterised +interfaces. Section~\ref{sec:wiring-parms} below covers parameterised +interfaces. Section~\ref{sec:wiring-reqs} specifies requirements +on the wiring statements of an application when viewed as a whole. We will +use the simple application of Figure~\ref{fig:wiring} as our running +example. + +For the purposes of this section, we will assume that all instantiations of +generic components have been expanded into non-generic components as +explained in Sections~\ref{sec:generic-components} +and~\ref{sec:load-component}. + +\begin{figure} +\begin{verbatim} +interface X { module M { + command int f(); provides interface X as P; + event bool g(int x); uses interface X as U; +} provides command void h(); + } implementation { ... } +configuration C { + provides interface X; + provides command void h2(); +} +implementation { + components M; + X = M.P; + M.U -> M.P; + h2 = M.h; +} +\end{verbatim} +\caption{Simple Wiring Example} +\label{fig:wiring} +\end{figure} + +We define the meaning of wiring in terms of \emph{intermediate +functions}.\footnote{\nesc can be compiled without explicit intermediate +functions, so the behaviour described in this section has no runtime cost +beyond the actual function calls and the runtime dispatch necessary for +parameterised commands or events.} There is one intermediate function +$I_\alpha$ for every command or event $\alpha$ of every component. For +instance, in Figure~\ref{fig:wiring}, module M has intermediate functions +$I_\code{M.P.f}$, $I_\code{M.P.g}$, $I_\code{M.U.f}$, $I_\code{M.U.g}$, +$I_\code{M.h}$. In examples, we name intermediate functions based on their +component, interface name and function name. + +An intermediate function is either used or provided. Each intermediate +function takes the same arguments as the corresponding command or +event in the component's specification. The body of an intermediate +function $I$ is a list of calls (executed sequentially) to other +intermediate functions. These other intermediate functions are the +functions to which $I$ is connected by the application's wiring +statements. The arguments $I$ receives are passed on to the called +intermediate functions unchanged. The result of $I$ is a list of +results (the type of this list's elements is the result type of the +command or event corresponding to $I$), built by concatenating the +result lists of the called intermediate functions. An intermediate +function which returns an empty result list corresponds to an +unconnected command or event; an intermediate function which returns a +list of two or more elements corresponds to ``fan-out''. + +\paragraph{Intermediate Functions and Configurations} + +The wiring statements in a configuration specify the body of intermediate +functions. We first expand the wiring statements to refer to intermediate +functions rather than specification elements, and we suppress the +distinction between \code{=} and \code{->} wiring statements. We write +\code{$I_1$ <-> $I_2$} for a connection between intermediate functions +\code{$I_1$} and \code{$I_2$}. For instance, configuration \code{C} from +Figure~\ref{fig:wiring} specifies the following intermediate function +connections:\\ +\begin{tabular}{ccc} +$I_\code{C.X.f}$ \code{<->} $I_\code{M.P.f}$ & +$I_\code{M.U.f}$ \code{<->} $I_\code{M.P.f}$ & +$I_\code{C.h2}$ \code{<->} $I_\code{M.h}$ \\ +$I_\code{C.X.g}$ \code{<->} $I_\code{M.P.g}$ & +$I_\code{M.U.g}$ \code{<->} $I_\code{M.P.g}$ +\end{tabular} + +In a connection \code{$I_1$ <-> $I_2$} from a configuration +$C$ one of the two intermediate functions is the \emph{callee} and the +other is the \emph{caller}. The connection simply specifies that a call to +the callee is added to the body of the caller. \code{$I_1$} +(similarly, \code{$I_2$}) is a callee if any of the following conditions hold +(we use the internal, external terminology for specification elements with +respect to the configuration $C$ containing the connection): +\begin{itemize} +\item If \code{$I_1$} corresponds to an internal specification element that +is a bare, provided command or event. +\item If \code{$I_1$} corresponds to an external specification element that +is a bare, used command or event. +\item If \code{$I_1$} corresponds to a command of interface instance $X$, +and $X$ is an internal, provided or external, used specification element. +\item If \code{$I_1$} corresponds to an event of interface instance $X$, +and $X$ is an external, provided or internal, used specification element. +\end{itemize} +If none of these conditions hold, \code{$I_1$} is a caller. The rules for +wiring in Section~\ref{sec:wiring} ensure that a connection \code{$I_1$ <-> +$I_2$} cannot connect two callers or two callees. In configuration \code{C} +from Figure~\ref{fig:wiring}, $I_\code{C.X.f}$, $I_\code{C.h2}$, +$I_\code{M.P.g}$, $I_\code{M.U.f}$ are callers and $I_\code{C.X.g}$, +$I_\code{M.P.f}$, $I_\code{M.U.g}$, $I_\code{M.h}$ are callees. Thus the +connections of \code{C} specify that a call to $I_\code{M.P.f}$ is added to +$I_\code{C.X.f}$, a call to $I_\code{C.X.g}$ is added to $I_\code{M.P.g}$, +etc. + + +\paragraph{Intermediate Functions and Modules} + +The C code in modules calls, and is called by, intermediate functions. + +The intermediate function $I$ for provided command or event $\alpha$ of +module $M$ contains a single call to the implementation of $\alpha$ in +$M$. Its result is the singleton list of this call's result. + +The expression \code{call} $\alpha(e_1, \ldots, e_n)$ is evaluated as +follows: +\begin{itemize} +\item The arguments $e_1, \ldots, e_n$ are evaluated, giving values $v_1, +\ldots, v_n$. + +\item The intermediate function $I$ corresponding to $\alpha$ is called +with arguments $v_1, \ldots, v_n$, with results list $L$. + +\item If $L = (w)$ (a singleton list), the result of the \code{call} +is $w$. + +\item If $L = (w_1, w_2, \ldots, w_m)$ (two or more elements), the result +of the \code{call} depends on the result type $\tau$ of $\alpha$. If $\tau += \kw{void}$, then the result is \kw{void}. Otherwise, $\tau$ must have an +associated \emph{combining function} $c$ (Section~\ref{sec:attributes} +shows how combining functions are associated with types), or a compile-time +error occurs. The combining function takes two values of type $\tau$ and +returns a result of type $\tau$. The result of the \kw{call} is $c(w_1, +c(w_2, \ldots, c(w_{m-1}, w_m)))$ (note that the order of the elements of +$L$ was arbitrary). + +\item If $L$ is empty the default implementation for $\alpha$ is +called with arguments $v_1, \ldots, v_n$, and its result is the result of +the \code{call}. Section~\ref{sec:wiring-reqs} specifies that a +compile-time error occurs if $L$ can be empty and there is no default +implementation for $\alpha$. +\end{itemize} +The rules for \code{signal} expressions are identical. + +\paragraph{Example Intermediate Functions} + +Figure~\ref{fig:wiring-fns} shows the intermediate functions that are +produced for the components of Figure~\ref{fig:wiring}, using a C-like +syntax, where \code{list($x$)} produces a singleton list containing $x$, +\code{empty\_list} is a constant for the 0 element list and +\code{concat\_list} concatenates two lists. The calls to \code{M.P.f}, +\code{M.U.g}, \code{M.h} represent calls to the command and event +implementations in module \code{M} (not shown). + +\begin{figure} +\begin{tabular}{ll} +\tt list of int $I_\code{M.P.f}()$ \{ & \tt list of bool $I_\code{M.P.g}$(int x) \{ \\ +\tt \ \ return list(M.P.f()); & \tt \ \ list of bool r1 = $I_\code{C.X.g}$(x); \\ +\tt \} & \tt \ \ list of bool r1 = $I_\code{M.U.g}$(x); \\ + & \tt \ \ return list\_concat(r1, r2); \\ + & \tt \} \\ +\\ +\tt list of int $I_\code{M.U.f}()$ \{ & \tt list of bool $I_\code{M.U.g}$(int x) \{ \\ +\tt \ \ return $I_\code{M.P.f}$(); & \tt \ \ return list(M.U.g(x)); \\ +\tt \} & \tt \} \\ +\\ +\tt list of int $I_\code{C.X.f}()$ \{ & \tt list of bool $I_\code{C.X.g}$(int x) \{ \\ +\tt \ \ return $I_\code{M.P.f}$(); & \tt \ \ return empty\_list; \\ +\tt \} & \tt \} \\ +\\ +\tt list of void $I_\code{C.h2}()$ \{ & \tt list of void $I_\code{M.h}$() \{ \\ +\tt \ \ return $I_\code{M.h}$(); & \tt \ \ return list(M.h()); \\ +\tt \} & \tt \} \\ +\end{tabular} +\caption{Intermediate Functions for Figure~\ref{fig:wiring}} +\label{fig:wiring-fns} +\end{figure} + +\subsubsection{Wiring and Parameterised Functions} +\label{sec:wiring-parms} + +If a command or event $\alpha$ of component $K$ has instance +parameters of type $\tau_1, \ldots, \tau_n$ then there is an +intermediate function $I_{\alpha,v_1,\ldots,v_n}$ for every distinct +tuple $(v_1:\tau_1, \ldots, v_n:\tau_n)$. + +In modules, if intermediate function $I_{v_1, \ldots, v_n}$ corresponds +to parameterised, provided command (or event) $\alpha$ then the call in +$I_{v_1, \ldots, v_n}$ to $\alpha$'s implementation passes values $v_1, +\ldots, v_n$ as the values for $\alpha$'s instance parameters. + +The expression \code{call} $\alpha[e'_1, \ldots, e'_m](e_1, \ldots, e_n)$ +is evaluated as follows: +\begin{itemize} +\item The arguments $e_1, \ldots, e_n$ are evaluated, giving values $v_1, +\ldots, v_n$. +\item The arguments $e'_1, \ldots, e'_m$ are evaluated, giving values $v'_1, +\ldots, v'_m$. +\item The $v'_i$ values are cast to type $\tau_i$, where $\tau_i$ is the +type of the $i$th interface parameter of $\alpha$. +\item The intermediate function $I_{v'_1,\ldots,v'_m}$ corresponding to +$\alpha$ is called with arguments $v_1, \ldots, v_n$, with results list +$L$.\footnote{This call typically involves a runtime selection between +several command implementations - this is the only place where intermediate +functions have a runtime cost.} +\item If $L$ has one or more elements, the result of the \code{call} is +produced as in the non-parameterised case. +\item If $L$ is empty the default implementation for $\alpha$ is called +with interface parameter values $v'_1, \ldots, v'_m$ and arguments $v_1, +\ldots, v_n$, and its result is the result of the +\code{call}. Section~\ref{sec:wiring-reqs} specifies that a compile-time +error occurs if $L$ can be empty and there is no default implementation for +$\alpha$. +\end{itemize} +The rules for \code{signal} expressions are identical. + +There are two cases when an endpoint in a wiring statement refers to a +parameterised specification element: +\begin{itemize} +\item The endpoint specifies parameter values $v_1, \ldots, v_n$. If the +endpoint corresponds to commands or events $\alpha_1, \ldots, \alpha_m$ +then the corresponding intermediate functions are +$I_{\alpha_1,v_1,\ldots,v_n}$, \ldots, $I_{\alpha_m,v_1,\ldots,v_n}$ and +wiring behaves as before. +\item The endpoint does not specify parameter values. In this case, both +endpoints in the wiring statement correspond to parameterised specification +elements, with identical interface parameter types $\tau_1, \ldots, +\tau_n$. If one endpoint corresponds to commands or events $\alpha_1, +\ldots, \alpha_m$ and the other to corresponds to commands or events +$\beta_1, \ldots, \beta_m$, then there is a connection $I_{\alpha_i, w_1, +\ldots, w_n}$ \code{<->} $I_{\beta_i, w_1,\ldots, w_n}$ for all $1 \leq i +\leq m$ and all tuples $(w_1:\tau_1, \ldots, w_n:\tau_n)$ (i.e., the +endpoints are connected for all corresponding parameter values). +\end{itemize} + +\subsubsection{Application-level Requirements} +\label{sec:wiring-reqs} + +There are two requirement that the wiring statements of an application must +satisfy, or a compile-time error occurs: +\begin{itemize} +\item There must be no infinite loop involving only intermediate functions. +\item At every \code{call $\alpha$} (or \code{signal $\alpha$}) expression +in the application's modules: +\begin{itemize} +\item If the call is unparameterised: if the call returns an empty result +list there must be a default implementation of $\alpha$ (the number of +elements in the result list depends only on the wiring). +\item If the call is parameterised: if substitution of any values for the +interface parameters of $\alpha$ returns an empty result list there must be +a default implementation of $\alpha$ (the number of elements in the result +list for a given parameter value tuple depends only on the wiring). + +Note that this condition does not consider the expressions used to specify +interface parameter values at the call-site. +\end{itemize} +\end{itemize} + +\section{Concurrency in \nesc} +\label{sec:concurrency} + +\nesc's execution model is based on run-to-completion +\emph{tasks} (that typically represent the ongoing computation), and +\emph{interrupt handlers} that are signaled asynchronously by hardware. The +compiler relies on the user-provided \code{hwevent} and +\code{atomic\_hwevent} attributes to recognise interrupt handlers (see +Section~\ref{sec:attributes}). A scheduler for \nesc can execute tasks in +any order, but must obey the run-to-completion rule (the standard \tinyos +scheduler follows a FIFO policy). Because tasks are not preempted and run +to completion, they are atomic with respect to each other, but are not +atomic with respect to interrupt handlers. + +As this is a concurrent execution model, \nesc programs are susceptible to +race conditions, in particular data races on the program's \emph{shared +state}, i.e., its global and module variables (\nesc does not include +dynamic memory allocation). Races are avoided either by accessing +shared state only in tasks, or only within atomic statements. The \nesc +compiler reports potential data races to the programmer at compile-time. + +Formally, we divide the code of a \nesc program into two parts: +\begin{quote} +\textbf{Synchronous Code (SC):} code (functions, commands, events, tasks) +that is only reachable from tasks. + +\textbf{Asynchronous Code (AC):} code that is reachable from at +least one interrupt handler. +\end{quote} + +Although non-preemption eliminates data races among tasks, there are still +potential races between SC and AC, as well as between AC and AC. To +prevent data races, \nesc issues warnings for violations of the following +rules: +\begin{quote} +{\sl {\bf Race-Free Invariant 1}}: If a variable $x$ is written in AC, then +all accesses to $x$ must occur in atomic sections. + +{\sl {\bf Race-Free Invariant 2}}: If a variable $x$ is read in AC, then +all writes to $x$ must occur in atomic sections. +\end{quote} +The body of a function $f$ called from an atomic statement is considered to +be ``in'' the atomic statement as long as all calls to $f$ are ``in'' +atomic statements. + +It is possible to introduce a race condition that the compiler cannot +detect, but it must span multiple atomic statements or tasks and use storage +in intermediate variables. + +\nesc may report data races that cannot occur in practice, e.g., if all +accesses are protected by guards on some other variable. To avoid redundant +messages in this case, the programmer can annotate a variable $v$ with the +\kw{norace} storage-class specifier to eliminate all data race warnings for +$v$. The \kw{norace} keyword should be used with caution. + +\nesc reports a compile-time error for any command or event that is AC and +that was not declared with \kw{async}. This ensures that code that was not +written to execute safely in an interrupt handler is not called +inadvertently. + +\section{Attributes} +\label{sec:attributes} + +All C and \nesc declarations can be decorated with \emph{attributes} +(inspired by Java 1.5's attributes~\cite{java-attributes}) that: +\begin{itemize} +\item Avoid reserving lots of keywords and burdening the syntax. For + example, \code{@integer()} is used to mark generic component type arguments + that must be integer types (Section~\ref{sec:type-parameters}). + +\item Allow user-specified annotations which are accessible to external tools. +The mechanism by which these user-specified attributes are accessed is +beyond the scope of this reference manual; please see the \nesc compiler +manual for details. +\end{itemize} + +User-defined attributes must be declared prior to use, and have no effect +on code generation. The language-defined attributes are implicitly +declared; their effects are described in Section~\ref{sec:attributes}. + +An attribute declaration is simply a \kw{struct} declaration where the +\kw{struct}'s name is preceded by \code{@}: +\begin{quote} \grammarshift +\em \begin{tabbing} +\grammarindent +struct-or-union-specifier: \emph{also one of}\\ +\> \kw{struct} \kw{@} identifier \kw{\{} struct-declaration-list \kw{\}}\\ +\end{tabbing} +\end{quote} + +A use of an attribute specifies the attribute's name and gives an initialiser +(in parentheses) that must be valid for attribute's declaration: +\begin{quote} \grammarshift +\em \begin{tabbing} +\grammarindent +attribute:\\ +\> \kw{@} identifier \kw{(} initializer-list \kw{)}\\ +\end{tabbing} +\end{quote} + + +Attributes can be placed on all C and \nesc declarations and definitions. +Generally, attributes appear after the annotated object's name and +associated arguments, but before any other syntactic elements (e.g., +initialisers, function bodies, etc). See Appendix~\ref{sec:grammar} for the +full set of rules. The attributes of $x$ are the union of all attributes on +all declarations and definitions of $x$. + +Example: +\begin{quote} +\begin{verbatim} +struct @myattr { + int x; + char *why; +}; + +extern int z @myattr(5, "fun"); // simple use + +// a second attribute on z at it's definition +int z @myattr(3, "morefun") = 22; + +// use on a function, with a C99-style initialiser +void f(void) @myattr(.x=5, .why="for f") { + ... +} + +// use in a module, with an empty initialiser +module X { + provides interface I @myattr(); +} +... +\end{verbatim} +\end{quote} + +\subsection{\nesc Attributes} + +\nesc includes seven predefined attributes with various effects. Except +where otherwise specified, these take no arguments: + +\begin{itemize} +\item \code{@C()}: This attribute is used for a C declaration or definition +$d$ at the top-level of a module (it is ignored for all other +declarations). It specifies that $d$'s should appear in the global C scope +rather than in the module's per-component-implementation scope. This allows +$d$ to be used (e.g., called if it is a function) from C code. + +\item \code{@spontaneous()}: This attribute can be used on any function $f$ +(in modules or C code). It indicates that there are calls $f$ that are not +visible in the source code. The C \code{main} function is a typical +example. Section~\ref{sec:app} discusses how the \nesc compiler uses the +\code{spontaneous} attribute during compilation. + +\item \code{@hwevent()}: This attribute can be used on any function $f$ (in +modules or C code). It indicates that $f$ is an interrupt handler, i.e., +that there are spontaneous calls to $f$ and that $f$ is AC +(Section~\ref{sec:concurrency}). The use of \code{@hwevent()} implies +\code{@spontaneous()}. + +\item \code{@atomic\_hwevent()}: This attribute can be used on any function +$f$ (in modules or C code). This behaves the same as \code{@hwevent()}, but, +additionally, informs \nesc that the body of $f$ behaves as if it were an +\kw{atomic} statement (on typical hardware this means that this interrupt +handler runs with interrupts disabled). The use of \code{@atomic\_hwevent()} +implies \code{@spontaneous()}. + +Note that neither \code{@hwevent()} or \code{@atomic\_hwevent()} provide any +linkage of $f$ with a particular interrupt handler. The mechanism by +which that is achieved is platform-specific. + +Inside a function with the \code{@atomic\_hwevent()} attribute, a call to +\code{\_\_nesc\_enable\_interrupt()} is assumed to terminate +the implicit \kw{atomic} statement. This is useful for interrupt handlers +which must start with interrupts disabled, but can reenable interrupts +after a little work. + +\item \code{@combine($fnname$)}: This attribute specifies the combining +function for a type in a \kw{typedef} declaration. The combining function +specifies how to combine the multiple results of a call to a command +or event which has ``fan-out''. For example: +\begin{verbatim} + typedef uint8_t result_t @combine("rcombine"); + + result_t rcombine(result_t r1, result_t r2) + { + return r1 == FAIL ? FAIL : r2; + } +\end{verbatim} +specifies logical-and-like behaviour when combining commands (or events) +whose result type is \code{result\_t}. See +Section~\ref{sec:wiring-semantics} for the detailed semantics. + +A compile-time error occurs if the combining function $c$ for a type $t$ +does not have the following type: \code{$t$ $c$($t$, $t$)}. + +\item \code{@integer()}, \code{@number()}: declare properties of generic +component type parameters. See Section~\ref{sec:type-parameters}. + +\end{itemize} + +Example of attribute use: +\begin{quote} \begin{verbatim} +module RealMain { ... } +implementation { + int main(int argc, char **argv) @C() @spontaneous() { + ... + } +} +\end{verbatim} \end{quote} + +This example declares that function \code{main} should actually appear +in the C global scope (\code{@C()}), so that the linker can find it. It +also declares that \code{main} can be called even though there are no +function calls to \code{main} anywhere in the program +(\code{@spontaneous()}). + +\section{External Types} +\label{sec:external-types} + +External types are an extension to C that allows definition of types with a +platform-independent representation and no alignment restriction (i.e., an +arbitrary \code{char} array can be cast to, and accessed via, an external +type). They are intended for communication with entities external to +the \nesc program (e.g., other devices via a network), hence their name. + +\nesc has three kinds of external types: +\begin{itemize} +\item External base types are 2's complement integral types with a fixed +size and endianness. These types are \code{nx\_int$N$\_t}, +\code{nx\_uint$N$\_t}, \code{nxle\_int$N$\_t}, \code{nxle\_uint$N$\_t} for $N = +8, 16, 32, 64$. The \code{nx\_} types are big-endian, the \code{nxle\_} types +are little endian, the \code{int} types are signed and the \code{uint} +types are unsigned. Note that these types are not keywords. + +\item External array types are any array built from an external type, using +the usual C syntax, e.g, \code{nx\_int16\_t x[10]}. + +\code External structures and unions are declared like C structures and +unions, but using the \code{nx\_struct} and \code{nx\_union} keywords. An +external structure can only contain external types as elements. Currently, +external structures and unions cannot contain bitfields. +\end{itemize} + +External types have no alignment restrictions and external structures +contain no padding. External types can be used exactly like regular C +types.\footnote{The current \nesc compiler does not support using external +base types in casts, as function arguments and results, or to declare +initialised variables.} + +\section{Miscellaneous} +\label{sec:misc} + +\subsection{Constant Folding in \nesc} +\label{sec:constant-folding} + +There are two extensions to C's constant folding (see A.7.19 in +K\&R~\cite{kandr}) in \nesc: \emph{constant functions} and \emph{unknown +constants}. \emph{Constant functions} are functions provided by the \nesc +language which return a compile-time constant. The definition of \nesc's +constant functions is given in Section~\ref{sec:constant-functions}. An +\emph{unknown constant} is a constant whose value is not known at some +stage of semantic checking, e.g., non-type parameters to generic components +are unknown constants when a generic component is loaded and +checked. Unknown constants allow the definition of a generic component to +be (mostly, see next paragraph) checked for correctness before its +arguments' values are known. + +An expression involving an unknown constant is considered a constant +expression if the resulting expression is constant irrespective of the +unknown constant's value, with the following exceptions: $a / b$ and $a \% +b$ can assume that $b$ is not zero. Constant expressions involving unknown +constants are re-checked once the values of constant expressions become +known.\footnote{The time at which the value of unknown constants become +known is unspecified by this language definition.} As a result, the +following generic component definition is legal: +\begin{quote} +\begin{verbatim} +generic module A(int n) { } +implementation { + int s = 20 / n; +} +\end{verbatim} +\end{quote} +but the following instantiation will report a compile-time error: +\begin{quote} +\begin{verbatim} +configuration B { } +implementation { + components new A(0) as MyA; +} +\end{verbatim} +\end{quote} + +\subsection{Compile-time Constant Functions} +\label{sec:constant-functions} + +\nesc currently has three constant functions: +\begin{itemize} +\item +\code{unsigned int unique(char *identifier)} \\ +\code{unsigned int uniqueN(char *identifier, unsigned int nb)} + +Given a program with $k$ uses of \code{uniqueN} with the same +\code{identifier} and values $n_1, \ldots n_k$ for \code{nb}, each use +returns an integer $u_i$ from the sequence $0 \ldots (\sum_{i=0}^k +n_i) - 1$. Furthermore, the sequences $u_i \ldots u_i + n_i - 1$ do +not overlap with each other. Note that $n_i = 0$ is allowed. The +behaviour is undefined if $ \sum_{i=0}^k n_i >= \code{UINT\_MAX}$ +(\code{UINT\_MAX} from \code{}). + + +Less formally, \code{uniqueN("S", N)} allocates a sequence of +\code{N} consecutive numbers distinct from all other sequences +allocated for identifier \code{S}, returns the smallest value +from the sequence, and guarantees that the sequences are compact +(start at 0, no gaps between sequences). + +A use of \code{unique(S)} is short for \code{uniqueN(S, 1)}. + +The expansion of \code{uniqueN} calls happens after generic component +instantiation (Section~\ref{sec:load-component}): calls to \code{uniqueN} in +generic components return a different value in each instantiation. + +For purposes of checking constant expressions, \code{uniqueN($s$, $n$)} +behaves as if it were an unknown constant. + +Using \code{unique}, a component providing a service (defined by interface +\code{X}) can uniquely identify its clients with the following idiom: +\begin{quote} +\begin{verbatim} +module XService { + provides interface X[uint8_t id]; +} implementation { ... } + +module UserOfX { + uses interface X; +} implementation { ... } + +configuration ConnectUserToService { } +implementation { + components XService, UserOfX; + + UserOfX.X -> XService.X[unique("X")]; +} +\end{verbatim} +\end{quote} +Each client of \code{XService} will be connected to interface \code{X} with +a different \code{id}. + +\item \code{unsigned int uniqueCount(char *identifier)} + +\code{uniqueCount($s$)} returns the sum of all \code{nb} parameters +for all uses of \code{uniqueN($s$, nb)}, or 0 if there are no calls to +\code{uniqueN($s$)}. For purposes of checking constant expressions, +\code{uniqueCount($s$)} behaves as if it were an unknown constant. + +The intended use of \code{uniqueCount} is for dimensioning arrays (or +other data structures) which will be indexed using the numbers +returned by \kw{unique} and \kw{uniqueN}. For instance, a \kw{Timer} +service that identifies its clients (and hence each independent timer) +via a parameterised interface and \kw{unique} can use \kw{uniqueCount} +to allocate the correct number of timer data structures. + +\end{itemize} + +In the following example: +\begin{quote} +\begin{verbatim} +generic module A() { } +implementation { + int x = unique("A"); + int y = uniqueCount("A"); +} +configuration B { } +implementation { + components new A() as A1, new A() as A2; +} +\end{verbatim} +\end{quote} +\code{B.A1.y = B.A2.y = 2} and either \code{B.A1.x = 0, B.A2.x = 1} or +\code{B.A1.x = 1, B.A2.x = 0}. + +\subsection{Type Parameters and C Type Checking} +\label{sec:type-parameters} + +Generic interface and component definitions can have type +parameters. Syntactically, type parameters behave the same as \kw{typedef}'d +identifiers. When a generic component or interface is instantiated, the +type parameter will be replaced with the argument type, which cannot be +incomplete, of function or of array type. The size and alignment of a type +parameter are an unknown constant (Section~\ref{sec:constant-folding}). +The rules for assignment and type equivalence for a type parameter $t$ are +simple: a value of type $t$ is assignable to an lvalue of type $t$ (extends +A.7.17 in K\&R~\cite{kandr}) and type $t$ is only equivalent to itself (extends +A.8.10 in K\&R~\cite{kandr}). + +If a type parameter $t$ has the \code{@number()} attribute +(Section~\ref{sec:attributes}), the corresponding argument must be a +numerical (integral or floating-point) type, and all numerical operations +(i.e., those valid for floating-point types) are allowed on type $t$. + +If a type parameter $t$ has the \code{@integer()} attribute +(Section~\ref{sec:attributes}), the corresponding argument must be an +integral type, and all integral operations are allowed on type $t$. + +\subsection{Functions with no arguments, old-style C declarations} +\label{sec:misc-void} + +\nesc functions with no arguments are declared with \code{()}, not +\code{(void)}. The latter syntax reports a compile-time error. + +Old-style C declarations (with \code{()}) and function definitions +(parameters specified after the argument list) are not allowed in +interfaces or components (and cause compile-time errors). + +Note that neither of these changes apply to C files (so that existing +\file{.h} files can be used unchanged). + +\subsection{// comments} + +\nesc allows // comments in C, interface and component files. + +\section{\nesc Applications} +\label{sec:app} + +A \nesc application has two executable parts: C declarations and +definitions, and a set of components (non-generic components and +instantiated generic components). The components are connected +to each other via interfaces specified by a set of interface +definitions. + +The C declarations and definitions, interfaces and components that form a +\nesc application are determined by an on-demand loading process. The input +to the \nesc compiler is a single non-generic component $K$. The \nesc +compiler first loads a user-specified set of C files\footnote{\kw{ncc}, the +TinyOS frontend for \nesc always loads the TinyOS \file{tos.h} file.} +(Section~\ref{sec:load-c}), then loads the component definition for $K$ +(Section~\ref{sec:load-component}). The resulting program contains: +\begin{itemize} +\item All C declarations from the initially loaded C files +(Section~\ref{sec:load-c}). +\item All C declarations from all component and interface definitions +(Sections~\ref{sec:load-component} and~\ref{sec:load-intf}). +\item All components output by the rules of Section~\ref{sec:load-component}. +\end{itemize} + +Section~\ref{sec:cpp} discusses the interactions between \nesc and the C +preprocessor. The external linkage rules for a compiled \nesc program are +given in Section~\ref{sec:linkage}. The process by which C files, \nesc +component and interface definitions are located is outside the scope of +this reference manual; for details see the \file{ncc} and \kw{nescc} man +pages. + + +\subsection{Loading C file $X.h$} +\label{sec:load-c} + +File $X.h$ is located and preprocessed. Changes made to C macros (via +\code{\#define} and \code{\#undef}) are visible to all subsequently +preprocessed files. The C declarations and definitions from the +preprocessed $X$.h file are entered into the C global scope, and are +therefore visible to all subsequently processed C files, interfaces and +components. + +The \nesc keywords are not reserved when a C file is loaded in this +fashion. + +\subsection{Loading Component Definition $K$} +\label{sec:load-component} + +If $K$ has already been loaded, nothing more is done. Otherwise, file +$K$.nc is located and preprocessed. Changes made to C macros (via +\code{\#define} and \code{\#undef}) before the \kw{component}, \kw{module} +and \kw{configuration} keyword are preserved and visible to all +subsequently loaded files; changes made after this point are discarded. The +preprocessed file is parsed using the following grammar +(\emph{translation-unit} is a list of C declarations and function definitions): +\begin{quote} \grammarshift \em \begin{tabbing} +\grammarindent +nesC-file: \\ +\> translation-unit\opt interface\\ +\> translation-unit\opt module\\ +\> translation-unit\opt configuration +\end{tabbing} \end{quote} +Note that the \nesc keywords are reserved while parsing the C code in +\emph{translation-unit}. If $K$.nc does not define module $K$ or +configuration $K$, a compile-time error is reported. + +The component's definition is then processed +(Sections~\ref{sec:component-spec},~\ref{sec:configuration}, +and~\ref{sec:module}). All referenced component and interface definitions +are loaded (see also Section~\ref{sec:load-intf}) during this processing. +C declarations and definitions from a referenced component or interface +definition $D$ are available after the first reference to $D$. Note +however that macros defined in $D$ are not available in $K$ as $K$ +was already preprocessed (see Section~\ref{sec:cpp} for more discussion +of macros in \nesc). + +Finally, the set of components output by $K$ is defined by the following +algorithm: + +Expand($K$): +\begin{itemize} +\item If $K$ is a generic component, no component is output. + +\item If $K$ is a non-generic module, $K$ is output. + +\item If $K$ is a non-generic configuration: for each component +instantiation $\kw{new}\ L(a_1, \ldots, a_n)$ in $K$, a new component $X$ is +created according to the rules of Section~\ref{sec:generic-components} and +Expand($X$) is called recursively (instantiating further generic components +if $L$ contained component instantiations). Then $K$ is output. +\end{itemize} + +\subsection{Loading Interface Definition $I$} +\label{sec:load-intf} + +If $I$ has already been loaded, nothing more is done. Otherwise, file +$I$.nc is located and preprocessed. Changes made to C macros (via +\code{\#define} and \code{\#undef}) before the \kw{interface} keyword are +preserved and visible to all subsequently loaded files; changes made after +this point are discarded. The preprocessed file is parsed following the +\emph{nesC-file} production above. If $I$.nc does not define +\code{interface $I$} a compile-time error is reported. Then +$I$'s definition is processed (Section~\ref{sec:interface}). + +\subsection{\nesc and the C Preprocessor} +\label{sec:cpp} + +During preprocessing, \nesc defines the \kw{NESC} symbol to a number XYZ +which identifies the version of the \nesc language and compiler. For \nesc +1.2, XYZ is at least 120.\footnote{The \kw{NESC} symbol was not defined in +versions of \nesc prior to 1.1.} + +The loading of component and interface definitions is driven by syntactic +rules; as a result it must happen after preprocessing. Thus if a component +$X$ references, e.g., an interface $I$, macros defined in $I$ cannot be +used in $X$ even though $I$'s C declarations can be. We suggest the +following structure to avoid confusion: +\begin{enumerate} +\item All C declarations, function definitions and macros should be placed +in a \file{.h} file, e.g., \file{I.h}. This file should be wrapped in the +usual \code{\#ifndef I\_H} / \code{\#define I\_H} / \code{\#endif} way. + +\item The file(s) with which the \file{.h} file is naturally associated +(e.g., an interface \code{I}) should \code{\#include "I.h"}). +\label{sec:cpp-natural} + +\item Files which wish to use the macros defined in the \file{.h} file +should \code{\#include} it. + +\item Files which wish to use the C declarations and definitions from +the \file{.h} file should \code{\#include} it if they do not reference one +of the components or interfaces from point~\ref{sec:cpp-natural}. +\end{enumerate} + +These rules are similar to how \code{\#include} is typically used in C. + +\subsection{External Linkage Rules} +\label{sec:linkage} + +The following rules specify the external visibility of symbols defined +in a nesC program: +\begin{itemize} +\item The external linkage of C variable declarations is the same as for C +(note that this does not include variables declared inside modules). + +\item All function definitions marked with \code{spontaneous}, +\code{hwevent} or \code{atomic\_hwevent} attributes +(Section~\ref{sec:attributes}) are external definitions. + +\item All used commands and events of binary components are external +definitions. + +\item All non-static C function declarations without a definition +are external references. + +\item All provided commands and events of binary components are +external references. +\end{itemize} + +The external names of C declarations, and of function definitions +inside modules using the \kw{C} attribute, are the same as the +corresponding C name. The external names of all other externally +visible symbols is implementation-defined.\footnote{The current +nesC compiler uses ``componentname\$functionname''.} + +The \nesc compiler can assume that only code reachable from external +definitions will be executed (i.e., there are no ``invisible'' calls to any +other functions).\footnote{The current \nesc compiler uses this information +to eliminate unreachable code.} + + + +\appendix + +\section{Grammar} +\label{sec:grammar} + +Please refer to Appendix~A of Kernighan and Ritchie (K\&R) +~\cite[pp234--239]{kandr} while reading this grammar (see the ``Imported +rules'', Section~\ref{sec:imported}, for a quick summary of references to +the K\&R grammar). + +The following additional keywords are used by \nesc: \kw{as}, \kw{atomic}, +\kw{async}, \kw{call}, \kw{command}, \kw{component}, \kw{components}, +\kw{configuration}, \kw{event}, \kw{generic}, \kw{implementation}, +\kw{includes}, \kw{interface}, \kw{module}, \kw{new}, \kw{norace}, +\kw{nx\_struct}, \kw{nx\_union}, \kw{post}, \kw{provides}, \kw{signal}, +\kw{task}, \kw{uses}. The following keywords are reserved for future use: +\kw{abstract} and \kw{extends}. + +\nesc reserves all identifiers starting with \kw{\_\_nesc} for internal +use. + +\nesc files follow the \emph{nesC-file} production; \file{.h} files loaded +before the program's main component (see Section~\ref{sec:app}) follow the +\emph{translation-unit} directive from K\&R and do not reserve any of +the \nesc keywords except for \kw{nx\_struct} and \kw{nx\_union}. + +New rules: \em \begin{tabbing} +\grammarindent +nesC-file: \\ +\> translation-unit\opt interface-definition\\ +\> translation-unit\opt component\\ +\\ +interface-definition:\\ +\> \kw{interface} identifier type-parameters\opt attributes\opt \kw{\{} declaration-list \kw{\}}\\ +\\ +type-parameters:\\ +\> \kw{<} type-parameter-list \kw{>}\\ +\\ +type-parameter-list:\\ +\> identifier attributes\opt\\ +\> type-parameter-list \kw{,} identifier attributes\opt\\ +\\ +component:\\ +\> comp-kind identifier comp-parameters\opt attributes\opt component-specification implementation\opt\\ +\\ +comp-kind:\\ +\> \kw{module}\\ +\> \kw{component}\\ +\> \kw{configuration}\\ +\> \kw{generic module}\\ +\> \kw{generic configuration}\\ +\\ +implementation:\\ +\> module-implementation\\ +\> configuration-implementation\\ +\\ +comp-parameters:\\ +\> \kw{(} component-parameter-list \kw{)}\\ +\\ +component-parameter-list:\\ +\> component-parameter\\ +\> component-parameter-list \kw{,} component-parameter\\ +\\ +component-parameter:\\ +\> parameter-declaration\\ +\> \kw{typedef} identifier attributes\opt\\ +\\ +module-implementation:\\ +\> \kw{implementation} \kw{\{} translation-unit \kw{\}}\\ +\\ +configuration-implementation:\\ +\> \kw{implementation} \kw{\{} configuration-element-list\opt \kw{\}}\\ +\\ +configuration-element-list:\\ +\> configuration-element\\ +\> configuration-element-list configuration-element\\ +\\ +configuration-element:\\ +\> components\\ +\> connection\\ +\> declaration\\ +\\ +components:\\ +\> \kw{components} component-line \kw{;}\\ +\\ +component-line:\\ +\> component-ref instance-name\opt\\ +\> component-line \kw{,} component-ref instance-name\opt\\ +\\ +instance-name:\\ +\> \kw{as} identifier\\ +\\ +component-ref:\\ +\> identifier\\ +\> \kw{new} identifier \kw{(} component-argument-list \kw{)}\\ +\\ +component-argument-list:\\ +\> component-argument\\ +\> component-argument-list \kw{,} component-argument\\ +\\ +component-argument:\\ +\> expression\\ +\> type-name\\ +\\ +connection:\\ +\> endpoint \kw{=} endpoint\\ +\> endpoint \kw{->} endpoint\\ +\> endpoint \kw{<-} endpoint\\ +\\ +endpoint:\\ +\> identifier-path \\ +\> identifier-path \kw{[} argument-expression-list \kw{]}\\ +\\ +identifier-path:\\ +\> identifier\\ +\> identifier-path \kw{.} identifier\\ +\\ +component-specification:\\ +\> \kw{\{} uses-provides-list \kw{\}}\\ +\\ +uses-provides-list:\\ +\> uses-provides\\ +\> uses-provides-list uses-provides\\ +\\ +uses-provides:\\ +\> \kw{uses} specification-element-list\\ +\> \kw{provides} specification-element-list\\ +\> declaration\\ +\\ +specification-element-list:\\ +\> specification-element\\ +\> \kw{\{} specification-elements \kw{\}}\\ +\\ +specification-elements:\\ +\> specification-element\\ +\> specification-elements specification-element\\ +\\ +specification-element:\\ +\> declaration\\ +\> interface-type instance-name\opt instance-parameters\opt attributes\opt\\ +\\ +interface-type:\\ +\> \kw{interface} identifier type-arguments\opt\\ +\\ +type-arguments:\\ +\> \kw{<} type-argument-list \kw{>}\\ +\\ +type-argument-list:\\ +\> type-name\\ +\> type-argument-list \kw{,} type-name\\ +\\ +instance-parameters:\\ +\> \kw{[} parameter-type-list \kw{]}\\ +\\ +attributes:\\ +\> attributes attribute\\ +\> attribute\\ +\\ +attribute:\\ +\> \kw{@} identifier \kw{(} initializer-list \kw{)}\\ +\end{tabbing} \rm + +Changed rules: +\em \begin{tabbing} +\grammarindent +typedef-name: \emph{also one of}\\ +\> identifier \kw{.} identifier +\\ +storage-class-specifier: \emph{also one of}\\ +\> \kw{command} \kw{event} \kw{async} \kw{task} \kw{norace}\\ +\\ +declaration-specifiers: \emph{also}\\ +\> \kw{default} declaration-specifiers\\ +\\ +direct-declarator: \emph{also}\\ +\> identifier \kw{.} identifier \\ +\> direct-declarator instance-parameters \kw{(} parameter-type-list \kw{)}\\ +\\ +struct-or-union-specifier: \emph{also one of}\\ +\> \kw{struct} \kw{@} identifier \kw{\{} struct-declaration-list \kw{\}}\\ +\> struct-or-union identifier attributes \kw{\{} struct-declaration-list \kw{\}}\\ +\\ +struct-or-union: \emph{also one of}\\ +\> \kw{nx\_struct}\\ +\> \kw{nx\_union}\\ +\\ +enum-specifier: \emph{also one of}\\ +\> \kw{enum} identifier attributes \kw{\{} enumerator-list \kw{\}}\\ +\\ +init-declarator: \emph{also}\\ +\> declarator attributes\\ +\> declarator attributes \kw{=} initializer\\ +\\ +struct-declarator: \emph{also}\\ +\> declarator attributes\\ +\> declarator \kw{:} constant-expression attributes \\ +\\ +parameter-declaration: \emph{also}\\ +\> declaration-specifiers declarator attributes\\ +\\ +function-definition: \emph{also}\\ +\> declaration-specifiers\opt declarator attributes declaration-list\opt compound-statement\\ +\\ +statement: \emph{also}\\ +\> atomic-statement\\ +\\ +atomic-statement:\\ +\> \kw{atomic} statement\\ +\\ +postfix-expression: \emph{replaced by}\\ +\> primary-expression\\ +\> postfix-expression \kw{[} argument-expression-list \kw{]}\\ +\> call-kind\opt primary \kw{(} argument-expression-list\opt \kw{)}\\ +\> postfix-expression \kw{.} identifier\\ +\> postfix-expression \kw{->} identifier\\ +\> postfix-expression \kw{++}\\ +\> postfix-expression \kw{--}\\ +\\\\ +call-kind: \emph{one of}\\ +\> \kw{call} \kw{signal} \kw{post} +\end{tabbing} \rm + +Note that like like regular typedefs, the extended rule for +\emph{typedef-name} (to refer to types from other components) cannot be +directly used in a LALR(1) parser. + +\subsection{Imported Rules} +\label{sec:imported} + +This list is for reference purposes only: +\begin{itemize} +\item \emph{argument-expression-list}: A list of comma-separated +expressions. + +\item \emph{compound-stmt}: A C \{ \} block statement. + +\item \emph{declaration}: A C declaration. + +\item \emph{declaration-list}: A list of C declarations. + +\item \emph{declaration-specifiers}: A list of storage classes, type +specifiers and type qualifiers. + +\item \emph{declarator}: The part of a C declaration that specifies +the array, function and pointer parts of the declared entity's type. + +\item \emph{direct-declarator}: Like \emph{declarator}, but with no +leading pointer-type specification. + +\item \emph{enumerator-list}: List of constant declarations inside an +\kw{enum}. + +\item \emph{expression}: Any C expression. + +\item \emph{identifier}: Any C identifier. + +\item \emph{init-declarator}: The part of a C declaration that specifies +the array, function and pointer parts of the declared entity's type, and +its initialiser (if any). + +\item \emph{initializer}: An initializer for a variable declaration. + +\item \emph{initializer-list}: An initializer for a compound type without +the enclosing \kw{\{}, kw{\}}. + +\item \emph{parameter-declaration}: A function parameter declaration. + +\item \emph{parameter-type-list}: Specification of a function's parameters. + +\item \emph{postfix-expression}: A restricted class of C expressions. + +\item \emph{primary}: An identifier, constant, string or parenthesised +expression. + +\item \emph{statement}: Any C statement. + +\item \emph{storage-class-specifier}: A storage class specification for +a C declaration. + +\item \emph{struct-declaration-list}: Declarations inside a \kw{struct} +or \kw{union}. + +\item \emph{translation-unit}: A list of C declarations and function +definitions. + +\item \emph{type-name}: A C type specification. + +\end{itemize} + +\section{Glossary} +\label{sec:glossary} + +\begin{itemize} +\item \emph{attribute}: a user-specified decoration that can be placed on C +and nesC declarations. Attributes must be declared (see \emph{attribute +kind}). + +\item \emph{attribute kind}: a declaration of an attribute, which +specifies the attribute's arguments. + +\item \emph{bare command, bare event}: See \emph{command}. + +\item \emph{binary component}: a component provided in binary rather than +source code form. Binary components cannot be generic. + +\item \emph{combining function}: C function that combines the multiple +results of a command call (or event signal) in the presence of +\emph{fan-out}. + +\item \emph{command}, \emph{event}: A function that is part of a +component's \emph{specification}, either directly as a \emph{bare} +command or event, or within one of the component's \emph{interfaces}. + +Bare commands and events have roles (\emph{provider}, \emph{user}) and can +have \emph{instance parameters}. When these parameters are present, the +command or event is known as a \emph{bare, parameterised} command or +event. The instance parameters of a command or event are distinct from its +regular function parameters. + +\item \emph{compile-time error}: An error that the \nesc compiler must +report at compile-time. + +\item \emph{component}: The basic unit of \nesc programs. Components have a +name and are of two kinds: \emph{generic} components, which take type and +constant parameters and must be instantiated before they can be used, and +non-generic components which exist implicitly in a single instance. A +component has a \emph{specification} and an implementation. A \emph{module} +is a component whose implementation is C code; a \emph{configuration} is a +component whose implementation is built by selecting or instantiating other +components, and \emph{wiring} them together. + +\item \emph{configuration}: A component whose implementation is built by +selecting or instantiating other components, and \emph{wiring} them +together. + +\item \emph{endpoint}: A specification of a particular specification +element, and optionally some instance arguments, in a wiring +statement of a configuration. A parameterised endpoint is an endpoint +without instance arguments that corresponds to a parameterised specification +element. + +\item \emph{event}: See \emph{command}. + +\item \emph{extent}: The lifetime of a variable. \nesc has the standard C +extents: \emph{indefinite}, \emph{function}, and \emph{block}. + +\item \emph{external}: In a configuration $C$, describes a specification +element from $C$'s specification. See internal. + +\item \emph{external type}: a special kind of type with a +platform-independent representation and no alignment restrictions. + +\item \emph{fan-in}: Describes a provided command or event called from more +than one place. + +\item \emph{fan-out}: Describes a used command or event connected to more +than one command or event implementation. A \emph{combining function} +combines the results of calls to these used commands or events. + +\item \emph{generic}: See \emph{component}, \emph{interface}. + +\item \emph{interface}: An instance of a particular \emph{interface type} +in the \emph{specification} of a component. An interface has a name, a role +(\emph{provider} or \emph{user}), an \emph{interface type} and, optionally, +\emph{instance parameters}. An interface with parameters is a +\emph{parameterised interface}. + +\item \emph{interface definition}: An \emph{interface definition} specifies +the interaction between two components, \emph{the provider} and the +\emph{user}. This specification takes the form of a set of \emph{commands} +and \emph{events}. Each interface definition has a distinct name, and may +optionally take type parameters. Interface definitions with type parameters +are called \emph{generic interface definitions}. Argument types must be +provided before a generic interface definition can be used as an +\emph{interface type}. + +Interfaces are bi-directional: the provider of an interface implements its +commands, the user of an interface implements its events. + +\item \emph{interface type}: A reference to an interface definition, along +with argument types if the definition is generic. \emph{Configurations} can +only connect two interface instances if they have the same interface type +and instance parameters. + +\item \emph{instance parameter}: An instance parameter is a parameter added +to an interface type. It has a name and must be of integral type. + +There is (conceptually) a separate interface for each distinct list of +instance parameter values of a \emph{parameterised interface} (and, +similarly, separate commands or events in the case of parameterised +commands or events). In a module, parameterised interfaces, commands, +events allow runtime selection or a \kw{call} or \kw{signal} target. + +\item \emph{intermediate function}: A pseudo-function that represents the +behaviour of the commands and events of a component, as specified by the +wiring statements of the whole application. See +Section~\ref{sec:wiring-semantics}. + +\item \emph{internal}: In a configuration $C$, describes a specification +element from one of the components specified in $C$'s component list. See +external. + +\item \emph{module}: A component whose implementation is provided by C +code. + +\item \emph{name space}: \nesc has the standard C \emph{object} (variables, +functions, typedefs, enum-constants), \emph{tag} (\code{struct}, +\code{union} and \code{enum} tags) and \emph{label} (goto labels) +name spaces. Additionally, \nesc has a \emph{component} name space for +component and interface definitions. + +\item \emph{parameterised command, parameterised event, parameterised +interface, parameterised endpoint}: See command, event, interface instance, +endpoint. + +\item \emph{provided, provider}: A role for a specification +element. A module $K$ must implement the \emph{provided commands of $K$} +and \emph{provided events of $K$}. + +\item \emph{provided command of $K$}: A command that is either a +provided specification element of $K$, or a command of a provided interface +of $K$. + +\item \emph{provided event of $K$}: An event that is either a +provided specification element of $K$, or an event of a used interface +of $K$. + +\item \emph{scope}: \nesc has the standard C \emph{global}, +\emph{function-parameter} and \emph{block} scopes. Additionally there is a +\emph{component parameter}, \emph{specification} and \emph{implementation} +scope for each component and an \emph{interface parameter} and +\emph{interface} scope for each interface. Scopes are divided into +\emph{name spaces}. + +\item \emph{specification}: A list of \emph{specification elements} that +specifies the interaction of a component with other components. + +\item \emph{specification element}: An \emph{interface}, \emph{bare +command} or \emph{bare event} in a specification. Specification elements +are either \emph{provided} or \emph{used}. + +\item \emph{task}: A \tinyos task representing an independent thread of +control whose execution is requested by the application and initiated +by the \tinyos scheduler. + +\item \emph{used, user}: A role for a specification element. + +\item \emph{used command of $K$}: A command that is either a used specification +element of $K$, or a command of a used interface of $K$. + +\item \emph{used event of $K$}: An event that is either a used specification +element of $K$, or an event of a provided interface of $K$. + +\item \emph{wiring}: The connections between component's specification +elements specified by a configuration. + +\end{itemize} + + +\bibliographystyle{abbrv} +\bibliography{ref} + +\end{document} + +% LocalWords: summarised behaviour nesC's summarises Kernighan async NESC uint +% LocalWords: uniqueCount inttypes TinyOS enum struct SendMsg Init MyInit doit +% LocalWords: MyMessage sendDone parameterised AMStandard StdControl AQueue nc +% LocalWords: initialisation ReceiveMsg GenericComm iff sizeof msg myTask stmt +% LocalWords: args NoWiring SecondQueue ccc callees call's concat bool norace +% LocalWords: unparameterised ncc frontend tos hwevent XYZ undef nesC BarTypes +% LocalWords: BarType constant's XService lvalue gcc's gcc init fnname nesc nx +% LocalWords: TOSH initialiser parenthesised recognise attribute's nxle nescc +% LocalWords: initialisers bitfields initialised ifndef endif componentname +% LocalWords: functionname reenable LALR diff --git a/doc/user/attributes.txt b/doc/user/attributes.txt new file mode 100644 index 0000000..18a2837 --- /dev/null +++ b/doc/user/attributes.txt @@ -0,0 +1,348 @@ +Introduction +============ + +nesC 1.2 allows programmers to attach attributes to nesC programs. This +allows: +- simple language extensions without reserving lots of keywords and burdening + the syntax (e.g., "wire at most once") +- user-specified annotations which would then be accessible to user-built + tools (e.g., mark a set of interfaces as "configuration interfaces" to + build a pc-side configuration tool for a specific app) + +These attributes are inspired by the annotations in Java 1.5 +(see http://jcp.org/aboutJava/communityprocess/review/jsr175/ for details). + +User-defined attributes have no direct effect on code generation. Instead, +the nesC compiler can output information on the program and its use of +attributes for use in external tools. This information is also useful for +tools that do not rely on attributes. + +Finally, nesC includes some Java classes for parsing the nesC XML output +into a set of Java objects, and a sample Java application using this +framework to verify "at-most-once", "at-least-once" and "exactly-once" +wiring constraints. The Java XML parsing classes are found in + tools/java/net/tinyos/nesc/dump +and the wiring-check application is in + tools/java/net/tinyos/nesc/wiring +Please see the README files in those directories for more details. + +Attribute declaration and use +============================= + +An attribute has a name, and associated values. Attributes are declared +like a struct whose name starts with '@'. The struct's fields are the +values associated with the attribute: + struct @atmostonce { } // "wired at-most-once", with no associated values + struct @section { char *name; } // "linker section", with section name + +An attribute can be used on: +- declarations (variables, typedefs, functions, interface instances, etc) +- component and interface definitions + +For variables, typedefs and interface instances, the attribute is placed at +the end of the declaration (before the initialiser for variables): + typedef int mytype @special(); + int fun @veryspecial("yes") = 22; + provides interface Fun as Bar[int id] @rpcinterface(); + +For functions, it is placed after the end of the argument list (in either +a prototype or in an implementation): + int magic(int bar) @magicfunction(99); + void moremagic(void) @magicfunction(100) { } + +For component and interface definitions it is placed after the (optional) +arguments: + interface Fun @special() { ... } + module Small @runaway("now") { ... + +As the example shows, an attribute use takes the form + @() + +The attribute parameters must be a valid initialiser for the struct +defining . For instance, in + struct @big { + char *name; + int args[4]; + }; +valid attributes uses include: + @big() // use default values + @big("yes", 1, 2, 3, 99) + @big("no!", { 1, 2 }) // args[2] and args[3] have default values + @big( .args = { 9 }, .name = "explicit"); // use field names + + +or they can use the java 1.5-like @attribute-name(value) syntax: + + int main() @spontaneous @section("foo") { ... } + + +Currently, any declared attribute can be used on any entity. Future +versions of nesC may allow a particular attribute to be restricted, e.g., +to variables. + +Extracting information from a nesC program +========================================== + +The -fnesc-dump= options to ncc (and nescc) are used to specify what +information you wish to extract from a nesC program. Note that to +successfully extract information, the nesC program must compile without +error (with one exception: unwired functions and interfaces are allowed). + +The information is output in XML. The doc/dump directory contains a schema +description for this XML output. The information is sent to the file +specified by the -fnesc-dumpfile= option, or to stdout if no such option is +used. + +You can ask for the following information: +- components (includes both generic components and their instances) +- interface definitions +- interfaces (provided and used in components) +- functions (both C and module functions) +- variables, enum constants, typedefs (again, both from C and modules) +- wiring graphs (for the whole program and for individual configurations) + +Dump request syntax +------------------- + +A dump request has the form + -fnesc-dump=REQUEST +or + -fnesc-dump=REQUEST(ARGUMENTS) + +where REQUEST specifies what information you want to collect, and ARGUMENTS +includes options and filters for that request. Filters, described below, +allow you to extract only the information you want, e.g., all interfaces +with attribute @special, rather than all interfaces of the program. Options +are used by some REQUESTs to modify their behaviour. Multiple arguments are +separated by commas; multiple filter arguments are implicitly and-ed +together. + +Because parentheses are meaningful to most shells, you will have to escape +them in arguments to ncc, either with \, or by surrounding the whole +arguments in '': + -fnesc-dump=components\(wiring\) +or + '-fnesc-dump=components(wiring)' + +A single call to ncc may include multiple -fnesc-dump arguments. The +information selected by all of these will be collected together and output +as a single XML document. + +Dump requests +------------- + +This section gives a high-level overview of the information collected by +each dump request. For details on what information is available for each +individual item (component, variable, etc), please see the XML schema (note +that items always include the attributes that have been attached to +them). It is often also helpful to examine the output on a sample program, +but note that, e.g., unlike the schema definition, this will not +necessarily tell you which fields are sometimes present and sometimes +absent. + +REQUEST: "components" +OPTIONS: "wiring" +FILTERS: yes +Returns the components used in a program. This includes: +- all the non-generic components +- all instances of generic components +- all generic components instantiated by the program +If the "wiring" option is included, wiring graphs for configurations will +be output. + +REQUEST: "interfacedefs" +OPTIONS: none +FILTERS: yes +Returns the interface definitions used in a program. To find out which +interfaces are provided or used by which components, see the "interfaces" +request. + +REQUEST: "interfaces" +OPTIONS: none +FILTERS: yes +Returns the interfaces provided and used by components. + +REQUEST: "functions" +OPTIONS: none +FILTERS: yes +Returns the functions defined in C files and in components, including commands +and events defined outside interfaces. + +REQUEST: "variables" +OPTIONS: none +FILTERS: yes +Returns the variables defined in C files and at the top-level inside +components (i.e., this does not include function parameters and local +variables). + +REQUEST: "constants" +OPTIONS: none +FILTERS: yes +Returns the enum constants defined in C files and at the top-level inside +components. + +REQUEST: "typedefs" +OPTIONS: none +FILTERS: yes +Returns the typedefs defined in C files and at the top-level inside +components. + +REQUEST: "tags" +OPTIONS: none +FILTERS: yes +Returns the tagged types (struct, union, enum) defined in C files and at +the top-level inside components. + +REQUEST: "wiring" +OPTIONS: "functions" +FILTERS: no +Return the application's wiring graph. +If you specify the "functions" option, this graph will be in terms of the +program's individual commands and events, i.e., interfaces are +expanded. You may be surprised at how parameterised commands and events are +handled when the "functions" option is used: there are edges from nodes +representing the command (or event) for all possible parameter values to +nodes representing to the command (event) with specific parameter values. + +REQUEST: "referenced" +OPTIONS: "components", "interfacedefs", "interfaces", "functions", + "variables", "constants", "typedefs", "tags" +FILTERS: no +At least one option must be used. Many of the items described above refer +to other items, e.g., interfaces refer to the interface definitions they +are an instance of and to the component to which they belong. By including +"referenced(components, interfacedefs)", any components and interface +definitions referred to from an interface that is being output will also +be output. This helps reduce the size and complexity of the XML output +when you are using filters (see the examples below), by only including +the components referenced from interfaces of interest, rather than all +components. Note that "referenced" is recursive: if you have asked for +referenced components, and this causes the inclusion of a component A +which refers to a component B, then component B will also be included. + + +Dump filters +------------ + +A tool can always simply ask for all XML information to be output, but this +might be slow and unwieldy, and would force the external tool to do its own +filtering, e.g., for interfaces with a particular attribute. To simplify +external tool implementations, the nesC dump facility includes boolean +filters which are applied before adding items requested by -fnesc-dump +requests. Note however that items added because of a "referenced" request +are not currently filtered. + +Filters are boolean expression built with (), |, &, ! (with the usual +meanings) and base filters which take the form + NAME(ARGUMENTS) +where the ARGUMENTS are strings and numbers separated by commas. Strings +that look like numbers, contain commas, white space, parentheses, ", |, & +and ! must be surrounded by "'s, other strings can be entered without +surrounding "'s. Within "'s, \ can be used to escape " and other +characters. + +Note that the parentheses are not optional. A 0-argument filter is NAME(). + +FILTER: "file" +ARGUMENT: unix-style (* and ?) file pattern +True if the file containing the item matches the file pattern. + +FILTER: "name" +ARGUMENT: regular expression +True if the item name matches the regular expression. + +FILTER: "component" +ARGUMENT: component name +True if the item's component is the same as the filter's argument +(exact string matching). + +FILTER: "global" +ARGUMENT: none +True if the item is in C's global scope. + +FILTER: "instance" +ARGUMENT: none +True if the item is in a generic component instance (see the discussion of +generic components). + +FILTER: "abstract" +ARGUMENT: none +True if the item is in a generic component (see the discussion of generic +components). + +FILTER: "attribute" +ARGUMENT: list of attribute names +True if the item contains any of the attributes from the argument list +(exact string matching). + + +Generic components +------------------ + +Because generic components are instantiated at compile-time, it is possible +to get information on all instances of generic components, and on the items +contained within them. Some tools may be interested in this information, +but others may be more interested in information from the generic +component that was instantiated (e.g., a tool that gives you the filenames +of all components used in your program). + +To help distinguish between these cases at dump time, nesC includes two +filters: "abstract()" and "instance()". These can be used both to filter +components themselves, and also to filter items (such as variables, +interfaces, etc) which are found inside them. These two filters cover the +four possible categories of components: + +!abstract() & !instance(): a regular (not generic) component +!abstract() & instance(): an instance of a generic component in your program +abstract() & !instance(): a generic component +abstract() & instance(): if a generic configuration A includes an + instantiation of a generic component B, the instance of B in A can be + considered partially instantiated. It will be fully instantiated when + A itself is instantiated... (the dump system does not normally return + such components, but they are reachable from the wiring graph of a + generic configuration). + + + +Examples +-------- + +o Collect everything, and send it to file big.xml: + + ncc -fnesc-dump=components(wiring) + -fnesc-dump=interfacedefs + -fnesc-dump=interfaces + -fnesc-dump=functions + -fnesc-dump=typedefs + -fnesc-dump=variables + -fnesc-dump=constants + -fnesc-dump=typedefs + -fnesc-dump=tags + -fnesc-dump=wiring + -fnesc-dumpfile=big.xml + MyApp.nc + +o Find specification elements (interfaces, commands, events) with the @rpc + attribute: + + ncc '-fnesc-dump=interfaces(attribute(rpc))' + '-fnesc-dump=functions(attribute(rpc))' MyApp.nc + + (note that this would also return any functions in modules which + incorrectly(?) used the @rpc attribute) + +o Find specification elements with the @rpc attribute, but exclude + those from generic components (i.e., we care about the interfaces + on actual components, not those in the generic components that we + instantiated): + + ncc '-fnesc-dump=interfaces(attribute(rpc) & !abstract())' + '-fnesc-dump=functions(attribute(rpc) & !abstract())' MyApp.nc + +o The same as above, but we also need some information on the components + these interfaces, commands and events belong to: + + ncc '-fnesc-dump=interfaces(attribute(rpc) & !abstract())' + '-fnesc-dump=functions(attribute(rpc) & !abstract())' + '-fnesc-dump=referenced(components)' MyApp.nc + diff --git a/doc/user/binary-components.txt b/doc/user/binary-components.txt new file mode 100644 index 0000000..b5799e0 --- /dev/null +++ b/doc/user/binary-components.txt @@ -0,0 +1,167 @@ +How to build and use binary components +====================================== + +1) Binary Components +-------------------- + +nesC 1.2 allows you to build and use binary components. This is supported +through a new way of definining components. A component "Foo" can be defined +in file Foo.nc as: + + component Foo { + provides interface A as X; + uses interface A as Y; + } + +Note that you say "component" rather than "module" or "configuration", and +there is no implementation section. When generating the .o file for a +nesC application including Foo, the nesC compiler will: + +- include references to external symbols for all provided commands and used + events of Foo + +- define external symbols (based on the application's wiring graph) for all + used events and provided commands of Foo + +- These symbols are named 'component-name$interface-name$command-or-event-name' + +- The compiler requires that all commands and events used by Foo (including + all commands in used interfaces and all events in provided interfaces) + be fully wired (in particular, parameterised interfaces must be wired + as a whole and not just for individual values) + +In this example, if interface A is + interface A { + command int request(); + event void done(int val); + } + +Then the generated .o file for an application including Foo will: + - use symbols named Foo$X$request, Foo$Y$done + - define symbols named Foo$X$done, Foo$Y$request + +2) Using binary components +-------------------------- + +Using a binary component is straightforward: just wire the binary component +(e.g., Foo) into your application just as you would any other component. At +some point, you will have to link your application with the binary +component's definition. While this operation is beyond the scope of the +nesC language itself, this might happen in one of the following ways: + +- The binary component is distributed in an object (.o) or library (.a) + file. You just link your application against this object or library as + you would any other. For instance: + ncc -target=mica2 MyApp.nc some-binary-component.o + +- The binary component is pre-installed in the mote's ROM. Some loader is + responsible for linking newly installed user applications with the + appropriate ROM entry points. + +3) Building binary components +----------------------------- + +While the 'component' language feature appears to be designed for linking +to externally created binary component, it can actually also be used to +create them. An example will make this clear. Assume I want to build a +binary component "Foo" from our example above. + +I have some implementation of Foo (in this case a module, but it could +also be a configuration): + + module FooImplementation { + provides interface A as X; + uses interface A as Y; + } + implementation { + // This does something mysterious to requests... + int x; + + command int X.request() { + return call Y.request() + x; + } + + event void Y.done(int val) { + x = val; + } + } + +I can build a binary version of Foo by compiling BuildBinaryFoo: + + configuration BuildBinaryFoo { } + implementation { + components Foo, FooImplementation; + + Foo.X -> FooImplementation.X; + Foo.Y <- FooImplementation.Y; + } + +where Foo is a *different* component from the one we saw earlier: + + component Foo { + // Note that the uses, provides are reversed from the definition + // of Foo (and FooImplementation) above! + uses interface A as X; + provides interface A as Y; + } + +4) Warnings +----------- + +Some issues you should be aware of when building and using binary components: + +- If a component (e.g., TimerC) is included in both your application and + the binary component definition, you will end up with two copies of TimerC. + This is a) wasteful, b) unlikely to work. + + A binary component should include the strict minimum necessary, and should + express its dependencies on outside services through interfaces. + +- Compile with -DNESC_BUILD_BINARY when building binary components to avoid + having copies of the runtime support functions (TOS_post, + __nesc_atomic_start, __nesc_atomic_end) in your binary components. Note + that the necessary #ifdef's are only present from TinyOS 1.1.11 onwards. + +- The symbol names used in binary components include '$'. If you want to call + these from C code, you may have to include the -fdollars-in-identifiers + command-line flag. On some platforms (avr, msp430), the assembler does not + support '$' in symbol names. To avoid this, use 'nescc -gcc=' + (e.g., 'nescc -gcc=avr-gcc') rather than avr-gcc or msp430-gcc to compile + your C code. nescc will invoke your-gcc, but with a custom assembler + which accepts '$'. + +- 'default' commands and events do not work across binary component + boundaries: the decision to call a default command is made at + compile-time based on whether or not the command is wired. A call + to a command in a binary component is always assumed wired, so the + default command will never be called (the same applies to events, of + course). + + This is most likely to cause surprises with parameterised interfaces. The + following code: + + component BinaryA { + provides interface A[int id]; + } + + module UseA { + uses interface A; + } + implementation { + void f() { + call A.request(); + } + event void A.done(int val) { + } + } + + configuration WireA { } + implementation { + components UseA, BinaryA; + UseA.A -> BinaryA.A[10]; + } + + will produce the error + binary entry point BinaryA.A.done is not fully wired + as even if the binary implementation of BinaryA had a default handler for + BinaryA.A.done, the compiler would not know when it should be called. diff --git a/doc/user/generics-1.2.txt b/doc/user/generics-1.2.txt new file mode 100644 index 0000000..0e3770c --- /dev/null +++ b/doc/user/generics-1.2.txt @@ -0,0 +1,269 @@ +Introduction +============ + +This is a quick introduction to generic components and interfaces, the new +features of nesC 1.2. A generic component is a component that can be +multiply instantiated at compile-time and which takes an optional parameter +list (including type arguments). A generic interface is an interface with +type arguments. This allows, e.g., the creation of reusable adapter +components (such as "converting" a StdControl to a SplitControl interface), +simplifies implementations of components with much in common (such as the +TinyDB attributes), etc. + +Generic Components +================== + +Both generic configurations and generic modules are supported. The syntax +is straightforward, as this generic queue of ints (with no empty/full +detection) shows: + + interface IntQueue { + command void push(int x); + command int pop(); + } + + generic module IntQueueC(int n) { + provides interface IntQueue; + } implementation { + int q[n]; + int p1 = 0, p2 = 0; + + command void IntQueue.push(int x) { + q[p1++] = x; + if (p1 == n) p1 = 0; + } + + command int IntQueue.pop() { + int ret = q[p2++]; + if (p2 == n) p2 = 0; + return ret; + } + } + +The n argument to IntQueueC can be used within the component as a constant +expression; in this example it is used to dimension the q array. + +Generic components are instantiated in the `components' declaration +of configurations: + + configuration MyApp { } + implementation { + components MyCode, new IntQueueC(10) as MyQueue; + + MyCode.Queue -> MyQueue; + } + +This creates a new 10 element int-queue, accessible as MyQueue within +the MyApp configuration. This new component is not accessible outside +MyApp, except via any interfaces wired within MyApp. You can also have +generic configurations: + + generic configuration SomeAssembly() { + provides interface X; + } + implementation { + components new SomeAssemblyM(), new IntQueueC(10) as MyQueue; + + X = SomeAssemblyM.X; + SomeAssemblyM.Queue -> MyQueue; + } + +Every time SomeAssembly is instantiated, new instances of SomeAssemblyM and +IntQueueC will also be instantiated. + +unique, uniqueCount work "correctly" (i.e., usefully ;-)): if unique is +used within a generic component C, it returns a different value in +each instance of C, and the call within the definition of C itself +does not affect the value returned by uniqueCount. + +Instantiating a generic component is effectively equivalent to creating a +new component with the parameters replaced by the argument values. Thus, +instantiating a generic module will produce two slightly different versions +of the module's code; beware of code size explosion if you instantiate many +modules... A future version of nesC may support code sharing between +instances of generic modules, with some restrictions and at some runtime +cost. + + +Generic Interfaces and Type Parameters +====================================== + +Finally, generic components can also have type arguments. This is most +useful in conjunction with generic interfaces, e.g., to create a queue +of any type: + + interface Queue { + command void push(t x); + command t pop(); + } + + generic module QueueC(typedef t, int n) { + provides interface Queue; + // Note: this is a shortcut for + // provides interface Queue as Queue + // hence the declarations below refer to Queue, not Queue. + // Stylistically it's probably best to give a name to the + // provided or used interface. + } implementation { + t q[n]; + int p1 = 0, p2 = 0; + + command void Queue.push(t x) { + q[p1++] = x; + if (p1 == n) p1 = 0; + } + + command t Queue.pop() { + t ret = q[p2++]; + if (p2 == n) p2 = 0; + return ret; + } + } + +The Queue interface takes a single type parameter t, which can be used +within Queue as if it were a typedefed type. Type arguments must be +provided for generic interfaces in uses and provides declarations. The +generic component queue takes a type parameter t (using the funky "typedef +t" syntax), and a size as in the IntQueue example. As with generic +interfaces, component type parameters can be used as if they were typedefed +types. + +Generic components with type arguments are instantiated just like +other generic components: + + configuration MyApp { } + implementation { + components MyCode, new QueueC(int, 10) as MyQueue; + + MyCode.Queue -> MyQueue; + } + +One restriction: type arguments to generic components and interfaces can +not be of array, function or incomplete type. + +By default, the only operations that can be performed on a value of a type +parameter are copying it, and passing it as an argument to some +function. If a generic component needs some functionality on its type +parameter, it can express that need by using an appropriate interface: + + interface Compare { + command bool lessthan(t x1, t x2); + } + + generic module Sort(typedef t) { + uses interface Compare; + } + implementation { + ... + void f() { + t x1, x2; + ... + if (call Compare.lessthan(x1, x2)) + ... + } + +It is also possible to declare, using the special @integer() and @number() +attributes, that a type parameter is of an integral (respectively numerical) +type. In that case, all the operations allowed on integers (respectively, +integers and floating-point numbers) are allowed: + + generic module Sort(typedef t @number()) { } + implementation { + ... + void f() { + t x1, x2; + ... + if (x1 < x2) + ... + } + +Of course, the type argument to Sort must then be an integral or floating-point +type. + + +Type and constants in Component Specifications and Other Changes +================================================================ + +As part of the changes for generic components, nesC now allows types and +enum constants to be defined in the specification of a component (both in +generic and non-generic components). These types can be used in the +component in which they are defined, and in configurations that include the +component (as arguments to generic components or to define other types and +constants). For example, + + interface Send { + command result_t send(t x); + event result_t sendDone(); + } + + generic configuration RadioStack(typedef messageType) { + typedef messageType *messagePtr; + provides interface Send; + } + implementation { + ... + } + + + configuration MyRadioStack { + provides interface Send; + } + implementation { + components new RadioStack(MyMessageType) as TheActualStack; + + Send = TheActualStack.Send; + + // Build a queue of the message pointer type + components new QueueOf(TheActualStack.messagePtr) as MyQueue; + ... + } + +This example also shows that you can now intersperse wiring statements +and component declarations. Additionally, you can have typedefs in the +body of a configuration, so MyRadioStack could also be written as: + + configuration MyRadioStack { + provides interface Send; + } + implementation { + components new RadioStack(MyMessageType) as TheActualStack; + + Send = TheActualStack.Send; + + // Build a queue of the message pointer type, using a local typedef + typedef TheActualStack.messagePtr MyMessageTypePtr; + components new QueueOf(MyMessageTypePtr) as MyQueue; + ... + } + +Note that you can refer to typedefs and enum constants in other components, +but not to struct, union or enum tags, i.e., + + module Fun { + struct silly { int x; }; + } implementation { ... } + + configuration Barf { } + implementation { + components Fun; + + typedef struct Fun.silly baz; + } + +is not allowed, but + + module Legalfun { + typedef enum { ONE = 2 } sillier; + } implementation { ... } + + configuration Ok { } + implementation { + components Legalfun; + + typedef Legalfun.sillier baz; + enum { THREE = Legalfun.ONE }; + } + +is. + + diff --git a/doc/user/network-types.txt b/doc/user/network-types.txt new file mode 100644 index 0000000..60f0e86 --- /dev/null +++ b/doc/user/network-types.txt @@ -0,0 +1,108 @@ +Part 1: Using External Types +============================ + +External types are an extension to nesC for platform-independent type +representation: you can define your packet layout using syntax very similar +to existing C type declarations, and just accesses it like a regular C +type. The compiler ensures that this type has the same representation on +all platforms and generates any necessary conversion code. Additionally, +these types have no alignment restrictions. This makes them particularly +suitable for defining and accessing network packets in a +platform-independent way. + +For instance, the SurgeCmdMsg from the Surge application can be defined and +accessed as follows using external types: + + typedef nx_struct { + nx_uint8_t type; + nx_union { + nx_uint32_t newrate; + nx_uint16_t focusaddr; + } args; + } SurgeCmdMsg; + ... + + SurgeCmdMsg *pCmdMsg = (SurgeCmdMsg *)payload; + if (pCmdMsg->type == SURGE_TYPE_SETRATE) { + timer_rate = pCmdMsg->args.newrate; + ... + +More formally, nesC includes three kinds of external types. + + o External base types are similar to the fixed size in8_t, uint16_t, etc + types. They include 8, 16, 32 and 64-bit signed and unsigned integers + denoted by the types nx_[u]int[8/16/32/64]_t. + + o External array types are any array built from an external type, using + the usual C syntax, e.g, nx_int16_t x[10]. + + o External structures are declared like C structures and unions, but + using the nx_struct and nx_union keywords (as in the SurgeCmdMsg + example above). An external structure can only contain external types + as elements. + +External types have no alignment restrictions, external structures contain +no padding, and the external base types use a 2's complement, big-endian +representation (there are also little-endian versions of the base types +available, using the nxle_ prefix, but their use is discouraged for +networking purposes). Bit-fields in external structures are maximally +packed. A 0-width bit-field moves allocation on to the next byte. Thus the +representation of external types is platform-independent, and any arbitrary +section of memory can be accessed via an external type. + +All these external types can be used exactly like regular C types, with a +few restrictions: + o Bit-fields can only be created from big-endian external base types + (i.e., `nx_struct { nxle_uint8_t f1 : 2; }' is not allowed). + Having big- and little-endian bit-fields adjacent in a type would + be problematic... + o Bit-fields of external types cannot be used inside non-external + structures (i.e., `struct { nx_uint8_t f1 : 2; }' is not allowed). + o External type variables cannot have initialisers. + +Part 2: Implementation +====================== + +In the generated C code for nesC programs using external types, we simply +define a C type for each external base type, translate nx_struct and +nx_union to struct and union and leave array types unchanged. The external +base types are replaced by structures containing char arrays. + +Reads and writes of external base types are replaced by calls to inline +functions like NTOH32 in the example below. For instance, the example +from Surge becomes: + + typedef struct { char data[4]; } nx_uint32_t; + static inline unsigned short NTOUH32(void *target) { + unsigned char *base = target; + return (unsigned long)base[3] << 24 | + (unsigned long)base[2] << 16 | + base[1] << 8 | base[0]; + } + ... + typedef struct { + nx_uint8_t type; + union { + nx_uint32_t newrate; + nx_uint16_t focusaddr; + } args; + } SurgeCmdMsg; + ... + SurgeCmdMsg *pCmdMsg = (SurgeCmdMsg *)payload; + if (NTOUH8(&pCmdMsg->type) == SURGE_TYPE_SETRATE) { + timer_rate = NTOUH32(&pCmdMsg->args.newrate); + ... + +For this translation to be correct, a structure containing only characters +(such as nx_uint32_t) should have no alignment restrictions, and the same +must hold for structures containing such structures (e.g., +SurgeCmdMsg). This is true on many, but not all platforms: on ARM +processors, all structures are aligned to 4-byte boundaries, and on +Motorola 68K processors they are aligned to 2-byte boundaries. We currently +work around this problem by using gcc's non-standard packed attribute. + +Bit-fields are a little more complex: space used by bit-fields inside +external structures are replaced by "filler" fields. Accesses to external +bit-fields is done by taking the address of the enclosing external +structure, treating it as an array of bytes and accessing the appropriate +offsets. diff --git a/include/COPYING b/include/COPYING new file mode 100644 index 0000000..623b625 --- /dev/null +++ b/include/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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) year 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. + + , 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. diff --git a/include/COPYING3 b/include/COPYING3 new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/include/COPYING3 @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/include/ChangeLog b/include/ChangeLog new file mode 100644 index 0000000..7ea34d2 --- /dev/null +++ b/include/ChangeLog @@ -0,0 +1,388 @@ +2007-11-07 Joseph Myers + Daniel Jacobowitz + + * floatformat.h (struct floatformat): Add split_half field. + (floatformat_ibm_long_double): New. + +2007-09-06 Tom Tromey + + * libiberty.h (pex_free): Document process killing. + +2007-08-31 Douglas Gregor + + * demangle.h (enum demangle_component_type): Add + DEMANGLE_COMPONENT_RVALUE_REFERENCE. + +2007-07-25 Ben Elliston + + * ternary.h: Remove. + +2007-07-18 Bob Wilson + + * xtensa-config.h (XCHAL_HAVE_THREADPTR): New. + (XCHAL_HAVE_RELEASE_SYNC, XCHAL_HAVE_S32C1I): New. + +2007-07-17 Nick Clifton + + * COPYING3: New file. Contains version 3 of the GNU General + Public License. + +2007-07-12 Kai Tietz + + * splay-tree.h (libi_uhostptr_t, libi_shostptr_t): New types, + needed for WIN64 when a long is not wide enough for a pointer. + (splay_tree_key, splay_tree_value): Use the new types. + +2007-05-07 Nathan Froyd + + * libiberty.h (writeargv): Declare. + +2007-04-25 Mark Mitchell + + * demangle.h: Change license to LGPL + exception. + +2007-03-29 Joel Brobecker + + * filenames.h (FILENAME_CMP): Adjust define to call filename_cmp + regardless of the type of file system. + +2007-03-06 Jan Hubicka + + * ansidecl.h (ATTRIBUTE_COLD, ATTRIBUTE_HOT): New. + +2007-02-09 Joseph S. Myers + + * libiberty.h (pex_write_input): Remove prototype. + +2007-01-31 Vladimir Prus + + * libiberty.h (PEX_STDERR_TO_PIPE): New define. + (PEX_BINARY_ERROR): New define. + (pex_read_err): New function. + +2007-01-29 Simon Baldwin + + * demangle.h: New cplus_demangle_print_callback, + cplus_demangle_v3_callback, and java_demangle_v3_callback function + prototypes, and demangle_callbackref type definition. + +2006-12-06 Nick Clifton + + * ansidecl.h (ATTRIBUTE_PACKED): Define. + +2006-11-30 Andrew Stubbs + J"orn Rennecke + + PR driver/29931 + * libiberty.h (make_relative_prefix_ignore_links): Declare. + +2006-11-27 Bob Wilson + + * xtensa-config.h (XSHAL_ABI): New. + (XTHAL_ABI_WINDOWED, XTHAL_ABI_CALL0): New. + +2006-04-11 Jim Blandy + + * libiberty.h (pex_input_file, pex_input_pipe): New declarations. + +2006-01-18 DJ Delorie + + * md5.h: Include ansidecl.h + +2006-01-09 Bob Wilson + + * xtensa-config.h (XCHAL_HAVE_MUL32_HIGH): Define. + +2005-12-30 Bob Wilson + + * xtensa-config.h (XCHAL_HAVE_WIDE_BRANCHES): New. + +2005-12-10 Terry Laurenzo + + PR java/9861 + * demangle.h : Add DMGL_RET_POSTFIX define to enable alternative + output format for return types + +2005-10-31 Mark Kettenis + + * floatformat.h (enum floatformat_byteorders): Add + floatformat_vax. + (floatformat_vax_aingle, floatformat_vax_double): Declare. + +2005-09-26 Mark Mitchell + + * libiberty.h (expandargv): New function. + +2005-08-17 Mark Kettenis + + * floatformat.h (struct floatformat): Change type of large + argument for is_valid member to `const void *'. + (floatformat_to_double): Change type of second argument to `const + void *'. + (floatformat_from_double): Change type of last argument to `void + *'. + (floatformat_is_valid): Change type of last argument to `const + void *'. + +2005-07-12 Ben Elliston + + * xregex2.h (regexec): Qualify this prototype with __extension__ + when compiling with GNU C. + +2005-07-03 Steve Ellcey + + PR other/13906 + * ansidecl.h (ATTRIBUTE_ALIGNED_ALIGNOF): New. + * md5.h (md5_uintptr): New. + (md5_ctx): Align buffer field. + +2005-06-30 Daniel Berlin + + * hashtab.h (HTAB_DELETED_ENTRY): New macro. + (HTAB_EMPTY_ENTRY): New macro. + +2005-06-20 Geoffrey Keating + + * libiberty.h (strverscmp): Prototype. + +2005-06-06 Gabriel Dos Reis + + * libiberty.h (XOBFINISH): New. + +2005-06-01 Kaveh R. Ghazi + + * libiberty.h (vsnprintf): Add format attribute. + +2005-05-29 Kaveh R. Ghazi + + * ansidecl.h: Add ATTRIBUTE_FPTR_PRINTF. + +2005-05-28 Eli Zaretskii + + * libiberty.h: (snprintf) [!HAVE_DECL_SNPRINTF]: Declare if + needed. + (vsnprintf) [!HAVE_DECL_VSNPRINTF]: Declare if needed. + +2005-05-25 Richard Henderson + + * demangle.h (DEMANGLE_COMPONENT_HIDDEN_ALIAS): New. + +2005-05-24 Gabriel Dos Reis + + * libiberty.h (ACONCAT): Properly cast value of alloca(). + + * ansidecl.h (ATTRIBUTE_UNUSED_LABEL): Don't define if + __cplusplus. + +2005-05-12 Steve Ellcey + + libiberty.h: Do not define empty basename prototype. + +2005-05-10 Nick Clifton + + * Update the address and phone number of the FSF organization in + the GPL notices in the following files: + COPYING, ansidecl.h, bfdlink.h, bout.h, demangle.h, dis-asm.h, + dyn-string.h, fibheap.h, filenames.h, floatformat.h, + fnmatch.h, gdbm.h, getopt.h, hashtab.h, hp-symtab.h, ieee.h, + libiberty.h, md5.h, oasys.h, objalloc.h, obstack.h, os9k.h, + partition.h, progress.h, safe-ctype.h, sort.h, splay-tree.h, + symcat.h, ternary.h, xregex2.h, xtensa-config.h, + xtensa-isa-internal.h, xtensa-isa.h + +2005-04-25 Kaveh R. Ghazi + + * libiberty.h (unlock_std_streams): New. + +2005-04-19 Kaveh R. Ghazi + + * hashtab.h, libiberty.h, objalloc.h, splay-tree.h, ternary.h: + Don't use the PTR macro. + + * sort.h: Don't use the PARAMS macro. + +2005-04-16 Kaveh R. Ghazi + + * libiberty.h (unlock_stream): New. + +2005-04-13 Kaveh R. Ghazi + + * libiberty.h (fopen_unlocked, fdopen_unlocked, freopen_unlocked): + Remove parameter names. + +2005-04-11 Kaveh R. Ghazi + + * libiberty.h (fopen_unlocked, fdopen_unlocked, freopen_unlocked): + Provide prototypes for new functions. + +2005-03-29 Ian Lance Taylor + + * libiberty.h: Fix indentation. + +2005-03-28 Ian Lance Taylor + + * libiberty.h: Include . + (PEX_RECORD_TIMES, PEX_USE_PIPES, PEX_SAVE_TEMPS): Define. + (PEX_LAST, PEX_SEARCH, PEX_SUFFIX, PEX_STDERR_TO_STDOUT): Define. + (PEX_BINARY_INPUT, PEX_BINARY_OUTPUT): Define. + (pex_init, pex_run, pex_read_output): Declare. + (pex_get_status, pex_get_times, pex_free, pex_one): Declare. + (struct pex_time): Define. + +2005-03-28 Mark Mitchell + + * libiberty.h (ffs): Declare, if necessary. + +2005-03-27 Gabriel Dos Reis + + * xregex2.h (_RE_ARGS): Remove definition and uses. + +2005-03-27 Gabriel Dos Reis + + * ternary.h: Don't use PARAMS anymore. + +2005-03-27 Gabriel Dos Reis + + * partition.h: Remove use of PARAMS. + * obstack.h: Remove conditional prototypes __STDC__. + * objalloc.h: Remove use of PARAMS. + * splay-tree.h: Likewise. + +2005-03-27 Gabriel Dos Reis + + * md5.h: Remove definition and uses of __P. + * dyn-string.h: Remove uses of PARAMS. + * fibheap.h: Likewise. + * floatformat.h: Likewise. + * hashtab.h: Likewise. + +2005-03-26 Gabriel Dos Reis + + * demangle.h: Remove uses of PARAMS. + + * libiberty.h (ANSI_PROTOTYPES): Remove guard since + ANSI_PROTOTYPES is always assumed. + Remove uses of PARAMS throughout. + +2005-03-24 Kaveh R. Ghazi + + * libiberty.h (xstrndup): Declare. + +2005-03-22 Kaveh R. Ghazi + + * libiberty.h (make_relative_prefix): Add ATTRIBUTE_MALLOC. + +2005-03-09 Mark Mitchell + + * libiberty.h (gettimeofday): Declare. + +2005-03-01 Jan Beulich + + * libiberty.h: Declare unlink_if_ordinary. + +2005-02-14 Paolo Bonzini + + PR bootstrap/19818 + * ansidecl.h (PARAMS): Guard from redefinition. + +2004-12-11 Ben Elliston + + * fibheap.h (struct fibnode): Only use unsigned long bitfields + when __GNUC__ is defined and ints are less than 32-bits wide. + +2004-10-07 Bob Wilson + + * xtensa-config.h (XSHAL_USE_ABSOLUTE_LITERALS, + XCHAL_HAVE_PREDICTED_BRANCHES, XCHAL_INST_FETCH_WIDTH): New. + (XCHAL_EXTRA_SA_SIZE, XCHAL_EXTRA_SA_ALIGN): Delete. + +2004-09-13 Aaron W. LaFramboise + + * libiberty.h (basename): Prototype for __MINGW32__. + +2004-09-04 Kaveh R. Ghazi + + * ansidecl.h (ATTRIBUTE_SENTINEL): Define. + * libiberty.h (concat, reconcat, concat_length, concat_copy, + concat_copy2): Use ATTRIBUTE_SENTINEL. + +2004-08-02 Gabriel Dos Reis + + * libiberty.h (XDELETE, XDELETEVEC, XRESIZEVEC): Remove any + const-qualification before disposal. + +2004-07-24 Bernardo Innocenti + + * ansidecl.h (ARG_UNUSED): New Macro. + +2004-07-24 Bernardo Innocenti + + * libiberty.h (XNEW, XCNEW, XNEWVEC, XCNEWVEC, XOBNEW): Move here from + libcpp/internal.h. + (XDELETE, XRESIZEVEC, XDELETEVEC, XNEWVAR, XCNEWVAR, XRESIZEVAR): New + macros. + +2004-07-21 Paolo Bonzini + + * ansidecl.h (ATTRIBUTE_PURE): New. + +2004-07-13 Bernardo Innocenti + + * libiberty.h (ASTRDUP): Add casts required for stricter + type conversion rules of C++. + * obstack.h (obstack_free): Likewise. + +2004-05-04 Andreas Jaeger + + * demangle.h: Do not use C++ reserved keyword typename as + parameter for cplus_demangle_fill_builtin_type. + +2004-04-22 Richard Henderson + + * hashtab.h (struct htab): Add size_prime_index. + +2004-04-13 Jeff Law + + * hashtab.h (htab_remove_elt_with_hash): Prototype new function. + +2004-03-30 Zack Weinberg + + * hashtab.h, splay-tree.h: Use new shorter form of GTY markers. + +2004-02-24 Ian Lance Taylor + + * dyn-string.h: Update copyright date. + +2004-02-23 Ian Lance Taylor + + * dyn-string.h: Remove test of IN_LIBGCC2 and IN_GLIBCPP_V3 and + the associated #defines. + +2004-01-12 Ian Lance Taylor + + * demangle.h: Instead of checking ANSI_PROTOTYPES, just include + "libiberty.h". + + * demangle.h: If ANSI_PROTOTYPES is defined, include . + + * demangle.h (enum demangle_component_type): Define. + (struct demangle_operator_info): Declare. + (struct demangle_builtin_type_info): Declare. + (struct demangle_component): Define. + (cplus_demangle_fill_component): Declare. + (cplus_demangle_fill_name): Declare. + (cplus_demangle_fill_builtin_type): Declare. + (cplus_demangle_fill_operator): Declare. + (cplus_demangle_fill_extended_operator): Declare. + (cplus_demangle_fill_ctor, cplus_demangle_fill_dtor): Declare. + (cplus_demangle_v3_components): Declare. + (cplus_demangle_print): Declare. + +For older changes see ChangeLog-9103 + +Local Variables: +mode: change-log +left-margin: 8 +fill-column: 74 +version-control: never +End: diff --git a/include/ChangeLog-9103 b/include/ChangeLog-9103 new file mode 100644 index 0000000..f4f7aa1 --- /dev/null +++ b/include/ChangeLog-9103 @@ -0,0 +1,2682 @@ +2003-12-19 Andreas Tobler + + * include/fibheap.h (fibnode): Use __extension__ for + bit-fields mark and degree if __GNUC__. + +2003-12-18 Kazu Hirata + + * include/fibheap.h (fibnode): Use unsigned long int for + bit-fields if __GNUC__ is defined. + +2003-12-19 Andreas Tobler + + * fibheap.h (fibnode): Use __extension__ for + bit-fields mark and degree if __GNUC__. + +2003-12-18 Kazu Hirata + + * fibheap.h (fibnode): Use unsigned long int for + bit-fields if __GNUC__ is defined. + +2003-12-04 H.J. Lu + + * bfdlink.h (bfd_link_info): Change relax_finalizing to + need_relax_finalize. + +2003-12-03 Alan Modra + + * bfdlink.h (struct bfd_link_hash_entry): Rename "next" to "und_next". + +2003-12-02 Alan Modra + + * bfdlink.h (struct bfd_link_info): Remove mpc860c0 field. + +2003-11-14 Nick Clifton + + * dis-asm.h (struct disassemble_info): Add new field + 'symbol_is_valid' which is a function which can tell the + disassembler to skip certain symbols as they should not be + displayed to the user. + (arm_symbol_is_valid): New prototype. This is the ARM + specific function for the symbol_is_valid field. + (generic_symbol_is_valid): New prototype. This is the default + function pointed to by the symbol_is_valid field. + +2003-11-06 Bruno Rohee + + * hp-symtab.h: Fix "the the" typo. + +2003-10-24 H.J. Lu + + * bfdlink.h (bfd_elf_version_expr): Add "symbol" and remove + "wildcard". + +2003-10-22 Joseph S. Myers + + * obstack.h: Merge the following change from gnulib: + 2003-10-21 Paul Eggert + * obstack.h (obstack_1grow_fast): Properly parenthesize arg. + (obstack_ptr_grow_fast, obstack_int_grow_fast): + Don't use lvalue casts, as GCC plans to remove support for them + in GCC 3.5. Reported by Joseph S. Myers. This bug + was also present in the non-GCC version, indicating that this + code had always been buggy and had never been widely used. + (obstack_1grow, obstack_ptr_grow, obstack_int_grow, obstack_blank): + Use the fast variant of each macro, rather than copying the + definiens of the fast variant; that way, we'll be more likely to + catch future bugs in the fast variants. + +2003-10-22 Jakub Jelinek + + * bfdlink.h (struct bfd_elf_version_expr): Remove match field. + Add wildcard and mask fields. + (BFD_ELF_VERSION_C_TYPE): Define. + (BFD_ELF_VERSION_CXX_TYPE): Likewise. + (BFD_ELF_VERSION_JAVA_TYPE): Likewise. + (struct bfd_elf_version_expr_head): New. + (struct bfd_elf_version_tree): Add match field. + Change type of globals and locals fields + to struct bfd_elf_version_expr_head. + +2003-09-22 Andrew Cagney + + * floatformat.h (struct floatformat): Add field "is_valid". + +2003-09-15 Andrew Cagney + + * floatformat.h (floatformat_to_double): Make input buffer constant. + (floatformat_from_double, floatformat_is_valid): Ditto. + +2003-09-15 Andrew Cagney + + * floatformat.h (struct floatformat): Make "exp_bias" signed. + +2003-09-15 Daniel Jacobowitz + + * floatformat.h (floatformat_is_valid): Add prototype. + +2003-08-27 Andrew Cagney + + * dis-asm.h (init_disassemble_info): Declare. + (INIT_DISASSEMBLE_INFO): Redefine as a call to + init_disassemble_info. + (INIT_DISASSEMBLE_INFO_NO_ARCH): Ditto. + +2003-08-20 Nick Clifton + + * bfdlink.h (enum report_method): New enum. Describes how to + report something. + (struct bfd_link_info): Delete fields 'no_undefined' and + 'allow_shlib_undefined'. Replace with + 'unresolved_symbols_in_objects' and + 'unresolved_symbols_in_shared_libs'. + +2003-08-07 Alan Modra + + * bfdlink.h: Remove PARAMS macro. Replace PTR with void *. + * dis-asm.h: Likewise. + +2003-07-09 Bob Wilson + + * xtensa-config.h: Undef all macros before defining them. + +2003-07-06 H.J. Lu + + * demangle.h: Support C++. + +2003-07-01 Zack Weinberg + + * filenames.h: New file imported from binutils. + +2003-06-30 Bob Wilson + + * xtensa-config.h: New file imported from binutils. + +2003-06-30 Bob Wilson + + * xtensa-config.h (XCHAL_HAVE_CONST16, XCHAL_HAVE_ABS, + XCHAL_HAVE_ADDX, XCHAL_HAVE_L32R): Define. + +2003-06-25 Alan Modra + + * bfdlink.h: Correct spelling of "relocatable". + +2003-06-22 Zack Weinberg + + * safe-ctype.h (HC_UNKNOWN, HC_ASCII, HC_EBCDIC): Rename to + HOST_CHARSET_UNKNOWN, HOST_CHARSET_ASCII, HOST_CHARSET_EBCDIC + respectively. + +2003-06-21 Zack Weinberg + + * safe-ctype.h (HC_UNKNOWN, HC_ASCII, HC_EBCDIC, HOST_CHARSET): + New #defines. + +2003-06-17 Kaveh R. Ghazi + + * ansidecl.h: Delete HAVE_LONG_DOUBLE GCC bootstrap support. + +2003-05-23 Jakub Jelinek + + * bfdlink.h (struct bfd_link_info): Add execstack and noexecstack. + +2003-06-03 H.J. Lu + + * bfdlink.h (LD_DEFINITION_IN_DISCARDED_SECTION): New. + +2003-05-30 Ulrich Drepper + Jakub Jelinek + + * bfdlink.h (struct bfd_link_info): Add pie and executable + bits. + +2003-05-21 Nick Clifton + + * bfdlink.h (struct bfd_link_hash_table): Fix typo in comment. + +2003-05-15 Jim Blandy + + * libiberty.h (hex_value): Make the value an unsigned int, to + avoid unexpected sign-extension when cast to unsigned types larger + than int --- like bfd_vma, on some platforms. + (_hex_value): Update declaration. + +2003-05-09 Alan Modra + + * xtensa-isa-internal.h (xtensa_isa_module_struct): Remove const on + gen_num_opcodes_fn return type. + +2003-05-07 Jason Merrill + + * hashtab.h (iterative_hash): Prototype. + (iterative_hash_object): New macro. + +2003-04-28 H.J. Lu + + * bfdlink.h (bfd_link_info): Add relax_finalizing. + +2003-04-23 H.J. Lu + + * bfdlink.h (bfd_link_callbacks): Add error_handler. + +2003-04-02 Bob Wilson + + * xtensa-config.h: Remove comment indicating that this is a + generated file. + +2003-04-01 Bob Wilson + + * dis-asm.h (print_insn_xtensa): Declare. + * xtensa-config.h: New file. + * xtensa-isa-internal.h: Likewise. + * xtensa-isa.h: Likewise. + +2003-03-17 Kaveh R. Ghazi + + * ansidecl.h (ATTRIBUTE_NONNULL, ATTRIBUTE_NULL_PRINTF, + ATTRIBUTE_NULL_PRINTF_1, ATTRIBUTE_NULL_PRINTF_2, + ATTRIBUTE_NULL_PRINTF_3, ATTRIBUTE_NULL_PRINTF_4, + ATTRIBUTE_NULL_PRINTF_5): New. + (ATTRIBUTE_PRINTF): Add ATTRIBUTE_NONNULL. + +2003-03-17 Jan Hubicka + + * hashtab.h (htab_traverse_noresize): Declare. + +2003-02-27 Kaveh R. Ghazi + + * libiberty.h: Document return value of physmem routines. + +2003-02-20 Kaveh R. Ghazi + + * libiberty.h (physmem_total, physmem_available): Prototype. + +2003-02-20 Daniel Jacobowitz + + * libiberty.h (lrealpath): Add declaration. + +2003-01-31 Grant Grundler + + * hppa.h (ldwa, ldda): Add ordered opcodes. + +2003-01-26 Daniel Jacobowitz + + * hashtab.h (htab_alloc_with_arg, htab_free_with_arg): Add new types. + (struct htab): Add alloc_arg, alloc_with_arg_f, free_with_arg_f. + (htab_create_alloc_ex): New prototype. + (htab_set_functions_ex): New prototype. + +2002-07-17 Geoffrey Keating + + * splay-tree.h (GTY): Define if undefined. + (splay_tree_allocate_fn): Return PTR for compatibility, not void *. + (struct splay_tree_node_s): Support gengtype. + (struct splay_tree_s): Likewise. Make allocate_data a PTR, + not a void *. + +2002-01-02 Ben Elliston + + * dis-asm.h (print_insn_iq2000): Declare. + +2002-12-24 Dmitry Diky + + * dis-asm.h: Add msp430 disassembler prototype. + +2002-12-27 Chris Demetriou + + * dis-asm.h (print_mips_disassembler_options): Prototype. + +2002-12-23 Alan Modra + + * bfdlink.h (struct bfd_link_info): Add "strip_discarded". + +2002-12-20 Alan Modra + + * bfdlink.h (struct bfd_link_info): Replace bfd_boolean fields with + bit-fields. Rearrange to put all like types together. + +2002-11-30 Alan Modra + + * bfdlink.h: Replace boolean with bfd_boolean. Formatting. + +2002-11-23 Simon Burge + + * libiberty.h (basename): Add NetBSD to the list. + +2002-11-22 Daniel Jacobowitz + + * libiberty.h (make_relative_prefix): Add prototype. + +2002-11-14 Egor Duda + + * bfdlink.h (struct bfd_link_info): Add new boolean + field pei386_runtime_pseudo_reloc. + +2002-10-26 Roger Sayle + + * partition.h: Close the extern "C" scope when compiling with C++. + +2002-10-26 Roger Sayle + DJ Delorie + + PR bootstrap/8351 + * getopt.h: Avoid prototyping getopt with no arguments in C++. + +2002-10-24 Nathan Tallent + + * ansidecl.h (__STDC__): Add (__alpha && __cplusplus) to the + list of platform compilers that may look, smell and act + like __STDC__ but that may not define it. + +2002-10-11 David O'Brien + + * getopt.h: getopt is in unistd.h (based on SUSv2). + +2002-09-26 Andrew Cagney + + * regs/: Delete directory. + +2002-09-19 Alexandre Oliva + + * libiberty.h (asprintf, vasprintf): Don't declare them if the + corresponding HAVE_DECL_ macro is 1. + +2002-09-19 Nathan Tallent + + * dis-asm.h: Remove (errant) trailing semicolon (;) from the + extern "C" { } declaration. + +2002-09-04 Nick Clifton + + * dis-asm.h (print_ppc_disassembler_options): Prototype. + +2002-08-28 Michael Hayes + + * dis-asm.h: Add standard disassembler for tic4x. + +2002-08-07 H.J. Lu + + * bfdlink.h (bfd_link_info): Add allow_undefined_version. + (bfd_elf_version_expr): Add symver and script. + +2002-07-31 Ian Dall + + * bfdlink.h (bfd_link_common_skip_ar_symbols): New enum. + (struct bfd_link_info): Add new field 'common_skip_ar_symbols'. + +2002-07-19 Denis Chertykov + Matthew Green + + * dis-asm.h (print_insn_ip2k): Declare. + +2002-07-01 Alan Modra + + * bfdlink.h (struct bfd_sym_chain): Declare. + (struct bfd_link_info): Add gc_sym_list. Formatting fixes. + +2002-06-25 Alan Modra + + * demangle.h: #include "ansidecl.h" rather than #include . + * fibheap.h: Likewise. + * hashtab.h: Likewise. + * partition.h: Likewise. + * sort.h: Likewise. + * splay-tree.h: Likewise. + +2002-06-24 Alan Modra + + * libiberty.h (basename): Don't declare if HAVE_DECL_BASENAME. + * getopt.h (getopt): Don't declare if HAVE_DECL_GETOPT. + +2002-06-18 Dave Brolley + + From Catherine Moore: + * dis-asm.h (print_insn_frv): New prototype. + +2002-06-09 Andrew Cagney + + * remote-sim.h: Move to directory gdb/. + * callback.h: Move to directory gdb/. + +2002-06-07 Charles Wilson + + * bfdlink.h (struct bfd_link_info): Change type of + pei386_auto_import field to int so that -1 can mean enabled by + default and 1 can mean enabled by command line switch. + +2002-06-06 DJ Delorie + + * hashtab.h (htab): Rearrange new members for backward + compatibility. + (htab_create): Don't use a macro that requires other headers. + +2002-06-05 Geoffrey Keating + + * hashtab.h (htab_create): Restore prototype for backward + compatibility. + (htab_try_create): Likewise. + +2002-05-22 Geoffrey Keating + + * hashtab.h (struct htab): Update for change to length specifier. + +2002-05-10 Geoffrey Keating + + * hashtab.h (GTY): Define if undefined. + (htab_alloc): New typedef. + (htab_free): New typedef. + (struct htab): Support gengtype; allow user-specified memory + allocation. + (htab_create_alloc): New. + (htab_create): Replace with #define. + (htab_try_create): Delete. + +2002-05-28 Kuang Hwa Lin + + * dis-asm.h: Prototype print_insn_dlx. + +2002-05-23 Andrew Cagney + + * sim-d10v.h: Delete file. Moved to include/gdb/. + +2002-05-21 H.J. Lu (hjl@gnu.org) + + * bfdlink.h (bfd_link_info): Add allow_multiple_definition. + +2002-05-17 J"orn Rennecke + + * dis-asm.h (print_insn_shl, print_insn_sh64l): Remove prototype. + +2002-04-16 David S. Miller + + * xregex2.h (__restrict_arr): Define to __restrict on GCC + 3.1 and later. Do not redefine. + +2002-04-01 Phil Edwards + + * dyn-string.h: Also allow IN_GLIBCPP_V3 to redefine names. + +2002-03-10 Daniel Jacobowitz + + * gdb: New directory. + +2002-03-06 Andrew Cagney + + * floatformat.h (floatformat_arm_ext): Delete declaration. + +2002-02-21 Jim Blandy + + Allow the user to specify functions for allocating memory for + splay tree roots and nodes. + * splay-tree.h (splay_tree_allocate_fn, splay_tree_deallocate_fn): + New types. + (splay_tree): New fields: `allocate', `deallocate', and + `allocate_data'. + (splay_tree_new_with_allocator): New function declaration. + +2002-02-15 Alan Modra + + Support arbitrary length fill patterns. + * bfdlink.h (enum bfd_link_order_type): Remove bfd_fill_link_order. + (struct bfd_link_order): Remove fill. Add data.size. + +2002-02-08 Alexandre Oliva + + Contribute sh64-elf. + 2000-11-25 Hans-Peter Nilsson + * dis-asm.h (print_insn_sh64): New prototype. + (print_insn_sh64l): New prototype. + (print_insn_sh64x_media): New prototype. + +2002-02-05 Frank Ch. Eigler + + * dis-asm.h (disassemble_info): New field `insn_sets'. + (INIT_DISASSEMBLE_INFO): Clear it. + +2002-02-05 Jason Merrill + + * demangle.h (cplus_demangle_v3): Add "options" parm. + (cplus_demangle_v3_type): Remove prototype. + (DMGL_VERBOSE): New macro. + (DMGL_TYPES): New macro. + +2002-02-02 H.J. Lu (hjl@gnu.org) + + * demangle.h (cplus_demangle_v3_type): New prototype. + +2002-01-31 Ivan Guzvinec + + * dis-asm.h : Add support for or32 targets + +2002-01-28 Kaveh R. Ghazi + + * libiberty.h (C_alloca): Add ATTRIBUTE_MALLOC. + +2002-01-27 David O'Brien + + * cgen.h (BFD_VERSION): Use BFD_VERSION_DATE instead. + +2001-12-14 Nick Clifton + + * dis-asm.h (INIT_DISASSEMBLE_INFO_NO_ARCH): Initialise the + disassembler_options field (to NULL). + +2001-12-13 Jakub Jelinek + + * bfdlink.h (struct bfd_link_info): Add eh_frame_hdr field. + +2001-12-07 Geoffrey Keating + + * dis-asm.h (print_insn_xstormy16): Declare. + +2001-12-06 Richard Henderson + + * demangle.h (no_demangling): New. + (NO_DEMANGLING_STYLE_STRING): New. + +2001-11-14 Alan Modra + + * dis-asm.h (print_insn_i386): Declare. + +2001-11-11 Timothy Wall + + * dis-asm.h: Fix comment to refer to octets rather than bytes. + +2001-10-30 Hans-Peter Nilsson + + * dis-asm.h (print_insn_mmix): Add prototype. + +2001-10-24 Neil Booth + + * safe-ctype.h (_sch_isbasic, IS_ISOBASIC): New. + +2001-10-22 Kaveh R. Ghazi + + * libiberty.h (hex_init): Revert delete. + + * libiberty.h (_hex_value): Const-ify. + (hex_init): Delete. + +2001-10-16 Christopher Faylor + + * filenames.h: Add cygwin to the list of dosish style path systems. + +2001-10-07 Kaveh R. Ghazi + + * demangle.h (demangler_engine): Const-ify. + * libiberty.h (buildargv): Likewise. + +2001-10-03 Vassili Karpov + + * bfdlink.h (struct bfd_link_info): Add nocopyreloc field. + +2001-09-24 Kaveh R. Ghazi + + * libiberty.h (reconcat): New function. + +2001-09-18 Kaveh R. Ghazi + + * libiberty.h (concat, concat_length, concat_copy, concat_copy2, + ACONCAT): Improve comments. + +2001-09-18 Alan Modra + + * objalloc.h (OBJALLOC_ALIGN): Define using offsetof. + +2001-09-17 Kaveh R. Ghazi + + * libiberty.h (concat_length, concat_copy, concat_copy2, + libiberty_concat_ptr, ACONCAT): New. + + * libiberty.h (ASTRDUP): New macro. + libiberty_optr, libiberty_nptr, libiberty_len): Declare. + +2001-08-29 Kaveh R. Ghazi + + * ansidecl.h: Update comments reflecting previous change. + +2001-08-27 Kaveh R. Ghazi + + * ansidecl.h (VA_OPEN, VA_CLOSE): Allow multiple uses. + +2001-08-25 Nick Clifton + + * bfdlink.h (struct bfd_link_info): Change 'spare_dynamic_tags' to + unsigned to remove a compile time warning message. + +2001-08-24 H.J. Lu + + * bfdlink.h (bfd_link_hash_table_type): New. The linker hash + table type, bfd_link_generic_hash_table and + bfd_link_elf_hash_table. + (bfd_link_hash_table): Add a new field, type, for the linker + hash table type. + +2001-08-23 Jakub Jelinek + + * bfdlink.h (struct bfd_link_info): Add combreloc and + spare_dynamic_tags fields. + +2001-08-23 Lars Brinkhoff + + * dyn-string.h, fibheap.h, partition.h, sort.h, splay-tree.h: + replace "GNU CC" with "GCC". + +2001-08-21 Richard Henderson + + * fibheap.h: Tidy formatting. + (fibnode_t): Limit degree to 31 bits to avoid warning. + +2001-08-20 Daniel Berlin + + * fibheap.h: New file. Fibonacci heap. + +2001-08-20 Andrew Cagney + + * floatformat.h (floatformat_arm_ext): Document as deprecated. + (floatformat_arm_ext_big, floatformat_arm_ext_littlebyte_bigword) + (floatformat_ia64_spill_little, floatformat_ia64_quad_little) + (floatformat_ia64_spill_big, floatformat_ia64_quad_big) + (floatformat_m88110_harris_ext): Declare. + +2001-08-18 Zack Weinberg + + * ansidecl.h: Reorganize for readability, remove documentation + of obsolete macros, document PARAMS and VPARAMS. Add new + macros VA_OPEN, VA_CLOSE, and VA_FIXEDARG for nicer variadic + function implementation. + +2001-08-16 Richard Henderson + + * hashtab.h (htab_hash_string): Declare. + +2001-08-10 Andrew Cagney + + * libiberty.h (lbasename): Change function declaration to return a + const char pointer. + +2001-08-02 Mark Kettenis + + * xregex.h (_REGEX_RE_COMP): Define. + (re_comp): Define to xre_comp. + (re_exec): Define to xre_exec. + +2001-08-02 Charles Wilson + + * bfdlink.h (struct bfd_link_info): add new boolean + field pei386_auto_import. + +2001-07-18 Andreas Jaeger + + * xregex2.h: Place under LGPL version 2.1. + +2001-07-10 Jeff Johnston + + * xregex.h: New file to support libiberty regex. + * xregex2.h: Ditto. + +2001-06-15 Hans-Peter Nilsson + + * bfdlink.h (struct bfd_link_info): New member export_dynamic. + +2001-05-16 Matt Kraai + + * partition.h: Fix misspelling of `implementation'. + +2001-05-10 Kaveh R. Ghazi + + * ansidecl.h (NULL_PTR): Delete. + +2001-05-07 Zack Weinberg + + * demangle.h: Use PARAMS for all prototypes. + * ternary.h: Use PARAMS for all prototypes. Use PTR, not void *. + Make arguments constant where possible. + +2001-05-07 Mark Mitchell + + * splay-tree.h (splay_tree_max): New function. + (splay_tree_min): Likewise. + +2001-04-27 Johan Rydberg + + * dis-asm.h (print_insn_openrisc): Add prototype. + +2001-04-15 Daniel Berlin + + * ternary.h: New file - Ternary search tree header. + +2001-04-13 Jakub Jelinek + + * bfdlink.h (bfd_link_discard): Add discard_sec_merge. + +2001-04-03 Zack Weinberg + + * ansidecl.h: All logic from gcc/gansidecl.h moved here. + +2001-03-31 Kaveh R. Ghazi + + * libiberty.h (alloca): Handle setting C_ALLOCA. + +2001-03-20 Jim Blandy + + * demangle.h (enum gnu_v3_constructor_kinds, + is_gnu_v3_mangled_ctor, enum gnu_v3_destructor_kinds, + is_gnu_v3_mangled_dtor): New declarations. + +2001-03-14 Nick Clifton + + * ansidecl.h: Fix copyright dates. + * demangle.h: Fix copyright dates. + * floatformat.h: Fix copyright dates. + * fnmatch.h: Fix copyright dates. + * getopt.h: Fix copyright dates. + * libiberty.h: Add FSF copyright notice. + * md5.h: Fix copyright dates. + * obstack.h: Fix copyright dates. + * splay-tree.h: Fix copyright dates. + +2001-03-10 Neil Booth + John David Anglin + + * libiberty.h: Add lbasename. + +2001-03-06 Zack Weinberg + + * libiberty.h: Prototype C_alloca; define alloca to either + __builtin_alloca or C_alloca as appropriate. + +2001-03-01 John David Anglin + + * safe-ctype.h (_sch_test): Cast enum bit to unsigned short int for pcc + compatibility. + +2001-02-18 lars brinkhoff + + * dis-asm.h: Add PDP-11 target. + +2001-02-09 Martin Schwidefsky + + * dis-asm.h: Add linux target for S/390. + +2001-01-11 Peter Targett + + * dis-asm.h (arc_get_disassembler): Correct declaration. + +2001-01-09 Philip Blundell + + * bin-bugs.h (REPORT_BUGS_TO): Set to `bug-binutils@gnu.org'. + +2000-12-18 Joseph S. Myers + + * COPYING: Update to current + ftp://ftp.gnu.org/pub/gnu/Licenses/COPYING-2.0 (fixes references + to 19yy as example year in copyright notice). + +2000-12-19 Hans-Peter Nilsson + + * dis-asm.h (struct disassemble_info): New member "section". + (INIT_DISASSEMBLE_INFO_NO_ARCH): Initialize private_data member. + Initialize section member. + +2000-12-16 Herman A.J. ten Brugge + + * safe-ctype.h: Make code work on all targets and not just on + targets where a char is 8 bits. + +2000-12-10 Fred Fish + + * bfdlink.h (struct bfd_link_info): Add new allow_shlib_undefined + member to struct for systems where it is normal to have undefined + symbols in shared libraries at runtime and the runtime linker + takes care of redirecting them. + +2000-12-07 Zack Weinberg + + * safe-ctype.h: New file. + +2000-12-06 Rodney Brown + + * getopt.h obstack.h: Standarize copyright statement. + +2000-12-04 Richard Henderson + + * demangle.h: Change "new_abi" to "v3" everywhere. + +2000-11-22 Zack Weinberg + + * libiberty.h: Move #includes to top. Prototype xmalloc_failed. + +2000-11-15 Kenneth Block + + * demangle.h: Add gnat and java demangle styles. + +2000-11-04 Hans-Peter Nilsson + + * hashtab.h (struct htab): Add member return_allocation_failure. + (htab_try_create): New prototype. Mention which functions may + return NULL when this is used. + +2000-11-03 Hans-Peter Nilsson + + * hashtab.h: Change void * to PTR where necessary. + +2000-10-11 Mark Mitchell + + * splay-tree.h (splay_tree_predecessor): Declare. + +2000-09-29 Hans-Peter Nilsson + + * dis-asm.h: Declare cris_get_disassembler, not print_insn_cris. + Fix typo in comment. + +2000-09-28 John David Anglin + + * alloca-conf.h: New file (copied from libiberty). + +2000-09-05 John David Anglin + + * md5.h (md5_uint32): Choose via INT_MAX instead of UINT_MAX. + +2000-09-04 Alex Samuel + + * dyn-string.h: Adjust formatting. + (dyn_string_insert_char): New macro. New declaration. + +2000-08-28 Jason Merrill + + * md5.h: New file. + +2000-08-24 Greg McGary + + * libiberty.h (ARRAY_SIZE): New macro. + +2000-07-29 Nick Clifton + + * os9k.h: Add copyright notice. + Fix formatting. + +2000-07-22 Jason Eckhardt + + * dis-asm.h (print_insn_i860): Add prototype. + +2000-07-20 H.J. Lu + + * bfdlink.h (bfd_link_info): Add new_dtags. + +2000-07-20 Hans-Peter Nilsson + + * dis-asm.h (print_insn_cris): Declare. + +2000-07-19 H.J. Lu (hjl@gnu.org) + + * bfdlink.h (bfd_link_info): Add flags and flags_1. + +2000-06-05 DJ Delorie + + * MAINTAINERS: new + +2000-06-21 Alex Samuel + + * dyn-string.h (dyn_string_init, dyn_string_new, + dyn_string_delete, dyn_string_release, dyn_string_resize, + dyn_string_clear, dyn_string_copy, dyn_string_copy_cstr, + dyn_string_prepend, dyn_string_prepend_cstr, dyn_string_insert, + dyn_string_insert_cstr, dyn_string_append, dyn_string_append_cstr, + dyn_string_append_char, dyn_string_substring_dyn_string_eq): + Define as same name with __cxa_ prepended, if IN_LIBGCC2. + (dyn_string_init, dyn_string_copy, dyn_string_copy_cstr, + dyn_string_prepend, dyn_string_prepend_cstr, dyn_string_insert, + dyn_string_insert_cstr, dyn_string_append, dyn_string_append_cstr, + dyn_string_append_char, dyn_string_substring): Change return type + to int. + +2000-06-18 Stephane Carrez + + * dis-asm.h (print_insn_m68hc12): Define. + (print_insn_m68hc11): Likewise. + +2000-06-18 Nick Clifton + + * os9k.h: Change values of MODSYNC and CRCCON due to bug report + from Russ Magee . + +2000-06-07 Kaveh R. Ghazi + + * demangle.h (demangling_styles): Remove trailing comma in enum. + + * dyn-string.h (dyn_string_append_char): Change parameter from + char to int. + +2000-06-04 Alex Samuel + + * dyn-string.h: Move here from gcc/dyn-string.h. Add new functions. + + * demangle.h (DMGL_GNU_NEW_ABI): New macro. + (DMGL_STYLE_MASK): Or in DMGL_GNU_NEW_ABI. + (current_demangling_style): Add gnu_new_abi_demangling. + (GNU_NEW_ABI_DEMANGLING_STYLE_STRING): New macro. + (GNU_NEW_ABI_DEMANGLING): Likewise. + (cplus_demangle_new_abi): New declaration. + +Tue May 30 16:53:34 2000 Andrew Cagney + + * floatformat.h (struct floatformat): Add field name. + +2000-05-26 Eli Zaretskii + + * filenames.h: New file. + (HAVE_DOS_BASED_FILE_SYSTEM, IS_DIR_SEPARATOR) + (IS_ABSOLUTE_PATH, FILENAME_CMP): New macros. + +2000-05-23 Kaveh R. Ghazi + + * getopt.h (getopt): Also check HAVE_DECL_* when prototyping. + + * libiberty.h (basename): Likewise. + +2000-05-17 S. Bharadwaj Yadavalli + Rick Gorton + + * bfdlink.h (struct bfd_link_info): Add emitrelocations flag. + +2000-05-08 Alan Modra + + * dis-asm.h (print_insn_tic54x): Declare. + +2000-05-06 Zack Weinberg + + * ansidecl.h: #define __extension__ to nothing if + GCC_VERSION < 2008. + +2000-05-04 Kaveh R. Ghazi + + * demangle.h (demangler_engine): Constify. + +Thu May 4 17:15:26 2000 Philippe De Muyter + + * sort.h (sys/types.h): File included unconditionnaly. + (stddef.h): File include only #ifdef __STDC__. + +2000-05-03 Zack Weinberg + + * symcat.h: Remove #endif label. + +2000-04-28 Kenneth Block + Jason Merrill + + * demangle.h (libiberty_demanglers): new table for different styles. + (cplus_demangle_set_style): New function for setting style. + (cplus_demangle_name_to_style): New function to translate name. + +2000-04-24 Mark Mitchell + + * hashtab.h (hash_pointer): Declare. + (eq_pointer): Likewise. + +2000-04-23 Mark Mitchell + + * sort.h: New file. + +Fri Apr 21 13:20:53 2000 Richard Henderson + David Mosberger + + * dis-asm.h (print_insn_ia64): Declare. + +Tue Apr 18 16:22:30 2000 Richard Kenner + + * hashtab.h (enum insert_option): New type. + (htab_find_slot, htab_find_slot_with_hash): Use it. + +2000-04-17 Kaveh R. Ghazi + + * symcat.h: Honor autoconf macro HAVE_STRINGIZE. Add + comments/caveats with regard to traditional C behavior. + +2000-04-05 Richard Henderson + + * splay-tree.h (splay_tree_remove): Declare. + +2000-04-04 Alan Modra + + * bin-bugs.h (REPORT_BUGS_TO): Remove translated part. + +2000-04-03 Alan Modra + + * bin-bugs.h: New file. + +2000-03-30 Mark Mitchell + + * hashtab.h (hashval_t): New type. + (htab_find_with_hash): Use it as an argument. + (htab_find_slot_with_hash): Likewise. + +2000-03-27 Denis Chertykov + + * dis-asm.h (print_insn_avr): Declare. + +2000-03-14 Bernd Schmidt + + * hashtab.h (htab_trav): Modify type so that first arg is of type + void **. + (htab_find_with_hash, htab_find_slot_with_hash): Declare new + functions. + +2000-03-09 Alex Samuel + + * partition.h: New file. + +2000-03-09 Zack Weinberg + + * hashtab.h (struct htab): Add del_f. + (htab_del): New type. + (htab_create): Add fourth argument. + +2000-03-08 Zack Weinberg + + * hashtab.h (hash_table_t): Rename to htab_t. + (struct hash_table): Rename to struct htab. Shorten element + names. Reorder elements by size. + (htab_hash, htab_eq, htab_trav): New typedefs for the callback + function pointers. + (hash_table_entry_t): Discard; just use void * for element + type. + +2000-03-01 H.J. Lu + + * bfdlink.h (bfd_link_callbacks): Add a boolean arg to + the undefined_symbol callback. + +2000-02-23 Linas Vepstas + + * dis-asm.h (print_insn_i370): Declare. + +Tue Feb 22 15:19:54 2000 Andrew Cagney + + * remote-sim.h (sim_trace): Document return values. + (sim_set_trace): Declare. Deprecate. + +2000-02-21 Alan Modra + + * dis-asm.h (struct disassemble_info): Change `length' param of + read_memory_func to unsigned. Change type of `buffer_length' and + `octets_per_byte' to unsigned. + (buffer_read_memory): Change `length' param to unsigned. + +2000-02-16 Nick Clifton + + * dis-asm.h: Add prototypes for ARM register name functions. + +Wed Feb 9 18:45:49 2000 Andrew Cagney + + * wait.h: Delete. No longer used by GDB. + +Tue Feb 8 17:01:13 2000 Andrew Cagney + + * remote-sim.h (sim_resume): Clarify use of SIGGNAL. + (sim_stop_reason): Clarify meaning of sim_signalled. + +2000-02-03 Timothy Wall + + * dis-asm.h (struct disassemble_info): Added octets_per_byte + field and initialize it to one (1). + +2000-01-27 Nick Clifton + + * dis-asm.h: Add prototype for disassembler_usage(). + Add prototype for arm_disassembler_options(). + Remove prototype for arm_toggle_regnames(). + Add prototype for parse_arm_disassembler_option(). + +Sat Jan 1 19:06:52 2000 Hans-Peter Nilsson + + * symcat.h (STRINGX) [!__STDC__ || ALMOST_STDC]: Change "?" to "s" + to stringify argument s. + +Wed Dec 15 11:22:56 1999 Jeffrey A Law (law@cygnus.com) + + * hp-symtab.h (HP_LANGUAGE_FORTRAN): New enumeration constant. + (HP_LANGUAGE_F77): Define using HP_LANGUAGE_FORTRAN. + +1999-12-15 Doug Evans + + * dis-asm.h: Enclose in extern "C" ifdef __cplusplus. + +1999-12-05 Mark Mitchell + + * splay-tree.h (struct splay_tree_node): Rename to ... + (struct splay_tree_node_s): ... this. + (struct splay_tree): Rename to ... + (struct splay_tree_s): ... this. + +1999-11-30 Kaveh R. Ghazi + + * ansidecl.h (ATTRIBUTE_MALLOC): New macro. + + * libiberty.h (buildargv, dupargv, concat, choose_temp_base, + make_temp_file, xmalloc, xcalloc, xstrdup, xmemdup): Add + ATTRIBUTE_MALLOC. + (xatexit): Remove __GNUC__ check, add ATTRIBUTE_NORETURN. + +1999-11-28 Kaveh R. Ghazi + + * libiberty.h: Include stdarg.h when ANSI_PROTOTYPES is defined. + (asprintf, vasprintf): Provide declarations. + +Wed Nov 10 12:43:21 1999 Philippe De Muyter + Kaveh R. Ghazi + + * ansidecl.h: Define and test `GCC_VERSION', not `HAVE_GCC_VERSION'. + +1999-11-04 Jimmy Guo + + * hp-symtab.h (dntt_type_fparam): Add doc_ranges, misc_kind + fields, change location type to CORE_ADDR from int. + (dntt_type_const): Name the 5th field location_type. + +Sun Oct 24 19:11:32 1999 Andrew Cagney + + * sim-d10v.h (SIM_D10V_TS2_DMAP_REGNUM): Define. + +1999-10-23 08:51 -0700 Zack Weinberg + + * hashtab.h: Give hash_table_t a struct tag. Add prototypes + for clear_hash_table_slot and traverse_hash_table. Correct + prototype of all_hash_table_collisions. + +Sat Oct 23 19:00:13 1999 Andrew Cagney + + * sim-d10v.h: New file. + +Fri Oct 15 01:47:51 1999 Vladimir Makarov + + * hashtab.h: New file. + +1999-10-10 Kaveh R. Ghazi + + * ansidecl.h (HAVE_GCC_VERSION): New macro. Use it instead of + explicitly testing __GNUC__ and __GNUC_MINOR__. + + (ATTRIBUTE_PRINTF): Use `__format__', not `format'. + +1999-09-25 Kaveh R. Ghazi + + * libiberty.h (make_temp_file): Add a prototype. + +Tue Sep 14 00:35:02 1999 Marc Espie + + * libiberty.h (basename): OpenBSD has a correct prototype. + (xrealloc): Remove outdated comment. + +1999-09-07 Jeff Garzik + + * libiberty.h (xmemdup): Add prototype for new function. + +1999-09-04 Steve Chamberlain + + * dis-asm.h (print_insn_pj): Declare. + +1999-09-01 Kaveh R. Ghazi + + * obstack.h (obstack_grow, obstack_grow0): Move (char*) casts + in calls to `_obstack_memcpy' from here ... + + (_obstack_memcpy): ... to here, except in the __STDC__ case which + doesn't need it. + +1999-08-30 Kaveh R. Ghazi + + * libiberty.h (getpwd): Prototype. + +1999-08-01 Mark Mitchell + + * splay-tree.h (splay_tree_insert): Return the new node. + +1999-07-11 Ian Lance Taylor + + * ansidecl.h: Copy attribute support macros from egcs. + +1999-06-22 Mark Mitchell + + * bfdlink.h (struct bfd_link_hash_entry): Add init_function and + fini_function. + +1999-06-20 Mark Mitchell + + * mips.h (Elf32_Internal_Msym): New structure. + (Elf32_External_Msym): Likewise. + (ELF32_MS_REL_INDEX): New macro. + (ELF32_MS_FLAGS): Likewise. + (ELF32_MS_INFO): Likewise. + +1999-06-14 Nick Clifton + + * dis-asm.h (arm_toggle_regnames): New prototype. + (struct diassemble_info): New field: disassembler_options. + +1999-04-11 Richard Henderson + + * bfdlink.h (bfd_elf_version_expr): Rename `match' to `pattern'. + Add `match' callback function. + +1999-04-10 Richard Henderson + + * bfdlink.h (bfd_link_info): Add no_undefined. + +1999-04-08 Nick Clifton + + * dis-asm.h: Add prototype for print_insn_mcore. + +1999-04-02 Mark Mitchell + + * splay-tree.h (splay_tree_compare_pointers): Declare. + +1999-03-30 Mark Mitchell + + * splay-tree.h (splay_tree_compare_ints): Declare. + +Wed Mar 24 12:46:29 1999 Andrew Cagney + + * libiberty.h (basename): Cygwin{,32} should have the prototype. + +1999-02-22 Jim Lemke + + * bfdlink.h (bfd_link_info): add field "mpc860c0". + +Mon Feb 1 21:05:46 1999 Catherine Moore + + * dis-asm.h (print_insn_i386_att): Declare. + (print_insn_i386_intel): Declare. + +1998-12-30 Michael Meissner + + * dis-asm.h (INIT_DISASSEMBLE_INFO_NO_ARCH): Cast STREAM and + FPRINTF_FUNC to avoid compiler warnings. + +Wed Dec 30 16:07:14 1998 David Taylor + + * dis-asm.h: change void * to PTR (two places). + +Mon Dec 14 09:53:31 1998 Kaveh R. Ghazi + + * demangle.h: Don't check IN_GCC anymore. + * splay-tree.h: Likewise. + +Tue Dec 8 00:30:31 1998 Elena Zannoni + + The following changes were made by Elena Zannoni + and Edith Epstein + as part of a project to merge in + changes made by HP; HP did not create ChangeLog entries. + + * dis-asm.h (struct disassemble_info): change the type of stream + from FILE* to void*, for use with gdb's new type GDB_FILE. + (fprintf_ftype): change FILE* parameter type to void*. + + * demangle.h: (DMGL_EDG): new macro for Kuck and Associates + (DMGL_STYLE_MASK): modify to include Kuck and Assoc style + (demangling_styles): add new edg_demangling style + (EDG_DEMANGLING_STYLE_STRING): new macro + (EDG_DEMANGLING): new macro + (DMGL_HP): new macro, for HP/aCC compiler. + (DMGL_STYLE_MASK): modify to include new HP's style. + (demangling_styles): add new hp_demangling value. + (HP_DEMANGLING_STYLE_STRING): new macro. + (ARM_DEMANGLING): coerce to int. + (HP_DEMANGLING): new macro. + + * hp-symtab.h: rewritten, from HP. + (quick_procedure): change type of language field to unsigned int + (quick_module): change type of language field to unsigned int + (struct dntt_type_svar): add field thread_specific. + (hp_language): add languages modcal and dmpascal. + +Fri Nov 20 13:14:00 1998 Andrew Cagney + + * libiberty.h (basename): Add prototype for FreeBSD. + +Fri Nov 13 19:19:11 1998 Kaveh R. Ghazi + + * libiberty.h: Prototype xcalloc. + +Sun Nov 8 17:42:25 1998 Kaveh R. Ghazi + + * ansidecl.h: Wrap problematic macros with !IN_GCC. + + * demangle.h: Never define PARAMS(). + * splay-tree.h: Likewise. + +Sat Nov 7 18:30:20 1998 Peter Schauer + + * dis-asm.h (print_insn_vax): Declare. + +Sat Nov 7 16:04:03 1998 Kaveh R. Ghazi + + * demangle.h: Don't include gansidecl.h. + * splay-tree.h: Likewise. + +1998-10-26 16:03 Ulrich Drepper + + * bfdlink.h (struct bfd_link_info): Add new field optimize. + +Thu Oct 22 19:58:00 1998 Kaveh R. Ghazi + + * splay-tree.h: Wrap function pointer parameter declarations in + PARAMS() macro. + +1998-10-21 Mark Mitchell + + * splay-tree.h: New file. + +Fri Oct 9 00:02:03 1998 Jeffrey A Law (law@cygnus.com) + + * Merge devo and egcs include directories. + +Sat Sep 5 12:16:33 1998 Jeffrey A Law (law@cygnus.com) + + * getopt.h, obstack.h: Updated from gcc. + +1998-08-03 Jason Molenda (jsm@bugshack.cygnus.com) + + * libiberty.h (xexit): Change decl to use modern GCC attribute + to indicate exit does not return. + +Mon Jun 1 13:48:32 1998 Jason Molenda (crash@bugshack.cygnus.com) + + * obstack.h: Update to latest FSF version. + +Tue Feb 24 13:05:02 1998 Doug Evans + + * dis-asm.h (disassemble_info): Member `symbol' renamed to `symbols' + and made an "asymbol **". New member num_symbols. + (INIT_DISASSEMBLE_INFO_NO_ARCH): Update. + +Tue Feb 17 12:32:18 1998 Andrew Cagney + + * remote-sim.h (sim_fetch_register, sim_store_register): Add + register length parameter. Functions return actual length of + register. + +Thu Feb 12 16:29:01 1998 Ian Lance Taylor + + * getopt.h: Update to latest FSF version. + +Wed Feb 11 16:56:06 1998 Doug Evans + + * symcat.h: New file. + +Mon Feb 2 17:13:31 1998 Steve Haworth + + * dis-asm.h (print_insn_tic30): Declare. + +Thu Jan 22 16:23:59 1998 Fred Fish + + * dis-asm.h: Add flag INSN_HAS_RELOC to tell disassembly + function there is a reloc on this line. + +Mon Dec 8 11:22:23 1997 Nick Clifton + + * dis-asm.h: Remove prototype of disasm_symaddr() as this function + no longer exists. + +Tue Dec 2 10:20:53 1997 Nick Clifton + + * dis-asm.h (disasm_symaddr): New prototype. + +Mon Dec 1 11:29:35 1997 Doug Evans + + * callback.h (CB_SYSCALL): Comment out arg names in prototypes. + +Wed Nov 26 16:47:58 1997 Michael Meissner + + * callback.h (CB_SYSCALL): Consistantly use names for prototype + arguments. + +Wed Nov 26 11:39:30 1997 Doug Evans + + * callback.h (CB_SYSCALL): Change byte count arguments to + {read,write}_mem to `int'. New member `magic'. + (CB_SYSCALL_MAGIC,CB_SYSCALL_INIT): New macros. + +Tue Nov 25 01:35:52 1997 Doug Evans + + * callback.h (struct stat): Move forward decl up. + (host_callback): Pass stat struct pointer to stat,fstat. + (CB_SYS_nnn): Reorganize. + (CB_SYSCALL): New members p1,p2. + (cb_host_to_target_stat): Delete fourth arg. + +Sat Nov 22 23:34:15 1997 Andrew Cagney + + * remote-sim.h (sim_stop_reason): Clarify sim_signalled SIGRC + argument. + +Mon Nov 17 14:00:51 1997 Doug Evans + + * callback.h (CB_TARGET_DEFS_MAP): Renamed from target_defs_map. + (host_callback): Add stat, fstat, syscall_map, errno_map, open_map, + signal_map, stat_map. + (errn_map,open_map): Renamed to cb_init_foo_map. + (cb_host_to_target_errno,cb_target_to_host_open): Renamed from + host_to_target_errno,target_to_host_open. + (cb_read_target_syscall_maps): Add prototype. + (cb_target_to_host_syscall): Likewise. + (cb_host_to_target_stat): Likewise. + (cb_syscall): Likewise. + (CB_SYS_{exit,open,close,read,write,lseek,unlink,getpid,kill,fstat, + argvlen,argv,chdir,stat,chmod,utime,time}): Define. + (CB_SYSCALL): New type. + (CB_RC): New enum. + +Fri Nov 7 10:34:09 1997 Rob Savoye + + * libiberty.h: Add extern "C" { so it can be used with C++ + programs. + * remote-sim.h: Add extern "C" { so it can be used with C++ + programs. + +Tue Oct 14 16:07:51 1997 Nick Clifton + + * dis-asm.h (struct disassemble_info): New field + 'symbol_at_address_func'. + (INIT_DISASSEMBLE_INFO_NO_ARCH): Initialise new field with + generic_symbol_at_address. + +Mon Oct 13 10:17:15 1997 Andrew Cagney + + * remote-sim.h: Clarify sim_read, sim_write MEM argument. + +Wed Sep 24 18:03:10 1997 Stu Grossman + + * remote-sim.h (SIM_RC): Add a bunch of new return codes for + breakpoint stuff. + * Add functions to tell the simulator to set/clear/enable/disable + intrinsic breakpoints. + +Thu Aug 28 19:41:42 1997 Andrew Cagney + + * libiberty.h (dupargv): Add prototype. + +Tue Aug 26 12:25:49 1997 Andrew Cagney + + * remote-sim.h (sim_create_inferior): Add ABFD arg. Document. + +Mon Aug 25 10:50:51 1997 Andrew Cagney + + * remote-sim.h (sim_open): Add ABFD arg. Document. + +Fri Aug 8 16:43:56 1997 Doug Evans + + * dis-asm.h (arc_get_disassembler): Declare. + +Wed Jul 30 11:39:50 1997 Per Bothner + + * demangle.h (DMGL_JAVA): New option to request Java demangling. + +Tue Jul 22 17:59:54 1997 Ian Lance Taylor + + * libiberty.h (PEXECUTE_*): Define. + (pexecute, pwait): Declare. + +Fri Jun 6 13:02:33 1997 Andrew Cagney + + * remote-sim.h (sim_kill): Mark as depreciated. + +Fri May 23 13:43:41 1997 Fred Fish + + * bfdlink.h (struct bfd_link_info): Add task_link member. + +Thu May 22 11:32:49 1997 Andrew Cagney + + * remote-sim.h: Review documentation. Clarify restrictions on + when functions can be called. + +Wed May 21 16:47:53 1997 Andrew Cagney + + * remote-sim.h (sim_set_profile_size): Add prototype, document as + depreciated. + +Tue May 20 09:32:22 1997 Andrew Cagney + + * remote-sim.h (sim_open): Add callback struct. + (sim_set_callbacks): Drop SIM_DESC argument. Document. + (sim_size): Remove recently added SIM_DESC argument. Document. + +Mon May 19 19:14:44 1997 Andrew Cagney + + * remote-sim.h: Pass SD into sim_size. + +Thu May 15 01:24:16 1997 Mark Alexander + + * obstack.h (obstack_specify_allocation_with_arg, obstack_chunkfun, + obstack_freefun): Eliminate compile warnings in gdb. + +Tue Apr 22 10:24:34 1997 Fred Fish + + * floatformat.h (floatformat_byteorders): Add comments for previous + formats and add floatformat_littlebyte_bigword, primarily for ARM. + Add declaration for floatformat_ieee_double_littlebyte_bigword. + +Fri Apr 18 13:04:49 1997 Andrew Cagney + + * remote-sim.h (sim_stop): New interface - asynchronous + notification of a request to stop / suspend the running + simulation. + + * remote-sim.h (enum sim_stop): Add sim_running and sim_polling as + states for use internal to simulators. + + * callback.h (struct host_callback_strut): Put a magic number at + the end of the struct to allow basic checking. + (struct host_callback_struct ): Add poll_quit - so + that the console etc can be polled at regular intervals. + +Thu Apr 17 02:17:12 1997 Doug Evans + + * remote-sim.h (struct _bfd): Declare. + (sim_load): Return SIM_RC. New arg `abfd'. + (sim_create_inferior): Return SIM_RC. Delete arg `start_address'. + +Wed Apr 2 17:09:12 1997 Andrew Cagney + + * remote-sim.h (sim_trace, sim_size): Make these global. They + will go away shortly. + +Wed Apr 2 15:23:49 1997 Doug Evans + + * remote-sim.h (SIM_OPEN_KIND, SIM_RC): New enums. + (sim_open): New argument `kind'. + +Wed Apr 2 14:45:51 1997 Ian Lance Taylor + + * COPYING: Update FSF address. + +Fri Mar 28 15:29:54 1997 Mike Meissner + + * callback.h (top level): Include stdarg.h or varargs.h if + va_start is not defined. + (host_callback_struct): Make {,e}vprintf_filtered take a va_list + instead of void *, since va_list might be an array or structure + type. + +Fri Mar 28 15:44:41 1997 H.J. Lu + + * libiberty.h (basename): Add prototype for glibc and linux. + +Mon Mar 17 19:22:12 1997 Ian Lance Taylor + + * objalloc.h: New file. + +Mon Mar 17 14:57:55 1997 Andrew Cagney + + * remote-sim.h: New file, copied in from gdb/remote-sim.h. One + day this will be placed in a directory of its own. + +Sat Mar 15 19:00:14 1997 Ian Lance Taylor + + * obstack.h: Update to current FSF version. + +Thu Mar 6 15:46:59 1997 Andrew Cagney + + * callback.h (struct host_callback_struct): Add callbacks - + flush_stdout, write_stderr, flush_stderr, vprintf_filtered, + evprintf_filtered. Delete redundant callbacks - printf_filtered. + +Thu Feb 27 23:18:27 1997 Ian Lance Taylor + + * bfdlink.h (struct bfd_link_info): Remove lprefix and lprefix_len + fields. + +Tue Feb 25 00:10:49 1997 Ian Lance Taylor + + * dis-asm.h (INIT_DISASSEMBLE_INFO_NO_ARCH): Initialize + bytes_per_chunk and display_endian. + +Mon Feb 24 17:47:02 1997 Ian Lance Taylor + + From Eric Youngdale : + * bfdlink.h (struct bfd_elf_version_expr): Define. + (struct bfd_elf_version_deps): Define. + (struct bfd_elf_version_tree): Define. + +Thu Feb 6 14:20:01 1997 Martin M. Hunt + + * dis-asm.h: (disassemble_info): Add new fields + bytes_per_chunk and display_endian to control the + display of raw instructions. + +Fri Dec 27 22:17:37 1996 Fred Fish + + * dis-asm.h (print_insn_tic80): Declare. + +Sun Dec 8 17:11:12 1996 Doug Evans + + * callback.h (host_callback): New member `error'. + +Wed Nov 20 00:40:23 1996 Doug Evans + + * callback.h: New file, moved here from gdb. + +Mon Nov 18 16:34:00 1996 Dawn Perchik + + * libiberty.h: Checkin again; last checkin failed due to sticky tag. + +Wed Nov 13 08:22:00 1996 Dawn Perchik + + * libiberty.h: Revert last commit due to conflicts with hpux + system headers. + +Tue Nov 12 16:31:00 1996 Dawn Perchik + + * libiberty.h: Move prototypes from argv.c here. + +Thu Oct 31 14:56:18 1996 Doug Evans + + * ansidecl.h (VPARAMS,VA_START): Define. + +Fri Oct 25 12:08:04 1996 Ian Lance Taylor + + * dis-asm.h (disassemble_info): Add bytes_per_line field. + (INIT_DISASSEMBLE_INFO_NO_ARCH): Initialize bytes_per_line field. + +Thu Oct 24 17:10:01 1996 Ian Lance Taylor + + * dis-asm.h (disassemble_info): Add symbol field. + (INIT_DISASSEMBLE_INFO_NO_ARCH): Initialize symbol field. + +Thu Oct 17 11:17:40 1996 Doug Evans + + * dis-asm.h (print_insn_m32r): Declare. + +Mon Oct 14 23:56:52 1996 Ian Lance Taylor + + * libiberty.h: Declare parameter types for xmalloc and xrealloc. + +Thu Oct 3 13:45:27 1996 Ian Lance Taylor + + * fnmatch.h: New file. + +Thu Oct 3 10:33:14 1996 Jeffrey A Law (law@cygnus.com) + + * dis-asm.h (print_insn_mn10x00): Delete declaration. + (print_insn_mn10200, print_insn_mn10300): Declare. + +Wed Oct 2 21:24:43 1996 Jeffrey A Law (law@cygnus.com) + + * dis-asm.h (print_insn_mn10x00): Declare. + +Mon Sep 30 13:56:11 1996 Fred Fish + + * libiberty.h: Remove #ifndef PRIVATE_XMALLOC. + +Sat Aug 31 13:27:06 1996 Jeffrey A Law (law@cygnus.com) + + * dis-asm.h (print_insn_v850): Declare. + +Tue Aug 13 16:10:30 1996 Stu Grossman (grossman@critters.cygnus.com) + + * obstack.h: Change bcopy to memcpy. Works better on Posix + systems, which generally lack bcopy. + +Mon Aug 12 17:03:18 1996 Stu Grossman (grossman@critters.cygnus.com) + + * ansidecl.h: Change WIN32 to _WIN32. + +Fri Jul 26 13:58:18 1996 Ian Lance Taylor + + * dis-asm.h: Add flavour field. + (print_insn_alpha): Declare. + (print_insn_alpha_osf, print_insn_alpha_vms): Don't declare. + (INIT_DISASSEMBLE_INFO): Initialize flavour field. + +Tue Jul 23 17:37:58 1996 Fred Fish + + * libiberty.h (PRIVATE_XMALLOC): Enclose xmalloc/xrealloc + definitions inside #ifndef so that programs that want to + can define PRIVATE_XMALLOC and then define xmalloc and + xrealloc anyway they want. + (basename): Document in source that we can't declare the + parameter type because it is declared inconsistently across + different systems. + +Mon Jul 22 13:16:13 1996 Richard Henderson + + * dis-asm.h (print_insn_alpha): Don't declare. + (print_insn_alpha_osf, print_insn_alpha_vms): Declare. + +Wed Jul 17 14:45:12 1996 Martin M. Hunt + + * dis-asm.h: (print_insn_d10v): Declare. + +Mon Jul 15 16:55:38 1996 Stu Grossman (grossman@critters.cygnus.com) + + * dis-asm.h: Get rid of decls for print_insn_i8086, + print_insn_sparc64 and print_insn_sparclite. + * (INIT_DISASSEMBLE_INFO): Split into two pieces. One, + INIT_DISASSEMBLE_INFO_NO_ARCH inits everything except for endian, + mach, and arch. + +Fri Jul 12 10:19:27 1996 Stu Grossman (grossman@critters.cygnus.com) + + * dis-asm.h (print_insn_i8086): Declare. + +Wed Jul 3 16:02:39 1996 Stu Grossman (grossman@critters.cygnus.com) + + * dis-asm.h (print_insn_sparclite): Declare. + +Tue Jun 18 16:02:46 1996 Jeffrey A. Law + + * dis-asm.h (print_insn_h8300s): Declare. + +Tue Jun 18 15:11:33 1996 Klaus Kaempf + + * fopen-vms.h: New file. + +Tue Jun 4 18:58:16 1996 Ian Lance Taylor + + * bfdlink.h (struct bfd_link_info): Add notice_all field. + +Fri Apr 26 10:33:12 1996 Doug Evans + + * demangle.h (#ifdef IN_GCC): #include "gansidecl.h". + (PROTO,PTR,const): Delete. + +Mon Apr 22 17:27:42 1996 Ian Lance Taylor + + * bfdlink.h (struct bfd_link_info): Add traditional_format field. + +Mon Apr 15 15:16:56 1996 Doug Evans + + * libiberty.h (choose_temp_base): Add prototype. + +Tue Mar 12 17:29:46 1996 Ian Lance Taylor + + * bfdlink.h (bfd_wrapped_link_hash_lookup): Declare. + (struct bfd_link_info): Add wrap_hash field. + +Wed Feb 14 16:49:17 1996 Martin Anantharaman + + * ieee.h (ieee_record_enum_type): Define + ieee_external_reference_info_enum. + +Fri Feb 2 17:09:25 1996 Doug Evans + + * dis-asm.h (DISASM_RAW_INSN): Delete. + +Tue Jan 23 09:21:47 1996 Doug Evans + + * dis-asm.h (INIT_DISASSEMBLE_INFO): Set endian to BFD_ENDIAN_UNKNOWN. + New argument FPRINTF_FUNC. + +Mon Jan 22 16:37:59 1996 Doug Evans + + * dis-asm.h (disassemble_info): New members arch, mach, endian. + (INIT_DISASSEMBLE_INFO): Initialize them. + (DISASM_RAW_INSN{,FLAG}): Define. + +Thu Jan 18 11:32:38 1996 Ian Lance Taylor + + * demangle.h (cplus_demangle_opname): Change opname parameter to + const char *. + (cplus_mangle_opname): Change return type and opname parameter to + const char *. + +Fri Jan 5 00:01:22 1996 Ian Lance Taylor + + * ieee.h (enum ieee_record): Add ieee_asn_record_enum, + ieee_at_record_enum, ieee_ty_record_enum, ieee_atn_record_enum, + ieee_bb_record_enum, and ieee_be_record_enum. + +Wed Jan 3 13:12:09 1996 Fred Fish + + * obstack.h: Update copyright to 1996. + (_obstack_memory_used): Declare. + (obstack_memory_used): Define macro. + +Thu Dec 28 11:42:12 1995 Ian Lance Taylor + + * libiberty.h (xstrdup): Declare. + +Thu Dec 21 14:47:17 1995 Michael Meissner + + * wait.h: Protect all macros with #ifndef. + +Tue Oct 24 21:45:40 1995 Ian Lance Taylor + + * bfdlink.h (struct bfd_link_info): Add static_link field. + +Tue Sep 12 16:28:04 1995 Ian Lance Taylor + + * bfdlink.h (struct bfd_link_callbacks): Add symbol parameter to + warning callback. + +Fri Sep 1 13:11:51 1995 Ian Lance Taylor + + * bfdlink.h (struct bfd_link_callbacks): Change warning callback + to take BFD, section, and address arguments. + +Thu Aug 31 16:45:12 1995 steve chamberlain + + * bfdlink.h (struct bfd_link_info): Remove PE stuff. + +Tue Aug 22 03:18:23 1995 Ken Raeburn + + * libiberty.h: Declare xstrerror. From Pat Rankin. + +Mon Aug 21 18:11:36 1995 steve chamberlain + + * bfdlink.h (struct bfd_link_info): Remove PE stuff. + +Wed Aug 2 08:14:12 1995 Doug Evans + + * dis-asm.h (print_insn_sparc64): Declare. + +Mon Jul 10 13:26:49 1995 Eric Youngdale + + * bfdlink.h (struct bfd_link_info): Add new field symbolic. + +Sun Jul 2 17:48:40 1995 Ian Lance Taylor + + * bfdlink.h (struct bfd_link_info): Change type of base_file to + PTR. + +Thu Jun 29 00:02:45 1995 Steve Chamberlain + + * bfdlink.h (struct bfd_link_info): Added base_file member. + +Tue Jun 20 16:40:04 1995 Steve Chamberlain + + * ansidecl.h: win32s is ANSI enough. + +Thu May 18 04:25:50 1995 Ken Raeburn + + Wed May 10 14:28:16 1995 Richard Earnshaw (rearnsha@armltd.co.uk) + + * dis-asm.h (print_insn_arm): Delete declaration. + (print_insn_{little,big}_arm): New declarations. + + * floatformat.h (floatformat_arm_ext): Declare. + +Sat May 13 10:14:08 1995 Steve Chamberlain + + * bfdlink.h (subsytem, stack_heap_parameters): New. + +Thu May 4 14:36:42 1995 Jason Merrill + + * demangle.h: Don't include ansidecl.h if IN_GCC. + +Tue Feb 21 00:37:28 1995 Jeff Law (law@snake.cs.utah.edu) + + * hp-symtab.h: Don't use bitfield enumerations, the HP C compiler + does not handle them correctly. + +Thu Feb 9 14:20:27 1995 Ian Lance Taylor + + * libiberty.h (basename): Don't declare parameter type; some + systems have this in their header files. + +Wed Feb 8 17:35:38 1995 Ian Lance Taylor + + * bfdlink.h (struct bfd_link_hash_entry): Change format of common + symbol information, to remove restrictions on maximum size and + alignment power, by using a pointer to a structure instead. + +Mon Feb 6 14:55:32 1995 Ian Lance Taylor + + * bfdlink.h (enum bfd_link_hash_type): Rename bfd_link_hash_weak + to bfd_link_hash_undefweak. Add bfd_link_hash_defweak. + +Mon Jan 16 21:00:23 1995 Stan Shebs + + * dis-asm.h (GDB_INIT_DISASSEMBLE_INFO, etc): Remove all + GDB-specific definitions. + +Sun Jan 15 18:39:35 1995 Steve Chamberlain + + * dis-asm.h (print_insn_w65): Declare. + +Thu Jan 12 17:51:17 1995 Ken Raeburn + + * libiberty.h (hex_p): Fix sense of test. + +Wed Jan 11 22:36:40 1995 Ken Raeburn + + * libiberty.h (_hex_array_size, _hex_bad, _hex_value, hex_init, + hex_p, hex_value): New macros and declarations, for hex.c. + +Fri Jan 6 17:44:14 1995 Ian Lance Taylor + + * dis-asm.h: Make idempotent. + +Wed Dec 14 13:08:43 1994 Stan Shebs + + * progress.h: New file, empty definitions for progress macros. + +Fri Nov 25 00:14:05 1994 Jeff Law (law@snake.cs.utah.edu) + + * hp-symtab.h: New file describing the debug symbols emitted + by the HP C compilers. + +Fri Nov 11 15:48:37 1994 Ian Lance Taylor + + * bfdlink.h (struct bfd_link_hash_entry): Change u.c.size from 24 + to 26 bits, and change u.c.alignment_power from 8 to 6 bits. 6 + bit in the alignment power is enough for a 64 bit address space. + +Mon Oct 31 13:02:51 1994 Stan Shebs (shebs@andros.cygnus.com) + + * demangle.h (cplus_mangle_opname): Declare. + +Tue Oct 25 11:38:02 1994 Ian Lance Taylor + + * bfdlink.h (struct bfd_link_callbacks): Fix comments for + multiple_common field. + +Sun Sep 04 17:58:10 1994 Richard Earnshaw (rwe@pegasus.esprit.ec.org) + + * dis-asm.h: Add support for the ARM. + +Wed Aug 10 12:51:41 1994 Doug Evans (dje@canuck.cygnus.com) + + * libiberty.h (strsignal): Document its existence even if we + can't declare it. + +Tue Aug 2 14:40:03 1994 Jim Kingdon (kingdon@lioth.cygnus.com) + + * os9k.h: Remove u_int16, u_int32, and owner_id typedefs and + expand their uses. Those names conflict with Mach headers. + +Fri Jul 22 14:17:12 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) + + * bfdlink.h (struct bfd_link_hash_entry): Change u.c.size into a + bitfield. Add field u.c.alignment_power. + +Sun Jul 10 00:26:39 1994 Ian Dall (dall@hfrd.dsto.gov.au) + + * dis-asm.h: Add print_insn_ns32k declaration. + +Mon Jun 20 17:13:29 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) + + * bfdlink.h (bfd_link_hash_table): Make creator a const pointer. + +Sat Jun 18 16:09:32 1994 Stan Shebs (shebs@andros.cygnus.com) + + * demangle.h (cplus_demangle_opname): Declare. + +Thu Jun 16 15:19:03 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * bfdlink.h (struct bfd_link_info): Add new field shared. + +Mon Jun 6 14:39:44 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * bfdlink.h (struct bfd_link_hash_entry): Remove written field: + not needed for all backends. + +Thu Apr 28 19:06:50 1994 Ken Raeburn (raeburn@cujo.cygnus.com) + + * dis-asm.h (disassembler): Declare. + +Fri Apr 1 00:38:17 1994 Jim Wilson (wilson@mole.gnu.ai.mit.edu) + + * obstack.h: Delete use of IN_GCC to control whether + stddef.h or gstddef.h is included. + +Tue Mar 22 13:06:02 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * bfdlink.h (enum bfd_link_order_type): Add bfd_data_link_order. + (struct bfd_link_order): Add data field to union. + +Mon Mar 21 18:45:26 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * bfdlink.h (struct bfd_link_callbacks): Change bitsize argument + to add_to_set to reloc. Remove bitsize argument from constructor. + Comment that reloc_overflow, reloc_dangerous and unattached_reloc + must handle NULL pointers for reloc location. + (enum bfd_link_order_type): Add bfd_section_reloc_link_order and + bfd_symbol_reloc_link_order. + (struct bfd_link_order): Add reloc field to union. + (struct bfd_link_order_reloc): Define. + +Mon Mar 14 12:27:50 1994 Ian Lance Taylor (ian@cygnus.com) + + * ieee-float.h: Removed; no longer used. + +Tue Mar 1 18:10:49 1994 Kung Hsu (kung@mexican.cygnus.com) + + * os9k.h: os9000 target specific header file, the header of the + object file is used now. + +Sun Feb 27 21:52:26 1994 Jim Kingdon (kingdon@deneb.cygnus.com) + + * floatformat.h: New file, intended to replace ieee-float.h. + +Sun Feb 20 17:15:42 1994 Ian Lance Taylor (ian@lisa.cygnus.com) + + * ansidecl.h (ANSI_PROTOTYPES): Define if using ANSI prototypes. + +Wed Feb 16 01:07:12 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * libiberty.h: Don't declare strsignal, to avoid conflicts with + Solaris system header files. + +Sat Feb 12 22:11:32 1994 Jeffrey A. Law (law@snake.cs.utah.edu) + + * libiberty.h (xexit): Use __volatile__ to avoid losing if + compiling with gcc -traditional. + +Thu Feb 10 14:05:41 1994 Ian Lance Taylor (ian@cygnus.com) + + * libiberty.h: New file. Declares functions provided by + libiberty. + +Tue Feb 8 05:19:52 1994 David J. Mackenzie (djm@thepub.cygnus.com) + + Handle obstack_chunk_alloc returning NULL. This allows + obstacks to be used by libraries, without forcing them + to call exit or longjmp. + * obstack.h (struct obstack): Add alloc_failed flag. + _obstack_begin, _obstack_begin_1): Declare to return int, not void. + (obstack_finish): If alloc_failed, return NULL. + (obstack_base, obstack_next_free, objstack_object_size): + If alloc_failed, return 0. + (obstack_grow, obstack_grow0, obstack_1grow, obstack_ptr_grow, + obstack_int_grow, obstack_blank): If alloc_failed, do nothing that + could corrupt the obstack. + +Mon Jan 24 15:06:05 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * bfdlink.h (struct bfd_link_callbacks): Add name, reloc_name and + addend argments to reloc_overflow callback. + +Fri Jan 21 19:13:12 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * dis-asm.h (print_insn_big_powerpc, print_insn_little_powerpc, + print_insn_rs6000): Declare. + +Thu Jan 6 14:15:55 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * bfdlink.h (struct bfd_link_callbacks): Add bitsize argument to + add_to_set field. Add new callback named constructor. + +Thu Dec 30 10:44:06 1993 Ian Lance Taylor (ian@rtl.cygnus.com) + + * bfdlink.h: New file for new BFD linker backend routines. + +Mon Nov 29 10:43:57 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * dis-asm.h (enum dis_insn_tyupe): Remove non-ANSI trailing comma. + +Sat Oct 2 20:42:26 1993 Jim Kingdon (kingdon@lioth.cygnus.com) + + * dis-asm.h: Move comment to right place. + +Mon Aug 9 19:03:35 1993 David J. Mackenzie (djm@thepub.cygnus.com) + + * obstack.h (obstack_chunkfun, obstack_freefun): Add defns from + previous version. Are these Cygnus local changes? + +Fri Aug 6 17:05:47 1993 David J. Mackenzie (djm@thepub.cygnus.com) + + * getopt.h, obstack.h: Update to latest FSF version. + +Mon Aug 2 14:45:29 1993 John Gilmore (gnu@cygnus.com) + + * dis-asm.h: Move enum outside of struct defn to avoid warnings. + +Mon Aug 2 08:49:30 1993 Stu Grossman (grossman at cygnus.com) + + * wait.h (WEXITSTATUS, WSTOPSIG): Mask down to 8 bits. This is + for systems that store stuff into the high 16 bits of a wait + status. + +Fri Jul 30 18:38:02 1993 John Gilmore (gnu@cygnus.com) + + * dis-asm.h: Add new fields insn_info_valid, branch_delay_insns, + data_size, insn_type, target, target2. These are used to return + information from the instruction decoders back to the calling + program. Add comments, make more readable. + +Mon Jul 19 22:14:14 1993 Fred Fish (fnf@deneb.cygnus.com) + + * nlm: New directory containing NLM/NetWare includes. + +Thu Jul 15 12:10:04 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) + + * dis-asm.h (struct disassemble_info): New field application_data. + +Thu Jul 15 12:41:15 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * dis-asm.h: Added declaration of print_insn_m88k. + +Fri Jul 2 10:31:59 1993 Ian Lance Taylor (ian@cygnus.com) + + * ansidecl.h: Use ANSI macros if __mips and _SYSTYPE_SVR4 are + defined, since RISC/OS cc handles ANSI declarations in SVR4 mode + but does not define __STDC__. + +Sun Jun 20 18:27:52 1993 Ken Raeburn (raeburn@poseidon.cygnus.com) + + * dis-asm.h: Don't need to include ansidecl.h any more. + +Fri Jun 18 03:22:10 1993 John Gilmore (gnu@cygnus.com) + + * oasys.h: Eliminate "int8_type", "int16_type", "int32_type", and + their variants. These changes are coordinated with corresponding + changes in ../bfd/oasys.c. + +Wed Jun 16 10:43:08 1993 Fred Fish (fnf@cygnus.com) + + * bfd.h: Note that it has been removed. + +Tue Jun 8 12:16:03 1993 Steve Chamberlain (sac@phydeaux.cygnus.com) + + Support for H8/300-H + * dis-asm.h (print_insn_h8300, print_insn_h8300h): Declare it. + +Tue Jun 1 07:35:03 1993 Ken Raeburn (raeburn@kr-pc.cygnus.com) + + * ansidecl.h (const): Don't define it if it's already defined. + +Thu May 27 18:19:51 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) + + * dis-asm.h (print_insn_hppa): Declare it. + + * bfd.h: Moved to bfd directory. Small stub here includes it + without requiring "-I../bfd". + +Thu Apr 29 12:06:13 1993 Ken Raeburn (raeburn@deneb.cygnus.com) + + * bfd.h: Updated with BSF_FUNCTION. + +Mon Apr 26 18:15:50 1993 Steve Chamberlain (sac@thepub.cygnus.com) + + * bfd.h, dis-asm.h: Updated with Hitachi SH. + +Fri Apr 23 18:41:38 1993 Steve Chamberlain (sac@thepub.cygnus.com) + + * bfd.h: Updated with alpha changes. + * dis-asm.h: Added alpha. + +Fri Apr 16 17:35:30 1993 Jim Kingdon (kingdon@cygnus.com) + + * bfd.h: Update for signed bfd_*get_*. + +Thu Apr 15 09:24:21 1993 Jim Kingdon (kingdon@cygnus.com) + + * bfd.h: Updated for file_truncated error. + +Thu Apr 8 10:53:47 1993 Ian Lance Taylor (ian@cygnus.com) + + * ansidecl.h: If no ANSI, define const to be empty. + +Thu Apr 1 09:00:10 1993 Jim Kingdon (kingdon@cygnus.com) + + * dis-asm.h: Declare a29k and i960 print_insn_*. + + * dis-asm.h: Add print_address_func and related stuff. + + * dis-asm.h (dis_asm_read_memory): Fix prototype. + +Wed Mar 31 17:40:16 1993 Jim Kingdon (kingdon@lioth.cygnus.com) + + * dis-asm.h: Add print_insn_sparc. + +Wed Mar 31 17:51:42 1993 Ian Lance Taylor (ian@cygnus.com) + + * bfd.h: Updated for BFD_RELOC_MIPS_GPREL and bfd_[gs]et_gp_size + prototypes. + +Wed Mar 31 16:35:12 1993 Stu Grossman (grossman@cygnus.com) + + * dis-asm.h: (disassemble_info): Fix typo in prototype of + dis_asm_memory_error(). + +Tue Mar 30 19:09:23 1993 Jim Kingdon (kingdon@lioth.cygnus.com) + + * dis-asm.h (disassembler_info): Add read_memory_func, + memory_error_func, buffer, and length. + ({GDB_,}INIT_DISASSEMBLE_INFO): Set them. + print_insn_*: Remove second argument. + +Tue Mar 30 14:48:55 1993 Steve Chamberlain (sac@thepub.cygnus.com) + + * bfd.h: Update for lma field of section. + +Tue Mar 30 12:22:55 1993 Jim Kingdon (kingdon@cygnus.com) + + * ansidecl.h: Use ANSI versions on AIX regardless of __STDC__. + +Fri Mar 19 14:49:49 1993 Steve Chamberlain (sac@thepub.cygnus.com) + + * dis-asm.h: Add h8500. + +Thu Mar 18 13:49:09 1993 Per Bothner (bothner@rtl.cygnus.com) + + * ieee-float.h: Moved from ../gdb. + * dis-asm.h: New file. Interface to dis-assembler. + +Thu Mar 11 10:52:57 1993 Fred Fish (fnf@cygnus.com) + + * demangle.h (DMGL_NO_OPTS): Add define (set to 0) to use + in place of bare 0, for readability reasons. + +Tue Mar 2 17:50:11 1993 Fred Fish (fnf@cygnus.com) + + * demangle.h: Replace all references to cfront with ARM. + +Tue Feb 23 12:21:14 1993 Ian Lance Taylor (ian@cygnus.com) + + * bfd.h: Update for new elements in JUMP_TABLE. + +Tue Feb 16 00:51:30 1993 John Gilmore (gnu@cygnus.com) + + * bfd.h: Update for BFD_VERSION 2.1. + +Tue Jan 26 11:49:20 1993 Ian Lance Taylor (ian@cygnus.com) + + * bfd.h: Update for SEC_IS_COMMON flag. + +Tue Jan 19 12:25:12 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * bfd.h: Update for bfd_asymbol_value bug fix. + +Fri Jan 8 16:37:18 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * bfd.h: Update to include ECOFF tdata and target_flavour. + +Sun Dec 27 17:52:30 1992 Fred Fish (fnf@cygnus.com) + + * bfd.h: Add declaration for bfd_get_size(). + +Tue Dec 22 22:42:46 1992 Fred Fish (fnf@cygnus.com) + + * demangle.h: Protect file from multiple inclusions with + #if !defined(DEMANGLE_H)...#define DEMANGLE_H...#endif. + +Mon Dec 21 21:25:50 1992 Stu Grossman (grossman at cygnus.com) + + * bfd.h: Update to get hppa_core_struct from bfd.c. + +Thu Dec 17 00:42:35 1992 John Gilmore (gnu@cygnus.com) + + * bfd.h: Update to get tekhex tdata name change from bfd. + +Mon Nov 9 23:55:42 1992 John Gilmore (gnu@cygnus.com) + + * ansidecl.h: Update comments to discourage use of EXFUN. + +Thu Nov 5 16:35:44 1992 Ian Lance Taylor (ian@cygnus.com) + + * bfd.h: Update to bring in SEC_SHARED_LIBRARY. + +Thu Nov 5 03:21:32 1992 John Gilmore (gnu@cygnus.com) + + * bfd.h: Update to match EXFUN, bfd_seclet_struct, and SDEF + cleanups in bfd. + +Wed Nov 4 07:28:05 1992 Ken Raeburn (raeburn@cygnus.com) + + * bout.h (N_CALLNAME, N_BALNAME): Define as char-type values, so + widening works consistently. + +Fri Oct 16 03:17:08 1992 John Gilmore (gnu@cygnus.com) + + * getopt.h: Update to Revised Standard FSF Version. + +Thu Oct 15 21:43:22 1992 K. Richard Pixley (rich@sendai.cygnus.com) + + * getopt.h (struct option): use the provided enum for has_arg. + + * demangle.h (AUTO_DEMANGLING, GNU_DEMANGLING, + LUCID_DEMANGLING): ultrix compilers require enums to be + enums and ints to be ints and casts where they meet. cast some + enums into ints. + +Thu Oct 15 04:35:51 1992 John Gilmore (gnu@cygnus.com) + + * bfd.h: Update after comment changes. + +Thu Oct 8 09:03:02 1992 Steve Chamberlain (sac@thepub.cygnus.com) + + * bfd.h (bfd_get_symbol_leading_char): new macro for getting in xvec + +Thu Sep 3 09:10:50 1992 Stu Grossman (grossman at cygnus.com) + + * bfd.h (struct reloc_howto_struct): size needs to be signed if + it's going to hold negative values. + +Sun Aug 30 17:50:27 1992 Per Bothner (bothner@rtl.cygnus.com) + + * demangle.h: New file, moved from ../gdb. Made independent + of gdb. Allow demangling style option to be passed as a + parameter to cplus_demangle(), but using the + current_demangling_style global as the default. + +Sat Aug 29 10:07:55 1992 Fred Fish (fnf@cygnus.com) + + * obstack.h: Merge comment change from current FSF version. + +Thu Aug 27 12:59:29 1992 Brendan Kehoe (brendan@cygnus.com) + + * bfd.h: add we32k + +Tue Aug 25 15:07:47 1992 Steve Chamberlain (sac@thepub.cygnus.com) + + * bfd.h: new after Z8000 stuff + +Mon Aug 17 09:01:23 1992 Ken Raeburn (raeburn@cygnus.com) + + * bfd.h: Regenerated after page/segment size changes. + +Sat Aug 1 13:46:31 1992 Fred Fish (fnf@cygnus.com) + + * obstack.h: Merge changes from current FSF version. + +Mon Jul 20 21:06:23 1992 Fred Fish (fnf@cygnus.com) + + * obstack.h (area_id, flags): Remove, replace with extra_arg, + use_extra_arg, and maybe_empty_object. + * obstack.h (OBSTACK_MAYBE_EMPTY_OBJECT, OBSTACK_MMALLOC_LIKE): + Remove, replaced by maybe_empty_object and use_extra_arg bitfields. + * obstack.h (obstack_full_begin, _obstack_begin): Remove area_id + and flags arguments. + * obstack.h (obstack_alloc_arg): New macro to set extra_arg. + +Thu Jul 16 08:12:44 1992 Steve Chamberlain (sac@thepub.cygnus.com) + + * bfd.h: new after adding BFD_IS_RELAXABLE + +Sat Jul 4 03:22:23 1992 John Gilmore (gnu at cygnus.com) + + * bfd.h: Regen after adding BSF_FILE. + +Mon Jun 29 14:18:36 1992 Fred Fish (fnf at sunfish) + + * obstack.h: Convert bcopy() use to memcpy(), which is more + portable, more standard, and can take advantage of gcc's builtin + functions for increased performance. + +Thu Jun 25 04:46:08 1992 John Gilmore (gnu at cygnus.com) + + * ansidecl.h (PARAMS): Incorporate this macro from gdb's defs.h. + It's a cleaner way to forward-declare function prototypes. + +Fri Jun 19 15:46:32 1992 Stu Grossman (grossman at cygnus.com) + + * bfd.h: HPPA merge. + +Tue Jun 16 21:30:56 1992 K. Richard Pixley (rich@cygnus.com) + + * getopt.h: gratuitous white space changes merged from other prep + releases. + +Thu Jun 11 01:10:55 1992 John Gilmore (gnu at cygnus.com) + + * bfd.h: Regen'd from bfd.c after removing elf_core_tdata_struct. + +Mon May 18 17:29:03 1992 K. Richard Pixley (rich@cygnus.com) + + * getopt.h: merged changes from make-3.62.11. + + * getopt.h: merged changes from grep-1.6 (alpha). + +Fri May 8 14:53:32 1992 K. Richard Pixley (rich@cygnus.com) + + * getopt.h: merged changes from bison-1.18. + +Sat Mar 14 17:25:20 1992 Fred Fish (fnf@cygnus.com) + + * obstack.h: Add "area_id" and "flags" members to obstack + structure. Add obstack_chunkfun() and obstack_freefun() to + set functions explicitly. Convert maybe_empty_object to + a bit in "flags". + +Thu Feb 27 22:01:02 1992 Per Bothner (bothner@cygnus.com) + + * wait.h (WIFSTOPPED): Add IBM rs6000-specific version. + +Fri Feb 21 20:49:20 1992 John Gilmore (gnu at cygnus.com) + + * obstack.h: Add obstack_full_begin. + * bfd.h, obstack.h: Protolint. + +Thu Jan 30 01:18:42 1992 John Gilmore (gnu at cygnus.com) + + * bfd.h: Remove comma from enum declaration. + +Mon Jan 27 22:01:13 1992 Steve Chamberlain (sac at cygnus.com) + + * bfd.h : new target entr, bfd_relax_section + +Wed Dec 18 17:19:44 1991 Stu Grossman (grossman at cygnus.com) + + * bfd.h, ieee.h: ANSIfy enums. + +Thu Dec 12 20:59:56 1991 John Gilmore (gnu at cygnus.com) + + * fopen-same.h, fopen-bin.h: New files for configuring + whether fopen distinguishes binary files or not. For use + by host-dependent config files. + +Sat Nov 30 20:46:43 1991 Steve Chamberlain (sac at rtl.cygnus.com) + + * bfd.h: change the documentation format. + + * created coff, elf and opcode and aout directories. Moved: + + aout64.h ==> aout/aout64.h + ar.h ==> aout/ar.h + a.out.encap.h ==> aout/encap.h + a.out.host.h ==> aout/host.h + a.out.hp.h ==> aout/hp.h + a.out.sun4.h ==> aout/sun4.h + ranlib.h ==> aout/ranlib.h + reloc.h ==> aout/reloc.h + stab.def ==> aout/stab.def + stab.gnu.h ==> aout/stab_gnu.h + + coff-a29k.h ==> coff/a29k.h + coff-h8300.h ==> coff/h8300.h + coff-i386.h ==> coff/i386.h + coff-i960.h ==> coff/i960.h + internalcoff.h ==> coff/internal.h + coff-m68k.h ==> coff/m68k.h + coff-m88k.h ==> coff/m88k.h + coff-mips.h ==> coff/mips.h + coff-rs6000.h ==> coff/rs6000.h + + elf-common.h ==> elf/common.h + dwarf.h ==> elf/dwarf.h + elf-external.h ==> elf/external.h + elf-internal.h ==> elf/internal.h + + a29k-opcode.h ==> opcode/a29k.h + arm-opcode.h ==> opcode/arm.h + h8300-opcode.h ==> opcode/h8300.h + i386-opcode.h ==> opcode/i386.h + i860-opcode.h ==> opcode/i860.h + i960-opcode.h ==> opcode/i960.h + m68k-opcode.h ==> opcode/m68k.h + m88k-opcode.h ==> opcode/m88k.h + mips-opcode.h ==> opcode/mips.h + np1-opcode.h ==> opcode/np1.h + ns32k-opcode.h ==> opcode/ns32k.h + pn-opcode.h ==> opcode/pn.h + pyr-opcode.h ==> opcode/pyr.h + sparc-opcode.h ==> opcode/sparc.h + tahoe-opcode.h ==> opcode/tahoe.h + vax-opcode.h ==> opcode/vax.h + + + +Wed Nov 27 10:38:31 1991 Steve Chamberlain (sac at rtl.cygnus.com) + + * internalcoff.h: (internal_scnhdr) took out #def dependency, now + s_nreloc and s_nlnno are always long. (internal_reloc): allways + has an offset field now. + +Fri Nov 22 08:12:58 1991 John Gilmore (gnu at cygnus.com) + + * coff-rs6000.h: Lint; use unsigned chars for external fields. + * internalcoff.h: Lint; cast storage classes to signed char. + +Thu Nov 21 21:01:05 1991 Per Bothner (bothner at cygnus.com) + + * stab.def: Remove the GNU extended type codes (e.g. N_SETT). + * aout64.h: The heuristic for distinguishing between + sunos-style and bsd-style ZMAGIC files (wrt. where the + text segment starts) is moved into (the default definition of) + the macro N_HEADER_IN_TEXT. This definition is only used + if no other definition is used - e.g. bfd/newsos3.c defines + N_HEADER_IN_TEXT(x) to be always 0 (as before). + +Thu Nov 21 11:53:03 1991 John Gilmore (gnu at cygnus.com) + + * aout64.h (N_TXTADDR, N_TXTOFF, N_TXTSIZE): New definitions + that should handle all uses. LOGICAL_ versions deleted. + Eliminate N_HEADER_IN_TEXT, using a_entry to determine which + kind of zmagic a.out file we are looking at. + * coff-rs6000.h: Typo. + +Tue Nov 19 18:43:37 1991 Per Bothner (bothner at cygnus.com) + + (Note: This is a revised entry, as was aout64.h.) + * aout64.h: Some cleanups of N_TXTADDR and N_TXTOFF: + Will now work for both old- and new-style ZMAGIC files, + depending on N_HEADER_IN_TEXT macro. + Add LOGICAL_TXTADDR, LOICAL_TXTOFF and LOGICAL_TXTSIZE + that don't count the exec header as part + of the text segment, to be consistent with bfd. + * a.out.sun4.h: Simplified/fixed for previous change. + +Mon Nov 18 00:02:06 1991 Fred Fish (fnf at cygnus.com) + + * dwarf.h: Update to DWARF draft 5 version from gcc2. + +Thu Nov 14 19:44:59 1991 Per Bothner (bothner at cygnus.com) + + * stab.def: Added defs for extended GNU symbol types, + such as N_SETT. These are normally ifdef'd out (because + of conflicts with a.out.gnu.h), but are used by bfb_stab_name(). + +Thu Nov 14 19:17:03 1991 Fred Fish (fnf at cygnus.com) + + * elf-common.h: Add defines to support ELF symbol table code. + +Mon Nov 11 19:01:06 1991 Fred Fish (fnf at cygnus.com) + + * elf-internal.h, elf-external.h, elf-common.h: Add support for + note sections, which are used in ELF core files to hold copies + of various /proc structures. + +Thu Nov 7 08:58:26 1991 Steve Chamberlain (sac at cygnus.com) + + * internalcoff.h: took out the M88 dependency in the lineno + struct. + * coff-m88k.h: defines GET_LINENO_LNNO and PUT_LINENO_LNNO to use + 32bit linno entries. + * a29k-opcode.h: fixed encoding of mtacc + +Sun Nov 3 11:54:22 1991 Per Bothner (bothner at cygnus.com) + + * bfd.h: Updated from ../bfd/bfd-in.h (q.v). + +Fri Nov 1 11:13:53 1991 John Gilmore (gnu at cygnus.com) + + * internalcoff.h: Add x_csect defines. + +Fri Oct 25 03:18:20 1991 John Gilmore (gnu at cygnus.com) + + * Rename COFF-related files in `coff-ARCH.h' form. + coff-a29k.h, coff-i386.h, coff-i960.h, coff-m68k.h, coff-m88k.h, + coff-mips.h, coff-rs6000.h to be exact. + +Thu Oct 24 22:11:11 1991 John Gilmore (gnu at cygnus.com) + + RS/6000 support, by Metin G. Ozisik, Mimi Phûông-Thåo Võ, and + John Gilmore. + + * a.out.gnu.h: Update slightly. + * bfd.h: Add new error code, fix doc, add bfd_arch_rs6000. + * internalcoff.h: Add more F_ codes for filehdr. Add + rs/6000-dependent fields to aouthdr. Add storage classes + to syments. Add 6000-specific auxent. Add r_size in reloc. + * rs6000coff.c: New file. + +Thu Oct 24 04:13:20 1991 Fred Fish (fnf at cygnus.com) + + * dwarf.h: New file for dwarf support. Copied from gcc2 + distribution. + +Wed Oct 16 13:31:45 1991 John Gilmore (gnu at cygnus.com) + + * aout64.h: Remove PAGE_SIZE defines; they are target-dependent. + Add N_FN_SEQ for N_FN symbol type used on Sequent machines. + * stab.def: Include N_FN_SEQ in table. + * bout.h: External formats of structures use unsigned chars. + +Fri Oct 11 12:40:43 1991 Steve Chamberlain (steve at cygnus.com) + + * bfd.h:upgrade from bfd.c + * internalcoff.h: add n_name, n_zeroes and n_offset macros + * amdcoff.h: Define OMAGIC and AOUTHDRSZ. + +Fri Oct 11 10:58:06 1991 Per Bothner (bothner at cygnus.com) + + * a.out.host.h: Change SEGMENT_SIZE to 0x1000 for Sony. + * bfd.h (align_power): Add (actually move) comment. + +Tue Oct 8 15:29:32 1991 Per Bothner (bothner at cygnus.com) + + * sys/h-rtbsd.h: Define MISSING_VFPRINT (for binutils/bucomm.c). + +Sun Oct 6 19:24:39 1991 John Gilmore (gnu at cygnus.com) + + * aout64.h: Move struct internal_exec to ../bfd/libaout.h so + it can be shared by all `a.out-family' code. Rename + EXTERNAL_LIST_SIZE to EXTERNAL_NLIST_SIZE. Use basic types + for nlist members, and make strx integral rather than pointer. + More commentary on n_type values. + * bout.h: Provide a struct external_exec rather than an + internal_exec. + * m68kcoff.h: Remove `tagentries' which snuck in from the i960 + COFF port. + +Fri Oct 4 01:25:59 1991 John Gilmore (gnu at cygnus.com) + + * h8300-opcode.h: Remove `_enum' from the typedef for an enum. + * bfd.h: Update to match bfd changes. + + * sys/h-i386mach.h, sysdep.h: Add 386 Mach host support. + +Tue Oct 1 04:58:42 1991 John Gilmore (gnu at cygnus.com) + + * bfd.h, elf-common.h, elf-external.h, elf-internal.h: + Add preliminary ELF support, sufficient for GDB, from Fred Fish. + * sysdep.h, sys/h-amix.h: Support Amiga SVR4. + + * sys/h-vaxult.h: Make it work. (David Taylor ) + * a.out.vax.h: Remove unused and confusing file. + +Mon Sep 30 12:52:35 1991 Per Bothner (bothner at cygnus.com) + + * sysdep.h: Define NEWSOS3_SYS, and use it. + +Fri Sep 20 13:38:21 1991 John Gilmore (gnu at cygnus.com) + + * a.out.gnu.h (N_FN): Its value *really is* 0x1F. + Fix it, and add comments warning about or-ing N_EXT with it + and/or N_WARNING. + * aout64.h (N_FN): Fix value, add comments about N_EXT. + * stab.def (table at end): Update to show all the type + values <0x20, including low order bits. Move N_FN to + its rightful place. + +Tue Sep 17 17:41:37 1991 Stu Grossman (grossman at cygnus.com) + + * sys/h-irix3.h: sgi/irix support. + +Tue Sep 17 07:52:59 1991 John Gilmore (gnu at cygint.cygnus.com) + + * stab.def (N_DEFD): Add GNU Modula-2 debug stab, from Andrew + Beers. + +Thu Sep 12 14:12:59 1991 John Gilmore (gnu at cygint.cygnus.com) + + * internalcoff.h (SYMNMLEN, FILNMLEN, DIMNUM): Define these + for internalcoff, separately from the various external coff's. + * amdcoff.h, bcs88kcoff.h, i386coff.h, intel-coff.h, m68kcoff.h, + m88k-bcs.h: Prefix SYMNMLEN, FILNMLEN, and DIMNUM with E_'s for + the external struct definitions. + * ecoff.h: Remove these #define's, kludge no longer needed. + + * sys/h-ultra3.h: Add new Ultracomputer host. + * sysdep.h: Add ULTRA3_SYM1_SYS and use it. + +Tue Sep 10 10:11:46 1991 John Gilmore (gnu at cygint.cygnus.com) + + * i386coff.h (LINESZ): Always 6, not based on sizeof(). + (Fix from Peter Schauer .) + +Wed Sep 4 08:58:37 1991 John Gilmore (gnu at cygint.cygnus.com) + + * a.out.gnu.h, aout64.h: Add N_WARNING. Change N_FN to 0x0E, + to match SunOS and BSD. Add N_COMM as 0x12 for SunOS shared lib + support. + * stab.def: Add N_COMM to table, fix overlap comment. + +Tue Sep 3 06:29:20 1991 John Gilmore (gnu at cygint.cygnus.com) + + Merge with latest FSF versions of these files. + + * stab.gnu.h: Add LAST_UNUSED_STAB_CODE. + * stab.def: Update to GPL2. Move N_WARNING out, since not a + debug symbol. Change comments, and reorder table to numeric + order. Update final table comment. + (N_DSLINE, N_BSLINE): Renumber from 0x66 and 0x68, to 0x46 and 0x48. + + * obstack.h: GPL2. Merge. + +Fri Aug 23 01:54:23 1991 John Gilmore (gnu at cygint.cygnus.com) + + * a.out.gnu.h, a.out.sun4.h: Make SEGMENT_SIZE able to depend + on the particular a.out being examined. + * a.out.sun4.h: Define segment sizes for Sun-3's and Sun-4's. + * FIXME: a.out.gnu.h is almost obsolete. + * FIXME: a.out.sun4.h should be renamed a.out.sun.h now. + +Wed Aug 21 20:32:13 1991 John Gilmore (gnu at cygint.cygnus.com) + + * Start a ChangeLog for the includes directory. + + * a.out.gnu.h (N_FN): Fix value -- was 15, should be 0x1E. + * stab.def: Update allocation table in comments at end, + to reflect reality as I know it. + + +Local Variables: +mode: change-log +left-margin: 8 +fill-column: 74 +version-control: never +End: diff --git a/include/ansidecl.h b/include/ansidecl.h new file mode 100644 index 0000000..c19955a --- /dev/null +++ b/include/ansidecl.h @@ -0,0 +1,393 @@ +/* ANSI and traditional C compatability macros + Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + +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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* ANSI and traditional C compatibility macros + + ANSI C is assumed if __STDC__ is #defined. + + Macro ANSI C definition Traditional C definition + ----- ---- - ---------- ----------- - ---------- + ANSI_PROTOTYPES 1 not defined + PTR `void *' `char *' + PTRCONST `void *const' `char *' + LONG_DOUBLE `long double' `double' + const not defined `' + volatile not defined `' + signed not defined `' + VA_START(ap, var) va_start(ap, var) va_start(ap) + + Note that it is safe to write "void foo();" indicating a function + with no return value, in all K+R compilers we have been able to test. + + For declaring functions with prototypes, we also provide these: + + PARAMS ((prototype)) + -- for functions which take a fixed number of arguments. Use this + when declaring the function. When defining the function, write a + K+R style argument list. For example: + + char *strcpy PARAMS ((char *dest, char *source)); + ... + char * + strcpy (dest, source) + char *dest; + char *source; + { ... } + + + VPARAMS ((prototype, ...)) + -- for functions which take a variable number of arguments. Use + PARAMS to declare the function, VPARAMS to define it. For example: + + int printf PARAMS ((const char *format, ...)); + ... + int + printf VPARAMS ((const char *format, ...)) + { + ... + } + + For writing functions which take variable numbers of arguments, we + also provide the VA_OPEN, VA_CLOSE, and VA_FIXEDARG macros. These + hide the differences between K+R and C89 more + thoroughly than the simple VA_START() macro mentioned above. + + VA_OPEN and VA_CLOSE are used *instead of* va_start and va_end. + Immediately after VA_OPEN, put a sequence of VA_FIXEDARG calls + corresponding to the list of fixed arguments. Then use va_arg + normally to get the variable arguments, or pass your va_list object + around. You do not declare the va_list yourself; VA_OPEN does it + for you. + + Here is a complete example: + + int + printf VPARAMS ((const char *format, ...)) + { + int result; + + VA_OPEN (ap, format); + VA_FIXEDARG (ap, const char *, format); + + result = vfprintf (stdout, format, ap); + VA_CLOSE (ap); + + return result; + } + + + You can declare variables either before or after the VA_OPEN, + VA_FIXEDARG sequence. Also, VA_OPEN and VA_CLOSE are the beginning + and end of a block. They must appear at the same nesting level, + and any variables declared after VA_OPEN go out of scope at + VA_CLOSE. Unfortunately, with a K+R compiler, that includes the + argument list. You can have multiple instances of VA_OPEN/VA_CLOSE + pairs in a single function in case you need to traverse the + argument list more than once. + + For ease of writing code which uses GCC extensions but needs to be + portable to other compilers, we provide the GCC_VERSION macro that + simplifies testing __GNUC__ and __GNUC_MINOR__ together, and various + wrappers around __attribute__. Also, __extension__ will be #defined + to nothing if it doesn't work. See below. + + This header also defines a lot of obsolete macros: + CONST, VOLATILE, SIGNED, PROTO, EXFUN, DEFUN, DEFUN_VOID, + AND, DOTS, NOARGS. Don't use them. */ + +#ifndef _ANSIDECL_H +#define _ANSIDECL_H 1 + +/* Every source file includes this file, + so they will all get the switch for lint. */ +/* LINTLIBRARY */ + +/* Using MACRO(x,y) in cpp #if conditionals does not work with some + older preprocessors. Thus we can't define something like this: + +#define HAVE_GCC_VERSION(MAJOR, MINOR) \ + (__GNUC__ > (MAJOR) || (__GNUC__ == (MAJOR) && __GNUC_MINOR__ >= (MINOR))) + +and then test "#if HAVE_GCC_VERSION(2,7)". + +So instead we use the macro below and test it against specific values. */ + +/* This macro simplifies testing whether we are using gcc, and if it + is of a particular minimum version. (Both major & minor numbers are + significant.) This macro will evaluate to 0 if we are not using + gcc at all. */ +#ifndef GCC_VERSION +#define GCC_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__) +#endif /* GCC_VERSION */ + +#if defined (__STDC__) || defined (_AIX) || (defined (__mips) && defined (_SYSTYPE_SVR4)) || defined(_WIN32) || (defined(__alpha) && defined(__cplusplus)) +/* All known AIX compilers implement these things (but don't always + define __STDC__). The RISC/OS MIPS compiler defines these things + in SVR4 mode, but does not define __STDC__. */ +/* eraxxon@alumni.rice.edu: The Compaq C++ compiler, unlike many other + C++ compilers, does not define __STDC__, though it acts as if this + was so. (Verified versions: 5.7, 6.2, 6.3, 6.5) */ + +#define ANSI_PROTOTYPES 1 +#define PTR void * +#define PTRCONST void *const +#define LONG_DOUBLE long double + +/* PARAMS is often defined elsewhere (e.g. by libintl.h), so wrap it in + a #ifndef. */ +#ifndef PARAMS +#define PARAMS(ARGS) ARGS +#endif + +#define VPARAMS(ARGS) ARGS +#define VA_START(VA_LIST, VAR) va_start(VA_LIST, VAR) + +/* variadic function helper macros */ +/* "struct Qdmy" swallows the semicolon after VA_OPEN/VA_FIXEDARG's + use without inhibiting further decls and without declaring an + actual variable. */ +#define VA_OPEN(AP, VAR) { va_list AP; va_start(AP, VAR); { struct Qdmy +#define VA_CLOSE(AP) } va_end(AP); } +#define VA_FIXEDARG(AP, T, N) struct Qdmy + +#undef const +#undef volatile +#undef signed + +/* inline requires special treatment; it's in C99, and GCC >=2.7 supports + it too, but it's not in C89. */ +#undef inline +#if __STDC_VERSION__ > 199901L +/* it's a keyword */ +#else +# if GCC_VERSION >= 2007 +# define inline __inline__ /* __inline__ prevents -pedantic warnings */ +# else +# define inline /* nothing */ +# endif +#endif + +/* These are obsolete. Do not use. */ +#ifndef IN_GCC +#define CONST const +#define VOLATILE volatile +#define SIGNED signed + +#define PROTO(type, name, arglist) type name arglist +#define EXFUN(name, proto) name proto +#define DEFUN(name, arglist, args) name(args) +#define DEFUN_VOID(name) name(void) +#define AND , +#define DOTS , ... +#define NOARGS void +#endif /* ! IN_GCC */ + +#else /* Not ANSI C. */ + +#undef ANSI_PROTOTYPES +#define PTR char * +#define PTRCONST PTR +#define LONG_DOUBLE double + +#define PARAMS(args) () +#define VPARAMS(args) (va_alist) va_dcl +#define VA_START(va_list, var) va_start(va_list) + +#define VA_OPEN(AP, VAR) { va_list AP; va_start(AP); { struct Qdmy +#define VA_CLOSE(AP) } va_end(AP); } +#define VA_FIXEDARG(AP, TYPE, NAME) TYPE NAME = va_arg(AP, TYPE) + +/* some systems define these in header files for non-ansi mode */ +#undef const +#undef volatile +#undef signed +#undef inline +#define const +#define volatile +#define signed +#define inline + +#ifndef IN_GCC +#define CONST +#define VOLATILE +#define SIGNED + +#define PROTO(type, name, arglist) type name () +#define EXFUN(name, proto) name() +#define DEFUN(name, arglist, args) name arglist args; +#define DEFUN_VOID(name) name() +#define AND ; +#define DOTS +#define NOARGS +#endif /* ! IN_GCC */ + +#endif /* ANSI C. */ + +/* Define macros for some gcc attributes. This permits us to use the + macros freely, and know that they will come into play for the + version of gcc in which they are supported. */ + +#if (GCC_VERSION < 2007) +# define __attribute__(x) +#endif + +/* Attribute __malloc__ on functions was valid as of gcc 2.96. */ +#ifndef ATTRIBUTE_MALLOC +# if (GCC_VERSION >= 2096) +# define ATTRIBUTE_MALLOC __attribute__ ((__malloc__)) +# else +# define ATTRIBUTE_MALLOC +# endif /* GNUC >= 2.96 */ +#endif /* ATTRIBUTE_MALLOC */ + +/* Attributes on labels were valid as of gcc 2.93. */ +#ifndef ATTRIBUTE_UNUSED_LABEL +# if (!defined (__cplusplus) && GCC_VERSION >= 2093) +# define ATTRIBUTE_UNUSED_LABEL ATTRIBUTE_UNUSED +# else +# define ATTRIBUTE_UNUSED_LABEL +# endif /* !__cplusplus && GNUC >= 2.93 */ +#endif /* ATTRIBUTE_UNUSED_LABEL */ + +#ifndef ATTRIBUTE_UNUSED +#define ATTRIBUTE_UNUSED __attribute__ ((__unused__)) +#endif /* ATTRIBUTE_UNUSED */ + +/* Before GCC 3.4, the C++ frontend couldn't parse attributes placed after the + identifier name. */ +#if ! defined(__cplusplus) || (GCC_VERSION >= 3004) +# define ARG_UNUSED(NAME) NAME ATTRIBUTE_UNUSED +#else /* !__cplusplus || GNUC >= 3.4 */ +# define ARG_UNUSED(NAME) NAME +#endif /* !__cplusplus || GNUC >= 3.4 */ + +#ifndef ATTRIBUTE_NORETURN +#define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__)) +#endif /* ATTRIBUTE_NORETURN */ + +/* Attribute `nonnull' was valid as of gcc 3.3. */ +#ifndef ATTRIBUTE_NONNULL +# if (GCC_VERSION >= 3003) +# define ATTRIBUTE_NONNULL(m) __attribute__ ((__nonnull__ (m))) +# else +# define ATTRIBUTE_NONNULL(m) +# endif /* GNUC >= 3.3 */ +#endif /* ATTRIBUTE_NONNULL */ + +/* Attribute `pure' was valid as of gcc 3.0. */ +#ifndef ATTRIBUTE_PURE +# if (GCC_VERSION >= 3000) +# define ATTRIBUTE_PURE __attribute__ ((__pure__)) +# else +# define ATTRIBUTE_PURE +# endif /* GNUC >= 3.0 */ +#endif /* ATTRIBUTE_PURE */ + +/* Use ATTRIBUTE_PRINTF when the format specifier must not be NULL. + This was the case for the `printf' format attribute by itself + before GCC 3.3, but as of 3.3 we need to add the `nonnull' + attribute to retain this behavior. */ +#ifndef ATTRIBUTE_PRINTF +#define ATTRIBUTE_PRINTF(m, n) __attribute__ ((__format__ (__printf__, m, n))) ATTRIBUTE_NONNULL(m) +#define ATTRIBUTE_PRINTF_1 ATTRIBUTE_PRINTF(1, 2) +#define ATTRIBUTE_PRINTF_2 ATTRIBUTE_PRINTF(2, 3) +#define ATTRIBUTE_PRINTF_3 ATTRIBUTE_PRINTF(3, 4) +#define ATTRIBUTE_PRINTF_4 ATTRIBUTE_PRINTF(4, 5) +#define ATTRIBUTE_PRINTF_5 ATTRIBUTE_PRINTF(5, 6) +#endif /* ATTRIBUTE_PRINTF */ + +/* Use ATTRIBUTE_FPTR_PRINTF when the format attribute is to be set on + a function pointer. Format attributes were allowed on function + pointers as of gcc 3.1. */ +#ifndef ATTRIBUTE_FPTR_PRINTF +# if (GCC_VERSION >= 3001) +# define ATTRIBUTE_FPTR_PRINTF(m, n) ATTRIBUTE_PRINTF(m, n) +# else +# define ATTRIBUTE_FPTR_PRINTF(m, n) +# endif /* GNUC >= 3.1 */ +# define ATTRIBUTE_FPTR_PRINTF_1 ATTRIBUTE_FPTR_PRINTF(1, 2) +# define ATTRIBUTE_FPTR_PRINTF_2 ATTRIBUTE_FPTR_PRINTF(2, 3) +# define ATTRIBUTE_FPTR_PRINTF_3 ATTRIBUTE_FPTR_PRINTF(3, 4) +# define ATTRIBUTE_FPTR_PRINTF_4 ATTRIBUTE_FPTR_PRINTF(4, 5) +# define ATTRIBUTE_FPTR_PRINTF_5 ATTRIBUTE_FPTR_PRINTF(5, 6) +#endif /* ATTRIBUTE_FPTR_PRINTF */ + +/* Use ATTRIBUTE_NULL_PRINTF when the format specifier may be NULL. A + NULL format specifier was allowed as of gcc 3.3. */ +#ifndef ATTRIBUTE_NULL_PRINTF +# if (GCC_VERSION >= 3003) +# define ATTRIBUTE_NULL_PRINTF(m, n) __attribute__ ((__format__ (__printf__, m, n))) +# else +# define ATTRIBUTE_NULL_PRINTF(m, n) +# endif /* GNUC >= 3.3 */ +# define ATTRIBUTE_NULL_PRINTF_1 ATTRIBUTE_NULL_PRINTF(1, 2) +# define ATTRIBUTE_NULL_PRINTF_2 ATTRIBUTE_NULL_PRINTF(2, 3) +# define ATTRIBUTE_NULL_PRINTF_3 ATTRIBUTE_NULL_PRINTF(3, 4) +# define ATTRIBUTE_NULL_PRINTF_4 ATTRIBUTE_NULL_PRINTF(4, 5) +# define ATTRIBUTE_NULL_PRINTF_5 ATTRIBUTE_NULL_PRINTF(5, 6) +#endif /* ATTRIBUTE_NULL_PRINTF */ + +/* Attribute `sentinel' was valid as of gcc 3.5. */ +#ifndef ATTRIBUTE_SENTINEL +# if (GCC_VERSION >= 3005) +# define ATTRIBUTE_SENTINEL __attribute__ ((__sentinel__)) +# else +# define ATTRIBUTE_SENTINEL +# endif /* GNUC >= 3.5 */ +#endif /* ATTRIBUTE_SENTINEL */ + + +#ifndef ATTRIBUTE_ALIGNED_ALIGNOF +# if (GCC_VERSION >= 3000) +# define ATTRIBUTE_ALIGNED_ALIGNOF(m) __attribute__ ((__aligned__ (__alignof__ (m)))) +# else +# define ATTRIBUTE_ALIGNED_ALIGNOF(m) +# endif /* GNUC >= 3.0 */ +#endif /* ATTRIBUTE_ALIGNED_ALIGNOF */ + +/* Useful for structures whose layout must much some binary specification + regardless of the alignment and padding qualities of the compiler. */ +#ifndef ATTRIBUTE_PACKED +# define ATTRIBUTE_PACKED __attribute__ ((packed)) +#endif + +/* Attribute `hot' and `cold' was valid as of gcc 4.3. */ +#ifndef ATTRIBUTE_COLD +# if (GCC_VERSION >= 4003) +# define ATTRIBUTE_COLD __attribute__ ((__cold__)) +# else +# define ATTRIBUTE_COLD +# endif /* GNUC >= 4.3 */ +#endif /* ATTRIBUTE_COLD */ +#ifndef ATTRIBUTE_HOT +# if (GCC_VERSION >= 4003) +# define ATTRIBUTE_HOT __attribute__ ((__hot__)) +# else +# define ATTRIBUTE_HOT +# endif /* GNUC >= 4.3 */ +#endif /* ATTRIBUTE_HOT */ + +/* We use __extension__ in some places to suppress -pedantic warnings + about GCC extensions. This feature didn't work properly before + gcc 2.8. */ +#if GCC_VERSION < 2008 +#define __extension__ +#endif + +#endif /* ansidecl.h */ diff --git a/include/demangle.h b/include/demangle.h new file mode 100644 index 0000000..b55226d --- /dev/null +++ b/include/demangle.h @@ -0,0 +1,579 @@ +/* Defs for interface to demanglers. + Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000, 2001, 2002, + 2003, 2004, 2005, 2007 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License + as published by the Free Software Foundation; either version 2, or + (at your option) any later version. + + In addition to the permissions in the GNU Library General Public + License, the Free Software Foundation gives you unlimited + permission to link the compiled version of this file into + combinations with other programs, and to distribute those + combinations without any restriction coming from the use of this + file. (The Library Public License restrictions do apply in other + respects; for example, they cover modification of the file, and + distribution when not linked into a combined executable.) + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA + 02110-1301, USA. */ + + +#if !defined (DEMANGLE_H) +#define DEMANGLE_H + +#include "libiberty.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/* Options passed to cplus_demangle (in 2nd parameter). */ + +#define DMGL_NO_OPTS 0 /* For readability... */ +#define DMGL_PARAMS (1 << 0) /* Include function args */ +#define DMGL_ANSI (1 << 1) /* Include const, volatile, etc */ +#define DMGL_JAVA (1 << 2) /* Demangle as Java rather than C++. */ +#define DMGL_VERBOSE (1 << 3) /* Include implementation details. */ +#define DMGL_TYPES (1 << 4) /* Also try to demangle type encodings. */ +#define DMGL_RET_POSTFIX (1 << 5) /* Print function return types (when + present) after function signature */ + +#define DMGL_AUTO (1 << 8) +#define DMGL_GNU (1 << 9) +#define DMGL_LUCID (1 << 10) +#define DMGL_ARM (1 << 11) +#define DMGL_HP (1 << 12) /* For the HP aCC compiler; + same as ARM except for + template arguments, etc. */ +#define DMGL_EDG (1 << 13) +#define DMGL_GNU_V3 (1 << 14) +#define DMGL_GNAT (1 << 15) + +/* If none of these are set, use 'current_demangling_style' as the default. */ +#define DMGL_STYLE_MASK (DMGL_AUTO|DMGL_GNU|DMGL_LUCID|DMGL_ARM|DMGL_HP|DMGL_EDG|DMGL_GNU_V3|DMGL_JAVA|DMGL_GNAT) + +/* Enumeration of possible demangling styles. + + Lucid and ARM styles are still kept logically distinct, even though + they now both behave identically. The resulting style is actual the + union of both. I.E. either style recognizes both "__pt__" and "__rf__" + for operator "->", even though the first is lucid style and the second + is ARM style. (FIXME?) */ + +extern enum demangling_styles +{ + no_demangling = -1, + unknown_demangling = 0, + auto_demangling = DMGL_AUTO, + gnu_demangling = DMGL_GNU, + lucid_demangling = DMGL_LUCID, + arm_demangling = DMGL_ARM, + hp_demangling = DMGL_HP, + edg_demangling = DMGL_EDG, + gnu_v3_demangling = DMGL_GNU_V3, + java_demangling = DMGL_JAVA, + gnat_demangling = DMGL_GNAT +} current_demangling_style; + +/* Define string names for the various demangling styles. */ + +#define NO_DEMANGLING_STYLE_STRING "none" +#define AUTO_DEMANGLING_STYLE_STRING "auto" +#define GNU_DEMANGLING_STYLE_STRING "gnu" +#define LUCID_DEMANGLING_STYLE_STRING "lucid" +#define ARM_DEMANGLING_STYLE_STRING "arm" +#define HP_DEMANGLING_STYLE_STRING "hp" +#define EDG_DEMANGLING_STYLE_STRING "edg" +#define GNU_V3_DEMANGLING_STYLE_STRING "gnu-v3" +#define JAVA_DEMANGLING_STYLE_STRING "java" +#define GNAT_DEMANGLING_STYLE_STRING "gnat" + +/* Some macros to test what demangling style is active. */ + +#define CURRENT_DEMANGLING_STYLE current_demangling_style +#define AUTO_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_AUTO) +#define GNU_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_GNU) +#define LUCID_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_LUCID) +#define ARM_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_ARM) +#define HP_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_HP) +#define EDG_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_EDG) +#define GNU_V3_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_GNU_V3) +#define JAVA_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_JAVA) +#define GNAT_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_GNAT) + +/* Provide information about the available demangle styles. This code is + pulled from gdb into libiberty because it is useful to binutils also. */ + +extern const struct demangler_engine +{ + const char *const demangling_style_name; + const enum demangling_styles demangling_style; + const char *const demangling_style_doc; +} libiberty_demanglers[]; + +extern char * +cplus_demangle (const char *mangled, int options); + +extern int +cplus_demangle_opname (const char *opname, char *result, int options); + +extern const char * +cplus_mangle_opname (const char *opname, int options); + +/* Note: This sets global state. FIXME if you care about multi-threading. */ + +extern void +set_cplus_marker_for_demangling (int ch); + +extern enum demangling_styles +cplus_demangle_set_style (enum demangling_styles style); + +extern enum demangling_styles +cplus_demangle_name_to_style (const char *name); + +/* Callback typedef for allocation-less demangler interfaces. */ +typedef void (*demangle_callbackref) (const char *, size_t, void *); + +/* V3 ABI demangling entry points, defined in cp-demangle.c. Callback + variants return non-zero on success, zero on error. char* variants + return a string allocated by malloc on success, NULL on error. */ +extern int +cplus_demangle_v3_callback (const char *mangled, int options, + demangle_callbackref callback, void *opaque); + +extern char* +cplus_demangle_v3 (const char *mangled, int options); + +extern int +java_demangle_v3_callback (const char *mangled, + demangle_callbackref callback, void *opaque); + +extern char* +java_demangle_v3 (const char *mangled); + +enum gnu_v3_ctor_kinds { + gnu_v3_complete_object_ctor = 1, + gnu_v3_base_object_ctor, + gnu_v3_complete_object_allocating_ctor +}; + +/* Return non-zero iff NAME is the mangled form of a constructor name + in the G++ V3 ABI demangling style. Specifically, return an `enum + gnu_v3_ctor_kinds' value indicating what kind of constructor + it is. */ +extern enum gnu_v3_ctor_kinds + is_gnu_v3_mangled_ctor (const char *name); + + +enum gnu_v3_dtor_kinds { + gnu_v3_deleting_dtor = 1, + gnu_v3_complete_object_dtor, + gnu_v3_base_object_dtor +}; + +/* Return non-zero iff NAME is the mangled form of a destructor name + in the G++ V3 ABI demangling style. Specifically, return an `enum + gnu_v3_dtor_kinds' value, indicating what kind of destructor + it is. */ +extern enum gnu_v3_dtor_kinds + is_gnu_v3_mangled_dtor (const char *name); + +/* The V3 demangler works in two passes. The first pass builds a tree + representation of the mangled name, and the second pass turns the + tree representation into a demangled string. Here we define an + interface to permit a caller to build their own tree + representation, which they can pass to the demangler to get a + demangled string. This can be used to canonicalize user input into + something which the demangler might output. It could also be used + by other demanglers in the future. */ + +/* These are the component types which may be found in the tree. Many + component types have one or two subtrees, referred to as left and + right (a component type with only one subtree puts it in the left + subtree). */ + +enum demangle_component_type +{ + /* A name, with a length and a pointer to a string. */ + DEMANGLE_COMPONENT_NAME, + /* A qualified name. The left subtree is a class or namespace or + some such thing, and the right subtree is a name qualified by + that class. */ + DEMANGLE_COMPONENT_QUAL_NAME, + /* A local name. The left subtree describes a function, and the + right subtree is a name which is local to that function. */ + DEMANGLE_COMPONENT_LOCAL_NAME, + /* A typed name. The left subtree is a name, and the right subtree + describes that name as a function. */ + DEMANGLE_COMPONENT_TYPED_NAME, + /* A template. The left subtree is a template name, and the right + subtree is a template argument list. */ + DEMANGLE_COMPONENT_TEMPLATE, + /* A template parameter. This holds a number, which is the template + parameter index. */ + DEMANGLE_COMPONENT_TEMPLATE_PARAM, + /* A constructor. This holds a name and the kind of + constructor. */ + DEMANGLE_COMPONENT_CTOR, + /* A destructor. This holds a name and the kind of destructor. */ + DEMANGLE_COMPONENT_DTOR, + /* A vtable. This has one subtree, the type for which this is a + vtable. */ + DEMANGLE_COMPONENT_VTABLE, + /* A VTT structure. This has one subtree, the type for which this + is a VTT. */ + DEMANGLE_COMPONENT_VTT, + /* A construction vtable. The left subtree is the type for which + this is a vtable, and the right subtree is the derived type for + which this vtable is built. */ + DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE, + /* A typeinfo structure. This has one subtree, the type for which + this is the tpeinfo structure. */ + DEMANGLE_COMPONENT_TYPEINFO, + /* A typeinfo name. This has one subtree, the type for which this + is the typeinfo name. */ + DEMANGLE_COMPONENT_TYPEINFO_NAME, + /* A typeinfo function. This has one subtree, the type for which + this is the tpyeinfo function. */ + DEMANGLE_COMPONENT_TYPEINFO_FN, + /* A thunk. This has one subtree, the name for which this is a + thunk. */ + DEMANGLE_COMPONENT_THUNK, + /* A virtual thunk. This has one subtree, the name for which this + is a virtual thunk. */ + DEMANGLE_COMPONENT_VIRTUAL_THUNK, + /* A covariant thunk. This has one subtree, the name for which this + is a covariant thunk. */ + DEMANGLE_COMPONENT_COVARIANT_THUNK, + /* A Java class. This has one subtree, the type. */ + DEMANGLE_COMPONENT_JAVA_CLASS, + /* A guard variable. This has one subtree, the name for which this + is a guard variable. */ + DEMANGLE_COMPONENT_GUARD, + /* A reference temporary. This has one subtree, the name for which + this is a temporary. */ + DEMANGLE_COMPONENT_REFTEMP, + /* A hidden alias. This has one subtree, the encoding for which it + is providing alternative linkage. */ + DEMANGLE_COMPONENT_HIDDEN_ALIAS, + /* A standard substitution. This holds the name of the + substitution. */ + DEMANGLE_COMPONENT_SUB_STD, + /* The restrict qualifier. The one subtree is the type which is + being qualified. */ + DEMANGLE_COMPONENT_RESTRICT, + /* The volatile qualifier. The one subtree is the type which is + being qualified. */ + DEMANGLE_COMPONENT_VOLATILE, + /* The const qualifier. The one subtree is the type which is being + qualified. */ + DEMANGLE_COMPONENT_CONST, + /* The restrict qualifier modifying a member function. The one + subtree is the type which is being qualified. */ + DEMANGLE_COMPONENT_RESTRICT_THIS, + /* The volatile qualifier modifying a member function. The one + subtree is the type which is being qualified. */ + DEMANGLE_COMPONENT_VOLATILE_THIS, + /* The const qualifier modifying a member function. The one subtree + is the type which is being qualified. */ + DEMANGLE_COMPONENT_CONST_THIS, + /* A vendor qualifier. The left subtree is the type which is being + qualified, and the right subtree is the name of the + qualifier. */ + DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL, + /* A pointer. The one subtree is the type which is being pointed + to. */ + DEMANGLE_COMPONENT_POINTER, + /* A reference. The one subtree is the type which is being + referenced. */ + DEMANGLE_COMPONENT_REFERENCE, + /* C++0x: An rvalue reference. The one subtree is the type which is + being referenced. */ + DEMANGLE_COMPONENT_RVALUE_REFERENCE, + /* A complex type. The one subtree is the base type. */ + DEMANGLE_COMPONENT_COMPLEX, + /* An imaginary type. The one subtree is the base type. */ + DEMANGLE_COMPONENT_IMAGINARY, + /* A builtin type. This holds the builtin type information. */ + DEMANGLE_COMPONENT_BUILTIN_TYPE, + /* A vendor's builtin type. This holds the name of the type. */ + DEMANGLE_COMPONENT_VENDOR_TYPE, + /* A function type. The left subtree is the return type. The right + subtree is a list of ARGLIST nodes. Either or both may be + NULL. */ + DEMANGLE_COMPONENT_FUNCTION_TYPE, + /* An array type. The left subtree is the dimension, which may be + NULL, or a string (represented as DEMANGLE_COMPONENT_NAME), or an + expression. The right subtree is the element type. */ + DEMANGLE_COMPONENT_ARRAY_TYPE, + /* A pointer to member type. The left subtree is the class type, + and the right subtree is the member type. CV-qualifiers appear + on the latter. */ + DEMANGLE_COMPONENT_PTRMEM_TYPE, + /* An argument list. The left subtree is the current argument, and + the right subtree is either NULL or another ARGLIST node. */ + DEMANGLE_COMPONENT_ARGLIST, + /* A template argument list. The left subtree is the current + template argument, and the right subtree is either NULL or + another TEMPLATE_ARGLIST node. */ + DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, + /* An operator. This holds information about a standard + operator. */ + DEMANGLE_COMPONENT_OPERATOR, + /* An extended operator. This holds the number of arguments, and + the name of the extended operator. */ + DEMANGLE_COMPONENT_EXTENDED_OPERATOR, + /* A typecast, represented as a unary operator. The one subtree is + the type to which the argument should be cast. */ + DEMANGLE_COMPONENT_CAST, + /* A unary expression. The left subtree is the operator, and the + right subtree is the single argument. */ + DEMANGLE_COMPONENT_UNARY, + /* A binary expression. The left subtree is the operator, and the + right subtree is a BINARY_ARGS. */ + DEMANGLE_COMPONENT_BINARY, + /* Arguments to a binary expression. The left subtree is the first + argument, and the right subtree is the second argument. */ + DEMANGLE_COMPONENT_BINARY_ARGS, + /* A trinary expression. The left subtree is the operator, and the + right subtree is a TRINARY_ARG1. */ + DEMANGLE_COMPONENT_TRINARY, + /* Arguments to a trinary expression. The left subtree is the first + argument, and the right subtree is a TRINARY_ARG2. */ + DEMANGLE_COMPONENT_TRINARY_ARG1, + /* More arguments to a trinary expression. The left subtree is the + second argument, and the right subtree is the third argument. */ + DEMANGLE_COMPONENT_TRINARY_ARG2, + /* A literal. The left subtree is the type, and the right subtree + is the value, represented as a DEMANGLE_COMPONENT_NAME. */ + DEMANGLE_COMPONENT_LITERAL, + /* A negative literal. Like LITERAL, but the value is negated. + This is a minor hack: the NAME used for LITERAL points directly + to the mangled string, but since negative numbers are mangled + using 'n' instead of '-', we want a way to indicate a negative + number which involves neither modifying the mangled string nor + allocating a new copy of the literal in memory. */ + DEMANGLE_COMPONENT_LITERAL_NEG +}; + +/* Types which are only used internally. */ + +struct demangle_operator_info; +struct demangle_builtin_type_info; + +/* A node in the tree representation is an instance of a struct + demangle_component. Note that the field names of the struct are + not well protected against macros defined by the file including + this one. We can fix this if it ever becomes a problem. */ + +struct demangle_component +{ + /* The type of this component. */ + enum demangle_component_type type; + + union + { + /* For DEMANGLE_COMPONENT_NAME. */ + struct + { + /* A pointer to the name (which need not NULL terminated) and + its length. */ + const char *s; + int len; + } s_name; + + /* For DEMANGLE_COMPONENT_OPERATOR. */ + struct + { + /* Operator. */ + const struct demangle_operator_info *op; + } s_operator; + + /* For DEMANGLE_COMPONENT_EXTENDED_OPERATOR. */ + struct + { + /* Number of arguments. */ + int args; + /* Name. */ + struct demangle_component *name; + } s_extended_operator; + + /* For DEMANGLE_COMPONENT_CTOR. */ + struct + { + /* Kind of constructor. */ + enum gnu_v3_ctor_kinds kind; + /* Name. */ + struct demangle_component *name; + } s_ctor; + + /* For DEMANGLE_COMPONENT_DTOR. */ + struct + { + /* Kind of destructor. */ + enum gnu_v3_dtor_kinds kind; + /* Name. */ + struct demangle_component *name; + } s_dtor; + + /* For DEMANGLE_COMPONENT_BUILTIN_TYPE. */ + struct + { + /* Builtin type. */ + const struct demangle_builtin_type_info *type; + } s_builtin; + + /* For DEMANGLE_COMPONENT_SUB_STD. */ + struct + { + /* Standard substitution string. */ + const char* string; + /* Length of string. */ + int len; + } s_string; + + /* For DEMANGLE_COMPONENT_TEMPLATE_PARAM. */ + struct + { + /* Template parameter index. */ + long number; + } s_number; + + /* For other types. */ + struct + { + /* Left (or only) subtree. */ + struct demangle_component *left; + /* Right subtree. */ + struct demangle_component *right; + } s_binary; + + } u; +}; + +/* People building mangled trees are expected to allocate instances of + struct demangle_component themselves. They can then call one of + the following functions to fill them in. */ + +/* Fill in most component types with a left subtree and a right + subtree. Returns non-zero on success, zero on failure, such as an + unrecognized or inappropriate component type. */ + +extern int +cplus_demangle_fill_component (struct demangle_component *fill, + enum demangle_component_type, + struct demangle_component *left, + struct demangle_component *right); + +/* Fill in a DEMANGLE_COMPONENT_NAME. Returns non-zero on success, + zero for bad arguments. */ + +extern int +cplus_demangle_fill_name (struct demangle_component *fill, + const char *, int); + +/* Fill in a DEMANGLE_COMPONENT_BUILTIN_TYPE, using the name of the + builtin type (e.g., "int", etc.). Returns non-zero on success, + zero if the type is not recognized. */ + +extern int +cplus_demangle_fill_builtin_type (struct demangle_component *fill, + const char *type_name); + +/* Fill in a DEMANGLE_COMPONENT_OPERATOR, using the name of the + operator and the number of arguments which it takes (the latter is + used to disambiguate operators which can be both binary and unary, + such as '-'). Returns non-zero on success, zero if the operator is + not recognized. */ + +extern int +cplus_demangle_fill_operator (struct demangle_component *fill, + const char *opname, int args); + +/* Fill in a DEMANGLE_COMPONENT_EXTENDED_OPERATOR, providing the + number of arguments and the name. Returns non-zero on success, + zero for bad arguments. */ + +extern int +cplus_demangle_fill_extended_operator (struct demangle_component *fill, + int numargs, + struct demangle_component *nm); + +/* Fill in a DEMANGLE_COMPONENT_CTOR. Returns non-zero on success, + zero for bad arguments. */ + +extern int +cplus_demangle_fill_ctor (struct demangle_component *fill, + enum gnu_v3_ctor_kinds kind, + struct demangle_component *name); + +/* Fill in a DEMANGLE_COMPONENT_DTOR. Returns non-zero on success, + zero for bad arguments. */ + +extern int +cplus_demangle_fill_dtor (struct demangle_component *fill, + enum gnu_v3_dtor_kinds kind, + struct demangle_component *name); + +/* This function translates a mangled name into a struct + demangle_component tree. The first argument is the mangled name. + The second argument is DMGL_* options. This returns a pointer to a + tree on success, or NULL on failure. On success, the third + argument is set to a block of memory allocated by malloc. This + block should be passed to free when the tree is no longer + needed. */ + +extern struct demangle_component * +cplus_demangle_v3_components (const char *mangled, int options, void **mem); + +/* This function takes a struct demangle_component tree and returns + the corresponding demangled string. The first argument is DMGL_* + options. The second is the tree to demangle. The third is a guess + at the length of the demangled string, used to initially allocate + the return buffer. The fourth is a pointer to a size_t. On + success, this function returns a buffer allocated by malloc(), and + sets the size_t pointed to by the fourth argument to the size of + the allocated buffer (not the length of the returned string). On + failure, this function returns NULL, and sets the size_t pointed to + by the fourth argument to 0 for an invalid tree, or to 1 for a + memory allocation error. */ + +extern char * +cplus_demangle_print (int options, + const struct demangle_component *tree, + int estimated_length, + size_t *p_allocated_size); + +/* This function takes a struct demangle_component tree and passes back + a demangled string in one or more calls to a callback function. + The first argument is DMGL_* options. The second is the tree to + demangle. The third is a pointer to a callback function; on each call + this receives an element of the demangled string, its length, and an + opaque value. The fourth is the opaque value passed to the callback. + The callback is called once or more to return the full demangled + string. The demangled element string is always nul-terminated, though + its length is also provided for convenience. In contrast to + cplus_demangle_print(), this function does not allocate heap memory + to grow output strings (except perhaps where alloca() is implemented + by malloc()), and so is normally safe for use where the heap has been + corrupted. On success, this function returns 1; on failure, 0. */ + +extern int +cplus_demangle_print_callback (int options, + const struct demangle_component *tree, + demangle_callbackref callback, void *opaque); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* DEMANGLE_H */ diff --git a/include/dyn-string.h b/include/dyn-string.h new file mode 100644 index 0000000..44e33de --- /dev/null +++ b/include/dyn-string.h @@ -0,0 +1,60 @@ +/* An abstract string datatype. + Copyright (C) 1998, 1999, 2000, 2002, 2004 Free Software Foundation, Inc. + Contributed by Mark Mitchell (mark@markmitchell.com). + +This file is part of GCC. + +GCC 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. + +GCC 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 GCC; see the file COPYING. If not, write to +the Free Software Foundation, 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + + +typedef struct dyn_string +{ + int allocated; /* The amount of space allocated for the string. */ + int length; /* The actual length of the string. */ + char *s; /* The string itself, NUL-terminated. */ +}* dyn_string_t; + +/* The length STR, in bytes, not including the terminating NUL. */ +#define dyn_string_length(STR) \ + ((STR)->length) + +/* The NTBS in which the contents of STR are stored. */ +#define dyn_string_buf(STR) \ + ((STR)->s) + +/* Compare DS1 to DS2 with strcmp. */ +#define dyn_string_compare(DS1, DS2) \ + (strcmp ((DS1)->s, (DS2)->s)) + + +extern int dyn_string_init (struct dyn_string *, int); +extern dyn_string_t dyn_string_new (int); +extern void dyn_string_delete (dyn_string_t); +extern char *dyn_string_release (dyn_string_t); +extern dyn_string_t dyn_string_resize (dyn_string_t, int); +extern void dyn_string_clear (dyn_string_t); +extern int dyn_string_copy (dyn_string_t, dyn_string_t); +extern int dyn_string_copy_cstr (dyn_string_t, const char *); +extern int dyn_string_prepend (dyn_string_t, dyn_string_t); +extern int dyn_string_prepend_cstr (dyn_string_t, const char *); +extern int dyn_string_insert (dyn_string_t, int, dyn_string_t); +extern int dyn_string_insert_cstr (dyn_string_t, int, const char *); +extern int dyn_string_insert_char (dyn_string_t, int, int); +extern int dyn_string_append (dyn_string_t, dyn_string_t); +extern int dyn_string_append_cstr (dyn_string_t, const char *); +extern int dyn_string_append_char (dyn_string_t, int); +extern int dyn_string_substring (dyn_string_t, dyn_string_t, int, int); +extern int dyn_string_eq (dyn_string_t, dyn_string_t); diff --git a/include/fibheap.h b/include/fibheap.h new file mode 100644 index 0000000..348c4ae --- /dev/null +++ b/include/fibheap.h @@ -0,0 +1,86 @@ +/* A Fibonacci heap datatype. + Copyright 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. + Contributed by Daniel Berlin (dan@cgsoftware.com). + +This file is part of GCC. + +GCC 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. + +GCC 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 GCC; see the file COPYING. If not, write to +the Free Software Foundation, 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +/* Fibonacci heaps are somewhat complex, but, there's an article in + DDJ that explains them pretty well: + + http://www.ddj.com/articles/1997/9701/9701o/9701o.htm?topic=algoritms + + Introduction to algorithms by Corman and Rivest also goes over them. + + The original paper that introduced them is "Fibonacci heaps and their + uses in improved network optimization algorithms" by Tarjan and + Fredman (JACM 34(3), July 1987). + + Amortized and real worst case time for operations: + + ExtractMin: O(lg n) amortized. O(n) worst case. + DecreaseKey: O(1) amortized. O(lg n) worst case. + Insert: O(2) amortized. O(1) actual. + Union: O(1) amortized. O(1) actual. */ + +#ifndef _FIBHEAP_H_ +#define _FIBHEAP_H_ + +#include "ansidecl.h" + +typedef long fibheapkey_t; + +typedef struct fibheap +{ + size_t nodes; + struct fibnode *min; + struct fibnode *root; +} *fibheap_t; + +typedef struct fibnode +{ + struct fibnode *parent; + struct fibnode *child; + struct fibnode *left; + struct fibnode *right; + fibheapkey_t key; + void *data; +#if defined (__GNUC__) && (!defined (SIZEOF_INT) || SIZEOF_INT < 4) + __extension__ unsigned long int degree : 31; + __extension__ unsigned long int mark : 1; +#else + unsigned int degree : 31; + unsigned int mark : 1; +#endif +} *fibnode_t; + +extern fibheap_t fibheap_new (void); +extern fibnode_t fibheap_insert (fibheap_t, fibheapkey_t, void *); +extern int fibheap_empty (fibheap_t); +extern fibheapkey_t fibheap_min_key (fibheap_t); +extern fibheapkey_t fibheap_replace_key (fibheap_t, fibnode_t, + fibheapkey_t); +extern void *fibheap_replace_key_data (fibheap_t, fibnode_t, + fibheapkey_t, void *); +extern void *fibheap_extract_min (fibheap_t); +extern void *fibheap_min (fibheap_t); +extern void *fibheap_replace_data (fibheap_t, fibnode_t, void *); +extern void *fibheap_delete_node (fibheap_t, fibnode_t); +extern void fibheap_delete (fibheap_t); +extern fibheap_t fibheap_union (fibheap_t, fibheap_t); + +#endif /* _FIBHEAP_H_ */ diff --git a/include/filenames.h b/include/filenames.h new file mode 100644 index 0000000..5338208 --- /dev/null +++ b/include/filenames.h @@ -0,0 +1,52 @@ +/* Macros for taking apart, interpreting and processing file names. + + These are here because some non-Posix (a.k.a. DOSish) systems have + drive letter brain-damage at the beginning of an absolute file name, + use forward- and back-slash in path names interchangeably, and + some of them have case-insensitive file names. + + Copyright 2000, 2001, 2007 Free Software Foundation, Inc. + +This file is part of BFD, the Binary File Descriptor library. + +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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef FILENAMES_H +#define FILENAMES_H + +#if defined(__MSDOS__) || defined(_WIN32) || defined(__OS2__) || defined (__CYGWIN__) + +#ifndef HAVE_DOS_BASED_FILE_SYSTEM +#define HAVE_DOS_BASED_FILE_SYSTEM 1 +#endif + +#define IS_DIR_SEPARATOR(c) ((c) == '/' || (c) == '\\') +/* Note that IS_ABSOLUTE_PATH accepts d:foo as well, although it is + only semi-absolute. This is because the users of IS_ABSOLUTE_PATH + want to know whether to prepend the current working directory to + a file name, which should not be done with a name like d:foo. */ +#define IS_ABSOLUTE_PATH(f) (IS_DIR_SEPARATOR((f)[0]) || (((f)[0]) && ((f)[1] == ':'))) + +#else /* not DOSish */ + +#define IS_DIR_SEPARATOR(c) ((c) == '/') +#define IS_ABSOLUTE_PATH(f) (IS_DIR_SEPARATOR((f)[0])) + +#endif /* not DOSish */ + +extern int filename_cmp (const char *s1, const char *s2); +#define FILENAME_CMP(s1, s2) filename_cmp(s1, s2) + +#endif /* FILENAMES_H */ diff --git a/include/floatformat.h b/include/floatformat.h new file mode 100644 index 0000000..c5f60a3 --- /dev/null +++ b/include/floatformat.h @@ -0,0 +1,149 @@ +/* IEEE floating point support declarations, for GDB, the GNU Debugger. + Copyright 1991, 1994, 1995, 1997, 2000, 2003, 2005 + Free Software Foundation, Inc. + +This file is part of GDB. + +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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#if !defined (FLOATFORMAT_H) +#define FLOATFORMAT_H 1 + +#include "ansidecl.h" + +/* A floatformat consists of a sign bit, an exponent and a mantissa. Once the + bytes are concatenated according to the byteorder flag, then each of those + fields is contiguous. We number the bits with 0 being the most significant + (i.e. BITS_BIG_ENDIAN type numbering), and specify which bits each field + contains with the *_start and *_len fields. */ + +/* What is the order of the bytes? */ + +enum floatformat_byteorders { + /* Standard little endian byte order. + EX: 1.2345678e10 => 00 00 80 c5 e0 fe 06 42 */ + floatformat_little, + + /* Standard big endian byte order. + EX: 1.2345678e10 => 42 06 fe e0 c5 80 00 00 */ + floatformat_big, + + /* Little endian byte order but big endian word order. + EX: 1.2345678e10 => e0 fe 06 42 00 00 80 c5 */ + floatformat_littlebyte_bigword, + + /* VAX byte order. Little endian byte order with 16-bit words. The + following example is an illustration of the byte order only; VAX + doesn't have a fully IEEE compliant floating-point format. + EX: 1.2345678e10 => 80 c5 00 00 06 42 e0 fe */ + floatformat_vax +}; + +enum floatformat_intbit { floatformat_intbit_yes, floatformat_intbit_no }; + +struct floatformat +{ + enum floatformat_byteorders byteorder; + unsigned int totalsize; /* Total size of number in bits */ + + /* Sign bit is always one bit long. 1 means negative, 0 means positive. */ + unsigned int sign_start; + + unsigned int exp_start; + unsigned int exp_len; + /* Bias added to a "true" exponent to form the biased exponent. It + is intentionally signed as, otherwize, -exp_bias can turn into a + very large number (e.g., given the exp_bias of 0x3fff and a 64 + bit long, the equation (long)(1 - exp_bias) evaluates to + 4294950914) instead of -16382). */ + int exp_bias; + /* Exponent value which indicates NaN. This is the actual value stored in + the float, not adjusted by the exp_bias. This usually consists of all + one bits. */ + unsigned int exp_nan; + + unsigned int man_start; + unsigned int man_len; + + /* Is the integer bit explicit or implicit? */ + enum floatformat_intbit intbit; + + /* Internal name for debugging. */ + const char *name; + + /* Validator method. */ + int (*is_valid) (const struct floatformat *fmt, const void *from); + + /* Is the format actually the sum of two smaller floating point + formats (IBM long double, as described in + gcc/config/rs6000/darwin-ldouble-format)? If so, this is the + smaller format in question, and the fields sign_start through + intbit describe the first half. If not, this is NULL. */ + const struct floatformat *split_half; +}; + +/* floatformats for IEEE single and double, big and little endian. */ + +extern const struct floatformat floatformat_ieee_single_big; +extern const struct floatformat floatformat_ieee_single_little; +extern const struct floatformat floatformat_ieee_double_big; +extern const struct floatformat floatformat_ieee_double_little; + +/* floatformat for ARM IEEE double, little endian bytes and big endian words */ + +extern const struct floatformat floatformat_ieee_double_littlebyte_bigword; + +/* floatformats for VAX. */ + +extern const struct floatformat floatformat_vax_f; +extern const struct floatformat floatformat_vax_d; +extern const struct floatformat floatformat_vax_g; + +/* floatformats for various extendeds. */ + +extern const struct floatformat floatformat_i387_ext; +extern const struct floatformat floatformat_m68881_ext; +extern const struct floatformat floatformat_i960_ext; +extern const struct floatformat floatformat_m88110_ext; +extern const struct floatformat floatformat_m88110_harris_ext; +extern const struct floatformat floatformat_arm_ext_big; +extern const struct floatformat floatformat_arm_ext_littlebyte_bigword; +/* IA-64 Floating Point register spilt into memory. */ +extern const struct floatformat floatformat_ia64_spill_big; +extern const struct floatformat floatformat_ia64_spill_little; +extern const struct floatformat floatformat_ia64_quad_big; +extern const struct floatformat floatformat_ia64_quad_little; +/* IBM long double (double+double). */ +extern const struct floatformat floatformat_ibm_long_double; + +/* Convert from FMT to a double. + FROM is the address of the extended float. + Store the double in *TO. */ + +extern void +floatformat_to_double (const struct floatformat *, const void *, double *); + +/* The converse: convert the double *FROM to FMT + and store where TO points. */ + +extern void +floatformat_from_double (const struct floatformat *, const double *, void *); + +/* Return non-zero iff the data at FROM is a valid number in format FMT. */ + +extern int +floatformat_is_valid (const struct floatformat *fmt, const void *from); + +#endif /* defined (FLOATFORMAT_H) */ diff --git a/include/fnmatch.h b/include/fnmatch.h new file mode 100644 index 0000000..5b9953c --- /dev/null +++ b/include/fnmatch.h @@ -0,0 +1,70 @@ +/* Copyright 1991, 1992, 1993, 1996 Free Software Foundation, Inc. + +NOTE: The canonical source of this file is maintained with the GNU C Library. +Bugs can be reported to bug-glibc@prep.ai.mit.edu. + +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, 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +#ifndef _FNMATCH_H + +#define _FNMATCH_H 1 + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined (__cplusplus) || (defined (__STDC__) && __STDC__) +#undef __P +#define __P(args) args +#else /* Not C++ or ANSI C. */ +#undef __P +#define __P(args) () +/* We can get away without defining `const' here only because in this file + it is used only inside the prototype for `fnmatch', which is elided in + non-ANSI C where `const' is problematical. */ +#endif /* C++ or ANSI C. */ + + +/* We #undef these before defining them because some losing systems + (HP-UX A.08.07 for example) define these in . */ +#undef FNM_PATHNAME +#undef FNM_NOESCAPE +#undef FNM_PERIOD + +/* Bits set in the FLAGS argument to `fnmatch'. */ +#define FNM_PATHNAME (1 << 0) /* No wildcard can ever match `/'. */ +#define FNM_NOESCAPE (1 << 1) /* Backslashes don't quote special chars. */ +#define FNM_PERIOD (1 << 2) /* Leading `.' is matched only explicitly. */ + +#if !defined (_POSIX_C_SOURCE) || _POSIX_C_SOURCE < 2 || defined (_GNU_SOURCE) +#define FNM_FILE_NAME FNM_PATHNAME /* Preferred GNU name. */ +#define FNM_LEADING_DIR (1 << 3) /* Ignore `/...' after a match. */ +#define FNM_CASEFOLD (1 << 4) /* Compare without regard to case. */ +#endif + +/* Value returned by `fnmatch' if STRING does not match PATTERN. */ +#define FNM_NOMATCH 1 + +/* Match STRING against the filename pattern PATTERN, + returning zero if it matches, FNM_NOMATCH if not. */ +extern int fnmatch __P ((const char *__pattern, const char *__string, + int __flags)); + +#ifdef __cplusplus +} +#endif + +#endif /* fnmatch.h */ diff --git a/include/getopt.h b/include/getopt.h new file mode 100644 index 0000000..5421cab --- /dev/null +++ b/include/getopt.h @@ -0,0 +1,144 @@ +/* Declarations for getopt. + Copyright 1989, 1990, 1991, 1992, 1993, 1994, 1996, 1997, 1998, 2000, + 2002 Free Software Foundation, Inc. + + NOTE: The canonical source of this file is maintained with the GNU C Library. + Bugs can be reported to bug-glibc@gnu.org. + + 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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, + 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 -1, 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__ +/* HAVE_DECL_* is a three-state macro: undefined, 0 or 1. If it is + undefined, we haven't run the autoconf check so provide the + declaration without arguments. If it is 0, we checked and failed + to find the declaration so provide a fully prototyped one. If it + is 1, we found it so don't provide any declaration at all. */ +#if !HAVE_DECL_GETOPT +#if defined (__GNU_LIBRARY__) || defined (HAVE_DECL_GETOPT) +/* Many other libraries have conflicting prototypes for getopt, with + differences in the consts, in unistd.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 +#ifndef __cplusplus +extern int getopt (); +#endif /* __cplusplus */ +#endif +#endif /* !HAVE_DECL_GETOPT */ + +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 */ diff --git a/include/hashtab.h b/include/hashtab.h new file mode 100644 index 0000000..77eee14 --- /dev/null +++ b/include/hashtab.h @@ -0,0 +1,206 @@ +/* An expandable hash tables datatype. + Copyright (C) 1999, 2000, 2002, 2003, 2004 Free Software Foundation, Inc. + Contributed by Vladimir Makarov (vmakarov@cygnus.com). + +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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* This package implements basic hash table functionality. It is possible + to search for an entry, create an entry and destroy an entry. + + Elements in the table are generic pointers. + + The size of the table is not fixed; if the occupancy of the table + grows too high the hash table will be expanded. + + The abstract data implementation is based on generalized Algorithm D + from Knuth's book "The art of computer programming". Hash table is + expanded by creation of new hash table and transferring elements from + the old table to the new table. */ + +#ifndef __HASHTAB_H__ +#define __HASHTAB_H__ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include "ansidecl.h" + +#ifndef GTY +#define GTY(X) +#endif + +/* The type for a hash code. */ +typedef unsigned int hashval_t; + +/* Callback function pointer types. */ + +/* Calculate hash of a table entry. */ +typedef hashval_t (*htab_hash) (const void *); + +/* Compare a table entry with a possible entry. The entry already in + the table always comes first, so the second element can be of a + different type (but in this case htab_find and htab_find_slot + cannot be used; instead the variants that accept a hash value + must be used). */ +typedef int (*htab_eq) (const void *, const void *); + +/* Cleanup function called whenever a live element is removed from + the hash table. */ +typedef void (*htab_del) (void *); + +/* Function called by htab_traverse for each live element. The first + arg is the slot of the element (which can be passed to htab_clear_slot + if desired), the second arg is the auxiliary pointer handed to + htab_traverse. Return 1 to continue scan, 0 to stop. */ +typedef int (*htab_trav) (void **, void *); + +/* Memory-allocation function, with the same functionality as calloc(). + Iff it returns NULL, the hash table implementation will pass an error + code back to the user, so if your code doesn't handle errors, + best if you use xcalloc instead. */ +typedef void *(*htab_alloc) (size_t, size_t); + +/* We also need a free() routine. */ +typedef void (*htab_free) (void *); + +/* Memory allocation and deallocation; variants which take an extra + argument. */ +typedef void *(*htab_alloc_with_arg) (void *, size_t, size_t); +typedef void (*htab_free_with_arg) (void *, void *); + +/* This macro defines reserved value for empty table entry. */ + +#define HTAB_EMPTY_ENTRY ((PTR) 0) + +/* This macro defines reserved value for table entry which contained + a deleted element. */ + +#define HTAB_DELETED_ENTRY ((PTR) 1) + +/* Hash tables are of the following type. The structure + (implementation) of this type is not needed for using the hash + tables. All work with hash table should be executed only through + functions mentioned below. The size of this structure is subject to + change. */ + +struct htab GTY(()) +{ + /* Pointer to hash function. */ + htab_hash hash_f; + + /* Pointer to comparison function. */ + htab_eq eq_f; + + /* Pointer to cleanup function. */ + htab_del del_f; + + /* Table itself. */ + void ** GTY ((use_param, length ("%h.size"))) entries; + + /* Current size (in entries) of the hash table. */ + size_t size; + + /* Current number of elements including also deleted elements. */ + size_t n_elements; + + /* Current number of deleted elements in the table. */ + size_t n_deleted; + + /* The following member is used for debugging. Its value is number + of all calls of `htab_find_slot' for the hash table. */ + unsigned int searches; + + /* The following member is used for debugging. Its value is number + of collisions fixed for time of work with the hash table. */ + unsigned int collisions; + + /* Pointers to allocate/free functions. */ + htab_alloc alloc_f; + htab_free free_f; + + /* Alternate allocate/free functions, which take an extra argument. */ + void * GTY((skip)) alloc_arg; + htab_alloc_with_arg alloc_with_arg_f; + htab_free_with_arg free_with_arg_f; + + /* Current size (in entries) of the hash table, as an index into the + table of primes. */ + unsigned int size_prime_index; +}; + +typedef struct htab *htab_t; + +/* An enum saying whether we insert into the hash table or not. */ +enum insert_option {NO_INSERT, INSERT}; + +/* The prototypes of the package functions. */ + +extern htab_t htab_create_alloc (size_t, htab_hash, + htab_eq, htab_del, + htab_alloc, htab_free); + +extern htab_t htab_create_alloc_ex (size_t, htab_hash, + htab_eq, htab_del, + void *, htab_alloc_with_arg, + htab_free_with_arg); + +/* Backward-compatibility functions. */ +extern htab_t htab_create (size_t, htab_hash, htab_eq, htab_del); +extern htab_t htab_try_create (size_t, htab_hash, htab_eq, htab_del); + +extern void htab_set_functions_ex (htab_t, htab_hash, + htab_eq, htab_del, + void *, htab_alloc_with_arg, + htab_free_with_arg); + +extern void htab_delete (htab_t); +extern void htab_empty (htab_t); + +extern void * htab_find (htab_t, const void *); +extern void ** htab_find_slot (htab_t, const void *, enum insert_option); +extern void * htab_find_with_hash (htab_t, const void *, hashval_t); +extern void ** htab_find_slot_with_hash (htab_t, const void *, + hashval_t, enum insert_option); +extern void htab_clear_slot (htab_t, void **); +extern void htab_remove_elt (htab_t, void *); +extern void htab_remove_elt_with_hash (htab_t, void *, hashval_t); + +extern void htab_traverse (htab_t, htab_trav, void *); +extern void htab_traverse_noresize (htab_t, htab_trav, void *); + +extern size_t htab_size (htab_t); +extern size_t htab_elements (htab_t); +extern double htab_collisions (htab_t); + +/* A hash function for pointers. */ +extern htab_hash htab_hash_pointer; + +/* An equality function for pointers. */ +extern htab_eq htab_eq_pointer; + +/* A hash function for null-terminated strings. */ +extern hashval_t htab_hash_string (const void *); + +/* An iterative hash function for arbitrary data. */ +extern hashval_t iterative_hash (const void *, size_t, hashval_t); +/* Shorthand for hashing something with an intrinsic size. */ +#define iterative_hash_object(OB,INIT) iterative_hash (&OB, sizeof (OB), INIT) + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __HASHTAB_H */ diff --git a/include/libiberty.h b/include/libiberty.h new file mode 100644 index 0000000..6ea8761 --- /dev/null +++ b/include/libiberty.h @@ -0,0 +1,654 @@ +/* Function declarations for libiberty. + + Copyright 2001, 2002, 2005, 2007 Free Software Foundation, Inc. + + Note - certain prototypes declared in this header file are for + functions whoes implementation copyright does not belong to the + FSF. Those prototypes are present in this file for reference + purposes only and their presence in this file should not construed + as an indication of ownership by the FSF of the implementation of + those functions in any way or form whatsoever. + + 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., 51 Franklin Street - Fifth Floor, + Boston, MA 02110-1301, USA. + + Written by Cygnus Support, 1994. + + The libiberty library provides a number of functions which are + missing on some operating systems. We do not declare those here, + to avoid conflicts with the system header files on operating + systems that do support those functions. In this file we only + declare those functions which are specific to libiberty. */ + +#ifndef LIBIBERTY_H +#define LIBIBERTY_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "ansidecl.h" + +/* Get a definition for size_t. */ +#include +/* Get a definition for va_list. */ +#include + +#include + +/* If the OS supports it, ensure that the supplied stream is setup to + avoid any multi-threaded locking. Otherwise leave the FILE pointer + unchanged. If the stream is NULL do nothing. */ + +extern void unlock_stream (FILE *); + +/* If the OS supports it, ensure that the standard I/O streams, stdin, + stdout and stderr are setup to avoid any multi-threaded locking. + Otherwise do nothing. */ + +extern void unlock_std_streams (void); + +/* Open and return a FILE pointer. If the OS supports it, ensure that + the stream is setup to avoid any multi-threaded locking. Otherwise + return the FILE pointer unchanged. */ + +extern FILE *fopen_unlocked (const char *, const char *); +extern FILE *fdopen_unlocked (int, const char *); +extern FILE *freopen_unlocked (const char *, const char *, FILE *); + +/* Build an argument vector from a string. Allocates memory using + malloc. Use freeargv to free the vector. */ + +extern char **buildargv (const char *) ATTRIBUTE_MALLOC; + +/* Free a vector returned by buildargv. */ + +extern void freeargv (char **); + +/* Duplicate an argument vector. Allocates memory using malloc. Use + freeargv to free the vector. */ + +extern char **dupargv (char **) ATTRIBUTE_MALLOC; + +/* Expand "@file" arguments in argv. */ + +extern void expandargv PARAMS ((int *, char ***)); + +/* Write argv to an @-file, inserting necessary quoting. */ + +extern int writeargv PARAMS ((char **, FILE *)); + +/* Return the last component of a path name. Note that we can't use a + prototype here because the parameter is declared inconsistently + across different systems, sometimes as "char *" and sometimes as + "const char *" */ + +/* HAVE_DECL_* is a three-state macro: undefined, 0 or 1. If it is + undefined, we haven't run the autoconf check so provide the + declaration without arguments. If it is 0, we checked and failed + to find the declaration so provide a fully prototyped one. If it + is 1, we found it so don't provide any declaration at all. */ +#if !HAVE_DECL_BASENAME +#if defined (__GNU_LIBRARY__ ) || defined (__linux__) || defined (__FreeBSD__) || defined (__OpenBSD__) || defined(__NetBSD__) || defined (__CYGWIN__) || defined (__CYGWIN32__) || defined (__MINGW32__) || defined (HAVE_DECL_BASENAME) +extern char *basename (const char *); +#else +/* Do not allow basename to be used if there is no prototype seen. We + either need to use the above prototype or have one from + autoconf which would result in HAVE_DECL_BASENAME being set. */ +#define basename basename_cannot_be_used_without_a_prototype +#endif +#endif + +/* A well-defined basename () that is always compiled in. */ + +extern const char *lbasename (const char *); + +/* A well-defined realpath () that is always compiled in. */ + +extern char *lrealpath (const char *); + +/* Concatenate an arbitrary number of strings. You must pass NULL as + the last argument of this function, to terminate the list of + strings. Allocates memory using xmalloc. */ + +extern char *concat (const char *, ...) ATTRIBUTE_MALLOC ATTRIBUTE_SENTINEL; + +/* Concatenate an arbitrary number of strings. You must pass NULL as + the last argument of this function, to terminate the list of + strings. Allocates memory using xmalloc. The first argument is + not one of the strings to be concatenated, but if not NULL is a + pointer to be freed after the new string is created, similar to the + way xrealloc works. */ + +extern char *reconcat (char *, const char *, ...) ATTRIBUTE_MALLOC ATTRIBUTE_SENTINEL; + +/* Determine the length of concatenating an arbitrary number of + strings. You must pass NULL as the last argument of this function, + to terminate the list of strings. */ + +extern unsigned long concat_length (const char *, ...) ATTRIBUTE_SENTINEL; + +/* Concatenate an arbitrary number of strings into a SUPPLIED area of + memory. You must pass NULL as the last argument of this function, + to terminate the list of strings. The supplied memory is assumed + to be large enough. */ + +extern char *concat_copy (char *, const char *, ...) ATTRIBUTE_SENTINEL; + +/* Concatenate an arbitrary number of strings into a GLOBAL area of + memory. You must pass NULL as the last argument of this function, + to terminate the list of strings. The supplied memory is assumed + to be large enough. */ + +extern char *concat_copy2 (const char *, ...) ATTRIBUTE_SENTINEL; + +/* This is the global area used by concat_copy2. */ + +extern char *libiberty_concat_ptr; + +/* Concatenate an arbitrary number of strings. You must pass NULL as + the last argument of this function, to terminate the list of + strings. Allocates memory using alloca. The arguments are + evaluated twice! */ +#define ACONCAT(ACONCAT_PARAMS) \ + (libiberty_concat_ptr = (char *) alloca (concat_length ACONCAT_PARAMS + 1), \ + concat_copy2 ACONCAT_PARAMS) + +/* Check whether two file descriptors refer to the same file. */ + +extern int fdmatch (int fd1, int fd2); + +/* Return the position of the first bit set in the argument. */ +/* Prototypes vary from system to system, so we only provide a + prototype on systems where we know that we need it. */ +#if defined (HAVE_DECL_FFS) && !HAVE_DECL_FFS +extern int ffs(int); +#endif + +/* Get the working directory. The result is cached, so don't call + chdir() between calls to getpwd(). */ + +extern char * getpwd (void); + +/* Get the current time. */ +/* Prototypes vary from system to system, so we only provide a + prototype on systems where we know that we need it. */ +#ifdef __MINGW32__ +/* Forward declaration to avoid #include . */ +struct timeval; +extern int gettimeofday (struct timeval *, void *); +#endif + +/* Get the amount of time the process has run, in microseconds. */ + +extern long get_run_time (void); + +/* Generate a relocated path to some installation directory. Allocates + return value using malloc. */ + +extern char *make_relative_prefix (const char *, const char *, + const char *) ATTRIBUTE_MALLOC; + +/* Generate a relocated path to some installation directory without + attempting to follow any soft links. Allocates + return value using malloc. */ + +extern char *make_relative_prefix_ignore_links (const char *, const char *, + const char *) ATTRIBUTE_MALLOC; + +/* Choose a temporary directory to use for scratch files. */ + +extern char *choose_temp_base (void) ATTRIBUTE_MALLOC; + +/* Return a temporary file name or NULL if unable to create one. */ + +extern char *make_temp_file (const char *) ATTRIBUTE_MALLOC; + +/* Remove a link to a file unless it is special. */ + +extern int unlink_if_ordinary (const char *); + +/* Allocate memory filled with spaces. Allocates using malloc. */ + +extern const char *spaces (int count); + +/* Return the maximum error number for which strerror will return a + string. */ + +extern int errno_max (void); + +/* Return the name of an errno value (e.g., strerrno (EINVAL) returns + "EINVAL"). */ + +extern const char *strerrno (int); + +/* Given the name of an errno value, return the value. */ + +extern int strtoerrno (const char *); + +/* ANSI's strerror(), but more robust. */ + +extern char *xstrerror (int); + +/* Return the maximum signal number for which strsignal will return a + string. */ + +extern int signo_max (void); + +/* Return a signal message string for a signal number + (e.g., strsignal (SIGHUP) returns something like "Hangup"). */ +/* This is commented out as it can conflict with one in system headers. + We still document its existence though. */ + +/*extern const char *strsignal (int);*/ + +/* Return the name of a signal number (e.g., strsigno (SIGHUP) returns + "SIGHUP"). */ + +extern const char *strsigno (int); + +/* Given the name of a signal, return its number. */ + +extern int strtosigno (const char *); + +/* Register a function to be run by xexit. Returns 0 on success. */ + +extern int xatexit (void (*fn) (void)); + +/* Exit, calling all the functions registered with xatexit. */ + +extern void xexit (int status) ATTRIBUTE_NORETURN; + +/* Set the program name used by xmalloc. */ + +extern void xmalloc_set_program_name (const char *); + +/* Report an allocation failure. */ +extern void xmalloc_failed (size_t) ATTRIBUTE_NORETURN; + +/* Allocate memory without fail. If malloc fails, this will print a + message to stderr (using the name set by xmalloc_set_program_name, + if any) and then call xexit. */ + +extern void *xmalloc (size_t) ATTRIBUTE_MALLOC; + +/* Reallocate memory without fail. This works like xmalloc. Note, + realloc type functions are not suitable for attribute malloc since + they may return the same address across multiple calls. */ + +extern void *xrealloc (void *, size_t); + +/* Allocate memory without fail and set it to zero. This works like + xmalloc. */ + +extern void *xcalloc (size_t, size_t) ATTRIBUTE_MALLOC; + +/* Copy a string into a memory buffer without fail. */ + +extern char *xstrdup (const char *) ATTRIBUTE_MALLOC; + +/* Copy at most N characters from string into a buffer without fail. */ + +extern char *xstrndup (const char *, size_t) ATTRIBUTE_MALLOC; + +/* Copy an existing memory buffer to a new memory buffer without fail. */ + +extern void *xmemdup (const void *, size_t, size_t) ATTRIBUTE_MALLOC; + +/* Physical memory routines. Return values are in BYTES. */ +extern double physmem_total (void); +extern double physmem_available (void); + + +/* These macros provide a K&R/C89/C++-friendly way of allocating structures + with nice encapsulation. The XDELETE*() macros are technically + superfluous, but provided here for symmetry. Using them consistently + makes it easier to update client code to use different allocators such + as new/delete and new[]/delete[]. */ + +/* Scalar allocators. */ + +#define XNEW(T) ((T *) xmalloc (sizeof (T))) +#define XCNEW(T) ((T *) xcalloc (1, sizeof (T))) +#define XDELETE(P) free ((void*) (P)) + +/* Array allocators. */ + +#define XNEWVEC(T, N) ((T *) xmalloc (sizeof (T) * (N))) +#define XCNEWVEC(T, N) ((T *) xcalloc ((N), sizeof (T))) +#define XRESIZEVEC(T, P, N) ((T *) xrealloc ((void *) (P), sizeof (T) * (N))) +#define XDELETEVEC(P) free ((void*) (P)) + +/* Allocators for variable-sized structures and raw buffers. */ + +#define XNEWVAR(T, S) ((T *) xmalloc ((S))) +#define XCNEWVAR(T, S) ((T *) xcalloc (1, (S))) +#define XRESIZEVAR(T, P, S) ((T *) xrealloc ((P), (S))) + +/* Type-safe obstack allocator. */ + +#define XOBNEW(O, T) ((T *) obstack_alloc ((O), sizeof (T))) +#define XOBFINISH(O, T) ((T) obstack_finish ((O))) + +/* hex character manipulation routines */ + +#define _hex_array_size 256 +#define _hex_bad 99 +extern const unsigned char _hex_value[_hex_array_size]; +extern void hex_init (void); +#define hex_p(c) (hex_value (c) != _hex_bad) +/* If you change this, note well: Some code relies on side effects in + the argument being performed exactly once. */ +#define hex_value(c) ((unsigned int) _hex_value[(unsigned char) (c)]) + +/* Flags for pex_init. These are bits to be or'ed together. */ + +/* Record subprocess times, if possible. */ +#define PEX_RECORD_TIMES 0x1 + +/* Use pipes for communication between processes, if possible. */ +#define PEX_USE_PIPES 0x2 + +/* Save files used for communication between processes. */ +#define PEX_SAVE_TEMPS 0x4 + +/* Prepare to execute one or more programs, with standard output of + each program fed to standard input of the next. + FLAGS As above. + PNAME The name of the program to report in error messages. + TEMPBASE A base name to use for temporary files; may be NULL to + use a random name. + Returns NULL on error. */ + +extern struct pex_obj *pex_init (int flags, const char *pname, + const char *tempbase); + +/* Flags for pex_run. These are bits to be or'ed together. */ + +/* Last program in pipeline. Standard output of program goes to + OUTNAME, or, if OUTNAME is NULL, to standard output of caller. Do + not set this if you want to call pex_read_output. After this is + set, pex_run may no longer be called with the same struct + pex_obj. */ +#define PEX_LAST 0x1 + +/* Search for program in executable search path. */ +#define PEX_SEARCH 0x2 + +/* OUTNAME is a suffix. */ +#define PEX_SUFFIX 0x4 + +/* Send program's standard error to standard output. */ +#define PEX_STDERR_TO_STDOUT 0x8 + +/* Input file should be opened in binary mode. This flag is ignored + on Unix. */ +#define PEX_BINARY_INPUT 0x10 + +/* Output file should be opened in binary mode. This flag is ignored + on Unix. For proper behaviour PEX_BINARY_INPUT and + PEX_BINARY_OUTPUT have to match appropriately--i.e., a call using + PEX_BINARY_OUTPUT should be followed by a call using + PEX_BINARY_INPUT. */ +#define PEX_BINARY_OUTPUT 0x20 + +/* Capture stderr to a pipe. The output can be read by + calling pex_read_err and reading from the returned + FILE object. This flag may be specified only for + the last program in a pipeline. + + This flag is supported only on Unix and Windows. */ +#define PEX_STDERR_TO_PIPE 0x40 + +/* Capture stderr in binary mode. This flag is ignored + on Unix. */ +#define PEX_BINARY_ERROR 0x80 + + +/* Execute one program. Returns NULL on success. On error returns an + error string (typically just the name of a system call); the error + string is statically allocated. + + OBJ Returned by pex_init. + + FLAGS As above. + + EXECUTABLE The program to execute. + + ARGV NULL terminated array of arguments to pass to the program. + + OUTNAME Sets the output file name as follows: + + PEX_SUFFIX set (OUTNAME may not be NULL): + TEMPBASE parameter to pex_init not NULL: + Output file name is the concatenation of TEMPBASE + and OUTNAME. + TEMPBASE is NULL: + Output file name is a random file name ending in + OUTNAME. + PEX_SUFFIX not set: + OUTNAME not NULL: + Output file name is OUTNAME. + OUTNAME NULL, TEMPBASE not NULL: + Output file name is randomly chosen using + TEMPBASE. + OUTNAME NULL, TEMPBASE NULL: + Output file name is randomly chosen. + + If PEX_LAST is not set, the output file name is the + name to use for a temporary file holding stdout, if + any (there will not be a file if PEX_USE_PIPES is set + and the system supports pipes). If a file is used, it + will be removed when no longer needed unless + PEX_SAVE_TEMPS is set. + + If PEX_LAST is set, and OUTNAME is not NULL, standard + output is written to the output file name. The file + will not be removed. If PEX_LAST and PEX_SUFFIX are + both set, TEMPBASE may not be NULL. + + ERRNAME If not NULL, this is the name of a file to which + standard error is written. If NULL, standard error of + the program is standard error of the caller. + + ERR On an error return, *ERR is set to an errno value, or + to 0 if there is no relevant errno. +*/ + +extern const char *pex_run (struct pex_obj *obj, int flags, + const char *executable, char * const *argv, + const char *outname, const char *errname, + int *err); + +/* As for pex_run (), but takes an extra parameter to enable the + environment for the child process to be specified. + + ENV The environment for the child process, specified as + an array of character pointers. Each element of the + array should point to a string of the form VAR=VALUE, + with the exception of the last element which must be + a null pointer. +*/ + +extern const char *pex_run_in_environment (struct pex_obj *obj, int flags, + const char *executable, + char * const *argv, + char * const *env, + const char *outname, + const char *errname, int *err); + +/* Return a stream for a temporary file to pass to the first program + in the pipeline as input. The file name is chosen as for pex_run. + pex_run closes the file automatically; don't close it yourself. */ + +extern FILE *pex_input_file (struct pex_obj *obj, int flags, + const char *in_name); + +/* Return a stream for a pipe connected to the standard input of the + first program in the pipeline. You must have passed + `PEX_USE_PIPES' to `pex_init'. Close the returned stream + yourself. */ + +extern FILE *pex_input_pipe (struct pex_obj *obj, int binary); + +/* Read the standard output of the last program to be executed. + pex_run can not be called after this. BINARY should be non-zero if + the file should be opened in binary mode; this is ignored on Unix. + Returns NULL on error. Don't call fclose on the returned FILE; it + will be closed by pex_free. */ + +extern FILE *pex_read_output (struct pex_obj *, int binary); + +/* Read the standard error of the last program to be executed. + pex_run can not be called after this. BINARY should be non-zero if + the file should be opened in binary mode; this is ignored on Unix. + Returns NULL on error. Don't call fclose on the returned FILE; it + will be closed by pex_free. */ + +extern FILE *pex_read_err (struct pex_obj *, int binary); + +/* Return exit status of all programs in VECTOR. COUNT indicates the + size of VECTOR. The status codes in the vector are in the order of + the calls to pex_run. Returns 0 on error, 1 on success. */ + +extern int pex_get_status (struct pex_obj *, int count, int *vector); + +/* Return times of all programs in VECTOR. COUNT indicates the size + of VECTOR. struct pex_time is really just struct timeval, but that + is not portable to all systems. Returns 0 on error, 1 on + success. */ + +struct pex_time +{ + unsigned long user_seconds; + unsigned long user_microseconds; + unsigned long system_seconds; + unsigned long system_microseconds; +}; + +extern int pex_get_times (struct pex_obj *, int count, + struct pex_time *vector); + +/* Clean up a pex_obj. If you have not called pex_get_times or + pex_get_status, this will try to kill the subprocesses. */ + +extern void pex_free (struct pex_obj *); + +/* Just execute one program. Return value is as for pex_run. + FLAGS Combination of PEX_SEARCH and PEX_STDERR_TO_STDOUT. + EXECUTABLE As for pex_run. + ARGV As for pex_run. + PNAME As for pex_init. + OUTNAME As for pex_run when PEX_LAST is set. + ERRNAME As for pex_run. + STATUS Set to exit status on success. + ERR As for pex_run. +*/ + +extern const char *pex_one (int flags, const char *executable, + char * const *argv, const char *pname, + const char *outname, const char *errname, + int *status, int *err); + +/* pexecute and pwait are the old pexecute interface, still here for + backward compatibility. Don't use these for new code. Instead, + use pex_init/pex_run/pex_get_status/pex_free, or pex_one. */ + +/* Definitions used by the pexecute routine. */ + +#define PEXECUTE_FIRST 1 +#define PEXECUTE_LAST 2 +#define PEXECUTE_ONE (PEXECUTE_FIRST + PEXECUTE_LAST) +#define PEXECUTE_SEARCH 4 +#define PEXECUTE_VERBOSE 8 + +/* Execute a program. */ + +extern int pexecute (const char *, char * const *, const char *, + const char *, char **, char **, int); + +/* Wait for pexecute to finish. */ + +extern int pwait (int, int *, int); + +#if !HAVE_DECL_ASPRINTF +/* Like sprintf but provides a pointer to malloc'd storage, which must + be freed by the caller. */ + +extern int asprintf (char **, const char *, ...) ATTRIBUTE_PRINTF_2; +#endif + +#if !HAVE_DECL_VASPRINTF +/* Like vsprintf but provides a pointer to malloc'd storage, which + must be freed by the caller. */ + +extern int vasprintf (char **, const char *, va_list) ATTRIBUTE_PRINTF(2,0); +#endif + +#if defined(HAVE_DECL_SNPRINTF) && !HAVE_DECL_SNPRINTF +/* Like sprintf but prints at most N characters. */ +extern int snprintf (char *, size_t, const char *, ...) ATTRIBUTE_PRINTF_3; +#endif + +#if defined(HAVE_DECL_VSNPRINTF) && !HAVE_DECL_VSNPRINTF +/* Like vsprintf but prints at most N characters. */ +extern int vsnprintf (char *, size_t, const char *, va_list) ATTRIBUTE_PRINTF(3,0); +#endif + +#if defined(HAVE_DECL_STRVERSCMP) && !HAVE_DECL_STRVERSCMP +/* Compare version strings. */ +extern int strverscmp (const char *, const char *); +#endif + +#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0])) + +/* Drastically simplified alloca configurator. If we're using GCC, + we use __builtin_alloca; otherwise we use the C alloca. The C + alloca is always available. You can override GCC by defining + USE_C_ALLOCA yourself. The canonical autoconf macro C_ALLOCA is + also set/unset as it is often used to indicate whether code needs + to call alloca(0). */ +extern void *C_alloca (size_t) ATTRIBUTE_MALLOC; +#undef alloca +#if GCC_VERSION >= 2000 && !defined USE_C_ALLOCA +# define alloca(x) __builtin_alloca(x) +# undef C_ALLOCA +# define ASTRDUP(X) \ + (__extension__ ({ const char *const libiberty_optr = (X); \ + const unsigned long libiberty_len = strlen (libiberty_optr) + 1; \ + char *const libiberty_nptr = (char *const) alloca (libiberty_len); \ + (char *) memcpy (libiberty_nptr, libiberty_optr, libiberty_len); })) +#else +# define alloca(x) C_alloca(x) +# undef USE_C_ALLOCA +# define USE_C_ALLOCA 1 +# undef C_ALLOCA +# define C_ALLOCA 1 +extern const char *libiberty_optr; +extern char *libiberty_nptr; +extern unsigned long libiberty_len; +# define ASTRDUP(X) \ + (libiberty_optr = (X), \ + libiberty_len = strlen (libiberty_optr) + 1, \ + libiberty_nptr = (char *) alloca (libiberty_len), \ + (char *) memcpy (libiberty_nptr, libiberty_optr, libiberty_len)) +#endif + +#ifdef __cplusplus +} +#endif + + +#endif /* ! defined (LIBIBERTY_H) */ diff --git a/include/md5.h b/include/md5.h new file mode 100644 index 0000000..e8eedb9 --- /dev/null +++ b/include/md5.h @@ -0,0 +1,141 @@ +/* md5.h - Declaration of functions and data types used for MD5 sum + computing library functions. + Copyright 1995, 1996, 2000 Free Software Foundation, Inc. + NOTE: The canonical source of this file is maintained with the GNU C + Library. Bugs can be reported to bug-glibc@prep.ai.mit.edu. + + 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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _MD5_H +#define _MD5_H 1 + +#include + +#if defined HAVE_LIMITS_H || _LIBC +# include +#endif + +#include "ansidecl.h" + +/* The following contortions are an attempt to use the C preprocessor + to determine an unsigned integral type that is 32 bits wide. An + alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but + doing that would require that the configure script compile and *run* + the resulting executable. Locally running cross-compiled executables + is usually not possible. */ + +#ifdef _LIBC +# include +typedef u_int32_t md5_uint32; +typedef uintptr_t md5_uintptr; +#else +# define INT_MAX_32_BITS 2147483647 + +/* If UINT_MAX isn't defined, assume it's a 32-bit type. + This should be valid for all systems GNU cares about because + that doesn't include 16-bit systems, and only modern systems + (that certainly have ) have 64+-bit integral types. */ + +# ifndef INT_MAX +# define INT_MAX INT_MAX_32_BITS +# endif + +# if INT_MAX == INT_MAX_32_BITS + typedef unsigned int md5_uint32; +# else +# if SHRT_MAX == INT_MAX_32_BITS + typedef unsigned short md5_uint32; +# else +# if LONG_MAX == INT_MAX_32_BITS + typedef unsigned long md5_uint32; +# else + /* The following line is intended to evoke an error. + Using #error is not portable enough. */ + "Cannot determine unsigned 32-bit data type." +# endif +# endif +# endif +/* We have to make a guess about the integer type equivalent in size + to pointers which should always be correct. */ +typedef unsigned long int md5_uintptr; +#endif + +/* Structure to save state of computation between the single steps. */ +struct md5_ctx +{ + md5_uint32 A; + md5_uint32 B; + md5_uint32 C; + md5_uint32 D; + + md5_uint32 total[2]; + md5_uint32 buflen; + char buffer[128] ATTRIBUTE_ALIGNED_ALIGNOF(md5_uint32); +}; + +/* + * The following three functions are build up the low level used in + * the functions `md5_stream' and `md5_buffer'. + */ + +/* Initialize structure containing state of computation. + (RFC 1321, 3.3: Step 3) */ +extern void md5_init_ctx (struct md5_ctx *ctx); + +/* Starting with the result of former calls of this function (or the + initialization function update the context for the next LEN bytes + starting at BUFFER. + It is necessary that LEN is a multiple of 64!!! */ +extern void md5_process_block (const void *buffer, size_t len, + struct md5_ctx *ctx); + +/* Starting with the result of former calls of this function (or the + initialization function update the context for the next LEN bytes + starting at BUFFER. + It is NOT required that LEN is a multiple of 64. */ +extern void md5_process_bytes (const void *buffer, size_t len, + struct md5_ctx *ctx); + +/* Process the remaining bytes in the buffer and put result from CTX + in first 16 bytes following RESBUF. The result is always in little + endian byte order, so that a byte-wise output yields to the wanted + ASCII representation of the message digest. + + IMPORTANT: On some systems it is required that RESBUF is correctly + aligned for a 32 bits value. */ +extern void *md5_finish_ctx (struct md5_ctx *ctx, void *resbuf); + + +/* Put result from CTX in first 16 bytes following RESBUF. The result is + always in little endian byte order, so that a byte-wise output yields + to the wanted ASCII representation of the message digest. + + IMPORTANT: On some systems it is required that RESBUF is correctly + aligned for a 32 bits value. */ +extern void *md5_read_ctx (const struct md5_ctx *ctx, void *resbuf); + + +/* Compute MD5 message digest for bytes read from STREAM. The + resulting message digest number will be written into the 16 bytes + beginning at RESBLOCK. */ +extern int md5_stream (FILE *stream, void *resblock); + +/* Compute MD5 message digest for LEN bytes beginning at BUFFER. The + result is always in little endian byte order, so that a byte-wise + output yields to the wanted ASCII representation of the message + digest. */ +extern void *md5_buffer (const char *buffer, size_t len, void *resblock); + +#endif diff --git a/include/objalloc.h b/include/objalloc.h new file mode 100644 index 0000000..36772d1 --- /dev/null +++ b/include/objalloc.h @@ -0,0 +1,115 @@ +/* objalloc.h -- routines to allocate memory for objects + Copyright 1997, 2001 Free Software Foundation, Inc. + Written by Ian Lance Taylor, Cygnus Solutions. + +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, 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +#ifndef OBJALLOC_H +#define OBJALLOC_H + +#include "ansidecl.h" + +/* These routines allocate space for an object. The assumption is + that the object will want to allocate space as it goes along, but + will never want to free any particular block. There is a function + to free a block, which also frees all more recently allocated + blocks. There is also a function to free all the allocated space. + + This is essentially a specialization of obstacks. The main + difference is that a block may not be allocated a bit at a time. + Another difference is that these routines are always built on top + of malloc, and always pass an malloc failure back to the caller, + unlike more recent versions of obstacks. */ + +/* This is what an objalloc structure looks like. Callers should not + refer to these fields, nor should they allocate these structure + themselves. Instead, they should only create them via + objalloc_init, and only access them via the functions and macros + listed below. The structure is only defined here so that we can + access it via macros. */ + +struct objalloc +{ + char *current_ptr; + unsigned int current_space; + void *chunks; +}; + +/* Work out the required alignment. */ + +struct objalloc_align { char x; double d; }; + +#if defined (__STDC__) && __STDC__ +#ifndef offsetof +#include +#endif +#endif +#ifndef offsetof +#define offsetof(TYPE, MEMBER) ((unsigned long) &((TYPE *)0)->MEMBER) +#endif +#define OBJALLOC_ALIGN offsetof (struct objalloc_align, d) + +/* Create an objalloc structure. Returns NULL if malloc fails. */ + +extern struct objalloc *objalloc_create (void); + +/* Allocate space from an objalloc structure. Returns NULL if malloc + fails. */ + +extern void *_objalloc_alloc (struct objalloc *, unsigned long); + +/* The macro version of objalloc_alloc. We only define this if using + gcc, because otherwise we would have to evaluate the arguments + multiple times, or use a temporary field as obstack.h does. */ + +#if defined (__GNUC__) && defined (__STDC__) && __STDC__ + +/* NextStep 2.0 cc is really gcc 1.93 but it defines __GNUC__ = 2 and + does not implement __extension__. But that compiler doesn't define + __GNUC_MINOR__. */ +#if __GNUC__ < 2 || (__NeXT__ && !__GNUC_MINOR__) +#define __extension__ +#endif + +#define objalloc_alloc(o, l) \ + __extension__ \ + ({ struct objalloc *__o = (o); \ + unsigned long __len = (l); \ + if (__len == 0) \ + __len = 1; \ + __len = (__len + OBJALLOC_ALIGN - 1) &~ (OBJALLOC_ALIGN - 1); \ + (__len <= __o->current_space \ + ? (__o->current_ptr += __len, \ + __o->current_space -= __len, \ + (void *) (__o->current_ptr - __len)) \ + : _objalloc_alloc (__o, __len)); }) + +#else /* ! __GNUC__ */ + +#define objalloc_alloc(o, l) _objalloc_alloc ((o), (l)) + +#endif /* ! __GNUC__ */ + +/* Free an entire objalloc structure. */ + +extern void objalloc_free (struct objalloc *); + +/* Free a block allocated by objalloc_alloc. This also frees all more + recently allocated blocks. */ + +extern void objalloc_free_block (struct objalloc *, void *); + +#endif /* OBJALLOC_H */ diff --git a/include/obstack.h b/include/obstack.h new file mode 100644 index 0000000..88c2a26 --- /dev/null +++ b/include/obstack.h @@ -0,0 +1,545 @@ +/* obstack.h - object stack macros + Copyright 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1996, 1997, 1998, + 1999, 2000, 2001, 2002, 2003, 2004, 2005 + Free Software Foundation, Inc. + + + NOTE: The canonical source of this file is maintained with the GNU C Library. + Bugs can be reported to bug-glibc@gnu.org. + + 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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, + USA. */ + +/* Summary: + +All the apparent functions defined here are macros. The idea +is that you would use these pre-tested macros to solve a +very specific set of problems, and they would run fast. +Caution: no side-effects in arguments please!! They may be +evaluated MANY times!! + +These macros operate a stack of objects. Each object starts life +small, and may grow to maturity. (Consider building a word syllable +by syllable.) An object can move while it is growing. Once it has +been "finished" it never changes address again. So the "top of the +stack" is typically an immature growing object, while the rest of the +stack is of mature, fixed size and fixed address objects. + +These routines grab large chunks of memory, using a function you +supply, called `obstack_chunk_alloc'. On occasion, they free chunks, +by calling `obstack_chunk_free'. You must define them and declare +them before using any obstack macros. + +Each independent stack is represented by a `struct obstack'. +Each of the obstack macros expects a pointer to such a structure +as the first argument. + +One motivation for this package is the problem of growing char strings +in symbol tables. Unless you are "fascist pig with a read-only mind" +--Gosper's immortal quote from HAKMEM item 154, out of context--you +would not like to put any arbitrary upper limit on the length of your +symbols. + +In practice this often means you will build many short symbols and a +few long symbols. At the time you are reading a symbol you don't know +how long it is. One traditional method is to read a symbol into a +buffer, realloc()ating the buffer every time you try to read a symbol +that is longer than the buffer. This is beaut, but you still will +want to copy the symbol from the buffer to a more permanent +symbol-table entry say about half the time. + +With obstacks, you can work differently. Use one obstack for all symbol +names. As you read a symbol, grow the name in the obstack gradually. +When the name is complete, finalize it. Then, if the symbol exists already, +free the newly read name. + +The way we do this is to take a large chunk, allocating memory from +low addresses. When you want to build a symbol in the chunk you just +add chars above the current "high water mark" in the chunk. When you +have finished adding chars, because you got to the end of the symbol, +you know how long the chars are, and you can create a new object. +Mostly the chars will not burst over the highest address of the chunk, +because you would typically expect a chunk to be (say) 100 times as +long as an average object. + +In case that isn't clear, when we have enough chars to make up +the object, THEY ARE ALREADY CONTIGUOUS IN THE CHUNK (guaranteed) +so we just point to it where it lies. No moving of chars is +needed and this is the second win: potentially long strings need +never be explicitly shuffled. Once an object is formed, it does not +change its address during its lifetime. + +When the chars burst over a chunk boundary, we allocate a larger +chunk, and then copy the partly formed object from the end of the old +chunk to the beginning of the new larger chunk. We then carry on +accreting characters to the end of the object as we normally would. + +A special macro is provided to add a single char at a time to a +growing object. This allows the use of register variables, which +break the ordinary 'growth' macro. + +Summary: + We allocate large chunks. + We carve out one object at a time from the current chunk. + Once carved, an object never moves. + We are free to append data of any size to the currently + growing object. + Exactly one object is growing in an obstack at any one time. + You can run one obstack per control block. + You may have as many control blocks as you dare. + Because of the way we do it, you can `unwind' an obstack + back to a previous state. (You may remove objects much + as you would with a stack.) +*/ + + +/* Don't do the contents of this file more than once. */ + +#ifndef _OBSTACK_H +#define _OBSTACK_H 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* We use subtraction of (char *) 0 instead of casting to int + because on word-addressable machines a simple cast to int + may ignore the byte-within-word field of the pointer. */ + +#ifndef __PTR_TO_INT +# define __PTR_TO_INT(P) ((P) - (char *) 0) +#endif + +#ifndef __INT_TO_PTR +# define __INT_TO_PTR(P) ((P) + (char *) 0) +#endif + +/* We need the type of the resulting object. If __PTRDIFF_TYPE__ is + defined, as with GNU C, use that; that way we don't pollute the + namespace with 's symbols. Otherwise, if is + available, include it and use ptrdiff_t. In traditional C, long is + the best that we can do. */ + +#ifdef __PTRDIFF_TYPE__ +# define PTR_INT_TYPE __PTRDIFF_TYPE__ +#else +# ifdef HAVE_STDDEF_H +# include +# define PTR_INT_TYPE ptrdiff_t +# else +# define PTR_INT_TYPE long +# endif +#endif + +#if defined _LIBC || defined HAVE_STRING_H +# include +# define _obstack_memcpy(To, From, N) memcpy ((To), (From), (N)) +#else +# ifdef memcpy +# define _obstack_memcpy(To, From, N) memcpy ((To), (char *)(From), (N)) +# else +# define _obstack_memcpy(To, From, N) bcopy ((char *)(From), (To), (N)) +# endif +#endif + +struct _obstack_chunk /* Lives at front of each chunk. */ +{ + char *limit; /* 1 past end of this chunk */ + struct _obstack_chunk *prev; /* address of prior chunk or NULL */ + char contents[4]; /* objects begin here */ +}; + +struct obstack /* control current object in current chunk */ +{ + long chunk_size; /* preferred size to allocate chunks in */ + struct _obstack_chunk *chunk; /* address of current struct obstack_chunk */ + char *object_base; /* address of object we are building */ + char *next_free; /* where to add next char to current object */ + char *chunk_limit; /* address of char after current chunk */ + PTR_INT_TYPE temp; /* Temporary for some macros. */ + int alignment_mask; /* Mask of alignment for each object. */ + /* These prototypes vary based on `use_extra_arg', and we use + casts to the prototypeless function type in all assignments, + but having prototypes here quiets -Wstrict-prototypes. */ + struct _obstack_chunk *(*chunkfun) (void *, long); + void (*freefun) (void *, struct _obstack_chunk *); + void *extra_arg; /* first arg for chunk alloc/dealloc funcs */ + unsigned use_extra_arg:1; /* chunk alloc/dealloc funcs take extra arg */ + unsigned maybe_empty_object:1;/* There is a possibility that the current + chunk contains a zero-length object. This + prevents freeing the chunk if we allocate + a bigger chunk to replace it. */ + unsigned alloc_failed:1; /* No longer used, as we now call the failed + handler on error, but retained for binary + compatibility. */ +}; + +/* Declare the external functions we use; they are in obstack.c. */ + +extern void _obstack_newchunk (struct obstack *, int); +extern void _obstack_free (struct obstack *, void *); +extern int _obstack_begin (struct obstack *, int, int, + void *(*) (long), void (*) (void *)); +extern int _obstack_begin_1 (struct obstack *, int, int, + void *(*) (void *, long), + void (*) (void *, void *), void *); +extern int _obstack_memory_used (struct obstack *); + +/* Do the function-declarations after the structs + but before defining the macros. */ + +void obstack_init (struct obstack *obstack); + +void * obstack_alloc (struct obstack *obstack, int size); + +void * obstack_copy (struct obstack *obstack, void *address, int size); +void * obstack_copy0 (struct obstack *obstack, void *address, int size); + +void obstack_free (struct obstack *obstack, void *block); + +void obstack_blank (struct obstack *obstack, int size); + +void obstack_grow (struct obstack *obstack, void *data, int size); +void obstack_grow0 (struct obstack *obstack, void *data, int size); + +void obstack_1grow (struct obstack *obstack, int data_char); +void obstack_ptr_grow (struct obstack *obstack, void *data); +void obstack_int_grow (struct obstack *obstack, int data); + +void * obstack_finish (struct obstack *obstack); + +int obstack_object_size (struct obstack *obstack); + +int obstack_room (struct obstack *obstack); +void obstack_make_room (struct obstack *obstack, int size); +void obstack_1grow_fast (struct obstack *obstack, int data_char); +void obstack_ptr_grow_fast (struct obstack *obstack, void *data); +void obstack_int_grow_fast (struct obstack *obstack, int data); +void obstack_blank_fast (struct obstack *obstack, int size); + +void * obstack_base (struct obstack *obstack); +void * obstack_next_free (struct obstack *obstack); +int obstack_alignment_mask (struct obstack *obstack); +int obstack_chunk_size (struct obstack *obstack); +int obstack_memory_used (struct obstack *obstack); + +/* Error handler called when `obstack_chunk_alloc' failed to allocate + more memory. This can be set to a user defined function. The + default action is to print a message and abort. */ +extern void (*obstack_alloc_failed_handler) (void); + +/* Exit value used when `print_and_abort' is used. */ +extern int obstack_exit_failure; + +/* Pointer to beginning of object being allocated or to be allocated next. + Note that this might not be the final address of the object + because a new chunk might be needed to hold the final size. */ + +#define obstack_base(h) ((h)->object_base) + +/* Size for allocating ordinary chunks. */ + +#define obstack_chunk_size(h) ((h)->chunk_size) + +/* Pointer to next byte not yet allocated in current chunk. */ + +#define obstack_next_free(h) ((h)->next_free) + +/* Mask specifying low bits that should be clear in address of an object. */ + +#define obstack_alignment_mask(h) ((h)->alignment_mask) + +/* To prevent prototype warnings provide complete argument list in + standard C version. */ +# define obstack_init(h) \ + _obstack_begin ((h), 0, 0, \ + (void *(*) (long)) obstack_chunk_alloc, (void (*) (void *)) obstack_chunk_free) + +# define obstack_begin(h, size) \ + _obstack_begin ((h), (size), 0, \ + (void *(*) (long)) obstack_chunk_alloc, (void (*) (void *)) obstack_chunk_free) + +# define obstack_specify_allocation(h, size, alignment, chunkfun, freefun) \ + _obstack_begin ((h), (size), (alignment), \ + (void *(*) (long)) (chunkfun), (void (*) (void *)) (freefun)) + +# define obstack_specify_allocation_with_arg(h, size, alignment, chunkfun, freefun, arg) \ + _obstack_begin_1 ((h), (size), (alignment), \ + (void *(*) (void *, long)) (chunkfun), \ + (void (*) (void *, void *)) (freefun), (arg)) + +# define obstack_chunkfun(h, newchunkfun) \ + ((h) -> chunkfun = (struct _obstack_chunk *(*)(void *, long)) (newchunkfun)) + +# define obstack_freefun(h, newfreefun) \ + ((h) -> freefun = (void (*)(void *, struct _obstack_chunk *)) (newfreefun)) + +#define obstack_1grow_fast(h,achar) (*((h)->next_free)++ = (achar)) + +#define obstack_blank_fast(h,n) ((h)->next_free += (n)) + +#define obstack_memory_used(h) _obstack_memory_used (h) + +#if defined __GNUC__ && defined __STDC__ && __STDC__ +/* NextStep 2.0 cc is really gcc 1.93 but it defines __GNUC__ = 2 and + does not implement __extension__. But that compiler doesn't define + __GNUC_MINOR__. */ +# if __GNUC__ < 2 || (__NeXT__ && !__GNUC_MINOR__) +# define __extension__ +# endif + +/* For GNU C, if not -traditional, + we can define these macros to compute all args only once + without using a global variable. + Also, we can avoid using the `temp' slot, to make faster code. */ + +# define obstack_object_size(OBSTACK) \ + __extension__ \ + ({ struct obstack *__o = (OBSTACK); \ + (unsigned) (__o->next_free - __o->object_base); }) + +# define obstack_room(OBSTACK) \ + __extension__ \ + ({ struct obstack *__o = (OBSTACK); \ + (unsigned) (__o->chunk_limit - __o->next_free); }) + +# define obstack_make_room(OBSTACK,length) \ +__extension__ \ +({ struct obstack *__o = (OBSTACK); \ + int __len = (length); \ + if (__o->chunk_limit - __o->next_free < __len) \ + _obstack_newchunk (__o, __len); \ + (void) 0; }) + +# define obstack_empty_p(OBSTACK) \ + __extension__ \ + ({ struct obstack *__o = (OBSTACK); \ + (__o->chunk->prev == 0 && __o->next_free - __o->chunk->contents == 0); }) + +# define obstack_grow(OBSTACK,where,length) \ +__extension__ \ +({ struct obstack *__o = (OBSTACK); \ + int __len = (length); \ + if (__o->next_free + __len > __o->chunk_limit) \ + _obstack_newchunk (__o, __len); \ + _obstack_memcpy (__o->next_free, (where), __len); \ + __o->next_free += __len; \ + (void) 0; }) + +# define obstack_grow0(OBSTACK,where,length) \ +__extension__ \ +({ struct obstack *__o = (OBSTACK); \ + int __len = (length); \ + if (__o->next_free + __len + 1 > __o->chunk_limit) \ + _obstack_newchunk (__o, __len + 1); \ + _obstack_memcpy (__o->next_free, (where), __len); \ + __o->next_free += __len; \ + *(__o->next_free)++ = 0; \ + (void) 0; }) + +# define obstack_1grow(OBSTACK,datum) \ +__extension__ \ +({ struct obstack *__o = (OBSTACK); \ + if (__o->next_free + 1 > __o->chunk_limit) \ + _obstack_newchunk (__o, 1); \ + obstack_1grow_fast (__o, datum); \ + (void) 0; }) + +/* These assume that the obstack alignment is good enough for pointers or ints, + and that the data added so far to the current object + shares that much alignment. */ + +# define obstack_ptr_grow(OBSTACK,datum) \ +__extension__ \ +({ struct obstack *__o = (OBSTACK); \ + if (__o->next_free + sizeof (void *) > __o->chunk_limit) \ + _obstack_newchunk (__o, sizeof (void *)); \ + obstack_ptr_grow_fast (__o, datum); }) + +# define obstack_int_grow(OBSTACK,datum) \ +__extension__ \ +({ struct obstack *__o = (OBSTACK); \ + if (__o->next_free + sizeof (int) > __o->chunk_limit) \ + _obstack_newchunk (__o, sizeof (int)); \ + obstack_int_grow_fast (__o, datum); }) + +# define obstack_ptr_grow_fast(OBSTACK,aptr) \ +__extension__ \ +({ struct obstack *__o1 = (OBSTACK); \ + *(const void **) __o1->next_free = (aptr); \ + __o1->next_free += sizeof (const void *); \ + (void) 0; }) + +# define obstack_int_grow_fast(OBSTACK,aint) \ +__extension__ \ +({ struct obstack *__o1 = (OBSTACK); \ + *(int *) __o1->next_free = (aint); \ + __o1->next_free += sizeof (int); \ + (void) 0; }) + +# define obstack_blank(OBSTACK,length) \ +__extension__ \ +({ struct obstack *__o = (OBSTACK); \ + int __len = (length); \ + if (__o->chunk_limit - __o->next_free < __len) \ + _obstack_newchunk (__o, __len); \ + obstack_blank_fast (__o, __len); \ + (void) 0; }) + +# define obstack_alloc(OBSTACK,length) \ +__extension__ \ +({ struct obstack *__h = (OBSTACK); \ + obstack_blank (__h, (length)); \ + obstack_finish (__h); }) + +# define obstack_copy(OBSTACK,where,length) \ +__extension__ \ +({ struct obstack *__h = (OBSTACK); \ + obstack_grow (__h, (where), (length)); \ + obstack_finish (__h); }) + +# define obstack_copy0(OBSTACK,where,length) \ +__extension__ \ +({ struct obstack *__h = (OBSTACK); \ + obstack_grow0 (__h, (where), (length)); \ + obstack_finish (__h); }) + +/* The local variable is named __o1 to avoid a name conflict + when obstack_blank is called. */ +# define obstack_finish(OBSTACK) \ +__extension__ \ +({ struct obstack *__o1 = (OBSTACK); \ + void *value; \ + value = (void *) __o1->object_base; \ + if (__o1->next_free == value) \ + __o1->maybe_empty_object = 1; \ + __o1->next_free \ + = __INT_TO_PTR ((__PTR_TO_INT (__o1->next_free)+__o1->alignment_mask)\ + & ~ (__o1->alignment_mask)); \ + if (__o1->next_free - (char *)__o1->chunk \ + > __o1->chunk_limit - (char *)__o1->chunk) \ + __o1->next_free = __o1->chunk_limit; \ + __o1->object_base = __o1->next_free; \ + value; }) + +# define obstack_free(OBSTACK, OBJ) \ +__extension__ \ +({ struct obstack *__o = (OBSTACK); \ + void *__obj = (void *) (OBJ); \ + if (__obj > (void *)__o->chunk && __obj < (void *)__o->chunk_limit) \ + __o->next_free = __o->object_base = (char *) __obj; \ + else (obstack_free) (__o, __obj); }) + +#else /* not __GNUC__ or not __STDC__ */ + +# define obstack_object_size(h) \ + (unsigned) ((h)->next_free - (h)->object_base) + +# define obstack_room(h) \ + (unsigned) ((h)->chunk_limit - (h)->next_free) + +# define obstack_empty_p(h) \ + ((h)->chunk->prev == 0 && (h)->next_free - (h)->chunk->contents == 0) + +/* Note that the call to _obstack_newchunk is enclosed in (..., 0) + so that we can avoid having void expressions + in the arms of the conditional expression. + Casting the third operand to void was tried before, + but some compilers won't accept it. */ + +# define obstack_make_room(h,length) \ +( (h)->temp = (length), \ + (((h)->next_free + (h)->temp > (h)->chunk_limit) \ + ? (_obstack_newchunk ((h), (h)->temp), 0) : 0)) + +# define obstack_grow(h,where,length) \ +( (h)->temp = (length), \ + (((h)->next_free + (h)->temp > (h)->chunk_limit) \ + ? (_obstack_newchunk ((h), (h)->temp), 0) : 0), \ + _obstack_memcpy ((h)->next_free, (where), (h)->temp), \ + (h)->next_free += (h)->temp) + +# define obstack_grow0(h,where,length) \ +( (h)->temp = (length), \ + (((h)->next_free + (h)->temp + 1 > (h)->chunk_limit) \ + ? (_obstack_newchunk ((h), (h)->temp + 1), 0) : 0), \ + _obstack_memcpy ((h)->next_free, (where), (h)->temp), \ + (h)->next_free += (h)->temp, \ + *((h)->next_free)++ = 0) + +# define obstack_1grow(h,datum) \ +( (((h)->next_free + 1 > (h)->chunk_limit) \ + ? (_obstack_newchunk ((h), 1), 0) : 0), \ + obstack_1grow_fast (h, datum)) + +# define obstack_ptr_grow(h,datum) \ +( (((h)->next_free + sizeof (char *) > (h)->chunk_limit) \ + ? (_obstack_newchunk ((h), sizeof (char *)), 0) : 0), \ + obstack_ptr_grow_fast (h, datum)) + +# define obstack_int_grow(h,datum) \ +( (((h)->next_free + sizeof (int) > (h)->chunk_limit) \ + ? (_obstack_newchunk ((h), sizeof (int)), 0) : 0), \ + obstack_int_grow_fast (h, datum)) + +# define obstack_ptr_grow_fast(h,aptr) \ + (((const void **) ((h)->next_free += sizeof (void *)))[-1] = (aptr)) + +# define obstack_int_grow_fast(h,aint) \ + (((int *) ((h)->next_free += sizeof (int)))[-1] = (aptr)) + +# define obstack_blank(h,length) \ +( (h)->temp = (length), \ + (((h)->chunk_limit - (h)->next_free < (h)->temp) \ + ? (_obstack_newchunk ((h), (h)->temp), 0) : 0), \ + obstack_blank_fast (h, (h)->temp)) + +# define obstack_alloc(h,length) \ + (obstack_blank ((h), (length)), obstack_finish ((h))) + +# define obstack_copy(h,where,length) \ + (obstack_grow ((h), (where), (length)), obstack_finish ((h))) + +# define obstack_copy0(h,where,length) \ + (obstack_grow0 ((h), (where), (length)), obstack_finish ((h))) + +# define obstack_finish(h) \ +( ((h)->next_free == (h)->object_base \ + ? (((h)->maybe_empty_object = 1), 0) \ + : 0), \ + (h)->temp = __PTR_TO_INT ((h)->object_base), \ + (h)->next_free \ + = __INT_TO_PTR ((__PTR_TO_INT ((h)->next_free)+(h)->alignment_mask) \ + & ~ ((h)->alignment_mask)), \ + (((h)->next_free - (char *) (h)->chunk \ + > (h)->chunk_limit - (char *) (h)->chunk) \ + ? ((h)->next_free = (h)->chunk_limit) : 0), \ + (h)->object_base = (h)->next_free, \ + __INT_TO_PTR ((h)->temp)) + +# define obstack_free(h,obj) \ +( (h)->temp = (char *) (obj) - (char *) (h)->chunk, \ + (((h)->temp > 0 && (h)->temp < (h)->chunk_limit - (char *) (h)->chunk)\ + ? (int) ((h)->next_free = (h)->object_base \ + = (h)->temp + (char *) (h)->chunk) \ + : (((obstack_free) ((h), (h)->temp + (char *) (h)->chunk), 0), 0))) + +#endif /* not __GNUC__ or not __STDC__ */ + +#ifdef __cplusplus +} /* C++ */ +#endif + +#endif /* obstack.h */ diff --git a/include/partition.h b/include/partition.h new file mode 100644 index 0000000..d8b554f --- /dev/null +++ b/include/partition.h @@ -0,0 +1,82 @@ +/* List implementation of a partition of consecutive integers. + Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc. + Contributed by CodeSourcery, LLC. + + This file is part of GCC. + + GCC 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. + + GCC 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 GCC; see the file COPYING. If not, write to + the Free Software Foundation, 51 Franklin Street - Fifth Floor, + Boston, MA 02110-1301, USA. */ + +/* This package implements a partition of consecutive integers. The + elements are partitioned into classes. Each class is represented + by one of its elements, the canonical element, which is chosen + arbitrarily from elements in the class. The principal operations + on a partition are FIND, which takes an element, determines its + class, and returns the canonical element for that class, and UNION, + which unites the two classes that contain two given elements into a + single class. + + The list implementation used here provides constant-time finds. By + storing the size of each class with the class's canonical element, + it is able to perform unions over all the classes in the partition + in O (N log N) time. */ + +#ifndef _PARTITION_H +#define _PARTITION_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include "ansidecl.h" +#include + +struct partition_elem +{ + /* The canonical element that represents the class containing this + element. */ + int class_element; + /* The next element in this class. Elements in each class form a + circular list. */ + struct partition_elem* next; + /* The number of elements in this class. Valid only if this is the + canonical element for its class. */ + unsigned class_count; +}; + +typedef struct partition_def +{ + /* The number of elements in this partition. */ + int num_elements; + /* The elements in the partition. */ + struct partition_elem elements[1]; +} *partition; + +extern partition partition_new (int); +extern void partition_delete (partition); +extern int partition_union (partition, int, int); +extern void partition_print (partition, FILE*); + +/* Returns the canonical element corresponding to the class containing + ELEMENT__ in PARTITION__. */ + +#define partition_find(partition__, element__) \ + ((partition__)->elements[(element__)].class_element) + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _PARTITION_H */ diff --git a/include/safe-ctype.h b/include/safe-ctype.h new file mode 100644 index 0000000..e59b357 --- /dev/null +++ b/include/safe-ctype.h @@ -0,0 +1,119 @@ +/* replacement macros. + + Copyright (C) 2000, 2001 Free Software Foundation, Inc. + Contributed by Zack Weinberg . + +This file is part of the libiberty library. +Libiberty is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +Libiberty 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with libiberty; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +/* This is a compatible replacement of the standard C library's + with the following properties: + + - Implements all isxxx() macros required by C99. + - Also implements some character classes useful when + parsing C-like languages. + - Does not change behavior depending on the current locale. + - Behaves properly for all values in the range of a signed or + unsigned char. + + To avoid conflicts, this header defines the isxxx functions in upper + case, e.g. ISALPHA not isalpha. */ + +#ifndef SAFE_CTYPE_H +#define SAFE_CTYPE_H + +#ifdef isalpha + #error "safe-ctype.h and ctype.h may not be used simultaneously" +#endif + +/* Determine host character set. */ +#define HOST_CHARSET_UNKNOWN 0 +#define HOST_CHARSET_ASCII 1 +#define HOST_CHARSET_EBCDIC 2 + +#if '\n' == 0x0A && ' ' == 0x20 && '0' == 0x30 \ + && 'A' == 0x41 && 'a' == 0x61 && '!' == 0x21 +# define HOST_CHARSET HOST_CHARSET_ASCII +#else +# if '\n' == 0x15 && ' ' == 0x40 && '0' == 0xF0 \ + && 'A' == 0xC1 && 'a' == 0x81 && '!' == 0x5A +# define HOST_CHARSET HOST_CHARSET_EBCDIC +# else +# define HOST_CHARSET HOST_CHARSET_UNKNOWN +# endif +#endif + +/* Categories. */ + +enum { + /* In C99 */ + _sch_isblank = 0x0001, /* space \t */ + _sch_iscntrl = 0x0002, /* nonprinting characters */ + _sch_isdigit = 0x0004, /* 0-9 */ + _sch_islower = 0x0008, /* a-z */ + _sch_isprint = 0x0010, /* any printing character including ' ' */ + _sch_ispunct = 0x0020, /* all punctuation */ + _sch_isspace = 0x0040, /* space \t \n \r \f \v */ + _sch_isupper = 0x0080, /* A-Z */ + _sch_isxdigit = 0x0100, /* 0-9A-Fa-f */ + + /* Extra categories useful to cpplib. */ + _sch_isidst = 0x0200, /* A-Za-z_ */ + _sch_isvsp = 0x0400, /* \n \r */ + _sch_isnvsp = 0x0800, /* space \t \f \v \0 */ + + /* Combinations of the above. */ + _sch_isalpha = _sch_isupper|_sch_islower, /* A-Za-z */ + _sch_isalnum = _sch_isalpha|_sch_isdigit, /* A-Za-z0-9 */ + _sch_isidnum = _sch_isidst|_sch_isdigit, /* A-Za-z0-9_ */ + _sch_isgraph = _sch_isalnum|_sch_ispunct, /* isprint and not space */ + _sch_iscppsp = _sch_isvsp|_sch_isnvsp, /* isspace + \0 */ + _sch_isbasic = _sch_isprint|_sch_iscppsp /* basic charset of ISO C + (plus ` and @) */ +}; + +/* Character classification. */ +extern const unsigned short _sch_istable[256]; + +#define _sch_test(c, bit) (_sch_istable[(c) & 0xff] & (unsigned short)(bit)) + +#define ISALPHA(c) _sch_test(c, _sch_isalpha) +#define ISALNUM(c) _sch_test(c, _sch_isalnum) +#define ISBLANK(c) _sch_test(c, _sch_isblank) +#define ISCNTRL(c) _sch_test(c, _sch_iscntrl) +#define ISDIGIT(c) _sch_test(c, _sch_isdigit) +#define ISGRAPH(c) _sch_test(c, _sch_isgraph) +#define ISLOWER(c) _sch_test(c, _sch_islower) +#define ISPRINT(c) _sch_test(c, _sch_isprint) +#define ISPUNCT(c) _sch_test(c, _sch_ispunct) +#define ISSPACE(c) _sch_test(c, _sch_isspace) +#define ISUPPER(c) _sch_test(c, _sch_isupper) +#define ISXDIGIT(c) _sch_test(c, _sch_isxdigit) + +#define ISIDNUM(c) _sch_test(c, _sch_isidnum) +#define ISIDST(c) _sch_test(c, _sch_isidst) +#define IS_ISOBASIC(c) _sch_test(c, _sch_isbasic) +#define IS_VSPACE(c) _sch_test(c, _sch_isvsp) +#define IS_NVSPACE(c) _sch_test(c, _sch_isnvsp) +#define IS_SPACE_OR_NUL(c) _sch_test(c, _sch_iscppsp) + +/* Character transformation. */ +extern const unsigned char _sch_toupper[256]; +extern const unsigned char _sch_tolower[256]; +#define TOUPPER(c) _sch_toupper[(c) & 0xff] +#define TOLOWER(c) _sch_tolower[(c) & 0xff] + +#endif /* SAFE_CTYPE_H */ diff --git a/include/sort.h b/include/sort.h new file mode 100644 index 0000000..582af81 --- /dev/null +++ b/include/sort.h @@ -0,0 +1,48 @@ +/* Sorting algorithms. + Copyright (C) 2000, 2002 Free Software Foundation, Inc. + Contributed by Mark Mitchell . + +This file is part of GCC. + +GCC 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. + +GCC 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 GCC; see the file COPYING. If not, write to +the Free Software Foundation, 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +#ifndef SORT_H +#define SORT_H + +#include /* For size_t */ +#ifdef __STDC__ +#include +#endif /* __STDC__ */ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include "ansidecl.h" + +/* Sort an array of pointers. */ + +extern void sort_pointers (size_t, void **, void **); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* SORT_H */ + + + + diff --git a/include/splay-tree.h b/include/splay-tree.h new file mode 100644 index 0000000..b03c581 --- /dev/null +++ b/include/splay-tree.h @@ -0,0 +1,152 @@ +/* A splay-tree datatype. + Copyright 1998, 1999, 2000, 2002, 2007 Free Software Foundation, Inc. + Contributed by Mark Mitchell (mark@markmitchell.com). + + This file is part of GCC. + + GCC 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. + + GCC 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 GCC; see the file COPYING. If not, write to + the Free Software Foundation, 51 Franklin Street - Fifth Floor, + Boston, MA 02110-1301, USA. */ + +/* For an easily readable description of splay-trees, see: + + Lewis, Harry R. and Denenberg, Larry. Data Structures and Their + Algorithms. Harper-Collins, Inc. 1991. + + The major feature of splay trees is that all basic tree operations + are amortized O(log n) time for a tree with n nodes. */ + +#ifndef _SPLAY_TREE_H +#define _SPLAY_TREE_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include "ansidecl.h" + +#ifndef _WIN64 + typedef unsigned long int libi_uhostptr_t; + typedef long int libi_shostptr_t; +#else + typedef unsigned long long libi_uhostptr_t; + typedef long long libi_shostptr_t; +#endif + +#ifndef GTY +#define GTY(X) +#endif + +/* Use typedefs for the key and data types to facilitate changing + these types, if necessary. These types should be sufficiently wide + that any pointer or scalar can be cast to these types, and then + cast back, without loss of precision. */ +typedef libi_uhostptr_t splay_tree_key; +typedef libi_uhostptr_t splay_tree_value; + +/* Forward declaration for a node in the tree. */ +typedef struct splay_tree_node_s *splay_tree_node; + +/* The type of a function which compares two splay-tree keys. The + function should return values as for qsort. */ +typedef int (*splay_tree_compare_fn) (splay_tree_key, splay_tree_key); + +/* The type of a function used to deallocate any resources associated + with the key. */ +typedef void (*splay_tree_delete_key_fn) (splay_tree_key); + +/* The type of a function used to deallocate any resources associated + with the value. */ +typedef void (*splay_tree_delete_value_fn) (splay_tree_value); + +/* The type of a function used to iterate over the tree. */ +typedef int (*splay_tree_foreach_fn) (splay_tree_node, void*); + +/* The type of a function used to allocate memory for tree root and + node structures. The first argument is the number of bytes needed; + the second is a data pointer the splay tree functions pass through + to the allocator. This function must never return zero. */ +typedef void *(*splay_tree_allocate_fn) (int, void *); + +/* The type of a function used to free memory allocated using the + corresponding splay_tree_allocate_fn. The first argument is the + memory to be freed; the latter is a data pointer the splay tree + functions pass through to the freer. */ +typedef void (*splay_tree_deallocate_fn) (void *, void *); + +/* The nodes in the splay tree. */ +struct splay_tree_node_s GTY(()) +{ + /* The key. */ + splay_tree_key GTY ((use_param1)) key; + + /* The value. */ + splay_tree_value GTY ((use_param2)) value; + + /* The left and right children, respectively. */ + splay_tree_node GTY ((use_params)) left; + splay_tree_node GTY ((use_params)) right; +}; + +/* The splay tree itself. */ +struct splay_tree_s GTY(()) +{ + /* The root of the tree. */ + splay_tree_node GTY ((use_params)) root; + + /* The comparision function. */ + splay_tree_compare_fn comp; + + /* The deallocate-key function. NULL if no cleanup is necessary. */ + splay_tree_delete_key_fn delete_key; + + /* The deallocate-value function. NULL if no cleanup is necessary. */ + splay_tree_delete_value_fn delete_value; + + /* Allocate/free functions, and a data pointer to pass to them. */ + splay_tree_allocate_fn allocate; + splay_tree_deallocate_fn deallocate; + void * GTY((skip)) allocate_data; +}; + +typedef struct splay_tree_s *splay_tree; + +extern splay_tree splay_tree_new (splay_tree_compare_fn, + splay_tree_delete_key_fn, + splay_tree_delete_value_fn); +extern splay_tree splay_tree_new_with_allocator (splay_tree_compare_fn, + splay_tree_delete_key_fn, + splay_tree_delete_value_fn, + splay_tree_allocate_fn, + splay_tree_deallocate_fn, + void *); +extern void splay_tree_delete (splay_tree); +extern splay_tree_node splay_tree_insert (splay_tree, + splay_tree_key, + splay_tree_value); +extern void splay_tree_remove (splay_tree, splay_tree_key); +extern splay_tree_node splay_tree_lookup (splay_tree, splay_tree_key); +extern splay_tree_node splay_tree_predecessor (splay_tree, splay_tree_key); +extern splay_tree_node splay_tree_successor (splay_tree, splay_tree_key); +extern splay_tree_node splay_tree_max (splay_tree); +extern splay_tree_node splay_tree_min (splay_tree); +extern int splay_tree_foreach (splay_tree, splay_tree_foreach_fn, void*); +extern int splay_tree_compare_ints (splay_tree_key, splay_tree_key); +extern int splay_tree_compare_pointers (splay_tree_key, splay_tree_key); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _SPLAY_TREE_H */ diff --git a/include/symcat.h b/include/symcat.h new file mode 100644 index 0000000..03a1292 --- /dev/null +++ b/include/symcat.h @@ -0,0 +1,49 @@ +/* Symbol concatenation utilities. + + Copyright (C) 1998, 2000 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 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., + 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef SYM_CAT_H +#define SYM_CAT_H + +#if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE) +#define CONCAT2(a,b) a##b +#define CONCAT3(a,b,c) a##b##c +#define CONCAT4(a,b,c,d) a##b##c##d +#define STRINGX(s) #s +#else +/* Note one should never pass extra whitespace to the CONCATn macros, + e.g. CONCAT2(foo, bar) because traditonal C will keep the space between + the two labels instead of concatenating them. Instead, make sure to + write CONCAT2(foo,bar). */ +#define CONCAT2(a,b) a/**/b +#define CONCAT3(a,b,c) a/**/b/**/c +#define CONCAT4(a,b,c,d) a/**/b/**/c/**/d +#define STRINGX(s) "s" +#endif + +#define XCONCAT2(a,b) CONCAT2(a,b) +#define XCONCAT3(a,b,c) CONCAT3(a,b,c) +#define XCONCAT4(a,b,c,d) CONCAT4(a,b,c,d) + +/* Note the layer of indirection here is typically used to allow + stringification of the expansion of macros. I.e. "#define foo + bar", "XSTRING(foo)", to yield "bar". Be aware that this only + works for __STDC__, not for traditional C which will still resolve + to "foo". */ +#define XSTRING(s) STRINGX(s) + +#endif /* SYM_CAT_H */ diff --git a/include/xregex.h b/include/xregex.h new file mode 100644 index 0000000..645195b --- /dev/null +++ b/include/xregex.h @@ -0,0 +1,28 @@ +/* This file redefines all regex external names before including + a renamed copy of glibc's regex.h. */ + +#ifndef _XREGEX_H +#define _XREGEX_H 1 + +# define regfree xregfree +# define regexec xregexec +# define regcomp xregcomp +# define regerror xregerror +# define re_set_registers xre_set_registers +# define re_match_2 xre_match_2 +# define re_match xre_match +# define re_search xre_search +# define re_compile_pattern xre_compile_pattern +# define re_set_syntax xre_set_syntax +# define re_search_2 xre_search_2 +# define re_compile_fastmap xre_compile_fastmap +# define re_syntax_options xre_syntax_options +# define re_max_failures xre_max_failures + +# define _REGEX_RE_COMP +# define re_comp xre_comp +# define re_exec xre_exec + +#include "xregex2.h" + +#endif /* xregex.h */ diff --git a/include/xregex2.h b/include/xregex2.h new file mode 100644 index 0000000..d3d0da1 --- /dev/null +++ b/include/xregex2.h @@ -0,0 +1,565 @@ +/* Definitions for data structures and routines for the regular + expression library, version 0.12. + + Copyright (C) 1985, 1989, 1990, 1991, 1992, 1993, 1995, 1996, 1997, + 1998, 2000, 2005 Free Software Foundation, Inc. + + This file is part of the GNU C Library. Its master source is NOT part of + the C library, however. The master source lives in /gd/gnu/lib. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA. */ + +#ifndef _REGEX_H +#define _REGEX_H 1 + +/* Allow the use in C++ code. */ +#ifdef __cplusplus +extern "C" { +#endif + +/* POSIX says that must be included (by the caller) before + . */ + +#if !defined _POSIX_C_SOURCE && !defined _POSIX_SOURCE && defined VMS +/* VMS doesn't have `size_t' in , even though POSIX says it + should be there. */ +# include +#endif + +/* The following two types have to be signed and unsigned integer type + wide enough to hold a value of a pointer. For most ANSI compilers + ptrdiff_t and size_t should be likely OK. Still size of these two + types is 2 for Microsoft C. Ugh... */ +typedef long int s_reg_t; +typedef unsigned long int active_reg_t; + +/* The following bits are used to determine the regexp syntax we + recognize. The set/not-set meanings are chosen so that Emacs syntax + remains the value 0. The bits are given in alphabetical order, and + the definitions shifted by one from the previous bit; thus, when we + add or remove a bit, only one other definition need change. */ +typedef unsigned long int reg_syntax_t; + +/* If this bit is not set, then \ inside a bracket expression is literal. + If set, then such a \ quotes the following character. */ +#define RE_BACKSLASH_ESCAPE_IN_LISTS ((unsigned long int) 1) + +/* If this bit is not set, then + and ? are operators, and \+ and \? are + literals. + If set, then \+ and \? are operators and + and ? are literals. */ +#define RE_BK_PLUS_QM (RE_BACKSLASH_ESCAPE_IN_LISTS << 1) + +/* If this bit is set, then character classes are supported. They are: + [:alpha:], [:upper:], [:lower:], [:digit:], [:alnum:], [:xdigit:], + [:space:], [:print:], [:punct:], [:graph:], and [:cntrl:]. + If not set, then character classes are not supported. */ +#define RE_CHAR_CLASSES (RE_BK_PLUS_QM << 1) + +/* If this bit is set, then ^ and $ are always anchors (outside bracket + expressions, of course). + If this bit is not set, then it depends: + ^ is an anchor if it is at the beginning of a regular + expression or after an open-group or an alternation operator; + $ is an anchor if it is at the end of a regular expression, or + before a close-group or an alternation operator. + + This bit could be (re)combined with RE_CONTEXT_INDEP_OPS, because + POSIX draft 11.2 says that * etc. in leading positions is undefined. + We already implemented a previous draft which made those constructs + invalid, though, so we haven't changed the code back. */ +#define RE_CONTEXT_INDEP_ANCHORS (RE_CHAR_CLASSES << 1) + +/* If this bit is set, then special characters are always special + regardless of where they are in the pattern. + If this bit is not set, then special characters are special only in + some contexts; otherwise they are ordinary. Specifically, + * + ? and intervals are only special when not after the beginning, + open-group, or alternation operator. */ +#define RE_CONTEXT_INDEP_OPS (RE_CONTEXT_INDEP_ANCHORS << 1) + +/* If this bit is set, then *, +, ?, and { cannot be first in an re or + immediately after an alternation or begin-group operator. */ +#define RE_CONTEXT_INVALID_OPS (RE_CONTEXT_INDEP_OPS << 1) + +/* If this bit is set, then . matches newline. + If not set, then it doesn't. */ +#define RE_DOT_NEWLINE (RE_CONTEXT_INVALID_OPS << 1) + +/* If this bit is set, then . doesn't match NUL. + If not set, then it does. */ +#define RE_DOT_NOT_NULL (RE_DOT_NEWLINE << 1) + +/* If this bit is set, nonmatching lists [^...] do not match newline. + If not set, they do. */ +#define RE_HAT_LISTS_NOT_NEWLINE (RE_DOT_NOT_NULL << 1) + +/* If this bit is set, either \{...\} or {...} defines an + interval, depending on RE_NO_BK_BRACES. + If not set, \{, \}, {, and } are literals. */ +#define RE_INTERVALS (RE_HAT_LISTS_NOT_NEWLINE << 1) + +/* If this bit is set, +, ? and | aren't recognized as operators. + If not set, they are. */ +#define RE_LIMITED_OPS (RE_INTERVALS << 1) + +/* If this bit is set, newline is an alternation operator. + If not set, newline is literal. */ +#define RE_NEWLINE_ALT (RE_LIMITED_OPS << 1) + +/* If this bit is set, then `{...}' defines an interval, and \{ and \} + are literals. + If not set, then `\{...\}' defines an interval. */ +#define RE_NO_BK_BRACES (RE_NEWLINE_ALT << 1) + +/* If this bit is set, (...) defines a group, and \( and \) are literals. + If not set, \(...\) defines a group, and ( and ) are literals. */ +#define RE_NO_BK_PARENS (RE_NO_BK_BRACES << 1) + +/* If this bit is set, then \ matches . + If not set, then \ is a back-reference. */ +#define RE_NO_BK_REFS (RE_NO_BK_PARENS << 1) + +/* If this bit is set, then | is an alternation operator, and \| is literal. + If not set, then \| is an alternation operator, and | is literal. */ +#define RE_NO_BK_VBAR (RE_NO_BK_REFS << 1) + +/* If this bit is set, then an ending range point collating higher + than the starting range point, as in [z-a], is invalid. + If not set, then when ending range point collates higher than the + starting range point, the range is ignored. */ +#define RE_NO_EMPTY_RANGES (RE_NO_BK_VBAR << 1) + +/* If this bit is set, then an unmatched ) is ordinary. + If not set, then an unmatched ) is invalid. */ +#define RE_UNMATCHED_RIGHT_PAREN_ORD (RE_NO_EMPTY_RANGES << 1) + +/* If this bit is set, succeed as soon as we match the whole pattern, + without further backtracking. */ +#define RE_NO_POSIX_BACKTRACKING (RE_UNMATCHED_RIGHT_PAREN_ORD << 1) + +/* If this bit is set, do not process the GNU regex operators. + If not set, then the GNU regex operators are recognized. */ +#define RE_NO_GNU_OPS (RE_NO_POSIX_BACKTRACKING << 1) + +/* If this bit is set, turn on internal regex debugging. + If not set, and debugging was on, turn it off. + This only works if regex.c is compiled -DDEBUG. + We define this bit always, so that all that's needed to turn on + debugging is to recompile regex.c; the calling code can always have + this bit set, and it won't affect anything in the normal case. */ +#define RE_DEBUG (RE_NO_GNU_OPS << 1) + +/* If this bit is set, a syntactically invalid interval is treated as + a string of ordinary characters. For example, the ERE 'a{1' is + treated as 'a\{1'. */ +#define RE_INVALID_INTERVAL_ORD (RE_DEBUG << 1) + +/* This global variable defines the particular regexp syntax to use (for + some interfaces). When a regexp is compiled, the syntax used is + stored in the pattern buffer, so changing this does not affect + already-compiled regexps. */ +extern reg_syntax_t re_syntax_options; + +/* Define combinations of the above bits for the standard possibilities. + (The [[[ comments delimit what gets put into the Texinfo file, so + don't delete them!) */ +/* [[[begin syntaxes]]] */ +#define RE_SYNTAX_EMACS 0 + +#define RE_SYNTAX_AWK \ + (RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DOT_NOT_NULL \ + | RE_NO_BK_PARENS | RE_NO_BK_REFS \ + | RE_NO_BK_VBAR | RE_NO_EMPTY_RANGES \ + | RE_DOT_NEWLINE | RE_CONTEXT_INDEP_ANCHORS \ + | RE_UNMATCHED_RIGHT_PAREN_ORD | RE_NO_GNU_OPS) + +#define RE_SYNTAX_GNU_AWK \ + ((RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DEBUG) \ + & ~(RE_DOT_NOT_NULL | RE_INTERVALS | RE_CONTEXT_INDEP_OPS)) + +#define RE_SYNTAX_POSIX_AWK \ + (RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS \ + | RE_INTERVALS | RE_NO_GNU_OPS) + +#define RE_SYNTAX_GREP \ + (RE_BK_PLUS_QM | RE_CHAR_CLASSES \ + | RE_HAT_LISTS_NOT_NEWLINE | RE_INTERVALS \ + | RE_NEWLINE_ALT) + +#define RE_SYNTAX_EGREP \ + (RE_CHAR_CLASSES | RE_CONTEXT_INDEP_ANCHORS \ + | RE_CONTEXT_INDEP_OPS | RE_HAT_LISTS_NOT_NEWLINE \ + | RE_NEWLINE_ALT | RE_NO_BK_PARENS \ + | RE_NO_BK_VBAR) + +#define RE_SYNTAX_POSIX_EGREP \ + (RE_SYNTAX_EGREP | RE_INTERVALS | RE_NO_BK_BRACES \ + | RE_INVALID_INTERVAL_ORD) + +/* P1003.2/D11.2, section 4.20.7.1, lines 5078ff. */ +#define RE_SYNTAX_ED RE_SYNTAX_POSIX_BASIC + +#define RE_SYNTAX_SED RE_SYNTAX_POSIX_BASIC + +/* Syntax bits common to both basic and extended POSIX regex syntax. */ +#define _RE_SYNTAX_POSIX_COMMON \ + (RE_CHAR_CLASSES | RE_DOT_NEWLINE | RE_DOT_NOT_NULL \ + | RE_INTERVALS | RE_NO_EMPTY_RANGES) + +#define RE_SYNTAX_POSIX_BASIC \ + (_RE_SYNTAX_POSIX_COMMON | RE_BK_PLUS_QM) + +/* Differs from ..._POSIX_BASIC only in that RE_BK_PLUS_QM becomes + RE_LIMITED_OPS, i.e., \? \+ \| are not recognized. Actually, this + isn't minimal, since other operators, such as \`, aren't disabled. */ +#define RE_SYNTAX_POSIX_MINIMAL_BASIC \ + (_RE_SYNTAX_POSIX_COMMON | RE_LIMITED_OPS) + +#define RE_SYNTAX_POSIX_EXTENDED \ + (_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \ + | RE_CONTEXT_INDEP_OPS | RE_NO_BK_BRACES \ + | RE_NO_BK_PARENS | RE_NO_BK_VBAR \ + | RE_CONTEXT_INVALID_OPS | RE_UNMATCHED_RIGHT_PAREN_ORD) + +/* Differs from ..._POSIX_EXTENDED in that RE_CONTEXT_INDEP_OPS is + removed and RE_NO_BK_REFS is added. */ +#define RE_SYNTAX_POSIX_MINIMAL_EXTENDED \ + (_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \ + | RE_CONTEXT_INVALID_OPS | RE_NO_BK_BRACES \ + | RE_NO_BK_PARENS | RE_NO_BK_REFS \ + | RE_NO_BK_VBAR | RE_UNMATCHED_RIGHT_PAREN_ORD) +/* [[[end syntaxes]]] */ + +/* Maximum number of duplicates an interval can allow. Some systems + (erroneously) define this in other header files, but we want our + value, so remove any previous define. */ +#ifdef RE_DUP_MAX +# undef RE_DUP_MAX +#endif +/* If sizeof(int) == 2, then ((1 << 15) - 1) overflows. */ +#define RE_DUP_MAX (0x7fff) + + +/* POSIX `cflags' bits (i.e., information for `regcomp'). */ + +/* If this bit is set, then use extended regular expression syntax. + If not set, then use basic regular expression syntax. */ +#define REG_EXTENDED 1 + +/* If this bit is set, then ignore case when matching. + If not set, then case is significant. */ +#define REG_ICASE (REG_EXTENDED << 1) + +/* If this bit is set, then anchors do not match at newline + characters in the string. + If not set, then anchors do match at newlines. */ +#define REG_NEWLINE (REG_ICASE << 1) + +/* If this bit is set, then report only success or fail in regexec. + If not set, then returns differ between not matching and errors. */ +#define REG_NOSUB (REG_NEWLINE << 1) + + +/* POSIX `eflags' bits (i.e., information for regexec). */ + +/* If this bit is set, then the beginning-of-line operator doesn't match + the beginning of the string (presumably because it's not the + beginning of a line). + If not set, then the beginning-of-line operator does match the + beginning of the string. */ +#define REG_NOTBOL 1 + +/* Like REG_NOTBOL, except for the end-of-line. */ +#define REG_NOTEOL (1 << 1) + + +/* If any error codes are removed, changed, or added, update the + `re_error_msg' table in regex.c. */ +typedef enum +{ +#ifdef _XOPEN_SOURCE + REG_ENOSYS = -1, /* This will never happen for this implementation. */ +#endif + + REG_NOERROR = 0, /* Success. */ + REG_NOMATCH, /* Didn't find a match (for regexec). */ + + /* POSIX regcomp return error codes. (In the order listed in the + standard.) */ + REG_BADPAT, /* Invalid pattern. */ + REG_ECOLLATE, /* Not implemented. */ + REG_ECTYPE, /* Invalid character class name. */ + REG_EESCAPE, /* Trailing backslash. */ + REG_ESUBREG, /* Invalid back reference. */ + REG_EBRACK, /* Unmatched left bracket. */ + REG_EPAREN, /* Parenthesis imbalance. */ + REG_EBRACE, /* Unmatched \{. */ + REG_BADBR, /* Invalid contents of \{\}. */ + REG_ERANGE, /* Invalid range end. */ + REG_ESPACE, /* Ran out of memory. */ + REG_BADRPT, /* No preceding re for repetition op. */ + + /* Error codes we've added. */ + REG_EEND, /* Premature end. */ + REG_ESIZE, /* Compiled pattern bigger than 2^16 bytes. */ + REG_ERPAREN /* Unmatched ) or \); not returned from regcomp. */ +} reg_errcode_t; + +/* This data structure represents a compiled pattern. Before calling + the pattern compiler, the fields `buffer', `allocated', `fastmap', + `translate', and `no_sub' can be set. After the pattern has been + compiled, the `re_nsub' field is available. All other fields are + private to the regex routines. */ + +#ifndef RE_TRANSLATE_TYPE +# define RE_TRANSLATE_TYPE char * +#endif + +struct re_pattern_buffer +{ +/* [[[begin pattern_buffer]]] */ + /* Space that holds the compiled pattern. It is declared as + `unsigned char *' because its elements are + sometimes used as array indexes. */ + unsigned char *buffer; + + /* Number of bytes to which `buffer' points. */ + unsigned long int allocated; + + /* Number of bytes actually used in `buffer'. */ + unsigned long int used; + + /* Syntax setting with which the pattern was compiled. */ + reg_syntax_t syntax; + + /* Pointer to a fastmap, if any, otherwise zero. re_search uses + the fastmap, if there is one, to skip over impossible + starting points for matches. */ + char *fastmap; + + /* Either a translate table to apply to all characters before + comparing them, or zero for no translation. The translation + is applied to a pattern when it is compiled and to a string + when it is matched. */ + RE_TRANSLATE_TYPE translate; + + /* Number of subexpressions found by the compiler. */ + size_t re_nsub; + + /* Zero if this pattern cannot match the empty string, one else. + Well, in truth it's used only in `re_search_2', to see + whether or not we should use the fastmap, so we don't set + this absolutely perfectly; see `re_compile_fastmap' (the + `duplicate' case). */ + unsigned can_be_null : 1; + + /* If REGS_UNALLOCATED, allocate space in the `regs' structure + for `max (RE_NREGS, re_nsub + 1)' groups. + If REGS_REALLOCATE, reallocate space if necessary. + If REGS_FIXED, use what's there. */ +#define REGS_UNALLOCATED 0 +#define REGS_REALLOCATE 1 +#define REGS_FIXED 2 + unsigned regs_allocated : 2; + + /* Set to zero when `regex_compile' compiles a pattern; set to one + by `re_compile_fastmap' if it updates the fastmap. */ + unsigned fastmap_accurate : 1; + + /* If set, `re_match_2' does not return information about + subexpressions. */ + unsigned no_sub : 1; + + /* If set, a beginning-of-line anchor doesn't match at the + beginning of the string. */ + unsigned not_bol : 1; + + /* Similarly for an end-of-line anchor. */ + unsigned not_eol : 1; + + /* If true, an anchor at a newline matches. */ + unsigned newline_anchor : 1; + +/* [[[end pattern_buffer]]] */ +}; + +typedef struct re_pattern_buffer regex_t; + +/* Type for byte offsets within the string. POSIX mandates this. */ +typedef int regoff_t; + + +/* This is the structure we store register match data in. See + regex.texinfo for a full description of what registers match. */ +struct re_registers +{ + unsigned num_regs; + regoff_t *start; + regoff_t *end; +}; + + +/* If `regs_allocated' is REGS_UNALLOCATED in the pattern buffer, + `re_match_2' returns information about at least this many registers + the first time a `regs' structure is passed. */ +#ifndef RE_NREGS +# define RE_NREGS 30 +#endif + + +/* POSIX specification for registers. Aside from the different names than + `re_registers', POSIX uses an array of structures, instead of a + structure of arrays. */ +typedef struct +{ + regoff_t rm_so; /* Byte offset from string's start to substring's start. */ + regoff_t rm_eo; /* Byte offset from string's start to substring's end. */ +} regmatch_t; + +/* Declarations for routines. */ + +/* To avoid duplicating every routine declaration -- once with a + prototype (if we are ANSI), and once without (if we aren't) -- we + use the following macro to declare argument types. This + unfortunately clutters up the declarations a bit, but I think it's + worth it. */ + +/* Sets the current default syntax to SYNTAX, and return the old syntax. + You can also simply assign to the `re_syntax_options' variable. */ +extern reg_syntax_t re_set_syntax (reg_syntax_t syntax); + +/* Compile the regular expression PATTERN, with length LENGTH + and syntax given by the global `re_syntax_options', into the buffer + BUFFER. Return NULL if successful, and an error string if not. */ +extern const char *re_compile_pattern (const char *pattern, size_t length, + struct re_pattern_buffer *buffer); + + +/* Compile a fastmap for the compiled pattern in BUFFER; used to + accelerate searches. Return 0 if successful and -2 if was an + internal error. */ +extern int re_compile_fastmap (struct re_pattern_buffer *buffer); + + +/* Search in the string STRING (with length LENGTH) for the pattern + compiled into BUFFER. Start searching at position START, for RANGE + characters. Return the starting position of the match, -1 for no + match, or -2 for an internal error. Also return register + information in REGS (if REGS and BUFFER->no_sub are nonzero). */ +extern int re_search (struct re_pattern_buffer *buffer, const char *string, + int length, int start, int range, + struct re_registers *regs); + + +/* Like `re_search', but search in the concatenation of STRING1 and + STRING2. Also, stop searching at index START + STOP. */ +extern int re_search_2 (struct re_pattern_buffer *buffer, const char *string1, + int length1, const char *string2, int length2, + int start, int range, struct re_registers *regs, + int stop); + + +/* Like `re_search', but return how many characters in STRING the regexp + in BUFFER matched, starting at position START. */ +extern int re_match (struct re_pattern_buffer *buffer, const char *string, + int length, int start, struct re_registers *regs); + + +/* Relates to `re_match' as `re_search_2' relates to `re_search'. */ +extern int re_match_2 (struct re_pattern_buffer *buffer, const char *string1, + int length1, const char *string2, int length2, + int start, struct re_registers *regs, int stop); + + +/* Set REGS to hold NUM_REGS registers, storing them in STARTS and + ENDS. Subsequent matches using BUFFER and REGS will use this memory + for recording register information. STARTS and ENDS must be + allocated with malloc, and must each be at least `NUM_REGS * sizeof + (regoff_t)' bytes long. + + If NUM_REGS == 0, then subsequent matches should allocate their own + register data. + + Unless this function is called, the first search or match using + PATTERN_BUFFER will allocate its own register data, without + freeing the old data. */ +extern void re_set_registers (struct re_pattern_buffer *buffer, + struct re_registers *regs, + unsigned num_regs, regoff_t *starts, + regoff_t *ends); + +#if defined _REGEX_RE_COMP || defined _LIBC +# ifndef _CRAY +/* 4.2 bsd compatibility. */ +extern char *re_comp (const char *); +extern int re_exec (const char *); +# endif +#endif + +/* GCC 2.95 and later have "__restrict"; C99 compilers have + "restrict", and "configure" may have defined "restrict". */ +#ifndef __restrict +# if ! (2 < __GNUC__ || (2 == __GNUC__ && 95 <= __GNUC_MINOR__)) +# if defined restrict || 199901L <= __STDC_VERSION__ +# define __restrict restrict +# else +# define __restrict +# endif +# endif +#endif + +/* GCC 3.1 and later support declaring arrays as non-overlapping + using the syntax array_name[restrict] */ +#ifndef __restrict_arr +# if ! (3 < __GNUC__ || (3 == __GNUC__ && 1 <= __GNUC_MINOR__)) || defined (__GNUG__) +# define __restrict_arr +# else +# define __restrict_arr __restrict +# endif +#endif + +/* POSIX compatibility. */ +extern int regcomp (regex_t *__restrict __preg, + const char *__restrict __pattern, + int __cflags); + +#if (__GNUC__) +__extension__ +#endif +extern int regexec (const regex_t *__restrict __preg, + const char *__restrict __string, size_t __nmatch, + regmatch_t __pmatch[__restrict_arr], + int __eflags); + +extern size_t regerror (int __errcode, const regex_t *__preg, + char *__errbuf, size_t __errbuf_size); + +extern void regfree (regex_t *__preg); + + +#ifdef __cplusplus +} +#endif /* C++ */ + +#endif /* regex.h */ + +/* +Local variables: +make-backup-files: t +version-control: t +trim-versions-without-asking: nil +End: +*/ diff --git a/include/xtensa-config.h b/include/xtensa-config.h new file mode 100644 index 0000000..2aca5fe --- /dev/null +++ b/include/xtensa-config.h @@ -0,0 +1,166 @@ +/* Xtensa configuration settings. + Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007 + Free Software Foundation, Inc. + Contributed by Bob Wilson (bwilson@tensilica.com) at Tensilica. + + 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, 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef XTENSA_CONFIG_H +#define XTENSA_CONFIG_H + +/* The macros defined here match those with the same names in the Xtensa + compile-time HAL (Hardware Abstraction Layer). Please refer to the + Xtensa System Software Reference Manual for documentation of these + macros. */ + +#undef XCHAL_HAVE_BE +#define XCHAL_HAVE_BE 1 + +#undef XCHAL_HAVE_DENSITY +#define XCHAL_HAVE_DENSITY 1 + +#undef XCHAL_HAVE_CONST16 +#define XCHAL_HAVE_CONST16 0 + +#undef XCHAL_HAVE_ABS +#define XCHAL_HAVE_ABS 1 + +#undef XCHAL_HAVE_ADDX +#define XCHAL_HAVE_ADDX 1 + +#undef XCHAL_HAVE_L32R +#define XCHAL_HAVE_L32R 1 + +#undef XSHAL_USE_ABSOLUTE_LITERALS +#define XSHAL_USE_ABSOLUTE_LITERALS 0 + +#undef XCHAL_HAVE_MAC16 +#define XCHAL_HAVE_MAC16 0 + +#undef XCHAL_HAVE_MUL16 +#define XCHAL_HAVE_MUL16 0 + +#undef XCHAL_HAVE_MUL32 +#define XCHAL_HAVE_MUL32 0 + +#undef XCHAL_HAVE_MUL32_HIGH +#define XCHAL_HAVE_MUL32_HIGH 0 + +#undef XCHAL_HAVE_DIV32 +#define XCHAL_HAVE_DIV32 0 + +#undef XCHAL_HAVE_NSA +#define XCHAL_HAVE_NSA 1 + +#undef XCHAL_HAVE_MINMAX +#define XCHAL_HAVE_MINMAX 0 + +#undef XCHAL_HAVE_SEXT +#define XCHAL_HAVE_SEXT 0 + +#undef XCHAL_HAVE_LOOPS +#define XCHAL_HAVE_LOOPS 1 + +#undef XCHAL_HAVE_THREADPTR +#define XCHAL_HAVE_THREADPTR 1 + +#undef XCHAL_HAVE_RELEASE_SYNC +#define XCHAL_HAVE_RELEASE_SYNC 0 + +#undef XCHAL_HAVE_S32C1I +#define XCHAL_HAVE_S32C1I 0 + +#undef XCHAL_HAVE_BOOLEANS +#define XCHAL_HAVE_BOOLEANS 0 + +#undef XCHAL_HAVE_FP +#define XCHAL_HAVE_FP 0 + +#undef XCHAL_HAVE_FP_DIV +#define XCHAL_HAVE_FP_DIV 0 + +#undef XCHAL_HAVE_FP_RECIP +#define XCHAL_HAVE_FP_RECIP 0 + +#undef XCHAL_HAVE_FP_SQRT +#define XCHAL_HAVE_FP_SQRT 0 + +#undef XCHAL_HAVE_FP_RSQRT +#define XCHAL_HAVE_FP_RSQRT 0 + +#undef XCHAL_HAVE_WINDOWED +#define XCHAL_HAVE_WINDOWED 1 + +#undef XCHAL_HAVE_WIDE_BRANCHES +#define XCHAL_HAVE_WIDE_BRANCHES 0 + +#undef XCHAL_HAVE_PREDICTED_BRANCHES +#define XCHAL_HAVE_PREDICTED_BRANCHES 0 + + +#undef XCHAL_ICACHE_SIZE +#define XCHAL_ICACHE_SIZE 8192 + +#undef XCHAL_DCACHE_SIZE +#define XCHAL_DCACHE_SIZE 8192 + +#undef XCHAL_ICACHE_LINESIZE +#define XCHAL_ICACHE_LINESIZE 16 + +#undef XCHAL_DCACHE_LINESIZE +#define XCHAL_DCACHE_LINESIZE 16 + +#undef XCHAL_ICACHE_LINEWIDTH +#define XCHAL_ICACHE_LINEWIDTH 4 + +#undef XCHAL_DCACHE_LINEWIDTH +#define XCHAL_DCACHE_LINEWIDTH 4 + +#undef XCHAL_DCACHE_IS_WRITEBACK +#define XCHAL_DCACHE_IS_WRITEBACK 0 + + +#undef XCHAL_HAVE_MMU +#define XCHAL_HAVE_MMU 1 + +#undef XCHAL_MMU_MIN_PTE_PAGE_SIZE +#define XCHAL_MMU_MIN_PTE_PAGE_SIZE 12 + + +#undef XCHAL_HAVE_DEBUG +#define XCHAL_HAVE_DEBUG 1 + +#undef XCHAL_NUM_IBREAK +#define XCHAL_NUM_IBREAK 2 + +#undef XCHAL_NUM_DBREAK +#define XCHAL_NUM_DBREAK 2 + +#undef XCHAL_DEBUGLEVEL +#define XCHAL_DEBUGLEVEL 4 + + +#undef XCHAL_INST_FETCH_WIDTH +#define XCHAL_INST_FETCH_WIDTH 4 + + +#undef XSHAL_ABI +#undef XTHAL_ABI_WINDOWED +#undef XTHAL_ABI_CALL0 +#define XSHAL_ABI XTHAL_ABI_WINDOWED +#define XTHAL_ABI_WINDOWED 0 +#define XTHAL_ABI_CALL0 1 + +#endif /* !XTENSA_CONFIG_H */ diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog new file mode 100644 index 0000000..574e054 --- /dev/null +++ b/libcpp/ChangeLog @@ -0,0 +1,1253 @@ +2008-01-07 Fred Fish + + PR preprocessor/30363: + * traditional.c (replace_args_and_push): Add local variable + cxtquote, calculate the replacement text size assuming a + worst case of every input character quoted with backslash, + and properly handle output quoting of quote characters in + actual arguments used in function-like macros. + +2008-01-03 Tom Tromey + + PR preprocessor/34602. + * directives.c (do_line): Don't try to spell EOF token. + (do_linemarker): Add comment. + +2007-12-11 DJ Delorie + + * charset.c (convert_using_iconv): Close out any shift states, + returning to the initial state. + +2007-12-06 Tom Tromey + + PR c/29172: + * internal.h (struct cpp_reader) : Changed + type. + : Removed. + * files.c (FILE_HASH_POOL_SIZE): New macro. + (struct file_hash_entry_pool): New. + (destroy_all_cpp_files): New function. + (allocate_file_hash_entries): Allocate a file_hash_entry_pool. + (new_file_hash_entry): Update. + (free_file_hash_entries): New function. + (_cpp_cleanup_files): Call free_file_hash_entries and + destroy_all_cpp_files. + (cpp_clear_file_cache): New function. + * include/cpplib.h (cpp_clear_file_cache): Declare. + +2007-12-03 Tom Tromey + + PR preprocessor/34288: + * configure.ac, config.in: Rebuilt. + * configure.ac: Check for ssize_t. + +2007-11-30 Tom Tromey + + PR preprocessor/32868: + * macro.c (_cpp_create_definition): Special case + __STDC_FORMAT_MACROS. + +2007-11-16 Michael Matz + + * files.c (search_path_head): Fix check for absolute paths. + +2007-11-11 Tom Tromey + + PR c++/17557: + * include/cpplib.h (cpp_included_before): Declare. + * files.c (struct file_hash_entry) : New field. + (_cpp_find_file): Initialize new field. + (make_cpp_dir): Likewise. + (cpp_included_before): New function. + +2007-11-01 Tom Tromey + + PR preprocessor/30805: + * macro.c (paste_tokens): Handle padding token. + (paste_tokens): Don't abort unless padding has PASTE_LEFT flag. + +2007-10-31 Tom Tromey + + PR preprocessor/30786: + * macro.c (builtin_macro): Return result of _cpp_do__Pragma. + * directives.c (_cpp_do__Pragma): Return error status. + * internal.h (_cpp_do__Pragma): Update. + * directives.c (get__Pragma_string): Back up if EOF seen. + +2007-09-06 Tom Tromey + + * internal.h (struct cpp_reader) : New + field. + (struct cpp_reader) : Likewise. + * init.c (cpp_set_line_map): New function. + * line-map.c (linemap_add): Use linemap's allocator. + * include/line-map.h (GTY): Define. + (line_map_realloc): New typedef. + (struct line_map): Mark with GTY. + (struct line_maps): Likewise. + (struct line_maps) : Likewise. + (struct line_maps) : New field. + * include/symtab.h (GTY): Conditionally define. + * include/cpplib.h (cpp_set_line_map): Declare. + (cpp_get_token_with_location): Declare. + * macro.c (cpp_get_token): Set invocation_location on the reader. + (cpp_get_token_with_location): New function. + +2007-08-30 Chao-ying Fu + + * expr.c (interpret_float_suffix): Support hr, r, lr, llr, uhr, ur, + ulr, ullr, hk, k, lk, llk, uhk, uk, ulk, ullk. + (cpp_classify_number): Support decimal fixed-point constants without + exponents. + Warn about fixed-point constants when -pedantic. + * include/cpplib.h (CPP_N_SMALL, CPP_N_MEDIUM, CPP_N_LARGE): Change + comments to support fixed-point values. + (CPP_N_FRACT, CPP_N_ACCUM): Define. + +2007-08-18 Tom Tromey + + PR preprocessor/32974: + * directives.c (parse_include): Don't check for EOL when + processing #pragma dependency. + +2007-07-30 Ollie Wild + + * directives-only.c: New file. + * internal.h (struct _cpp_dir_only_callbacks): New. + (_cpp_preprocess_dir_only): New function. + * directives.c (_cpp_handle_directive): Check directives_only before + disabling execution of indented directives. + * files.c (_cpp_stack_file): Add directives_only check. + * include/cpplib.h (struct cpp_options): Add directives_only. + (cpp_init_special_builtins): New function. + * init.c (cpp_init_special_builtins): New function. + (cpp_init_builtins): Move builtin_array initialization to + cpp_init_special_builtins. + (post_options): Check directives_only before setting + pfile->state.prevent_expansion = 1. + * macro.c (_cpp_builtin_macro_text): Print an error if __COUNTER__ + is expanded inside a directive while -fdirectives-only is enabled. + * Makefile.in (libcpp_a_OBJS): Add directives-only.o. + (libcpp_a_SOURCES): Add directives-only.c. + +2007-07-04 Uros Bizjak + + * traditional.c (_cpp_scan_out_logical_line): Initialize + fmacro.args, fmacro.node, fmacro.offset, fmacro.line and + fmacro.args to prevent 'may be used uninitialized' warning. + +2007-07-03 Uros Bizjak + + * include/cpplib.h (CPP_N_WIDTH_MD, CPP_N_MD_W, CPP_N_MD_Q): + Add new constants. + * expr.c (interpret_float_suffix): Process 'w', 'W', 'q' and 'Q' + suffixes. Return CPP_N_MD_W for 'w' or 'W' suffixes and CPP_N_MD_Q + for 'q' or 'Q' suffixes. + +2007-06-17 Danny Smith + + * files.c (open_file): Prevent the call + for stat from overwriting errno. + +2007-06-09 Vladimir Prus + + * files.c (open_file): Account for the + fact that on windows, opening a directory gives + EACCES. + +2007-06-05 Joerg Wunsch + + PR preprocessor/23479 + * expr.c (cpp_classify_number): Implement 0b-prefixed binary + integer constants. + (append_digit): Likewise. + * include/cpplib.h: Add CPP_N_BINARY, to be used for 0b-prefixed + binary integer constants. + +2007-05-31 Dave Korn + + PR preprocessor/14331 + * lex.c (_cpp_get_fresh_line): Don't warn if no newline at EOF. + +2007-05-24 Ollie Wild + + * macro.c (_cpp_builtin_macro_text): Handle BT_COUNTER. + * pch.c (cpp_write_pch_deps): Save __COUNTER__ state. + (cpp_write_pch_state): Save __COUNTER__ state. + (cpp_valid_state): Check valid __COUNTER__ state. + (cpp_read_state): Read new __COUNTER__ state. + * include/cpplib.h (enum builtin_type): Add BT_COUNTER enumerator. + * init.c (builtin_array): Add __COUNTER__/BT_COUNTER. + * internal.h (struct cpp_reader): Add counter member. + +2007-05-23 Simon Martin + + PR preprocessor/20077 + * macro.c (create_iso_definition): Fixed the method to determine + whether the token-pasting operator appears at the beginning or the end + of a macro. + +2007-05-21 Ian Lance Taylor + + * internal.h (struct cpp_reader): Add new fields: + nonexistent_file_hash and nonexistent_file_ob. + * files.c: Include "obstack.h". + (find_file_in_dir): Before trying to open the file, look up the + path name in the hash table of nonexistent files. After failing + to open the file, add the path name to the hash table. + (_cpp_find_file): Cache the results of looking up the file name + starting with the quote and bracket chain heads, if we can. + (nonexistent_file_hash_eq): New static function. + (_cpp_init_files): Initialize pfile->nonexistent_file_hash and + pfile->nonexistent_file_ob. + (_cpp_cleanup_files): Free pfile->nonexistent_file_hash and + pfile->nonexistent_file_ob. + +2007-05-14 Janis Johnson + + * expr.c (cpp_classify_number): Warn about dfp constant for -pedantic. + + PR c/31924 + * expr.c (interpret_float_suffix): Check for invalid suffix. + +2007-05-02 Eric Christopher + + * expr.c (num_div_op): Don't overflow if the result is + zero. + +2007-05-02 Tom Tromey + + PR preprocessor/28709: + * macro.c (paste_tokens): Remove PASTE_LEFT from the old lhs. + +2007-03-30 Michael Meissner + + * directives.c (lex_macro_node_from_str): Fix alloca call to be + type correct. + +2007-03-30 Richard Henderson + + * directives.c (lex_macro_node_from_str): New. + (cpp_push_definition, cpp_pop_definition): New. + * include/cpplib.h (cpp_push_definition, cpp_pop_definition): Declare. + +2007-03-01 Brooks Moses + + * Makefile.in: Add dummy install-pdf target. + +2007-01-30 Tom Tromey + + PR preprocessor/30468: + * mkdeps.c (apply_vpath): Strip successive '/'s if we stripped + './'. + +2007-01-30 Tom Tromey + + PR preprocessor/29966: + * macro.c (lex_expansion_token): Save and restore cpp_reader's + cur_token. + (_cpp_create_definition): Don't restore cur_token here. + * lex.c (_cpp_lex_token): Added assertion. + +2007-01-27 Tom Tromey + + * configure: Rebuilt. + +2007-01-12 Tom Tromey + + PR preprocessor/28227: + * directives.c (lex_macro_node): Added 'is_def_or_undef' + argument. + (do_define): Update. + (do_undef): Update. + (do_ifdef): Update. + (do_ifndef): Update. + +2007-01-11 Paolo Bonzini + + * configure: Regenerate. + +2007-01-11 Paolo Bonzini + + * configure: Regenerate. + +2007-01-04 Tom Tromey + + PR preprocessor/28165: + * internal.h (cpp_in_primary_file): New function. + * directives.c (do_include_next): Use cpp_in_primary_file. + (do_pragma_once): Likewise. + (do_pragma_system_header): Likewise. + +2006-12-29 Ian Lance Taylor + + * lex.c (_cpp_clean_line): Add uses of __builtin_expect. Don't + look backward at the end of the line unless we saw a backslash. + +2006-12-29 Jakub Jelinek + + PR preprocessor/29612 + * directives.c (do_linemarker): Set pfile->buffer->sysp always, not + only when new_sysp is non-zero. + +2006-12-28 Tom Tromey + + PR preprocessor/30001: + * charset.c (_cpp_convert_input): Check that to.len is greater + than zero. + +2006-11-20 Trevor Smigiel + + * configure.ac (need_64bit_hwint): Need 64bit hwint for SPU. + * configure: Rebuilt. + +2006-11-01 Douglas Gregor + + * include/cpplib.h (enum c_lang): Add CLK_GNUCXX0X and CLK_CXX0X + for experimental C++0x mode. + * init.c (lang_defaults): Add defaults for C++0x modes. C++0x has + adopted the preprocessor changes introduced in C99. + +2006-10-29 Joseph Myers + + * configure.ac (need_64bit_hwint): Set for i[34567]86-*-linux* + depending on --enable-targets=all. + * configure: Regenerate. + +2006-10-12 Jakub Jelinek + + PR preprocessor/28709 + * macro.c (paste_tokens): Do error reporting here, use BUF with the + spelled LHS token as opposed to spelling it again. + (paste_all_tokens): Don't report errors here, just break on failure. + +2006-10-10 Brooks Moses + + * Makefile.in: Added empty "pdf" target. + +2006-09-22 Geoffrey Keating + + * configure.ac: Make need_64_bit_hwint case for x86-darwin + match exactly the glob in gcc/config.gcc. + * configure: Regenerate. + +2006-09-13 Joseph S. Myers + + PR c/28768 + PR preprocessor/14634 + * lex.c (lex_string): Pedwarn for unterminated literals. + +2006-09-08 Eric Christopher + + * configure.ac: Add 64-bit HWI support for i?86-darwin. + +2006-08-14 Steve Ellcey + + PR c++/28288 + PR c++/14556 + * include/cpplib.h: Remove ?, ?= tokens. + (CPP_LAST_EQ): Change. + (CPP_LAST_PUNCTUATOR): Change. + * expr.c (cpp_operator): Remove MIN and MAX. + (reduce): Remove CPP_MIN and CPP_MAX. + (num_binary_op): Ditto. + * lex.c (_cpp_lex_direct): Ditto. + (cpp_avoid_paste): Remove ? as legal symbol after > or <. + +2006-06-09 Jakub Jelinek + + PR preprocessor/27746 + * directives.c (do_pragma): Handle pragma with valid namespace + and invalid name coming from macro expansion. + * directives.c (destringize_and_run): Initialize next field in + context. + + PR c/27747 + PR c++/27748 + * directives.c (destringize_and_run): Set NO_EXPAND on the + tokens. + + * macro.c (_cpp_backup_tokens): Fix comment typo. + +2006-05-31 Daniel Jacobowitz + + * Makefile.in (CATALOGS): Add po/ prefix. + * configure: Regenerated. + +2006-05-23 Carlos O'Donell + + * Makefile.in: Add install-html target. Add install-html to .PHONY + +2006-02-17 Grigory Zagorodnev + + * macro.c (_cpp_builtin_macro_text): Handle BT_TIMESTAMP. + * files.c (_cpp_get_file_stat): New function. + * include/cpplib.h (builtin_type): Add BT_TIMESTAMP. + * init.c (builtin_array): Add support for __TIMESTAMP__/BT_TIMESTAMP. + * internal.h (_cpp_get_file_stat): Prototype. + (struct cpp_buffer): Add timestamp. + +2006-01-23 Jakub Jelinek + + PR preprocessor/25717 + * init.c (cpp_init_builtins): If __STDC__ will not change value + between system headers and other sources, define it as a normal + macro rather than a builtin. + * macro.c (_cpp_builtin_macro_text) : Only check + cpp_in_system_header condition. + +2006-01-05 Paolo Bonzini + + * Makefile.in: Use -MMD instead of -MD. + +2006-01-04 Dmitry Kurochkin + Richard Henderson + + Merge from gomp branch: + * directives.c (struct pragma_entry): Add is_deferred. Add ident + entry to value union. + (end_directive): Don't eat the line if in_deferred_pragma. + (run_directive): Remove pragma hacks. + (insert_pragma_entry): Remove. + (new_pragma_entry): New. + (register_pragma_1): Split out of register_pragma. Only handle + the lookup tree and return the new entry. + (cpp_register_pragma): Fill in the pragma entry here. + (cpp_register_deferred_pragma): New. + (register_pragma_internal): New. + (_cpp_init_internal_pragmas): Use register_pragma_internal. + (do_pragma): Allow pragma expansion after namespace. For deferred + pragmas, don't slurp the line into a string. + (destringize_and_run): Save tokens for deferred pragmas. + (cpp_handle_deferred_pragma): Remove. + * macro.c (builtin_macro): Remove pragma token hack. + (_cpp_push_token_context): Rename from push_token_context and export. + * internal.h (struct lexer_state): Add pragma_allow_expansion. + (_cpp_push_token_context): Declare. + * lex.c (_cpp_lex_token): Allow _cpp_handle_directive to return + a token. Update the line number correctly if so. + (_cpp_lex_direct): Emit CPP_PRAGMA_EOL tokens. + (cpp_token_val_index): Return CPP_TOKEN_FLD_PRAGMA for pragmas. + * include/cpplib.h (PRAGMA_EOL): New. + (CPP_TOKEN_FLD_PRAGMA): New. + (struct cpp_token): Add val.pragma. + (struct cpp_options): Remove defer_pragmas. + (cpp_handle_deferred_pragma): Remove. + (cpp_register_deferred_pragma): Declare. + +2006-01-01 Jakub Jelinek + + PR c++/25294 + * directives.c (do_pragma): If pragma line ends with multi-line + block comment, end the saved deferred pragma string before that + comment. Handle embedded '\0' chars on the pragma line. + +2005-12-22 Volker Reichelt + + PR c++/23333 + * include/cpplib.h: Add PURE_ZERO to flags for the cpp_token structure. + +2005-12-07 Jon Grimm + Ben Elliston + + * include/cpplib.h (CPP_N_DFLOAT): New. + * expr.c (interpret_float_suffix): Identify df, dd, and dl + suffixes as decimal floating point constants. + (cpp_classify_number): Disallow hexadecimal DFP constants. + +2005-11-14 Gerald Pfeifer + Ian Lance Taylor + + * include/cpplib.h (struct cpp_callbacks): Annotate error with + ATTRIBUTE_FPTR_PRINTF(3,0) instead of ATTRIBUTE_PRINTF(3,0). + +2005-11-09 Per Bothner + Uros Bizjak + + PR c/24101 + * init.c (read_original_filename): Temporarily set + state.in_directive before calling _cpp_lex_direct for + CPP_HASH tokens. + +2005-11-03 James E Wilson + + PR preprocessor/24202 + * files.c (_cpp_pop_file_buffer): Set buffer_valid to false. + +2005-11-04 Joseph S. Myers + + * include/cpplib.h (struct cpp_callbacks): Make error take + va_list* parameter. + * errors.c (cpp_error): Update call to callback. + +2005-11-03 Andrew Pinski + + PR preprocessor/22042 + * macro.c (_cpp_builtin_macro_text): Lower the needed max + buffer size. + (cpp_quote_string): Don't octalify non printable + charactors. + +2005-11-03 Joseph S. Myers + + PR c++/17964 + * include/cpplib.h (struct cpp_options): Add client_diagnostic. + (struct cpp_callbacks): Add error. + * errors.c (cpp_error): If client_diagnostic, use error callback. + * charset.c (convert_escape): Don't use %03o in diagnostic. + +2005-10-21 James E Wilson + + PR preprocessor/15220 + * files.c (_cpp_find_file): New parameter angle_brackets. Fix all + callers. Pass to open_file_failed. + (open_file_failed): New parameter angle_brackets. Fix all callers. + Use in print_dep assignment. + * init.c (cpp_read_main_file): Pass additional arg to _cpp_find_file. + * internal.h (_cpp_find_file): Add new parm to declaration. + +2005-10-08 Kazu Hirata + + * configure.ac: Require 64-bit int for arm*-*-*eabi*. + * configure: Regenerate. + +2005-10-04 Ian Lance Taylor + + PR preprocessor/13726 + * directives.c (check_eol_return_comments): New static function. + (parse_include): Add buf parameter. Change all callers. + (do_include_common): If not discard comments, turn on + save_comments. Pass collected comments to include callback. + * include/cpplib.h (struct cpp_callbacks): Add new parameter to + include callback: cpp_token list. + +2005-09-20 Joseph S. Myers + + * include/cpplib.h (struct cpp_options): Add extended_identifiers. + * init.c (struct lang_flags, lang_defaults): Add + extended_identifiers. + (cpp_set_lang): Use it. + * lex.c (forms_identifier_p): Check extended_identifiers. + +2005-08-30 Jakub Jelinek + + PR preprocessor/20348 + PR preprocessor/20356 + * files.c (_cpp_find_file, search_cache): Revert 2004-06-26 and + 2004-06-05 changes. + +2005-07-23 Kaveh R. Ghazi + + * configure.ac (ACX_PROG_CC_WARNING_OPTS): add + -Wmissing-format-attribute. + + * configure: Regenerate. + +2005-06-29 Kelley Cook + + * all files: Update FSF address in copyright headers. + * makeucnid.c (write_copyright): Update outputted FSF address. + +2005-06-13 Zack Weinberg + + * configure.ac: Invoke ZW_CREATE_DEPDIR and + ZW_PROG_COMPILER_DEPENDENCIES. + * aclocal.m4, configure: Regenerate. + * Makefile.in (DEPMODE, DEPDIR, depcomp, COMPILE.base, COMPILE): + New variables. + (distclean): Clean up $(DEPDIR) and its contents. + (.c.o): Use $(COMPILE). + Include $(DEPDIR)/*.Po for most object->header dependencies. + +2005-05-28 Gabriel Dos Reis + + * configure.ac: Check declarations for asprintf and vasprintf. + * config.in: Regenerate. + * configure: Likewise. + + * charset.c (conversion_loop): Use XRESIZEVEC. + (convert_no_conversion): Likewise. + (convert_using_iconv): Likewise. + (init_iconv_desc): Cast return value of alloca. + (cpp_host_to_exec_charset): Use XNEWVEC. + (emit_numeric_escape): Use XRESIZEVEC. + (cpp_interpret_string): Use XNEWVEC. + (cpp_interpret_string): Use XRESIZEVEC. + (_cpp_interpret_identifier): Cast return value of alloca. + (_cpp_convert_input): Use XNEWVEC and XRESIZEVEC. + * directives.c (glue_header_name): Use XNEWVEC and XRESIZEVEC. + (parse_include): Use XNEWVEC. + (insert_pragma_entry): Rename local variable "new" to + "new_entry". + (save_registered_pragmas): Cast return value of xmemdup. + (destringize_and_run): Same for alloca. + (parse_assertion): Likewise. + (do_assert): Cast allocated storage to proper type. + (cpp_define): Likewise. + (_cpp_define_builtin): Likewise. + (cpp_undef): Likewise. + (handle_assertion): Likewise. + (cpp_push_buffer): Rename local variable "new" to "new_buffer". + * expr.c (CPP_UPLUS): Cast value to type cpp_ttype. + (CPP_UMINUS): Likewise. + (struct cpp_operator): Rename from struct operator. + (_cpp_expand_op_stack): Use XRESIZEVEC. + * files.c (pch_open_file): Use XNEWVEC. + (pch_open_file): Use XRESIZEVEC. + (read_file_guts): Use XNEWVEC and XRESIZEVEC. + (dir_name_of_file): Use XNEWVEC. + (make_cpp_file): Use XCNEW. + (make_cpp_dir): Likewise. + (allocate_file_hash_entries): USE XNEWVEC. + (cpp_included): Cast return value of htab_find_with_hash. + (append_file_to_dir): Use XNEWVEC. + (read_filename_string): Likewise. Use XRESIZEVEC too. + (read_name_map): Cast return value of alloca. Use XRESIZEVEC. + (remap_filename): Use XNEWVEC. + (struct pchf_entry): Move definition out of struct pchf_data. + (_cpp_save_file_entries): Use XCNEWVAR. + (_cpp_read_file_entries): Use XNEWVAR. + * identifiers.c (alloc_node): Use XOBNEW. + * init.c (cpp_create_reader): Use XCNEW. + (cpp_init_builtins): Cast of b->value to enum builtin_type. + (read_original_directory): Cast return value of alloca. + * lex.c (add_line_note): Use XRESIZEVEC. + (warn_about_normalization): Use XNEWVEC. + (_cpp_lex_direct): Cast node->directive_index to (enum cpp_ttype). + (new_buff): Use XNEWVEC. + * line-map.c (linemap_add): Use XRESIZEVEC. + * macro.c (builtin_macro): Cast return value of alloca. + (paste_tokens): Likewise. + (expand_arg): Use XNEWVEC and XRESIZEVEC. + (_cpp_save_parameter): Use XRESIZEVEC. + (create_iso_definition): Cast allocated storage to proper type. + (_cpp_create_definition): Likewise. + (cpp_macro_definition): Use XRESIZEVEC. + * makedepend.c (add_clm): Use XNEW. + (add_dir): Likewise. + * mkdeps.c (munge): Use XNEWVEC. + (deps_init): Use XCNEW. + (deps_add_target): Use XRESIZEVEC. + (deps_add_default_target): Cast return value of alloca. + (deps_add_dep): Use XRESIZEVEC. + (deps_add_vpath): Likewise. Use XNEWVEC too. + (deps_restore): Likewise. + * pch.c (save_idents): Use XNEW and XNEWVEC. + (cpp_save_state): Use XNEW. + (count_defs): Cast return value of htab_find. + (write_defs): Likewise. + (cpp_write_pch_deps): Use XNEWVEC. + (collect_ht_nodes): Use XRESIZEVEC. + (cpp_valid_state): Use XNEWVEC. + (save_macros): Use XRESIZEVEC. Cast return value of xmemdup. + * symtab.c (ht_create): Use XCNEW. + (ht_lookup_with_hash): Cast return value of obstack_copy0. + (ht_expand): Use XCNEWVEC. + * system.h (HAVE_DESIGNATED_INITIALIZERS): False if __cplusplus. + (bool): Do not define if __cplusplus. + +2005-05-12 Zack Weinberg + + * directives.c (#sccs table entry): Mark IN_I, consistent with #ident. + (do_sccs): Delete function definition, #define to do_ident. + (do_ident): Don't hardwire directive name. + +2005-05-12 Ryota Kunisawa + + PR bootstrap/21230 + * configure: Regenerate. + +2005-04-27 Andris Pavenis + + * files.c: Include io.h for DJGPP to get prototype of setmode. + +2005-04-19 Per Bothner + + PR preprocessor/20907 + * line-map.c (linemap_line_start): Fix bug when we need to increse + column_bits but can re-use the current line_map. + +2005-04-19 Kaveh R. Ghazi + + * system.h (fopen, fdopen, freopen): Define these to the unlocked + libiberty functions. + +2005-04-11 Kaveh R. Ghazi + + * configure.ac (libcpp_UNLOCKED_FUNCS): New. + (AC_CHECK_FUNCS, AC_CHECK_DECLS): Check for libcpp_UNLOCKED_FUNCS. + * system.h (putchar, getc, getchar, clearerr, feof, fileno, + fflush, fgetc, fgets, ferror, fread): Redefine to the associated + _unlocked function. + (fwrite_unlocked): Fix prototype. + + * configure, config.in: Regenerate. + +2005-04-05 Jakub Jelinek + + PR preprocessor/19475 + * macro.c (create_iso_definition): For < ISO C99, don't + pedwarn if there is no whitespace between macro name and its + replacement, but the replacement starts with a basic character + set character. + +2005-03-28 Andreas Jaeger + + * lex.c (warn_about_normalization): Cast field width to int to + avoid warning. + +2005-03-19 Joseph S. Myers + + * configure.ac: Consistently use solaris2.1[0-9]* instead of + solaris2.1[0-9]. + * configure: Regenerate. + +2005-03-15 Geoffrey Keating + + * charset.c (_cpp_valid_ucn): In identifiers, reject a partial + UCN rather than printing an error. + +2005-03-14 Geoffrey Keating + + * lex.c (forms_identifier_p): Disable UCNs in C89 mode. + +2005-03-14 Geoffrey Keating + + * init.c (cpp_create_reader): Default warn_normalize to normalized_C. + * charset.c: Update for new format of ucnid.h. + (ucn_valid_in_identifier): Update for new format of ucnid.h. + Add NST parameter, and update it; update callers. + (cpp_valid_ucn): Add NST parameter, update callers. Replace abort + with cpp_error. + (convert_ucn): Pass normalize_state to cpp_valid_ucn. + * internal.h (struct normalize_state): New. + (INITIAL_NORMALIZE_STATE): New. + (NORMALIZE_STATE_RESULT): New. + (NORMALIZE_STATE_UPDATE_IDNUM): New. + (_cpp_valid_ucn): New. + * lex.c (warn_about_normalization): New. + (forms_identifier_p): Add normalize_state parameter, update callers. + (lex_identifier): Add normalize_state parameter, update callers. Keep + the state current. + (lex_number): Likewise. + (_cpp_lex_direct): Pass normalize_state to subroutines. Check + it with warn_about_normalization. + * makeucnid.c: New. + * ucnid.h: Replace. + * ucnid.pl: Remove. + * ucnid.tab: Make appropriate for input to makeucnid.c. Remove + comments about obsolete version of C++. + * include/cpplib.h (enum cpp_normalize_level): New. + (struct cpp_options): Add warn_normalize field. + +2005-03-11 Geoffrey Keating + + * directives.c (glue_header_name): Update call to cpp_spell_token. + * internal.h (_cpp_interpret_identifier): New. + * charset.c (_cpp_interpret_identifier): New. + (_cpp_valid_ucn): Allow UCN version of '$'. + * lex.c (lex_identifier): Add extra parameter to indicate if initial + character was '$' or '\'. Support identifiers with UCNs. + (forms_identifier_p): Allow UCNs. + (_cpp_lex_direct): Pass extra parameter to lex_identifier. + (utf8_to_ucn): New. + (cpp_spell_token): Add FORSTRING parameter. Use it. + (cpp_token_as_text): Update call to cpp_spell_token. + (cpp_output_token): Write UCNs back out. + (stringify_arg): Update call to cpp_spell_token. + (paste_tokens): Likewise. + (cpp_macro_definition): Likewise. + * macro.c (stringify_arg): Likewise. + (paste_tokens): Likewise. + (cpp_macro_definition): Likewise. + * include/cpplib.h: Add parameter to cpp_spell_token. + +2005-03-04 Jakub Jelinek + + PR bootstrap/20282 + PR bootstrap/20305 + * macro.c (replace_args, cpp_get_token): Copy whole + cpp_token_u instead of just cpp_string field from it. + +2005-02-28 Devang Patel + + * directives.c (do_line): Save sysp early before line table is + realloc'ed. + +2005-02-20 Zack Weinberg + + PR 18785 + * charset.c (LAST_POSSIBLY_BASIC_SOURCE_CHAR): New helper macro. + (cpp_host_to_exec_charset): New function. + * include/cpplib.h: Declare cpp_host_to_exec_charset. + +2005-02-19 Devang Patel + + * charset.c (_cpp_convert_input): Check '\r' before inserting + '\n' at the end. + +2005-02-15 Eric Christopher + + PR preprocessor/19077 + * macro.c (cpp_macro_definition): Move handling of whitespace + to PREV_WHITE conditional. Remove overloading of len + variable. + +2005-02-14 Kazu Hirata + + * directives.c, files.c, init.c, internal.h, macro.c, pch.c, + traditional.c: Update copyright. + +2005-02-14 Paolo Bonzini + + PR bootstrap/19818 + * configure.ac: Check for declaration of basename and getopt. + * config.in: Regenerate. + * configure: Regenerate. + * internal.h (ustrcspn): New. + * macro.c (create_iso_definition): Fix allocation of memory. + (padding_token): Add cast to remove const-ness. + * pch.c (cpp_read_state): Use ustrcspn. + +2005-02-08 Mike Stump + + * files.c (pchf_adder): Remove. + (struct pchf_adder_info): Likewise. + (_cpp_save_file_entries): Write out all files so that #import works. + +2005-01-23 Joseph S. Myers + + * configure: Regenerate. + +2005-01-11 Tobias Schlueter + + * include/cpplib.h (c_lang): Fix comment to say cpp_create_reader. + + * include/cpplib.h: Also update copyright years. + +2005-01-03 Geoffrey Keating + + * files.c (_cpp_find_file): Add files found by search_path_exhausted + to the list of all files. + +2005-01-01 Gabriel Dos Reis + + * internal.h: Update references to Cpp lib filenames. + * directives.c: Likewise. + * init.c: Likewise. + * macro.c: Likewise. + * traditional.c: Likewise. + +2004-12-15 Eric Botcazou + + PR preprocessor/15167 + * files.c (destroy_cpp_file): New function. + (should_stack_file): Make a new file if the + compared file is still stacked. + +2004-11-28 Nathanael Nerode + + PR preprocessor/17610 + * directives.c (do_include_common): Error out if an empty filename + is given for #include (or #include_next or #import). + +2004-11-27 Roger Sayle + Zack Weinberg + + * internal.h: Replace all uses of uchar with unsigned char. + * include/cpp-id-data.h: Likewise. Guard typedef of uchar + with !IN_GCC, so uchar is only defined whilst building libcpp. + +2004-11-24 Kelley Cook + + * aclocal.m4: Regenerate. + +2004-11-24 Roger Sayle + + PR preprocessor/15824 + * configure.ac: Correct HAVE_UCHAR test to #include + directly, instead of the non-existant "system.h" and "ansidecl.h". + * configure: Regenerate. + +2004-11-23 Daniel Jacobowitz + Joseph Myers + + * internal.h (struct lexer_state): Add in_deferred_pragma. + * directives.c (struct pragma_entry): Add allow_expansion. + (insert_pragma_entry): Take allow_expansion flag. + (register_pragma): Likewise. + (cpp_register_pragma): Likewise. + (_cpp_init_internal_pragmas): Update calls to cpp_register_pragma. + (do_pragma): Honor allow_expansion. + (cpp_handle_deferred_pragma): Set in_deferred_pragma. + * include/cpplib.h (cpp_register_pragma): Update prototype. + +2004-11-18 Daniel Jacobowitz + Mark Mitchell + + * configure.ac (i[34567]86-*-solaris2.1[0-9]*): Set + need_64bit_hwint=yes. + * configure: Regenerate. + +2004-11-09 Joseph S. Myers + + * Makefile.in ($(PACKAGE).pot): New rule. Depend on + po/$(PACKAGE).pot. + (po/$(PACKAGE).pot): Use ":" instead of "," in --keyword + arguments. Add keywords _, N_, SYNTAX_ERROR and SYNTAX_ERROR2. + Remove local srcdir path from generated file. + +2004-11-04 Zack Weinberg + Gerald Pfeifer + + * internal.h (HAVE_ICONV): Undefine if we do not have HAVE_ICONV_H + as well. + +2004-10-27 Zack Weinberg + + PR 18075 + * directives.c (do_pragma): Do not defer pragmas which are unknown. + (cpp_handle_deferred_pragma): Add cast to silence warning. + +2004-10-14 Joseph S. Myers + + * errors.c (_cpp_begin_message): Print "error: " for errors. + +2004-10-10 Andreas Jaeger + + * makedepend.c: Include mkdeps.h for prototype of deps_add_vpath. + * Makefile.in (makedepend.o): Add dependency on mkdeps.h. + +2004-10-08 Andrew Pinski + + * pch.c (cpp_write_pch_state): Remove variable z as it is not + used. + (cpp_read_state): Remove unused variables, m, d and mac_count. + +2004-09-29 Per Bothner + + * directives.c (cpp_handle_deferred_pragma): Save, clear and restore + cb.line_change. Otherwise do_pragma will call the line_change + call-back with a meaningless line number. + +2004-09-24 Zack Weinberg + + * configure.ac: Move AC_PROG_MAKE_SET, AC_PROG_INSTALL to + programs cluster. Use ACX_PROG_CC_WARNING_OPTS, + ACX_PROG_CC_WARNING_ALMOST_PEDANTIC, ACX_PROG_CC_WARNINGS_ARE_ERRORS. + * aclocal.m4, configure: Regenerate. + * init.c: Include localedir.h. + * Makefile.in (WARN_CFLAGS, ALL_CFLAGS): New variables. + (DEFS): Delete. + (.c.o): Use $(ALL_CFLAGS). + (localedir.h, localedir.hs): New rules. + (clean): Use rm -rf to remove directories. + (distclean): Also delete localedir.h and localedir.hs. + (init.o): Update dependencies. + +2004-09-22 Kelley Cook + + * Makefile.in (aclocal.m4): Update dependencies. + * configure.ac (AC_CONFIG_MACRO_DIR): New. + * aclocal.m4, configure: Regenerate. + +2004-09-17 Zack Weinberg + + * charset.c (_cpp_destroy_iconv, emit_numeric_escape) + (_cpp_convert_input, _cpp_default_encoding): Add comments. + Some other comments in this file also tweaked. + + * directives.c (do_pragma): Save current buffer position + before lexing the pragma keywords; don't call + _cpp_backup_tokens in the defer_pragmas case. + +2004-09-15 Per Bothner + + * include/line-map.h (line_map_start): Add parameter names so + preceding comment makes sense. + (linemap_add): Remove from comment mention of non-existing parameter. + +2004-09-09 Matt Austern + Zack Weinberg + + * include/cpplib.h (TTYPE_TABLE): Remove CPP_ and SPELL_ + prefixes throughout. Add entry for PRAGMA. Remove + unnecessary "= 0" from EQ. + (enum cpp_ttype): Adjust OP and TK definitions to restore + prefixes, via token-paste. + (CPP_LAST_EQ, CPP_FIRST_DIGRAPH, CPP_LAST_PUNCTUATOR, CPP_LAST_CPP_OP): + Change from #defines to additional cpp_ttype enumerators. + (struct cpp_options): Add defer_pragmas. + (cpp_handle_deferred_pragma): Prototype new interface. + + * internal.h (struct cpp_reader): Add directive_result. + * directives.c (struct pragma_entry): Add is_internal field; + give boolean fields type bool. + (start_directive): Initialize pfile->directive_result.type. + (_cpp_do__Pragma): Likewise. + (run_directive): Do not crash if pfile->buffer->prev is NULL. + (insert_pragma_entry): Add 'internal' argument; set new->is_internal + from it. + (register_pragma): New static function, bulk of former + cpp_register_pragma here; add 'internal' argument, pass along + to insert_pragma_entry. + (cpp_register_pragma): Now a wrapper around register_pragma which + always passes false for 'internal' argument. + (_cpp_init_internal_pragmas): Call register_pragma directly, passing + true for 'internal'. + (do_pragma): If CPP_OPTION (pfile, defer_pragmas) and this isn't + an internal pragma, save text till the end of the line as a CPP_PRAGMA + token instead of executing the pragma. + (cpp_handle_deferred_pragma): New interface. + * lex.c (token_spellings): Adjust OP and TK definitions to + match changes to cpplib.h. + (_cpp_lex_token): Check for a directive-result token and + return it if present. + (cpp_token_val_index): Handle CPP_PRAGMA. + * macro.c (cpp_builtin_macro_text): Correct comment. + (builtin_macro): Handle directive-result tokens from _cpp_do__Pragma. + +2004-09-06 Serge Belyshev + + PR preprocessor/14699 + * symtab.c (ht_dump_statistics): Change type of sum_of_squares + from size_t to double. + +2004-08-28 Andreas Schwab + Andreas Jaeger + + * configure.ac: Set PACKAGE correctly. + * configure: Regenerated. + +2004-08-25 Paolo Bonzini + + * Makefile.in: Add back top_builddir. + +2004-08-25 Paolo Bonzini + + * configure.ac: Replace Automake macro invocations + with manual Autoconf checks and substitutions. + * configure: Regenerate. + * aclocal.m4: Regenerate. + * config.in: Regenerate. + * Makefile.am: Removed. + * Makefile.in: Heavy simplification and reorganization. + +2004-08-09 Mark Mitchell + + * configure.ac (arm*-*-eabi*): New target. + (arm*-*-symbianelf*): Likewise. + * configure: Regenerated. + +2004-07-24 Bernardo Innocenti + + * internal.h (xnew, xcnew, xnewvec, xcnewvec, xobnew): Remove. + * directives.c: Use XNEW-family macros from libiberty. + * lex.c: Likewise. + * macro.c: Likewise. + * cpplib.h (cpp_deps_style): Export enum with name. + +2004-07-23 Matthias Klose + + * init.c (init_library): Use PACKAGE for the text domain. + +2004-07-16 Andris Pavenis + + PR preprocessor/16366 + * internal.h (struct cpp_reader): New field dir_hash. + * files.c (make_cpp_dir): Use dir_hash, not file_hash. + (_cpp_init_files, _cpp_cleanup_files): Update for new field. + +2004-07-04 Neil Booth + + PR preprocessor/16192 + PR preprocessor/15913 + PR preprocessor/15572 + * expr.c (_cpp_parse_expr): Handle remaining cases where an + expression is missing. + * init.c (post_options): Traditional cpp doesn't do // comments. + +2004-06-30 Per Bothner + + * include/line-map.h (fileline): Remove old typedef. + * internal.h (struct cpp_reader): Use source_location typedef instead. + +2004-06-26 Zack Weinberg + + Partially revert patch of 2004-06-05. + * files.c (search_cache): Remove pfile argument. Don't check + for file that would be found by "" or <> search here... + (_cpp_find_file): ...do it here, before calling find_file_in_dir. + Do not apply directory-of-current-file correction to files + found by this check. Rearrange code slightly. + +2004-06-21 Geoffrey Keating + + * files.c (should_stack_file): Correct swapped parameters to call + to cb.read_pch. + * pch.c (cpp_valid_state): Handle -fpreprocessed. + +2004-06-15 Paolo Bonzini + + * Makefile.in: Regenerate with automake 1.8.5. + * aclocal.m4: Likewise. + * configure: Regenerate. + +2004-06-11 Zack Weinberg + + * configure.ac: Don't invoke ACX_HEADER_STDBOOL. + * configure, config.in: Regenerate. + * system.h: Unconditionally define bool as unsigned char, + BOOL_BITFIELD as unsigned int. + * .cvsignore: New file. + +2004-06-09 Geoffrey Keating + + * traditional.c (push_replacement_text): Set macro->traditional. + (save_replacement_text): Likewise. + * pch.c (cpp_write_pch_state): Don't write list of defined macros. + (struct save_macro_item): Delete. + (struct save_macro_data): Use a character array not the previous + structured format. + (save_macros): Save macro as text not as internal structures. + (cpp_prepare_state): Update for changes to save_macro_data. + (cpp_read_state): Don't read macros defined in PCH. Restore + -D macros as text. + * macro.c (create_iso_definition): Honour alloc_subobject. + Clear traditional flag. + (_cpp_create_definition): Honour alloc_subobject. + * lex.c (cpp_token_val_index): New. + * internal.h: Include cpp-id-data.h. + (uchar): Move definition to cpp-id-data.h. + (U): Likewise. + (cpp_macro): Likewise. + * directives.c (struct answer): Move to cpp-id-data.h. + (do_assert): Honour alloc_subobject. + + * include/symtab.h (struct ht): Add field 'alloc_subobject'. + * include/cpplib.h (struct cpp_string): Add GTY marker. + (enum cpp_token_fld_kind): New. + (struct cpp_token): Add GTY markers. + (cpp_token_val_index): Prototype. + (CPP_HASHNODE_VALUE_IDX): New. + (struct cpp_hashnode): Don't skip fields of 'value' when marking. + * include/cpp-id-data.h: New file. + +2004-06-09 Paolo Bonzini + + * Makefile.am (all-local): New. + * Makefile.in: Regenerate. + +2004-06-06 Roger Sayle + + * Makefile.am (LIBICONV): Declare. + (makedepend_LDADD): Use LIBICONV. + * Makefile.in: Regenerate. + +2004-06-05 Andrew Pinski + + * Makefile.am (LIBINTL): Declare + (makedepend_LDADD): Use LIBINTL. + * Makefile.in: Regenerate. + +2004-06-05 Zack Weinberg + + * Makefile.am: Add makedepend. + * Makefile.in, aclocal.m4: Regenerate. + * charset.c: Insert a space to avoid a warning. + * directives.c: Include mkdeps.h. + (_cpp_handle_directive): Reenable macro expander if appropriate. + (undefine_macros): Inline body of _cpp_free_definition for speed. + Do not call undef callback or _cpp_warn_if_unused_macro. + (cpp_get_deps): New interface. + * files.c (search_cache): Add pfile argument. Check for file + that would be found by "" or <> search here... + (_cpp_find_file): ...not here. Correct recorded start_dir of + files found by directory-of-current-file search that would be + found by "" or <> search. + * init.c (cpp_add_dependency_target): Delete. + * internal.h (struct lexer_state): Add discarding_output flag. + * lex.c (lex_identifier): Compute hash function while scanning. + * macro.c (cpp_scan_nooutput): Disable macro expansion outside + directives. + * makedepend.c: New file. + * mkdeps.c (struct deps): Add vpath vector. + (apply_vpath, deps_add_vpath): New function. + (deps_free): Free vpath vector. + (deps_add_dep, deps_add_target): Use apply_vpath. + * symtab.c (calc_hash): Use HT_HASHSTEP and HT_FINISH. + (ht_lookup_with_hash): New function. + * cpplib.h, mkdeps.h: Update prototypes. + * symtab.h: Update prototypes. + (HT_HASHSTEP, HT_FINISH): New macros. + +2004-05-29 Geoffrey Keating + + * symtab.c (ht_create): Set entries_owned. + (ht_destroy): Honour entries_owned. + (ht_expand): Likewise. + (ht_load): New. + * include/symtab.h (struct ht): New field 'entries_owned' + (ht_load): New prototype. + +2004-05-26 Paolo Bonzini + + PR bootstrap/15651 + * configure.ac: Fix m4 quoting when picking + the size of HOST_WIDE_INT. + * configure: Regenerate. + +2004-05-25 Paolo Bonzini + + * Makefile.am: the correct directory for + gettext include files is given by @INCINTL@. + * Makefile.in: Regenerate. + +2004-05-24 Paolo Bonzini + + * system.h [!ENABLE_NLS]: dgettext takes two + parameters. + +2004-05-23 Paolo Bonzini + + Moved libcpp from the gcc subdirectory to the toplevel. + * Makefile.am: New file. + * Makefile.in: Regenerate. + * configure.ac: New file. + * configure: Regenerate. + * config.in: Regenerate. + * charset.c: Moved from gcc/cppcharset.c. Add note about + brokenness of input charset detection. Adjust for change + in name of cppucnid.h. + * errors.c: Moved from gcc/cpperror.c. Do not include intl.h. + * expr.c: Moved from gcc/cppexp.c. + * files.c: Moved from gcc/cppfiles.c. Do not include intl.h. + Remove #define of O_BINARY, it is in system.h. + * identifiers.c: Moved from gcc/cpphash.c. + * internal.h: Moved from gcc/cpphash.h. Change header + guard name. All other files adjusted to match name change. + * init.c: Moved from gcc/cppinit.c. + (init_library) [ENABLE_NLS]: Call bindtextdomain. + * lex.c: Moved from gcc/cpplex.c. + * directives.c: Moved from gcc/cpplib.c. + * macro.c: Moved from gcc/cppmacro.c. + * pch.c: Moved from gcc/cpppch.c. Do not include intl.h. + * traditional.c: Moved from gcc/cpptrad.c. + * ucnid.h: Moved from gcc/cppucnid.h. Change header + guard name. + * ucnid.pl: Moved from gcc/cppucnid.pl. + * ucnid.tab: Moved from gcc/cppucnid.tab. Change header + guard name. + * symtab.c: Moved from gcc/hashtable.c. + * line-map.c: Moved from gcc. Do not include intl.h. + * mkdeps.c: Moved from gcc. + * system.h: New file. + * include/cpplib.h: Moved from gcc. Change header guard name. + * include/line-map.h: Moved from gcc. Change header guard name. + * include/mkdeps.h: Moved from gcc. Change header guard name. + * include/symtab.h: Moved from gcc/hashtable.h. Change header + guard name. diff --git a/libcpp/Makefile.in b/libcpp/Makefile.in new file mode 100644 index 0000000..c937946 --- /dev/null +++ b/libcpp/Makefile.in @@ -0,0 +1,233 @@ +# @configure_input@ +# Makefile for libcpp. Run 'configure' to generate Makefile from Makefile.in + +# Copyright (C) 2004 Free Software Foundation, Inc. + +#This file is part of libcpp. + +#libcpp 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. + +#libcpp 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 libcpp; see the file COPYING. If not, write to +#the Free Software Foundation, 51 Franklin Street, Fifth Floor, +#Boston MA 02110-1301, USA. + +@SET_MAKE@ + +srcdir = @srcdir@ +top_builddir = . +VPATH = @srcdir@ +INSTALL = @INSTALL@ +AR = ar +ARFLAGS = cru +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +CATALOGS = $(patsubst %,po/%,@CATALOGS@) +CC = @CC@ +CFLAGS = @CFLAGS@ +WARN_CFLAGS = @WARN_CFLAGS@ @WARN_PEDANTIC@ @WERROR@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +EXEEXT = @EXEEXT@ +GMSGFMT = @GMSGFMT@ +INCINTL = @INCINTL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +PACKAGE = @PACKAGE@ +RANLIB = @RANLIB@ +SHELL = @SHELL@ +USED_CATALOGS = @USED_CATALOGS@ +XGETTEXT = @XGETTEXT@ +DEPMODE = @CCDEPMODE@ +DEPDIR = @DEPDIR@ + +datadir = @datadir@ +exec_prefix = @prefix@ +libdir = @libdir@ +localedir = $(datadir)/locale +prefix = @prefix@ + +MSGMERGE = msgmerge +mkinstalldirs = $(SHELL) $(srcdir)/../config-aux/mkinstalldirs +depcomp = $(SHELL) $(srcdir)/../config-aux/depcomp + +INCLUDES = -I$(srcdir) -I. -I$(srcdir)/../include @INCINTL@ \ + -I$(srcdir)/include + +ALL_CFLAGS = $(CFLAGS) $(WARN_CFLAGS) $(INCLUDES) $(CPPFLAGS) + +libcpp_a_OBJS = charset.o directives.o directives-only.o errors.o \ + expr.o files.o identifiers.o init.o lex.o line-map.o macro.o \ + mkdeps.o pch.o symtab.o traditional.o + +libcpp_a_SOURCES = charset.c directives.c directives-only.c errors.c \ + expr.c files.c identifiers.c init.c lex.c line-map.c macro.c \ + mkdeps.c pch.c symtab.c traditional.c + +all: libcpp.a $(USED_CATALOGS) + +.SUFFIXES: +.SUFFIXES: .c .gmo .o .obj .po .pox + +libcpp.a: $(libcpp_a_OBJS) + -rm -f libcpp.a + $(AR) $(ARFLAGS) libcpp.a $(libcpp_a_OBJS) + $(RANLIB) libcpp.a + +# Rules to rebuild the configuration + +Makefile: $(srcdir)/Makefile.in config.status + $(SHELL) ./config.status Makefile + +config.status: $(srcdir)/configure + $(SHELL) ./config.status --recheck + +$(srcdir)/configure: @MAINT@ $(srcdir)/aclocal.m4 + cd $(srcdir) && $(AUTOCONF) + +$(srcdir)/aclocal.m4: @MAINT@ $(srcdir)/../config/acx.m4 \ + $(srcdir)/../config/gettext-sister.m4 $(srcdir)/../config/iconv.m4 \ + $(srcdir)/../config/codeset.m4 $(srcdir)/../config/lib-ld.m4 \ + $(srcdir)/../config/lib-link.m4 $(srcdir)/../config/lib-prefix.m4 \ + $(srcdir)/configure.ac + cd $(srcdir) && $(ACLOCAL) -I ../config + +config.h: stamp-h1 + test -f config.h || (rm -f stamp-h1 && $(MAKE) stamp-h1) + +stamp-h1: $(srcdir)/config.in config.status + -rm -f stamp-h1 + $(SHELL) ./config.status config.h + +$(srcdir)/config.in: @MAINT@ $(srcdir)/configure + cd $(srcdir) && $(AUTOHEADER) + -rm -f stamp-h1 + +# It is not possible to get LOCALEDIR defined in config.h because +# the value it needs to be defined to is only determined in the +# Makefile. Hence we do this instead. +localedir.h: localedir.hs; @true +localedir.hs: Makefile + echo "#define LOCALEDIR \"$(localedir)\"" > localedir.new + $(srcdir)/../config-aux/move-if-change localedir.new localedir.h + echo timestamp > localedir.hs + +# Installation rules and other phony targets + +# These rule has to look for .gmo modules in both srcdir and +# the cwd, and has to check that we actually have a catalog +# for each language, in case they weren't built or included +# with the distribution. +installdirs: + @$(mkinstalldirs) $(DESTDIR)$(datadir); \ + cats="$(CATALOGS)"; for cat in $$cats; do \ + lang=`basename $$cat | sed 's/\.gmo$$//'`; \ + if [ -f $$cat ] || [ -f $(srcdir)/$$cat ]; then \ + dir=$(localedir)/$$lang/LC_MESSAGES; \ + $(mkinstalldirs) $(DESTDIR)$$dir || exit 1; \ + fi; \ + done + +install-strip install: + +mostlyclean: + -rm -f *.o + +clean: mostlyclean + -rm -rf libcpp.a $(srcdir)/autom4te.cache + +distclean: clean + -rm -f config.h stamp-h1 config.status config.cache config.log \ + configure.lineno configure.status.lineno Makefile localedir.h \ + localedir.hs $(DEPDIR)/*.Po + -rmdir $(DEPDIR) + +maintainer-clean: distclean + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -rm -f $(srcdir)/configure $(srcdir)/aclocal.m4 + +check: +installcheck: +dvi: +pdf: +html: +info: +install-info: +install-pdf: +install-man: +install-html: + +update-po: $(CATALOGS:.gmo=.pox) + +.PHONY: installdirs install install-strip mostlyclean clean distclean \ + maintainer-clean check installcheck dvi pdf html info install-info \ + install-man update-po install-html + +# Dependency rule. +COMPILE.base = $(CC) $(DEFS) $(INCLUDES) $(CPPFLAGS) $(ALL_CFLAGS) -c +ifeq ($(DEPMODE),depmode=gcc3) +COMPILE = $(COMPILE.base) -o $@ -MT $@ -MMD -MP -MF $(DEPDIR)/$*.Po +else +COMPILE = source='$<' object='$@' libtool=no DEPDIR=$(DEPDIR) $(DEPMODE) \ + $(depcomp) $(COMPILE.base) +endif + +# Implicit rules and I18N + +.c.o: + $(COMPILE) $< + +# N.B. We do not attempt to copy these into $(srcdir). +.po.gmo: + -test -d po || mkdir po + $(GMSGFMT) --statistics -o $@ $< + +# The new .po has to be gone over by hand, so we deposit it into +# build/po with a different extension. +# If build/po/$(PACKAGE).pot exists, use it (it was just created), +# else use the one in srcdir. +.po.pox: + -test -d po || mkdir po + $(MSGMERGE) $< `if test -f po/$(PACKAGE).pot; \ + then echo po/$(PACKAGE).pot; \ + else echo $(srcdir)/po/$(PACKAGE).pot; fi` -o $@ + +# Rule for regenerating the message template. +$(PACKAGE).pot: po/$(PACKAGE).pot +po/$(PACKAGE).pot: $(libcpp_a_SOURCES) + -test -d $(srcdir)/po || mkdir $(srcdir)/po + $(XGETTEXT) --default-domain=$(PACKAGE) \ + --keyword=_ --keyword=N_ \ + --keyword=cpp_error:3 --keyword=cpp_errno:3 \ + --keyword=cpp_error_with_line:5 \ + --keyword=SYNTAX_ERROR --keyword=SYNTAX_ERROR2 \ + --copyright-holder="Free Software Foundation, Inc." \ + --msgid-bugs-address="http://gcc.gnu.org/bugs.html" \ + --language=c -o po/$(PACKAGE).pot.tmp $^ + sed 's:$(srcdir)/::g' po/$(PACKAGE).pot + rm po/$(PACKAGE).pot.tmp + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: + +# Dependencies +-include $(patsubst %.o, $(DEPDIR)/%.Po, $(libcpp_a_OBJS)) + +# Dependencies on generated headers have to be explicit. +init.o: localedir.h diff --git a/libcpp/aclocal.m4 b/libcpp/aclocal.m4 new file mode 100644 index 0000000..c58fe77 --- /dev/null +++ b/libcpp/aclocal.m4 @@ -0,0 +1,23 @@ +# generated automatically by aclocal 1.10 -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006 Free Software Foundation, Inc. +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +m4_include([../config-aux/acx.m4]) +m4_include([../config-aux/codeset.m4]) +m4_include([../config-aux/depstand.m4]) +m4_include([../config-aux/gettext-sister.m4]) +m4_include([../config-aux/iconv.m4]) +m4_include([../config-aux/lead-dot.m4]) +m4_include([../config-aux/lib-ld.m4]) +m4_include([../config-aux/lib-link.m4]) +m4_include([../config-aux/lib-prefix.m4]) +m4_include([../config-aux/warnings.m4]) diff --git a/libcpp/charset.c b/libcpp/charset.c new file mode 100644 index 0000000..5db8fc1 --- /dev/null +++ b/libcpp/charset.c @@ -0,0 +1,1689 @@ +/* CPP Library - charsets + Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2006 + Free Software Foundation, Inc. + + Broken out of c-lex.c Apr 2003, adding valid C99 UCN ranges. + +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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include "config.h" +#include "system.h" +#include "cpplib.h" +#include "internal.h" + +/* Character set handling for C-family languages. + + Terminological note: In what follows, "charset" or "character set" + will be taken to mean both an abstract set of characters and an + encoding for that set. + + The C99 standard discusses two character sets: source and execution. + The source character set is used for internal processing in translation + phases 1 through 4; the execution character set is used thereafter. + Both are required by 5.2.1.2p1 to be multibyte encodings, not wide + character encodings (see 3.7.2, 3.7.3 for the standardese meanings + of these terms). Furthermore, the "basic character set" (listed in + 5.2.1p3) is to be encoded in each with values one byte wide, and is + to appear in the initial shift state. + + It is not explicitly mentioned, but there is also a "wide execution + character set" used to encode wide character constants and wide + string literals; this is supposed to be the result of applying the + standard library function mbstowcs() to an equivalent narrow string + (6.4.5p5). However, the behavior of hexadecimal and octal + \-escapes is at odds with this; they are supposed to be translated + directly to wchar_t values (6.4.4.4p5,6). + + The source character set is not necessarily the character set used + to encode physical source files on disk; translation phase 1 converts + from whatever that encoding is to the source character set. + + The presence of universal character names in C99 (6.4.3 et seq.) + forces the source character set to be isomorphic to ISO 10646, + that is, Unicode. There is no such constraint on the execution + character set; note also that the conversion from source to + execution character set does not occur for identifiers (5.1.1.2p1#5). + + For convenience of implementation, the source character set's + encoding of the basic character set should be identical to the + execution character set OF THE HOST SYSTEM's encoding of the basic + character set, and it should not be a state-dependent encoding. + + cpplib uses UTF-8 or UTF-EBCDIC for the source character set, + depending on whether the host is based on ASCII or EBCDIC (see + respectively Unicode section 2.3/ISO10646 Amendment 2, and Unicode + Technical Report #16). With limited exceptions, it relies on the + system library's iconv() primitive to do charset conversion + (specified in SUSv2). */ + +#if !HAVE_ICONV +/* Make certain that the uses of iconv(), iconv_open(), iconv_close() + below, which are guarded only by if statements with compile-time + constant conditions, do not cause link errors. */ +#define iconv_open(x, y) (errno = EINVAL, (iconv_t)-1) +#define iconv(a,b,c,d,e) (errno = EINVAL, (size_t)-1) +#define iconv_close(x) (void)0 +#define ICONV_CONST +#endif + +#if HOST_CHARSET == HOST_CHARSET_ASCII +#define SOURCE_CHARSET "UTF-8" +#define LAST_POSSIBLY_BASIC_SOURCE_CHAR 0x7e +#elif HOST_CHARSET == HOST_CHARSET_EBCDIC +#define SOURCE_CHARSET "UTF-EBCDIC" +#define LAST_POSSIBLY_BASIC_SOURCE_CHAR 0xFF +#else +#error "Unrecognized basic host character set" +#endif + +#ifndef EILSEQ +#define EILSEQ EINVAL +#endif + +/* This structure is used for a resizable string buffer throughout. */ +/* Don't call it strbuf, as that conflicts with unistd.h on systems + such as DYNIX/ptx where unistd.h includes stropts.h. */ +struct _cpp_strbuf +{ + uchar *text; + size_t asize; + size_t len; +}; + +/* This is enough to hold any string that fits on a single 80-column + line, even if iconv quadruples its size (e.g. conversion from + ASCII to UTF-32) rounded up to a power of two. */ +#define OUTBUF_BLOCK_SIZE 256 + +/* Conversions between UTF-8 and UTF-16/32 are implemented by custom + logic. This is because a depressing number of systems lack iconv, + or have have iconv libraries that do not do these conversions, so + we need a fallback implementation for them. To ensure the fallback + doesn't break due to neglect, it is used on all systems. + + UTF-32 encoding is nice and simple: a four-byte binary number, + constrained to the range 00000000-7FFFFFFF to avoid questions of + signedness. We do have to cope with big- and little-endian + variants. + + UTF-16 encoding uses two-byte binary numbers, again in big- and + little-endian variants, for all values in the 00000000-0000FFFF + range. Values in the 00010000-0010FFFF range are encoded as pairs + of two-byte numbers, called "surrogate pairs": given a number S in + this range, it is mapped to a pair (H, L) as follows: + + H = (S - 0x10000) / 0x400 + 0xD800 + L = (S - 0x10000) % 0x400 + 0xDC00 + + Two-byte values in the D800...DFFF range are ill-formed except as a + component of a surrogate pair. Even if the encoding within a + two-byte value is little-endian, the H member of the surrogate pair + comes first. + + There is no way to encode values in the 00110000-7FFFFFFF range, + which is not currently a problem as there are no assigned code + points in that range; however, the author expects that it will + eventually become necessary to abandon UTF-16 due to this + limitation. Note also that, because of these pairs, UTF-16 does + not meet the requirements of the C standard for a wide character + encoding (see 3.7.3 and 6.4.4.4p11). + + UTF-8 encoding looks like this: + + value range encoded as + 00000000-0000007F 0xxxxxxx + 00000080-000007FF 110xxxxx 10xxxxxx + 00000800-0000FFFF 1110xxxx 10xxxxxx 10xxxxxx + 00010000-001FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + 00200000-03FFFFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx + 04000000-7FFFFFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx + + Values in the 0000D800 ... 0000DFFF range (surrogates) are invalid, + which means that three-byte sequences ED xx yy, with A0 <= xx <= BF, + never occur. Note also that any value that can be encoded by a + given row of the table can also be encoded by all successive rows, + but this is not done; only the shortest possible encoding for any + given value is valid. For instance, the character 07C0 could be + encoded as any of DF 80, E0 9F 80, F0 80 9F 80, F8 80 80 9F 80, or + FC 80 80 80 9F 80. Only the first is valid. + + An implementation note: the transformation from UTF-16 to UTF-8, or + vice versa, is easiest done by using UTF-32 as an intermediary. */ + +/* Internal primitives which go from an UTF-8 byte stream to native-endian + UTF-32 in a cppchar_t, or vice versa; this avoids an extra marshal/unmarshal + operation in several places below. */ +static inline int +one_utf8_to_cppchar (const uchar **inbufp, size_t *inbytesleftp, + cppchar_t *cp) +{ + static const uchar masks[6] = { 0x7F, 0x1F, 0x0F, 0x07, 0x02, 0x01 }; + static const uchar patns[6] = { 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; + + cppchar_t c; + const uchar *inbuf = *inbufp; + size_t nbytes, i; + + if (*inbytesleftp < 1) + return EINVAL; + + c = *inbuf; + if (c < 0x80) + { + *cp = c; + *inbytesleftp -= 1; + *inbufp += 1; + return 0; + } + + /* The number of leading 1-bits in the first byte indicates how many + bytes follow. */ + for (nbytes = 2; nbytes < 7; nbytes++) + if ((c & ~masks[nbytes-1]) == patns[nbytes-1]) + goto found; + return EILSEQ; + found: + + if (*inbytesleftp < nbytes) + return EINVAL; + + c = (c & masks[nbytes-1]); + inbuf++; + for (i = 1; i < nbytes; i++) + { + cppchar_t n = *inbuf++; + if ((n & 0xC0) != 0x80) + return EILSEQ; + c = ((c << 6) + (n & 0x3F)); + } + + /* Make sure the shortest possible encoding was used. */ + if (c <= 0x7F && nbytes > 1) return EILSEQ; + if (c <= 0x7FF && nbytes > 2) return EILSEQ; + if (c <= 0xFFFF && nbytes > 3) return EILSEQ; + if (c <= 0x1FFFFF && nbytes > 4) return EILSEQ; + if (c <= 0x3FFFFFF && nbytes > 5) return EILSEQ; + + /* Make sure the character is valid. */ + if (c > 0x7FFFFFFF || (c >= 0xD800 && c <= 0xDFFF)) return EILSEQ; + + *cp = c; + *inbufp = inbuf; + *inbytesleftp -= nbytes; + return 0; +} + +static inline int +one_cppchar_to_utf8 (cppchar_t c, uchar **outbufp, size_t *outbytesleftp) +{ + static const uchar masks[6] = { 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; + static const uchar limits[6] = { 0x80, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE }; + size_t nbytes; + uchar buf[6], *p = &buf[6]; + uchar *outbuf = *outbufp; + + nbytes = 1; + if (c < 0x80) + *--p = c; + else + { + do + { + *--p = ((c & 0x3F) | 0x80); + c >>= 6; + nbytes++; + } + while (c >= 0x3F || (c & limits[nbytes-1])); + *--p = (c | masks[nbytes-1]); + } + + if (*outbytesleftp < nbytes) + return E2BIG; + + while (p < &buf[6]) + *outbuf++ = *p++; + *outbytesleftp -= nbytes; + *outbufp = outbuf; + return 0; +} + +/* The following four functions transform one character between the two + encodings named in the function name. All have the signature + int (*)(iconv_t bigend, const uchar **inbufp, size_t *inbytesleftp, + uchar **outbufp, size_t *outbytesleftp) + + BIGEND must have the value 0 or 1, coerced to (iconv_t); it is + interpreted as a boolean indicating whether big-endian or + little-endian encoding is to be used for the member of the pair + that is not UTF-8. + + INBUFP, INBYTESLEFTP, OUTBUFP, OUTBYTESLEFTP work exactly as they + do for iconv. + + The return value is either 0 for success, or an errno value for + failure, which may be E2BIG (need more space), EILSEQ (ill-formed + input sequence), ir EINVAL (incomplete input sequence). */ + +static inline int +one_utf8_to_utf32 (iconv_t bigend, const uchar **inbufp, size_t *inbytesleftp, + uchar **outbufp, size_t *outbytesleftp) +{ + uchar *outbuf; + cppchar_t s = 0; + int rval; + + /* Check for space first, since we know exactly how much we need. */ + if (*outbytesleftp < 4) + return E2BIG; + + rval = one_utf8_to_cppchar (inbufp, inbytesleftp, &s); + if (rval) + return rval; + + outbuf = *outbufp; + outbuf[bigend ? 3 : 0] = (s & 0x000000FF); + outbuf[bigend ? 2 : 1] = (s & 0x0000FF00) >> 8; + outbuf[bigend ? 1 : 2] = (s & 0x00FF0000) >> 16; + outbuf[bigend ? 0 : 3] = (s & 0xFF000000) >> 24; + + *outbufp += 4; + *outbytesleftp -= 4; + return 0; +} + +static inline int +one_utf32_to_utf8 (iconv_t bigend, const uchar **inbufp, size_t *inbytesleftp, + uchar **outbufp, size_t *outbytesleftp) +{ + cppchar_t s; + int rval; + const uchar *inbuf; + + if (*inbytesleftp < 4) + return EINVAL; + + inbuf = *inbufp; + + s = inbuf[bigend ? 0 : 3] << 24; + s += inbuf[bigend ? 1 : 2] << 16; + s += inbuf[bigend ? 2 : 1] << 8; + s += inbuf[bigend ? 3 : 0]; + + if (s >= 0x7FFFFFFF || (s >= 0xD800 && s <= 0xDFFF)) + return EILSEQ; + + rval = one_cppchar_to_utf8 (s, outbufp, outbytesleftp); + if (rval) + return rval; + + *inbufp += 4; + *inbytesleftp -= 4; + return 0; +} + +static inline int +one_utf8_to_utf16 (iconv_t bigend, const uchar **inbufp, size_t *inbytesleftp, + uchar **outbufp, size_t *outbytesleftp) +{ + int rval; + cppchar_t s = 0; + const uchar *save_inbuf = *inbufp; + size_t save_inbytesleft = *inbytesleftp; + uchar *outbuf = *outbufp; + + rval = one_utf8_to_cppchar (inbufp, inbytesleftp, &s); + if (rval) + return rval; + + if (s > 0x0010FFFF) + { + *inbufp = save_inbuf; + *inbytesleftp = save_inbytesleft; + return EILSEQ; + } + + if (s < 0xFFFF) + { + if (*outbytesleftp < 2) + { + *inbufp = save_inbuf; + *inbytesleftp = save_inbytesleft; + return E2BIG; + } + outbuf[bigend ? 1 : 0] = (s & 0x00FF); + outbuf[bigend ? 0 : 1] = (s & 0xFF00) >> 8; + + *outbufp += 2; + *outbytesleftp -= 2; + return 0; + } + else + { + cppchar_t hi, lo; + + if (*outbytesleftp < 4) + { + *inbufp = save_inbuf; + *inbytesleftp = save_inbytesleft; + return E2BIG; + } + + hi = (s - 0x10000) / 0x400 + 0xD800; + lo = (s - 0x10000) % 0x400 + 0xDC00; + + /* Even if we are little-endian, put the high surrogate first. + ??? Matches practice? */ + outbuf[bigend ? 1 : 0] = (hi & 0x00FF); + outbuf[bigend ? 0 : 1] = (hi & 0xFF00) >> 8; + outbuf[bigend ? 3 : 2] = (lo & 0x00FF); + outbuf[bigend ? 2 : 3] = (lo & 0xFF00) >> 8; + + *outbufp += 4; + *outbytesleftp -= 4; + return 0; + } +} + +static inline int +one_utf16_to_utf8 (iconv_t bigend, const uchar **inbufp, size_t *inbytesleftp, + uchar **outbufp, size_t *outbytesleftp) +{ + cppchar_t s; + const uchar *inbuf = *inbufp; + int rval; + + if (*inbytesleftp < 2) + return EINVAL; + s = inbuf[bigend ? 0 : 1] << 8; + s += inbuf[bigend ? 1 : 0]; + + /* Low surrogate without immediately preceding high surrogate is invalid. */ + if (s >= 0xDC00 && s <= 0xDFFF) + return EILSEQ; + /* High surrogate must have a following low surrogate. */ + else if (s >= 0xD800 && s <= 0xDBFF) + { + cppchar_t hi = s, lo; + if (*inbytesleftp < 4) + return EINVAL; + + lo = inbuf[bigend ? 2 : 3] << 8; + lo += inbuf[bigend ? 3 : 2]; + + if (lo < 0xDC00 || lo > 0xDFFF) + return EILSEQ; + + s = (hi - 0xD800) * 0x400 + (lo - 0xDC00) + 0x10000; + } + + rval = one_cppchar_to_utf8 (s, outbufp, outbytesleftp); + if (rval) + return rval; + + /* Success - update the input pointers (one_cppchar_to_utf8 has done + the output pointers for us). */ + if (s <= 0xFFFF) + { + *inbufp += 2; + *inbytesleftp -= 2; + } + else + { + *inbufp += 4; + *inbytesleftp -= 4; + } + return 0; +} + +/* Helper routine for the next few functions. The 'const' on + one_conversion means that we promise not to modify what function is + pointed to, which lets the inliner see through it. */ + +static inline bool +conversion_loop (int (*const one_conversion)(iconv_t, const uchar **, size_t *, + uchar **, size_t *), + iconv_t cd, const uchar *from, size_t flen, struct _cpp_strbuf *to) +{ + const uchar *inbuf; + uchar *outbuf; + size_t inbytesleft, outbytesleft; + int rval; + + inbuf = from; + inbytesleft = flen; + outbuf = to->text + to->len; + outbytesleft = to->asize - to->len; + + for (;;) + { + do + rval = one_conversion (cd, &inbuf, &inbytesleft, + &outbuf, &outbytesleft); + while (inbytesleft && !rval); + + if (__builtin_expect (inbytesleft == 0, 1)) + { + to->len = to->asize - outbytesleft; + return true; + } + if (rval != E2BIG) + { + errno = rval; + return false; + } + + outbytesleft += OUTBUF_BLOCK_SIZE; + to->asize += OUTBUF_BLOCK_SIZE; + to->text = XRESIZEVEC (uchar, to->text, to->asize); + outbuf = to->text + to->asize - outbytesleft; + } +} + + +/* These functions convert entire strings between character sets. + They all have the signature + + bool (*)(iconv_t cd, const uchar *from, size_t flen, struct _cpp_strbuf *to); + + The input string FROM is converted as specified by the function + name plus the iconv descriptor CD (which may be fake), and the + result appended to TO. On any error, false is returned, otherwise true. */ + +/* These four use the custom conversion code above. */ +static bool +convert_utf8_utf16 (iconv_t cd, const uchar *from, size_t flen, + struct _cpp_strbuf *to) +{ + return conversion_loop (one_utf8_to_utf16, cd, from, flen, to); +} + +static bool +convert_utf8_utf32 (iconv_t cd, const uchar *from, size_t flen, + struct _cpp_strbuf *to) +{ + return conversion_loop (one_utf8_to_utf32, cd, from, flen, to); +} + +static bool +convert_utf16_utf8 (iconv_t cd, const uchar *from, size_t flen, + struct _cpp_strbuf *to) +{ + return conversion_loop (one_utf16_to_utf8, cd, from, flen, to); +} + +static bool +convert_utf32_utf8 (iconv_t cd, const uchar *from, size_t flen, + struct _cpp_strbuf *to) +{ + return conversion_loop (one_utf32_to_utf8, cd, from, flen, to); +} + +/* Identity conversion, used when we have no alternative. */ +static bool +convert_no_conversion (iconv_t cd ATTRIBUTE_UNUSED, + const uchar *from, size_t flen, struct _cpp_strbuf *to) +{ + if (to->len + flen > to->asize) + { + to->asize = to->len + flen; + to->text = XRESIZEVEC (uchar, to->text, to->asize); + } + memcpy (to->text + to->len, from, flen); + to->len += flen; + return true; +} + +/* And this one uses the system iconv primitive. It's a little + different, since iconv's interface is a little different. */ +#if HAVE_ICONV + +#define CONVERT_ICONV_GROW_BUFFER \ + do { \ + outbytesleft += OUTBUF_BLOCK_SIZE; \ + to->asize += OUTBUF_BLOCK_SIZE; \ + to->text = XRESIZEVEC (uchar, to->text, to->asize); \ + outbuf = (char *)to->text + to->asize - outbytesleft; \ + } while (0) + +static bool +convert_using_iconv (iconv_t cd, const uchar *from, size_t flen, + struct _cpp_strbuf *to) +{ + ICONV_CONST char *inbuf; + char *outbuf; + size_t inbytesleft, outbytesleft; + + /* Reset conversion descriptor and check that it is valid. */ + if (iconv (cd, 0, 0, 0, 0) == (size_t)-1) + return false; + + inbuf = (ICONV_CONST char *)from; + inbytesleft = flen; + outbuf = (char *)to->text + to->len; + outbytesleft = to->asize - to->len; + + for (;;) + { + iconv (cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft); + if (__builtin_expect (inbytesleft == 0, 1)) + { + /* Close out any shift states, returning to the initial state. */ + if (iconv (cd, 0, 0, &outbuf, &outbytesleft) == (size_t)-1) + { + if (errno != E2BIG) + return false; + + CONVERT_ICONV_GROW_BUFFER; + if (iconv (cd, 0, 0, &outbuf, &outbytesleft) == (size_t)-1) + return false; + } + + to->len = to->asize - outbytesleft; + return true; + } + if (errno != E2BIG) + return false; + + CONVERT_ICONV_GROW_BUFFER; + } +} +#else +#define convert_using_iconv 0 /* prevent undefined symbol error below */ +#endif + +/* Arrange for the above custom conversion logic to be used automatically + when conversion between a suitable pair of character sets is requested. */ + +#define APPLY_CONVERSION(CONVERTER, FROM, FLEN, TO) \ + CONVERTER.func (CONVERTER.cd, FROM, FLEN, TO) + +struct conversion +{ + const char *pair; + convert_f func; + iconv_t fake_cd; +}; +static const struct conversion conversion_tab[] = { + { "UTF-8/UTF-32LE", convert_utf8_utf32, (iconv_t)0 }, + { "UTF-8/UTF-32BE", convert_utf8_utf32, (iconv_t)1 }, + { "UTF-8/UTF-16LE", convert_utf8_utf16, (iconv_t)0 }, + { "UTF-8/UTF-16BE", convert_utf8_utf16, (iconv_t)1 }, + { "UTF-32LE/UTF-8", convert_utf32_utf8, (iconv_t)0 }, + { "UTF-32BE/UTF-8", convert_utf32_utf8, (iconv_t)1 }, + { "UTF-16LE/UTF-8", convert_utf16_utf8, (iconv_t)0 }, + { "UTF-16BE/UTF-8", convert_utf16_utf8, (iconv_t)1 }, +}; + +/* Subroutine of cpp_init_iconv: initialize and return a + cset_converter structure for conversion from FROM to TO. If + iconv_open() fails, issue an error and return an identity + converter. Silently return an identity converter if FROM and TO + are identical. */ +static struct cset_converter +init_iconv_desc (cpp_reader *pfile, const char *to, const char *from) +{ + struct cset_converter ret; + char *pair; + size_t i; + + if (!strcasecmp (to, from)) + { + ret.func = convert_no_conversion; + ret.cd = (iconv_t) -1; + return ret; + } + + pair = (char *) alloca(strlen(to) + strlen(from) + 2); + + strcpy(pair, from); + strcat(pair, "/"); + strcat(pair, to); + for (i = 0; i < ARRAY_SIZE (conversion_tab); i++) + if (!strcasecmp (pair, conversion_tab[i].pair)) + { + ret.func = conversion_tab[i].func; + ret.cd = conversion_tab[i].fake_cd; + return ret; + } + + /* No custom converter - try iconv. */ + if (HAVE_ICONV) + { + ret.func = convert_using_iconv; + ret.cd = iconv_open (to, from); + + if (ret.cd == (iconv_t) -1) + { + if (errno == EINVAL) + cpp_error (pfile, CPP_DL_ERROR, /* FIXME should be DL_SORRY */ + "conversion from %s to %s not supported by iconv", + from, to); + else + cpp_errno (pfile, CPP_DL_ERROR, "iconv_open"); + + ret.func = convert_no_conversion; + } + } + else + { + cpp_error (pfile, CPP_DL_ERROR, /* FIXME: should be DL_SORRY */ + "no iconv implementation, cannot convert from %s to %s", + from, to); + ret.func = convert_no_conversion; + ret.cd = (iconv_t) -1; + } + return ret; +} + +/* If charset conversion is requested, initialize iconv(3) descriptors + for conversion from the source character set to the execution + character sets. If iconv is not present in the C library, and + conversion is requested, issue an error. */ + +void +cpp_init_iconv (cpp_reader *pfile) +{ + const char *ncset = CPP_OPTION (pfile, narrow_charset); + const char *wcset = CPP_OPTION (pfile, wide_charset); + const char *default_wcset; + + bool be = CPP_OPTION (pfile, bytes_big_endian); + + if (CPP_OPTION (pfile, wchar_precision) >= 32) + default_wcset = be ? "UTF-32BE" : "UTF-32LE"; + else if (CPP_OPTION (pfile, wchar_precision) >= 16) + default_wcset = be ? "UTF-16BE" : "UTF-16LE"; + else + /* This effectively means that wide strings are not supported, + so don't do any conversion at all. */ + default_wcset = SOURCE_CHARSET; + + if (!ncset) + ncset = SOURCE_CHARSET; + if (!wcset) + wcset = default_wcset; + + pfile->narrow_cset_desc = init_iconv_desc (pfile, ncset, SOURCE_CHARSET); + pfile->wide_cset_desc = init_iconv_desc (pfile, wcset, SOURCE_CHARSET); +} + +/* Destroy iconv(3) descriptors set up by cpp_init_iconv, if necessary. */ +void +_cpp_destroy_iconv (cpp_reader *pfile) +{ + if (HAVE_ICONV) + { + if (pfile->narrow_cset_desc.func == convert_using_iconv) + iconv_close (pfile->narrow_cset_desc.cd); + if (pfile->wide_cset_desc.func == convert_using_iconv) + iconv_close (pfile->wide_cset_desc.cd); + } +} + +/* Utility routine for use by a full compiler. C is a character taken + from the *basic* source character set, encoded in the host's + execution encoding. Convert it to (the target's) execution + encoding, and return that value. + + Issues an internal error if C's representation in the narrow + execution character set fails to be a single-byte value (C99 + 5.2.1p3: "The representation of each member of the source and + execution character sets shall fit in a byte.") May also issue an + internal error if C fails to be a member of the basic source + character set (testing this exactly is too hard, especially when + the host character set is EBCDIC). */ +cppchar_t +cpp_host_to_exec_charset (cpp_reader *pfile, cppchar_t c) +{ + uchar sbuf[1]; + struct _cpp_strbuf tbuf; + + /* This test is merely an approximation, but it suffices to catch + the most important thing, which is that we don't get handed a + character outside the unibyte range of the host character set. */ + if (c > LAST_POSSIBLY_BASIC_SOURCE_CHAR) + { + cpp_error (pfile, CPP_DL_ICE, + "character 0x%lx is not in the basic source character set\n", + (unsigned long)c); + return 0; + } + + /* Being a character in the unibyte range of the host character set, + we can safely splat it into a one-byte buffer and trust that that + is a well-formed string. */ + sbuf[0] = c; + + /* This should never need to reallocate, but just in case... */ + tbuf.asize = 1; + tbuf.text = XNEWVEC (uchar, tbuf.asize); + tbuf.len = 0; + + if (!APPLY_CONVERSION (pfile->narrow_cset_desc, sbuf, 1, &tbuf)) + { + cpp_errno (pfile, CPP_DL_ICE, "converting to execution character set"); + return 0; + } + if (tbuf.len != 1) + { + cpp_error (pfile, CPP_DL_ICE, + "character 0x%lx is not unibyte in execution character set", + (unsigned long)c); + return 0; + } + c = tbuf.text[0]; + free(tbuf.text); + return c; +} + + + +/* Utility routine that computes a mask of the form 0000...111... with + WIDTH 1-bits. */ +static inline size_t +width_to_mask (size_t width) +{ + width = MIN (width, BITS_PER_CPPCHAR_T); + if (width >= CHAR_BIT * sizeof (size_t)) + return ~(size_t) 0; + else + return ((size_t) 1 << width) - 1; +} + +/* A large table of unicode character information. */ +enum { + /* Valid in a C99 identifier? */ + C99 = 1, + /* Valid in a C99 identifier, but not as the first character? */ + DIG = 2, + /* Valid in a C++ identifier? */ + CXX = 4, + /* NFC representation is not valid in an identifier? */ + CID = 8, + /* Might be valid NFC form? */ + NFC = 16, + /* Might be valid NFKC form? */ + NKC = 32, + /* Certain preceding characters might make it not valid NFC/NKFC form? */ + CTX = 64 +}; + +static const struct { + /* Bitmap of flags above. */ + unsigned char flags; + /* Combining class of the character. */ + unsigned char combine; + /* Last character in the range described by this entry. */ + unsigned short end; +} ucnranges[] = { +#include "ucnid.h" +}; + +/* Returns 1 if C is valid in an identifier, 2 if C is valid except at + the start of an identifier, and 0 if C is not valid in an + identifier. We assume C has already gone through the checks of + _cpp_valid_ucn. Also update NST for C if returning nonzero. The + algorithm is a simple binary search on the table defined in + ucnid.h. */ + +static int +ucn_valid_in_identifier (cpp_reader *pfile, cppchar_t c, + struct normalize_state *nst) +{ + int mn, mx, md; + + if (c > 0xFFFF) + return 0; + + mn = 0; + mx = ARRAY_SIZE (ucnranges) - 1; + while (mx != mn) + { + md = (mn + mx) / 2; + if (c <= ucnranges[md].end) + mx = md; + else + mn = md + 1; + } + + /* When -pedantic, we require the character to have been listed by + the standard for the current language. Otherwise, we accept the + union of the acceptable sets for C++98 and C99. */ + if (! (ucnranges[mn].flags & (C99 | CXX))) + return 0; + + if (CPP_PEDANTIC (pfile) + && ((CPP_OPTION (pfile, c99) && !(ucnranges[mn].flags & C99)) + || (CPP_OPTION (pfile, cplusplus) + && !(ucnranges[mn].flags & CXX)))) + return 0; + + /* Update NST. */ + if (ucnranges[mn].combine != 0 && ucnranges[mn].combine < nst->prev_class) + nst->level = normalized_none; + else if (ucnranges[mn].flags & CTX) + { + bool safe; + cppchar_t p = nst->previous; + + /* Easy cases from Bengali, Oriya, Tamil, Jannada, and Malayalam. */ + if (c == 0x09BE) + safe = p != 0x09C7; /* Use 09CB instead of 09C7 09BE. */ + else if (c == 0x0B3E) + safe = p != 0x0B47; /* Use 0B4B instead of 0B47 0B3E. */ + else if (c == 0x0BBE) + safe = p != 0x0BC6 && p != 0x0BC7; /* Use 0BCA/0BCB instead. */ + else if (c == 0x0CC2) + safe = p != 0x0CC6; /* Use 0CCA instead of 0CC6 0CC2. */ + else if (c == 0x0D3E) + safe = p != 0x0D46 && p != 0x0D47; /* Use 0D4A/0D4B instead. */ + /* For Hangul, characters in the range AC00-D7A3 are NFC/NFKC, + and are combined algorithmically from a sequence of the form + 1100-1112 1161-1175 11A8-11C2 + (if the third is not present, it is treated as 11A7, which is not + really a valid character). + Unfortunately, C99 allows (only) the NFC form, but C++ allows + only the combining characters. */ + else if (c >= 0x1161 && c <= 0x1175) + safe = p < 0x1100 || p > 0x1112; + else if (c >= 0x11A8 && c <= 0x11C2) + safe = (p < 0xAC00 || p > 0xD7A3 || (p - 0xAC00) % 28 != 0); + else + { + /* Uh-oh, someone updated ucnid.h without updating this code. */ + cpp_error (pfile, CPP_DL_ICE, "Character %x might not be NFKC", c); + safe = true; + } + if (!safe && c < 0x1161) + nst->level = normalized_none; + else if (!safe) + nst->level = MAX (nst->level, normalized_identifier_C); + } + else if (ucnranges[mn].flags & NKC) + ; + else if (ucnranges[mn].flags & NFC) + nst->level = MAX (nst->level, normalized_C); + else if (ucnranges[mn].flags & CID) + nst->level = MAX (nst->level, normalized_identifier_C); + else + nst->level = normalized_none; + nst->previous = c; + nst->prev_class = ucnranges[mn].combine; + + /* In C99, UCN digits may not begin identifiers. */ + if (CPP_OPTION (pfile, c99) && (ucnranges[mn].flags & DIG)) + return 2; + + return 1; +} + +/* [lex.charset]: The character designated by the universal character + name \UNNNNNNNN is that character whose character short name in + ISO/IEC 10646 is NNNNNNNN; the character designated by the + universal character name \uNNNN is that character whose character + short name in ISO/IEC 10646 is 0000NNNN. If the hexadecimal value + for a universal character name is less than 0x20 or in the range + 0x7F-0x9F (inclusive), or if the universal character name + designates a character in the basic source character set, then the + program is ill-formed. + + *PSTR must be preceded by "\u" or "\U"; it is assumed that the + buffer end is delimited by a non-hex digit. Returns zero if the + UCN has not been consumed. + + Otherwise the nonzero value of the UCN, whether valid or invalid, + is returned. Diagnostics are emitted for invalid values. PSTR + is updated to point one beyond the UCN, or to the syntactically + invalid character. + + IDENTIFIER_POS is 0 when not in an identifier, 1 for the start of + an identifier, or 2 otherwise. */ + +cppchar_t +_cpp_valid_ucn (cpp_reader *pfile, const uchar **pstr, + const uchar *limit, int identifier_pos, + struct normalize_state *nst) +{ + cppchar_t result, c; + unsigned int length; + const uchar *str = *pstr; + const uchar *base = str - 2; + + if (!CPP_OPTION (pfile, cplusplus) && !CPP_OPTION (pfile, c99)) + cpp_error (pfile, CPP_DL_WARNING, + "universal character names are only valid in C++ and C99"); + else if (CPP_WTRADITIONAL (pfile) && identifier_pos == 0) + cpp_error (pfile, CPP_DL_WARNING, + "the meaning of '\\%c' is different in traditional C", + (int) str[-1]); + + if (str[-1] == 'u') + length = 4; + else if (str[-1] == 'U') + length = 8; + else + { + cpp_error (pfile, CPP_DL_ICE, "In _cpp_valid_ucn but not a UCN"); + length = 4; + } + + result = 0; + do + { + c = *str; + if (!ISXDIGIT (c)) + break; + str++; + result = (result << 4) + hex_value (c); + } + while (--length && str < limit); + + /* Partial UCNs are not valid in strings, but decompose into + multiple tokens in identifiers, so we can't give a helpful + error message in that case. */ + if (length && identifier_pos) + return 0; + + *pstr = str; + if (length) + { + cpp_error (pfile, CPP_DL_ERROR, + "incomplete universal character name %.*s", + (int) (str - base), base); + result = 1; + } + /* The standard permits $, @ and ` to be specified as UCNs. We use + hex escapes so that this also works with EBCDIC hosts. */ + else if ((result < 0xa0 + && (result != 0x24 && result != 0x40 && result != 0x60)) + || (result & 0x80000000) + || (result >= 0xD800 && result <= 0xDFFF)) + { + cpp_error (pfile, CPP_DL_ERROR, + "%.*s is not a valid universal character", + (int) (str - base), base); + result = 1; + } + else if (identifier_pos && result == 0x24 + && CPP_OPTION (pfile, dollars_in_ident)) + { + if (CPP_OPTION (pfile, warn_dollars) && !pfile->state.skipping) + { + CPP_OPTION (pfile, warn_dollars) = 0; + cpp_error (pfile, CPP_DL_PEDWARN, "'$' in identifier or number"); + } + NORMALIZE_STATE_UPDATE_IDNUM (nst); + } + else if (identifier_pos) + { + int validity = ucn_valid_in_identifier (pfile, result, nst); + + if (validity == 0) + cpp_error (pfile, CPP_DL_ERROR, + "universal character %.*s is not valid in an identifier", + (int) (str - base), base); + else if (validity == 2 && identifier_pos == 1) + cpp_error (pfile, CPP_DL_ERROR, + "universal character %.*s is not valid at the start of an identifier", + (int) (str - base), base); + } + + if (result == 0) + result = 1; + + return result; +} + +/* Convert an UCN, pointed to by FROM, to UTF-8 encoding, then translate + it to the execution character set and write the result into TBUF. + An advanced pointer is returned. Issues all relevant diagnostics. */ +static const uchar * +convert_ucn (cpp_reader *pfile, const uchar *from, const uchar *limit, + struct _cpp_strbuf *tbuf, bool wide) +{ + cppchar_t ucn; + uchar buf[6]; + uchar *bufp = buf; + size_t bytesleft = 6; + int rval; + struct cset_converter cvt + = wide ? pfile->wide_cset_desc : pfile->narrow_cset_desc; + struct normalize_state nst = INITIAL_NORMALIZE_STATE; + + from++; /* Skip u/U. */ + ucn = _cpp_valid_ucn (pfile, &from, limit, 0, &nst); + + rval = one_cppchar_to_utf8 (ucn, &bufp, &bytesleft); + if (rval) + { + errno = rval; + cpp_errno (pfile, CPP_DL_ERROR, + "converting UCN to source character set"); + } + else if (!APPLY_CONVERSION (cvt, buf, 6 - bytesleft, tbuf)) + cpp_errno (pfile, CPP_DL_ERROR, + "converting UCN to execution character set"); + + return from; +} + +/* Subroutine of convert_hex and convert_oct. N is the representation + in the execution character set of a numeric escape; write it into the + string buffer TBUF and update the end-of-string pointer therein. WIDE + is true if it's a wide string that's being assembled in TBUF. This + function issues no diagnostics and never fails. */ +static void +emit_numeric_escape (cpp_reader *pfile, cppchar_t n, + struct _cpp_strbuf *tbuf, bool wide) +{ + if (wide) + { + /* We have to render this into the target byte order, which may not + be our byte order. */ + bool bigend = CPP_OPTION (pfile, bytes_big_endian); + size_t width = CPP_OPTION (pfile, wchar_precision); + size_t cwidth = CPP_OPTION (pfile, char_precision); + size_t cmask = width_to_mask (cwidth); + size_t nbwc = width / cwidth; + size_t i; + size_t off = tbuf->len; + cppchar_t c; + + if (tbuf->len + nbwc > tbuf->asize) + { + tbuf->asize += OUTBUF_BLOCK_SIZE; + tbuf->text = XRESIZEVEC (uchar, tbuf->text, tbuf->asize); + } + + for (i = 0; i < nbwc; i++) + { + c = n & cmask; + n >>= cwidth; + tbuf->text[off + (bigend ? nbwc - i - 1 : i)] = c; + } + tbuf->len += nbwc; + } + else + { + /* Note: this code does not handle the case where the target + and host have a different number of bits in a byte. */ + if (tbuf->len + 1 > tbuf->asize) + { + tbuf->asize += OUTBUF_BLOCK_SIZE; + tbuf->text = XRESIZEVEC (uchar, tbuf->text, tbuf->asize); + } + tbuf->text[tbuf->len++] = n; + } +} + +/* Convert a hexadecimal escape, pointed to by FROM, to the execution + character set and write it into the string buffer TBUF. Returns an + advanced pointer, and issues diagnostics as necessary. + No character set translation occurs; this routine always produces the + execution-set character with numeric value equal to the given hex + number. You can, e.g. generate surrogate pairs this way. */ +static const uchar * +convert_hex (cpp_reader *pfile, const uchar *from, const uchar *limit, + struct _cpp_strbuf *tbuf, bool wide) +{ + cppchar_t c, n = 0, overflow = 0; + int digits_found = 0; + size_t width = (wide ? CPP_OPTION (pfile, wchar_precision) + : CPP_OPTION (pfile, char_precision)); + size_t mask = width_to_mask (width); + + if (CPP_WTRADITIONAL (pfile)) + cpp_error (pfile, CPP_DL_WARNING, + "the meaning of '\\x' is different in traditional C"); + + from++; /* Skip 'x'. */ + while (from < limit) + { + c = *from; + if (! hex_p (c)) + break; + from++; + overflow |= n ^ (n << 4 >> 4); + n = (n << 4) + hex_value (c); + digits_found = 1; + } + + if (!digits_found) + { + cpp_error (pfile, CPP_DL_ERROR, + "\\x used with no following hex digits"); + return from; + } + + if (overflow | (n != (n & mask))) + { + cpp_error (pfile, CPP_DL_PEDWARN, + "hex escape sequence out of range"); + n &= mask; + } + + emit_numeric_escape (pfile, n, tbuf, wide); + + return from; +} + +/* Convert an octal escape, pointed to by FROM, to the execution + character set and write it into the string buffer TBUF. Returns an + advanced pointer, and issues diagnostics as necessary. + No character set translation occurs; this routine always produces the + execution-set character with numeric value equal to the given octal + number. */ +static const uchar * +convert_oct (cpp_reader *pfile, const uchar *from, const uchar *limit, + struct _cpp_strbuf *tbuf, bool wide) +{ + size_t count = 0; + cppchar_t c, n = 0; + size_t width = (wide ? CPP_OPTION (pfile, wchar_precision) + : CPP_OPTION (pfile, char_precision)); + size_t mask = width_to_mask (width); + bool overflow = false; + + while (from < limit && count++ < 3) + { + c = *from; + if (c < '0' || c > '7') + break; + from++; + overflow |= n ^ (n << 3 >> 3); + n = (n << 3) + c - '0'; + } + + if (n != (n & mask)) + { + cpp_error (pfile, CPP_DL_PEDWARN, + "octal escape sequence out of range"); + n &= mask; + } + + emit_numeric_escape (pfile, n, tbuf, wide); + + return from; +} + +/* Convert an escape sequence (pointed to by FROM) to its value on + the target, and to the execution character set. Do not scan past + LIMIT. Write the converted value into TBUF. Returns an advanced + pointer. Handles all relevant diagnostics. */ +static const uchar * +convert_escape (cpp_reader *pfile, const uchar *from, const uchar *limit, + struct _cpp_strbuf *tbuf, bool wide) +{ + /* Values of \a \b \e \f \n \r \t \v respectively. */ +#if HOST_CHARSET == HOST_CHARSET_ASCII + static const uchar charconsts[] = { 7, 8, 27, 12, 10, 13, 9, 11 }; +#elif HOST_CHARSET == HOST_CHARSET_EBCDIC + static const uchar charconsts[] = { 47, 22, 39, 12, 21, 13, 5, 11 }; +#else +#error "unknown host character set" +#endif + + uchar c; + struct cset_converter cvt + = wide ? pfile->wide_cset_desc : pfile->narrow_cset_desc; + + c = *from; + switch (c) + { + /* UCNs, hex escapes, and octal escapes are processed separately. */ + case 'u': case 'U': + return convert_ucn (pfile, from, limit, tbuf, wide); + + case 'x': + return convert_hex (pfile, from, limit, tbuf, wide); + break; + + case '0': case '1': case '2': case '3': + case '4': case '5': case '6': case '7': + return convert_oct (pfile, from, limit, tbuf, wide); + + /* Various letter escapes. Get the appropriate host-charset + value into C. */ + case '\\': case '\'': case '"': case '?': break; + + case '(': case '{': case '[': case '%': + /* '\(', etc, can be used at the beginning of a line in a long + string split onto multiple lines with \-newline, to prevent + Emacs or other text editors from getting confused. '\%' can + be used to prevent SCCS from mangling printf format strings. */ + if (CPP_PEDANTIC (pfile)) + goto unknown; + break; + + case 'b': c = charconsts[1]; break; + case 'f': c = charconsts[3]; break; + case 'n': c = charconsts[4]; break; + case 'r': c = charconsts[5]; break; + case 't': c = charconsts[6]; break; + case 'v': c = charconsts[7]; break; + + case 'a': + if (CPP_WTRADITIONAL (pfile)) + cpp_error (pfile, CPP_DL_WARNING, + "the meaning of '\\a' is different in traditional C"); + c = charconsts[0]; + break; + + case 'e': case 'E': + if (CPP_PEDANTIC (pfile)) + cpp_error (pfile, CPP_DL_PEDWARN, + "non-ISO-standard escape sequence, '\\%c'", (int) c); + c = charconsts[2]; + break; + + default: + unknown: + if (ISGRAPH (c)) + cpp_error (pfile, CPP_DL_PEDWARN, + "unknown escape sequence '\\%c'", (int) c); + else + { + /* diagnostic.c does not support "%03o". When it does, this + code can use %03o directly in the diagnostic again. */ + char buf[32]; + sprintf(buf, "%03o", (int) c); + cpp_error (pfile, CPP_DL_PEDWARN, + "unknown escape sequence: '\\%s'", buf); + } + } + + /* Now convert what we have to the execution character set. */ + if (!APPLY_CONVERSION (cvt, &c, 1, tbuf)) + cpp_errno (pfile, CPP_DL_ERROR, + "converting escape sequence to execution character set"); + + return from + 1; +} + +/* FROM is an array of cpp_string structures of length COUNT. These + are to be converted from the source to the execution character set, + escape sequences translated, and finally all are to be + concatenated. WIDE indicates whether or not to produce a wide + string. The result is written into TO. Returns true for success, + false for failure. */ +bool +cpp_interpret_string (cpp_reader *pfile, const cpp_string *from, size_t count, + cpp_string *to, bool wide) +{ + struct _cpp_strbuf tbuf; + const uchar *p, *base, *limit; + size_t i; + struct cset_converter cvt + = wide ? pfile->wide_cset_desc : pfile->narrow_cset_desc; + + tbuf.asize = MAX (OUTBUF_BLOCK_SIZE, from->len); + tbuf.text = XNEWVEC (uchar, tbuf.asize); + tbuf.len = 0; + + for (i = 0; i < count; i++) + { + p = from[i].text; + if (*p == 'L') p++; + p++; /* Skip leading quote. */ + limit = from[i].text + from[i].len - 1; /* Skip trailing quote. */ + + for (;;) + { + base = p; + while (p < limit && *p != '\\') + p++; + if (p > base) + { + /* We have a run of normal characters; these can be fed + directly to convert_cset. */ + if (!APPLY_CONVERSION (cvt, base, p - base, &tbuf)) + goto fail; + } + if (p == limit) + break; + + p = convert_escape (pfile, p + 1, limit, &tbuf, wide); + } + } + /* NUL-terminate the 'to' buffer and translate it to a cpp_string + structure. */ + emit_numeric_escape (pfile, 0, &tbuf, wide); + tbuf.text = XRESIZEVEC (uchar, tbuf.text, tbuf.len); + to->text = tbuf.text; + to->len = tbuf.len; + return true; + + fail: + cpp_errno (pfile, CPP_DL_ERROR, "converting to execution character set"); + free (tbuf.text); + return false; +} + +/* Subroutine of do_line and do_linemarker. Convert escape sequences + in a string, but do not perform character set conversion. */ +bool +cpp_interpret_string_notranslate (cpp_reader *pfile, const cpp_string *from, + size_t count, cpp_string *to, bool wide) +{ + struct cset_converter save_narrow_cset_desc = pfile->narrow_cset_desc; + bool retval; + + pfile->narrow_cset_desc.func = convert_no_conversion; + pfile->narrow_cset_desc.cd = (iconv_t) -1; + + retval = cpp_interpret_string (pfile, from, count, to, wide); + + pfile->narrow_cset_desc = save_narrow_cset_desc; + return retval; +} + + +/* Subroutine of cpp_interpret_charconst which performs the conversion + to a number, for narrow strings. STR is the string structure returned + by cpp_interpret_string. PCHARS_SEEN and UNSIGNEDP are as for + cpp_interpret_charconst. */ +static cppchar_t +narrow_str_to_charconst (cpp_reader *pfile, cpp_string str, + unsigned int *pchars_seen, int *unsignedp) +{ + size_t width = CPP_OPTION (pfile, char_precision); + size_t max_chars = CPP_OPTION (pfile, int_precision) / width; + size_t mask = width_to_mask (width); + size_t i; + cppchar_t result, c; + bool unsigned_p; + + /* The value of a multi-character character constant, or a + single-character character constant whose representation in the + execution character set is more than one byte long, is + implementation defined. This implementation defines it to be the + number formed by interpreting the byte sequence in memory as a + big-endian binary number. If overflow occurs, the high bytes are + lost, and a warning is issued. + + We don't want to process the NUL terminator handed back by + cpp_interpret_string. */ + result = 0; + for (i = 0; i < str.len - 1; i++) + { + c = str.text[i] & mask; + if (width < BITS_PER_CPPCHAR_T) + result = (result << width) | c; + else + result = c; + } + + if (i > max_chars) + { + i = max_chars; + cpp_error (pfile, CPP_DL_WARNING, + "character constant too long for its type"); + } + else if (i > 1 && CPP_OPTION (pfile, warn_multichar)) + cpp_error (pfile, CPP_DL_WARNING, "multi-character character constant"); + + /* Multichar constants are of type int and therefore signed. */ + if (i > 1) + unsigned_p = 0; + else + unsigned_p = CPP_OPTION (pfile, unsigned_char); + + /* Truncate the constant to its natural width, and simultaneously + sign- or zero-extend to the full width of cppchar_t. + For single-character constants, the value is WIDTH bits wide. + For multi-character constants, the value is INT_PRECISION bits wide. */ + if (i > 1) + width = CPP_OPTION (pfile, int_precision); + if (width < BITS_PER_CPPCHAR_T) + { + mask = ((cppchar_t) 1 << width) - 1; + if (unsigned_p || !(result & (1 << (width - 1)))) + result &= mask; + else + result |= ~mask; + } + *pchars_seen = i; + *unsignedp = unsigned_p; + return result; +} + +/* Subroutine of cpp_interpret_charconst which performs the conversion + to a number, for wide strings. STR is the string structure returned + by cpp_interpret_string. PCHARS_SEEN and UNSIGNEDP are as for + cpp_interpret_charconst. */ +static cppchar_t +wide_str_to_charconst (cpp_reader *pfile, cpp_string str, + unsigned int *pchars_seen, int *unsignedp) +{ + bool bigend = CPP_OPTION (pfile, bytes_big_endian); + size_t width = CPP_OPTION (pfile, wchar_precision); + size_t cwidth = CPP_OPTION (pfile, char_precision); + size_t mask = width_to_mask (width); + size_t cmask = width_to_mask (cwidth); + size_t nbwc = width / cwidth; + size_t off, i; + cppchar_t result = 0, c; + + /* This is finicky because the string is in the target's byte order, + which may not be our byte order. Only the last character, ignoring + the NUL terminator, is relevant. */ + off = str.len - (nbwc * 2); + result = 0; + for (i = 0; i < nbwc; i++) + { + c = bigend ? str.text[off + i] : str.text[off + nbwc - i - 1]; + result = (result << cwidth) | (c & cmask); + } + + /* Wide character constants have type wchar_t, and a single + character exactly fills a wchar_t, so a multi-character wide + character constant is guaranteed to overflow. */ + if (off > 0) + cpp_error (pfile, CPP_DL_WARNING, + "character constant too long for its type"); + + /* Truncate the constant to its natural width, and simultaneously + sign- or zero-extend to the full width of cppchar_t. */ + if (width < BITS_PER_CPPCHAR_T) + { + if (CPP_OPTION (pfile, unsigned_wchar) || !(result & (1 << (width - 1)))) + result &= mask; + else + result |= ~mask; + } + + *unsignedp = CPP_OPTION (pfile, unsigned_wchar); + *pchars_seen = 1; + return result; +} + +/* Interpret a (possibly wide) character constant in TOKEN. + PCHARS_SEEN points to a variable that is filled in with the number + of characters seen, and UNSIGNEDP to a variable that indicates + whether the result has signed type. */ +cppchar_t +cpp_interpret_charconst (cpp_reader *pfile, const cpp_token *token, + unsigned int *pchars_seen, int *unsignedp) +{ + cpp_string str = { 0, 0 }; + bool wide = (token->type == CPP_WCHAR); + cppchar_t result; + + /* an empty constant will appear as L'' or '' */ + if (token->val.str.len == (size_t) (2 + wide)) + { + cpp_error (pfile, CPP_DL_ERROR, "empty character constant"); + return 0; + } + else if (!cpp_interpret_string (pfile, &token->val.str, 1, &str, wide)) + return 0; + + if (wide) + result = wide_str_to_charconst (pfile, str, pchars_seen, unsignedp); + else + result = narrow_str_to_charconst (pfile, str, pchars_seen, unsignedp); + + if (str.text != token->val.str.text) + free ((void *)str.text); + + return result; +} + +/* Convert an identifier denoted by ID and LEN, which might contain + UCN escapes, to the source character set, either UTF-8 or + UTF-EBCDIC. Assumes that the identifier is actually a valid identifier. */ +cpp_hashnode * +_cpp_interpret_identifier (cpp_reader *pfile, const uchar *id, size_t len) +{ + /* It turns out that a UCN escape always turns into fewer characters + than the escape itself, so we can allocate a temporary in advance. */ + uchar * buf = (uchar *) alloca (len + 1); + uchar * bufp = buf; + size_t idp; + + for (idp = 0; idp < len; idp++) + if (id[idp] != '\\') + *bufp++ = id[idp]; + else + { + unsigned length = id[idp+1] == 'u' ? 4 : 8; + cppchar_t value = 0; + size_t bufleft = len - (bufp - buf); + int rval; + + idp += 2; + while (length && idp < len && ISXDIGIT (id[idp])) + { + value = (value << 4) + hex_value (id[idp]); + idp++; + length--; + } + idp--; + + /* Special case for EBCDIC: if the identifier contains + a '$' specified using a UCN, translate it to EBCDIC. */ + if (value == 0x24) + { + *bufp++ = '$'; + continue; + } + + rval = one_cppchar_to_utf8 (value, &bufp, &bufleft); + if (rval) + { + errno = rval; + cpp_errno (pfile, CPP_DL_ERROR, + "converting UCN to source character set"); + break; + } + } + + return CPP_HASHNODE (ht_lookup (pfile->hash_table, + buf, bufp - buf, HT_ALLOC)); +} + +/* Convert an input buffer (containing the complete contents of one + source file) from INPUT_CHARSET to the source character set. INPUT + points to the input buffer, SIZE is its allocated size, and LEN is + the length of the meaningful data within the buffer. The + translated buffer is returned, and *ST_SIZE is set to the length of + the meaningful data within the translated buffer. + + INPUT is expected to have been allocated with xmalloc. This function + will either return INPUT, or free it and return a pointer to another + xmalloc-allocated block of memory. */ +uchar * +_cpp_convert_input (cpp_reader *pfile, const char *input_charset, + uchar *input, size_t size, size_t len, off_t *st_size) +{ + struct cset_converter input_cset; + struct _cpp_strbuf to; + + input_cset = init_iconv_desc (pfile, SOURCE_CHARSET, input_charset); + if (input_cset.func == convert_no_conversion) + { + to.text = input; + to.asize = size; + to.len = len; + } + else + { + to.asize = MAX (65536, len); + to.text = XNEWVEC (uchar, to.asize); + to.len = 0; + + if (!APPLY_CONVERSION (input_cset, input, len, &to)) + cpp_error (pfile, CPP_DL_ERROR, + "failure to convert %s to %s", + CPP_OPTION (pfile, input_charset), SOURCE_CHARSET); + + free (input); + } + + /* Clean up the mess. */ + if (input_cset.func == convert_using_iconv) + iconv_close (input_cset.cd); + + /* Resize buffer if we allocated substantially too much, or if we + haven't enough space for the \n-terminator. */ + if (to.len + 4096 < to.asize || to.len >= to.asize) + to.text = XRESIZEVEC (uchar, to.text, to.len + 1); + + /* If the file is using old-school Mac line endings (\r only), + terminate with another \r, not an \n, so that we do not mistake + the \r\n sequence for a single DOS line ending and erroneously + issue the "No newline at end of file" diagnostic. */ + if (to.len && to.text[to.len - 1] == '\r') + to.text[to.len] = '\r'; + else + to.text[to.len] = '\n'; + + *st_size = to.len; + return to.text; +} + +/* Decide on the default encoding to assume for input files. */ +const char * +_cpp_default_encoding (void) +{ + const char *current_encoding = NULL; + + /* We disable this because the default codeset is 7-bit ASCII on + most platforms, and this causes conversion failures on every + file in GCC that happens to have one of the upper 128 characters + in it -- most likely, as part of the name of a contributor. + We should definitely recognize in-band markers of file encoding, + like: + - the appropriate Unicode byte-order mark (FE FF) to recognize + UTF16 and UCS4 (in both big-endian and little-endian flavors) + and UTF8 + - a "#i", "#d", "/ *", "//", " #p" or "#p" (for #pragma) to + distinguish ASCII and EBCDIC. + - now we can parse something like "#pragma GCC encoding + on the first line, or even Emacs/VIM's mode line tags (there's + a problem here in that VIM uses the last line, and Emacs has + its more elaborate "local variables" convention). + - investigate whether Java has another common convention, which + would be friendly to support. + (Zack Weinberg and Paolo Bonzini, May 20th 2004) */ +#if defined (HAVE_LOCALE_H) && defined (HAVE_LANGINFO_CODESET) && 0 + setlocale (LC_CTYPE, ""); + current_encoding = nl_langinfo (CODESET); +#endif + if (current_encoding == NULL || *current_encoding == '\0') + current_encoding = SOURCE_CHARSET; + + return current_encoding; +} diff --git a/libcpp/config.in b/libcpp/config.in new file mode 100644 index 0000000..4f3fcc7 --- /dev/null +++ b/libcpp/config.in @@ -0,0 +1,285 @@ +/* config.in. Generated from configure.ac by autoheader. */ + +/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP + systems. This function is required for `alloca.c' support on those systems. + */ +#undef CRAY_STACKSEG_END + +/* Define to 1 if using `alloca.c'. */ +#undef C_ALLOCA + +/* Define if you want more run-time sanity checks. */ +#undef ENABLE_CHECKING + +/* Define to 1 if translation of program messages to the user's native + language is requested. */ +#undef ENABLE_NLS + +/* Define to 1 if you have `alloca', as a function or macro. */ +#undef HAVE_ALLOCA + +/* Define to 1 if you have and it should be used (not on Ultrix). + */ +#undef HAVE_ALLOCA_H + +/* Define to 1 if you have the `clearerr_unlocked' function. */ +#undef HAVE_CLEARERR_UNLOCKED + +/* Define to 1 if you have the declaration of `abort', and to 0 if you don't. + */ +#undef HAVE_DECL_ABORT + +/* Define to 1 if you have the declaration of `asprintf', and to 0 if you + don't. */ +#undef HAVE_DECL_ASPRINTF + +/* Define to 1 if you have the declaration of `basename', and to 0 if you + don't. */ +#undef HAVE_DECL_BASENAME + +/* Define to 1 if you have the declaration of `clearerr_unlocked', and to 0 if + you don't. */ +#undef HAVE_DECL_CLEARERR_UNLOCKED + +/* Define to 1 if you have the declaration of `errno', and to 0 if you don't. + */ +#undef HAVE_DECL_ERRNO + +/* Define to 1 if you have the declaration of `feof_unlocked', and to 0 if you + don't. */ +#undef HAVE_DECL_FEOF_UNLOCKED + +/* Define to 1 if you have the declaration of `ferror_unlocked', and to 0 if + you don't. */ +#undef HAVE_DECL_FERROR_UNLOCKED + +/* Define to 1 if you have the declaration of `fflush_unlocked', and to 0 if + you don't. */ +#undef HAVE_DECL_FFLUSH_UNLOCKED + +/* Define to 1 if you have the declaration of `fgetc_unlocked', and to 0 if + you don't. */ +#undef HAVE_DECL_FGETC_UNLOCKED + +/* Define to 1 if you have the declaration of `fgets_unlocked', and to 0 if + you don't. */ +#undef HAVE_DECL_FGETS_UNLOCKED + +/* Define to 1 if you have the declaration of `fileno_unlocked', and to 0 if + you don't. */ +#undef HAVE_DECL_FILENO_UNLOCKED + +/* Define to 1 if you have the declaration of `fprintf_unlocked', and to 0 if + you don't. */ +#undef HAVE_DECL_FPRINTF_UNLOCKED + +/* Define to 1 if you have the declaration of `fputc_unlocked', and to 0 if + you don't. */ +#undef HAVE_DECL_FPUTC_UNLOCKED + +/* Define to 1 if you have the declaration of `fputs_unlocked', and to 0 if + you don't. */ +#undef HAVE_DECL_FPUTS_UNLOCKED + +/* Define to 1 if you have the declaration of `fread_unlocked', and to 0 if + you don't. */ +#undef HAVE_DECL_FREAD_UNLOCKED + +/* Define to 1 if you have the declaration of `fwrite_unlocked', and to 0 if + you don't. */ +#undef HAVE_DECL_FWRITE_UNLOCKED + +/* Define to 1 if you have the declaration of `getchar_unlocked', and to 0 if + you don't. */ +#undef HAVE_DECL_GETCHAR_UNLOCKED + +/* Define to 1 if you have the declaration of `getc_unlocked', and to 0 if you + don't. */ +#undef HAVE_DECL_GETC_UNLOCKED + +/* Define to 1 if you have the declaration of `getopt', and to 0 if you don't. + */ +#undef HAVE_DECL_GETOPT + +/* Define to 1 if you have the declaration of `putchar_unlocked', and to 0 if + you don't. */ +#undef HAVE_DECL_PUTCHAR_UNLOCKED + +/* Define to 1 if you have the declaration of `putc_unlocked', and to 0 if you + don't. */ +#undef HAVE_DECL_PUTC_UNLOCKED + +/* Define to 1 if you have the declaration of `vasprintf', and to 0 if you + don't. */ +#undef HAVE_DECL_VASPRINTF + +/* Define to 1 if you have the header file. */ +#undef HAVE_FCNTL_H + +/* Define to 1 if you have the `feof_unlocked' function. */ +#undef HAVE_FEOF_UNLOCKED + +/* Define to 1 if you have the `ferror_unlocked' function. */ +#undef HAVE_FERROR_UNLOCKED + +/* Define to 1 if you have the `fflush_unlocked' function. */ +#undef HAVE_FFLUSH_UNLOCKED + +/* Define to 1 if you have the `fgetc_unlocked' function. */ +#undef HAVE_FGETC_UNLOCKED + +/* Define to 1 if you have the `fgets_unlocked' function. */ +#undef HAVE_FGETS_UNLOCKED + +/* Define to 1 if you have the `fileno_unlocked' function. */ +#undef HAVE_FILENO_UNLOCKED + +/* Define to 1 if you have the `fprintf_unlocked' function. */ +#undef HAVE_FPRINTF_UNLOCKED + +/* Define to 1 if you have the `fputc_unlocked' function. */ +#undef HAVE_FPUTC_UNLOCKED + +/* Define to 1 if you have the `fputs_unlocked' function. */ +#undef HAVE_FPUTS_UNLOCKED + +/* Define to 1 if you have the `fread_unlocked' function. */ +#undef HAVE_FREAD_UNLOCKED + +/* Define to 1 if you have the `fwrite_unlocked' function. */ +#undef HAVE_FWRITE_UNLOCKED + +/* Define to 1 if you have the `getchar_unlocked' function. */ +#undef HAVE_GETCHAR_UNLOCKED + +/* Define to 1 if you have the `getc_unlocked' function. */ +#undef HAVE_GETC_UNLOCKED + +/* Define if you have the iconv() function. */ +#undef HAVE_ICONV + +/* Define to 1 if you have the header file. */ +#undef HAVE_ICONV_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define if you have and nl_langinfo(CODESET). */ +#undef HAVE_LANGINFO_CODESET + +/* Define to 1 if you have the header file. */ +#undef HAVE_LIMITS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_LOCALE_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if libc includes obstacks. */ +#undef HAVE_OBSTACK + +/* Define to 1 if you have the `putchar_unlocked' function. */ +#undef HAVE_PUTCHAR_UNLOCKED + +/* Define to 1 if you have the `putc_unlocked' function. */ +#undef HAVE_PUTC_UNLOCKED + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDDEF_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_FILE_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define if defines \`uchar'. */ +#undef HAVE_UCHAR + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to the widest efficient host integer type at least as wide as the + target's size_t type. */ +#undef HOST_WIDE_INT + +/* Define as const if the declaration of iconv() needs const. */ +#undef ICONV_CONST + +/* Define to the name of this package. */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* The size of `int', as computed by sizeof. */ +#undef SIZEOF_INT + +/* The size of `long', as computed by sizeof. */ +#undef SIZEOF_LONG + +/* If using the C implementation of alloca, define if you know the + direction of stack growth for your system; otherwise it will be + automatically deduced at runtime. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ +#undef STACK_DIRECTION + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Define if you can safely include both and . */ +#undef STRING_WITH_STRINGS + +/* Define to 1 if you can safely include both and . */ +#undef TIME_WITH_SYS_TIME + +/* Define to 1 if your declares `struct tm'. */ +#undef TM_IN_SYS_TIME + +/* Define to empty if `const' does not conform to ANSI C. */ +#undef const + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +#undef inline +#endif + +/* Define to `long int' if does not define. */ +#undef off_t + +/* Define to `unsigned int' if does not define. */ +#undef size_t + +/* Define to `int' if does not define. */ +#undef ssize_t diff --git a/libcpp/configure b/libcpp/configure new file mode 100755 index 0000000..46d4979 --- /dev/null +++ b/libcpp/configure @@ -0,0 +1,9977 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.61 for cpplib . +# +# Report bugs to . +# +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + + + +# PATH needs CR +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +as_nl=' +' +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + { (exit 1); exit 1; } +fi + +# Work around bugs in pre-3.0 UWIN ksh. +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + + +# Name of the executable. +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# CDPATH. +$as_unset CDPATH + + +if test "x$CONFIG_SHELL" = x; then + if (eval ":") 2>/dev/null; then + as_have_required=yes +else + as_have_required=no +fi + + if test $as_have_required = yes && (eval ": +(as_func_return () { + (exit \$1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = \"\$1\" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test \$exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=\$LINENO + as_lineno_2=\$LINENO + test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && + test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } +") 2> /dev/null; then + : +else + as_candidate_shells= + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + case $as_dir in + /*) + for as_base in sh bash ksh sh5; do + as_candidate_shells="$as_candidate_shells $as_dir/$as_base" + done;; + esac +done +IFS=$as_save_IFS + + + for as_shell in $as_candidate_shells $SHELL; do + # Try only shells that exist, to save several forks. + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { ("$as_shell") 2> /dev/null <<\_ASEOF +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + +: +_ASEOF +}; then + CONFIG_SHELL=$as_shell + as_have_required=yes + if { "$as_shell" 2> /dev/null <<\_ASEOF +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + +: +(as_func_return () { + (exit $1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = "$1" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test $exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } + +_ASEOF +}; then + break +fi + +fi + + done + + if test "x$CONFIG_SHELL" != x; then + for as_var in BASH_ENV ENV + do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var + done + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} +fi + + + if test $as_have_required = no; then + echo This script requires a shell more modern than all the + echo shells that I found on your system. Please install a + echo modern shell, or manually run the script under such a + echo shell if you do have one. + { (exit 1); exit 1; } +fi + + +fi + +fi + + + +(eval "as_func_return () { + (exit \$1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = \"\$1\" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test \$exitcode = 0") || { + echo No shell found that supports shell functions. + echo Please tell autoconf@gnu.org about your system, + echo including any error possibly output before this + echo message +} + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in +-n*) + case `echo 'x\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + *) ECHO_C='\c';; + esac;; +*) + ECHO_N='-n';; +esac + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir +fi +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + + +exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} + +# Identity of this package. +PACKAGE_NAME='cpplib' +PACKAGE_TARNAME='cpplib' +PACKAGE_VERSION=' ' +PACKAGE_STRING='cpplib ' +PACKAGE_BUGREPORT='nescc-bugs@lists.sourceforge.net' + +ac_unique_file="ucnid.h" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='SHELL +PATH_SEPARATOR +PACKAGE_NAME +PACKAGE_TARNAME +PACKAGE_VERSION +PACKAGE_STRING +PACKAGE_BUGREPORT +exec_prefix +prefix +program_transform_name +bindir +sbindir +libexecdir +datarootdir +datadir +sysconfdir +sharedstatedir +localstatedir +includedir +oldincludedir +docdir +infodir +htmldir +dvidir +pdfdir +psdir +libdir +localedir +mandir +DEFS +ECHO_C +ECHO_N +ECHO_T +LIBS +build_alias +host_alias +target_alias +build +build_cpu +build_vendor +build_os +host +host_cpu +host_vendor +host_os +target +target_cpu +target_vendor +target_os +SET_MAKE +INSTALL_PROGRAM +INSTALL_SCRIPT +INSTALL_DATA +CC +CFLAGS +LDFLAGS +CPPFLAGS +ac_ct_CC +EXEEXT +OBJEXT +RANLIB +ACLOCAL +AUTOCONF +AUTOHEADER +WARN_CFLAGS +WARN_PEDANTIC +WERROR +am__leading_dot +DEPDIR +CCDEPMODE +CPP +GREP +EGREP +LIBOBJS +ALLOCA +USE_NLS +LIBINTL +LIBINTL_DEP +INCINTL +XGETTEXT +GMSGFMT +POSUB +CATALOGS +DATADIRNAME +INSTOBJEXT +GENCAT +CATOBJEXT +LIBICONV +LTLIBICONV +PACKAGE +USED_CATALOGS +MAINT +LTLIBOBJS' +ac_subst_files='' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` + eval enable_$ac_feature=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` + eval enable_$ac_feature=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package | sed 's/[-.]/_/g'` + eval with_$ac_package=\$ac_optarg ;; + + -without-* | --without-*) + ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package | sed 's/[-.]/_/g'` + eval with_$ac_package=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) { echo "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + { echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } +fi + +# Be sure to have absolute directory names. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; } +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + { echo "$as_me: error: Working directory cannot be determined" >&2 + { (exit 1); exit 1; }; } +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + { echo "$as_me: error: pwd does not report name of working directory" >&2 + { (exit 1); exit 1; }; } + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$0" || +$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$0" : 'X\(//\)[^/]' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +echo X"$0" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 + { (exit 1); exit 1; }; } +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2 + { (exit 1); exit 1; }; } + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures cpplib to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/cpplib] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] + --target=TARGET configure for building compilers for TARGET [HOST] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of cpplib :";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-werror-always enable -Werror despite compiler version + --disable-rpath do not hardcode runtime library paths + --enable-maintainer-mode enable rules only needed by maintainers + --enable-checking enable expensive run-time checks + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-gnu-ld assume the C compiler uses GNU ld default=no + --with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib + --without-libiconv-prefix don't search for libiconv in includedir and libdir + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CPP C preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to . +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +cpplib configure +generated by GNU Autoconf 2.61 + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by cpplib $as_me , which was +generated by GNU Autoconf 2.61. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + echo "PATH: $as_dir" +done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; + 2) + ac_configure_args1="$ac_configure_args1 '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + ac_configure_args="$ac_configure_args '$ac_arg'" + ;; + esac + done +done +$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } +$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + cat <<\_ASBOX +## ---------------- ## +## Cache variables. ## +## ---------------- ## +_ASBOX + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 +echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + *) $as_unset $ac_var ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + cat <<\_ASBOX +## ----------------- ## +## Output variables. ## +## ----------------- ## +_ASBOX + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + cat <<\_ASBOX +## ------------------- ## +## File substitutions. ## +## ------------------- ## +_ASBOX + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + cat <<\_ASBOX +## ----------- ## +## confdefs.h. ## +## ----------- ## +_ASBOX + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + echo "$as_me: caught signal $ac_signal" + echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer explicitly selected file to automatically selected ones. +if test -n "$CONFIG_SITE"; then + set x "$CONFIG_SITE" +elif test "x$prefix" != xNONE; then + set x "$prefix/share/config.site" "$prefix/etc/config.site" +else + set x "$ac_default_prefix/share/config.site" \ + "$ac_default_prefix/etc/config.site" +fi +shift +for ac_site_file +do + if test -r "$ac_site_file"; then + { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 +echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special + # files actually), so we avoid doing that. + if test -f "$cache_file"; then + { echo "$as_me:$LINENO: loading cache $cache_file" >&5 +echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { echo "$as_me:$LINENO: creating cache $cache_file" >&5 +echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 +echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 +echo "$as_me: former value: $ac_old_val" >&2;} + { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 +echo "$as_me: current value: $ac_new_val" >&2;} + ac_cache_corrupted=: + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 +echo "$as_me: error: changes in the environment can compromise the build" >&2;} + { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } +fi + + + + + + + + + + + + + + + + + + + + + + + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +ac_aux_dir= +for ac_dir in ../config-aux "$srcdir"/../config-aux; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in ../config-aux \"$srcdir\"/../config-aux" >&5 +echo "$as_me: error: cannot find install-sh or install.sh in ../config-aux \"$srcdir\"/../config-aux" >&2;} + { (exit 1); exit 1; }; } +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + + +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + { { echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5 +echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;} + { (exit 1); exit 1; }; } + +{ echo "$as_me:$LINENO: checking build system type" >&5 +echo $ECHO_N "checking build system type... $ECHO_C" >&6; } +if test "${ac_cv_build+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 +echo "$as_me: error: cannot guess build type; you must specify one" >&2;} + { (exit 1); exit 1; }; } +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5 +echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_build" >&5 +echo "${ECHO_T}$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) { { echo "$as_me:$LINENO: error: invalid value of canonical build" >&5 +echo "$as_me: error: invalid value of canonical build" >&2;} + { (exit 1); exit 1; }; };; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ echo "$as_me:$LINENO: checking host system type" >&5 +echo $ECHO_N "checking host system type... $ECHO_C" >&6; } +if test "${ac_cv_host+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5 +echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;} + { (exit 1); exit 1; }; } +fi + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_host" >&5 +echo "${ECHO_T}$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) { { echo "$as_me:$LINENO: error: invalid value of canonical host" >&5 +echo "$as_me: error: invalid value of canonical host" >&2;} + { (exit 1); exit 1; }; };; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + +{ echo "$as_me:$LINENO: checking target system type" >&5 +echo $ECHO_N "checking target system type... $ECHO_C" >&6; } +if test "${ac_cv_target+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "x$target_alias" = x; then + ac_cv_target=$ac_cv_host +else + ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || + { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $target_alias failed" >&5 +echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $target_alias failed" >&2;} + { (exit 1); exit 1; }; } +fi + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_target" >&5 +echo "${ECHO_T}$ac_cv_target" >&6; } +case $ac_cv_target in +*-*-*) ;; +*) { { echo "$as_me:$LINENO: error: invalid value of canonical target" >&5 +echo "$as_me: error: invalid value of canonical target" >&2;} + { (exit 1); exit 1; }; };; +esac +target=$ac_cv_target +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_target +shift +target_cpu=$1 +target_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +target_os=$* +IFS=$ac_save_IFS +case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac + + +# The aliases save the names the user supplied, while $host etc. +# will get canonicalized. +test -n "$target_alias" && + test "$program_prefix$program_suffix$program_transform_name" = \ + NONENONEs,x,x, && + program_prefix=${target_alias}- + +# Checks for programs. +{ echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; } +set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } + SET_MAKE= +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +{ echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; } +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in + ./ | .// | /cC/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + done + done + ;; +esac +done +IFS=$as_save_IFS + + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ echo "$as_me:$LINENO: result: $INSTALL" >&5 +echo "${ECHO_T}$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + +# Provide some information about the compiler. +echo "$as_me:$LINENO: checking for C compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (ac_try="$ac_compiler --version >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler --version >&5") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler -v >&5") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler -V >&5") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 +echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; } +ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` +# +# List of possible output files, starting from the most likely. +# The algorithm is not robust to junk in `.', hence go to wildcards (a.*) +# only as a last resort. b.out is created by i960 compilers. +ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out' +# +# The IRIX 6 linker writes into existing files which may not be +# executable, retaining their permissions. Remove them first so a +# subsequent execution test works. +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { (ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi + +{ echo "$as_me:$LINENO: result: $ac_file" >&5 +echo "${ECHO_T}$ac_file" >&6; } +if test -z "$ac_file"; then + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: C compiler cannot create executables +See \`config.log' for more details." >&5 +echo "$as_me: error: C compiler cannot create executables +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; } +fi + +ac_exeext=$ac_cv_exeext + +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ echo "$as_me:$LINENO: checking whether the C compiler works" >&5 +echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; } +# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 +# If not cross compiling, check that we can run a simple program. +if test "$cross_compiling" != yes; then + if { ac_try='./$ac_file' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { echo "$as_me:$LINENO: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + fi + fi +fi +{ echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } + +rm -f a.out a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 +echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; } +{ echo "$as_me:$LINENO: result: $cross_compiling" >&5 +echo "${ECHO_T}$cross_compiling" >&6; } + +{ echo "$as_me:$LINENO: checking for suffix of executables" >&5 +echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; } +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest$ac_cv_exeext +{ echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 +echo "${ECHO_T}$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +{ echo "$as_me:$LINENO: checking for suffix of object files" >&5 +echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; } +if test "${ac_cv_objext+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 +echo "${ECHO_T}$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; } +if test "${ac_cv_c_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_compiler_gnu=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; } +GCC=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; } +if test "${ac_cv_prog_cc_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + CFLAGS="" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 +echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; } +if test "${ac_cv_prog_cc_c89+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_c89=$ac_arg +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { echo "$as_me:$LINENO: result: none needed" >&5 +echo "${ECHO_T}none needed" >&6; } ;; + xno) + { echo "$as_me:$LINENO: result: unsupported" >&5 +echo "${ECHO_T}unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;; +esac + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_RANLIB+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { echo "$as_me:$LINENO: result: $RANLIB" >&5 +echo "${ECHO_T}$RANLIB" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 +echo "${ECHO_T}$ac_ct_RANLIB" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + + +MISSING=`cd $ac_aux_dir && ${PWDCMD-pwd}`/missing +for ac_prog in aclocal +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_ACLOCAL+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ACLOCAL"; then + ac_cv_prog_ACLOCAL="$ACLOCAL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ACLOCAL="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ACLOCAL=$ac_cv_prog_ACLOCAL +if test -n "$ACLOCAL"; then + { echo "$as_me:$LINENO: result: $ACLOCAL" >&5 +echo "${ECHO_T}$ACLOCAL" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + + test -n "$ACLOCAL" && break +done +test -n "$ACLOCAL" || ACLOCAL="$MISSING aclocal" + +for ac_prog in autoconf +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_AUTOCONF+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$AUTOCONF"; then + ac_cv_prog_AUTOCONF="$AUTOCONF" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AUTOCONF="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +AUTOCONF=$ac_cv_prog_AUTOCONF +if test -n "$AUTOCONF"; then + { echo "$as_me:$LINENO: result: $AUTOCONF" >&5 +echo "${ECHO_T}$AUTOCONF" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + + test -n "$AUTOCONF" && break +done +test -n "$AUTOCONF" || AUTOCONF="$MISSING autoconf" + +for ac_prog in autoheader +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_AUTOHEADER+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$AUTOHEADER"; then + ac_cv_prog_AUTOHEADER="$AUTOHEADER" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AUTOHEADER="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +AUTOHEADER=$ac_cv_prog_AUTOHEADER +if test -n "$AUTOHEADER"; then + { echo "$as_me:$LINENO: result: $AUTOHEADER" >&5 +echo "${ECHO_T}$AUTOHEADER" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + + test -n "$AUTOHEADER" && break +done +test -n "$AUTOHEADER" || AUTOHEADER="$MISSING autoheader" + + +# Figure out what compiler warnings we can enable. +# See config/warnings.m4 for details. + + +WARN_CFLAGS= +save_CFLAGS="$CFLAGS" +for option in -W -Wall -Wwrite-strings -Wstrict-prototypes \ + -Wmissing-prototypes -Wold-style-definition \ + -Wmissing-format-attribute; do + as_acx_Woption=`echo "acx_cv_prog_cc_warning_$option" | $as_tr_sh` + + { echo "$as_me:$LINENO: checking whether $CC supports $option" >&5 +echo $ECHO_N "checking whether $CC supports $option... $ECHO_C" >&6; } +if { as_var=$as_acx_Woption; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + CFLAGS="$option" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + eval "$as_acx_Woption=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_acx_Woption=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +ac_res=`eval echo '${'$as_acx_Woption'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } + if test `eval echo '${'$as_acx_Woption'}'` = yes; then + WARN_CFLAGS="$WARN_CFLAGS${WARN_CFLAGS:+ }$option" +fi + + done +CFLAGS="$save_CFLAGS" + +WARN_PEDANTIC= +if test "$GCC" = yes; then + { echo "$as_me:$LINENO: checking whether $CC supports -pedantic -Wno-long-long" >&5 +echo $ECHO_N "checking whether $CC supports -pedantic -Wno-long-long... $ECHO_C" >&6; } +if test "${acx_cv_prog_cc_pedantic__Wno_long_long+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + save_CFLAGS="$CFLAGS" +CFLAGS="-pedantic -Wno-long-long" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + acx_cv_prog_cc_pedantic__Wno_long_long=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + acx_cv_prog_cc_pedantic__Wno_long_long=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +CFLAGS="$save_CFLAGS" +fi +{ echo "$as_me:$LINENO: result: $acx_cv_prog_cc_pedantic__Wno_long_long" >&5 +echo "${ECHO_T}$acx_cv_prog_cc_pedantic__Wno_long_long" >&6; } +if test $acx_cv_prog_cc_pedantic__Wno_long_long = yes; then + WARN_PEDANTIC="$WARN_PEDANTIC${WARN_PEDANTIC:+ }-pedantic -Wno-long-long" +fi + + +fi + + + +# Only enable with --enable-werror-always until existing warnings are +# corrected. +WERROR= +# Check whether --enable-werror-always was given. +if test "${enable_werror_always+set}" = set; then + enableval=$enable_werror_always; +else + enable_werror_always=no +fi + +if test $enable_werror_always = yes; then + WERROR="$WERROR${WERROR:+ }-Werror" +fi + + + + +# Dependency checking. +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depdir" + + +depcc="$CC" am_compiler_list= + +am_depcomp=$ac_aux_dir/depcomp +{ echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 +echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6; } +if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + for depmode in $am_compiler_list; do + if test $depmode = none; then break; fi + + echo "$as_me:$LINENO: trying $depmode" >&5 + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "include sub/conftest.Po" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + depcmd="depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c" + echo "| $depcmd" | sed -e 's/ */ /g' >&5 + if env $depcmd > conftest.err 2>&1 && + grep sub/conftst6.h sub/conftest.Po >>conftest.err 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po >>conftest.err 2>&1 && + ${MAKE-make} -s -f confmf >>conftest.err 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + echo "$as_me:$LINENO: success" >&5 + break + fi + fi + echo "$as_me:$LINENO: failure, diagnostics are:" >&5 + sed -e 's/^/| /' < conftest.err >&5 + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 +echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6; } +if test x${am_cv_CC_dependencies_compiler_type-none} = xnone +then { { echo "$as_me:$LINENO: error: no usable dependency style found" >&5 +echo "$as_me: error: no usable dependency style found" >&2;} + { (exit 1); exit 1; }; } +else CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + +fi + + +# Checks for header files. +{ echo "$as_me:$LINENO: checking whether time.h and sys/time.h may both be included" >&5 +echo $ECHO_N "checking whether time.h and sys/time.h may both be included... $ECHO_C" >&6; } +if test "${ac_cv_header_time+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include + +int +main () +{ +if ((struct tm *) 0) +return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_header_time=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_header_time=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_header_time" >&5 +echo "${ECHO_T}$ac_cv_header_time" >&6; } +if test $ac_cv_header_time = yes; then + +cat >>confdefs.h <<\_ACEOF +#define TIME_WITH_SYS_TIME 1 +_ACEOF + +fi + +{ echo "$as_me:$LINENO: checking whether string.h and strings.h may both be included" >&5 +echo $ECHO_N "checking whether string.h and strings.h may both be included... $ECHO_C" >&6; } +if test "${gcc_cv_header_string+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + gcc_cv_header_string=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + gcc_cv_header_string=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $gcc_cv_header_string" >&5 +echo "${ECHO_T}$gcc_cv_header_string" >&6; } +if test $gcc_cv_header_string = yes; then + +cat >>confdefs.h <<\_ACEOF +#define STRING_WITH_STRINGS 1 +_ACEOF + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 +echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test "${ac_cv_prog_CPP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi + +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi + +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ echo "$as_me:$LINENO: result: $CPP" >&5 +echo "${ECHO_T}$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi + +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi + +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&5 +echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 +echo $ECHO_N "checking for grep that handles long lines and -e... $ECHO_C" >&6; } +if test "${ac_cv_path_GREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Extract the first word of "grep ggrep" to use in msg output +if test -z "$GREP"; then +set dummy grep ggrep; ac_prog_name=$2 +if test "${ac_cv_path_GREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_path_GREP_found=false +# Loop through the user's path and test for each of PROGNAME-LIST +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue + # Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + ac_count=`expr $ac_count + 1` + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + + $ac_path_GREP_found && break 3 + done +done + +done +IFS=$as_save_IFS + + +fi + +GREP="$ac_cv_path_GREP" +if test -z "$GREP"; then + { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } +fi + +else + ac_cv_path_GREP=$GREP +fi + + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 +echo "${ECHO_T}$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ echo "$as_me:$LINENO: checking for egrep" >&5 +echo $ECHO_N "checking for egrep... $ECHO_C" >&6; } +if test "${ac_cv_path_EGREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + # Extract the first word of "egrep" to use in msg output +if test -z "$EGREP"; then +set dummy egrep; ac_prog_name=$2 +if test "${ac_cv_path_EGREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_path_EGREP_found=false +# Loop through the user's path and test for each of PROGNAME-LIST +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue + # Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + ac_count=`expr $ac_count + 1` + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + + $ac_path_EGREP_found && break 3 + done +done + +done +IFS=$as_save_IFS + + +fi + +EGREP="$ac_cv_path_EGREP" +if test -z "$EGREP"; then + { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } +fi + +else + ac_cv_path_EGREP=$EGREP +fi + + + fi +fi +{ echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 +echo "${ECHO_T}$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; } +if test "${ac_cv_header_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_header_stdc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_header_stdc=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then + : +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +fi +{ echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +echo "${ECHO_T}$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +cat >>confdefs.h <<\_ACEOF +#define STDC_HEADERS 1 +_ACEOF + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. + + + + + + + + + +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_Header=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + + + + + + + + + + +for ac_header in iconv.h locale.h fcntl.h limits.h stddef.h \ + stdlib.h strings.h string.h sys/file.h unistd.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +else + # Is the header compilable? +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } + +# Is the header present? +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( cat <<\_ASBOX +## ----------------------------------------------- ## +## Report this to nescc-bugs@lists.sourceforge.net ## +## ----------------------------------------------- ## +_ASBOX + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +# Checks for typedefs, structures, and compiler characteristics. +{ echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5 +echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6; } +if test "${ac_cv_c_const+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +/* FIXME: Include the comments suggested by Paul. */ +#ifndef __cplusplus + /* Ultrix mips cc rejects this. */ + typedef int charset[2]; + const charset cs; + /* SunOS 4.1.1 cc rejects this. */ + char const *const *pcpcc; + char **ppc; + /* NEC SVR4.0.2 mips cc rejects this. */ + struct point {int x, y;}; + static struct point const zero = {0,0}; + /* AIX XL C 1.02.0.0 rejects this. + It does not let you subtract one const X* pointer from another in + an arm of an if-expression whose if-part is not a constant + expression */ + const char *g = "string"; + pcpcc = &g + (g ? g-g : 0); + /* HPUX 7.0 cc rejects these. */ + ++pcpcc; + ppc = (char**) pcpcc; + pcpcc = (char const *const *) ppc; + { /* SCO 3.2v4 cc rejects this. */ + char *t; + char const *s = 0 ? (char *) 0 : (char const *) 0; + + *t++ = 0; + if (s) return 0; + } + { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ + int x[] = {25, 17}; + const int *foo = &x[0]; + ++foo; + } + { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ + typedef const int *iptr; + iptr p = 0; + ++p; + } + { /* AIX XL C 1.02.0.0 rejects this saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; }; + struct s *b; b->j = 5; + } + { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; + if (!foo) return 0; + } + return !cs[0] && !zero.x; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_c_const=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_c_const=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 +echo "${ECHO_T}$ac_cv_c_const" >&6; } +if test $ac_cv_c_const = no; then + +cat >>confdefs.h <<\_ACEOF +#define const +_ACEOF + +fi + +{ echo "$as_me:$LINENO: checking for inline" >&5 +echo $ECHO_N "checking for inline... $ECHO_C" >&6; } +if test "${ac_cv_c_inline+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifndef __cplusplus +typedef int foo_t; +static $ac_kw foo_t static_foo () {return 0; } +$ac_kw foo_t foo () {return 0; } +#endif + +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_c_inline=$ac_kw +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_inline" != no && break +done + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5 +echo "${ECHO_T}$ac_cv_c_inline" >&6; } + + +case $ac_cv_c_inline in + inline | yes) ;; + *) + case $ac_cv_c_inline in + no) ac_val=;; + *) ac_val=$ac_cv_c_inline;; + esac + cat >>confdefs.h <<_ACEOF +#ifndef __cplusplus +#define inline $ac_val +#endif +_ACEOF + ;; +esac + +{ echo "$as_me:$LINENO: checking for obstacks" >&5 +echo $ECHO_N "checking for obstacks... $ECHO_C" >&6; } +if test "${ac_cv_func_obstack+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + #include "obstack.h" +int +main () +{ +struct obstack mem; + #define obstack_chunk_alloc malloc + #define obstack_chunk_free free + obstack_init (&mem); + obstack_free (&mem, 0); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + ac_cv_func_obstack=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_func_obstack=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_func_obstack" >&5 +echo "${ECHO_T}$ac_cv_func_obstack" >&6; } +if test $ac_cv_func_obstack = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_OBSTACK 1 +_ACEOF + +else + case " $LIBOBJS " in + *" obstack.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS obstack.$ac_objext" + ;; +esac + +fi + +{ echo "$as_me:$LINENO: checking for off_t" >&5 +echo $ECHO_N "checking for off_t... $ECHO_C" >&6; } +if test "${ac_cv_type_off_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +typedef off_t ac__type_new_; +int +main () +{ +if ((ac__type_new_ *) 0) + return 0; +if (sizeof (ac__type_new_)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_type_off_t=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_type_off_t=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_type_off_t" >&5 +echo "${ECHO_T}$ac_cv_type_off_t" >&6; } +if test $ac_cv_type_off_t = yes; then + : +else + +cat >>confdefs.h <<_ACEOF +#define off_t long int +_ACEOF + +fi + +{ echo "$as_me:$LINENO: checking for size_t" >&5 +echo $ECHO_N "checking for size_t... $ECHO_C" >&6; } +if test "${ac_cv_type_size_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +typedef size_t ac__type_new_; +int +main () +{ +if ((ac__type_new_ *) 0) + return 0; +if (sizeof (ac__type_new_)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_type_size_t=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_type_size_t=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5 +echo "${ECHO_T}$ac_cv_type_size_t" >&6; } +if test $ac_cv_type_size_t = yes; then + : +else + +cat >>confdefs.h <<_ACEOF +#define size_t unsigned int +_ACEOF + +fi + +{ echo "$as_me:$LINENO: checking for ssize_t" >&5 +echo $ECHO_N "checking for ssize_t... $ECHO_C" >&6; } +if test "${ac_cv_type_ssize_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +typedef ssize_t ac__type_new_; +int +main () +{ +if ((ac__type_new_ *) 0) + return 0; +if (sizeof (ac__type_new_)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_type_ssize_t=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_type_ssize_t=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_type_ssize_t" >&5 +echo "${ECHO_T}$ac_cv_type_ssize_t" >&6; } +if test $ac_cv_type_ssize_t = yes; then + : +else + +cat >>confdefs.h <<_ACEOF +#define ssize_t int +_ACEOF + +fi + +{ echo "$as_me:$LINENO: checking whether struct tm is in sys/time.h or time.h" >&5 +echo $ECHO_N "checking whether struct tm is in sys/time.h or time.h... $ECHO_C" >&6; } +if test "${ac_cv_struct_tm+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include + +int +main () +{ +struct tm tm; + int *p = &tm.tm_sec; + return !p; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_struct_tm=time.h +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_struct_tm=sys/time.h +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_struct_tm" >&5 +echo "${ECHO_T}$ac_cv_struct_tm" >&6; } +if test $ac_cv_struct_tm = sys/time.h; then + +cat >>confdefs.h <<\_ACEOF +#define TM_IN_SYS_TIME 1 +_ACEOF + +fi + +{ echo "$as_me:$LINENO: checking for int" >&5 +echo $ECHO_N "checking for int... $ECHO_C" >&6; } +if test "${ac_cv_type_int+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +typedef int ac__type_new_; +int +main () +{ +if ((ac__type_new_ *) 0) + return 0; +if (sizeof (ac__type_new_)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_type_int=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_type_int=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_type_int" >&5 +echo "${ECHO_T}$ac_cv_type_int" >&6; } + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ echo "$as_me:$LINENO: checking size of int" >&5 +echo $ECHO_N "checking size of int... $ECHO_C" >&6; } +if test "${ac_cv_sizeof_int+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + typedef int ac__type_sizeof_; +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=0 ac_mid=0 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + typedef int ac__type_sizeof_; +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid; break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr $ac_mid + 1` + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + typedef int ac__type_sizeof_; +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=-1 ac_mid=-1 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + typedef int ac__type_sizeof_; +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=$ac_mid; break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_hi=`expr '(' $ac_mid ')' - 1` + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo= ac_hi= +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +# Binary search between lo and hi bounds. +while test "x$ac_lo" != "x$ac_hi"; do + ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + typedef int ac__type_sizeof_; +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr '(' $ac_mid ')' + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in +?*) ac_cv_sizeof_int=$ac_lo;; +'') if test "$ac_cv_type_int" = yes; then + { { echo "$as_me:$LINENO: error: cannot compute sizeof (int) +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute sizeof (int) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; } + else + ac_cv_sizeof_int=0 + fi ;; +esac +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + typedef int ac__type_sizeof_; +static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); } +static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); } +#include +#include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (((long int) (sizeof (ac__type_sizeof_))) < 0) + { + long int i = longval (); + if (i != ((long int) (sizeof (ac__type_sizeof_)))) + return 1; + fprintf (f, "%ld\n", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ((long int) (sizeof (ac__type_sizeof_)))) + return 1; + fprintf (f, "%lu\n", i); + } + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_sizeof_int=`cat conftest.val` +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +if test "$ac_cv_type_int" = yes; then + { { echo "$as_me:$LINENO: error: cannot compute sizeof (int) +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute sizeof (int) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; } + else + ac_cv_sizeof_int=0 + fi +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +rm -f conftest.val +fi +{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_int" >&5 +echo "${ECHO_T}$ac_cv_sizeof_int" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_INT $ac_cv_sizeof_int +_ACEOF + + +{ echo "$as_me:$LINENO: checking for long" >&5 +echo $ECHO_N "checking for long... $ECHO_C" >&6; } +if test "${ac_cv_type_long+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +typedef long ac__type_new_; +int +main () +{ +if ((ac__type_new_ *) 0) + return 0; +if (sizeof (ac__type_new_)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_type_long=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_type_long=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_type_long" >&5 +echo "${ECHO_T}$ac_cv_type_long" >&6; } + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ echo "$as_me:$LINENO: checking size of long" >&5 +echo $ECHO_N "checking size of long... $ECHO_C" >&6; } +if test "${ac_cv_sizeof_long+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + typedef long ac__type_sizeof_; +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=0 ac_mid=0 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + typedef long ac__type_sizeof_; +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid; break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr $ac_mid + 1` + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + typedef long ac__type_sizeof_; +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=-1 ac_mid=-1 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + typedef long ac__type_sizeof_; +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=$ac_mid; break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_hi=`expr '(' $ac_mid ')' - 1` + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo= ac_hi= +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +# Binary search between lo and hi bounds. +while test "x$ac_lo" != "x$ac_hi"; do + ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + typedef long ac__type_sizeof_; +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr '(' $ac_mid ')' + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in +?*) ac_cv_sizeof_long=$ac_lo;; +'') if test "$ac_cv_type_long" = yes; then + { { echo "$as_me:$LINENO: error: cannot compute sizeof (long) +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute sizeof (long) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; } + else + ac_cv_sizeof_long=0 + fi ;; +esac +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + typedef long ac__type_sizeof_; +static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); } +static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); } +#include +#include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (((long int) (sizeof (ac__type_sizeof_))) < 0) + { + long int i = longval (); + if (i != ((long int) (sizeof (ac__type_sizeof_)))) + return 1; + fprintf (f, "%ld\n", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ((long int) (sizeof (ac__type_sizeof_)))) + return 1; + fprintf (f, "%lu\n", i); + } + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_sizeof_long=`cat conftest.val` +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +if test "$ac_cv_type_long" = yes; then + { { echo "$as_me:$LINENO: error: cannot compute sizeof (long) +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute sizeof (long) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; } + else + ac_cv_sizeof_long=0 + fi +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +rm -f conftest.val +fi +{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_long" >&5 +echo "${ECHO_T}$ac_cv_sizeof_long" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_LONG $ac_cv_sizeof_long +_ACEOF + + + + + + + + + + + + + + + + + + + +for ac_func in clearerr_unlocked feof_unlocked ferror_unlocked fflush_unlocked fgetc_unlocked fgets_unlocked fileno_unlocked fprintf_unlocked fputc_unlocked fputs_unlocked fread_unlocked fwrite_unlocked getchar_unlocked getc_unlocked putchar_unlocked putc_unlocked +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +{ echo "$as_me:$LINENO: checking whether abort is declared" >&5 +echo $ECHO_N "checking whether abort is declared... $ECHO_C" >&6; } +if test "${ac_cv_have_decl_abort+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef abort + (void) abort; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_abort=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_abort=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_abort" >&5 +echo "${ECHO_T}$ac_cv_have_decl_abort" >&6; } +if test $ac_cv_have_decl_abort = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_ABORT 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_ABORT 0 +_ACEOF + + +fi +{ echo "$as_me:$LINENO: checking whether asprintf is declared" >&5 +echo $ECHO_N "checking whether asprintf is declared... $ECHO_C" >&6; } +if test "${ac_cv_have_decl_asprintf+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef asprintf + (void) asprintf; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_asprintf=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_asprintf=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_asprintf" >&5 +echo "${ECHO_T}$ac_cv_have_decl_asprintf" >&6; } +if test $ac_cv_have_decl_asprintf = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_ASPRINTF 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_ASPRINTF 0 +_ACEOF + + +fi +{ echo "$as_me:$LINENO: checking whether basename is declared" >&5 +echo $ECHO_N "checking whether basename is declared... $ECHO_C" >&6; } +if test "${ac_cv_have_decl_basename+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef basename + (void) basename; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_basename=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_basename=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_basename" >&5 +echo "${ECHO_T}$ac_cv_have_decl_basename" >&6; } +if test $ac_cv_have_decl_basename = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_BASENAME 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_BASENAME 0 +_ACEOF + + +fi +{ echo "$as_me:$LINENO: checking whether errno is declared" >&5 +echo $ECHO_N "checking whether errno is declared... $ECHO_C" >&6; } +if test "${ac_cv_have_decl_errno+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef errno + (void) errno; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_errno=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_errno=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_errno" >&5 +echo "${ECHO_T}$ac_cv_have_decl_errno" >&6; } +if test $ac_cv_have_decl_errno = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_ERRNO 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_ERRNO 0 +_ACEOF + + +fi +{ echo "$as_me:$LINENO: checking whether getopt is declared" >&5 +echo $ECHO_N "checking whether getopt is declared... $ECHO_C" >&6; } +if test "${ac_cv_have_decl_getopt+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef getopt + (void) getopt; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_getopt=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_getopt=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_getopt" >&5 +echo "${ECHO_T}$ac_cv_have_decl_getopt" >&6; } +if test $ac_cv_have_decl_getopt = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_GETOPT 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_GETOPT 0 +_ACEOF + + +fi +{ echo "$as_me:$LINENO: checking whether clearerr_unlocked is declared" >&5 +echo $ECHO_N "checking whether clearerr_unlocked is declared... $ECHO_C" >&6; } +if test "${ac_cv_have_decl_clearerr_unlocked+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef clearerr_unlocked + (void) clearerr_unlocked; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_clearerr_unlocked=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_clearerr_unlocked=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_clearerr_unlocked" >&5 +echo "${ECHO_T}$ac_cv_have_decl_clearerr_unlocked" >&6; } +if test $ac_cv_have_decl_clearerr_unlocked = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_CLEARERR_UNLOCKED 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_CLEARERR_UNLOCKED 0 +_ACEOF + + +fi +{ echo "$as_me:$LINENO: checking whether feof_unlocked is declared" >&5 +echo $ECHO_N "checking whether feof_unlocked is declared... $ECHO_C" >&6; } +if test "${ac_cv_have_decl_feof_unlocked+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef feof_unlocked + (void) feof_unlocked; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_feof_unlocked=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_feof_unlocked=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_feof_unlocked" >&5 +echo "${ECHO_T}$ac_cv_have_decl_feof_unlocked" >&6; } +if test $ac_cv_have_decl_feof_unlocked = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FEOF_UNLOCKED 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FEOF_UNLOCKED 0 +_ACEOF + + +fi +{ echo "$as_me:$LINENO: checking whether ferror_unlocked is declared" >&5 +echo $ECHO_N "checking whether ferror_unlocked is declared... $ECHO_C" >&6; } +if test "${ac_cv_have_decl_ferror_unlocked+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef ferror_unlocked + (void) ferror_unlocked; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_ferror_unlocked=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_ferror_unlocked=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_ferror_unlocked" >&5 +echo "${ECHO_T}$ac_cv_have_decl_ferror_unlocked" >&6; } +if test $ac_cv_have_decl_ferror_unlocked = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FERROR_UNLOCKED 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FERROR_UNLOCKED 0 +_ACEOF + + +fi +{ echo "$as_me:$LINENO: checking whether fflush_unlocked is declared" >&5 +echo $ECHO_N "checking whether fflush_unlocked is declared... $ECHO_C" >&6; } +if test "${ac_cv_have_decl_fflush_unlocked+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef fflush_unlocked + (void) fflush_unlocked; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_fflush_unlocked=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_fflush_unlocked=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_fflush_unlocked" >&5 +echo "${ECHO_T}$ac_cv_have_decl_fflush_unlocked" >&6; } +if test $ac_cv_have_decl_fflush_unlocked = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FFLUSH_UNLOCKED 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FFLUSH_UNLOCKED 0 +_ACEOF + + +fi +{ echo "$as_me:$LINENO: checking whether fgetc_unlocked is declared" >&5 +echo $ECHO_N "checking whether fgetc_unlocked is declared... $ECHO_C" >&6; } +if test "${ac_cv_have_decl_fgetc_unlocked+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef fgetc_unlocked + (void) fgetc_unlocked; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_fgetc_unlocked=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_fgetc_unlocked=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_fgetc_unlocked" >&5 +echo "${ECHO_T}$ac_cv_have_decl_fgetc_unlocked" >&6; } +if test $ac_cv_have_decl_fgetc_unlocked = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FGETC_UNLOCKED 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FGETC_UNLOCKED 0 +_ACEOF + + +fi +{ echo "$as_me:$LINENO: checking whether fgets_unlocked is declared" >&5 +echo $ECHO_N "checking whether fgets_unlocked is declared... $ECHO_C" >&6; } +if test "${ac_cv_have_decl_fgets_unlocked+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef fgets_unlocked + (void) fgets_unlocked; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_fgets_unlocked=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_fgets_unlocked=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_fgets_unlocked" >&5 +echo "${ECHO_T}$ac_cv_have_decl_fgets_unlocked" >&6; } +if test $ac_cv_have_decl_fgets_unlocked = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FGETS_UNLOCKED 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FGETS_UNLOCKED 0 +_ACEOF + + +fi +{ echo "$as_me:$LINENO: checking whether fileno_unlocked is declared" >&5 +echo $ECHO_N "checking whether fileno_unlocked is declared... $ECHO_C" >&6; } +if test "${ac_cv_have_decl_fileno_unlocked+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef fileno_unlocked + (void) fileno_unlocked; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_fileno_unlocked=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_fileno_unlocked=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_fileno_unlocked" >&5 +echo "${ECHO_T}$ac_cv_have_decl_fileno_unlocked" >&6; } +if test $ac_cv_have_decl_fileno_unlocked = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FILENO_UNLOCKED 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FILENO_UNLOCKED 0 +_ACEOF + + +fi +{ echo "$as_me:$LINENO: checking whether fprintf_unlocked is declared" >&5 +echo $ECHO_N "checking whether fprintf_unlocked is declared... $ECHO_C" >&6; } +if test "${ac_cv_have_decl_fprintf_unlocked+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef fprintf_unlocked + (void) fprintf_unlocked; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_fprintf_unlocked=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_fprintf_unlocked=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_fprintf_unlocked" >&5 +echo "${ECHO_T}$ac_cv_have_decl_fprintf_unlocked" >&6; } +if test $ac_cv_have_decl_fprintf_unlocked = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FPRINTF_UNLOCKED 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FPRINTF_UNLOCKED 0 +_ACEOF + + +fi +{ echo "$as_me:$LINENO: checking whether fputc_unlocked is declared" >&5 +echo $ECHO_N "checking whether fputc_unlocked is declared... $ECHO_C" >&6; } +if test "${ac_cv_have_decl_fputc_unlocked+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef fputc_unlocked + (void) fputc_unlocked; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_fputc_unlocked=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_fputc_unlocked=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_fputc_unlocked" >&5 +echo "${ECHO_T}$ac_cv_have_decl_fputc_unlocked" >&6; } +if test $ac_cv_have_decl_fputc_unlocked = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FPUTC_UNLOCKED 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FPUTC_UNLOCKED 0 +_ACEOF + + +fi +{ echo "$as_me:$LINENO: checking whether fputs_unlocked is declared" >&5 +echo $ECHO_N "checking whether fputs_unlocked is declared... $ECHO_C" >&6; } +if test "${ac_cv_have_decl_fputs_unlocked+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef fputs_unlocked + (void) fputs_unlocked; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_fputs_unlocked=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_fputs_unlocked=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_fputs_unlocked" >&5 +echo "${ECHO_T}$ac_cv_have_decl_fputs_unlocked" >&6; } +if test $ac_cv_have_decl_fputs_unlocked = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FPUTS_UNLOCKED 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FPUTS_UNLOCKED 0 +_ACEOF + + +fi +{ echo "$as_me:$LINENO: checking whether fread_unlocked is declared" >&5 +echo $ECHO_N "checking whether fread_unlocked is declared... $ECHO_C" >&6; } +if test "${ac_cv_have_decl_fread_unlocked+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef fread_unlocked + (void) fread_unlocked; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_fread_unlocked=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_fread_unlocked=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_fread_unlocked" >&5 +echo "${ECHO_T}$ac_cv_have_decl_fread_unlocked" >&6; } +if test $ac_cv_have_decl_fread_unlocked = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FREAD_UNLOCKED 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FREAD_UNLOCKED 0 +_ACEOF + + +fi +{ echo "$as_me:$LINENO: checking whether fwrite_unlocked is declared" >&5 +echo $ECHO_N "checking whether fwrite_unlocked is declared... $ECHO_C" >&6; } +if test "${ac_cv_have_decl_fwrite_unlocked+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef fwrite_unlocked + (void) fwrite_unlocked; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_fwrite_unlocked=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_fwrite_unlocked=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_fwrite_unlocked" >&5 +echo "${ECHO_T}$ac_cv_have_decl_fwrite_unlocked" >&6; } +if test $ac_cv_have_decl_fwrite_unlocked = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FWRITE_UNLOCKED 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FWRITE_UNLOCKED 0 +_ACEOF + + +fi +{ echo "$as_me:$LINENO: checking whether getchar_unlocked is declared" >&5 +echo $ECHO_N "checking whether getchar_unlocked is declared... $ECHO_C" >&6; } +if test "${ac_cv_have_decl_getchar_unlocked+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef getchar_unlocked + (void) getchar_unlocked; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_getchar_unlocked=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_getchar_unlocked=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_getchar_unlocked" >&5 +echo "${ECHO_T}$ac_cv_have_decl_getchar_unlocked" >&6; } +if test $ac_cv_have_decl_getchar_unlocked = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_GETCHAR_UNLOCKED 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_GETCHAR_UNLOCKED 0 +_ACEOF + + +fi +{ echo "$as_me:$LINENO: checking whether getc_unlocked is declared" >&5 +echo $ECHO_N "checking whether getc_unlocked is declared... $ECHO_C" >&6; } +if test "${ac_cv_have_decl_getc_unlocked+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef getc_unlocked + (void) getc_unlocked; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_getc_unlocked=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_getc_unlocked=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_getc_unlocked" >&5 +echo "${ECHO_T}$ac_cv_have_decl_getc_unlocked" >&6; } +if test $ac_cv_have_decl_getc_unlocked = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_GETC_UNLOCKED 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_GETC_UNLOCKED 0 +_ACEOF + + +fi +{ echo "$as_me:$LINENO: checking whether putchar_unlocked is declared" >&5 +echo $ECHO_N "checking whether putchar_unlocked is declared... $ECHO_C" >&6; } +if test "${ac_cv_have_decl_putchar_unlocked+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef putchar_unlocked + (void) putchar_unlocked; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_putchar_unlocked=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_putchar_unlocked=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_putchar_unlocked" >&5 +echo "${ECHO_T}$ac_cv_have_decl_putchar_unlocked" >&6; } +if test $ac_cv_have_decl_putchar_unlocked = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_PUTCHAR_UNLOCKED 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_PUTCHAR_UNLOCKED 0 +_ACEOF + + +fi +{ echo "$as_me:$LINENO: checking whether putc_unlocked is declared" >&5 +echo $ECHO_N "checking whether putc_unlocked is declared... $ECHO_C" >&6; } +if test "${ac_cv_have_decl_putc_unlocked+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef putc_unlocked + (void) putc_unlocked; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_putc_unlocked=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_putc_unlocked=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_putc_unlocked" >&5 +echo "${ECHO_T}$ac_cv_have_decl_putc_unlocked" >&6; } +if test $ac_cv_have_decl_putc_unlocked = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_PUTC_UNLOCKED 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_PUTC_UNLOCKED 0 +_ACEOF + + +fi +{ echo "$as_me:$LINENO: checking whether vasprintf is declared" >&5 +echo $ECHO_N "checking whether vasprintf is declared... $ECHO_C" >&6; } +if test "${ac_cv_have_decl_vasprintf+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef vasprintf + (void) vasprintf; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_vasprintf=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_vasprintf=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_vasprintf" >&5 +echo "${ECHO_T}$ac_cv_have_decl_vasprintf" >&6; } +if test $ac_cv_have_decl_vasprintf = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_VASPRINTF 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_VASPRINTF 0 +_ACEOF + + +fi + + + +# Checks for library functions. +# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works +# for constant arguments. Useless! +{ echo "$as_me:$LINENO: checking for working alloca.h" >&5 +echo $ECHO_N "checking for working alloca.h... $ECHO_C" >&6; } +if test "${ac_cv_working_alloca_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +char *p = (char *) alloca (2 * sizeof (int)); + if (p) return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + ac_cv_working_alloca_h=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_working_alloca_h=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_working_alloca_h" >&5 +echo "${ECHO_T}$ac_cv_working_alloca_h" >&6; } +if test $ac_cv_working_alloca_h = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_ALLOCA_H 1 +_ACEOF + +fi + +{ echo "$as_me:$LINENO: checking for alloca" >&5 +echo $ECHO_N "checking for alloca... $ECHO_C" >&6; } +if test "${ac_cv_func_alloca_works+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __GNUC__ +# define alloca __builtin_alloca +#else +# ifdef _MSC_VER +# include +# define alloca _alloca +# else +# ifdef HAVE_ALLOCA_H +# include +# else +# ifdef _AIX + #pragma alloca +# else +# ifndef alloca /* predefined by HP cc +Olibcalls */ +char *alloca (); +# endif +# endif +# endif +# endif +#endif + +int +main () +{ +char *p = (char *) alloca (1); + if (p) return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + ac_cv_func_alloca_works=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_func_alloca_works=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_func_alloca_works" >&5 +echo "${ECHO_T}$ac_cv_func_alloca_works" >&6; } + +if test $ac_cv_func_alloca_works = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_ALLOCA 1 +_ACEOF + +else + # The SVR3 libPW and SVR4 libucb both contain incompatible functions +# that cause trouble. Some versions do not even contain alloca or +# contain a buggy version. If you still want to use their alloca, +# use ar to extract alloca.o from them instead of compiling alloca.c. + +ALLOCA=\${LIBOBJDIR}alloca.$ac_objext + +cat >>confdefs.h <<\_ACEOF +#define C_ALLOCA 1 +_ACEOF + + +{ echo "$as_me:$LINENO: checking whether \`alloca.c' needs Cray hooks" >&5 +echo $ECHO_N "checking whether \`alloca.c' needs Cray hooks... $ECHO_C" >&6; } +if test "${ac_cv_os_cray+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#if defined CRAY && ! defined CRAY2 +webecray +#else +wenotbecray +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "webecray" >/dev/null 2>&1; then + ac_cv_os_cray=yes +else + ac_cv_os_cray=no +fi +rm -f conftest* + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_os_cray" >&5 +echo "${ECHO_T}$ac_cv_os_cray" >&6; } +if test $ac_cv_os_cray = yes; then + for ac_func in _getb67 GETB67 getb67; do + as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_var'}'` = yes; then + +cat >>confdefs.h <<_ACEOF +#define CRAY_STACKSEG_END $ac_func +_ACEOF + + break +fi + + done +fi + +{ echo "$as_me:$LINENO: checking stack direction for C alloca" >&5 +echo $ECHO_N "checking stack direction for C alloca... $ECHO_C" >&6; } +if test "${ac_cv_c_stack_direction+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + ac_cv_c_stack_direction=0 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +find_stack_direction () +{ + static char *addr = 0; + auto char dummy; + if (addr == 0) + { + addr = &dummy; + return find_stack_direction (); + } + else + return (&dummy > addr) ? 1 : -1; +} + +int +main () +{ + return find_stack_direction () < 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_c_stack_direction=1 +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_c_stack_direction=-1 +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_c_stack_direction" >&5 +echo "${ECHO_T}$ac_cv_c_stack_direction" >&6; } + +cat >>confdefs.h <<_ACEOF +#define STACK_DIRECTION $ac_cv_c_stack_direction +_ACEOF + + +fi + +{ echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; } +if test "${ac_cv_header_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_header_stdc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_header_stdc=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then + : +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +fi +{ echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +echo "${ECHO_T}$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +cat >>confdefs.h <<\_ACEOF +#define STDC_HEADERS 1 +_ACEOF + +fi + + + { echo "$as_me:$LINENO: checking for nl_langinfo and CODESET" >&5 +echo $ECHO_N "checking for nl_langinfo and CODESET... $ECHO_C" >&6; } +if test "${am_cv_langinfo_codeset+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +char* cs = nl_langinfo(CODESET); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + am_cv_langinfo_codeset=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + am_cv_langinfo_codeset=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + +fi +{ echo "$as_me:$LINENO: result: $am_cv_langinfo_codeset" >&5 +echo "${ECHO_T}$am_cv_langinfo_codeset" >&6; } + if test $am_cv_langinfo_codeset = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_LANGINFO_CODESET 1 +_ACEOF + + fi + +# If we haven't got the data from the intl directory, +# assume NLS is disabled. +USE_NLS=no +LIBINTL= +LIBINTL_DEP= +INCINTL= +XGETTEXT= +GMSGFMT= +POSUB= + +if test -f ../intl/config.intl; then + . ../intl/config.intl +fi +{ echo "$as_me:$LINENO: checking whether NLS is requested" >&5 +echo $ECHO_N "checking whether NLS is requested... $ECHO_C" >&6; } +if test x"$USE_NLS" != xyes; then + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +else + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } + +cat >>confdefs.h <<\_ACEOF +#define ENABLE_NLS 1 +_ACEOF + + + { echo "$as_me:$LINENO: checking for catalogs to be installed" >&5 +echo $ECHO_N "checking for catalogs to be installed... $ECHO_C" >&6; } + # Look for .po and .gmo files in the source directory. + CATALOGS= + XLINGUAS= + for cat in $srcdir/po/*.gmo $srcdir/po/*.po; do + # If there aren't any .gmo files the shell will give us the + # literal string "../path/to/srcdir/po/*.gmo" which has to be + # weeded out. + case "$cat" in *\**) + continue;; + esac + # The quadruple backslash is collapsed to a double backslash + # by the backticks, then collapsed again by the double quotes, + # leaving us with one backslash in the sed expression (right + # before the dot that mustn't act as a wildcard). + cat=`echo $cat | sed -e "s!$srcdir/po/!!" -e "s!\\\\.po!.gmo!"` + lang=`echo $cat | sed -e "s!\\\\.gmo!!"` + # The user is allowed to set LINGUAS to a list of languages to + # install catalogs for. If it's empty that means "all of them." + if test "x$LINGUAS" = x; then + CATALOGS="$CATALOGS $cat" + XLINGUAS="$XLINGUAS $lang" + else + case "$LINGUAS" in *$lang*) + CATALOGS="$CATALOGS $cat" + XLINGUAS="$XLINGUAS $lang" + ;; + esac + fi + done + LINGUAS="$XLINGUAS" + { echo "$as_me:$LINENO: result: $LINGUAS" >&5 +echo "${ECHO_T}$LINGUAS" >&6; } + + + DATADIRNAME=share + + INSTOBJEXT=.mo + + GENCAT=gencat + + CATOBJEXT=.gmo + +fi + +{ echo "$as_me:$LINENO: checking for uchar" >&5 +echo $ECHO_N "checking for uchar... $ECHO_C" >&6; } +if test "${gcc_cv_type_uchar+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include + +int +main () +{ +if ((uchar *)0) return 0; + if (sizeof(uchar)) return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_type_uchar=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_type_uchar=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $gcc_cv_type_uchar" >&5 +echo "${ECHO_T}$gcc_cv_type_uchar" >&6; } +if test $ac_cv_type_uchar = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_UCHAR 1 +_ACEOF + +fi + + + if test "X$prefix" = "XNONE"; then + acl_final_prefix="$ac_default_prefix" + else + acl_final_prefix="$prefix" + fi + if test "X$exec_prefix" = "XNONE"; then + acl_final_exec_prefix='${prefix}' + else + acl_final_exec_prefix="$exec_prefix" + fi + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" + prefix="$acl_save_prefix" + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +# Prepare PATH_SEPARATOR. +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { echo "$as_me:$LINENO: checking for ld used by GCC" >&5 +echo $ECHO_N "checking for ld used by GCC... $ECHO_C" >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | [A-Za-z]:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { echo "$as_me:$LINENO: checking for GNU ld" >&5 +echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6; } +else + { echo "$as_me:$LINENO: checking for non-GNU ld" >&5 +echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6; } +fi +if test "${acl_cv_path_LD+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + acl_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + if "$acl_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then + test "$with_gnu_ld" != no && break + else + test "$with_gnu_ld" != yes && break + fi + fi + done + IFS="$ac_save_ifs" +else + acl_cv_path_LD="$LD" # Let the user override the test with a path. +fi +fi + +LD="$acl_cv_path_LD" +if test -n "$LD"; then + { echo "$as_me:$LINENO: result: $LD" >&5 +echo "${ECHO_T}$LD" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi +test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 +echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} + { (exit 1); exit 1; }; } +{ echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 +echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6; } +if test "${acl_cv_prog_gnu_ld+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # I'd rather use --version here, but apparently some GNU ld's only accept -v. +if $LD -v 2>&1 &5; then + acl_cv_prog_gnu_ld=yes +else + acl_cv_prog_gnu_ld=no +fi +fi +{ echo "$as_me:$LINENO: result: $acl_cv_prog_gnu_ld" >&5 +echo "${ECHO_T}$acl_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$acl_cv_prog_gnu_ld + + + + { echo "$as_me:$LINENO: checking for shared library run path origin" >&5 +echo $ECHO_N "checking for shared library run path origin... $ECHO_C" >&6; } +if test "${acl_cv_rpath+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ + ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh + . ./conftest.sh + rm -f ./conftest.sh + acl_cv_rpath=done + +fi +{ echo "$as_me:$LINENO: result: $acl_cv_rpath" >&5 +echo "${ECHO_T}$acl_cv_rpath" >&6; } + wl="$acl_cv_wl" + libext="$acl_cv_libext" + shlibext="$acl_cv_shlibext" + hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" + hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" + hardcode_direct="$acl_cv_hardcode_direct" + hardcode_minus_L="$acl_cv_hardcode_minus_L" + # Check whether --enable-rpath was given. +if test "${enable_rpath+set}" = set; then + enableval=$enable_rpath; : +else + enable_rpath=yes +fi + + + + + + + + + use_additional=yes + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + +# Check whether --with-libiconv-prefix was given. +if test "${with_libiconv_prefix+set}" = set; then + withval=$with_libiconv_prefix; + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + else + additional_includedir="$withval/include" + additional_libdir="$withval/lib" + fi + fi + +fi + + LIBICONV= + LTLIBICONV= + INCICONV= + rpathdirs= + ltrpathdirs= + names_already_handled= + names_next_round='iconv ' + while test -n "$names_next_round"; do + names_this_round="$names_next_round" + names_next_round= + for name in $names_this_round; do + already_handled= + for n in $names_already_handled; do + if test "$n" = "$name"; then + already_handled=yes + break + fi + done + if test -z "$already_handled"; then + names_already_handled="$names_already_handled $name" + uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` + eval value=\"\$HAVE_LIB$uppername\" + if test -n "$value"; then + if test "$value" = yes; then + eval value=\"\$LIB$uppername\" + test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value" + eval value=\"\$LTLIB$uppername\" + test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value" + else + : + fi + else + found_dir= + found_la= + found_so= + found_a= + if test $use_additional = yes; then + if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then + found_dir="$additional_libdir" + found_so="$additional_libdir/lib$name.$shlibext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + else + if test -f "$additional_libdir/lib$name.$libext"; then + found_dir="$additional_libdir" + found_a="$additional_libdir/lib$name.$libext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + fi + fi + fi + if test "X$found_dir" = "X"; then + for x in $LDFLAGS $LTLIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + case "$x" in + -L*) + dir=`echo "X$x" | sed -e 's/^X-L//'` + if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then + found_dir="$dir" + found_so="$dir/lib$name.$shlibext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + else + if test -f "$dir/lib$name.$libext"; then + found_dir="$dir" + found_a="$dir/lib$name.$libext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + fi + fi + ;; + esac + if test "X$found_dir" != "X"; then + break + fi + done + fi + if test "X$found_dir" != "X"; then + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name" + if test "X$found_so" != "X"; then + if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + else + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $found_dir" + fi + if test "$hardcode_direct" = yes; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + else + if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $found_dir" + fi + else + haveit= + for x in $LDFLAGS $LIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir" + fi + if test "$hardcode_minus_L" != no; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + else + LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" + fi + fi + fi + fi + else + if test "X$found_a" != "X"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a" + else + LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name" + fi + fi + additional_includedir= + case "$found_dir" in + */lib | */lib/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'` + additional_includedir="$basedir/include" + ;; + esac + if test "X$additional_includedir" != "X"; then + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + for x in $CPPFLAGS $INCICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir" + fi + fi + fi + fi + fi + if test -n "$found_la"; then + save_libdir="$libdir" + case "$found_la" in + */* | *\\*) . "$found_la" ;; + *) . "./$found_la" ;; + esac + libdir="$save_libdir" + for dep in $dependency_libs; do + case "$dep" in + -L*) + additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` + if test "X$additional_libdir" != "X/usr/lib"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/lib"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + haveit= + for x in $LDFLAGS $LIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir" + fi + fi + haveit= + for x in $LDFLAGS $LTLIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir" + fi + fi + fi + fi + ;; + -R*) + dir=`echo "X$dep" | sed -e 's/^X-R//'` + if test "$enable_rpath" != no; then + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $dir" + fi + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $dir" + fi + fi + ;; + -l*) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` + ;; + *.la) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` + ;; + *) + LIBICONV="${LIBICONV}${LIBICONV:+ }$dep" + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep" + ;; + esac + done + fi + else + LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name" + fi + fi + fi + done + done + if test "X$rpathdirs" != "X"; then + if test -n "$hardcode_libdir_separator"; then + alldirs= + for found_dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" + done + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" + else + for found_dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$found_dir" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" + done + fi + fi + if test "X$ltrpathdirs" != "X"; then + for found_dir in $ltrpathdirs; do + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir" + done + fi + + + + + + + + am_save_CPPFLAGS="$CPPFLAGS" + + for element in $INCICONV; do + haveit= + for x in $CPPFLAGS; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X$element"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" + fi + done + + + { echo "$as_me:$LINENO: checking for iconv" >&5 +echo $ECHO_N "checking for iconv... $ECHO_C" >&6; } +if test "${am_cv_func_iconv+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + am_cv_func_iconv="no, consider installing GNU libiconv" + am_cv_lib_iconv=no + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +int +main () +{ +iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + am_cv_func_iconv=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + if test "$am_cv_func_iconv" != yes; then + am_save_LIBS="$LIBS" + LIBS="$LIBS $LIBICONV" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +int +main () +{ +iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + am_cv_lib_iconv=yes + am_cv_func_iconv=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$am_save_LIBS" + fi + +fi +{ echo "$as_me:$LINENO: result: $am_cv_func_iconv" >&5 +echo "${ECHO_T}$am_cv_func_iconv" >&6; } + if test "$am_cv_func_iconv" = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_ICONV 1 +_ACEOF + + fi + if test "$am_cv_lib_iconv" = yes; then + { echo "$as_me:$LINENO: checking how to link with libiconv" >&5 +echo $ECHO_N "checking how to link with libiconv... $ECHO_C" >&6; } + { echo "$as_me:$LINENO: result: $LIBICONV" >&5 +echo "${ECHO_T}$LIBICONV" >&6; } + else + CPPFLAGS="$am_save_CPPFLAGS" + LIBICONV= + LTLIBICONV= + fi + + + + if test "$am_cv_func_iconv" = yes; then + { echo "$as_me:$LINENO: checking for iconv declaration" >&5 +echo $ECHO_N "checking for iconv declaration... $ECHO_C" >&6; } + if test "${am_cv_proto_iconv+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#include +extern +#ifdef __cplusplus +"C" +#endif +#if defined(__STDC__) || defined(__cplusplus) +size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); +#else +size_t iconv(); +#endif + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + am_cv_proto_iconv_arg1="" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + am_cv_proto_iconv_arg1="const" +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);" +fi + + am_cv_proto_iconv=`echo "$am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` + { echo "$as_me:$LINENO: result: ${ac_t:- + }$am_cv_proto_iconv" >&5 +echo "${ECHO_T}${ac_t:- + }$am_cv_proto_iconv" >&6; } + +cat >>confdefs.h <<_ACEOF +#define ICONV_CONST $am_cv_proto_iconv_arg1 +_ACEOF + + fi + + +# More defines and substitutions. +PACKAGE="$PACKAGE_TARNAME" + +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + + + +if test "x$enable_nls" != xno; then + USED_CATALOGS='$(CATALOGS)' +else + USED_CATALOGS= +fi + + +# Check whether --enable-maintainer-mode was given. +if test "${enable_maintainer_mode+set}" = set; then + enableval=$enable_maintainer_mode; +else + enable_maintainer_mode=no +fi + + +if test "x$enable_maintainer_mode" = xno; then + MAINT='#' +else + MAINT= +fi + + +# Check whether --enable-checking was given. +if test "${enable_checking+set}" = set; then + enableval=$enable_checking; +else + enable_checking=no +fi + + +if test $enable_checking != no ; then + +cat >>confdefs.h <<\_ACEOF +#define ENABLE_CHECKING 1 +_ACEOF + +fi + + +case $target in + alpha*-*-* | \ + arm*-*-*eabi* | \ + arm*-*-symbianelf* | \ + x86_64-*-* | \ + ia64-*-* | \ + hppa*64*-*-* | parisc*64*-*-* | \ + i[34567]86-*-darwin* | \ + i[34567]86-*-solaris2.1[0-9]* | \ + mips*-*-* | \ + mmix-*-* | \ + powerpc*-*-* | \ + rs6000*-*-* | \ + s390*-*-* | \ + sparc64*-*-* | ultrasparc-*-freebsd* | \ + sparcv9-*-solaris2* | \ + sparc-*-solaris2.[789] | sparc-*-solaris2.1[0-9]* | \ + spu-*-* | \ + sh[123456789l]*-*-*) + need_64bit_hwint=yes ;; + i[34567]86-*-linux*) + if test "x$enable_targets" = xall; then + need_64bit_hwint=yes + else + need_64bit_hwint=no + fi + ;; + *) + need_64bit_hwint=no ;; +esac + +case $need_64bit_hwint:$ac_cv_sizeof_long in + *:8 | no:*) host_wide_int=long ;; + *) host_wide_int='long long' ;; +esac + + + +cat >>confdefs.h <<_ACEOF +#define HOST_WIDE_INT long long +_ACEOF + + +# Output. + +ac_config_headers="$ac_config_headers config.h:config.in" + +ac_config_files="$ac_config_files Makefile" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 +echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + *) $as_unset $ac_var ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + test "x$cache_file" != "x/dev/null" && + { echo "$as_me:$LINENO: updating cache $cache_file" >&5 +echo "$as_me: updating cache $cache_file" >&6;} + cat confcache >$cache_file + else + { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 +echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + +: ${CONFIG_STATUS=./config.status} +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 +echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >$CONFIG_STATUS <<_ACEOF +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false +SHELL=\${CONFIG_SHELL-$SHELL} +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + + + +# PATH needs CR +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +as_nl=' +' +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + { (exit 1); exit 1; } +fi + +# Work around bugs in pre-3.0 UWIN ksh. +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + + +# Name of the executable. +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# CDPATH. +$as_unset CDPATH + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in +-n*) + case `echo 'x\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + *) ECHO_C='\c';; + esac;; +*) + ECHO_N='-n';; +esac + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir +fi +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 + +# Save the log message, to keep $[0] and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by cpplib $as_me , which was +generated by GNU Autoconf 2.61. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTIONS] [FILE]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF +ac_cs_version="\\ +cpplib config.status +configured by $0, generated by GNU Autoconf 2.61, + with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" + +Copyright (C) 2006 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +# If no file are specified by the user, then we need to provide default +# value. By we need to know if files were specified by the user. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + echo "$ac_cs_version"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + CONFIG_FILES="$CONFIG_FILES $ac_optarg" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + { echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) { echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$ac_config_targets $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF +if \$ac_cs_recheck; then + echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 + CONFIG_SHELL=$SHELL + export CONFIG_SHELL + exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF +# +# INIT-COMMANDS +# +ac_aux_dir=$ac_aux_dir DEPDIR=$DEPDIR + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "depdir") CONFIG_COMMANDS="$CONFIG_COMMANDS depdir" ;; + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h:config.in" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + + *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= + trap 'exit_status=$? + { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status +' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || +{ + echo "$me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} + +# +# Set up the sed scripts for CONFIG_FILES section. +# + +# No need to generate the scripts if there are no CONFIG_FILES. +# This happens for instance when ./config.status config.h +if test -n "$CONFIG_FILES"; then + +_ACEOF + + + +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + cat >conf$$subs.sed <<_ACEOF +SHELL!$SHELL$ac_delim +PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim +PACKAGE_NAME!$PACKAGE_NAME$ac_delim +PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim +PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim +PACKAGE_STRING!$PACKAGE_STRING$ac_delim +PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim +exec_prefix!$exec_prefix$ac_delim +prefix!$prefix$ac_delim +program_transform_name!$program_transform_name$ac_delim +bindir!$bindir$ac_delim +sbindir!$sbindir$ac_delim +libexecdir!$libexecdir$ac_delim +datarootdir!$datarootdir$ac_delim +datadir!$datadir$ac_delim +sysconfdir!$sysconfdir$ac_delim +sharedstatedir!$sharedstatedir$ac_delim +localstatedir!$localstatedir$ac_delim +includedir!$includedir$ac_delim +oldincludedir!$oldincludedir$ac_delim +docdir!$docdir$ac_delim +infodir!$infodir$ac_delim +htmldir!$htmldir$ac_delim +dvidir!$dvidir$ac_delim +pdfdir!$pdfdir$ac_delim +psdir!$psdir$ac_delim +libdir!$libdir$ac_delim +localedir!$localedir$ac_delim +mandir!$mandir$ac_delim +DEFS!$DEFS$ac_delim +ECHO_C!$ECHO_C$ac_delim +ECHO_N!$ECHO_N$ac_delim +ECHO_T!$ECHO_T$ac_delim +LIBS!$LIBS$ac_delim +build_alias!$build_alias$ac_delim +host_alias!$host_alias$ac_delim +target_alias!$target_alias$ac_delim +build!$build$ac_delim +build_cpu!$build_cpu$ac_delim +build_vendor!$build_vendor$ac_delim +build_os!$build_os$ac_delim +host!$host$ac_delim +host_cpu!$host_cpu$ac_delim +host_vendor!$host_vendor$ac_delim +host_os!$host_os$ac_delim +target!$target$ac_delim +target_cpu!$target_cpu$ac_delim +target_vendor!$target_vendor$ac_delim +target_os!$target_os$ac_delim +SET_MAKE!$SET_MAKE$ac_delim +INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim +INSTALL_SCRIPT!$INSTALL_SCRIPT$ac_delim +INSTALL_DATA!$INSTALL_DATA$ac_delim +CC!$CC$ac_delim +CFLAGS!$CFLAGS$ac_delim +LDFLAGS!$LDFLAGS$ac_delim +CPPFLAGS!$CPPFLAGS$ac_delim +ac_ct_CC!$ac_ct_CC$ac_delim +EXEEXT!$EXEEXT$ac_delim +OBJEXT!$OBJEXT$ac_delim +RANLIB!$RANLIB$ac_delim +ACLOCAL!$ACLOCAL$ac_delim +AUTOCONF!$AUTOCONF$ac_delim +AUTOHEADER!$AUTOHEADER$ac_delim +WARN_CFLAGS!$WARN_CFLAGS$ac_delim +WARN_PEDANTIC!$WARN_PEDANTIC$ac_delim +WERROR!$WERROR$ac_delim +am__leading_dot!$am__leading_dot$ac_delim +DEPDIR!$DEPDIR$ac_delim +CCDEPMODE!$CCDEPMODE$ac_delim +CPP!$CPP$ac_delim +GREP!$GREP$ac_delim +EGREP!$EGREP$ac_delim +LIBOBJS!$LIBOBJS$ac_delim +ALLOCA!$ALLOCA$ac_delim +USE_NLS!$USE_NLS$ac_delim +LIBINTL!$LIBINTL$ac_delim +LIBINTL_DEP!$LIBINTL_DEP$ac_delim +INCINTL!$INCINTL$ac_delim +XGETTEXT!$XGETTEXT$ac_delim +GMSGFMT!$GMSGFMT$ac_delim +POSUB!$POSUB$ac_delim +CATALOGS!$CATALOGS$ac_delim +DATADIRNAME!$DATADIRNAME$ac_delim +INSTOBJEXT!$INSTOBJEXT$ac_delim +GENCAT!$GENCAT$ac_delim +CATOBJEXT!$CATOBJEXT$ac_delim +LIBICONV!$LIBICONV$ac_delim +LTLIBICONV!$LTLIBICONV$ac_delim +PACKAGE!$PACKAGE$ac_delim +USED_CATALOGS!$USED_CATALOGS$ac_delim +MAINT!$MAINT$ac_delim +LTLIBOBJS!$LTLIBOBJS$ac_delim +_ACEOF + + if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 93; then + break + elif $ac_last_try; then + { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed` +if test -n "$ac_eof"; then + ac_eof=`echo "$ac_eof" | sort -nru | sed 1q` + ac_eof=`expr $ac_eof + 1` +fi + +cat >>$CONFIG_STATUS <<_ACEOF +cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b end +_ACEOF +sed ' +s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g +s/^/s,@/; s/!/@,|#_!!_#|/ +:n +t n +s/'"$ac_delim"'$/,g/; t +s/$/\\/; p +N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n +' >>$CONFIG_STATUS >$CONFIG_STATUS <<_ACEOF +:end +s/|#_!!_#|//g +CEOF$ac_eof +_ACEOF + + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/ +s/:*\${srcdir}:*/:/ +s/:*@srcdir@:*/:/ +s/^\([^=]*=[ ]*\):*/\1/ +s/:*$// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF +fi # test -n "$CONFIG_FILES" + + +for ac_tag in :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5 +echo "$as_me: error: Invalid tag $ac_tag." >&2;} + { (exit 1); exit 1; }; };; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 +echo "$as_me: error: cannot find input file: $ac_f" >&2;} + { (exit 1); exit 1; }; };; + esac + ac_file_inputs="$ac_file_inputs $ac_f" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input="Generated from "`IFS=: + echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure." + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + fi + + case $ac_tag in + *:-:* | *:-) cat >"$tmp/stdin";; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + { as_dir="$ac_dir" + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 +echo "$as_me: error: cannot create directory $as_dir" >&2;} + { (exit 1); exit 1; }; }; } + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= + +case `sed -n '/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p +' $ac_file_inputs` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF + sed "$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s&@configure_input@&$configure_input&;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +$ac_datarootdir_hack +" $ac_file_inputs | sed -f "$tmp/subs-1.sed" >$tmp/out + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && + { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&5 +echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&2;} + + rm -f "$tmp/stdin" + case $ac_file in + -) cat "$tmp/out"; rm -f "$tmp/out";; + *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;; + esac + ;; + :H) + # + # CONFIG_HEADER + # +_ACEOF + +# Transform confdefs.h into a sed script `conftest.defines', that +# substitutes the proper values into config.h.in to produce config.h. +rm -f conftest.defines conftest.tail +# First, append a space to every undef/define line, to ease matching. +echo 's/$/ /' >conftest.defines +# Then, protect against being on the right side of a sed subst, or in +# an unquoted here document, in config.status. If some macros were +# called several times there might be several #defines for the same +# symbol, which is useless. But do not sort them, since the last +# AC_DEFINE must be honored. +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +# These sed commands are passed to sed as "A NAME B PARAMS C VALUE D", where +# NAME is the cpp macro being defined, VALUE is the value it is being given. +# PARAMS is the parameter list in the macro definition--in most cases, it's +# just an empty string. +ac_dA='s,^\\([ #]*\\)[^ ]*\\([ ]*' +ac_dB='\\)[ (].*,\\1define\\2' +ac_dC=' ' +ac_dD=' ,' + +uniq confdefs.h | + sed -n ' + t rset + :rset + s/^[ ]*#[ ]*define[ ][ ]*// + t ok + d + :ok + s/[\\&,]/\\&/g + s/^\('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/ '"$ac_dA"'\1'"$ac_dB"'\2'"${ac_dC}"'\3'"$ac_dD"'/p + s/^\('"$ac_word_re"'\)[ ]*\(.*\)/'"$ac_dA"'\1'"$ac_dB$ac_dC"'\2'"$ac_dD"'/p + ' >>conftest.defines + +# Remove the space that was appended to ease matching. +# Then replace #undef with comments. This is necessary, for +# example, in the case of _POSIX_SOURCE, which is predefined and required +# on some systems where configure will not decide to define it. +# (The regexp can be short, since the line contains either #define or #undef.) +echo 's/ $// +s,^[ #]*u.*,/* & */,' >>conftest.defines + +# Break up conftest.defines: +ac_max_sed_lines=50 + +# First sed command is: sed -f defines.sed $ac_file_inputs >"$tmp/out1" +# Second one is: sed -f defines.sed "$tmp/out1" >"$tmp/out2" +# Third one will be: sed -f defines.sed "$tmp/out2" >"$tmp/out1" +# et cetera. +ac_in='$ac_file_inputs' +ac_out='"$tmp/out1"' +ac_nxt='"$tmp/out2"' + +while : +do + # Write a here document: + cat >>$CONFIG_STATUS <<_ACEOF + # First, check the format of the line: + cat >"\$tmp/defines.sed" <<\\CEOF +/^[ ]*#[ ]*undef[ ][ ]*$ac_word_re[ ]*\$/b def +/^[ ]*#[ ]*define[ ][ ]*$ac_word_re[( ]/b def +b +:def +_ACEOF + sed ${ac_max_sed_lines}q conftest.defines >>$CONFIG_STATUS + echo 'CEOF + sed -f "$tmp/defines.sed"' "$ac_in >$ac_out" >>$CONFIG_STATUS + ac_in=$ac_out; ac_out=$ac_nxt; ac_nxt=$ac_in + sed 1,${ac_max_sed_lines}d conftest.defines >conftest.tail + grep . conftest.tail >/dev/null || break + rm -f conftest.defines + mv conftest.tail conftest.defines +done +rm -f conftest.defines conftest.tail + +echo "ac_result=$ac_in" >>$CONFIG_STATUS +cat >>$CONFIG_STATUS <<\_ACEOF + if test x"$ac_file" != x-; then + echo "/* $configure_input */" >"$tmp/config.h" + cat "$ac_result" >>"$tmp/config.h" + if diff $ac_file "$tmp/config.h" >/dev/null 2>&1; then + { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 +echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f $ac_file + mv "$tmp/config.h" $ac_file + fi + else + echo "/* $configure_input */" + cat "$ac_result" + fi + rm -f "$tmp/out12" + ;; + + :C) { echo "$as_me:$LINENO: executing $ac_file commands" >&5 +echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depdir":C) $SHELL $ac_aux_dir/mkinstalldirs $DEPDIR ;; + "config.h":H) echo timestamp > stamp-h1 ;; + + esac +done # for ac_tag + + +{ (exit 0); exit 0; } +_ACEOF +chmod +x $CONFIG_STATUS +ac_clean_files=$ac_clean_files_save + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || { (exit 1); exit 1; } +fi + diff --git a/libcpp/configure.ac b/libcpp/configure.ac new file mode 100644 index 0000000..3c2071c --- /dev/null +++ b/libcpp/configure.ac @@ -0,0 +1,161 @@ +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. + +AC_PREREQ(2.59) +AC_INIT(cpplib, [ ], nescc-bugs@lists.sourceforge.net, cpplib) +AC_CONFIG_SRCDIR(ucnid.h) +AC_CONFIG_AUX_DIR(../config-aux) +AC_CONFIG_MACRO_DIR(../config-aux) +AC_CANONICAL_SYSTEM + +# Checks for programs. +AC_PROG_MAKE_SET +AC_PROG_INSTALL +AC_PROG_CC +AC_PROG_RANLIB + +MISSING=`cd $ac_aux_dir && ${PWDCMD-pwd}`/missing +AC_CHECK_PROGS([ACLOCAL], [aclocal], [$MISSING aclocal]) +AC_CHECK_PROGS([AUTOCONF], [autoconf], [$MISSING autoconf]) +AC_CHECK_PROGS([AUTOHEADER], [autoheader], [$MISSING autoheader]) + +# Figure out what compiler warnings we can enable. +# See config/warnings.m4 for details. + +ACX_PROG_CC_WARNING_OPTS([-W -Wall -Wwrite-strings -Wstrict-prototypes \ + -Wmissing-prototypes -Wold-style-definition \ + -Wmissing-format-attribute]) +ACX_PROG_CC_WARNING_ALMOST_PEDANTIC([-Wno-long-long]) + +# Only enable with --enable-werror-always until existing warnings are +# corrected. +ACX_PROG_CC_WARNINGS_ARE_ERRORS([manual]) + +# Dependency checking. +ZW_CREATE_DEPDIR +ZW_PROG_COMPILER_DEPENDENCIES([CC]) + +# Checks for header files. +AC_HEADER_TIME +ACX_HEADER_STRING +AC_CHECK_HEADERS(iconv.h locale.h fcntl.h limits.h stddef.h \ + stdlib.h strings.h string.h sys/file.h unistd.h) + +# Checks for typedefs, structures, and compiler characteristics. +AC_C_CONST +AC_C_INLINE +AC_FUNC_OBSTACK +AC_TYPE_OFF_T +AC_TYPE_SIZE_T +AC_CHECK_TYPE(ssize_t, int) +AC_STRUCT_TM +AC_CHECK_SIZEOF(int) +AC_CHECK_SIZEOF(long) +define(libcpp_UNLOCKED_FUNCS, clearerr_unlocked feof_unlocked dnl + ferror_unlocked fflush_unlocked fgetc_unlocked fgets_unlocked dnl + fileno_unlocked fprintf_unlocked fputc_unlocked fputs_unlocked dnl + fread_unlocked fwrite_unlocked getchar_unlocked getc_unlocked dnl + putchar_unlocked putc_unlocked) +AC_CHECK_FUNCS(libcpp_UNLOCKED_FUNCS) +AC_CHECK_DECLS(m4_split(m4_normalize(abort asprintf basename errno getopt \ + libcpp_UNLOCKED_FUNCS vasprintf))) + +# Checks for library functions. +AC_FUNC_ALLOCA +AC_HEADER_STDC +AM_LANGINFO_CODESET +ZW_GNU_GETTEXT_SISTER_DIR + +AC_CACHE_CHECK(for uchar, gcc_cv_type_uchar, +[AC_TRY_COMPILE([ +#include +], +[if ((uchar *)0) return 0; + if (sizeof(uchar)) return 0;], +ac_cv_type_uchar=yes, ac_cv_type_uchar=no)]) +if test $ac_cv_type_uchar = yes; then + AC_DEFINE(HAVE_UCHAR, 1, + [Define if defines \`uchar'.]) +fi + +AM_ICONV + +# More defines and substitutions. +PACKAGE="$PACKAGE_TARNAME" +AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Define to the name of this package.]) +AC_SUBST(PACKAGE) + +if test "x$enable_nls" != xno; then + USED_CATALOGS='$(CATALOGS)' +else + USED_CATALOGS= +fi +AC_SUBST(USED_CATALOGS) + +AC_ARG_ENABLE(maintainer-mode, +[ --enable-maintainer-mode enable rules only needed by maintainers],, +enable_maintainer_mode=no) + +if test "x$enable_maintainer_mode" = xno; then + MAINT='#' +else + MAINT= +fi +AC_SUBST(MAINT) + +AC_ARG_ENABLE(checking, +[ --enable-checking enable expensive run-time checks],, +enable_checking=no) + +if test $enable_checking != no ; then + AC_DEFINE(ENABLE_CHECKING, 1, +[Define if you want more run-time sanity checks.]) +fi + +m4_changequote(,) +case $target in + alpha*-*-* | \ + arm*-*-*eabi* | \ + arm*-*-symbianelf* | \ + x86_64-*-* | \ + ia64-*-* | \ + hppa*64*-*-* | parisc*64*-*-* | \ + i[34567]86-*-darwin* | \ + i[34567]86-*-solaris2.1[0-9]* | \ + mips*-*-* | \ + mmix-*-* | \ + powerpc*-*-* | \ + rs6000*-*-* | \ + s390*-*-* | \ + sparc64*-*-* | ultrasparc-*-freebsd* | \ + sparcv9-*-solaris2* | \ + sparc-*-solaris2.[789] | sparc-*-solaris2.1[0-9]* | \ + spu-*-* | \ + sh[123456789l]*-*-*) + need_64bit_hwint=yes ;; + i[34567]86-*-linux*) + if test "x$enable_targets" = xall; then + need_64bit_hwint=yes + else + need_64bit_hwint=no + fi + ;; + *) + need_64bit_hwint=no ;; +esac + +case $need_64bit_hwint:$ac_cv_sizeof_long in + *:8 | no:*) host_wide_int=long ;; + *) host_wide_int='long long' ;; +esac +m4_changequote([,]) + +AC_DEFINE_UNQUOTED(HOST_WIDE_INT, long long, +[Define to the widest efficient host integer type at least + as wide as the target's size_t type.]) + +# Output. + +AC_CONFIG_HEADERS(config.h:config.in, [echo timestamp > stamp-h1]) +AC_CONFIG_FILES(Makefile) +AC_OUTPUT diff --git a/libcpp/directives-only.c b/libcpp/directives-only.c new file mode 100644 index 0000000..d50cebb --- /dev/null +++ b/libcpp/directives-only.c @@ -0,0 +1,240 @@ +/* CPP Library - directive only preprocessing for distributed compilation. + Copyright (C) 2007 + Free Software Foundation, Inc. + Contributed by Ollie Wild . + +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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include "config.h" +#include "system.h" +#include "cpplib.h" +#include "internal.h" + +/* DO (Directive only) flags. */ +#define DO_BOL (1 << 0) /* At the beginning of a logical line. */ +#define DO_STRING (1 << 1) /* In a string constant. */ +#define DO_CHAR (1 << 2) /* In a character constant. */ +#define DO_BLOCK_COMMENT (1 << 3) /* In a block comment. */ +#define DO_LINE_COMMENT (1 << 4) /* In a single line "//-style" comment. */ + +#define DO_LINE_SPECIAL (DO_STRING | DO_CHAR | DO_LINE_COMMENT) +#define DO_SPECIAL (DO_LINE_SPECIAL | DO_BLOCK_COMMENT) + +/* Writes out the preprocessed file, handling spacing and paste + avoidance issues. */ +void +_cpp_preprocess_dir_only (cpp_reader *pfile, + const struct _cpp_dir_only_callbacks *cb) +{ + struct cpp_buffer *buffer; + const unsigned char *cur, *base, *next_line, *rlimit; + cppchar_t c, last_c; + unsigned flags; + int lines, col; + source_location loc; + + restart: + /* Buffer initialization ala _cpp_clean_line(). */ + buffer = pfile->buffer; + buffer->cur_note = buffer->notes_used = 0; + buffer->cur = buffer->line_base = buffer->next_line; + buffer->need_line = false; + + /* This isn't really needed. It prevents a compiler warning, though. */ + loc = pfile->line_table->highest_line; + + /* Scan initialization. */ + next_line = cur = base = buffer->cur; + rlimit = buffer->rlimit; + flags = DO_BOL; + lines = 0; + col = 1; + + for (last_c = '\n', c = *cur; cur < rlimit; last_c = c, c = *++cur, ++col) + { + /* Skip over escaped newlines. */ + if (__builtin_expect (c == '\\', false)) + { + const unsigned char *tmp = cur + 1; + + while (is_nvspace (*tmp) && tmp < rlimit) + tmp++; + if (*tmp == '\r') + tmp++; + if (*tmp == '\n' && tmp < rlimit) + { + CPP_INCREMENT_LINE (pfile, 0); + lines++; + col = 0; + cur = tmp; + c = last_c; + continue; + } + } + + if (__builtin_expect (last_c == '#', false) && !(flags & DO_SPECIAL)) + { + if (c != '#' && (flags & DO_BOL)) + { + struct line_maps *line_table; + + if (!pfile->state.skipping && next_line != base) + cb->print_lines (lines, base, next_line - base); + + /* Prep things for directive handling. */ + buffer->next_line = cur; + buffer->need_line = true; + _cpp_get_fresh_line (pfile); + + /* Ensure proper column numbering for generated error messages. */ + buffer->line_base -= col - 1; + + _cpp_handle_directive (pfile, 0 /* ignore indented */); + + /* Sanitize the line settings. Duplicate #include's can mess + things up. */ + line_table = pfile->line_table; + line_table->highest_location = line_table->highest_line; + + /* The if block prevents us from outputing line information when + the file ends with a directive and no newline. Note that we + must use pfile->buffer, not buffer. */ + if (pfile->buffer->next_line < pfile->buffer->rlimit) + cb->maybe_print_line (pfile->line_table->highest_line); + + goto restart; + } + + flags &= ~DO_BOL; + pfile->mi_valid = false; + } + else if (__builtin_expect (last_c == '/', false) \ + && !(flags & DO_SPECIAL) && c != '*' && c != '/') + { + /* If a previous slash is not starting a block comment, clear the + DO_BOL flag. */ + flags &= ~DO_BOL; + pfile->mi_valid = false; + } + + switch (c) + { + case '/': + if ((flags & DO_BLOCK_COMMENT) && last_c == '*') + { + flags &= ~DO_BLOCK_COMMENT; + c = 0; + } + else if (!(flags & DO_SPECIAL) && last_c == '/') + flags |= DO_LINE_COMMENT; + else if (!(flags & DO_SPECIAL)) + /* Mark the position for possible error reporting. */ + LINEMAP_POSITION_FOR_COLUMN (loc, pfile->line_table, col); + + break; + + case '*': + if (!(flags & DO_SPECIAL)) + { + if (last_c == '/') + flags |= DO_BLOCK_COMMENT; + else + { + flags &= ~DO_BOL; + pfile->mi_valid = false; + } + } + + break; + + case '\'': + case '"': + { + unsigned state = (c == '"') ? DO_STRING : DO_CHAR; + + if (!(flags & DO_SPECIAL)) + { + flags |= state; + flags &= ~DO_BOL; + pfile->mi_valid = false; + } + else if ((flags & state) && last_c != '\\') + flags &= ~state; + + break; + } + + case '\\': + { + if ((flags & (DO_STRING | DO_CHAR)) && last_c == '\\') + c = 0; + + if (!(flags & DO_SPECIAL)) + { + flags &= ~DO_BOL; + pfile->mi_valid = false; + } + + break; + } + + case '\n': + CPP_INCREMENT_LINE (pfile, 0); + lines++; + col = 0; + flags &= ~DO_LINE_SPECIAL; + if (!(flags & DO_SPECIAL)) + flags |= DO_BOL; + break; + + case '#': + next_line = cur; + /* Don't update DO_BOL yet. */ + break; + + case ' ': case '\t': case '\f': case '\v': case '\0': + break; + + default: + if (!(flags & DO_SPECIAL)) + { + flags &= ~DO_BOL; + pfile->mi_valid = false; + } + break; + } + } + + if (flags & DO_BLOCK_COMMENT) + cpp_error_with_line (pfile, CPP_DL_ERROR, loc, 0, "unterminated comment"); + + if (!pfile->state.skipping && cur != base) + { + /* If the file was not newline terminated, add rlimit, which is + guaranteed to point to a newline, to the end of our range. */ + if (cur[-1] != '\n') + { + cur++; + CPP_INCREMENT_LINE (pfile, 0); + lines++; + } + + cb->print_lines (lines, base, cur - base); + } + + _cpp_pop_buffer (pfile); + if (pfile->buffer) + goto restart; +} diff --git a/libcpp/directives.c b/libcpp/directives.c new file mode 100644 index 0000000..6e2e55c --- /dev/null +++ b/libcpp/directives.c @@ -0,0 +1,2311 @@ +/* CPP Library. (Directive handling.) + Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, + 1999, 2000, 2001, 2002, 2003, 2004, 2005, + 2007, 2008 Free Software Foundation, Inc. + Contributed by Per Bothner, 1994-95. + Based on CCCP program by Paul Rubin, June 1986 + Adapted to ANSI C, Richard Stallman, Jan 1987 + +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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include "config.h" +#include "system.h" +#include "cpplib.h" +#include "internal.h" +#include "mkdeps.h" +#include "obstack.h" + +/* Stack of conditionals currently in progress + (including both successful and failing conditionals). */ +struct if_stack +{ + struct if_stack *next; + unsigned int line; /* Line where condition started. */ + const cpp_hashnode *mi_cmacro;/* macro name for #ifndef around entire file */ + bool skip_elses; /* Can future #else / #elif be skipped? */ + bool was_skipping; /* If were skipping on entry. */ + int type; /* Most recent conditional for diagnostics. */ +}; + +/* Contains a registered pragma or pragma namespace. */ +typedef void (*pragma_cb) (cpp_reader *); +struct pragma_entry +{ + struct pragma_entry *next; + const cpp_hashnode *pragma; /* Name and length. */ + bool is_nspace; + bool is_internal; + bool is_deferred; + bool allow_expansion; + union { + pragma_cb handler; + struct pragma_entry *space; + unsigned int ident; + } u; +}; + +/* Values for the origin field of struct directive. KANDR directives + come from traditional (K&R) C. STDC89 directives come from the + 1989 C standard. EXTENSION directives are extensions. */ +#define KANDR 0 +#define STDC89 1 +#define EXTENSION 2 + +/* Values for the flags field of struct directive. COND indicates a + conditional; IF_COND an opening conditional. INCL means to treat + "..." and <...> as q-char and h-char sequences respectively. IN_I + means this directive should be handled even if -fpreprocessed is in + effect (these are the directives with callback hooks). + + EXPAND is set on directives that are always macro-expanded. */ +#define COND (1 << 0) +#define IF_COND (1 << 1) +#define INCL (1 << 2) +#define IN_I (1 << 3) +#define EXPAND (1 << 4) + +/* Defines one #-directive, including how to handle it. */ +typedef void (*directive_handler) (cpp_reader *); +typedef struct directive directive; +struct directive +{ + directive_handler handler; /* Function to handle directive. */ + const uchar *name; /* Name of directive. */ + unsigned short length; /* Length of name. */ + unsigned char origin; /* Origin of directive. */ + unsigned char flags; /* Flags describing this directive. */ +}; + +/* Forward declarations. */ + +static void skip_rest_of_line (cpp_reader *); +static void check_eol (cpp_reader *); +static void start_directive (cpp_reader *); +static void prepare_directive_trad (cpp_reader *); +static void end_directive (cpp_reader *, int); +static void directive_diagnostics (cpp_reader *, const directive *, int); +static void run_directive (cpp_reader *, int, const char *, size_t); +static char *glue_header_name (cpp_reader *); +static const char *parse_include (cpp_reader *, int *, const cpp_token ***); +static void push_conditional (cpp_reader *, int, int, const cpp_hashnode *); +static unsigned int read_flag (cpp_reader *, unsigned int); +static int strtoul_for_line (const uchar *, unsigned int, unsigned long *); +static void do_diagnostic (cpp_reader *, int, int); +static cpp_hashnode *lex_macro_node (cpp_reader *, bool); +static int undefine_macros (cpp_reader *, cpp_hashnode *, void *); +static void do_include_common (cpp_reader *, enum include_type); +static struct pragma_entry *lookup_pragma_entry (struct pragma_entry *, + const cpp_hashnode *); +static int count_registered_pragmas (struct pragma_entry *); +static char ** save_registered_pragmas (struct pragma_entry *, char **); +static char ** restore_registered_pragmas (cpp_reader *, struct pragma_entry *, + char **); +static void do_pragma_once (cpp_reader *); +static void do_pragma_poison (cpp_reader *); +static void do_pragma_system_header (cpp_reader *); +static void do_pragma_dependency (cpp_reader *); +static void do_linemarker (cpp_reader *); +static const cpp_token *get_token_no_padding (cpp_reader *); +static const cpp_token *get__Pragma_string (cpp_reader *); +static void destringize_and_run (cpp_reader *, const cpp_string *); +static int parse_answer (cpp_reader *, struct answer **, int); +static cpp_hashnode *parse_assertion (cpp_reader *, struct answer **, int); +static struct answer ** find_answer (cpp_hashnode *, const struct answer *); +static void handle_assertion (cpp_reader *, const char *, int); + +/* This is the table of directive handlers. It is ordered by + frequency of occurrence; the numbers at the end are directive + counts from all the source code I have lying around (egcs and libc + CVS as of 1999-05-18, plus grub-0.5.91, linux-2.2.9, and + pcmcia-cs-3.0.9). This is no longer important as directive lookup + is now O(1). All extensions other than #warning and #include_next + are deprecated. The name is where the extension appears to have + come from. */ + +#define DIRECTIVE_TABLE \ +D(define, T_DEFINE = 0, KANDR, IN_I) /* 270554 */ \ +D(include, T_INCLUDE, KANDR, INCL | EXPAND) /* 52262 */ \ +D(endif, T_ENDIF, KANDR, COND) /* 45855 */ \ +D(ifdef, T_IFDEF, KANDR, COND | IF_COND) /* 22000 */ \ +D(if, T_IF, KANDR, COND | IF_COND | EXPAND) /* 18162 */ \ +D(else, T_ELSE, KANDR, COND) /* 9863 */ \ +D(ifndef, T_IFNDEF, KANDR, COND | IF_COND) /* 9675 */ \ +D(undef, T_UNDEF, KANDR, IN_I) /* 4837 */ \ +D(line, T_LINE, KANDR, EXPAND) /* 2465 */ \ +D(elif, T_ELIF, STDC89, COND | EXPAND) /* 610 */ \ +D(error, T_ERROR, STDC89, 0) /* 475 */ \ +D(pragma, T_PRAGMA, STDC89, IN_I) /* 195 */ \ +D(warning, T_WARNING, EXTENSION, 0) /* 22 */ \ +D(include_next, T_INCLUDE_NEXT, EXTENSION, INCL | EXPAND) /* 19 */ \ +D(ident, T_IDENT, EXTENSION, IN_I) /* 11 */ \ +D(import, T_IMPORT, EXTENSION, INCL | EXPAND) /* 0 ObjC */ \ +D(assert, T_ASSERT, EXTENSION, 0) /* 0 SVR4 */ \ +D(unassert, T_UNASSERT, EXTENSION, 0) /* 0 SVR4 */ \ +D(sccs, T_SCCS, EXTENSION, IN_I) /* 0 SVR4? */ + +/* #sccs is synonymous with #ident. */ +#define do_sccs do_ident + +/* Use the table to generate a series of prototypes, an enum for the + directive names, and an array of directive handlers. */ + +#define D(name, t, o, f) static void do_##name (cpp_reader *); +DIRECTIVE_TABLE +#undef D + +#define D(n, tag, o, f) tag, +enum +{ + DIRECTIVE_TABLE + N_DIRECTIVES +}; +#undef D + +#define D(name, t, origin, flags) \ +{ do_##name, (const uchar *) #name, \ + sizeof #name - 1, origin, flags }, +static const directive dtable[] = +{ +DIRECTIVE_TABLE +}; +#undef D +#undef DIRECTIVE_TABLE + +/* Wrapper struct directive for linemarkers. + The origin is more or less true - the original K+R cpp + did use this notation in its preprocessed output. */ +static const directive linemarker_dir = +{ + do_linemarker, U"#", 1, KANDR, IN_I +}; + +#define SEEN_EOL() (pfile->cur_token[-1].type == CPP_EOF) + +/* Skip any remaining tokens in a directive. */ +static void +skip_rest_of_line (cpp_reader *pfile) +{ + /* Discard all stacked contexts. */ + while (pfile->context->prev) + _cpp_pop_context (pfile); + + /* Sweep up all tokens remaining on the line. */ + if (! SEEN_EOL ()) + while (_cpp_lex_token (pfile)->type != CPP_EOF) + ; +} + +/* Ensure there are no stray tokens at the end of a directive. */ +static void +check_eol (cpp_reader *pfile) +{ + if (! SEEN_EOL () && _cpp_lex_token (pfile)->type != CPP_EOF) + cpp_error (pfile, CPP_DL_PEDWARN, "extra tokens at end of #%s directive", + pfile->directive->name); +} + +/* Ensure there are no stray tokens other than comments at the end of + a directive, and gather the comments. */ +static const cpp_token ** +check_eol_return_comments (cpp_reader *pfile) +{ + size_t c; + size_t capacity = 8; + const cpp_token **buf; + + buf = XNEWVEC (const cpp_token *, capacity); + c = 0; + if (! SEEN_EOL ()) + { + while (1) + { + const cpp_token *tok; + + tok = _cpp_lex_token (pfile); + if (tok->type == CPP_EOF) + break; + if (tok->type != CPP_COMMENT) + cpp_error (pfile, CPP_DL_PEDWARN, + "extra tokens at end of #%s directive", + pfile->directive->name); + else + { + if (c + 1 >= capacity) + { + capacity *= 2; + buf = XRESIZEVEC (const cpp_token *, buf, capacity); + } + buf[c] = tok; + ++c; + } + } + } + buf[c] = NULL; + return buf; +} + +/* Called when entering a directive, _Pragma or command-line directive. */ +static void +start_directive (cpp_reader *pfile) +{ + /* Setup in-directive state. */ + pfile->state.in_directive = 1; + pfile->state.save_comments = 0; + pfile->directive_result.type = CPP_PADDING; + + /* Some handlers need the position of the # for diagnostics. */ + pfile->directive_line = pfile->line_table->highest_line; +} + +/* Called when leaving a directive, _Pragma or command-line directive. */ +static void +end_directive (cpp_reader *pfile, int skip_line) +{ + if (pfile->state.in_deferred_pragma) + ; + else if (CPP_OPTION (pfile, traditional)) + { + /* Revert change of prepare_directive_trad. */ + pfile->state.prevent_expansion--; + + if (pfile->directive != &dtable[T_DEFINE]) + _cpp_remove_overlay (pfile); + } + /* We don't skip for an assembler #. */ + else if (skip_line) + { + skip_rest_of_line (pfile); + if (!pfile->keep_tokens) + { + pfile->cur_run = &pfile->base_run; + pfile->cur_token = pfile->base_run.base; + } + } + + /* Restore state. */ + pfile->state.save_comments = ! CPP_OPTION (pfile, discard_comments); + pfile->state.in_directive = 0; + pfile->state.in_expression = 0; + pfile->state.angled_headers = 0; + pfile->directive = 0; +} + +/* Prepare to handle the directive in pfile->directive. */ +static void +prepare_directive_trad (cpp_reader *pfile) +{ + if (pfile->directive != &dtable[T_DEFINE]) + { + bool no_expand = (pfile->directive + && ! (pfile->directive->flags & EXPAND)); + bool was_skipping = pfile->state.skipping; + + pfile->state.in_expression = (pfile->directive == &dtable[T_IF] + || pfile->directive == &dtable[T_ELIF]); + if (pfile->state.in_expression) + pfile->state.skipping = false; + + if (no_expand) + pfile->state.prevent_expansion++; + _cpp_scan_out_logical_line (pfile, NULL); + if (no_expand) + pfile->state.prevent_expansion--; + + pfile->state.skipping = was_skipping; + _cpp_overlay_buffer (pfile, pfile->out.base, + pfile->out.cur - pfile->out.base); + } + + /* Stop ISO C from expanding anything. */ + pfile->state.prevent_expansion++; +} + +/* Output diagnostics for a directive DIR. INDENTED is nonzero if + the '#' was indented. */ +static void +directive_diagnostics (cpp_reader *pfile, const directive *dir, int indented) +{ + /* Issue -pedantic warnings for extensions. */ + if (CPP_PEDANTIC (pfile) + && ! pfile->state.skipping + && dir->origin == EXTENSION) + cpp_error (pfile, CPP_DL_PEDWARN, "#%s is a GCC extension", dir->name); + + /* Traditionally, a directive is ignored unless its # is in + column 1. Therefore in code intended to work with K+R + compilers, directives added by C89 must have their # + indented, and directives present in traditional C must not. + This is true even of directives in skipped conditional + blocks. #elif cannot be used at all. */ + if (CPP_WTRADITIONAL (pfile)) + { + if (dir == &dtable[T_ELIF]) + cpp_error (pfile, CPP_DL_WARNING, + "suggest not using #elif in traditional C"); + else if (indented && dir->origin == KANDR) + cpp_error (pfile, CPP_DL_WARNING, + "traditional C ignores #%s with the # indented", + dir->name); + else if (!indented && dir->origin != KANDR) + cpp_error (pfile, CPP_DL_WARNING, + "suggest hiding #%s from traditional C with an indented #", + dir->name); + } +} + +/* Check if we have a known directive. INDENTED is nonzero if the + '#' of the directive was indented. This function is in this file + to save unnecessarily exporting dtable etc. to lex.c. Returns + nonzero if the line of tokens has been handled, zero if we should + continue processing the line. */ +int +_cpp_handle_directive (cpp_reader *pfile, int indented) +{ + const directive *dir = 0; + const cpp_token *dname; + bool was_parsing_args = pfile->state.parsing_args; + bool was_discarding_output = pfile->state.discarding_output; + int skip = 1; + + if (was_discarding_output) + pfile->state.prevent_expansion = 0; + + if (was_parsing_args) + { + if (CPP_OPTION (pfile, pedantic)) + cpp_error (pfile, CPP_DL_PEDWARN, + "embedding a directive within macro arguments is not portable"); + pfile->state.parsing_args = 0; + pfile->state.prevent_expansion = 0; + } + start_directive (pfile); + dname = _cpp_lex_token (pfile); + + if (dname->type == CPP_NAME) + { + if (dname->val.node->is_directive) + dir = &dtable[dname->val.node->directive_index]; + } + /* We do not recognize the # followed by a number extension in + assembler code. */ + else if (dname->type == CPP_NUMBER && CPP_OPTION (pfile, lang) != CLK_ASM) + { + dir = &linemarker_dir; + if (CPP_PEDANTIC (pfile) && ! CPP_OPTION (pfile, preprocessed) + && ! pfile->state.skipping) + cpp_error (pfile, CPP_DL_PEDWARN, + "style of line directive is a GCC extension"); + } + + if (dir) + { + /* If we have a directive that is not an opening conditional, + invalidate any control macro. */ + if (! (dir->flags & IF_COND)) + pfile->mi_valid = false; + + /* Kluge alert. In order to be sure that code like this + + #define HASH # + HASH define foo bar + + does not cause '#define foo bar' to get executed when + compiled with -save-temps, we recognize directives in + -fpreprocessed mode only if the # is in column 1. macro.c + puts a space in front of any '#' at the start of a macro. + + We exclude the -fdirectives-only case because macro expansion + has not been performed yet, and block comments can cause spaces + to preceed the directive. */ + if (CPP_OPTION (pfile, preprocessed) + && !CPP_OPTION (pfile, directives_only) + && (indented || !(dir->flags & IN_I))) + { + skip = 0; + dir = 0; + } + else + { + /* In failed conditional groups, all non-conditional + directives are ignored. Before doing that, whether + skipping or not, we should lex angle-bracketed headers + correctly, and maybe output some diagnostics. */ + pfile->state.angled_headers = dir->flags & INCL; + pfile->state.directive_wants_padding = dir->flags & INCL; + if (! CPP_OPTION (pfile, preprocessed)) + directive_diagnostics (pfile, dir, indented); + if (pfile->state.skipping && !(dir->flags & COND)) + dir = 0; + } + } + else if (dname->type == CPP_EOF) + ; /* CPP_EOF is the "null directive". */ + else + { + /* An unknown directive. Don't complain about it in assembly + source: we don't know where the comments are, and # may + introduce assembler pseudo-ops. Don't complain about invalid + directives in skipped conditional groups (6.10 p4). */ + if (CPP_OPTION (pfile, lang) == CLK_ASM) + skip = 0; + else if (!pfile->state.skipping) + cpp_error (pfile, CPP_DL_ERROR, "invalid preprocessing directive #%s", + cpp_token_as_text (pfile, dname)); + } + + pfile->directive = dir; + if (CPP_OPTION (pfile, traditional)) + prepare_directive_trad (pfile); + + if (dir) + pfile->directive->handler (pfile); + else if (skip == 0) + _cpp_backup_tokens (pfile, 1); + + end_directive (pfile, skip); + if (was_parsing_args) + { + /* Restore state when within macro args. */ + pfile->state.parsing_args = 2; + pfile->state.prevent_expansion = 1; + } + if (was_discarding_output) + pfile->state.prevent_expansion = 1; + return skip; +} + +/* Directive handler wrapper used by the command line option + processor. BUF is \n terminated. */ +static void +run_directive (cpp_reader *pfile, int dir_no, const char *buf, size_t count) +{ + cpp_push_buffer (pfile, (const uchar *) buf, count, + /* from_stage3 */ true); + start_directive (pfile); + + /* This is a short-term fix to prevent a leading '#' being + interpreted as a directive. */ + _cpp_clean_line (pfile); + + pfile->directive = &dtable[dir_no]; + if (CPP_OPTION (pfile, traditional)) + prepare_directive_trad (pfile); + pfile->directive->handler (pfile); + end_directive (pfile, 1); + _cpp_pop_buffer (pfile); +} + +/* Checks for validity the macro name in #define, #undef, #ifdef and + #ifndef directives. IS_DEF_OR_UNDEF is true if this call is + processing a #define or #undefine directive, and false + otherwise. */ +static cpp_hashnode * +lex_macro_node (cpp_reader *pfile, bool is_def_or_undef) +{ + const cpp_token *token = _cpp_lex_token (pfile); + + /* The token immediately after #define must be an identifier. That + identifier may not be "defined", per C99 6.10.8p4. + In C++, it may not be any of the "named operators" either, + per C++98 [lex.digraph], [lex.key]. + Finally, the identifier may not have been poisoned. (In that case + the lexer has issued the error message for us.) */ + + if (token->type == CPP_NAME) + { + cpp_hashnode *node = token->val.node; + + if (is_def_or_undef && node == pfile->spec_nodes.n_defined) + cpp_error (pfile, CPP_DL_ERROR, + "\"defined\" cannot be used as a macro name"); + else if (! (node->flags & NODE_POISONED)) + return node; + } + else if (token->flags & NAMED_OP) + cpp_error (pfile, CPP_DL_ERROR, + "\"%s\" cannot be used as a macro name as it is an operator in C++", + NODE_NAME (token->val.node)); + else if (token->type == CPP_EOF) + cpp_error (pfile, CPP_DL_ERROR, "no macro name given in #%s directive", + pfile->directive->name); + else + cpp_error (pfile, CPP_DL_ERROR, "macro names must be identifiers"); + + return NULL; +} + +/* Process a #define directive. Most work is done in macro.c. */ +static void +do_define (cpp_reader *pfile) +{ + cpp_hashnode *node = lex_macro_node (pfile, true); + + if (node) + { + /* If we have been requested to expand comments into macros, + then re-enable saving of comments. */ + pfile->state.save_comments = + ! CPP_OPTION (pfile, discard_comments_in_macro_exp); + + if (_cpp_create_definition (pfile, node)) + if (pfile->cb.define) + pfile->cb.define (pfile, pfile->directive_line, node); + } +} + +/* Handle #undef. Mark the identifier NT_VOID in the hash table. */ +static void +do_undef (cpp_reader *pfile) +{ + cpp_hashnode *node = lex_macro_node (pfile, true); + + if (node) + { + if (pfile->cb.undef) + pfile->cb.undef (pfile, pfile->directive_line, node); + + /* 6.10.3.5 paragraph 2: [#undef] is ignored if the specified + identifier is not currently defined as a macro name. */ + if (node->type == NT_MACRO) + { + if (node->flags & NODE_WARN) + cpp_error (pfile, CPP_DL_WARNING, + "undefining \"%s\"", NODE_NAME (node)); + + if (CPP_OPTION (pfile, warn_unused_macros)) + _cpp_warn_if_unused_macro (pfile, node, NULL); + + _cpp_free_definition (node); + } + } + + check_eol (pfile); +} + +/* Undefine a single macro/assertion/whatever. */ + +static int +undefine_macros (cpp_reader *pfile ATTRIBUTE_UNUSED, cpp_hashnode *h, + void *data_p ATTRIBUTE_UNUSED) +{ + /* Body of _cpp_free_definition inlined here for speed. + Macros and assertions no longer have anything to free. */ + h->type = NT_VOID; + h->flags &= ~(NODE_POISONED|NODE_BUILTIN|NODE_DISABLED); + return 1; +} + +/* Undefine all macros and assertions. */ + +void +cpp_undef_all (cpp_reader *pfile) +{ + cpp_forall_identifiers (pfile, undefine_macros, NULL); +} + + +/* Helper routine used by parse_include. Reinterpret the current line + as an h-char-sequence (< ... >); we are looking at the first token + after the <. Returns a malloced filename. */ +static char * +glue_header_name (cpp_reader *pfile) +{ + const cpp_token *token; + char *buffer; + size_t len, total_len = 0, capacity = 1024; + + /* To avoid lexed tokens overwriting our glued name, we can only + allocate from the string pool once we've lexed everything. */ + buffer = XNEWVEC (char, capacity); + for (;;) + { + token = get_token_no_padding (pfile); + + if (token->type == CPP_GREATER) + break; + if (token->type == CPP_EOF) + { + cpp_error (pfile, CPP_DL_ERROR, "missing terminating > character"); + break; + } + + len = cpp_token_len (token) + 2; /* Leading space, terminating \0. */ + if (total_len + len > capacity) + { + capacity = (capacity + len) * 2; + buffer = XRESIZEVEC (char, buffer, capacity); + } + + if (token->flags & PREV_WHITE) + buffer[total_len++] = ' '; + + total_len = (cpp_spell_token (pfile, token, (uchar *) &buffer[total_len], + true) + - (uchar *) buffer); + } + + buffer[total_len] = '\0'; + return buffer; +} + +/* Returns the file name of #include, #include_next, #import and + #pragma dependency. The string is malloced and the caller should + free it. Returns NULL on error. */ +static const char * +parse_include (cpp_reader *pfile, int *pangle_brackets, + const cpp_token ***buf) +{ + char *fname; + const cpp_token *header; + + /* Allow macro expansion. */ + header = get_token_no_padding (pfile); + if (header->type == CPP_STRING || header->type == CPP_HEADER_NAME) + { + fname = XNEWVEC (char, header->val.str.len - 1); + memcpy (fname, header->val.str.text + 1, header->val.str.len - 2); + fname[header->val.str.len - 2] = '\0'; + *pangle_brackets = header->type == CPP_HEADER_NAME; + } + else if (header->type == CPP_LESS) + { + fname = glue_header_name (pfile); + *pangle_brackets = 1; + } + else + { + const unsigned char *dir; + + if (pfile->directive == &dtable[T_PRAGMA]) + dir = U"pragma dependency"; + else + dir = pfile->directive->name; + cpp_error (pfile, CPP_DL_ERROR, "#%s expects \"FILENAME\" or ", + dir); + + return NULL; + } + + if (pfile->directive == &dtable[T_PRAGMA]) + { + /* This pragma allows extra tokens after the file name. */ + } + else if (buf == NULL || CPP_OPTION (pfile, discard_comments)) + check_eol (pfile); + else + { + /* If we are not discarding comments, then gather them while + doing the eol check. */ + *buf = check_eol_return_comments (pfile); + } + + return fname; +} + +/* Handle #include, #include_next and #import. */ +static void +do_include_common (cpp_reader *pfile, enum include_type type) +{ + const char *fname; + int angle_brackets; + const cpp_token **buf = NULL; + + /* Re-enable saving of comments if requested, so that the include + callback can dump comments which follow #include. */ + pfile->state.save_comments = ! CPP_OPTION (pfile, discard_comments); + + fname = parse_include (pfile, &angle_brackets, &buf); + if (!fname) + { + if (buf) + XDELETEVEC (buf); + return; + } + + if (!*fname) + { + cpp_error (pfile, CPP_DL_ERROR, "empty filename in #%s", + pfile->directive->name); + XDELETEVEC (fname); + if (buf) + XDELETEVEC (buf); + return; + } + + /* Prevent #include recursion. */ + if (pfile->line_table->depth >= CPP_STACK_MAX) + cpp_error (pfile, CPP_DL_ERROR, "#include nested too deeply"); + else + { + /* Get out of macro context, if we are. */ + skip_rest_of_line (pfile); + + if (pfile->cb.include) + pfile->cb.include (pfile, pfile->directive_line, + pfile->directive->name, fname, angle_brackets, + buf); + + _cpp_stack_include (pfile, fname, angle_brackets, type); + } + + XDELETEVEC (fname); + if (buf) + XDELETEVEC (buf); +} + +static void +do_include (cpp_reader *pfile) +{ + do_include_common (pfile, IT_INCLUDE); +} + +static void +do_import (cpp_reader *pfile) +{ + do_include_common (pfile, IT_IMPORT); +} + +static void +do_include_next (cpp_reader *pfile) +{ + enum include_type type = IT_INCLUDE_NEXT; + + /* If this is the primary source file, warn and use the normal + search logic. */ + if (cpp_in_primary_file (pfile)) + { + cpp_error (pfile, CPP_DL_WARNING, + "#include_next in primary source file"); + type = IT_INCLUDE; + } + do_include_common (pfile, type); +} + +/* Subroutine of do_linemarker. Read possible flags after file name. + LAST is the last flag seen; 0 if this is the first flag. Return the + flag if it is valid, 0 at the end of the directive. Otherwise + complain. */ +static unsigned int +read_flag (cpp_reader *pfile, unsigned int last) +{ + const cpp_token *token = _cpp_lex_token (pfile); + + if (token->type == CPP_NUMBER && token->val.str.len == 1) + { + unsigned int flag = token->val.str.text[0] - '0'; + + if (flag > last && flag <= 4 + && (flag != 4 || last == 3) + && (flag != 2 || last == 0)) + return flag; + } + + if (token->type != CPP_EOF) + cpp_error (pfile, CPP_DL_ERROR, "invalid flag \"%s\" in line directive", + cpp_token_as_text (pfile, token)); + return 0; +} + +/* Subroutine of do_line and do_linemarker. Convert a number in STR, + of length LEN, to binary; store it in NUMP, and return 0 if the + number was well-formed, 1 if not. Temporary, hopefully. */ +static int +strtoul_for_line (const uchar *str, unsigned int len, long unsigned int *nump) +{ + unsigned long reg = 0; + uchar c; + while (len--) + { + c = *str++; + if (!ISDIGIT (c)) + return 1; + reg *= 10; + reg += c - '0'; + } + *nump = reg; + return 0; +} + +/* Interpret #line command. + Note that the filename string (if any) is a true string constant + (escapes are interpreted), unlike in #line. */ +static void +do_line (cpp_reader *pfile) +{ + const struct line_maps *line_table = pfile->line_table; + const struct line_map *map = &line_table->maps[line_table->used - 1]; + + /* skip_rest_of_line() may cause line table to be realloc()ed so note down + sysp right now. */ + + unsigned char map_sysp = map->sysp; + const cpp_token *token; + const char *new_file = map->to_file; + unsigned long new_lineno; + + /* C99 raised the minimum limit on #line numbers. */ + unsigned int cap = CPP_OPTION (pfile, c99) ? 2147483647 : 32767; + + /* #line commands expand macros. */ + token = cpp_get_token (pfile); + if (token->type != CPP_NUMBER + || strtoul_for_line (token->val.str.text, token->val.str.len, + &new_lineno)) + { + if (token->type == CPP_EOF) + cpp_error (pfile, CPP_DL_ERROR, "unexpected end of file after #line"); + else + cpp_error (pfile, CPP_DL_ERROR, + "\"%s\" after #line is not a positive integer", + cpp_token_as_text (pfile, token)); + return; + } + + if (CPP_PEDANTIC (pfile) && (new_lineno == 0 || new_lineno > cap)) + cpp_error (pfile, CPP_DL_PEDWARN, "line number out of range"); + + token = cpp_get_token (pfile); + if (token->type == CPP_STRING) + { + cpp_string s = { 0, 0 }; + if (cpp_interpret_string_notranslate (pfile, &token->val.str, 1, + &s, false)) + new_file = (const char *)s.text; + check_eol (pfile); + } + else if (token->type != CPP_EOF) + { + cpp_error (pfile, CPP_DL_ERROR, "\"%s\" is not a valid filename", + cpp_token_as_text (pfile, token)); + return; + } + + skip_rest_of_line (pfile); + _cpp_do_file_change (pfile, LC_RENAME, new_file, new_lineno, + map_sysp); +} + +/* Interpret the # 44 "file" [flags] notation, which has slightly + different syntax and semantics from #line: Flags are allowed, + and we never complain about the line number being too big. */ +static void +do_linemarker (cpp_reader *pfile) +{ + const struct line_maps *line_table = pfile->line_table; + const struct line_map *map = &line_table->maps[line_table->used - 1]; + const cpp_token *token; + const char *new_file = map->to_file; + unsigned long new_lineno; + unsigned int new_sysp = map->sysp; + enum lc_reason reason = LC_RENAME; + int flag; + + /* Back up so we can get the number again. Putting this in + _cpp_handle_directive risks two calls to _cpp_backup_tokens in + some circumstances, which can segfault. */ + _cpp_backup_tokens (pfile, 1); + + /* #line commands expand macros. */ + token = cpp_get_token (pfile); + if (token->type != CPP_NUMBER + || strtoul_for_line (token->val.str.text, token->val.str.len, + &new_lineno)) + { + /* Unlike #line, there does not seem to be a way to get an EOF + here. So, it should be safe to always spell the token. */ + cpp_error (pfile, CPP_DL_ERROR, + "\"%s\" after # is not a positive integer", + cpp_token_as_text (pfile, token)); + return; + } + + token = cpp_get_token (pfile); + if (token->type == CPP_STRING) + { + cpp_string s = { 0, 0 }; + if (cpp_interpret_string_notranslate (pfile, &token->val.str, + 1, &s, false)) + new_file = (const char *)s.text; + + new_sysp = 0; + flag = read_flag (pfile, 0); + if (flag == 1) + { + reason = LC_ENTER; + /* Fake an include for cpp_included (). */ + _cpp_fake_include (pfile, new_file); + flag = read_flag (pfile, flag); + } + else if (flag == 2) + { + reason = LC_LEAVE; + flag = read_flag (pfile, flag); + } + if (flag == 3) + { + new_sysp = 1; + flag = read_flag (pfile, flag); + if (flag == 4) + new_sysp = 2; + } + pfile->buffer->sysp = new_sysp; + + check_eol (pfile); + } + else if (token->type != CPP_EOF) + { + cpp_error (pfile, CPP_DL_ERROR, "\"%s\" is not a valid filename", + cpp_token_as_text (pfile, token)); + return; + } + + skip_rest_of_line (pfile); + _cpp_do_file_change (pfile, reason, new_file, new_lineno, new_sysp); +} + +/* Arrange the file_change callback. pfile->line has changed to + FILE_LINE of TO_FILE, for reason REASON. SYSP is 1 for a system + header, 2 for a system header that needs to be extern "C" protected, + and zero otherwise. */ +void +_cpp_do_file_change (cpp_reader *pfile, enum lc_reason reason, + const char *to_file, unsigned int file_line, + unsigned int sysp) +{ + const struct line_map *map = linemap_add (pfile->line_table, reason, sysp, + to_file, file_line); + if (map != NULL) + linemap_line_start (pfile->line_table, map->to_line, 127); + + if (pfile->cb.file_change) + pfile->cb.file_change (pfile, map); +} + +/* Report a warning or error detected by the program we are + processing. Use the directive's tokens in the error message. */ +static void +do_diagnostic (cpp_reader *pfile, int code, int print_dir) +{ + if (_cpp_begin_message (pfile, code, pfile->cur_token[-1].src_loc, 0)) + { + if (print_dir) + fprintf (stderr, "#%s ", pfile->directive->name); + pfile->state.prevent_expansion++; + cpp_output_line (pfile, stderr); + pfile->state.prevent_expansion--; + } +} + +static void +do_error (cpp_reader *pfile) +{ + do_diagnostic (pfile, CPP_DL_ERROR, 1); +} + +static void +do_warning (cpp_reader *pfile) +{ + /* We want #warning diagnostics to be emitted in system headers too. */ + do_diagnostic (pfile, CPP_DL_WARNING_SYSHDR, 1); +} + +/* Report program identification. */ +static void +do_ident (cpp_reader *pfile) +{ + const cpp_token *str = cpp_get_token (pfile); + + if (str->type != CPP_STRING) + cpp_error (pfile, CPP_DL_ERROR, "invalid #%s directive", + pfile->directive->name); + else if (pfile->cb.ident) + pfile->cb.ident (pfile, pfile->directive_line, &str->val.str); + + check_eol (pfile); +} + +/* Lookup a PRAGMA name in a singly-linked CHAIN. Returns the + matching entry, or NULL if none is found. The returned entry could + be the start of a namespace chain, or a pragma. */ +static struct pragma_entry * +lookup_pragma_entry (struct pragma_entry *chain, const cpp_hashnode *pragma) +{ + while (chain && chain->pragma != pragma) + chain = chain->next; + + return chain; +} + +/* Create and insert a blank pragma entry at the beginning of a + singly-linked CHAIN. */ +static struct pragma_entry * +new_pragma_entry (cpp_reader *pfile, struct pragma_entry **chain) +{ + struct pragma_entry *new_entry; + + new_entry = (struct pragma_entry *) + _cpp_aligned_alloc (pfile, sizeof (struct pragma_entry)); + + memset (new_entry, 0, sizeof (struct pragma_entry)); + new_entry->next = *chain; + + *chain = new_entry; + return new_entry; +} + +/* Register a pragma NAME in namespace SPACE. If SPACE is null, it + goes in the global namespace. */ +static struct pragma_entry * +register_pragma_1 (cpp_reader *pfile, const char *space, const char *name, + bool allow_name_expansion) +{ + struct pragma_entry **chain = &pfile->pragmas; + struct pragma_entry *entry; + const cpp_hashnode *node; + + if (space) + { + node = cpp_lookup (pfile, U space, strlen (space)); + entry = lookup_pragma_entry (*chain, node); + if (!entry) + { + entry = new_pragma_entry (pfile, chain); + entry->pragma = node; + entry->is_nspace = true; + entry->allow_expansion = allow_name_expansion; + } + else if (!entry->is_nspace) + goto clash; + else if (entry->allow_expansion != allow_name_expansion) + { + cpp_error (pfile, CPP_DL_ICE, + "registering pragmas in namespace \"%s\" with mismatched " + "name expansion", space); + return NULL; + } + chain = &entry->u.space; + } + else if (allow_name_expansion) + { + cpp_error (pfile, CPP_DL_ICE, + "registering pragma \"%s\" with name expansion " + "and no namespace", name); + return NULL; + } + + /* Check for duplicates. */ + node = cpp_lookup (pfile, U name, strlen (name)); + entry = lookup_pragma_entry (*chain, node); + if (entry == NULL) + { + entry = new_pragma_entry (pfile, chain); + entry->pragma = node; + return entry; + } + + if (entry->is_nspace) + clash: + cpp_error (pfile, CPP_DL_ICE, + "registering \"%s\" as both a pragma and a pragma namespace", + NODE_NAME (node)); + else if (space) + cpp_error (pfile, CPP_DL_ICE, "#pragma %s %s is already registered", + space, name); + else + cpp_error (pfile, CPP_DL_ICE, "#pragma %s is already registered", name); + + return NULL; +} + +/* Register a cpplib internal pragma SPACE NAME with HANDLER. */ +static void +register_pragma_internal (cpp_reader *pfile, const char *space, + const char *name, pragma_cb handler) +{ + struct pragma_entry *entry; + + entry = register_pragma_1 (pfile, space, name, false); + entry->is_internal = true; + entry->u.handler = handler; +} + +/* Register a pragma NAME in namespace SPACE. If SPACE is null, it + goes in the global namespace. HANDLER is the handler it will call, + which must be non-NULL. If ALLOW_EXPANSION is set, allow macro + expansion while parsing pragma NAME. This function is exported + from libcpp. */ +void +cpp_register_pragma (cpp_reader *pfile, const char *space, const char *name, + pragma_cb handler, bool allow_expansion) +{ + struct pragma_entry *entry; + + if (!handler) + { + cpp_error (pfile, CPP_DL_ICE, "registering pragma with NULL handler"); + return; + } + + entry = register_pragma_1 (pfile, space, name, false); + if (entry) + { + entry->allow_expansion = allow_expansion; + entry->u.handler = handler; + } +} + +/* Similarly, but create mark the pragma for deferred processing. + When found, a CPP_PRAGMA token will be insertted into the stream + with IDENT in the token->u.pragma slot. */ +void +cpp_register_deferred_pragma (cpp_reader *pfile, const char *space, + const char *name, unsigned int ident, + bool allow_expansion, bool allow_name_expansion) +{ + struct pragma_entry *entry; + + entry = register_pragma_1 (pfile, space, name, allow_name_expansion); + if (entry) + { + entry->is_deferred = true; + entry->allow_expansion = allow_expansion; + entry->u.ident = ident; + } +} + +/* Register the pragmas the preprocessor itself handles. */ +void +_cpp_init_internal_pragmas (cpp_reader *pfile) +{ + /* Pragmas in the global namespace. */ + register_pragma_internal (pfile, 0, "once", do_pragma_once); + + /* New GCC-specific pragmas should be put in the GCC namespace. */ + register_pragma_internal (pfile, "GCC", "poison", do_pragma_poison); + register_pragma_internal (pfile, "GCC", "system_header", + do_pragma_system_header); + register_pragma_internal (pfile, "GCC", "dependency", do_pragma_dependency); +} + +/* Return the number of registered pragmas in PE. */ + +static int +count_registered_pragmas (struct pragma_entry *pe) +{ + int ct = 0; + for (; pe != NULL; pe = pe->next) + { + if (pe->is_nspace) + ct += count_registered_pragmas (pe->u.space); + ct++; + } + return ct; +} + +/* Save into SD the names of the registered pragmas referenced by PE, + and return a pointer to the next free space in SD. */ + +static char ** +save_registered_pragmas (struct pragma_entry *pe, char **sd) +{ + for (; pe != NULL; pe = pe->next) + { + if (pe->is_nspace) + sd = save_registered_pragmas (pe->u.space, sd); + *sd++ = (char *) xmemdup (HT_STR (&pe->pragma->ident), + HT_LEN (&pe->pragma->ident), + HT_LEN (&pe->pragma->ident) + 1); + } + return sd; +} + +/* Return a newly-allocated array which saves the names of the + registered pragmas. */ + +char ** +_cpp_save_pragma_names (cpp_reader *pfile) +{ + int ct = count_registered_pragmas (pfile->pragmas); + char **result = XNEWVEC (char *, ct); + (void) save_registered_pragmas (pfile->pragmas, result); + return result; +} + +/* Restore from SD the names of the registered pragmas referenced by PE, + and return a pointer to the next unused name in SD. */ + +static char ** +restore_registered_pragmas (cpp_reader *pfile, struct pragma_entry *pe, + char **sd) +{ + for (; pe != NULL; pe = pe->next) + { + if (pe->is_nspace) + sd = restore_registered_pragmas (pfile, pe->u.space, sd); + pe->pragma = cpp_lookup (pfile, U *sd, strlen (*sd)); + free (*sd); + sd++; + } + return sd; +} + +/* Restore the names of the registered pragmas from SAVED. */ + +void +_cpp_restore_pragma_names (cpp_reader *pfile, char **saved) +{ + (void) restore_registered_pragmas (pfile, pfile->pragmas, saved); + free (saved); +} + +/* Pragmata handling. We handle some, and pass the rest on to the + front end. C99 defines three pragmas and says that no macro + expansion is to be performed on them; whether or not macro + expansion happens for other pragmas is implementation defined. + This implementation allows for a mix of both, since GCC did not + traditionally macro expand its (few) pragmas, whereas OpenMP + specifies that macro expansion should happen. */ +static void +do_pragma (cpp_reader *pfile) +{ + const struct pragma_entry *p = NULL; + const cpp_token *token, *pragma_token = pfile->cur_token; + cpp_token ns_token; + unsigned int count = 1; + + pfile->state.prevent_expansion++; + + token = cpp_get_token (pfile); + ns_token = *token; + if (token->type == CPP_NAME) + { + p = lookup_pragma_entry (pfile->pragmas, token->val.node); + if (p && p->is_nspace) + { + bool allow_name_expansion = p->allow_expansion; + if (allow_name_expansion) + pfile->state.prevent_expansion--; + token = cpp_get_token (pfile); + if (token->type == CPP_NAME) + p = lookup_pragma_entry (p->u.space, token->val.node); + else + p = NULL; + if (allow_name_expansion) + pfile->state.prevent_expansion++; + count = 2; + } + } + + if (p) + { + if (p->is_deferred) + { + pfile->directive_result.src_loc = pragma_token->src_loc; + pfile->directive_result.type = CPP_PRAGMA; + pfile->directive_result.flags = pragma_token->flags; + pfile->directive_result.val.pragma = p->u.ident; + pfile->state.in_deferred_pragma = true; + pfile->state.pragma_allow_expansion = p->allow_expansion; + if (!p->allow_expansion) + pfile->state.prevent_expansion++; + } + else + { + /* Since the handler below doesn't get the line number, that + it might need for diagnostics, make sure it has the right + numbers in place. */ + if (pfile->cb.line_change) + (*pfile->cb.line_change) (pfile, pragma_token, false); + if (p->allow_expansion) + pfile->state.prevent_expansion--; + (*p->u.handler) (pfile); + if (p->allow_expansion) + pfile->state.prevent_expansion++; + } + } + else if (pfile->cb.def_pragma) + { + if (count == 1 || pfile->context->prev == NULL) + _cpp_backup_tokens (pfile, count); + else + { + /* Invalid name comes from macro expansion, _cpp_backup_tokens + won't allow backing 2 tokens. */ + /* ??? The token buffer is leaked. Perhaps if def_pragma hook + reads both tokens, we could perhaps free it, but if it doesn't, + we don't know the exact lifespan. */ + cpp_token *toks = XNEWVEC (cpp_token, 2); + toks[0] = ns_token; + toks[0].flags |= NO_EXPAND; + toks[1] = *token; + toks[1].flags |= NO_EXPAND; + _cpp_push_token_context (pfile, NULL, toks, 2); + } + pfile->cb.def_pragma (pfile, pfile->directive_line); + } + + pfile->state.prevent_expansion--; +} + +/* Handle #pragma once. */ +static void +do_pragma_once (cpp_reader *pfile) +{ + if (cpp_in_primary_file (pfile)) + cpp_error (pfile, CPP_DL_WARNING, "#pragma once in main file"); + + check_eol (pfile); + _cpp_mark_file_once_only (pfile, pfile->buffer->file); +} + +/* Handle #pragma GCC poison, to poison one or more identifiers so + that the lexer produces a hard error for each subsequent usage. */ +static void +do_pragma_poison (cpp_reader *pfile) +{ + const cpp_token *tok; + cpp_hashnode *hp; + + pfile->state.poisoned_ok = 1; + for (;;) + { + tok = _cpp_lex_token (pfile); + if (tok->type == CPP_EOF) + break; + if (tok->type != CPP_NAME) + { + cpp_error (pfile, CPP_DL_ERROR, + "invalid #pragma GCC poison directive"); + break; + } + + hp = tok->val.node; + if (hp->flags & NODE_POISONED) + continue; + + if (hp->type == NT_MACRO) + cpp_error (pfile, CPP_DL_WARNING, "poisoning existing macro \"%s\"", + NODE_NAME (hp)); + _cpp_free_definition (hp); + hp->flags |= NODE_POISONED | NODE_DIAGNOSTIC; + } + pfile->state.poisoned_ok = 0; +} + +/* Mark the current header as a system header. This will suppress + some categories of warnings (notably those from -pedantic). It is + intended for use in system libraries that cannot be implemented in + conforming C, but cannot be certain that their headers appear in a + system include directory. To prevent abuse, it is rejected in the + primary source file. */ +static void +do_pragma_system_header (cpp_reader *pfile) +{ + if (cpp_in_primary_file (pfile)) + cpp_error (pfile, CPP_DL_WARNING, + "#pragma system_header ignored outside include file"); + else + { + check_eol (pfile); + skip_rest_of_line (pfile); + cpp_make_system_header (pfile, 1, 0); + } +} + +/* Check the modified date of the current include file against a specified + file. Issue a diagnostic, if the specified file is newer. We use this to + determine if a fixed header should be refixed. */ +static void +do_pragma_dependency (cpp_reader *pfile) +{ + const char *fname; + int angle_brackets, ordering; + + fname = parse_include (pfile, &angle_brackets, NULL); + if (!fname) + return; + + ordering = _cpp_compare_file_date (pfile, fname, angle_brackets); + if (ordering < 0) + cpp_error (pfile, CPP_DL_WARNING, "cannot find source file %s", fname); + else if (ordering > 0) + { + cpp_error (pfile, CPP_DL_WARNING, + "current file is older than %s", fname); + if (cpp_get_token (pfile)->type != CPP_EOF) + { + _cpp_backup_tokens (pfile, 1); + do_diagnostic (pfile, CPP_DL_WARNING, 0); + } + } + + free ((void *) fname); +} + +/* Get a token but skip padding. */ +static const cpp_token * +get_token_no_padding (cpp_reader *pfile) +{ + for (;;) + { + const cpp_token *result = cpp_get_token (pfile); + if (result->type != CPP_PADDING) + return result; + } +} + +/* Check syntax is "(string-literal)". Returns the string on success, + or NULL on failure. */ +static const cpp_token * +get__Pragma_string (cpp_reader *pfile) +{ + const cpp_token *string; + const cpp_token *paren; + + paren = get_token_no_padding (pfile); + if (paren->type == CPP_EOF) + _cpp_backup_tokens (pfile, 1); + if (paren->type != CPP_OPEN_PAREN) + return NULL; + + string = get_token_no_padding (pfile); + if (string->type == CPP_EOF) + _cpp_backup_tokens (pfile, 1); + if (string->type != CPP_STRING && string->type != CPP_WSTRING) + return NULL; + + paren = get_token_no_padding (pfile); + if (paren->type == CPP_EOF) + _cpp_backup_tokens (pfile, 1); + if (paren->type != CPP_CLOSE_PAREN) + return NULL; + + return string; +} + +/* Destringize IN into a temporary buffer, by removing the first \ of + \" and \\ sequences, and process the result as a #pragma directive. */ +static void +destringize_and_run (cpp_reader *pfile, const cpp_string *in) +{ + const unsigned char *src, *limit; + char *dest, *result; + cpp_context *saved_context; + cpp_token *saved_cur_token; + tokenrun *saved_cur_run; + cpp_token *toks; + int count; + + dest = result = (char *) alloca (in->len - 1); + src = in->text + 1 + (in->text[0] == 'L'); + limit = in->text + in->len - 1; + while (src < limit) + { + /* We know there is a character following the backslash. */ + if (*src == '\\' && (src[1] == '\\' || src[1] == '"')) + src++; + *dest++ = *src++; + } + *dest = '\n'; + + /* Ugh; an awful kludge. We are really not set up to be lexing + tokens when in the middle of a macro expansion. Use a new + context to force cpp_get_token to lex, and so skip_rest_of_line + doesn't go beyond the end of the text. Also, remember the + current lexing position so we can return to it later. + + Something like line-at-a-time lexing should remove the need for + this. */ + saved_context = pfile->context; + saved_cur_token = pfile->cur_token; + saved_cur_run = pfile->cur_run; + + pfile->context = XNEW (cpp_context); + pfile->context->macro = 0; + pfile->context->prev = 0; + pfile->context->next = 0; + + /* Inline run_directive, since we need to delay the _cpp_pop_buffer + until we've read all of the tokens that we want. */ + cpp_push_buffer (pfile, (const uchar *) result, dest - result, + /* from_stage3 */ true); + /* ??? Antique Disgusting Hack. What does this do? */ + if (pfile->buffer->prev) + pfile->buffer->file = pfile->buffer->prev->file; + + start_directive (pfile); + _cpp_clean_line (pfile); + do_pragma (pfile); + end_directive (pfile, 1); + + /* We always insert at least one token, the directive result. It'll + either be a CPP_PADDING or a CPP_PRAGMA. In the later case, we + need to insert *all* of the tokens, including the CPP_PRAGMA_EOL. */ + + /* If we're not handling the pragma internally, read all of the tokens from + the string buffer now, while the string buffer is still installed. */ + /* ??? Note that the token buffer allocated here is leaked. It's not clear + to me what the true lifespan of the tokens are. It would appear that + the lifespan is the entire parse of the main input stream, in which case + this may not be wrong. */ + if (pfile->directive_result.type == CPP_PRAGMA) + { + int maxcount; + + count = 1; + maxcount = 50; + toks = XNEWVEC (cpp_token, maxcount); + toks[0] = pfile->directive_result; + + do + { + if (count == maxcount) + { + maxcount = maxcount * 3 / 2; + toks = XRESIZEVEC (cpp_token, toks, maxcount); + } + toks[count] = *cpp_get_token (pfile); + /* Macros have been already expanded by cpp_get_token + if the pragma allowed expansion. */ + toks[count++].flags |= NO_EXPAND; + } + while (toks[count-1].type != CPP_PRAGMA_EOL); + } + else + { + count = 1; + toks = XNEW (cpp_token); + toks[0] = pfile->directive_result; + + /* If we handled the entire pragma internally, make sure we get the + line number correct for the next token. */ + if (pfile->cb.line_change) + pfile->cb.line_change (pfile, pfile->cur_token, false); + } + + /* Finish inlining run_directive. */ + pfile->buffer->file = NULL; + _cpp_pop_buffer (pfile); + + /* Reset the old macro state before ... */ + XDELETE (pfile->context); + pfile->context = saved_context; + pfile->cur_token = saved_cur_token; + pfile->cur_run = saved_cur_run; + + /* ... inserting the new tokens we collected. */ + _cpp_push_token_context (pfile, NULL, toks, count); +} + +/* Handle the _Pragma operator. Return 0 on error, 1 if ok. */ +int +_cpp_do__Pragma (cpp_reader *pfile) +{ + const cpp_token *string = get__Pragma_string (pfile); + pfile->directive_result.type = CPP_PADDING; + + if (string) + { + destringize_and_run (pfile, &string->val.str); + return 1; + } + cpp_error (pfile, CPP_DL_ERROR, + "_Pragma takes a parenthesized string literal"); + return 0; +} + +/* Handle #ifdef. */ +static void +do_ifdef (cpp_reader *pfile) +{ + int skip = 1; + + if (! pfile->state.skipping) + { + const cpp_hashnode *node = lex_macro_node (pfile, false); + + if (node) + { + skip = node->type != NT_MACRO; + _cpp_mark_macro_used (node); + check_eol (pfile); + } + } + + push_conditional (pfile, skip, T_IFDEF, 0); +} + +/* Handle #ifndef. */ +static void +do_ifndef (cpp_reader *pfile) +{ + int skip = 1; + const cpp_hashnode *node = 0; + + if (! pfile->state.skipping) + { + node = lex_macro_node (pfile, false); + + if (node) + { + skip = node->type == NT_MACRO; + _cpp_mark_macro_used (node); + check_eol (pfile); + } + } + + push_conditional (pfile, skip, T_IFNDEF, node); +} + +/* _cpp_parse_expr puts a macro in a "#if !defined ()" expression in + pfile->mi_ind_cmacro so we can handle multiple-include + optimizations. If macro expansion occurs in the expression, we + cannot treat it as a controlling conditional, since the expansion + could change in the future. That is handled by cpp_get_token. */ +static void +do_if (cpp_reader *pfile) +{ + int skip = 1; + + if (! pfile->state.skipping) + skip = _cpp_parse_expr (pfile) == false; + + push_conditional (pfile, skip, T_IF, pfile->mi_ind_cmacro); +} + +/* Flip skipping state if appropriate and continue without changing + if_stack; this is so that the error message for missing #endif's + etc. will point to the original #if. */ +static void +do_else (cpp_reader *pfile) +{ + cpp_buffer *buffer = pfile->buffer; + struct if_stack *ifs = buffer->if_stack; + + if (ifs == NULL) + cpp_error (pfile, CPP_DL_ERROR, "#else without #if"); + else + { + if (ifs->type == T_ELSE) + { + cpp_error (pfile, CPP_DL_ERROR, "#else after #else"); + cpp_error_with_line (pfile, CPP_DL_ERROR, ifs->line, 0, + "the conditional began here"); + } + ifs->type = T_ELSE; + + /* Skip any future (erroneous) #elses or #elifs. */ + pfile->state.skipping = ifs->skip_elses; + ifs->skip_elses = true; + + /* Invalidate any controlling macro. */ + ifs->mi_cmacro = 0; + + /* Only check EOL if was not originally skipping. */ + if (!ifs->was_skipping && CPP_OPTION (pfile, warn_endif_labels)) + check_eol (pfile); + } +} + +/* Handle a #elif directive by not changing if_stack either. See the + comment above do_else. */ +static void +do_elif (cpp_reader *pfile) +{ + cpp_buffer *buffer = pfile->buffer; + struct if_stack *ifs = buffer->if_stack; + + if (ifs == NULL) + cpp_error (pfile, CPP_DL_ERROR, "#elif without #if"); + else + { + if (ifs->type == T_ELSE) + { + cpp_error (pfile, CPP_DL_ERROR, "#elif after #else"); + cpp_error_with_line (pfile, CPP_DL_ERROR, ifs->line, 0, + "the conditional began here"); + } + ifs->type = T_ELIF; + + /* Only evaluate this if we aren't skipping elses. During + evaluation, set skipping to false to get lexer warnings. */ + if (ifs->skip_elses) + pfile->state.skipping = 1; + else + { + pfile->state.skipping = 0; + pfile->state.skipping = ! _cpp_parse_expr (pfile); + ifs->skip_elses = ! pfile->state.skipping; + } + + /* Invalidate any controlling macro. */ + ifs->mi_cmacro = 0; + } +} + +/* #endif pops the if stack and resets pfile->state.skipping. */ +static void +do_endif (cpp_reader *pfile) +{ + cpp_buffer *buffer = pfile->buffer; + struct if_stack *ifs = buffer->if_stack; + + if (ifs == NULL) + cpp_error (pfile, CPP_DL_ERROR, "#endif without #if"); + else + { + /* Only check EOL if was not originally skipping. */ + if (!ifs->was_skipping && CPP_OPTION (pfile, warn_endif_labels)) + check_eol (pfile); + + /* If potential control macro, we go back outside again. */ + if (ifs->next == 0 && ifs->mi_cmacro) + { + pfile->mi_valid = true; + pfile->mi_cmacro = ifs->mi_cmacro; + } + + buffer->if_stack = ifs->next; + pfile->state.skipping = ifs->was_skipping; + obstack_free (&pfile->buffer_ob, ifs); + } +} + +/* Push an if_stack entry for a preprocessor conditional, and set + pfile->state.skipping to SKIP. If TYPE indicates the conditional + is #if or #ifndef, CMACRO is a potentially controlling macro, and + we need to check here that we are at the top of the file. */ +static void +push_conditional (cpp_reader *pfile, int skip, int type, + const cpp_hashnode *cmacro) +{ + struct if_stack *ifs; + cpp_buffer *buffer = pfile->buffer; + + ifs = XOBNEW (&pfile->buffer_ob, struct if_stack); + ifs->line = pfile->directive_line; + ifs->next = buffer->if_stack; + ifs->skip_elses = pfile->state.skipping || !skip; + ifs->was_skipping = pfile->state.skipping; + ifs->type = type; + /* This condition is effectively a test for top-of-file. */ + if (pfile->mi_valid && pfile->mi_cmacro == 0) + ifs->mi_cmacro = cmacro; + else + ifs->mi_cmacro = 0; + + pfile->state.skipping = skip; + buffer->if_stack = ifs; +} + +/* Read the tokens of the answer into the macro pool, in a directive + of type TYPE. Only commit the memory if we intend it as permanent + storage, i.e. the #assert case. Returns 0 on success, and sets + ANSWERP to point to the answer. */ +static int +parse_answer (cpp_reader *pfile, struct answer **answerp, int type) +{ + const cpp_token *paren; + struct answer *answer; + unsigned int acount; + + /* In a conditional, it is legal to not have an open paren. We + should save the following token in this case. */ + paren = cpp_get_token (pfile); + + /* If not a paren, see if we're OK. */ + if (paren->type != CPP_OPEN_PAREN) + { + /* In a conditional no answer is a test for any answer. It + could be followed by any token. */ + if (type == T_IF) + { + _cpp_backup_tokens (pfile, 1); + return 0; + } + + /* #unassert with no answer is valid - it removes all answers. */ + if (type == T_UNASSERT && paren->type == CPP_EOF) + return 0; + + cpp_error (pfile, CPP_DL_ERROR, "missing '(' after predicate"); + return 1; + } + + for (acount = 0;; acount++) + { + size_t room_needed; + const cpp_token *token = cpp_get_token (pfile); + cpp_token *dest; + + if (token->type == CPP_CLOSE_PAREN) + break; + + if (token->type == CPP_EOF) + { + cpp_error (pfile, CPP_DL_ERROR, "missing ')' to complete answer"); + return 1; + } + + /* struct answer includes the space for one token. */ + room_needed = (sizeof (struct answer) + acount * sizeof (cpp_token)); + + if (BUFF_ROOM (pfile->a_buff) < room_needed) + _cpp_extend_buff (pfile, &pfile->a_buff, sizeof (struct answer)); + + dest = &((struct answer *) BUFF_FRONT (pfile->a_buff))->first[acount]; + *dest = *token; + + /* Drop whitespace at start, for answer equivalence purposes. */ + if (acount == 0) + dest->flags &= ~PREV_WHITE; + } + + if (acount == 0) + { + cpp_error (pfile, CPP_DL_ERROR, "predicate's answer is empty"); + return 1; + } + + answer = (struct answer *) BUFF_FRONT (pfile->a_buff); + answer->count = acount; + answer->next = NULL; + *answerp = answer; + + return 0; +} + +/* Parses an assertion directive of type TYPE, returning a pointer to + the hash node of the predicate, or 0 on error. If an answer was + supplied, it is placed in ANSWERP, otherwise it is set to 0. */ +static cpp_hashnode * +parse_assertion (cpp_reader *pfile, struct answer **answerp, int type) +{ + cpp_hashnode *result = 0; + const cpp_token *predicate; + + /* We don't expand predicates or answers. */ + pfile->state.prevent_expansion++; + + *answerp = 0; + predicate = cpp_get_token (pfile); + if (predicate->type == CPP_EOF) + cpp_error (pfile, CPP_DL_ERROR, "assertion without predicate"); + else if (predicate->type != CPP_NAME) + cpp_error (pfile, CPP_DL_ERROR, "predicate must be an identifier"); + else if (parse_answer (pfile, answerp, type) == 0) + { + unsigned int len = NODE_LEN (predicate->val.node); + unsigned char *sym = (unsigned char *) alloca (len + 1); + + /* Prefix '#' to get it out of macro namespace. */ + sym[0] = '#'; + memcpy (sym + 1, NODE_NAME (predicate->val.node), len); + result = cpp_lookup (pfile, sym, len + 1); + } + + pfile->state.prevent_expansion--; + return result; +} + +/* Returns a pointer to the pointer to CANDIDATE in the answer chain, + or a pointer to NULL if the answer is not in the chain. */ +static struct answer ** +find_answer (cpp_hashnode *node, const struct answer *candidate) +{ + unsigned int i; + struct answer **result; + + for (result = &node->value.answers; *result; result = &(*result)->next) + { + struct answer *answer = *result; + + if (answer->count == candidate->count) + { + for (i = 0; i < answer->count; i++) + if (! _cpp_equiv_tokens (&answer->first[i], &candidate->first[i])) + break; + + if (i == answer->count) + break; + } + } + + return result; +} + +/* Test an assertion within a preprocessor conditional. Returns + nonzero on failure, zero on success. On success, the result of + the test is written into VALUE, otherwise the value 0. */ +int +_cpp_test_assertion (cpp_reader *pfile, unsigned int *value) +{ + struct answer *answer; + cpp_hashnode *node; + + node = parse_assertion (pfile, &answer, T_IF); + + /* For recovery, an erroneous assertion expression is handled as a + failing assertion. */ + *value = 0; + + if (node) + *value = (node->type == NT_ASSERTION && + (answer == 0 || *find_answer (node, answer) != 0)); + else if (pfile->cur_token[-1].type == CPP_EOF) + _cpp_backup_tokens (pfile, 1); + + /* We don't commit the memory for the answer - it's temporary only. */ + return node == 0; +} + +/* Handle #assert. */ +static void +do_assert (cpp_reader *pfile) +{ + struct answer *new_answer; + cpp_hashnode *node; + + node = parse_assertion (pfile, &new_answer, T_ASSERT); + if (node) + { + size_t answer_size; + + /* Place the new answer in the answer list. First check there + is not a duplicate. */ + new_answer->next = 0; + if (node->type == NT_ASSERTION) + { + if (*find_answer (node, new_answer)) + { + cpp_error (pfile, CPP_DL_WARNING, "\"%s\" re-asserted", + NODE_NAME (node) + 1); + return; + } + new_answer->next = node->value.answers; + } + + answer_size = sizeof (struct answer) + ((new_answer->count - 1) + * sizeof (cpp_token)); + /* Commit or allocate storage for the object. */ + if (pfile->hash_table->alloc_subobject) + { + struct answer *temp_answer = new_answer; + new_answer = (struct answer *) pfile->hash_table->alloc_subobject + (answer_size); + memcpy (new_answer, temp_answer, answer_size); + } + else + BUFF_FRONT (pfile->a_buff) += answer_size; + + node->type = NT_ASSERTION; + node->value.answers = new_answer; + check_eol (pfile); + } +} + +/* Handle #unassert. */ +static void +do_unassert (cpp_reader *pfile) +{ + cpp_hashnode *node; + struct answer *answer; + + node = parse_assertion (pfile, &answer, T_UNASSERT); + /* It isn't an error to #unassert something that isn't asserted. */ + if (node && node->type == NT_ASSERTION) + { + if (answer) + { + struct answer **p = find_answer (node, answer), *temp; + + /* Remove the answer from the list. */ + temp = *p; + if (temp) + *p = temp->next; + + /* Did we free the last answer? */ + if (node->value.answers == 0) + node->type = NT_VOID; + + check_eol (pfile); + } + else + _cpp_free_definition (node); + } + + /* We don't commit the memory for the answer - it's temporary only. */ +} + +/* These are for -D, -U, -A. */ + +/* Process the string STR as if it appeared as the body of a #define. + If STR is just an identifier, define it with value 1. + If STR has anything after the identifier, then it should + be identifier=definition. */ +void +cpp_define (cpp_reader *pfile, const char *str) +{ + char *buf, *p; + size_t count; + + /* Copy the entire option so we can modify it. + Change the first "=" in the string to a space. If there is none, + tack " 1" on the end. */ + + count = strlen (str); + buf = (char *) alloca (count + 3); + memcpy (buf, str, count); + + p = strchr (str, '='); + if (p) + buf[p - str] = ' '; + else + { + buf[count++] = ' '; + buf[count++] = '1'; + } + buf[count] = '\n'; + + run_directive (pfile, T_DEFINE, buf, count); +} + +/* Slight variant of the above for use by initialize_builtins. */ +void +_cpp_define_builtin (cpp_reader *pfile, const char *str) +{ + size_t len = strlen (str); + char *buf = (char *) alloca (len + 1); + memcpy (buf, str, len); + buf[len] = '\n'; + run_directive (pfile, T_DEFINE, buf, len); +} + +/* Process MACRO as if it appeared as the body of an #undef. */ +void +cpp_undef (cpp_reader *pfile, const char *macro) +{ + size_t len = strlen (macro); + char *buf = (char *) alloca (len + 1); + memcpy (buf, macro, len); + buf[len] = '\n'; + run_directive (pfile, T_UNDEF, buf, len); +} + +/* Like lex_macro_node, but read the input from STR. */ +static cpp_hashnode * +lex_macro_node_from_str (cpp_reader *pfile, const char *str) +{ + size_t len = strlen (str); + uchar *buf = (uchar *) alloca (len + 1); + cpp_hashnode *node; + + memcpy (buf, str, len); + buf[len] = '\n'; + cpp_push_buffer (pfile, buf, len, true); + node = lex_macro_node (pfile, true); + _cpp_pop_buffer (pfile); + + return node; +} + +/* If STR is a defined macro, return its definition node, else return NULL. */ +cpp_macro * +cpp_push_definition (cpp_reader *pfile, const char *str) +{ + cpp_hashnode *node = lex_macro_node_from_str (pfile, str); + if (node && node->type == NT_MACRO) + return node->value.macro; + else + return NULL; +} + +/* Replace a previous definition DFN of the macro STR. If DFN is NULL, + then the macro should be undefined. */ +void +cpp_pop_definition (cpp_reader *pfile, const char *str, cpp_macro *dfn) +{ + cpp_hashnode *node = lex_macro_node_from_str (pfile, str); + if (node == NULL) + return; + + if (node->type == NT_MACRO) + { + if (pfile->cb.undef) + pfile->cb.undef (pfile, pfile->directive_line, node); + if (CPP_OPTION (pfile, warn_unused_macros)) + _cpp_warn_if_unused_macro (pfile, node, NULL); + } + if (node->type != NT_VOID) + _cpp_free_definition (node); + + if (dfn) + { + node->type = NT_MACRO; + node->value.macro = dfn; + if (! ustrncmp (NODE_NAME (node), DSC ("__STDC_"))) + node->flags |= NODE_WARN; + + if (pfile->cb.define) + pfile->cb.define (pfile, pfile->directive_line, node); + } +} + +/* Process the string STR as if it appeared as the body of a #assert. */ +void +cpp_assert (cpp_reader *pfile, const char *str) +{ + handle_assertion (pfile, str, T_ASSERT); +} + +/* Process STR as if it appeared as the body of an #unassert. */ +void +cpp_unassert (cpp_reader *pfile, const char *str) +{ + handle_assertion (pfile, str, T_UNASSERT); +} + +/* Common code for cpp_assert (-A) and cpp_unassert (-A-). */ +static void +handle_assertion (cpp_reader *pfile, const char *str, int type) +{ + size_t count = strlen (str); + const char *p = strchr (str, '='); + + /* Copy the entire option so we can modify it. Change the first + "=" in the string to a '(', and tack a ')' on the end. */ + char *buf = (char *) alloca (count + 2); + + memcpy (buf, str, count); + if (p) + { + buf[p - str] = '('; + buf[count++] = ')'; + } + buf[count] = '\n'; + str = buf; + + run_directive (pfile, type, str, count); +} + +/* The number of errors for a given reader. */ +unsigned int +cpp_errors (cpp_reader *pfile) +{ + return pfile->errors; +} + +/* The options structure. */ +cpp_options * +cpp_get_options (cpp_reader *pfile) +{ + return &pfile->opts; +} + +/* The callbacks structure. */ +cpp_callbacks * +cpp_get_callbacks (cpp_reader *pfile) +{ + return &pfile->cb; +} + +/* Copy the given callbacks structure to our own. */ +void +cpp_set_callbacks (cpp_reader *pfile, cpp_callbacks *cb) +{ + pfile->cb = *cb; +} + +/* The dependencies structure. (Creates one if it hasn't already been.) */ +struct deps * +cpp_get_deps (cpp_reader *pfile) +{ + if (!pfile->deps) + pfile->deps = deps_init (); + return pfile->deps; +} + +/* Push a new buffer on the buffer stack. Returns the new buffer; it + doesn't fail. It does not generate a file change call back; that + is the responsibility of the caller. */ +cpp_buffer * +cpp_push_buffer (cpp_reader *pfile, const uchar *buffer, size_t len, + int from_stage3) +{ + cpp_buffer *new_buffer = XOBNEW (&pfile->buffer_ob, cpp_buffer); + + /* Clears, amongst other things, if_stack and mi_cmacro. */ + memset (new_buffer, 0, sizeof (cpp_buffer)); + + new_buffer->next_line = new_buffer->buf = buffer; + new_buffer->rlimit = buffer + len; + new_buffer->from_stage3 = from_stage3; + new_buffer->prev = pfile->buffer; + new_buffer->need_line = true; + + pfile->buffer = new_buffer; + + return new_buffer; +} + +/* Pops a single buffer, with a file change call-back if appropriate. + Then pushes the next -include file, if any remain. */ +void +_cpp_pop_buffer (cpp_reader *pfile) +{ + cpp_buffer *buffer = pfile->buffer; + struct _cpp_file *inc = buffer->file; + struct if_stack *ifs; + + /* Walk back up the conditional stack till we reach its level at + entry to this file, issuing error messages. */ + for (ifs = buffer->if_stack; ifs; ifs = ifs->next) + cpp_error_with_line (pfile, CPP_DL_ERROR, ifs->line, 0, + "unterminated #%s", dtable[ifs->type].name); + + /* In case of a missing #endif. */ + pfile->state.skipping = 0; + + /* _cpp_do_file_change expects pfile->buffer to be the new one. */ + pfile->buffer = buffer->prev; + + free (buffer->notes); + + /* Free the buffer object now; we may want to push a new buffer + in _cpp_push_next_include_file. */ + obstack_free (&pfile->buffer_ob, buffer); + + if (inc) + { + _cpp_pop_file_buffer (pfile, inc); + + _cpp_do_file_change (pfile, LC_LEAVE, 0, 0, 0); + } +} + +/* Enter all recognized directives in the hash table. */ +void +_cpp_init_directives (cpp_reader *pfile) +{ + unsigned int i; + cpp_hashnode *node; + + for (i = 0; i < (unsigned int) N_DIRECTIVES; i++) + { + node = cpp_lookup (pfile, dtable[i].name, dtable[i].length); + node->is_directive = 1; + node->directive_index = i; + } +} diff --git a/libcpp/errors.c b/libcpp/errors.c new file mode 100644 index 0000000..97de490 --- /dev/null +++ b/libcpp/errors.c @@ -0,0 +1,189 @@ +/* Default error handlers for CPP Library. + Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1998, 1999, 2000, + 2001, 2002, 2004 Free Software Foundation, Inc. + Written by Per Bothner, 1994. + Based on CCCP program by Paul Rubin, June 1986 + Adapted to ANSI C, Richard Stallman, Jan 1987 + +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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + In other words, you are welcome to use, share and improve this program. + You are forbidden to forbid anyone else to use, share and improve + what you give them. Help stamp out software-hoarding! */ + +#include "config.h" +#include "system.h" +#include "cpplib.h" +#include "internal.h" + +static void print_location (cpp_reader *, source_location, unsigned int); + +/* Print the logical file location (LINE, COL) in preparation for a + diagnostic. Outputs the #include chain if it has changed. A line + of zero suppresses the include stack, and outputs the program name + instead. */ +static void +print_location (cpp_reader *pfile, source_location line, unsigned int col) +{ + if (line == 0) + fprintf (stderr, "%s: ", progname); + else + { + const struct line_map *map; + unsigned int lin; + + map = linemap_lookup (pfile->line_table, line); + linemap_print_containing_files (pfile->line_table, map); + + lin = SOURCE_LINE (map, line); + if (col == 0) + { + col = SOURCE_COLUMN (map, line); + if (col == 0) + col = 1; + } + + if (lin == 0) + fprintf (stderr, "%s:", map->to_file); + else if (CPP_OPTION (pfile, show_column) == 0) + fprintf (stderr, "%s:%u:", map->to_file, lin); + else + fprintf (stderr, "%s:%u:%u:", map->to_file, lin, col); + + fputc (' ', stderr); + } +} + +/* Set up for a diagnostic: print the file and line, bump the error + counter, etc. SRC_LOC is the logical line number; zero means to print + at the location of the previously lexed token, which tends to be + the correct place by default. The column number can be specified either + using COLUMN or (if COLUMN==0) extracting SOURCE_COLUMN from SRC_LOC. + (This may seem redundant, but is useful when pre-scanning (cleaning) a line, + when we haven't yet verified whether the current line_map has a + big enough max_column_hint.) + + Returns 0 if the error has been suppressed. */ +int +_cpp_begin_message (cpp_reader *pfile, int code, + source_location src_loc, unsigned int column) +{ + int level = CPP_DL_EXTRACT (code); + + switch (level) + { + case CPP_DL_WARNING: + case CPP_DL_PEDWARN: + if (cpp_in_system_header (pfile) + && ! CPP_OPTION (pfile, warn_system_headers)) + return 0; + /* Fall through. */ + + case CPP_DL_WARNING_SYSHDR: + if (CPP_OPTION (pfile, warnings_are_errors) + || (level == CPP_DL_PEDWARN && CPP_OPTION (pfile, pedantic_errors))) + { + if (CPP_OPTION (pfile, inhibit_errors)) + return 0; + level = CPP_DL_ERROR; + pfile->errors++; + } + else if (CPP_OPTION (pfile, inhibit_warnings)) + return 0; + break; + + case CPP_DL_ERROR: + if (CPP_OPTION (pfile, inhibit_errors)) + return 0; + /* ICEs cannot be inhibited. */ + case CPP_DL_ICE: + pfile->errors++; + break; + } + + print_location (pfile, src_loc, column); + if (CPP_DL_WARNING_P (level)) + fputs (_("warning: "), stderr); + else if (level == CPP_DL_ICE) + fputs (_("internal error: "), stderr); + else + fputs (_("error: "), stderr); + + return 1; +} + +/* Don't remove the blank before do, as otherwise the exgettext + script will mistake this as a function definition */ +#define v_message(msgid, ap) \ + do { vfprintf (stderr, _(msgid), ap); putc ('\n', stderr); } while (0) + +/* Exported interface. */ + +/* Print an error at the location of the previously lexed token. */ +void +cpp_error (cpp_reader * pfile, int level, const char *msgid, ...) +{ + source_location src_loc; + va_list ap; + + va_start (ap, msgid); + + if (CPP_OPTION (pfile, client_diagnostic)) + pfile->cb.error (pfile, level, _(msgid), &ap); + else + { + if (CPP_OPTION (pfile, traditional)) + { + if (pfile->state.in_directive) + src_loc = pfile->directive_line; + else + src_loc = pfile->line_table->highest_line; + } + else + { + src_loc = pfile->cur_token[-1].src_loc; + } + + if (_cpp_begin_message (pfile, level, src_loc, 0)) + v_message (msgid, ap); + } + + va_end (ap); +} + +/* Print an error at a specific location. */ +void +cpp_error_with_line (cpp_reader *pfile, int level, + source_location src_loc, unsigned int column, + const char *msgid, ...) +{ + va_list ap; + + va_start (ap, msgid); + + if (_cpp_begin_message (pfile, level, src_loc, column)) + v_message (msgid, ap); + + va_end (ap); +} + +void +cpp_errno (cpp_reader *pfile, int level, const char *msgid) +{ + if (msgid[0] == '\0') + msgid = _("stdout"); + + cpp_error (pfile, level, "%s: %s", msgid, xstrerror (errno)); +} diff --git a/libcpp/expr.c b/libcpp/expr.c new file mode 100644 index 0000000..9df7533 --- /dev/null +++ b/libcpp/expr.c @@ -0,0 +1,1666 @@ +/* Parse C expressions for cpplib. + Copyright (C) 1987, 1992, 1994, 1995, 1997, 1998, 1999, 2000, 2001, + 2002, 2004 Free Software Foundation. + Contributed by Per Bothner, 1994. + +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, 51 Franklin Street, Fifth Floor, +Boston, MA 02110-1301, USA. */ + +#include "config.h" +#include "system.h" +#include "cpplib.h" +#include "internal.h" + +#define PART_PRECISION (sizeof (cpp_num_part) * CHAR_BIT) +#define HALF_MASK (~(cpp_num_part) 0 >> (PART_PRECISION / 2)) +#define LOW_PART(num_part) (num_part & HALF_MASK) +#define HIGH_PART(num_part) (num_part >> (PART_PRECISION / 2)) + +struct op +{ + const cpp_token *token; /* The token forming op (for diagnostics). */ + cpp_num value; /* The value logically "right" of op. */ + enum cpp_ttype op; +}; + +/* Some simple utility routines on double integers. */ +#define num_zerop(num) ((num.low | num.high) == 0) +#define num_eq(num1, num2) (num1.low == num2.low && num1.high == num2.high) +static bool num_positive (cpp_num, size_t); +static bool num_greater_eq (cpp_num, cpp_num, size_t); +static cpp_num num_trim (cpp_num, size_t); +static cpp_num num_part_mul (cpp_num_part, cpp_num_part); + +static cpp_num num_unary_op (cpp_reader *, cpp_num, enum cpp_ttype); +static cpp_num num_binary_op (cpp_reader *, cpp_num, cpp_num, enum cpp_ttype); +static cpp_num num_negate (cpp_num, size_t); +static cpp_num num_bitwise_op (cpp_reader *, cpp_num, cpp_num, enum cpp_ttype); +static cpp_num num_inequality_op (cpp_reader *, cpp_num, cpp_num, + enum cpp_ttype); +static cpp_num num_equality_op (cpp_reader *, cpp_num, cpp_num, + enum cpp_ttype); +static cpp_num num_mul (cpp_reader *, cpp_num, cpp_num); +static cpp_num num_div_op (cpp_reader *, cpp_num, cpp_num, enum cpp_ttype); +static cpp_num num_lshift (cpp_num, size_t, size_t); +static cpp_num num_rshift (cpp_num, size_t, size_t); + +static cpp_num append_digit (cpp_num, int, int, size_t); +static cpp_num parse_defined (cpp_reader *); +static cpp_num eval_token (cpp_reader *, const cpp_token *); +static struct op *reduce (cpp_reader *, struct op *, enum cpp_ttype); +static unsigned int interpret_float_suffix (const uchar *, size_t); +static unsigned int interpret_int_suffix (const uchar *, size_t); +static void check_promotion (cpp_reader *, const struct op *); + +/* Token type abuse to create unary plus and minus operators. */ +#define CPP_UPLUS ((enum cpp_ttype) (CPP_LAST_CPP_OP + 1)) +#define CPP_UMINUS ((enum cpp_ttype) (CPP_LAST_CPP_OP + 2)) + +/* With -O2, gcc appears to produce nice code, moving the error + message load and subsequent jump completely out of the main path. */ +#define SYNTAX_ERROR(msgid) \ + do { cpp_error (pfile, CPP_DL_ERROR, msgid); goto syntax_error; } while(0) +#define SYNTAX_ERROR2(msgid, arg) \ + do { cpp_error (pfile, CPP_DL_ERROR, msgid, arg); goto syntax_error; } \ + while(0) + +/* Subroutine of cpp_classify_number. S points to a float suffix of + length LEN, possibly zero. Returns 0 for an invalid suffix, or a + flag vector describing the suffix. */ +static unsigned int +interpret_float_suffix (const uchar *s, size_t len) +{ + size_t f, l, w, q, i, d; + size_t r, k, u, h; + + f = l = w = q = i = d = 0; + r = k = u = h = 0; + + while (len--) + switch (s[len]) + { + case 'r': case 'R': r++; break; + case 'k': case 'K': k++; break; + case 'u': case 'U': u++; break; + case 'h': case 'H': h++; break; + case 'f': case 'F': + if (d > 0) + return 0; + f++; + break; + case 'l': case 'L': + if (d > 0) + return 0; + l++; + /* If there are two Ls, they must be adjacent and the same case. */ + if (l == 2 && s[len] != s[len + 1]) + return 0; + break; + case 'w': case 'W': + if (d > 0) + return 0; + w++; + break; + case 'q': case 'Q': + if (d > 0) + return 0; + q++; + break; + case 'i': case 'I': + case 'j': case 'J': i++; break; + case 'd': case 'D': d++; break; + default: + return 0; + } + + if (r + k > 1 || h > 1 || l > 2 || u > 1) + return 0; + + if (r == 1) + { + if (f || i || d || w || q) + return 0; + + return (CPP_N_FRACT + | (u ? CPP_N_UNSIGNED : 0) + | (h ? CPP_N_SMALL : + l == 2 ? CPP_N_LARGE : + l == 1 ? CPP_N_MEDIUM : 0)); + } + + if (k == 1) + { + if (f || i || d || w || q) + return 0; + + return (CPP_N_ACCUM + | (u ? CPP_N_UNSIGNED : 0) + | (h ? CPP_N_SMALL : + l == 2 ? CPP_N_LARGE : + l == 1 ? CPP_N_MEDIUM : 0)); + } + + if (f + l + w + q > 1 || i > 1 || h + u > 0) + return 0; + + /* Allow dd, df, dl suffixes for decimal float constants. */ + if (d && ((d + f + l != 2) || i)) + return 0; + + return ((i ? CPP_N_IMAGINARY : 0) + | (f ? CPP_N_SMALL : + l ? CPP_N_LARGE : + w ? CPP_N_MD_W : + q ? CPP_N_MD_Q : CPP_N_MEDIUM) + | (d ? CPP_N_DFLOAT : 0)); +} + +/* Subroutine of cpp_classify_number. S points to an integer suffix + of length LEN, possibly zero. Returns 0 for an invalid suffix, or a + flag vector describing the suffix. */ +static unsigned int +interpret_int_suffix (const uchar *s, size_t len) +{ + size_t u, l, i; + + u = l = i = 0; + + while (len--) + switch (s[len]) + { + case 'u': case 'U': u++; break; + case 'i': case 'I': + case 'j': case 'J': i++; break; + case 'l': case 'L': l++; + /* If there are two Ls, they must be adjacent and the same case. */ + if (l == 2 && s[len] != s[len + 1]) + return 0; + break; + default: + return 0; + } + + if (l > 2 || u > 1 || i > 1) + return 0; + + return ((i ? CPP_N_IMAGINARY : 0) + | (u ? CPP_N_UNSIGNED : 0) + | ((l == 0) ? CPP_N_SMALL + : (l == 1) ? CPP_N_MEDIUM : CPP_N_LARGE)); +} + +/* Categorize numeric constants according to their field (integer, + floating point, or invalid), radix (decimal, octal, hexadecimal), + and type suffixes. */ +unsigned int +cpp_classify_number (cpp_reader *pfile, const cpp_token *token) +{ + const uchar *str = token->val.str.text; + const uchar *limit; + unsigned int max_digit, result, radix; + enum {NOT_FLOAT = 0, AFTER_POINT, AFTER_EXPON} float_flag; + + /* If the lexer has done its job, length one can only be a single + digit. Fast-path this very common case. */ + if (token->val.str.len == 1) + return CPP_N_INTEGER | CPP_N_SMALL | CPP_N_DECIMAL; + + limit = str + token->val.str.len; + float_flag = NOT_FLOAT; + max_digit = 0; + radix = 10; + + /* First, interpret the radix. */ + if (*str == '0') + { + radix = 8; + str++; + + /* Require at least one hex digit to classify it as hex. */ + if ((*str == 'x' || *str == 'X') + && (str[1] == '.' || ISXDIGIT (str[1]))) + { + radix = 16; + str++; + } + else if ((*str == 'b' || *str == 'B') && (str[1] == '0' || str[1] == '1')) + { + radix = 2; + str++; + } + } + + /* Now scan for a well-formed integer or float. */ + for (;;) + { + unsigned int c = *str++; + + if (ISDIGIT (c) || (ISXDIGIT (c) && radix == 16)) + { + c = hex_value (c); + if (c > max_digit) + max_digit = c; + } + else if (c == '.') + { + if (float_flag == NOT_FLOAT) + float_flag = AFTER_POINT; + else + SYNTAX_ERROR ("too many decimal points in number"); + } + else if ((radix <= 10 && (c == 'e' || c == 'E')) + || (radix == 16 && (c == 'p' || c == 'P'))) + { + float_flag = AFTER_EXPON; + break; + } + else + { + /* Start of suffix. */ + str--; + break; + } + } + + /* The suffix may be for decimal fixed-point constants without exponent. */ + if (radix != 16 && float_flag == NOT_FLOAT) + { + result = interpret_float_suffix (str, limit - str); + if ((result & CPP_N_FRACT) || (result & CPP_N_ACCUM)) + { + result |= CPP_N_FLOATING; + /* We need to restore the radix to 10, if the radix is 8. */ + if (radix == 8) + radix = 10; + + if (CPP_PEDANTIC (pfile)) + cpp_error (pfile, CPP_DL_PEDWARN, + "fixed-point constants are a GCC extension"); + goto syntax_ok; + } + else + result = 0; + } + + if (float_flag != NOT_FLOAT && radix == 8) + radix = 10; + + if (max_digit >= radix) + { + if (radix == 2) + SYNTAX_ERROR2 ("invalid digit \"%c\" in binary constant", '0' + max_digit); + else + SYNTAX_ERROR2 ("invalid digit \"%c\" in octal constant", '0' + max_digit); + } + + if (float_flag != NOT_FLOAT) + { + if (radix == 2) + { + cpp_error (pfile, CPP_DL_ERROR, + "invalid prefix \"0b\" for floating constant"); + return CPP_N_INVALID; + } + + if (radix == 16 && CPP_PEDANTIC (pfile) && !CPP_OPTION (pfile, c99)) + cpp_error (pfile, CPP_DL_PEDWARN, + "use of C99 hexadecimal floating constant"); + + if (float_flag == AFTER_EXPON) + { + if (*str == '+' || *str == '-') + str++; + + /* Exponent is decimal, even if string is a hex float. */ + if (!ISDIGIT (*str)) + SYNTAX_ERROR ("exponent has no digits"); + + do + str++; + while (ISDIGIT (*str)); + } + else if (radix == 16) + SYNTAX_ERROR ("hexadecimal floating constants require an exponent"); + + result = interpret_float_suffix (str, limit - str); + if (result == 0) + { + cpp_error (pfile, CPP_DL_ERROR, + "invalid suffix \"%.*s\" on floating constant", + (int) (limit - str), str); + return CPP_N_INVALID; + } + + /* Traditional C didn't accept any floating suffixes. */ + if (limit != str + && CPP_WTRADITIONAL (pfile) + && ! cpp_sys_macro_p (pfile)) + cpp_error (pfile, CPP_DL_WARNING, + "traditional C rejects the \"%.*s\" suffix", + (int) (limit - str), str); + + /* Radix must be 10 for decimal floats. */ + if ((result & CPP_N_DFLOAT) && radix != 10) + { + cpp_error (pfile, CPP_DL_ERROR, + "invalid suffix \"%.*s\" with hexadecimal floating constant", + (int) (limit - str), str); + return CPP_N_INVALID; + } + + if ((result & (CPP_N_FRACT | CPP_N_ACCUM)) && CPP_PEDANTIC (pfile)) + cpp_error (pfile, CPP_DL_PEDWARN, + "fixed-point constants are a GCC extension"); + + if ((result & CPP_N_DFLOAT) && CPP_PEDANTIC (pfile)) + cpp_error (pfile, CPP_DL_PEDWARN, + "decimal float constants are a GCC extension"); + + result |= CPP_N_FLOATING; + } + else + { + result = interpret_int_suffix (str, limit - str); + if (result == 0) + { + cpp_error (pfile, CPP_DL_ERROR, + "invalid suffix \"%.*s\" on integer constant", + (int) (limit - str), str); + return CPP_N_INVALID; + } + + /* Traditional C only accepted the 'L' suffix. + Suppress warning about 'LL' with -Wno-long-long. */ + if (CPP_WTRADITIONAL (pfile) && ! cpp_sys_macro_p (pfile)) + { + int u_or_i = (result & (CPP_N_UNSIGNED|CPP_N_IMAGINARY)); + int large = (result & CPP_N_WIDTH) == CPP_N_LARGE; + + if (u_or_i || (large && CPP_OPTION (pfile, warn_long_long))) + cpp_error (pfile, CPP_DL_WARNING, + "traditional C rejects the \"%.*s\" suffix", + (int) (limit - str), str); + } + + if ((result & CPP_N_WIDTH) == CPP_N_LARGE + && ! CPP_OPTION (pfile, c99) + && CPP_OPTION (pfile, warn_long_long)) + cpp_error (pfile, CPP_DL_PEDWARN, + "use of C99 long long integer constant"); + + result |= CPP_N_INTEGER; + } + + syntax_ok: + if ((result & CPP_N_IMAGINARY) && CPP_PEDANTIC (pfile)) + cpp_error (pfile, CPP_DL_PEDWARN, + "imaginary constants are a GCC extension"); + if (radix == 2 && CPP_PEDANTIC (pfile)) + cpp_error (pfile, CPP_DL_PEDWARN, + "binary constants are a GCC extension"); + + if (radix == 10) + result |= CPP_N_DECIMAL; + else if (radix == 16) + result |= CPP_N_HEX; + else if (radix == 2) + result |= CPP_N_BINARY; + else + result |= CPP_N_OCTAL; + + return result; + + syntax_error: + return CPP_N_INVALID; +} + +/* cpp_interpret_integer converts an integer constant into a cpp_num, + of precision options->precision. + + We do not provide any interface for decimal->float conversion, + because the preprocessor doesn't need it and we don't want to + drag in GCC's floating point emulator. */ +cpp_num +cpp_interpret_integer (cpp_reader *pfile, const cpp_token *token, + unsigned int type) +{ + const uchar *p, *end; + cpp_num result; + + result.low = 0; + result.high = 0; + result.unsignedp = !!(type & CPP_N_UNSIGNED); + result.overflow = false; + + p = token->val.str.text; + end = p + token->val.str.len; + + /* Common case of a single digit. */ + if (token->val.str.len == 1) + result.low = p[0] - '0'; + else + { + cpp_num_part max; + size_t precision = CPP_OPTION (pfile, precision); + unsigned int base = 10, c = 0; + bool overflow = false; + + if ((type & CPP_N_RADIX) == CPP_N_OCTAL) + { + base = 8; + p++; + } + else if ((type & CPP_N_RADIX) == CPP_N_HEX) + { + base = 16; + p += 2; + } + else if ((type & CPP_N_RADIX) == CPP_N_BINARY) + { + base = 2; + p += 2; + } + + /* We can add a digit to numbers strictly less than this without + needing the precision and slowness of double integers. */ + max = ~(cpp_num_part) 0; + if (precision < PART_PRECISION) + max >>= PART_PRECISION - precision; + max = (max - base + 1) / base + 1; + + for (; p < end; p++) + { + c = *p; + + if (ISDIGIT (c) || (base == 16 && ISXDIGIT (c))) + c = hex_value (c); + else + break; + + /* Strict inequality for when max is set to zero. */ + if (result.low < max) + result.low = result.low * base + c; + else + { + result = append_digit (result, c, base, precision); + overflow |= result.overflow; + max = 0; + } + } + + if (overflow) + cpp_error (pfile, CPP_DL_PEDWARN, + "integer constant is too large for its type"); + /* If too big to be signed, consider it unsigned. Only warn for + decimal numbers. Traditional numbers were always signed (but + we still honor an explicit U suffix); but we only have + traditional semantics in directives. */ + else if (!result.unsignedp + && !(CPP_OPTION (pfile, traditional) + && pfile->state.in_directive) + && !num_positive (result, precision)) + { + if (base == 10) + cpp_error (pfile, CPP_DL_WARNING, + "integer constant is so large that it is unsigned"); + result.unsignedp = true; + } + } + + return result; +} + +/* Append DIGIT to NUM, a number of PRECISION bits being read in base BASE. */ +static cpp_num +append_digit (cpp_num num, int digit, int base, size_t precision) +{ + cpp_num result; + unsigned int shift; + bool overflow; + cpp_num_part add_high, add_low; + + /* Multiply by 2, 8 or 16. Catching this overflow here means we don't + need to worry about add_high overflowing. */ + switch (base) + { + case 2: + shift = 1; + break; + + case 16: + shift = 4; + break; + + default: + shift = 3; + } + overflow = !!(num.high >> (PART_PRECISION - shift)); + result.high = num.high << shift; + result.low = num.low << shift; + result.high |= num.low >> (PART_PRECISION - shift); + result.unsignedp = num.unsignedp; + + if (base == 10) + { + add_low = num.low << 1; + add_high = (num.high << 1) + (num.low >> (PART_PRECISION - 1)); + } + else + add_high = add_low = 0; + + if (add_low + digit < add_low) + add_high++; + add_low += digit; + + if (result.low + add_low < result.low) + add_high++; + if (result.high + add_high < result.high) + overflow = true; + + result.low += add_low; + result.high += add_high; + result.overflow = overflow; + + /* The above code catches overflow of a cpp_num type. This catches + overflow of the (possibly shorter) target precision. */ + num.low = result.low; + num.high = result.high; + result = num_trim (result, precision); + if (!num_eq (result, num)) + result.overflow = true; + + return result; +} + +/* Handle meeting "defined" in a preprocessor expression. */ +static cpp_num +parse_defined (cpp_reader *pfile) +{ + cpp_num result; + int paren = 0; + cpp_hashnode *node = 0; + const cpp_token *token; + cpp_context *initial_context = pfile->context; + + /* Don't expand macros. */ + pfile->state.prevent_expansion++; + + token = cpp_get_token (pfile); + if (token->type == CPP_OPEN_PAREN) + { + paren = 1; + token = cpp_get_token (pfile); + } + + if (token->type == CPP_NAME) + { + node = token->val.node; + if (paren && cpp_get_token (pfile)->type != CPP_CLOSE_PAREN) + { + cpp_error (pfile, CPP_DL_ERROR, "missing ')' after \"defined\""); + node = 0; + } + } + else + { + cpp_error (pfile, CPP_DL_ERROR, + "operator \"defined\" requires an identifier"); + if (token->flags & NAMED_OP) + { + cpp_token op; + + op.flags = 0; + op.type = token->type; + cpp_error (pfile, CPP_DL_ERROR, + "(\"%s\" is an alternative token for \"%s\" in C++)", + cpp_token_as_text (pfile, token), + cpp_token_as_text (pfile, &op)); + } + } + + if (node) + { + if (pfile->context != initial_context && CPP_PEDANTIC (pfile)) + cpp_error (pfile, CPP_DL_WARNING, + "this use of \"defined\" may not be portable"); + + _cpp_mark_macro_used (node); + + /* A possible controlling macro of the form #if !defined (). + _cpp_parse_expr checks there was no other junk on the line. */ + pfile->mi_ind_cmacro = node; + } + + pfile->state.prevent_expansion--; + + result.unsignedp = false; + result.high = 0; + result.overflow = false; + result.low = node && node->type == NT_MACRO; + return result; +} + +/* Convert a token into a CPP_NUMBER (an interpreted preprocessing + number or character constant, or the result of the "defined" or "#" + operators). */ +static cpp_num +eval_token (cpp_reader *pfile, const cpp_token *token) +{ + cpp_num result; + unsigned int temp; + int unsignedp = 0; + + result.unsignedp = false; + result.overflow = false; + + switch (token->type) + { + case CPP_NUMBER: + temp = cpp_classify_number (pfile, token); + switch (temp & CPP_N_CATEGORY) + { + case CPP_N_FLOATING: + cpp_error (pfile, CPP_DL_ERROR, + "floating constant in preprocessor expression"); + break; + case CPP_N_INTEGER: + if (!(temp & CPP_N_IMAGINARY)) + return cpp_interpret_integer (pfile, token, temp); + cpp_error (pfile, CPP_DL_ERROR, + "imaginary number in preprocessor expression"); + break; + + case CPP_N_INVALID: + /* Error already issued. */ + break; + } + result.high = result.low = 0; + break; + + case CPP_WCHAR: + case CPP_CHAR: + { + cppchar_t cc = cpp_interpret_charconst (pfile, token, + &temp, &unsignedp); + + result.high = 0; + result.low = cc; + /* Sign-extend the result if necessary. */ + if (!unsignedp && (cppchar_signed_t) cc < 0) + { + if (PART_PRECISION > BITS_PER_CPPCHAR_T) + result.low |= ~(~(cpp_num_part) 0 + >> (PART_PRECISION - BITS_PER_CPPCHAR_T)); + result.high = ~(cpp_num_part) 0; + result = num_trim (result, CPP_OPTION (pfile, precision)); + } + } + break; + + case CPP_NAME: + if (token->val.node == pfile->spec_nodes.n_defined) + return parse_defined (pfile); + else if (CPP_OPTION (pfile, cplusplus) + && (token->val.node == pfile->spec_nodes.n_true + || token->val.node == pfile->spec_nodes.n_false)) + { + result.high = 0; + result.low = (token->val.node == pfile->spec_nodes.n_true); + } + else + { + result.high = 0; + result.low = 0; + if (CPP_OPTION (pfile, warn_undef) && !pfile->state.skip_eval) + cpp_error (pfile, CPP_DL_WARNING, "\"%s\" is not defined", + NODE_NAME (token->val.node)); + } + break; + + default: /* CPP_HASH */ + _cpp_test_assertion (pfile, &temp); + result.high = 0; + result.low = temp; + } + + result.unsignedp = !!unsignedp; + return result; +} + +/* Operator precedence and flags table. + +After an operator is returned from the lexer, if it has priority less +than the operator on the top of the stack, we reduce the stack by one +operator and repeat the test. Since equal priorities do not reduce, +this is naturally right-associative. + +We handle left-associative operators by decrementing the priority of +just-lexed operators by one, but retaining the priority of operators +already on the stack. + +The remaining cases are '(' and ')'. We handle '(' by skipping the +reduction phase completely. ')' is given lower priority than +everything else, including '(', effectively forcing a reduction of the +parenthesized expression. If there is a matching '(', the routine +reduce() exits immediately. If the normal exit route sees a ')', then +there cannot have been a matching '(' and an error message is output. + +The parser assumes all shifted operators require a left operand unless +the flag NO_L_OPERAND is set. These semantics are automatic; any +extra semantics need to be handled with operator-specific code. */ + +/* Flags. If CHECK_PROMOTION, we warn if the effective sign of an + operand changes because of integer promotions. */ +#define NO_L_OPERAND (1 << 0) +#define LEFT_ASSOC (1 << 1) +#define CHECK_PROMOTION (1 << 2) + +/* Operator to priority map. Must be in the same order as the first + N entries of enum cpp_ttype. */ +static const struct cpp_operator +{ + uchar prio; + uchar flags; +} optab[] = +{ + /* EQ */ {0, 0}, /* Shouldn't happen. */ + /* NOT */ {16, NO_L_OPERAND}, + /* GREATER */ {12, LEFT_ASSOC | CHECK_PROMOTION}, + /* LESS */ {12, LEFT_ASSOC | CHECK_PROMOTION}, + /* PLUS */ {14, LEFT_ASSOC | CHECK_PROMOTION}, + /* MINUS */ {14, LEFT_ASSOC | CHECK_PROMOTION}, + /* MULT */ {15, LEFT_ASSOC | CHECK_PROMOTION}, + /* DIV */ {15, LEFT_ASSOC | CHECK_PROMOTION}, + /* MOD */ {15, LEFT_ASSOC | CHECK_PROMOTION}, + /* AND */ {9, LEFT_ASSOC | CHECK_PROMOTION}, + /* OR */ {7, LEFT_ASSOC | CHECK_PROMOTION}, + /* XOR */ {8, LEFT_ASSOC | CHECK_PROMOTION}, + /* RSHIFT */ {13, LEFT_ASSOC}, + /* LSHIFT */ {13, LEFT_ASSOC}, + + /* COMPL */ {16, NO_L_OPERAND}, + /* AND_AND */ {6, LEFT_ASSOC}, + /* OR_OR */ {5, LEFT_ASSOC}, + /* QUERY */ {3, 0}, + /* COLON */ {4, LEFT_ASSOC | CHECK_PROMOTION}, + /* COMMA */ {2, LEFT_ASSOC}, + /* OPEN_PAREN */ {1, NO_L_OPERAND}, + /* CLOSE_PAREN */ {0, 0}, + /* EOF */ {0, 0}, + /* EQ_EQ */ {11, LEFT_ASSOC}, + /* NOT_EQ */ {11, LEFT_ASSOC}, + /* GREATER_EQ */ {12, LEFT_ASSOC | CHECK_PROMOTION}, + /* LESS_EQ */ {12, LEFT_ASSOC | CHECK_PROMOTION}, + /* UPLUS */ {16, NO_L_OPERAND}, + /* UMINUS */ {16, NO_L_OPERAND} +}; + +/* Parse and evaluate a C expression, reading from PFILE. + Returns the truth value of the expression. + + The implementation is an operator precedence parser, i.e. a + bottom-up parser, using a stack for not-yet-reduced tokens. + + The stack base is op_stack, and the current stack pointer is 'top'. + There is a stack element for each operator (only), and the most + recently pushed operator is 'top->op'. An operand (value) is + stored in the 'value' field of the stack element of the operator + that precedes it. */ +bool +_cpp_parse_expr (cpp_reader *pfile) +{ + struct op *top = pfile->op_stack; + unsigned int lex_count; + bool saw_leading_not, want_value = true; + + pfile->state.skip_eval = 0; + + /* Set up detection of #if ! defined(). */ + pfile->mi_ind_cmacro = 0; + saw_leading_not = false; + lex_count = 0; + + /* Lowest priority operator prevents further reductions. */ + top->op = CPP_EOF; + + for (;;) + { + struct op op; + + lex_count++; + op.token = cpp_get_token (pfile); + op.op = op.token->type; + + switch (op.op) + { + /* These tokens convert into values. */ + case CPP_NUMBER: + case CPP_CHAR: + case CPP_WCHAR: + case CPP_NAME: + case CPP_HASH: + if (!want_value) + SYNTAX_ERROR2 ("missing binary operator before token \"%s\"", + cpp_token_as_text (pfile, op.token)); + want_value = false; + top->value = eval_token (pfile, op.token); + continue; + + case CPP_NOT: + saw_leading_not = lex_count == 1; + break; + case CPP_PLUS: + if (want_value) + op.op = CPP_UPLUS; + break; + case CPP_MINUS: + if (want_value) + op.op = CPP_UMINUS; + break; + + default: + if ((int) op.op <= (int) CPP_EQ || (int) op.op >= (int) CPP_PLUS_EQ) + SYNTAX_ERROR2 ("token \"%s\" is not valid in preprocessor expressions", + cpp_token_as_text (pfile, op.token)); + break; + } + + /* Check we have a value or operator as appropriate. */ + if (optab[op.op].flags & NO_L_OPERAND) + { + if (!want_value) + SYNTAX_ERROR2 ("missing binary operator before token \"%s\"", + cpp_token_as_text (pfile, op.token)); + } + else if (want_value) + { + /* We want a number (or expression) and haven't got one. + Try to emit a specific diagnostic. */ + if (op.op == CPP_CLOSE_PAREN && top->op == CPP_OPEN_PAREN) + SYNTAX_ERROR ("missing expression between '(' and ')'"); + + if (op.op == CPP_EOF && top->op == CPP_EOF) + SYNTAX_ERROR ("#if with no expression"); + + if (top->op != CPP_EOF && top->op != CPP_OPEN_PAREN) + SYNTAX_ERROR2 ("operator '%s' has no right operand", + cpp_token_as_text (pfile, top->token)); + else if (op.op == CPP_CLOSE_PAREN || op.op == CPP_EOF) + /* Complain about missing paren during reduction. */; + else + SYNTAX_ERROR2 ("operator '%s' has no left operand", + cpp_token_as_text (pfile, op.token)); + } + + top = reduce (pfile, top, op.op); + if (!top) + goto syntax_error; + + if (op.op == CPP_EOF) + break; + + switch (op.op) + { + case CPP_CLOSE_PAREN: + continue; + case CPP_OR_OR: + if (!num_zerop (top->value)) + pfile->state.skip_eval++; + break; + case CPP_AND_AND: + case CPP_QUERY: + if (num_zerop (top->value)) + pfile->state.skip_eval++; + break; + case CPP_COLON: + if (top->op != CPP_QUERY) + SYNTAX_ERROR (" ':' without preceding '?'"); + if (!num_zerop (top[-1].value)) /* Was '?' condition true? */ + pfile->state.skip_eval++; + else + pfile->state.skip_eval--; + default: + break; + } + + want_value = true; + + /* Check for and handle stack overflow. */ + if (++top == pfile->op_limit) + top = _cpp_expand_op_stack (pfile); + + top->op = op.op; + top->token = op.token; + } + + /* The controlling macro expression is only valid if we called lex 3 + times: and . push_conditional () + checks that we are at top-of-file. */ + if (pfile->mi_ind_cmacro && !(saw_leading_not && lex_count == 3)) + pfile->mi_ind_cmacro = 0; + + if (top != pfile->op_stack) + { + cpp_error (pfile, CPP_DL_ICE, "unbalanced stack in #if"); + syntax_error: + return false; /* Return false on syntax error. */ + } + + return !num_zerop (top->value); +} + +/* Reduce the operator / value stack if possible, in preparation for + pushing operator OP. Returns NULL on error, otherwise the top of + the stack. */ +static struct op * +reduce (cpp_reader *pfile, struct op *top, enum cpp_ttype op) +{ + unsigned int prio; + + if (top->op <= CPP_EQ || top->op > CPP_LAST_CPP_OP + 2) + { + bad_op: + cpp_error (pfile, CPP_DL_ICE, "impossible operator '%u'", top->op); + return 0; + } + + if (op == CPP_OPEN_PAREN) + return top; + + /* Decrement the priority of left-associative operators to force a + reduction with operators of otherwise equal priority. */ + prio = optab[op].prio - ((optab[op].flags & LEFT_ASSOC) != 0); + while (prio < optab[top->op].prio) + { + if (CPP_OPTION (pfile, warn_num_sign_change) + && optab[top->op].flags & CHECK_PROMOTION) + check_promotion (pfile, top); + + switch (top->op) + { + case CPP_UPLUS: + case CPP_UMINUS: + case CPP_NOT: + case CPP_COMPL: + top[-1].value = num_unary_op (pfile, top->value, top->op); + break; + + case CPP_PLUS: + case CPP_MINUS: + case CPP_RSHIFT: + case CPP_LSHIFT: + case CPP_COMMA: + top[-1].value = num_binary_op (pfile, top[-1].value, + top->value, top->op); + break; + + case CPP_GREATER: + case CPP_LESS: + case CPP_GREATER_EQ: + case CPP_LESS_EQ: + top[-1].value + = num_inequality_op (pfile, top[-1].value, top->value, top->op); + break; + + case CPP_EQ_EQ: + case CPP_NOT_EQ: + top[-1].value + = num_equality_op (pfile, top[-1].value, top->value, top->op); + break; + + case CPP_AND: + case CPP_OR: + case CPP_XOR: + top[-1].value + = num_bitwise_op (pfile, top[-1].value, top->value, top->op); + break; + + case CPP_MULT: + top[-1].value = num_mul (pfile, top[-1].value, top->value); + break; + + case CPP_DIV: + case CPP_MOD: + top[-1].value = num_div_op (pfile, top[-1].value, + top->value, top->op); + break; + + case CPP_OR_OR: + top--; + if (!num_zerop (top->value)) + pfile->state.skip_eval--; + top->value.low = (!num_zerop (top->value) + || !num_zerop (top[1].value)); + top->value.high = 0; + top->value.unsignedp = false; + top->value.overflow = false; + continue; + + case CPP_AND_AND: + top--; + if (num_zerop (top->value)) + pfile->state.skip_eval--; + top->value.low = (!num_zerop (top->value) + && !num_zerop (top[1].value)); + top->value.high = 0; + top->value.unsignedp = false; + top->value.overflow = false; + continue; + + case CPP_OPEN_PAREN: + if (op != CPP_CLOSE_PAREN) + { + cpp_error (pfile, CPP_DL_ERROR, "missing ')' in expression"); + return 0; + } + top--; + top->value = top[1].value; + return top; + + case CPP_COLON: + top -= 2; + if (!num_zerop (top->value)) + { + pfile->state.skip_eval--; + top->value = top[1].value; + } + else + top->value = top[2].value; + top->value.unsignedp = (top[1].value.unsignedp + || top[2].value.unsignedp); + continue; + + case CPP_QUERY: + cpp_error (pfile, CPP_DL_ERROR, "'?' without following ':'"); + return 0; + + default: + goto bad_op; + } + + top--; + if (top->value.overflow && !pfile->state.skip_eval) + cpp_error (pfile, CPP_DL_PEDWARN, + "integer overflow in preprocessor expression"); + } + + if (op == CPP_CLOSE_PAREN) + { + cpp_error (pfile, CPP_DL_ERROR, "missing '(' in expression"); + return 0; + } + + return top; +} + +/* Returns the position of the old top of stack after expansion. */ +struct op * +_cpp_expand_op_stack (cpp_reader *pfile) +{ + size_t old_size = (size_t) (pfile->op_limit - pfile->op_stack); + size_t new_size = old_size * 2 + 20; + + pfile->op_stack = XRESIZEVEC (struct op, pfile->op_stack, new_size); + pfile->op_limit = pfile->op_stack + new_size; + + return pfile->op_stack + old_size; +} + +/* Emits a warning if the effective sign of either operand of OP + changes because of integer promotions. */ +static void +check_promotion (cpp_reader *pfile, const struct op *op) +{ + if (op->value.unsignedp == op[-1].value.unsignedp) + return; + + if (op->value.unsignedp) + { + if (!num_positive (op[-1].value, CPP_OPTION (pfile, precision))) + cpp_error (pfile, CPP_DL_WARNING, + "the left operand of \"%s\" changes sign when promoted", + cpp_token_as_text (pfile, op->token)); + } + else if (!num_positive (op->value, CPP_OPTION (pfile, precision))) + cpp_error (pfile, CPP_DL_WARNING, + "the right operand of \"%s\" changes sign when promoted", + cpp_token_as_text (pfile, op->token)); +} + +/* Clears the unused high order bits of the number pointed to by PNUM. */ +static cpp_num +num_trim (cpp_num num, size_t precision) +{ + if (precision > PART_PRECISION) + { + precision -= PART_PRECISION; + if (precision < PART_PRECISION) + num.high &= ((cpp_num_part) 1 << precision) - 1; + } + else + { + if (precision < PART_PRECISION) + num.low &= ((cpp_num_part) 1 << precision) - 1; + num.high = 0; + } + + return num; +} + +/* True iff A (presumed signed) >= 0. */ +static bool +num_positive (cpp_num num, size_t precision) +{ + if (precision > PART_PRECISION) + { + precision -= PART_PRECISION; + return (num.high & (cpp_num_part) 1 << (precision - 1)) == 0; + } + + return (num.low & (cpp_num_part) 1 << (precision - 1)) == 0; +} + +/* Sign extend a number, with PRECISION significant bits and all + others assumed clear, to fill out a cpp_num structure. */ +cpp_num +cpp_num_sign_extend (cpp_num num, size_t precision) +{ + if (!num.unsignedp) + { + if (precision > PART_PRECISION) + { + precision -= PART_PRECISION; + if (precision < PART_PRECISION + && (num.high & (cpp_num_part) 1 << (precision - 1))) + num.high |= ~(~(cpp_num_part) 0 >> (PART_PRECISION - precision)); + } + else if (num.low & (cpp_num_part) 1 << (precision - 1)) + { + if (precision < PART_PRECISION) + num.low |= ~(~(cpp_num_part) 0 >> (PART_PRECISION - precision)); + num.high = ~(cpp_num_part) 0; + } + } + + return num; +} + +/* Returns the negative of NUM. */ +static cpp_num +num_negate (cpp_num num, size_t precision) +{ + cpp_num copy; + + copy = num; + num.high = ~num.high; + num.low = ~num.low; + if (++num.low == 0) + num.high++; + num = num_trim (num, precision); + num.overflow = (!num.unsignedp && num_eq (num, copy) && !num_zerop (num)); + + return num; +} + +/* Returns true if A >= B. */ +static bool +num_greater_eq (cpp_num pa, cpp_num pb, size_t precision) +{ + bool unsignedp; + + unsignedp = pa.unsignedp || pb.unsignedp; + + if (!unsignedp) + { + /* Both numbers have signed type. If they are of different + sign, the answer is the sign of A. */ + unsignedp = num_positive (pa, precision); + + if (unsignedp != num_positive (pb, precision)) + return unsignedp; + + /* Otherwise we can do an unsigned comparison. */ + } + + return (pa.high > pb.high) || (pa.high == pb.high && pa.low >= pb.low); +} + +/* Returns LHS OP RHS, where OP is a bit-wise operation. */ +static cpp_num +num_bitwise_op (cpp_reader *pfile ATTRIBUTE_UNUSED, + cpp_num lhs, cpp_num rhs, enum cpp_ttype op) +{ + lhs.overflow = false; + lhs.unsignedp = lhs.unsignedp || rhs.unsignedp; + + /* As excess precision is zeroed, there is no need to num_trim () as + these operations cannot introduce a set bit there. */ + if (op == CPP_AND) + { + lhs.low &= rhs.low; + lhs.high &= rhs.high; + } + else if (op == CPP_OR) + { + lhs.low |= rhs.low; + lhs.high |= rhs.high; + } + else + { + lhs.low ^= rhs.low; + lhs.high ^= rhs.high; + } + + return lhs; +} + +/* Returns LHS OP RHS, where OP is an inequality. */ +static cpp_num +num_inequality_op (cpp_reader *pfile, cpp_num lhs, cpp_num rhs, + enum cpp_ttype op) +{ + bool gte = num_greater_eq (lhs, rhs, CPP_OPTION (pfile, precision)); + + if (op == CPP_GREATER_EQ) + lhs.low = gte; + else if (op == CPP_LESS) + lhs.low = !gte; + else if (op == CPP_GREATER) + lhs.low = gte && !num_eq (lhs, rhs); + else /* CPP_LESS_EQ. */ + lhs.low = !gte || num_eq (lhs, rhs); + + lhs.high = 0; + lhs.overflow = false; + lhs.unsignedp = false; + return lhs; +} + +/* Returns LHS OP RHS, where OP is == or !=. */ +static cpp_num +num_equality_op (cpp_reader *pfile ATTRIBUTE_UNUSED, + cpp_num lhs, cpp_num rhs, enum cpp_ttype op) +{ + /* Work around a 3.0.4 bug; see PR 6950. */ + bool eq = num_eq (lhs, rhs); + if (op == CPP_NOT_EQ) + eq = !eq; + lhs.low = eq; + lhs.high = 0; + lhs.overflow = false; + lhs.unsignedp = false; + return lhs; +} + +/* Shift NUM, of width PRECISION, right by N bits. */ +static cpp_num +num_rshift (cpp_num num, size_t precision, size_t n) +{ + cpp_num_part sign_mask; + bool x = num_positive (num, precision); + + if (num.unsignedp || x) + sign_mask = 0; + else + sign_mask = ~(cpp_num_part) 0; + + if (n >= precision) + num.high = num.low = sign_mask; + else + { + /* Sign-extend. */ + if (precision < PART_PRECISION) + num.high = sign_mask, num.low |= sign_mask << precision; + else if (precision < 2 * PART_PRECISION) + num.high |= sign_mask << (precision - PART_PRECISION); + + if (n >= PART_PRECISION) + { + n -= PART_PRECISION; + num.low = num.high; + num.high = sign_mask; + } + + if (n) + { + num.low = (num.low >> n) | (num.high << (PART_PRECISION - n)); + num.high = (num.high >> n) | (sign_mask << (PART_PRECISION - n)); + } + } + + num = num_trim (num, precision); + num.overflow = false; + return num; +} + +/* Shift NUM, of width PRECISION, left by N bits. */ +static cpp_num +num_lshift (cpp_num num, size_t precision, size_t n) +{ + if (n >= precision) + { + num.overflow = !num.unsignedp && !num_zerop (num); + num.high = num.low = 0; + } + else + { + cpp_num orig, maybe_orig; + size_t m = n; + + orig = num; + if (m >= PART_PRECISION) + { + m -= PART_PRECISION; + num.high = num.low; + num.low = 0; + } + if (m) + { + num.high = (num.high << m) | (num.low >> (PART_PRECISION - m)); + num.low <<= m; + } + num = num_trim (num, precision); + + if (num.unsignedp) + num.overflow = false; + else + { + maybe_orig = num_rshift (num, precision, n); + num.overflow = !num_eq (orig, maybe_orig); + } + } + + return num; +} + +/* The four unary operators: +, -, ! and ~. */ +static cpp_num +num_unary_op (cpp_reader *pfile, cpp_num num, enum cpp_ttype op) +{ + switch (op) + { + case CPP_UPLUS: + if (CPP_WTRADITIONAL (pfile) && !pfile->state.skip_eval) + cpp_error (pfile, CPP_DL_WARNING, + "traditional C rejects the unary plus operator"); + num.overflow = false; + break; + + case CPP_UMINUS: + num = num_negate (num, CPP_OPTION (pfile, precision)); + break; + + case CPP_COMPL: + num.high = ~num.high; + num.low = ~num.low; + num = num_trim (num, CPP_OPTION (pfile, precision)); + num.overflow = false; + break; + + default: /* case CPP_NOT: */ + num.low = num_zerop (num); + num.high = 0; + num.overflow = false; + num.unsignedp = false; + break; + } + + return num; +} + +/* The various binary operators. */ +static cpp_num +num_binary_op (cpp_reader *pfile, cpp_num lhs, cpp_num rhs, enum cpp_ttype op) +{ + cpp_num result; + size_t precision = CPP_OPTION (pfile, precision); + size_t n; + + switch (op) + { + /* Shifts. */ + case CPP_LSHIFT: + case CPP_RSHIFT: + if (!rhs.unsignedp && !num_positive (rhs, precision)) + { + /* A negative shift is a positive shift the other way. */ + if (op == CPP_LSHIFT) + op = CPP_RSHIFT; + else + op = CPP_LSHIFT; + rhs = num_negate (rhs, precision); + } + if (rhs.high) + n = ~0; /* Maximal. */ + else + n = rhs.low; + if (op == CPP_LSHIFT) + lhs = num_lshift (lhs, precision, n); + else + lhs = num_rshift (lhs, precision, n); + break; + + /* Arithmetic. */ + case CPP_MINUS: + rhs = num_negate (rhs, precision); + case CPP_PLUS: + result.low = lhs.low + rhs.low; + result.high = lhs.high + rhs.high; + if (result.low < lhs.low) + result.high++; + result.unsignedp = lhs.unsignedp || rhs.unsignedp; + result.overflow = false; + + result = num_trim (result, precision); + if (!result.unsignedp) + { + bool lhsp = num_positive (lhs, precision); + result.overflow = (lhsp == num_positive (rhs, precision) + && lhsp != num_positive (result, precision)); + } + return result; + + /* Comma. */ + default: /* case CPP_COMMA: */ + if (CPP_PEDANTIC (pfile) && (!CPP_OPTION (pfile, c99) + || !pfile->state.skip_eval)) + cpp_error (pfile, CPP_DL_PEDWARN, + "comma operator in operand of #if"); + lhs = rhs; + break; + } + + return lhs; +} + +/* Multiplies two unsigned cpp_num_parts to give a cpp_num. This + cannot overflow. */ +static cpp_num +num_part_mul (cpp_num_part lhs, cpp_num_part rhs) +{ + cpp_num result; + cpp_num_part middle[2], temp; + + result.low = LOW_PART (lhs) * LOW_PART (rhs); + result.high = HIGH_PART (lhs) * HIGH_PART (rhs); + + middle[0] = LOW_PART (lhs) * HIGH_PART (rhs); + middle[1] = HIGH_PART (lhs) * LOW_PART (rhs); + + temp = result.low; + result.low += LOW_PART (middle[0]) << (PART_PRECISION / 2); + if (result.low < temp) + result.high++; + + temp = result.low; + result.low += LOW_PART (middle[1]) << (PART_PRECISION / 2); + if (result.low < temp) + result.high++; + + result.high += HIGH_PART (middle[0]); + result.high += HIGH_PART (middle[1]); + result.unsignedp = true; + result.overflow = false; + + return result; +} + +/* Multiply two preprocessing numbers. */ +static cpp_num +num_mul (cpp_reader *pfile, cpp_num lhs, cpp_num rhs) +{ + cpp_num result, temp; + bool unsignedp = lhs.unsignedp || rhs.unsignedp; + bool overflow, negate = false; + size_t precision = CPP_OPTION (pfile, precision); + + /* Prepare for unsigned multiplication. */ + if (!unsignedp) + { + if (!num_positive (lhs, precision)) + negate = !negate, lhs = num_negate (lhs, precision); + if (!num_positive (rhs, precision)) + negate = !negate, rhs = num_negate (rhs, precision); + } + + overflow = lhs.high && rhs.high; + result = num_part_mul (lhs.low, rhs.low); + + temp = num_part_mul (lhs.high, rhs.low); + result.high += temp.low; + if (temp.high) + overflow = true; + + temp = num_part_mul (lhs.low, rhs.high); + result.high += temp.low; + if (temp.high) + overflow = true; + + temp.low = result.low, temp.high = result.high; + result = num_trim (result, precision); + if (!num_eq (result, temp)) + overflow = true; + + if (negate) + result = num_negate (result, precision); + + if (unsignedp) + result.overflow = false; + else + result.overflow = overflow || (num_positive (result, precision) ^ !negate + && !num_zerop (result)); + result.unsignedp = unsignedp; + + return result; +} + +/* Divide two preprocessing numbers, returning the answer or the + remainder depending upon OP. */ +static cpp_num +num_div_op (cpp_reader *pfile, cpp_num lhs, cpp_num rhs, enum cpp_ttype op) +{ + cpp_num result, sub; + cpp_num_part mask; + bool unsignedp = lhs.unsignedp || rhs.unsignedp; + bool negate = false, lhs_neg = false; + size_t i, precision = CPP_OPTION (pfile, precision); + + /* Prepare for unsigned division. */ + if (!unsignedp) + { + if (!num_positive (lhs, precision)) + negate = !negate, lhs_neg = true, lhs = num_negate (lhs, precision); + if (!num_positive (rhs, precision)) + negate = !negate, rhs = num_negate (rhs, precision); + } + + /* Find the high bit. */ + if (rhs.high) + { + i = precision - 1; + mask = (cpp_num_part) 1 << (i - PART_PRECISION); + for (; ; i--, mask >>= 1) + if (rhs.high & mask) + break; + } + else if (rhs.low) + { + if (precision > PART_PRECISION) + i = precision - PART_PRECISION - 1; + else + i = precision - 1; + mask = (cpp_num_part) 1 << i; + for (; ; i--, mask >>= 1) + if (rhs.low & mask) + break; + } + else + { + if (!pfile->state.skip_eval) + cpp_error (pfile, CPP_DL_ERROR, "division by zero in #if"); + return lhs; + } + + /* First nonzero bit of RHS is bit I. Do naive division by + shifting the RHS fully left, and subtracting from LHS if LHS is + at least as big, and then repeating but with one less shift. + This is not very efficient, but is easy to understand. */ + + rhs.unsignedp = true; + lhs.unsignedp = true; + i = precision - i - 1; + sub = num_lshift (rhs, precision, i); + + result.high = result.low = 0; + for (;;) + { + if (num_greater_eq (lhs, sub, precision)) + { + lhs = num_binary_op (pfile, lhs, sub, CPP_MINUS); + if (i >= PART_PRECISION) + result.high |= (cpp_num_part) 1 << (i - PART_PRECISION); + else + result.low |= (cpp_num_part) 1 << i; + } + if (i-- == 0) + break; + sub.low = (sub.low >> 1) | (sub.high << (PART_PRECISION - 1)); + sub.high >>= 1; + } + + /* We divide so that the remainder has the sign of the LHS. */ + if (op == CPP_DIV) + { + result.unsignedp = unsignedp; + result.overflow = false; + if (!unsignedp) + { + if (negate) + result = num_negate (result, precision); + result.overflow = (num_positive (result, precision) ^ !negate + && !num_zerop (result)); + } + + return result; + } + + /* CPP_MOD. */ + lhs.unsignedp = unsignedp; + lhs.overflow = false; + if (lhs_neg) + lhs = num_negate (lhs, precision); + + return lhs; +} diff --git a/libcpp/files.c b/libcpp/files.c new file mode 100644 index 0000000..467bb14 --- /dev/null +++ b/libcpp/files.c @@ -0,0 +1,1769 @@ +/* Part of CPP library. File handling. + Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1998, + 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 + Free Software Foundation, Inc. + Written by Per Bothner, 1994. + Based on CCCP program by Paul Rubin, June 1986 + Adapted to ANSI C, Richard Stallman, Jan 1987 + Split out of cpplib.c, Zack Weinberg, Oct 1998 + Reimplemented, Neil Booth, Jul 2003 + +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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include "config.h" +#include "system.h" +#include "cpplib.h" +#include "internal.h" +#include "mkdeps.h" +#include "obstack.h" +#include "hashtab.h" +#include "md5.h" +#include + +/* Variable length record files on VMS will have a stat size that includes + record control characters that won't be included in the read size. */ +#ifdef VMS +# define FAB_C_VAR 2 /* variable length records (see Starlet fabdef.h) */ +# define STAT_SIZE_RELIABLE(ST) ((ST).st_fab_rfm != FAB_C_VAR) +#else +# define STAT_SIZE_RELIABLE(ST) true +#endif + +#ifdef __DJGPP__ +#include + /* For DJGPP redirected input is opened in text mode. */ +# define set_stdin_to_binary_mode() \ + if (! isatty (0)) setmode (0, O_BINARY) +#else +# define set_stdin_to_binary_mode() /* Nothing */ +#endif + +/* This structure represents a file searched for by CPP, whether it + exists or not. An instance may be pointed to by more than one + file_hash_entry; at present no reference count is kept. */ +struct _cpp_file +{ + /* Filename as given to #include or command line switch. */ + const char *name; + + /* The full path used to find the file. */ + const char *path; + + /* The full path of the pch file. */ + const char *pchname; + + /* The file's path with the basename stripped. NULL if it hasn't + been calculated yet. */ + const char *dir_name; + + /* Chain through all files. */ + struct _cpp_file *next_file; + + /* The contents of NAME after calling read_file(). */ + const uchar *buffer; + + /* The macro, if any, preventing re-inclusion. */ + const cpp_hashnode *cmacro; + + /* The directory in the search path where FILE was found. Used for + #include_next and determining whether a header is a system + header. */ + cpp_dir *dir; + + /* As filled in by stat(2) for the file. */ + struct stat st; + + /* File descriptor. Invalid if -1, otherwise open. */ + int fd; + + /* Zero if this file was successfully opened and stat()-ed, + otherwise errno obtained from failure. */ + int err_no; + + /* Number of times the file has been stacked for preprocessing. */ + unsigned short stack_count; + + /* If opened with #import or contains #pragma once. */ + bool once_only; + + /* If read() failed before. */ + bool dont_read; + + /* If this file is the main file. */ + bool main_file; + + /* If BUFFER above contains the true contents of the file. */ + bool buffer_valid; + + /* File is a PCH (on return from find_include_file). */ + bool pch; +}; + +/* A singly-linked list for all searches for a given file name, with + its head pointed to by a slot in FILE_HASH. The file name is what + appeared between the quotes in a #include directive; it can be + determined implicitly from the hash table location or explicitly + from FILE->name. + + FILE is a structure containing details about the file that was + found with that search, or details of how the search failed. + + START_DIR is the starting location of the search in the include + chain. The current directories for "" includes are also hashed in + the hash table and therefore unique. Files that are looked up + without using a search path, such as absolute filenames and file + names from the command line share a special starting directory so + they don't cause cache hits with normal include-chain lookups. + + If START_DIR is NULL then the entry is for a directory, not a file, + and the directory is in DIR. Since the starting point in a file + lookup chain is never NULL, this means that simple pointer + comparisons against START_DIR can be made to determine cache hits + in file lookups. + + If a cache lookup fails because of e.g. an extra "./" in the path, + then nothing will break. It is just less efficient as CPP will + have to do more work re-preprocessing the file, and/or comparing + its contents against earlier once-only files. +*/ +struct file_hash_entry +{ + struct file_hash_entry *next; + cpp_dir *start_dir; + source_location location; + union + { + _cpp_file *file; + cpp_dir *dir; + } u; +}; + +/* Number of entries to put in a file_hash_entry pool. */ +#define FILE_HASH_POOL_SIZE 127 + +/* A file hash entry pool. We allocate file_hash_entry object from + one of these. */ +struct file_hash_entry_pool +{ + /* Number of entries used from this pool. */ + unsigned int file_hash_entries_used; + /* Next pool in the chain; used when freeing. */ + struct file_hash_entry_pool *next; + /* The memory pool. */ + struct file_hash_entry pool[FILE_HASH_POOL_SIZE]; +}; + +static bool open_file (_cpp_file *file); +static bool pch_open_file (cpp_reader *pfile, _cpp_file *file, + bool *invalid_pch); +static bool find_file_in_dir (cpp_reader *pfile, _cpp_file *file, + bool *invalid_pch); +static bool read_file_guts (cpp_reader *pfile, _cpp_file *file); +static bool read_file (cpp_reader *pfile, _cpp_file *file); +static bool should_stack_file (cpp_reader *, _cpp_file *file, bool import); +static struct cpp_dir *search_path_head (cpp_reader *, const char *fname, + int angle_brackets, enum include_type); +static const char *dir_name_of_file (_cpp_file *file); +static void open_file_failed (cpp_reader *pfile, _cpp_file *file, int); +static struct file_hash_entry *search_cache (struct file_hash_entry *head, + const cpp_dir *start_dir); +static _cpp_file *make_cpp_file (cpp_reader *, cpp_dir *, const char *fname); +static void destroy_cpp_file (_cpp_file *); +static cpp_dir *make_cpp_dir (cpp_reader *, const char *dir_name, int sysp); +static void allocate_file_hash_entries (cpp_reader *pfile); +static struct file_hash_entry *new_file_hash_entry (cpp_reader *pfile); +static int report_missing_guard (void **slot, void *b); +static hashval_t file_hash_hash (const void *p); +static int file_hash_eq (const void *p, const void *q); +static char *read_filename_string (int ch, FILE *f); +static void read_name_map (cpp_dir *dir); +static char *remap_filename (cpp_reader *pfile, _cpp_file *file); +static char *append_file_to_dir (const char *fname, cpp_dir *dir); +static bool validate_pch (cpp_reader *, _cpp_file *file, const char *pchname); +static int pchf_save_compare (const void *e1, const void *e2); +static int pchf_compare (const void *d_p, const void *e_p); +static bool check_file_against_entries (cpp_reader *, _cpp_file *, bool); + +/* Given a filename in FILE->PATH, with the empty string interpreted + as , open it. + + On success FILE contains an open file descriptor and stat + information for the file. On failure the file descriptor is -1 and + the appropriate errno is also stored in FILE. Returns TRUE iff + successful. + + We used to open files in nonblocking mode, but that caused more + problems than it solved. Do take care not to acquire a controlling + terminal by mistake (this can't happen on sane systems, but + paranoia is a virtue). + + Use the three-argument form of open even though we aren't + specifying O_CREAT, to defend against broken system headers. + + O_BINARY tells some runtime libraries (notably DJGPP) not to do + newline translation; we can handle DOS line breaks just fine + ourselves. */ +static bool +open_file (_cpp_file *file) +{ + if (file->path[0] == '\0') + { + file->fd = 0; + set_stdin_to_binary_mode (); + } + else + file->fd = open (file->path, O_RDONLY | O_NOCTTY | O_BINARY, 0666); + + if (file->fd != -1) + { + if (fstat (file->fd, &file->st) == 0) + { + if (!S_ISDIR (file->st.st_mode)) + { + file->err_no = 0; + return true; + } + + /* Ignore a directory and continue the search. The file we're + looking for may be elsewhere in the search path. */ + errno = ENOENT; + } + + close (file->fd); + file->fd = -1; + } +#if defined(_WIN32) && !defined(__CYGWIN__) + else if (errno == EACCES) + { + /* On most UNIX systems, open succeeds on a directory. Above, + we check if we have opened a directory and if so, set errno + to ENOENT. However, on Windows, opening a directory + fails with EACCES. We want to return ENOENT in that + case too. */ + if (stat (file->path, &file->st) == 0 + && S_ISDIR (file->st.st_mode)) + errno = ENOENT; + else + /* The call to stat may have reset errno. */ + errno = EACCES; + } +#endif + else if (errno == ENOTDIR) + errno = ENOENT; + + file->err_no = errno; + + return false; +} + +/* Temporary PCH intercept of opening a file. Try to find a PCH file + based on FILE->name and FILE->dir, and test those found for + validity using PFILE->cb.valid_pch. Return true iff a valid file is + found. Set *INVALID_PCH if a PCH file is found but wasn't valid. */ + +static bool +pch_open_file (cpp_reader *pfile, _cpp_file *file, bool *invalid_pch) +{ + static const char extension[] = ".gch"; + const char *path = file->path; + size_t len, flen; + char *pchname; + struct stat st; + bool valid = false; + + /* No PCH on or if not requested. */ + if (file->name[0] == '\0' || !pfile->cb.valid_pch) + return false; + + flen = strlen (path); + len = flen + sizeof (extension); + pchname = XNEWVEC (char, len); + memcpy (pchname, path, flen); + memcpy (pchname + flen, extension, sizeof (extension)); + + if (stat (pchname, &st) == 0) + { + DIR *pchdir; + struct dirent *d; + size_t dlen, plen = len; + + if (!S_ISDIR (st.st_mode)) + valid = validate_pch (pfile, file, pchname); + else if ((pchdir = opendir (pchname)) != NULL) + { + pchname[plen - 1] = '/'; + while ((d = readdir (pchdir)) != NULL) + { + dlen = strlen (d->d_name) + 1; + if ((strcmp (d->d_name, ".") == 0) + || (strcmp (d->d_name, "..") == 0)) + continue; + if (dlen + plen > len) + { + len += dlen + 64; + pchname = XRESIZEVEC (char, pchname, len); + } + memcpy (pchname + plen, d->d_name, dlen); + valid = validate_pch (pfile, file, pchname); + if (valid) + break; + } + closedir (pchdir); + } + if (valid) + file->pch = true; + else + *invalid_pch = true; + } + + if (valid) + file->pchname = pchname; + else + free (pchname); + + return valid; +} + +/* Try to open the path FILE->name appended to FILE->dir. This is + where remap and PCH intercept the file lookup process. Return true + if the file was found, whether or not the open was successful. + Set *INVALID_PCH to true if a PCH file is found but wasn't valid. */ + +static bool +find_file_in_dir (cpp_reader *pfile, _cpp_file *file, bool *invalid_pch) +{ + char *path; + + if (CPP_OPTION (pfile, remap) && (path = remap_filename (pfile, file))) + ; + else + if (file->dir->construct) + path = file->dir->construct (file->name, file->dir); + else + path = append_file_to_dir (file->name, file->dir); + + if (path) + { + hashval_t hv = htab_hash_string (path); + char *copy; + void **pp; + + if (htab_find_with_hash (pfile->nonexistent_file_hash, path, hv) != NULL) + { + file->err_no = ENOENT; + return false; + } + + file->path = path; + if (pch_open_file (pfile, file, invalid_pch)) + return true; + + if (open_file (file)) + return true; + + if (file->err_no != ENOENT) + { + open_file_failed (pfile, file, 0); + return true; + } + + /* We copy the path name onto an obstack partly so that we don't + leak the memory, but mostly so that we don't fragment the + heap. */ + copy = obstack_copy0 (&pfile->nonexistent_file_ob, path, + strlen (path)); + free (path); + pp = htab_find_slot_with_hash (pfile->nonexistent_file_hash, + copy, hv, INSERT); + *pp = copy; + + file->path = file->name; + } + else + { + file->err_no = ENOENT; + file->path = NULL; + } + + return false; +} + +/* Return tue iff the missing_header callback found the given HEADER. */ +static bool +search_path_exhausted (cpp_reader *pfile, const char *header, _cpp_file *file) +{ + missing_header_cb func = pfile->cb.missing_header; + + /* When the regular search path doesn't work, try context dependent + headers search paths. */ + if (func + && file->dir == NULL) + { + if ((file->path = func (pfile, header, &file->dir)) != NULL) + { + if (open_file (file)) + return true; + free ((void *)file->path); + } + file->path = file->name; + } + + return false; +} + +bool +_cpp_find_failed (_cpp_file *file) +{ + return file->err_no != 0; +} + +/* Given a filename FNAME search for such a file in the include path + starting from START_DIR. If FNAME is the empty string it is + interpreted as STDIN if START_DIR is PFILE->no_search_path. + + If the file is not found in the file cache fall back to the O/S and + add the result to our cache. + + If the file was not found in the filesystem, or there was an error + opening it, then ERR_NO is nonzero and FD is -1. If the file was + found, then ERR_NO is zero and FD could be -1 or an open file + descriptor. FD can be -1 if the file was found in the cache and + had previously been closed. To open it again pass the return value + to open_file(). +*/ +_cpp_file * +_cpp_find_file (cpp_reader *pfile, const char *fname, cpp_dir *start_dir, bool fake, int angle_brackets) +{ + struct file_hash_entry *entry, **hash_slot; + _cpp_file *file; + bool invalid_pch = false; + bool saw_bracket_include = false; + bool saw_quote_include = false; + struct cpp_dir *found_in_cache = NULL; + + /* Ensure we get no confusion between cached files and directories. */ + if (start_dir == NULL) + cpp_error (pfile, CPP_DL_ICE, "NULL directory in find_file"); + + hash_slot = (struct file_hash_entry **) + htab_find_slot_with_hash (pfile->file_hash, fname, + htab_hash_string (fname), + INSERT); + + /* First check the cache before we resort to memory allocation. */ + entry = search_cache (*hash_slot, start_dir); + if (entry) + return entry->u.file; + + file = make_cpp_file (pfile, start_dir, fname); + + /* Try each path in the include chain. */ + for (; !fake ;) + { + if (find_file_in_dir (pfile, file, &invalid_pch)) + break; + + file->dir = file->dir->next; + if (file->dir == NULL) + { + if (search_path_exhausted (pfile, fname, file)) + { + /* Although this file must not go in the cache, because + the file found might depend on things (like the current file) + that aren't represented in the cache, it still has to go in + the list of all files so that #import works. */ + file->next_file = pfile->all_files; + pfile->all_files = file; + return file; + } + + open_file_failed (pfile, file, angle_brackets); + if (invalid_pch) + { + cpp_error (pfile, CPP_DL_ERROR, + "one or more PCH files were found, but they were invalid"); + if (!cpp_get_options (pfile)->warn_invalid_pch) + cpp_error (pfile, CPP_DL_ERROR, + "use -Winvalid-pch for more information"); + } + break; + } + + /* Only check the cache for the starting location (done above) + and the quote and bracket chain heads because there are no + other possible starting points for searches. */ + if (file->dir == pfile->bracket_include) + saw_bracket_include = true; + else if (file->dir == pfile->quote_include) + saw_quote_include = true; + else + continue; + + entry = search_cache (*hash_slot, file->dir); + if (entry) + { + found_in_cache = file->dir; + break; + } + } + + if (entry) + { + /* Cache for START_DIR too, sharing the _cpp_file structure. */ + free ((char *) file->name); + free (file); + file = entry->u.file; + } + else + { + /* This is a new file; put it in the list. */ + file->next_file = pfile->all_files; + pfile->all_files = file; + } + + /* Store this new result in the hash table. */ + entry = new_file_hash_entry (pfile); + entry->next = *hash_slot; + entry->start_dir = start_dir; + entry->location = pfile->line_table->highest_location; + entry->u.file = file; + *hash_slot = entry; + + /* If we passed the quote or bracket chain heads, cache them also. + This speeds up processing if there are lots of -I options. */ + if (saw_bracket_include + && pfile->bracket_include != start_dir + && found_in_cache != pfile->bracket_include) + { + entry = new_file_hash_entry (pfile); + entry->next = *hash_slot; + entry->start_dir = pfile->bracket_include; + entry->location = pfile->line_table->highest_location; + entry->u.file = file; + *hash_slot = entry; + } + if (saw_quote_include + && pfile->quote_include != start_dir + && found_in_cache != pfile->quote_include) + { + entry = new_file_hash_entry (pfile); + entry->next = *hash_slot; + entry->start_dir = pfile->quote_include; + entry->location = pfile->line_table->highest_location; + entry->u.file = file; + *hash_slot = entry; + } + + return file; +} + +/* Read a file into FILE->buffer, returning true on success. + + If FILE->fd is something weird, like a block device, we don't want + to read it at all. Don't even try to figure out what something is, + except for plain files and block devices, since there is no + reliable portable way of doing this. + + FIXME: Flush file cache and try again if we run out of memory. */ +static bool +read_file_guts (cpp_reader *pfile, _cpp_file *file) +{ + ssize_t size, total, count; + uchar *buf; + bool regular; + + if (S_ISBLK (file->st.st_mode)) + { + cpp_error (pfile, CPP_DL_ERROR, "%s is a block device", file->path); + return false; + } + + regular = S_ISREG (file->st.st_mode); + if (regular) + { + /* off_t might have a wider range than ssize_t - in other words, + the max size of a file might be bigger than the address + space. We can't handle a file that large. (Anyone with + a single source file bigger than 2GB needs to rethink + their coding style.) Some systems (e.g. AIX 4.1) define + SSIZE_MAX to be much smaller than the actual range of the + type. Use INTTYPE_MAXIMUM unconditionally to ensure this + does not bite us. */ + if (file->st.st_size > INTTYPE_MAXIMUM (ssize_t)) + { + cpp_error (pfile, CPP_DL_ERROR, "%s is too large", file->path); + return false; + } + + size = file->st.st_size; + } + else + /* 8 kilobytes is a sensible starting size. It ought to be bigger + than the kernel pipe buffer, and it's definitely bigger than + the majority of C source files. */ + size = 8 * 1024; + + buf = XNEWVEC (uchar, size + 1); + total = 0; + while ((count = read (file->fd, buf + total, size - total)) > 0) + { + total += count; + + if (total == size) + { + if (regular) + break; + size *= 2; + buf = XRESIZEVEC (uchar, buf, size + 1); + } + } + + if (count < 0) + { + cpp_errno (pfile, CPP_DL_ERROR, file->path); + return false; + } + + if (regular && total != size && STAT_SIZE_RELIABLE (file->st)) + cpp_error (pfile, CPP_DL_WARNING, + "%s is shorter than expected", file->path); + + file->buffer = _cpp_convert_input (pfile, CPP_OPTION (pfile, input_charset), + buf, size, total, &file->st.st_size); + file->buffer_valid = true; + + return true; +} + +/* Convenience wrapper around read_file_guts that opens the file if + necessary and closes the file descriptor after reading. FILE must + have been passed through find_file() at some stage. */ +static bool +read_file (cpp_reader *pfile, _cpp_file *file) +{ + /* If we already have its contents in memory, succeed immediately. */ + if (file->buffer_valid) + return true; + + /* If an earlier read failed for some reason don't try again. */ + if (file->dont_read || file->err_no) + return false; + + if (file->fd == -1 && !open_file (file)) + { + open_file_failed (pfile, file, 0); + return false; + } + + file->dont_read = !read_file_guts (pfile, file); + close (file->fd); + file->fd = -1; + + return !file->dont_read; +} + +/* Returns TRUE if FILE's contents have been successfully placed in + FILE->buffer and the file should be stacked, otherwise false. */ +static bool +should_stack_file (cpp_reader *pfile, _cpp_file *file, bool import) +{ + _cpp_file *f; + + /* Skip once-only files. */ + if (file->once_only) + return false; + + /* We must mark the file once-only if #import now, before header + guard checks. Otherwise, undefining the header guard might + cause the file to be re-stacked. */ + if (import) + { + _cpp_mark_file_once_only (pfile, file); + + /* Don't stack files that have been stacked before. */ + if (file->stack_count) + return false; + } + + /* Skip if the file had a header guard and the macro is defined. + PCH relies on this appearing before the PCH handler below. */ + if (file->cmacro && file->cmacro->type == NT_MACRO) + return false; + + /* Handle PCH files immediately; don't stack them. */ + if (file->pch) + { + pfile->cb.read_pch (pfile, file->pchname, file->fd, file->path); + close (file->fd); + file->fd = -1; + return false; + } + + if (!read_file (pfile, file)) + return false; + + /* Check the file against the PCH file. This is done before + checking against files we've already seen, since it may save on + I/O. */ + if (check_file_against_entries (pfile, file, import)) + { + /* If this isn't a #import, but yet we can't include the file, + that means that it was #import-ed in the PCH file, + so we can never include it again. */ + if (! import) + _cpp_mark_file_once_only (pfile, file); + return false; + } + + /* Now we've read the file's contents, we can stack it if there + are no once-only files. */ + if (!pfile->seen_once_only) + return true; + + /* We may have read the file under a different name. Look + for likely candidates and compare file contents to be sure. */ + for (f = pfile->all_files; f; f = f->next_file) + { + if (f == file) + continue; + + if ((import || f->once_only) + && f->err_no == 0 + && f->st.st_mtime == file->st.st_mtime + && f->st.st_size == file->st.st_size) + { + _cpp_file *ref_file; + bool same_file_p = false; + + if (f->buffer && !f->buffer_valid) + { + /* We already have a buffer but it is not valid, because + the file is still stacked. Make a new one. */ + ref_file = make_cpp_file (pfile, f->dir, f->name); + ref_file->path = f->path; + } + else + /* The file is not stacked anymore. We can reuse it. */ + ref_file = f; + + same_file_p = read_file (pfile, ref_file) + /* Size might have changed in read_file(). */ + && ref_file->st.st_size == file->st.st_size + && !memcmp (ref_file->buffer, + file->buffer, + file->st.st_size); + + if (f->buffer && !f->buffer_valid) + { + ref_file->path = 0; + destroy_cpp_file (ref_file); + } + + if (same_file_p) + break; + } + } + + return f == NULL; +} + +/* Place the file referenced by FILE into a new buffer on the buffer + stack if possible. IMPORT is true if this stacking attempt is + because of a #import directive. Returns true if a buffer is + stacked. */ +bool +_cpp_stack_file (cpp_reader *pfile, _cpp_file *file, bool import) +{ + cpp_buffer *buffer; + int sysp; + + if (!should_stack_file (pfile, file, import)) + return false; + + if (pfile->buffer == NULL || file->dir == NULL) + sysp = 0; + else + sysp = MAX (pfile->buffer->sysp, file->dir->sysp); + + /* Add the file to the dependencies on its first inclusion. */ + if (CPP_OPTION (pfile, deps.style) > !!sysp && !file->stack_count) + { + if (!file->main_file || !CPP_OPTION (pfile, deps.ignore_main_file)) + deps_add_dep (pfile->deps, file->path); + } + + /* Clear buffer_valid since _cpp_clean_line messes it up. */ + file->buffer_valid = false; + file->stack_count++; + + /* Stack the buffer. */ + buffer = cpp_push_buffer (pfile, file->buffer, file->st.st_size, + CPP_OPTION (pfile, preprocessed) + && !CPP_OPTION (pfile, directives_only)); + buffer->file = file; + buffer->sysp = sysp; + + /* Initialize controlling macro state. */ + pfile->mi_valid = true; + pfile->mi_cmacro = 0; + + /* Generate the call back. */ + _cpp_do_file_change (pfile, LC_ENTER, file->path, 1, sysp); + + return true; +} + +/* Mark FILE to be included once only. */ +void +_cpp_mark_file_once_only (cpp_reader *pfile, _cpp_file *file) +{ + pfile->seen_once_only = true; + file->once_only = true; +} + +/* Return the directory from which searching for FNAME should start, + considering the directive TYPE and ANGLE_BRACKETS. If there is + nothing left in the path, returns NULL. */ +static struct cpp_dir * +search_path_head (cpp_reader *pfile, const char *fname, int angle_brackets, + enum include_type type) +{ + cpp_dir *dir; + _cpp_file *file; + + if (IS_ABSOLUTE_PATH (fname)) + return &pfile->no_search_path; + + /* pfile->buffer is NULL when processing an -include command-line flag. */ + file = pfile->buffer == NULL ? pfile->main_file : pfile->buffer->file; + + /* For #include_next, skip in the search path past the dir in which + the current file was found, but if it was found via an absolute + path use the normal search logic. */ + if (type == IT_INCLUDE_NEXT && file->dir + && file->dir != &pfile->no_search_path) + dir = file->dir->next; + else if (angle_brackets) + dir = pfile->bracket_include; + else if (type == IT_CMDLINE) + /* -include and -imacros use the #include "" chain with the + preprocessor's cwd prepended. */ + return make_cpp_dir (pfile, "./", false); + else if (pfile->quote_ignores_source_dir) + dir = pfile->quote_include; + else + return make_cpp_dir (pfile, dir_name_of_file (file), + pfile->buffer ? pfile->buffer->sysp : 0); + + if (dir == NULL) + cpp_error (pfile, CPP_DL_ERROR, + "no include path in which to search for %s", fname); + + return dir; +} + +/* Strip the basename from the file's path. It ends with a slash if + of nonzero length. Note that this procedure also works for + , which is represented by the empty string. */ +static const char * +dir_name_of_file (_cpp_file *file) +{ + if (!file->dir_name) + { + size_t len = lbasename (file->path) - file->path; + char *dir_name = XNEWVEC (char, len + 1); + + memcpy (dir_name, file->path, len); + dir_name[len] = '\0'; + file->dir_name = dir_name; + } + + return file->dir_name; +} + +/* Handles #include-family directives (distinguished by TYPE), + including HEADER, and the command line -imacros and -include. + Returns true if a buffer was stacked. */ +bool +_cpp_stack_include (cpp_reader *pfile, const char *fname, int angle_brackets, + enum include_type type) +{ + struct cpp_dir *dir; + _cpp_file *file; + + dir = search_path_head (pfile, fname, angle_brackets, type); + if (!dir) + return false; + + file = _cpp_find_file (pfile, fname, dir, false, angle_brackets); + + /* Compensate for the increment in linemap_add. In the case of a + normal #include, we're currently at the start of the line + *following* the #include. A separate source_location for this + location makes no sense (until we do the LC_LEAVE), and + complicates LAST_SOURCE_LINE_LOCATION. This does not apply if we + found a PCH file (in which case linemap_add is not called) or we + were included from the command-line. */ + if (! file->pch && file->err_no == 0 && type != IT_CMDLINE) + pfile->line_table->highest_location--; + + return _cpp_stack_file (pfile, file, type == IT_IMPORT); +} + +/* Could not open FILE. The complication is dependency output. */ +static void +open_file_failed (cpp_reader *pfile, _cpp_file *file, int angle_brackets) +{ + int sysp = pfile->line_table->highest_line > 1 && pfile->buffer ? pfile->buffer->sysp : 0; + bool print_dep = CPP_OPTION (pfile, deps.style) > (angle_brackets || !!sysp); + + errno = file->err_no; + if (print_dep && CPP_OPTION (pfile, deps.missing_files) && errno == ENOENT) + deps_add_dep (pfile->deps, file->name); + else + { + /* If we are outputting dependencies but not for this file then + don't error because we can still produce correct output. */ + if (CPP_OPTION (pfile, deps.style) && ! print_dep) + cpp_errno (pfile, CPP_DL_WARNING, file->path); + else + cpp_errno (pfile, CPP_DL_ERROR, file->path); + } +} + +/* Search in the chain beginning at HEAD for a file whose search path + started at START_DIR != NULL. */ +static struct file_hash_entry * +search_cache (struct file_hash_entry *head, const cpp_dir *start_dir) +{ + while (head && head->start_dir != start_dir) + head = head->next; + + return head; +} + +/* Allocate a new _cpp_file structure. */ +static _cpp_file * +make_cpp_file (cpp_reader *pfile, cpp_dir *dir, const char *fname) +{ + _cpp_file *file; + + file = XCNEW (_cpp_file); + file->main_file = !pfile->buffer; + file->fd = -1; + file->dir = dir; + file->name = xstrdup (fname); + + return file; +} + +/* Release a _cpp_file structure. */ +static void +destroy_cpp_file (_cpp_file *file) +{ + if (file->buffer) + free ((void *) file->buffer); + free ((void *) file->name); + free (file); +} + +/* Release all the files allocated by this reader. */ +static void +destroy_all_cpp_files (cpp_reader *pfile) +{ + _cpp_file *iter = pfile->all_files; + while (iter) + { + _cpp_file *next = iter->next_file; + destroy_cpp_file (iter); + iter = next; + } +} + +/* A hash of directory names. The directory names are the path names + of files which contain a #include "", the included file name is + appended to this directories. + + To avoid duplicate entries we follow the convention that all + non-empty directory names should end in a '/'. DIR_NAME must be + stored in permanently allocated memory. */ +static cpp_dir * +make_cpp_dir (cpp_reader *pfile, const char *dir_name, int sysp) +{ + struct file_hash_entry *entry, **hash_slot; + cpp_dir *dir; + + hash_slot = (struct file_hash_entry **) + htab_find_slot_with_hash (pfile->dir_hash, dir_name, + htab_hash_string (dir_name), + INSERT); + + /* Have we already hashed this directory? */ + for (entry = *hash_slot; entry; entry = entry->next) + if (entry->start_dir == NULL) + return entry->u.dir; + + dir = XCNEW (cpp_dir); + dir->next = pfile->quote_include; + dir->name = (char *) dir_name; + dir->len = strlen (dir_name); + dir->sysp = sysp; + dir->construct = 0; + + /* Store this new result in the hash table. */ + entry = new_file_hash_entry (pfile); + entry->next = *hash_slot; + entry->start_dir = NULL; + entry->location = pfile->line_table->highest_location; + entry->u.dir = dir; + *hash_slot = entry; + + return dir; +} + +/* Create a new block of memory for file hash entries. */ +static void +allocate_file_hash_entries (cpp_reader *pfile) +{ + struct file_hash_entry_pool *pool = XNEW (struct file_hash_entry_pool); + pool->file_hash_entries_used = 0; + pool->next = pfile->file_hash_entries; + pfile->file_hash_entries = pool; +} + +/* Return a new file hash entry. */ +static struct file_hash_entry * +new_file_hash_entry (cpp_reader *pfile) +{ + unsigned int idx; + if (pfile->file_hash_entries->file_hash_entries_used == FILE_HASH_POOL_SIZE) + allocate_file_hash_entries (pfile); + + idx = pfile->file_hash_entries->file_hash_entries_used++; + return &pfile->file_hash_entries->pool[idx]; +} + +/* Free the file hash entry pools. */ +static void +free_file_hash_entries (cpp_reader *pfile) +{ + struct file_hash_entry_pool *iter = pfile->file_hash_entries; + while (iter) + { + struct file_hash_entry_pool *next = iter->next; + free (iter); + iter = next; + } +} + +/* Returns TRUE if a file FNAME has ever been successfully opened. + This routine is not intended to correctly handle filenames aliased + by links or redundant . or .. traversals etc. */ +bool +cpp_included (cpp_reader *pfile, const char *fname) +{ + struct file_hash_entry *entry; + + entry = (struct file_hash_entry *) + htab_find_with_hash (pfile->file_hash, fname, htab_hash_string (fname)); + + while (entry && (entry->start_dir == NULL || entry->u.file->err_no)) + entry = entry->next; + + return entry != NULL; +} + +/* Returns TRUE if a file FNAME has ever been successfully opened + before LOCATION. This routine is not intended to correctly handle + filenames aliased by links or redundant . or .. traversals etc. */ +bool +cpp_included_before (cpp_reader *pfile, const char *fname, + source_location location) +{ + struct file_hash_entry *entry; + + entry = (struct file_hash_entry *) + htab_find_with_hash (pfile->file_hash, fname, htab_hash_string (fname)); + + while (entry && (entry->start_dir == NULL || entry->u.file->err_no + || entry->location > location)) + entry = entry->next; + + return entry != NULL; +} + +/* Calculate the hash value of a file hash entry P. */ + +static hashval_t +file_hash_hash (const void *p) +{ + struct file_hash_entry *entry = (struct file_hash_entry *) p; + const char *hname; + if (entry->start_dir) + hname = entry->u.file->name; + else + hname = entry->u.dir->name; + + return htab_hash_string (hname); +} + +/* Compare a string Q against a file hash entry P. */ +static int +file_hash_eq (const void *p, const void *q) +{ + struct file_hash_entry *entry = (struct file_hash_entry *) p; + const char *fname = (const char *) q; + const char *hname; + + if (entry->start_dir) + hname = entry->u.file->name; + else + hname = entry->u.dir->name; + + return strcmp (hname, fname) == 0; +} + +/* Compare entries in the nonexistent file hash table. These are just + strings. */ +static int +nonexistent_file_hash_eq (const void *p, const void *q) +{ + return strcmp (p, q) == 0; +} + +/* Initialize everything in this source file. */ +void +_cpp_init_files (cpp_reader *pfile) +{ + pfile->file_hash = htab_create_alloc (127, file_hash_hash, file_hash_eq, + NULL, xcalloc, free); + pfile->dir_hash = htab_create_alloc (127, file_hash_hash, file_hash_eq, + NULL, xcalloc, free); + allocate_file_hash_entries (pfile); + pfile->nonexistent_file_hash = htab_create_alloc (127, htab_hash_string, + nonexistent_file_hash_eq, + NULL, xcalloc, free); + _obstack_begin (&pfile->nonexistent_file_ob, 0, 0, + (void *(*) (long)) xmalloc, + (void (*) (void *)) free); +} + +/* Finalize everything in this source file. */ +void +_cpp_cleanup_files (cpp_reader *pfile) +{ + htab_delete (pfile->file_hash); + htab_delete (pfile->dir_hash); + htab_delete (pfile->nonexistent_file_hash); + obstack_free (&pfile->nonexistent_file_ob, 0); + free_file_hash_entries (pfile); + destroy_all_cpp_files (pfile); +} + +/* Make the parser forget about files it has seen. This can be useful + for resetting the parser to start another run. */ +void +cpp_clear_file_cache (cpp_reader *pfile) +{ + _cpp_cleanup_files (pfile); + pfile->file_hash_entries = NULL; + pfile->all_files = NULL; + _cpp_init_files (pfile); +} + +/* Enter a file name in the hash for the sake of cpp_included. */ +void +_cpp_fake_include (cpp_reader *pfile, const char *fname) +{ + _cpp_find_file (pfile, fname, pfile->buffer->file->dir, true, 0); +} + +/* Not everyone who wants to set system-header-ness on a buffer can + see the details of a buffer. This is an exported interface because + fix-header needs it. */ +void +cpp_make_system_header (cpp_reader *pfile, int syshdr, int externc) +{ + int flags = 0; + const struct line_maps *line_table = pfile->line_table; + const struct line_map *map = &line_table->maps[line_table->used-1]; + + /* 1 = system header, 2 = system header to be treated as C. */ + if (syshdr) + flags = 1 + (externc != 0); + pfile->buffer->sysp = flags; + _cpp_do_file_change (pfile, LC_RENAME, map->to_file, + SOURCE_LINE (map, pfile->line_table->highest_line), flags); +} + +/* Allow the client to change the current file. Used by the front end + to achieve pseudo-file names like . + If REASON is LC_LEAVE, then NEW_NAME must be NULL. */ +void +cpp_change_file (cpp_reader *pfile, enum lc_reason reason, + const char *new_name) +{ + _cpp_do_file_change (pfile, reason, new_name, 1, 0); +} + +/* Callback function for htab_traverse. */ +static int +report_missing_guard (void **slot, void *b) +{ + struct file_hash_entry *entry = (struct file_hash_entry *) *slot; + int *bannerp = (int *) b; + + /* Skip directories. */ + if (entry->start_dir != NULL) + { + _cpp_file *file = entry->u.file; + + /* We don't want MI guard advice for the main file. */ + if (file->cmacro == NULL && file->stack_count == 1 && !file->main_file) + { + if (*bannerp == 0) + { + fputs (_("Multiple include guards may be useful for:\n"), + stderr); + *bannerp = 1; + } + + fputs (entry->u.file->path, stderr); + putc ('\n', stderr); + } + } + + return 0; +} + +/* Report on all files that might benefit from a multiple include guard. + Triggered by -H. */ +void +_cpp_report_missing_guards (cpp_reader *pfile) +{ + int banner = 0; + + htab_traverse (pfile->file_hash, report_missing_guard, &banner); +} + +/* Locate HEADER, and determine whether it is newer than the current + file. If it cannot be located or dated, return -1, if it is + newer, return 1, otherwise 0. */ +int +_cpp_compare_file_date (cpp_reader *pfile, const char *fname, + int angle_brackets) +{ + _cpp_file *file; + struct cpp_dir *dir; + + dir = search_path_head (pfile, fname, angle_brackets, IT_INCLUDE); + if (!dir) + return -1; + + file = _cpp_find_file (pfile, fname, dir, false, angle_brackets); + if (file->err_no) + return -1; + + if (file->fd != -1) + { + close (file->fd); + file->fd = -1; + } + + return file->st.st_mtime > pfile->buffer->file->st.st_mtime; +} + +/* Pushes the given file onto the buffer stack. Returns nonzero if + successful. */ +bool +cpp_push_include (cpp_reader *pfile, const char *fname) +{ + return _cpp_stack_include (pfile, fname, false, IT_CMDLINE); +} + +/* Do appropriate cleanup when a file INC's buffer is popped off the + input stack. */ +void +_cpp_pop_file_buffer (cpp_reader *pfile, _cpp_file *file) +{ + /* Record the inclusion-preventing macro, which could be NULL + meaning no controlling macro. */ + if (pfile->mi_valid && file->cmacro == NULL) + file->cmacro = pfile->mi_cmacro; + + /* Invalidate control macros in the #including file. */ + pfile->mi_valid = false; + + if (file->buffer) + { + free ((void *) file->buffer); + file->buffer = NULL; + file->buffer_valid = false; + } +} + +/* Inteface to file statistics record in _cpp_file structure. */ +struct stat * +_cpp_get_file_stat (_cpp_file *file) +{ + return &file->st; +} + +/* Set the include chain for "" to QUOTE, for <> to BRACKET. If + QUOTE_IGNORES_SOURCE_DIR, then "" includes do not look in the + directory of the including file. + + If BRACKET does not lie in the QUOTE chain, it is set to QUOTE. */ +void +cpp_set_include_chains (cpp_reader *pfile, cpp_dir *quote, cpp_dir *bracket, + int quote_ignores_source_dir) +{ + pfile->quote_include = quote; + pfile->bracket_include = quote; + pfile->quote_ignores_source_dir = quote_ignores_source_dir; + + for (; quote; quote = quote->next) + { + quote->name_map = NULL; + quote->len = strlen (quote->name); + if (quote == bracket) + pfile->bracket_include = bracket; + } +} + +/* Append the file name to the directory to create the path, but don't + turn / into // or // into ///; // may be a namespace escape. */ +static char * +append_file_to_dir (const char *fname, cpp_dir *dir) +{ + size_t dlen, flen; + char *path; + + dlen = dir->len; + flen = strlen (fname); + path = XNEWVEC (char, dlen + 1 + flen + 1); + memcpy (path, dir->name, dlen); + if (dlen && path[dlen - 1] != '/') + path[dlen++] = '/'; + memcpy (&path[dlen], fname, flen + 1); + + return path; +} + +/* Read a space delimited string of unlimited length from a stdio + file F. */ +static char * +read_filename_string (int ch, FILE *f) +{ + char *alloc, *set; + int len; + + len = 20; + set = alloc = XNEWVEC (char, len + 1); + if (! is_space (ch)) + { + *set++ = ch; + while ((ch = getc (f)) != EOF && ! is_space (ch)) + { + if (set - alloc == len) + { + len *= 2; + alloc = XRESIZEVEC (char, alloc, len + 1); + set = alloc + len / 2; + } + *set++ = ch; + } + } + *set = '\0'; + ungetc (ch, f); + return alloc; +} + +/* Read the file name map file for DIR. */ +static void +read_name_map (cpp_dir *dir) +{ + static const char FILE_NAME_MAP_FILE[] = "header.gcc"; + char *name; + FILE *f; + size_t len, count = 0, room = 9; + + len = dir->len; + name = (char *) alloca (len + sizeof (FILE_NAME_MAP_FILE) + 1); + memcpy (name, dir->name, len); + if (len && name[len - 1] != '/') + name[len++] = '/'; + strcpy (name + len, FILE_NAME_MAP_FILE); + f = fopen (name, "r"); + + dir->name_map = XNEWVEC (const char *, room); + + /* Silently return NULL if we cannot open. */ + if (f) + { + int ch; + + while ((ch = getc (f)) != EOF) + { + char *to; + + if (is_space (ch)) + continue; + + if (count + 2 > room) + { + room += 8; + dir->name_map = XRESIZEVEC (const char *, dir->name_map, room); + } + + dir->name_map[count] = read_filename_string (ch, f); + while ((ch = getc (f)) != EOF && is_hspace (ch)) + ; + + to = read_filename_string (ch, f); + if (IS_ABSOLUTE_PATH (to)) + dir->name_map[count + 1] = to; + else + { + dir->name_map[count + 1] = append_file_to_dir (to, dir); + free (to); + } + + count += 2; + while ((ch = getc (f)) != '\n') + if (ch == EOF) + break; + } + + fclose (f); + } + + /* Terminate the list of maps. */ + dir->name_map[count] = NULL; +} + +/* Remap a FILE's name based on the file_name_map, if any, for + FILE->dir. If the file name has any directory separators, + recursively check those directories too. */ +static char * +remap_filename (cpp_reader *pfile, _cpp_file *file) +{ + const char *fname, *p; + char *new_dir; + cpp_dir *dir; + size_t index, len; + + dir = file->dir; + fname = file->name; + + for (;;) + { + if (!dir->name_map) + read_name_map (dir); + + for (index = 0; dir->name_map[index]; index += 2) + if (!strcmp (dir->name_map[index], fname)) + return xstrdup (dir->name_map[index + 1]); + + p = strchr (fname, '/'); + if (!p || p == fname) + return NULL; + + len = dir->len + (p - fname + 1); + new_dir = XNEWVEC (char, len + 1); + memcpy (new_dir, dir->name, dir->len); + memcpy (new_dir + dir->len, fname, p - fname + 1); + new_dir[len] = '\0'; + + dir = make_cpp_dir (pfile, new_dir, dir->sysp); + fname = p + 1; + } +} + +/* Returns true if PCHNAME is a valid PCH file for FILE. */ +static bool +validate_pch (cpp_reader *pfile, _cpp_file *file, const char *pchname) +{ + const char *saved_path = file->path; + bool valid = false; + + file->path = pchname; + if (open_file (file)) + { + valid = 1 & pfile->cb.valid_pch (pfile, pchname, file->fd); + + if (!valid) + { + close (file->fd); + file->fd = -1; + } + + if (CPP_OPTION (pfile, print_include_names)) + { + unsigned int i; + for (i = 1; i < pfile->line_table->depth; i++) + putc ('.', stderr); + fprintf (stderr, "%c %s\n", + valid ? '!' : 'x', pchname); + } + } + + file->path = saved_path; + return valid; +} + +/* Get the path associated with the _cpp_file F. The path includes + the base name from the include directive and the directory it was + found in via the search path. */ + +const char * +cpp_get_path (struct _cpp_file *f) +{ + return f->path; +} + +/* Get the directory associated with the _cpp_file F. */ + +cpp_dir * +cpp_get_dir (struct _cpp_file *f) +{ + return f->dir; +} + +/* Get the cpp_buffer currently associated with the cpp_reader + PFILE. */ + +cpp_buffer * +cpp_get_buffer (cpp_reader *pfile) +{ + return pfile->buffer; +} + +/* Get the _cpp_file associated with the cpp_buffer B. */ + +_cpp_file * +cpp_get_file (cpp_buffer *b) +{ + return b->file; +} + +/* Get the previous cpp_buffer given a cpp_buffer B. The previous + buffer is the buffer that included the given buffer. */ + +cpp_buffer * +cpp_get_prev (cpp_buffer *b) +{ + return b->prev; +} + +/* This data structure holds the list of header files that were seen + while the PCH was being built. The 'entries' field is kept sorted + in memcmp() order; yes, this means that on little-endian systems, + it's sorted initially by the least-significant byte of 'size', but + that's OK. The code does rely on having entries with the same size + next to each other. */ + +struct pchf_entry { + /* The size of this file. This is used to save running a MD5 checksum + if the sizes don't match. */ + off_t size; + /* The MD5 checksum of this file. */ + unsigned char sum[16]; + /* Is this file to be included only once? */ + bool once_only; +}; + +struct pchf_data { + /* Number of pchf_entry structures. */ + size_t count; + + /* Are there any values with once_only set? + This is used as an optimisation, it means we don't have to search + the structure if we're processing a regular #include. */ + bool have_once_only; + + struct pchf_entry entries[1]; +}; + +static struct pchf_data *pchf; + +/* A qsort ordering function for pchf_entry structures. */ + +static int +pchf_save_compare (const void *e1, const void *e2) +{ + return memcmp (e1, e2, sizeof (struct pchf_entry)); +} + +/* Create and write to F a pchf_data structure. */ + +bool +_cpp_save_file_entries (cpp_reader *pfile, FILE *fp) +{ + size_t count = 0; + struct pchf_data *result; + size_t result_size; + _cpp_file *f; + + for (f = pfile->all_files; f; f = f->next_file) + ++count; + + result_size = (sizeof (struct pchf_data) + + sizeof (struct pchf_entry) * (count - 1)); + result = XCNEWVAR (struct pchf_data, result_size); + + result->count = 0; + result->have_once_only = false; + + for (f = pfile->all_files; f; f = f->next_file) + { + size_t count; + + /* This should probably never happen, since if a read error occurred + the PCH file shouldn't be written... */ + if (f->dont_read || f->err_no) + continue; + + if (f->stack_count == 0) + continue; + + count = result->count++; + + result->entries[count].once_only = f->once_only; + /* |= is avoided in the next line because of an HP C compiler bug */ + result->have_once_only = result->have_once_only | f->once_only; + if (f->buffer_valid) + md5_buffer ((const char *)f->buffer, + f->st.st_size, result->entries[count].sum); + else + { + FILE *ff; + int oldfd = f->fd; + + if (!open_file (f)) + { + open_file_failed (pfile, f, 0); + return false; + } + ff = fdopen (f->fd, "rb"); + md5_stream (ff, result->entries[count].sum); + fclose (ff); + f->fd = oldfd; + } + result->entries[count].size = f->st.st_size; + } + + result_size = (sizeof (struct pchf_data) + + sizeof (struct pchf_entry) * (result->count - 1)); + + qsort (result->entries, result->count, sizeof (struct pchf_entry), + pchf_save_compare); + + return fwrite (result, result_size, 1, fp) == 1; +} + +/* Read the pchf_data structure from F. */ + +bool +_cpp_read_file_entries (cpp_reader *pfile ATTRIBUTE_UNUSED, FILE *f) +{ + struct pchf_data d; + + if (fread (&d, sizeof (struct pchf_data) - sizeof (struct pchf_entry), 1, f) + != 1) + return false; + + pchf = XNEWVAR (struct pchf_data, sizeof (struct pchf_data) + + sizeof (struct pchf_entry) * (d.count - 1)); + memcpy (pchf, &d, sizeof (struct pchf_data) - sizeof (struct pchf_entry)); + if (fread (pchf->entries, sizeof (struct pchf_entry), d.count, f) + != d.count) + return false; + return true; +} + +/* The parameters for pchf_compare. */ + +struct pchf_compare_data +{ + /* The size of the file we're looking for. */ + off_t size; + + /* The MD5 checksum of the file, if it's been computed. */ + unsigned char sum[16]; + + /* Is SUM valid? */ + bool sum_computed; + + /* Do we need to worry about entries that don't have ONCE_ONLY set? */ + bool check_included; + + /* The file that we're searching for. */ + _cpp_file *f; +}; + +/* bsearch comparison function; look for D_P in E_P. */ + +static int +pchf_compare (const void *d_p, const void *e_p) +{ + const struct pchf_entry *e = (const struct pchf_entry *)e_p; + struct pchf_compare_data *d = (struct pchf_compare_data *)d_p; + int result; + + result = memcmp (&d->size, &e->size, sizeof (off_t)); + if (result != 0) + return result; + + if (! d->sum_computed) + { + _cpp_file *const f = d->f; + + md5_buffer ((const char *)f->buffer, f->st.st_size, d->sum); + d->sum_computed = true; + } + + result = memcmp (d->sum, e->sum, 16); + if (result != 0) + return result; + + if (d->check_included || e->once_only) + return 0; + else + return 1; +} + +/* Check that F is not in a list read from a PCH file (if any). + Assumes that f->buffer_valid is true. Return TRUE if the file + should not be read. */ + +static bool +check_file_against_entries (cpp_reader *pfile ATTRIBUTE_UNUSED, + _cpp_file *f, + bool check_included) +{ + struct pchf_compare_data d; + + if (pchf == NULL + || (! check_included && ! pchf->have_once_only)) + return false; + + d.size = f->st.st_size; + d.sum_computed = false; + d.f = f; + d.check_included = check_included; + return bsearch (&d, pchf->entries, pchf->count, sizeof (struct pchf_entry), + pchf_compare) != NULL; +} diff --git a/libcpp/identifiers.c b/libcpp/identifiers.c new file mode 100644 index 0000000..c22f4a7 --- /dev/null +++ b/libcpp/identifiers.c @@ -0,0 +1,118 @@ +/* Hash tables for the CPP library. + Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1998, + 1999, 2000, 2001, 2002 Free Software Foundation, Inc. + Written by Per Bothner, 1994. + Based on CCCP program by Paul Rubin, June 1986 + Adapted to ANSI C, Richard Stallman, Jan 1987 + +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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + In other words, you are welcome to use, share and improve this program. + You are forbidden to forbid anyone else to use, share and improve + what you give them. Help stamp out software-hoarding! */ + +#include "config.h" +#include "system.h" +#include "cpplib.h" +#include "internal.h" + +static cpp_hashnode *alloc_node (hash_table *); + +/* Return an identifier node for hashtable.c. Used by cpplib except + when integrated with the C front ends. */ +static cpp_hashnode * +alloc_node (hash_table *table) +{ + cpp_hashnode *node; + + node = XOBNEW (&table->pfile->hash_ob, cpp_hashnode); + memset (node, 0, sizeof (cpp_hashnode)); + return node; +} + +/* Set up the identifier hash table. Use TABLE if non-null, otherwise + create our own. */ +void +_cpp_init_hashtable (cpp_reader *pfile, hash_table *table) +{ + struct spec_nodes *s; + + if (table == NULL) + { + pfile->our_hashtable = 1; + table = ht_create (13); /* 8K (=2^13) entries. */ + table->alloc_node = (hashnode (*) (hash_table *)) alloc_node; + + _obstack_begin (&pfile->hash_ob, 0, 0, + (void *(*) (long)) xmalloc, + (void (*) (void *)) free); + } + + table->pfile = pfile; + pfile->hash_table = table; + + /* Now we can initialize things that use the hash table. */ + _cpp_init_directives (pfile); + _cpp_init_internal_pragmas (pfile); + + s = &pfile->spec_nodes; + s->n_defined = cpp_lookup (pfile, DSC("defined")); + s->n_true = cpp_lookup (pfile, DSC("true")); + s->n_false = cpp_lookup (pfile, DSC("false")); + s->n__VA_ARGS__ = cpp_lookup (pfile, DSC("__VA_ARGS__")); + s->n__VA_ARGS__->flags |= NODE_DIAGNOSTIC; +} + +/* Tear down the identifier hash table. */ +void +_cpp_destroy_hashtable (cpp_reader *pfile) +{ + if (pfile->our_hashtable) + { + ht_destroy (pfile->hash_table); + obstack_free (&pfile->hash_ob, 0); + } +} + +/* Returns the hash entry for the STR of length LEN, creating one + if necessary. */ +cpp_hashnode * +cpp_lookup (cpp_reader *pfile, const unsigned char *str, unsigned int len) +{ + /* ht_lookup cannot return NULL. */ + return CPP_HASHNODE (ht_lookup (pfile->hash_table, str, len, HT_ALLOC)); +} + +/* Determine whether the str STR, of length LEN, is a defined macro. */ +int +cpp_defined (cpp_reader *pfile, const unsigned char *str, int len) +{ + cpp_hashnode *node; + + node = CPP_HASHNODE (ht_lookup (pfile->hash_table, str, len, HT_NO_INSERT)); + + /* If it's of type NT_MACRO, it cannot be poisoned. */ + return node && node->type == NT_MACRO; +} + +/* For all nodes in the hashtable, callback CB with parameters PFILE, + the node, and V. */ +void +cpp_forall_identifiers (cpp_reader *pfile, cpp_cb cb, void *v) +{ + /* We don't need a proxy since the hash table's identifier comes + first in cpp_hashnode. */ + ht_forall (pfile->hash_table, (ht_cb) cb, v); +} diff --git a/libcpp/include/cpp-id-data.h b/libcpp/include/cpp-id-data.h new file mode 100644 index 0000000..2445186 --- /dev/null +++ b/libcpp/include/cpp-id-data.h @@ -0,0 +1,78 @@ +/* Structures that hang off cpp_identifier, for PCH. + Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, + 1999, 2000, 2001, 2002, 2003, 2004 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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include "cpplib.h" + +#if !defined (HAVE_UCHAR) && !defined (IN_GCC) +typedef unsigned char uchar; +#endif + +#define U (const unsigned char *) /* Intended use: U"string" */ + +/* Chained list of answers to an assertion. */ +struct answer GTY(()) +{ + struct answer *next; + unsigned int count; + cpp_token GTY ((length ("%h.count"))) first[1]; +}; + +/* Each macro definition is recorded in a cpp_macro structure. + Variadic macros cannot occur with traditional cpp. */ +struct cpp_macro GTY(()) +{ + /* Parameters, if any. */ + cpp_hashnode ** GTY ((nested_ptr (union tree_node, + "%h ? CPP_HASHNODE (GCC_IDENT_TO_HT_IDENT (%h)) : NULL", + "%h ? HT_IDENT_TO_GCC_IDENT (HT_NODE (%h)) : NULL"), + length ("%h.paramc"))) + params; + + /* Replacement tokens (ISO) or replacement text (traditional). See + comment at top of cpptrad.c for how traditional function-like + macros are encoded. */ + union cpp_macro_u + { + cpp_token * GTY ((tag ("0"), length ("%0.count"))) tokens; + const unsigned char * GTY ((tag ("1"))) text; + } GTY ((desc ("%1.traditional"))) exp; + + /* Definition line number. */ + source_location line; + + /* Number of tokens in expansion, or bytes for traditional macros. */ + unsigned int count; + + /* Number of parameters. */ + unsigned short paramc; + + /* If a function-like macro. */ + unsigned int fun_like : 1; + + /* If a variadic macro. */ + unsigned int variadic : 1; + + /* If macro defined in system header. */ + unsigned int syshdr : 1; + + /* Nonzero if it has been expanded or had its existence tested. */ + unsigned int used : 1; + + /* Indicate which field of 'exp' is in use. */ + unsigned int traditional : 1; +}; diff --git a/libcpp/include/cpplib.h b/libcpp/include/cpplib.h new file mode 100644 index 0000000..ac1d032 --- /dev/null +++ b/libcpp/include/cpplib.h @@ -0,0 +1,882 @@ +/* Definitions for CPP library. + Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, + 2004, 2005, 2007 + Free Software Foundation, Inc. + Written by Per Bothner, 1994-95. + +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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + In other words, you are welcome to use, share and improve this program. + You are forbidden to forbid anyone else to use, share and improve + what you give them. Help stamp out software-hoarding! */ +#ifndef LIBCPP_CPPLIB_H +#define LIBCPP_CPPLIB_H + +#include +#include "symtab.h" +#include "line-map.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct cpp_reader cpp_reader; +typedef struct cpp_buffer cpp_buffer; +typedef struct cpp_options cpp_options; +typedef struct cpp_token cpp_token; +typedef struct cpp_string cpp_string; +typedef struct cpp_hashnode cpp_hashnode; +typedef struct cpp_macro cpp_macro; +typedef struct cpp_callbacks cpp_callbacks; +typedef struct cpp_dir cpp_dir; + +struct answer; +struct _cpp_file; + +/* The first three groups, apart from '=', can appear in preprocessor + expressions (+= and -= are used to indicate unary + and - resp.). + This allows a lookup table to be implemented in _cpp_parse_expr. + + The first group, to CPP_LAST_EQ, can be immediately followed by an + '='. The lexer needs operators ending in '=', like ">>=", to be in + the same order as their counterparts without the '=', like ">>". + + See the cpp_operator table optab in expr.c if you change the order or + add or remove anything in the first group. */ + +#define TTYPE_TABLE \ + OP(EQ, "=") \ + OP(NOT, "!") \ + OP(GREATER, ">") /* compare */ \ + OP(LESS, "<") \ + OP(PLUS, "+") /* math */ \ + OP(MINUS, "-") \ + OP(MULT, "*") \ + OP(DIV, "/") \ + OP(MOD, "%") \ + OP(AND, "&") /* bit ops */ \ + OP(OR, "|") \ + OP(XOR, "^") \ + OP(RSHIFT, ">>") \ + OP(LSHIFT, "<<") \ + \ + OP(COMPL, "~") \ + OP(AND_AND, "&&") /* logical */ \ + OP(OR_OR, "||") \ + OP(QUERY, "?") \ + OP(COLON, ":") \ + OP(COMMA, ",") /* grouping */ \ + OP(OPEN_PAREN, "(") \ + OP(CLOSE_PAREN, ")") \ + TK(EOF, NONE) \ + OP(EQ_EQ, "==") /* compare */ \ + OP(NOT_EQ, "!=") \ + OP(GREATER_EQ, ">=") \ + OP(LESS_EQ, "<=") \ + \ + /* These two are unary + / - in preprocessor expressions. */ \ + OP(PLUS_EQ, "+=") /* math */ \ + OP(MINUS_EQ, "-=") \ + \ + OP(MULT_EQ, "*=") \ + OP(DIV_EQ, "/=") \ + OP(MOD_EQ, "%=") \ + OP(AND_EQ, "&=") /* bit ops */ \ + OP(OR_EQ, "|=") \ + OP(XOR_EQ, "^=") \ + OP(RSHIFT_EQ, ">>=") \ + OP(LSHIFT_EQ, "<<=") \ + /* Digraphs together, beginning with CPP_FIRST_DIGRAPH. */ \ + OP(HASH, "#") /* digraphs */ \ + OP(PASTE, "##") \ + OP(OPEN_SQUARE, "[") \ + OP(CLOSE_SQUARE, "]") \ + OP(OPEN_BRACE, "{") \ + OP(CLOSE_BRACE, "}") \ + /* The remainder of the punctuation. Order is not significant. */ \ + OP(SEMICOLON, ";") /* structure */ \ + OP(ELLIPSIS, "...") \ + OP(PLUS_PLUS, "++") /* increment */ \ + OP(MINUS_MINUS, "--") \ + OP(DEREF, "->") /* accessors */ \ + OP(FERED, "<-") /* wiring */ \ + OP(DOT, ".") \ + OP(SCOPE, "::") \ + OP(DEREF_STAR, "->*") \ + OP(DOT_STAR, ".*") \ + OP(ATSIGN, "@") /* used in Objective-C */ \ + \ + TK(NAME, IDENT) /* word */ \ + TK(AT_NAME, IDENT) /* @word - Objective-C */ \ + TK(NUMBER, LITERAL) /* 34_be+ta */ \ + \ + TK(CHAR, LITERAL) /* 'char' */ \ + TK(WCHAR, LITERAL) /* L'char' */ \ + TK(OTHER, LITERAL) /* stray punctuation */ \ + \ + TK(STRING, LITERAL) /* "string" */ \ + TK(WSTRING, LITERAL) /* L"string" */ \ + TK(OBJC_STRING, LITERAL) /* @"string" - Objective-C */ \ + TK(HEADER_NAME, LITERAL) /* in #include */ \ + \ + TK(COMMENT, LITERAL) /* Only if output comments. */ \ + /* SPELL_LITERAL happens to DTRT. */ \ + TK(MACRO_ARG, NONE) /* Macro argument. */ \ + TK(PRAGMA, NONE) /* Only for deferred pragmas. */ \ + TK(PRAGMA_EOL, NONE) /* End-of-line for deferred pragmas. */ \ + TK(PADDING, NONE) /* Whitespace for -E. */ + +#define OP(e, s) CPP_ ## e, +#define TK(e, s) CPP_ ## e, +enum cpp_ttype +{ + TTYPE_TABLE + N_TTYPES, + + /* Positions in the table. */ + CPP_LAST_EQ = CPP_LSHIFT, + CPP_FIRST_DIGRAPH = CPP_HASH, + CPP_LAST_PUNCTUATOR= CPP_ATSIGN, + CPP_LAST_CPP_OP = CPP_LESS_EQ +}; +#undef OP +#undef TK + +/* C language kind, used when calling cpp_create_reader. */ +enum c_lang {CLK_GNUC89 = 0, CLK_GNUC99, CLK_STDC89, CLK_STDC94, CLK_STDC99, + CLK_GNUCXX, CLK_CXX98, CLK_GNUCXX0X, CLK_CXX0X, CLK_ASM}; + +/* Payload of a NUMBER, STRING, CHAR or COMMENT token. */ +struct cpp_string GTY(()) +{ + unsigned int len; + const unsigned char *text; +}; + +/* Flags for the cpp_token structure. */ +#define PREV_WHITE (1 << 0) /* If whitespace before this token. */ +#define DIGRAPH (1 << 1) /* If it was a digraph. */ +#define STRINGIFY_ARG (1 << 2) /* If macro argument to be stringified. */ +#define PASTE_LEFT (1 << 3) /* If on LHS of a ## operator. */ +#define NAMED_OP (1 << 4) /* C++ named operators. */ +#define NO_EXPAND (1 << 5) /* Do not macro-expand this token. */ +#define BOL (1 << 6) /* Token at beginning of line. */ +#define PURE_ZERO (1 << 7) /* Single 0 digit, used by the C++ frontend, + set in c-lex.c. */ + +/* Specify which field, if any, of the cpp_token union is used. */ + +enum cpp_token_fld_kind { + CPP_TOKEN_FLD_NODE, + CPP_TOKEN_FLD_SOURCE, + CPP_TOKEN_FLD_STR, + CPP_TOKEN_FLD_ARG_NO, + CPP_TOKEN_FLD_PRAGMA, + CPP_TOKEN_FLD_NONE +}; + +/* A preprocessing token. This has been carefully packed and should + occupy 16 bytes on 32-bit hosts and 24 bytes on 64-bit hosts. */ +struct cpp_token GTY(()) +{ + source_location src_loc; /* Location of first char of token. */ + ENUM_BITFIELD(cpp_ttype) type : CHAR_BIT; /* token type */ + unsigned char flags; /* flags - see above */ + + union cpp_token_u + { + /* An identifier. */ + cpp_hashnode * + GTY ((nested_ptr (union tree_node, + "%h ? CPP_HASHNODE (GCC_IDENT_TO_HT_IDENT (%h)) : NULL", + "%h ? HT_IDENT_TO_GCC_IDENT (HT_NODE (%h)) : NULL"), + tag ("CPP_TOKEN_FLD_NODE"))) + node; + + /* Inherit padding from this token. */ + cpp_token * GTY ((tag ("CPP_TOKEN_FLD_SOURCE"))) source; + + /* A string, or number. */ + struct cpp_string GTY ((tag ("CPP_TOKEN_FLD_STR"))) str; + + /* Argument no. for a CPP_MACRO_ARG. */ + unsigned int GTY ((tag ("CPP_TOKEN_FLD_ARG_NO"))) arg_no; + + /* Caller-supplied identifier for a CPP_PRAGMA. */ + unsigned int GTY ((tag ("CPP_TOKEN_FLD_PRAGMA"))) pragma; + } GTY ((desc ("cpp_token_val_index (&%1)"))) val; +}; + +/* Say which field is in use. */ +extern enum cpp_token_fld_kind cpp_token_val_index (cpp_token *tok); + +/* A type wide enough to hold any multibyte source character. + cpplib's character constant interpreter requires an unsigned type. + Also, a typedef for the signed equivalent. + The width of this type is capped at 32 bits; there do exist targets + where wchar_t is 64 bits, but only in a non-default mode, and there + would be no meaningful interpretation for a wchar_t value greater + than 2^32 anyway -- the widest wide-character encoding around is + ISO 10646, which stops at 2^31. */ +#if CHAR_BIT * SIZEOF_INT >= 32 +# define CPPCHAR_SIGNED_T int +#elif CHAR_BIT * SIZEOF_LONG >= 32 +# define CPPCHAR_SIGNED_T long +#else +# error "Cannot find a least-32-bit signed integer type" +#endif +typedef unsigned CPPCHAR_SIGNED_T cppchar_t; +typedef CPPCHAR_SIGNED_T cppchar_signed_t; + +/* Style of header dependencies to generate. */ +enum cpp_deps_style { DEPS_NONE = 0, DEPS_USER, DEPS_SYSTEM }; + +/* The possible normalization levels, from most restrictive to least. */ +enum cpp_normalize_level { + /* In NFKC. */ + normalized_KC = 0, + /* In NFC. */ + normalized_C, + /* In NFC, except for subsequences where being in NFC would make + the identifier invalid. */ + normalized_identifier_C, + /* Not normalized at all. */ + normalized_none +}; + +/* This structure is nested inside struct cpp_reader, and + carries all the options visible to the command line. */ +struct cpp_options +{ + /* Characters between tab stops. */ + unsigned int tabstop; + + /* The language we're preprocessing. */ + enum c_lang lang; + + /* Nonzero means use extra default include directories for C++. */ + unsigned char cplusplus; + + /* Nonzero means handle cplusplus style comments. */ + unsigned char cplusplus_comments; + + /* Nonzero means define __OBJC__, treat @ as a special token, and + use the OBJC[PLUS]_INCLUDE_PATH environment variable. */ + unsigned char objc; + + /* Nonzero means don't copy comments into the output file. */ + unsigned char discard_comments; + + /* Nonzero means don't copy comments into the output file during + macro expansion. */ + unsigned char discard_comments_in_macro_exp; + + /* Nonzero means process the ISO trigraph sequences. */ + unsigned char trigraphs; + + /* Nonzero means process the ISO digraph sequences. */ + unsigned char digraphs; + + /* Nonzero means to allow hexadecimal floats and LL suffixes. */ + unsigned char extended_numbers; + + /* Nonzero means print names of header files (-H). */ + unsigned char print_include_names; + + /* Nonzero means cpp_pedwarn causes a hard error. */ + unsigned char pedantic_errors; + + /* Nonzero means don't print warning messages. */ + unsigned char inhibit_warnings; + + /* Nonzero means complain about deprecated features. */ + unsigned char warn_deprecated; + + /* Nonzero means don't suppress warnings from system headers. */ + unsigned char warn_system_headers; + + /* Nonzero means don't print error messages. Has no option to + select it, but can be set by a user of cpplib (e.g. fix-header). */ + unsigned char inhibit_errors; + + /* Nonzero means warn if slash-star appears in a comment. */ + unsigned char warn_comments; + + /* Nonzero means warn if a user-supplied include directory does not + exist. */ + unsigned char warn_missing_include_dirs; + + /* Nonzero means warn if there are any trigraphs. */ + unsigned char warn_trigraphs; + + /* Nonzero means warn about multicharacter charconsts. */ + unsigned char warn_multichar; + + /* Nonzero means warn about various incompatibilities with + traditional C. */ + unsigned char warn_traditional; + + /* Nonzero means warn about long long numeric constants. */ + unsigned char warn_long_long; + + /* Nonzero means warn about text after an #endif (or #else). */ + unsigned char warn_endif_labels; + + /* Nonzero means warn about implicit sign changes owing to integer + promotions. */ + unsigned char warn_num_sign_change; + + /* Zero means don't warn about __VA_ARGS__ usage in c89 pedantic mode. + Presumably the usage is protected by the appropriate #ifdef. */ + unsigned char warn_variadic_macros; + + /* Nonzero means turn warnings into errors. */ + unsigned char warnings_are_errors; + + /* Nonzero means we should look for header.gcc files that remap file + names. */ + unsigned char remap; + + /* Zero means dollar signs are punctuation. */ + unsigned char dollars_in_ident; + + /* Nonzero means UCNs are accepted in identifiers. */ + unsigned char extended_identifiers; + + /* True if we should warn about dollars in identifiers or numbers + for this translation unit. */ + unsigned char warn_dollars; + + /* Nonzero means warn if undefined identifiers are evaluated in an #if. */ + unsigned char warn_undef; + + /* Nonzero means warn of unused macros from the main file. */ + unsigned char warn_unused_macros; + + /* Nonzero for the 1999 C Standard, including corrigenda and amendments. */ + unsigned char c99; + + /* Nonzero if we are conforming to a specific C or C++ standard. */ + unsigned char std; + + /* Nonzero means give all the error messages the ANSI standard requires. */ + unsigned char pedantic; + + /* Nonzero means we're looking at already preprocessed code, so don't + bother trying to do macro expansion and whatnot. */ + unsigned char preprocessed; + + /* Print column number in error messages. */ + unsigned char show_column; + + /* Nonzero means handle C++ alternate operator names. */ + unsigned char operator_names; + + /* True for traditional preprocessing. */ + unsigned char traditional; + + /* Holds the name of the target (execution) character set. */ + const char *narrow_charset; + + /* Holds the name of the target wide character set. */ + const char *wide_charset; + + /* Holds the name of the input character set. */ + const char *input_charset; + + /* The minimum permitted level of normalization before a warning + is generated. */ + enum cpp_normalize_level warn_normalize; + + /* True to warn about precompiled header files we couldn't use. */ + bool warn_invalid_pch; + + /* True if dependencies should be restored from a precompiled header. */ + bool restore_pch_deps; + + /* Dependency generation. */ + struct + { + /* Style of header dependencies to generate. */ + enum cpp_deps_style style; + + /* Assume missing files are generated files. */ + bool missing_files; + + /* Generate phony targets for each dependency apart from the first + one. */ + bool phony_targets; + + /* If true, no dependency is generated on the main file. */ + bool ignore_main_file; + } deps; + + /* Target-specific features set by the front end or client. */ + + /* Precision for target CPP arithmetic, target characters, target + ints and target wide characters, respectively. */ + size_t precision, char_precision, int_precision, wchar_precision; + + /* True means chars (wide chars) are unsigned. */ + bool unsigned_char, unsigned_wchar; + + /* True if the most significant byte in a word has the lowest + address in memory. */ + bool bytes_big_endian; + + /* Nonzero means __STDC__ should have the value 0 in system headers. */ + unsigned char stdc_0_in_system_headers; + + /* True means error callback should be used for diagnostics. */ + bool client_diagnostic; + + /* True disables tokenization outside of preprocessing directives. */ + bool directives_only; +}; + +/* Callback for header lookup for HEADER, which is the name of a + source file. It is used as a method of last resort to find headers + that are not otherwise found during the normal include processing. + The return value is the malloced name of a header to try and open, + if any, or NULL otherwise. This callback is called only if the + header is otherwise unfound. */ +typedef const char *(*missing_header_cb)(cpp_reader *, const char *header, cpp_dir **); + +/* Call backs to cpplib client. */ +struct cpp_callbacks +{ + /* Called when a new line of preprocessed output is started. */ + void (*line_change) (cpp_reader *, const cpp_token *, int); + + /* Called when switching to/from a new file. + The line_map is for the new file. It is NULL if there is no new file. + (In C this happens when done with + and also + when done with a main file.) This can be used for resource cleanup. */ + void (*file_change) (cpp_reader *, const struct line_map *); + + void (*dir_change) (cpp_reader *, const char *); + void (*include) (cpp_reader *, unsigned int, const unsigned char *, + const char *, int, const cpp_token **); + void (*define) (cpp_reader *, unsigned int, cpp_hashnode *); + void (*undef) (cpp_reader *, unsigned int, cpp_hashnode *); + void (*ident) (cpp_reader *, unsigned int, const cpp_string *); + void (*def_pragma) (cpp_reader *, unsigned int); + int (*valid_pch) (cpp_reader *, const char *, int); + void (*read_pch) (cpp_reader *, const char *, int, const char *); + missing_header_cb missing_header; + + /* Called to emit a diagnostic if client_diagnostic option is true. + This callback receives the translated message. */ + void (*error) (cpp_reader *, int, const char *, va_list *) + ATTRIBUTE_FPTR_PRINTF(3,0); +}; + +/* Chain of directories to look for include files in. */ +struct cpp_dir +{ + /* NULL-terminated singly-linked list. */ + struct cpp_dir *next; + + /* NAME of the directory, NUL-terminated. */ + char *name; + unsigned int len; + + /* One if a system header, two if a system header that has extern + "C" guards for C++. */ + unsigned char sysp; + + /* Mapping of file names for this directory for MS-DOS and related + platforms. A NULL-terminated array of (from, to) pairs. */ + const char **name_map; + + /* Routine to construct pathname, given the search path name and the + HEADER we are trying to find, return a constructed pathname to + try and open. If this is NULL, the constructed pathname is as + constructed by append_file_to_dir. */ + char *(*construct) (const char *header, cpp_dir *dir); + + /* The C front end uses these to recognize duplicated + directories in the search path. */ + ino_t ino; + dev_t dev; + + /* Is this a user-supplied directory? */ + bool user_supplied_p; +}; + +/* Name under which this program was invoked. */ +extern const char *progname; + +/* The structure of a node in the hash table. The hash table has + entries for all identifiers: either macros defined by #define + commands (type NT_MACRO), assertions created with #assert + (NT_ASSERTION), or neither of the above (NT_VOID). Builtin macros + like __LINE__ are flagged NODE_BUILTIN. Poisoned identifiers are + flagged NODE_POISONED. NODE_OPERATOR (C++ only) indicates an + identifier that behaves like an operator such as "xor". + NODE_DIAGNOSTIC is for speed in lex_token: it indicates a + diagnostic may be required for this node. Currently this only + applies to __VA_ARGS__ and poisoned identifiers. */ + +/* Hash node flags. */ +#define NODE_OPERATOR (1 << 0) /* C++ named operator. */ +#define NODE_POISONED (1 << 1) /* Poisoned identifier. */ +#define NODE_BUILTIN (1 << 2) /* Builtin macro. */ +#define NODE_DIAGNOSTIC (1 << 3) /* Possible diagnostic when lexed. */ +#define NODE_WARN (1 << 4) /* Warn if redefined or undefined. */ +#define NODE_DISABLED (1 << 5) /* A disabled macro. */ +#define NODE_MACRO_ARG (1 << 6) /* Used during #define processing. */ + +/* Different flavors of hash node. */ +enum node_type +{ + NT_VOID = 0, /* No definition yet. */ + NT_MACRO, /* A macro of some form. */ + NT_ASSERTION /* Predicate for #assert. */ +}; + +/* Different flavors of builtin macro. _Pragma is an operator, but we + handle it with the builtin code for efficiency reasons. */ +enum builtin_type +{ + BT_SPECLINE = 0, /* `__LINE__' */ + BT_DATE, /* `__DATE__' */ + BT_FILE, /* `__FILE__' */ + BT_BASE_FILE, /* `__BASE_FILE__' */ + BT_INCLUDE_LEVEL, /* `__INCLUDE_LEVEL__' */ + BT_TIME, /* `__TIME__' */ + BT_STDC, /* `__STDC__' */ + BT_PRAGMA, /* `_Pragma' operator */ + BT_TIMESTAMP, /* `__TIMESTAMP__' */ + BT_COUNTER /* `__COUNTER__' */ +}; + +#define CPP_HASHNODE(HNODE) ((cpp_hashnode *) (HNODE)) +#define HT_NODE(NODE) ((ht_identifier *) (NODE)) +#define NODE_LEN(NODE) HT_LEN (&(NODE)->ident) +#define NODE_NAME(NODE) HT_STR (&(NODE)->ident) + +/* Specify which field, if any, of the union is used. */ + +enum { + NTV_MACRO, + NTV_ANSWER, + NTV_BUILTIN, + NTV_ARGUMENT, + NTV_NONE +}; + +#define CPP_HASHNODE_VALUE_IDX(HNODE) \ + ((HNODE.flags & NODE_MACRO_ARG) ? NTV_ARGUMENT \ + : HNODE.type == NT_MACRO ? ((HNODE.flags & NODE_BUILTIN) \ + ? NTV_BUILTIN : NTV_MACRO) \ + : HNODE.type == NT_ASSERTION ? NTV_ANSWER \ + : NTV_NONE) + +/* The common part of an identifier node shared amongst all 3 C front + ends. Also used to store CPP identifiers, which are a superset of + identifiers in the grammatical sense. */ + +union _cpp_hashnode_value GTY(()) +{ + /* If a macro. */ + cpp_macro * GTY((tag ("NTV_MACRO"))) macro; + /* Answers to an assertion. */ + struct answer * GTY ((tag ("NTV_ANSWER"))) answers; + /* Code for a builtin macro. */ + enum builtin_type GTY ((tag ("NTV_BUILTIN"))) builtin; + /* Macro argument index. */ + unsigned short GTY ((tag ("NTV_ARGUMENT"))) arg_index; +}; + +struct cpp_hashnode GTY(()) +{ + struct ht_identifier ident; + unsigned int is_directive : 1; + unsigned int directive_index : 7; /* If is_directive, + then index into directive table. + Otherwise, a NODE_OPERATOR. */ + unsigned char rid_code; /* Rid code - for front ends. */ + ENUM_BITFIELD(node_type) type : 8; /* CPP node type. */ + unsigned char flags; /* CPP flags. */ + + union _cpp_hashnode_value GTY ((desc ("CPP_HASHNODE_VALUE_IDX (%1)"))) value; +}; + +/* Call this first to get a handle to pass to other functions. + + If you want cpplib to manage its own hashtable, pass in a NULL + pointer. Otherwise you should pass in an initialized hash table + that cpplib will share; this technique is used by the C front + ends. */ +extern cpp_reader *cpp_create_reader (enum c_lang, struct ht *, + struct line_maps *); + +/* Reset the cpp_reader's line_map. This is only used after reading a + PCH file. */ +extern void cpp_set_line_map (cpp_reader *, struct line_maps *); + +/* Call this to change the selected language standard (e.g. because of + command line options). */ +extern void cpp_set_lang (cpp_reader *, enum c_lang); + +/* Set the include paths. */ +extern void cpp_set_include_chains (cpp_reader *, cpp_dir *, cpp_dir *, int); + +/* Call these to get pointers to the options, callback, and deps + structures for a given reader. These pointers are good until you + call cpp_finish on that reader. You can either edit the callbacks + through the pointer returned from cpp_get_callbacks, or set them + with cpp_set_callbacks. */ +extern cpp_options *cpp_get_options (cpp_reader *); +extern cpp_callbacks *cpp_get_callbacks (cpp_reader *); +extern void cpp_set_callbacks (cpp_reader *, cpp_callbacks *); +extern struct deps *cpp_get_deps (cpp_reader *); + +/* This function reads the file, but does not start preprocessing. It + returns the name of the original file; this is the same as the + input file, except for preprocessed input. This will generate at + least one file change callback, and possibly a line change callback + too. If there was an error opening the file, it returns NULL. */ +extern const char *cpp_read_main_file (cpp_reader *, const char *); + +/* Set up built-ins with special behavior. Use cpp_init_builtins() + instead unless your know what you are doing. */ +extern void cpp_init_special_builtins (cpp_reader *); + +/* Set up built-ins like __FILE__. */ +extern void cpp_init_builtins (cpp_reader *, int); + +/* This is called after options have been parsed, and partially + processed. */ +extern void cpp_post_options (cpp_reader *); + +/* Set up translation to the target character set. */ +extern void cpp_init_iconv (cpp_reader *); + +/* Call this to finish preprocessing. If you requested dependency + generation, pass an open stream to write the information to, + otherwise NULL. It is your responsibility to close the stream. + + Returns cpp_errors (pfile). */ +extern int cpp_finish (cpp_reader *, FILE *deps_stream); + +/* Call this to release the handle at the end of preprocessing. Any + use of the handle after this function returns is invalid. Returns + cpp_errors (pfile). */ +extern void cpp_destroy (cpp_reader *); + +/* Error count. */ +extern unsigned int cpp_errors (cpp_reader *); + +extern unsigned int cpp_token_len (const cpp_token *); +extern unsigned char *cpp_token_as_text (cpp_reader *, const cpp_token *); +extern unsigned char *cpp_spell_token (cpp_reader *, const cpp_token *, + unsigned char *, bool); +extern void cpp_register_pragma (cpp_reader *, const char *, const char *, + void (*) (cpp_reader *), bool); +extern void cpp_register_deferred_pragma (cpp_reader *, const char *, + const char *, unsigned, bool, bool); +extern int cpp_avoid_paste (cpp_reader *, const cpp_token *, + const cpp_token *); +extern const cpp_token *cpp_get_token (cpp_reader *); +extern const cpp_token *cpp_get_token_with_location (cpp_reader *, + source_location *); +extern const unsigned char *cpp_macro_definition (cpp_reader *, + const cpp_hashnode *); +extern void _cpp_backup_tokens (cpp_reader *, unsigned int); + +/* Evaluate a CPP_CHAR or CPP_WCHAR token. */ +extern cppchar_t cpp_interpret_charconst (cpp_reader *, const cpp_token *, + unsigned int *, int *); +/* Evaluate a vector of CPP_STRING or CPP_WSTRING tokens. */ +extern bool cpp_interpret_string (cpp_reader *, + const cpp_string *, size_t, + cpp_string *, bool); +extern bool cpp_interpret_string_notranslate (cpp_reader *, + const cpp_string *, size_t, + cpp_string *, bool); + +/* Convert a host character constant to the execution character set. */ +extern cppchar_t cpp_host_to_exec_charset (cpp_reader *, cppchar_t); + +/* Used to register macros and assertions, perhaps from the command line. + The text is the same as the command line argument. */ +extern void cpp_define (cpp_reader *, const char *); +extern void cpp_assert (cpp_reader *, const char *); +extern void cpp_undef (cpp_reader *, const char *); +extern void cpp_unassert (cpp_reader *, const char *); + +extern cpp_macro *cpp_push_definition (cpp_reader *, const char *); +extern void cpp_pop_definition (cpp_reader *, const char *, cpp_macro *); + +/* Undefine all macros and assertions. */ +extern void cpp_undef_all (cpp_reader *); + +extern cpp_buffer *cpp_push_buffer (cpp_reader *, const unsigned char *, + size_t, int); +extern int cpp_defined (cpp_reader *, const unsigned char *, int); + +/* A preprocessing number. Code assumes that any unused high bits of + the double integer are set to zero. */ +typedef unsigned HOST_WIDE_INT cpp_num_part; +typedef struct cpp_num cpp_num; +struct cpp_num +{ + cpp_num_part high; + cpp_num_part low; + bool unsignedp; /* True if value should be treated as unsigned. */ + bool overflow; /* True if the most recent calculation overflowed. */ +}; + +/* cpplib provides two interfaces for interpretation of preprocessing + numbers. + + cpp_classify_number categorizes numeric constants according to + their field (integer, floating point, or invalid), radix (decimal, + octal, hexadecimal), and type suffixes. */ + +#define CPP_N_CATEGORY 0x000F +#define CPP_N_INVALID 0x0000 +#define CPP_N_INTEGER 0x0001 +#define CPP_N_FLOATING 0x0002 + +#define CPP_N_WIDTH 0x00F0 +#define CPP_N_SMALL 0x0010 /* int, float, shrot _Fract/Accum */ +#define CPP_N_MEDIUM 0x0020 /* long, double, long _Fract/_Accum. */ +#define CPP_N_LARGE 0x0040 /* long long, long double, + long long _Fract/Accum. */ + +#define CPP_N_WIDTH_MD 0xF0000 /* machine defined. */ +#define CPP_N_MD_W 0x10000 +#define CPP_N_MD_Q 0x20000 + +#define CPP_N_RADIX 0x0F00 +#define CPP_N_DECIMAL 0x0100 +#define CPP_N_HEX 0x0200 +#define CPP_N_OCTAL 0x0400 +#define CPP_N_BINARY 0x0800 + +#define CPP_N_UNSIGNED 0x1000 /* Properties. */ +#define CPP_N_IMAGINARY 0x2000 +#define CPP_N_DFLOAT 0x4000 + +#define CPP_N_FRACT 0x100000 /* Fract types. */ +#define CPP_N_ACCUM 0x200000 /* Accum types. */ + +/* Classify a CPP_NUMBER token. The return value is a combination of + the flags from the above sets. */ +extern unsigned cpp_classify_number (cpp_reader *, const cpp_token *); + +/* Evaluate a token classified as category CPP_N_INTEGER. */ +extern cpp_num cpp_interpret_integer (cpp_reader *, const cpp_token *, + unsigned int type); + +/* Sign extend a number, with PRECISION significant bits and all + others assumed clear, to fill out a cpp_num structure. */ +cpp_num cpp_num_sign_extend (cpp_num, size_t); + +/* Diagnostic levels. To get a diagnostic without associating a + position in the translation unit with it, use cpp_error_with_line + with a line number of zero. */ + +/* Warning, an error with -Werror. */ +#define CPP_DL_WARNING 0x00 +/* Same as CPP_DL_WARNING, except it is not suppressed in system headers. */ +#define CPP_DL_WARNING_SYSHDR 0x01 +/* Warning, an error with -pedantic-errors or -Werror. */ +#define CPP_DL_PEDWARN 0x02 +/* An error. */ +#define CPP_DL_ERROR 0x03 +/* An internal consistency check failed. Prints "internal error: ", + otherwise the same as CPP_DL_ERROR. */ +#define CPP_DL_ICE 0x04 +/* Extracts a diagnostic level from an int. */ +#define CPP_DL_EXTRACT(l) (l & 0xf) +/* Nonzero if a diagnostic level is one of the warnings. */ +#define CPP_DL_WARNING_P(l) (CPP_DL_EXTRACT (l) >= CPP_DL_WARNING \ + && CPP_DL_EXTRACT (l) <= CPP_DL_PEDWARN) + +/* Output a diagnostic of some kind. */ +extern void cpp_error (cpp_reader *, int, const char *msgid, ...) + ATTRIBUTE_PRINTF_3; + +/* Output a diagnostic with "MSGID: " preceding the + error string of errno. No location is printed. */ +extern void cpp_errno (cpp_reader *, int, const char *msgid); + +/* Same as cpp_error, except additionally specifies a position as a + (translation unit) physical line and physical column. If the line is + zero, then no location is printed. */ +extern void cpp_error_with_line (cpp_reader *, int, source_location, unsigned, + const char *msgid, ...) ATTRIBUTE_PRINTF_5; + +/* In cpplex.c */ +extern int cpp_ideq (const cpp_token *, const char *); +extern void cpp_output_line (cpp_reader *, FILE *); +extern void cpp_output_token (const cpp_token *, FILE *); +extern const char *cpp_type2name (enum cpp_ttype); +/* Returns the value of an escape sequence, truncated to the correct + target precision. PSTR points to the input pointer, which is just + after the backslash. LIMIT is how much text we have. WIDE is true + if the escape sequence is part of a wide character constant or + string literal. Handles all relevant diagnostics. */ +extern cppchar_t cpp_parse_escape (cpp_reader *, const unsigned char ** pstr, + const unsigned char *limit, int wide); + +/* In cpphash.c */ + +/* Lookup an identifier in the hashtable. Puts the identifier in the + table if it is not already there. */ +extern cpp_hashnode *cpp_lookup (cpp_reader *, const unsigned char *, + unsigned int); + +typedef int (*cpp_cb) (cpp_reader *, cpp_hashnode *, void *); +extern void cpp_forall_identifiers (cpp_reader *, cpp_cb, void *); + +/* In cppmacro.c */ +extern void cpp_scan_nooutput (cpp_reader *); +extern int cpp_sys_macro_p (cpp_reader *); +extern unsigned char *cpp_quote_string (unsigned char *, const unsigned char *, + unsigned int); + +/* In cppfiles.c */ +extern bool cpp_included (cpp_reader *, const char *); +extern bool cpp_included_before (cpp_reader *, const char *, source_location); +extern void cpp_make_system_header (cpp_reader *, int, int); +extern bool cpp_push_include (cpp_reader *, const char *); +extern void cpp_change_file (cpp_reader *, enum lc_reason, const char *); +extern const char *cpp_get_path (struct _cpp_file *); +extern cpp_dir *cpp_get_dir (struct _cpp_file *); +extern cpp_buffer *cpp_get_buffer (cpp_reader *); +extern struct _cpp_file *cpp_get_file (cpp_buffer *); +extern cpp_buffer *cpp_get_prev (cpp_buffer *); +extern void cpp_clear_file_cache (cpp_reader *); + +/* In cpppch.c */ +struct save_macro_data; +extern int cpp_save_state (cpp_reader *, FILE *); +extern int cpp_write_pch_deps (cpp_reader *, FILE *); +extern int cpp_write_pch_state (cpp_reader *, FILE *); +extern int cpp_valid_state (cpp_reader *, const char *, int); +extern void cpp_prepare_state (cpp_reader *, struct save_macro_data **); +extern int cpp_read_state (cpp_reader *, const char *, FILE *, + struct save_macro_data *); + +#ifdef __cplusplus +} +#endif + +#endif /* ! LIBCPP_CPPLIB_H */ diff --git a/libcpp/include/line-map.h b/libcpp/include/line-map.h new file mode 100644 index 0000000..cddc74d --- /dev/null +++ b/libcpp/include/line-map.h @@ -0,0 +1,191 @@ +/* Map logical line numbers to (source file, line number) pairs. + Copyright (C) 2001, 2003, 2004, 2007 + 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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + In other words, you are welcome to use, share and improve this program. + You are forbidden to forbid anyone else to use, share and improve + what you give them. Help stamp out software-hoarding! */ + +#ifndef LIBCPP_LINE_MAP_H +#define LIBCPP_LINE_MAP_H + +#ifndef GTY +#define GTY(x) /* nothing */ +#endif + +/* Reason for adding a line change with add_line_map (). LC_ENTER is + when including a new file, e.g. a #include directive in C. + LC_LEAVE is when reaching a file's end. LC_RENAME is when a file + name or line number changes for neither of the above reasons + (e.g. a #line directive in C). */ +enum lc_reason {LC_ENTER = 0, LC_LEAVE, LC_RENAME}; + +/* A logical line/column number, i.e. an "index" into a line_map. */ +/* Long-term, we want to use this to replace struct location_s (in input.h), + and effectively typedef source_location location_t. */ +typedef unsigned int source_location; + +/* Memory allocation function typedef. Works like xrealloc. */ +typedef void *(*line_map_realloc) (void *, size_t); + +/* Physical source file TO_FILE at line TO_LINE at column 0 is represented + by the logical START_LOCATION. TO_LINE+L at column C is represented by + START_LOCATION+(L*(1<start_location) >> (MAP)->column_bits) + (MAP)->to_line) + +#define SOURCE_COLUMN(MAP, LINE) \ + (((LINE) - (MAP)->start_location) & ((1 << (MAP)->column_bits) - 1)) + +/* Returns the last source line within a map. This is the (last) line + of the #include, or other directive, that caused a map change. */ +#define LAST_SOURCE_LINE(MAP) \ + SOURCE_LINE (MAP, LAST_SOURCE_LINE_LOCATION (MAP)) +#define LAST_SOURCE_LINE_LOCATION(MAP) \ + ((((MAP)[1].start_location - 1 - (MAP)->start_location) \ + & ~((1 << (MAP)->column_bits) - 1)) \ + + (MAP)->start_location) + +/* Returns the map a given map was included from. */ +#define INCLUDED_FROM(SET, MAP) (&(SET)->maps[(MAP)->included_from]) + +/* Nonzero if the map is at the bottom of the include stack. */ +#define MAIN_FILE_P(MAP) ((MAP)->included_from < 0) + +/* Set LOC to a source position that is the same line as the most recent + linemap_line_start, but with the specified TO_COLUMN column number. */ + +#define LINEMAP_POSITION_FOR_COLUMN(LOC, SET, TO_COLUMN) { \ + unsigned int to_column = (TO_COLUMN); \ + struct line_maps *set = (SET); \ + if (__builtin_expect (to_column >= set->max_column_hint, 0)) \ + (LOC) = linemap_position_for_column (set, to_column); \ + else { \ + source_location r = set->highest_line; \ + r = r + to_column; \ + if (r >= set->highest_location) \ + set->highest_location = r; \ + (LOC) = r; \ + }} + + +extern source_location +linemap_position_for_column (struct line_maps *set, unsigned int to_column); +#endif /* !LIBCPP_LINE_MAP_H */ diff --git a/libcpp/include/mkdeps.h b/libcpp/include/mkdeps.h new file mode 100644 index 0000000..60a5b5d --- /dev/null +++ b/libcpp/include/mkdeps.h @@ -0,0 +1,79 @@ +/* Dependency generator for Makefile fragments. + Copyright (C) 2000, 2001, 2003 Free Software Foundation, Inc. + Contributed by Zack Weinberg, Mar 2000 + +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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + In other words, you are welcome to use, share and improve this program. + You are forbidden to forbid anyone else to use, share and improve + what you give them. Help stamp out software-hoarding! */ + +#ifndef LIBCPP_MKDEPS_H +#define LIBCPP_MKDEPS_H + +/* This is the data structure used by all the functions in mkdeps.c. + It's quite straightforward, but should be treated as opaque. */ + +struct deps; + +/* Create a deps buffer. */ +extern struct deps *deps_init (void); + +/* Destroy a deps buffer. */ +extern void deps_free (struct deps *); + +/* Add a set of "vpath" directories. The second argument is a colon- + separated list of pathnames, like you would set Make's VPATH + variable to. If a dependency or target name begins with any of + these pathnames (and the next path element is not "..") that + pathname is stripped off. */ +extern void deps_add_vpath (struct deps *, const char *); + +/* Add a target (appears on left side of the colon) to the deps list. Takes + a boolean indicating whether to quote the target for MAKE. */ +extern void deps_add_target (struct deps *, const char *, int); + +/* Sets the default target if none has been given already. An empty + string as the default target is interpreted as stdin. */ +extern void deps_add_default_target (struct deps *, const char *); + +/* Add a dependency (appears on the right side of the colon) to the + deps list. Dependencies will be printed in the order that they + were entered with this function. By convention, the first + dependency entered should be the primary source file. */ +extern void deps_add_dep (struct deps *, const char *); + +/* Write out a deps buffer to a specified file. The third argument + is the number of columns to word-wrap at (0 means don't wrap). */ +extern void deps_write (const struct deps *, FILE *, unsigned int); + +/* Write out a deps buffer to a file, in a form that can be read back + with deps_restore. Returns nonzero on error, in which case the + error number will be in errno. */ +extern int deps_save (struct deps *, FILE *); + +/* Read back dependency information written with deps_save into + the deps buffer. The third argument may be NULL, in which case + the dependency information is just skipped, or it may be a filename, + in which case that filename is skipped. */ +extern int deps_restore (struct deps *, FILE *, const char *); + +/* For each dependency *except the first*, emit a dummy rule for that + file, causing it to depend on nothing. This is used to work around + the intermediate-file deletion misfeature in Make, in some + automatic dependency schemes. */ +extern void deps_phony_targets (const struct deps *, FILE *); + +#endif /* ! LIBCPP_MKDEPS_H */ diff --git a/libcpp/include/symtab.h b/libcpp/include/symtab.h new file mode 100644 index 0000000..2bd45cf --- /dev/null +++ b/libcpp/include/symtab.h @@ -0,0 +1,98 @@ +/* Hash tables. + Copyright (C) 2000, 2001, 2003, 2004, 2007 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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef LIBCPP_SYMTAB_H +#define LIBCPP_SYMTAB_H + +#include "obstack.h" +#ifndef GTY +#define GTY(x) /* nothing */ +#endif + +/* This is what each hash table entry points to. It may be embedded + deeply within another object. */ +typedef struct ht_identifier ht_identifier; +struct ht_identifier GTY(()) +{ + const unsigned char *str; + unsigned int len; + unsigned int hash_value; +}; + +#define HT_LEN(NODE) ((NODE)->len) +#define HT_STR(NODE) ((NODE)->str) + +typedef struct ht hash_table; +typedef struct ht_identifier *hashnode; + +enum ht_lookup_option {HT_NO_INSERT = 0, HT_ALLOC, HT_ALLOCED}; + +/* An identifier hash table for cpplib and the front ends. */ +struct ht +{ + /* Identifiers are allocated from here. */ + struct obstack stack; + + hashnode *entries; + /* Call back, allocate a node. */ + hashnode (*alloc_node) (hash_table *); + /* Call back, allocate something that hangs off a node like a cpp_macro. + NULL means use the usual allocator. */ + void * (*alloc_subobject) (size_t); + + unsigned int nslots; /* Total slots in the entries array. */ + unsigned int nelements; /* Number of live elements. */ + + /* Link to reader, if any. For the benefit of cpplib. */ + struct cpp_reader *pfile; + + /* Table usage statistics. */ + unsigned int searches; + unsigned int collisions; + + /* Should 'entries' be freed when it is no longer needed? */ + bool entries_owned; +}; + +/* Initialize the hashtable with 2 ^ order entries. */ +extern hash_table *ht_create (unsigned int order); + +/* Frees all memory associated with a hash table. */ +extern void ht_destroy (hash_table *); + +extern hashnode ht_lookup (hash_table *, const unsigned char *, + size_t, enum ht_lookup_option); +extern hashnode ht_lookup_with_hash (hash_table *, const unsigned char *, + size_t, unsigned int, + enum ht_lookup_option); +#define HT_HASHSTEP(r, c) ((r) * 67 + ((c) - 113)); +#define HT_HASHFINISH(r, len) ((r) + (len)) + +/* For all nodes in TABLE, make a callback. The callback takes + TABLE->PFILE, the node, and a PTR, and the callback sequence stops + if the callback returns zero. */ +typedef int (*ht_cb) (struct cpp_reader *, hashnode, const void *); +extern void ht_forall (hash_table *, ht_cb, const void *); + +/* Restore the hash table. */ +extern void ht_load (hash_table *ht, hashnode *entries, + unsigned int nslots, unsigned int nelements, bool own); + +/* Dump allocation statistics to stderr. */ +extern void ht_dump_statistics (hash_table *); + +#endif /* LIBCPP_SYMTAB_H */ diff --git a/libcpp/init.c b/libcpp/init.c new file mode 100644 index 0000000..aa0c0b1 --- /dev/null +++ b/libcpp/init.c @@ -0,0 +1,658 @@ +/* CPP Library. + Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, + 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007 Free Software Foundation, Inc. + Contributed by Per Bothner, 1994-95. + Based on CCCP program by Paul Rubin, June 1986 + Adapted to ANSI C, Richard Stallman, Jan 1987 + +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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include "config.h" +#include "system.h" +#include "cpplib.h" +#include "internal.h" +#include "mkdeps.h" +#include "localedir.h" + +static void init_library (void); +static void mark_named_operators (cpp_reader *); +static void read_original_filename (cpp_reader *); +static void read_original_directory (cpp_reader *); +static void post_options (cpp_reader *); + +/* If we have designated initializers (GCC >2.7) these tables can be + initialized, constant data. Otherwise, they have to be filled in at + runtime. */ +#if HAVE_DESIGNATED_INITIALIZERS + +#define init_trigraph_map() /* Nothing. */ +#define TRIGRAPH_MAP \ +__extension__ const uchar _cpp_trigraph_map[UCHAR_MAX + 1] = { + +#define END }; +#define s(p, v) [p] = v, + +#else + +#define TRIGRAPH_MAP uchar _cpp_trigraph_map[UCHAR_MAX + 1] = { 0 }; \ + static void init_trigraph_map (void) { \ + unsigned char *x = _cpp_trigraph_map; + +#define END } +#define s(p, v) x[p] = v; + +#endif + +TRIGRAPH_MAP + s('=', '#') s(')', ']') s('!', '|') + s('(', '[') s('\'', '^') s('>', '}') + s('/', '\\') s('<', '{') s('-', '~') +END + +#undef s +#undef END +#undef TRIGRAPH_MAP + +/* A set of booleans indicating what CPP features each source language + requires. */ +struct lang_flags +{ + char c99; + char cplusplus; + char extended_numbers; + char extended_identifiers; + char std; + char cplusplus_comments; + char digraphs; +}; + +static const struct lang_flags lang_defaults[] = +{ /* c99 c++ xnum xid std // digr */ + /* GNUC89 */ { 0, 0, 1, 0, 0, 1, 1 }, + /* GNUC99 */ { 1, 0, 1, 0, 0, 1, 1 }, + /* STDC89 */ { 0, 0, 0, 0, 1, 0, 0 }, + /* STDC94 */ { 0, 0, 0, 0, 1, 0, 1 }, + /* STDC99 */ { 1, 0, 1, 0, 1, 1, 1 }, + /* GNUCXX */ { 0, 1, 1, 0, 0, 1, 1 }, + /* CXX98 */ { 0, 1, 1, 0, 1, 1, 1 }, + /* GNUCXX0X */ { 1, 1, 1, 0, 0, 1, 1 }, + /* CXX0X */ { 1, 1, 1, 0, 1, 1, 1 }, + /* ASM */ { 0, 0, 1, 0, 0, 1, 0 } + /* xid should be 1 for GNUC99, STDC99, GNUCXX, CXX98, GNUCXX0X, and + CXX0X when no longer experimental (when all uses of identifiers + in the compiler have been audited for correct handling of + extended identifiers). */ +}; + +/* Sets internal flags correctly for a given language. */ +void +cpp_set_lang (cpp_reader *pfile, enum c_lang lang) +{ + const struct lang_flags *l = &lang_defaults[(int) lang]; + + CPP_OPTION (pfile, lang) = lang; + + CPP_OPTION (pfile, c99) = l->c99; + CPP_OPTION (pfile, cplusplus) = l->cplusplus; + CPP_OPTION (pfile, extended_numbers) = l->extended_numbers; + CPP_OPTION (pfile, extended_identifiers) = l->extended_identifiers; + CPP_OPTION (pfile, std) = l->std; + CPP_OPTION (pfile, trigraphs) = l->std; + CPP_OPTION (pfile, cplusplus_comments) = l->cplusplus_comments; + CPP_OPTION (pfile, digraphs) = l->digraphs; +} + +/* Initialize library global state. */ +static void +init_library (void) +{ + static int initialized = 0; + + if (! initialized) + { + initialized = 1; + + /* Set up the trigraph map. This doesn't need to do anything if + we were compiled with a compiler that supports C99 designated + initializers. */ + init_trigraph_map (); + +#ifdef ENABLE_NLS + (void) bindtextdomain (PACKAGE, LOCALEDIR); +#endif + } +} + +/* Initialize a cpp_reader structure. */ +cpp_reader * +cpp_create_reader (enum c_lang lang, hash_table *table, + struct line_maps *line_table) +{ + cpp_reader *pfile; + + /* Initialize this instance of the library if it hasn't been already. */ + init_library (); + + pfile = XCNEW (cpp_reader); + + cpp_set_lang (pfile, lang); + CPP_OPTION (pfile, warn_multichar) = 1; + CPP_OPTION (pfile, discard_comments) = 1; + CPP_OPTION (pfile, discard_comments_in_macro_exp) = 1; + CPP_OPTION (pfile, show_column) = 1; + CPP_OPTION (pfile, tabstop) = 8; + CPP_OPTION (pfile, operator_names) = 1; + CPP_OPTION (pfile, warn_trigraphs) = 2; + CPP_OPTION (pfile, warn_endif_labels) = 1; + CPP_OPTION (pfile, warn_deprecated) = 1; + CPP_OPTION (pfile, warn_long_long) = !CPP_OPTION (pfile, c99); + CPP_OPTION (pfile, dollars_in_ident) = 1; + CPP_OPTION (pfile, warn_dollars) = 1; + CPP_OPTION (pfile, warn_variadic_macros) = 1; + CPP_OPTION (pfile, warn_normalize) = normalized_C; + + /* Default CPP arithmetic to something sensible for the host for the + benefit of dumb users like fix-header. */ + CPP_OPTION (pfile, precision) = CHAR_BIT * sizeof (long); + CPP_OPTION (pfile, char_precision) = CHAR_BIT; + CPP_OPTION (pfile, wchar_precision) = CHAR_BIT * sizeof (int); + CPP_OPTION (pfile, int_precision) = CHAR_BIT * sizeof (int); + CPP_OPTION (pfile, unsigned_char) = 0; + CPP_OPTION (pfile, unsigned_wchar) = 1; + CPP_OPTION (pfile, bytes_big_endian) = 1; /* does not matter */ + + /* Default to no charset conversion. */ + CPP_OPTION (pfile, narrow_charset) = _cpp_default_encoding (); + CPP_OPTION (pfile, wide_charset) = 0; + + /* Default the input character set to UTF-8. */ + CPP_OPTION (pfile, input_charset) = _cpp_default_encoding (); + + /* A fake empty "directory" used as the starting point for files + looked up without a search path. Name cannot be '/' because we + don't want to prepend anything at all to filenames using it. All + other entries are correct zero-initialized. */ + pfile->no_search_path.name = (char *) ""; + + /* Initialize the line map. */ + pfile->line_table = line_table; + + /* Initialize lexer state. */ + pfile->state.save_comments = ! CPP_OPTION (pfile, discard_comments); + + /* Set up static tokens. */ + pfile->avoid_paste.type = CPP_PADDING; + pfile->avoid_paste.val.source = NULL; + pfile->eof.type = CPP_EOF; + pfile->eof.flags = 0; + + /* Create a token buffer for the lexer. */ + _cpp_init_tokenrun (&pfile->base_run, 250); + pfile->cur_run = &pfile->base_run; + pfile->cur_token = pfile->base_run.base; + + /* Initialize the base context. */ + pfile->context = &pfile->base_context; + pfile->base_context.macro = 0; + pfile->base_context.prev = pfile->base_context.next = 0; + + /* Aligned and unaligned storage. */ + pfile->a_buff = _cpp_get_buff (pfile, 0); + pfile->u_buff = _cpp_get_buff (pfile, 0); + + /* The expression parser stack. */ + _cpp_expand_op_stack (pfile); + + /* Initialize the buffer obstack. */ + _obstack_begin (&pfile->buffer_ob, 0, 0, + (void *(*) (long)) xmalloc, + (void (*) (void *)) free); + + _cpp_init_files (pfile); + + _cpp_init_hashtable (pfile, table); + + return pfile; +} + +/* Set the line_table entry in PFILE. This is called after reading a + PCH file, as the old line_table will be incorrect. */ +void +cpp_set_line_map (cpp_reader *pfile, struct line_maps *line_table) +{ + pfile->line_table = line_table; +} + +/* Free resources used by PFILE. Accessing PFILE after this function + returns leads to undefined behavior. Returns the error count. */ +void +cpp_destroy (cpp_reader *pfile) +{ + cpp_context *context, *contextn; + tokenrun *run, *runn; + + free (pfile->op_stack); + + while (CPP_BUFFER (pfile) != NULL) + _cpp_pop_buffer (pfile); + + if (pfile->out.base) + free (pfile->out.base); + + if (pfile->macro_buffer) + { + free (pfile->macro_buffer); + pfile->macro_buffer = NULL; + pfile->macro_buffer_len = 0; + } + + if (pfile->deps) + deps_free (pfile->deps); + obstack_free (&pfile->buffer_ob, 0); + + _cpp_destroy_hashtable (pfile); + _cpp_cleanup_files (pfile); + _cpp_destroy_iconv (pfile); + + _cpp_free_buff (pfile->a_buff); + _cpp_free_buff (pfile->u_buff); + _cpp_free_buff (pfile->free_buffs); + + for (run = &pfile->base_run; run; run = runn) + { + runn = run->next; + free (run->base); + if (run != &pfile->base_run) + free (run); + } + + for (context = pfile->base_context.next; context; context = contextn) + { + contextn = context->next; + free (context); + } + + free (pfile); +} + +/* This structure defines one built-in identifier. A node will be + entered in the hash table under the name NAME, with value VALUE. + + There are two tables of these. builtin_array holds all the + "builtin" macros: these are handled by builtin_macro() in + macro.c. Builtin is somewhat of a misnomer -- the property of + interest is that these macros require special code to compute their + expansions. The value is a "builtin_type" enumerator. + + operator_array holds the C++ named operators. These are keywords + which act as aliases for punctuators. In C++, they cannot be + altered through #define, and #if recognizes them as operators. In + C, these are not entered into the hash table at all (but see + ). The value is a token-type enumerator. */ +struct builtin +{ + const uchar *name; + unsigned short len; + unsigned short value; +}; + +#define B(n, t) { DSC(n), t } +static const struct builtin builtin_array[] = +{ + B("__TIMESTAMP__", BT_TIMESTAMP), + B("__TIME__", BT_TIME), + B("__DATE__", BT_DATE), + B("__FILE__", BT_FILE), + B("__BASE_FILE__", BT_BASE_FILE), + B("__LINE__", BT_SPECLINE), + B("__INCLUDE_LEVEL__", BT_INCLUDE_LEVEL), + B("__COUNTER__", BT_COUNTER), + /* Keep builtins not used for -traditional-cpp at the end, and + update init_builtins() if any more are added. */ + B("_Pragma", BT_PRAGMA), + B("__STDC__", BT_STDC), +}; + +static const struct builtin operator_array[] = +{ + B("and", CPP_AND_AND), + B("and_eq", CPP_AND_EQ), + B("bitand", CPP_AND), + B("bitor", CPP_OR), + B("compl", CPP_COMPL), + B("not", CPP_NOT), + B("not_eq", CPP_NOT_EQ), + B("or", CPP_OR_OR), + B("or_eq", CPP_OR_EQ), + B("xor", CPP_XOR), + B("xor_eq", CPP_XOR_EQ) +}; +#undef B + +/* Mark the C++ named operators in the hash table. */ +static void +mark_named_operators (cpp_reader *pfile) +{ + const struct builtin *b; + + for (b = operator_array; + b < (operator_array + ARRAY_SIZE (operator_array)); + b++) + { + cpp_hashnode *hp = cpp_lookup (pfile, b->name, b->len); + hp->flags |= NODE_OPERATOR; + hp->is_directive = 0; + hp->directive_index = b->value; + } +} + +void +cpp_init_special_builtins (cpp_reader *pfile) +{ + const struct builtin *b; + size_t n = ARRAY_SIZE (builtin_array); + + if (CPP_OPTION (pfile, traditional)) + n -= 2; + else if (! CPP_OPTION (pfile, stdc_0_in_system_headers) + || CPP_OPTION (pfile, std)) + n--; + + for (b = builtin_array; b < builtin_array + n; b++) + { + cpp_hashnode *hp = cpp_lookup (pfile, b->name, b->len); + hp->type = NT_MACRO; + hp->flags |= NODE_BUILTIN | NODE_WARN; + hp->value.builtin = (enum builtin_type) b->value; + } +} + +/* Read the builtins table above and enter them, and language-specific + macros, into the hash table. HOSTED is true if this is a hosted + environment. */ +void +cpp_init_builtins (cpp_reader *pfile, int hosted) +{ + cpp_init_special_builtins (pfile); + + if (!CPP_OPTION (pfile, traditional) + && (! CPP_OPTION (pfile, stdc_0_in_system_headers) + || CPP_OPTION (pfile, std))) + _cpp_define_builtin (pfile, "__STDC__ 1"); + + if (CPP_OPTION (pfile, cplusplus)) + _cpp_define_builtin (pfile, "__cplusplus 1"); + else if (CPP_OPTION (pfile, lang) == CLK_ASM) + _cpp_define_builtin (pfile, "__ASSEMBLER__ 1"); + else if (CPP_OPTION (pfile, lang) == CLK_STDC94) + _cpp_define_builtin (pfile, "__STDC_VERSION__ 199409L"); + else if (CPP_OPTION (pfile, c99)) + _cpp_define_builtin (pfile, "__STDC_VERSION__ 199901L"); + + if (hosted) + _cpp_define_builtin (pfile, "__STDC_HOSTED__ 1"); + else + _cpp_define_builtin (pfile, "__STDC_HOSTED__ 0"); + + if (CPP_OPTION (pfile, objc)) + _cpp_define_builtin (pfile, "__OBJC__ 1"); +} + +/* Sanity-checks are dependent on command-line options, so it is + called as a subroutine of cpp_read_main_file (). */ +#if ENABLE_CHECKING +static void sanity_checks (cpp_reader *); +static void sanity_checks (cpp_reader *pfile) +{ + cppchar_t test = 0; + size_t max_precision = 2 * CHAR_BIT * sizeof (cpp_num_part); + + /* Sanity checks for assumptions about CPP arithmetic and target + type precisions made by cpplib. */ + test--; + if (test < 1) + cpp_error (pfile, CPP_DL_ICE, "cppchar_t must be an unsigned type"); + + if (CPP_OPTION (pfile, precision) > max_precision) + cpp_error (pfile, CPP_DL_ICE, + "preprocessor arithmetic has maximum precision of %lu bits;" + " target requires %lu bits", + (unsigned long) max_precision, + (unsigned long) CPP_OPTION (pfile, precision)); + + if (CPP_OPTION (pfile, precision) < CPP_OPTION (pfile, int_precision)) + cpp_error (pfile, CPP_DL_ICE, + "CPP arithmetic must be at least as precise as a target int"); + + if (CPP_OPTION (pfile, char_precision) < 8) + cpp_error (pfile, CPP_DL_ICE, "target char is less than 8 bits wide"); + + if (CPP_OPTION (pfile, wchar_precision) < CPP_OPTION (pfile, char_precision)) + cpp_error (pfile, CPP_DL_ICE, + "target wchar_t is narrower than target char"); + + if (CPP_OPTION (pfile, int_precision) < CPP_OPTION (pfile, char_precision)) + cpp_error (pfile, CPP_DL_ICE, + "target int is narrower than target char"); + + /* This is assumed in eval_token() and could be fixed if necessary. */ + if (sizeof (cppchar_t) > sizeof (cpp_num_part)) + cpp_error (pfile, CPP_DL_ICE, + "CPP half-integer narrower than CPP character"); + + if (CPP_OPTION (pfile, wchar_precision) > BITS_PER_CPPCHAR_T) + cpp_error (pfile, CPP_DL_ICE, + "CPP on this host cannot handle wide character constants over" + " %lu bits, but the target requires %lu bits", + (unsigned long) BITS_PER_CPPCHAR_T, + (unsigned long) CPP_OPTION (pfile, wchar_precision)); +} +#else +# define sanity_checks(PFILE) +#endif + +/* This is called after options have been parsed, and partially + processed. */ +void +cpp_post_options (cpp_reader *pfile) +{ + sanity_checks (pfile); + + post_options (pfile); + + /* Mark named operators before handling command line macros. */ + if (CPP_OPTION (pfile, cplusplus) && CPP_OPTION (pfile, operator_names)) + mark_named_operators (pfile); +} + +/* Setup for processing input from the file named FNAME, or stdin if + it is the empty string. Return the original filename + on success (e.g. foo.i->foo.c), or NULL on failure. */ +const char * +cpp_read_main_file (cpp_reader *pfile, const char *fname) +{ + if (CPP_OPTION (pfile, deps.style) != DEPS_NONE) + { + if (!pfile->deps) + pfile->deps = deps_init (); + + /* Set the default target (if there is none already). */ + deps_add_default_target (pfile->deps, fname); + } + + pfile->main_file + = _cpp_find_file (pfile, fname, &pfile->no_search_path, false, 0); + if (_cpp_find_failed (pfile->main_file)) + return NULL; + + _cpp_stack_file (pfile, pfile->main_file, false); + + /* For foo.i, read the original filename foo.c now, for the benefit + of the front ends. */ + if (CPP_OPTION (pfile, preprocessed)) + { + read_original_filename (pfile); + fname = pfile->line_table->maps[pfile->line_table->used-1].to_file; + } + return fname; +} + +/* For preprocessed files, if the first tokens are of the form # NUM. + handle the directive so we know the original file name. This will + generate file_change callbacks, which the front ends must handle + appropriately given their state of initialization. */ +static void +read_original_filename (cpp_reader *pfile) +{ + const cpp_token *token, *token1; + + /* Lex ahead; if the first tokens are of the form # NUM, then + process the directive, otherwise back up. */ + token = _cpp_lex_direct (pfile); + if (token->type == CPP_HASH) + { + pfile->state.in_directive = 1; + token1 = _cpp_lex_direct (pfile); + _cpp_backup_tokens (pfile, 1); + pfile->state.in_directive = 0; + + /* If it's a #line directive, handle it. */ + if (token1->type == CPP_NUMBER) + { + _cpp_handle_directive (pfile, token->flags & PREV_WHITE); + read_original_directory (pfile); + return; + } + } + + /* Backup as if nothing happened. */ + _cpp_backup_tokens (pfile, 1); +} + +/* For preprocessed files, if the tokens following the first filename + line is of the form # "/path/name//", handle the + directive so we know the original current directory. */ +static void +read_original_directory (cpp_reader *pfile) +{ + const cpp_token *hash, *token; + + /* Lex ahead; if the first tokens are of the form # NUM, then + process the directive, otherwise back up. */ + hash = _cpp_lex_direct (pfile); + if (hash->type != CPP_HASH) + { + _cpp_backup_tokens (pfile, 1); + return; + } + + token = _cpp_lex_direct (pfile); + + if (token->type != CPP_NUMBER) + { + _cpp_backup_tokens (pfile, 2); + return; + } + + token = _cpp_lex_direct (pfile); + + if (token->type != CPP_STRING + || ! (token->val.str.len >= 5 + && token->val.str.text[token->val.str.len-2] == '/' + && token->val.str.text[token->val.str.len-3] == '/')) + { + _cpp_backup_tokens (pfile, 3); + return; + } + + if (pfile->cb.dir_change) + { + char *debugdir = (char *) alloca (token->val.str.len - 3); + + memcpy (debugdir, (const char *) token->val.str.text + 1, + token->val.str.len - 4); + debugdir[token->val.str.len - 4] = '\0'; + + pfile->cb.dir_change (pfile, debugdir); + } +} + +/* This is called at the end of preprocessing. It pops the last + buffer and writes dependency output, and returns the number of + errors. + + Maybe it should also reset state, such that you could call + cpp_start_read with a new filename to restart processing. */ +int +cpp_finish (cpp_reader *pfile, FILE *deps_stream) +{ + /* Warn about unused macros before popping the final buffer. */ + if (CPP_OPTION (pfile, warn_unused_macros)) + cpp_forall_identifiers (pfile, _cpp_warn_if_unused_macro, NULL); + + /* lex.c leaves the final buffer on the stack. This it so that + it returns an unending stream of CPP_EOFs to the client. If we + popped the buffer, we'd dereference a NULL buffer pointer and + segfault. It's nice to allow the client to do worry-free excess + cpp_get_token calls. */ + while (pfile->buffer) + _cpp_pop_buffer (pfile); + + /* Don't write the deps file if there are errors. */ + if (CPP_OPTION (pfile, deps.style) != DEPS_NONE + && deps_stream && pfile->errors == 0) + { + deps_write (pfile->deps, deps_stream, 72); + + if (CPP_OPTION (pfile, deps.phony_targets)) + deps_phony_targets (pfile->deps, deps_stream); + } + + /* Report on headers that could use multiple include guards. */ + if (CPP_OPTION (pfile, print_include_names)) + _cpp_report_missing_guards (pfile); + + return pfile->errors; +} + +static void +post_options (cpp_reader *pfile) +{ + /* -Wtraditional is not useful in C++ mode. */ + if (CPP_OPTION (pfile, cplusplus)) + CPP_OPTION (pfile, warn_traditional) = 0; + + /* Permanently disable macro expansion if we are rescanning + preprocessed text. Read preprocesed source in ISO mode. */ + if (CPP_OPTION (pfile, preprocessed)) + { + if (!CPP_OPTION (pfile, directives_only)) + pfile->state.prevent_expansion = 1; + CPP_OPTION (pfile, traditional) = 0; + } + + if (CPP_OPTION (pfile, warn_trigraphs) == 2) + CPP_OPTION (pfile, warn_trigraphs) = !CPP_OPTION (pfile, trigraphs); + + if (CPP_OPTION (pfile, traditional)) + { + CPP_OPTION (pfile, cplusplus_comments) = 0; + + /* Traditional CPP does not accurately track column information. */ + CPP_OPTION (pfile, show_column) = 0; + CPP_OPTION (pfile, trigraphs) = 0; + CPP_OPTION (pfile, warn_trigraphs) = 0; + } +} diff --git a/libcpp/internal.h b/libcpp/internal.h new file mode 100644 index 0000000..6110e5c --- /dev/null +++ b/libcpp/internal.h @@ -0,0 +1,702 @@ +/* Part of CPP library. + Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007 + 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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* This header defines all the internal data structures and functions + that need to be visible across files. It should not be used outside + cpplib. */ + +#ifndef LIBCPP_INTERNAL_H +#define LIBCPP_INTERNAL_H + +#include "symtab.h" +#include "cpp-id-data.h" + +#ifndef HAVE_ICONV_H +#undef HAVE_ICONV +#endif + +#if HAVE_ICONV +#include +#else +#define HAVE_ICONV 0 +typedef int iconv_t; /* dummy */ +#endif + +struct directive; /* Deliberately incomplete. */ +struct pending_option; +struct op; +struct _cpp_strbuf; + +typedef bool (*convert_f) (iconv_t, const unsigned char *, size_t, + struct _cpp_strbuf *); +struct cset_converter +{ + convert_f func; + iconv_t cd; +}; + +#define BITS_PER_CPPCHAR_T (CHAR_BIT * sizeof (cppchar_t)) + +/* Test if a sign is valid within a preprocessing number. */ +#define VALID_SIGN(c, prevc) \ + (((c) == '+' || (c) == '-') && \ + ((prevc) == 'e' || (prevc) == 'E' \ + || (((prevc) == 'p' || (prevc) == 'P') \ + && CPP_OPTION (pfile, extended_numbers)))) + +#define CPP_OPTION(PFILE, OPTION) ((PFILE)->opts.OPTION) +#define CPP_BUFFER(PFILE) ((PFILE)->buffer) +#define CPP_BUF_COLUMN(BUF, CUR) ((CUR) - (BUF)->line_base) +#define CPP_BUF_COL(BUF) CPP_BUF_COLUMN(BUF, (BUF)->cur) + +#define CPP_INCREMENT_LINE(PFILE, COLS_HINT) do { \ + const struct line_maps *line_table = PFILE->line_table; \ + const struct line_map *map = &line_table->maps[line_table->used-1]; \ + unsigned int line = SOURCE_LINE (map, line_table->highest_line); \ + linemap_line_start (PFILE->line_table, line + 1, COLS_HINT); \ + } while (0) + +/* Maximum nesting of cpp_buffers. We use a static limit, partly for + efficiency, and partly to limit runaway recursion. */ +#define CPP_STACK_MAX 200 + +/* Host alignment handling. */ +struct dummy +{ + char c; + union + { + double d; + int *p; + } u; +}; + +#define DEFAULT_ALIGNMENT offsetof (struct dummy, u) +#define CPP_ALIGN2(size, align) (((size) + ((align) - 1)) & ~((align) - 1)) +#define CPP_ALIGN(size) CPP_ALIGN2 (size, DEFAULT_ALIGNMENT) + +#define _cpp_mark_macro_used(NODE) do { \ + if ((NODE)->type == NT_MACRO && !((NODE)->flags & NODE_BUILTIN)) \ + (NODE)->value.macro->used = 1; } while (0) + +/* A generic memory buffer, and operations on it. */ +typedef struct _cpp_buff _cpp_buff; +struct _cpp_buff +{ + struct _cpp_buff *next; + unsigned char *base, *cur, *limit; +}; + +extern _cpp_buff *_cpp_get_buff (cpp_reader *, size_t); +extern void _cpp_release_buff (cpp_reader *, _cpp_buff *); +extern void _cpp_extend_buff (cpp_reader *, _cpp_buff **, size_t); +extern _cpp_buff *_cpp_append_extend_buff (cpp_reader *, _cpp_buff *, size_t); +extern void _cpp_free_buff (_cpp_buff *); +extern unsigned char *_cpp_aligned_alloc (cpp_reader *, size_t); +extern unsigned char *_cpp_unaligned_alloc (cpp_reader *, size_t); + +#define BUFF_ROOM(BUFF) (size_t) ((BUFF)->limit - (BUFF)->cur) +#define BUFF_FRONT(BUFF) ((BUFF)->cur) +#define BUFF_LIMIT(BUFF) ((BUFF)->limit) + +/* #include types. */ +enum include_type {IT_INCLUDE, IT_INCLUDE_NEXT, IT_IMPORT, IT_CMDLINE}; + +union utoken +{ + const cpp_token *token; + const cpp_token **ptoken; +}; + +/* A "run" of tokens; part of a chain of runs. */ +typedef struct tokenrun tokenrun; +struct tokenrun +{ + tokenrun *next, *prev; + cpp_token *base, *limit; +}; + +/* Accessor macros for struct cpp_context. */ +#define FIRST(c) ((c)->u.iso.first) +#define LAST(c) ((c)->u.iso.last) +#define CUR(c) ((c)->u.trad.cur) +#define RLIMIT(c) ((c)->u.trad.rlimit) + +typedef struct cpp_context cpp_context; +struct cpp_context +{ + /* Doubly-linked list. */ + cpp_context *next, *prev; + + union + { + /* For ISO macro expansion. Contexts other than the base context + are contiguous tokens. e.g. macro expansions, expanded + argument tokens. */ + struct + { + union utoken first; + union utoken last; + } iso; + + /* For traditional macro expansion. */ + struct + { + const unsigned char *cur; + const unsigned char *rlimit; + } trad; + } u; + + /* If non-NULL, a buffer used for storage related to this context. + When the context is popped, the buffer is released. */ + _cpp_buff *buff; + + /* For a macro context, the macro node, otherwise NULL. */ + cpp_hashnode *macro; + + /* True if utoken element is token, else ptoken. */ + bool direct_p; +}; + +struct lexer_state +{ + /* Nonzero if first token on line is CPP_HASH. */ + unsigned char in_directive; + + /* Nonzero if in a directive that will handle padding tokens itself. + #include needs this to avoid problems with computed include and + spacing between tokens. */ + unsigned char directive_wants_padding; + + /* True if we are skipping a failed conditional group. */ + unsigned char skipping; + + /* Nonzero if in a directive that takes angle-bracketed headers. */ + unsigned char angled_headers; + + /* Nonzero if in a #if or #elif directive. */ + unsigned char in_expression; + + /* Nonzero to save comments. Turned off if discard_comments, and in + all directives apart from #define. */ + unsigned char save_comments; + + /* Nonzero if lexing __VA_ARGS__ is valid. */ + unsigned char va_args_ok; + + /* Nonzero if lexing poisoned identifiers is valid. */ + unsigned char poisoned_ok; + + /* Nonzero to prevent macro expansion. */ + unsigned char prevent_expansion; + + /* Nonzero when parsing arguments to a function-like macro. */ + unsigned char parsing_args; + + /* Nonzero if prevent_expansion is true only because output is + being discarded. */ + unsigned char discarding_output; + + /* Nonzero to skip evaluating part of an expression. */ + unsigned int skip_eval; + + /* Nonzero when handling a deferred pragma. */ + unsigned char in_deferred_pragma; + + /* Nonzero if the deferred pragma being handled allows macro expansion. */ + unsigned char pragma_allow_expansion; +}; + +/* Special nodes - identifiers with predefined significance. */ +struct spec_nodes +{ + cpp_hashnode *n_defined; /* defined operator */ + cpp_hashnode *n_true; /* C++ keyword true */ + cpp_hashnode *n_false; /* C++ keyword false */ + cpp_hashnode *n__VA_ARGS__; /* C99 vararg macros */ +}; + +typedef struct _cpp_line_note _cpp_line_note; +struct _cpp_line_note +{ + /* Location in the clean line the note refers to. */ + const unsigned char *pos; + + /* Type of note. The 9 'from' trigraph characters represent those + trigraphs, '\\' an escaped newline, ' ' an escaped newline with + intervening space, and anything else is invalid. */ + unsigned int type; +}; + +/* Represents the contents of a file cpplib has read in. */ +struct cpp_buffer +{ + const unsigned char *cur; /* Current location. */ + const unsigned char *line_base; /* Start of current physical line. */ + const unsigned char *next_line; /* Start of to-be-cleaned logical line. */ + + const unsigned char *buf; /* Entire character buffer. */ + const unsigned char *rlimit; /* Writable byte at end of file. */ + + _cpp_line_note *notes; /* Array of notes. */ + unsigned int cur_note; /* Next note to process. */ + unsigned int notes_used; /* Number of notes. */ + unsigned int notes_cap; /* Size of allocated array. */ + + struct cpp_buffer *prev; + + /* Pointer into the file table; non-NULL if this is a file buffer. + Used for include_next and to record control macros. */ + struct _cpp_file *file; + + /* Saved value of __TIMESTAMP__ macro - date and time of last modification + of the assotiated file. */ + const unsigned char *timestamp; + + /* Value of if_stack at start of this file. + Used to prohibit unmatched #endif (etc) in an include file. */ + struct if_stack *if_stack; + + /* True if we need to get the next clean line. */ + bool need_line; + + /* True if we have already warned about C++ comments in this file. + The warning happens only for C89 extended mode with -pedantic on, + or for -Wtraditional, and only once per file (otherwise it would + be far too noisy). */ + unsigned int warned_cplusplus_comments : 1; + + /* True if we don't process trigraphs and escaped newlines. True + for preprocessed input, command line directives, and _Pragma + buffers. */ + unsigned int from_stage3 : 1; + + /* At EOF, a buffer is automatically popped. If RETURN_AT_EOF is + true, a CPP_EOF token is then returned. Otherwise, the next + token from the enclosing buffer is returned. */ + unsigned int return_at_eof : 1; + + /* One for a system header, two for a C system header file that therefore + needs to be extern "C" protected in C++, and zero otherwise. */ + unsigned char sysp; + + /* The directory of the this buffer's file. Its NAME member is not + allocated, so we don't need to worry about freeing it. */ + struct cpp_dir dir; + + /* Descriptor for converting from the input character set to the + source character set. */ + struct cset_converter input_cset_desc; +}; + +/* A cpp_reader encapsulates the "state" of a pre-processor run. + Applying cpp_get_token repeatedly yields a stream of pre-processor + tokens. Usually, there is only one cpp_reader object active. */ +struct cpp_reader +{ + /* Top of buffer stack. */ + cpp_buffer *buffer; + + /* Overlaid buffer (can be different after processing #include). */ + cpp_buffer *overlaid_buffer; + + /* Lexer state. */ + struct lexer_state state; + + /* Source line tracking. */ + struct line_maps *line_table; + + /* The line of the '#' of the current directive. */ + source_location directive_line; + + /* Memory buffers. */ + _cpp_buff *a_buff; /* Aligned permanent storage. */ + _cpp_buff *u_buff; /* Unaligned permanent storage. */ + _cpp_buff *free_buffs; /* Free buffer chain. */ + + /* Context stack. */ + struct cpp_context base_context; + struct cpp_context *context; + + /* If in_directive, the directive if known. */ + const struct directive *directive; + + /* Token generated while handling a directive, if any. */ + cpp_token directive_result; + + /* When expanding a macro at top-level, this is the location of the + macro invocation. */ + source_location invocation_location; + + /* True if this call to cpp_get_token should consider setting + invocation_location. */ + bool set_invocation_location; + + /* Search paths for include files. */ + struct cpp_dir *quote_include; /* "" */ + struct cpp_dir *bracket_include; /* <> */ + struct cpp_dir no_search_path; /* No path. */ + + /* Chain of all hashed _cpp_file instances. */ + struct _cpp_file *all_files; + + struct _cpp_file *main_file; + + /* File and directory hash table. */ + struct htab *file_hash; + struct htab *dir_hash; + struct file_hash_entry_pool *file_hash_entries; + + /* Negative path lookup hash table. */ + struct htab *nonexistent_file_hash; + struct obstack nonexistent_file_ob; + + /* Nonzero means don't look for #include "foo" the source-file + directory. */ + bool quote_ignores_source_dir; + + /* Nonzero if any file has contained #pragma once or #import has + been used. */ + bool seen_once_only; + + /* Multiple include optimization. */ + const cpp_hashnode *mi_cmacro; + const cpp_hashnode *mi_ind_cmacro; + bool mi_valid; + + /* Lexing. */ + cpp_token *cur_token; + tokenrun base_run, *cur_run; + unsigned int lookaheads; + + /* Nonzero prevents the lexer from re-using the token runs. */ + unsigned int keep_tokens; + + /* Error counter for exit code. */ + unsigned int errors; + + /* Buffer to hold macro definition string. */ + unsigned char *macro_buffer; + unsigned int macro_buffer_len; + + /* Descriptor for converting from the source character set to the + execution character set. */ + struct cset_converter narrow_cset_desc; + + /* Descriptor for converting from the source character set to the + wide execution character set. */ + struct cset_converter wide_cset_desc; + + /* Date and time text. Calculated together if either is requested. */ + const unsigned char *date; + const unsigned char *time; + + /* EOF token, and a token forcing paste avoidance. */ + cpp_token avoid_paste; + cpp_token eof; + + /* Opaque handle to the dependencies of mkdeps.c. */ + struct deps *deps; + + /* Obstack holding all macro hash nodes. This never shrinks. + See identifiers.c */ + struct obstack hash_ob; + + /* Obstack holding buffer and conditional structures. This is a + real stack. See directives.c. */ + struct obstack buffer_ob; + + /* Pragma table - dynamic, because a library user can add to the + list of recognized pragmas. */ + struct pragma_entry *pragmas; + + /* Call backs to cpplib client. */ + struct cpp_callbacks cb; + + /* Identifier hash table. */ + struct ht *hash_table; + + /* Expression parser stack. */ + struct op *op_stack, *op_limit; + + /* User visible options. */ + struct cpp_options opts; + + /* Special nodes - identifiers with predefined significance to the + preprocessor. */ + struct spec_nodes spec_nodes; + + /* Whether cpplib owns the hashtable. */ + bool our_hashtable; + + /* Traditional preprocessing output buffer (a logical line). */ + struct + { + unsigned char *base; + unsigned char *limit; + unsigned char *cur; + source_location first_line; + } out; + + /* Used for buffer overlays by traditional.c. */ + const unsigned char *saved_cur, *saved_rlimit, *saved_line_base; + + /* A saved list of the defined macros, for dependency checking + of precompiled headers. */ + struct cpp_savedstate *savedstate; + + /* Next value of __COUNTER__ macro. */ + unsigned int counter; +}; + +/* Character classes. Based on the more primitive macros in safe-ctype.h. + If the definition of `numchar' looks odd to you, please look up the + definition of a pp-number in the C standard [section 6.4.8 of C99]. + + In the unlikely event that characters other than \r and \n enter + the set is_vspace, the macro handle_newline() in lex.c must be + updated. */ +#define _dollar_ok(x) ((x) == '$' && CPP_OPTION (pfile, dollars_in_ident)) + +#define is_idchar(x) (ISIDNUM(x) || _dollar_ok(x)) +#define is_numchar(x) ISIDNUM(x) +#define is_idstart(x) (ISIDST(x) || _dollar_ok(x)) +#define is_numstart(x) ISDIGIT(x) +#define is_hspace(x) ISBLANK(x) +#define is_vspace(x) IS_VSPACE(x) +#define is_nvspace(x) IS_NVSPACE(x) +#define is_space(x) IS_SPACE_OR_NUL(x) + +/* This table is constant if it can be initialized at compile time, + which is the case if cpp was compiled with GCC >=2.7, or another + compiler that supports C99. */ +#if HAVE_DESIGNATED_INITIALIZERS +extern const unsigned char _cpp_trigraph_map[UCHAR_MAX + 1]; +#else +extern unsigned char _cpp_trigraph_map[UCHAR_MAX + 1]; +#endif + +/* Macros. */ + +static inline int cpp_in_system_header (cpp_reader *); +static inline int +cpp_in_system_header (cpp_reader *pfile) +{ + return pfile->buffer ? pfile->buffer->sysp : 0; +} +#define CPP_PEDANTIC(PF) CPP_OPTION (PF, pedantic) +#define CPP_WTRADITIONAL(PF) CPP_OPTION (PF, warn_traditional) + +static inline int cpp_in_primary_file (cpp_reader *); +static inline int +cpp_in_primary_file (cpp_reader *pfile) +{ + return pfile->line_table->depth == 1; +} + +/* In errors.c */ +extern int _cpp_begin_message (cpp_reader *, int, + source_location, unsigned int); + +/* In macro.c */ +extern void _cpp_free_definition (cpp_hashnode *); +extern bool _cpp_create_definition (cpp_reader *, cpp_hashnode *); +extern void _cpp_pop_context (cpp_reader *); +extern void _cpp_push_text_context (cpp_reader *, cpp_hashnode *, + const unsigned char *, size_t); +extern bool _cpp_save_parameter (cpp_reader *, cpp_macro *, cpp_hashnode *); +extern bool _cpp_arguments_ok (cpp_reader *, cpp_macro *, const cpp_hashnode *, + unsigned int); +extern const unsigned char *_cpp_builtin_macro_text (cpp_reader *, + cpp_hashnode *); +extern int _cpp_warn_if_unused_macro (cpp_reader *, cpp_hashnode *, void *); +extern void _cpp_push_token_context (cpp_reader *, cpp_hashnode *, + const cpp_token *, unsigned int); + +/* In identifiers.c */ +extern void _cpp_init_hashtable (cpp_reader *, hash_table *); +extern void _cpp_destroy_hashtable (cpp_reader *); + +/* In files.c */ +typedef struct _cpp_file _cpp_file; +extern _cpp_file *_cpp_find_file (cpp_reader *, const char *, cpp_dir *, + bool, int); +extern bool _cpp_find_failed (_cpp_file *); +extern void _cpp_mark_file_once_only (cpp_reader *, struct _cpp_file *); +extern void _cpp_fake_include (cpp_reader *, const char *); +extern bool _cpp_stack_file (cpp_reader *, _cpp_file*, bool); +extern bool _cpp_stack_include (cpp_reader *, const char *, int, + enum include_type); +extern int _cpp_compare_file_date (cpp_reader *, const char *, int); +extern void _cpp_report_missing_guards (cpp_reader *); +extern void _cpp_init_files (cpp_reader *); +extern void _cpp_cleanup_files (cpp_reader *); +extern void _cpp_pop_file_buffer (cpp_reader *, struct _cpp_file *); +extern bool _cpp_save_file_entries (cpp_reader *pfile, FILE *f); +extern bool _cpp_read_file_entries (cpp_reader *, FILE *); +extern struct stat *_cpp_get_file_stat (_cpp_file *); + +/* In expr.c */ +extern bool _cpp_parse_expr (cpp_reader *); +extern struct op *_cpp_expand_op_stack (cpp_reader *); + +/* In lex.c */ +extern void _cpp_process_line_notes (cpp_reader *, int); +extern void _cpp_clean_line (cpp_reader *); +extern bool _cpp_get_fresh_line (cpp_reader *); +extern bool _cpp_skip_block_comment (cpp_reader *); +extern cpp_token *_cpp_temp_token (cpp_reader *); +extern const cpp_token *_cpp_lex_token (cpp_reader *); +extern cpp_token *_cpp_lex_direct (cpp_reader *); +extern int _cpp_equiv_tokens (const cpp_token *, const cpp_token *); +extern void _cpp_init_tokenrun (tokenrun *, unsigned int); + +/* In init.c. */ +extern void _cpp_maybe_push_include_file (cpp_reader *); + +/* In directives.c */ +extern int _cpp_test_assertion (cpp_reader *, unsigned int *); +extern int _cpp_handle_directive (cpp_reader *, int); +extern void _cpp_define_builtin (cpp_reader *, const char *); +extern char ** _cpp_save_pragma_names (cpp_reader *); +extern void _cpp_restore_pragma_names (cpp_reader *, char **); +extern int _cpp_do__Pragma (cpp_reader *); +extern void _cpp_init_directives (cpp_reader *); +extern void _cpp_init_internal_pragmas (cpp_reader *); +extern void _cpp_do_file_change (cpp_reader *, enum lc_reason, const char *, + unsigned int, unsigned int); +extern void _cpp_pop_buffer (cpp_reader *); + +/* In directives.c */ +struct _cpp_dir_only_callbacks +{ + /* Called to print a block of lines. */ + void (*print_lines) (int, const void *, size_t); + void (*maybe_print_line) (source_location); +}; + +extern void _cpp_preprocess_dir_only (cpp_reader *, + const struct _cpp_dir_only_callbacks *); + +/* In traditional.c. */ +extern bool _cpp_scan_out_logical_line (cpp_reader *, cpp_macro *); +extern bool _cpp_read_logical_line_trad (cpp_reader *); +extern void _cpp_overlay_buffer (cpp_reader *pfile, const unsigned char *, + size_t); +extern void _cpp_remove_overlay (cpp_reader *); +extern bool _cpp_create_trad_definition (cpp_reader *, cpp_macro *); +extern bool _cpp_expansions_different_trad (const cpp_macro *, + const cpp_macro *); +extern unsigned char *_cpp_copy_replacement_text (const cpp_macro *, + unsigned char *); +extern size_t _cpp_replacement_text_len (const cpp_macro *); + +/* In charset.c. */ + +/* The normalization state at this point in the sequence. + It starts initialized to all zeros, and at the end + 'level' is the normalization level of the sequence. */ + +struct normalize_state +{ + /* The previous character. */ + cppchar_t previous; + /* The combining class of the previous character. */ + unsigned char prev_class; + /* The lowest normalization level so far. */ + enum cpp_normalize_level level; +}; +#define INITIAL_NORMALIZE_STATE { 0, 0, normalized_KC } +#define NORMALIZE_STATE_RESULT(st) ((st)->level) + +/* We saw a character that matches ISIDNUM(), update a + normalize_state appropriately. */ +#define NORMALIZE_STATE_UPDATE_IDNUM(st) \ + ((st)->previous = 0, (st)->prev_class = 0) + +extern cppchar_t _cpp_valid_ucn (cpp_reader *, const unsigned char **, + const unsigned char *, int, + struct normalize_state *state); +extern void _cpp_destroy_iconv (cpp_reader *); +extern unsigned char *_cpp_convert_input (cpp_reader *, const char *, + unsigned char *, size_t, size_t, + off_t *); +extern const char *_cpp_default_encoding (void); +extern cpp_hashnode * _cpp_interpret_identifier (cpp_reader *pfile, + const unsigned char *id, + size_t len); + +/* Utility routines and macros. */ +#define DSC(str) (const unsigned char *)str, sizeof str - 1 + +/* These are inline functions instead of macros so we can get type + checking. */ +static inline int ustrcmp (const unsigned char *, const unsigned char *); +static inline int ustrncmp (const unsigned char *, const unsigned char *, + size_t); +static inline size_t ustrlen (const unsigned char *); +static inline unsigned char *uxstrdup (const unsigned char *); +static inline unsigned char *ustrchr (const unsigned char *, int); +static inline int ufputs (const unsigned char *, FILE *); + +/* Use a const char for the second parameter since it is usually a literal. */ +static inline int ustrcspn (const unsigned char *, const char *); + +static inline int +ustrcmp (const unsigned char *s1, const unsigned char *s2) +{ + return strcmp ((const char *)s1, (const char *)s2); +} + +static inline int +ustrncmp (const unsigned char *s1, const unsigned char *s2, size_t n) +{ + return strncmp ((const char *)s1, (const char *)s2, n); +} + +static inline int +ustrcspn (const unsigned char *s1, const char *s2) +{ + return strcspn ((const char *)s1, s2); +} + +static inline size_t +ustrlen (const unsigned char *s1) +{ + return strlen ((const char *)s1); +} + +static inline unsigned char * +uxstrdup (const unsigned char *s1) +{ + return (unsigned char *) xstrdup ((const char *)s1); +} + +static inline unsigned char * +ustrchr (const unsigned char *s1, int c) +{ + return (unsigned char *) strchr ((const char *)s1, c); +} + +static inline int +ufputs (const unsigned char *s, FILE *f) +{ + return fputs ((const char *)s, f); +} + +#endif /* ! LIBCPP_INTERNAL_H */ diff --git a/libcpp/lex.c b/libcpp/lex.c new file mode 100644 index 0000000..c3edcfd --- /dev/null +++ b/libcpp/lex.c @@ -0,0 +1,1723 @@ +/* CPP Library - lexical analysis. + Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. + Contributed by Per Bothner, 1994-95. + Based on CCCP program by Paul Rubin, June 1986 + Adapted to ANSI C, Richard Stallman, Jan 1987 + Broken out to separate file, Zack Weinberg, Mar 2000 + +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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include "config.h" +#include "system.h" +#include "cpplib.h" +#include "internal.h" + +enum spell_type +{ + SPELL_OPERATOR = 0, + SPELL_IDENT, + SPELL_LITERAL, + SPELL_NONE +}; + +struct token_spelling +{ + enum spell_type category; + const unsigned char *name; +}; + +static const unsigned char *const digraph_spellings[] = +{ U"%:", U"%:%:", U"<:", U":>", U"<%", U"%>" }; + +#define OP(e, s) { SPELL_OPERATOR, U s }, +#define TK(e, s) { SPELL_ ## s, U #e }, +static const struct token_spelling token_spellings[N_TTYPES] = { TTYPE_TABLE }; +#undef OP +#undef TK + +#define TOKEN_SPELL(token) (token_spellings[(token)->type].category) +#define TOKEN_NAME(token) (token_spellings[(token)->type].name) + +static void add_line_note (cpp_buffer *, const uchar *, unsigned int); +static int skip_line_comment (cpp_reader *); +static void skip_whitespace (cpp_reader *, cppchar_t); +static void lex_string (cpp_reader *, cpp_token *, const uchar *); +static void save_comment (cpp_reader *, cpp_token *, const uchar *, cppchar_t); +static void create_literal (cpp_reader *, cpp_token *, const uchar *, + unsigned int, enum cpp_ttype); +static bool warn_in_comment (cpp_reader *, _cpp_line_note *); +static int name_p (cpp_reader *, const cpp_string *); +static tokenrun *next_tokenrun (tokenrun *); + +static _cpp_buff *new_buff (size_t); + + +/* Utility routine: + + Compares, the token TOKEN to the NUL-terminated string STRING. + TOKEN must be a CPP_NAME. Returns 1 for equal, 0 for unequal. */ +int +cpp_ideq (const cpp_token *token, const char *string) +{ + if (token->type != CPP_NAME) + return 0; + + return !ustrcmp (NODE_NAME (token->val.node), (const uchar *) string); +} + +/* Record a note TYPE at byte POS into the current cleaned logical + line. */ +static void +add_line_note (cpp_buffer *buffer, const uchar *pos, unsigned int type) +{ + if (buffer->notes_used == buffer->notes_cap) + { + buffer->notes_cap = buffer->notes_cap * 2 + 200; + buffer->notes = XRESIZEVEC (_cpp_line_note, buffer->notes, + buffer->notes_cap); + } + + buffer->notes[buffer->notes_used].pos = pos; + buffer->notes[buffer->notes_used].type = type; + buffer->notes_used++; +} + +/* Returns with a logical line that contains no escaped newlines or + trigraphs. This is a time-critical inner loop. */ +void +_cpp_clean_line (cpp_reader *pfile) +{ + cpp_buffer *buffer; + const uchar *s; + uchar c, *d, *p; + + buffer = pfile->buffer; + buffer->cur_note = buffer->notes_used = 0; + buffer->cur = buffer->line_base = buffer->next_line; + buffer->need_line = false; + s = buffer->next_line - 1; + + if (!buffer->from_stage3) + { + const uchar *pbackslash = NULL; + + /* Short circuit for the common case of an un-escaped line with + no trigraphs. The primary win here is by not writing any + data back to memory until we have to. */ + for (;;) + { + c = *++s; + if (__builtin_expect (c == '\n', false) + || __builtin_expect (c == '\r', false)) + { + d = (uchar *) s; + + if (__builtin_expect (s == buffer->rlimit, false)) + goto done; + + /* DOS line ending? */ + if (__builtin_expect (c == '\r', false) + && s[1] == '\n') + { + s++; + if (s == buffer->rlimit) + goto done; + } + + if (__builtin_expect (pbackslash == NULL, true)) + goto done; + + /* Check for escaped newline. */ + p = d; + while (is_nvspace (p[-1])) + p--; + if (p - 1 != pbackslash) + goto done; + + /* Have an escaped newline; process it and proceed to + the slow path. */ + add_line_note (buffer, p - 1, p != d ? ' ' : '\\'); + d = p - 2; + buffer->next_line = p - 1; + break; + } + if (__builtin_expect (c == '\\', false)) + pbackslash = s; + else if (__builtin_expect (c == '?', false) + && __builtin_expect (s[1] == '?', false) + && _cpp_trigraph_map[s[2]]) + { + /* Have a trigraph. We may or may not have to convert + it. Add a line note regardless, for -Wtrigraphs. */ + add_line_note (buffer, s, s[2]); + if (CPP_OPTION (pfile, trigraphs)) + { + /* We do, and that means we have to switch to the + slow path. */ + d = (uchar *) s; + *d = _cpp_trigraph_map[s[2]]; + s += 2; + break; + } + } + } + + + for (;;) + { + c = *++s; + *++d = c; + + if (c == '\n' || c == '\r') + { + /* Handle DOS line endings. */ + if (c == '\r' && s != buffer->rlimit && s[1] == '\n') + s++; + if (s == buffer->rlimit) + break; + + /* Escaped? */ + p = d; + while (p != buffer->next_line && is_nvspace (p[-1])) + p--; + if (p == buffer->next_line || p[-1] != '\\') + break; + + add_line_note (buffer, p - 1, p != d ? ' ': '\\'); + d = p - 2; + buffer->next_line = p - 1; + } + else if (c == '?' && s[1] == '?' && _cpp_trigraph_map[s[2]]) + { + /* Add a note regardless, for the benefit of -Wtrigraphs. */ + add_line_note (buffer, d, s[2]); + if (CPP_OPTION (pfile, trigraphs)) + { + *d = _cpp_trigraph_map[s[2]]; + s += 2; + } + } + } + } + else + { + do + s++; + while (*s != '\n' && *s != '\r'); + d = (uchar *) s; + + /* Handle DOS line endings. */ + if (*s == '\r' && s != buffer->rlimit && s[1] == '\n') + s++; + } + + done: + *d = '\n'; + /* A sentinel note that should never be processed. */ + add_line_note (buffer, d + 1, '\n'); + buffer->next_line = s + 1; +} + +/* Return true if the trigraph indicated by NOTE should be warned + about in a comment. */ +static bool +warn_in_comment (cpp_reader *pfile, _cpp_line_note *note) +{ + const uchar *p; + + /* Within comments we don't warn about trigraphs, unless the + trigraph forms an escaped newline, as that may change + behavior. */ + if (note->type != '/') + return false; + + /* If -trigraphs, then this was an escaped newline iff the next note + is coincident. */ + if (CPP_OPTION (pfile, trigraphs)) + return note[1].pos == note->pos; + + /* Otherwise, see if this forms an escaped newline. */ + p = note->pos + 3; + while (is_nvspace (*p)) + p++; + + /* There might have been escaped newlines between the trigraph and the + newline we found. Hence the position test. */ + return (*p == '\n' && p < note[1].pos); +} + +/* Process the notes created by add_line_note as far as the current + location. */ +void +_cpp_process_line_notes (cpp_reader *pfile, int in_comment) +{ + cpp_buffer *buffer = pfile->buffer; + + for (;;) + { + _cpp_line_note *note = &buffer->notes[buffer->cur_note]; + unsigned int col; + + if (note->pos > buffer->cur) + break; + + buffer->cur_note++; + col = CPP_BUF_COLUMN (buffer, note->pos + 1); + + if (note->type == '\\' || note->type == ' ') + { + if (note->type == ' ' && !in_comment) + cpp_error_with_line (pfile, CPP_DL_WARNING, pfile->line_table->highest_line, col, + "backslash and newline separated by space"); + + if (buffer->next_line > buffer->rlimit) + { + cpp_error_with_line (pfile, CPP_DL_PEDWARN, pfile->line_table->highest_line, col, + "backslash-newline at end of file"); + /* Prevent "no newline at end of file" warning. */ + buffer->next_line = buffer->rlimit; + } + + buffer->line_base = note->pos; + CPP_INCREMENT_LINE (pfile, 0); + } + else if (_cpp_trigraph_map[note->type]) + { + if (CPP_OPTION (pfile, warn_trigraphs) + && (!in_comment || warn_in_comment (pfile, note))) + { + if (CPP_OPTION (pfile, trigraphs)) + cpp_error_with_line (pfile, CPP_DL_WARNING, pfile->line_table->highest_line, col, + "trigraph ??%c converted to %c", + note->type, + (int) _cpp_trigraph_map[note->type]); + else + { + cpp_error_with_line + (pfile, CPP_DL_WARNING, pfile->line_table->highest_line, col, + "trigraph ??%c ignored, use -trigraphs to enable", + note->type); + } + } + } + else + abort (); + } +} + +/* Skip a C-style block comment. We find the end of the comment by + seeing if an asterisk is before every '/' we encounter. Returns + nonzero if comment terminated by EOF, zero otherwise. + + Buffer->cur points to the initial asterisk of the comment. */ +bool +_cpp_skip_block_comment (cpp_reader *pfile) +{ + cpp_buffer *buffer = pfile->buffer; + const uchar *cur = buffer->cur; + uchar c; + + cur++; + if (*cur == '/') + cur++; + + for (;;) + { + /* People like decorating comments with '*', so check for '/' + instead for efficiency. */ + c = *cur++; + + if (c == '/') + { + if (cur[-2] == '*') + break; + + /* Warn about potential nested comments, but not if the '/' + comes immediately before the true comment delimiter. + Don't bother to get it right across escaped newlines. */ + if (CPP_OPTION (pfile, warn_comments) + && cur[0] == '*' && cur[1] != '/') + { + buffer->cur = cur; + cpp_error_with_line (pfile, CPP_DL_WARNING, + pfile->line_table->highest_line, CPP_BUF_COL (buffer), + "\"/*\" within comment"); + } + } + else if (c == '\n') + { + unsigned int cols; + buffer->cur = cur - 1; + _cpp_process_line_notes (pfile, true); + if (buffer->next_line >= buffer->rlimit) + return true; + _cpp_clean_line (pfile); + + cols = buffer->next_line - buffer->line_base; + CPP_INCREMENT_LINE (pfile, cols); + + cur = buffer->cur; + } + } + + buffer->cur = cur; + _cpp_process_line_notes (pfile, true); + return false; +} + +/* Skip a C++ line comment, leaving buffer->cur pointing to the + terminating newline. Handles escaped newlines. Returns nonzero + if a multiline comment. */ +static int +skip_line_comment (cpp_reader *pfile) +{ + cpp_buffer *buffer = pfile->buffer; + unsigned int orig_line = pfile->line_table->highest_line; + + while (*buffer->cur != '\n') + buffer->cur++; + + _cpp_process_line_notes (pfile, true); + return orig_line != pfile->line_table->highest_line; +} + +/* Skips whitespace, saving the next non-whitespace character. */ +static void +skip_whitespace (cpp_reader *pfile, cppchar_t c) +{ + cpp_buffer *buffer = pfile->buffer; + bool saw_NUL = false; + + do + { + /* Horizontal space always OK. */ + if (c == ' ' || c == '\t') + ; + /* Just \f \v or \0 left. */ + else if (c == '\0') + saw_NUL = true; + else if (pfile->state.in_directive && CPP_PEDANTIC (pfile)) + cpp_error_with_line (pfile, CPP_DL_PEDWARN, pfile->line_table->highest_line, + CPP_BUF_COL (buffer), + "%s in preprocessing directive", + c == '\f' ? "form feed" : "vertical tab"); + + c = *buffer->cur++; + } + /* We only want non-vertical space, i.e. ' ' \t \f \v \0. */ + while (is_nvspace (c)); + + if (saw_NUL) + cpp_error (pfile, CPP_DL_WARNING, "null character(s) ignored"); + + buffer->cur--; +} + +/* See if the characters of a number token are valid in a name (no + '.', '+' or '-'). */ +static int +name_p (cpp_reader *pfile, const cpp_string *string) +{ + unsigned int i; + + for (i = 0; i < string->len; i++) + if (!is_idchar (string->text[i])) + return 0; + + return 1; +} + +/* After parsing an identifier or other sequence, produce a warning about + sequences not in NFC/NFKC. */ +static void +warn_about_normalization (cpp_reader *pfile, + const cpp_token *token, + const struct normalize_state *s) +{ + if (CPP_OPTION (pfile, warn_normalize) < NORMALIZE_STATE_RESULT (s) + && !pfile->state.skipping) + { + /* Make sure that the token is printed using UCNs, even + if we'd otherwise happily print UTF-8. */ + unsigned char *buf = XNEWVEC (unsigned char, cpp_token_len (token)); + size_t sz; + + sz = cpp_spell_token (pfile, token, buf, false) - buf; + if (NORMALIZE_STATE_RESULT (s) == normalized_C) + cpp_error_with_line (pfile, CPP_DL_WARNING, token->src_loc, 0, + "`%.*s' is not in NFKC", (int) sz, buf); + else + cpp_error_with_line (pfile, CPP_DL_WARNING, token->src_loc, 0, + "`%.*s' is not in NFC", (int) sz, buf); + } +} + +/* Returns TRUE if the sequence starting at buffer->cur is invalid in + an identifier. FIRST is TRUE if this starts an identifier. */ +static bool +forms_identifier_p (cpp_reader *pfile, int first, + struct normalize_state *state) +{ + cpp_buffer *buffer = pfile->buffer; + + if (*buffer->cur == '$') + { + if (!CPP_OPTION (pfile, dollars_in_ident)) + return false; + + buffer->cur++; + if (CPP_OPTION (pfile, warn_dollars) && !pfile->state.skipping) + { + CPP_OPTION (pfile, warn_dollars) = 0; + cpp_error (pfile, CPP_DL_PEDWARN, "'$' in identifier or number"); + } + + return true; + } + + /* Is this a syntactically valid UCN? */ + if (CPP_OPTION (pfile, extended_identifiers) + && *buffer->cur == '\\' + && (buffer->cur[1] == 'u' || buffer->cur[1] == 'U')) + { + buffer->cur += 2; + if (_cpp_valid_ucn (pfile, &buffer->cur, buffer->rlimit, 1 + !first, + state)) + return true; + buffer->cur -= 2; + } + + return false; +} + +/* Lex an identifier starting at BUFFER->CUR - 1. */ +static cpp_hashnode * +lex_identifier (cpp_reader *pfile, const uchar *base, bool starts_ucn, + struct normalize_state *nst) +{ + cpp_hashnode *result; + const uchar *cur; + unsigned int len; + unsigned int hash = HT_HASHSTEP (0, *base); + + cur = pfile->buffer->cur; + if (! starts_ucn) + while (ISIDNUM (*cur)) + { + hash = HT_HASHSTEP (hash, *cur); + cur++; + } + pfile->buffer->cur = cur; + if (starts_ucn || forms_identifier_p (pfile, false, nst)) + { + /* Slower version for identifiers containing UCNs (or $). */ + do { + while (ISIDNUM (*pfile->buffer->cur)) + { + pfile->buffer->cur++; + NORMALIZE_STATE_UPDATE_IDNUM (nst); + } + } while (forms_identifier_p (pfile, false, nst)); + result = _cpp_interpret_identifier (pfile, base, + pfile->buffer->cur - base); + } + else + { + len = cur - base; + hash = HT_HASHFINISH (hash, len); + + result = (cpp_hashnode *) + ht_lookup_with_hash (pfile->hash_table, base, len, hash, HT_ALLOC); + } + + /* Rarely, identifiers require diagnostics when lexed. */ + if (__builtin_expect ((result->flags & NODE_DIAGNOSTIC) + && !pfile->state.skipping, 0)) + { + /* It is allowed to poison the same identifier twice. */ + if ((result->flags & NODE_POISONED) && !pfile->state.poisoned_ok) + cpp_error (pfile, CPP_DL_ERROR, "attempt to use poisoned \"%s\"", + NODE_NAME (result)); + + /* Constraint 6.10.3.5: __VA_ARGS__ should only appear in the + replacement list of a variadic macro. */ + if (result == pfile->spec_nodes.n__VA_ARGS__ + && !pfile->state.va_args_ok) + cpp_error (pfile, CPP_DL_PEDWARN, + "__VA_ARGS__ can only appear in the expansion" + " of a C99 variadic macro"); + } + + return result; +} + +/* Lex a number to NUMBER starting at BUFFER->CUR - 1. */ +static void +lex_number (cpp_reader *pfile, cpp_string *number, + struct normalize_state *nst) +{ + const uchar *cur; + const uchar *base; + uchar *dest; + + base = pfile->buffer->cur - 1; + do + { + cur = pfile->buffer->cur; + + /* N.B. ISIDNUM does not include $. */ + while (ISIDNUM (*cur) || *cur == '.' || VALID_SIGN (*cur, cur[-1])) + { + cur++; + NORMALIZE_STATE_UPDATE_IDNUM (nst); + } + + pfile->buffer->cur = cur; + } + while (forms_identifier_p (pfile, false, nst)); + + number->len = cur - base; + dest = _cpp_unaligned_alloc (pfile, number->len + 1); + memcpy (dest, base, number->len); + dest[number->len] = '\0'; + number->text = dest; +} + +/* Create a token of type TYPE with a literal spelling. */ +static void +create_literal (cpp_reader *pfile, cpp_token *token, const uchar *base, + unsigned int len, enum cpp_ttype type) +{ + uchar *dest = _cpp_unaligned_alloc (pfile, len + 1); + + memcpy (dest, base, len); + dest[len] = '\0'; + token->type = type; + token->val.str.len = len; + token->val.str.text = dest; +} + +/* Lexes a string, character constant, or angle-bracketed header file + name. The stored string contains the spelling, including opening + quote and leading any leading 'L'. It returns the type of the + literal, or CPP_OTHER if it was not properly terminated. + + The spelling is NUL-terminated, but it is not guaranteed that this + is the first NUL since embedded NULs are preserved. */ +static void +lex_string (cpp_reader *pfile, cpp_token *token, const uchar *base) +{ + bool saw_NUL = false; + const uchar *cur; + cppchar_t terminator; + enum cpp_ttype type; + + cur = base; + terminator = *cur++; + if (terminator == 'L') + terminator = *cur++; + if (terminator == '\"') + type = *base == 'L' ? CPP_WSTRING: CPP_STRING; + else if (terminator == '\'') + type = *base == 'L' ? CPP_WCHAR: CPP_CHAR; + else + terminator = '>', type = CPP_HEADER_NAME; + + for (;;) + { + cppchar_t c = *cur++; + + /* In #include-style directives, terminators are not escapable. */ + if (c == '\\' && !pfile->state.angled_headers && *cur != '\n') + cur++; + else if (c == terminator) + break; + else if (c == '\n') + { + cur--; + type = CPP_OTHER; + break; + } + else if (c == '\0') + saw_NUL = true; + } + + if (saw_NUL && !pfile->state.skipping) + cpp_error (pfile, CPP_DL_WARNING, + "null character(s) preserved in literal"); + + if (type == CPP_OTHER && CPP_OPTION (pfile, lang) != CLK_ASM) + cpp_error (pfile, CPP_DL_PEDWARN, "missing terminating %c character", + (int) terminator); + + pfile->buffer->cur = cur; + create_literal (pfile, token, base, cur - base, type); +} + +/* The stored comment includes the comment start and any terminator. */ +static void +save_comment (cpp_reader *pfile, cpp_token *token, const unsigned char *from, + cppchar_t type) +{ + unsigned char *buffer; + unsigned int len, clen; + + len = pfile->buffer->cur - from + 1; /* + 1 for the initial '/'. */ + + /* C++ comments probably (not definitely) have moved past a new + line, which we don't want to save in the comment. */ + if (is_vspace (pfile->buffer->cur[-1])) + len--; + + /* If we are currently in a directive, then we need to store all + C++ comments as C comments internally, and so we need to + allocate a little extra space in that case. + + Note that the only time we encounter a directive here is + when we are saving comments in a "#define". */ + clen = (pfile->state.in_directive && type == '/') ? len + 2 : len; + + buffer = _cpp_unaligned_alloc (pfile, clen); + + token->type = CPP_COMMENT; + token->val.str.len = clen; + token->val.str.text = buffer; + + buffer[0] = '/'; + memcpy (buffer + 1, from, len - 1); + + /* Finish conversion to a C comment, if necessary. */ + if (pfile->state.in_directive && type == '/') + { + buffer[1] = '*'; + buffer[clen - 2] = '*'; + buffer[clen - 1] = '/'; + } +} + +/* Allocate COUNT tokens for RUN. */ +void +_cpp_init_tokenrun (tokenrun *run, unsigned int count) +{ + run->base = XNEWVEC (cpp_token, count); + run->limit = run->base + count; + run->next = NULL; +} + +/* Returns the next tokenrun, or creates one if there is none. */ +static tokenrun * +next_tokenrun (tokenrun *run) +{ + if (run->next == NULL) + { + run->next = XNEW (tokenrun); + run->next->prev = run; + _cpp_init_tokenrun (run->next, 250); + } + + return run->next; +} + +/* Allocate a single token that is invalidated at the same time as the + rest of the tokens on the line. Has its line and col set to the + same as the last lexed token, so that diagnostics appear in the + right place. */ +cpp_token * +_cpp_temp_token (cpp_reader *pfile) +{ + cpp_token *old, *result; + + old = pfile->cur_token - 1; + if (pfile->cur_token == pfile->cur_run->limit) + { + pfile->cur_run = next_tokenrun (pfile->cur_run); + pfile->cur_token = pfile->cur_run->base; + } + + result = pfile->cur_token++; + result->src_loc = old->src_loc; + return result; +} + +/* Lex a token into RESULT (external interface). Takes care of issues + like directive handling, token lookahead, multiple include + optimization and skipping. */ +const cpp_token * +_cpp_lex_token (cpp_reader *pfile) +{ + cpp_token *result; + + for (;;) + { + if (pfile->cur_token == pfile->cur_run->limit) + { + pfile->cur_run = next_tokenrun (pfile->cur_run); + pfile->cur_token = pfile->cur_run->base; + } + /* We assume that the current token is somewhere in the current + run. */ + if (pfile->cur_token < pfile->cur_run->base + || pfile->cur_token >= pfile->cur_run->limit) + abort (); + + if (pfile->lookaheads) + { + pfile->lookaheads--; + result = pfile->cur_token++; + } + else + result = _cpp_lex_direct (pfile); + + if (result->flags & BOL) + { + /* Is this a directive. If _cpp_handle_directive returns + false, it is an assembler #. */ + if (result->type == CPP_HASH + /* 6.10.3 p 11: Directives in a list of macro arguments + gives undefined behavior. This implementation + handles the directive as normal. */ + && pfile->state.parsing_args != 1) + { + if (_cpp_handle_directive (pfile, result->flags & PREV_WHITE)) + { + if (pfile->directive_result.type == CPP_PADDING) + continue; + result = &pfile->directive_result; + } + } + else if (pfile->state.in_deferred_pragma) + result = &pfile->directive_result; + + if (pfile->cb.line_change && !pfile->state.skipping) + pfile->cb.line_change (pfile, result, pfile->state.parsing_args); + } + + /* We don't skip tokens in directives. */ + if (pfile->state.in_directive || pfile->state.in_deferred_pragma) + break; + + /* Outside a directive, invalidate controlling macros. At file + EOF, _cpp_lex_direct takes care of popping the buffer, so we never + get here and MI optimization works. */ + pfile->mi_valid = false; + + if (!pfile->state.skipping || result->type == CPP_EOF) + break; + } + + return result; +} + +/* Returns true if a fresh line has been loaded. */ +bool +_cpp_get_fresh_line (cpp_reader *pfile) +{ + int return_at_eof; + + /* We can't get a new line until we leave the current directive. */ + if (pfile->state.in_directive) + return false; + + for (;;) + { + cpp_buffer *buffer = pfile->buffer; + + if (!buffer->need_line) + return true; + + if (buffer->next_line < buffer->rlimit) + { + _cpp_clean_line (pfile); + return true; + } + + /* First, get out of parsing arguments state. */ + if (pfile->state.parsing_args) + return false; + + /* End of buffer. Non-empty files should end in a newline. */ + if (buffer->buf != buffer->rlimit + && buffer->next_line > buffer->rlimit + && !buffer->from_stage3) + { + /* Clip to buffer size. */ + buffer->next_line = buffer->rlimit; + } + + return_at_eof = buffer->return_at_eof; + _cpp_pop_buffer (pfile); + if (pfile->buffer == NULL || return_at_eof) + return false; + } +} + +#define IF_NEXT_IS(CHAR, THEN_TYPE, ELSE_TYPE) \ + do \ + { \ + result->type = ELSE_TYPE; \ + if (*buffer->cur == CHAR) \ + buffer->cur++, result->type = THEN_TYPE; \ + } \ + while (0) + +/* Lex a token into pfile->cur_token, which is also incremented, to + get diagnostics pointing to the correct location. + + Does not handle issues such as token lookahead, multiple-include + optimization, directives, skipping etc. This function is only + suitable for use by _cpp_lex_token, and in special cases like + lex_expansion_token which doesn't care for any of these issues. + + When meeting a newline, returns CPP_EOF if parsing a directive, + otherwise returns to the start of the token buffer if permissible. + Returns the location of the lexed token. */ +cpp_token * +_cpp_lex_direct (cpp_reader *pfile) +{ + cppchar_t c; + cpp_buffer *buffer; + const unsigned char *comment_start; + cpp_token *result = pfile->cur_token++; + + fresh_line: + result->flags = 0; + buffer = pfile->buffer; + if (buffer->need_line) + { + if (pfile->state.in_deferred_pragma) + { + result->type = CPP_PRAGMA_EOL; + pfile->state.in_deferred_pragma = false; + if (!pfile->state.pragma_allow_expansion) + pfile->state.prevent_expansion--; + return result; + } + if (!_cpp_get_fresh_line (pfile)) + { + result->type = CPP_EOF; + if (!pfile->state.in_directive) + { + /* Tell the compiler the line number of the EOF token. */ + result->src_loc = pfile->line_table->highest_line; + result->flags = BOL; + } + return result; + } + if (!pfile->keep_tokens) + { + pfile->cur_run = &pfile->base_run; + result = pfile->base_run.base; + pfile->cur_token = result + 1; + } + result->flags = BOL; + if (pfile->state.parsing_args == 2) + result->flags |= PREV_WHITE; + } + buffer = pfile->buffer; + update_tokens_line: + result->src_loc = pfile->line_table->highest_line; + + skipped_white: + if (buffer->cur >= buffer->notes[buffer->cur_note].pos + && !pfile->overlaid_buffer) + { + _cpp_process_line_notes (pfile, false); + result->src_loc = pfile->line_table->highest_line; + } + c = *buffer->cur++; + + LINEMAP_POSITION_FOR_COLUMN (result->src_loc, pfile->line_table, + CPP_BUF_COLUMN (buffer, buffer->cur)); + + switch (c) + { + case ' ': case '\t': case '\f': case '\v': case '\0': + result->flags |= PREV_WHITE; + skip_whitespace (pfile, c); + goto skipped_white; + + case '\n': + if (buffer->cur < buffer->rlimit) + CPP_INCREMENT_LINE (pfile, 0); + buffer->need_line = true; + goto fresh_line; + + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + { + struct normalize_state nst = INITIAL_NORMALIZE_STATE; + result->type = CPP_NUMBER; + lex_number (pfile, &result->val.str, &nst); + warn_about_normalization (pfile, result, &nst); + break; + } + + case 'L': + /* 'L' may introduce wide characters or strings. */ + if (*buffer->cur == '\'' || *buffer->cur == '"') + { + lex_string (pfile, result, buffer->cur - 1); + break; + } + /* Fall through. */ + + case '_': + case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': + case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': + case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': + case 's': case 't': case 'u': case 'v': case 'w': case 'x': + case 'y': case 'z': + case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': + case 'G': case 'H': case 'I': case 'J': case 'K': + case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': + case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': + case 'Y': case 'Z': + result->type = CPP_NAME; + { + struct normalize_state nst = INITIAL_NORMALIZE_STATE; + result->val.node = lex_identifier (pfile, buffer->cur - 1, false, + &nst); + warn_about_normalization (pfile, result, &nst); + } + + /* Convert named operators to their proper types. */ + if (result->val.node->flags & NODE_OPERATOR) + { + result->flags |= NAMED_OP; + result->type = (enum cpp_ttype) result->val.node->directive_index; + } + break; + + case '\'': + case '"': + lex_string (pfile, result, buffer->cur - 1); + break; + + case '/': + /* A potential block or line comment. */ + comment_start = buffer->cur; + c = *buffer->cur; + + if (c == '*') + { + if (_cpp_skip_block_comment (pfile)) + cpp_error (pfile, CPP_DL_ERROR, "unterminated comment"); + } + else if (c == '/' && (CPP_OPTION (pfile, cplusplus_comments) + || cpp_in_system_header (pfile))) + { + /* Warn about comments only if pedantically GNUC89, and not + in system headers. */ + if (CPP_OPTION (pfile, lang) == CLK_GNUC89 && CPP_PEDANTIC (pfile) + && ! buffer->warned_cplusplus_comments) + { + cpp_error (pfile, CPP_DL_PEDWARN, + "C++ style comments are not allowed in ISO C90"); + cpp_error (pfile, CPP_DL_PEDWARN, + "(this will be reported only once per input file)"); + buffer->warned_cplusplus_comments = 1; + } + + if (skip_line_comment (pfile) && CPP_OPTION (pfile, warn_comments)) + cpp_error (pfile, CPP_DL_WARNING, "multi-line comment"); + } + else if (c == '=') + { + buffer->cur++; + result->type = CPP_DIV_EQ; + break; + } + else + { + result->type = CPP_DIV; + break; + } + + if (!pfile->state.save_comments) + { + result->flags |= PREV_WHITE; + goto update_tokens_line; + } + + /* Save the comment as a token in its own right. */ + save_comment (pfile, result, comment_start, c); + break; + + case '<': + if (pfile->state.angled_headers) + { + lex_string (pfile, result, buffer->cur - 1); + break; + } + + result->type = CPP_LESS; + if (*buffer->cur == '=') + buffer->cur++, result->type = CPP_LESS_EQ; + else if (*buffer->cur == '-') + buffer->cur++, result->type = CPP_FERED; + else if (*buffer->cur == '<') + { + buffer->cur++; + IF_NEXT_IS ('=', CPP_LSHIFT_EQ, CPP_LSHIFT); + } + else if (CPP_OPTION (pfile, digraphs)) + { + if (*buffer->cur == ':') + { + buffer->cur++; + result->flags |= DIGRAPH; + result->type = CPP_OPEN_SQUARE; + } + else if (*buffer->cur == '%') + { + buffer->cur++; + result->flags |= DIGRAPH; + result->type = CPP_OPEN_BRACE; + } + } + break; + + case '>': + result->type = CPP_GREATER; + if (*buffer->cur == '=') + buffer->cur++, result->type = CPP_GREATER_EQ; + else if (*buffer->cur == '>') + { + buffer->cur++; + IF_NEXT_IS ('=', CPP_RSHIFT_EQ, CPP_RSHIFT); + } + break; + + case '%': + result->type = CPP_MOD; + if (*buffer->cur == '=') + buffer->cur++, result->type = CPP_MOD_EQ; + else if (CPP_OPTION (pfile, digraphs)) + { + if (*buffer->cur == ':') + { + buffer->cur++; + result->flags |= DIGRAPH; + result->type = CPP_HASH; + if (*buffer->cur == '%' && buffer->cur[1] == ':') + buffer->cur += 2, result->type = CPP_PASTE; + } + else if (*buffer->cur == '>') + { + buffer->cur++; + result->flags |= DIGRAPH; + result->type = CPP_CLOSE_BRACE; + } + } + break; + + case '.': + result->type = CPP_DOT; + if (ISDIGIT (*buffer->cur)) + { + struct normalize_state nst = INITIAL_NORMALIZE_STATE; + result->type = CPP_NUMBER; + lex_number (pfile, &result->val.str, &nst); + warn_about_normalization (pfile, result, &nst); + } + else if (*buffer->cur == '.' && buffer->cur[1] == '.') + buffer->cur += 2, result->type = CPP_ELLIPSIS; + else if (*buffer->cur == '*' && CPP_OPTION (pfile, cplusplus)) + buffer->cur++, result->type = CPP_DOT_STAR; + break; + + case '+': + result->type = CPP_PLUS; + if (*buffer->cur == '+') + buffer->cur++, result->type = CPP_PLUS_PLUS; + else if (*buffer->cur == '=') + buffer->cur++, result->type = CPP_PLUS_EQ; + break; + + case '-': + result->type = CPP_MINUS; + if (*buffer->cur == '>') + { + buffer->cur++; + result->type = CPP_DEREF; + if (*buffer->cur == '*' && CPP_OPTION (pfile, cplusplus)) + buffer->cur++, result->type = CPP_DEREF_STAR; + } + else if (*buffer->cur == '-') + buffer->cur++, result->type = CPP_MINUS_MINUS; + else if (*buffer->cur == '=') + buffer->cur++, result->type = CPP_MINUS_EQ; + break; + + case '&': + result->type = CPP_AND; + if (*buffer->cur == '&') + buffer->cur++, result->type = CPP_AND_AND; + else if (*buffer->cur == '=') + buffer->cur++, result->type = CPP_AND_EQ; + break; + + case '|': + result->type = CPP_OR; + if (*buffer->cur == '|') + buffer->cur++, result->type = CPP_OR_OR; + else if (*buffer->cur == '=') + buffer->cur++, result->type = CPP_OR_EQ; + break; + + case ':': + result->type = CPP_COLON; + if (*buffer->cur == ':' && CPP_OPTION (pfile, cplusplus)) + buffer->cur++, result->type = CPP_SCOPE; + else if (*buffer->cur == '>' && CPP_OPTION (pfile, digraphs)) + { + buffer->cur++; + result->flags |= DIGRAPH; + result->type = CPP_CLOSE_SQUARE; + } + break; + + case '*': IF_NEXT_IS ('=', CPP_MULT_EQ, CPP_MULT); break; + case '=': IF_NEXT_IS ('=', CPP_EQ_EQ, CPP_EQ); break; + case '!': IF_NEXT_IS ('=', CPP_NOT_EQ, CPP_NOT); break; + case '^': IF_NEXT_IS ('=', CPP_XOR_EQ, CPP_XOR); break; + case '#': IF_NEXT_IS ('#', CPP_PASTE, CPP_HASH); break; + + case '?': result->type = CPP_QUERY; break; + case '~': result->type = CPP_COMPL; break; + case ',': result->type = CPP_COMMA; break; + case '(': result->type = CPP_OPEN_PAREN; break; + case ')': result->type = CPP_CLOSE_PAREN; break; + case '[': result->type = CPP_OPEN_SQUARE; break; + case ']': result->type = CPP_CLOSE_SQUARE; break; + case '{': result->type = CPP_OPEN_BRACE; break; + case '}': result->type = CPP_CLOSE_BRACE; break; + case ';': result->type = CPP_SEMICOLON; break; + + /* @ is a punctuator in Objective-C. */ + case '@': result->type = CPP_ATSIGN; break; + + case '$': + case '\\': + { + const uchar *base = --buffer->cur; + struct normalize_state nst = INITIAL_NORMALIZE_STATE; + + if (forms_identifier_p (pfile, true, &nst)) + { + result->type = CPP_NAME; + result->val.node = lex_identifier (pfile, base, true, &nst); + warn_about_normalization (pfile, result, &nst); + break; + } + buffer->cur++; + } + + default: + create_literal (pfile, result, buffer->cur - 1, 1, CPP_OTHER); + break; + } + + return result; +} + +/* An upper bound on the number of bytes needed to spell TOKEN. + Does not include preceding whitespace. */ +unsigned int +cpp_token_len (const cpp_token *token) +{ + unsigned int len; + + switch (TOKEN_SPELL (token)) + { + default: len = 4; break; + case SPELL_LITERAL: len = token->val.str.len; break; + case SPELL_IDENT: len = NODE_LEN (token->val.node) * 10; break; + } + + return len; +} + +/* Parse UTF-8 out of NAMEP and place a \U escape in BUFFER. + Return the number of bytes read out of NAME. (There are always + 10 bytes written to BUFFER.) */ + +static size_t +utf8_to_ucn (unsigned char *buffer, const unsigned char *name) +{ + int j; + int ucn_len = 0; + int ucn_len_c; + unsigned t; + unsigned long utf32; + + /* Compute the length of the UTF-8 sequence. */ + for (t = *name; t & 0x80; t <<= 1) + ucn_len++; + + utf32 = *name & (0x7F >> ucn_len); + for (ucn_len_c = 1; ucn_len_c < ucn_len; ucn_len_c++) + { + utf32 = (utf32 << 6) | (*++name & 0x3F); + + /* Ill-formed UTF-8. */ + if ((*name & ~0x3F) != 0x80) + abort (); + } + + *buffer++ = '\\'; + *buffer++ = 'U'; + for (j = 7; j >= 0; j--) + *buffer++ = "0123456789abcdef"[(utf32 >> (4 * j)) & 0xF]; + return ucn_len; +} + + +/* Write the spelling of a token TOKEN to BUFFER. The buffer must + already contain the enough space to hold the token's spelling. + Returns a pointer to the character after the last character written. + FORSTRING is true if this is to be the spelling after translation + phase 1 (this is different for UCNs). + FIXME: Would be nice if we didn't need the PFILE argument. */ +unsigned char * +cpp_spell_token (cpp_reader *pfile, const cpp_token *token, + unsigned char *buffer, bool forstring) +{ + switch (TOKEN_SPELL (token)) + { + case SPELL_OPERATOR: + { + const unsigned char *spelling; + unsigned char c; + + if (token->flags & DIGRAPH) + spelling + = digraph_spellings[(int) token->type - (int) CPP_FIRST_DIGRAPH]; + else if (token->flags & NAMED_OP) + goto spell_ident; + else + spelling = TOKEN_NAME (token); + + while ((c = *spelling++) != '\0') + *buffer++ = c; + } + break; + + spell_ident: + case SPELL_IDENT: + if (forstring) + { + memcpy (buffer, NODE_NAME (token->val.node), + NODE_LEN (token->val.node)); + buffer += NODE_LEN (token->val.node); + } + else + { + size_t i; + const unsigned char * name = NODE_NAME (token->val.node); + + for (i = 0; i < NODE_LEN (token->val.node); i++) + if (name[i] & ~0x7F) + { + i += utf8_to_ucn (buffer, name + i) - 1; + buffer += 10; + } + else + *buffer++ = NODE_NAME (token->val.node)[i]; + } + break; + + case SPELL_LITERAL: + memcpy (buffer, token->val.str.text, token->val.str.len); + buffer += token->val.str.len; + break; + + case SPELL_NONE: + cpp_error (pfile, CPP_DL_ICE, + "unspellable token %s", TOKEN_NAME (token)); + break; + } + + return buffer; +} + +/* Returns TOKEN spelt as a null-terminated string. The string is + freed when the reader is destroyed. Useful for diagnostics. */ +unsigned char * +cpp_token_as_text (cpp_reader *pfile, const cpp_token *token) +{ + unsigned int len = cpp_token_len (token) + 1; + unsigned char *start = _cpp_unaligned_alloc (pfile, len), *end; + + end = cpp_spell_token (pfile, token, start, false); + end[0] = '\0'; + + return start; +} + +/* Used by C front ends, which really should move to using + cpp_token_as_text. */ +const char * +cpp_type2name (enum cpp_ttype type) +{ + return (const char *) token_spellings[type].name; +} + +/* Writes the spelling of token to FP, without any preceding space. + Separated from cpp_spell_token for efficiency - to avoid stdio + double-buffering. */ +void +cpp_output_token (const cpp_token *token, FILE *fp) +{ + switch (TOKEN_SPELL (token)) + { + case SPELL_OPERATOR: + { + const unsigned char *spelling; + int c; + + if (token->flags & DIGRAPH) + spelling + = digraph_spellings[(int) token->type - (int) CPP_FIRST_DIGRAPH]; + else if (token->flags & NAMED_OP) + goto spell_ident; + else + spelling = TOKEN_NAME (token); + + c = *spelling; + do + putc (c, fp); + while ((c = *++spelling) != '\0'); + } + break; + + spell_ident: + case SPELL_IDENT: + { + size_t i; + const unsigned char * name = NODE_NAME (token->val.node); + + for (i = 0; i < NODE_LEN (token->val.node); i++) + if (name[i] & ~0x7F) + { + unsigned char buffer[10]; + i += utf8_to_ucn (buffer, name + i) - 1; + fwrite (buffer, 1, 10, fp); + } + else + fputc (NODE_NAME (token->val.node)[i], fp); + } + break; + + case SPELL_LITERAL: + fwrite (token->val.str.text, 1, token->val.str.len, fp); + break; + + case SPELL_NONE: + /* An error, most probably. */ + break; + } +} + +/* Compare two tokens. */ +int +_cpp_equiv_tokens (const cpp_token *a, const cpp_token *b) +{ + if (a->type == b->type && a->flags == b->flags) + switch (TOKEN_SPELL (a)) + { + default: /* Keep compiler happy. */ + case SPELL_OPERATOR: + return 1; + case SPELL_NONE: + return (a->type != CPP_MACRO_ARG || a->val.arg_no == b->val.arg_no); + case SPELL_IDENT: + return a->val.node == b->val.node; + case SPELL_LITERAL: + return (a->val.str.len == b->val.str.len + && !memcmp (a->val.str.text, b->val.str.text, + a->val.str.len)); + } + + return 0; +} + +/* Returns nonzero if a space should be inserted to avoid an + accidental token paste for output. For simplicity, it is + conservative, and occasionally advises a space where one is not + needed, e.g. "." and ".2". */ +int +cpp_avoid_paste (cpp_reader *pfile, const cpp_token *token1, + const cpp_token *token2) +{ + enum cpp_ttype a = token1->type, b = token2->type; + cppchar_t c; + + if (token1->flags & NAMED_OP) + a = CPP_NAME; + if (token2->flags & NAMED_OP) + b = CPP_NAME; + + c = EOF; + if (token2->flags & DIGRAPH) + c = digraph_spellings[(int) b - (int) CPP_FIRST_DIGRAPH][0]; + else if (token_spellings[b].category == SPELL_OPERATOR) + c = token_spellings[b].name[0]; + + /* Quickly get everything that can paste with an '='. */ + if ((int) a <= (int) CPP_LAST_EQ && c == '=') + return 1; + + switch (a) + { + case CPP_GREATER: return c == '>'; + case CPP_LESS: return c == '<' || c == '%' || c == ':'; + case CPP_PLUS: return c == '+'; + case CPP_MINUS: return c == '-' || c == '>'; + case CPP_DIV: return c == '/' || c == '*'; /* Comments. */ + case CPP_MOD: return c == ':' || c == '>'; + case CPP_AND: return c == '&'; + case CPP_OR: return c == '|'; + case CPP_COLON: return c == ':' || c == '>'; + case CPP_DEREF: return c == '*'; + case CPP_DOT: return c == '.' || c == '%' || b == CPP_NUMBER; + case CPP_HASH: return c == '#' || c == '%'; /* Digraph form. */ + case CPP_NAME: return ((b == CPP_NUMBER + && name_p (pfile, &token2->val.str)) + || b == CPP_NAME + || b == CPP_CHAR || b == CPP_STRING); /* L */ + case CPP_NUMBER: return (b == CPP_NUMBER || b == CPP_NAME + || c == '.' || c == '+' || c == '-'); + /* UCNs */ + case CPP_OTHER: return ((token1->val.str.text[0] == '\\' + && b == CPP_NAME) + || (CPP_OPTION (pfile, objc) + && token1->val.str.text[0] == '@' + && (b == CPP_NAME || b == CPP_STRING))); + default: break; + } + + return 0; +} + +/* Output all the remaining tokens on the current line, and a newline + character, to FP. Leading whitespace is removed. If there are + macros, special token padding is not performed. */ +void +cpp_output_line (cpp_reader *pfile, FILE *fp) +{ + const cpp_token *token; + + token = cpp_get_token (pfile); + while (token->type != CPP_EOF) + { + cpp_output_token (token, fp); + token = cpp_get_token (pfile); + if (token->flags & PREV_WHITE) + putc (' ', fp); + } + + putc ('\n', fp); +} + +/* Memory buffers. Changing these three constants can have a dramatic + effect on performance. The values here are reasonable defaults, + but might be tuned. If you adjust them, be sure to test across a + range of uses of cpplib, including heavy nested function-like macro + expansion. Also check the change in peak memory usage (NJAMD is a + good tool for this). */ +#define MIN_BUFF_SIZE 8000 +#define BUFF_SIZE_UPPER_BOUND(MIN_SIZE) (MIN_BUFF_SIZE + (MIN_SIZE) * 3 / 2) +#define EXTENDED_BUFF_SIZE(BUFF, MIN_EXTRA) \ + (MIN_EXTRA + ((BUFF)->limit - (BUFF)->cur) * 2) + +#if MIN_BUFF_SIZE > BUFF_SIZE_UPPER_BOUND (0) + #error BUFF_SIZE_UPPER_BOUND must be at least as large as MIN_BUFF_SIZE! +#endif + +/* Create a new allocation buffer. Place the control block at the end + of the buffer, so that buffer overflows will cause immediate chaos. */ +static _cpp_buff * +new_buff (size_t len) +{ + _cpp_buff *result; + unsigned char *base; + + if (len < MIN_BUFF_SIZE) + len = MIN_BUFF_SIZE; + len = CPP_ALIGN (len); + + base = XNEWVEC (unsigned char, len + sizeof (_cpp_buff)); + result = (_cpp_buff *) (base + len); + result->base = base; + result->cur = base; + result->limit = base + len; + result->next = NULL; + return result; +} + +/* Place a chain of unwanted allocation buffers on the free list. */ +void +_cpp_release_buff (cpp_reader *pfile, _cpp_buff *buff) +{ + _cpp_buff *end = buff; + + while (end->next) + end = end->next; + end->next = pfile->free_buffs; + pfile->free_buffs = buff; +} + +/* Return a free buffer of size at least MIN_SIZE. */ +_cpp_buff * +_cpp_get_buff (cpp_reader *pfile, size_t min_size) +{ + _cpp_buff *result, **p; + + for (p = &pfile->free_buffs;; p = &(*p)->next) + { + size_t size; + + if (*p == NULL) + return new_buff (min_size); + result = *p; + size = result->limit - result->base; + /* Return a buffer that's big enough, but don't waste one that's + way too big. */ + if (size >= min_size && size <= BUFF_SIZE_UPPER_BOUND (min_size)) + break; + } + + *p = result->next; + result->next = NULL; + result->cur = result->base; + return result; +} + +/* Creates a new buffer with enough space to hold the uncommitted + remaining bytes of BUFF, and at least MIN_EXTRA more bytes. Copies + the excess bytes to the new buffer. Chains the new buffer after + BUFF, and returns the new buffer. */ +_cpp_buff * +_cpp_append_extend_buff (cpp_reader *pfile, _cpp_buff *buff, size_t min_extra) +{ + size_t size = EXTENDED_BUFF_SIZE (buff, min_extra); + _cpp_buff *new_buff = _cpp_get_buff (pfile, size); + + buff->next = new_buff; + memcpy (new_buff->base, buff->cur, BUFF_ROOM (buff)); + return new_buff; +} + +/* Creates a new buffer with enough space to hold the uncommitted + remaining bytes of the buffer pointed to by BUFF, and at least + MIN_EXTRA more bytes. Copies the excess bytes to the new buffer. + Chains the new buffer before the buffer pointed to by BUFF, and + updates the pointer to point to the new buffer. */ +void +_cpp_extend_buff (cpp_reader *pfile, _cpp_buff **pbuff, size_t min_extra) +{ + _cpp_buff *new_buff, *old_buff = *pbuff; + size_t size = EXTENDED_BUFF_SIZE (old_buff, min_extra); + + new_buff = _cpp_get_buff (pfile, size); + memcpy (new_buff->base, old_buff->cur, BUFF_ROOM (old_buff)); + new_buff->next = old_buff; + *pbuff = new_buff; +} + +/* Free a chain of buffers starting at BUFF. */ +void +_cpp_free_buff (_cpp_buff *buff) +{ + _cpp_buff *next; + + for (; buff; buff = next) + { + next = buff->next; + free (buff->base); + } +} + +/* Allocate permanent, unaligned storage of length LEN. */ +unsigned char * +_cpp_unaligned_alloc (cpp_reader *pfile, size_t len) +{ + _cpp_buff *buff = pfile->u_buff; + unsigned char *result = buff->cur; + + if (len > (size_t) (buff->limit - result)) + { + buff = _cpp_get_buff (pfile, len); + buff->next = pfile->u_buff; + pfile->u_buff = buff; + result = buff->cur; + } + + buff->cur = result + len; + return result; +} + +/* Allocate permanent, unaligned storage of length LEN from a_buff. + That buffer is used for growing allocations when saving macro + replacement lists in a #define, and when parsing an answer to an + assertion in #assert, #unassert or #if (and therefore possibly + whilst expanding macros). It therefore must not be used by any + code that they might call: specifically the lexer and the guts of + the macro expander. + + All existing other uses clearly fit this restriction: storing + registered pragmas during initialization. */ +unsigned char * +_cpp_aligned_alloc (cpp_reader *pfile, size_t len) +{ + _cpp_buff *buff = pfile->a_buff; + unsigned char *result = buff->cur; + + if (len > (size_t) (buff->limit - result)) + { + buff = _cpp_get_buff (pfile, len); + buff->next = pfile->a_buff; + pfile->a_buff = buff; + result = buff->cur; + } + + buff->cur = result + len; + return result; +} + +/* Say which field of TOK is in use. */ + +enum cpp_token_fld_kind +cpp_token_val_index (cpp_token *tok) +{ + switch (TOKEN_SPELL (tok)) + { + case SPELL_IDENT: + return CPP_TOKEN_FLD_NODE; + case SPELL_LITERAL: + return CPP_TOKEN_FLD_STR; + case SPELL_NONE: + if (tok->type == CPP_MACRO_ARG) + return CPP_TOKEN_FLD_ARG_NO; + else if (tok->type == CPP_PADDING) + return CPP_TOKEN_FLD_SOURCE; + else if (tok->type == CPP_PRAGMA) + return CPP_TOKEN_FLD_PRAGMA; + /* else fall through */ + default: + return CPP_TOKEN_FLD_NONE; + } +} diff --git a/libcpp/line-map.c b/libcpp/line-map.c new file mode 100644 index 0000000..c13a82d --- /dev/null +++ b/libcpp/line-map.c @@ -0,0 +1,355 @@ +/* Map logical line numbers to (source file, line number) pairs. + Copyright (C) 2001, 2003, 2004, 2007 + 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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + In other words, you are welcome to use, share and improve this program. + You are forbidden to forbid anyone else to use, share and improve + what you give them. Help stamp out software-hoarding! */ + +#include "config.h" +#include "system.h" +#include "line-map.h" + +static void trace_include (const struct line_maps *, const struct line_map *); + +/* Initialize a line map set. */ + +void +linemap_init (struct line_maps *set) +{ + set->maps = NULL; + set->allocated = 0; + set->used = 0; + set->last_listed = -1; + set->trace_includes = false; + set->depth = 0; + set->cache = 0; + set->highest_location = 0; + set->highest_line = 0; + set->max_column_hint = 0; +} + +/* Check for and warn about line_maps entered but not exited. */ + +void +linemap_check_files_exited (struct line_maps *set) +{ + struct line_map *map; + /* Depending upon whether we are handling preprocessed input or + not, this can be a user error or an ICE. */ + for (map = &set->maps[set->used - 1]; ! MAIN_FILE_P (map); + map = INCLUDED_FROM (set, map)) + fprintf (stderr, "line-map.c: file \"%s\" entered but not left\n", + map->to_file); +} + +/* Free a line map set. */ + +void +linemap_free (struct line_maps *set) +{ + if (set->maps) + { + linemap_check_files_exited (set); + + free (set->maps); + } +} + +/* Add a mapping of logical source line to physical source file and + line number. + + The text pointed to by TO_FILE must have a lifetime + at least as long as the final call to lookup_line (). An empty + TO_FILE means standard input. If reason is LC_LEAVE, and + TO_FILE is NULL, then TO_FILE, TO_LINE and SYSP are given their + natural values considering the file we are returning to. + + FROM_LINE should be monotonic increasing across calls to this + function. A call to this function can relocate the previous set of + A call to this function can relocate the previous set of + maps, so any stored line_map pointers should not be used. */ + +const struct line_map * +linemap_add (struct line_maps *set, enum lc_reason reason, + unsigned int sysp, const char *to_file, unsigned int to_line) +{ + struct line_map *map; + source_location start_location = set->highest_location + 1; + + if (set->used && start_location < set->maps[set->used - 1].start_location) + abort (); + + if (set->used == set->allocated) + { + line_map_realloc reallocator + = set->reallocator ? set->reallocator : xrealloc; + set->allocated = 2 * set->allocated + 256; + set->maps + = (struct line_map *) (*reallocator) (set->maps, + set->allocated + * sizeof (struct line_map)); + memset (&set->maps[set->used], 0, ((set->allocated - set->used) + * sizeof (struct line_map))); + } + + map = &set->maps[set->used]; + + if (to_file && *to_file == '\0') + to_file = ""; + + /* If we don't keep our line maps consistent, we can easily + segfault. Don't rely on the client to do it for us. */ + if (set->depth == 0) + reason = LC_ENTER; + else if (reason == LC_LEAVE) + { + struct line_map *from; + bool error; + + if (MAIN_FILE_P (map - 1)) + { + if (to_file == NULL) + { + set->depth--; + return NULL; + } + error = true; + reason = LC_RENAME; + from = map - 1; + } + else + { + from = INCLUDED_FROM (set, map - 1); + error = to_file && strcmp (from->to_file, to_file); + } + + /* Depending upon whether we are handling preprocessed input or + not, this can be a user error or an ICE. */ + if (error) + fprintf (stderr, "line-map.c: file \"%s\" left but not entered\n", + to_file); + + /* A TO_FILE of NULL is special - we use the natural values. */ + if (error || to_file == NULL) + { + to_file = from->to_file; + to_line = SOURCE_LINE (from, from[1].start_location); + sysp = from->sysp; + } + } + + map->reason = reason; + map->sysp = sysp; + map->start_location = start_location; + map->to_file = to_file; + map->to_line = to_line; + set->cache = set->used++; + map->column_bits = 0; + set->highest_location = start_location; + set->highest_line = start_location; + set->max_column_hint = 0; + + if (reason == LC_ENTER) + { + map->included_from = set->depth == 0 ? -1 : (int) (set->used - 2); + set->depth++; + if (set->trace_includes) + trace_include (set, map); + } + else if (reason == LC_RENAME) + map->included_from = map[-1].included_from; + else if (reason == LC_LEAVE) + { + set->depth--; + map->included_from = INCLUDED_FROM (set, map - 1)->included_from; + } + + return map; +} + +source_location +linemap_line_start (struct line_maps *set, unsigned int to_line, + unsigned int max_column_hint) +{ + struct line_map *map = &set->maps[set->used - 1]; + source_location highest = set->highest_location; + source_location r; + unsigned int last_line = SOURCE_LINE (map, set->highest_line); + int line_delta = to_line - last_line; + bool add_map = false; + if (line_delta < 0 + || (line_delta > 10 && line_delta * map->column_bits > 1000) + || (max_column_hint >= (1U << map->column_bits)) + || (max_column_hint <= 80 && map->column_bits >= 10)) + { + add_map = true; + } + else + max_column_hint = set->max_column_hint; + if (add_map) + { + int column_bits; + if (max_column_hint > 100000 || highest > 0xC0000000) + { + /* If the column number is ridiculous or we've allocated a huge + number of source_locations, give up on column numbers. */ + max_column_hint = 0; + if (highest >0xF0000000) + return 0; + column_bits = 0; + } + else + { + column_bits = 7; + while (max_column_hint >= (1U << column_bits)) + column_bits++; + max_column_hint = 1U << column_bits; + } + /* Allocate the new line_map. However, if the current map only has a + single line we can sometimes just increase its column_bits instead. */ + if (line_delta < 0 + || last_line != map->to_line + || SOURCE_COLUMN (map, highest) >= (1U << column_bits)) + map = (struct line_map*) linemap_add (set, LC_RENAME, map->sysp, + map->to_file, to_line); + map->column_bits = column_bits; + r = map->start_location + ((to_line - map->to_line) << column_bits); + } + else + r = highest - SOURCE_COLUMN (map, highest) + + (line_delta << map->column_bits); + set->highest_line = r; + if (r > set->highest_location) + set->highest_location = r; + set->max_column_hint = max_column_hint; + return r; +} + +source_location +linemap_position_for_column (struct line_maps *set, unsigned int to_column) +{ + source_location r = set->highest_line; + if (to_column >= set->max_column_hint) + { + if (r >= 0xC000000 || to_column > 100000) + { + /* Running low on source_locations - disable column numbers. */ + return r; + } + else + { + struct line_map *map = &set->maps[set->used - 1]; + r = linemap_line_start (set, SOURCE_LINE (map, r), to_column + 50); + } + } + r = r + to_column; + if (r >= set->highest_location) + set->highest_location = r; + return r; +} + +/* Given a logical line, returns the map from which the corresponding + (source file, line) pair can be deduced. Since the set is built + chronologically, the logical lines are monotonic increasing, and so + the list is sorted and we can use a binary search. */ + +const struct line_map * +linemap_lookup (struct line_maps *set, source_location line) +{ + unsigned int md, mn, mx; + const struct line_map *cached; + + mn = set->cache; + mx = set->used; + + cached = &set->maps[mn]; + /* We should get a segfault if no line_maps have been added yet. */ + if (line >= cached->start_location) + { + if (mn + 1 == mx || line < cached[1].start_location) + return cached; + } + else + { + mx = mn; + mn = 0; + } + + while (mx - mn > 1) + { + md = (mn + mx) / 2; + if (set->maps[md].start_location > line) + mx = md; + else + mn = md; + } + + set->cache = mn; + return &set->maps[mn]; +} + +/* Print the file names and line numbers of the #include commands + which led to the map MAP, if any, to stderr. Nothing is output if + the most recently listed stack is the same as the current one. */ + +void +linemap_print_containing_files (struct line_maps *set, + const struct line_map *map) +{ + if (MAIN_FILE_P (map) || set->last_listed == map->included_from) + return; + + set->last_listed = map->included_from; + map = INCLUDED_FROM (set, map); + + fprintf (stderr, _("In file included from %s:%u"), + map->to_file, LAST_SOURCE_LINE (map)); + + while (! MAIN_FILE_P (map)) + { + map = INCLUDED_FROM (set, map); + /* Translators note: this message is used in conjunction + with "In file included from %s:%ld" and some other + tricks. We want something like this: + + | In file included from sys/select.h:123, + | from sys/types.h:234, + | from userfile.c:31: + | bits/select.h:45: + + with all the "from"s lined up. + The trailing comma is at the beginning of this message, + and the trailing colon is not translated. */ + fprintf (stderr, _(",\n from %s:%u"), + map->to_file, LAST_SOURCE_LINE (map)); + } + + fputs (":\n", stderr); +} + +/* Print an include trace, for e.g. the -H option of the preprocessor. */ + +static void +trace_include (const struct line_maps *set, const struct line_map *map) +{ + unsigned int i = set->depth; + + while (--i) + putc ('.', stderr); + fprintf (stderr, " %s\n", map->to_file); +} diff --git a/libcpp/macro.c b/libcpp/macro.c new file mode 100644 index 0000000..754e2f7 --- /dev/null +++ b/libcpp/macro.c @@ -0,0 +1,1876 @@ +/* Part of CPP library. (Macro and #define handling.) + Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1998, + 1999, 2000, 2001, 2002, 2003, 2004, 2005, + 2006, 2007 Free Software Foundation, Inc. + Written by Per Bothner, 1994. + Based on CCCP program by Paul Rubin, June 1986 + Adapted to ANSI C, Richard Stallman, Jan 1987 + +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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + In other words, you are welcome to use, share and improve this program. + You are forbidden to forbid anyone else to use, share and improve + what you give them. Help stamp out software-hoarding! */ + +#include "config.h" +#include "system.h" +#include "cpplib.h" +#include "internal.h" + +typedef struct macro_arg macro_arg; +struct macro_arg +{ + const cpp_token **first; /* First token in unexpanded argument. */ + const cpp_token **expanded; /* Macro-expanded argument. */ + const cpp_token *stringified; /* Stringified argument. */ + unsigned int count; /* # of tokens in argument. */ + unsigned int expanded_count; /* # of tokens in expanded argument. */ +}; + +/* Macro expansion. */ + +static int enter_macro_context (cpp_reader *, cpp_hashnode *); +static int builtin_macro (cpp_reader *, cpp_hashnode *); +static void push_ptoken_context (cpp_reader *, cpp_hashnode *, _cpp_buff *, + const cpp_token **, unsigned int); +static _cpp_buff *collect_args (cpp_reader *, const cpp_hashnode *); +static cpp_context *next_context (cpp_reader *); +static const cpp_token *padding_token (cpp_reader *, const cpp_token *); +static void expand_arg (cpp_reader *, macro_arg *); +static const cpp_token *new_string_token (cpp_reader *, uchar *, unsigned int); +static const cpp_token *stringify_arg (cpp_reader *, macro_arg *); +static void paste_all_tokens (cpp_reader *, const cpp_token *); +static bool paste_tokens (cpp_reader *, const cpp_token **, const cpp_token *); +static void replace_args (cpp_reader *, cpp_hashnode *, cpp_macro *, + macro_arg *); +static _cpp_buff *funlike_invocation_p (cpp_reader *, cpp_hashnode *); +static bool create_iso_definition (cpp_reader *, cpp_macro *); + +/* #define directive parsing and handling. */ + +static cpp_token *alloc_expansion_token (cpp_reader *, cpp_macro *); +static cpp_token *lex_expansion_token (cpp_reader *, cpp_macro *); +static bool warn_of_redefinition (cpp_reader *, const cpp_hashnode *, + const cpp_macro *); +static bool parse_params (cpp_reader *, cpp_macro *); +static void check_trad_stringification (cpp_reader *, const cpp_macro *, + const cpp_string *); + +/* Emits a warning if NODE is a macro defined in the main file that + has not been used. */ +int +_cpp_warn_if_unused_macro (cpp_reader *pfile, cpp_hashnode *node, + void *v ATTRIBUTE_UNUSED) +{ + if (node->type == NT_MACRO && !(node->flags & NODE_BUILTIN)) + { + cpp_macro *macro = node->value.macro; + + if (!macro->used + && MAIN_FILE_P (linemap_lookup (pfile->line_table, macro->line))) + cpp_error_with_line (pfile, CPP_DL_WARNING, macro->line, 0, + "macro \"%s\" is not used", NODE_NAME (node)); + } + + return 1; +} + +/* Allocates and returns a CPP_STRING token, containing TEXT of length + LEN, after null-terminating it. TEXT must be in permanent storage. */ +static const cpp_token * +new_string_token (cpp_reader *pfile, unsigned char *text, unsigned int len) +{ + cpp_token *token = _cpp_temp_token (pfile); + + text[len] = '\0'; + token->type = CPP_STRING; + token->val.str.len = len; + token->val.str.text = text; + token->flags = 0; + return token; +} + +static const char * const monthnames[] = +{ + "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" +}; + +/* Helper function for builtin_macro. Returns the text generated by + a builtin macro. */ +const uchar * +_cpp_builtin_macro_text (cpp_reader *pfile, cpp_hashnode *node) +{ + const struct line_map *map; + const uchar *result = NULL; + unsigned int number = 1; + + switch (node->value.builtin) + { + default: + cpp_error (pfile, CPP_DL_ICE, "invalid built-in macro \"%s\"", + NODE_NAME (node)); + break; + + case BT_TIMESTAMP: + { + cpp_buffer *pbuffer = cpp_get_buffer (pfile); + if (pbuffer->timestamp == NULL) + { + /* Initialize timestamp value of the assotiated file. */ + struct _cpp_file *file = cpp_get_file (pbuffer); + if (file) + { + /* Generate __TIMESTAMP__ string, that represents + the date and time of the last modification + of the current source file. The string constant + looks like "Sun Sep 16 01:03:52 1973". */ + struct tm *tb = NULL; + struct stat *st = _cpp_get_file_stat (file); + if (st) + tb = localtime (&st->st_mtime); + if (tb) + { + char *str = asctime (tb); + size_t len = strlen (str); + unsigned char *buf = _cpp_unaligned_alloc (pfile, len + 2); + buf[0] = '"'; + strcpy ((char *) buf + 1, str); + buf[len] = '"'; + pbuffer->timestamp = buf; + } + else + { + cpp_errno (pfile, CPP_DL_WARNING, + "could not determine file timestamp"); + pbuffer->timestamp = U"\"??? ??? ?? ??:??:?? ????\""; + } + } + } + result = pbuffer->timestamp; + } + break; + case BT_FILE: + case BT_BASE_FILE: + { + unsigned int len; + const char *name; + uchar *buf; + map = linemap_lookup (pfile->line_table, pfile->line_table->highest_line); + + if (node->value.builtin == BT_BASE_FILE) + while (! MAIN_FILE_P (map)) + map = INCLUDED_FROM (pfile->line_table, map); + + name = map->to_file; + len = strlen (name); + buf = _cpp_unaligned_alloc (pfile, len * 2 + 3); + result = buf; + *buf = '"'; + buf = cpp_quote_string (buf + 1, (const unsigned char *) name, len); + *buf++ = '"'; + *buf = '\0'; + } + break; + + case BT_INCLUDE_LEVEL: + /* The line map depth counts the primary source as level 1, but + historically __INCLUDE_DEPTH__ has called the primary source + level 0. */ + number = pfile->line_table->depth - 1; + break; + + case BT_SPECLINE: + map = &pfile->line_table->maps[pfile->line_table->used-1]; + /* If __LINE__ is embedded in a macro, it must expand to the + line of the macro's invocation, not its definition. + Otherwise things like assert() will not work properly. */ + if (CPP_OPTION (pfile, traditional)) + number = pfile->line_table->highest_line; + else + number = pfile->cur_token[-1].src_loc; + number = SOURCE_LINE (map, number); + break; + + /* __STDC__ has the value 1 under normal circumstances. + However, if (a) we are in a system header, (b) the option + stdc_0_in_system_headers is true (set by target config), and + (c) we are not in strictly conforming mode, then it has the + value 0. (b) and (c) are already checked in cpp_init_builtins. */ + case BT_STDC: + if (cpp_in_system_header (pfile)) + number = 0; + else + number = 1; + break; + + case BT_DATE: + case BT_TIME: + if (pfile->date == NULL) + { + /* Allocate __DATE__ and __TIME__ strings from permanent + storage. We only do this once, and don't generate them + at init time, because time() and localtime() are very + slow on some systems. */ + time_t tt; + struct tm *tb = NULL; + + /* (time_t) -1 is a legitimate value for "number of seconds + since the Epoch", so we have to do a little dance to + distinguish that from a genuine error. */ + errno = 0; + tt = time(NULL); + if (tt != (time_t)-1 || errno == 0) + tb = localtime (&tt); + + if (tb) + { + pfile->date = _cpp_unaligned_alloc (pfile, + sizeof ("\"Oct 11 1347\"")); + sprintf ((char *) pfile->date, "\"%s %2d %4d\"", + monthnames[tb->tm_mon], tb->tm_mday, + tb->tm_year + 1900); + + pfile->time = _cpp_unaligned_alloc (pfile, + sizeof ("\"12:34:56\"")); + sprintf ((char *) pfile->time, "\"%02d:%02d:%02d\"", + tb->tm_hour, tb->tm_min, tb->tm_sec); + } + else + { + cpp_errno (pfile, CPP_DL_WARNING, + "could not determine date and time"); + + pfile->date = U"\"??? ?? ????\""; + pfile->time = U"\"??:??:??\""; + } + } + + if (node->value.builtin == BT_DATE) + result = pfile->date; + else + result = pfile->time; + break; + + case BT_COUNTER: + if (CPP_OPTION (pfile, directives_only) && pfile->state.in_directive) + cpp_error (pfile, CPP_DL_ERROR, + "__COUNTER__ expanded inside directive with -fdirectives-only"); + number = pfile->counter++; + break; + } + + if (result == NULL) + { + /* 21 bytes holds all NUL-terminated unsigned 64-bit numbers. */ + result = _cpp_unaligned_alloc (pfile, 21); + sprintf ((char *) result, "%u", number); + } + + return result; +} + +/* Convert builtin macros like __FILE__ to a token and push it on the + context stack. Also handles _Pragma, for which a new token may not + be created. Returns 1 if it generates a new token context, 0 to + return the token to the caller. */ +static int +builtin_macro (cpp_reader *pfile, cpp_hashnode *node) +{ + const uchar *buf; + size_t len; + char *nbuf; + + if (node->value.builtin == BT_PRAGMA) + { + /* Don't interpret _Pragma within directives. The standard is + not clear on this, but to me this makes most sense. */ + if (pfile->state.in_directive) + return 0; + + return _cpp_do__Pragma (pfile); + } + + buf = _cpp_builtin_macro_text (pfile, node); + len = ustrlen (buf); + nbuf = (char *) alloca (len + 1); + memcpy (nbuf, buf, len); + nbuf[len]='\n'; + + cpp_push_buffer (pfile, (uchar *) nbuf, len, /* from_stage3 */ true); + _cpp_clean_line (pfile); + + /* Set pfile->cur_token as required by _cpp_lex_direct. */ + pfile->cur_token = _cpp_temp_token (pfile); + _cpp_push_token_context (pfile, NULL, _cpp_lex_direct (pfile), 1); + if (pfile->buffer->cur != pfile->buffer->rlimit) + cpp_error (pfile, CPP_DL_ICE, "invalid built-in macro \"%s\"", + NODE_NAME (node)); + _cpp_pop_buffer (pfile); + + return 1; +} + +/* Copies SRC, of length LEN, to DEST, adding backslashes before all + backslashes and double quotes. DEST must be of sufficient size. + Returns a pointer to the end of the string. */ +uchar * +cpp_quote_string (uchar *dest, const uchar *src, unsigned int len) +{ + while (len--) + { + uchar c = *src++; + + if (c == '\\' || c == '"') + { + *dest++ = '\\'; + *dest++ = c; + } + else + *dest++ = c; + } + + return dest; +} + +/* Convert a token sequence ARG to a single string token according to + the rules of the ISO C #-operator. */ +static const cpp_token * +stringify_arg (cpp_reader *pfile, macro_arg *arg) +{ + unsigned char *dest; + unsigned int i, escape_it, backslash_count = 0; + const cpp_token *source = NULL; + size_t len; + + if (BUFF_ROOM (pfile->u_buff) < 3) + _cpp_extend_buff (pfile, &pfile->u_buff, 3); + dest = BUFF_FRONT (pfile->u_buff); + *dest++ = '"'; + + /* Loop, reading in the argument's tokens. */ + for (i = 0; i < arg->count; i++) + { + const cpp_token *token = arg->first[i]; + + if (token->type == CPP_PADDING) + { + if (source == NULL) + source = token->val.source; + continue; + } + + escape_it = (token->type == CPP_STRING || token->type == CPP_WSTRING + || token->type == CPP_CHAR || token->type == CPP_WCHAR); + + /* Room for each char being written in octal, initial space and + final quote and NUL. */ + len = cpp_token_len (token); + if (escape_it) + len *= 4; + len += 3; + + if ((size_t) (BUFF_LIMIT (pfile->u_buff) - dest) < len) + { + size_t len_so_far = dest - BUFF_FRONT (pfile->u_buff); + _cpp_extend_buff (pfile, &pfile->u_buff, len); + dest = BUFF_FRONT (pfile->u_buff) + len_so_far; + } + + /* Leading white space? */ + if (dest - 1 != BUFF_FRONT (pfile->u_buff)) + { + if (source == NULL) + source = token; + if (source->flags & PREV_WHITE) + *dest++ = ' '; + } + source = NULL; + + if (escape_it) + { + _cpp_buff *buff = _cpp_get_buff (pfile, len); + unsigned char *buf = BUFF_FRONT (buff); + len = cpp_spell_token (pfile, token, buf, true) - buf; + dest = cpp_quote_string (dest, buf, len); + _cpp_release_buff (pfile, buff); + } + else + dest = cpp_spell_token (pfile, token, dest, true); + + if (token->type == CPP_OTHER && token->val.str.text[0] == '\\') + backslash_count++; + else + backslash_count = 0; + } + + /* Ignore the final \ of invalid string literals. */ + if (backslash_count & 1) + { + cpp_error (pfile, CPP_DL_WARNING, + "invalid string literal, ignoring final '\\'"); + dest--; + } + + /* Commit the memory, including NUL, and return the token. */ + *dest++ = '"'; + len = dest - BUFF_FRONT (pfile->u_buff); + BUFF_FRONT (pfile->u_buff) = dest + 1; + return new_string_token (pfile, dest - len, len); +} + +/* Try to paste two tokens. On success, return nonzero. In any + case, PLHS is updated to point to the pasted token, which is + guaranteed to not have the PASTE_LEFT flag set. */ +static bool +paste_tokens (cpp_reader *pfile, const cpp_token **plhs, const cpp_token *rhs) +{ + unsigned char *buf, *end, *lhsend; + cpp_token *lhs; + unsigned int len; + + len = cpp_token_len (*plhs) + cpp_token_len (rhs) + 1; + buf = (unsigned char *) alloca (len); + end = lhsend = cpp_spell_token (pfile, *plhs, buf, false); + + /* Avoid comment headers, since they are still processed in stage 3. + It is simpler to insert a space here, rather than modifying the + lexer to ignore comments in some circumstances. Simply returning + false doesn't work, since we want to clear the PASTE_LEFT flag. */ + if ((*plhs)->type == CPP_DIV && rhs->type != CPP_EQ) + *end++ = ' '; + /* In one obscure case we might see padding here. */ + if (rhs->type != CPP_PADDING) + end = cpp_spell_token (pfile, rhs, end, false); + *end = '\n'; + + cpp_push_buffer (pfile, buf, end - buf, /* from_stage3 */ true); + _cpp_clean_line (pfile); + + /* Set pfile->cur_token as required by _cpp_lex_direct. */ + pfile->cur_token = _cpp_temp_token (pfile); + lhs = _cpp_lex_direct (pfile); + if (pfile->buffer->cur != pfile->buffer->rlimit) + { + source_location saved_loc = lhs->src_loc; + + _cpp_pop_buffer (pfile); + _cpp_backup_tokens (pfile, 1); + *lhsend = '\0'; + + /* We have to remove the PASTE_LEFT flag from the old lhs, but + we want to keep the new location. */ + *lhs = **plhs; + *plhs = lhs; + lhs->src_loc = saved_loc; + lhs->flags &= ~PASTE_LEFT; + + /* Mandatory error for all apart from assembler. */ + if (CPP_OPTION (pfile, lang) != CLK_ASM) + cpp_error (pfile, CPP_DL_ERROR, + "pasting \"%s\" and \"%s\" does not give a valid preprocessing token", + buf, cpp_token_as_text (pfile, rhs)); + return false; + } + + *plhs = lhs; + _cpp_pop_buffer (pfile); + return true; +} + +/* Handles an arbitrarily long sequence of ## operators, with initial + operand LHS. This implementation is left-associative, + non-recursive, and finishes a paste before handling succeeding + ones. If a paste fails, we back up to the RHS of the failing ## + operator before pushing the context containing the result of prior + successful pastes, with the effect that the RHS appears in the + output stream after the pasted LHS normally. */ +static void +paste_all_tokens (cpp_reader *pfile, const cpp_token *lhs) +{ + const cpp_token *rhs; + cpp_context *context = pfile->context; + + do + { + /* Take the token directly from the current context. We can do + this, because we are in the replacement list of either an + object-like macro, or a function-like macro with arguments + inserted. In either case, the constraints to #define + guarantee we have at least one more token. */ + if (context->direct_p) + rhs = FIRST (context).token++; + else + rhs = *FIRST (context).ptoken++; + + if (rhs->type == CPP_PADDING) + { + if (rhs->flags & PASTE_LEFT) + abort (); + } + if (!paste_tokens (pfile, &lhs, rhs)) + break; + } + while (rhs->flags & PASTE_LEFT); + + /* Put the resulting token in its own context. */ + _cpp_push_token_context (pfile, NULL, lhs, 1); +} + +/* Returns TRUE if the number of arguments ARGC supplied in an + invocation of the MACRO referenced by NODE is valid. An empty + invocation to a macro with no parameters should pass ARGC as zero. + + Note that MACRO cannot necessarily be deduced from NODE, in case + NODE was redefined whilst collecting arguments. */ +bool +_cpp_arguments_ok (cpp_reader *pfile, cpp_macro *macro, const cpp_hashnode *node, unsigned int argc) +{ + if (argc == macro->paramc) + return true; + + if (argc < macro->paramc) + { + /* As an extension, a rest argument is allowed to not appear in + the invocation at all. + e.g. #define debug(format, args...) something + debug("string"); + + This is exactly the same as if there had been an empty rest + argument - debug("string", ). */ + + if (argc + 1 == macro->paramc && macro->variadic) + { + if (CPP_PEDANTIC (pfile) && ! macro->syshdr) + cpp_error (pfile, CPP_DL_PEDWARN, + "ISO C99 requires rest arguments to be used"); + return true; + } + + cpp_error (pfile, CPP_DL_ERROR, + "macro \"%s\" requires %u arguments, but only %u given", + NODE_NAME (node), macro->paramc, argc); + } + else + cpp_error (pfile, CPP_DL_ERROR, + "macro \"%s\" passed %u arguments, but takes just %u", + NODE_NAME (node), argc, macro->paramc); + + return false; +} + +/* Reads and returns the arguments to a function-like macro + invocation. Assumes the opening parenthesis has been processed. + If there is an error, emits an appropriate diagnostic and returns + NULL. Each argument is terminated by a CPP_EOF token, for the + future benefit of expand_arg(). */ +static _cpp_buff * +collect_args (cpp_reader *pfile, const cpp_hashnode *node) +{ + _cpp_buff *buff, *base_buff; + cpp_macro *macro; + macro_arg *args, *arg; + const cpp_token *token; + unsigned int argc; + + macro = node->value.macro; + if (macro->paramc) + argc = macro->paramc; + else + argc = 1; + buff = _cpp_get_buff (pfile, argc * (50 * sizeof (cpp_token *) + + sizeof (macro_arg))); + base_buff = buff; + args = (macro_arg *) buff->base; + memset (args, 0, argc * sizeof (macro_arg)); + buff->cur = (unsigned char *) &args[argc]; + arg = args, argc = 0; + + /* Collect the tokens making up each argument. We don't yet know + how many arguments have been supplied, whether too many or too + few. Hence the slightly bizarre usage of "argc" and "arg". */ + do + { + unsigned int paren_depth = 0; + unsigned int ntokens = 0; + + argc++; + arg->first = (const cpp_token **) buff->cur; + + for (;;) + { + /* Require space for 2 new tokens (including a CPP_EOF). */ + if ((unsigned char *) &arg->first[ntokens + 2] > buff->limit) + { + buff = _cpp_append_extend_buff (pfile, buff, + 1000 * sizeof (cpp_token *)); + arg->first = (const cpp_token **) buff->cur; + } + + token = cpp_get_token (pfile); + + if (token->type == CPP_PADDING) + { + /* Drop leading padding. */ + if (ntokens == 0) + continue; + } + else if (token->type == CPP_OPEN_PAREN) + paren_depth++; + else if (token->type == CPP_CLOSE_PAREN) + { + if (paren_depth-- == 0) + break; + } + else if (token->type == CPP_COMMA) + { + /* A comma does not terminate an argument within + parentheses or as part of a variable argument. */ + if (paren_depth == 0 + && ! (macro->variadic && argc == macro->paramc)) + break; + } + else if (token->type == CPP_EOF + || (token->type == CPP_HASH && token->flags & BOL)) + break; + + arg->first[ntokens++] = token; + } + + /* Drop trailing padding. */ + while (ntokens > 0 && arg->first[ntokens - 1]->type == CPP_PADDING) + ntokens--; + + arg->count = ntokens; + arg->first[ntokens] = &pfile->eof; + + /* Terminate the argument. Excess arguments loop back and + overwrite the final legitimate argument, before failing. */ + if (argc <= macro->paramc) + { + buff->cur = (unsigned char *) &arg->first[ntokens + 1]; + if (argc != macro->paramc) + arg++; + } + } + while (token->type != CPP_CLOSE_PAREN && token->type != CPP_EOF); + + if (token->type == CPP_EOF) + { + /* We still need the CPP_EOF to end directives, and to end + pre-expansion of a macro argument. Step back is not + unconditional, since we don't want to return a CPP_EOF to our + callers at the end of an -include-d file. */ + if (pfile->context->prev || pfile->state.in_directive) + _cpp_backup_tokens (pfile, 1); + cpp_error (pfile, CPP_DL_ERROR, + "unterminated argument list invoking macro \"%s\"", + NODE_NAME (node)); + } + else + { + /* A single empty argument is counted as no argument. */ + if (argc == 1 && macro->paramc == 0 && args[0].count == 0) + argc = 0; + if (_cpp_arguments_ok (pfile, macro, node, argc)) + { + /* GCC has special semantics for , ## b where b is a varargs + parameter: we remove the comma if b was omitted entirely. + If b was merely an empty argument, the comma is retained. + If the macro takes just one (varargs) parameter, then we + retain the comma only if we are standards conforming. + + If FIRST is NULL replace_args () swallows the comma. */ + if (macro->variadic && (argc < macro->paramc + || (argc == 1 && args[0].count == 0 + && !CPP_OPTION (pfile, std)))) + args[macro->paramc - 1].first = NULL; + return base_buff; + } + } + + /* An error occurred. */ + _cpp_release_buff (pfile, base_buff); + return NULL; +} + +/* Search for an opening parenthesis to the macro of NODE, in such a + way that, if none is found, we don't lose the information in any + intervening padding tokens. If we find the parenthesis, collect + the arguments and return the buffer containing them. */ +static _cpp_buff * +funlike_invocation_p (cpp_reader *pfile, cpp_hashnode *node) +{ + const cpp_token *token, *padding = NULL; + + for (;;) + { + token = cpp_get_token (pfile); + if (token->type != CPP_PADDING) + break; + if (padding == NULL + || (!(padding->flags & PREV_WHITE) && token->val.source == NULL)) + padding = token; + } + + if (token->type == CPP_OPEN_PAREN) + { + pfile->state.parsing_args = 2; + return collect_args (pfile, node); + } + + /* CPP_EOF can be the end of macro arguments, or the end of the + file. We mustn't back up over the latter. Ugh. */ + if (token->type != CPP_EOF || token == &pfile->eof) + { + /* Back up. We may have skipped padding, in which case backing + up more than one token when expanding macros is in general + too difficult. We re-insert it in its own context. */ + _cpp_backup_tokens (pfile, 1); + if (padding) + _cpp_push_token_context (pfile, NULL, padding, 1); + } + + return NULL; +} + +/* Push the context of a macro with hash entry NODE onto the context + stack. If we can successfully expand the macro, we push a context + containing its yet-to-be-rescanned replacement list and return one. + Otherwise, we don't push a context and return zero. */ +static int +enter_macro_context (cpp_reader *pfile, cpp_hashnode *node) +{ + /* The presence of a macro invalidates a file's controlling macro. */ + pfile->mi_valid = false; + + pfile->state.angled_headers = false; + + /* Handle standard macros. */ + if (! (node->flags & NODE_BUILTIN)) + { + cpp_macro *macro = node->value.macro; + + if (macro->fun_like) + { + _cpp_buff *buff; + + pfile->state.prevent_expansion++; + pfile->keep_tokens++; + pfile->state.parsing_args = 1; + buff = funlike_invocation_p (pfile, node); + pfile->state.parsing_args = 0; + pfile->keep_tokens--; + pfile->state.prevent_expansion--; + + if (buff == NULL) + { + if (CPP_WTRADITIONAL (pfile) && ! node->value.macro->syshdr) + cpp_error (pfile, CPP_DL_WARNING, + "function-like macro \"%s\" must be used with arguments in traditional C", + NODE_NAME (node)); + + return 0; + } + + if (macro->paramc > 0) + replace_args (pfile, node, macro, (macro_arg *) buff->base); + _cpp_release_buff (pfile, buff); + } + + /* Disable the macro within its expansion. */ + node->flags |= NODE_DISABLED; + + macro->used = 1; + + if (macro->paramc == 0) + _cpp_push_token_context (pfile, node, macro->exp.tokens, macro->count); + + return 1; + } + + /* Handle built-in macros and the _Pragma operator. */ + return builtin_macro (pfile, node); +} + +/* Replace the parameters in a function-like macro of NODE with the + actual ARGS, and place the result in a newly pushed token context. + Expand each argument before replacing, unless it is operated upon + by the # or ## operators. */ +static void +replace_args (cpp_reader *pfile, cpp_hashnode *node, cpp_macro *macro, macro_arg *args) +{ + unsigned int i, total; + const cpp_token *src, *limit; + const cpp_token **dest, **first; + macro_arg *arg; + _cpp_buff *buff; + + /* First, fully macro-expand arguments, calculating the number of + tokens in the final expansion as we go. The ordering of the if + statements below is subtle; we must handle stringification before + pasting. */ + total = macro->count; + limit = macro->exp.tokens + macro->count; + + for (src = macro->exp.tokens; src < limit; src++) + if (src->type == CPP_MACRO_ARG) + { + /* Leading and trailing padding tokens. */ + total += 2; + + /* We have an argument. If it is not being stringified or + pasted it is macro-replaced before insertion. */ + arg = &args[src->val.arg_no - 1]; + + if (src->flags & STRINGIFY_ARG) + { + if (!arg->stringified) + arg->stringified = stringify_arg (pfile, arg); + } + else if ((src->flags & PASTE_LEFT) + || (src > macro->exp.tokens && (src[-1].flags & PASTE_LEFT))) + total += arg->count - 1; + else + { + if (!arg->expanded) + expand_arg (pfile, arg); + total += arg->expanded_count - 1; + } + } + + /* Now allocate space for the expansion, copy the tokens and replace + the arguments. */ + buff = _cpp_get_buff (pfile, total * sizeof (cpp_token *)); + first = (const cpp_token **) buff->base; + dest = first; + + for (src = macro->exp.tokens; src < limit; src++) + { + unsigned int count; + const cpp_token **from, **paste_flag; + + if (src->type != CPP_MACRO_ARG) + { + *dest++ = src; + continue; + } + + paste_flag = 0; + arg = &args[src->val.arg_no - 1]; + if (src->flags & STRINGIFY_ARG) + count = 1, from = &arg->stringified; + else if (src->flags & PASTE_LEFT) + count = arg->count, from = arg->first; + else if (src != macro->exp.tokens && (src[-1].flags & PASTE_LEFT)) + { + count = arg->count, from = arg->first; + if (dest != first) + { + if (dest[-1]->type == CPP_COMMA + && macro->variadic + && src->val.arg_no == macro->paramc) + { + /* Swallow a pasted comma if from == NULL, otherwise + drop the paste flag. */ + if (from == NULL) + dest--; + else + paste_flag = dest - 1; + } + /* Remove the paste flag if the RHS is a placemarker. */ + else if (count == 0) + paste_flag = dest - 1; + } + } + else + count = arg->expanded_count, from = arg->expanded; + + /* Padding on the left of an argument (unless RHS of ##). */ + if ((!pfile->state.in_directive || pfile->state.directive_wants_padding) + && src != macro->exp.tokens && !(src[-1].flags & PASTE_LEFT)) + *dest++ = padding_token (pfile, src); + + if (count) + { + memcpy (dest, from, count * sizeof (cpp_token *)); + dest += count; + + /* With a non-empty argument on the LHS of ##, the last + token should be flagged PASTE_LEFT. */ + if (src->flags & PASTE_LEFT) + paste_flag = dest - 1; + } + + /* Avoid paste on RHS (even case count == 0). */ + if (!pfile->state.in_directive && !(src->flags & PASTE_LEFT)) + *dest++ = &pfile->avoid_paste; + + /* Add a new paste flag, or remove an unwanted one. */ + if (paste_flag) + { + cpp_token *token = _cpp_temp_token (pfile); + token->type = (*paste_flag)->type; + token->val = (*paste_flag)->val; + if (src->flags & PASTE_LEFT) + token->flags = (*paste_flag)->flags | PASTE_LEFT; + else + token->flags = (*paste_flag)->flags & ~PASTE_LEFT; + *paste_flag = token; + } + } + + /* Free the expanded arguments. */ + for (i = 0; i < macro->paramc; i++) + if (args[i].expanded) + free (args[i].expanded); + + push_ptoken_context (pfile, node, buff, first, dest - first); +} + +/* Return a special padding token, with padding inherited from SOURCE. */ +static const cpp_token * +padding_token (cpp_reader *pfile, const cpp_token *source) +{ + cpp_token *result = _cpp_temp_token (pfile); + + result->type = CPP_PADDING; + + /* Data in GCed data structures cannot be made const so far, so we + need a cast here. */ + result->val.source = (cpp_token *) source; + result->flags = 0; + return result; +} + +/* Get a new uninitialized context. Create a new one if we cannot + re-use an old one. */ +static cpp_context * +next_context (cpp_reader *pfile) +{ + cpp_context *result = pfile->context->next; + + if (result == 0) + { + result = XNEW (cpp_context); + result->prev = pfile->context; + result->next = 0; + pfile->context->next = result; + } + + pfile->context = result; + return result; +} + +/* Push a list of pointers to tokens. */ +static void +push_ptoken_context (cpp_reader *pfile, cpp_hashnode *macro, _cpp_buff *buff, + const cpp_token **first, unsigned int count) +{ + cpp_context *context = next_context (pfile); + + context->direct_p = false; + context->macro = macro; + context->buff = buff; + FIRST (context).ptoken = first; + LAST (context).ptoken = first + count; +} + +/* Push a list of tokens. */ +void +_cpp_push_token_context (cpp_reader *pfile, cpp_hashnode *macro, + const cpp_token *first, unsigned int count) +{ + cpp_context *context = next_context (pfile); + + context->direct_p = true; + context->macro = macro; + context->buff = NULL; + FIRST (context).token = first; + LAST (context).token = first + count; +} + +/* Push a traditional macro's replacement text. */ +void +_cpp_push_text_context (cpp_reader *pfile, cpp_hashnode *macro, + const uchar *start, size_t len) +{ + cpp_context *context = next_context (pfile); + + context->direct_p = true; + context->macro = macro; + context->buff = NULL; + CUR (context) = start; + RLIMIT (context) = start + len; + macro->flags |= NODE_DISABLED; +} + +/* Expand an argument ARG before replacing parameters in a + function-like macro. This works by pushing a context with the + argument's tokens, and then expanding that into a temporary buffer + as if it were a normal part of the token stream. collect_args() + has terminated the argument's tokens with a CPP_EOF so that we know + when we have fully expanded the argument. */ +static void +expand_arg (cpp_reader *pfile, macro_arg *arg) +{ + unsigned int capacity; + bool saved_warn_trad; + + if (arg->count == 0) + return; + + /* Don't warn about funlike macros when pre-expanding. */ + saved_warn_trad = CPP_WTRADITIONAL (pfile); + CPP_WTRADITIONAL (pfile) = 0; + + /* Loop, reading in the arguments. */ + capacity = 256; + arg->expanded = XNEWVEC (const cpp_token *, capacity); + + push_ptoken_context (pfile, NULL, NULL, arg->first, arg->count + 1); + for (;;) + { + const cpp_token *token; + + if (arg->expanded_count + 1 >= capacity) + { + capacity *= 2; + arg->expanded = XRESIZEVEC (const cpp_token *, arg->expanded, + capacity); + } + + token = cpp_get_token (pfile); + + if (token->type == CPP_EOF) + break; + + arg->expanded[arg->expanded_count++] = token; + } + + _cpp_pop_context (pfile); + + CPP_WTRADITIONAL (pfile) = saved_warn_trad; +} + +/* Pop the current context off the stack, re-enabling the macro if the + context represented a macro's replacement list. The context + structure is not freed so that we can re-use it later. */ +void +_cpp_pop_context (cpp_reader *pfile) +{ + cpp_context *context = pfile->context; + + if (context->macro) + context->macro->flags &= ~NODE_DISABLED; + + if (context->buff) + _cpp_release_buff (pfile, context->buff); + + pfile->context = context->prev; +} + +/* External routine to get a token. Also used nearly everywhere + internally, except for places where we know we can safely call + _cpp_lex_token directly, such as lexing a directive name. + + Macro expansions and directives are transparently handled, + including entering included files. Thus tokens are post-macro + expansion, and after any intervening directives. External callers + see CPP_EOF only at EOF. Internal callers also see it when meeting + a directive inside a macro call, when at the end of a directive and + state.in_directive is still 1, and at the end of argument + pre-expansion. */ +const cpp_token * +cpp_get_token (cpp_reader *pfile) +{ + const cpp_token *result; + bool can_set = pfile->set_invocation_location; + pfile->set_invocation_location = false; + + for (;;) + { + cpp_hashnode *node; + cpp_context *context = pfile->context; + + /* Context->prev == 0 <=> base context. */ + if (!context->prev) + result = _cpp_lex_token (pfile); + else if (FIRST (context).token != LAST (context).token) + { + if (context->direct_p) + result = FIRST (context).token++; + else + result = *FIRST (context).ptoken++; + + if (result->flags & PASTE_LEFT) + { + paste_all_tokens (pfile, result); + if (pfile->state.in_directive) + continue; + return padding_token (pfile, result); + } + } + else + { + _cpp_pop_context (pfile); + if (pfile->state.in_directive) + continue; + return &pfile->avoid_paste; + } + + if (pfile->state.in_directive && result->type == CPP_COMMENT) + continue; + + if (result->type != CPP_NAME) + break; + + node = result->val.node; + + if (node->type != NT_MACRO || (result->flags & NO_EXPAND)) + break; + + if (!(node->flags & NODE_DISABLED)) + { + /* If not in a macro context, and we're going to start an + expansion, record the location. */ + if (can_set && !context->macro) + pfile->invocation_location = result->src_loc; + if (!pfile->state.prevent_expansion + && enter_macro_context (pfile, node)) + { + if (pfile->state.in_directive) + continue; + return padding_token (pfile, result); + } + } + else + { + /* Flag this token as always unexpandable. FIXME: move this + to collect_args()?. */ + cpp_token *t = _cpp_temp_token (pfile); + t->type = result->type; + t->flags = result->flags | NO_EXPAND; + t->val = result->val; + result = t; + } + + break; + } + + return result; +} + +/* Like cpp_get_token, but also returns a location separate from the + one provided by the returned token. LOC is an out parameter; *LOC + is set to the location "as expected by the user". This matters + when a token results from macro expansion -- the token's location + will indicate where the macro is defined, but *LOC will be the + location of the start of the expansion. */ +const cpp_token * +cpp_get_token_with_location (cpp_reader *pfile, source_location *loc) +{ + const cpp_token *result; + + pfile->set_invocation_location = true; + result = cpp_get_token (pfile); + if (pfile->context->macro) + *loc = pfile->invocation_location; + else + *loc = result->src_loc; + + return result; +} + +/* Returns true if we're expanding an object-like macro that was + defined in a system header. Just checks the macro at the top of + the stack. Used for diagnostic suppression. */ +int +cpp_sys_macro_p (cpp_reader *pfile) +{ + cpp_hashnode *node = pfile->context->macro; + + return node && node->value.macro && node->value.macro->syshdr; +} + +/* Read each token in, until end of the current file. Directives are + transparently processed. */ +void +cpp_scan_nooutput (cpp_reader *pfile) +{ + /* Request a CPP_EOF token at the end of this file, rather than + transparently continuing with the including file. */ + pfile->buffer->return_at_eof = true; + + pfile->state.discarding_output++; + pfile->state.prevent_expansion++; + + if (CPP_OPTION (pfile, traditional)) + while (_cpp_read_logical_line_trad (pfile)) + ; + else + while (cpp_get_token (pfile)->type != CPP_EOF) + ; + + pfile->state.discarding_output--; + pfile->state.prevent_expansion--; +} + +/* Step back one (or more) tokens. Can only step back more than 1 if + they are from the lexer, and not from macro expansion. */ +void +_cpp_backup_tokens (cpp_reader *pfile, unsigned int count) +{ + if (pfile->context->prev == NULL) + { + pfile->lookaheads += count; + while (count--) + { + pfile->cur_token--; + if (pfile->cur_token == pfile->cur_run->base + /* Possible with -fpreprocessed and no leading #line. */ + && pfile->cur_run->prev != NULL) + { + pfile->cur_run = pfile->cur_run->prev; + pfile->cur_token = pfile->cur_run->limit; + } + } + } + else + { + if (count != 1) + abort (); + if (pfile->context->direct_p) + FIRST (pfile->context).token--; + else + FIRST (pfile->context).ptoken--; + } +} + +/* #define directive parsing and handling. */ + +/* Returns nonzero if a macro redefinition warning is required. */ +static bool +warn_of_redefinition (cpp_reader *pfile, const cpp_hashnode *node, + const cpp_macro *macro2) +{ + const cpp_macro *macro1; + unsigned int i; + + /* Some redefinitions need to be warned about regardless. */ + if (node->flags & NODE_WARN) + return true; + + /* Redefinition of a macro is allowed if and only if the old and new + definitions are the same. (6.10.3 paragraph 2). */ + macro1 = node->value.macro; + + /* Don't check count here as it can be different in valid + traditional redefinitions with just whitespace differences. */ + if (macro1->paramc != macro2->paramc + || macro1->fun_like != macro2->fun_like + || macro1->variadic != macro2->variadic) + return true; + + /* Check parameter spellings. */ + for (i = 0; i < macro1->paramc; i++) + if (macro1->params[i] != macro2->params[i]) + return true; + + /* Check the replacement text or tokens. */ + if (CPP_OPTION (pfile, traditional)) + return _cpp_expansions_different_trad (macro1, macro2); + + if (macro1->count != macro2->count) + return true; + + for (i = 0; i < macro1->count; i++) + if (!_cpp_equiv_tokens (¯o1->exp.tokens[i], ¯o2->exp.tokens[i])) + return true; + + return false; +} + +/* Free the definition of hashnode H. */ +void +_cpp_free_definition (cpp_hashnode *h) +{ + /* Macros and assertions no longer have anything to free. */ + h->type = NT_VOID; + /* Clear builtin flag in case of redefinition. */ + h->flags &= ~(NODE_BUILTIN | NODE_DISABLED); +} + +/* Save parameter NODE to the parameter list of macro MACRO. Returns + zero on success, nonzero if the parameter is a duplicate. */ +bool +_cpp_save_parameter (cpp_reader *pfile, cpp_macro *macro, cpp_hashnode *node) +{ + unsigned int len; + /* Constraint 6.10.3.6 - duplicate parameter names. */ + if (node->flags & NODE_MACRO_ARG) + { + cpp_error (pfile, CPP_DL_ERROR, "duplicate macro parameter \"%s\"", + NODE_NAME (node)); + return true; + } + + if (BUFF_ROOM (pfile->a_buff) + < (macro->paramc + 1) * sizeof (cpp_hashnode *)) + _cpp_extend_buff (pfile, &pfile->a_buff, sizeof (cpp_hashnode *)); + + ((cpp_hashnode **) BUFF_FRONT (pfile->a_buff))[macro->paramc++] = node; + node->flags |= NODE_MACRO_ARG; + len = macro->paramc * sizeof (union _cpp_hashnode_value); + if (len > pfile->macro_buffer_len) + { + pfile->macro_buffer = XRESIZEVEC (unsigned char, pfile->macro_buffer, + len); + pfile->macro_buffer_len = len; + } + ((union _cpp_hashnode_value *) pfile->macro_buffer)[macro->paramc - 1] + = node->value; + + node->value.arg_index = macro->paramc; + return false; +} + +/* Check the syntax of the parameters in a MACRO definition. Returns + false if an error occurs. */ +static bool +parse_params (cpp_reader *pfile, cpp_macro *macro) +{ + unsigned int prev_ident = 0; + + for (;;) + { + const cpp_token *token = _cpp_lex_token (pfile); + + switch (token->type) + { + default: + /* Allow/ignore comments in parameter lists if we are + preserving comments in macro expansions. */ + if (token->type == CPP_COMMENT + && ! CPP_OPTION (pfile, discard_comments_in_macro_exp)) + continue; + + cpp_error (pfile, CPP_DL_ERROR, + "\"%s\" may not appear in macro parameter list", + cpp_token_as_text (pfile, token)); + return false; + + case CPP_NAME: + if (prev_ident) + { + cpp_error (pfile, CPP_DL_ERROR, + "macro parameters must be comma-separated"); + return false; + } + prev_ident = 1; + + if (_cpp_save_parameter (pfile, macro, token->val.node)) + return false; + continue; + + case CPP_CLOSE_PAREN: + if (prev_ident || macro->paramc == 0) + return true; + + /* Fall through to pick up the error. */ + case CPP_COMMA: + if (!prev_ident) + { + cpp_error (pfile, CPP_DL_ERROR, "parameter name missing"); + return false; + } + prev_ident = 0; + continue; + + case CPP_ELLIPSIS: + macro->variadic = 1; + if (!prev_ident) + { + _cpp_save_parameter (pfile, macro, + pfile->spec_nodes.n__VA_ARGS__); + pfile->state.va_args_ok = 1; + if (! CPP_OPTION (pfile, c99) + && CPP_OPTION (pfile, pedantic) + && CPP_OPTION (pfile, warn_variadic_macros)) + cpp_error (pfile, CPP_DL_PEDWARN, + "anonymous variadic macros were introduced in C99"); + } + else if (CPP_OPTION (pfile, pedantic) + && CPP_OPTION (pfile, warn_variadic_macros)) + cpp_error (pfile, CPP_DL_PEDWARN, + "ISO C does not permit named variadic macros"); + + /* We're at the end, and just expect a closing parenthesis. */ + token = _cpp_lex_token (pfile); + if (token->type == CPP_CLOSE_PAREN) + return true; + /* Fall through. */ + + case CPP_EOF: + cpp_error (pfile, CPP_DL_ERROR, "missing ')' in macro parameter list"); + return false; + } + } +} + +/* Allocate room for a token from a macro's replacement list. */ +static cpp_token * +alloc_expansion_token (cpp_reader *pfile, cpp_macro *macro) +{ + if (BUFF_ROOM (pfile->a_buff) < (macro->count + 1) * sizeof (cpp_token)) + _cpp_extend_buff (pfile, &pfile->a_buff, sizeof (cpp_token)); + + return &((cpp_token *) BUFF_FRONT (pfile->a_buff))[macro->count++]; +} + +/* Lex a token from the expansion of MACRO, but mark parameters as we + find them and warn of traditional stringification. */ +static cpp_token * +lex_expansion_token (cpp_reader *pfile, cpp_macro *macro) +{ + cpp_token *token, *saved_cur_token; + + saved_cur_token = pfile->cur_token; + pfile->cur_token = alloc_expansion_token (pfile, macro); + token = _cpp_lex_direct (pfile); + pfile->cur_token = saved_cur_token; + + /* Is this a parameter? */ + if (token->type == CPP_NAME + && (token->val.node->flags & NODE_MACRO_ARG) != 0) + { + token->type = CPP_MACRO_ARG; + token->val.arg_no = token->val.node->value.arg_index; + } + else if (CPP_WTRADITIONAL (pfile) && macro->paramc > 0 + && (token->type == CPP_STRING || token->type == CPP_CHAR)) + check_trad_stringification (pfile, macro, &token->val.str); + + return token; +} + +static bool +create_iso_definition (cpp_reader *pfile, cpp_macro *macro) +{ + cpp_token *token; + const cpp_token *ctoken; + bool following_paste_op = false; + const char *paste_op_error_msg = + N_("'##' cannot appear at either end of a macro expansion"); + + /* Get the first token of the expansion (or the '(' of a + function-like macro). */ + ctoken = _cpp_lex_token (pfile); + + if (ctoken->type == CPP_OPEN_PAREN && !(ctoken->flags & PREV_WHITE)) + { + bool ok = parse_params (pfile, macro); + macro->params = (cpp_hashnode **) BUFF_FRONT (pfile->a_buff); + if (!ok) + return false; + + /* Success. Commit or allocate the parameter array. */ + if (pfile->hash_table->alloc_subobject) + { + cpp_hashnode **params = + (cpp_hashnode **) pfile->hash_table->alloc_subobject + (sizeof (cpp_hashnode *) * macro->paramc); + memcpy (params, macro->params, + sizeof (cpp_hashnode *) * macro->paramc); + macro->params = params; + } + else + BUFF_FRONT (pfile->a_buff) = (uchar *) ¯o->params[macro->paramc]; + macro->fun_like = 1; + } + else if (ctoken->type != CPP_EOF && !(ctoken->flags & PREV_WHITE)) + { + /* While ISO C99 requires whitespace before replacement text + in a macro definition, ISO C90 with TC1 allows there characters + from the basic source character set. */ + if (CPP_OPTION (pfile, c99)) + cpp_error (pfile, CPP_DL_PEDWARN, + "ISO C99 requires whitespace after the macro name"); + else + { + int warntype = CPP_DL_WARNING; + switch (ctoken->type) + { + case CPP_ATSIGN: + case CPP_AT_NAME: + case CPP_OBJC_STRING: + /* '@' is not in basic character set. */ + warntype = CPP_DL_PEDWARN; + break; + case CPP_OTHER: + /* Basic character set sans letters, digits and _. */ + if (strchr ("!\"#%&'()*+,-./:;<=>?[\\]^{|}~", + ctoken->val.str.text[0]) == NULL) + warntype = CPP_DL_PEDWARN; + break; + default: + /* All other tokens start with a character from basic + character set. */ + break; + } + cpp_error (pfile, warntype, + "missing whitespace after the macro name"); + } + } + + if (macro->fun_like) + token = lex_expansion_token (pfile, macro); + else + { + token = alloc_expansion_token (pfile, macro); + *token = *ctoken; + } + + for (;;) + { + /* Check the stringifying # constraint 6.10.3.2.1 of + function-like macros when lexing the subsequent token. */ + if (macro->count > 1 && token[-1].type == CPP_HASH && macro->fun_like) + { + if (token->type == CPP_MACRO_ARG) + { + token->flags &= ~PREV_WHITE; + token->flags |= STRINGIFY_ARG; + token->flags |= token[-1].flags & PREV_WHITE; + token[-1] = token[0]; + macro->count--; + } + /* Let assembler get away with murder. */ + else if (CPP_OPTION (pfile, lang) != CLK_ASM) + { + cpp_error (pfile, CPP_DL_ERROR, + "'#' is not followed by a macro parameter"); + return false; + } + } + + if (token->type == CPP_EOF) + { + /* Paste operator constraint 6.10.3.3.1: + Token-paste ##, can appear in both object-like and + function-like macros, but not at the end. */ + if (following_paste_op) + { + cpp_error (pfile, CPP_DL_ERROR, paste_op_error_msg); + return false; + } + break; + } + + /* Paste operator constraint 6.10.3.3.1. */ + if (token->type == CPP_PASTE) + { + /* Token-paste ##, can appear in both object-like and + function-like macros, but not at the beginning. */ + if (macro->count == 1) + { + cpp_error (pfile, CPP_DL_ERROR, paste_op_error_msg); + return false; + } + + --macro->count; + token[-1].flags |= PASTE_LEFT; + } + + following_paste_op = (token->type == CPP_PASTE); + token = lex_expansion_token (pfile, macro); + } + + macro->exp.tokens = (cpp_token *) BUFF_FRONT (pfile->a_buff); + macro->traditional = 0; + + /* Don't count the CPP_EOF. */ + macro->count--; + + /* Clear whitespace on first token for warn_of_redefinition(). */ + if (macro->count) + macro->exp.tokens[0].flags &= ~PREV_WHITE; + + /* Commit or allocate the memory. */ + if (pfile->hash_table->alloc_subobject) + { + cpp_token *tokns = + (cpp_token *) pfile->hash_table->alloc_subobject (sizeof (cpp_token) + * macro->count); + memcpy (tokns, macro->exp.tokens, sizeof (cpp_token) * macro->count); + macro->exp.tokens = tokns; + } + else + BUFF_FRONT (pfile->a_buff) = (uchar *) ¯o->exp.tokens[macro->count]; + + return true; +} + +/* Parse a macro and save its expansion. Returns nonzero on success. */ +bool +_cpp_create_definition (cpp_reader *pfile, cpp_hashnode *node) +{ + cpp_macro *macro; + unsigned int i; + bool ok; + + if (pfile->hash_table->alloc_subobject) + macro = (cpp_macro *) pfile->hash_table->alloc_subobject + (sizeof (cpp_macro)); + else + macro = (cpp_macro *) _cpp_aligned_alloc (pfile, sizeof (cpp_macro)); + macro->line = pfile->directive_line; + macro->params = 0; + macro->paramc = 0; + macro->variadic = 0; + macro->used = !CPP_OPTION (pfile, warn_unused_macros); + macro->count = 0; + macro->fun_like = 0; + /* To suppress some diagnostics. */ + macro->syshdr = pfile->buffer && pfile->buffer->sysp != 0; + + if (CPP_OPTION (pfile, traditional)) + ok = _cpp_create_trad_definition (pfile, macro); + else + { + ok = create_iso_definition (pfile, macro); + + /* We set the type for SEEN_EOL() in directives.c. + + Longer term we should lex the whole line before coming here, + and just copy the expansion. */ + + /* Stop the lexer accepting __VA_ARGS__. */ + pfile->state.va_args_ok = 0; + } + + /* Clear the fast argument lookup indices. */ + for (i = macro->paramc; i-- > 0; ) + { + struct cpp_hashnode *node = macro->params[i]; + node->flags &= ~ NODE_MACRO_ARG; + node->value = ((union _cpp_hashnode_value *) pfile->macro_buffer)[i]; + } + + if (!ok) + return ok; + + if (node->type == NT_MACRO) + { + if (CPP_OPTION (pfile, warn_unused_macros)) + _cpp_warn_if_unused_macro (pfile, node, NULL); + + if (warn_of_redefinition (pfile, node, macro)) + { + cpp_error_with_line (pfile, CPP_DL_PEDWARN, pfile->directive_line, 0, + "\"%s\" redefined", NODE_NAME (node)); + + if (node->type == NT_MACRO && !(node->flags & NODE_BUILTIN)) + cpp_error_with_line (pfile, CPP_DL_PEDWARN, + node->value.macro->line, 0, + "this is the location of the previous definition"); + } + } + + if (node->type != NT_VOID) + _cpp_free_definition (node); + + /* Enter definition in hash table. */ + node->type = NT_MACRO; + node->value.macro = macro; + if (! ustrncmp (NODE_NAME (node), DSC ("__STDC_")) + && ustrcmp (NODE_NAME (node), (const uchar *) "__STDC_FORMAT_MACROS")) + node->flags |= NODE_WARN; + + return ok; +} + +/* Warn if a token in STRING matches one of a function-like MACRO's + parameters. */ +static void +check_trad_stringification (cpp_reader *pfile, const cpp_macro *macro, + const cpp_string *string) +{ + unsigned int i, len; + const uchar *p, *q, *limit; + + /* Loop over the string. */ + limit = string->text + string->len - 1; + for (p = string->text + 1; p < limit; p = q) + { + /* Find the start of an identifier. */ + while (p < limit && !is_idstart (*p)) + p++; + + /* Find the end of the identifier. */ + q = p; + while (q < limit && is_idchar (*q)) + q++; + + len = q - p; + + /* Loop over the function macro arguments to see if the + identifier inside the string matches one of them. */ + for (i = 0; i < macro->paramc; i++) + { + const cpp_hashnode *node = macro->params[i]; + + if (NODE_LEN (node) == len + && !memcmp (p, NODE_NAME (node), len)) + { + cpp_error (pfile, CPP_DL_WARNING, + "macro argument \"%s\" would be stringified in traditional C", + NODE_NAME (node)); + break; + } + } + } +} + +/* Returns the name, arguments and expansion of a macro, in a format + suitable to be read back in again, and therefore also for DWARF 2 + debugging info. e.g. "PASTE(X, Y) X ## Y", or "MACNAME EXPANSION". + Caller is expected to generate the "#define" bit if needed. The + returned text is temporary, and automatically freed later. */ +const unsigned char * +cpp_macro_definition (cpp_reader *pfile, const cpp_hashnode *node) +{ + unsigned int i, len; + const cpp_macro *macro = node->value.macro; + unsigned char *buffer; + + if (node->type != NT_MACRO || (node->flags & NODE_BUILTIN)) + { + cpp_error (pfile, CPP_DL_ICE, + "invalid hash type %d in cpp_macro_definition", node->type); + return 0; + } + + /* Calculate length. */ + len = NODE_LEN (node) + 2; /* ' ' and NUL. */ + if (macro->fun_like) + { + len += 4; /* "()" plus possible final ".." of named + varargs (we have + 1 below). */ + for (i = 0; i < macro->paramc; i++) + len += NODE_LEN (macro->params[i]) + 1; /* "," */ + } + + /* This should match below where we fill in the buffer. */ + if (CPP_OPTION (pfile, traditional)) + len += _cpp_replacement_text_len (macro); + else + { + for (i = 0; i < macro->count; i++) + { + cpp_token *token = ¯o->exp.tokens[i]; + + if (token->type == CPP_MACRO_ARG) + len += NODE_LEN (macro->params[token->val.arg_no - 1]); + else + len += cpp_token_len (token); + + if (token->flags & STRINGIFY_ARG) + len++; /* "#" */ + if (token->flags & PASTE_LEFT) + len += 3; /* " ##" */ + if (token->flags & PREV_WHITE) + len++; /* " " */ + } + } + + if (len > pfile->macro_buffer_len) + { + pfile->macro_buffer = XRESIZEVEC (unsigned char, + pfile->macro_buffer, len); + pfile->macro_buffer_len = len; + } + + /* Fill in the buffer. Start with the macro name. */ + buffer = pfile->macro_buffer; + memcpy (buffer, NODE_NAME (node), NODE_LEN (node)); + buffer += NODE_LEN (node); + + /* Parameter names. */ + if (macro->fun_like) + { + *buffer++ = '('; + for (i = 0; i < macro->paramc; i++) + { + cpp_hashnode *param = macro->params[i]; + + if (param != pfile->spec_nodes.n__VA_ARGS__) + { + memcpy (buffer, NODE_NAME (param), NODE_LEN (param)); + buffer += NODE_LEN (param); + } + + if (i + 1 < macro->paramc) + /* Don't emit a space after the comma here; we're trying + to emit a Dwarf-friendly definition, and the Dwarf spec + forbids spaces in the argument list. */ + *buffer++ = ','; + else if (macro->variadic) + *buffer++ = '.', *buffer++ = '.', *buffer++ = '.'; + } + *buffer++ = ')'; + } + + /* The Dwarf spec requires a space after the macro name, even if the + definition is the empty string. */ + *buffer++ = ' '; + + if (CPP_OPTION (pfile, traditional)) + buffer = _cpp_copy_replacement_text (macro, buffer); + else if (macro->count) + /* Expansion tokens. */ + { + for (i = 0; i < macro->count; i++) + { + cpp_token *token = ¯o->exp.tokens[i]; + + if (token->flags & PREV_WHITE) + *buffer++ = ' '; + if (token->flags & STRINGIFY_ARG) + *buffer++ = '#'; + + if (token->type == CPP_MACRO_ARG) + { + memcpy (buffer, + NODE_NAME (macro->params[token->val.arg_no - 1]), + NODE_LEN (macro->params[token->val.arg_no - 1])); + buffer += NODE_LEN (macro->params[token->val.arg_no - 1]); + } + else + buffer = cpp_spell_token (pfile, token, buffer, false); + + if (token->flags & PASTE_LEFT) + { + *buffer++ = ' '; + *buffer++ = '#'; + *buffer++ = '#'; + /* Next has PREV_WHITE; see _cpp_create_definition. */ + } + } + } + + *buffer = '\0'; + return pfile->macro_buffer; +} diff --git a/libcpp/makeucnid.c b/libcpp/makeucnid.c new file mode 100644 index 0000000..b452e08 --- /dev/null +++ b/libcpp/makeucnid.c @@ -0,0 +1,342 @@ +/* Make ucnid.h from various sources. + Copyright (C) 2005 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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* Run this program as + ./makeucnid ucnid.tab UnicodeData.txt DerivedNormalizationProps.txt \ + > ucnid.h +*/ + +#include +#include +#include +#include +#include + +enum { + C99 = 1, + CXX = 2, + digit = 4, + not_NFC = 8, + not_NFKC = 16, + maybe_not_NFC = 32 +}; + +static unsigned flags[65536]; +static unsigned short decomp[65536][2]; +static unsigned char combining_value[65536]; + +/* Die! */ + +static void +fail (const char *s) +{ + fprintf (stderr, "%s\n", s); + exit (1); +} + +/* Read ucnid.tab and set the C99 and CXX flags in header[]. */ + +static void +read_ucnid (const char *fname) +{ + FILE *f = fopen (fname, "r"); + unsigned fl = 0; + + if (!f) + fail ("opening ucnid.tab"); + for (;;) + { + char line[256]; + + if (!fgets (line, sizeof (line), f)) + break; + if (strcmp (line, "[C99]\n") == 0) + fl = C99; + else if (strcmp (line, "[CXX]\n") == 0) + fl = CXX; + else if (isxdigit (line[0])) + { + char *l = line; + while (*l) + { + unsigned long start, end; + char *endptr; + start = strtoul (l, &endptr, 16); + if (endptr == l || (*endptr != '-' && ! isspace (*endptr))) + fail ("parsing ucnid.tab [1]"); + l = endptr; + if (*l != '-') + end = start; + else + { + end = strtoul (l + 1, &endptr, 16); + if (end < start) + fail ("parsing ucnid.tab, end before start"); + l = endptr; + if (! isspace (*l)) + fail ("parsing ucnid.tab, junk after range"); + } + while (isspace (*l)) + l++; + if (end > 0xFFFF) + fail ("parsing ucnid.tab, end too large"); + while (start <= end) + flags[start++] |= fl; + } + } + } + if (ferror (f)) + fail ("reading ucnid.tab"); + fclose (f); +} + +/* Read UnicodeData.txt and set the 'digit' flag, and + also fill in the 'decomp' table to be the decompositions of + characters for which both the character decomposed and all the code + points in the decomposition are either C99 or CXX. */ + +static void +read_table (char *fname) +{ + FILE * f = fopen (fname, "r"); + + if (!f) + fail ("opening UnicodeData.txt"); + for (;;) + { + char line[256]; + unsigned long codepoint, this_decomp[4]; + char *l; + int i; + int decomp_useful; + + if (!fgets (line, sizeof (line), f)) + break; + codepoint = strtoul (line, &l, 16); + if (l == line || *l != ';') + fail ("parsing UnicodeData.txt, reading code point"); + if (codepoint > 0xffff || ! (flags[codepoint] & (C99 | CXX))) + continue; + + do { + l++; + } while (*l != ';'); + /* Category value; things starting with 'N' are numbers of some + kind. */ + if (*++l == 'N') + flags[codepoint] |= digit; + + do { + l++; + } while (*l != ';'); + /* Canonical combining class; in NFC/NFKC, they must be increasing + (or zero). */ + if (! isdigit (*++l)) + fail ("parsing UnicodeData.txt, combining class not number"); + combining_value[codepoint] = strtoul (l, &l, 10); + if (*l++ != ';') + fail ("parsing UnicodeData.txt, junk after combining class"); + + /* Skip over bidi value. */ + do { + l++; + } while (*l != ';'); + + /* Decomposition mapping. */ + decomp_useful = flags[codepoint]; + if (*++l == '<') /* Compatibility mapping. */ + continue; + for (i = 0; i < 4; i++) + { + if (*l == ';') + break; + if (!isxdigit (*l)) + fail ("parsing UnicodeData.txt, decomposition format"); + this_decomp[i] = strtoul (l, &l, 16); + decomp_useful &= flags[this_decomp[i]]; + while (isspace (*l)) + l++; + } + if (i > 2) /* Decomposition too long. */ + fail ("parsing UnicodeData.txt, decomposition too long"); + if (decomp_useful) + while (--i >= 0) + decomp[codepoint][i] = this_decomp[i]; + } + if (ferror (f)) + fail ("reading UnicodeData.txt"); + fclose (f); +} + +/* Read DerivedNormalizationProps.txt and set the flags that say whether + a character is in NFC, NFKC, or is context-dependent. */ + +static void +read_derived (const char *fname) +{ + FILE * f = fopen (fname, "r"); + + if (!f) + fail ("opening DerivedNormalizationProps.txt"); + for (;;) + { + char line[256]; + unsigned long start, end; + char *l; + bool not_NFC_p, not_NFKC_p, maybe_not_NFC_p; + + if (!fgets (line, sizeof (line), f)) + break; + not_NFC_p = (strstr (line, "; NFC_QC; N") != NULL); + not_NFKC_p = (strstr (line, "; NFKC_QC; N") != NULL); + maybe_not_NFC_p = (strstr (line, "; NFC_QC; M") != NULL); + if (! not_NFC_p && ! not_NFKC_p && ! maybe_not_NFC_p) + continue; + + start = strtoul (line, &l, 16); + if (l == line) + fail ("parsing DerivedNormalizationProps.txt, reading start"); + if (start > 0xffff) + continue; + if (*l == '.' && l[1] == '.') + end = strtoul (l + 2, &l, 16); + else + end = start; + + while (start <= end) + flags[start++] |= ((not_NFC_p ? not_NFC : 0) + | (not_NFKC_p ? not_NFKC : 0) + | (maybe_not_NFC_p ? maybe_not_NFC : 0) + ); + } + if (ferror (f)) + fail ("reading DerivedNormalizationProps.txt"); + fclose (f); +} + +/* Write out the table. + The table consists of two words per entry. The first word is the flags + for the unicode code points up to and including the second word. */ + +static void +write_table (void) +{ + unsigned i; + unsigned last_flag = flags[0]; + bool really_safe = decomp[0][0] == 0; + unsigned char last_combine = combining_value[0]; + + for (i = 1; i <= 65536; i++) + if (i == 65536 + || (flags[i] != last_flag && ((flags[i] | last_flag) & (C99 | CXX))) + || really_safe != (decomp[i][0] == 0) + || combining_value[i] != last_combine) + { + printf ("{ %s|%s|%s|%s|%s|%s|%s, %3d, %#06x },\n", + last_flag & C99 ? "C99" : " 0", + last_flag & digit ? "DIG" : " 0", + last_flag & CXX ? "CXX" : " 0", + really_safe ? "CID" : " 0", + last_flag & not_NFC ? " 0" : "NFC", + last_flag & not_NFKC ? " 0" : "NKC", + last_flag & maybe_not_NFC ? "CTX" : " 0", + combining_value[i - 1], + i - 1); + last_flag = flags[i]; + last_combine = combining_value[0]; + really_safe = decomp[i][0] == 0; + } +} + +/* Print out the huge copyright notice. */ + +static void +write_copyright (void) +{ + static const char copyright[] = "\ +/* Unicode characters and various properties.\n\ + Copyright (C) 2003, 2005 Free Software Foundation, Inc.\n\ +\n\ + This program is free software; you can redistribute it and/or modify it\n\ + under the terms of the GNU General Public License as published by the\n\ + Free Software Foundation; either version 2, or (at your option) any\n\ + later version.\n\ +\n\ + This program is distributed in the hope that it will be useful,\n\ + but WITHOUT ANY WARRANTY; without even the implied warranty of\n\ + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\ + GNU General Public License for more details.\n\ +\n\ + You should have received a copy of the GNU General Public License\n\ + along with this program; if not, write to the Free Software\n\ + Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n\ +\n\ +\n\ + Copyright (C) 1991-2005 Unicode, Inc. All rights reserved.\n\ + Distributed under the Terms of Use in\n\ + http://www.unicode.org/copyright.html.\n\ +\n\ + Permission is hereby granted, free of charge, to any person\n\ + obtaining a copy of the Unicode data files and any associated\n\ + documentation (the \"Data Files\") or Unicode software and any\n\ + associated documentation (the \"Software\") to deal in the Data Files\n\ + or Software without restriction, including without limitation the\n\ + rights to use, copy, modify, merge, publish, distribute, and/or\n\ + sell copies of the Data Files or Software, and to permit persons to\n\ + whom the Data Files or Software are furnished to do so, provided\n\ + that (a) the above copyright notice(s) and this permission notice\n\ + appear with all copies of the Data Files or Software, (b) both the\n\ + above copyright notice(s) and this permission notice appear in\n\ + associated documentation, and (c) there is clear notice in each\n\ + modified Data File or in the Software as well as in the\n\ + documentation associated with the Data File(s) or Software that the\n\ + data or software has been modified.\n\ +\n\ + THE DATA FILES AND SOFTWARE ARE PROVIDED \"AS IS\", WITHOUT WARRANTY\n\ + OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n\ + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n\ + NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE\n\ + COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR\n\ + ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY\n\ + DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,\n\ + WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS\n\ + ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE\n\ + OF THE DATA FILES OR SOFTWARE.\n\ +\n\ + Except as contained in this notice, the name of a copyright holder\n\ + shall not be used in advertising or otherwise to promote the sale,\n\ + use or other dealings in these Data Files or Software without prior\n\ + written authorization of the copyright holder. */\n"; + + puts (copyright); +} + +/* Main program. */ + +int +main(int argc, char ** argv) +{ + if (argc != 4) + fail ("too few arguments to makeucn"); + read_ucnid (argv[1]); + read_table (argv[2]); + read_derived (argv[3]); + + write_copyright (); + write_table (); + return 0; +} diff --git a/libcpp/mkdeps.c b/libcpp/mkdeps.c new file mode 100644 index 0000000..8aa96c5 --- /dev/null +++ b/libcpp/mkdeps.c @@ -0,0 +1,418 @@ +/* Dependency generator for Makefile fragments. + Copyright (C) 2000, 2001, 2003, 2007 Free Software Foundation, Inc. + Contributed by Zack Weinberg, Mar 2000 + +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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + In other words, you are welcome to use, share and improve this program. + You are forbidden to forbid anyone else to use, share and improve + what you give them. Help stamp out software-hoarding! */ + +#include "config.h" +#include "system.h" +#include "mkdeps.h" + +/* Keep this structure local to this file, so clients don't find it + easy to start making assumptions. */ +struct deps +{ + const char **targetv; + unsigned int ntargets; /* number of slots actually occupied */ + unsigned int targets_size; /* amt of allocated space - in words */ + + const char **depv; + unsigned int ndeps; + unsigned int deps_size; + + const char **vpathv; + size_t *vpathlv; + unsigned int nvpaths; + unsigned int vpaths_size; +}; + +static const char *munge (const char *); + +/* Given a filename, quote characters in that filename which are + significant to Make. Note that it's not possible to quote all such + characters - e.g. \n, %, *, ?, [, \ (in some contexts), and ~ are + not properly handled. It isn't possible to get this right in any + current version of Make. (??? Still true? Old comment referred to + 3.76.1.) */ + +static const char * +munge (const char *filename) +{ + int len; + const char *p, *q; + char *dst, *buffer; + + for (p = filename, len = 0; *p; p++, len++) + { + switch (*p) + { + case ' ': + case '\t': + /* GNU make uses a weird quoting scheme for white space. + A space or tab preceded by 2N+1 backslashes represents + N backslashes followed by space; a space or tab + preceded by 2N backslashes represents N backslashes at + the end of a file name; and backslashes in other + contexts should not be doubled. */ + for (q = p - 1; filename <= q && *q == '\\'; q--) + len++; + len++; + break; + + case '$': + /* '$' is quoted by doubling it. */ + len++; + break; + } + } + + /* Now we know how big to make the buffer. */ + buffer = XNEWVEC (char, len + 1); + + for (p = filename, dst = buffer; *p; p++, dst++) + { + switch (*p) + { + case ' ': + case '\t': + for (q = p - 1; filename <= q && *q == '\\'; q--) + *dst++ = '\\'; + *dst++ = '\\'; + break; + + case '$': + *dst++ = '$'; + break; + + default: + /* nothing */; + } + *dst = *p; + } + + *dst = '\0'; + return buffer; +} + +/* If T begins with any of the partial pathnames listed in d->vpathv, + then advance T to point beyond that pathname. */ +static const char * +apply_vpath (struct deps *d, const char *t) +{ + if (d->vpathv) + { + unsigned int i; + for (i = 0; i < d->nvpaths; i++) + { + if (!strncmp (d->vpathv[i], t, d->vpathlv[i])) + { + const char *p = t + d->vpathlv[i]; + if (!IS_DIR_SEPARATOR (*p)) + goto not_this_one; + + /* Do not simplify $(vpath)/../whatever. ??? Might not + be necessary. */ + if (p[1] == '.' && p[2] == '.' && IS_DIR_SEPARATOR (p[3])) + goto not_this_one; + + /* found a match */ + t = t + d->vpathlv[i] + 1; + break; + } + not_this_one:; + } + } + + /* Remove leading ./ in any case. */ + while (t[0] == '.' && IS_DIR_SEPARATOR (t[1])) + { + t += 2; + /* If we removed a leading ./, then also remove any /s after the + first. */ + while (IS_DIR_SEPARATOR (t[0])) + ++t; + } + + return t; +} + +/* Public routines. */ + +struct deps * +deps_init (void) +{ + return XCNEW (struct deps); +} + +void +deps_free (struct deps *d) +{ + unsigned int i; + + if (d->targetv) + { + for (i = 0; i < d->ntargets; i++) + free ((void *) d->targetv[i]); + free (d->targetv); + } + + if (d->depv) + { + for (i = 0; i < d->ndeps; i++) + free ((void *) d->depv[i]); + free (d->depv); + } + + if (d->vpathv) + { + for (i = 0; i < d->nvpaths; i++) + free ((void *) d->vpathv[i]); + free (d->vpathv); + free (d->vpathlv); + } + + free (d); +} + +/* Adds a target T. We make a copy, so it need not be a permanent + string. QUOTE is true if the string should be quoted. */ +void +deps_add_target (struct deps *d, const char *t, int quote) +{ + if (d->ntargets == d->targets_size) + { + d->targets_size = d->targets_size * 2 + 4; + d->targetv = XRESIZEVEC (const char *, d->targetv, d->targets_size); + } + + t = apply_vpath (d, t); + if (quote) + t = munge (t); /* Also makes permanent copy. */ + else + t = xstrdup (t); + + d->targetv[d->ntargets++] = t; +} + +/* Sets the default target if none has been given already. An empty + string as the default target in interpreted as stdin. The string + is quoted for MAKE. */ +void +deps_add_default_target (struct deps *d, const char *tgt) +{ + /* Only if we have no targets. */ + if (d->ntargets) + return; + + if (tgt[0] == '\0') + deps_add_target (d, "-", 1); + else + { +#ifndef TARGET_OBJECT_SUFFIX +# define TARGET_OBJECT_SUFFIX ".o" +#endif + const char *start = lbasename (tgt); + char *o = (char *) alloca (strlen (start) + + strlen (TARGET_OBJECT_SUFFIX) + 1); + char *suffix; + + strcpy (o, start); + + suffix = strrchr (o, '.'); + if (!suffix) + suffix = o + strlen (o); + strcpy (suffix, TARGET_OBJECT_SUFFIX); + + deps_add_target (d, o, 1); + } +} + +void +deps_add_dep (struct deps *d, const char *t) +{ + t = munge (apply_vpath (d, t)); /* Also makes permanent copy. */ + + if (d->ndeps == d->deps_size) + { + d->deps_size = d->deps_size * 2 + 8; + d->depv = XRESIZEVEC (const char *, d->depv, d->deps_size); + } + d->depv[d->ndeps++] = t; +} + +void +deps_add_vpath (struct deps *d, const char *vpath) +{ + const char *elem, *p; + char *copy; + size_t len; + + for (elem = vpath; *elem; elem = p) + { + for (p = elem; *p && *p != ':'; p++); + len = p - elem; + copy = XNEWVEC (char, len + 1); + memcpy (copy, elem, len); + copy[len] = '\0'; + if (*p == ':') + p++; + + if (d->nvpaths == d->vpaths_size) + { + d->vpaths_size = d->vpaths_size * 2 + 8; + d->vpathv = XRESIZEVEC (const char *, d->vpathv, d->vpaths_size); + d->vpathlv = XRESIZEVEC (size_t, d->vpathlv, d->vpaths_size); + } + d->vpathv[d->nvpaths] = copy; + d->vpathlv[d->nvpaths] = len; + d->nvpaths++; + } +} + +void +deps_write (const struct deps *d, FILE *fp, unsigned int colmax) +{ + unsigned int size, i, column; + + column = 0; + if (colmax && colmax < 34) + colmax = 34; + + for (i = 0; i < d->ntargets; i++) + { + size = strlen (d->targetv[i]); + column += size; + if (colmax && column > colmax) + { + fputs (" \\\n ", fp); + column = 1 + size; + } + if (i) + { + putc (' ', fp); + column++; + } + fputs (d->targetv[i], fp); + } + + putc (':', fp); + putc (' ', fp); + column += 2; + + for (i = 0; i < d->ndeps; i++) + { + size = strlen (d->depv[i]); + column += size; + if (colmax && column > colmax) + { + fputs (" \\\n ", fp); + column = 1 + size; + } + if (i) + { + putc (' ', fp); + column++; + } + fputs (d->depv[i], fp); + } + putc ('\n', fp); +} + +void +deps_phony_targets (const struct deps *d, FILE *fp) +{ + unsigned int i; + + for (i = 1; i < d->ndeps; i++) + { + putc ('\n', fp); + fputs (d->depv[i], fp); + putc (':', fp); + putc ('\n', fp); + } +} + +/* Write out a deps buffer to a file, in a form that can be read back + with deps_restore. Returns nonzero on error, in which case the + error number will be in errno. */ + +int +deps_save (struct deps *deps, FILE *f) +{ + unsigned int i; + + /* The cppreader structure contains makefile dependences. Write out this + structure. */ + + /* The number of dependences. */ + if (fwrite (&deps->ndeps, sizeof (deps->ndeps), 1, f) != 1) + return -1; + /* The length of each dependence followed by the string. */ + for (i = 0; i < deps->ndeps; i++) + { + size_t num_to_write = strlen (deps->depv[i]); + if (fwrite (&num_to_write, sizeof (size_t), 1, f) != 1) + return -1; + if (fwrite (deps->depv[i], num_to_write, 1, f) != 1) + return -1; + } + + return 0; +} + +/* Read back dependency information written with deps_save into + the deps buffer. The third argument may be NULL, in which case + the dependency information is just skipped, or it may be a filename, + in which case that filename is skipped. */ + +int +deps_restore (struct deps *deps, FILE *fd, const char *self) +{ + unsigned int i, count; + size_t num_to_read; + size_t buf_size = 512; + char *buf = XNEWVEC (char, buf_size); + + /* Number of dependences. */ + if (fread (&count, 1, sizeof (count), fd) != sizeof (count)) + return -1; + + /* The length of each dependence string, followed by the string. */ + for (i = 0; i < count; i++) + { + /* Read in # bytes in string. */ + if (fread (&num_to_read, 1, sizeof (size_t), fd) != sizeof (size_t)) + return -1; + if (buf_size < num_to_read + 1) + { + buf_size = num_to_read + 1 + 127; + buf = XRESIZEVEC (char, buf, buf_size); + } + if (fread (buf, 1, num_to_read, fd) != num_to_read) + return -1; + buf[num_to_read] = '\0'; + + /* Generate makefile dependencies from .pch if -nopch-deps. */ + if (self != NULL && strcmp (buf, self) != 0) + deps_add_dep (deps, buf); + } + + free (buf); + return 0; +} diff --git a/libcpp/pch.c b/libcpp/pch.c new file mode 100644 index 0000000..bf7b9be --- /dev/null +++ b/libcpp/pch.c @@ -0,0 +1,739 @@ +/* Part of CPP library. (Precompiled header reading/writing.) + Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005 + 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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include "config.h" +#include "system.h" +#include "cpplib.h" +#include "internal.h" +#include "hashtab.h" +#include "mkdeps.h" + +static int write_macdef (cpp_reader *, cpp_hashnode *, void *); +static int save_idents (cpp_reader *, cpp_hashnode *, void *); +static hashval_t hashmem (const void *, size_t); +static hashval_t cpp_string_hash (const void *); +static int cpp_string_eq (const void *, const void *); +static int count_defs (cpp_reader *, cpp_hashnode *, void *); +static int comp_hashnodes (const void *, const void *); +static int collect_ht_nodes (cpp_reader *, cpp_hashnode *, void *); +static int write_defs (cpp_reader *, cpp_hashnode *, void *); +static int save_macros (cpp_reader *, cpp_hashnode *, void *); + +/* This structure represents a macro definition on disk. */ +struct macrodef_struct +{ + unsigned int definition_length; + unsigned short name_length; + unsigned short flags; +}; + +/* This is how we write out a macro definition. + Suitable for being called by cpp_forall_identifiers. */ + +static int +write_macdef (cpp_reader *pfile, cpp_hashnode *hn, void *file_p) +{ + FILE *f = (FILE *) file_p; + switch (hn->type) + { + case NT_VOID: + if (! (hn->flags & NODE_POISONED)) + return 1; + + case NT_MACRO: + if ((hn->flags & NODE_BUILTIN)) + return 1; + + { + struct macrodef_struct s; + const unsigned char *defn; + + s.name_length = NODE_LEN (hn); + s.flags = hn->flags & NODE_POISONED; + + if (hn->type == NT_MACRO) + { + defn = cpp_macro_definition (pfile, hn); + s.definition_length = ustrlen (defn); + } + else + { + defn = NODE_NAME (hn); + s.definition_length = s.name_length; + } + + if (fwrite (&s, sizeof (s), 1, f) != 1 + || fwrite (defn, 1, s.definition_length, f) != s.definition_length) + { + cpp_errno (pfile, CPP_DL_ERROR, + "while writing precompiled header"); + return 0; + } + } + return 1; + + case NT_ASSERTION: + /* Not currently implemented. */ + return 1; + + default: + abort (); + } +} + +/* This structure records the names of the defined macros. + It's also used as a callback structure for size_initial_idents + and save_idents. */ + +struct cpp_savedstate +{ + /* A hash table of the defined identifiers. */ + htab_t definedhash; + /* The size of the definitions of those identifiers (the size of + 'definedstrs'). */ + size_t hashsize; + /* Number of definitions */ + size_t n_defs; + /* Array of definitions. In cpp_write_pch_deps it is used for sorting. */ + cpp_hashnode **defs; + /* Space for the next definition. Definitions are null-terminated + strings. */ + unsigned char *definedstrs; +}; + +/* Save this identifier into the state: put it in the hash table, + put the definition in 'definedstrs'. */ + +static int +save_idents (cpp_reader *pfile ATTRIBUTE_UNUSED, cpp_hashnode *hn, void *ss_p) +{ + struct cpp_savedstate *const ss = (struct cpp_savedstate *)ss_p; + + if (hn->type != NT_VOID) + { + struct cpp_string news; + void **slot; + + news.len = NODE_LEN (hn); + news.text= NODE_NAME (hn); + slot = htab_find_slot (ss->definedhash, &news, INSERT); + if (*slot == NULL) + { + struct cpp_string *sp; + unsigned char *text; + + sp = XNEW (struct cpp_string); + *slot = sp; + + sp->len = NODE_LEN (hn); + sp->text = text = XNEWVEC (unsigned char, NODE_LEN (hn)); + memcpy (text, NODE_NAME (hn), NODE_LEN (hn)); + } + } + + return 1; +} + +/* Hash some memory in a generic way. */ + +static hashval_t +hashmem (const void *p_p, size_t sz) +{ + const unsigned char *p = (const unsigned char *)p_p; + size_t i; + hashval_t h; + + h = 0; + for (i = 0; i < sz; i++) + h = h * 67 - (*p++ - 113); + return h; +} + +/* Hash a cpp string for the hashtable machinery. */ + +static hashval_t +cpp_string_hash (const void *a_p) +{ + const struct cpp_string *a = (const struct cpp_string *) a_p; + return hashmem (a->text, a->len); +} + +/* Compare two cpp strings for the hashtable machinery. */ + +static int +cpp_string_eq (const void *a_p, const void *b_p) +{ + const struct cpp_string *a = (const struct cpp_string *) a_p; + const struct cpp_string *b = (const struct cpp_string *) b_p; + return (a->len == b->len + && memcmp (a->text, b->text, a->len) == 0); +} + +/* Save the current definitions of the cpp_reader for dependency + checking purposes. When writing a precompiled header, this should + be called at the same point in the compilation as cpp_valid_state + would be called when reading the precompiled header back in. */ + +int +cpp_save_state (cpp_reader *r, FILE *f) +{ + /* Save the list of non-void identifiers for the dependency checking. */ + r->savedstate = XNEW (struct cpp_savedstate); + r->savedstate->definedhash = htab_create (100, cpp_string_hash, + cpp_string_eq, NULL); + cpp_forall_identifiers (r, save_idents, r->savedstate); + + /* Write out the list of defined identifiers. */ + cpp_forall_identifiers (r, write_macdef, f); + + return 0; +} + +/* Calculate the 'hashsize' field of the saved state. */ + +static int +count_defs (cpp_reader *pfile ATTRIBUTE_UNUSED, cpp_hashnode *hn, void *ss_p) +{ + struct cpp_savedstate *const ss = (struct cpp_savedstate *)ss_p; + + switch (hn->type) + { + case NT_MACRO: + if (hn->flags & NODE_BUILTIN) + return 1; + + /* else fall through. */ + + case NT_VOID: + { + struct cpp_string news; + void **slot; + + news.len = NODE_LEN (hn); + news.text = NODE_NAME (hn); + slot = (void **) htab_find (ss->definedhash, &news); + if (slot == NULL) + { + ss->hashsize += NODE_LEN (hn) + 1; + ss->n_defs += 1; + } + } + return 1; + + case NT_ASSERTION: + /* Not currently implemented. */ + return 1; + + default: + abort (); + } +} + +/* Collect the identifiers into the state's string table. */ +static int +write_defs (cpp_reader *pfile ATTRIBUTE_UNUSED, cpp_hashnode *hn, void *ss_p) +{ + struct cpp_savedstate *const ss = (struct cpp_savedstate *)ss_p; + + switch (hn->type) + { + case NT_MACRO: + if (hn->flags & NODE_BUILTIN) + return 1; + + /* else fall through. */ + + case NT_VOID: + { + struct cpp_string news; + void **slot; + + news.len = NODE_LEN (hn); + news.text = NODE_NAME (hn); + slot = (void **) htab_find (ss->definedhash, &news); + if (slot == NULL) + { + ss->defs[ss->n_defs] = hn; + ss->n_defs += 1; + } + } + return 1; + + case NT_ASSERTION: + /* Not currently implemented. */ + return 1; + + default: + abort (); + } +} + +/* Comparison function for qsort. The arguments point to pointers of + type ht_hashnode *. */ +static int +comp_hashnodes (const void *px, const void *py) +{ + cpp_hashnode *x = *(cpp_hashnode **) px; + cpp_hashnode *y = *(cpp_hashnode **) py; + return ustrcmp (NODE_NAME (x), NODE_NAME (y)); +} + +/* Write out the remainder of the dependency information. This should be + called after the PCH is ready to be saved. */ + +int +cpp_write_pch_deps (cpp_reader *r, FILE *f) +{ + struct macrodef_struct z; + struct cpp_savedstate *const ss = r->savedstate; + unsigned char *definedstrs; + size_t i; + + /* Collect the list of identifiers which have been seen and + weren't defined to anything previously. */ + ss->hashsize = 0; + ss->n_defs = 0; + cpp_forall_identifiers (r, count_defs, ss); + + ss->defs = XNEWVEC (cpp_hashnode *, ss->n_defs); + ss->n_defs = 0; + cpp_forall_identifiers (r, write_defs, ss); + + /* Sort the list, copy it into a buffer, and write it out. */ + qsort (ss->defs, ss->n_defs, sizeof (cpp_hashnode *), &comp_hashnodes); + definedstrs = ss->definedstrs = XNEWVEC (unsigned char, ss->hashsize); + for (i = 0; i < ss->n_defs; ++i) + { + size_t len = NODE_LEN (ss->defs[i]); + memcpy (definedstrs, NODE_NAME (ss->defs[i]), len + 1); + definedstrs += len + 1; + } + + memset (&z, 0, sizeof (z)); + z.definition_length = ss->hashsize; + if (fwrite (&z, sizeof (z), 1, f) != 1 + || fwrite (ss->definedstrs, ss->hashsize, 1, f) != 1) + { + cpp_errno (r, CPP_DL_ERROR, "while writing precompiled header"); + return -1; + } + free (ss->definedstrs); + + /* Free the saved state. */ + free (ss); + r->savedstate = NULL; + + /* Save the next value of __COUNTER__. */ + if (fwrite (&r->counter, sizeof (r->counter), 1, f) != 1) + { + cpp_errno (r, CPP_DL_ERROR, "while writing precompiled header"); + return -1; + } + + return 0; +} + +/* Write out the definitions of the preprocessor, in a form suitable for + cpp_read_state. */ + +int +cpp_write_pch_state (cpp_reader *r, FILE *f) +{ + if (!r->deps) + r->deps = deps_init (); + + if (deps_save (r->deps, f) != 0) + { + cpp_errno (r, CPP_DL_ERROR, "while writing precompiled header"); + return -1; + } + + if (! _cpp_save_file_entries (r, f)) + { + cpp_errno (r, CPP_DL_ERROR, "while writing precompiled header"); + return -1; + } + + /* Save the next __COUNTER__ value. When we include a precompiled header, + we need to start at the offset we would have if the header had been + included normally. */ + if (fwrite (&r->counter, sizeof (r->counter), 1, f) != 1) + { + cpp_errno (r, CPP_DL_ERROR, "while writing precompiled header"); + return -1; + } + + return 0; +} + + +/* Data structure to transform hash table nodes into a sorted list */ + +struct ht_node_list +{ + /* Array of nodes */ + cpp_hashnode **defs; + /* Number of nodes in the array */ + size_t n_defs; + /* Size of the allocated array */ + size_t asize; +}; + +/* Callback for collecting identifiers from hash table */ + +static int +collect_ht_nodes (cpp_reader *pfile ATTRIBUTE_UNUSED, cpp_hashnode *hn, + void *nl_p) +{ + struct ht_node_list *const nl = (struct ht_node_list *)nl_p; + + if (hn->type != NT_VOID || hn->flags & NODE_POISONED) + { + if (nl->n_defs == nl->asize) + { + nl->asize *= 2; + nl->defs = XRESIZEVEC (cpp_hashnode *, nl->defs, nl->asize); + } + + nl->defs[nl->n_defs] = hn; + ++nl->n_defs; + } + return 1; +} + + +/* Return nonzero if FD is a precompiled header which is consistent + with the preprocessor's current definitions. It will be consistent + when: + + - anything that was defined just before the PCH was generated + is defined the same way now; and + - anything that was not defined then, but is defined now, was not + used by the PCH. + + NAME is used to print warnings if `warn_invalid_pch' is set in the + reader's flags. +*/ + +int +cpp_valid_state (cpp_reader *r, const char *name, int fd) +{ + struct macrodef_struct m; + size_t namebufsz = 256; + unsigned char *namebuf = XNEWVEC (unsigned char, namebufsz); + unsigned char *undeftab = NULL; + struct ht_node_list nl = { 0, 0, 0 }; + unsigned char *first, *last; + unsigned int i; + unsigned int counter; + + /* Read in the list of identifiers that must be defined + Check that they are defined in the same way. */ + for (;;) + { + cpp_hashnode *h; + const unsigned char *newdefn; + + if (read (fd, &m, sizeof (m)) != sizeof (m)) + goto error; + + if (m.name_length == 0) + break; + + /* If this file is already preprocessed, there won't be any + macros defined, and that's OK. */ + if (CPP_OPTION (r, preprocessed)) + { + if (lseek (fd, m.definition_length, SEEK_CUR) == -1) + goto error; + continue; + } + + if (m.definition_length > namebufsz) + { + free (namebuf); + namebufsz = m.definition_length + 256; + namebuf = XNEWVEC (unsigned char, namebufsz); + } + + if ((size_t)read (fd, namebuf, m.definition_length) + != m.definition_length) + goto error; + + h = cpp_lookup (r, namebuf, m.name_length); + if (m.flags & NODE_POISONED + || h->type != NT_MACRO + || h->flags & NODE_POISONED) + { + if (CPP_OPTION (r, warn_invalid_pch)) + cpp_error (r, CPP_DL_WARNING_SYSHDR, + "%s: not used because `%.*s' not defined", + name, m.name_length, namebuf); + goto fail; + } + + newdefn = cpp_macro_definition (r, h); + + if (m.definition_length != ustrlen (newdefn) + || memcmp (namebuf, newdefn, m.definition_length) != 0) + { + if (CPP_OPTION (r, warn_invalid_pch)) + cpp_error (r, CPP_DL_WARNING_SYSHDR, + "%s: not used because `%.*s' defined as `%s' not `%.*s'", + name, m.name_length, namebuf, newdefn + m.name_length, + m.definition_length - m.name_length, + namebuf + m.name_length); + goto fail; + } + } + free (namebuf); + namebuf = NULL; + + /* Read in the list of identifiers that must not be defined. + Check that they really aren't. */ + undeftab = XNEWVEC (unsigned char, m.definition_length); + if ((size_t) read (fd, undeftab, m.definition_length) != m.definition_length) + goto error; + + /* Collect identifiers from the current hash table. */ + nl.n_defs = 0; + nl.asize = 10; + nl.defs = XNEWVEC (cpp_hashnode *, nl.asize); + cpp_forall_identifiers (r, &collect_ht_nodes, &nl); + qsort (nl.defs, nl.n_defs, sizeof (cpp_hashnode *), &comp_hashnodes); + + /* Loop through nl.defs and undeftab, both of which are sorted lists. + There should be no matches. */ + first = undeftab; + last = undeftab + m.definition_length; + i = 0; + + while (first < last && i < nl.n_defs) + { + int cmp = ustrcmp (first, NODE_NAME (nl.defs[i])); + + if (cmp < 0) + first += ustrlen (first) + 1; + else if (cmp > 0) + ++i; + else + { + if (CPP_OPTION (r, warn_invalid_pch)) + cpp_error (r, CPP_DL_WARNING_SYSHDR, + "%s: not used because `%s' is defined", + name, first); + goto fail; + } + } + + free(nl.defs); + nl.defs = NULL; + free (undeftab); + undeftab = NULL; + + /* Read in the next value of __COUNTER__. + Check that (a) __COUNTER__ was not used in the pch or (b) __COUNTER__ + has not been used in this translation unit. */ + if (read (fd, &counter, sizeof (counter)) != sizeof (counter)) + goto error; + if (counter && r->counter) + { + if (CPP_OPTION (r, warn_invalid_pch)) + cpp_error (r, CPP_DL_WARNING_SYSHDR, + "%s: not used because `__COUNTER__' is invalid", + name); + goto fail; + } + + /* We win! */ + return 0; + + error: + cpp_errno (r, CPP_DL_ERROR, "while reading precompiled header"); + return -1; + + fail: + if (namebuf != NULL) + free (namebuf); + if (undeftab != NULL) + free (undeftab); + if (nl.defs != NULL) + free (nl.defs); + return 1; +} + +/* Save all the existing macros. */ + +struct save_macro_data +{ + uchar **defns; + size_t count; + size_t array_size; + char **saved_pragmas; +}; + +/* Save the definition of a single macro, so that it will persist + across a PCH restore. Because macro data is in GCed memory, which + will be blown away by PCH, it must be temporarily copied to + malloced memory. (The macros will refer to identifier nodes which + are also GCed and so on, so the copying is done by turning them + into self-contained strings.) The assumption is that most macro + definitions will come from the PCH file, not from the compilation + before the PCH file is loaded, so it doesn't matter that this is + a little expensive. + + It would reduce the cost even further if macros defined in the PCH + file were not saved in this way, but this is not done (yet), except + for builtins, and for #assert by default. */ + +static int +save_macros (cpp_reader *r, cpp_hashnode *h, void *data_p) +{ + struct save_macro_data *data = (struct save_macro_data *)data_p; + if (h->type != NT_VOID + && (h->flags & NODE_BUILTIN) == 0) + { + if (data->count == data->array_size) + { + data->array_size *= 2; + data->defns = XRESIZEVEC (uchar *, data->defns, (data->array_size)); + } + + switch (h->type) + { + case NT_ASSERTION: + /* Not currently implemented. */ + return 1; + + case NT_MACRO: + { + const uchar * defn = cpp_macro_definition (r, h); + size_t defnlen = ustrlen (defn); + + data->defns[data->count] = (uchar *) xmemdup (defn, defnlen, + defnlen + 2); + data->defns[data->count][defnlen] = '\n'; + } + break; + + default: + abort (); + } + data->count++; + } + return 1; +} + +/* Prepare to restore the state, by saving the currently-defined + macros in 'data'. */ + +void +cpp_prepare_state (cpp_reader *r, struct save_macro_data **data) +{ + struct save_macro_data *d = XNEW (struct save_macro_data); + + d->array_size = 512; + d->defns = XNEWVEC (uchar *, d->array_size); + d->count = 0; + cpp_forall_identifiers (r, save_macros, d); + d->saved_pragmas = _cpp_save_pragma_names (r); + *data = d; +} + +/* Given a precompiled header that was previously determined to be valid, + apply all its definitions (and undefinitions) to the current state. + DEPNAME is passed to deps_restore. */ + +int +cpp_read_state (cpp_reader *r, const char *name, FILE *f, + struct save_macro_data *data) +{ + size_t i; + struct lexer_state old_state; + unsigned int counter; + + /* Restore spec_nodes, which will be full of references to the old + hashtable entries and so will now be invalid. */ + { + struct spec_nodes *s = &r->spec_nodes; + s->n_defined = cpp_lookup (r, DSC("defined")); + s->n_true = cpp_lookup (r, DSC("true")); + s->n_false = cpp_lookup (r, DSC("false")); + s->n__VA_ARGS__ = cpp_lookup (r, DSC("__VA_ARGS__")); + } + + old_state = r->state; + r->state.in_directive = 1; + r->state.prevent_expansion = 1; + r->state.angled_headers = 0; + + /* Run through the carefully-saved macros, insert them. */ + for (i = 0; i < data->count; i++) + { + cpp_hashnode *h; + size_t namelen; + uchar *defn; + + namelen = ustrcspn (data->defns[i], "( \n"); + h = cpp_lookup (r, data->defns[i], namelen); + defn = data->defns[i] + namelen; + + /* The PCH file is valid, so we know that if there is a definition + from the PCH file it must be the same as the one we had + originally, and so do not need to restore it. */ + if (h->type == NT_VOID) + { + if (cpp_push_buffer (r, defn, ustrchr (defn, '\n') - defn, true) + != NULL) + { + _cpp_clean_line (r); + if (!_cpp_create_definition (r, h)) + abort (); + _cpp_pop_buffer (r); + } + else + abort (); + } + + free (data->defns[i]); + } + r->state = old_state; + + _cpp_restore_pragma_names (r, data->saved_pragmas); + + free (data); + + if (deps_restore (r->deps, f, CPP_OPTION (r, restore_pch_deps) ? name : NULL) + != 0) + goto error; + + if (! _cpp_read_file_entries (r, f)) + goto error; + + if (fread (&counter, sizeof (counter), 1, f) != 1) + goto error; + + if (!r->counter) + r->counter = counter; + + return 0; + + error: + cpp_errno (r, CPP_DL_ERROR, "while reading precompiled header"); + return -1; +} diff --git a/libcpp/po/ChangeLog b/libcpp/po/ChangeLog new file mode 100644 index 0000000..70da372 --- /dev/null +++ b/libcpp/po/ChangeLog @@ -0,0 +1,184 @@ +2007-12-05 Joseph S. Myers + + * vi.po: Update. + +2007-11-15 Joseph S. Myers + + * es.po: Update. + +2007-11-11 Joseph S. Myers + + * de.po, zh_CN.po: Update. + +2007-11-10 Joseph S. Myers + + * be.po, ca.po, da.po, de.po, el.po, es.po, fr.po, ja.po, nl.po, + sv.po, tr.po, uk,po, vi.po, zh_CN.po, zh_TW.po: Update. + +2007-11-08 Joseph S. Myers + + * cpplib.pot: Regenerate. + +2007-10-21 Joseph S. Myers + + * es.po, vi.po: Update. + +2007-10-10 Joseph S. Myers + + * be.po, ca.po, da.po, de.po, el.po, es.po, fr.po, ja.po, nl.po, + sv.po, tr.po, uk,po, vi.po, zh_CN.po, zh_TW.po: Update. + +2007-08-21 Joseph S. Myers + + * be.po, ca.po, da.po, de.po, el.po, es.po, fr.po, ja.po, nl.po, + sv.po, tr.po, vi.po, zh_CN.po, zh_TW.po: Update. + * uk.po: New. + +2007-06-26 Joseph S. Myers + + * be.po, ca.po, da.po, de.po, el.po, es.po, fr.po, ja.po, nl.po, + rw.po, sv.po, tr.po, vi.po, zh_CN.po, zh_TW.po: Update. + +2007-03-07 Joseph S. Myers + + * cpplib.pot: Regenerate. + +2006-10-22 Joseph S. Myers + + * cpplib.pot: Regenerate. + +2006-09-03 Joseph S. Myers + + * vi.po: Update. + +2006-06-24 Joseph S. Myers + + * sv.po: Update. + +2006-06-24 Joseph S. Myers + + * be.po, ca.po, da.po, de.po, el.po, es.po, fr.po, ja.po, nl.po, + rw.po, sv.po, tr.po, vi.po, zh_CN.po, zh_TW.po: Update. + +2006-04-21 Joseph S. Myers + + * de.po: Update. + +2006-03-31 Joseph S. Myers + + * sv.po: Update. + +2006-03-13 Joseph S. Myers + + * be.po, ca.po, da.po, de.po, el.po, es.po, fr.po, ja.po, nl.po, + rw.po, sv.po, tr.po, vi.po, zh_CN.po: Update. + * zh_TW.po: New file. + +2005-12-06 Joseph S. Myers + + * vi.po: Update. + +2005-12-03 Joseph S. Myers + + * zh_CN.po: New file. + +2005-12-01 Joseph S. Myers + + * be.po, ca.po, da.po, de.po, el.po, es.po, fr.po, ja.po, nl.po, + rw.po, sv.po, tr.po, vi.po: Update. + +2005-11-20 Joseph S. Myers + + * cpplib.pot: Regenerate. + +2005-09-04 Joseph S. Myers + + * be.po, ca.po, da.po, de.po, el.po, es.po, fr.po, ja.po, nl.po, + rw.po, sv.po, tr.po, vi.po: Update. + +2005-06-18 Joseph S. Myers + + * tr.po, vi.po: Update. + +2005-06-16 Joseph S. Myers + + * be.po, ca.po, da.po, de.po, el.po, es.po, fr.po, ja.po, nl.po, + rw.po, sv.po, tr.po, vi.po: Update. + +2005-06-14 Joseph S. Myers + + * fr.po, sv.po: Update. + +2005-06-07 Jakub Jelinek + + * cpplib.pot: Regenerate. + +2005-05-05 Joseph S. Myers + + * nl.po: Update. + +2005-04-27 Joseph S. Myers + + * be.po, ca.po, da.po, de.po, el.po, es.po, fr.po, ja.po, nl.po, + rw.po, sv.po, tr.po, vi.po: Update. + +2005-04-06 Joseph S. Myers + + * rw.po: New file. + +2005-03-29 Joseph S. Myers + + * de.po: Update. + +2005-03-04 Joseph S. Myers + + * tr.po: Update. + * vi.po: New file. + +2005-03-04 Joseph S. Myers + + * be.po, ca.po, da.po, de.po, el.po, es.po, fr.po, ja.po, nl.po, + sv.po, tr.po: Update. + +2005-02-25 Joseph S. Myers + + * cpplib.pot: Regenerate. + +2004-12-15 Joseph S. Myers + + * fr.po: Update. + +2004-12-04 Joseph S. Myers + + * tr.po: Update. + +2004-12-02 Joseph S. Myers + + * es.po: Update. + +2004-12-01 Joseph S. Myers + + * be.po, ca.po, da.po, de.po, el.po, es.po, fr.po, ja.po, nl.po, + sv.po, tr.po: Update. + +2004-11-27 Joseph S. Myers + + * cpplib.pot: Regenerate. + +2004-11-09 Joseph S. Myers + + * cpplib.pot: Regenerate. + +2004-05-23 Paolo Bonzini + + * be.po: Extracted from gcc/po/be.po. + * ca.po: Extracted from gcc/po/ca.po. + * da.po: Extracted from gcc/po/da.po. + * de.po: Extracted from gcc/po/de.po. + * el.po: Extracted from gcc/po/el.po. + * es.po: Extracted from gcc/po/es.po. + * fr.po: Extracted from gcc/po/fr.po. + * ja.po: Extracted from gcc/po/ja.po. + * nl.po: Extracted from gcc/po/nl.po. + * sv.po: Extracted from gcc/po/sv.po. + * tr.po: Extracted from gcc/po/tr.po. diff --git a/libcpp/po/be.po b/libcpp/po/be.po new file mode 100644 index 0000000..44c500b --- /dev/null +++ b/libcpp/po/be.po @@ -0,0 +1,2937 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2002 Free Software Foundation, Inc. +# Ales Nyakhaychyk , 2002. +# +msgid "" +msgstr "" +"Project-Id-Version: gcc 3.1\n" +"Report-Msgid-Bugs-To: http://gcc.gnu.org/bugs.html\n" +"POT-Creation-Date: 2007-11-08 21:08+0000\n" +"PO-Revision-Date: 2002-05-17 15:54+0200\n" +"Last-Translator: Ales Nyakhaychyk \n" +"Language-Team: Belarusian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: charset.c:654 +#, c-format +msgid "conversion from %s to %s not supported by iconv" +msgstr "" + +#: charset.c:657 +msgid "iconv_open" +msgstr "" + +#: charset.c:665 +#, c-format +msgid "no iconv implementation, cannot convert from %s to %s" +msgstr "" + +#: charset.c:742 +#, c-format +msgid "character 0x%lx is not in the basic source character set\n" +msgstr "" + +#: charset.c:759 charset.c:1352 +msgid "converting to execution character set" +msgstr "" + +#: charset.c:765 +#, c-format +msgid "character 0x%lx is not unibyte in execution character set" +msgstr "" + +#: charset.c:889 +#, c-format +msgid "Character %x might not be NFKC" +msgstr "" + +#: charset.c:949 +msgid "universal character names are only valid in C++ and C99" +msgstr "" + +#: charset.c:952 +#, c-format +msgid "the meaning of '\\%c' is different in traditional C" +msgstr "" + +#: charset.c:961 +msgid "In _cpp_valid_ucn but not a UCN" +msgstr "" + +#: charset.c:986 +#, c-format +msgid "incomplete universal character name %.*s" +msgstr "" + +#: charset.c:998 +#, fuzzy, c-format +msgid "%.*s is not a valid universal character" +msgstr "\"%s\" - гэта не пачатак дэкларацыі" + +#: charset.c:1008 lex.c:484 +msgid "'$' in identifier or number" +msgstr "" + +#: charset.c:1018 +#, c-format +msgid "universal character %.*s is not valid in an identifier" +msgstr "" + +#: charset.c:1022 +#, c-format +msgid "universal character %.*s is not valid at the start of an identifier" +msgstr "" + +#: charset.c:1056 charset.c:1571 +msgid "converting UCN to source character set" +msgstr "" + +#: charset.c:1060 +msgid "converting UCN to execution character set" +msgstr "" + +#: charset.c:1132 +msgid "the meaning of '\\x' is different in traditional C" +msgstr "" + +#: charset.c:1149 +msgid "\\x used with no following hex digits" +msgstr "" + +#: charset.c:1156 +msgid "hex escape sequence out of range" +msgstr "" + +#: charset.c:1195 +msgid "octal escape sequence out of range" +msgstr "" + +#: charset.c:1263 +msgid "the meaning of '\\a' is different in traditional C" +msgstr "" + +#: charset.c:1270 +#, c-format +msgid "non-ISO-standard escape sequence, '\\%c'" +msgstr "" + +#: charset.c:1278 +#, c-format +msgid "unknown escape sequence '\\%c'" +msgstr "невядомая ESC-паслядоўнасць '\\%c'" + +#: charset.c:1286 +#, fuzzy, c-format +msgid "unknown escape sequence: '\\%s'" +msgstr "невядомая ESC-паслядоўнасць '\\%c'" + +#: charset.c:1293 +msgid "converting escape sequence to execution character set" +msgstr "" + +#: charset.c:1415 charset.c:1478 +#, fuzzy +msgid "character constant too long for its type" +msgstr "сімвальная канстанта вельмі доўгая" + +#: charset.c:1418 +msgid "multi-character character constant" +msgstr "мнагасімвальная сімвальная канстанта" + +#: charset.c:1510 +msgid "empty character constant" +msgstr "пустая сімвальная канстанта" + +#: charset.c:1612 +#, c-format +msgid "failure to convert %s to %s" +msgstr "" + +#: directives.c:215 directives.c:241 +#, c-format +msgid "extra tokens at end of #%s directive" +msgstr "" + +#: directives.c:344 +#, c-format +msgid "#%s is a GCC extension" +msgstr "" + +#: directives.c:356 +msgid "suggest not using #elif in traditional C" +msgstr "" + +#: directives.c:359 +#, c-format +msgid "traditional C ignores #%s with the # indented" +msgstr "" + +#: directives.c:363 +#, c-format +msgid "suggest hiding #%s from traditional C with an indented #" +msgstr "" + +#: directives.c:389 +msgid "embedding a directive within macro arguments is not portable" +msgstr "" + +#: directives.c:409 +msgid "style of line directive is a GCC extension" +msgstr "" + +#: directives.c:464 +#, c-format +msgid "invalid preprocessing directive #%s" +msgstr "" + +#: directives.c:532 +msgid "\"defined\" cannot be used as a macro name" +msgstr "" + +#: directives.c:538 +#, c-format +msgid "\"%s\" cannot be used as a macro name as it is an operator in C++" +msgstr "" + +#: directives.c:541 +#, c-format +msgid "no macro name given in #%s directive" +msgstr "" + +#: directives.c:544 +msgid "macro names must be identifiers" +msgstr "" + +#: directives.c:585 +#, c-format +msgid "undefining \"%s\"" +msgstr "" + +#: directives.c:640 +msgid "missing terminating > character" +msgstr "" + +#: directives.c:695 +#, c-format +msgid "#%s expects \"FILENAME\" or " +msgstr "" + +#: directives.c:739 +#, c-format +msgid "empty filename in #%s" +msgstr "" + +#: directives.c:749 +msgid "#include nested too deeply" +msgstr "" + +#: directives.c:790 +msgid "#include_next in primary source file" +msgstr "" + +#: directives.c:816 +#, c-format +msgid "invalid flag \"%s\" in line directive" +msgstr "" + +#: directives.c:868 +#, c-format +msgid "\"%s\" after #line is not a positive integer" +msgstr "" + +#: directives.c:874 +msgid "line number out of range" +msgstr "" + +#: directives.c:887 directives.c:964 +#, c-format +msgid "\"%s\" is not a valid filename" +msgstr "" + +#: directives.c:924 +#, c-format +msgid "\"%s\" after # is not a positive integer" +msgstr "" + +#: directives.c:1026 +#, fuzzy, c-format +msgid "invalid #%s directive" +msgstr "нерэчаісны ініцыялізатар" + +#: directives.c:1089 +#, c-format +msgid "registering pragmas in namespace \"%s\" with mismatched name expansion" +msgstr "" + +#: directives.c:1098 +#, c-format +msgid "registering pragma \"%s\" with name expansion and no namespace" +msgstr "" + +#: directives.c:1116 +#, c-format +msgid "registering \"%s\" as both a pragma and a pragma namespace" +msgstr "" + +#: directives.c:1119 +#, fuzzy, c-format +msgid "#pragma %s %s is already registered" +msgstr "Клас \"%s\" ужо існуе" + +#: directives.c:1122 +#, c-format +msgid "#pragma %s is already registered" +msgstr "" + +#: directives.c:1152 +msgid "registering pragma with NULL handler" +msgstr "" + +#: directives.c:1362 +msgid "#pragma once in main file" +msgstr "" + +#: directives.c:1385 +msgid "invalid #pragma GCC poison directive" +msgstr "" + +#: directives.c:1394 +#, c-format +msgid "poisoning existing macro \"%s\"" +msgstr "" + +#: directives.c:1413 +msgid "#pragma system_header ignored outside include file" +msgstr "" + +#: directives.c:1437 +#, fuzzy, c-format +msgid "cannot find source file %s" +msgstr "не магу знайсці крыніцу %s" + +#: directives.c:1441 +#, c-format +msgid "current file is older than %s" +msgstr "" + +#: directives.c:1620 +msgid "_Pragma takes a parenthesized string literal" +msgstr "" + +#: directives.c:1693 +msgid "#else without #if" +msgstr "" + +#: directives.c:1698 +msgid "#else after #else" +msgstr "" + +#: directives.c:1700 directives.c:1733 +msgid "the conditional began here" +msgstr "" + +#: directives.c:1726 +msgid "#elif without #if" +msgstr "" + +#: directives.c:1731 +msgid "#elif after #else" +msgstr "" + +#: directives.c:1761 +msgid "#endif without #if" +msgstr "" + +#: directives.c:1838 +msgid "missing '(' after predicate" +msgstr "" + +#: directives.c:1853 +msgid "missing ')' to complete answer" +msgstr "" + +#: directives.c:1873 +msgid "predicate's answer is empty" +msgstr "" + +#: directives.c:1900 +msgid "assertion without predicate" +msgstr "" + +#: directives.c:1902 +msgid "predicate must be an identifier" +msgstr "" + +#: directives.c:1988 +#, c-format +msgid "\"%s\" re-asserted" +msgstr "" + +#: directives.c:2271 +#, c-format +msgid "unterminated #%s" +msgstr "" + +#: directives-only.c:221 lex.c:1016 traditional.c:162 +msgid "unterminated comment" +msgstr "незавершаныя каментарыі" + +#: errors.c:118 +msgid "warning: " +msgstr "" + +#: errors.c:120 +msgid "internal error: " +msgstr "" + +#: errors.c:122 +msgid "error: " +msgstr "" + +#: errors.c:186 +#, fuzzy +msgid "stdout" +msgstr "структура" + +#: errors.c:188 +#, c-format +msgid "%s: %s" +msgstr "" + +#: expr.c:261 +msgid "too many decimal points in number" +msgstr "" + +#: expr.c:290 expr.c:365 +msgid "fixed-point constants are a GCC extension" +msgstr "" + +#: expr.c:303 +#, fuzzy, c-format +msgid "invalid digit \"%c\" in binary constant" +msgstr "`%E' - нерэчаісная нязьменная тыпу string" + +#: expr.c:305 +#, fuzzy, c-format +msgid "invalid digit \"%c\" in octal constant" +msgstr "`%E' - нерэчаісная нязьменная тыпу string" + +#: expr.c:313 +#, fuzzy +msgid "invalid prefix \"0b\" for floating constant" +msgstr "`%E' - нерэчаісная нязьменная тыпу string" + +#: expr.c:319 +msgid "use of C99 hexadecimal floating constant" +msgstr "" + +#: expr.c:328 +msgid "exponent has no digits" +msgstr "" + +#: expr.c:335 +msgid "hexadecimal floating constants require an exponent" +msgstr "" + +#: expr.c:341 +#, fuzzy, c-format +msgid "invalid suffix \"%.*s\" on floating constant" +msgstr "`%E' - нерэчаісная нязьменная тыпу string" + +#: expr.c:351 expr.c:393 +#, c-format +msgid "traditional C rejects the \"%.*s\" suffix" +msgstr "" + +#: expr.c:358 +#, c-format +msgid "invalid suffix \"%.*s\" with hexadecimal floating constant" +msgstr "" + +#: expr.c:369 +msgid "decimal float constants are a GCC extension" +msgstr "" + +#: expr.c:379 +#, fuzzy, c-format +msgid "invalid suffix \"%.*s\" on integer constant" +msgstr "`%E' - нерэчаісная нязьменная тыпу string" + +#: expr.c:401 +msgid "use of C99 long long integer constant" +msgstr "" + +#: expr.c:409 +msgid "imaginary constants are a GCC extension" +msgstr "" + +#: expr.c:412 +msgid "binary constants are a GCC extension" +msgstr "" + +#: expr.c:505 +msgid "integer constant is too large for its type" +msgstr "" + +#: expr.c:517 +msgid "integer constant is so large that it is unsigned" +msgstr "" + +#: expr.c:612 +msgid "missing ')' after \"defined\"" +msgstr "" + +#: expr.c:619 +msgid "operator \"defined\" requires an identifier" +msgstr "" + +#: expr.c:627 +#, c-format +msgid "(\"%s\" is an alternative token for \"%s\" in C++)" +msgstr "" + +#: expr.c:637 +msgid "this use of \"defined\" may not be portable" +msgstr "" + +#: expr.c:676 +msgid "floating constant in preprocessor expression" +msgstr "" + +#: expr.c:682 +msgid "imaginary number in preprocessor expression" +msgstr "" + +#: expr.c:727 +#, c-format +msgid "\"%s\" is not defined" +msgstr "" + +#: expr.c:855 expr.c:884 +#, fuzzy, c-format +msgid "missing binary operator before token \"%s\"" +msgstr "прапушчан прабел пасля нумара \"%.*s\"" + +#: expr.c:875 +#, c-format +msgid "token \"%s\" is not valid in preprocessor expressions" +msgstr "" + +#: expr.c:892 +msgid "missing expression between '(' and ')'" +msgstr "" + +#: expr.c:895 +msgid "#if with no expression" +msgstr "" + +#: expr.c:898 +#, c-format +msgid "operator '%s' has no right operand" +msgstr "" + +#: expr.c:903 +#, c-format +msgid "operator '%s' has no left operand" +msgstr "" + +#: expr.c:929 +msgid " ':' without preceding '?'" +msgstr "" + +#: expr.c:956 +msgid "unbalanced stack in #if" +msgstr "" + +#: expr.c:975 +#, fuzzy, c-format +msgid "impossible operator '%u'" +msgstr "немагчымы апэратар '%s'" + +#: expr.c:1065 +msgid "missing ')' in expression" +msgstr "" + +#: expr.c:1086 +msgid "'?' without following ':'" +msgstr "" + +#: expr.c:1096 +msgid "integer overflow in preprocessor expression" +msgstr "" + +#: expr.c:1101 +msgid "missing '(' in expression" +msgstr "" + +#: expr.c:1133 +#, c-format +msgid "the left operand of \"%s\" changes sign when promoted" +msgstr "" + +#: expr.c:1138 +#, c-format +msgid "the right operand of \"%s\" changes sign when promoted" +msgstr "" + +#: expr.c:1397 +msgid "traditional C rejects the unary plus operator" +msgstr "" + +#: expr.c:1480 +msgid "comma operator in operand of #if" +msgstr "" + +#: expr.c:1612 +msgid "division by zero in #if" +msgstr "" + +#: files.c:442 +msgid "NULL directory in find_file" +msgstr "" + +#: files.c:480 +msgid "one or more PCH files were found, but they were invalid" +msgstr "" + +#: files.c:483 +msgid "use -Winvalid-pch for more information" +msgstr "" + +#: files.c:570 +#, c-format +msgid "%s is a block device" +msgstr "%s - гэта блёчная прылада" + +#: files.c:587 +#, c-format +msgid "%s is too large" +msgstr "%s - вельмі вялікі" + +#: files.c:622 +#, c-format +msgid "%s is shorter than expected" +msgstr "" + +#: files.c:852 +#, c-format +msgid "no include path in which to search for %s" +msgstr "" + +#: files.c:1157 +msgid "Multiple include guards may be useful for:\n" +msgstr "" + +#: init.c:426 +msgid "cppchar_t must be an unsigned type" +msgstr "" + +#: init.c:430 +#, c-format +msgid "preprocessor arithmetic has maximum precision of %lu bits; target requires %lu bits" +msgstr "" + +#: init.c:437 +msgid "CPP arithmetic must be at least as precise as a target int" +msgstr "" + +#: init.c:440 +msgid "target char is less than 8 bits wide" +msgstr "" + +#: init.c:444 +msgid "target wchar_t is narrower than target char" +msgstr "" + +#: init.c:448 +msgid "target int is narrower than target char" +msgstr "" + +#: init.c:453 +msgid "CPP half-integer narrower than CPP character" +msgstr "" + +#: init.c:457 +#, c-format +msgid "CPP on this host cannot handle wide character constants over %lu bits, but the target requires %lu bits" +msgstr "" + +#: lex.c:283 +msgid "backslash and newline separated by space" +msgstr "" + +#: lex.c:288 +msgid "backslash-newline at end of file" +msgstr "" + +#: lex.c:303 +#, c-format +msgid "trigraph ??%c converted to %c" +msgstr "" + +#: lex.c:310 +#, c-format +msgid "trigraph ??%c ignored, use -trigraphs to enable" +msgstr "" + +#: lex.c:356 +msgid "\"/*\" within comment" +msgstr "" + +#: lex.c:414 +#, c-format +msgid "%s in preprocessing directive" +msgstr "" + +#: lex.c:423 +msgid "null character(s) ignored" +msgstr "" + +#: lex.c:460 +#, c-format +msgid "`%.*s' is not in NFKC" +msgstr "" + +#: lex.c:463 +#, fuzzy, c-format +msgid "`%.*s' is not in NFC" +msgstr "`%D' - гэта ня функцыя," + +#: lex.c:551 +#, c-format +msgid "attempt to use poisoned \"%s\"" +msgstr "" + +#: lex.c:559 +msgid "__VA_ARGS__ can only appear in the expansion of a C99 variadic macro" +msgstr "" + +#: lex.c:659 +msgid "null character(s) preserved in literal" +msgstr "" + +#: lex.c:662 +#, c-format +msgid "missing terminating %c character" +msgstr "прапушчан завяршаючы сімвал %c" + +#: lex.c:1027 +msgid "C++ style comments are not allowed in ISO C90" +msgstr "" + +#: lex.c:1029 +msgid "(this will be reported only once per input file)" +msgstr "" + +#: lex.c:1034 +msgid "multi-line comment" +msgstr "" + +#: lex.c:1347 +#, fuzzy, c-format +msgid "unspellable token %s" +msgstr "немагу адчыніць файл \"%s\"" + +#: line-map.c:320 +#, c-format +msgid "In file included from %s:%u" +msgstr "" + +#: line-map.c:338 +#, c-format +msgid "" +",\n" +" from %s:%u" +msgstr "" + +#: macro.c:84 +#, c-format +msgid "macro \"%s\" is not used" +msgstr "" + +#: macro.c:123 macro.c:319 +#, c-format +msgid "invalid built-in macro \"%s\"" +msgstr "" + +#: macro.c:157 +#, fuzzy +msgid "could not determine file timestamp" +msgstr "не магу знайсці крыніцу %s\n" + +#: macro.c:254 +#, fuzzy +msgid "could not determine date and time" +msgstr "Немагчыма адчыніць файл з дадзенымі %s.\n" + +#: macro.c:270 +msgid "__COUNTER__ expanded inside directive with -fdirectives-only" +msgstr "" + +#: macro.c:423 +msgid "invalid string literal, ignoring final '\\'" +msgstr "" + +#: macro.c:483 +#, c-format +msgid "pasting \"%s\" and \"%s\" does not give a valid preprocessing token" +msgstr "" + +#: macro.c:558 +msgid "ISO C99 requires rest arguments to be used" +msgstr "" + +#: macro.c:563 +#, c-format +msgid "macro \"%s\" requires %u arguments, but only %u given" +msgstr "" + +#: macro.c:568 +#, c-format +msgid "macro \"%s\" passed %u arguments, but takes just %u" +msgstr "" + +#: macro.c:679 traditional.c:680 +#, c-format +msgid "unterminated argument list invoking macro \"%s\"" +msgstr "" + +#: macro.c:782 +#, c-format +msgid "function-like macro \"%s\" must be used with arguments in traditional C" +msgstr "" + +#: macro.c:1325 +#, c-format +msgid "duplicate macro parameter \"%s\"" +msgstr "" + +#: macro.c:1371 +#, c-format +msgid "\"%s\" may not appear in macro parameter list" +msgstr "" + +#: macro.c:1379 +msgid "macro parameters must be comma-separated" +msgstr "" + +#: macro.c:1396 +msgid "parameter name missing" +msgstr "" + +#: macro.c:1413 +msgid "anonymous variadic macros were introduced in C99" +msgstr "" + +#: macro.c:1418 +msgid "ISO C does not permit named variadic macros" +msgstr "" + +#: macro.c:1427 +msgid "missing ')' in macro parameter list" +msgstr "" + +#: macro.c:1476 +msgid "'##' cannot appear at either end of a macro expansion" +msgstr "" + +#: macro.c:1510 +msgid "ISO C99 requires whitespace after the macro name" +msgstr "" + +#: macro.c:1534 +#, fuzzy +msgid "missing whitespace after the macro name" +msgstr "прапушчан прабел пасля нумара \"%.*s\"" + +#: macro.c:1564 +msgid "'#' is not followed by a macro parameter" +msgstr "" + +#: macro.c:1683 +#, c-format +msgid "\"%s\" redefined" +msgstr "" + +#: macro.c:1688 +msgid "this is the location of the previous definition" +msgstr "" + +#: macro.c:1738 +#, c-format +msgid "macro argument \"%s\" would be stringified in traditional C" +msgstr "" + +#: macro.c:1761 +#, c-format +msgid "invalid hash type %d in cpp_macro_definition" +msgstr "" + +#: pch.c:84 pch.c:332 pch.c:344 pch.c:362 pch.c:368 pch.c:377 +msgid "while writing precompiled header" +msgstr "" + +#: pch.c:485 +#, fuzzy, c-format +msgid "%s: not used because `%.*s' not defined" +msgstr "адмеціна `%s' выкарыстоўвываецца, але ня вызначана" + +#: pch.c:497 +#, c-format +msgid "%s: not used because `%.*s' defined as `%s' not `%.*s'" +msgstr "" + +#: pch.c:538 +#, c-format +msgid "%s: not used because `%s' is defined" +msgstr "" + +#: pch.c:558 +#, c-format +msgid "%s: not used because `__COUNTER__' is invalid" +msgstr "" + +#: pch.c:567 pch.c:737 +msgid "while reading precompiled header" +msgstr "" + +#: traditional.c:750 +#, c-format +msgid "detected recursion whilst expanding macro \"%s\"" +msgstr "" + +#: traditional.c:917 +msgid "syntax error in macro parameter list" +msgstr "" + +#~ msgid "wrong number of arguments specified for `%s' attribute" +#~ msgstr "памылковая колькасьць аргументаў, зададзеных для атрыбута `%s'" + +#~ msgid "`%s' attribute ignored" +#~ msgstr "\"%s\" атрыбут ігнарыруецца" + +#~ msgid "unknown machine mode `%s'" +#~ msgstr "невядомы рэжым машыны \"%s\"" + +#~ msgid "no data type for mode `%s'" +#~ msgstr "няма тыпа дадзеных для рэжыма \"%s\"" + +#~ msgid "section of `%s' conflicts with previous declaration" +#~ msgstr "секцыя \"%s\" канфліктуе з папярэдняй дэкларацыяй" + +#~ msgid "section attributes are not supported for this target" +#~ msgstr "атрыбуты секцыі не падтрымліваюцца для гэтай мэты" + +#, fuzzy +#~ msgid "`%s' attribute ignored for `%s'" +#~ msgstr "\"%s\" атрыбут ігнарыруецца" + +#, fuzzy +#~ msgid "second arg to `__builtin_prefetch' must be a constant" +#~ msgstr "аргумент `__builtin_args_info' павінен быць канстантай" + +#, fuzzy +#~ msgid "third arg to `__builtin_prefetch' must be a constant" +#~ msgstr "аргумент `__builtin_args_info' павінен быць канстантай" + +#~ msgid "__builtin_saveregs not supported by this target" +#~ msgstr "__buitin_saveregs не падтрымліваецца гэтай мэтай" + +#~ msgid "argument of `__builtin_args_info' must be constant" +#~ msgstr "аргумент `__builtin_args_info' павінен быць канстантай" + +#~ msgid "argument of `__builtin_args_info' out of range" +#~ msgstr "аргумент `__builtin_args_info' выйшаў за межы" + +#~ msgid "missing argument in `__builtin_args_info'" +#~ msgstr "прапушчан аргумент у `__builtin_args_info'" + +#~ msgid "`va_start' used in function with fixed args" +#~ msgstr "" +#~ "`va_start' выкарыстоўвываецца ў функцыі з нязьменнай\n" +#~ " колькасьцю аргументаў" + +#~ msgid "`__builtin_next_arg' called without an argument" +#~ msgstr "\"__buitin_next_arg\" выклікаецца без аргумента" + +#~ msgid "invalid use of `restrict'" +#~ msgstr "нявернае выкарыстанне \"restict\"" + +#, fuzzy +#~ msgid "cannot disable built-in function `%s'" +#~ msgstr "не магу ініцыялізаваць сяброўскую функцыю \"%s\"" + +#~ msgid "too few arguments to function `%s'" +#~ msgstr "нехапае аргументаў у функцыі \"%s\"" + +#~ msgid "too many arguments to function `%s'" +#~ msgstr "вельмі шмат аргумэнтаў у функцыі `%s'" + +#, fuzzy +#~ msgid "ISO C++ forbids taking the address of a label" +#~ msgstr "ISO C не дазваляе пусты ізыходны файл" + +#, fuzzy +#~ msgid "ISO C forbids taking the address of a label" +#~ msgstr "ISO C не дазваляе пусты ізыходны файл" + +#~ msgid "unknown C standard `%s'" +#~ msgstr "невядомы C стандарт `%s'" + +#~ msgid "label `%s' defined but not used" +#~ msgstr "адмеціна `%s' вызначана, але ня выкарыстоўваецца" + +#, fuzzy +#~ msgid "previous declaration of function `%s' with attribute noinline" +#~ msgstr "няма папярэдняга аб'яўлення для \"%s\"" + +#, fuzzy +#~ msgid "previous declaration of function `%s' was inline" +#~ msgstr "няма папярэдняга аб'яўлення для \"%s\"" + +#, fuzzy +#~ msgid "a parameter" +#~ msgstr "невыкарыстаемы параметр \"%s\"" + +#, fuzzy +#~ msgid "a global declaration" +#~ msgstr "Нерэчаіснае абвяшчэнне" + +#~ msgid "duplicate label declaration `%s'" +#~ msgstr "паўторнае абвяшчэньне адмеціны `%s'" + +#~ msgid "this is a previous declaration" +#~ msgstr "гэта папярэдняе абвяшчэньне" + +#~ msgid "empty declaration" +#~ msgstr "пустое абвяшчэньне" + +#, fuzzy +#~ msgid "ISO C89 does not support `[*]' array declarators" +#~ msgstr "ISO C89 не падтрымлівае \"long long\"" + +#~ msgid "`%s' is usually a function" +#~ msgstr "`%s' - звычайна функцыя" + +#~ msgid "parameter `%s' is initialized" +#~ msgstr "параметр \"%s\" ініцыялізаваны" + +#~ msgid "`long long long' is too long for GCC" +#~ msgstr "`long long long' - вельмі доўга для GCC" + +#~ msgid "ISO C89 does not support `long long'" +#~ msgstr "ISO C89 не падтрымлівае `long long'" + +#~ msgid "duplicate `%s'" +#~ msgstr "паўтарэньне `%s'" + +#~ msgid "long, short, signed or unsigned invalid for `%s'" +#~ msgstr "long, short, signed ці unsigned нерэчаісны для \"%s\"" + +#~ msgid "complex invalid for `%s'" +#~ msgstr "complex нерэчаісны для \"%s\"" + +#~ msgid "ISO C89 does not support complex types" +#~ msgstr "ISO C89 не падтрымлівае комлексныя тыпы" + +#~ msgid "ISO C does not support plain `complex' meaning `double complex'" +#~ msgstr "ISO C не падтрымлівае просты \"complex\" у значэнні \"double complex\"" + +#~ msgid "ISO C does not support complex integer types" +#~ msgstr "ISO C не падтрымлівае комлексныя цэлалікавыя тыпы" + +#~ msgid "duplicate `const'" +#~ msgstr "паўтарэнне \"const\"" + +#~ msgid "duplicate `restrict'" +#~ msgstr "паўтарэнне \"restrict\"" + +#~ msgid "duplicate `volatile'" +#~ msgstr "паўтарэнне \"volatile\"" + +#~ msgid "size of array `%s' is negative" +#~ msgstr "памер масіва \"%s\" адмоўны" + +#~ msgid "size of array `%s' is too large" +#~ msgstr "памер масіва \"%s\" вельмі вялікі" + +#, fuzzy +#~ msgid "redefinition of `struct %s'" +#~ msgstr "перанакіраванне stdout: %s" + +#~ msgid "union" +#~ msgstr "аб'яднанне" + +#~ msgid "structure" +#~ msgstr "структура" + +#~ msgid "members" +#~ msgstr "члены" + +#~ msgid "bit-field `%s' has invalid type" +#~ msgstr "бітавае поле \"%s\" мае нерэчаісны тып" + +#~ msgid "no previous prototype for `%s'" +#~ msgstr "няма папярэдняга прататыпа для \"%s\"" + +#~ msgid "no previous declaration for `%s'" +#~ msgstr "няма папярэдняга аб'яўлення для \"%s\"" + +#~ msgid "return type of `%s' is not `int'" +#~ msgstr "вяртаемы тып \"%s\" не \"int\"" + +#~ msgid "first argument of `%s' should be `int'" +#~ msgstr "першым аргументам \"%s\" павінен быць \"int\"" + +#~ msgid "second argument of `%s' should be `char **'" +#~ msgstr "другім аргументам \"%s\" павінен быць \"char **\"" + +#~ msgid "size of return value of `%s' is %u bytes" +#~ msgstr "памер вяртаемага значэння \"%s\" %u байт" + +#~ msgid "size of return value of `%s' is larger than %d bytes" +#~ msgstr "памер вяртаемага значэння \"%s\" больш чым %d байт" + +#~ msgid "function does not return string type" +#~ msgstr "функцыя не вяртае тып string" + +#~ msgid "`0' flag" +#~ msgstr "'0' флаг" + +#~ msgid "`O' modifier" +#~ msgstr "'O' мадыфікатар" + +#~ msgid "%s does not support %s" +#~ msgstr "%s не падтрымлівае %s" + +#~ msgid "syntax error" +#~ msgstr "сінтаксічная памылка" + +#, fuzzy +#~ msgid "syntax error: cannot back up" +#~ msgstr "сінтаксічная памылка" + +#~ msgid "ISO C forbids an empty source file" +#~ msgstr "ISO C не дазваляе пусты ізыходны файл" + +#, fuzzy +#~ msgid "first argument to __builtin_choose_expr not a constant" +#~ msgstr "аргумент `__builtin_args_info' павінен быць канстантай" + +#~ msgid "`%s' is not at beginning of declaration" +#~ msgstr "\"%s\" - гэта не пачатак дэкларацыі" + +#~ msgid "ISO C forbids label declarations" +#~ msgstr "ISO C не дазваляе дэкларацыі метак (label)" + +#~ msgid "empty body in an else-statement" +#~ msgstr "пустое цела ў else-выражэнні" + +#~ msgid "ISO C forbids `goto *expr;'" +#~ msgstr "ISO C не падтрымлівае \"goto *expr;\"" + +#~ msgid "parse error" +#~ msgstr "граматычная памылка" + +#~ msgid "%s at end of input" +#~ msgstr "%s на прыканцы ўводу" + +#~ msgid "%s before %s'%c'" +#~ msgstr "%s перад %s'%c'" + +#~ msgid "%s before %s'\\x%x'" +#~ msgstr "%s перад %s'\\x%x'" + +#~ msgid "%s before \"%s\"" +#~ msgstr "%s перад \"%s\"" + +#~ msgid "%s before '%s' token" +#~ msgstr "%s перад знакам '%s'" + +#, fuzzy +#~ msgid "YYDEBUG not defined" +#~ msgstr "YYDEBUG не вызначан." + +#, fuzzy +#~ msgid "#pragma pack(push[, id], ) is not supported on this target" +#~ msgstr "атрыбуты секцыі не падтрымліваюцца для гэтай мэты" + +#, fuzzy +#~ msgid "#pragma pack(pop[, id], ) is not supported on this target" +#~ msgstr "атрыбуты секцыі не падтрымліваюцца для гэтай мэты" + +#, fuzzy +#~ msgid "asm declaration conficts with previous rename" +#~ msgstr "секцыя \"%s\" канфліктуе з папярэдняй дэкларацыяй" + +#~ msgid "destructor needed for `%#D'" +#~ msgstr "дэструктару неабходны \"%#D\"" + +#~ msgid "`%s' has an incomplete type" +#~ msgstr "\"%s\" мае незавершаны тып" + +#~ msgid "`%s' undeclared (first use in this function)" +#~ msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" + +#~ msgid "(Each undeclared identifier is reported only once" +#~ msgstr "(Аб кожным неабвешчаным ідэнтыфікатары паведамляецца" + +#~ msgid "for each function it appears in.)" +#~ msgstr "адзін раз для кожнай функцыі, дзе ён з'яўляецца.)" + +#~ msgid "too many arguments to function" +#~ msgstr "вельмі шмат аргументаў у функцыі" + +#~ msgid "too few arguments to function" +#~ msgstr "не хапае аргументаў у функцыі" + +#~ msgid "ISO C does not support `++' and `--' on complex types" +#~ msgstr "ISO C не падтрымлівае \"++\" і \"--\" для тыпу complex" + +#, fuzzy +#~ msgid "wrong type argument to increment" +#~ msgstr "не хапае аргументаў у функцыі" + +#, fuzzy +#~ msgid "cannot take address of bit-field `%s'" +#~ msgstr "не магу атрымаць адрас бітавага поля \"%s\"" + +#~ msgid "initialization" +#~ msgstr "ініцыялізацыя" + +#~ msgid "invalid initializer" +#~ msgstr "нерэчаісны ініцыялізатар" + +#~ msgid "missing initializer" +#~ msgstr "прапушчан ініцыялізатар" + +#~ msgid "return" +#~ msgstr "вяртанне" + +#~ msgid "called from here" +#~ msgstr "выклікана адсюль" + +#~ msgid "internal error" +#~ msgstr "унутраная памылка" + +#~ msgid "no arguments" +#~ msgstr "няма аргументаў" + +#~ msgid "%d constructor(s) found\n" +#~ msgstr "%d канструктар(аў) знойдзен(а)\n" + +#~ msgid "%d destructor(s) found\n" +#~ msgstr "%d дэструктар(аў) знойдзен(а)\n" + +#~ msgid "[cannot find %s]" +#~ msgstr "[нельга знайсці %s]" + +#~ msgid "cannot find `%s'" +#~ msgstr "нельга знайсці \"%s\"" + +#~ msgid "redirecting stdout: %s" +#~ msgstr "перанакіраванне stdout: %s" + +#~ msgid "cannot find `nm'" +#~ msgstr "нельга знайсці \"nm\"" + +#~ msgid "pipe" +#~ msgstr "канвеер" + +#~ msgid "unable to open file '%s'" +#~ msgstr "немагу адчыніць файл \"%s\"" + +#~ msgid "not found\n" +#~ msgstr "не знойдзена\n" + +#~ msgid "bad magic number in file '%s'" +#~ msgstr "дрэнная магічная лічба ў файле \"%s\"" + +#~ msgid "cannot find `ldd'" +#~ msgstr "не магу знайсці \"ldd\"" + +#, fuzzy +#~ msgid "library lib%s not found" +#~ msgstr "Бібліятэка lib%s не знойдзена" + +#~ msgid "bad magic number" +#~ msgstr "дрэнны \"магічны\" нумар" + +#~ msgid "bad header version" +#~ msgstr "дрэнная версія загалоўка" + +#~ msgid "unsupported version" +#~ msgstr "непадтрымліваемая версія" + +#, fuzzy +#~ msgid "missing binary operator" +#~ msgstr "прапушчан ініцыялізатар" + +#~ msgid "%s: Not a directory" +#~ msgstr "%s: не дырэкторыя" + +#, fuzzy +#~ msgid "changing search order for system directory \"%s\"" +#~ msgstr "немагчыма стварыць дырэкторыю \"%s\"" + +#, fuzzy +#~ msgid "argument missing after %s" +#~ msgstr "аргумент для \"%s\" прапушчан" + +#, fuzzy +#~ msgid "output filename specified twice" +#~ msgstr "не зададзены ўваходзячыя файлы" + +#, fuzzy +#~ msgid "unknown string token %s\n" +#~ msgstr "невядомая назва рэгістра: %s\n" + +#, fuzzy +#~ msgid "unknown escape sequence: '\\%03o'" +#~ msgstr "невядомая ESC-паслядоўнасць '\\%c'" + +#, fuzzy +#~ msgid "invalid option %s" +#~ msgstr "Нерэчаісны выбар %s" + +#~ msgid "too many input files" +#~ msgstr "вельмі шмат уваходзячых файлаў" + +#~ msgid "%s:%d: warning: " +#~ msgstr "%s:%d: увага: " + +#~ msgid "%s: warning: " +#~ msgstr "%s: увага: " + +#~ msgid "%s: %s: " +#~ msgstr "%s: %s: " + +#, fuzzy +#~ msgid "In member function `%s':" +#~ msgstr "у функцыі \"%s\":" + +#~ msgid "In function `%s':" +#~ msgstr "у функцыі \"%s\":" + +#~ msgid "compilation terminated.\n" +#~ msgstr "кампіляцыя завершана.\n" + +#~ msgid "In file included from %s:%d" +#~ msgstr "У файле уключаным з %s:%d" + +#~ msgid ":\n" +#~ msgstr ":\n" + +#~ msgid "can't get current directory" +#~ msgstr "не магу атрымаць бягучую дырэкторыю" + +#~ msgid "abort in %s, at %s:%d" +#~ msgstr "спынена ў %s, ля %s:%d" + +#~ msgid "invalid %%-code" +#~ msgstr "нерэчаісны %%-код" + +#~ msgid "unused parameter `%s'" +#~ msgstr "невыкарыстаемы параметр \"%s\"" + +#, fuzzy +#~ msgid "missing argument to `%s' option" +#~ msgstr "аргумент для \"%s\" прапушчан" + +#, fuzzy +#~ msgid "extraneous argument to `%s' option" +#~ msgstr "аргумент для \"%s\" прапушчан" + +#~ msgid "-pipe not supported" +#~ msgstr "-pipe не падтрымліваецца" + +#~ msgid "# %s %.2f %.2f\n" +#~ msgstr "# %s %.2f %.2f\n" + +#~ msgid "Usage: %s [options] file...\n" +#~ msgstr "Выкарыстанне: %s [выбары] файл...\n" + +#~ msgid "Options:\n" +#~ msgstr "Выбары:\n" + +#~ msgid " --help Display this information\n" +#~ msgstr " --help Адлюстраваць гэту інфармацыю\n" + +#~ msgid " -dumpversion Display the version of the compiler\n" +#~ msgstr " -dumpversion Адлюстраваць версію кампілятара\n" + +#, fuzzy +#~ msgid " -specs= Override built-in specs with the contents of \n" +#~ msgstr " -o <файл> Памясціць вывад у <файл>\n" + +#~ msgid " -o Place the output into \n" +#~ msgstr " -o <файл> Памясціць вывад у <файл>\n" + +#, fuzzy +#~ msgid "argument to `-l' is missing" +#~ msgstr "аргумент для \"-x\" прапушчан" + +#~ msgid "argument to `-x' is missing" +#~ msgstr "аргумент для \"-x\" прапушчан" + +#~ msgid "argument to `-%s' is missing" +#~ msgstr "аргумент для \"-%s\" прапушчан" + +#, fuzzy +#~ msgid "invalid specification! Bug in cc" +#~ msgstr "Нерэчаісная спецыфікацыя! Памылка ў cc." + +#~ msgid "%s\n" +#~ msgstr "%s\n" + +#, fuzzy +#~ msgid "spec failure: unrecognized spec option '%c'" +#~ msgstr "нераспазнаны выбар \"-%s\"" + +#~ msgid "unrecognized option `-%s'" +#~ msgstr "нераспазнаны выбар \"-%s\"" + +#~ msgid "programs: %s\n" +#~ msgstr "праграмы: %s\n" + +#~ msgid "libraries: %s\n" +#~ msgstr "бібліятэкі: %s\n" + +#~ msgid "" +#~ "\n" +#~ "For bug reporting instructions, please see:\n" +#~ msgstr "" +#~ "\n" +#~ "Інструкцыі для паведамленняў аб памылках глядзіце тут:\n" + +#~ msgid "gcc version %s\n" +#~ msgstr "версія gcc %s\n" + +#, fuzzy +#~ msgid "no input files" +#~ msgstr "няма ўваходзячых файлаў" + +#~ msgid "%s: %s compiler not installed on this system" +#~ msgstr "%s: %s кампілятар не ўсталяваны на гэтай сістэме" + +#~ msgid "language %s not recognized" +#~ msgstr "мова %s не распазнана" + +#, fuzzy +#~ msgid "internal gcc abort" +#~ msgstr "унутраная памылка" + +#, fuzzy +#~ msgid " -h, --help Print this help, then exit\n" +#~ msgstr " --help Адлюстраваць гэту інфармацыю\n" + +#, fuzzy +#~ msgid " -v, --version Print version number, then exit\n" +#~ msgstr " -dumpversion Адлюстраваць версію кампілятара\n" + +#, fuzzy +#~ msgid " -n, --no-output Do not create an output file\n" +#~ msgstr " -o <файл> Памясціць вывад у <файл>\n" + +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "For bug reporting instructions, please see:\n" +#~ "%s.\n" +#~ msgstr "" +#~ "\n" +#~ "Інструкцыі для паведамленняў аб памылках глядзіце тут:\n" + +#~ msgid "Copyright (C) 2001 Free Software Foundation, Inc.\n" +#~ msgstr "Copyright (C) 2001 Free Software Foundation, Inc.\n" + +#~ msgid "can't open %s" +#~ msgstr "немагчыма адчыніць %s" + +#~ msgid "invalid parameter `%s'" +#~ msgstr "нерэчаісны парамэтр `%s'" + +#~ msgid "%s: internal abort\n" +#~ msgstr "%s: унутраная памылка (датэрміновае завяршэньне)\n" + +#~ msgid "%s: compiling `%s'\n" +#~ msgstr "%s: кампілюецца \"%s\"\n" + +#~ msgid "%s: can't delete file `%s': %s\n" +#~ msgstr "%s: немагчыма знішчыць файл \"%s\": %s\n" + +#~ msgid "%s: %d: warning: no extern definition for `%s'\n" +#~ msgstr "%s: %d: увага: няма знешняга (extern) абвяшчэння для \"%s\"\n" + +#~ msgid "%s: can't open file `%s' for reading: %s\n" +#~ msgstr "%s: немагчыма адчыніць файл `%s' для чытаньня: %s\n" + +#~ msgid "" +#~ "\n" +#~ "%s: error reading input file `%s': %s\n" +#~ msgstr "" +#~ "\n" +#~ "%s: памылка чытаньня файла ўводу `%s': %s\n" + +#~ msgid "%s: warning: file `%s' already saved in `%s'\n" +#~ msgstr "%s: увага: файл \"%s\" ужо запісан у \"%s\"\n" + +#~ msgid "%s: can't change mode of file `%s': %s\n" +#~ msgstr "%s: немагчыма зьмяніць рэжым файла `%s': %s\n" + +#~ msgid "%s: input file names must have .c suffixes: %s\n" +#~ msgstr "%s: файл уводу павінен мець суфікс .c: %s\n" + +#~ msgid "floating point overflow" +#~ msgstr "перапаўненьне плаваючай кропкі" + +#~ msgid "unknown register name: %s" +#~ msgstr "невядомая назва рэгістра: %s" + +#, fuzzy +#~ msgid "could not find a spill register" +#~ msgstr "Не выкарыстоўваць рэгістра sb" + +#, fuzzy +#~ msgid "unrecognizable insn:" +#~ msgstr "нераспазнаны выбар \"-%s\"" + +#, fuzzy +#~ msgid "duplicate asm operand name '%s'" +#~ msgstr "паўторнае абвяшчэнне меткі \"%s\"" + +#, fuzzy +#~ msgid "undefined named operand '%s'" +#~ msgstr "нераспазнаны аператар %s" + +#~ msgid "unused variable `%s'" +#~ msgstr "невыкарыстоўваемая пераменная \"%s\"" + +#~ msgid "size of `%s' is %d bytes" +#~ msgstr "памер \"%s\" - %d байт" + +#~ msgid "size of `%s' is larger than %d bytes" +#~ msgstr "памер \"%s\" больш чам %d байт" + +#~ msgid "Enable exception handling" +#~ msgstr "Уключыць апрацоўку выключэньняў" + +#~ msgid "Insert stack checking code into the program" +#~ msgstr "Уключаць код правэркі стэку ў праграму" + +#~ msgid "Enable SSA optimizations" +#~ msgstr "Уключаць SSA аптымізацыю" + +#, fuzzy +#~ msgid "Do not recognize any built in functions" +#~ msgstr "Не генерыраваць сімвальныя інструкцыі" + +#, fuzzy +#~ msgid "invalid option `%s'" +#~ msgstr "Нерэчаісны выбар \"%s\"" + +#, fuzzy +#~ msgid "internal error: %s" +#~ msgstr "Унутраная памылка: %s" + +#~ msgid "" +#~ "\n" +#~ "Language specific options:\n" +#~ msgstr "" +#~ "\n" +#~ "Выбары, спецыфічныя для мовы:\n" + +#~ msgid "" +#~ "\n" +#~ " Options for %s:\n" +#~ msgstr "" +#~ "\n" +#~ " Выбары для %s:\n" + +#, fuzzy +#~ msgid "unrecognized option `%s'" +#~ msgstr "нераспазнаны выбар \"-%s\"" + +#, fuzzy +#~ msgid "-Wid-clash-LEN is no longer supported" +#~ msgstr "-pipe не падтрымліваецца." + +#~ msgid "`%s': unknown or unsupported -g option" +#~ msgstr "\"%s\" : невядомы ці непадтрымліваемы выбар -g" + +#~ msgid "invalid --param option: %s" +#~ msgstr "нерэчаісны выбар --param : %s" + +#~ msgid "" +#~ "%s%s%s version %s (%s)\n" +#~ "%s\tcompiled by GNU C version %s.\n" +#~ "%s%s%s version %s (%s) compiled by CC.\n" +#~ msgstr "" +#~ "%s%s%s версія %s (%s)\n" +#~ "%s\tзкампілявана GNU C версія %s.\n" +#~ "%s%s%s версія %s (%s) зкампілявана CC.\n" + +#~ msgid "options enabled: " +#~ msgstr "выбары ўключаны:" + +#~ msgid "can't open %s for writing" +#~ msgstr "немагчыма адчыніць %s для запісу" + +#, fuzzy +#~ msgid "ignoring command line option '%s'" +#~ msgstr "Нераспазнаны выбар \"%s\"" + +#, fuzzy +#~ msgid "-ffunction-sections not supported for this target" +#~ msgstr "атрыбуты секцыі не падтрымліваюцца для гэтай мэты" + +#, fuzzy +#~ msgid "-fdata-sections not supported for this target" +#~ msgstr "атрыбуты секцыі не падтрымліваюцца для гэтай мэты" + +#, fuzzy +#~ msgid "-fprefetch-loop-arrays not supported for this target" +#~ msgstr "атрыбуты секцыі не падтрымліваюцца для гэтай мэты" + +#~ msgid "error writing to %s" +#~ msgstr "памылка запісу ў %s" + +#, fuzzy +#~ msgid "invalid character constant in #if" +#~ msgstr "сімвальная канстанта вельмі доўгая" + +#~ msgid "usage: %s [switches] input output" +#~ msgstr "выкарыстаньне: %s [выключальнікі] увод вывад" + +#~ msgid "#error%.*s" +#~ msgstr "#памылка%.*s" + +#~ msgid "#warning%.*s" +#~ msgstr "#увага%.*s" + +#~ msgid "unbalanced #endif" +#~ msgstr "незбалансаваны #endif" + +#~ msgid "invalid register name for `%s'" +#~ msgstr "нерэчаісная назва рэгістра `%s'" + +#~ msgid "optimization turned on" +#~ msgstr "аптымізацыя уключана" + +#~ msgid "optimization turned off" +#~ msgstr "аптымізацыя выключана" + +#~ msgid "invalid %%Q value" +#~ msgstr "дрэннае %%Q значэнне" + +#~ msgid "invalid %%C value" +#~ msgstr "нерэчаіснае значэньне %%C" + +#~ msgid "invalid %%N value" +#~ msgstr "нерэчаіснае значэньне %%N" + +#~ msgid "invalid %%M value" +#~ msgstr "нерэчаіснае значэньне %%M" + +#~ msgid "invalid %%m value" +#~ msgstr "нерэчаіснае значэньне %%m" + +#~ msgid "invalid %%L value" +#~ msgstr "нерэчаіснае значэньне %%L" + +#~ msgid "invalid %%O value" +#~ msgstr "нерэчаіснае значэньне %%O" + +#~ msgid "invalid %%P value" +#~ msgstr "нерэчаіснае значэньне %%P" + +#~ msgid "invalid %%V value" +#~ msgstr "нерэчаіснае значэньне %%V" + +#, fuzzy +#~ msgid "-f%s ignored for Unicos/Mk (not supported)" +#~ msgstr "-pipe не падтрымліваецца." + +#, fuzzy +#~ msgid "-mieee not supported on Unicos/Mk" +#~ msgstr "-pipe не падтрымліваецца" + +#~ msgid "invalid %%H value" +#~ msgstr "нерэчаіснае значэньне %%H" + +#, fuzzy +#~ msgid "invalid %%J value" +#~ msgstr "дрэннае %%Q значэнне" + +#~ msgid "invalid %%r value" +#~ msgstr "нерэчаіснае значэньне %%r" + +#~ msgid "invalid %%R value" +#~ msgstr "нерэчаіснае значэньне %%R" + +#~ msgid "invalid %%h value" +#~ msgstr "нерэчаіснае значэньне %%h" + +#~ msgid "invalid %%U value" +#~ msgstr "нерэчаіснае значэньне %%U" + +#~ msgid "invalid %%s value" +#~ msgstr "нерэчаіснае значэньне %%v" + +#~ msgid "invalid %%E value" +#~ msgstr "нерэчаіснае значэньне %%E" + +#~ msgid "invalid %%xn code" +#~ msgstr "нерэчаіснае значэньне %%xn" + +#~ msgid "Use hardware fp" +#~ msgstr "Выкарыстоўваць апаратную плаваючую кропку" + +#~ msgid "Do not use hardware fp" +#~ msgstr "Не выкарыстоўваць апаратную плаваючую кропку" + +#, fuzzy +#~ msgid "argument of `%s' attribute is not a string constant" +#~ msgstr "аргумент `__builtin_args_info' павінен быць канстантай" + +#, fuzzy +#~ msgid "invalid operand to %%R code" +#~ msgstr "нерэчаісны %%-код" + +#, fuzzy +#~ msgid "invalid operand to %%H/%%L code" +#~ msgstr "нерэчаісны %%-код" + +#, fuzzy +#~ msgid "invalid operand to %%U code" +#~ msgstr "нерэчаісны %%-код" + +#, fuzzy +#~ msgid "invalid operand to %%V code" +#~ msgstr "нерэчаісны %%-код" + +#, fuzzy +#~ msgid "target CPU does not support THUMB instructions" +#~ msgstr "ISO C не падтрымлівае комлексныя цэлалікавыя тыпы" + +#, fuzzy +#~ msgid "`%s' attribute only applies to functions" +#~ msgstr "\"%s\" звычайна функцыя" + +#, fuzzy +#~ msgid "invalid insn:" +#~ msgstr "Нерэчаісны выбар %s" + +#~ msgid "internal error: bad register: %d" +#~ msgstr "унутраная памылка: дрэнны рэгістр: %d" + +#~ msgid "unrecognized address" +#~ msgstr "нераспазнаны адрас" + +#, fuzzy +#~ msgid "unrecognized supposed constant" +#~ msgstr "нераспазнаны выбар \"-%s\"" + +#, fuzzy +#~ msgid "Do not use condition codes from normal instructions" +#~ msgstr "Не генерыраваць сімвальныя інструкцыі" + +#, fuzzy +#~ msgid "Generate code for the specified chip or CPU version" +#~ msgstr "Генерыраваць код для дадзенага ЦП" + +#, fuzzy +#~ msgid "Do not make adjacent short instructions parallel" +#~ msgstr "Не генерыраваць сімвальныя інструкцыі" + +#~ msgid "invalid mode for gen_tst_reg" +#~ msgstr "нерэчаісны рэжым для gen_tst_reg" + +#, fuzzy +#~ msgid "Don't pass parameters in registers" +#~ msgstr "Не выкарыстоўваць рэгістра sb" + +#, fuzzy +#~ msgid "Generate code for near calls" +#~ msgstr "Генерыраваць код для Intel as" + +#, fuzzy +#~ msgid "Don't generate code for near calls" +#~ msgstr "Генерыраваць код для Intel as" + +#, fuzzy +#~ msgid "Generate code for near jumps" +#~ msgstr "Генерыраваць код для Intel as" + +#, fuzzy +#~ msgid "Don't generate code for near jumps" +#~ msgstr "Генерыраваць код для Intel as" + +#, fuzzy +#~ msgid "Generate code for a bit-manipulation unit" +#~ msgstr "Генерыраваць код для Intel as" + +#, fuzzy +#~ msgid "Don't generate code for a bit-manipulation unit" +#~ msgstr "Не генерыраваць сімвальныя інструкцыі" + +#, fuzzy +#~ msgid "Generate code for memory map1" +#~ msgstr "Генерыраваць код для Intel as" + +#, fuzzy +#~ msgid "Generate code for memory map2" +#~ msgstr "Генерыраваць код для Intel as" + +#, fuzzy +#~ msgid "Generate code for memory map3" +#~ msgstr "Генерыраваць код для Intel as" + +#, fuzzy +#~ msgid "Generate code for memory map4" +#~ msgstr "Генерыраваць код для Intel as" + +#, fuzzy +#~ msgid "-ms2600 is used without -ms" +#~ msgstr "-ms2600 ужываецца без -ms." + +#~ msgid "Do not generate char instructions" +#~ msgstr "Не генерыраваць сімвальныя інструкцыі" + +#, fuzzy +#~ msgid "argument to `%s' attribute larger than %d" +#~ msgstr "памер \"%s\" больш чам %d байт" + +#, fuzzy +#~ msgid "invalid operand code `%c'" +#~ msgstr "Нерэчаісны выбар \"%s\"" + +#, fuzzy +#~ msgid "unknown insn mode" +#~ msgstr "невядомы рэжым машыны \"%s\"" + +#, fuzzy +#~ msgid "`%s' attribute only applies to variables" +#~ msgstr "\"%s\" атрыбут ігнарыруецца" + +#~ msgid "Create GUI application" +#~ msgstr "Стварыць GUI прыдатак" + +#~ msgid "Create console application" +#~ msgstr "Стварыць кансольны прыдатак" + +#~ msgid "Generate code for a DLL" +#~ msgstr "Стварыць код для DLL" + +#~ msgid "Generate code for given CPU" +#~ msgstr "Генерыраваць код для дадзенага ЦП" + +#~ msgid "Use given assembler dialect" +#~ msgstr "Выкарыстоўвываць зададзены дыялект асэмблера" + +#~ msgid "Generate ELF output" +#~ msgstr "Стварыць ELF-вывад" + +#~ msgid "Generate code for GNU as" +#~ msgstr "Генерыраваць код для GNU as" + +#~ msgid "Generate code for Intel as" +#~ msgstr "Генерыраваць код для Intel as" + +#~ msgid "Generate code for GNU ld" +#~ msgstr "Генерыраваць код для GNU ld" + +#~ msgid "Generate code for Intel ld" +#~ msgstr "Генерыраваць код для Intel ld" + +#~ msgid "Generate code without GP reg" +#~ msgstr "Генерыраваць код без GP reg" + +#, fuzzy +#~ msgid "invalid argument of `%s' attribute" +#~ msgstr "нявернае выкарыстанне \"restict\"" + +#, fuzzy +#~ msgid "invalid operand to %%s code" +#~ msgstr "нерэчаісны %%-код" + +#, fuzzy +#~ msgid "invalid operand to %%p code" +#~ msgstr "нерэчаісны %%-код" + +#, fuzzy +#~ msgid "invalid operand to %%T/%%B code" +#~ msgstr "нерэчаісны %%-код" + +#, fuzzy +#~ msgid "invalid operand to %%N code" +#~ msgstr "нерэчаісны %%-код" + +#~ msgid "bad address" +#~ msgstr "дрэнны адрас" + +#, fuzzy +#~ msgid "lo_sum not of register" +#~ msgstr "Не выкарыстоўваць рэгістра sb" + +#, fuzzy +#~ msgid "invalid register in the instruction" +#~ msgstr "нявернае выкарыстанне \"restict\"" + +#, fuzzy +#~ msgid "invalid rotate insn" +#~ msgstr "Нерэчаісны выбар %s" + +#~ msgid "Generate code for a 68020" +#~ msgstr "Ствараць код для 68020" + +#~ msgid "Generate code for a 68000" +#~ msgstr "Ствараць код для 68000" + +#, fuzzy +#~ msgid "Do not use the bit-field instructions" +#~ msgstr "Не генерыраваць сімвальныя інструкцыі" + +#, fuzzy +#~ msgid "Generate code for a Sun FPA" +#~ msgstr "Стварыць код для DLL" + +#, fuzzy +#~ msgid "Do not generate code for a Sun FPA" +#~ msgstr "Стварыць код для DLL" + +#, fuzzy +#~ msgid "Generate code for a Sun Sky board" +#~ msgstr "Стварыць код для DLL" + +#~ msgid "Generate code for a 68881" +#~ msgstr "Ствараць код для 68881" + +#~ msgid "Generate code for a 68030" +#~ msgstr "Ствараць код для 68030" + +#~ msgid "Generate code for a 68040" +#~ msgstr "Ствараць код для 68040" + +#~ msgid "Generate code for a 68060" +#~ msgstr "Ствараць код для 68060" + +#~ msgid "Generate code for a 520X" +#~ msgstr "Ствараць код для 520X" + +#~ msgid "Generate code for a 68851" +#~ msgstr "Ствараць код для 68851" + +#~ msgid "Do no generate code for a 68851" +#~ msgstr "Не ствараць код для 68851" + +#~ msgid "Generate code for a 68302" +#~ msgstr "Ствараць код для 68302" + +#~ msgid "Generate code for a 68332" +#~ msgstr "Ствараць код для 68332" + +#~ msgid "Generate code for a cpu32" +#~ msgstr "Ствараць код для цп32" + +#~ msgid "invalid %%x/X value" +#~ msgstr "нерэчаіснае значэньне %%x/X" + +#~ msgid "invalid %%o value" +#~ msgstr "нерэчаіснае значэньне %%o" + +#, fuzzy +#~ msgid "invalid %%s/S value" +#~ msgstr "дрэннае %%Q значэнне" + +#, fuzzy +#~ msgid "invalid %%P operand" +#~ msgstr "нерэчаісны %%-код" + +#, fuzzy +#~ msgid "invalid %%D value" +#~ msgstr "дрэннае %%Q значэнне" + +#, fuzzy +#~ msgid "invalid option `-mshort-data-%s'" +#~ msgstr "Нерэчаісны выбар \"%s\"" + +#, fuzzy +#~ msgid "invalid option `-mstack-increment=%s'" +#~ msgstr "Нерэчаісны выбар \"%s\"" + +#, fuzzy +#~ msgid "invalid option `entry%s'" +#~ msgstr "Нерэчаісны выбар \"%s\"" + +#, fuzzy +#~ msgid "can't rewind temp file" +#~ msgstr "немагчыма стварыць часовы файл" + +#, fuzzy +#~ msgid "can't write to output file" +#~ msgstr "не магу запісаць ў %s" + +#, fuzzy +#~ msgid "can't read from temp file" +#~ msgstr "не магу прачытаць з %s" + +#, fuzzy +#~ msgid "can't close temp file" +#~ msgstr "немагчыма зачыніць уваходзячы файл %s" + +#~ msgid "Use GNU as" +#~ msgstr "Выкарыстоўваць GNU як" + +#~ msgid "Use symbolic register names" +#~ msgstr "Ужываць сімвалічныя назвы рэгістраў" + +#~ msgid "Don't use symbolic register names" +#~ msgstr "Не ўжываць сімвалічныя назва рэгістраў" + +#~ msgid "Output compiler statistics" +#~ msgstr "Вывесці статыстыку капілятара" + +#~ msgid "Don't output compiler statistics" +#~ msgstr "Не выводзіць статыстыку кампілятара" + +#~ msgid "Use hardware floating point" +#~ msgstr "Выкарыстоўваць апаратную \"плаваючую кропку\"" + +#~ msgid "Use 64-bit FP registers" +#~ msgstr "Выкарыстоўваць 64-бітныя FP-рэгістры" + +#~ msgid "Use 32-bit FP registers" +#~ msgstr "Выкарыстоўваць 32-бітныя FP-рэгістры" + +#~ msgid "Use 64-bit general registers" +#~ msgstr "Выкарыстоўваць 64-бітныя галоўныя рэгістры" + +#~ msgid "Use 32-bit general registers" +#~ msgstr "Выкарыстоўваць 32-бітныя галоўныя рэгістры" + +#~ msgid "Use Irix PIC" +#~ msgstr "Выкарыстоўваць Irix PIC" + +#~ msgid "Don't use Irix PIC" +#~ msgstr "Не выкарыстоўваць Irix PIC" + +#~ msgid "Use OSF PIC" +#~ msgstr "Выкарыстоўваць OSF PIC" + +#~ msgid "Don't use OSF PIC" +#~ msgstr "Не выкарыстоўваць OSF PIC" + +#~ msgid "Optimize for 3900" +#~ msgstr "Аптымізаваць для 3900" + +#~ msgid "Optimize for 4650" +#~ msgstr "Аптымізаваць для 4650" + +#, fuzzy +#~ msgid "-f%s not supported: ignored" +#~ msgstr "-pipe не падтрымліваецца" + +#~ msgid "Target the AM33 processor" +#~ msgstr "Мэта - AM33 працэсар" + +#~ msgid "Don't use hardware fp" +#~ msgstr "Не выкарыстоўваць апаратную fp" + +#~ msgid "Optimize for 32532 cpu" +#~ msgstr "Аптымізаваць для 32532 ЦП" + +#~ msgid "Optimize for 32332 cpu" +#~ msgstr "Аптымізаваць для 32332 ЦП" + +#~ msgid "Optimize for 32032" +#~ msgstr "Аптымізаваць для 32032 ЦП" + +#~ msgid "Do not use register sb" +#~ msgstr "Не выкарыстоўваць рэгістра sb" + +#, fuzzy +#~ msgid "Do not use bit-field instructions" +#~ msgstr "Не генерыраваць сімвальныя інструкцыі" + +#~ msgid "Use 32 bit int" +#~ msgstr "Выкарыстоўваць 32-х бітны int" + +#~ msgid "Use 16 bit int" +#~ msgstr "Выкарыстоўваць 16-ці бітны int" + +#~ msgid "Use 32 bit float" +#~ msgstr "Выкарыстоўваць 32-х бітны float" + +#~ msgid "Use 64 bit float" +#~ msgstr "Выкарыстоўваць 64-х бітны float" + +#~ msgid "Use UNIX assembler syntax" +#~ msgstr "Выкарыстоўваць UNIX-сінтакс для асэмблера" + +#~ msgid "Use DEC assembler syntax" +#~ msgstr "Выкарыстоўваць DEC-сінтакс для асэмблера" + +#, fuzzy +#~ msgid "unknown ABI specified: '%s'" +#~ msgstr "невядомы рэжым машыны \"%s\"" + +#, fuzzy +#~ msgid "argument 1 of __builtin_altivec_predicate must be a constant" +#~ msgstr "аргумент `__builtin_args_info' павінен быць канстантай" + +#, fuzzy +#~ msgid "argument 1 of __builtin_altivec_predicate is out of range" +#~ msgstr "аргумент `__builtin_args_info' выйшаў за межы" + +#, fuzzy +#~ msgid "argument 3 of `%s' must be a 2-bit literal" +#~ msgstr "першым аргументам \"%s\" павінен быць \"int\"" + +#~ msgid "Don't use AltiVec instructions" +#~ msgstr "Не выкарыстоўваць інструкцыі AltiVec" + +#~ msgid "Don't use EABI" +#~ msgstr "Не выкарыстоўваць EABI" + +#~ msgid "Use alternate register names" +#~ msgstr "Выкарыстоўвываць альтэрнатыўныя назвы рэгістраў" + +#~ msgid "Don't use alternate register names" +#~ msgstr "Не выкарыстоўвываць альтэрнатыўныя назвы рэгістраў" + +#, fuzzy +#~ msgid "Don't use bras" +#~ msgstr "Не выкарыстоўваць Irix PIC" + +#, fuzzy +#~ msgid "__builtin_saveregs not supported by this subtarget" +#~ msgstr "__buitin_saveregs не падтрымліваецца гэтай мэтай" + +#, fuzzy +#~ msgid "Profiling is not supported on this target." +#~ msgstr "__buitin_saveregs не падтрымліваецца гэтай мэтай" + +#~ msgid "invalid %%Y operand" +#~ msgstr "нерэчаісны %%Y аперанд" + +#~ msgid "invalid %%A operand" +#~ msgstr "нерэчаісны %%A аперанд" + +#~ msgid "invalid %%B operand" +#~ msgstr "нерэчаісны %%B аперанд" + +#~ msgid "invalid %%c operand" +#~ msgstr "нерэчаісны %%c аперанд" + +#~ msgid "invalid %%C operand" +#~ msgstr "нерэчаісны %%C аперанд" + +#~ msgid "invalid %%d operand" +#~ msgstr "нерэчаісны %%d аперанд" + +#~ msgid "invalid %%D operand" +#~ msgstr "нерэчаісны %%D аперанд" + +#~ msgid "invalid %%f operand" +#~ msgstr "нерэчаісны %%f аперанд" + +#~ msgid "Optimize for Cypress processors" +#~ msgstr "Аптымізацыя для Cypress працэсараў" + +#~ msgid "Optimize for SparcLite processors" +#~ msgstr "Аптымізацыя для SparcLite працэсараў" + +#~ msgid "Optimize for F930 processors" +#~ msgstr "Аптымізацыя для F930 працэсараў" + +#~ msgid "Optimize for F934 processors" +#~ msgstr "Аптымізацыя для F934 працэсараў" + +#~ msgid "Optimize for SuperSparc processors" +#~ msgstr "Аптымізацыя для SuperSparc працэсараў" + +#~ msgid "unrecognized section name \"%s\"" +#~ msgstr "нераспазнаная назва сэкцыі \"%s\"" + +#~ msgid "%s=%s is too large" +#~ msgstr "%s=%s вельмі вялікі" + +#~ msgid "invalid mask" +#~ msgstr "нерэчаісная маска" + +#~ msgid "invalid address" +#~ msgstr "нерэчаісны адрас" + +#, fuzzy +#~ msgid "no register in address" +#~ msgstr "невядомая назва рэгістра: %s" + +#, fuzzy +#~ msgid "Do not use the Xtensa boolean register option" +#~ msgstr "Не ўжываць сімвалічныя назва рэгістраў" + +#, fuzzy +#~ msgid "Use the Xtensa floating-point unit" +#~ msgstr "Выкарыстоўваць апаратную \"плаваючую кропку\"" + +#, fuzzy +#~ msgid "%s for `%T %s' operator" +#~ msgstr "%s перад знакам \"%s\"" + +#, fuzzy +#~ msgid "%s for `%T %s %T' operator" +#~ msgstr "%s перад знакам \"%s\"" + +#, fuzzy +#~ msgid "%s for `%s %T' operator" +#~ msgstr "%s перад знакам \"%s\"" + +#, fuzzy +#~ msgid "duplicate enum value `%D'" +#~ msgstr "паўтарэнне \"volatile\"" + +#, fuzzy +#~ msgid "duplicate nested type `%D'" +#~ msgstr "паўтарэнне \"restrict\"" + +#, fuzzy +#~ msgid "duplicate member `%D'" +#~ msgstr "паўтарэнне \"%s\"" + +#, fuzzy +#~ msgid "`%D' invalid in `%T'" +#~ msgstr "Нерэчаісны выбар \"%s\"" + +#, fuzzy +#~ msgid "`%D' invalid in `%#T'" +#~ msgstr "Нерэчаісны выбар \"%s\"" + +#~ msgid "previous definition of `%#T'" +#~ msgstr "папярэдняе вызначэньне `%#T'" + +#, fuzzy +#~ msgid "bit-field `%#D' with non-integral type" +#~ msgstr "бітавае поле \"%s\" мае нерэчаісны тып" + +#, fuzzy +#~ msgid "field `%D' invalidly declared method type" +#~ msgstr "бітавае поле \"%s\" мае нерэчаісны тып" + +#, fuzzy +#~ msgid "field `%D' invalidly declared offset type" +#~ msgstr "бітавае поле \"%s\" мае нерэчаісны тып" + +#, fuzzy +#~ msgid "field `%D' declared static in union" +#~ msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" + +#~ msgid "declaration of `%#D'" +#~ msgstr "абвяшчэньне `%#D'" + +#~ msgid "converting from `%T' to `%T'" +#~ msgstr "пераўтварэньне з `%T' у `%T'" + +#~ msgid "conflicts with previous declaration `%#D'" +#~ msgstr "канфлікт з папярэднім абвяшчэньнем `%#D'" + +#~ msgid "label `%D' used but not defined" +#~ msgstr "адмеціна `%D' выкарыстоўвываецца, але ня вызначана" + +#~ msgid "label `%D' defined but not used" +#~ msgstr "адмеціна `%D' вызначана, але не выкарыстоўваецца" + +#~ msgid "previous declaration of `%D'" +#~ msgstr "папярэдняе абвяшчэньне `%D'" + +#, fuzzy +#~ msgid "shadowing %s function `%#D'" +#~ msgstr "у функцыі \"%s\":" + +#, fuzzy +#~ msgid "conflicts with built-in declaration `%#D'" +#~ msgstr "паўторнае абвяшчэнне меткі \"%s\"" + +#~ msgid "new declaration `%#D'" +#~ msgstr "новае абвяшчэньне `%#D'" + +#, fuzzy +#~ msgid "ambiguates built-in declaration `%#D'" +#~ msgstr "паўторнае абвяшчэнне меткі \"%s\"" + +#~ msgid "previous declaration of `%#D'" +#~ msgstr "папярэдняе абвяшчэньне `%#D'" + +#~ msgid "declaration of template `%#D'" +#~ msgstr "абвяшчэньне шаблёну `%#D'" + +#, fuzzy +#~ msgid "ambiguates old declaration `%#D'" +#~ msgstr "паўторнае абвяшчэнне меткі \"%s\"" + +#, fuzzy +#~ msgid "previous declaration `%#D' here" +#~ msgstr "няма папярэдняга аб'яўлення для \"%s\"" + +#, fuzzy +#~ msgid "previous declaration as `%#D'" +#~ msgstr "няма папярэдняга аб'яўлення для \"%s\"" + +#, fuzzy +#~ msgid "prototype for `%#D'" +#~ msgstr "няма папярэдняга прататыпа для \"%s\"" + +#, fuzzy +#~ msgid "previous declaration of `%#D' with %L linkage" +#~ msgstr "няма папярэдняга аб'яўлення для \"%s\"" + +#, fuzzy +#~ msgid "after previous specification in `%#D'" +#~ msgstr "няма папярэдняга аб'яўлення для \"%s\"" + +#, fuzzy +#~ msgid "previous non-inline declaration here" +#~ msgstr "няма папярэдняга аб'яўлення для \"%s\"" + +#, fuzzy +#~ msgid "than previous declaration `%F'" +#~ msgstr "няма папярэдняга аб'яўлення для \"%s\"" + +#, fuzzy +#~ msgid "`%#D' used prior to declaration" +#~ msgstr "\"%s\" - гэта не пачатак дэкларацыі" + +#, fuzzy +#~ msgid "redeclaration of `wchar_t' as `%T'" +#~ msgstr "няма папярэдняга аб'яўлення для \"%s\"" + +#, fuzzy +#~ msgid "invalid redeclaration of `%D'" +#~ msgstr "Нерэчаіснае абвяшчэнне" + +#~ msgid "as `%D'" +#~ msgstr "як `%D'" + +#, fuzzy +#~ msgid "previous external decl of `%#D'" +#~ msgstr "няма папярэдняга аб'яўлення для \"%s\"" + +#, fuzzy +#~ msgid "global declaration `%#D'" +#~ msgstr "паўторнае абвяшчэнне меткі \"%s\"" + +#, fuzzy +#~ msgid "`%#D' hides constructor for `%#T'" +#~ msgstr "дэструктару неабходны \"%#D\"" + +#, fuzzy +#~ msgid "`%#D' conflicts with previous using declaration `%#D'" +#~ msgstr "секцыя \"%s\" канфліктуе з папярэдняй дэкларацыяй" + +#, fuzzy +#~ msgid "previous non-function declaration `%#D'" +#~ msgstr "няма папярэдняга аб'яўлення для \"%s\"" + +#, fuzzy +#~ msgid "conflicts with function declaration `%#D'" +#~ msgstr "секцыя \"%s\" канфліктуе з папярэдняй дэкларацыяй" + +#, fuzzy +#~ msgid "implicit declaration of function `%#D'" +#~ msgstr "няма папярэдняга аб'яўлення для \"%s\"" + +#~ msgid " from here" +#~ msgstr " адсюль" + +#, fuzzy +#~ msgid " skips initialization of `%#D'" +#~ msgstr "ініцыялізацыя" + +#, fuzzy +#~ msgid "duplicate label `%D'" +#~ msgstr "паўтарэнне \"%s\"" + +#~ msgid "invalid use of `%D'" +#~ msgstr "нерэчаіснае выкарыстаньне `%D'" + +#, fuzzy +#~ msgid "typedef `%D' is initialized" +#~ msgstr "параметр \"%s\" ініцыялізаваны" + +#, fuzzy +#~ msgid "variable `%#D' has initializer but incomplete type" +#~ msgstr "\"%s\" мае незавершаны тып" + +#, fuzzy +#~ msgid "elements of array `%#D' have incomplete type" +#~ msgstr "\"%s\" мае незавершаны тып" + +#, fuzzy +#~ msgid "cannot initialize `%T' from `%T'" +#~ msgstr "не магу ініцыялізаваць сяброўскую функцыю \"%s\"" + +#~ msgid "array size missing in `%D'" +#~ msgstr "прапушчан памер масіва ў `%D'" + +#~ msgid "zero-size array `%D'" +#~ msgstr "нулявы памер масіва `%D'" + +#, fuzzy +#~ msgid "uninitialized const `%D'" +#~ msgstr "не магу ініцыялізаваць сяброўскую функцыю \"%s\"" + +#, fuzzy +#~ msgid "`%D' has incomplete type" +#~ msgstr "\"%s\" мае незавершаны тып" + +#, fuzzy +#~ msgid "cannot initialize `%D' to namespace `%D'" +#~ msgstr "не магу ініцыялізаваць сяброўскую функцыю \"%s\"" + +#, fuzzy +#~ msgid "shadowing previous type declaration of `%#D'" +#~ msgstr "няма папярэдняга аб'яўлення для \"%s\"" + +#, fuzzy +#~ msgid "`%D' declared with an exception specification" +#~ msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" + +#~ msgid "`main' must return `int'" +#~ msgstr "`main' павінна вяртаць `int'" + +#~ msgid "size of array `%D' has non-integer type" +#~ msgstr "памер масіва `%D' не цэлалікавы тып" + +#, fuzzy +#~ msgid "size of array has non-integer type" +#~ msgstr "памер масіва \"%s\" адмоўны" + +#~ msgid "size of array `%D' is negative" +#~ msgstr "памер масіва `%D' - адмоўны" + +#~ msgid "size of array is negative" +#~ msgstr "адмоўны памер масіва " + +#, fuzzy +#~ msgid "ISO C++ forbids zero-size array" +#~ msgstr "ISO C не дазваляе дэкларацыі метак (label)" + +#, fuzzy +#~ msgid "size of array `%D' is not an integral constant-expression" +#~ msgstr "памер масіва \"%s\" адмоўны" + +#, fuzzy +#~ msgid "ISO C++ forbids variable-size array" +#~ msgstr "ISO C не дазваляе дэкларацыі метак (label)" + +#~ msgid "invalid declarator" +#~ msgstr "нерэчаісны абвяшчальнік" + +#~ msgid "multiple declarations `%T' and `%T'" +#~ msgstr "неаднолькавае абвяшчэньне `%T' і `%T'" + +#~ msgid "ISO C++ does not support `long long'" +#~ msgstr "ISO C++ не падтрымлівае \"long long\"" + +#, fuzzy +#~ msgid "ISO C++ forbids declaration of `%s' with no type" +#~ msgstr "ISO C не дазваляе дэкларацыі метак (label)" + +#, fuzzy +#~ msgid "size of member `%D' is not constant" +#~ msgstr "тып параметра \"%s\" не аб'яўлены" + +#~ msgid "can't initialize friend function `%s'" +#~ msgstr "не магу ініцыялізаваць сяброўскую функцыю \"%s\"" + +#~ msgid "virtual functions cannot be friends" +#~ msgstr "віртуальныя функцыі не могуць быць сяброўскімі" + +#, fuzzy +#~ msgid "can't define friend function `%s' in a local class definition" +#~ msgstr "не магу ініцыялізаваць сяброўскую функцыю \"%s\"" + +#, fuzzy +#~ msgid "template parameters cannot be friends" +#~ msgstr "віртуальныя функцыі не могуць быць сяброўскімі" + +#~ msgid "invalid use of `::'" +#~ msgstr "нерэчаіснае выкарыстаньне `::'" + +#, fuzzy +#~ msgid "function `%D' cannot be declared friend" +#~ msgstr "віртуальныя функцыі не могуць быць сяброўскімі" + +#, fuzzy +#~ msgid "function `%D' declared virtual inside a union" +#~ msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" + +#, fuzzy +#~ msgid "field `%D' has incomplete type" +#~ msgstr "\"%s\" мае незавершаны тып" + +#, fuzzy +#~ msgid "name `%T' has incomplete type" +#~ msgstr "\"%s\" мае незавершаны тып" + +#~ msgid "default argument for `%#D' has type `%T'" +#~ msgstr "звычайны аргумэнт для `%#D' мае тып `%T'" + +#, fuzzy +#~ msgid "parameter `%D' invalidly declared method type" +#~ msgstr "тып параметра \"%s\" не аб'яўлены" + +#, fuzzy +#~ msgid "parameter `%D' invalidly declared offset type" +#~ msgstr "тып параметра \"%s\" не аб'яўлены" + +#, fuzzy +#~ msgid "use of enum `%#D' without previous declaration" +#~ msgstr "секцыя \"%s\" канфліктуе з папярэдняй дэкларацыяй" + +#~ msgid "previous definition here" +#~ msgstr "папярэдняе вызначэньне" + +#, fuzzy +#~ msgid "return type `%#T' is incomplete" +#~ msgstr "вяртаемы тып \"%s\" не \"int\"" + +#, fuzzy +#~ msgid "semicolon missing after declaration of `%#T'" +#~ msgstr "Не магу знайсці дэкларацыю інтэрфейса для \"%s\"" + +#, fuzzy +#~ msgid "`%D' implicitly declared before its definition" +#~ msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" + +#, fuzzy +#~ msgid "parameter `%D' declared void" +#~ msgstr "тып параметра \"%s\" не аб'яўлены" + +#, fuzzy +#~ msgid "duplicate type qualifiers in %s declaration" +#~ msgstr "паўторнае абвяшчэнне меткі \"%s\"" + +#, fuzzy +#~ msgid "deleting `%T' is undefined" +#~ msgstr "метка \"%s\" ужываецца, але не вызначана" + +#, fuzzy +#~ msgid "template declaration of `%#D'" +#~ msgstr "пустое абвяшчэнне" + +#, fuzzy +#~ msgid "invalid data member initialization" +#~ msgstr "нерэчаісны ініцыялізатар" + +#, fuzzy +#~ msgid "initializer specified for non-member function `%D'" +#~ msgstr "не магу ініцыялізаваць сяброўскую функцыю \"%s\"" + +#, fuzzy +#~ msgid "invalid initializer for virtual method `%D'" +#~ msgstr "нерэчаісны ініцыялізатар" + +#, fuzzy +#~ msgid "use of `%D' is ambiguous" +#~ msgstr "памер \"%s\" - %d байт" + +#, fuzzy +#~ msgid "unknown namespace `%D'" +#~ msgstr "невядомы рэжым машыны \"%s\"" + +#, fuzzy +#~ msgid "namespace `%D' not allowed in using-declaration" +#~ msgstr "\"%s\" - гэта не пачатак дэкларацыі" + +#, fuzzy +#~ msgid "`%D' is already a friend of class `%T'" +#~ msgstr "не знойдзен клас \"%s\"" + +#, fuzzy +#~ msgid "previous friend declaration of `%D'" +#~ msgstr "няма папярэдняга аб'яўлення для \"%s\"" + +#, fuzzy +#~ msgid "template parameter type `%T' declared `friend'" +#~ msgstr "тып параметра \"%s\" не аб'яўлены" + +#, fuzzy +#~ msgid "member initializers for `%#D'" +#~ msgstr "complex нерэчаісны для \"%s\"" + +#, fuzzy +#~ msgid "base initializers for `%#T'" +#~ msgstr "не магу ініцыялізаваць сяброўскую функцыю \"%s\"" + +#, fuzzy +#~ msgid "base class `%T' already initialized" +#~ msgstr "Клас \"%s\" ужо існуе" + +#, fuzzy +#~ msgid "bad array initializer" +#~ msgstr "нерэчаісны ініцыялізатар" + +#, fuzzy +#~ msgid "`%T' is not an aggregate type" +#~ msgstr "\"%s\" мае незавершаны тып" + +#, fuzzy +#~ msgid "invalid use of non-static field `%D'" +#~ msgstr "нявернае выкарыстанне \"restict\"" + +#, fuzzy +#~ msgid "invalid use of member `%D'" +#~ msgstr "нявернае выкарыстанне \"restict\"" + +#, fuzzy +#~ msgid "no method `%T::%D'" +#~ msgstr "у метадзе \"%s\":" + +#, fuzzy +#~ msgid "can't find class$" +#~ msgstr "Не магу знайсці клас \"%s\"" + +#, fuzzy +#~ msgid "semicolon missing after declaration of `%T'" +#~ msgstr "Не магу знайсці дэкларацыю інтэрфейса для \"%s\"" + +#, fuzzy +#~ msgid "`%D' not defined" +#~ msgstr "YYDEBUG не вызначан." + +#, fuzzy +#~ msgid "`%D' was not declared in this scope" +#~ msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" + +#, fuzzy +#~ msgid "`%D' undeclared (first use this function)" +#~ msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" + +#, fuzzy +#~ msgid "`::%D' undeclared (first use here)" +#~ msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" + +#, fuzzy +#~ msgid "no type `%D' in `%T'" +#~ msgstr "вяртаемы тып \"%s\" не \"int\"" + +#, fuzzy +#~ msgid "invalid member template declaration `%D'" +#~ msgstr "паўторнае абвяшчэнне меткі \"%s\"" + +#, fuzzy +#~ msgid "`%D' is not a function template" +#~ msgstr "\"%s\" звычайна функцыя" + +#, fuzzy +#~ msgid "no default argument for `%D'" +#~ msgstr "нехапае аргументаў у функцыі \"%s\"" + +#, fuzzy +#~ msgid "`%T' is not a template type" +#~ msgstr "\"%s\" мае незавершаны тып" + +#~ msgid "previous declaration `%D'" +#~ msgstr "папярэдняе абвяшчэньне `%D'" + +#, fuzzy +#~ msgid "template parameter `%#D'" +#~ msgstr "невыкарыстаемы параметр \"%s\"" + +#, fuzzy +#~ msgid "provided for `%D'" +#~ msgstr "дэструктару неабходны \"%#D\"" + +#, fuzzy +#~ msgid "template argument %d is invalid" +#~ msgstr "параметр \"%s\" ініцыялізаваны" + +#, fuzzy +#~ msgid "for template declaration `%D'" +#~ msgstr "пустое абвяшчэнне" + +#~ msgid "invalid parameter type `%T'" +#~ msgstr "нерэчаісны тып парамэтра `%T'" + +#~ msgid "in declaration `%D'" +#~ msgstr "у абвяшчэньні `%D'" + +#, fuzzy +#~ msgid "explicit specialization here" +#~ msgstr "ініцыялізацыя" + +#, fuzzy +#~ msgid "duplicate explicit instantiation of `%#D'" +#~ msgstr "паўторнае абвяшчэнне меткі \"%s\"" + +#, fuzzy +#~ msgid "duplicate explicit instantiation of `%#T'" +#~ msgstr "паўторнае абвяшчэнне меткі \"%s\"" + +#, fuzzy +#~ msgid "type of asm operand `%E' could not be determined" +#~ msgstr "тып параметра \"%s\" не аб'яўлены" + +#, fuzzy +#~ msgid "base initializer for `%T'" +#~ msgstr "не магу ініцыялізаваць сяброўскую функцыю \"%s\"" + +#~ msgid "%s before `%s'" +#~ msgstr "%s перад \"%s\"" + +#~ msgid "%s before `%c'" +#~ msgstr "%s перад '%c'" + +#~ msgid "%s before `\\%o'" +#~ msgstr "%s перад \"\\%o\"" + +#~ msgid "%s before `%s' token" +#~ msgstr "%s перад знакам \"%s\"" + +#, fuzzy +#~ msgid "`%s' attribute is not supported on this platform" +#~ msgstr "атрыбуты секцыі не падтрымліваюцца для гэтай мэты" + +#, fuzzy +#~ msgid "`sizeof' applied to incomplete type `%T'" +#~ msgstr "\"%s\" мае незавершаны тып" + +#, fuzzy +#~ msgid "`%E' cannot be used as a function" +#~ msgstr "\"%s\" звычайна функцыя" + +#, fuzzy +#~ msgid "too many arguments to %s `%+#D'" +#~ msgstr "вельмі шмат аргументаў у функцыі \"%s\"" + +#, fuzzy +#~ msgid "too few arguments to %s `%+#D'" +#~ msgstr "нехапае аргументаў у функцыі \"%s\"" + +#, fuzzy +#~ msgid "attempt to take address of bit-field structure member `%D'" +#~ msgstr "не магу атрымаць адрас бітавага поля \"%s\"" + +#, fuzzy +#~ msgid "cannot %s a pointer to incomplete type `%T'" +#~ msgstr "\"%s\" мае незавершаны тып" + +#, fuzzy +#~ msgid "invalid cast to function type `%T'" +#~ msgstr "Нерэчаісны выбар \"%s\"" + +#, fuzzy +#~ msgid "invalid use of undefined type `%#T'" +#~ msgstr "нявернае выкарыстанне \"restict\"" + +#, fuzzy +#~ msgid "forward declaration of `%#T'" +#~ msgstr "няма папярэдняга аб'яўлення для \"%s\"" + +#~ msgid "invalid use of `%T'" +#~ msgstr "нерэчаіснае выкарыстаньне `%T'" + +#, fuzzy +#~ msgid "invalid use of template type parameter" +#~ msgstr "нявернае выкарыстанне \"restict\"" + +#, fuzzy +#~ msgid "missing initializer for member `%D'" +#~ msgstr "прапушчан ініцыялізатар" + +#, fuzzy +#~ msgid "member `%D' with uninitialized const fields" +#~ msgstr "параметр \"%s\" ініцыялізаваны" + +#, fuzzy +#~ msgid "member `%D' is uninitialized reference" +#~ msgstr "параметр \"%s\" ініцыялізаваны" + +#~ msgid "warning:" +#~ msgstr "увага:" + +#, fuzzy +#~ msgid "In statement function" +#~ msgstr "вельмі шмат аргументаў у функцыі" + +#~ msgid "argument to `%s' missing" +#~ msgstr "аргумент для \"%s\" прапушчан" + +#, fuzzy +#~ msgid "Implicit declaration of `%A' at %0" +#~ msgstr "паўторнае абвяшчэнне меткі \"%s\"" + +#~ msgid "Unknown escape sequence `\\%A' at %0" +#~ msgstr "Невядомая ESC-паслядоўнасьць `\\%A' at %0" + +#, fuzzy +#~ msgid "Unterminated escape sequence `\\' at %0" +#~ msgstr "невядомая ESC-паслядоўнасць '\\%c'" + +#, fuzzy +#~ msgid "non-ISO escape sequence `\\%c'" +#~ msgstr "невядомая ESC-паслядоўнасць '\\%c'" + +#, fuzzy +#~ msgid "Zero-length character constant at %0" +#~ msgstr "пустая сімвальная канстанта" + +#, fuzzy +#~ msgid "Character constant at %0 has no closing apostrophe at %1" +#~ msgstr "сімвальная канстанта вельмі доўгая" + +#, fuzzy +#~ msgid "Unable to open INCLUDE file `%A' at %0" +#~ msgstr "немагу адчыніць файл \"%s\"" + +#, fuzzy +#~ msgid "Truncating characters on right side of character constant at %0" +#~ msgstr "мнагасімвальная сімвальная канстанта" + +#, fuzzy +#~ msgid "Array `%A' at %0 is too large to handle" +#~ msgstr "памер масіва \"%s\" вельмі вялікі" + +#, fuzzy +#~ msgid "Statement function `%A' defined at %0 is not used" +#~ msgstr "метка \"%s\" вызначана, але не выкарыстоўваецца" + +#~ msgid "In function" +#~ msgstr "У функцыі" + +#~ msgid "In program" +#~ msgstr "У праграме" + +#~ msgid "In construct" +#~ msgstr "У канструкцыі" + +#~ msgid "field '%s' not found in class" +#~ msgstr "поле \"%s\" не знойдзена ў класе" + +#~ msgid "abstract method in non-abstract class" +#~ msgstr "абстрактны метад у неабстрактным класе" + +#~ msgid "method '%s' not found in class" +#~ msgstr "метад \"%s\" не знойдзен у класе" + +#~ msgid "failed to find class '%s'" +#~ msgstr "не знойдзен клас \"%s\"" + +#~ msgid "missing field '%s' in '%s'" +#~ msgstr "прапушчана поле '%s' у '%s'" + +#, fuzzy +#~ msgid "mismatching signature for field '%s' in '%s'" +#~ msgstr "Прапушчана поле \"%s\" у \"%s\"" + +#, fuzzy +#~ msgid "can't expand %s" +#~ msgstr "не магу прачытаць з %s" + +#~ msgid "can't close %s" +#~ msgstr "не магу зачыніць %s" + +#~ msgid "cannot find file for class %s" +#~ msgstr "немагчыма знайсьці файл для кляса %s" + +#~ msgid "no input file specified" +#~ msgstr "не зададзены ўваходзячыя файлы" + +#~ msgid "can't close input file %s" +#~ msgstr "немагчыма зачыніць уваходзячы файл %s" + +#~ msgid "bad zip/jar file %s" +#~ msgstr "дрэнны zip/jar файл \"%s\"" + +#, fuzzy +#~ msgid "field initializer type mismatch" +#~ msgstr "нерэчаісны ініцыялізатар" + +#~ msgid "can't create directory %s" +#~ msgstr "немагчыма стварыць дырэкторыю \"%s\"" + +#~ msgid "can't open output file `%s'" +#~ msgstr "немагчыма адчыніць файл уводу `%s'" + +#~ msgid "file not found `%s'" +#~ msgstr "файл `%s' ня знойдзен" + +#~ msgid "cannot create temporary file" +#~ msgstr "немагчыма стварыць часовы файл" + +#, fuzzy +#~ msgid "can't mangle %s" +#~ msgstr "не магу зачыніць %s" + +#~ msgid "Missing name" +#~ msgstr "Прапушчана назва" + +#~ msgid "Missing class name" +#~ msgstr "Прапушчана назва класа" + +#~ msgid "Invalid declaration" +#~ msgstr "Нерэчаіснае абвяшчэнне" + +#~ msgid "Missing identifier" +#~ msgstr "Прапушчан ідэнтыфікатар" + +#~ msgid "unregistered operator %s" +#~ msgstr "нераспазнаны аператар %s" + +#, fuzzy +#~ msgid "cannot find protocol declaration for `%s'" +#~ msgstr "Не магу знайсці дэкларацыю пратакола для \"%s\"" + +#, fuzzy +#~ msgid "cannot find interface declaration for `%s'" +#~ msgstr "Не магу знайсці дэкларацыю інтэрфейса для \"%s\"" + +#, fuzzy +#~ msgid "cannot find reference tag for class `%s'" +#~ msgstr "Не магу знайсці файл для класа %s." + +#~ msgid "cannot find class `%s'" +#~ msgstr "немагчыма знайсьці кляс `%s'" + +#~ msgid "class `%s' already exists" +#~ msgstr "кляс `%s' ужо існуе" + +#, fuzzy +#~ msgid "cannot find interface declaration for `%s', superclass of `%s'" +#~ msgstr "Не магу знайсці дэкларацыю інтэрфейса для \"%s\"" + +#, fuzzy +#~ msgid "circular inheritance in interface declaration for `%s'" +#~ msgstr "Не магу знайсці дэкларацыю інтэрфейса для \"%s\"" + +#, fuzzy +#~ msgid "cannot find class (factory) method" +#~ msgstr "не магу знайсці метад." + +#, fuzzy +#~ msgid "method `%s' not implemented by protocol" +#~ msgstr "метад \"%s\" не знойдзен у класе" + +#~ msgid "cannot find method" +#~ msgstr "немагчыма знайсьці мэтад" + +#, fuzzy +#~ msgid "duplicate definition of class method `%s'" +#~ msgstr "паўторнае абвяшчэнне меткі \"%s\"" + +#, fuzzy +#~ msgid "duplicate declaration of class method `%s'" +#~ msgstr "паўторнае абвяшчэнне меткі \"%s\"" + +#, fuzzy +#~ msgid "duplicate declaration of instance method `%s'" +#~ msgstr "паўторнае абвяшчэнне меткі \"%s\"" + +#~ msgid "-pipe is not supported" +#~ msgstr "-pipe не падтрымліваецца" + +#~ msgid "-mhard-float not supported" +#~ msgstr "-mhard-float не падтрымліваецца" diff --git a/libcpp/po/ca.po b/libcpp/po/ca.po new file mode 100644 index 0000000..930aaef --- /dev/null +++ b/libcpp/po/ca.po @@ -0,0 +1,919 @@ +# translation of cpplib-4.0.1.po to Catalan +# Catalan translation of gcc. +# Copyright (C) 2003, 2005 Free Software Foundation, Inc. +# This file is distributed under the same license as the gcc package. +# +# Gilles MATEU , 2002. +# Gilles MATEU , 2003. +# Gilles MATEU , 2004. +# Mateu Gilles , 2005. +msgid "" +msgstr "" +"Project-Id-Version: cpplib-4.0.1\n" +"Report-Msgid-Bugs-To: http://gcc.gnu.org/bugs.html\n" +"POT-Creation-Date: 2007-11-08 21:08+0000\n" +"PO-Revision-Date: 2005-11-25 22:56+0100\n" +"Last-Translator: Mateu Gilles \n" +"Language-Team: Catalan \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" + +#: charset.c:654 +#, c-format +msgid "conversion from %s to %s not supported by iconv" +msgstr "iconv no dona suport a la conversió de %s a %s" + +#: charset.c:657 +msgid "iconv_open" +msgstr "iconv_open" + +#: charset.c:665 +#, c-format +msgid "no iconv implementation, cannot convert from %s to %s" +msgstr "cap implementació de iconv, no es pot convertir de %s a %s" + +#: charset.c:742 +#, c-format +msgid "character 0x%lx is not in the basic source character set\n" +msgstr "el caràcter 0x%lx no és en el joc de caràcters de base\n" + +#: charset.c:759 charset.c:1352 +msgid "converting to execution character set" +msgstr "convertint al joc de caràcters d'execució" + +#: charset.c:765 +#, c-format +msgid "character 0x%lx is not unibyte in execution character set" +msgstr "el caràcter 0x%lx no és mono octet en el joc de caràcters d'execució" + +#: charset.c:889 +#, c-format +msgid "Character %x might not be NFKC" +msgstr "" + +#: charset.c:949 +msgid "universal character names are only valid in C++ and C99" +msgstr "els noms de caràcter universals nomès són vàlids en C++ i C99" + +#: charset.c:952 +#, c-format +msgid "the meaning of '\\%c' is different in traditional C" +msgstr "el significat de \"\\%c\" és diferent en C tradicional" + +#: charset.c:961 +msgid "In _cpp_valid_ucn but not a UCN" +msgstr "" + +#: charset.c:986 +#, c-format +msgid "incomplete universal character name %.*s" +msgstr "el nom de caràcter universal %.*s és incomplet" + +#: charset.c:998 +#, c-format +msgid "%.*s is not a valid universal character" +msgstr "%.*s no és un caràcter universal vàlid" + +#: charset.c:1008 lex.c:484 +msgid "'$' in identifier or number" +msgstr "\"$\" en un identificador o un nombre" + +#: charset.c:1018 +#, c-format +msgid "universal character %.*s is not valid in an identifier" +msgstr "el nom de caràcter universal %.*s no és vàlid en un identificador" + +#: charset.c:1022 +#, c-format +msgid "universal character %.*s is not valid at the start of an identifier" +msgstr "el nom de caràcter universal %.*s no és vàlid a l'inici d'un identificador" + +#: charset.c:1056 charset.c:1571 +msgid "converting UCN to source character set" +msgstr "convertint UCN al joc font de caràcters" + +#: charset.c:1060 +msgid "converting UCN to execution character set" +msgstr "convertint UCN al joc de caràcters d'execució" + +#: charset.c:1132 +msgid "the meaning of '\\x' is different in traditional C" +msgstr "el significat de \"\\x\" és diferent en C tradicional" + +#: charset.c:1149 +msgid "\\x used with no following hex digits" +msgstr "es va usar \\x sense dígits hexadecimales a continuació" + +#: charset.c:1156 +msgid "hex escape sequence out of range" +msgstr "seqüència d'escapa hexadecimal fora de rang" + +#: charset.c:1195 +msgid "octal escape sequence out of range" +msgstr "seqüència d'escapa octal fora de rang" + +#: charset.c:1263 +msgid "the meaning of '\\a' is different in traditional C" +msgstr "el significat de \"\\a\" és diferent en C tradicional" + +#: charset.c:1270 +#, c-format +msgid "non-ISO-standard escape sequence, '\\%c'" +msgstr "seqüència d'escapa que no és estàndard ISO, \"\\%c\"" + +#: charset.c:1278 +#, c-format +msgid "unknown escape sequence '\\%c'" +msgstr "seqüència d'escapa \"\\%c\" desconeguda" + +#: charset.c:1286 +#, fuzzy, c-format +msgid "unknown escape sequence: '\\%s'" +msgstr "seqüència d'escapa \"\\%c\" desconeguda" + +#: charset.c:1293 +msgid "converting escape sequence to execution character set" +msgstr "convertint una seqüència d'escapa al joc de caràcters d'execució" + +#: charset.c:1415 charset.c:1478 +msgid "character constant too long for its type" +msgstr "constant de caràcter massa gran pel seu tipus" + +#: charset.c:1418 +msgid "multi-character character constant" +msgstr "constant de caràcter amb múltiples caràcters" + +#: charset.c:1510 +msgid "empty character constant" +msgstr "constant de caràter buida" + +#: charset.c:1612 +#, c-format +msgid "failure to convert %s to %s" +msgstr "fallada convertint %s a %s" + +#: directives.c:215 directives.c:241 +#, c-format +msgid "extra tokens at end of #%s directive" +msgstr "elements superflus al final de la directiva #%s" + +#: directives.c:344 +#, c-format +msgid "#%s is a GCC extension" +msgstr "#%s és una extenció del GCC" + +#: directives.c:356 +msgid "suggest not using #elif in traditional C" +msgstr "es suggereix no usar #elif en C tradicional" + +#: directives.c:359 +#, c-format +msgid "traditional C ignores #%s with the # indented" +msgstr "C tradicional ignora #%s amb el # indentat" + +#: directives.c:363 +#, c-format +msgid "suggest hiding #%s from traditional C with an indented #" +msgstr "es suggereix ocultar #%s del C tradicional amb el # indentat" + +#: directives.c:389 +msgid "embedding a directive within macro arguments is not portable" +msgstr "l'incrustació d'una directiva entre arguments de macro no és portable" + +#: directives.c:409 +msgid "style of line directive is a GCC extension" +msgstr "la directiva d'estil de línia és una extenció del GCC" + +#: directives.c:464 +#, c-format +msgid "invalid preprocessing directive #%s" +msgstr "directiva de preprocessament #%s invàlida" + +#: directives.c:532 +msgid "\"defined\" cannot be used as a macro name" +msgstr "\"defined\" no es pot usar com un nom de macro" + +#: directives.c:538 +#, c-format +msgid "\"%s\" cannot be used as a macro name as it is an operator in C++" +msgstr "no es pot usar \"%s\" com un nom de macro perquè és un operador en C++" + +#: directives.c:541 +#, c-format +msgid "no macro name given in #%s directive" +msgstr "no es va donar un nom de macro en la directiva #%s" + +#: directives.c:544 +msgid "macro names must be identifiers" +msgstr "els noms de macro han de ser identificadors" + +#: directives.c:585 +#, c-format +msgid "undefining \"%s\"" +msgstr "esborrant la definició de \"%s\"" + +#: directives.c:640 +msgid "missing terminating > character" +msgstr "falta el caràcter de terminació >" + +#: directives.c:695 +#, c-format +msgid "#%s expects \"FILENAME\" or " +msgstr "#%s espera \"NOM_DE_FITXER\" o " + +#: directives.c:739 +#, c-format +msgid "empty filename in #%s" +msgstr "nom de fitxer buit en #%s" + +#: directives.c:749 +msgid "#include nested too deeply" +msgstr "#include niat amb massa profunditat" + +#: directives.c:790 +msgid "#include_next in primary source file" +msgstr "#include_next en el fitxer font primari" + +#: directives.c:816 +#, c-format +msgid "invalid flag \"%s\" in line directive" +msgstr "indicador \"%s\" invàlid en la directiva de línia" + +#: directives.c:868 +#, c-format +msgid "\"%s\" after #line is not a positive integer" +msgstr "\"%s\" desprès de #line no és un enter positiu" + +#: directives.c:874 +msgid "line number out of range" +msgstr "nombre de línia fora de rang" + +#: directives.c:887 directives.c:964 +#, c-format +msgid "\"%s\" is not a valid filename" +msgstr "\"%s\" no és un nom de fitxer vàlid" + +#: directives.c:924 +#, c-format +msgid "\"%s\" after # is not a positive integer" +msgstr "\"%s\" desprès de # no és un enter positiu" + +#: directives.c:1026 +#, fuzzy, c-format +msgid "invalid #%s directive" +msgstr "directiva #ident invàlida" + +#: directives.c:1089 +#, c-format +msgid "registering pragmas in namespace \"%s\" with mismatched name expansion" +msgstr "" + +#: directives.c:1098 +#, fuzzy, c-format +msgid "registering pragma \"%s\" with name expansion and no namespace" +msgstr "desant \"%s\" com a pragma i espai de noms de pragma" + +#: directives.c:1116 +#, c-format +msgid "registering \"%s\" as both a pragma and a pragma namespace" +msgstr "desant \"%s\" com a pragma i espai de noms de pragma" + +#: directives.c:1119 +#, c-format +msgid "#pragma %s %s is already registered" +msgstr "ja s'ha desat #pragma %s %s" + +#: directives.c:1122 +#, c-format +msgid "#pragma %s is already registered" +msgstr "ja s'ha desat #pragma %s" + +#: directives.c:1152 +msgid "registering pragma with NULL handler" +msgstr "" + +#: directives.c:1362 +msgid "#pragma once in main file" +msgstr "#pragma una vegada en el fitxer principal" + +#: directives.c:1385 +msgid "invalid #pragma GCC poison directive" +msgstr "directiva #pragma de GCC enverinada invàlida" + +#: directives.c:1394 +#, c-format +msgid "poisoning existing macro \"%s\"" +msgstr "enverinant la macro existent \"%s\"" + +#: directives.c:1413 +msgid "#pragma system_header ignored outside include file" +msgstr "#pragma system_header ignorat fora del fitxer d'inclusió" + +#: directives.c:1437 +#, c-format +msgid "cannot find source file %s" +msgstr "no es pot trobar la font %s" + +#: directives.c:1441 +#, c-format +msgid "current file is older than %s" +msgstr "el fitxer actual és més vell que %s" + +#: directives.c:1620 +msgid "_Pragma takes a parenthesized string literal" +msgstr "_Pragma pren una cadena literal entre parèntesis" + +#: directives.c:1693 +msgid "#else without #if" +msgstr "#else sense #if" + +#: directives.c:1698 +msgid "#else after #else" +msgstr "#else després de #else" + +#: directives.c:1700 directives.c:1733 +msgid "the conditional began here" +msgstr "el condicional va començar aquí" + +#: directives.c:1726 +msgid "#elif without #if" +msgstr "#elif sense #if" + +#: directives.c:1731 +msgid "#elif after #else" +msgstr "#elif després de #else" + +#: directives.c:1761 +msgid "#endif without #if" +msgstr "#endif sense #if" + +#: directives.c:1838 +msgid "missing '(' after predicate" +msgstr "falta \"(\" abans del predicat" + +#: directives.c:1853 +msgid "missing ')' to complete answer" +msgstr "falta \")\" per a completar la resposta" + +#: directives.c:1873 +msgid "predicate's answer is empty" +msgstr "el predicat de la resposta està buit" + +#: directives.c:1900 +msgid "assertion without predicate" +msgstr "afirmació sense predicat" + +#: directives.c:1902 +msgid "predicate must be an identifier" +msgstr "el predicat ha de ser un identificador" + +#: directives.c:1988 +#, c-format +msgid "\"%s\" re-asserted" +msgstr "\"%s\" reafirmat" + +#: directives.c:2271 +#, c-format +msgid "unterminated #%s" +msgstr "#%s sense acabar" + +#: directives-only.c:221 lex.c:1016 traditional.c:162 +msgid "unterminated comment" +msgstr "comentari sense acabar" + +#: errors.c:118 +msgid "warning: " +msgstr "avís: " + +#: errors.c:120 +msgid "internal error: " +msgstr "error intern: " + +#: errors.c:122 +msgid "error: " +msgstr "error: " + +#: errors.c:186 +msgid "stdout" +msgstr "stdout" + +#: errors.c:188 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: expr.c:261 +msgid "too many decimal points in number" +msgstr "nombre amb massa punts decimals" + +#: expr.c:290 expr.c:365 +#, fuzzy +msgid "fixed-point constants are a GCC extension" +msgstr "les constants imaginàries són una extensió d'el GCC" + +#: expr.c:303 +#, fuzzy, c-format +msgid "invalid digit \"%c\" in binary constant" +msgstr "dígit \"%c\" invàlid en la constant octal" + +#: expr.c:305 +#, c-format +msgid "invalid digit \"%c\" in octal constant" +msgstr "dígit \"%c\" invàlid en la constant octal" + +#: expr.c:313 +#, fuzzy +msgid "invalid prefix \"0b\" for floating constant" +msgstr "sufix \"%.*s\" invàlid en la constant de coma flotant" + +#: expr.c:319 +msgid "use of C99 hexadecimal floating constant" +msgstr "ús d'una constant de coma flotant hexadecimal C99" + +#: expr.c:328 +msgid "exponent has no digits" +msgstr "exponent no té dígits" + +#: expr.c:335 +msgid "hexadecimal floating constants require an exponent" +msgstr "la constant de coma flotant hexadecimal requereix un exponent" + +#: expr.c:341 +#, c-format +msgid "invalid suffix \"%.*s\" on floating constant" +msgstr "sufix \"%.*s\" invàlid en la constant de coma flotant" + +#: expr.c:351 expr.c:393 +#, c-format +msgid "traditional C rejects the \"%.*s\" suffix" +msgstr "el C tradicional rebutja el sufix \"%.*s\"" + +#: expr.c:358 +#, fuzzy, c-format +msgid "invalid suffix \"%.*s\" with hexadecimal floating constant" +msgstr "sufix \"%.*s\" invàlid en la constant de coma flotant" + +#: expr.c:369 +#, fuzzy +msgid "decimal float constants are a GCC extension" +msgstr "les constants imaginàries són una extensió d'el GCC" + +#: expr.c:379 +#, c-format +msgid "invalid suffix \"%.*s\" on integer constant" +msgstr "sufix \"%.*s\" invàlid en constant entera" + +#: expr.c:401 +msgid "use of C99 long long integer constant" +msgstr "ús d'una constant entera long long C99" + +#: expr.c:409 +msgid "imaginary constants are a GCC extension" +msgstr "les constants imaginàries són una extensió d'el GCC" + +#: expr.c:412 +#, fuzzy +msgid "binary constants are a GCC extension" +msgstr "les constants imaginàries són una extensió d'el GCC" + +#: expr.c:505 +msgid "integer constant is too large for its type" +msgstr "la constant entera és massa gran pel seu tipus" + +#: expr.c:517 +msgid "integer constant is so large that it is unsigned" +msgstr "la constant entera és tan gran que és unsigned" + +#: expr.c:612 +msgid "missing ')' after \"defined\"" +msgstr "\")\" faltant després de \"defined\"" + +#: expr.c:619 +msgid "operator \"defined\" requires an identifier" +msgstr "l'operador \"defined\" requereix un identificador" + +#: expr.c:627 +#, c-format +msgid "(\"%s\" is an alternative token for \"%s\" in C++)" +msgstr "(\"%s\" és un element alternatiu per a \"%s\" en C++)" + +#: expr.c:637 +msgid "this use of \"defined\" may not be portable" +msgstr "aquest ùs de \"defined\" podria no ser portable" + +#: expr.c:676 +msgid "floating constant in preprocessor expression" +msgstr "constant de coma flotant en l'expressió del preprocessador" + +#: expr.c:682 +msgid "imaginary number in preprocessor expression" +msgstr "nombre imaginari en l'expressió del preprocessador" + +#: expr.c:727 +#, c-format +msgid "\"%s\" is not defined" +msgstr "\"%s\" no és definit" + +#: expr.c:855 expr.c:884 +#, c-format +msgid "missing binary operator before token \"%s\"" +msgstr "operador binari faltant abans de l'element \"%s\"" + +#: expr.c:875 +#, c-format +msgid "token \"%s\" is not valid in preprocessor expressions" +msgstr "l'element \"%s\" no és vàlid en les expressions del preprocesador" + +#: expr.c:892 +msgid "missing expression between '(' and ')'" +msgstr "expressión faltant entre \"(\" i \")\"" + +#: expr.c:895 +msgid "#if with no expression" +msgstr "#if sense expressió" + +#: expr.c:898 +#, c-format +msgid "operator '%s' has no right operand" +msgstr "l'operador \"%s\" no té operant de dreta" + +#: expr.c:903 +#, c-format +msgid "operator '%s' has no left operand" +msgstr "l'operador \"%s\" no té operant d'esquera" + +#: expr.c:929 +msgid " ':' without preceding '?'" +msgstr " \":\" sense \"?\" precedent" + +#: expr.c:956 +msgid "unbalanced stack in #if" +msgstr "pila desequilibrada en #if" + +#: expr.c:975 +#, c-format +msgid "impossible operator '%u'" +msgstr "operador \"%u\" impossible" + +#: expr.c:1065 +msgid "missing ')' in expression" +msgstr "\")\" faltant en l'expressió" + +#: expr.c:1086 +msgid "'?' without following ':'" +msgstr " \"?\" sense el \":\" següent" + +#: expr.c:1096 +msgid "integer overflow in preprocessor expression" +msgstr "desbordament d'enter en l'expressió del preprocessador" + +#: expr.c:1101 +msgid "missing '(' in expression" +msgstr "\"(\" faltant en l'expressió" + +#: expr.c:1133 +#, c-format +msgid "the left operand of \"%s\" changes sign when promoted" +msgstr "l'operant esquera de \"%s\" canvia el signe quan és promogut" + +#: expr.c:1138 +#, c-format +msgid "the right operand of \"%s\" changes sign when promoted" +msgstr "l'operant dreta de \"%s\" canvia el signe quan és promogut" + +#: expr.c:1397 +msgid "traditional C rejects the unary plus operator" +msgstr "C tradicional rebutja l'operador unari més" + +#: expr.c:1480 +msgid "comma operator in operand of #if" +msgstr "operador coma en operant de #if" + +#: expr.c:1612 +msgid "division by zero in #if" +msgstr "divisió per zero en #if" + +#: files.c:442 +msgid "NULL directory in find_file" +msgstr "directori NULL en find_file" + +#: files.c:480 +msgid "one or more PCH files were found, but they were invalid" +msgstr "un o més fitxers PCH varen ser trobats, però varen ser invàlids" + +#: files.c:483 +msgid "use -Winvalid-pch for more information" +msgstr "usi -Winvalid-pch per a més informació" + +#: files.c:570 +#, c-format +msgid "%s is a block device" +msgstr "%s és un dispositiu de blocs" + +#: files.c:587 +#, c-format +msgid "%s is too large" +msgstr "%s és massa gran" + +#: files.c:622 +#, c-format +msgid "%s is shorter than expected" +msgstr "%s és més curt qu'esperat" + +#: files.c:852 +#, c-format +msgid "no include path in which to search for %s" +msgstr "no hi ha ruta d'inclusió en la qual cercar %s" + +#: files.c:1157 +msgid "Multiple include guards may be useful for:\n" +msgstr "Múltiples guàrdies d'inclusió poden ser útils per a:\n" + +#: init.c:426 +msgid "cppchar_t must be an unsigned type" +msgstr "cppchar_t ha de ser d'un tipus unsigned" + +#: init.c:430 +#, c-format +msgid "preprocessor arithmetic has maximum precision of %lu bits; target requires %lu bits" +msgstr "l'aritmètica del preprocesador té una precisió màxima de %lu bits; l'objectiu requereix %lu bits" + +#: init.c:437 +msgid "CPP arithmetic must be at least as precise as a target int" +msgstr "l'aritmètica de CPP ha de ser almenys tan precisa com un int de l'objectiu" + +#: init.c:440 +msgid "target char is less than 8 bits wide" +msgstr "el char de l'objectiu té menys de 8 bits d'ampliaria" + +#: init.c:444 +msgid "target wchar_t is narrower than target char" +msgstr "el wchar_t de l'objectiu és més estret qu'el char de l'objectiu" + +#: init.c:448 +msgid "target int is narrower than target char" +msgstr "el int de l'objectiu és més estret qu'el char de l'objectiu" + +#: init.c:453 +msgid "CPP half-integer narrower than CPP character" +msgstr "el half-integer de CPP és més estret que el caràcter de CPP" + +#: init.c:457 +#, c-format +msgid "CPP on this host cannot handle wide character constants over %lu bits, but the target requires %lu bits" +msgstr "CPP no pot manejar constants de caràcter amples més enllà de %lu bits en aquest ordinador, però l'objectiu requereix %lu bits" + +#: lex.c:283 +msgid "backslash and newline separated by space" +msgstr "barra invertida i fi de línia separats per un espai" + +#: lex.c:288 +msgid "backslash-newline at end of file" +msgstr "barra invertida i nova línia al final del fitxer" + +#: lex.c:303 +#, c-format +msgid "trigraph ??%c converted to %c" +msgstr "trigraph ??%c convertit a %c" + +#: lex.c:310 +#, c-format +msgid "trigraph ??%c ignored, use -trigraphs to enable" +msgstr "s'ignora el trigraph ??%c, usi -trigraphs per permetre-ho" + +#: lex.c:356 +msgid "\"/*\" within comment" +msgstr "\"/*\" dintre d'un comentari" + +#: lex.c:414 +#, c-format +msgid "%s in preprocessing directive" +msgstr "%s en una directiva de preprocessament" + +#: lex.c:423 +msgid "null character(s) ignored" +msgstr "caràter(es) nul(s) ignorats" + +#: lex.c:460 +#, fuzzy, c-format +msgid "`%.*s' is not in NFKC" +msgstr "\"%s\" no és definit" + +#: lex.c:463 +#, fuzzy, c-format +msgid "`%.*s' is not in NFC" +msgstr "\"%s\" no és definit" + +#: lex.c:551 +#, c-format +msgid "attempt to use poisoned \"%s\"" +msgstr "intent d'usar \"%s\" enverinat" + +#: lex.c:559 +msgid "__VA_ARGS__ can only appear in the expansion of a C99 variadic macro" +msgstr "__VA_ARGS__ solament pot aparèixer en l'expansió d'una macro variadic C99" + +#: lex.c:659 +msgid "null character(s) preserved in literal" +msgstr "caràcter(es) nul(s) preservats en la literal" + +#: lex.c:662 +#, fuzzy, c-format +msgid "missing terminating %c character" +msgstr "falta el caràcter de terminació >" + +#: lex.c:1027 +msgid "C++ style comments are not allowed in ISO C90" +msgstr "els comentaris d'estil C++ no són permesos en ISO C90" + +#: lex.c:1029 +msgid "(this will be reported only once per input file)" +msgstr "(això es reportarà solament una vegada per cada fitxer d'entrada)" + +#: lex.c:1034 +msgid "multi-line comment" +msgstr "comentari en múltiples línies" + +#: lex.c:1347 +#, c-format +msgid "unspellable token %s" +msgstr "Element %s impronunciable" + +#: line-map.c:320 +#, c-format +msgid "In file included from %s:%u" +msgstr "En el fitxer inclòs dès de %s:%u" + +#: line-map.c:338 +#, c-format +msgid "" +",\n" +" from %s:%u" +msgstr "" +",\n" +" dès de %s:%u" + +#: macro.c:84 +#, c-format +msgid "macro \"%s\" is not used" +msgstr "no s'usa la macro \"%s\"" + +#: macro.c:123 macro.c:319 +#, c-format +msgid "invalid built-in macro \"%s\"" +msgstr "macro interna \"%s\" invàlida" + +#: macro.c:157 +#, fuzzy +msgid "could not determine file timestamp" +msgstr "no es pot determinar la data i l'hora" + +#: macro.c:254 +msgid "could not determine date and time" +msgstr "no es pot determinar la data i l'hora" + +#: macro.c:270 +msgid "__COUNTER__ expanded inside directive with -fdirectives-only" +msgstr "" + +#: macro.c:423 +msgid "invalid string literal, ignoring final '\\'" +msgstr "cadena literal invàlida, s'ignora el \"\\\" final" + +#: macro.c:483 +#, c-format +msgid "pasting \"%s\" and \"%s\" does not give a valid preprocessing token" +msgstr "enganxar \"%s\" i \"%s\" no dóna un element de preprocessament vàlid" + +#: macro.c:558 +msgid "ISO C99 requires rest arguments to be used" +msgstr "ISO C99 requereix que la resta dels arguments sigui usat" + +#: macro.c:563 +#, c-format +msgid "macro \"%s\" requires %u arguments, but only %u given" +msgstr "la macro \"%s\" requereix %u arguments, però només %u passats" + +#: macro.c:568 +#, c-format +msgid "macro \"%s\" passed %u arguments, but takes just %u" +msgstr "la macro \"%s\" va rebre %u arguments, però en va prendre solament %u" + +#: macro.c:679 traditional.c:680 +#, c-format +msgid "unterminated argument list invoking macro \"%s\"" +msgstr "llista d'arguments sense acabar a l'invocar la macro \"%s\"" + +#: macro.c:782 +#, c-format +msgid "function-like macro \"%s\" must be used with arguments in traditional C" +msgstr "la funció de macro \"%s\" s'ha d'usar amb arguments en C tradicional" + +#: macro.c:1325 +#, c-format +msgid "duplicate macro parameter \"%s\"" +msgstr "paràmetre de macro \"%s\" duplicat" + +#: macro.c:1371 +#, c-format +msgid "\"%s\" may not appear in macro parameter list" +msgstr "\"%s\" podria faltar en la llista de paràmetre de macro" + +#: macro.c:1379 +msgid "macro parameters must be comma-separated" +msgstr "els paràmetres de macro han de ser separats per comes" + +#: macro.c:1396 +msgid "parameter name missing" +msgstr "falta el nom del paràmetre" + +#: macro.c:1413 +msgid "anonymous variadic macros were introduced in C99" +msgstr "els macros variadic anònims es van introduir en C99" + +#: macro.c:1418 +msgid "ISO C does not permit named variadic macros" +msgstr "ISO C no permet macros variadic nomenats" + +#: macro.c:1427 +msgid "missing ')' in macro parameter list" +msgstr "\")\" faltant en la llista de paràmetres de macro" + +#: macro.c:1476 +msgid "'##' cannot appear at either end of a macro expansion" +msgstr "\"##\" no pot apareixer en o al final d'una expansió de macro" + +#: macro.c:1510 +msgid "ISO C99 requires whitespace after the macro name" +msgstr "ISO C99 requereix espais en blanc després del nom de macro" + +#: macro.c:1534 +msgid "missing whitespace after the macro name" +msgstr "espais en blanc faltant després del nom de macro" + +#: macro.c:1564 +msgid "'#' is not followed by a macro parameter" +msgstr "\"#\" no és seguit per un paràmetre de macro" + +#: macro.c:1683 +#, c-format +msgid "\"%s\" redefined" +msgstr "\"%s\" re-definit" + +#: macro.c:1688 +msgid "this is the location of the previous definition" +msgstr "aquesta és la ubicació de la definició prèvia" + +#: macro.c:1738 +#, c-format +msgid "macro argument \"%s\" would be stringified in traditional C" +msgstr "l'argument de macro \"%s\" hauria de ser convertit en cadena en C traditional" + +#: macro.c:1761 +#, c-format +msgid "invalid hash type %d in cpp_macro_definition" +msgstr "tipus de hash %d invàlid en cpp_macro_definition" + +#: pch.c:84 pch.c:332 pch.c:344 pch.c:362 pch.c:368 pch.c:377 +msgid "while writing precompiled header" +msgstr "mentre escrivint capçalera precompilada" + +#: pch.c:485 +#, c-format +msgid "%s: not used because `%.*s' not defined" +msgstr "%s: no utilitzat perquè \"%.*s\" no està definit" + +#: pch.c:497 +#, c-format +msgid "%s: not used because `%.*s' defined as `%s' not `%.*s'" +msgstr "%s: no utilitzat perquè \"%.*s\" està definit com a \"%s\" i no com a \"%.*s\"" + +#: pch.c:538 +#, c-format +msgid "%s: not used because `%s' is defined" +msgstr "%s: no utilitzat perquè \"%s\" és definit" + +#: pch.c:558 +#, fuzzy, c-format +msgid "%s: not used because `__COUNTER__' is invalid" +msgstr "%s: no utilitzat perquè \"%s\" és definit" + +#: pch.c:567 pch.c:737 +msgid "while reading precompiled header" +msgstr "mentre llegint capçalera precompilada" + +#: traditional.c:750 +#, c-format +msgid "detected recursion whilst expanding macro \"%s\"" +msgstr "whilst recursiu detectat en expandint la macro \"%s\"" + +#: traditional.c:917 +msgid "syntax error in macro parameter list" +msgstr "error sintàctic en la llista de paràmetre de macro" + +#~ msgid "unknown escape sequence: '\\%03o'" +#~ msgstr "seqüència d'escapa desconeguda: '\\%03o'" + +#~ msgid "no newline at end of file" +#~ msgstr "no hi ha caràcter de fi de línia al final del fitxer" diff --git a/libcpp/po/cpplib.pot b/libcpp/po/cpplib.pot new file mode 100644 index 0000000..fdd1c41 --- /dev/null +++ b/libcpp/po/cpplib.pot @@ -0,0 +1,927 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR Free Software Foundation, Inc. +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: http://gcc.gnu.org/bugs.html\n" +"POT-Creation-Date: 2007-11-08 21:08+0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: charset.c:654 +#, c-format +msgid "conversion from %s to %s not supported by iconv" +msgstr "" + +#: charset.c:657 +msgid "iconv_open" +msgstr "" + +#: charset.c:665 +#, c-format +msgid "no iconv implementation, cannot convert from %s to %s" +msgstr "" + +#: charset.c:742 +#, c-format +msgid "character 0x%lx is not in the basic source character set\n" +msgstr "" + +#: charset.c:759 +#: charset.c:1352 +msgid "converting to execution character set" +msgstr "" + +#: charset.c:765 +#, c-format +msgid "character 0x%lx is not unibyte in execution character set" +msgstr "" + +#: charset.c:889 +#, c-format +msgid "Character %x might not be NFKC" +msgstr "" + +#: charset.c:949 +msgid "universal character names are only valid in C++ and C99" +msgstr "" + +#: charset.c:952 +#, c-format +msgid "the meaning of '\\%c' is different in traditional C" +msgstr "" + +#: charset.c:961 +msgid "In _cpp_valid_ucn but not a UCN" +msgstr "" + +#: charset.c:986 +#, c-format +msgid "incomplete universal character name %.*s" +msgstr "" + +#: charset.c:998 +#, c-format +msgid "%.*s is not a valid universal character" +msgstr "" + +#: charset.c:1008 +#: lex.c:484 +msgid "'$' in identifier or number" +msgstr "" + +#: charset.c:1018 +#, c-format +msgid "universal character %.*s is not valid in an identifier" +msgstr "" + +#: charset.c:1022 +#, c-format +msgid "universal character %.*s is not valid at the start of an identifier" +msgstr "" + +#: charset.c:1056 +#: charset.c:1571 +msgid "converting UCN to source character set" +msgstr "" + +#: charset.c:1060 +msgid "converting UCN to execution character set" +msgstr "" + +#: charset.c:1132 +msgid "the meaning of '\\x' is different in traditional C" +msgstr "" + +#: charset.c:1149 +msgid "\\x used with no following hex digits" +msgstr "" + +#: charset.c:1156 +msgid "hex escape sequence out of range" +msgstr "" + +#: charset.c:1195 +msgid "octal escape sequence out of range" +msgstr "" + +#: charset.c:1263 +msgid "the meaning of '\\a' is different in traditional C" +msgstr "" + +#: charset.c:1270 +#, c-format +msgid "non-ISO-standard escape sequence, '\\%c'" +msgstr "" + +#: charset.c:1278 +#, c-format +msgid "unknown escape sequence '\\%c'" +msgstr "" + +#: charset.c:1286 +#, c-format +msgid "unknown escape sequence: '\\%s'" +msgstr "" + +#: charset.c:1293 +msgid "converting escape sequence to execution character set" +msgstr "" + +#: charset.c:1415 +#: charset.c:1478 +msgid "character constant too long for its type" +msgstr "" + +#: charset.c:1418 +msgid "multi-character character constant" +msgstr "" + +#: charset.c:1510 +msgid "empty character constant" +msgstr "" + +#: charset.c:1612 +#, c-format +msgid "failure to convert %s to %s" +msgstr "" + +#: directives.c:215 +#: directives.c:241 +#, c-format +msgid "extra tokens at end of #%s directive" +msgstr "" + +#: directives.c:344 +#, c-format +msgid "#%s is a GCC extension" +msgstr "" + +#: directives.c:356 +msgid "suggest not using #elif in traditional C" +msgstr "" + +#: directives.c:359 +#, c-format +msgid "traditional C ignores #%s with the # indented" +msgstr "" + +#: directives.c:363 +#, c-format +msgid "suggest hiding #%s from traditional C with an indented #" +msgstr "" + +#: directives.c:389 +msgid "embedding a directive within macro arguments is not portable" +msgstr "" + +#: directives.c:409 +msgid "style of line directive is a GCC extension" +msgstr "" + +#: directives.c:464 +#, c-format +msgid "invalid preprocessing directive #%s" +msgstr "" + +#: directives.c:532 +msgid "\"defined\" cannot be used as a macro name" +msgstr "" + +#: directives.c:538 +#, c-format +msgid "\"%s\" cannot be used as a macro name as it is an operator in C++" +msgstr "" + +#: directives.c:541 +#, c-format +msgid "no macro name given in #%s directive" +msgstr "" + +#: directives.c:544 +msgid "macro names must be identifiers" +msgstr "" + +#: directives.c:585 +#, c-format +msgid "undefining \"%s\"" +msgstr "" + +#: directives.c:640 +msgid "missing terminating > character" +msgstr "" + +#: directives.c:695 +#, c-format +msgid "#%s expects \"FILENAME\" or " +msgstr "" + +#: directives.c:739 +#, c-format +msgid "empty filename in #%s" +msgstr "" + +#: directives.c:749 +msgid "#include nested too deeply" +msgstr "" + +#: directives.c:790 +msgid "#include_next in primary source file" +msgstr "" + +#: directives.c:816 +#, c-format +msgid "invalid flag \"%s\" in line directive" +msgstr "" + +#: directives.c:868 +#, c-format +msgid "\"%s\" after #line is not a positive integer" +msgstr "" + +#: directives.c:874 +msgid "line number out of range" +msgstr "" + +#: directives.c:887 +#: directives.c:964 +#, c-format +msgid "\"%s\" is not a valid filename" +msgstr "" + +#: directives.c:924 +#, c-format +msgid "\"%s\" after # is not a positive integer" +msgstr "" + +#: directives.c:1026 +#, c-format +msgid "invalid #%s directive" +msgstr "" + +#: directives.c:1089 +#, c-format +msgid "registering pragmas in namespace \"%s\" with mismatched name expansion" +msgstr "" + +#: directives.c:1098 +#, c-format +msgid "registering pragma \"%s\" with name expansion and no namespace" +msgstr "" + +#: directives.c:1116 +#, c-format +msgid "registering \"%s\" as both a pragma and a pragma namespace" +msgstr "" + +#: directives.c:1119 +#, c-format +msgid "#pragma %s %s is already registered" +msgstr "" + +#: directives.c:1122 +#, c-format +msgid "#pragma %s is already registered" +msgstr "" + +#: directives.c:1152 +msgid "registering pragma with NULL handler" +msgstr "" + +#: directives.c:1362 +msgid "#pragma once in main file" +msgstr "" + +#: directives.c:1385 +msgid "invalid #pragma GCC poison directive" +msgstr "" + +#: directives.c:1394 +#, c-format +msgid "poisoning existing macro \"%s\"" +msgstr "" + +#: directives.c:1413 +msgid "#pragma system_header ignored outside include file" +msgstr "" + +#: directives.c:1437 +#, c-format +msgid "cannot find source file %s" +msgstr "" + +#: directives.c:1441 +#, c-format +msgid "current file is older than %s" +msgstr "" + +#: directives.c:1620 +msgid "_Pragma takes a parenthesized string literal" +msgstr "" + +#: directives.c:1693 +msgid "#else without #if" +msgstr "" + +#: directives.c:1698 +msgid "#else after #else" +msgstr "" + +#: directives.c:1700 +#: directives.c:1733 +msgid "the conditional began here" +msgstr "" + +#: directives.c:1726 +msgid "#elif without #if" +msgstr "" + +#: directives.c:1731 +msgid "#elif after #else" +msgstr "" + +#: directives.c:1761 +msgid "#endif without #if" +msgstr "" + +#: directives.c:1838 +msgid "missing '(' after predicate" +msgstr "" + +#: directives.c:1853 +msgid "missing ')' to complete answer" +msgstr "" + +#: directives.c:1873 +msgid "predicate's answer is empty" +msgstr "" + +#: directives.c:1900 +msgid "assertion without predicate" +msgstr "" + +#: directives.c:1902 +msgid "predicate must be an identifier" +msgstr "" + +#: directives.c:1988 +#, c-format +msgid "\"%s\" re-asserted" +msgstr "" + +#: directives.c:2271 +#, c-format +msgid "unterminated #%s" +msgstr "" + +#: directives-only.c:221 +#: lex.c:1016 +#: traditional.c:162 +msgid "unterminated comment" +msgstr "" + +#: errors.c:118 +msgid "warning: " +msgstr "" + +#: errors.c:120 +msgid "internal error: " +msgstr "" + +#: errors.c:122 +msgid "error: " +msgstr "" + +#: errors.c:186 +msgid "stdout" +msgstr "" + +#: errors.c:188 +#, c-format +msgid "%s: %s" +msgstr "" + +#: expr.c:261 +msgid "too many decimal points in number" +msgstr "" + +#: expr.c:290 +#: expr.c:365 +msgid "fixed-point constants are a GCC extension" +msgstr "" + +#: expr.c:303 +#, c-format +msgid "invalid digit \"%c\" in binary constant" +msgstr "" + +#: expr.c:305 +#, c-format +msgid "invalid digit \"%c\" in octal constant" +msgstr "" + +#: expr.c:313 +msgid "invalid prefix \"0b\" for floating constant" +msgstr "" + +#: expr.c:319 +msgid "use of C99 hexadecimal floating constant" +msgstr "" + +#: expr.c:328 +msgid "exponent has no digits" +msgstr "" + +#: expr.c:335 +msgid "hexadecimal floating constants require an exponent" +msgstr "" + +#: expr.c:341 +#, c-format +msgid "invalid suffix \"%.*s\" on floating constant" +msgstr "" + +#: expr.c:351 +#: expr.c:393 +#, c-format +msgid "traditional C rejects the \"%.*s\" suffix" +msgstr "" + +#: expr.c:358 +#, c-format +msgid "invalid suffix \"%.*s\" with hexadecimal floating constant" +msgstr "" + +#: expr.c:369 +msgid "decimal float constants are a GCC extension" +msgstr "" + +#: expr.c:379 +#, c-format +msgid "invalid suffix \"%.*s\" on integer constant" +msgstr "" + +#: expr.c:401 +msgid "use of C99 long long integer constant" +msgstr "" + +#: expr.c:409 +msgid "imaginary constants are a GCC extension" +msgstr "" + +#: expr.c:412 +msgid "binary constants are a GCC extension" +msgstr "" + +#: expr.c:505 +msgid "integer constant is too large for its type" +msgstr "" + +#: expr.c:517 +msgid "integer constant is so large that it is unsigned" +msgstr "" + +#: expr.c:612 +msgid "missing ')' after \"defined\"" +msgstr "" + +#: expr.c:619 +msgid "operator \"defined\" requires an identifier" +msgstr "" + +#: expr.c:627 +#, c-format +msgid "(\"%s\" is an alternative token for \"%s\" in C++)" +msgstr "" + +#: expr.c:637 +msgid "this use of \"defined\" may not be portable" +msgstr "" + +#: expr.c:676 +msgid "floating constant in preprocessor expression" +msgstr "" + +#: expr.c:682 +msgid "imaginary number in preprocessor expression" +msgstr "" + +#: expr.c:727 +#, c-format +msgid "\"%s\" is not defined" +msgstr "" + +#: expr.c:855 +#: expr.c:884 +#, c-format +msgid "missing binary operator before token \"%s\"" +msgstr "" + +#: expr.c:875 +#, c-format +msgid "token \"%s\" is not valid in preprocessor expressions" +msgstr "" + +#: expr.c:892 +msgid "missing expression between '(' and ')'" +msgstr "" + +#: expr.c:895 +msgid "#if with no expression" +msgstr "" + +#: expr.c:898 +#, c-format +msgid "operator '%s' has no right operand" +msgstr "" + +#: expr.c:903 +#, c-format +msgid "operator '%s' has no left operand" +msgstr "" + +#: expr.c:929 +msgid " ':' without preceding '?'" +msgstr "" + +#: expr.c:956 +msgid "unbalanced stack in #if" +msgstr "" + +#: expr.c:975 +#, c-format +msgid "impossible operator '%u'" +msgstr "" + +#: expr.c:1065 +msgid "missing ')' in expression" +msgstr "" + +#: expr.c:1086 +msgid "'?' without following ':'" +msgstr "" + +#: expr.c:1096 +msgid "integer overflow in preprocessor expression" +msgstr "" + +#: expr.c:1101 +msgid "missing '(' in expression" +msgstr "" + +#: expr.c:1133 +#, c-format +msgid "the left operand of \"%s\" changes sign when promoted" +msgstr "" + +#: expr.c:1138 +#, c-format +msgid "the right operand of \"%s\" changes sign when promoted" +msgstr "" + +#: expr.c:1397 +msgid "traditional C rejects the unary plus operator" +msgstr "" + +#: expr.c:1480 +msgid "comma operator in operand of #if" +msgstr "" + +#: expr.c:1612 +msgid "division by zero in #if" +msgstr "" + +#: files.c:442 +msgid "NULL directory in find_file" +msgstr "" + +#: files.c:480 +msgid "one or more PCH files were found, but they were invalid" +msgstr "" + +#: files.c:483 +msgid "use -Winvalid-pch for more information" +msgstr "" + +#: files.c:570 +#, c-format +msgid "%s is a block device" +msgstr "" + +#: files.c:587 +#, c-format +msgid "%s is too large" +msgstr "" + +#: files.c:622 +#, c-format +msgid "%s is shorter than expected" +msgstr "" + +#: files.c:852 +#, c-format +msgid "no include path in which to search for %s" +msgstr "" + +#: files.c:1157 +msgid "Multiple include guards may be useful for:\n" +msgstr "" + +#: init.c:426 +msgid "cppchar_t must be an unsigned type" +msgstr "" + +#: init.c:430 +#, c-format +msgid "" +"preprocessor arithmetic has maximum precision of %lu bits; target requires %" +"lu bits" +msgstr "" + +#: init.c:437 +msgid "CPP arithmetic must be at least as precise as a target int" +msgstr "" + +#: init.c:440 +msgid "target char is less than 8 bits wide" +msgstr "" + +#: init.c:444 +msgid "target wchar_t is narrower than target char" +msgstr "" + +#: init.c:448 +msgid "target int is narrower than target char" +msgstr "" + +#: init.c:453 +msgid "CPP half-integer narrower than CPP character" +msgstr "" + +#: init.c:457 +#, c-format +msgid "" +"CPP on this host cannot handle wide character constants over %lu bits, but " +"the target requires %lu bits" +msgstr "" + +#: lex.c:283 +msgid "backslash and newline separated by space" +msgstr "" + +#: lex.c:288 +msgid "backslash-newline at end of file" +msgstr "" + +#: lex.c:303 +#, c-format +msgid "trigraph ??%c converted to %c" +msgstr "" + +#: lex.c:310 +#, c-format +msgid "trigraph ??%c ignored, use -trigraphs to enable" +msgstr "" + +#: lex.c:356 +msgid "\"/*\" within comment" +msgstr "" + +#: lex.c:414 +#, c-format +msgid "%s in preprocessing directive" +msgstr "" + +#: lex.c:423 +msgid "null character(s) ignored" +msgstr "" + +#: lex.c:460 +#, c-format +msgid "`%.*s' is not in NFKC" +msgstr "" + +#: lex.c:463 +#, c-format +msgid "`%.*s' is not in NFC" +msgstr "" + +#: lex.c:551 +#, c-format +msgid "attempt to use poisoned \"%s\"" +msgstr "" + +#: lex.c:559 +msgid "__VA_ARGS__ can only appear in the expansion of a C99 variadic macro" +msgstr "" + +#: lex.c:659 +msgid "null character(s) preserved in literal" +msgstr "" + +#: lex.c:662 +#, c-format +msgid "missing terminating %c character" +msgstr "" + +#: lex.c:1027 +msgid "C++ style comments are not allowed in ISO C90" +msgstr "" + +#: lex.c:1029 +msgid "(this will be reported only once per input file)" +msgstr "" + +#: lex.c:1034 +msgid "multi-line comment" +msgstr "" + +#: lex.c:1347 +#, c-format +msgid "unspellable token %s" +msgstr "" + +#: line-map.c:320 +#, c-format +msgid "In file included from %s:%u" +msgstr "" + +#: line-map.c:338 +#, c-format +msgid "" +",\n" +" from %s:%u" +msgstr "" + +#: macro.c:84 +#, c-format +msgid "macro \"%s\" is not used" +msgstr "" + +#: macro.c:123 +#: macro.c:319 +#, c-format +msgid "invalid built-in macro \"%s\"" +msgstr "" + +#: macro.c:157 +msgid "could not determine file timestamp" +msgstr "" + +#: macro.c:254 +msgid "could not determine date and time" +msgstr "" + +#: macro.c:270 +msgid "__COUNTER__ expanded inside directive with -fdirectives-only" +msgstr "" + +#: macro.c:423 +msgid "invalid string literal, ignoring final '\\'" +msgstr "" + +#: macro.c:483 +#, c-format +msgid "pasting \"%s\" and \"%s\" does not give a valid preprocessing token" +msgstr "" + +#: macro.c:558 +msgid "ISO C99 requires rest arguments to be used" +msgstr "" + +#: macro.c:563 +#, c-format +msgid "macro \"%s\" requires %u arguments, but only %u given" +msgstr "" + +#: macro.c:568 +#, c-format +msgid "macro \"%s\" passed %u arguments, but takes just %u" +msgstr "" + +#: macro.c:679 +#: traditional.c:680 +#, c-format +msgid "unterminated argument list invoking macro \"%s\"" +msgstr "" + +#: macro.c:782 +#, c-format +msgid "function-like macro \"%s\" must be used with arguments in traditional C" +msgstr "" + +#: macro.c:1325 +#, c-format +msgid "duplicate macro parameter \"%s\"" +msgstr "" + +#: macro.c:1371 +#, c-format +msgid "\"%s\" may not appear in macro parameter list" +msgstr "" + +#: macro.c:1379 +msgid "macro parameters must be comma-separated" +msgstr "" + +#: macro.c:1396 +msgid "parameter name missing" +msgstr "" + +#: macro.c:1413 +msgid "anonymous variadic macros were introduced in C99" +msgstr "" + +#: macro.c:1418 +msgid "ISO C does not permit named variadic macros" +msgstr "" + +#: macro.c:1427 +msgid "missing ')' in macro parameter list" +msgstr "" + +#: macro.c:1476 +msgid "'##' cannot appear at either end of a macro expansion" +msgstr "" + +#: macro.c:1510 +msgid "ISO C99 requires whitespace after the macro name" +msgstr "" + +#: macro.c:1534 +msgid "missing whitespace after the macro name" +msgstr "" + +#: macro.c:1564 +msgid "'#' is not followed by a macro parameter" +msgstr "" + +#: macro.c:1683 +#, c-format +msgid "\"%s\" redefined" +msgstr "" + +#: macro.c:1688 +msgid "this is the location of the previous definition" +msgstr "" + +#: macro.c:1738 +#, c-format +msgid "macro argument \"%s\" would be stringified in traditional C" +msgstr "" + +#: macro.c:1761 +#, c-format +msgid "invalid hash type %d in cpp_macro_definition" +msgstr "" + +#: pch.c:84 +#: pch.c:332 +#: pch.c:344 +#: pch.c:362 +#: pch.c:368 +#: pch.c:377 +msgid "while writing precompiled header" +msgstr "" + +#: pch.c:485 +#, c-format +msgid "%s: not used because `%.*s' not defined" +msgstr "" + +#: pch.c:497 +#, c-format +msgid "%s: not used because `%.*s' defined as `%s' not `%.*s'" +msgstr "" + +#: pch.c:538 +#, c-format +msgid "%s: not used because `%s' is defined" +msgstr "" + +#: pch.c:558 +#, c-format +msgid "%s: not used because `__COUNTER__' is invalid" +msgstr "" + +#: pch.c:567 +#: pch.c:737 +msgid "while reading precompiled header" +msgstr "" + +#: traditional.c:750 +#, c-format +msgid "detected recursion whilst expanding macro \"%s\"" +msgstr "" + +#: traditional.c:917 +msgid "syntax error in macro parameter list" +msgstr "" diff --git a/libcpp/po/da.po b/libcpp/po/da.po new file mode 100644 index 0000000..5224116 --- /dev/null +++ b/libcpp/po/da.po @@ -0,0 +1,16177 @@ +# Danish version of GCC strings. +# Copyright (C) 2002, 03 Free Software Foundation, Inc. +# Ole Laursen , 2001, 02, 03. +# +# Konventioner: +# +# ABI -> binær grænseflade +# ANSI -> (har jeg tilladt mig at opdatere til (modsvarer Info-hjælpen)) ISO +# access -> tilgangs- +# aggregate -> en variabel af en sammensat type (fx struct, class) +# ambigeous -> tvetydig +# arg, argument -> parameter (for ikke at blande sammen med diskussionsargument) +# array -> tabel +# assembler -> maskinkodeoversætter +# assertion -> postulat +# attribute -> egenskab +# base class -> stamklasse +# basic block -> basisblok (funktioner deles op i disse under oversættelsen) +# braces -> krøllede paranteser +# braced-group -> sætningsblok +# branch -> forgrening +# buffer -> mellemlager +# cast -> typetildeling, omtvingelse af typen +# con-/destructor -> kon-/destruktionsfunktion +# conflicting -> modstridende +# convert -> konvertere, omdanne +# declared -> erklæret +# defaults to -> antages at være +# dereference -> følge +# discard -> fjerne +# discard -> kassere +# driver -> styringsprogram +# duplicate -> optræder mere end én gang; mangfoldiggøre +# edge list -> kantliste +# elt -> udtrykstræ +# endian -> endet (fx storendet, lillendet) +# endianness -> endethed +# exception handling -> håndtering af undtagelser +# excess -> for mange +# expansion -> udfoldning +# extra -> (ret ofte) overskydende +# floating point -> kommatal +# formals -> parametre +# format string -> formateringsstreng +# forward -> forhånd (f.eks. forhåndserklæring) +# frame table -> rammetabel +# friend -> ven(ne-) +# gp (general purpose) register -> alment register (havde først brug- med, med det er overflødigt) +# hard register -> hardware-register +# have no effect -> udvirker intet +# identifier -> kaldenavn +# incompatible -> uforenelig, passer ikke +# incomplete -> ufuldstændig +# initialize -> tildele startværdi, klargøre +# initializer -> startværdi +# initializer list -> klargøringsliste +# inline -> integrede, indbygges (eller som reserveret ord: inline) +# instance -> instans (fx af en klasse) +# issue (fx warnings) -> fremkom med +# iterator -> løkkevariabel +# junk -> ragelse +# keyword -> reserveret ord +# label -> etiket +# linking -> sammenkædning +# lvalue -> venstreværdi +# macro -> makro +# malformed -> forkert udformet, misdannet +# member function/method -> [medlems]funktion (metode i Objective C) +# mismatch -> passer ikke med +# mmap -> indlæse +# modifier, qualifier -> modifikation +# multiple inheritance -> multipel nedarvning +# newline -> linjeskift +# non-numeric -> ikke et tal +# null character -> nultegn +# null pointer -> nul[-]henvisning +# offset -> forskydning +# opcodes (til ovenstående) -> instruktioner +# out of range -> uden for det gyldige (til tider mulige) interval +# overflow -> (til tider) løber over +# overlap -> [interval]sammenfald +# overloading -> flertydiggørelse +# padding -> udfylning +# pass -> overbringe (fx parametre), videregive +# pointer -> henvisning[svariabel] +# preprocessor -> præprocessor +# profiling -> profilering +# promote -> forfremme +# request -> (til tider) forespørgsel +# return -> returnerer +# schedule -> planlæg +# scope -> virkningsfelt +# shadowing -> skygger for +# shift -> skift +# specified -> (oftest) angivet +# specifier -> anvisning, angivelse +# stab -> stik (?) +# statement -> sætning +# storage class -> lagringsklasse +# strict -> nøje +# string -> streng +# subscript -> indeks, opslag +# target -> mål[arkitektur] +# template -> skabelon +# thrown -> kastet +# token -> symbol +# top-level -> øverste niveau +# trigraphs ('??%c'-dimser) -> trigrafer +# undefine -> glemme definitionen +# undefined blahblah -> blahblah er ikke defineret +# underscore -> understreg +# universal-character-name -> universelt tegn[navn] +# unsigned -> uden fortegn +# varargs -> variable parameterlister +# variadic macro -> makro med vilkårligt antal parametre +# variabels -> variabler (med afslutnings-r) +# vtable -> virtuel tabel +# wide character -> bredtegn +# white space -> mellemrum +# whitespace -> mellemrum +# +# Reserverede ord ofte ikke oversat, ej heller er der anbragt ' omkring +# (fx unsigned -> unsigned; derimod function -> funktion). Forkortelser +# som decl (for declaration) og arg (for argument) er oversat uforkortet +# - der er jo masser af plads at tage af. +# +msgid "" +msgstr "" +"Project-Id-Version: gcc 3.3\n" +"Report-Msgid-Bugs-To: http://gcc.gnu.org/bugs.html\n" +"POT-Creation-Date: 2007-11-08 21:08+0000\n" +"PO-Revision-Date: 2003-05-25 18:00+0200\n" +"Last-Translator: Ole Laursen \n" +"Language-Team: Danish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" + +#: charset.c:654 +#, fuzzy, c-format +msgid "conversion from %s to %s not supported by iconv" +msgstr "konvertering fra NaN til unsigned int" + +#: charset.c:657 +msgid "iconv_open" +msgstr "" + +#: charset.c:665 +#, c-format +msgid "no iconv implementation, cannot convert from %s to %s" +msgstr "" + +#: charset.c:742 +#, fuzzy, c-format +msgid "character 0x%lx is not in the basic source character set\n" +msgstr "universelt tegnnavn står for '%c', som er en del af det basale kildekodetegnsæt" + +#: charset.c:759 charset.c:1352 +msgid "converting to execution character set" +msgstr "" + +#: charset.c:765 +#, c-format +msgid "character 0x%lx is not unibyte in execution character set" +msgstr "" + +#: charset.c:889 +#, c-format +msgid "Character %x might not be NFKC" +msgstr "" + +#: charset.c:949 +#, fuzzy +msgid "universal character names are only valid in C++ and C99" +msgstr "universelt tegn '\\U%08x' er ikke gyldigt i kaldenavne" + +#: charset.c:952 +#, c-format +msgid "the meaning of '\\%c' is different in traditional C" +msgstr "betydningen af '\\%c' er anderledes i traditionel C" + +#: charset.c:961 +msgid "In _cpp_valid_ucn but not a UCN" +msgstr "" + +#: charset.c:986 +#, fuzzy, c-format +msgid "incomplete universal character name %.*s" +msgstr "ufuldstændigt universelt tegnnavn" + +#: charset.c:998 +#, fuzzy, c-format +msgid "%.*s is not a valid universal character" +msgstr "'%T::%D' er ikke en gyldig erklærer" + +#: charset.c:1008 lex.c:484 +#, fuzzy +msgid "'$' in identifier or number" +msgstr "'$'-tegn i kaldenavn eller tal" + +#: charset.c:1018 +#, fuzzy, c-format +msgid "universal character %.*s is not valid in an identifier" +msgstr "universelt tegn '\\U%08x' er ikke gyldigt i kaldenavne" + +#: charset.c:1022 +#, fuzzy, c-format +msgid "universal character %.*s is not valid at the start of an identifier" +msgstr "universelt tegn '\\U%08x' er ikke gyldigt i kaldenavne" + +#: charset.c:1056 charset.c:1571 +#, fuzzy +msgid "converting UCN to source character set" +msgstr "konverterer NULL til en ikke-henvisningstype" + +#: charset.c:1060 +#, fuzzy +msgid "converting UCN to execution character set" +msgstr "konverterer NULL til en ikke-henvisningstype" + +#: charset.c:1132 +msgid "the meaning of '\\x' is different in traditional C" +msgstr "betydningen af '\\x' er anderledes i traditionel C" + +#: charset.c:1149 +msgid "\\x used with no following hex digits" +msgstr "\\x angivet uden efterfølgende hexadecimale cifre" + +#: charset.c:1156 +msgid "hex escape sequence out of range" +msgstr "den hexadecimale undvigesekvens er uden for det gyldige interval" + +#: charset.c:1195 +msgid "octal escape sequence out of range" +msgstr "den oktale undvigesekvens er uden for det gyldige interval" + +#: charset.c:1263 +msgid "the meaning of '\\a' is different in traditional C" +msgstr "betydningen af '\\a' er anderledes i traditionel C" + +#: charset.c:1270 +#, c-format +msgid "non-ISO-standard escape sequence, '\\%c'" +msgstr "undvigesekvensen '\\%c' er ikke ISO-standard" + +#: charset.c:1278 +#, c-format +msgid "unknown escape sequence '\\%c'" +msgstr "ukendt undvigesekvensen '\\%c'" + +#: charset.c:1286 +#, fuzzy, c-format +msgid "unknown escape sequence: '\\%s'" +msgstr "ukendt undvigesekvensen '\\%c'" + +#: charset.c:1293 +#, fuzzy +msgid "converting escape sequence to execution character set" +msgstr "undvigesekvens er uden for det gyldig interval for tegn" + +#: charset.c:1415 charset.c:1478 +msgid "character constant too long for its type" +msgstr "tegnkonstanten er for lang for dens type" + +#: charset.c:1418 +msgid "multi-character character constant" +msgstr "flerbyte-tegnkonstant" + +#: charset.c:1510 +msgid "empty character constant" +msgstr "tom tegnkonstant" + +#: charset.c:1612 +#, fuzzy, c-format +msgid "failure to convert %s to %s" +msgstr "kunne ikke konvertere '%E' til '%T'" + +#: directives.c:215 directives.c:241 +#, c-format +msgid "extra tokens at end of #%s directive" +msgstr "ekstra symboler i slutningen af #%s-direktiv" + +#: directives.c:344 +#, c-format +msgid "#%s is a GCC extension" +msgstr "#%s er en GCC-udvidelse" + +#: directives.c:356 +msgid "suggest not using #elif in traditional C" +msgstr "foreslår undladelse af brug af #elif i traditionel C" + +#: directives.c:359 +#, c-format +msgid "traditional C ignores #%s with the # indented" +msgstr "traditionel C ignorerer #%s når '#' er indrykket" + +#: directives.c:363 +#, c-format +msgid "suggest hiding #%s from traditional C with an indented #" +msgstr "foreslår at skjule #%s fra traditionel C vha. indrykket '#'" + +#: directives.c:389 +msgid "embedding a directive within macro arguments is not portable" +msgstr "indlejring af et direktiv inden i makroparametre er ikke portabelt" + +#: directives.c:409 +msgid "style of line directive is a GCC extension" +msgstr "linjestilsdirektiv er en GCC-udvidelse" + +#: directives.c:464 +#, c-format +msgid "invalid preprocessing directive #%s" +msgstr "ugyldigt præprocessordirektiv #%s" + +#: directives.c:532 +msgid "\"defined\" cannot be used as a macro name" +msgstr "\"defined\" kan ikke bruges som makronavn" + +#: directives.c:538 +#, c-format +msgid "\"%s\" cannot be used as a macro name as it is an operator in C++" +msgstr "\"%s\" kan ikke bruges som et makronavn da det er en operator i C++" + +#: directives.c:541 +#, c-format +msgid "no macro name given in #%s directive" +msgstr "intet makronavn angivet i direktivet #%s" + +#: directives.c:544 +msgid "macro names must be identifiers" +msgstr "makronavne skal være kaldenavne" + +#: directives.c:585 +#, c-format +msgid "undefining \"%s\"" +msgstr "glemmer definitionen af \"%s\"" + +#: directives.c:640 +msgid "missing terminating > character" +msgstr "manglende afsluttende '>'-tegn" + +#: directives.c:695 +#, c-format +msgid "#%s expects \"FILENAME\" or " +msgstr "#%s forventer \"FILNAVN\" eller " + +#: directives.c:739 +#, fuzzy, c-format +msgid "empty filename in #%s" +msgstr "tomt filnavn i #%s" + +#: directives.c:749 +msgid "#include nested too deeply" +msgstr "#include indlejret for dybt" + +#: directives.c:790 +msgid "#include_next in primary source file" +msgstr "#include_next i den primære kildekodefil" + +#: directives.c:816 +#, c-format +msgid "invalid flag \"%s\" in line directive" +msgstr "ugyldigt flag \"%s\" i linjedirektiv" + +#: directives.c:868 +#, c-format +msgid "\"%s\" after #line is not a positive integer" +msgstr "\"%s\" efter #line er ikke et positivt heltal" + +#: directives.c:874 +msgid "line number out of range" +msgstr "linjenummer er uden for det gyldige interval" + +#: directives.c:887 directives.c:964 +#, c-format +msgid "\"%s\" is not a valid filename" +msgstr "\"%s\" er ikke et ugyldigt filnavn" + +#: directives.c:924 +#, c-format +msgid "\"%s\" after # is not a positive integer" +msgstr "\"%s\" efter # er ikke et positivt heltal" + +#: directives.c:1026 +#, fuzzy, c-format +msgid "invalid #%s directive" +msgstr "ugyldigt #ident-direktiv" + +#: directives.c:1089 +#, c-format +msgid "registering pragmas in namespace \"%s\" with mismatched name expansion" +msgstr "" + +#: directives.c:1098 +#, fuzzy, c-format +msgid "registering pragma \"%s\" with name expansion and no namespace" +msgstr "registrerer \"%s\" som både et pragma og som et pragmanavnerum" + +#: directives.c:1116 +#, c-format +msgid "registering \"%s\" as both a pragma and a pragma namespace" +msgstr "registrerer \"%s\" som både et pragma og som et pragmanavnerum" + +#: directives.c:1119 +#, c-format +msgid "#pragma %s %s is already registered" +msgstr "#pragma %s %s er allerede registreret" + +#: directives.c:1122 +#, c-format +msgid "#pragma %s is already registered" +msgstr "#pragma %s er allerede registreret" + +#: directives.c:1152 +msgid "registering pragma with NULL handler" +msgstr "" + +#: directives.c:1362 +msgid "#pragma once in main file" +msgstr "'#pragma once' i hovedfil" + +#: directives.c:1385 +msgid "invalid #pragma GCC poison directive" +msgstr "ugyldigt #pragma GCC poison-direktiv" + +#: directives.c:1394 +#, c-format +msgid "poisoning existing macro \"%s\"" +msgstr "forgifter eksisterende makro \"%s\"" + +#: directives.c:1413 +msgid "#pragma system_header ignored outside include file" +msgstr "'#pragma system_header' ignoreret uden for inkluderingsfil" + +#: directives.c:1437 +#, fuzzy, c-format +msgid "cannot find source file %s" +msgstr "kan ikke finde kilden %s" + +#: directives.c:1441 +#, c-format +msgid "current file is older than %s" +msgstr "aktuel fil er ældre end %s" + +#: directives.c:1620 +msgid "_Pragma takes a parenthesized string literal" +msgstr "_Pragma tager en strengkonstant med paranteser omkring" + +#: directives.c:1693 +msgid "#else without #if" +msgstr "#else uden #if" + +#: directives.c:1698 +msgid "#else after #else" +msgstr "#else efter #else" + +#: directives.c:1700 directives.c:1733 +msgid "the conditional began here" +msgstr "betingelsen begyndte her" + +#: directives.c:1726 +msgid "#elif without #if" +msgstr "#elif uden #if" + +#: directives.c:1731 +msgid "#elif after #else" +msgstr "#elif efter #else" + +#: directives.c:1761 +msgid "#endif without #if" +msgstr "#endif uden #if" + +#: directives.c:1838 +msgid "missing '(' after predicate" +msgstr "manglende '(' efter udsagn" + +#: directives.c:1853 +msgid "missing ')' to complete answer" +msgstr "manglende ')' til at fuldføre svar" + +#: directives.c:1873 +msgid "predicate's answer is empty" +msgstr "udsagnets svar et tomt" + +#: directives.c:1900 +msgid "assertion without predicate" +msgstr "postulat uden udsagn" + +#: directives.c:1902 +msgid "predicate must be an identifier" +msgstr "udsagn skal være et kaldenavn" + +#: directives.c:1988 +#, c-format +msgid "\"%s\" re-asserted" +msgstr "\"%s\" genpostuleret" + +#: directives.c:2271 +#, c-format +msgid "unterminated #%s" +msgstr "uafsluttet #%s" + +#: directives-only.c:221 lex.c:1016 traditional.c:162 +msgid "unterminated comment" +msgstr "uafsluttet kommentar" + +#: errors.c:118 +msgid "warning: " +msgstr "advarsel: " + +#: errors.c:120 +msgid "internal error: " +msgstr "intern fejl: " + +#: errors.c:122 +#, fuzzy +msgid "error: " +msgstr "intern fejl: " + +#: errors.c:186 +msgid "stdout" +msgstr "std-ud" + +#: errors.c:188 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: expr.c:261 +msgid "too many decimal points in number" +msgstr "for mange decimalkommaer i tal" + +#: expr.c:290 expr.c:365 +#, fuzzy +msgid "fixed-point constants are a GCC extension" +msgstr "imaginære konstanter er en GCC-udvidelse" + +#: expr.c:303 +#, fuzzy, c-format +msgid "invalid digit \"%c\" in binary constant" +msgstr "ugyldig ciffer \"%c\" i oktal konstant" + +#: expr.c:305 +#, c-format +msgid "invalid digit \"%c\" in octal constant" +msgstr "ugyldig ciffer \"%c\" i oktal konstant" + +#: expr.c:313 +#, fuzzy +msgid "invalid prefix \"0b\" for floating constant" +msgstr "ugyldig endelse \"%.*s\" i kommatalskonstant" + +#: expr.c:319 +msgid "use of C99 hexadecimal floating constant" +msgstr "brug af C99 hexadecimal kommatalskonstant" + +#: expr.c:328 +msgid "exponent has no digits" +msgstr "der er ingen cifre i eksponent" + +#: expr.c:335 +msgid "hexadecimal floating constants require an exponent" +msgstr "hexadecimal kommatalskonstant skal have en eksponent" + +#: expr.c:341 +#, c-format +msgid "invalid suffix \"%.*s\" on floating constant" +msgstr "ugyldig endelse \"%.*s\" i kommatalskonstant" + +#: expr.c:351 expr.c:393 +#, c-format +msgid "traditional C rejects the \"%.*s\" suffix" +msgstr "traditionel C tillader ikke endelsen \"%.*s\"" + +#: expr.c:358 +#, fuzzy, c-format +msgid "invalid suffix \"%.*s\" with hexadecimal floating constant" +msgstr "ugyldig endelse \"%.*s\" i kommatalskonstant" + +#: expr.c:369 +#, fuzzy +msgid "decimal float constants are a GCC extension" +msgstr "imaginære konstanter er en GCC-udvidelse" + +#: expr.c:379 +#, c-format +msgid "invalid suffix \"%.*s\" on integer constant" +msgstr "ugyldig endelse \"%.*s\" i heltalskonstant" + +#: expr.c:401 +msgid "use of C99 long long integer constant" +msgstr "brug af ISO C99 long long-heltalskonstanter" + +#: expr.c:409 +msgid "imaginary constants are a GCC extension" +msgstr "imaginære konstanter er en GCC-udvidelse" + +#: expr.c:412 +#, fuzzy +msgid "binary constants are a GCC extension" +msgstr "imaginære konstanter er en GCC-udvidelse" + +#: expr.c:505 +msgid "integer constant is too large for its type" +msgstr "heltalskonstanten er for stor for dens type" + +#: expr.c:517 +msgid "integer constant is so large that it is unsigned" +msgstr "heltalskonstanten er så stor at den er unsigned" + +#: expr.c:612 +msgid "missing ')' after \"defined\"" +msgstr "manglende ')' efter \"defined\"" + +#: expr.c:619 +msgid "operator \"defined\" requires an identifier" +msgstr "operatoren \"defined\" kræver et kaldenavn" + +#: expr.c:627 +#, c-format +msgid "(\"%s\" is an alternative token for \"%s\" in C++)" +msgstr "(\"%s\" er et alternativt symbol for \"%s\" i C++)" + +#: expr.c:637 +msgid "this use of \"defined\" may not be portable" +msgstr "denne brug af \"defined\" er muligvis ikke portabel" + +#: expr.c:676 +msgid "floating constant in preprocessor expression" +msgstr "kommatalskonstant i præprocessorudtryk" + +#: expr.c:682 +msgid "imaginary number in preprocessor expression" +msgstr "imaginært tal i præprocessorudtryk" + +#: expr.c:727 +#, c-format +msgid "\"%s\" is not defined" +msgstr "\"%s\" er ikke defineret" + +#: expr.c:855 expr.c:884 +#, c-format +msgid "missing binary operator before token \"%s\"" +msgstr "manglende binær operator før symbolet \"%s\"" + +#: expr.c:875 +#, c-format +msgid "token \"%s\" is not valid in preprocessor expressions" +msgstr "symbolet \"%s\" er ikke gyldigt i præprocessorudtryk" + +#: expr.c:892 +#, fuzzy +msgid "missing expression between '(' and ')'" +msgstr "tomt udtryk mellem '(' og ')'" + +#: expr.c:895 +msgid "#if with no expression" +msgstr "#if uden noget udtryk" + +#: expr.c:898 +#, c-format +msgid "operator '%s' has no right operand" +msgstr "operatoren '%s' har ikke nogen højre operand" + +#: expr.c:903 +#, c-format +msgid "operator '%s' has no left operand" +msgstr "operatoren '%s' har ikke nogen venstre operand" + +#: expr.c:929 +msgid " ':' without preceding '?'" +msgstr " ':' uden forudgående '?'" + +#: expr.c:956 +msgid "unbalanced stack in #if" +msgstr "uafbalanceret stak i #if" + +#: expr.c:975 +#, c-format +msgid "impossible operator '%u'" +msgstr "umulig operator '%u'" + +#: expr.c:1065 +msgid "missing ')' in expression" +msgstr "manglende ')' i udtryk" + +#: expr.c:1086 +msgid "'?' without following ':'" +msgstr "'?' uden efterfølgende ':'" + +#: expr.c:1096 +msgid "integer overflow in preprocessor expression" +msgstr "heltallet løber over i præprocessorudtrykket" + +#: expr.c:1101 +msgid "missing '(' in expression" +msgstr "manglende '(' i udtryk" + +#: expr.c:1133 +#, c-format +msgid "the left operand of \"%s\" changes sign when promoted" +msgstr "den venstre operand til \"%s\" ændrer fortegn ved forfremmelse" + +#: expr.c:1138 +#, c-format +msgid "the right operand of \"%s\" changes sign when promoted" +msgstr "den højre operand til \"%s\" ændrer fortegn ved forfremmelse" + +#: expr.c:1397 +msgid "traditional C rejects the unary plus operator" +msgstr "traditionel C tillader ikke operatoren unær plus" + +#: expr.c:1480 +msgid "comma operator in operand of #if" +msgstr "kommeoperator i en operand til #if" + +#: expr.c:1612 +msgid "division by zero in #if" +msgstr "division med nul i #if" + +#: files.c:442 +msgid "NULL directory in find_file" +msgstr "" + +#: files.c:480 +msgid "one or more PCH files were found, but they were invalid" +msgstr "" + +#: files.c:483 +msgid "use -Winvalid-pch for more information" +msgstr "" + +#: files.c:570 +#, c-format +msgid "%s is a block device" +msgstr "%s er en blokenhed" + +#: files.c:587 +#, c-format +msgid "%s is too large" +msgstr "%s er for stor" + +#: files.c:622 +#, c-format +msgid "%s is shorter than expected" +msgstr "%s er kortere end forventet" + +#: files.c:852 +#, fuzzy, c-format +msgid "no include path in which to search for %s" +msgstr "der er ingen inkluderingssti at finde %s i" + +#: files.c:1157 +msgid "Multiple include guards may be useful for:\n" +msgstr "Flere inkluderingsvagter kan være nyttige til:\n" + +#: init.c:426 +msgid "cppchar_t must be an unsigned type" +msgstr "cppchar_t skal være en unsigned type" + +#: init.c:430 +#, c-format +msgid "preprocessor arithmetic has maximum precision of %lu bits; target requires %lu bits" +msgstr "præprocessorberegning har en maksimal præcision på %lu bit; målarkitektur kræver %lu bit" + +#: init.c:437 +msgid "CPP arithmetic must be at least as precise as a target int" +msgstr "CPP-beregning skal være mindst lige så præcis som en målarkitekturs int" + +#: init.c:440 +msgid "target char is less than 8 bits wide" +msgstr "målarkitekturs char er mindre end 8 bit bred" + +#: init.c:444 +msgid "target wchar_t is narrower than target char" +msgstr "målarkitekturs wchar_t er mindre end målarkitekturs char" + +#: init.c:448 +msgid "target int is narrower than target char" +msgstr "målarkitekturs int er mindre end målarkitekturs char" + +#: init.c:453 +msgid "CPP half-integer narrower than CPP character" +msgstr "CPP-halvheltal er mindre end CPP-tegn" + +#: init.c:457 +#, c-format +msgid "CPP on this host cannot handle wide character constants over %lu bits, but the target requires %lu bits" +msgstr "CPP på denne vært kan ikke håndtere bredtegnkonstanter over %lu bit, men målarkitekturen kræver %lu bit" + +#: lex.c:283 +msgid "backslash and newline separated by space" +msgstr "omvendt skråstreg og linjeskift er adskilt af mellemrum" + +#: lex.c:288 +msgid "backslash-newline at end of file" +msgstr "omvendt skråstreg efterfulgt af linjeskift ved slutningen af filen" + +#: lex.c:303 +#, c-format +msgid "trigraph ??%c converted to %c" +msgstr "trigrafen ??%c konverteret til %c" + +#: lex.c:310 +#, fuzzy, c-format +msgid "trigraph ??%c ignored, use -trigraphs to enable" +msgstr "trigrafen ??%c ignoreret" + +#: lex.c:356 +msgid "\"/*\" within comment" +msgstr "\"/*\" i en kommentar" + +#: lex.c:414 +#, c-format +msgid "%s in preprocessing directive" +msgstr "%s i præprocessordirektiv" + +#: lex.c:423 +msgid "null character(s) ignored" +msgstr "nultegn ignoreret" + +#: lex.c:460 +#, fuzzy, c-format +msgid "`%.*s' is not in NFKC" +msgstr "\"%s\" er ikke defineret" + +#: lex.c:463 +#, fuzzy, c-format +msgid "`%.*s' is not in NFC" +msgstr "\"%s\" er ikke defineret" + +#: lex.c:551 +#, c-format +msgid "attempt to use poisoned \"%s\"" +msgstr "forsøg på at bruge forgiftet \"%s\"" + +#: lex.c:559 +msgid "__VA_ARGS__ can only appear in the expansion of a C99 variadic macro" +msgstr "__VA_ARGS__ kan kun optræde i udfoldelsen af en C99-makro med vilkårligt antal parametre" + +#: lex.c:659 +msgid "null character(s) preserved in literal" +msgstr "nultegn bevaret i strengkonstant" + +#: lex.c:662 +#, c-format +msgid "missing terminating %c character" +msgstr "manglende afsluttende '%c'-tegn" + +#: lex.c:1027 +msgid "C++ style comments are not allowed in ISO C90" +msgstr "kommentarer i C++-stil er ikke tilladt i ISO C90" + +#: lex.c:1029 +msgid "(this will be reported only once per input file)" +msgstr "(dette rapporteres kun en enkelt gang per inddatafil)" + +#: lex.c:1034 +msgid "multi-line comment" +msgstr "flerlinjers kommentar" + +#: lex.c:1347 +#, c-format +msgid "unspellable token %s" +msgstr "symbol %s kan ikke staves" + +#: line-map.c:320 +#, c-format +msgid "In file included from %s:%u" +msgstr "I filen inkluderet af %s:%u" + +#: line-map.c:338 +#, c-format +msgid "" +",\n" +" from %s:%u" +msgstr "" +",\n" +" af %s:%u" + +#: macro.c:84 +#, c-format +msgid "macro \"%s\" is not used" +msgstr "makroen \"%s\" bliver ikke brugt" + +#: macro.c:123 macro.c:319 +#, c-format +msgid "invalid built-in macro \"%s\"" +msgstr "ugyldig indbygget makro \"%s\"" + +#: macro.c:157 +#, fuzzy +msgid "could not determine file timestamp" +msgstr "kunne ikke bestemme dato og tid" + +#: macro.c:254 +msgid "could not determine date and time" +msgstr "kunne ikke bestemme dato og tid" + +#: macro.c:270 +msgid "__COUNTER__ expanded inside directive with -fdirectives-only" +msgstr "" + +#: macro.c:423 +msgid "invalid string literal, ignoring final '\\'" +msgstr "ugyldig strengkonstant, ignorerer afsluttende '\\'" + +#: macro.c:483 +#, c-format +msgid "pasting \"%s\" and \"%s\" does not give a valid preprocessing token" +msgstr "indsættelse af \"%s\" og \"%s\" giver ikke et gyldigt præprocessorsymbol" + +#: macro.c:558 +msgid "ISO C99 requires rest arguments to be used" +msgstr "ISO C99 påkræver at restparametrene skal bruges" + +#: macro.c:563 +#, c-format +msgid "macro \"%s\" requires %u arguments, but only %u given" +msgstr "makroen \"%s\" kræver %u parametre, men modtager kun %u" + +#: macro.c:568 +#, c-format +msgid "macro \"%s\" passed %u arguments, but takes just %u" +msgstr "makroen \"%s\" bliver viderebragt %u parametre, men tager kun mod %u" + +#: macro.c:679 traditional.c:680 +#, c-format +msgid "unterminated argument list invoking macro \"%s\"" +msgstr "uafsluttet parameterliste ved kald af makroen \"%s\"" + +#: macro.c:782 +#, c-format +msgid "function-like macro \"%s\" must be used with arguments in traditional C" +msgstr "funktionsagtig makro \"%s\" skal bruges med parametre i traditionel C" + +#: macro.c:1325 +#, c-format +msgid "duplicate macro parameter \"%s\"" +msgstr "makroparameternavnet \"%s\" optræder mere end én gang" + +#: macro.c:1371 +#, c-format +msgid "\"%s\" may not appear in macro parameter list" +msgstr "\"%s\" må ikke optræde i makroparameterliste" + +#: macro.c:1379 +msgid "macro parameters must be comma-separated" +msgstr "makroparametre skal være komma-adskilte" + +#: macro.c:1396 +msgid "parameter name missing" +msgstr "parameternavn mangler" + +#: macro.c:1413 +msgid "anonymous variadic macros were introduced in C99" +msgstr "anonyme makroer med vilkårligt antal parametre blev introduceret i C99" + +#: macro.c:1418 +msgid "ISO C does not permit named variadic macros" +msgstr "ISO C tillader ikke navngivne makroer med vilkårligt antal parametre" + +#: macro.c:1427 +msgid "missing ')' in macro parameter list" +msgstr "manglende ')' i makroparameterliste" + +#: macro.c:1476 +msgid "'##' cannot appear at either end of a macro expansion" +msgstr "'##' må ikke optræde ved nogen af enderne i en makrokrop" + +#: macro.c:1510 +#, fuzzy +msgid "ISO C99 requires whitespace after the macro name" +msgstr "ISO C påkræver mellemrum efter makronavnet" + +#: macro.c:1534 +#, fuzzy +msgid "missing whitespace after the macro name" +msgstr "ISO C påkræver mellemrum efter makronavnet" + +#: macro.c:1564 +msgid "'#' is not followed by a macro parameter" +msgstr "'#' efterfølges ikke af en makroparameter" + +#: macro.c:1683 +#, c-format +msgid "\"%s\" redefined" +msgstr "\"%s\" omdefineret" + +#: macro.c:1688 +msgid "this is the location of the previous definition" +msgstr "den foregående definition er her" + +#: macro.c:1738 +#, c-format +msgid "macro argument \"%s\" would be stringified in traditional C" +msgstr "makroparameteren \"%s\" ville blive gjort til en streng i traditionel C" + +#: macro.c:1761 +#, c-format +msgid "invalid hash type %d in cpp_macro_definition" +msgstr "ugyldig hashtype %d i cpp_macro_definition" + +#: pch.c:84 pch.c:332 pch.c:344 pch.c:362 pch.c:368 pch.c:377 +msgid "while writing precompiled header" +msgstr "" + +#: pch.c:485 +#, fuzzy, c-format +msgid "%s: not used because `%.*s' not defined" +msgstr "etiketten '%s' er benyttet, men ikke defineret" + +#: pch.c:497 +#, c-format +msgid "%s: not used because `%.*s' defined as `%s' not `%.*s'" +msgstr "" + +#: pch.c:538 +#, fuzzy, c-format +msgid "%s: not used because `%s' is defined" +msgstr "'%s' brugt, men aldrig defineret" + +#: pch.c:558 +#, c-format +msgid "%s: not used because `__COUNTER__' is invalid" +msgstr "" + +#: pch.c:567 pch.c:737 +msgid "while reading precompiled header" +msgstr "" + +#: traditional.c:750 +#, c-format +msgid "detected recursion whilst expanding macro \"%s\"" +msgstr "opdagede rekursion ved udfoldelse af makroen \"%s\"" + +#: traditional.c:917 +#, fuzzy +msgid "syntax error in macro parameter list" +msgstr "\"%s\" må ikke optræde i makroparameterliste" + +#~ msgid "`%s' attribute directive ignored" +#~ msgstr "egenskabsdirektivet '%s' ignoreret" + +#~ msgid "wrong number of arguments specified for `%s' attribute" +#~ msgstr "forkert antal parametre angivet til egenskaben '%s'" + +#~ msgid "`%s' attribute does not apply to types" +#~ msgstr "egenskaben '%s' kan ikke anvendes på typer" + +#~ msgid "`%s' attribute only applies to function types" +#~ msgstr "egenskaben '%s' kan kun anvendes sammen med funktionstyper" + +#~ msgid "`%s' attribute ignored" +#~ msgstr "egenskaben '%s' ignoreret" + +#~ msgid "offset outside bounds of constant string" +#~ msgstr "forskydning udenfor grænserne af konstant streng" + +#~ msgid "second arg to `__builtin_prefetch' must be a constant" +#~ msgstr "den anden parameter til '__builtin_prefetch' skal være en konstant" + +#~ msgid "invalid second arg to __builtin_prefetch; using zero" +#~ msgstr "ugyldig anden parameter til '__builtin_prefetch'; benytter nul" + +#~ msgid "third arg to `__builtin_prefetch' must be a constant" +#~ msgstr "en tredje parameter til '__builtin_prefetch' skal være en konstant" + +#~ msgid "invalid third arg to __builtin_prefetch; using zero" +#~ msgstr "ugyldig tredje parameter til '__builtin_prefetch'; benytter nul" + +#~ msgid "__builtin_saveregs not supported by this target" +#~ msgstr "__builtin_saveregs understøttes ikke af denne målarkitektur" + +#~ msgid "argument of `__builtin_args_info' must be constant" +#~ msgstr "parameteren til '__builtin_args_info' skal være konstant" + +#~ msgid "argument of `__builtin_args_info' out of range" +#~ msgstr "parameteren til '__builtin_args_info' er uden for det gyldige interval" + +#~ msgid "missing argument in `__builtin_args_info'" +#~ msgstr "manglende parameter i '__builtin_args_info'" + +#~ msgid "`va_start' used in function with fixed args" +#~ msgstr "`va_start' benyttet i en funktion med fast antal parametre" + +#~ msgid "second parameter of `va_start' not last named argument" +#~ msgstr "den anden parameter til 'va_start' er ikke den sidste navngivne parameter" + +#~ msgid "`__builtin_next_arg' called without an argument" +#~ msgstr "`__builtin_next_arg' kaldt uden en parameter" + +#~ msgid "too many arguments to function `va_start'" +#~ msgstr "for mange parametre til funktionen 'va_start'" + +#~ msgid "first argument to `va_arg' not of type `va_list'" +#~ msgstr "den første parameter til 'va_arg' er ikke af typen 'va_list'" + +#~ msgid "`%s' is promoted to `%s' when passed through `...'" +#~ msgstr "'%s' forfremmes til '%s' ved overbringelse gennem '...'" + +#~ msgid "(so you should pass `%s' not `%s' to `va_arg')" +#~ msgstr "(så du skal overbring '%s' ikke '%s' til 'va_arg')" + +#~ msgid "invalid arg to `__builtin_frame_address'" +#~ msgstr "ugyldig parameter til '__builtin_frame_address'" + +#~ msgid "invalid arg to `__builtin_return_address'" +#~ msgstr "ugyldig parameter til '__builtin_return_address'" + +#~ msgid "unsupported arg to `__builtin_frame_address'" +#~ msgstr "ikke-understøttet parameter til '__builtin_frame_address'" + +#~ msgid "unsupported arg to `__builtin_return_address'" +#~ msgstr "ikke-understøttet parameter til '__builtin_return_address'" + +#~ msgid "second arg to `__builtin_expect' must be a constant" +#~ msgstr "den anden parameter til '__builtin_expect' skal være en konstant" + +#~ msgid "__builtin_longjmp second argument must be 1" +#~ msgstr "den anden paramter til '__builtin_longjmp' skal være 1" + +#~ msgid "built-in function `%s' not currently supported" +#~ msgstr "den indbyggede funktion '%s' understøttes i øjeblikket ikke" + +#~ msgid "target format does not support infinity" +#~ msgstr "målprocessoren understøtter ikke uendelig" + +#~ msgid "`%s' is not defined outside of function scope" +#~ msgstr "'%s' er ikke defineret uden for funktionsvirkefelt" + +#~ msgid "string length `%d' is greater than the length `%d' ISO C%d compilers are required to support" +#~ msgstr "strenglængden '%d' er større end den længde på '%d' som ISO C%d-oversættere er pålagt at understøtte" + +#~ msgid "concatenation of string literals with __FUNCTION__ is deprecated" +#~ msgstr "sammensætning af strengkonstanter med __FUNCTION__ er forældet" + +#~ msgid "overflow in constant expression" +#~ msgstr "overløb i konstant udtryk" + +#~ msgid "integer overflow in expression" +#~ msgstr "heltalsoverløb i udtryk" + +#~ msgid "floating point overflow in expression" +#~ msgstr "kommatalsoverløb i udtryk" + +#~ msgid "vector overflow in expression" +#~ msgstr "vektoroverløb i udtryk" + +#~ msgid "large integer implicitly truncated to unsigned type" +#~ msgstr "stort heltal forkortes underforstået til type uden fortegn" + +#~ msgid "negative integer implicitly converted to unsigned type" +#~ msgstr "negativt heltal forkortes underforstået til type uden fortegn" + +#~ msgid "overflow in implicit constant conversion" +#~ msgstr "overløb i underforstået konstant konvertering" + +#~ msgid "operation on `%s' may be undefined" +#~ msgstr "brug af '%s' er muligvis ikke defineret" + +#~ msgid "expression statement has incomplete type" +#~ msgstr "udtrykket er af en ufuldstændig type" + +#~ msgid "case label does not reduce to an integer constant" +#~ msgstr "case-etiketten kan ikke reduceres til en heltalskonstant" + +#~ msgid "invalid truth-value expression" +#~ msgstr "ugyldigt sandhedsværdiudtryk" + +#~ msgid "invalid operands to binary %s" +#~ msgstr "ugyldige operander til binær %s" + +#~ msgid "comparison is always false due to limited range of data type" +#~ msgstr "sammenligning er altid falsk på grund af den begrænsede rækkevidde af datatypen" + +#~ msgid "comparison is always true due to limited range of data type" +#~ msgstr "sammenligning er altid sand på grund af den begrænsede rækkevidde af datatypen" + +#~ msgid "comparison of unsigned expression >= 0 is always true" +#~ msgstr "sammenligning med unsigned udtryk >= 0 er altid sand" + +#~ msgid "comparison of unsigned expression < 0 is always false" +#~ msgstr "sammenligning med unsigned udtryk < 0 er altid falsk" + +#~ msgid "pointer of type `void *' used in arithmetic" +#~ msgstr "henvisning af typen 'void *' benyttet i udregning" + +#~ msgid "pointer to a function used in arithmetic" +#~ msgstr "henvisning til en funktion benyttet i udregning" + +#~ msgid "pointer to member function used in arithmetic" +#~ msgstr "henvisning til en medlemsfunktion benyttet i udregning" + +#~ msgid "pointer to a member used in arithmetic" +#~ msgstr "henvisning til et medlem benyttet i udregning" + +#~ msgid "struct type value used where scalar is required" +#~ msgstr "værdi af struct-type angivet hvor skalar er påkrævet" + +#~ msgid "union type value used where scalar is required" +#~ msgstr "værdi af union-type angivet hvor skalar er påkrævet" + +#~ msgid "array type value used where scalar is required" +#~ msgstr "værdi af tabeltype angivet hvor skalar er påkrævet" + +#~ msgid "suggest parentheses around assignment used as truth value" +#~ msgstr "foreslår paranteser omkring tildeling der er benyttet som boolsk værdi" + +#~ msgid "invalid use of `restrict'" +#~ msgstr "ugyldig brug af 'restrict'" + +#~ msgid "invalid application of `sizeof' to a function type" +#~ msgstr "ugyldig anvendelse af 'sizeof' på en funktionstype" + +#~ msgid "invalid application of `%s' to a void type" +#~ msgstr "ugyldig anvendelse af '%s' på en void-type" + +#~ msgid "invalid application of `%s' to an incomplete type" +#~ msgstr "ugyldig anvendelse af '%s' på en ufuldstændig type" + +#~ msgid "`__alignof' applied to a bit-field" +#~ msgstr "'__alignof' benyttet på et bitfelt" + +#~ msgid "cannot disable built-in function `%s'" +#~ msgstr "kan ikke deaktivere den indbyggede funktion '%s'" + +#~ msgid "too few arguments to function `%s'" +#~ msgstr "for få parametre til funktionen '%s'" + +#~ msgid "too many arguments to function `%s'" +#~ msgstr "for mange parametre til funktionen '%s'" + +#~ msgid "non-floating-point argument to function `%s'" +#~ msgstr "parameter der ikke er et kommatal, til funktionen '%s'" + +#~ msgid "pointers are not permitted as case values" +#~ msgstr "henvisningsvariabler er ikke tilladt som case-værdier" + +#~ msgid "ISO C++ forbids range expressions in switch statements" +#~ msgstr "ISO C++ forbyder intervaludtryk i switch-sætninger" + +#~ msgid "ISO C forbids range expressions in switch statements" +#~ msgstr "ISO C forbyder intervaludtryk i switch-sætninger" + +#~ msgid "empty range specified" +#~ msgstr "tomt interval angivet" + +#~ msgid "duplicate (or overlapping) case value" +#~ msgstr "case-værdi optræder mere end én gang (måske pga. intervalsammenfald)" + +#~ msgid "this is the first entry overlapping that value" +#~ msgstr "dette er det første punkt som falder sammen med den værdi" + +#~ msgid "duplicate case value" +#~ msgstr "case-værdi optræder mere end én gang" + +#~ msgid "previously used here" +#~ msgstr "tidligere benyttet her" + +#~ msgid "multiple default labels in one switch" +#~ msgstr "flere default-etiketter i én switch-konstruktion" + +#~ msgid "this is the first default label" +#~ msgstr "dette er den første default-etiket" + +#~ msgid "ISO C++ forbids taking the address of a label" +#~ msgstr "ISO C++ forbyder at tage adressen af en etiket" + +#~ msgid "ISO C forbids taking the address of a label" +#~ msgstr "ISO C forbyder at tage adressen af en etiket" + +#~ msgid "declaration of `%s' shadows %s" +#~ msgstr "erklæring af '%s' skygger for '%s'" + +#~ msgid "unknown machine mode `%s'" +#~ msgstr "ukendt maskintilstand '%s'" + +#~ msgid "no data type for mode `%s'" +#~ msgstr "ingen datatype til tilstanden '%s'" + +#~ msgid "unable to emulate '%s'" +#~ msgstr "kunne ikke emulere '%s'" + +#~ msgid "section attribute cannot be specified for local variables" +#~ msgstr "sektionsegenskaben kan ikke angives for lokale variabler" + +#~ msgid "section of `%s' conflicts with previous declaration" +#~ msgstr "sektionen '%s' strider mod tidligere erklæring" + +#~ msgid "section attribute not allowed for `%s'" +#~ msgstr "sektionsegenskaben er ikke tilladt for '%s'" + +#~ msgid "section attributes are not supported for this target" +#~ msgstr "sektionsegenskaber understøttes ikke på denne målarkitektur" + +#~ msgid "requested alignment is not a constant" +#~ msgstr "angivet justering er ikke en konstant" + +#~ msgid "requested alignment is not a power of 2" +#~ msgstr "angivet justering er ikke en potens af 2" + +#~ msgid "requested alignment is too large" +#~ msgstr "angivet justering er for stor" + +#~ msgid "alignment may not be specified for `%s'" +#~ msgstr "justering må ikke angives for '%s'" + +#~ msgid "`%s' defined both normally and as an alias" +#~ msgstr "'%s' er defineret både normalt og som et alias" + +#~ msgid "alias arg not a string" +#~ msgstr "aliasparameter er ikke en streng" + +#~ msgid "visibility arg not a string" +#~ msgstr "synlighedsparameter er ikke en streng" + +#~ msgid "visibility arg must be one of \"default\", \"hidden\", \"protected\" or \"internal\"" +#~ msgstr "synlighedsparameter skal være en af \"default\", \"hidden\", \"protected\" eller \"internal\"" + +#~ msgid "tls_model arg not a string" +#~ msgstr "tls_model-parameter er ikke en streng" + +#~ msgid "tls_model arg must be one of \"local-exec\", \"initial-exec\", \"local-dynamic\" or \"global-dynamic\"" +#~ msgstr "tls_model-parameter skal være en af \"local-exec\", \"initial-exec\", \"local-dynamic\" eller \"global-dynamic\"" + +#~ msgid "`%s' attribute applies only to functions" +#~ msgstr "'%s'-egenskaben kan kun anvendes sammen med funktioner" + +#~ msgid "can't set `%s' attribute after definition" +#~ msgstr "kan ikke angive '%s'-egenskaben efter definitionen" + +#~ msgid "`%s' attribute ignored for `%s'" +#~ msgstr "'%s'-egenskaben ignoreret for '%s'" + +#~ msgid "invalid vector type for attribute `%s'" +#~ msgstr "ugyldig vektortype for egenskaben '%s'" + +#~ msgid "no vector mode with the size and type specified could be found" +#~ msgstr "ingen vektortilstand med den angivne størrelse og typen kunne findes" + +#~ msgid "nonnull attribute without arguments on a non-prototype" +#~ msgstr "ikke-nul egenskab uden parametre til en ikke-prototype" + +#~ msgid "nonnull argument has invalid operand number (arg %lu)" +#~ msgstr "ikke-nul parameter har ugyldig operandnummer (parameter %lu)" + +#~ msgid "nonnull argument with out-of-range operand number (arg %lu, operand %lu)" +#~ msgstr "ikke-nul parameter med operandnummer uden for det gyldig interval (parameter %lu, operand %lu)" + +#~ msgid "nonnull argument references non-pointer operand (arg %lu, operand %lu)" +#~ msgstr "ikke-nul parameter refererer til ikke-henvisningsoperand (parameter %lu, operand %lu)" + +#~ msgid "null argument where non-null required (arg %lu)" +#~ msgstr "nulparameter hvor ikke-nul er påkrævet (parameter %lu)" + +#~ msgid "void value not ignored as it ought to be" +#~ msgstr "tom værdi er ikke ignoreret som den burde være" + +#~ msgid "conversion to non-scalar type requested" +#~ msgstr "konvertering til ikke-skalartype udbedt" + +#~ msgid "array `%s' assumed to have one element" +#~ msgstr "tabellen '%s' antages kun at have ét element" + +#~ msgid "`struct %s' incomplete in scope ending here" +#~ msgstr "'struct %s' er ufuldstændig ved virkefeltets afslutning her" + +#~ msgid "`union %s' incomplete in scope ending here" +#~ msgstr "'union %s' er ufuldstændig ved virkefeltets afslutning her" + +#~ msgid "`enum %s' incomplete in scope ending here" +#~ msgstr "'enum %s' er ufuldstændig ved virkefeltets afslutning her" + +#~ msgid "label `%s' defined but not used" +#~ msgstr "etiketten '%s' er defineret, men ikke benyttet" + +#~ msgid "function `%s' redeclared as inline" +#~ msgstr "funktionen '%s' omerklæret som inline" + +#~ msgid "previous declaration of function `%s' with attribute noinline" +#~ msgstr "tidligere erklæring af funktionen '%s' med egenskaben noinline" + +#~ msgid "function `%s' redeclared with attribute noinline" +#~ msgstr "funktionen '%s' omerklæret med egenskaben noinline" + +#~ msgid "previous declaration of function `%s' was inline" +#~ msgstr "tidligere erklæring af funktionen '%s' var inline" + +# shadowing betyder at en funktion har samme navn og dermed skjuler en anden +#~ msgid "shadowing built-in function `%s'" +#~ msgstr "skygger for den indbyggede funktion '%s'" + +#~ msgid "shadowing library function `%s'" +#~ msgstr "skygger for biblioteksfunktionen '%s'" + +#~ msgid "library function `%s' declared as non-function" +#~ msgstr "biblioteksfunktionen '%s' er erklæret som noget der ikke er en funktion" + +#~ msgid "built-in function `%s' declared as non-function" +#~ msgstr "den indbyggede funktion '%s' er erklæret som noget der ikke er en funktion" + +#~ msgid "`%s' redeclared as different kind of symbol" +#~ msgstr "'%s' omerklæret som en anden form for symbol" + +#~ msgid "previous declaration of `%s'" +#~ msgstr "'%s' er tidligere erklæret" + +#~ msgid "conflicting types for built-in function `%s'" +#~ msgstr "modstridende typer for den indbyggede funktion '%s'" + +#~ msgid "conflicting types for `%s'" +#~ msgstr "modstridende typer for '%s'" + +#~ msgid "a parameter list with an ellipsis can't match an empty parameter name list declaration" +#~ msgstr "en parameterliste med '...' passer ikke til en erklæring med en tom parameterliste" + +#~ msgid "an argument type that has a default promotion can't match an empty parameter name list declaration" +#~ msgstr "en parametertype med automatisk forfremmelse passer ikke til en erklæring med en tom parameterliste" + +#~ msgid "thread-local declaration of `%s' follows non thread-local declaration" +#~ msgstr "trådlokal erklæring af '%s' følger ikke-trådlokal erklæring" + +#~ msgid "non thread-local declaration of `%s' follows thread-local declaration" +#~ msgstr "ikke-trådlokal erklæring af '%s' følger trådlokal erklæring" + +#~ msgid "redefinition of `%s'" +#~ msgstr "omdefinering af '%s'" + +#~ msgid "redeclaration of `%s'" +#~ msgstr "omerklæring af '%s'" + +#~ msgid "conflicting declarations of `%s'" +#~ msgstr "modstridende erklæringer af '%s'" + +#~ msgid "prototype for `%s' follows" +#~ msgstr "prototypen for '%s' følger" + +#~ msgid "non-prototype definition here" +#~ msgstr "definition uden prototype her" + +#~ msgid "prototype for `%s' follows and number of arguments doesn't match" +#~ msgstr "prototypen for '%s' følger og antallet af parametre passer ikke" + +#~ msgid "prototype for `%s' follows and argument %d doesn't match" +#~ msgstr "prototypen for '%s' følger og den %d. parameter passer ikke" + +#~ msgid "`%s' declared inline after being called" +#~ msgstr "'%s' er erklæret inline efter at være blevet kaldt" + +#~ msgid "`%s' declared inline after its definition" +#~ msgstr "'%s' er erklæret inline efter dens definition" + +# anden 'declaration' er underforstået i engelsk original +#~ msgid "static declaration for `%s' follows non-static" +#~ msgstr "static-erklæring af '%s' følger erklæring uden static" + +#~ msgid "non-static declaration for `%s' follows static" +#~ msgstr "erklæring uden static af '%s' følger static-erklæring" + +#~ msgid "const declaration for `%s' follows non-const" +#~ msgstr "const-erklæring af '%s' følger ikke-konstant erklæring" + +#~ msgid "type qualifiers for `%s' conflict with previous decl" +#~ msgstr "typemodifikationer for '%s' strider mod tidligere erklæring" + +#~ msgid "redundant redeclaration of `%s' in same scope" +#~ msgstr "overflødig omerklæring af '%s' i samme virkefelt" + +#~ msgid "declaration of `%s' shadows a parameter" +#~ msgstr "erklæring af '%s' skygger for en parameter" + +#~ msgid "declaration of `%s' shadows a symbol from the parameter list" +#~ msgstr "erklæring af '%s' skygger for et symbol fra parameterlisten" + +#~ msgid "a parameter" +#~ msgstr "en parameter" + +#~ msgid "a previous local" +#~ msgstr "en tidligere lokal variabel" + +#~ msgid "a global declaration" +#~ msgstr "en global erklæring" + +#~ msgid "nested extern declaration of `%s'" +#~ msgstr "indlejret extern-erklæring af '%s'" + +#~ msgid "`%s' used prior to declaration" +#~ msgstr "'%s' benyttes før erklæringen" + +#~ msgid "`%s' was declared implicitly `extern' and later `static'" +#~ msgstr "'%s' blev underforstået erklæret 'extern' og derefter 'static'" + +#~ msgid "type mismatch with previous external decl" +#~ msgstr "typen passer ikke med tidligere ekstern erklæring" + +#~ msgid "previous external decl of `%s'" +#~ msgstr "tidligere ekstern erklæring af '%s'" + +#~ msgid "type mismatch with previous implicit declaration" +#~ msgstr "typen passer ikke med tidligere underforstået erklæring" + +#~ msgid "previous implicit declaration of `%s'" +#~ msgstr "tidligere underforstået erklæring af '%s'" + +#~ msgid "`%s' was previously implicitly declared to return `int'" +#~ msgstr "'%s' blev tidligere underforstået erklæret til at returnere 'int'" + +#~ msgid "`%s' was declared `extern' and later `static'" +#~ msgstr "'%s' blev erklæret 'extern' og derefter 'static'" + +#~ msgid "extern declaration of `%s' doesn't match global one" +#~ msgstr "extern-erklæring af '%s' passer ikke med den globale" + +#~ msgid "`%s' locally external but globally static" +#~ msgstr "'%s' er lokalt ekstern, men globalt statisk" + +#~ msgid "function `%s' was previously declared within a block" +#~ msgstr "funktionen '%s' blev tidligere erklæret inden for en blok" + +#~ msgid "implicit declaration of function `%s'" +#~ msgstr "underforstået erklæring af funktionen '%s'" + +#~ msgid "label %s referenced outside of any function" +#~ msgstr "der er blevet henvist til etiketten '%s' uden for en funktion" + +#~ msgid "duplicate label declaration `%s'" +#~ msgstr "etiketten '%s' er blevet erklæret mere end én gang" + +#~ msgid "this is a previous declaration" +#~ msgstr "dette er en tidligere erklæring" + +#~ msgid "unnamed struct/union that defines no instances" +#~ msgstr "unavngiven struct/union som ikke definerer nogen instanser" + +#~ msgid "useless keyword or type name in empty declaration" +#~ msgstr "ubrugeligt reserveret ord eller typenavn i tom erklæring" + +#~ msgid "two types specified in one empty declaration" +#~ msgstr "to typer angivet i én tom erklæring" + +#~ msgid "empty declaration" +#~ msgstr "tom erklæring" + +#~ msgid "ISO C90 does not support `static' or type qualifiers in parameter array declarators" +#~ msgstr "ISO C90 understøtter ikke 'static' eller typemodifikationer i parametertabelerklæringer" + +#~ msgid "ISO C90 does not support `[*]' array declarators" +#~ msgstr "ISO C90 understøtter ikke tabelerklæringer med '[*]'" + +#~ msgid "GCC does not yet properly implement `[*]' array declarators" +#~ msgstr "GCC understøtter endnu ikke ordentligt tabelerklæringer med '[*]'" + +#~ msgid "static or type qualifiers in abstract declarator" +#~ msgstr "static eller typemodifikationer i abstrakt erklæring" + +#~ msgid "`%s' is usually a function" +#~ msgstr "'%s' er sædvanligvis en funktion" + +# init dækker over værditildeling her - samme for de næste mange +#~ msgid "typedef `%s' is initialized (use __typeof__ instead)" +#~ msgstr "typedef '%s' bliver tildelt en værdi (benyt __typeof__ i stedet)" + +#~ msgid "function `%s' is initialized like a variable" +#~ msgstr "funktionen '%s' bliver tildelt en startværdi som en variabel" + +#~ msgid "parameter `%s' is initialized" +#~ msgstr "parameteren '%s' bliver tildelt en startværdi" + +#~ msgid "variable-sized object may not be initialized" +#~ msgstr "et objekt af variabel størrelse må ikke tildeles en startværdi" + +#~ msgid "variable `%s' has initializer but incomplete type" +#~ msgstr "variablen '%s' bliver tildelt en startværdi, men er af en ufuldstændig type" + +#~ msgid "elements of array `%s' have incomplete type" +#~ msgstr "elementer i tabellen '%s' er af en ufuldstændig type" + +#~ msgid "declaration of `%s' has `extern' and is initialized" +#~ msgstr "erklæringen af '%s' indeholder 'extern' og variablen bliver tildelt en startværdi" + +#~ msgid "inline function `%s' given attribute noinline" +#~ msgstr "inline funktion '%s' givet egenskaben noinline" + +#~ msgid "initializer fails to determine size of `%s'" +#~ msgstr "startværdien giver ikke størrelsen af '%s'" + +#~ msgid "array size missing in `%s'" +#~ msgstr "tabelstørrelsen mangler i '%s'" + +#~ msgid "zero or negative size array `%s'" +#~ msgstr "nul eller negativ størrelse for tabellen '%s'" + +#~ msgid "storage size of `%s' isn't known" +#~ msgstr "lagringsstørrelsen af '%s' er ikke kendt" + +#~ msgid "storage size of `%s' isn't constant" +#~ msgstr "lagringsstørrelsen af '%s' er ikke konstant" + +#~ msgid "ignoring asm-specifier for non-static local variable `%s'" +#~ msgstr "ignorerer asm-anvisning til den ikke-statiske, lokale variabel '%s'" + +#~ msgid "ISO C forbids parameter `%s' shadowing typedef" +#~ msgstr "ISO C forbyder at parameteren '%s' skygger for typedef" + +#~ msgid "`long long long' is too long for GCC" +#~ msgstr "'long long long' er for langt for GCC" + +#~ msgid "ISO C90 does not support `long long'" +#~ msgstr "ISO C90 understøtter ikke 'long long'" + +#~ msgid "duplicate `%s'" +#~ msgstr "'%s' optræder mere end én gang" + +#~ msgid "`__thread' before `extern'" +#~ msgstr "'__thread' før 'extern'" + +#~ msgid "`__thread' before `static'" +#~ msgstr "'__thread' før 'static'" + +#~ msgid "two or more data types in declaration of `%s'" +#~ msgstr "mere end én datatype i erklæringen af '%s'" + +#~ msgid "`%s' fails to be a typedef or built in type" +#~ msgstr "'%s' er hverken en typedef eller en indbygget type" + +#~ msgid "type defaults to `int' in declaration of `%s'" +#~ msgstr "typen antages at være 'int' i erklæringen af '%s'" + +#~ msgid "both long and short specified for `%s'" +#~ msgstr "både long og short er angivet for '%s'" + +#~ msgid "long or short specified with char for `%s'" +#~ msgstr "long eller short angivet samtidig med char for '%s'" + +#~ msgid "long or short specified with floating type for `%s'" +#~ msgstr "long eller short angivet samtidig med en kommatalstype for '%s'" + +#~ msgid "the only valid combination is `long double'" +#~ msgstr "den eneste gyldige kombination er 'long double'" + +#~ msgid "both signed and unsigned specified for `%s'" +#~ msgstr "både signed og unsigned er angivet for '%s'" + +#~ msgid "long, short, signed or unsigned invalid for `%s'" +#~ msgstr "long, short, signed og unsigned er ugyldige for '%s'" + +#~ msgid "long, short, signed or unsigned used invalidly for `%s'" +#~ msgstr "long, short, signed og unsigned er benyttet på ugyldig vis for '%s'" + +#~ msgid "complex invalid for `%s'" +#~ msgstr "complex ugyldig for '%s'" + +#~ msgid "ISO C90 does not support complex types" +#~ msgstr "ISO C90 understøtter ikke komplekse typer" + +#~ msgid "ISO C does not support plain `complex' meaning `double complex'" +#~ msgstr "ISO C understøtter ikke at blot 'complex' betyder 'double complex'" + +#~ msgid "ISO C does not support complex integer types" +#~ msgstr "ISO C understøtter ikke komplekse heltalstyper" + +#~ msgid "duplicate `const'" +#~ msgstr "'const' optræder mere end én gang" + +#~ msgid "duplicate `restrict'" +#~ msgstr "'restrict' optræder mere end én gang" + +#~ msgid "duplicate `volatile'" +#~ msgstr "'volatile' optræder mere end én gang" + +#~ msgid "multiple storage classes in declaration of `%s'" +#~ msgstr "flere lagringsklasser optræder i erklæringen af '%s'" + +#~ msgid "function definition declared `auto'" +#~ msgstr "'auto' er påhæftet funktionsdefinitionen" + +#~ msgid "function definition declared `register'" +#~ msgstr "'register' er påhæftet funktionsdefinitionen" + +#~ msgid "function definition declared `typedef'" +#~ msgstr "'typedef' er påhæftet funktionsdefinitionen" + +#~ msgid "function definition declared `__thread'" +#~ msgstr "'__thread' er påhæftet funktionsdefinitionen" + +#~ msgid "storage class specified for structure field `%s'" +#~ msgstr "lagringsklasse angivet for strukturfelt '%s'" + +#~ msgid "storage class specified for parameter `%s'" +#~ msgstr "lagringsklasse angivet for parameter '%s'" + +#~ msgid "storage class specified for typename" +#~ msgstr "lagringsklasse angivet for typenavn" + +#~ msgid "`%s' initialized and declared `extern'" +#~ msgstr "'%s' bliver tildelt en startværdi og er samtidig erklæret 'extern'" + +#~ msgid "`%s' has both `extern' and initializer" +#~ msgstr "'%s' er erklæret 'extern', men bliver tildelt en startværdi" + +#~ msgid "top-level declaration of `%s' specifies `auto'" +#~ msgstr "erklæring af '%s' på øverste niveau angiver 'auto'" + +#~ msgid "nested function `%s' declared `extern'" +#~ msgstr "indlejret funktion '%s' er erklæret 'extern'" + +#~ msgid "function-scope `%s' implicitly auto and declared `__thread'" +#~ msgstr "'%s' i funktionsvirkefelt underforstået auto og erklæret '__thread'" + +#~ msgid "static or type qualifiers in non-parameter array declarator" +#~ msgstr "static eller typemodifikationer i ikke-parametertabelerklæring" + +#~ msgid "declaration of `%s' as array of voids" +#~ msgstr "'%s' erklæret som en tabel af void" + +#~ msgid "declaration of `%s' as array of functions" +#~ msgstr "'%s' erklæret som en tabel af funktioner" + +#~ msgid "invalid use of structure with flexible array member" +#~ msgstr "ugyldig brug af struktur med fleksibelt tabelmedlem" + +#~ msgid "size of array `%s' has non-integer type" +#~ msgstr "størrelsen af tabellen '%s' er ikke af en heltalstype" + +#~ msgid "ISO C forbids zero-size array `%s'" +#~ msgstr "ISO C forbyder tabellen '%s' med størrelsen nul" + +#~ msgid "size of array `%s' is negative" +#~ msgstr "størrelsen af tabellen '%s' er negativ" + +#~ msgid "ISO C90 forbids array `%s' whose size can't be evaluated" +#~ msgstr "ISO C90 forbyder tabellen '%s' hvis størrelse ikke kan bestemmes" + +#~ msgid "ISO C90 forbids variable-size array `%s'" +#~ msgstr "ISO C90 forbyder tabellen '%s' med variabel størrelse" + +#~ msgid "size of array `%s' is too large" +#~ msgstr "størrelsen af tabellen '%s' er for stor" + +#~ msgid "ISO C90 does not support flexible array members" +#~ msgstr "ISO C90 understøtter ikke fleksible tabelmedlemmer" + +#~ msgid "array type has incomplete element type" +#~ msgstr "tabeltypen er af en ufuldstændig type" + +#~ msgid "ISO C forbids const or volatile function types" +#~ msgstr "ISO C forbyder const eller volatile funktionstyper" + +#~ msgid "`%s' declared as function returning a function" +#~ msgstr "'%s' er erklæret som en funktion der returnerer en funktion" + +#~ msgid "`%s' declared as function returning an array" +#~ msgstr "'%s' er erklæret som en funktion der returnerer en tabel" + +#~ msgid "ISO C forbids qualified void function return type" +#~ msgstr "ISO C forbyder void funktionsreturtype med modifikationer" + +#~ msgid "type qualifiers ignored on function return type" +#~ msgstr "typemodifikationer ignoreret i funktionsreturtypen" + +#~ msgid "ISO C forbids qualified function types" +#~ msgstr "ISO C forbyder funktionsreturtype med modifikationer" + +#~ msgid "invalid type modifier within pointer declarator" +#~ msgstr "ugyldig typemodifikation i erklæring af henvisning" + +#~ msgid "variable or field `%s' declared void" +#~ msgstr "variabel eller felt '%s' erklæret void" + +#~ msgid "attributes in parameter array declarator ignored" +#~ msgstr "egenskaber i parametertabelerklæring ignoreret" + +#~ msgid "invalid type modifier within array declarator" +#~ msgstr "ugyldig typemodifikation i tabelerklæring" + +#~ msgid "field `%s' declared as a function" +#~ msgstr "feltet '%s' er erklæret som en funktion" + +#~ msgid "field `%s' has incomplete type" +#~ msgstr "feltet '%s' er af en ufuldstændig type" + +#~ msgid "invalid storage class for function `%s'" +#~ msgstr "ugyldig lagringsklasse for funktion '%s'" + +#~ msgid "`noreturn' function returns non-void value" +#~ msgstr "en funktion uden returtype returnerer en ikke-tom værdi" + +# at oversætte inline med et udsagnsord her bliver vist for tvetydigt +#~ msgid "cannot inline function `main'" +#~ msgstr "funktionen 'main' kan ikke være inline" + +#~ msgid "variable `%s' declared `inline'" +#~ msgstr "variablen '%s' er erklæret 'inline'" + +#~ msgid "thread-local storage not supported for this target" +#~ msgstr "trådlokal lagring understøttes ikke på målarkitekturen" + +#~ msgid "function declaration isn't a prototype" +#~ msgstr "funktionserklæringen er ikke en prototype" + +#~ msgid "parameter names (without types) in function declaration" +#~ msgstr "parameternavne (uden typer) i funktionserklæringen" + +#~ msgid "parameter `%s' has incomplete type" +#~ msgstr "parameteren '%s' er af en ufuldstændig type" + +#~ msgid "parameter has incomplete type" +#~ msgstr "parameteren er af en ufuldstændig type" + +# engelsk original upræcis (hvordan kan man henvise til en type?) +#~ msgid "parameter `%s' points to incomplete type" +#~ msgstr "parameteren '%s' er en henvisning til en ufuldstændig type" + +#~ msgid "parameter points to incomplete type" +#~ msgstr "parameteren er en henvisning til en ufuldstændig type" + +#~ msgid "parameter `%s' has just a forward declaration" +#~ msgstr "parameteren '%s' har kun en forhåndserklæring" + +#~ msgid "`void' in parameter list must be the entire list" +#~ msgstr "'void' i en parameterliste skal udgøre hele listen" + +#~ msgid "`struct %s' declared inside parameter list" +#~ msgstr "'struct %s' erklæret inde i en parameterliste" + +#~ msgid "`union %s' declared inside parameter list" +#~ msgstr "'union %s' erklæret inde i en parameterliste" + +#~ msgid "`enum %s' declared inside parameter list" +#~ msgstr "'enum %s' erklæret inde i en parameterliste" + +#~ msgid "anonymous struct declared inside parameter list" +#~ msgstr "anonym struct erklæret inde i en parameterliste" + +#~ msgid "anonymous union declared inside parameter list" +#~ msgstr "anonym union erklæret inde i en parameterliste" + +#~ msgid "anonymous enum declared inside parameter list" +#~ msgstr "anonym enum erklæret inde i en parameterliste" + +#~ msgid "its scope is only this definition or declaration, which is probably not what you want" +#~ msgstr "dens virkefelt er kun denne definition eller erklæring hvilket sandsynligvis ikke er hvad du ønsker." + +#~ msgid "redefinition of `union %s'" +#~ msgstr "omdefinering af 'union %s'" + +#~ msgid "redefinition of `struct %s'" +#~ msgstr "omdefinering af 'struct %s'" + +#~ msgid "declaration does not declare anything" +#~ msgstr "erklæring erklærer ikke noget" + +# engelsk original forkortet +#~ msgid "%s defined inside parms" +#~ msgstr "%s defineret inden i parameterliste" + +#~ msgid "union" +#~ msgstr "union" + +#~ msgid "structure" +#~ msgstr "struktur" + +#~ msgid "%s has no %s" +#~ msgstr "%s har ingen %s" + +#~ msgid "struct" +#~ msgstr "struct" + +#~ msgid "named members" +#~ msgstr "navngivne medlemmer" + +#~ msgid "members" +#~ msgstr "medlemmer" + +#~ msgid "nested redefinition of `%s'" +#~ msgstr "indlejret omdefinering af '%s'" + +#~ msgid "bit-field `%s' width not an integer constant" +#~ msgstr "bredden af bitfeltet '%s' er ikke en heltalskonstant" + +#~ msgid "bit-field `%s' has invalid type" +#~ msgstr "bitfeltet '%s' er af en ufuldstændig type" + +#~ msgid "bit-field `%s' type invalid in ISO C" +#~ msgstr "typen af bitfeltet '%s' er ugyldig i ISO C" + +#~ msgid "negative width in bit-field `%s'" +#~ msgstr "negativ bredde i bitfeltet '%s'" + +#~ msgid "width of `%s' exceeds its type" +#~ msgstr "bredden af '%s' overstiger typen" + +#~ msgid "zero width for bit-field `%s'" +#~ msgstr "en bredde på nul for bitfeltet '%s'" + +# RETMIG: find på et eller andet med præcisionen +#~ msgid "`%s' is narrower than values of its type" +#~ msgstr "'%s' er smallere end værdier af dens type" + +#~ msgid "flexible array member in union" +#~ msgstr "fleksibelt tabelmedlem i union" + +#~ msgid "flexible array member not at end of struct" +#~ msgstr "fleksibelt tabelmedlem ikke i slutningen af struktur" + +#~ msgid "flexible array member in otherwise empty struct" +#~ msgstr "fleksibelt tabelmedlem i ellers tom struktur" + +#~ msgid "duplicate member `%s'" +#~ msgstr "medlemmet '%s' optræder mere end én gang" + +#~ msgid "union cannot be made transparent" +#~ msgstr "union kan ikke ikke gøres gennemsigtig" + +#~ msgid "redeclaration of `enum %s'" +#~ msgstr "omerklæring af 'enum %s'" + +# original forkortet +#~ msgid "enum defined inside parms" +#~ msgstr "enum defineret inden i parameterliste" + +#~ msgid "enumeration values exceed range of largest integer" +#~ msgstr "enum-værdier overstige rækkevidden af det største heltal" + +#~ msgid "enumerator value for `%s' not integer constant" +#~ msgstr "enum-værdien for '%s' er ikke en heltalskonstant" + +#~ msgid "overflow in enumeration values" +#~ msgstr "enum-værdier for store" + +#~ msgid "ISO C restricts enumerator values to range of `int'" +#~ msgstr "ISO C begrænser enum-værdier til rækkevidden af 'int'" + +#~ msgid "return type is an incomplete type" +#~ msgstr "returtypen er en ufuldstændig type" + +#~ msgid "return type defaults to `int'" +#~ msgstr "returtypen antages at være 'int'" + +#~ msgid "no previous prototype for `%s'" +#~ msgstr "ingen tidligere prototype for '%s'" + +#~ msgid "`%s' was used with no prototype before its definition" +#~ msgstr "'%s' blev brugt uden en prototype før dens definition" + +#~ msgid "no previous declaration for `%s'" +#~ msgstr "ingen tidligere erklæring af '%s'" + +#~ msgid "`%s' was used with no declaration before its definition" +#~ msgstr "'%s' blev brugt uden en erklæring før dens definition" + +#~ msgid "return type of `%s' is not `int'" +#~ msgstr "returtypen til '%s' er ikke 'int'" + +#~ msgid "first argument of `%s' should be `int'" +#~ msgstr "den første parameter til '%s' skal være 'int'" + +#~ msgid "second argument of `%s' should be `char **'" +#~ msgstr "den anden parameter til '%s' skal være 'char **'" + +#~ msgid "third argument of `%s' should probably be `char **'" +#~ msgstr "den tredje parameter til '%s' skal sandsynligvis være 'char **'" + +#~ msgid "`%s' takes only zero or two arguments" +#~ msgstr "'%s' tager kun mod to eller ingen parametre" + +#~ msgid "`%s' is normally a non-static function" +#~ msgstr "'%s' er normalt en ikke-statisk funktion" + +#~ msgid "parm types given both in parmlist and separately" +#~ msgstr "parametertyper angivet både i parameterliste og separat" + +#~ msgid "parameter name omitted" +#~ msgstr "parameternavn udeladt" + +#~ msgid "parameter `%s' declared void" +#~ msgstr "parameteren '%s' erklæret void" + +#~ msgid "parameter name missing from parameter list" +#~ msgstr "parameternavn mangler fra parameterliste" + +#~ msgid "multiple parameters named `%s'" +#~ msgstr "flere parametre ved navn '%s'" + +#~ msgid "type of `%s' defaults to `int'" +#~ msgstr "typen til '%s' antages at være 'int'" + +#~ msgid "declaration for parameter `%s' but no such parameter" +#~ msgstr "erklæring af parameteren '%s', men ingen sådan parameter" + +#~ msgid "number of arguments doesn't match prototype" +#~ msgstr "antallet af parametre passer ikke til prototypen" + +#~ msgid "promoted argument `%s' doesn't match prototype" +#~ msgstr "den forfremmede parameter '%s' passer ikke til prototypen" + +#~ msgid "argument `%s' doesn't match prototype" +#~ msgstr "parameteren '%s' passer ikke til prototypen" + +#~ msgid "no return statement in function returning non-void" +#~ msgstr "ingen return-sætning i en funktion der ikke returnerer void" + +#~ msgid "this function may return with or without a value" +#~ msgstr "denne funktion kan returnere med eller uden en værdi" + +#~ msgid "size of return value of `%s' is %u bytes" +#~ msgstr "størrelsen af returtypen til '%s' er %u byte" + +#~ msgid "size of return value of `%s' is larger than %d bytes" +#~ msgstr "størrelsen af returtypen til '%s' er større end %d byte" + +#~ msgid "`for' loop initial declaration used outside C99 mode" +#~ msgstr "begyndelseserklæring i 'for'-løkke benyttet uden for C99-tilstand" + +#~ msgid "`struct %s' declared in `for' loop initial declaration" +#~ msgstr "'struct %s' erklæret i begyndelseserklæring i 'for'-løkke" + +#~ msgid "`union %s' declared in `for' loop initial declaration" +#~ msgstr "'union %s' erklæret i begyndelseserklæring i 'for'-løkke" + +#~ msgid "`enum %s' declared in `for' loop initial declaration" +#~ msgstr "'enum %s' erklæret i begyndelseserklæring i 'for'-løkke" + +#~ msgid "declaration of non-variable `%s' in `for' loop initial declaration" +#~ msgstr "erklæring af '%s' der ikke er en variabel, i begyndelseserklæring i 'for'-løkke" + +#~ msgid "declaration of static variable `%s' in `for' loop initial declaration" +#~ msgstr "erklæring af '%s' der er en statisk variabel, i begyndelseserklæring i 'for'-løkke" + +#~ msgid "declaration of `extern' variable `%s' in `for' loop initial declaration" +#~ msgstr "erklæring af '%s' der er en 'extern'-variabel, i begyndelseserklæring i 'for'-løkke" + +#~ msgid "format string arg not a string type" +#~ msgstr "formateringsstrengsparameter er ikke af en strengtype" + +#~ msgid "args to be formatted is not '...'" +#~ msgstr "parametrene der skal formateres, er ikke '...'" + +#~ msgid "strftime formats cannot format arguments" +#~ msgstr "strftime-formater kan ikke formatere parametre" + +#~ msgid "format string has invalid operand number" +#~ msgstr "formateringsstrengen har et ugyldigt operandtal" + +#~ msgid "function does not return string type" +#~ msgstr "funktionen returnerer ikke en strengtype" + +#~ msgid "unrecognized format specifier" +#~ msgstr "ukendt formateringsanvisning" + +#~ msgid "`%s' is an unrecognized format function type" +#~ msgstr "'%s' er en ukendt formateringsfunktionstype" + +#~ msgid "format string arg follows the args to be formatted" +#~ msgstr "formateringsstrengsparameter efterfølger parametrene der skal formateres" + +# her er der tale om en signalering +#~ msgid "` ' flag" +#~ msgstr "' '-flag" + +#~ msgid "the ` ' printf flag" +#~ msgstr "' '-printf-flaget" + +#~ msgid "`+' flag" +#~ msgstr "'+'-flag" + +#~ msgid "the `+' printf flag" +#~ msgstr "'+'-printf-flaget" + +#~ msgid "`#' flag" +#~ msgstr "'#'-flag" + +#~ msgid "the `#' printf flag" +#~ msgstr "'#'-printf-flaget" + +#~ msgid "`0' flag" +#~ msgstr "'0'-flag" + +#~ msgid "the `0' printf flag" +#~ msgstr "'0'-printf-flaget" + +#~ msgid "`-' flag" +#~ msgstr "'-'-flag" + +#~ msgid "the `-' printf flag" +#~ msgstr "'-'-printf-flaget" + +#~ msgid "`'' flag" +#~ msgstr "'''-flag" + +#~ msgid "the `'' printf flag" +#~ msgstr "'''-printf-flaget" + +#~ msgid "`I' flag" +#~ msgstr "'I'-flag" + +#~ msgid "the `I' printf flag" +#~ msgstr "'I'-printf-flaget" + +#~ msgid "field width" +#~ msgstr "feltbredde" + +#~ msgid "field width in printf format" +#~ msgstr "feltbredde i printf-formatering" + +#~ msgid "precision" +#~ msgstr "præcision" + +#~ msgid "precision in printf format" +#~ msgstr "præcision i printf-formatering" + +#~ msgid "length modifier" +#~ msgstr "længdetilpasning" + +#~ msgid "length modifier in printf format" +#~ msgstr "længdetilpasning i printf-formatering" + +#~ msgid "assignment suppression" +#~ msgstr "tildelingsundertrykkelse" + +#~ msgid "the assignment suppression scanf feature" +#~ msgstr "den tildelingsundertrykkende scanf-facilitet" + +#~ msgid "`a' flag" +#~ msgstr "'a'-flag" + +#~ msgid "the `a' scanf flag" +#~ msgstr "'a'-scanf-flaget" + +#~ msgid "field width in scanf format" +#~ msgstr "feltbredde i scanf-formatering" + +#~ msgid "length modifier in scanf format" +#~ msgstr "længdetilpasning i scanf-formatering" + +#~ msgid "the `'' scanf flag" +#~ msgstr "'''-scanf-flaget" + +#~ msgid "the `I' scanf flag" +#~ msgstr "'I'-scanf-flaget" + +#~ msgid "`_' flag" +#~ msgstr "'_'-flag" + +#~ msgid "the `_' strftime flag" +#~ msgstr "'_'-strftime-flaget" + +#~ msgid "the `-' strftime flag" +#~ msgstr "'-'-strftime-flaget" + +#~ msgid "the `0' strftime flag" +#~ msgstr "'0'-strftime-flaget" + +#~ msgid "`^' flag" +#~ msgstr "'^'-flag" + +#~ msgid "the `^' strftime flag" +#~ msgstr "'^'-strftime-flaget" + +#~ msgid "the `#' strftime flag" +#~ msgstr "'#'-strftime-flaget" + +#~ msgid "field width in strftime format" +#~ msgstr "feltbredde i strftime-formatering" + +#~ msgid "`E' modifier" +#~ msgstr "'E'-modifikation" + +#~ msgid "the `E' strftime modifier" +#~ msgstr "'E'-strftime-modifikationen" + +#~ msgid "`O' modifier" +#~ msgstr "'O'-modifikation" + +#~ msgid "the `O' strftime modifier" +#~ msgstr "'O'-strftime-modifikationen" + +#~ msgid "the `O' modifier" +#~ msgstr "'O'-modifikation" + +#~ msgid "fill character" +#~ msgstr "udfyldningstegn" + +#~ msgid "fill character in strfmon format" +#~ msgstr "udfyldningstegn i strfmon-formatering" + +#~ msgid "the `^' strfmon flag" +#~ msgstr "'^'-strfmon-flaget" + +#~ msgid "the `+' strfmon flag" +#~ msgstr "'+'-strfmon-flaget" + +#~ msgid "`(' flag" +#~ msgstr "'('-flag" + +#~ msgid "the `(' strfmon flag" +#~ msgstr "'('-strfmon-flaget" + +#~ msgid "`!' flag" +#~ msgstr "'!'-flag" + +#~ msgid "the `!' strfmon flag" +#~ msgstr "'!'-strfmon-flaget" + +#~ msgid "the `-' strfmon flag" +#~ msgstr "'-'-strfmon-flaget" + +#~ msgid "field width in strfmon format" +#~ msgstr "feltbredde i strfmon-formatering" + +#~ msgid "left precision" +#~ msgstr "venstrepræcision" + +#~ msgid "left precision in strfmon format" +#~ msgstr "venstrepræcision i strfmon-formatering" + +#~ msgid "right precision" +#~ msgstr "højrepræcision" + +#~ msgid "right precision in strfmon format" +#~ msgstr "højrepræcision i strfmon-formatering" + +#~ msgid "length modifier in strfmon format" +#~ msgstr "længdemodifikation i strfmon-formatering" + +#~ msgid "function might be possible candidate for `%s' format attribute" +#~ msgstr "funktion er en mulig kandidat til '%s'-formateringsegenskab" + +#~ msgid "missing $ operand number in format" +#~ msgstr "manglende $-operandnummer i formatering" + +#~ msgid "%s does not support %%n$ operand number formats" +#~ msgstr "%s understøtter ikke %%n$-operandnummerformateringer" + +#~ msgid "operand number out of range in format" +#~ msgstr "operandnummer uden for det gyldige interval" + +#~ msgid "format argument %d used more than once in %s format" +#~ msgstr "formateringsparameter %d brugt mere end en gang i %s-formatering" + +#~ msgid "format argument %d unused before used argument %d in $-style format" +#~ msgstr "formateringsparameter %d ubenyttet før den brugte parameter %d i formatering med $" + +#~ msgid "format not a string literal, format string not checked" +#~ msgstr "formatering er ikke en strengkonstant, formateringsstrengen er ikke kontrolleret" + +#~ msgid "format not a string literal and no format arguments" +#~ msgstr "formatering er ikke en strengkonstant og der er ingen formateringsparametre" + +#~ msgid "format not a string literal, argument types not checked" +#~ msgstr "formatering er ikke en strengkonstant, parametertyper er ikke kontrolleret" + +#~ msgid "too many arguments for format" +#~ msgstr "for mange parametre til formatering" + +#~ msgid "unused arguments in $-style format" +#~ msgstr "ubenyttede parametre i formatering med $" + +#~ msgid "zero-length %s format string" +#~ msgstr "formateringsstreng %s med længden nul" + +#~ msgid "format is a wide character string" +#~ msgstr "formatering er en bredtegnsstreng" + +#~ msgid "unterminated format string" +#~ msgstr "uafsluttet formateringsstreng" + +#~ msgid "embedded `\\0' in format" +#~ msgstr "indlejret '\\0' i formatering" + +#~ msgid "spurious trailing `%%' in format" +#~ msgstr "mystisk afsluttende '%%' i formatering" + +#~ msgid "repeated %s in format" +#~ msgstr "gentaget %s i formatering" + +#~ msgid "missing fill character at end of strfmon format" +#~ msgstr "mangler fyldtegn i slutningen af strfmon-formatering" + +#~ msgid "too few arguments for format" +#~ msgstr "for få parametre til formatering" + +#~ msgid "zero width in %s format" +#~ msgstr "bredde på nul i %s-formatering" + +#~ msgid "empty left precision in %s format" +#~ msgstr "tom venstrepræcision i %s-formatering" + +#~ msgid "field precision" +#~ msgstr "feltpræcision" + +#~ msgid "empty precision in %s format" +#~ msgstr "tom præcision i %s-formatering" + +#~ msgid "%s does not support the `%s' %s length modifier" +#~ msgstr "%s understøtter ikke '%s' %s-længdemodifikationen" + +#~ msgid "conversion lacks type at end of format" +#~ msgstr "konvertering mangler type i slutningen af formatering" + +#~ msgid "unknown conversion type character `%c' in format" +#~ msgstr "ukendt konverteringstypetegn '%c' i formatering" + +#~ msgid "unknown conversion type character 0x%x in format" +#~ msgstr "ukendt konverteringstypetegn 0x%x i formatering" + +#~ msgid "%s does not support the `%%%c' %s format" +#~ msgstr "%s understøtter ikke '%%%c' %s-formateringen" + +#~ msgid "%s used with `%%%c' %s format" +#~ msgstr "%s brugt med '%%%c' %s-formatering" + +#~ msgid "%s does not support %s" +#~ msgstr "%s understøtter ikke %s" + +#~ msgid "%s does not support %s with the `%%%c' %s format" +#~ msgstr "%s understøtter ikke %s med '%%%c' %s-formateringen" + +#~ msgid "%s ignored with %s and `%%%c' %s format" +#~ msgstr "%s ignoreret med %s og '%%%c' %s-formatering" + +#~ msgid "%s ignored with %s in %s format" +#~ msgstr "%s ignoreret med %s i %s-formatering" + +#~ msgid "use of %s and %s together with `%%%c' %s format" +#~ msgstr "brug af %s og %s sammen med '%%%c' %s-formatering" + +#~ msgid "use of %s and %s together in %s format" +#~ msgstr "brug af %s og %s sammen i %s-formatering" + +#~ msgid "`%%%c' yields only last 2 digits of year in some locales" +#~ msgstr "'%%%c' giver kun de to sidste cifre af året under nogle regionalindstillinger" + +#~ msgid "`%%%c' yields only last 2 digits of year" +#~ msgstr "'%%%c' giver kun de to sidste cifre af året" + +#~ msgid "no closing `]' for `%%[' format" +#~ msgstr "ingen afsluttende '[' til '%%['-formatering" + +#~ msgid "use of `%s' length modifier with `%c' type character" +#~ msgstr "brug af '%s'-længdemodifikation med '%c'-typetegn" + +#~ msgid "%s does not support the `%%%s%c' %s format" +#~ msgstr "%s understøtter ikke '%%%s%c' %s-formateringen" + +#~ msgid "operand number specified with suppressed assignment" +#~ msgstr "operandnummer angivet med undertrykt tildeling" + +#~ msgid "operand number specified for format taking no argument" +#~ msgstr "operandnummer angiver for formatering der ikke tager mod parametre" + +#~ msgid "writing through null pointer (arg %d)" +#~ msgstr "skrivning gennem nulhenvisning (parameter %d)" + +#~ msgid "reading through null pointer (arg %d)" +#~ msgstr "læsning gennem nulhenvisning (parameter %d)" + +#~ msgid "writing into constant object (arg %d)" +#~ msgstr "skrivning til konstant objekt (parameter %d)" + +#~ msgid "extra type qualifiers in format argument (arg %d)" +#~ msgstr "ekstra typemodifikationer i formateringsparameter (parameter %d)" + +#~ msgid "format argument is not a pointer (arg %d)" +#~ msgstr "formateringsparameter er ikke en henvisning (parameter %d)" + +#~ msgid "format argument is not a pointer to a pointer (arg %d)" +#~ msgstr "formateringsparameter er ikke en henvisning til en henvisning (parameter %d)" + +#~ msgid "pointer" +#~ msgstr "henvisning" + +#~ msgid "different type" +#~ msgstr "anden type" + +#~ msgid "%s is not type %s (arg %d)" +#~ msgstr "%s er ikke af typen %s (parameter %d)" + +#~ msgid "%s format, %s arg (arg %d)" +#~ msgstr "%s-formatering, %s-parameter (parameter %d)" + +#~ msgid "YYDEBUG not defined" +#~ msgstr "YYDEBUG ikke defineret" + +#~ msgid "badly nested C headers from preprocessor" +#~ msgstr "ugyldigt indlejrede C-inkluderingsfiler fra præprocessoren" + +#~ msgid "ignoring #pragma %s %s" +#~ msgstr "ignorerer #pragma %s %s" + +#~ msgid "universal-character-name '\\u%04x' not valid in identifier" +#~ msgstr "universelt tegn '\\u%04x' er ikke gyldigt i kaldenavne" + +#~ msgid "stray '%c' in program" +#~ msgstr "vildfaren '%c' i program" + +#~ msgid "stray '\\%o' in program" +#~ msgstr "vildfaren '\\%o' i program" + +#~ msgid "this decimal constant is unsigned only in ISO C90" +#~ msgstr "denne kommatalskonstant er kun unsigned i ISO C90" + +#~ msgid "this decimal constant would be unsigned in ISO C90" +#~ msgstr "denne kommatalskonstant ville være unsigned i ISO C90" + +#~ msgid "integer constant is too large for \"%s\" type" +#~ msgstr "heltalskonstanten er for stor til typen '%s'" + +#~ msgid "floating constant exceeds range of \"%s\"" +#~ msgstr "kommatalskonstant overskrider intervallet for '%s'" + +#~ msgid "ignoring invalid multibyte character" +#~ msgstr "ignorerer ugyldigt flerbyte-tegn" + +#~ msgid "missing argument to \"-%s\"" +#~ msgstr "der mangler en parameter til tilvalget '-%s'" + +#~ msgid "no class name specified with \"-%s\"" +#~ msgstr "intet klassenavn angivet med '-%s'" + +#~ msgid "missing filename after \"-%s\"" +#~ msgstr "et filnavn mangler efter '-%s'" + +#~ msgid "missing target after \"-%s\"" +#~ msgstr "et mål mangler efter '-%s'" + +#~ msgid "options array incorrectly sorted: %s is before %s" +#~ msgstr "tilvalgstabel sorteret forkert: %s er før %s" + +#~ msgid "too many filenames given. Type %s --help for usage" +#~ msgstr "for mange filnavne angivet - vejledning i brug kan fås med '%s --help'" + +#~ msgid "-Wno-strict-prototypes is not supported in C++" +#~ msgstr "-Wno-strict-prototypes er ikke understøttet i C++" + +#~ msgid "switch \"%s\" is no longer supported" +#~ msgstr "tilvalget '%s' understøttes ikke længere" + +#~ msgid "switch \"%s\" is deprecated, please see documentation for details" +#~ msgstr "tilvalget '%s' er forældet, se venligst dokumentationen for detaljer" + +#~ msgid "-fhandle-exceptions has been renamed to -fexceptions (and is now on by default)" +#~ msgstr "-fhandle-exceptions er blevet omdøbt til -fexceptions (og er nu til som standard)" + +#~ msgid "output filename specified twice" +#~ msgstr "uddatafilnavnet er angivet to gange" + +#~ msgid "-Wformat-y2k ignored without -Wformat" +#~ msgstr "-Wformat-y2k ignoreret uden -Wformat" + +#~ msgid "-Wformat-extra-args ignored without -Wformat" +#~ msgstr "-Wformat-extra-args ignoreret uden -Wformat" + +#~ msgid "-Wformat-zero-length ignored without -Wformat" +#~ msgstr "-Wformat-zero-length ignoreret uden -Wformat" + +#~ msgid "-Wformat-nonliteral ignored without -Wformat" +#~ msgstr "-Wformat-nonliteral ignoreret uden -Wformat" + +#~ msgid "-Wformat-security ignored without -Wformat" +#~ msgstr "-Wformat-security ignoreret uden -Wformat" + +#~ msgid "-Wmissing-format-attribute ignored without -Wformat" +#~ msgstr "-Wmissing-format-attribute ignoreret uden -Wformat" + +#~ msgid "opening output file %s" +#~ msgstr "åbner uddatafilen %s" + +#~ msgid "opening dependency file %s" +#~ msgstr "åbner afhængighedsfilen %s" + +#~ msgid "closing dependency file %s" +#~ msgstr "lukker afhængighedsfilen %s" + +#~ msgid "when writing output to %s" +#~ msgstr "ved skrivning af uddata til %s" + +#~ msgid "to generate dependencies you must specify either -M or -MM" +#~ msgstr "for at generere afhængigheder skal du angive enten -M eller -MM" + +#~ msgid "\"-%s\" is valid for %s but not for %s" +#~ msgstr "'-%s' er gyldigt for %s, men ikke for %s" + +# den fulde tekst til disse bidder findes også senere +#~ msgid "" +#~ "Switches:\n" +#~ " -include Include the contents of before other files\n" +#~ " -imacros Accept definition of macros in \n" +#~ " -iprefix Specify as a prefix for next two options\n" +#~ " -iwithprefix Add to the end of the system include path\n" +#~ " -iwithprefixbefore Add to the end of the main include path\n" +#~ " -isystem Add to the start of the system include path\n" +#~ msgstr "" +#~ "Tilvalg:\n" +#~ " -include Inkludér indholdet af før andre filer\n" +#~ " -imacros Læs makrodefinitionerne i \n" +#~ " -iprefix Angiv som et præfiks til de næste to tilvalg\n" +#~ " -iwithprefix Føj til slutningen af systeminkluderingsstien\n" +#~ " -withprefixbefore Føj til slutningen af den alm. inkluderingssti\n" +#~ " -isystem Føj til begyndelsen af systeminkluderingsstien\n" + +#~ msgid "" +#~ " -idirafter Add to the end of the system include path\n" +#~ " -I Add to the end of the main include path\n" +#~ " -I- Fine-grained include path control; see info docs\n" +#~ " -nostdinc Do not search system include directories\n" +#~ " (dirs specified with -isystem will still be used)\n" +#~ " -nostdinc++ Do not search system include directories for C++\n" +#~ " -o Put output into \n" +#~ msgstr "" +#~ " -idirafter Føj til slutningen af systeminkluderingsstien\n" +#~ " -I Føj til slutningen af den alm. inkluderingssti\n" +#~ " -I- Nøje kontrolleret inkluderingssti; se info-hjælpen\n" +#~ " -nostdinc Søg ikke i systeminkluderingskataloger\n" +#~ " (kataloger angivet med -isystem søges dog stadig)\n" +#~ " -nostdinc++ Søg ikke i systeminkluderingskataloger til C++\n" +#~ " -o Send uddata til \n" + +#~ msgid "" +#~ " -trigraphs Support ISO C trigraphs\n" +#~ " -std= Specify the conformance standard; one of:\n" +#~ " gnu89, gnu99, c89, c99, iso9899:1990,\n" +#~ " iso9899:199409, iso9899:1999, c++98\n" +#~ " -w Inhibit warning messages\n" +#~ " -W[no-]trigraphs Warn if trigraphs are encountered\n" +#~ " -W[no-]comment{s} Warn if one comment starts inside another\n" +#~ msgstr "" +#~ " -trigraphs Understøt ISO C trigrafer\n" +#~ " -std= Angiv at koden retter sig efter en af standarderne:\n" +#~ " gnu89, gnu99, c89, c99, iso9899:1990,\n" +#~ " iso9899:199409, iso9899:1999, c++98\n" +#~ " -w Undertryk advarselsmeddelelser\n" +#~ " -W[no-]trigraphs Advar hvis trigrafer mødes\n" +#~ " -W[no-]comment{s} Advar hvis en kommentar begynder inden i en anden\n" + +#~ msgid "" +#~ " -W[no-]traditional Warn about features not present in traditional C\n" +#~ " -W[no-]undef Warn if an undefined macro is used by #if\n" +#~ " -W[no-]import Warn about the use of the #import directive\n" +#~ msgstr "" +#~ " -W[no-]traditional Advar om utilgængelige faciliteter i traditionel C\n" +#~ " -W[no-]undef Advar hvis en ikkedefineret makro bruges med #if\n" +#~ " -W[no-]import Advar om brug af #import-direktivet\n" + +#~ msgid "" +#~ " -W[no-]error Treat all warnings as errors\n" +#~ " -W[no-]system-headers Do not suppress warnings from system headers\n" +#~ " -W[no-]all Enable most preprocessor warnings\n" +#~ msgstr "" +#~ " -W[no-]error Behandl alle advarsler som fejl\n" +#~ " -W[no-]system-headers Undertryk ikke advarsler fra systeminkluderingsfiler\n" +#~ " -W[no-]all Slå alle præprocessoradvarsler til\n" + +#~ msgid "" +#~ " -M Generate make dependencies\n" +#~ " -MM As -M, but ignore system header files\n" +#~ " -MD Generate make dependencies and compile\n" +#~ " -MMD As -MD, but ignore system header files\n" +#~ " -MF Write dependency output to the given file\n" +#~ " -MG Treat missing header file as generated files\n" +#~ msgstr "" +#~ " -M Generér afhængigheder til make\n" +#~ " -MM Som -M, men ignorér systeminkluderingsfiler\n" +#~ " -MD Generer make-afhængigheder og oversæt\n" +#~ " -MMD Som -MD, men ignorér systeminkluderingsfiler\n" +#~ " -MF Skriv afhænghedsuddata til den givne fil\n" +#~ " -MG Behandl manglende inkl.-filer som genererede filer\n" + +# make kalder phony targets for falske mål +#~ msgid "" +#~ " -MP\t\t\t Generate phony targets for all headers\n" +#~ " -MQ Add a MAKE-quoted target\n" +#~ " -MT Add an unquoted target\n" +#~ msgstr "" +#~ " -MP Generér \"falske\" mål for alle inkluderingsfiler\n" +#~ " -MQ Tilføj et MAKE-mål i anførselstegn\n" +#~ " -MT Tilføj et mål uden anførselstegn\n" + +#~ msgid "" +#~ " -D Define a with string '1' as its value\n" +#~ " -D= Define a with as its value\n" +#~ " -A= Assert the to \n" +#~ " -A-= Disable the to \n" +#~ " -U Undefine \n" +#~ " -v Display the version number\n" +#~ msgstr "" +#~ " -D Definér makroen med strengen '1' som værdi\n" +#~ " -D= Definér makroen med værdien \n" +#~ " -A= Angiv at er svar på \n" +#~ " -A-= Angiv at ikke er svar på \n" +#~ " -U Glem definitionen af \n" +#~ " -v Skriv versionsnummeret\n" + +#~ msgid "" +#~ " -H Print the name of header files as they are used\n" +#~ " -C Do not discard comments\n" +#~ " -dM Display a list of macro definitions active at end\n" +#~ " -dD Preserve macro definitions in output\n" +#~ " -dN As -dD except that only the names are preserved\n" +#~ " -dI Include #include directives in the output\n" +#~ msgstr "" +#~ " -H Skriv navnene på inkluderingsfilerne når de bruges\n" +#~ " -C Fjern ikke kommentarer\n" +#~ " -dM Vis til sidst de aktive makrodefinitioner\n" +#~ " -dD Bevar makrodefinitioner i uddata\n" +#~ " -dN Som -dD bortset fra at kun navnene bevares\n" +#~ " -dI Inkludér #include-anvisninger i uddata\n" + +#~ msgid "" +#~ " -f[no-]preprocessed Treat the input file as already preprocessed\n" +#~ " -ftabstop= Distance between tab stops for column reporting\n" +#~ " -P Do not generate #line directives\n" +#~ " -remap Remap file names when including files\n" +#~ " --help Display this information\n" +#~ msgstr "" +#~ " -f[no-]preprocessed Behandl inddatafilen som allerede præprocesseret\n" +#~ " -ftabstop= Afstand mellem tabulatorstop i kolonnerapportering\n" +#~ " -P Generér ikke #line-angivelser\n" +#~ " -remap Omdan filnavne ved filinkludering\n" +#~ " --help Vis denne vejledning\n" + +#~ msgid "syntax error" +#~ msgstr "syntaksfejl" + +#~ msgid "syntax error: cannot back up" +#~ msgstr "syntaksfejl: kan ikke gå tilbage" + +#~ msgid "ISO C forbids an empty source file" +#~ msgstr "ISO C forbyder en tom kildefil" + +#~ msgid "argument of `asm' is not a constant string" +#~ msgstr "parameteren til 'asm' er ikke en konstant streng" + +#~ msgid "ISO C forbids data definition with no type or storage class" +#~ msgstr "ISO C forbyder definition af data uden angivelse af type eller lagringsklasse" + +#~ msgid "data definition has no type or storage class" +#~ msgstr "definition af data uden angivelse af type eller lagringsklasse" + +#~ msgid "ISO C does not allow extra `;' outside of a function" +#~ msgstr "ISO C tillader ikke ekstra ';' uden for funktioner" + +#~ msgid "`sizeof' applied to a bit-field" +#~ msgstr "'sizeof' benyttet på et bitfelt" + +#~ msgid "ISO C forbids omitting the middle term of a ?: expression" +#~ msgstr "ISO C forbyder udeladelse af den midterste del af et '?:'-udtryk" + +#~ msgid "ISO C89 forbids compound literals" +#~ msgstr "ISO C89 forbyder sammensatte konstanter" + +#~ msgid "ISO C forbids braced-groups within expressions" +#~ msgstr "ISO C forbyder sætningsblokke inden i udtryk" + +#~ msgid "first argument to __builtin_choose_expr not a constant" +#~ msgstr "første parameter til '__builtin_choose_expr' skal være en konstant" + +#~ msgid "traditional C rejects ISO C style function definitions" +#~ msgstr "traditionel C tillader ikke ISO C-functionsdefinitioner" + +#~ msgid "`%s' is not at beginning of declaration" +#~ msgstr "'%s' er ikke ved begyndelsen af erklæringen" + +#~ msgid "ISO C forbids empty initializer braces" +#~ msgstr "ISO C forbyder tom startværdiblok" + +#~ msgid "ISO C89 forbids specifying subobject to initialize" +#~ msgstr "ISO C89 forbyder angivelse af underobjekt til klargøring" + +# RETMIG: hm, gad vide om dette er rigtigt +#~ msgid "obsolete use of designated initializer without `='" +#~ msgstr "forældet brug af udpeget startværdi uden '='" + +#~ msgid "obsolete use of designated initializer with `:'" +#~ msgstr "forældet brug af udpeget startværdi med ':'" + +#~ msgid "ISO C forbids specifying range of elements to initialize" +#~ msgstr "ISO C forbyder angivelse af interval af elementer til klargøring" + +#~ msgid "ISO C forbids nested functions" +#~ msgstr "ISO C forbyder indlejrede funktioner" + +#~ msgid "ISO C forbids forward references to `enum' types" +#~ msgstr "ISO C forbyder forhåndsreferencer til 'enum'-typer" + +#~ msgid "comma at end of enumerator list" +#~ msgstr "komma i slutningen af enum-liste" + +#~ msgid "no semicolon at end of struct or union" +#~ msgstr "intet semikolon i slutningen af struct eller union" + +#~ msgid "extra semicolon in struct or union specified" +#~ msgstr "ekstra semikolon angivet i struct eller union" + +#~ msgid "ISO C doesn't support unnamed structs/unions" +#~ msgstr "ISO C understøtter ikke unavngivne struct/union-konstruktioner" + +#~ msgid "ISO C forbids member declarations with no members" +#~ msgstr "ISO C forbyder medlemserklæringer uden medlemmer" + +#~ msgid "deprecated use of label at end of compound statement" +#~ msgstr "forældet brug af etiket i slutningen af sammensat sætning" + +#~ msgid "ISO C89 forbids mixed declarations and code" +#~ msgstr "ISO C89 forbyder blandede erklæringer og kode" + +#~ msgid "ISO C forbids label declarations" +#~ msgstr "ISO C forbyder etiketerklæringer" + +#~ msgid "braced-group within expression allowed only inside a function" +#~ msgstr "sætningsblokke i udtryk er kun tilladt inde i en funktion" + +#~ msgid "empty body in an else-statement" +#~ msgstr "tom krop i en else-sætning" + +#~ msgid "ISO C forbids `goto *expr;'" +#~ msgstr "ISO C forbyder 'goto *udtryk;'" + +#~ msgid "ISO C forbids forward parameter declarations" +#~ msgstr "ISO C forbyder forhåndsparametererklæringer" + +#~ msgid "ISO C requires a named argument before `...'" +#~ msgstr "ISO C påkræver en navngiven parameter før '...'" + +#~ msgid "`...' in old-style identifier list" +#~ msgstr "'...' i gammeldags liste af kaldenavne" + +#~ msgid "parse error; also virtual memory exhausted" +#~ msgstr "tolkningsfejl; desuden løbet tør for virtuel hukommelse" + +#~ msgid "parse error" +#~ msgstr "tolkningsfejl" + +#~ msgid "parser stack overflow" +#~ msgstr "overløb i tolkerens stak" + +#~ msgid "%s at end of input" +#~ msgstr "%s ved slutning af inddata" + +#~ msgid "%s before %s'%c'" +#~ msgstr "%s før %s'%c'" + +#~ msgid "%s before %s'\\x%x'" +#~ msgstr "%s før %s'\\x%x'" + +#~ msgid "%s before string constant" +#~ msgstr "%s før strengkonstant" + +#~ msgid "%s before numeric constant" +#~ msgstr "%s før talkonstant" + +#~ msgid "%s before \"%s\"" +#~ msgstr "%s før \"%s\"" + +#~ msgid "%s before '%s' token" +#~ msgstr "%s før symbolet '%s'" + +#~ msgid "traditional C rejects string concatenation" +#~ msgstr "traditionel C tillader ikke strengsammensætning" + +#~ msgid "syntax error at '%s' token" +#~ msgstr "syntaksfejl ved symbolet '%s'" + +#~ msgid "#pragma pack (pop) encountered without matching #pragma pack (push, )" +#~ msgstr "'#pragma pack (pop)' mødt uden tilsvarende '#pragma pack (push, )'" + +#~ msgid "#pragma pack(pop, %s) encountered without matching #pragma pack(push, %s, )" +#~ msgstr "'#pragma pack(pop, %s)' mødt uden tilsvarende '#pragma pack(push, %s, )'" + +#~ msgid "#pragma pack(push[, id], ) is not supported on this target" +#~ msgstr "#pragma pack(push[, id], ) understøttes ikke på målarkitekturen" + +#~ msgid "#pragma pack(pop[, id], ) is not supported on this target" +#~ msgstr "#pragma pack(pop[, id], ) understøttes ikke på målarkitekturen" + +#~ msgid "missing '(' after '#pragma pack' - ignored" +#~ msgstr "manglende '(' efter '#pragma pack' - ignoreret" + +#~ msgid "malformed '#pragma pack' - ignored" +#~ msgstr "forkert udformet '#pragma pack' - ignoreret" + +#~ msgid "malformed '#pragma pack(push[, id], )' - ignored" +#~ msgstr "forkert udformet '#pragma pack(push[, id], )' - ignoreret" + +#~ msgid "malformed '#pragma pack(pop[, id])' - ignored" +#~ msgstr "forkert udformet '#pragma pack(pop[, id])' - ignoreret" + +#~ msgid "unknown action '%s' for '#pragma pack' - ignored" +#~ msgstr "ukendt handling '%s' for '#pragma pack' - ignoreret" + +#~ msgid "junk at end of '#pragma pack'" +#~ msgstr "ragelse i slutningen af '#pragma pack'" + +#~ msgid "alignment must be a small power of two, not %d" +#~ msgstr "justering skal være en lille potens af to, ikke %d" + +#~ msgid "applying #pragma weak `%s' after first use results in unspecified behavior" +#~ msgstr "anvendelse af #pragma weak '%s' efter første brug resulterer i ikke-defineret opførsel" + +#~ msgid "malformed #pragma weak, ignored" +#~ msgstr "forkert udformet '#pragma weak' - ignoreret" + +#~ msgid "junk at end of #pragma weak" +#~ msgstr "ragelse i slutningen af '#pragma weak'" + +#~ msgid "malformed #pragma redefine_extname, ignored" +#~ msgstr "forkert udformet '#pragma redefine_extname' - ignoreret" + +#~ msgid "junk at end of #pragma redefine_extname" +#~ msgstr "ragelse i slutningen af '#pragma redefine_extname'" + +#~ msgid "#pragma redefine_extname conflicts with declaration" +#~ msgstr "#pragma redefine_extname er i konflikt med erklæring" + +#~ msgid "malformed #pragma extern_prefix, ignored" +#~ msgstr "forkert udformet '#pragma extern_prefix' - ignoreret" + +#~ msgid "junk at end of #pragma extern_prefix" +#~ msgstr "ragelse i slutningen af '#pragma extern_prefix'" + +#~ msgid "asm declaration conflicts with previous rename" +#~ msgstr "asm-erklæring er i konflikt med tidligere omdøbelse" + +#~ msgid "break statement not within loop or switch" +#~ msgstr "break-sætning befinder sig ikke i en løkke- eller switch-konstruktion" + +#~ msgid "continue statement not within a loop" +#~ msgstr "continue-sætning befinder sig ikke i en løkke" + +#~ msgid "destructor needed for `%#D'" +#~ msgstr "destruktionsfunktion påkrævet til '%#D'" + +#~ msgid "where case label appears here" +#~ msgstr "hvor case-etiket optræder her" + +#~ msgid "(enclose actions of previous case statements requiring destructors in their own scope.)" +#~ msgstr "(indesluttede handlinger fra tidligere case-sætninger kræver destruktionsfunktioner i deres eget virkefelt)" + +#~ msgid "%s qualifier ignored on asm" +#~ msgstr "%s-modifikation ignoreret ved asm" + +#~ msgid "`%s' has an incomplete type" +#~ msgstr "'%s' er af en ufuldstændig type" + +#~ msgid "invalid use of void expression" +#~ msgstr "ugyldig brug af void-udtryk" + +#~ msgid "invalid use of flexible array member" +#~ msgstr "ugyldig brug af fleksibelt tabelmedlem" + +#~ msgid "invalid use of array with unspecified bounds" +#~ msgstr "ugyldig brug af tabel uden angivne grænser" + +#~ msgid "invalid use of undefined type `%s %s'" +#~ msgstr "ugyldig brug af en type '%s %s' der ikke er defineret" + +#~ msgid "invalid use of incomplete typedef `%s'" +#~ msgstr "ugyldig brug af ufuldstændig typedef '%s'" + +#~ msgid "function types not truly compatible in ISO C" +#~ msgstr "funktionstyper ikke er fuldt ud forenelige i ISO C" + +#~ msgid "types are not quite compatible" +#~ msgstr "typer er ikke helt forenelige" + +#~ msgid "arithmetic on pointer to an incomplete type" +#~ msgstr "beregninger udført på en henvisning til en ufuldstændig type" + +#~ msgid "%s has no member named `%s'" +#~ msgstr "%s har intet medlem ved navn '%s'" + +#~ msgid "request for member `%s' in something not a structure or union" +#~ msgstr "forespørgsel efter medlemmet '%s' i noget der hverken er en union eller en struktur" + +#~ msgid "dereferencing pointer to incomplete type" +#~ msgstr "forsøg på at følge en henvisning til en variabel af en ufuldstændig type" + +#~ msgid "dereferencing `void *' pointer" +#~ msgstr "forsøg på at følge en 'void *'-henvisning" + +#~ msgid "invalid type argument of `%s'" +#~ msgstr "ugyldig typeparameter '%s'" + +#~ msgid "subscript missing in array reference" +#~ msgstr "indeks mangler i tabelopslag" + +#~ msgid "array subscript has type `char'" +#~ msgstr "tabelindeks er af typen 'char'" + +#~ msgid "array subscript is not an integer" +#~ msgstr "tabelindeks er ikke et heltal" + +#~ msgid "ISO C forbids subscripting `register' array" +#~ msgstr "ISO C forbyder opslag i 'register'-tabel" + +#~ msgid "ISO C90 forbids subscripting non-lvalue array" +#~ msgstr "ISO C90 forbyder opslag i tabel der ikke er venstreværdi" + +#~ msgid "subscript has type `char'" +#~ msgstr "indeks er af typen 'char'" + +#~ msgid "subscripted value is neither array nor pointer" +#~ msgstr "værdien der er påført et indeks, er hverken en tabel eller en henvisningsvariabel" + +#~ msgid "`%s' undeclared here (not in a function)" +#~ msgstr "'%s' ikke erklæret her (ikke i en funktion)" + +#~ msgid "`%s' undeclared (first use in this function)" +#~ msgstr "'%s' er ikke erklæret (først benyttet i denne funktion)" + +#~ msgid "(Each undeclared identifier is reported only once" +#~ msgstr "(et kaldenavn der ikke er erklæret, rapporteres kun én gang" + +#~ msgid "for each function it appears in.)" +#~ msgstr "per funktion)" + +#~ msgid "local declaration of `%s' hides instance variable" +#~ msgstr "den lokale erklæring af funktionen '%s' skjuler instansvariabel" + +#~ msgid "called object is not a function" +#~ msgstr "det kaldte objekt er ikke en funktion" + +#~ msgid "too many arguments to function" +#~ msgstr "for mange parametre til funktionen" + +#~ msgid "type of formal parameter %d is incomplete" +#~ msgstr "typen af den formelle parameter %d er ufuldstændig" + +#~ msgid "%s as integer rather than floating due to prototype" +#~ msgstr "%s som heltal i stedet for kommatal på grund af prototypen" + +#~ msgid "%s as integer rather than complex due to prototype" +#~ msgstr "%s som heltal i stedet for complex på grund af prototypen" + +#~ msgid "%s as complex rather than floating due to prototype" +#~ msgstr "%s som complex i stedet for kommatal på grund af prototypen" + +#~ msgid "%s as floating rather than integer due to prototype" +#~ msgstr "%s som kommatal i stedet for heltal på grund af prototypen" + +#~ msgid "%s as complex rather than integer due to prototype" +#~ msgstr "%s som complex i stedet for heltal på grund af prototypen" + +#~ msgid "%s as floating rather than complex due to prototype" +#~ msgstr "%s som kommatal i stedet for complex på grund af prototypen" + +#~ msgid "%s as `float' rather than `double' due to prototype" +#~ msgstr "%s som float i stedet for double på grund af prototypen" + +#~ msgid "%s with different width due to prototype" +#~ msgstr "%s med anderledes bredde på grund af prototypen" + +#~ msgid "%s as unsigned due to prototype" +#~ msgstr "%s som unsigned på grund af prototypen" + +#~ msgid "%s as signed due to prototype" +#~ msgstr "%s som signed på grund af prototypen" + +#~ msgid "too few arguments to function" +#~ msgstr "for få parametre til funktionen" + +#~ msgid "suggest parentheses around + or - inside shift" +#~ msgstr "foreslår paranteser omkring + eller - inden i skifteoperation" + +#~ msgid "suggest parentheses around && within ||" +#~ msgstr "foreslår paranteser omkring && inden i ||" + +#~ msgid "suggest parentheses around arithmetic in operand of |" +#~ msgstr "foreslår paranteser omkring beregning i operand til |" + +#~ msgid "suggest parentheses around comparison in operand of |" +#~ msgstr "foreslår paranteser omkring sammenligning i operand til |" + +#~ msgid "suggest parentheses around arithmetic in operand of ^" +#~ msgstr "foreslår paranteser omkring beregning i operand til ^" + +#~ msgid "suggest parentheses around comparison in operand of ^" +#~ msgstr "foreslår paranteser omkring sammenligning i operand til ^" + +#~ msgid "suggest parentheses around + or - in operand of &" +#~ msgstr "foreslår paranteser omkring + eller - i operand til &" + +#~ msgid "suggest parentheses around comparison in operand of &" +#~ msgstr "foreslår paranteser omkring sammenligning i operand til &" + +#~ msgid "comparisons like X<=Y<=Z do not have their mathematical meaning" +#~ msgstr "sammenligninger som 'x <= y <= z' følger ikke den matematiske betydning" + +#~ msgid "division by zero" +#~ msgstr "division med nul" + +#~ msgid "right shift count is negative" +#~ msgstr "højreskiftsantal er negativ" + +#~ msgid "right shift count >= width of type" +#~ msgstr "højreskiftsantal er større end bredden af typen" + +#~ msgid "left shift count is negative" +#~ msgstr "venstreskiftsantal er negativ" + +#~ msgid "left shift count >= width of type" +#~ msgstr "venstreskiftsantal er større end bredden af typen" + +#~ msgid "shift count is negative" +#~ msgstr "skifteantal er negativ" + +#~ msgid "shift count >= width of type" +#~ msgstr "skifteantal er større end bredden af typen" + +#~ msgid "comparing floating point with == or != is unsafe" +#~ msgstr "sammenligning af kommatal med == eller != er ikke sikkert" + +#~ msgid "ISO C forbids comparison of `void *' with function pointer" +#~ msgstr "ISO C forbyder sammenligning af 'void *' med funktionshenvisning" + +#~ msgid "comparison of distinct pointer types lacks a cast" +#~ msgstr "sammenligning med forskellige henvisningstyper mangler en typeomtvingelse" + +#~ msgid "comparison between pointer and integer" +#~ msgstr "sammenligning mellem henvisningsvariabel og heltal" + +#~ msgid "ISO C forbids ordered comparisons of pointers to functions" +#~ msgstr "ISO C forbyder ordnede sammenligninger af henvisninger til funktioner" + +#~ msgid "comparison of complete and incomplete pointers" +#~ msgstr "sammenligning mellem en fuldstændig og ufuldstændig henvisning" + +#~ msgid "ordered comparison of pointer with integer zero" +#~ msgstr "ordnet sammenligning af henvisning med heltallet nul" + +#~ msgid "unordered comparison on non-floating point argument" +#~ msgstr "uordnet sammenligning af ikke-kommatalsparameter" + +#~ msgid "comparison between signed and unsigned" +#~ msgstr "sammenligning mellem signed og unsigned" + +#~ msgid "comparison of promoted ~unsigned with constant" +#~ msgstr "sammenligning af forfremmet ~unsigned med konstant" + +#~ msgid "comparison of promoted ~unsigned with unsigned" +#~ msgstr "sammenligning af forfremmet ~unsigned med unsigned" + +#~ msgid "pointer of type `void *' used in subtraction" +#~ msgstr "henvisning af typen 'void *' benyttet i subtraktion" + +#~ msgid "pointer to a function used in subtraction" +#~ msgstr "henvisning til en funktion benyttet i subtraktion" + +#~ msgid "wrong type argument to unary plus" +#~ msgstr "forkert parametertype til unært plus" + +#~ msgid "wrong type argument to unary minus" +#~ msgstr "forkert parametertype til unært minus" + +#~ msgid "ISO C does not support `~' for complex conjugation" +#~ msgstr "ISO C understøtter ikke '~' til compleks-konjugering" + +#~ msgid "wrong type argument to bit-complement" +#~ msgstr "forkert parametertype til bitkomplement" + +#~ msgid "wrong type argument to abs" +#~ msgstr "forkert parametertype til abs" + +#~ msgid "wrong type argument to conjugation" +#~ msgstr "forkert parametertype til konjugation" + +#~ msgid "wrong type argument to unary exclamation mark" +#~ msgstr "forkert parametertype til unært udråbstegn" + +#~ msgid "ISO C does not support `++' and `--' on complex types" +#~ msgstr "ISO C understøtter ikke '++' og '--' for complex-typer" + +# man kan ikke stikke en forøgelse (++) en type som parameter, 'type +# argument' skal opfattes på en anden måde +#~ msgid "wrong type argument to increment" +#~ msgstr "forkert parametertype til forøgelse" + +#~ msgid "wrong type argument to decrement" +#~ msgstr "forkert parametertype til formindskelse" + +#~ msgid "increment of pointer to unknown structure" +#~ msgstr "forøgelse af henvisning til en ukendt struktur" + +#~ msgid "decrement of pointer to unknown structure" +#~ msgstr "formindskelse af henvisning til en ukendt struktur" + +# RETMIG: hvad betyder dette? +#~ msgid "ISO C forbids the address of a cast expression" +#~ msgstr "ISO C forbyder adressen af et typeomtvingningsudtryk" + +#~ msgid "invalid lvalue in unary `&'" +#~ msgstr "ugyldig venstreværdi i unær '&'" + +#~ msgid "attempt to take address of bit-field structure member `%s'" +#~ msgstr "forsøg på at finde adressen af bitfeltstrukturmedlemmet '%s'" + +#~ msgid "%s" +#~ msgstr "%s" + +#~ msgid "ISO C forbids use of conditional expressions as lvalues" +#~ msgstr "ISO C forbyder brug af betingede udtryk som venstreværdier" + +#~ msgid "ISO C forbids use of compound expressions as lvalues" +#~ msgstr "ISO C forbyder brug af sammensatte udtryk som venstreværdier" + +#~ msgid "ISO C forbids use of cast expressions as lvalues" +#~ msgstr "ISO C forbyder brug af typeomtvingningsudtryk som venstreværdier" + +# RETMIG: lettere klodset konstruktion +#~ msgid "%s of read-only member `%s'" +#~ msgstr "%s af medlemmet '%s' der kun må læses" + +#~ msgid "%s of read-only variable `%s'" +#~ msgstr "%s af variablen '%s' der kun må læses" + +#~ msgid "%s of read-only location" +#~ msgstr "%s af placering der kun må læses" + +#~ msgid "cannot take address of bit-field `%s'" +#~ msgstr "kan ikke finde adressen af bitfeltet '%s'" + +#~ msgid "global register variable `%s' used in nested function" +#~ msgstr "global registervariabel '%s' benyttet i indlejret funktion" + +#~ msgid "register variable `%s' used in nested function" +#~ msgstr "registervariabel '%s' benyttet i indlejret funktion" + +#~ msgid "address of global register variable `%s' requested" +#~ msgstr "forespørgsel efter adressen af den globale registervariabel '%s'" + +#~ msgid "cannot put object with volatile field into register" +#~ msgstr "kan ikke anbringe et objekt med et volatile-felt i et register" + +#~ msgid "address of register variable `%s' requested" +#~ msgstr "forespørgsel efter adressen af registervariablen '%s'" + +#~ msgid "signed and unsigned type in conditional expression" +#~ msgstr "signed og unsigned type i betinget udtryk" + +#~ msgid "ISO C forbids conditional expr with only one void side" +#~ msgstr "ISO C forbyder betingede udtryk med kun én tom side" + +#~ msgid "ISO C forbids conditional expr between `void *' and function pointer" +#~ msgstr "ISO C++ forbyder betinget udtryk mellem 'void *' og funktionshenvisning" + +#~ msgid "pointer type mismatch in conditional expression" +#~ msgstr "henvisningstyperne i betingelsesudtrykket passer ikke sammen" + +#~ msgid "pointer/integer type mismatch in conditional expression" +#~ msgstr "henvisnings- og heltalstype i betingelsesudtrykket passer ikke sammen" + +#~ msgid "type mismatch in conditional expression" +#~ msgstr "typerne i betingelsesudtrykket passer ikke sammen" + +#~ msgid "left-hand operand of comma expression has no effect" +#~ msgstr "venstreoperanden til kommaudtrykket har ingen virkning" + +#~ msgid "cast specifies array type" +#~ msgstr "typetildelingen angiver en tabeltype" + +#~ msgid "cast specifies function type" +#~ msgstr "typetildelingen angiver en funktionstype" + +#~ msgid "ISO C forbids casting nonscalar to the same type" +#~ msgstr "ISO C forbyder omtvingelse af ikke-skalar til den samme type" + +#~ msgid "ISO C forbids casts to union type" +#~ msgstr "ISO C forbyder omtvingelse til uniontype" + +#~ msgid "cast to union type from type not present in union" +#~ msgstr "typetildeling til en uniontype fra en type der ikke findes i union'en" + +#~ msgid "cast adds new qualifiers to function type" +#~ msgstr "typeomtvingning tilføjer modifikationer til en funktionstype" + +#~ msgid "cast discards qualifiers from pointer target type" +#~ msgstr "typeomtvingelse kasserer modifikationer på henvisningsmålets type" + +#~ msgid "cast increases required alignment of target type" +#~ msgstr "typeomtvingelse forøger den påkrævne justering af måltypen" + +#~ msgid "cast from pointer to integer of different size" +#~ msgstr "typeomtvingelse fra henvisning til heltal af en anden størrelse" + +#~ msgid "cast does not match function type" +#~ msgstr "typeomtvingelse passer ikke til funktionstype" + +#~ msgid "cast to pointer from integer of different size" +#~ msgstr "typeomtvingelse fra heltal til henvisning af en anden størrelse" + +#~ msgid "type-punning to incomplete type might break strict-aliasing rules" +#~ msgstr "typeomtvingning af ufuldstændig type bryder muligvis strenge aliasregler" + +#~ msgid "dereferencing type-punned pointer will break strict-aliasing rules" +#~ msgstr "følgning af en typeomtvunget henvisning vil bryde strenge aliasregler" + +#~ msgid "invalid lvalue in assignment" +#~ msgstr "ugyldig venstreværdi i tildeling" + +#~ msgid "assignment" +#~ msgstr "tildeling" + +#~ msgid "cannot pass rvalue to reference parameter" +#~ msgstr "kan ikke videregive højreværdi til referenceparameter" + +#~ msgid "%s makes qualified function pointer from unqualified" +#~ msgstr "%s opretter en funktionshenvisning med modifikationer fra én uden" + +#~ msgid "%s discards qualifiers from pointer target type" +#~ msgstr "%s kasserer modifikationer på henvisningsmålets type" + +#~ msgid "ISO C prohibits argument conversion to union type" +#~ msgstr "ISO C forbyder parameterkonvertering til uniontype" + +#~ msgid "ISO C forbids %s between function pointer and `void *'" +#~ msgstr "ISO C forbyder %s mellem funktionshenvisning og 'void *'" + +#~ msgid "pointer targets in %s differ in signedness" +#~ msgstr "fortegnene i henvisningsmål i %s er forskellige" + +#~ msgid "%s from incompatible pointer type" +#~ msgstr "%s fra en henvisningstype der ikke er forenelig med målets" + +#~ msgid "%s makes pointer from integer without a cast" +#~ msgstr "%s opretter en henvisningsvariabel ud fra et heltal uden en typeomtvingning" + +#~ msgid "%s makes integer from pointer without a cast" +#~ msgstr "%s opretter et heltal ud fra en henvisningsvariabel uden en typeomtvingning" + +#~ msgid "incompatible type for argument %d of `%s'" +#~ msgstr "typen af den %d. parameter i '%s' passer ikke" + +#~ msgid "incompatible type for argument %d of indirect function call" +#~ msgstr "typen af den %d. parameter i det indirekte funktionskald passer ikke" + +#~ msgid "incompatible types in %s" +#~ msgstr "uforenelige typer i %s" + +#~ msgid "passing arg of `%s'" +#~ msgstr "videregiver parameter til '%s'" + +#~ msgid "passing arg of pointer to function" +#~ msgstr "videregiver parameter af henvisning til funktion" + +#~ msgid "passing arg %d of `%s'" +#~ msgstr "videregiver den %d. parameter til '%s'" + +#~ msgid "passing arg %d of pointer to function" +#~ msgstr "videregiver den %d. parameter af henvisning til funktion" + +#~ msgid "initializer for static variable is not constant" +#~ msgstr "startværdien for den statiske variabel er ikke en konstant" + +#~ msgid "initializer for static variable uses complicated arithmetic" +#~ msgstr "startværdien for den statiske variabel benytter komplicerede beregninger" + +#~ msgid "aggregate initializer is not constant" +#~ msgstr "startværdi til variabel af en sammensat type er ikke en konstant" + +#~ msgid "aggregate initializer uses complicated arithmetic" +#~ msgstr "startværdien til variabel af en sammensat type benytter komplicerede beregninger" + +# 'automatic aggregate' betyder automatisk allokerede variabler, dvs. +# ganske almindelige lokale variabler (kan evt. erklæres med 'auto') +#~ msgid "traditional C rejects automatic aggregate initialization" +#~ msgstr "traditionel C forbyder klargøring af auto-variabler af sammensatte typer" + +#~ msgid "(near initialization for `%s')" +#~ msgstr "(i nærheden af klargøringen af '%s')" + +#~ msgid "char-array initialized from wide string" +#~ msgstr "char-tabel får tildelt startværdi fra en bred streng" + +#~ msgid "int-array initialized from non-wide string" +#~ msgstr "int-tabel får tildelt startværdi fra en ikke-bred streng" + +#~ msgid "initializer-string for array of chars is too long" +#~ msgstr "startværdistrengen til char-tabellen er for lang" + +#~ msgid "array initialized from non-constant array expression" +#~ msgstr "tabel får tildelt en startværdi fra et tabeludtryk der ikke er konstant" + +#~ msgid "initializer element is not constant" +#~ msgstr "startværdielement er ikke en konstant" + +#~ msgid "initialization" +#~ msgstr "klargøring" + +#~ msgid "initializer element is not computable at load time" +#~ msgstr "startværdielement kan ikke beregnes ved indlæsningstidspunktet" + +#~ msgid "invalid initializer" +#~ msgstr "ugyldig startværdi" + +#~ msgid "extra brace group at end of initializer" +#~ msgstr "overskydende krøllede paranteser ved slutningen af startværdien" + +#~ msgid "missing braces around initializer" +#~ msgstr "krøllede paranteser mangler omkring startværdien" + +#~ msgid "braces around scalar initializer" +#~ msgstr "krøllede paranteser omkring skalarstartværdi" + +# RETMIG: eller er det fleksibel tabel-medlem +#~ msgid "initialization of flexible array member in a nested context" +#~ msgstr "klargøring af fleksibelt tabelmedlem i en indlejret kontekst" + +#~ msgid "initialization of a flexible array member" +#~ msgstr "klargøring af fleksibelt tabelmedlem" + +#~ msgid "missing initializer" +#~ msgstr "manglende startværdi" + +#~ msgid "empty scalar initializer" +#~ msgstr "tom skalarstartværdi" + +#~ msgid "extra elements in scalar initializer" +#~ msgstr "overskydende elementer i skalarstarværdi" + +#~ msgid "initialization designators may not nest" +#~ msgstr "klargøringstegn må ikke indlejres" + +#~ msgid "array index in non-array initializer" +#~ msgstr "tabelindeks i en startværdi der ikke er en tabel" + +# RETMIG: record? +#~ msgid "field name not in record or union initializer" +#~ msgstr "feltnavn ikke i struktur- eller union-startværdi" + +#~ msgid "nonconstant array index in initializer" +#~ msgstr "tabelindekset i startværdien er ikke en konstant" + +#~ msgid "array index in initializer exceeds array bounds" +#~ msgstr "tabelindeks i startværdi overskrider tabelgrænser" + +#~ msgid "empty index range in initializer" +#~ msgstr "tomt indeksinterval i startværdi" + +#~ msgid "array index range in initializer exceeds array bounds" +#~ msgstr "tabelindeksinterval i startværdi overskrider tabelgrænser" + +#~ msgid "unknown field `%s' specified in initializer" +#~ msgstr "ukendt felt '%s' angivet i startværdi" + +#~ msgid "initialized field with side-effects overwritten" +#~ msgstr "klargjort felt med bivirkninger overskrevet" + +#~ msgid "excess elements in char array initializer" +#~ msgstr "for mange elementer i char-tabelstartværdien" + +#~ msgid "excess elements in struct initializer" +#~ msgstr "for mange elementer i struct-startværdi" + +#~ msgid "non-static initialization of a flexible array member" +#~ msgstr "ikke-statisk klargøring af fleksibelt tabelmedlem" + +#~ msgid "excess elements in union initializer" +#~ msgstr "for mange elementer i union-startværdi" + +#~ msgid "traditional C rejects initialization of unions" +#~ msgstr "traditionel C forbyder tildeling af startværdi til unioner" + +#~ msgid "excess elements in array initializer" +#~ msgstr "for mange elementer i tabelstartværdi" + +#~ msgid "excess elements in vector initializer" +#~ msgstr "for mange elementer i vektorstartværdi" + +#~ msgid "excess elements in scalar initializer" +#~ msgstr "for mange elementer i skalarstartværdi" + +#~ msgid "asm template is not a string constant" +#~ msgstr "asm-sætning er ikke en strengkonstant" + +#~ msgid "invalid lvalue in asm statement" +#~ msgstr "ugyldig venstreværdi i asm-sætning" + +#~ msgid "modification by `asm'" +#~ msgstr "ændring af 'asm'" + +#~ msgid "function declared `noreturn' has a `return' statement" +#~ msgstr "funktion der er erklæret 'noreturn' har en 'return'-sætning" + +#~ msgid "`return' with no value, in function returning non-void" +#~ msgstr "'return' uden nogen værdi i en funktion der ikke returnerer void" + +#~ msgid "`return' with a value, in function returning void" +#~ msgstr "'return' med en værdi i en funktion der returnerer void" + +#~ msgid "return" +#~ msgstr "returnering" + +#~ msgid "function returns address of local variable" +#~ msgstr "funktion returnerer adressen på en lokal variabel" + +#~ msgid "switch quantity not an integer" +#~ msgstr "switch-størrelsen er ikke et heltal" + +#~ msgid "`long' switch expression not converted to `int' in ISO C" +#~ msgstr "'long'-udtryk i switch konverteres ikke til 'int' i ISO C" + +#~ msgid "case label not within a switch statement" +#~ msgstr "case-etiket befinder sig ikke inden i en switch-sætning" + +#~ msgid "`default' label not within a switch statement" +#~ msgstr "'default'-etiket befinder sig ikke inden i en switch-sætning" + +#~ msgid "inlining failed in call to `%s'" +#~ msgstr "indlejring mislykkedes i kald til '%s'" + +#~ msgid "called from here" +#~ msgstr "kaldt herfra" + +#~ msgid "can't inline call to `%s'" +#~ msgstr "kan ikke indlejre kald til '%s'" + +#~ msgid "function call has aggregate value" +#~ msgstr "funktionskald har en sammensat værdi" + +#~ msgid "Size of loop %d should be %d, not %d." +#~ msgstr "Størrelsen af løkke %d burde være %d, ikke %d." + +#~ msgid "Bb %d do not belong to loop %d." +#~ msgstr "Basisblok %d hører ikke til løkke %d." + +#~ msgid "Loop %d's header does not have exactly 2 entries." +#~ msgstr "Løkke %d's hoved har ikke præcis 2 elementer." + +#~ msgid "Loop %d's latch does not have exactly 1 successor." +#~ msgstr "Løkke %d's ende har ikke præcis 1 efterfølger." + +#~ msgid "Loop %d's latch does not have header as successor." +#~ msgstr "Løkke %d's ende har ikke hoved som efterfølger." + +#~ msgid "Loop %d's latch does not belong directly to it." +#~ msgstr "Løkke %d's ende tilhører ikke direkte løkken." + +#~ msgid "Loop %d's header does not belong directly to it." +#~ msgstr "Løkke %d's hoved tilhører ikke direkte løkken." + +#~ msgid "bb %d on wrong place" +#~ msgstr "basisblok %d ved et forkerte sted" + +#~ msgid "prev_bb of %d should be %d, not %d" +#~ msgstr "prev_bb for %d bør være %d, ikke %d" + +#~ msgid "end insn %d for block %d not found in the insn stream" +#~ msgstr "slutinstruktion %d for blok %d ikke fundet i instruktionsstrømmen" + +#~ msgid "insn %d is in multiple basic blocks (%d and %d)" +#~ msgstr "instruktion %d er i flere basisblokke (%d og %d)" + +#~ msgid "head insn %d for block %d not found in the insn stream" +#~ msgstr "hovedinstruktion %d for blok %d ikke fundet i instruktionsstrømmen" + +#~ msgid "verify_flow_info: REG_BR_PROB does not match cfg %i %i" +#~ msgstr "verify_flow_info: REG_BR_PROB passer ikke til konf. %i %i" + +#~ msgid "verify_flow_info: Wrong count of block %i %i" +#~ msgstr "verify_flow_info: Ukorrekt antal af blok %i %i" + +#~ msgid "verify_flow_info: Wrong frequency of block %i %i" +#~ msgstr "verify_flow_info: Ukorrekt frekvens af blok %i %i" + +#~ msgid "verify_flow_info: Duplicate edge %i->%i" +#~ msgstr "verify_flow_info: Dobbelt kant %i->%i" + +#~ msgid "verify_flow_info: Wrong probability of edge %i->%i %i" +#~ msgstr "verify_flow_info: Ukorrekt sandsynlighed for kant %i->%i %i" + +#~ msgid "verify_flow_info: Wrong count of edge %i->%i %i" +#~ msgstr "verify_flow_info: Ukorrekt antal for kant %i->%i %i" + +#~ msgid "verify_flow_info: Incorrect blocks for fallthru %i->%i" +#~ msgstr "verify_flow_info: Ukorrekte blokke til fald-gennem %i->%i" + +#~ msgid "verify_flow_info: Incorrect fallthru %i->%i" +#~ msgstr "verify_flow_info: Ukorrekt fald-gennem %i->%i" + +#~ msgid "wrong insn in the fallthru edge" +#~ msgstr "forkert instruktion i fald-gennem-kant" + +#~ msgid "verify_flow_info: Basic block %d succ edge is corrupted" +#~ msgstr "verify_flow_info: Efterfølgende kant til basisblok %d er ødelagt" + +#~ msgid "Missing REG_EH_REGION note in the end of bb %i" +#~ msgstr "Mangler REG_EH_REGION-note i slutningen af basisblok %i" + +#~ msgid "Too many outgoing branch edges from bb %i" +#~ msgstr "For mange udgående forgreningskanter fra basisblok %i" + +#~ msgid "Fallthru edge after unconditional jump %i" +#~ msgstr "Fald gennem-kant efter ubetinget spring %i" + +#~ msgid "Wrong amount of branch edges after unconditional jump %i" +#~ msgstr "Forkert antal forgreningskanter efter ubetinget spring %i" + +#~ msgid "Wrong amount of branch edges after conditional jump %i" +#~ msgstr "Forkert antal forgreningskanter efter betinget spring %i" + +#~ msgid "Call edges for non-call insn in bb %i" +#~ msgstr "Kaldekanter for ikke-kaldsinstruktion i basisblok %i" + +#~ msgid "Abnormal edges for no purpose in bb %i" +#~ msgstr "Unormale kanter uden noget formål i basisblok %i" + +#~ msgid "missing barrier after block %i" +#~ msgstr "manglende barriere efter blok %i" + +#~ msgid "basic block %d pred edge is corrupted" +#~ msgstr "foregående kant til basisblok %d er ødelagt" + +#~ msgid "insn %d inside basic block %d but block_for_insn is NULL" +#~ msgstr "instruktion %d inden i basisblok %d, men block_for_insn er NULL" + +#~ msgid "insn %d inside basic block %d but block_for_insn is %i" +#~ msgstr "instruktion %d inden i basisblok %d, men block_for_insn er %i" + +#~ msgid "NOTE_INSN_BASIC_BLOCK is missing for block %d" +#~ msgstr "NOTE_INSN_BASIC_BLOCK mangler for blok %d" + +#~ msgid "NOTE_INSN_BASIC_BLOCK %d in middle of basic block %d" +#~ msgstr "NOTE_INSN_BASIC_BLOCK %d i midten af basisblok %d" + +#~ msgid "in basic block %d:" +#~ msgstr "i basisblok %d:" + +#~ msgid "flow control insn inside a basic block" +#~ msgstr "strømkontrolinstruktion inden i en basisblok" + +#~ msgid "basic block %i edge lists are corrupted" +#~ msgstr "kantlister til basisblok %i er ødelagt" + +#~ msgid "basic blocks not numbered consecutively" +#~ msgstr "basisblokkene er ikke nummeret i rækkefølge" + +#~ msgid "insn outside basic block" +#~ msgstr "instruktion uden for basisblok" + +#~ msgid "return not followed by barrier" +#~ msgstr "returnering følges ikke af barriere" + +#~ msgid "number of bb notes in insn chain (%d) != n_basic_blocks (%d)" +#~ msgstr "antallet af basisbloknoter i instruktionskæden (%d) != n_basic_blocks (%d)" + +#~ msgid "verify_flow_info failed" +#~ msgstr "verify_flow_info mislykkedes" + +#~ msgid "internal error" +#~ msgstr "intern fejl" + +#~ msgid "no arguments" +#~ msgstr "ingen parametre" + +#~ msgid "fopen %s" +#~ msgstr "fopen %s" + +#~ msgid "fclose %s" +#~ msgstr "fclose %s" + +#~ msgid "collect2 version %s" +#~ msgstr "collect2 version %s" + +#~ msgid "%d constructor(s) found\n" +#~ msgstr "%d konstruktionsfunktion(er) fundet\n" + +#~ msgid "%d destructor(s) found\n" +#~ msgstr "%d destruktionsfunktion(er) fundet\n" + +#~ msgid "%d frame table(s) found\n" +#~ msgstr "%d rammetabel(ler) fundet\n" + +#~ msgid "%s terminated with signal %d [%s]%s" +#~ msgstr "%s afsluttet af signal %d [%s]%s" + +#~ msgid "%s returned %d exit status" +#~ msgstr "%s returnerede afslutningskoden %d" + +#~ msgid "[cannot find %s]" +#~ msgstr "[kan ikke finde %s]" + +#~ msgid "cannot find `%s'" +#~ msgstr "kan ikke finde '%s'" + +#~ msgid "redirecting stdout: %s" +#~ msgstr "omdirigerer standard-ud: %s" + +#~ msgid "[Leaving %s]\n" +#~ msgstr "[Efterlader %s]\n" + +#~ msgid "" +#~ "\n" +#~ "write_c_file - output name is %s, prefix is %s\n" +#~ msgstr "" +#~ "\n" +#~ "write_c_file - uddatanavnet er %s, præfikset er %s\n" + +#~ msgid "cannot find `nm'" +#~ msgstr "kan ikke finde 'nm'" + +#~ msgid "pipe" +#~ msgstr "pipe" + +#~ msgid "fdopen" +#~ msgstr "fdopen" + +#~ msgid "dup2 %d 1" +#~ msgstr "dup2 %d 1" + +#~ msgid "close %d" +#~ msgstr "close %d" + +#~ msgid "execv %s" +#~ msgstr "fejl under kørsel (vha. execv) af %s" + +#~ msgid "init function found in object %s" +#~ msgstr "klargøringsfunktion fundet i objekt %s" + +#~ msgid "fini function found in object %s" +#~ msgstr "afslutningsfunktion fundet i objekt %s" + +#~ msgid "fclose" +#~ msgstr "fclose" + +#~ msgid "unable to open file '%s'" +#~ msgstr "kunne ikke åbne filen '%s'" + +#~ msgid "unable to stat file '%s'" +#~ msgstr "kunne ikke få fat i oplysninger om filen '%s'" + +#~ msgid "unable to mmap file '%s'" +#~ msgstr "kunne ikke indlæse filen '%s'" + +#~ msgid "not found\n" +#~ msgstr "ikke fundet\n" + +#~ msgid "dynamic dependency %s not found" +#~ msgstr "dynamisk afhængighed %s ikke fundet" + +#~ msgid "bad magic number in file '%s'" +#~ msgstr "ugyldigt magisk tal i filen '%s'" + +#~ msgid "dynamic dependencies.\n" +#~ msgstr "dynamiske afhængigheder.\n" + +#~ msgid "cannot find `ldd'" +#~ msgstr "kan ikke finde 'ldd'" + +#~ msgid "" +#~ "\n" +#~ "ldd output with constructors/destructors.\n" +#~ msgstr "" +#~ "\n" +#~ "ldd-uddata med konstruktions-/destruktionsfunktioner.\n" + +#~ msgid "unable to open dynamic dependency '%s'" +#~ msgstr "kan ikke åbne den dynamiske afhængighed '%s'" + +#~ msgid "%s: not a COFF file" +#~ msgstr "%s: ikke en COFF-fil" + +#~ msgid "%s: cannot open as COFF file" +#~ msgstr "%s: kan ikke åbnes som en COFF-fil" + +#~ msgid "library lib%s not found" +#~ msgstr "biblioteket lib%s ikke fundet" + +#~ msgid "open %s" +#~ msgstr "fejl ved åbning af %s" + +#~ msgid "incompatibilities between object file & expected values" +#~ msgstr "uoverensstemmelser mellem objektfil og forventede værdier" + +#~ msgid "" +#~ "\n" +#~ "Processing symbol table #%d, offset = 0x%.8lx, kind = %s\n" +#~ msgstr "" +#~ "\n" +#~ "Behandler symboltabel nr. %d, forskydning = 0x%.8lx, form = %s\n" + +#~ msgid "string section missing" +#~ msgstr "strengsektion mangler" + +#~ msgid "section pointer missing" +#~ msgstr "sektionshenvisning mangler" + +#~ msgid "no symbol table found" +#~ msgstr "ingen symboltabel fundet" + +#~ msgid "no cmd_strings found" +#~ msgstr "ingen cmd_strings fundet" + +#~ msgid "" +#~ "\n" +#~ "Updating header and load commands.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Opdaterer hoved- og indlæsningskommandoer.\n" +#~ "\n" + +#~ msgid "load command map, %d cmds, new size %ld.\n" +#~ msgstr "indlæser kommandooversigt, %d kommandoer, ny størrelse %ld.\n" + +#~ msgid "" +#~ "writing load commands.\n" +#~ "\n" +#~ msgstr "" +#~ "skriver indlæsningskommandoer.\n" +#~ "\n" + +#~ msgid "close %s" +#~ msgstr "fejl ved lukning af %s" + +#~ msgid "could not convert 0x%l.8x into a region" +#~ msgstr "kunne ikke konvertere 0x%l.8x til en region" + +#~ msgid "%s function, region %d, offset = %ld (0x%.8lx)\n" +#~ msgstr "%s-funktion, region %d, forskydning = %ld (0x%.8lx)\n" + +#~ msgid "bad magic number" +#~ msgstr "ugyldigt magisk tal" + +#~ msgid "bad header version" +#~ msgstr "ugyldig version af hovedet" + +#~ msgid "bad raw header version" +#~ msgstr "ugyldig version af råhovedet" + +#~ msgid "raw header buffer too small" +#~ msgstr "råhoved-mellemlager for småt" + +#~ msgid "old raw header file" +#~ msgstr "gammel råhovedfil" + +#~ msgid "unsupported version" +#~ msgstr "versionen er ikke understøttet" + +#~ msgid "unknown {de,en}code_mach_o_hdr return value %d" +#~ msgstr "ukendt {de,en}code_mach_o_hdr returneringsværdi %d" + +#~ msgid "fstat %s" +#~ msgstr "fejl ved egenskabsundersøgelse af filen %s" + +#~ msgid "lseek %s 0" +#~ msgstr "fejl ved søgning til begyndelsen i filen %s" + +#~ msgid "read %s" +#~ msgstr "fejl ved læsning af %s" + +#~ msgid "read %ld bytes, expected %ld, from %s" +#~ msgstr "læste %ld byte, forventede %ld, fra %s" + +#~ msgid "msync %s" +#~ msgstr "fejl ved synkronisering mellem hukommelse og disk af %s" + +#~ msgid "munmap %s" +#~ msgstr "fejl ved fjernelse af %s fra hukommelsen" + +#~ msgid "write %s" +#~ msgstr "fejl ved skrivning til %s" + +#~ msgid "wrote %ld bytes, expected %ld, to %s" +#~ msgstr "skrev %ld byte, forventede %ld, til %s" + +#~ msgid "" +#~ ";; Combiner statistics: %d attempts, %d substitutions (%d requiring new space),\n" +#~ ";; %d successes.\n" +#~ "\n" +#~ msgstr "" +#~ ";; kombineringsstatistik: %d forsøg, %d udskiftninger (%d kræver ny plads),\n" +#~ ";; %d vellykkede.\n" +#~ "\n" + +#~ msgid "" +#~ "\n" +#~ ";; Combiner totals: %d attempts, %d substitutions (%d requiring new space),\n" +#~ ";; %d successes.\n" +#~ msgstr "" +#~ "\n" +#~ ";; kombineringstotal: %d forsøg, %d udskiftninger (%d kræver ny plads),\n" +#~ ";; %d succeser.\n" + +#~ msgid "cannot convert to a pointer type" +#~ msgstr "kan ikke konverteres til en henvisningstype" + +#~ msgid "pointer value used where a floating point value was expected" +#~ msgstr "en henvisningsværdi er angivet hvor der forventedes en kommatalsværdi" + +#~ msgid "aggregate value used where a float was expected" +#~ msgstr "en værdi af en sammensat type er angivet hvor der forventedes et kommatal" + +#~ msgid "conversion to incomplete type" +#~ msgstr "konvertering til en ufuldstændig type" + +#~ msgid "can't convert between vector values of different size" +#~ msgstr "kan ikke konvertere vektorværdier af forskellige størrelser" + +#~ msgid "aggregate value used where an integer was expected" +#~ msgstr "en værdi af en sammensat type er angivet hvor der forventedes et heltal" + +#~ msgid "pointer value used where a complex was expected" +#~ msgstr "en henvisningsværdi er angivet hvor der forventedes et komplekst tal" + +#~ msgid "aggregate value used where a complex was expected" +#~ msgstr "en værdi af en sammensat type er angivet hvor der forventedes et komplekst tal" + +#~ msgid "can't convert value to a vector" +#~ msgstr "kan ikke konvertere værdi til en vektor" + +#~ msgid "ISO C++ does not permit \"%s\" in #if" +#~ msgstr "ISO C++ tillader ikke \"%s\" i #if" + +#~ msgid "invalid character '%c' in #if" +#~ msgstr "ugyldigt tegn '%c' i #if" + +#~ msgid "invalid character '\\%03o' in #if" +#~ msgstr "ugyldigt tegn '\\%03o' i #if" + +#~ msgid "absolute file name in remap_filename" +#~ msgstr "absolut filnavn i remap_filename" + +#~ msgid "ignoring nonexistent directory \"%s\"\n" +#~ msgstr "ignorerer det ikke-eksisterende katalog \"%s\"\n" + +#~ msgid "%s: Not a directory" +#~ msgstr "%s: ikke et katalog" + +#~ msgid "ignoring duplicate directory \"%s\"\n" +#~ msgstr "ignorerer mere end én angivelse af kataloget \"%s\"\n" + +#~ msgid " as it is a non-system directory that duplicates a system directory\n" +#~ msgstr " da det er et ikke-systemkatalog som dublerer et systemkatalog\n" + +#~ msgid "#include \"...\" search starts here:\n" +#~ msgstr "#include \"...\"-søgning begynder her:\n" + +#~ msgid "#include <...> search starts here:\n" +#~ msgstr "#include <...>-søgning begynder her:\n" + +#~ msgid "End of search list.\n" +#~ msgstr "Slut på søgningslisten.\n" + +#~ msgid "" +#~ msgstr "" + +#~ msgid "" +#~ msgstr "" + +#~ msgid "assertion missing after %s" +#~ msgstr "et postulat mangler efter %s" + +#~ msgid "directory name missing after %s" +#~ msgstr "et katalognavn mangler efter %s" + +#~ msgid "file name missing after %s" +#~ msgstr "et filnavn mangler efter %s" + +#~ msgid "macro name missing after %s" +#~ msgstr "et makronavn mangler efter %s" + +#~ msgid "path name missing after %s" +#~ msgstr "navnet på en sti mangler efter %s" + +#~ msgid "-I- specified twice" +#~ msgstr "-I- er angivet to gange" + +#~ msgid "no newline at end of file" +#~ msgstr "ingen linjeskift ved slutningen af filen" + +#~ msgid "unknown string token %s\n" +#~ msgstr "ukendt strengsymbol %s\n" + +#~ msgid "non-hex digit '%c' in universal-character-name" +#~ msgstr "'%c' der ikke er et hexadecimalt ciffer, optræder i universelt tegnnavn" + +#~ msgid "universal-character-name on EBCDIC target" +#~ msgstr "universelt tegnnavn på EBCDIC-mål" + +#~ msgid "universal-character-name out of range" +#~ msgstr "universelt tegnnavn uden for det gyldige interval" + +#~ msgid "unknown escape sequence: '\\%03o'" +#~ msgstr "ukendt undvigesekvensen '\\%03o'" + +#~ msgid "escape sequence out of range for its type" +#~ msgstr "undvigesekvensen er uden for det gyldig interval for dens type" + +#~ msgid "#import is obsolete, use an #ifndef wrapper in the header file" +#~ msgstr "#import er forældet, brug en #ifndef-indpakning i inkluderingsfilen" + +#~ msgid "#pragma once is obsolete" +#~ msgstr "'#pragma once' er forældet" + +#~ msgid "\"%s\" is not a valid option to the preprocessor" +#~ msgstr "\"%s\" er ikke et gyldigt tilvalg til præprocessoren" + +#~ msgid "too many input files" +#~ msgstr "for mange inddatafiler" + +#~ msgid ";; Processing block from %d to %d, %d sets.\n" +#~ msgstr ";; Behandler blok fra %d til %d, %d mængder.\n" + +#~ msgid "((anonymous))" +#~ msgstr "((anonym))" + +#~ msgid "%s: warnings being treated as errors\n" +#~ msgstr "%s: advarsler bliver opfattet som fejl\n" + +#~ msgid "%s: %s: " +#~ msgstr "%s: %s: " + +#~ msgid "%s " +#~ msgstr "%s " + +#~ msgid " %s" +#~ msgstr " %s" + +#~ msgid "At top level:" +#~ msgstr "Ved øverste niveau:" + +#~ msgid "In member function `%s':" +#~ msgstr "I medlemsfunktionen '%s':" + +#~ msgid "In function `%s':" +#~ msgstr "I funktionen '%s':" + +#~ msgid "compilation terminated.\n" +#~ msgstr "oversættelse afsluttede.\n" + +#~ msgid "%s:%d: confused by earlier errors, bailing out\n" +#~ msgstr "%s:%d: forvirret af tidligere fejl, opgiver ævred\n" + +#~ msgid "" +#~ "Please submit a full bug report,\n" +#~ "with preprocessed source if appropriate.\n" +#~ "See %s for instructions.\n" +#~ msgstr "" +#~ "Indsend venligst en komplet fejlrapport med\n" +#~ "præprocesseret kildekode om nødvendigt.\n" +#~ "Se %s for instruktioner.\n" + +#~ msgid "Internal compiler error: Error reporting routines re-entered.\n" +#~ msgstr "Intern oversætterfejl: fejlrapporteringsrutiner blev kaldt igen.\n" + +#~ msgid "in %s, at %s:%d" +#~ msgstr "i %s, ved %s:%d" + +#~ msgid "In file included from %s:%d" +#~ msgstr "I filen inkluderet af %s:%d" + +# kommer til at stå neden under ovenstående, derfor "af" +#~ msgid "" +#~ ",\n" +#~ " from %s:%d" +#~ msgstr "" +#~ ",\n" +#~ " af %s:%d" + +#~ msgid ":\n" +#~ msgstr ":\n" + +#~ msgid "`%s' is deprecated (declared at %s:%d)" +#~ msgstr "'%s' er forældet (erklæret ved %s:%d)" + +#~ msgid "`%s' is deprecated" +#~ msgstr "'%s' er forældet" + +#~ msgid "type is deprecated (declared at %s:%d)" +#~ msgstr "type er forældet (erklæret ved %s:%d)" + +#~ msgid "type is deprecated" +#~ msgstr "type er forældet" + +#~ msgid "dominator of %d should be %d, not %d" +#~ msgstr "dominator for %d burde være %d, ikke %d" + +#~ msgid "DW_LOC_OP %s not implemented\n" +#~ msgstr "DW_LOC_OP %s understøttes ikke\n" + +#~ msgid "internal regno botch: `%s' has regno = %d\n" +#~ msgstr "internt reg.nr.-problem: '%s' har reg.nr. = %d\n" + +#~ msgid "support for the DWARF1 debugging format is deprecated" +#~ msgstr "understøttelse for DWARF1-fejlanalyseringsformatet er forældet" + +#~ msgid "can't get current directory" +#~ msgstr "kan ikke få fat i det aktuelle katalog" + +#~ msgid "can't access real part of complex value in hard register" +#~ msgstr "kan ikke tilgå den reelle del af komplekst tal i et hardwareregister" + +#~ msgid "can't access imaginary part of complex value in hard register" +#~ msgstr "kan ikke tilgå den imaginære del af komplekst tal i et hardwareregister" + +#~ msgid "ICE: emit_insn used where emit_jump_insn needed:\n" +#~ msgstr "ICE: emit_insn brugt hvor emit_jump_insn behøves:\n" + +#~ msgid "abort in %s, at %s:%d" +#~ msgstr "afbrudt i %s ved %s:%d" + +#~ msgid "exception handling disabled, use -fexceptions to enable" +#~ msgstr "håndtering af undtagelser er slået fra, angiv -fexceptions for at slå dem til" + +#~ msgid "argument of `__builtin_eh_return_regno' must be constant" +#~ msgstr "parameteren til '__builtin_eh_return_regno' skal være konstant" + +#~ msgid "__builtin_eh_return not supported on this target" +#~ msgstr "__builtin_eh_return understøttes ikke på målarkitekturen" + +#~ msgid "stack limits not supported on this target" +#~ msgstr "stakgrænser understøttes ikke på målarkitekturen" + +#~ msgid "function using short complex types cannot be inline" +#~ msgstr "funktioner der benytter short complex-typer, kan ikke indbygges" + +#~ msgid "unsupported wide integer operation" +#~ msgstr "bred heltalsoperation understøttes ikke" + +#~ msgid "prior parameter's size depends on `%s'" +#~ msgstr "foregående parameters størrelse afhænger af '%s'" + +#~ msgid "returned value in block_exit_expr" +#~ msgstr "returnerede værdi i block_exit_expr" + +#~ msgid "cannot take the address of an unaligned member" +#~ msgstr "kan ikke tage adressen af et ikke-justeret medlem" + +#~ msgid "negative insn length" +#~ msgstr "negativ instruktionslængde" + +#~ msgid "could not split insn" +#~ msgstr "kunne ikke dele instruktion" + +#~ msgid "invalid `asm': " +#~ msgstr "ugyldig 'asm': " + +#~ msgid "nested assembly dialect alternatives" +#~ msgstr "indlejrede alternativer for maskinkodedialekter" + +#~ msgid "unterminated assembly dialect alternative" +#~ msgstr "uafsluttet alternativ for maskinkodedialekt" + +#~ msgid "operand number missing after %%-letter" +#~ msgstr "operandtal mangler efter %%-letter" + +#~ msgid "operand number out of range" +#~ msgstr "operandtal er uden for det gyldige interval" + +#~ msgid "invalid %%-code" +#~ msgstr "ugyldig %%-kode" + +#~ msgid "`%%l' operand isn't a label" +#~ msgstr "'%%l'-operand er ikke en etiket" + +#~ msgid "floating constant misused" +#~ msgstr "kommatalskonstant misbrugt" + +#~ msgid "invalid expression as operand" +#~ msgstr "ugyldigt udtryk som operand" + +#~ msgid "function might be possible candidate for attribute `noreturn'" +#~ msgstr "funktion er muligvis en kandidat til egenskaben 'noreturn'" + +#~ msgid "`noreturn' function does return" +#~ msgstr "funktion med egenskaben 'noreturn' returnerer" + +# RETMIG: dette må kunne gøres bedre +#~ msgid "control reaches end of non-void function" +#~ msgstr "kontrol når til slutningen af ikke-void funktion" + +#~ msgid "Attempt to delete prologue/epilogue insn:" +#~ msgstr "forsøg på at slette indledende/afsluttende instruktion:" + +#~ msgid "comparison is always %d due to width of bit-field" +#~ msgstr "sammenligning er altid %d på grund af den begrænsede rækkevidde af bitfeltet" + +#~ msgid "comparison is always %d" +#~ msgstr "sammenligning er altid %d" + +# RETMIG: det giver ikke mening +#~ msgid "`or' of unmatched not-equal tests is always 1" +#~ msgstr "'or' af uafbalancerede sammenligninger med forskellig fra er altid 1" + +#~ msgid "`and' of mutually exclusive equal-tests is always 0" +#~ msgstr "'and' af udtryk der hver for sig udelukker hinanden, er altid 0" + +#~ msgid "size of variable `%s' is too large" +#~ msgstr "størrelsen af variablen '%s' er for stor" + +#~ msgid "impossible constraint in `asm'" +#~ msgstr "umulig begrænsing i 'asm'" + +#~ msgid "`%s' might be used uninitialized in this function" +#~ msgstr "'%s' bliver måske brugt uden at have en startværdi i denne funktion" + +#~ msgid "variable `%s' might be clobbered by `longjmp' or `vfork'" +#~ msgstr "variablen '%s' bliver måske overskrevet af 'longjmp' eller 'vfork'" + +#~ msgid "argument `%s' might be clobbered by `longjmp' or `vfork'" +#~ msgstr "parameteren '%s' bliver måske overskrevet af 'longjmp' eller 'vfork'" + +#~ msgid "function returns an aggregate" +#~ msgstr "funktion returnerer en værdi af en sammensat type" + +#~ msgid "unused parameter `%s'" +#~ msgstr "ubenyttet parameter '%s'" + +#~ msgid "ambiguous abbreviation %s" +#~ msgstr "tvetydig forkortelse %s" + +#~ msgid "incomplete `%s' option" +#~ msgstr "ufuldstændigt tilvalg '%s'" + +#~ msgid "missing argument to `%s' option" +#~ msgstr "der mangler en parameter til tilvalget '%s'" + +#~ msgid "extraneous argument to `%s' option" +#~ msgstr "der er en parameter for meget til tilvalget '%s'" + +#~ msgid "Using built-in specs.\n" +#~ msgstr "Benytter indbyggede specifikationer.\n" + +#~ msgid "" +#~ "Setting spec %s to '%s'\n" +#~ "\n" +#~ msgstr "" +#~ "Sætter specifikation %s til '%s'\n" +#~ "\n" + +#~ msgid "Reading specs from %s\n" +#~ msgstr "Læser specifikationer fra %s\n" + +#~ msgid "specs %%include syntax malformed after %ld characters" +#~ msgstr "%%include-syntaks i specifikationer misdannet efter %ld tegn" + +#~ msgid "could not find specs file %s\n" +#~ msgstr "kunne ikke finde specifikationsfilen %s\n" + +#~ msgid "specs %%rename syntax malformed after %ld characters" +#~ msgstr "%%rename-syntaks i specifikationer misdannet efter %ld tegn" + +#~ msgid "specs %s spec was not found to be renamed" +#~ msgstr "%s-specifikation i specifikationer kunne ikke findes til omdøbelse" + +#~ msgid "%s: attempt to rename spec '%s' to already defined spec '%s'" +#~ msgstr "%s: forsøg på at omdøbe specifikation '%s' til allerede defineret specifikation '%s'" + +#~ msgid "rename spec %s to %s\n" +#~ msgstr "omdøb specifikation %s til %s\n" + +#~ msgid "" +#~ "spec is '%s'\n" +#~ "\n" +#~ msgstr "" +#~ "specifikation er '%s'\n" +#~ "\n" + +#~ msgid "specs unknown %% command after %ld characters" +#~ msgstr "ukendt %%-kommando i specifikationer efter %ld tegn" + +#~ msgid "specs file malformed after %ld characters" +#~ msgstr "specifikationsfil misdannet efter %ld tegn" + +#~ msgid "spec file has no spec for linking" +#~ msgstr "specifikationsfil har ingen specifikation til sammenkædning" + +#~ msgid "-pipe not supported" +#~ msgstr "-pipe understøttes ikke" + +#~ msgid "" +#~ "\n" +#~ "Go ahead? (y or n) " +#~ msgstr "" +#~ "\n" +#~ "Fortsæt, ja (y) eller nej (n)?" + +#~ msgid "" +#~ "Internal error: %s (program %s)\n" +#~ "Please submit a full bug report.\n" +#~ "See %s for instructions." +#~ msgstr "" +#~ "Intern fejl: %s (programmet %s)\n" +#~ "Indsend venligst en komplet fejlrapport.\n" +#~ "Se %s for instruktioner." + +#~ msgid "# %s %.2f %.2f\n" +#~ msgstr "# %s %.2f %.2f\n" + +#~ msgid "Usage: %s [options] file...\n" +#~ msgstr "Brug: %s [tilvalg] fil...\n" + +#~ msgid "Options:\n" +#~ msgstr "Tilvalg:\n" + +#~ msgid " -pass-exit-codes Exit with highest error code from a phase\n" +#~ msgstr " -pass-exit-codes Afslut med den højeste fejlkode fra en fase\n" + +#~ msgid " --help Display this information\n" +#~ msgstr " --help Vis disse oplysninger\n" + +#~ msgid " --target-help Display target specific command line options\n" +#~ msgstr " --target-help Vis målspecifikke kommandolinjetilvalg\n" + +#~ msgid " (Use '-v --help' to display command line options of sub-processes)\n" +#~ msgstr " (benyt '-v --help' for at vise kommandolinjetilvalg for underprocesser)\n" + +#~ msgid " -dumpspecs Display all of the built in spec strings\n" +#~ msgstr " -dumpspecs Vis alle de indbyggede specifikationsstrenge\n" + +#~ msgid " -dumpversion Display the version of the compiler\n" +#~ msgstr " -dumpversion Vis versionsnummeret af oversætteren\n" + +#~ msgid " -dumpmachine Display the compiler's target processor\n" +#~ msgstr " -dumpmachine Vis oversætterens målprocessor\n" + +#~ msgid " -print-search-dirs Display the directories in the compiler's search path\n" +#~ msgstr " -print-search-dirs Vis katalogerne i oversætterens søgesti\n" + +#~ msgid " -print-libgcc-file-name Display the name of the compiler's companion library\n" +#~ msgstr " -print-libgcc-file-name Vis navnet på oversætterens tilhørende bibliotek\n" + +#~ msgid " -print-file-name= Display the full path to library \n" +#~ msgstr " -print-file-name= Vis den komplette sti til biblioteket \n" + +#~ msgid " -print-prog-name= Display the full path to compiler component \n" +#~ msgstr " -print-prog-name= Vis den komplette sti til oversætterkomponenten \n" + +#~ msgid " -print-multi-directory Display the root directory for versions of libgcc\n" +#~ msgstr " -print-multi-directory Vis rodkataloget for versioner af libgcc\n" + +#~ msgid "" +#~ " -print-multi-lib Display the mapping between command line options and\n" +#~ " multiple library search directories\n" +#~ msgstr "" +#~ " -print-multi-lib Vis afbildningen mellem kommandolinjetilvalg og\n" +#~ " flere bibliotekssøgekataloger\n" + +#~ msgid " -print-multi-os-directory Display the relative path to OS libraries\n" +#~ msgstr " -print-multi-os-directory Vis den relative sti for OS-biblioteker\n" + +#~ msgid " -Wa, Pass comma-separated on to the assembler\n" +#~ msgstr " -Wa, Videregiv komma-adskilte til maskinkodeoversætteren\n" + +#~ msgid " -Wp, Pass comma-separated on to the preprocessor\n" +#~ msgstr " -Wp, Videregiv komma-adskilte til præprocessoren\n" + +#~ msgid " -Wl, Pass comma-separated on to the linker\n" +#~ msgstr " -Wl, Videregiv komma-adskilte til sammenkæderen\n" + +#~ msgid " -Xlinker Pass on to the linker\n" +#~ msgstr " -Xlinker Videregiv til sammenkæderen\n" + +#~ msgid " -save-temps Do not delete intermediate files\n" +#~ msgstr " -save-temps Slet ikke midlertidige filer\n" + +#~ msgid " -pipe Use pipes rather than intermediate files\n" +#~ msgstr " -pipe Brug datakanaler i stedet for midlertidige filer\n" + +#~ msgid " -time Time the execution of each subprocess\n" +#~ msgstr " -time Tag tid på udførslen af hver underproces\n" + +#~ msgid " -specs= Override built-in specs with the contents of \n" +#~ msgstr " -specs= Overskriv indbyggede specifikationer med indholdet af \n" + +#~ msgid " -std= Assume that the input sources are for \n" +#~ msgstr " -std= Antag at inddatakildekoden er skrevet til \n" + +#~ msgid " -B Add to the compiler's search paths\n" +#~ msgstr " -B Tilføj katalog til oversætterens søgestier\n" + +#~ msgid " -b Run gcc for target , if installed\n" +#~ msgstr " -b Kør GCC til målet , hvis installeret\n" + +#~ msgid " -V Run gcc version number , if installed\n" +#~ msgstr " -V Kør GCC med versionsnummeret , hvis installeret\n" + +#~ msgid " -v Display the programs invoked by the compiler\n" +#~ msgstr " -v Vis de programmer der startes af oversætteren\n" + +#~ msgid " -### Like -v but options quoted and commands not executed\n" +#~ msgstr "" +#~ " -### Som '-v', men tilvalg anbringes i anførselstegn\n" +#~ " og kommandoerne udføres ikke\n" + +#~ msgid " -E Preprocess only; do not compile, assemble or link\n" +#~ msgstr " -E Forbehandl kun; oversæt og sammenkæd ikke\n" + +#~ msgid " -S Compile only; do not assemble or link\n" +#~ msgstr " -S Oversæt kun; maskinekodeoversæt og sammenkæd ikke\n" + +#~ msgid " -c Compile and assemble, but do not link\n" +#~ msgstr " -c Oversæt, også til maskinkode, men sammenkæd ikke\n" + +#~ msgid " -o Place the output into \n" +#~ msgstr " -o Anbring uddataene i \n" + +#~ msgid "" +#~ " -x Specify the language of the following input files\n" +#~ " Permissible languages include: c c++ assembler none\n" +#~ " 'none' means revert to the default behavior of\n" +#~ " guessing the language based on the file's extension\n" +#~ msgstr "" +#~ " -x Angiv sproget for de følgende inddatafiler.\n" +#~ " Tilladte sprog inkluderer: c c++ assembler none\n" +#~ " 'none' betyder at standardopførslen med at gætte\n" +#~ " sproget på filendelsen udføres\n" + +#~ msgid "" +#~ "\n" +#~ "Options starting with -g, -f, -m, -O, -W, or --param are automatically\n" +#~ " passed on to the various sub-processes invoked by %s. In order to pass\n" +#~ " other options on to these processes the -W options must be used.\n" +#~ msgstr "" +#~ "\n" +#~ "Tilvalg der begynder med -g, -f, -m, -O, -W eller --param bliver automatisk\n" +#~ " givet videre til de forskellige underprocesser som %s starter. For at\n" +#~ " videregive andre indstillinger til disse processer kan tilvalg på formen\n" +#~ " '-W' bruges.\n" + +#~ msgid "`-%c' option must have argument" +#~ msgstr "tilvalget '-%c' skal have en parameter" + +#~ msgid "couldn't run `%s': %s" +#~ msgstr "kunne ikke køre '%s': %s" + +#~ msgid "%s (GCC) %s\n" +#~ msgstr "%s (GCC) %s\n" + +#~ msgid "Copyright (C) 2003 Free Software Foundation, Inc.\n" +#~ msgstr "Copyright © 2003 Free Software Foundation, Inc.\n" + +#~ msgid "" +#~ "This is free software; see the source for copying conditions. There is NO\n" +#~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" +#~ "\n" +#~ msgstr "" +#~ "Dette er et frit program; se kildekoden for kopieringsbetingelser. Der er\n" +#~ "INGEN garanti; ikke engang for SALGBARHED eller BRUGBARHED TIL NOGET FORMÅL.\n" + +#~ msgid "argument to `-Xlinker' is missing" +#~ msgstr "der mangler en parameter til '-Xlinker'" + +#~ msgid "argument to `-l' is missing" +#~ msgstr "der mangler en parameter til '-l'" + +#~ msgid "argument to `-specs' is missing" +#~ msgstr "der mangler en parameter til '-specs'" + +#~ msgid "argument to `-specs=' is missing" +#~ msgstr "der mangler en parameter til '-specs='" + +#~ msgid "`-%c' must come at the start of the command line" +#~ msgstr "'-%c' skal være i begyndelsen af kommandolinjen" + +#~ msgid "argument to `-B' is missing" +#~ msgstr "der mangler en parameter til '-B'" + +#~ msgid "cannot specify -o with -c or -S and multiple compilations" +#~ msgstr "kan ikke angive -o med -c eller -S og flere oversættelser" + +#~ msgid "warning: -pipe ignored because -save-temps specified" +#~ msgstr "advarsel: -pipe ignoreret fordi -save-temps er angivet" + +#~ msgid "warning: -pipe ignored because -time specified" +#~ msgstr "advarsel: -pipe ignoreret fordi -time er angivet" + +#~ msgid "argument to `-x' is missing" +#~ msgstr "der mangler en parameter til '-x'" + +#~ msgid "argument to `-%s' is missing" +#~ msgstr "der mangler en parameter til '-%s'" + +#~ msgid "warning: `-x %s' after last input file has no effect" +#~ msgstr "advarsel: '-x %s' efter den sidste inddatafil har ingen effekt" + +#~ msgid "invalid specification! Bug in cc" +#~ msgstr "ugyldig specifikation! Fejl i cc." + +#~ msgid "%s\n" +#~ msgstr "%s\n" + +#~ msgid "spec failure: '%%*' has not been initialized by pattern match" +#~ msgstr "specifikationsfejl: '%%*' er ikke blevet klargjort af mønstersøgning" + +#~ msgid "warning: use of obsolete %%[ operator in specs" +#~ msgstr "advarsel: forældet '%%['-operator benyttet i specifikationer" + +#~ msgid "Processing spec %c%s%c, which is '%s'\n" +#~ msgstr "Behandler specifikation %c%s%c, som er '%s'\n" + +#~ msgid "spec failure: unrecognized spec option '%c'" +#~ msgstr "specifikationsfejl: ukendt specifikationstilvalg '%c'" + +#~ msgid "unknown spec function `%s'" +#~ msgstr "ukendt specifikationsfunktion '%s'" + +#~ msgid "error in args to spec function `%s'" +#~ msgstr "fejl i parametre til specifikationsfunktion '%s'" + +#~ msgid "malformed spec function name" +#~ msgstr "forkert udformet specifikationsfunktionsnavn" + +#~ msgid "no arguments for spec function" +#~ msgstr "ingen parametre til specifikationsfunktion" + +#~ msgid "malformed spec function arguments" +#~ msgstr "forkert udformede specifikationsfunktionsparametre" + +#~ msgid "mismatched braces in specs" +#~ msgstr "uafbalancerede krøllede paranteser i specifikationer" + +#~ msgid "unrecognized option `-%s'" +#~ msgstr "ukendt tilvalg '-%s'" + +#~ msgid "install: %s%s\n" +#~ msgstr "installering: %s%s\n" + +#~ msgid "programs: %s\n" +#~ msgstr "programmer: %s\n" + +#~ msgid "libraries: %s\n" +#~ msgstr "biblioteker: %s\n" + +#~ msgid "" +#~ "\n" +#~ "For bug reporting instructions, please see:\n" +#~ msgstr "" +#~ "\n" +#~ "For fejlrapporteringsinstruktioner, se:\n" + +#~ msgid "Configured with: %s\n" +#~ msgstr "Konfigureret med: %s\n" + +#~ msgid "Thread model: %s\n" +#~ msgstr "Trådmodel: %s\n" + +#~ msgid "gcc version %s\n" +#~ msgstr "GCC version %s\n" + +#~ msgid "gcc driver version %s executing gcc version %s\n" +#~ msgstr "GCC-styringsprogram version %s kører GCCc version %s\n" + +#~ msgid "no input files" +#~ msgstr "ingen inddatafiler" + +#~ msgid "%s: %s compiler not installed on this system" +#~ msgstr "%s: %s-oversætter ikke installeret på dette system" + +#~ msgid "%s: linker input file unused because linking not done" +#~ msgstr "%s: sammenkæderinddatafil ikke benyttet eftersom sammenkædning ikke blev foretaget" + +#~ msgid "language %s not recognized" +#~ msgstr "sproget %s ikke genkendt" + +#~ msgid "internal gcc abort" +#~ msgstr "intern GCC-afbrydelse" + +#~ msgid "Internal gcov abort.\n" +#~ msgstr "Intern gcov afbrydelse.\n" + +#~ msgid "" +#~ "Usage: gcov [OPTION]... SOURCEFILE\n" +#~ "\n" +#~ msgstr "" +#~ "Brug: gcov [TILVALG]... KILDEFIL\n" +#~ "\n" + +#~ msgid "" +#~ "Print code coverage information.\n" +#~ "\n" +#~ msgstr "" +#~ "Udskriv kodedækningsoplysninger.\n" +#~ "\n" + +#~ msgid " -h, --help Print this help, then exit\n" +#~ msgstr " -h, --help Udskriv denne hjælp og afslut\n" + +#~ msgid " -v, --version Print version number, then exit\n" +#~ msgstr " -v, --version Udskriv versionsnummeret og afslut\n" + +#~ msgid " -b, --branch-probabilities Include branch probabilities in output\n" +#~ msgstr " -b, --branch-probabilities Medtag forgreningssandsynligheder i uddata\n" + +#~ msgid "" +#~ " -c, --branch-counts Given counts of branches taken\n" +#~ " rather than percentages\n" +#~ msgstr " -c, --branch-counts Antal forgreninger taget i stedet for procenter\n" + +#~ msgid " -n, --no-output Do not create an output file\n" +#~ msgstr " -n, --no-output Opret ikke en uddatafil\n" + +#~ msgid "" +#~ " -l, --long-file-names Use long output file names for included\n" +#~ " source files\n" +#~ msgstr " -l, --long-file-names Brug lange filnavne til inkluderede kildefiler\n" + +#~ msgid " -f, --function-summaries Output summaries for each function\n" +#~ msgstr " -f, --function-summaries Udskriv sammendrag for hver funktion\n" + +#~ msgid " -o, --object-directory DIR|FILE Search for object files in DIR or called FILE\n" +#~ msgstr " -o, --object-directory KAT|FIL Søg efter objektfiler i KAT eller kaldt FIL\n" + +#~ msgid " -p, --preserve-paths Preserve all pathname components\n" +#~ msgstr " -p, --preserve-paths Bevar alle stinavnskomponenter\n" + +#~ msgid "" +#~ "\n" +#~ "For bug reporting instructions, please see:\n" +#~ "%s.\n" +#~ msgstr "" +#~ "\n" +#~ "For fejlrapporteringsinstruktioner, se:\n" +#~ "%s.\n" + +#~ msgid "gcov (GCC) %s\n" +#~ msgstr "gcov (GCC) %s\n" + +#~ msgid "Copyright (C) 2001 Free Software Foundation, Inc.\n" +#~ msgstr "Copyright © 2001 Free Software Foundation, Inc.\n" + +#~ msgid "Could not open basic block file %s.\n" +#~ msgstr "Kunne ikke åbne basisblokfilen %s.\n" + +#~ msgid "Could not open program flow graph file %s.\n" +#~ msgstr "Kunne ikke åbne programstrømsgraffilen %s.\n" + +#~ msgid "Could not open data file %s.\n" +#~ msgstr "Kunne ikke åbne datafilen %s.\n" + +#~ msgid "Assuming that all execution counts are zero.\n" +#~ msgstr "Antager at alle kørselstællere er nul.\n" + +#~ msgid "No executable code associated with file %s.\n" +#~ msgstr "Ingen kørbar kode associeret med filen %s.\n" + +#~ msgid "%s of %d lines executed in %s %s\n" +#~ msgstr "%s af %d linjer udført i %s %s\n" + +#~ msgid "No executable lines in %s %s\n" +#~ msgstr "Ingen kørbare linjer i %s %s\n" + +#~ msgid "%s of %d branches executed in %s %s\n" +#~ msgstr "%s af %d forgreninger udført i %s %s\n" + +#~ msgid "%s of %d branches taken at least once in %s %s\n" +#~ msgstr "%s af %d forgreninger valgt mindst én gang i %s %s\n" + +#~ msgid "No branches in %s %s\n" +#~ msgstr "Ingen forgreninger i %s %s\n" + +#~ msgid "%s of %d calls executed in %s %s\n" +#~ msgstr "%s af %d kald udført i %s %s\n" + +#~ msgid "No calls in %s %s\n" +#~ msgstr "Ingen kald i %s %s\n" + +#~ msgid "didn't use all bb entries of graph, function %s\n" +#~ msgstr "brugte ikke alle grafens basisblokelementer, funktion %s\n" + +#~ msgid "block_num = %ld, num_blocks = %d\n" +#~ msgstr "block_num = %ld, num_blocks = %d\n" + +#~ msgid "ERROR: unexpected line number %ld\n" +#~ msgstr "Fejl: uventet linjenummer %ld\n" + +#~ msgid "ERROR: too many basic blocks in function %s\n" +#~ msgstr "Fejl: for mange basisblokke i funktionen %s\n" + +#~ msgid "ERROR: out of range line number in function %s\n" +#~ msgstr "Fejl: linjenummer uden for det gyldige interval i funktionen %s\n" + +#~ msgid "Could not open source file %s.\n" +#~ msgstr "Kunne ikke åbne kildefilen %s.\n" + +#~ msgid "Warning: source file %s is newer than %s\n" +#~ msgstr "Advarsel: kildefil %s er nyere end %s\n" + +#~ msgid "Unexpected EOF while reading source file %s.\n" +#~ msgstr "Stødt på slutningen af kildefilen %s tidligere end forventet.\n" + +#~ msgid "call %2d never executed\n" +#~ msgstr "kald %2d aldrig udført\n" + +#~ msgid "call %2d returns %s\n" +#~ msgstr "kald %2d returnerer %s\n" + +#~ msgid "branch %2d never executed\n" +#~ msgstr "forgrening %2d aldrig udført\n" + +#~ msgid "branch %2d taken %s\n" +#~ msgstr "forgrening %2d valgt %s\n" + +#~ msgid "Creating %s.\n" +#~ msgstr "Opretter %s.\n" + +#~ msgid "Error writing output file %s.\n" +#~ msgstr "Fejl ved skrivning af uddatafilen %s.\n" + +#~ msgid "Could not open output file %s.\n" +#~ msgstr "Kunne ikke åbne uddatafilen %s.\n" + +#~ msgid "GCSE disabled: %d > 1000 basic blocks and %d >= 20 edges/basic block" +#~ msgstr "GCSE deaktiveret: %d > 1000 basisblokke og %d >= 20 kanter/basisblok" + +#~ msgid "GCSE disabled: %d basic blocks and %d registers" +#~ msgstr "GCSE deaktiveret: %d basisblokke og %d registre" + +#~ msgid "Name `%s' contains quotes" +#~ msgstr "Navnet '%s' indeholder citationstegn" + +#~ msgid "invalid string `%s' in define_cpu_unit" +#~ msgstr "ugyldig streng '%s' i define_cpu_unit" + +#~ msgid "invalid string `%s' in define_query_cpu_unit" +#~ msgstr "ugyldig streng '%s' i define_query_cpu_unit" + +#~ msgid "invalid string `%s' in define_bypass" +#~ msgstr "ugyldig streng '%s' i define_bypass" + +#~ msgid "invalid first string `%s' in exclusion_set" +#~ msgstr "ugyldig første streng '%s' i exclusion_set" + +#~ msgid "invalid second string `%s' in exclusion_set" +#~ msgstr "ugyldig anden streng '%s' i exclusion_set" + +#~ msgid "invalid first string `%s' in presence_set" +#~ msgstr "ugyldig første streng '%s' i presence_set" + +#~ msgid "invalid second string `%s' in presence_set" +#~ msgstr "ugyldig anden streng '%s' i presence_set" + +#~ msgid "invalid first string `%s' in absence_set" +#~ msgstr "ugyldig første streng '%s' i absence_set" + +#~ msgid "invalid second string `%s' in absence_set" +#~ msgstr "ugyldig anden streng '%s' i absence_set" + +#~ msgid "invalid string `%s' in define_automaton" +#~ msgstr "ugyldig streng '%s' i define_automaton" + +#~ msgid "invalid option `%s' in automata_option" +#~ msgstr "ugyldigt tilvalg '%s' i automata_option" + +#~ msgid "garbage after ) in reservation `%s'" +#~ msgstr "ragelse efter ) i reservering '%s'" + +#~ msgid "invalid `%s' in reservation `%s'" +#~ msgstr "ugyldig '%s' i reservering '%s'" + +#~ msgid "repetition `%s' <= 1 in reservation `%s'" +#~ msgstr "gentagelse '%s' <= 1 i reservering '%s'" + +#~ msgid "unit `%s' in exclusion is not declared" +#~ msgstr "enhed '%s' i ekskludering er ikke erklæret" + +#~ msgid "`%s' in exclusion is not unit" +#~ msgstr "'%s' i ekskludering er ikke enhed" + +#~ msgid "unit `%s' excludes itself" +#~ msgstr "enheden '%s' ekskluderer sig selv" + +#~ msgid "units `%s' and `%s' in exclusion set belong to different automata" +#~ msgstr "enhederne '%s' og '%s' i ekskluderingsmængde tilhører forskellige automater" + +#~ msgid "unit `%s' excludes and requires presence of `%s'" +#~ msgstr "enheden '%s' ekskluderer og kræver tilstedeværelse af '%s'" + +#~ msgid "unit `%s' requires absence and presence of `%s'" +#~ msgstr "enheden '%s' kræver tilstedeværelse og fravær af '%s'" + +#~ msgid "repeated declaration of automaton `%s'" +#~ msgstr "gentaget erklæring af automaten '%s'" + +#~ msgid "define_insn_reservation `%s' has negative latency time" +#~ msgstr "define_insn_reservation '%s' har negativ ventetid" + +#~ msgid "`%s' is already used as insn reservation name" +#~ msgstr "`%s' bliver allerede benyttet som instruktionsreserveringsnavn" + +#~ msgid "define_bypass `%s - %s' has negative latency time" +#~ msgstr "define_bypass '%s - %s' har negativ ventetid" + +#~ msgid "automaton `%s' is not declared" +#~ msgstr "automaten '%s' er ikke erklæret" + +#~ msgid "define_unit `%s' without automaton when one defined" +#~ msgstr "define_unit '%s' uden automat når en er defineret" + +#~ msgid "`%s' is declared as cpu unit" +#~ msgstr "'%s' er erklæret som CPU-enhed" + +#~ msgid "`%s' is declared as cpu reservation" +#~ msgstr "'%s' er erklæret som CPU-reservering" + +#~ msgid "repeated declaration of unit `%s'" +#~ msgstr "gentaget erklæring af enheden '%s'" + +#~ msgid "repeated declaration of reservation `%s'" +#~ msgstr "gentaget erklæring af reserveringen '%s'" + +#~ msgid "there is no insn reservation `%s'" +#~ msgstr "der er ingen instruktionsreservering '%s'" + +#~ msgid "the same bypass `%s - %s' is already defined" +#~ msgstr "den samme videreledning '%s - %s' er allerede defineret" + +#~ msgid "bypass `%s - %s' is already defined" +#~ msgstr "videreledning '%s - %s' er allerede defineret" + +#~ msgid "automaton `%s' is not used" +#~ msgstr "automat '%s' bliver ikke benyttet" + +#~ msgid "undeclared unit or reservation `%s'" +#~ msgstr "ikke-erklæret enhed eller reservering '%s'" + +#~ msgid "unit `%s' is not used" +#~ msgstr "enhed '%s' bliver ikke benyttet" + +#~ msgid "reservation `%s' is not used" +#~ msgstr "reservering '%s' bliver ikke benyttet" + +#~ msgid "cycle in definition of reservation `%s'" +#~ msgstr "cyklus i definering af reservering '%s'" + +#~ msgid "Units `%s' and `%s' should be in the same automaton" +#~ msgstr "Enhederne '%s' og '%s' skal være i den samme automat" + +#~ msgid "-split has no argument." +#~ msgstr "-split uden parametre" + +#~ msgid "option `-split' has not been implemented yet\n" +#~ msgstr "tilvalget '-split' understøttes ikke endnu\n" + +#~ msgid "Automaton `%s': Insn `%s' will never be issued" +#~ msgstr "Automat '%s': instruktion '%s' vil aldrig blive udført" + +#~ msgid "Insn `%s' will never be issued" +#~ msgstr "Instruktion '%s' vil aldrig blive udført" + +#~ msgid "Errors in DFA description" +#~ msgstr "Fejl i DFA-beskrivelse" + +#~ msgid "Error in writing DFA description file %s" +#~ msgstr "Fejl ved skrivning af DFA-beskrivelsesfil %s" + +#~ msgid "No input file name." +#~ msgstr "Intet inddatafilnavn." + +#~ msgid "can't open %s" +#~ msgstr "kan ikke åbne %s" + +#~ msgid "fix_sched_param: unknown param: %s" +#~ msgstr "fix_sched_param: ukendt parameter: %s" + +#~ msgid "function cannot be inline" +#~ msgstr "funktion kan ikke indbygges" + +#~ msgid "varargs function cannot be inline" +#~ msgstr "funktion med variabel parameterliste kan ikke indbygges" + +#~ msgid "function using alloca cannot be inline" +#~ msgstr "funktion der bruger alloca, kan ikke indbygges" + +#~ msgid "function using setjmp cannot be inline" +#~ msgstr "funktion der bruger setjmp, kan ikke indbygges" + +#~ msgid "function uses __builtin_eh_return" +#~ msgstr "funktionen bruger __builtin_eh_return" + +#~ msgid "function with nested functions cannot be inline" +#~ msgstr "funktion med indlejrede funktioner kan ikke indbygges" + +#~ msgid "function with label addresses used in initializers cannot inline" +#~ msgstr "funktion hvor etiketadresser benyttes i klargøringer, kan ikke indbygges" + +#~ msgid "function too large to be inline" +#~ msgstr "funktionen er for stor til at blive indbygget" + +#~ msgid "no prototype, and parameter address used; cannot be inline" +#~ msgstr "ingen prototype, og parameteradressen benyttes; kan ikke indbygges" + +#~ msgid "inline functions not supported for this return value type" +#~ msgstr "integrerede funktioner understøttes ikke for denne returværditype" + +#~ msgid "function with varying-size return value cannot be inline" +#~ msgstr "funktioner med returværdier af varierende størrelse kan ikke indbygges" + +#~ msgid "function with varying-size parameter cannot be inline" +#~ msgstr "funktioner med parametre af varierende størrelse kan ikke indbygges" + +#~ msgid "function with transparent unit parameter cannot be inline" +#~ msgstr "funktioner med gennemsigtig union-parameter kan ikke indbygges" + +#~ msgid "function with computed jump cannot inline" +#~ msgstr "funktioner med beregnede spring kan ikke indbygges" + +#~ msgid "function with nonlocal goto cannot be inline" +#~ msgstr "funktioner med ikke-lokale goto'er kan ikke indbygges" + +#~ msgid "function with target specific attribute(s) cannot be inlined" +#~ msgstr "funktioner med målspecifikke egenskaber kan ikke indbygges" + +#~ msgid "invalid parameter `%s'" +#~ msgstr "ugyldig parameter '%s'" + +#~ msgid "Profile does not match flowgraph of function %s (out of date?)" +#~ msgstr "Profil passer ikke til flowgraph af funktionen %s (forældet?)" + +#~ msgid ".da file corrupted" +#~ msgstr ".da-fil ødelagt" + +# 'prob' står for sandsynlighed +#~ msgid "corrupted profile info: prob for %d-%d thought to be %d" +#~ msgstr "ødelagte profilinfo: sandsynlighed for %d-%d menes at være %d" + +#~ msgid "file %s not found, execution counts assumed to be zero" +#~ msgstr "filen %s ikke fundet, antager at kørselstællere er nul" + +#~ msgid "%s: internal abort\n" +#~ msgstr "%s: intern afbrydelse\n" + +#~ msgid "%s: error writing file `%s': %s\n" +#~ msgstr "%s: fejl ved skrivning til filen '%s': %s\n" + +#~ msgid "%s: usage '%s [ -VqfnkN ] [ -i ] [ filename ... ]'\n" +#~ msgstr "%s: brug '%s [ -VqfnkN ] [ -i ] [ filenavn ... ]'\n" + +#~ msgid "%s: usage '%s [ -VqfnkNlgC ] [ -B ] [ filename ... ]'\n" +#~ msgstr "%s: brug '%s [ -VqfnkNlgC ] [ -B ] [ filnavn ... ]'\n" + +#~ msgid "%s: warning: no read access for file `%s'\n" +#~ msgstr "%s: advarsel: ingen læseadgang til filen '%s'\n" + +#~ msgid "%s: warning: no write access for file `%s'\n" +#~ msgstr "%s: advarsel: ingen skriveadgang til filen '%s'\n" + +#~ msgid "%s: warning: no write access for dir containing `%s'\n" +#~ msgstr "%s: advarsel: ingen skriveadgang til kataloget der indeholder '%s'\n" + +#~ msgid "%s: invalid file name: %s\n" +#~ msgstr "%s: ugyldigt filnavn: %s\n" + +#~ msgid "%s: %s: can't get status: %s\n" +#~ msgstr "%s: %s: kan ikke finde ud af filens status: %s\n" + +#~ msgid "" +#~ "\n" +#~ "%s: fatal error: aux info file corrupted at line %d\n" +#~ msgstr "" +#~ "\n" +#~ "%s: fatal fejl: hjælpeinformationsfilen er beskadiget ved linje %d\n" + +#~ msgid "%s:%d: declaration of function `%s' takes different forms\n" +#~ msgstr "%s:%d: erklæringen af funktionen '%s' antager forskellige former\n" + +#~ msgid "%s: compiling `%s'\n" +#~ msgstr "%s: oversætter '%s'\n" + +#~ msgid "%s: wait: %s\n" +#~ msgstr "%s: vent: %s\n" + +#~ msgid "%s: subprocess got fatal signal %d\n" +#~ msgstr "%s: underprocessen modtog fatalt signal %d\n" + +#~ msgid "%s: %s exited with status %d\n" +#~ msgstr "%s: %s afsluttede med status %d\n" + +#~ msgid "%s: warning: missing SYSCALLS file `%s'\n" +#~ msgstr "%s: advarsel: manglende SYSCALLS-fil '%s'\n" + +#~ msgid "%s: can't read aux info file `%s': %s\n" +#~ msgstr "%s: kan ikke læse hjælpeinformationsfilen '%s': %s\n" + +#~ msgid "%s: can't get status of aux info file `%s': %s\n" +#~ msgstr "%s: kan ikke få status for hjælpeinformationsfilen '%s': %s\n" + +#~ msgid "%s: can't open aux info file `%s' for reading: %s\n" +#~ msgstr "%s: kan ikke åbne hjælpeinformationsfilen '%s' til at læse fra: %s\n" + +#~ msgid "%s: error reading aux info file `%s': %s\n" +#~ msgstr "%s: fejl ved læsning af hjælpeinformationsfilen '%s': %s\n" + +#~ msgid "%s: error closing aux info file `%s': %s\n" +#~ msgstr "%s: fejl ved lukning af hjælpeinformationsfilen '%s': %s\n" + +#~ msgid "%s: can't delete aux info file `%s': %s\n" +#~ msgstr "%s: kan ikke slette hjælpeinformationsfilen '%s': %s\n" + +#~ msgid "%s: can't delete file `%s': %s\n" +#~ msgstr "%s: kan ikke slette filen '%s': %s\n" + +#~ msgid "%s: warning: can't rename file `%s' to `%s': %s\n" +#~ msgstr "%s: advarsel: kan ikke omdøbe filen '%s' til '%s': %s\n" + +#~ msgid "%s: conflicting extern definitions of '%s'\n" +#~ msgstr "%s: modstridende eksterne definitioner af '%s'\n" + +#~ msgid "%s: declarations of '%s' will not be converted\n" +#~ msgstr "%s: erklæringer af '%s' vil ikke blive omdannet\n" + +#~ msgid "%s: conflict list for '%s' follows:\n" +#~ msgstr "%s: modstridene for '%s' følger:\n" + +#~ msgid "%s: warning: using formals list from %s(%d) for function `%s'\n" +#~ msgstr "%s: advarsel: bruger parameterlisten fra %s(%d) til funktionen '%s'\n" + +#~ msgid "%s: %d: `%s' used but missing from SYSCALLS\n" +#~ msgstr "%s: %d: '%s' benyttet, men mangler i SYSCALLS\n" + +#~ msgid "%s: %d: warning: no extern definition for `%s'\n" +#~ msgstr "%s: %d: advarsel: ingen ekstern definition af '%s'\n" + +#~ msgid "%s: warning: no static definition for `%s' in file `%s'\n" +#~ msgstr "%s: advarsel: ingen statisk definition af '%s' i filen '%s'\n" + +#~ msgid "%s: multiple static defs of `%s' in file `%s'\n" +#~ msgstr "%s: flere statiske definitioner af '%s' i filen '%s'\n" + +#~ msgid "%s: %d: warning: source too confusing\n" +#~ msgstr "%s: %d: advarsel: koden er for forvirrende\n" + +#~ msgid "%s: %d: warning: varargs function declaration not converted\n" +#~ msgstr "%s: %d: advarsel: funktionserklæring med variabel parameterliste er ikke omdannet\n" + +#~ msgid "%s: declaration of function `%s' not converted\n" +#~ msgstr "%s: erklæringen af funktionen '%s' er ikke omdannet\n" + +#~ msgid "%s: warning: too many parameter lists in declaration of `%s'\n" +#~ msgstr "%s: advarsel: for mange parameterlister i erklæringen af '%s'\n" + +#~ msgid "" +#~ "\n" +#~ "%s: warning: too few parameter lists in declaration of `%s'\n" +#~ msgstr "" +#~ "\n" +#~ "%s: advarsel: for få parameterlister i erklæringen af '%s'\n" + +#~ msgid "%s: %d: warning: found `%s' but expected `%s'\n" +#~ msgstr "%s: %d: advarsel: fandt '%s', men forventede '%s'\n" + +#~ msgid "%s: local declaration for function `%s' not inserted\n" +#~ msgstr "%s: den lokale erklæring af funktionen '%s' er ikke indsat\n" + +#~ msgid "" +#~ "\n" +#~ "%s: %d: warning: can't add declaration of `%s' into macro call\n" +#~ msgstr "" +#~ "\n" +#~ "%s: %d: advarsel: kan ikke tilføje erklæringen af '%s' i makrokald\n" + +#~ msgid "%s: global declarations for file `%s' not inserted\n" +#~ msgstr "%s: globale erklæringer for filen '%s' er ikke indsat\n" + +#~ msgid "%s: definition of function `%s' not converted\n" +#~ msgstr "%s: definitionen af funktionen '%s' er ikke omdannet\n" + +#~ msgid "%s: %d: warning: definition of %s not converted\n" +#~ msgstr "%s: %d: advarsel: definitionen af '%s' er ikke omdannet\n" + +#~ msgid "%s: found definition of `%s' at %s(%d)\n" +#~ msgstr "%s: fandt definitionen af '%s' ved %s(%d)\n" + +#~ msgid "%s: %d: warning: `%s' excluded by preprocessing\n" +#~ msgstr "%s: %d: advarsel: '%s' ekskluderet af forbehandlingen\n" + +#~ msgid "%s: function definition not converted\n" +#~ msgstr "%s: funktionsdefinitionen er ikke omdannet\n" + +#~ msgid "%s: `%s' not converted\n" +#~ msgstr "%s: '%s' ikke omdannet\n" + +#~ msgid "%s: would convert file `%s'\n" +#~ msgstr "%s: ville omdanne filen '%s'\n" + +#~ msgid "%s: converting file `%s'\n" +#~ msgstr "%s: omdanner filen '%s'\n" + +#~ msgid "%s: can't get status for file `%s': %s\n" +#~ msgstr "%s: kan ikke få status for filen '%s': %s\n" + +#~ msgid "%s: can't open file `%s' for reading: %s\n" +#~ msgstr "%s: kan ikke åbne filen '%s' til at læse fra: %s\n" + +#~ msgid "" +#~ "\n" +#~ "%s: error reading input file `%s': %s\n" +#~ msgstr "" +#~ "\n" +#~ "%s: fejl ved læsning af inddatafilen '%s': %s\n" + +#~ msgid "%s: can't create/open clean file `%s': %s\n" +#~ msgstr "%s: kan ikke oprette/åbne oprydningsfilen '%s': %s\n" + +#~ msgid "%s: warning: file `%s' already saved in `%s'\n" +#~ msgstr "%s: advarsel: filen '%s' er allerede gemt i '%s'\n" + +#~ msgid "%s: can't link file `%s' to `%s': %s\n" +#~ msgstr "%s: kan ikke kæde filen '%s' sammen med '%s': %s\n" + +#~ msgid "%s: can't create/open output file `%s': %s\n" +#~ msgstr "%s: kan ikke oprette/åbne uddatafilen '%s': %s\n" + +#~ msgid "%s: can't change mode of file `%s': %s\n" +#~ msgstr "%s: kan ikke ændre tilstanden af filen '%s': '%s'\n" + +#~ msgid "%s: cannot get working directory: %s\n" +#~ msgstr "%s: kan ikke få fat i arbejdskataloget: %s\n" + +#~ msgid "%s: input file names must have .c suffixes: %s\n" +#~ msgstr "%s: inddatafilnavn skal have '.c'-endelser: %s\n" + +#~ msgid "Didn't find a coloring.\n" +#~ msgstr "Kunne ikke finde en farvning.\n" + +#~ msgid "output constraint %d must specify a single register" +#~ msgstr "uddatabegrænsning %d skal angive et enkelt register" + +#~ msgid "output constraint %d cannot be specified together with \"%s\" clobber" +#~ msgstr "uddatabegrænsning %d kan ikke angives samtidig med overskrivning af \"%s\"" + +#~ msgid "output regs must be grouped at top of stack" +#~ msgstr "uddataregistre skal grupperes i toppen af stakken" + +#~ msgid "implicitly popped regs must be grouped at top of stack" +#~ msgstr "implicit aflæste registre skal grupperes i toppen af stakken" + +#~ msgid "output operand %d must use `&' constraint" +#~ msgstr "uddataoperand %d skal bruge begrænsningen '&'" + +#~ msgid "can't use '%s' as a %s register" +#~ msgstr "kan ikke bruge '%s' som et %s-register" + +#~ msgid "unknown register name: %s" +#~ msgstr "ukendt registernavn: %s" + +#~ msgid "global register variable follows a function definition" +#~ msgstr "en global registervariabel følger en funktionsdefinition" + +#~ msgid "register used for two global register variables" +#~ msgstr "register brugt til to globale registervariabler" + +#~ msgid "call-clobbered register used for global register variable" +#~ msgstr "kaldeoverskrevet register brugt til global registervariabel" + +#~ msgid "validate_value_data: [%u] Bad next_regno for empty chain (%u)" +#~ msgstr "validate_value_data: [%u] Ugyldig next_regno til tom kæde (%u)" + +#~ msgid "validate_value_data: Loop in regno chain (%u)" +#~ msgstr "validate_value_data: Løkke i registertalskæde (%u)" + +#~ msgid "validate_value_data: [%u] Bad oldest_regno (%u)" +#~ msgstr "validate_value_data: [%u] Ugyldig oldest_regno (%u)" + +#~ msgid "validate_value_data: [%u] Non-empty reg in chain (%s %u %i)" +#~ msgstr "validate_value_data: [%u] Ikke-tomt register i kæde (%s %u %i)" + +#~ msgid "cannot reload integer constant operand in `asm'" +#~ msgstr "kan ikke genindlæse heltalskonstantoperand i 'asm'" + +#~ msgid "impossible register constraint in `asm'" +#~ msgstr "umulig registerbegrænsing i 'asm'" + +#~ msgid "`&' constraint used with no register class" +#~ msgstr "'&'-begrænsning brugt uden registerklasse" + +#~ msgid "unable to generate reloads for:" +#~ msgstr "kunne ikke generere genindlæsninger for:" + +#~ msgid "inconsistent operand constraints in an `asm'" +#~ msgstr "inkonsistente operandbegræsninger i 'asm'" + +#~ msgid "frame size too large for reliable stack checking" +#~ msgstr "rammestørrelse for stor til pålidelig stakkontrol" + +#~ msgid "try reducing the number of local variables" +#~ msgstr "forsøg at reducere antallet af lokale variable" + +#~ msgid "can't find a register in class `%s' while reloading `asm'" +#~ msgstr "kan ikke finde et register i klassen '%s' ved genindlæsning af 'asm'" + +#~ msgid "unable to find a register to spill in class `%s'" +#~ msgstr "kan ikke finde et register at bortødsle i klassen '%s'" + +#~ msgid "this is the insn:" +#~ msgstr "dette er instruktionen:" + +#~ msgid "`asm' operand requires impossible reload" +#~ msgstr "'asm'-operand kræver umulig genindlæsning" + +#~ msgid "could not find a spill register" +#~ msgstr "kunne ikke finde et register at bortødsle" + +#~ msgid "`asm' operand constraint incompatible with operand size" +#~ msgstr "'asm'-operandbegrænsning ikke forenelig med operandstørrelse" + +#~ msgid "VOIDmode on an output" +#~ msgstr "VOID-tilstand ved uddata" + +#~ msgid "output operand is constant in `asm'" +#~ msgstr "uddataoperand er konstant i 'asm'" + +#~ msgid "unrecognizable insn:" +#~ msgstr "ukendt instruktion:" + +#~ msgid "insn does not satisfy its constraints:" +#~ msgstr "instruktion tilfredsstiller ikke sine begrænsninger:" + +#~ msgid "RTL check: access of elt %d of `%s' with last elt %d in %s, at %s:%d" +#~ msgstr "RTL-kontrol: tilgang til udtrykstræ %d fra '%s' med sidste udtrykstræ %d i %s, ved %s:%d" + +#~ msgid "RTL check: expected elt %d type '%c', have '%c' (rtx %s) in %s, at %s:%d" +#~ msgstr "RTL-kontrol: forventede udtrykstræ %d type '%c', har '%c' (registeroverførselsudtryk %s) i %s, ved %s:%d" + +#~ msgid "RTL check: expected elt %d type '%c' or '%c', have '%c' (rtx %s) in %s, at %s:%d" +#~ msgstr "RTL-kontrol: forventede udtrykstræ %d type '%c' eller '%c', har '%c' (registeroverførselsudtryk %s) i %s, ved %s:%d" + +#~ msgid "RTL check: expected code `%s', have `%s' in %s, at %s:%d" +#~ msgstr "RTL-kontrol: forventede koden '%s', har '%s' i %s, ved %s:%d" + +#~ msgid "RTL check: expected code `%s' or `%s', have `%s' in %s, at %s:%d" +#~ msgstr "RTL-kontrol: forventede koden '%s' eller '%s', har '%s' i %s, ved %s:%d" + +#~ msgid "RTL check: access of elt %d of vector with last elt %d in %s, at %s:%d" +#~ msgstr "RTL-kontrol: tilgang til udtrykstræ %d af vektor hvis sidste udtrykstræ er %d i %s, ved %s:%d" + +#~ msgid "RTL flag check: %s used with unexpected rtx code `%s' in %s, at %s:%d" +#~ msgstr "RTL-flagskontrol: %s benyttet med uventet rtx-kode '%s' i %s, ved %s:%d" + +#~ msgid "jump to `%s' invalidly jumps into binding contour" +#~ msgstr "spring til '%s' rammer på ugyldig vis ind i bindingskontur" + +#~ msgid "label `%s' used before containing binding contour" +#~ msgstr "etiket '%s' brugt før indholdende bindingskontur" + +#~ msgid "output operand constraint lacks `='" +#~ msgstr "uddataoperandbegrænsning mangler '='" + +#~ msgid "output constraint `%c' for operand %d is not at the beginning" +#~ msgstr "uddatabegrænsning '%c' for operanden %d er ikke ved begyndelsen" + +#~ msgid "operand constraint contains incorrectly positioned '+' or '='" +#~ msgstr "operandbegrænsning indeholder forkert placeret '+' eller '='" + +#~ msgid "`%%' constraint used with last operand" +#~ msgstr "'%%'-begrænsning brugt med sidste operand" + +#~ msgid "matching constraint not valid in output operand" +#~ msgstr "begrænsningen er ikke gyldig for uddataoperanden" + +#~ msgid "input operand constraint contains `%c'" +#~ msgstr "inddataoperandbegrænsningen indeholder '%c'" + +#~ msgid "matching constraint references invalid operand number" +#~ msgstr "begrænsning refererer til et ugyldigt operandtal" + +#~ msgid "invalid punctuation `%c' in constraint" +#~ msgstr "ugyldig punktuering '%c' i begrænsning" + +#~ msgid "asm-specifier for variable `%s' conflicts with asm clobber list" +#~ msgstr "asm-anvisning for variablen '%s' strider mod asm-overskrivelsesliste" + +#~ msgid "unknown register name `%s' in `asm'" +#~ msgstr "ukendt registernavn '%s' i 'asm'" + +#~ msgid "more than %d operands in `asm'" +#~ msgstr "mere end %d operander i 'asm'" + +#~ msgid "output number %d not directly addressable" +#~ msgstr "uddata nr. %d kan ikke adresseres direkte" + +#~ msgid "asm operand %d probably doesn't match constraints" +#~ msgstr "'asm'-operand %d passer sandsynligvis ikke til begrænsninger" + +#~ msgid "asm clobber conflict with output operand" +#~ msgstr "asm-overskrivelse er i modstrid med uddataoperander" + +#~ msgid "asm clobber conflict with input operand" +#~ msgstr "asm-overskrivelse er i modstrid med inddataoperander" + +#~ msgid "too many alternatives in `asm'" +#~ msgstr "for mange alternativer i 'asm'" + +#~ msgid "operand constraints for `asm' differ in number of alternatives" +#~ msgstr "operandbegrænsninger til 'asm' har forskellige antal alternativer" + +#~ msgid "duplicate asm operand name '%s'" +#~ msgstr "'asm'-operandnavnet '%s' optræder mere end én gang" + +#~ msgid "missing close brace for named operand" +#~ msgstr "manglende afsluttende krøllet parantes til navngiven operand" + +#~ msgid "undefined named operand '%s'" +#~ msgstr "ikkedefineret navngiven operand '%s'" + +#~ msgid "unused variable `%s'" +#~ msgstr "ubrugt variabel '%s'" + +#~ msgid "enumeration value `%s' not handled in switch" +#~ msgstr "enum-værdien '%s' håndteres ikke i switch-sætning" + +#~ msgid "case value `%ld' not in enumerated type" +#~ msgstr "case-værdien '%ld' eksisterer ikke i enum-type" + +#~ msgid "case value `%ld' not in enumerated type `%s'" +#~ msgstr "case-værdien '%ld' eksisterer ikke i enum-typen '%s'" + +#~ msgid "switch missing default case" +#~ msgstr "switch-konstruktion mangler default" + +#~ msgid "type size can't be explicitly evaluated" +#~ msgstr "det er ikke muligt eksplicit at finde typens størrelse" + +#~ msgid "variable-size type declared outside of any function" +#~ msgstr "en type med en variabel størrelse er erklæret uden for en funktion" + +#~ msgid "size of `%s' is %d bytes" +#~ msgstr "størrelsen af '%s' er %d byte" + +#~ msgid "size of `%s' is larger than %d bytes" +#~ msgstr "størrelsen af '%s' er større end %d byte" + +#~ msgid "packed attribute causes inefficient alignment for `%s'" +#~ msgstr "packed-egenskab forårsager ineffektiv justering af '%s'" + +#~ msgid "packed attribute is unnecessary for `%s'" +#~ msgstr "packed-egenskab er unødvendig for '%s'" + +#~ msgid "padding struct to align `%s'" +#~ msgstr "udfylder struct for at justere '%s'" + +#~ msgid "padding struct size to alignment boundary" +#~ msgstr "udfylder struct-størrelse til justeringskant" + +#~ msgid "packed attribute causes inefficient alignment" +#~ msgstr "packed-egenskab forårsager ineffektiv justering" + +#~ msgid "packed attribute is unnecessary" +#~ msgstr "packed-egenskab er unødvendig" + +#~ msgid "cannot timevar_pop '%s' when top of timevars stack is '%s'" +#~ msgstr "kan ikke udføre timevar_pop '%s' når toppen af timevars-stakken er '%s'" + +#~ msgid "" +#~ "\n" +#~ "Execution times (seconds)\n" +#~ msgstr "" +#~ "\n" +#~ "Udførselstid (sekunder)\n" + +#~ msgid " TOTAL :" +#~ msgstr " TOTAL :" + +#~ msgid "time in %s: %ld.%06ld (%ld%%)\n" +#~ msgstr "tid i %s: %ld.%06ld (%ld%%)\n" + +#~ msgid "collect: reading %s\n" +#~ msgstr "collect: læser %s\n" + +#~ msgid "collect: recompiling %s\n" +#~ msgstr "collect: genoversætter '%s'\n" + +# RETMIG: rigtigt? +#~ msgid "collect: tweaking %s in %s\n" +#~ msgstr "collect: presser %s i %s\n" + +#~ msgid "collect: relinking\n" +#~ msgstr "collect: kæder sammen igen\n" + +#~ msgid "ld returned %d exit status" +#~ msgstr "ld returnerede afslutningskoden %d" + +#~ msgid "Generate debugging info in default format" +#~ msgstr "Generér fejlfindingsinfo i standardformat" + +#~ msgid "Generate debugging info in default extended format" +#~ msgstr "Generér fejlfindingsinfo i udvidet standardformat" + +#~ msgid "Generate STABS format debug info" +#~ msgstr "Generér fejlfindingsinfo i STABS-format" + +#~ msgid "Generate extended STABS format debug info" +#~ msgstr "Generér fejlfindingsinfo i udvidet STABS-format" + +#~ msgid "Generate DWARF-1 format debug info" +#~ msgstr "Generér fejlfindingsinfo i DWARF-1-format" + +#~ msgid "Generate extended DWARF-1 format debug info" +#~ msgstr "Generér fejlfindingsinfo i udvidet DWARF-1-format" + +#~ msgid "Generate DWARF-2 debug info" +#~ msgstr "Generér fejlfindingsinfo i DWARF-2-format" + +#~ msgid "Generate XCOFF format debug info" +#~ msgstr "Generér fejlfindingsinfo i XCOFF-format" + +#~ msgid "Generate extended XCOFF format debug info" +#~ msgstr "Generér fejlfindingsinfo i udvidet XCOFF-format" + +#~ msgid "Generate COFF format debug info" +#~ msgstr "Generér fejlfindingsinfo i COFF-format" + +#~ msgid "Generate VMS format debug info" +#~ msgstr "Generér fejlfindingsinfo i VMS-format" + +#~ msgid "Perform DWARF2 duplicate elimination" +#~ msgstr "Udfør DWARF2-eliminering af dubletter" + +#~ msgid "Do not store floats in registers" +#~ msgstr "Lagr ikke kommatal i registre" + +#~ msgid "Consider all mem refs through pointers as volatile" +#~ msgstr "Betragt alle hukommelsesferencer gennem henvisninger som volatile" + +#~ msgid "Consider all mem refs to global data to be volatile" +#~ msgstr "Betragt alle hukommelsesferencer til globale data som volatile" + +#~ msgid "Consider all mem refs to static data to be volatile" +#~ msgstr "Betragt alle hukommelsesferencer til statiske data som volatile" + +#~ msgid "Defer popping functions args from stack until later" +#~ msgstr "Vent med fjernelse af funktionsparametre fra stakken til senere" + +#~ msgid "When possible do not generate stack frames" +#~ msgstr "Generér ikke stakrammer når det kan undgås" + +#~ msgid "Optimize sibling and tail recursive calls" +#~ msgstr "Optimér søskende- og halerekursive kald" + +#~ msgid "Perform superblock formation via tail duplication" +#~ msgstr "Udfør superbloksformering vha. haleduplikering" + +# RETMIG: hvad er CSE? +#~ msgid "When running CSE, follow jumps to their targets" +#~ msgstr "Ved kørsel af CSE følg spring til deres mål" + +#~ msgid "When running CSE, follow conditional jumps" +#~ msgstr "Ved kørsel af CSE følg betingede spring" + +#~ msgid "Perform a number of minor, expensive optimizations" +#~ msgstr "Udfør et antal mindre, dyre optimeringer" + +#~ msgid "Perform jump threading optimizations" +#~ msgstr "Udfør springtrådningsoptimeringer" + +#~ msgid "Perform strength reduction optimizations" +#~ msgstr "Udfør styrkereduceringsoptimeringer" + +#~ msgid "Perform loop unrolling when iteration count is known" +#~ msgstr "Udfør løkkeudrulning når iterationsantallet er kendt" + +#~ msgid "Perform loop unrolling for all loops" +#~ msgstr "Udfør løkkeudrulning for alle løkker" + +#~ msgid "Generate prefetch instructions, if available, for arrays in loops" +#~ msgstr "Generér præhentningsinstruktioner, hvis tilgængelige, for tabeller i løkker" + +#~ msgid "Force all loop invariant computations out of loops" +#~ msgstr "Tving alle løkkeinvariansberegninger ud af løkker" + +#~ msgid "Strength reduce all loop general induction variables" +#~ msgstr "Styrkereducér alle generelle løkkeinduktionsvariabler" + +#~ msgid "Store strings in writable data section" +#~ msgstr "Gem strenge i en skrivbar datasektion" + +#~ msgid "Enable machine specific peephole optimizations" +#~ msgstr "Aktivér maskinspecifikke kighulsoptimeringer" + +#~ msgid "Copy memory operands into registers before using" +#~ msgstr "Kopiér hukommelsesoperander ind i registre før brug" + +#~ msgid "Copy memory address constants into regs before using" +#~ msgstr "Kopiér hukommelsesadressekonstanter ind i registre før brug" + +#~ msgid "Allow function addresses to be held in registers" +#~ msgstr "Tillad funktionsadresser at blive opbevaret i registre" + +#~ msgid "Integrate simple functions into their callers" +#~ msgstr "Integrér simple funktioner i deres kaldere" + +#~ msgid "Generate code for funcs even if they are fully inlined" +#~ msgstr "Generér kode for funktioner selv hvis de indlejres helt" + +#~ msgid "Pay attention to the 'inline' keyword" +#~ msgstr "Læg mærke til 'inline'-nøgleordet" + +#~ msgid "Emit static const variables even if they are not used" +#~ msgstr "Konstruér statiske, konstante variabler selv hvis de ikke bruges" + +#~ msgid "Check for syntax errors, then stop" +#~ msgstr "Kontrollér syntaks og stop derefter" + +#~ msgid "Mark data as shared rather than private" +#~ msgstr "Markér data som delt snarere end privat" + +#~ msgid "Enable saving registers around function calls" +#~ msgstr "Aktivér gemning af registrer omkring funktionskald" + +#~ msgid "Return 'short' aggregates in memory, not registers" +#~ msgstr "Returnér små sammensatte værdier i hukommelsen, ikke i registre" + +#~ msgid "Return 'short' aggregates in registers" +#~ msgstr "Returnér små sammensatte værdier i registre" + +#~ msgid "Attempt to fill delay slots of branch instructions" +#~ msgstr "Forsøg at udfylde ventepladser med forgreningsinstruktioner" + +#~ msgid "Perform the global common subexpression elimination" +#~ msgstr "Udfør global eliminering af fælles underudtryk" + +#~ msgid "Perform enhanced load motion during global subexpression elimination" +#~ msgstr "Udfør forbedret indlæsningsbevægelse under eliminering af fælles underudtryk" + +#~ msgid "Perform store motion after global subexpression elimination" +#~ msgstr "Udfør lagringsbevægelse efter eliminering af fælles underudtryk" + +#~ msgid "Perform the loop optimizations" +#~ msgstr "Udfør løkkeoptimeringerne" + +#~ msgid "Perform cross-jumping optimization" +#~ msgstr "Udfør krydsspringsoptimering" + +#~ msgid "Perform conversion of conditional jumps to branchless equivalents" +#~ msgstr "Udfør konvertering af betingede spring til forgreningsløse ækvivalenter" + +#~ msgid "Perform conversion of conditional jumps to conditional execution" +#~ msgstr "Udfør konvertering af betingede spring til betinget udførsel" + +#~ msgid "Run CSE pass after loop optimizations" +#~ msgstr "Kør CSE-fase efter løkkeoptimeringer" + +#~ msgid "Run the loop optimizer twice" +#~ msgstr "Kør løkkeoptimeringen to gange" + +#~ msgid "Delete useless null pointer checks" +#~ msgstr "Fjern ubrugelige nul-henvisningstjek" + +#~ msgid "Reschedule instructions before register allocation" +#~ msgstr "Omplanlæg instruktioner før registerallokering" + +#~ msgid "Reschedule instructions after register allocation" +#~ msgstr "Omplanlæg instruktioner efter registerallokering" + +#~ msgid "Enable scheduling across basic blocks" +#~ msgstr "Aktivér planlægning over basisblokke" + +#~ msgid "Allow speculative motion of non-loads" +#~ msgstr "Tillad spekulativ bevægelse af ikke-indlæsninger" + +#~ msgid "Allow speculative motion of some loads" +#~ msgstr "Tillad spekulativ bevægelse af nogle indlæsninger" + +#~ msgid "Allow speculative motion of more loads" +#~ msgstr "Tillad spekulativ bevægelse af flere indlæsninger" + +# RETMIG: rigtig? +#~ msgid "Replace add,compare,branch with branch on count reg" +#~ msgstr "Erstat tilføj,sammenlign,forgrening med forgrening på tælleregister" + +#~ msgid "Generate position independent code, if possible" +#~ msgstr "Generér placeringsuafhængig kode, om muligt" + +#~ msgid "Enable exception handling" +#~ msgstr "Aktivér undtagelseshåndtering" + +#~ msgid "Just generate unwind tables for exception handling" +#~ msgstr "Generér blot afvindingstabeller for undtagelseshåndtering" + +#~ msgid "Generate unwind tables exact at each instruction boundary" +#~ msgstr "Generér afvindingstabeller eksakt for hver instruktionsgrænse" + +#~ msgid "Support synchronous non-call exceptions" +#~ msgstr "Understøt synkrone ikke-kaldende undtagelser" + +#~ msgid "Insert arc based program profiling code" +#~ msgstr "Indsæt buebaseret programprofileringskode" + +#~ msgid "Create data files needed by gcov" +#~ msgstr "Opret datafiler som gcov har brug for" + +#~ msgid "Use profiling information for branch probabilities" +#~ msgstr "Benyt profileringsoplysninger til forgreningssandsynligheder" + +#~ msgid "Enable basic program profiling code" +#~ msgstr "Aktivér basal programprofileringskode" + +#~ msgid "Reorder basic blocks to improve code placement" +#~ msgstr "Omordn basisblokke for at forbedre kodeplacering" + +#~ msgid "Reorder functions to improve code placement" +#~ msgstr "Omordn funktioner for at forbedre kodeplacering" + +#~ msgid "Do the register renaming optimization pass" +#~ msgstr "Foretag registeromdøbningsoptimering" + +#~ msgid "Do the register copy-propagation optimization pass" +#~ msgstr "Foretag registerkopipropageringsoptimering" + +#~ msgid "Do not put uninitialized globals in the common section" +#~ msgstr "Anbring ikke uklargjorte globale variabler i den fælles sektion" + +#~ msgid "Do not generate .size directives" +#~ msgstr "Generér ikke .size-direktiver" + +#~ msgid "place each function into its own section" +#~ msgstr "placér hver funktion i dens egen sektion" + +#~ msgid "place data items into their own section" +#~ msgstr "placér dataelementer i deres egen sektion" + +#~ msgid "Add extra commentary to assembler output" +#~ msgstr "Tilføj ekstra kommentarer til menneskeligt læsbar maskinkodeuddata" + +#~ msgid "Output GNU ld formatted global initializers" +#~ msgstr "Udskriv GNU ld-formaterede globale startværdier" + +#~ msgid "Enables a register move optimization" +#~ msgstr "Aktivér en registerflytningsoptimering" + +#~ msgid "Do the full regmove optimization pass" +#~ msgstr "Foretag en komplet registerflytningsoptimering" + +#~ msgid "Pack structure members together without holes" +#~ msgstr "Pak strukturmedlemmer sammen uden mellemrum" + +#~ msgid "Insert stack checking code into the program" +#~ msgstr "Indsæt stakkontrolleringskode i programmet" + +#~ msgid "Specify that arguments may alias each other & globals" +#~ msgstr "Angiv at parametre kan være aliaser for hinanden og for globale variable" + +#~ msgid "Assume arguments may alias globals but not each other" +#~ msgstr "Antag at parametre kan være aliaser for globale variable, men ikke for hinanden" + +#~ msgid "Assume arguments do not alias each other or globals" +#~ msgstr "Antag at parametre ikke er aliaser for hinanden eller for globale variable" + +#~ msgid "Assume strict aliasing rules apply" +#~ msgstr "Antag at strenge aliasregler skal anvendes" + +#~ msgid "Align the start of loops" +#~ msgstr "Justér begyndelsen af løkker" + +#~ msgid "Align labels which are only reached by jumping" +#~ msgstr "Justér etiketter som kun nås ved spring" + +#~ msgid "Align all labels" +#~ msgstr "Justér alle etiketter" + +#~ msgid "Align the start of functions" +#~ msgstr "Justér begyndelsen af funktioner" + +#~ msgid "Attempt to merge identical constants across compilation units" +#~ msgstr "Forsøg at forene identiske konstanter over forskellige oversættelsesenheder" + +#~ msgid "Attempt to merge identical constants and constant variables" +#~ msgstr "Forsøg at forene identiske konstanter og konstante variabler" + +#~ msgid "Suppress output of instruction numbers and line number notes in debugging dumps" +#~ msgstr "Undtryk udskrift af instruktionstal og linjenummernoter i fejlfindingsdump" + +#~ msgid "Instrument function entry/exit with profiling calls" +#~ msgstr "Instrumentér funktionsindgange/-afslutninger med profileringskald" + +#~ msgid "Put zero initialized data in the bss section" +#~ msgstr "Anbring nul-klargjorte data i bss-sektionen" + +#~ msgid "Enable SSA optimizations" +#~ msgstr "Aktivér SSA-optimeringer" + +#~ msgid "Enable SSA conditional constant propagation" +#~ msgstr "Aktivér betinget konstant SSA-propagering" + +#~ msgid "Enable aggressive SSA dead code elimination" +#~ msgstr "Aktivér aggressiv SSA-eliminering af ubrugt kode" + +#~ msgid "External symbols have a leading underscore" +#~ msgstr "Eksterne symboler har indledende understreg" + +#~ msgid "Process #ident directives" +#~ msgstr "Behandl #ident-direktiver" + +#~ msgid "Enables an rtl peephole pass run before sched2" +#~ msgstr "Aktivér en RTL-kikhulsfase før sched2" + +#~ msgid "Assume no NaNs or +-Infs are generated" +#~ msgstr "Antag at ingen NaN eller +-Inf bliver genereret" + +#~ msgid "Enables guessing of branch probabilities" +#~ msgstr "Aktivér gæt af forgreningssandsynligheder" + +#~ msgid "Set errno after built-in math functions" +#~ msgstr "Sæt errno efter indbyggede matematikfunktioner" + +#~ msgid "Floating-point operations can trap" +#~ msgstr "Kommatalsoperationer kan fange" + +#~ msgid "Allow math optimizations that may violate IEEE or ANSI standards" +#~ msgstr "Tillad matematikoptimeringer der kan overtræde IEEE- eller ANSI-standarderne" + +#~ msgid "Disable optimizations observable by IEEE signaling NaNs" +#~ msgstr "Deaktivér optimeringer som kan opdages ved IEEE-signalerende NaN'er" + +#~ msgid "Generate code to check bounds before indexing arrays" +#~ msgstr "Generér kode til at kontrollere grænserne før tabeller indekseres" + +#~ msgid "Convert floating point constant to single precision constant" +#~ msgstr "Konvertér kommatalskonstanter til enkeltpræcisionskonstanter" + +#~ msgid "Report time taken by each compiler pass at end of run" +#~ msgstr "Rapportér den tid det tager for hver oversættelsesfase ved afslutningen af kørslen" + +#~ msgid "Report on permanent memory allocation at end of run" +#~ msgstr "Rapportér om permanente hukommelsesallokering ved afslutningen af kørslen" + +#~ msgid "Trap for signed overflow in addition / subtraction / multiplication" +#~ msgstr "Opsæt fælde for overløb med fortegn i addition/subtraktion/multiplikation" + +#~ msgid "Use graph coloring register allocation." +#~ msgstr "Allokér registre vha. graffarvning" + +#~ msgid "Compile just for ISO C90" +#~ msgstr "Oversæt kun til ISO C90" + +#~ msgid "Determine language standard" +#~ msgstr "Bestem sprogstandarden" + +#~ msgid "Make bit-fields by unsigned by default" +#~ msgstr "Lad bitfelter være uden fortegn som standard" + +#~ msgid "Make 'char' be signed by default" +#~ msgstr "Lad 'char' være med fortegn som standard" + +#~ msgid "Make 'char' be unsigned by default" +#~ msgstr "Lad 'char' være uden fortegn som standard" + +#~ msgid "Do not recognize the 'asm' keyword" +#~ msgstr "Genkend ikke det reserverede ord 'asm'" + +#~ msgid "Do not recognize any built in functions" +#~ msgstr "Genkend ikke nogen indbyggede funktioner" + +#~ msgid "Assume normal C execution environment" +#~ msgstr "Antag normalt C-kørselsmiljø" + +#~ msgid "Assume that standard libraries & main might not exist" +#~ msgstr "Antag at standardbibliotekerne og main måske ikke eksisterer" + +#~ msgid "Allow different types as args of ? operator" +#~ msgstr "Tillad forskellige typer som parametre til ?-operatoren" + +#~ msgid "Allow the use of $ inside identifiers" +#~ msgstr "Tillad brug af $ inden i kaldenavne" + +#~ msgid "Use the same size for double as for float" +#~ msgstr "Benyt den samme størrelse til double som til float" + +#~ msgid "Use the smallest fitting integer to hold enums" +#~ msgstr "Benyt den mindst mulige størrelse heltal til enum-værdier" + +#~ msgid "Override the underlying type for wchar_t to `unsigned short'" +#~ msgstr "Overskriv den underliggende type af wchar_t til 'unsigned short'" + +#~ msgid "Enable most warning messages" +#~ msgstr "Aktivér de fleste advarselsbeskeder" + +#~ msgid "Warn about casting functions to incompatible types" +#~ msgstr "Advar om omtvingning af funktioner til ikke-kompatible typer" + +#~ msgid "Warn about functions which might be candidates for format attributes" +#~ msgstr "Advar om funktioner som kan være kandidater til formateringsegenskaber" + +#~ msgid "Warn about casts which discard qualifiers" +#~ msgstr "Advar om typeomtvingninger som forkaster modifikationer" + +#~ msgid "Warn about subscripts whose type is 'char'" +#~ msgstr "Advar som tabelindeksering hvis type er 'char'" + +#~ msgid "Warn if nested comments are detected" +#~ msgstr "Advar hvis indlejrede kommentarer mødes" + +#~ msgid "Warn about possibly confusing type conversions" +#~ msgstr "Advar om typekonverteringer der kan være forvirrende" + +#~ msgid "Do not warn about compile-time integer division by zero" +#~ msgstr "Advar ikke om heltalsdivision på oversættelsestidspunktet med nul" + +#~ msgid "Warn about testing equality of floating point numbers" +#~ msgstr "Advar om lighedssammenligninger mellem kommatal" + +#~ msgid "Warn about printf/scanf/strftime/strfmon format anomalies" +#~ msgstr "Advar om printf/scanf/strftime/strfmon-formateringsanormaliteter" + +#~ msgid "Don't warn about too many arguments to format functions" +#~ msgstr "Advar ikke om for mange parametre til formateringsfunktioner" + +#~ msgid "Warn about non-string-literal format strings" +#~ msgstr "Advar om formateringsstrenge der ikke er strengkonstanter" + +#~ msgid "Warn about possible security problems with format functions" +#~ msgstr "Advar om mulige sikkerhedsproblemer i forbindelse med formateringsfunktioner" + +#~ msgid "Don't warn about strftime formats yielding 2 digit years" +#~ msgstr "Advar ikke om strftime-formateringer med 2-cifres år" + +#~ msgid "Warn about implicit function declarations" +#~ msgstr "Advar om underforståede funktionserklæringer" + +#~ msgid "Warn when a declaration does not specify a type" +#~ msgstr "Advar når en erklæring ikke angiver en type" + +#~ msgid "Warn about the use of the #import directive" +#~ msgstr "Advar om brug af #import-direktivet" + +#~ msgid "Do not warn about using 'long long' when -pedantic" +#~ msgstr "Advar ikke om brug af 'long long' når -pedantic benyttes" + +#~ msgid "Warn about suspicious declarations of main" +#~ msgstr "Advar om mistænkelige erklæringer af main" + +#~ msgid "Warn about possibly missing braces around initializers" +#~ msgstr "Advar om mulige manglende krøllede paranteser omkring startværdier" + +#~ msgid "Warn about global funcs without previous declarations" +#~ msgstr "Advar om globale funktioner uden tidligere erklæringer" + +#~ msgid "Warn about global funcs without prototypes" +#~ msgstr "Advar om globale funktioner uden prototyper" + +#~ msgid "Warn about use of multicharacter literals" +#~ msgstr "Advar om brug af multitegnskonstanter" + +#~ msgid "Warn about externs not at file scope level" +#~ msgstr "Advar om extern-erklæringer som ikke er ved filvirkefeltsniveauet" + +#~ msgid "Warn about possible missing parentheses" +#~ msgstr "Advar om mulige manglende paranteser" + +#~ msgid "Warn about function pointer arithmetic" +#~ msgstr "Advar om beregninger på funktionshenvisninger" + +#~ msgid "Warn about multiple declarations of the same object" +#~ msgstr "Advar om flere erklæring af det samme objekt" + +#~ msgid "Warn whenever a function's return-type defaults to int" +#~ msgstr "Advar når en funktions returtype antages at være int" + +#~ msgid "Warn about possible violations of sequence point rules" +#~ msgstr "Advar om mulige brud på sekvenspunktreglerne" + +#~ msgid "Warn about signed/unsigned comparisons" +#~ msgstr "Advar om sammenligninger mellem typer med og uden fortegn" + +#~ msgid "Warn about non-prototyped function decls" +#~ msgstr "Advar om funktionserklæringer uden prototype" + +#~ msgid "Warn about constructs whose meanings change in ISO C" +#~ msgstr "Advar om konstruktioner hvis betydning er ændret i ISO C" + +#~ msgid "Warn when trigraphs are encountered" +#~ msgstr "Advar når trigrafer mødes" + +#~ msgid "Warn about unrecognized pragmas" +#~ msgstr "Advar om ukendte pragmaer" + +#~ msgid "Mark strings as 'const char *'" +#~ msgstr "Markér strenge som 'const char *'" + +#~ msgid "Warn when a function is unused" +#~ msgstr "Advar når en funktion ikke benyttes" + +#~ msgid "Warn when a label is unused" +#~ msgstr "Advar når en etiket ikke benyttes" + +#~ msgid "Warn when a function parameter is unused" +#~ msgstr "Advar når en funktionsparameter ikke benyttes" + +#~ msgid "Warn when a variable is unused" +#~ msgstr "Advar når en variabel ikke benyttes" + +#~ msgid "Warn when an expression value is unused" +#~ msgstr "Advar når værdien af et udtryk ikke benyttes" + +#~ msgid "Do not suppress warnings from system headers" +#~ msgstr "Undertryk ikke advarsler fra systeminkluderingsfiler" + +#~ msgid "Treat all warnings as errors" +#~ msgstr "Behandl alle advarsler som fejl" + +#~ msgid "Warn when one local variable shadows another" +#~ msgstr "Advar når en lokal variabel skygger for en anden" + +#~ msgid "Warn about enumerated switches, with no default, missing a case" +#~ msgstr "Advar om switch-sætninger over enum-typer som mangler et tilfælde og ikke har default" + +#~ msgid "Warn about enumerated switches missing a default case" +#~ msgstr "Advar om switch-sætninger over enum-typer som mangler default" + +#~ msgid "Warn about all enumerated switches missing a specific case" +#~ msgstr "Advar om alle switch-sætninger over enum-typer som mangler et bestemt tilfælde" + +#~ msgid "Warn about returning structures, unions or arrays" +#~ msgstr "Advar om returnering af struct, union og tabeller" + +#~ msgid "Warn about pointer casts which increase alignment" +#~ msgstr "Advar om typeomtvingning af henvisninger som forøger justeringen" + +#~ msgid "Warn about code that will never be executed" +#~ msgstr "Advar om kode som aldrig bliver udført" + +#~ msgid "Warn about uninitialized automatic variables" +#~ msgstr "Advar om ikke-klargjorte automatiske variabler" + +#~ msgid "Warn when an inlined function cannot be inlined" +#~ msgstr "Advar når en inline funktion ikke kan indbygges" + +#~ msgid "Warn when the packed attribute has no effect on struct layout" +#~ msgstr "Advar når packed-egenskaben ikke har nogen effekt på struct-layoutet" + +#~ msgid "Warn when padding is required to align struct members" +#~ msgstr "Advar når udfyldning er påkrævet for at justere struct-medlemmer" + +#~ msgid "Warn when an optimization pass is disabled" +#~ msgstr "Advar når en optimeringsfase deaktiveres" + +#~ msgid "Warn about uses of __attribute__((deprecated)) declarations" +#~ msgstr "Advar om brug af __attribute__((deprecated))-erklæringer" + +#~ msgid "Warn about functions which might be candidates for attribute noreturn" +#~ msgstr "Advar om funktioner som kan være kandidater til egenskaben noreturn" + +#~ msgid "Warn about code which might break the strict aliasing rules" +#~ msgstr "Advar om kode som kan bryde strenge aliasregler" + +#~ msgid "invalid option `%s'" +#~ msgstr "ugyldigt tilvalg '%s'" + +#~ msgid "`%s' declared `static' but never defined" +#~ msgstr "'%s' erklæret 'static', men aldrig defineret" + +#~ msgid "`%s' defined but not used" +#~ msgstr "'%s' defineret, men aldrig brugt" + +#~ msgid "invalid register name `%s' for register variable" +#~ msgstr "ugyldigt registernavn '%s' for registervariabel" + +#~ msgid " -ffixed- Mark as being unavailable to the compiler\n" +#~ msgstr " -ffixed- Markér som værende utilgængeligt for oversætteren\n" + +#~ msgid " -fcall-used- Mark as being corrupted by function calls\n" +#~ msgstr " -fcall-used- Markér som værende benyttet af funktionskald\n" + +#~ msgid " -fcall-saved- Mark as being preserved across functions\n" +#~ msgstr " -fcall-saved- Markér som værende bevaret over funktioner\n" + +#~ msgid " -finline-limit= Limits the size of inlined functions to \n" +#~ msgstr " -finline-limit= Begræns størrelsen af inlie funktion til \n" + +#~ msgid " -fmessage-length= Limits diagnostics messages lengths to characters per line. 0 suppresses line-wrapping\n" +#~ msgstr " -fmessage-length= Begræns længden af diagnosticeringmeddelelser til længden tegn/linje. 0 undertrykker linjeombrydning\n" + +#~ msgid " -fdiagnostics-show-location=[once | every-line] Indicates how often source location information should be emitted, as prefix, at the beginning of diagnostics when line-wrapping\n" +#~ msgstr " -fdiagnostics-show-location=[once | every-line] Indikerer hvor ofte kildeplaceringsoplysninger skal udsendes som præfiks til begyndelsen af meddelelserne ved linjeombrydning\n" + +#~ msgid " -ftls-model=[global-dynamic | local-dynamic | initial-exec | local-exec] Indicates the default thread-local storage code generation model\n" +#~ msgstr " -ftls-model=[global-dynamic | local-dynamic | initial-exec | local-exec] Indikerer den forvalgte tråd-lokale lagringsmodel for kodegenerering\n" + +#~ msgid " -O[number] Set optimization level to [number]\n" +#~ msgstr " -O[tal] Sæt optimeringsniveauet til [tal]\n" + +#~ msgid " -Os Optimize for space rather than speed\n" +#~ msgstr " -Os Optimér mht. plads i stedet for hastighed\n" + +#~ msgid " -pedantic Issue warnings needed by strict compliance to ISO C\n" +#~ msgstr " -pedantic Udsend advarsler som er nødvendige for streng overholdelse af ISO C\n" + +#~ msgid " -pedantic-errors Like -pedantic except that errors are produced\n" +#~ msgstr " -pedantic-errors Som -pedantic bortset fra at problemer bliver til fejl\n" + +#~ msgid " -w Suppress warnings\n" +#~ msgstr " -w Undertryk advarsler\n" + +#~ msgid " -W Enable extra warnings\n" +#~ msgstr " -W Aktivér ekstra advarsler\n" + +#~ msgid " -Wunused Enable unused warnings\n" +#~ msgstr " -Wunused Aktivér ubrugthedsadvarsler\n" + +#~ msgid " -Wlarger-than- Warn if an object is larger than bytes\n" +#~ msgstr " -Wlarger-than- Advar hvis et objekt er større end byte\n" + +#~ msgid " -p Enable function profiling\n" +#~ msgstr " -p Aktivér funktionsprofilering\n" + +#~ msgid " -o Place output into \n" +#~ msgstr " -o Anbring uddata i \n" + +#~ msgid "" +#~ " -G Put global and static data smaller than \n" +#~ " bytes into a special section (on some targets)\n" +#~ msgstr " -G Anbring globale og statiske data mindre end byte i en specialsektion (på nogle målarkitekturer)\n" + +#~ msgid " -aux-info Emit declaration info into \n" +#~ msgstr " -aux-info Udskriv erklæringsoplysninger til \n" + +#~ msgid " -quiet Do not display functions compiled or elapsed time\n" +#~ msgstr " -quiet Vis ikke funktioner der oversættes eller forløbet tid\n" + +#~ msgid " -version Display the compiler's version\n" +#~ msgstr " -version Udskriv oversætterens version\n" + +#~ msgid " -d[letters] Enable dumps from specific passes of the compiler\n" +#~ msgstr " -d[bogstaver] Aktivér dump fra specifikke faser i oversætteren\n" + +#~ msgid " -dumpbase Base name to be used for dumps from specific passes\n" +#~ msgstr " -dumpbase Basisnavn til brug for dump fra specifikke faser\n" + +#~ msgid " -fsched-verbose= Set the verbosity level of the scheduler\n" +#~ msgstr " -fsched-verbose= Angiv hvor meget planlæggeren skal fortælle\n" + +#~ msgid " --help Display this information\n" +#~ msgstr " --help Vis disse oplysninger\n" + +#~ msgid "" +#~ "\n" +#~ "Language specific options:\n" +#~ msgstr "" +#~ "\n" +#~ "Sprogspecifikke tilvalg:\n" + +#~ msgid " %-23.23s [undocumented]\n" +#~ msgstr " %-23.23s [ikke dokumenteret]\n" + +# %s er et sprog +#~ msgid "" +#~ "\n" +#~ "There are undocumented %s specific options as well.\n" +#~ msgstr "" +#~ "\n" +#~ "Der er også ikke-dokumenterede specifikke tilvalg til %s.\n" + +#~ msgid "" +#~ "\n" +#~ " Options for %s:\n" +#~ msgstr "" +#~ "\n" +#~ " Tilvalg til %s:\n" + +#~ msgid "" +#~ "\n" +#~ "Target specific options:\n" +#~ msgstr "" +#~ "\n" +#~ "Målspecifikke tilvalg:\n" + +#~ msgid " -m%-23.23s [undocumented]\n" +#~ msgstr " -m%-23.23s [ikke dokumenteret]\n" + +#~ msgid "" +#~ "\n" +#~ "There are undocumented target specific options as well.\n" +#~ msgstr "" +#~ "\n" +#~ "Der er også ikke-dokumenterede målspecifikke tilvalg.\n" + +#~ msgid " They exist, but they are not documented.\n" +#~ msgstr " De eksisterer, men er ikke dokumenteret.\n" + +#~ msgid "unrecognized gcc debugging option: %c" +#~ msgstr "ukendt GCC-fejlfindingstilvalg: %c" + +#~ msgid "`%s': unknown tls-model option" +#~ msgstr "'%s': ukendt tls-model-tilvalg" + +#~ msgid "unrecognized register name `%s'" +#~ msgstr "ukendt registernavn '%s'" + +#~ msgid "unrecognized option `%s'" +#~ msgstr "ukendt tilvalg '%s'" + +#~ msgid "-Wid-clash-LEN is no longer supported" +#~ msgstr "-Wid-clash-LEN understøttes ikke længere" + +#~ msgid "use -gdwarf -g%d for DWARF v1, level %d" +#~ msgstr "benyt - gdwarf -g%d til DWARF v1, niveau %d" + +#~ msgid "use -gdwarf-2 for DWARF v2" +#~ msgstr "benyt -gdwarf-2 til DWARF v2" + +#~ msgid "ignoring option `%s' due to invalid debug level specification" +#~ msgstr "ignorerer tilvalget '%s' på grund af ugyldig specifikation af fejlfindingsniveau" + +#~ msgid "`%s': unknown or unsupported -g option" +#~ msgstr "'%s': ukendt eller ikke-understøttet '-g'-tilvalg" + +#~ msgid "`%s' ignored, conflicts with `-g%s'" +#~ msgstr "'%s' ignoreret, er i konflikt med '-g%s'" + +#~ msgid "-param option missing argument" +#~ msgstr "'-param'-tilvalg mangler parameter" + +#~ msgid "invalid --param option: %s" +#~ msgstr "ugyldigt '--param'-tilvalg: %s" + +#~ msgid "invalid parameter value `%s'" +#~ msgstr "ugyldig parameterværdi '%s'" + +#~ msgid "" +#~ "%s%s%s version %s (%s)\n" +#~ "%s\tcompiled by GNU C version %s.\n" +#~ "%s%s%s version %s (%s) compiled by CC.\n" +#~ msgstr "" +#~ "%s%s%s version %s (%s)\n" +#~ "%s\toversat af GNU C version %s.\n" +#~ "%s%s%s version %s (%s) oversat af CC.\n" + +#~ msgid "%s%sGGC heuristics: --param ggc-min-expand=%d --param ggc-min-heapsize=%d\n" +#~ msgstr "%s%sGGC-heuristikker: --param ggc-min-expand=%d --param ggc-min-heapsize=%d\n" + +#~ msgid "options passed: " +#~ msgstr "tilvalg overbragt: " + +#~ msgid "options enabled: " +#~ msgstr "tilvalg slået til: " + +#~ msgid "can't open %s for writing" +#~ msgstr "kan ikke åbne '%s' til skrivning" + +#~ msgid "ignoring command line option '%s'" +#~ msgstr "ignorerer kommandolinjetilvalget '%s'" + +#~ msgid "(it is valid for %s but not the selected language)" +#~ msgstr "(det er gyldigt for %s, men ikke for det valgte sprog)" + +#~ msgid "-Wuninitialized is not supported without -O" +#~ msgstr "-Wuninitialized understøttes ikke uden -O" + +#~ msgid "instruction scheduling not supported on this target machine" +#~ msgstr "instruktionsplanlægning understøttes ikke på målarkitekturen" + +#~ msgid "this target machine does not have delayed branches" +#~ msgstr "målarkitekturen har ikke forsinkede forgreninger" + +#~ msgid "-f%sleading-underscore not supported on this target machine" +#~ msgstr "-f%sleading-underscore understøttes ikke på målarkitekturen" + +#~ msgid "-ffunction-sections not supported for this target" +#~ msgstr "-ffunction-sections understøttes ikke på målarkitekturen" + +#~ msgid "-fdata-sections not supported for this target" +#~ msgstr "-fdata-sections understøttes ikke på målarkitekturen" + +#~ msgid "-ffunction-sections disabled; it makes profiling impossible" +#~ msgstr "-ffunction-sections deaktiveret; dette gør profilering umulig" + +#~ msgid "-fprefetch-loop-arrays not supported for this target" +#~ msgstr "-fprefetch-loop-arrays understøttes ikke på målarkitekturen" + +#~ msgid "-fprefetch-loop-arrays not supported for this target (try -march switches)" +#~ msgstr "-fprefetch-loop-arrays understøttes ikke på målarkitekturen (prøv '-march'-tilvalgene)" + +#~ msgid "-fprefetch-loop-arrays is not supported with -Os" +#~ msgstr "-fprefetch-loop-arrays understøttes ikke med -Os" + +#~ msgid "-ffunction-sections may affect debugging on some targets" +#~ msgstr "-ffunction-sections kan have indflydelse på fejlfinding på nogle målarkitekturer" + +#~ msgid "error writing to %s" +#~ msgstr "fejl ved skrivning til %s" + +#~ msgid "error closing %s" +#~ msgstr "fejl ved lukning af %s" + +#~ msgid "could not open dump file `%s'" +#~ msgstr "kunne ikke åbne dumpningsfilen '%s'" + +#~ msgid "ignoring unknown option `%.*s' in `-f%s'" +#~ msgstr "ignorerer ukendt tilvalg '%.*s' i '-f%s'" + +#~ msgid "arrays of functions are not meaningful" +#~ msgstr "en tabel af funktioner giver ikke mening" + +#~ msgid "function return type cannot be function" +#~ msgstr "en funktions returtype kan ikke være en funktion" + +#~ msgid "invalid initializer for bit string" +#~ msgstr "ugyldig startværdi til bitstreng" + +#~ msgid "tree check: expected %s, have %s in %s, at %s:%d" +#~ msgstr "træ-kontrol: forventede %s, har %s i %s, ved %s:%d" + +#~ msgid "tree check: expected class '%c', have '%c' (%s) in %s, at %s:%d" +#~ msgstr "træ-kontrol: forventede klasse '%c', har '%c' (%s) i %s, ved %s:%d" + +#~ msgid "tree check: accessed elt %d of tree_vec with %d elts in %s, at %s:%d" +#~ msgstr "RTL-kontrol: tilgik udtrykstræ %d af tree_vec med %d udtrykstræer i %s, ved %s:%d" + +#~ msgid "%s causes a section type conflict" +#~ msgstr "%s forårsager en sektionstypekonflikt" + +#~ msgid "register name not specified for `%s'" +#~ msgstr "registernavn ikke angivet for '%s'" + +#~ msgid "invalid register name for `%s'" +#~ msgstr "ugyldigt registernavn for '%s'" + +#~ msgid "data type of `%s' isn't suitable for a register" +#~ msgstr "datatypen for '%s' passer ikke med et register" + +#~ msgid "register specified for `%s' isn't suitable for data type" +#~ msgstr "registeret som er angivet for '%s' passer ikke med datatypen" + +#~ msgid "global register variable has initial value" +#~ msgstr "global registervariabel har en startværdi" + +#~ msgid "volatile register variables don't work as you might wish" +#~ msgstr "registervariable erklæret volatile virker ikke som du måske ønsker" + +#~ msgid "register name given for non-register variable `%s'" +#~ msgstr "registernavn givet for ikke-registervariablen '%s'" + +#~ msgid "alignment of `%s' is greater than maximum object file alignment. Using %d" +#~ msgstr "justering af '%s' er større end den maksimale objektfilsjustering - bruger %d" + +#~ msgid "thread-local COMMON data not implemented" +#~ msgstr "tråd-lokal COMMON-data er ikke implementeret" + +#~ msgid "requested alignment for %s is greater than implemented alignment of %d" +#~ msgstr "forespurgt justering for %s er større end den implementerede justering af %d" + +#~ msgid "initializer for integer value is too complicated" +#~ msgstr "startværdien for heltallet er for kompliceret" + +#~ msgid "initializer for floating value is not a floating constant" +#~ msgstr "startværdien for kommatal er ikke en kommatalskonstant" + +#~ msgid "unknown set constructor type" +#~ msgstr "ukendt mængdekonstruktionstype" + +#~ msgid "invalid initial value for member `%s'" +#~ msgstr "ugyldig startværdi for medlemmet '%s'" + +#~ msgid "weak declaration of `%s' must precede definition" +#~ msgstr "svag erklæring af '%s' skal komme før definitionen" + +#~ msgid "weak declaration of `%s' after first use results in unspecified behavior" +#~ msgstr "svag erklæring af '%s' efter første brug resulterer i ikke-defineret opførsel" + +#~ msgid "weak declaration of `%s' must be public" +#~ msgstr "svag erklæring af '%s' skal være public" + +#~ msgid "weak declaration of `%s' not supported" +#~ msgstr "svag erklæring af '%s' ikke understøttet" + +#~ msgid "only weak aliases are supported in this configuration" +#~ msgstr "kun svage aliaser understøttes i denne konfiguration" + +#~ msgid "alias definitions not supported in this configuration; ignored" +#~ msgstr "aliasdefinitioner er ikke understøttet i denne konfiguration; ignoreret" + +#~ msgid "visibility attribute not supported in this configuration; ignored" +#~ msgstr "synlighedsegenskab er ikke understøttet i denne konfiguration; ignoreret" + +#~ msgid "virtual array %s[%lu]: element %lu out of bounds in %s, at %s:%d" +#~ msgstr "virtuel tabel %s[%lu]: element %lu ude over grænserne i %s, ved %s:%d" + +#~ msgid "no sclass for %s stab (0x%x)\n" +#~ msgstr "ingen sclass for %s stab (0x%x)\n" + +#~ msgid "#`%s' not supported by %s#" +#~ msgstr "#'%s' ikke understøttet af %s#" + +#~ msgid "The maximum number of instructions in a single function eligible for inlining" +#~ msgstr "Det maksimale antal instruktioner i en enkelt funktion der må indbygges" + +#~ msgid "The maximum number of instructions when automatically inlining" +#~ msgstr "Det maksimale antal instruktioner ved automatisk indbygning" + +#~ msgid "The maximum number of instructions by repeated inlining before gcc starts to throttle inlining" +#~ msgstr "Det maksimale antal instruktioner ved gentagen indbygning før GCC dæmper indbygningen" + +#~ msgid "The slope of the linear function throttling inlining after the recursive inlining limit has been reached is given by the negative reciprocal value of this parameter" +#~ msgstr "Hældningen af den lineære funktion der dæmper indbygning efter at den rekursive indbygningsgrænse er nået, er givet ved den negative, reciprokke værdi af denne parameter" + +#~ msgid "The number of instructions in a single functions still eligible to inlining after a lot recursive inlining" +#~ msgstr "Antallet af instruktioner i en enkelt funktion der stadig indbygges efter megen rekursiv indbygning" + +#~ msgid "The maximum number of instructions for the RTL inliner" +#~ msgstr "Det maksimale antal instruktioner til RTL-indbyggeren" + +#~ msgid "The maximum number of instructions to consider to fill a delay slot" +#~ msgstr "Det maksimale antal instruktioner det overvejes at udfylde ventepladser med" + +#~ msgid "The maximum number of instructions to consider to find accurate live register information" +#~ msgstr "Det maksimale antal instruktioner der overvejes under søgning efter præcis registerinfo" + +#~ msgid "The maximum length of scheduling's pending operations list" +#~ msgstr "Den maksimale længde af planlæggerens liste over ventende operationer" + +#~ msgid "The maximum amount of memory to be allocated by GCSE" +#~ msgstr "Den maksimale mængde hukommelse som skal allokeres af GCSE" + +#~ msgid "The maximum number of passes to make when doing GCSE" +#~ msgstr "Det maksimale antal faser der skal gennemgås ved udførsel af GCSE" + +#~ msgid "The maximum number of instructions to consider to unroll in a loop" +#~ msgstr "Det maksimale antal instruktioner der overvejes at udrulle i en løkke" + +#~ msgid "Select fraction of the maximal count of repetitions of basic block in program given basic block needs to have to be considered hot" +#~ msgstr "Vælg den andel af det maksimale antal gentagelser af basisblokke i et program en given basisblok skal have for at blive betragtet som \"varm\"" + +#~ msgid "Select fraction of the maximal frequency of executions of basic block in function given basic block needs to have to be considered hot" +#~ msgstr "Vælg den andel af den maksimale frekvens af udførsler af basisblokke i et program en given basisblok skal have for at blive betragtet som \"varm\"" + +#~ msgid "The percentage of function, weighted by execution frequency, that must be covered by trace formation. Used when profile feedback is available" +#~ msgstr "Den procendel af funktioner vægtet efter udførselsfrekvens som skal dækkes af sporingsformering; benyttes når profileringsfeedback er tilgængeligt" + +#~ msgid "The percentage of function, weighted by execution frequency, that must be covered by trace formation. Used when profile feedback is not available" +#~ msgstr "Den procendel af funktioner vægtet efter udførselsfrekvens som skal dækkes af sporingsformering; benyttes når profileringsfeedback ikke er tilgængeligt" + +#~ msgid "Maximal code growth caused by tail duplication (in percents)" +#~ msgstr "Maksimal kodevækst forårsaget af haleduplikering (i procent)" + +#~ msgid "Stop reverse growth if the reverse probability of best edge is less than this threshold (in percents)" +#~ msgstr "Stop omvendt vækst hvis den omvendte sandsynlighed for den bedste kant er mindre end denne tærskel (i procent)" + +#~ msgid "Stop forward growth if the probability of best edge is less than this threshold (in percents). Used when profile feedback is available" +#~ msgstr "Stop fremadrettet vækst hvis sandsynligheden for den bedste kant er mindre end denne tærskel (i procent); benyttes når profileringsfeedback er tilgængeligt" + +#~ msgid "Stop forward growth if the probability of best edge is less than this threshold (in percents). Used when profile feedback is not available" +#~ msgstr "Stop fremadrettet vækst hvis sandsynligheden for den bedste kant er mindre end denne tærskel (i procent); benyttes når profileringsfeedback ikke er tilgængeligt" + +#~ msgid "The maximum number of incoming edges to consider for crossjumping" +#~ msgstr "Det maksimale antal indadgående kanter der overvejes til krydsspring" + +#~ msgid "Minimum heap expansion to trigger garbage collection, as a percentage of the total size of the heap." +#~ msgstr "Minimal heap-udvidelse for at udløse garbage collection, som en procentdel af den totale heap" + +#~ msgid "Minimum heap size before we start collecting garbage, in kilobytes." +#~ msgstr "Minimal heap-størrelse før garbage collection startes, i kilobyte." + +#~ msgid "too many #pragma options align=reset" +#~ msgstr "for mange '#pragma options align=reset'" + +#~ msgid "malformed '#pragma options', ignoring" +#~ msgstr "forkert udformet '#pragma options', ignorerer" + +#~ msgid "junk at end of '#pragma options'" +#~ msgstr "ragelse i slutningen af '#pragma options'" + +#~ msgid "malformed '#pragma options align={mac68k|power|reset}', ignoring" +#~ msgstr "forkert udformet '#pragma options align={mac68k|power|reset}', ignorerer" + +#~ msgid "missing '(' after '#pragma unused', ignoring" +#~ msgstr "manglende '(' efter '#pragma unused', ignorerer" + +#~ msgid "missing ')' after '#pragma unused', ignoring" +#~ msgstr "manglende ')' efter '#pragma unused', ignorerer" + +#~ msgid "junk at end of '#pragma unused'" +#~ msgstr "ragelse i slutningen af '#pragma unused'" + +#~ msgid "-msystem-v and -p are incompatible" +#~ msgstr "-msystem-v og -p er indbyrdes uforenelige" + +#~ msgid "-msystem-v and -mthreads are incompatible" +#~ msgstr "-msystem-v og -mthreads er indbyrdes uforenelige" + +#~ msgid "-f%s ignored for Unicos/Mk (not supported)" +#~ msgstr "-f%s ignoreret for Unicos/Mk (ikke understøttet)" + +#~ msgid "-mieee not supported on Unicos/Mk" +#~ msgstr "-mieee understøttes ikke på Unicos/Mk" + +#~ msgid "-mieee-with-inexact not supported on Unicos/Mk" +#~ msgstr "-mieee-with-inexact understøttes ikke på Unicos/Mk" + +#~ msgid "bad value `%s' for -mtrap-precision switch" +#~ msgstr "ugyldig værdi '%s' til tilvalget -mtrap-precision" + +#~ msgid "bad value `%s' for -mfp-rounding-mode switch" +#~ msgstr "ugyldig værdi '%s' til tilvalget -mfp-rounding-mode" + +#~ msgid "bad value `%s' for -mfp-trap-mode switch" +#~ msgstr "ugyldig værdi '%s' til tilvalget -mfp-trap-mode" + +#~ msgid "bad value `%s' for -mtls-size switch" +#~ msgstr "ugyldig værdi '%s' til tilvalget -mtls-size" + +#~ msgid "bad value `%s' for -mcpu switch" +#~ msgstr "ugyldig værdi '%s' til tilvalget -mcpu" + +#~ msgid "trap mode not supported on Unicos/Mk" +#~ msgstr "fældetilstand understøttes ikke på Unicos/Mk" + +#~ msgid "fp software completion requires -mtrap-precision=i" +#~ msgstr "kommatalssoftwarefuldførelse kræver -mtrap-precision=i" + +#~ msgid "rounding mode not supported for VAX floats" +#~ msgstr "afrundingstilstand er ikke understøttet for VAX-kommatal" + +#~ msgid "trap mode not supported for VAX floats" +#~ msgstr "fældetilstand er ikke understøttet for VAX-kommatal" + +#~ msgid "L%d cache latency unknown for %s" +#~ msgstr "L%d-mellemlagersventetid ukendt for %s" + +#~ msgid "bad value `%s' for -mmemory-latency" +#~ msgstr "ugyldig værdi '%s' for -mmemory-latency" + +#~ msgid "invalid %%H value" +#~ msgstr "ugyldig %%H-værdi" + +#~ msgid "invalid %%J value" +#~ msgstr "ugyldig %%J-værdi" + +#~ msgid "invalid %%r value" +#~ msgstr "ugyldig %%r-værdi" + +#~ msgid "invalid %%R value" +#~ msgstr "ugyldig %%R-værdi" + +#~ msgid "invalid %%N value" +#~ msgstr "ugyldig %%N-værdi" + +#~ msgid "invalid %%P value" +#~ msgstr "ugyldig %%P-værdi" + +#~ msgid "invalid %%h value" +#~ msgstr "ugyldig %%h-værdi" + +#~ msgid "invalid %%L value" +#~ msgstr "ugyldig %%L-værdi" + +#~ msgid "invalid %%m value" +#~ msgstr "ugyldig %%m-værdi" + +#~ msgid "invalid %%M value" +#~ msgstr "ugyldig %%M-værdi" + +#~ msgid "invalid %%U value" +#~ msgstr "ugyldig %%U-værdi" + +#~ msgid "invalid %%s value" +#~ msgstr "ugyldig %%s-værdi" + +#~ msgid "invalid %%C value" +#~ msgstr "ugyldig %%C-værdi" + +#~ msgid "invalid %%E value" +#~ msgstr "ugyldig %%E-værdi" + +#~ msgid "unknown relocation unspec" +#~ msgstr "ukendt relokaliserings-unspec" + +#~ msgid "invalid %%xn code" +#~ msgstr "ugyldig %%xn-kode" + +#~ msgid "bad builtin fcode" +#~ msgstr "ugyldig indbygget fcode" + +#~ msgid "Use hardware fp" +#~ msgstr "Brug hardwarekommatal" + +#~ msgid "Do not use hardware fp" +#~ msgstr "Brug ikke hardwarekommatal" + +#~ msgid "Use fp registers" +#~ msgstr "Brug kommatalsregistre" + +#~ msgid "Do not use fp registers" +#~ msgstr "Brug ikke kommatalsregistre" + +#~ msgid "Do not assume GAS" +#~ msgstr "Antag ikke GAS" + +#~ msgid "Assume GAS" +#~ msgstr "Antag GAS" + +#~ msgid "Request IEEE-conformant math library routines (OSF/1)" +#~ msgstr "Påkræv at matematiksbibliotekrutiner opfylder IEEE-standarden (OSF/1)" + +#~ msgid "Emit IEEE-conformant code, without inexact exceptions" +#~ msgstr "Udsend kode der opfylder IEEE-standarden, uden ineksakte undtagelser" + +#~ msgid "Emit IEEE-conformant code, with inexact exceptions" +#~ msgstr "Udsend kode der opfylder IEEE-standarden, med ineksakte undtagelser" + +#~ msgid "Do not emit complex integer constants to read-only memory" +#~ msgstr "Udsend ikke komplekse heltalskonstanter til skrivebeskyttet hukommelse" + +#~ msgid "Use VAX fp" +#~ msgstr "Benyt VAX-kommatal" + +#~ msgid "Do not use VAX fp" +#~ msgstr "Benyt ikke VAX-kommatal" + +#~ msgid "Emit code for the byte/word ISA extension" +#~ msgstr "Udsend kode for byte/word-ISA-udvidelsen" + +#~ msgid "Emit code for the motion video ISA extension" +#~ msgstr "Udsend kode for video-ISA-udvidelsen" + +#~ msgid "Emit code for the fp move and sqrt ISA extension" +#~ msgstr "Udsend kode for kommatalsflytning og kvadratrod-ISA-udvidelsen" + +#~ msgid "Emit code for the counting ISA extension" +#~ msgstr "Udsend kode for tæller-ISA-udvidelsen" + +#~ msgid "Emit code using explicit relocation directives" +#~ msgstr "Udsend kode der bruger eksplicitte relokaliseringsdirektiver" + +#~ msgid "Emit 16-bit relocations to the small data areas" +#~ msgstr "Udsend 16-bit relokalisering til det lille dataområde" + +#~ msgid "Emit 32-bit relocations to the small data areas" +#~ msgstr "Udsend 32-bit relokalisering til det lille dataområde" + +#~ msgid "Emit rdval instead of rduniq for thread pointer" +#~ msgstr "Udsend rdval i stedet for rduniq for trådhenvisning" + +#~ msgid "Use features of and schedule given CPU" +#~ msgstr "Brug faciliteter fra og planlæg mht. den givne processor" + +#~ msgid "Schedule given CPU" +#~ msgstr "Planlæg til en given processor" + +#~ msgid "Control the generated fp rounding mode" +#~ msgstr "Kontrollér den genererede kommatalsafrundingstilstand" + +#~ msgid "Control the IEEE trap mode" +#~ msgstr "Kontrollér IEEE-fældetilstanden" + +#~ msgid "Control the precision given to fp exceptions" +#~ msgstr "Kontrollér den præcision der gives til kommatalsundtagelser" + +#~ msgid "Tune expected memory latency" +#~ msgstr "Justér den forventede hukommelsesventetid" + +#~ msgid "Specify bit size of immediate TLS offsets" +#~ msgstr "Angiv bitstørrelse for umiddelbar TLS-afsæt" + +#~ msgid "bad value (%s) for -mcpu switch" +#~ msgstr "ugyldig værdi '%s' til tilvalget -mcpu" + +#~ msgid "argument of `%s' attribute is not a string constant" +#~ msgstr "parameteren til egenskaben '%s er ikke en strengkonstant" + +#~ msgid "argument of `%s' attribute is not \"ilink1\" or \"ilink2\"" +#~ msgstr "parameteren til egenskaben '%s er ikke \"ilink1\" eller \"ilink2\"" + +#~ msgid "invalid operand to %%R code" +#~ msgstr "ugyldig operand til %%R-koden" + +#~ msgid "invalid operand to %%H/%%L code" +#~ msgstr "ugyldig operand til %%H/%%L-koden" + +#~ msgid "invalid operand to %%U code" +#~ msgstr "ugyldig operand til %%U-koden" + +#~ msgid "invalid operand to %%V code" +#~ msgstr "ugyldig operand til %%V-koden" + +#~ msgid "invalid operand output code" +#~ msgstr "ugyldig operand-uddatakode" + +#~ msgid "switch -mcpu=%s conflicts with -march= switch" +#~ msgstr "tilvalget -mcpu=%s er i konflikt med tilvalget -march=" + +#~ msgid "bad value (%s) for %s switch" +#~ msgstr "ugyldig værdi (%s) til tilvalget %s" + +#~ msgid "target CPU does not support APCS-32" +#~ msgstr "målprocessoren understøtter ikke APCS-32" + +#~ msgid "target CPU does not support APCS-26" +#~ msgstr "målprocessoren understøtter ikke APCS-26" + +#~ msgid "target CPU does not support interworking" +#~ msgstr "målprocessoren understøtter ikke interarbejde" + +#~ msgid "target CPU does not support THUMB instructions" +#~ msgstr "målprocessoren understøtter ikke THUMB-instruktioner" + +#~ msgid "enabling backtrace support is only meaningful when compiling for the Thumb" +#~ msgstr "aktivering af tilbagesporingsunderstøttelse giver kun mening ved oversættelse for en Thumb" + +#~ msgid "enabling callee interworking support is only meaningful when compiling for the Thumb" +#~ msgstr "aktivering af interarbejdeunderstøttelse for kaldte objekter giver kun mening ved oversættelse for en Thumb" + +#~ msgid "enabling caller interworking support is only meaningful when compiling for the Thumb" +#~ msgstr "aktivering af interarbejdeunderstøttelse for kaldere giver kun mening ved oversættelse for en Thumb" + +#~ msgid "interworking forces APCS-32 to be used" +#~ msgstr "interarbejde tvinger APCS-32 til at blive brugt" + +#~ msgid "-mapcs-stack-check incompatible with -mno-apcs-frame" +#~ msgstr "-mapcs-stack-check og -mno-apcs-frame er indbyrdes uforenelige" + +#~ msgid "-fpic and -mapcs-reent are incompatible" +#~ msgstr "-fpic og -mapcs-reent er indbyrdes uforenelige" + +#~ msgid "APCS reentrant code not supported. Ignored" +#~ msgstr "APCS-genindtrædelig kode er ikke understøttet - ignoreret" + +#~ msgid "-g with -mno-apcs-frame may not give sensible debugging" +#~ msgstr "-g med -mno-apcs-frame giver måske ikke fornuftig fejlanalysering" + +#~ msgid "passing floating point arguments in fp regs not yet supported" +#~ msgstr "overbringelse af kommatalsparametre i kommatalsregistre er ikke understøttet endnu" + +#~ msgid "invalid floating point emulation option: -mfpe-%s" +#~ msgstr "ugyldigt tilvalg til kommatalsemulering: -mfpe-%s" + +#~ msgid "structure size boundary can only be set to 8 or 32" +#~ msgstr "strukturstørrelsesgrænse kan kun sættes til 8 eller 32" + +#~ msgid "-mpic-register= is useless without -fpic" +#~ msgstr "-mpic-register= er ubrugelig uden -fpic" + +#~ msgid "unable to use '%s' for PIC register" +#~ msgstr "kan ikke bruge '%s' til PIC-register" + +#~ msgid "`%s' attribute only applies to functions" +#~ msgstr "egenskaben '%s' kan kun anvendes sammen med funktioner" + +#~ msgid "unable to compute real location of stacked parameter" +#~ msgstr "kan ikke beregne virkelig placering af stakkede parametre" + +#~ msgid "no low registers available for popping high registers" +#~ msgstr "ingen lave registre er tilgængelige til at modtage værdier fra høje registre" + +#~ msgid "interrupt Service Routines cannot be coded in Thumb mode" +#~ msgstr "afbrydelsesservicerutiner kan ikke kodes i Thumb-tilstand" + +#~ msgid "initialized variable `%s' is marked dllimport" +#~ msgstr "variablen '%s' med startværdi er markeret dllimport" + +#~ msgid "static variable `%s' is marked dllimport" +#~ msgstr "statisk variabel '%s' er markeret dllimport" + +#~ msgid "Generate APCS conformant stack frames" +#~ msgstr "Generér APCS-overholdende stakrammer" + +#~ msgid "Store function names in object code" +#~ msgstr "Gem funktionsnavne i objektkode" + +#~ msgid "Use the 32-bit version of the APCS" +#~ msgstr "Benyt 32 bit-udgaven af APCS" + +#~ msgid "Use the 26-bit version of the APCS" +#~ msgstr "Benyt 26 bit-udgaven af APCS" + +#~ msgid "Pass FP arguments in FP registers" +#~ msgstr "Videregiv kommatalsparametre i kommatalsregistre" + +#~ msgid "Generate re-entrant, PIC code" +#~ msgstr "Generér genindtrædelig PIC-kode" + +#~ msgid "The MMU will trap on unaligned accesses" +#~ msgstr "MMU'en vil aktiveres ved ikke-justerede tilgange" + +#~ msgid "Use library calls to perform FP operations" +#~ msgstr "Benyt bibliotekskald til at udføre kommatalsoperationer" + +#~ msgid "Use hardware floating point instructions" +#~ msgstr "Benyt hardware-kommatalsinstruktioner" + +#~ msgid "Assume target CPU is configured as big endian" +#~ msgstr "Antag at målprocessoren er konfigureret som storendet" + +#~ msgid "Assume target CPU is configured as little endian" +#~ msgstr "Antag at målprocessoren er konfigureret som lilleendet" + +#~ msgid "Assume big endian bytes, little endian words" +#~ msgstr "Antag storendede byte og lilleendede word" + +#~ msgid "Support calls between Thumb and ARM instruction sets" +#~ msgstr "Understøt kald mellem Thumb- og ARM-instruktionssættene" + +#~ msgid "Generate a call to abort if a noreturn function returns" +#~ msgstr "Generér et kald til abort hvis en noreturn-funktion returnerer" + +#~ msgid "Do not move instructions into a function's prologue" +#~ msgstr "Flyt ikke instruktioner til en funktions begyndelse" + +#~ msgid "Do not load the PIC register in function prologues" +#~ msgstr "Indlæs ikke PIC-registeret i funktionsbegyndelser" + +#~ msgid "Generate call insns as indirect calls, if necessary" +#~ msgstr "Generér kaldeinstruktioner som indirekte kald, om nødvendigt" + +#~ msgid "Compile for the Thumb not the ARM" +#~ msgstr "Oversæt til Thymb, ikke til ARM" + +#~ msgid "Thumb: Generate (non-leaf) stack frames even if not needed" +#~ msgstr "Thumb: Generér (ikke-yderste) stakrammer selv hvis det ikke er nødvendigt" + +#~ msgid "Thumb: Generate (leaf) stack frames even if not needed" +#~ msgstr "Thumb: Generér (yderste) stakrammer selv hvis det ikke er nødvendigt" + +#~ msgid "Thumb: Assume non-static functions may be called from ARM code" +#~ msgstr "Thumb: Antag at ikke-statiske funktioner kan kaldes fra ARM-kode" + +#~ msgid "Thumb: Assume function pointers may go to non-Thumb aware code" +#~ msgstr "Thumb: Antag at funktionshenvisninger kan gå til kode der ikke er opmærksom på Thumb" + +#~ msgid "Specify the name of the target CPU" +#~ msgstr "Angiv navnet på målprocessoren" + +#~ msgid "Specify the name of the target architecture" +#~ msgstr "Angiv navnet på målarkitekturen" + +#~ msgid "Specify the version of the floating point emulator" +#~ msgstr "Angiv versionen af kommatalsemulatoren" + +#~ msgid "Specify the minimum bit alignment of structures" +#~ msgstr "Angiv den mindste bitjustering af strukturer" + +#~ msgid "Specify the register to be used for PIC addressing" +#~ msgstr "Angiv det register der skal bruges til PIC-adressering" + +#~ msgid "Ignore dllimport attribute for functions" +#~ msgstr "Ignorér dllimport-egenskaben for funktioner" + +#~ msgid "large frame pointer change (%d) with -mtiny-stack" +#~ msgstr "stor rammehenvisningsændring (%d) med -mtiny-stack" + +#~ msgid "bad address, not (reg+disp):" +#~ msgstr "ugyldig adresse, ikke (reg+disp):" + +#~ msgid "internal compiler error. Bad address:" +#~ msgstr "intern oversætterfejl - ugyldig adresse:" + +#~ msgid "internal compiler error. Unknown mode:" +#~ msgstr "intern oversætterfejl - ugyldig tilstand:" + +#~ msgid "invalid insn:" +#~ msgstr "ugyldig instruktion:" + +#~ msgid "incorrect insn:" +#~ msgstr "ukorrekt instruktion:" + +#~ msgid "unknown move insn:" +#~ msgstr "ukendt flytteinstruktion:" + +#~ msgid "bad shift insn:" +#~ msgstr "ugyldig skifteinstruktion:" + +#~ msgid "internal compiler error. Incorrect shift:" +#~ msgstr "intern oversætterfejl - ukorrekt skift:" + +#~ msgid "only initialized variables can be placed into program memory area" +#~ msgstr "kun variabler med startværdi kan placeres i programhukommelsesområdet" + +#~ msgid "only uninitialized variables can be placed in the .noinit section" +#~ msgstr "kun variabler uden startværdi kan placeres i .noinit-sektionen" + +#~ msgid "MCU `%s' supported for assembler only" +#~ msgstr "MCU '%s' understøttes kun for maskinkode" + +#~ msgid "Assume int to be 8 bit integer" +#~ msgstr "Antag at int er 8 bit-heltal" + +#~ msgid "Change the stack pointer without disabling interrupts" +#~ msgstr "Ændr stakhenvisningen uden at deaktivere afbrydelser" + +#~ msgid "Use subroutines for function prologue/epilogue" +#~ msgstr "Benyt subrutiner for funktionsindledning/-afslutninger" + +#~ msgid "Change only the low 8 bits of the stack pointer" +#~ msgstr "Ændr kun de laveste 8 bit af stakhenvisningen" + +#~ msgid "Do not generate tablejump insns" +#~ msgstr "Generér ikke tabelspringsinstruktioner" + +#~ msgid "Use rjmp/rcall (limited range) on >8K devices" +#~ msgstr "Benyt rjmp/rcall (begrænset omfang) på >8K-enheder" + +#~ msgid "Output instruction sizes to the asm file" +#~ msgstr "Anbring instruktionsstørrelser i asm-filen" + +#~ msgid "Specify the initial stack address" +#~ msgstr "Angiv den første stakadresse" + +#~ msgid "Specify the MCU name" +#~ msgstr "Angiv MCU-navnet" + +#~ msgid "trampolines not supported" +#~ msgstr "trampoliner understøttes ikke" + +#~ msgid "missing '(' after '#pragma %s' - ignored" +#~ msgstr "manglende '(' efter '#pragma %s' - ignoreret" + +#~ msgid "missing function name in '#pragma %s' - ignored" +#~ msgstr "manglende funktionsnavn i '#pragma %s' - ignoreret" + +#~ msgid "malformed '#pragma %s' - ignored" +#~ msgstr "forkert udformet '#pragma %s' - ignoreret" + +#~ msgid "missing section name in '#pragma %s' - ignored" +#~ msgstr "manglende sektionsnavn i '#pragma %s' - ignoreret" + +#~ msgid "missing ')' for '#pragma %s' - ignored" +#~ msgstr "manglende '(' for '#pragma %s' - ignoreret" + +#~ msgid "junk at end of '#pragma %s'" +#~ msgstr "ragelse i slutningen af '#pragma %s'" + +#~ msgid "unknown CPU version %d, using 40.\n" +#~ msgstr "ukendt processorversion %d, bruger 40.\n" + +#~ msgid "ISR %s requires %d words of local vars, max is 32767" +#~ msgstr "ISR %s kræver %d ord af lokale variable, maks. er 32767" + +#~ msgid "using CONST_DOUBLE for address" +#~ msgstr "bruger CONST_DOUBLE til adresse" + +#~ msgid "c4x_address_cost: Invalid addressing mode" +#~ msgstr "c4x_address_cost: Ugyldig adresseringstilstand" + +#~ msgid "c4x_print_operand: %%L inconsistency" +#~ msgstr "c4x_print_operand: %%L-inkonsistens" + +#~ msgid "c4x_print_operand: %%N inconsistency" +#~ msgstr "c4x_print_operand: %%N-inkonsistens" + +#~ msgid "c4x_print_operand: %%O inconsistency" +#~ msgstr "c4x_print_operand: %%O-inkonsistens" + +#~ msgid "c4x_print_operand: Bad operand case" +#~ msgstr "c4x_print_operand: Ugyldig operand-case" + +#~ msgid "c4x_print_operand_address: Bad post_modify" +#~ msgstr "c4x_print_operand_address: Ugyldig post_modify" + +#~ msgid "c4x_print_operand_address: Bad pre_modify" +#~ msgstr "c4x_print_operand_address: Ugyldig pre_modify" + +#~ msgid "c4x_print_operand_address: Bad operand case" +#~ msgstr "c4x_print_operand_address: Ugyldig operand-case" + +#~ msgid "c4x_rptb_insert: Cannot find start label" +#~ msgstr "c4x_rptb_insert: Kan ikke finde startetiket" + +#~ msgid "mode not QImode" +#~ msgstr "tilstand ikke QImode" + +#~ msgid "invalid indirect memory address" +#~ msgstr "ugyldig indirekte hukommelsesadresse" + +#~ msgid "invalid indirect (S) memory address" +#~ msgstr "ugyldig indirekte (S) hukommelsesadresse" + +#~ msgid "c4x_valid_operands: Internal error" +#~ msgstr "c4x_valid_operands: Intern fejl" + +#~ msgid "c4x_operand_subword: invalid mode" +#~ msgstr "c4x_operand_subword: ugyldig tilstand" + +#~ msgid "c4x_operand_subword: invalid operand" +#~ msgstr "c4x_operand_subword: ugyldig operand" + +#~ msgid "c4x_operand_subword: invalid autoincrement" +#~ msgstr "c4x_operand_subword: ugyldig selvforøgelse" + +#~ msgid "c4x_operand_subword: invalid address" +#~ msgstr "c4x_operand_subword: ugyldig adresse" + +#~ msgid "c4x_operand_subword: address not offsettable" +#~ msgstr "c4x_operand_subword: adresse kan ikke tilføjes et offset" + +#~ msgid "c4x_rptb_rpts_p: Repeat block top label moved\n" +#~ msgstr "c4x_rptb_rpts_p: Topetiket til gentagelsesblok flyttet\n" + +#~ msgid "Small memory model" +#~ msgstr "Lille hukommelsesmodel" + +#~ msgid "Big memory model" +#~ msgstr "Stor hukommelsesmodel" + +#~ msgid "Use MPYI instruction for C3x" +#~ msgstr "Benyt MPYI-instruktionen til C3x" + +#~ msgid "Do not use MPYI instruction for C3x" +#~ msgstr "Benyt ikke MPYI-instruktionen til C3x" + +#~ msgid "Use fast but approximate float to integer conversion" +#~ msgstr "Benyt hurtig, men approksimativ konvertering fra komma- til heltal" + +#~ msgid "Use slow but accurate float to integer conversion" +#~ msgstr "Benyt langsom, men nøjagtig konvertering fra komma- til heltal" + +#~ msgid "Enable use of RTPS instruction" +#~ msgstr "Aktivér brug af RTPS-instruktionen" + +#~ msgid "Disable use of RTPS instruction" +#~ msgstr "Deaktivér brug af RTPS-instruktionen" + +#~ msgid "Enable use of RTPB instruction" +#~ msgstr "Aktivér brug af RTPB-instruktionen" + +#~ msgid "Disable use of RTPB instruction" +#~ msgstr "Deaktivér brug af RTPB-instruktionen" + +#~ msgid "Generate code for C30 CPU" +#~ msgstr "Generér kode til en C30-processor" + +#~ msgid "Generate code for C31 CPU" +#~ msgstr "Generér kode til en C31-processor" + +#~ msgid "Generate code for C32 CPU" +#~ msgstr "Generér kode til en C32-processor" + +#~ msgid "Generate code for C33 CPU" +#~ msgstr "Generér kode til en C33-processor" + +#~ msgid "Generate code for C40 CPU" +#~ msgstr "Generér kode til en C40-processor" + +#~ msgid "Generate code for C44 CPU" +#~ msgstr "Generér kode til en C44-processor" + +#~ msgid "Emit code compatible with TI tools" +#~ msgstr "Udsend kode der er kompatibel med TI-værktøjer" + +#~ msgid "Emit code to use GAS extensions" +#~ msgstr "Udsend kode der bruger GAS-udvidelser" + +# RETMIG: hvad står ISR for? +#~ msgid "Save DP across ISR in small memory model" +#~ msgstr "Gem DP over ISR i lille hukommelsesmodel" + +#~ msgid "Don't save DP across ISR in small memory model" +#~ msgstr "Gem ikke DP over ISR i lille hukommelsesmodel" + +#~ msgid "Pass arguments on the stack" +#~ msgstr "Overbring parametre på stakken" + +#~ msgid "Pass arguments in registers" +#~ msgstr "Overbring parametre i registre" + +#~ msgid "Enable new features under development" +#~ msgstr "Aktivér nye faciliteter under udvikling" + +#~ msgid "Disable new features under development" +#~ msgstr "Deaktivér nye faciliteter under udvikling" + +#~ msgid "Use the BK register as a general purpose register" +#~ msgstr "Benyt BK-registeret som et alment register" + +#~ msgid "Do not allocate BK register" +#~ msgstr "Allokér ikke BK-registeret" + +#~ msgid "Enable use of DB instruction" +#~ msgstr "Aktivér brug af DB-instruktioner" + +#~ msgid "Disable use of DB instruction" +#~ msgstr "Deaktivér brug af DB-instruktioner" + +#~ msgid "Enable debugging" +#~ msgstr "Aktivér fejlanalyseringsinfo" + +#~ msgid "Disable debugging" +#~ msgstr "Deaktivér fejlanalyseringsinfo" + +# RETMIG: hvad betyder hoisting? (det har noget med jage indlæsning af dem ud af registre) +#~ msgid "Force constants into registers to improve hoisting" +#~ msgstr "Tving konstanter ind i registre for at forbedre hoisting" + +#~ msgid "Don't force constants into registers" +#~ msgstr "Tving ikke konstanter ind i registre" + +#~ msgid "Force RTL generation to emit valid 3 operand insns" +#~ msgstr "Tving RTL-generering til at udsende gyldig 3-operandinstruktioner" + +#~ msgid "Allow RTL generation to emit invalid 3 operand insns" +#~ msgstr "Tillad RTL-generering at udsende ugyldig 3-operandinstruktioner" + +#~ msgid "Allow unsigned iteration counts for RPTB/DB" +#~ msgstr "Tillad iterationstællere uden fortegn for RPTB/DB" + +#~ msgid "Disallow unsigned iteration counts for RPTB/DB" +#~ msgstr "Tillad ikke iterationstællere uden fortegn for RPTB/DB" + +#~ msgid "Preserve all 40 bits of FP reg across call" +#~ msgstr "Bevar alle 40 bit af kommatalsregisteret på tværs af kald" + +#~ msgid "Only preserve 32 bits of FP reg across call" +#~ msgstr "Bevar kun 32 bit af kommatalsregisteret på tværs af kald" + +#~ msgid "Enable parallel instructions" +#~ msgstr "Aktivér parallelle instruktioner" + +#~ msgid "Disable parallel instructions" +#~ msgstr "Deaktivér parallelle instruktioner" + +#~ msgid "Enable MPY||ADD and MPY||SUB instructions" +#~ msgstr "Aktivér instruktionerne MPY||ADD og MPY||SUB" + +#~ msgid "Disable MPY||ADD and MPY||SUB instructions" +#~ msgstr "Deaktivér instruktionerne MPY||ADD og MPY||SUB" + +#~ msgid "Assume that pointers may be aliased" +#~ msgstr "Antag at henvisninger kan være aliaser" + +#~ msgid "Assume that pointers not aliased" +#~ msgstr "Antag at henvisninger ikke kan være aliaser" + +#~ msgid "Specify maximum number of iterations for RPTS" +#~ msgstr "Angiv maksimalt antal iterationer for RPTS" + +#~ msgid "Select CPU to generate code for" +#~ msgstr "Vælg den processor der skal genereres kode til" + +#~ msgid "unexpected index-type in cris_print_index" +#~ msgstr "uventet indekstype i cris_print_index" + +#~ msgid "unexpected base-type in cris_print_base" +#~ msgstr "uventet grundtype in cris_print_base" + +#~ msgid "stackframe too big: %d bytes" +#~ msgstr "stakramme for stor: %d byte" + +#~ msgid "allocated but unused delay list in epilogue" +#~ msgstr "allokeret, men ubenyttet venteliste i afslutning" + +#~ msgid "unexpected function type needing stack adjustment for __builtin_eh_return" +#~ msgstr "uventet funktionstype behøver stak justering for __builtin_eh_return" + +#~ msgid "invalid operand for 'b' modifier" +#~ msgstr "ugyldig operand til 'b'-ændring" + +#~ msgid "invalid operand for 'v' modifier" +#~ msgstr "ugyldig operand til 'v'-ændring" + +#~ msgid "invalid operand for 'P' modifier" +#~ msgstr "ugyldig operand til 'P'-ændring" + +#~ msgid "invalid operand for 'p' modifier" +#~ msgstr "ugyldig operand til 'p'-ændring" + +#~ msgid "invalid operand for 'z' modifier" +#~ msgstr "ugyldig operand til 'z'-ændring" + +#~ msgid "invalid operand for 'H' modifier" +#~ msgstr "ugyldig operand til 'H'-ændring" + +#~ msgid "bad register" +#~ msgstr "ugyldigt register" + +#~ msgid "invalid operand for 'e' modifier" +#~ msgstr "ugyldig operand til 'e'-ændring" + +#~ msgid "invalid operand for 'm' modifier" +#~ msgstr "ugyldig operand til 'm'-ændring" + +#~ msgid "invalid operand for 'A' modifier" +#~ msgstr "ugyldig operand til 'A'-ændring" + +#~ msgid "invalid operand for 'D' modifier" +#~ msgstr "ugyldig operand til 'D'-ændring" + +#~ msgid "invalid operand for 'T' modifier" +#~ msgstr "ugyldig operand til 'T'-ændring" + +#~ msgid "invalid operand modifier letter" +#~ msgstr "ugyldigt operandændringsbogstav" + +#~ msgid "internal error: bad register: %d" +#~ msgstr "intern fejl: ugyldigt register: %d" + +#~ msgid "unexpected multiplicative operand" +#~ msgstr "uventet multiplikativ operand" + +#~ msgid "unexpected operand" +#~ msgstr "uventet operand" + +#~ msgid "unrecognized address" +#~ msgstr "ukendt adresse" + +#~ msgid "internal error: sideeffect-insn affecting main effect" +#~ msgstr "intern fejl: bivirkningsinstruktion påvirker hovedvirkning" + +#~ msgid "internal error: cris_side_effect_mode_ok with bad operands" +#~ msgstr "intern fejl: cris_side_effect_mode_ok med ugyldige operander" + +#~ msgid "unrecognized supposed constant" +#~ msgstr "ukendt formodet konstant" + +#~ msgid "unrecognized supposed constant in cris_global_pic_symbol" +#~ msgstr "ukendt formodet konstant i cris_global_pic_symbol" + +#~ msgid "-max-stackframe=%d is not usable, not between 0 and %d" +#~ msgstr "-max-stackframe=%d er ikke brugbar mellem 0 og %d" + +#~ msgid "unknown CRIS version specification in -march= or -mcpu= : %s" +#~ msgstr "ukendt CRIS-versionsspecifikation i -march= eller -mcpu=: %s" + +#~ msgid "unknown CRIS cpu version specification in -mtune= : %s" +#~ msgstr "ukendt CRIS-versionsspecifikation i -mtune=: %s" + +#~ msgid "-fPIC and -fpic are not supported in this configuration" +#~ msgstr "-fPIC og -fpic understøttes ikke af denne konfiguration" + +#~ msgid "that particular -g option is invalid with -maout and -melinux" +#~ msgstr "det bestemte '-g'-tilvalg er ugyldigt med -maout og -melinux" + +#~ msgid "unexpected side-effects in address" +#~ msgstr "uventede bivirkninger i adresse" + +#~ msgid "unexpected PIC symbol" +#~ msgstr "uventet PIC-symbol" + +#~ msgid "PIC register isn't set up" +#~ msgstr "PIC-register er ikke sat op" + +#~ msgid "unexpected address expression" +#~ msgstr "uventet adresseudtryk" + +#~ msgid "emitting PIC operand, but PIC register isn't set up" +#~ msgstr "udsender PIC-operand, men PIC-register er ikke sat op" + +#~ msgid "unexpected NOTE as addr_const:" +#~ msgstr "uventet NOTE som addr_const:" + +#~ msgid "Compile for the MMU-less Etrax 100-based elinux system" +#~ msgstr "Oversæt for det Etrax 100-baserede elinux-system uden MMU" + +#~ msgid "For elinux, request a specified stack-size for this program" +#~ msgstr "For elinux; forespørg en angivet stakstørrelse for dette program" + +#~ msgid "Compile for ETRAX 4 (CRIS v3)" +#~ msgstr "Oversæt for ETRAX 4 (CRIS v3)" + +#~ msgid "Compile for ETRAX 100 (CRIS v8)" +#~ msgstr "Oversæt for ETRAX 100 (CRIS v8)" + +#~ msgid "Emit verbose debug information in assembly code" +#~ msgstr "Udsend fejlanalyseringsinfo i maskinkode" + +#~ msgid "Do not use condition codes from normal instructions" +#~ msgstr "Benyt ikke betingelseskoder fra normale instruktioner" + +#~ msgid "Do not emit addressing modes with side-effect assignment" +#~ msgstr "Udsend ikke adresseringstilstande med bivirkningstildeling" + +#~ msgid "Do not tune stack alignment" +#~ msgstr "Finjustér ikke stakjustering" + +#~ msgid "Do not tune writable data alignment" +#~ msgstr "Finjustér ikke justering af skrivbare data" + +#~ msgid "Do not tune code and read-only data alignment" +#~ msgstr "Finjustér ikke justering af kode og skrivebeskyttet data" + +#~ msgid "Align code and data to 32 bits" +#~ msgstr "Justér kode og data til 32 bit" + +#~ msgid "Don't align items in code or data" +#~ msgstr "Justér ikke elementer i kode eller data" + +#~ msgid "Do not emit function prologue or epilogue" +#~ msgstr "Udsend ikke funktionsindledning eller -afslutning" + +#~ msgid "Use the most feature-enabling options allowed by other options" +#~ msgstr "Benyt de tilvalg der giver de fleste faciliteter tilladt af andre tilvalg" + +#~ msgid "Override -mbest-lib-options" +#~ msgstr "Overskriv -mbest-lib-options" + +#~ msgid "Generate code for the specified chip or CPU version" +#~ msgstr "Generér kode til en given chip- eller processorversion" + +#~ msgid "Tune alignment for the specified chip or CPU version" +#~ msgstr "Finjustér justering til en given chip- eller processorversion" + +#~ msgid "Warn when a stackframe is larger than the specified size" +#~ msgstr "Advar når en stakramme er større end den angivne størrelse" + +#~ msgid "no FUNCTION_PROFILER for CRIS" +#~ msgstr "ingen FUNCTION_PROFILER for CRIS" + +#~ msgid "Together with -fpic and -fPIC, do not use GOTPLT references" +#~ msgstr "Benyt ikke GOTPLT-referencer sammen med -fpic og -fPIC" + +#~ msgid "bad modes_tieable_p for register %s, mode1 %s, mode2 %s" +#~ msgstr "ugyldig modes_tieable_p for register %s, mode1 %s, mode2 %s" + +#~ msgid "bad insn to d30v_print_operand_address:" +#~ msgstr "ugyldig instruktion til d30v_print_operand_address:" + +#~ msgid "bad insn to d30v_print_operand_memory_reference:" +#~ msgstr "ugyldig instruktion til d30v_print_operand_memory_reference:" + +#~ msgid "bad insn to d30v_print_operand, 'f' modifier:" +#~ msgstr "ugyldig instruktion til d30v_print_operand, 'f'-ændring:" + +#~ msgid "bad insn to d30v_print_operand, 'A' modifier:" +#~ msgstr "ugyldig instruktion til d30v_print_operand, 'A'-ændring:" + +#~ msgid "bad insn to d30v_print_operand, 'M' modifier:" +#~ msgstr "ugyldig instruktion til d30v_print_operand, 'M'-ændring:" + +#~ msgid "bad insn to print_operand, 'F' or 'T' modifier:" +#~ msgstr "ugyldig instruktion til d30v_print_operand, 'F'- eller 'T'-ændring:" + +#~ msgid "bad insn to print_operand, 'B' modifier:" +#~ msgstr "ugyldig instruktion til d30v_print_operand, 'B'-ændring:" + +#~ msgid "bad insn to print_operand, 'E' modifier:" +#~ msgstr "ugyldig instruktion til d30v_print_operand, 'E'-ændring:" + +#~ msgid "bad insn to print_operand, 'R' modifier:" +#~ msgstr "ugyldig instruktion til d30v_print_operand, 'R'-ændring:" + +#~ msgid "bad insn to print_operand, 's' modifier:" +#~ msgstr "ugyldig instruktion til d30v_print_operand, 's'-ændring:" + +#~ msgid "bad insn in d30v_print_operand, 0 case" +#~ msgstr "ugyldig instruktion til d30v_print_operand, 0 case" + +#~ msgid "d30v_emit_comparison" +#~ msgstr "d30v_emit_comparison" + +#~ msgid "bad call to d30v_move_2words" +#~ msgstr "ugyldigt kald af d30v_move_2words" + +#~ msgid "Enable use of conditional move instructions" +#~ msgstr "Aktivér brug af betingede flytteinstruktioner" + +#~ msgid "Disable use of conditional move instructions" +#~ msgstr "Deaktivér brug af betingede flytteinstruktioner" + +#~ msgid "Debug argument support in compiler" +#~ msgstr "Fejlanalyser parameterunderstøttelse i oversætteren" + +#~ msgid "Debug stack support in compiler" +#~ msgstr "Fejlanalyser stakunderstøttelse i oversætteren" + +#~ msgid "Debug memory address support in compiler" +#~ msgstr "Fejlanalyser hukommelsesadresseunderstøttelse i oversætteren" + +#~ msgid "Make adjacent short instructions parallel if possible" +#~ msgstr "Gør nærliggende korte instruktioner parallelle om muligt" + +#~ msgid "Do not make adjacent short instructions parallel" +#~ msgstr "Gør ikke nærliggende korte instruktioner parallelle" + +#~ msgid "Link programs/data to be in external memory by default" +#~ msgstr "Sammenkæd program/data til at være i ekstern hukommelse som standard" + +#~ msgid "Link programs/data to be in onchip memory by default" +#~ msgstr "Sammenkæd program/data til at være i hukommelsen på chippen som standard" + +#~ msgid "Change the branch costs within the compiler" +#~ msgstr "Skift forgreningsomkostningen i oversætteren" + +#~ msgid "Change the threshold for conversion to conditional execution" +#~ msgstr "Skift tærsklen for konvertering til betinget udførelse" + +#~ msgid "stack size > 32k" +#~ msgstr "stakstørrelse > 32k" + +#~ msgid "invalid addressing mode" +#~ msgstr "ugyldig adresseringstilstand" + +#~ msgid "bad register extension code" +#~ msgstr "ugyldig registerudvidelseskode" + +#~ msgid "invalid offset in ybase addressing" +#~ msgstr "ugyldigt afsæt i ybase-adressering" + +#~ msgid "invalid register in ybase addressing" +#~ msgstr "ugyldigt register i ybase-adressering" + +#~ msgid "invalid shift operator in emit_1600_core_shift" +#~ msgstr "ugyldig skifteoperator i emit_1600_core_shift" + +#~ msgid "invalid mode for gen_tst_reg" +#~ msgstr "ugyldig tilstand for gen_tst_reg" + +#~ msgid "invalid mode for integer comparison in gen_compare_reg" +#~ msgstr "ugyldig tilstand for heltalssammenligning i gen_compare_reg" + +#~ msgid "Pass parameters in registers (default)" +#~ msgstr "Overbring parametre i registre (standard)" + +#~ msgid "Don't pass parameters in registers" +#~ msgstr "Overbring ikke parametre i registre" + +#~ msgid "Generate code for near calls" +#~ msgstr "Generér kode til nære kald" + +#~ msgid "Don't generate code for near calls" +#~ msgstr "Generér ikke kode til nære kald" + +#~ msgid "Generate code for near jumps" +#~ msgstr "Generér kode til nære spring" + +#~ msgid "Don't generate code for near jumps" +#~ msgstr "Generér ikke kode til nære spring" + +#~ msgid "Generate code for a bit-manipulation unit" +#~ msgstr "Generér kode til en bit-manipuleringsenhed" + +#~ msgid "Don't generate code for a bit-manipulation unit" +#~ msgstr "Generér ikke kode til en bit-manipuleringsenhed" + +#~ msgid "Generate code for memory map1" +#~ msgstr "Generér kode til memory map1" + +#~ msgid "Generate code for memory map2" +#~ msgstr "Generér kode til memory map2" + +#~ msgid "Generate code for memory map3" +#~ msgstr "Generér kode til memory map3" + +#~ msgid "Generate code for memory map4" +#~ msgstr "Generér kode til memory map4" + +#~ msgid "Ouput extra code for initialized data" +#~ msgstr "Udsend ekstra kode til data med startværdier" + +#~ msgid "Don't let reg. allocator use ybase registers" +#~ msgstr "Lad ikke registerallokeringen benytte ybase-registre" + +#~ msgid "Output extra debug info in Luxworks environment" +#~ msgstr "Udsend ekstra fejlanalyseringsinfo i Luxworks-miljøet" + +#~ msgid "Save temp. files in Luxworks environment" +#~ msgstr "Gem midlertidige filer i Luxworks-miljøet" + +#~ msgid "Specify alternate name for text section" +#~ msgstr "Angiv alternativt navn til tekstsektionen" + +#~ msgid "Specify alternate name for data section" +#~ msgstr "Angiv alternativt navn til datasektionen" + +#~ msgid "Specify alternate name for bss section" +#~ msgstr "Angiv alternativt navn til bss-sektionen" + +#~ msgid "Specify alternate name for constant section" +#~ msgstr "Angiv alternativt navn til konstantsektionen" + +#~ msgid "Specify alternate name for dsp16xx chip" +#~ msgstr "Angiv alternativt navn til dsp16xx-chippen" + +#~ msgid "profiling not implemented yet" +#~ msgstr "profilering understøttes ikke endnu" + +#~ msgid "trampolines not yet implemented" +#~ msgstr "trampoliner understøttes ikke endnu" + +#~ msgid "fr30_print_operand_address: unhandled address" +#~ msgstr "fr30_print_operand_address: ikke-håndteret adresse" + +#~ msgid "fr30_print_operand: unrecognized %%p code" +#~ msgstr "fr30_print_operand: ukendt '%%p'-kode" + +#~ msgid "fr30_print_operand: unrecognized %%b code" +#~ msgstr "fr30_print_operand: ukendt '%%b'-kode" + +#~ msgid "fr30_print_operand: unrecognized %%B code" +#~ msgstr "fr30_print_operand: ukendt '%%B'-kode" + +#~ msgid "fr30_print_operand: invalid operand to %%A code" +#~ msgstr "fr30_print_operand: ugyldig operand til '%%A'-kode" + +#~ msgid "fr30_print_operand: invalid %%x code" +#~ msgstr "fr30_print_operand: ugyldig '%%x'-kode" + +#~ msgid "fr30_print_operand: invalid %%F code" +#~ msgstr "fr30_print_operand: ugyldig '%%F'-kode" + +#~ msgid "fr30_print_operand: unknown code" +#~ msgstr "fr30_print_operand: ukendt kode" + +#~ msgid "fr30_print_operand: unhandled MEM" +#~ msgstr "fr30_print_operand: ikke-håndteret MEM" + +#~ msgid "Assume small address space" +#~ msgstr "Antag lille adresserum" + +#~ msgid "Unknown cpu: -mcpu=%s" +#~ msgstr "Ukendt processor: -mcpu=%s" + +#~ msgid "-fpic and -gdwarf are incompatible (-fpic and -g/-gdwarf-2 are fine)" +#~ msgstr "-fpic og -gdwarf er indbyrdes uforenelige (-fpic og -g/-gdwarf-2 er i orden)" + +#~ msgid "Bad insn to frv_print_operand_address:" +#~ msgstr "Ugyldig instruktion til frv_print_operand_address:" + +#~ msgid "Bad register to frv_print_operand_memory_reference_reg:" +#~ msgstr "Ugyldigt register til frv_print_operand_memory_reference_reg:" + +#~ msgid "Bad insn to frv_print_operand_memory_reference:" +#~ msgstr "Ugyldig instruktion til frv_print_operand_memory_reference:" + +#~ msgid "Bad insn in frv_print_operand, bad const_double" +#~ msgstr "Ugyldig instruktion i frv_print_operand, ugyldig const_double" + +#~ msgid "Bad insn to frv_print_operand, 'C' modifier:" +#~ msgstr "Ugyldig instruktionen til frv_print_operand, 'C'-modifikation:" + +#~ msgid "Bad insn to frv_print_operand, 'c' modifier:" +#~ msgstr "Ugyldig instruktion til frv_print_operand, 'c'-modifikation:" + +#~ msgid "Bad insn to frv_print_operand, 'e' modifier:" +#~ msgstr "Ugyldig instruktion til frv_print_operand, 'e'-modifikation:" + +#~ msgid "Bad insn to frv_print_operand, 'F' modifier:" +#~ msgstr "Ugyldig instruktion til frv_print_operand, 'F'-modifikation:" + +#~ msgid "Bad insn to frv_print_operand, 'f' modifier:" +#~ msgstr "Ugyldig instruktion til frv_print_operand, 'f'-modifikation:" + +#~ msgid "Bad insn to frv_print_operand, 'L' modifier:" +#~ msgstr "Ugyldig instruktion til frv_print_operand, 'L'-modifikation:" + +#~ msgid "Bad insn to frv_print_operand, 'M/N' modifier:" +#~ msgstr "Ugyldig instruktion til frv_print_operand, 'M/N'-modifikation:" + +#~ msgid "Bad insn to frv_print_operand, 'O' modifier:" +#~ msgstr "Ugyldig instruktion til frv_print_operand, 'O'-modifikation:" + +#~ msgid "Bad insn to frv_print_operand, P modifier:" +#~ msgstr "Ugyldig instruktion til frv_print_operand, P-modifikation:" + +#~ msgid "Bad insn in frv_print_operand, z case" +#~ msgstr "Ugyldig instruktion i frv_print_operand, tilfældet z" + +#~ msgid "Bad insn in frv_print_operand, 0 case" +#~ msgstr "Ugyldig instruktion i frv_print_operand, tilfældet 0" + +#~ msgid "frv_print_operand: unknown code" +#~ msgstr "fr_print_operand: ukendt kode" + +#~ msgid "Bad output_move_single operand" +#~ msgstr "Ugyldig output_move_single-operand" + +#~ msgid "Bad output_move_double operand" +#~ msgstr "Ugyldig output_move_double-operand" + +#~ msgid "Bad output_condmove_single operand" +#~ msgstr "Ugyldig output_condmove_single-operand" + +#~ msgid "frv_registers_update" +#~ msgstr "frv_registers_update" + +#~ msgid "frv_registers_used_p" +#~ msgstr "frv_registers_used_p" + +#~ msgid "frv_registers_set_p" +#~ msgstr "frv_registers_set_p" + +#~ msgid "accumulator is not a constant integer" +#~ msgstr "akkumulator er ikke et konstant heltal" + +#~ msgid "accumulator number is out of bounds" +#~ msgstr "akkumulatortal er uden for det gyldig interval" + +#~ msgid "inappropriate accumulator for `%s'" +#~ msgstr "forkert akkumulator for '%s'" + +#~ msgid "`%s' expects a constant argument" +#~ msgstr "'%s' forventer en konstant parameter" + +#~ msgid "constant argument out of range for `%s'" +#~ msgstr "konstant parameter uden for det gyldige interval for '%s'" + +#~ msgid "media functions are not available unless -mmedia is used" +#~ msgstr "mediafunktioner er ikke tilgængelige medmindre -mmedia benyttes" + +#~ msgid "this media function is only available on the fr500" +#~ msgstr "denne mediafunktion er kun tilgængelig på fr500" + +#~ msgid "this media function is only available on the fr400" +#~ msgstr "denne mediafunktion er kun tilgængelig på fr400" + +#~ msgid " (frv)" +#~ msgstr " (frv)" + +#~ msgid "-ms2600 is used without -ms" +#~ msgstr "-ms2600 benyttet uden -ms" + +#~ msgid "-mn is used without -mh or -ms" +#~ msgstr "-mn benyttet uden -mh eller -ms" + +#~ msgid "Generate H8S code" +#~ msgstr "Generér H8S-kode" + +#~ msgid "Do not generate H8S code" +#~ msgstr "Generér ikke H8S-kode" + +#~ msgid "Generate H8S/2600 code" +#~ msgstr "Generér H8S/2600-kode" + +#~ msgid "Do not generate H8S/2600 code" +#~ msgstr "Generér ikke H8S/2600-kode" + +#~ msgid "Make integers 32 bits wide" +#~ msgstr "Gør heltal 32 bit brede" + +#~ msgid "Use registers for argument passing" +#~ msgstr "Benyt registre til parameteroverbringning" + +#~ msgid "Do not use registers for argument passing" +#~ msgstr "Benyt ikke registre til parameteroverbringning" + +#~ msgid "Consider access to byte sized memory slow" +#~ msgstr "Betragt tilgang til bytestørrelseshukommelse som langsomt" + +#~ msgid "Enable linker relaxing" +#~ msgstr "Aktivér tolerant sammenkædning" + +#~ msgid "Generate H8/300H code" +#~ msgstr "Generér H8/300H-kode" + +#~ msgid "Enable the normal mode" +#~ msgstr "Aktivér den normale tilstand" + +#~ msgid "Do not generate H8/300H code" +#~ msgstr "Generér ikke H8/300H-kode" + +#~ msgid "Use H8/300 alignment rules" +#~ msgstr "Benyt H8/300-justeringsregler" + +#~ msgid "junk at end of #pragma map" +#~ msgstr "ragelse i slutningen af #pragma map" + +#~ msgid "malformed #pragma map, ignored" +#~ msgstr "forkert udformet '#pragma map' - ignoreret" + +#~ msgid "real name is too long - alias ignored" +#~ msgstr "rigtigt navn for langt - alias ignoreret" + +#~ msgid "alias name is too long - alias ignored" +#~ msgstr "aliasnavn for langt - alias ignoreret" + +#~ msgid "internal error--no jump follows compare:" +#~ msgstr "intern fejl - intet spring efterfølger sammenligning:" + +#~ msgid "Generate char instructions" +#~ msgstr "Generér char-instruktioner" + +#~ msgid "Do not generate char instructions" +#~ msgstr "Generér ikke char-instruktioner" + +#~ msgid "code model %s not supported in PIC mode" +#~ msgstr "kodemodellen %s er ikke understøttet i PIC-tilstand" + +#~ msgid "bad value (%s) for -mcmodel= switch" +#~ msgstr "ugyldig værdi (%s) til tilvalget -mcmodel=" + +#~ msgid "bad value (%s) for -masm= switch" +#~ msgstr "ugyldig værdi (%s) til tilvalget -masm=" + +#~ msgid "code model `%s' not supported in the %s bit mode" +#~ msgstr "kodemodellen %s er ikke understøttet i %s bit-tilstand" + +#~ msgid "code model `large' not supported yet" +#~ msgstr "kodemodellen 'large' er ikke understøttet endnu" + +#~ msgid "%i-bit mode not compiled in" +#~ msgstr "%i bit-tilstand er ikke oversat med ind" + +#~ msgid "bad value (%s) for -march= switch" +#~ msgstr "ugyldig værdi (%s) til tilvalget -march=" + +#~ msgid "bad value (%s) for -mcpu= switch" +#~ msgstr "ugyldig værdi (%s) til tilvalget -mcpu=" + +#~ msgid "-mregparm=%d is not between 0 and %d" +#~ msgstr "-mregparm=%d er ikke mellem 0 og %d" + +#~ msgid "-malign-loops is obsolete, use -falign-loops" +#~ msgstr "-malign-loops er forældet, benyt -falign-loops" + +#~ msgid "-malign-loops=%d is not between 0 and %d" +#~ msgstr "-malign-loops=%d er ikke mellem 0 og %d" + +#~ msgid "-malign-jumps is obsolete, use -falign-jumps" +#~ msgstr "-malign-jumps er forældet, benyt -falign-jumps" + +#~ msgid "-malign-functions is obsolete, use -falign-functions" +#~ msgstr "-malign-functions er forældet, benyt -falign-functions" + +#~ msgid "-mpreferred-stack-boundary=%d is not between %d and 12" +#~ msgstr "-mpreferred-stack-boundary=%d er ikke mellem %d og 12" + +#~ msgid "-mbranch-cost=%d is not between 0 and 5" +#~ msgstr "-mbranch-cost=%d er ikke mellem 0 og 5" + +#~ msgid "bad value (%s) for -mtls-dialect= switch" +#~ msgstr "ugyldig værdi (%s) til tilvalget -mtls-dialect" + +#~ msgid "-malign-double makes no sense in the 64bit mode" +#~ msgstr "-malign-double giver ikke mening i 64 bit-tilstand" + +#~ msgid "-mrtd calling convention not supported in the 64bit mode" +#~ msgstr "kaldekonventionen -mrtd er ikke understøttet i 64 bit-tilstand" + +#~ msgid "SSE instruction set disabled, using 387 arithmetics" +#~ msgstr "SSE-instruktionssæt deaktiveret, bruger 387-beregninger" + +#~ msgid "387 instruction set disabled, using SSE arithmetics" +#~ msgstr "387-instruktionssæt deaktiveret, bruger SSE-beregninger" + +#~ msgid "bad value (%s) for -mfpmath= switch" +#~ msgstr "ugyldig værdi (%s) til tilvalget -mfpmath=" + +#~ msgid "`%s' attribute requires an integer constant argument" +#~ msgstr "egenskaben '%s' kræver en heltalskonstant som parameter" + +#~ msgid "argument to `%s' attribute larger than %d" +#~ msgstr "parameter til egenskaben '%s' er større end %d" + +#~ msgid "invalid UNSPEC as operand" +#~ msgstr "ugyldig UNSPEC som operand" + +#~ msgid "extended registers have no high halves" +#~ msgstr "udvidede registre har ikke høje halvdele" + +#~ msgid "unsupported operand size for extended register" +#~ msgstr "ikke-understøttet operandstørrelse for udvidede registre" + +#~ msgid "operand is neither a constant nor a condition code, invalid operand code 'c'" +#~ msgstr "operand er hverken en konstant eller en betingelseskode, ugyldig operandkode 'c'" + +#~ msgid "invalid operand code `%c'" +#~ msgstr "ugyldig operandkode '%c'" + +#~ msgid "invalid constraints for operand" +#~ msgstr "ugyldige begrænsninger for operand" + +#~ msgid "unknown insn mode" +#~ msgstr "ukendt instruktionstilstand" + +#~ msgid "selector must be an immediate" +#~ msgstr "vælger skal være en umiddelbar værdi" + +#~ msgid "mask must be an immediate" +#~ msgstr "maske skal være en umiddelbar værdi" + +#~ msgid "shift must be an immediate" +#~ msgstr "skifteværdi skal være en umiddelbar værdi" + +#~ msgid "`%s' attribute only applies to variables" +#~ msgstr "egenskaben '%s' kan kun anvendes på variabler" + +#~ msgid "`%s' declared as both exported to and imported from a DLL" +#~ msgstr "'%s' erklæret som både eksporteret til og importeret fra en DLL" + +#~ msgid "Use the Cygwin interface" +#~ msgstr "Benyt Cygwin-grænsefladen" + +#~ msgid "Use the Mingw32 interface" +#~ msgstr "Benyt Mingw32-grænsefladen" + +#~ msgid "Create GUI application" +#~ msgstr "Opret grafisk program" + +#~ msgid "Don't set Windows defines" +#~ msgstr "Angiv ikke Windows-definitioner" + +#~ msgid "Set Windows defines" +#~ msgstr "Angiv Windows-definitioner" + +#~ msgid "Create console application" +#~ msgstr "Opret konsolprogram" + +#~ msgid "Generate code for a DLL" +#~ msgstr "Generér kode til en DLL" + +#~ msgid "Ignore dllimport for functions" +#~ msgstr "Ignorér dllimport til funktioner" + +#~ msgid "Use Mingw-specific thread support" +#~ msgstr "Benyt Mingw-specifik trådunderstøttelse" + +#~ msgid "-f%s ignored for target (all code is position independent)" +#~ msgstr "-f%s ignoreret for målarkitekturen (all kode er positionsuafhængigt)" + +#~ msgid "-mbnu210 is ignored (option is obsolete)" +#~ msgstr "-mbnu210 ignoreres (tilvalget er forældet)" + +#~ msgid "Alternate calling convention" +#~ msgstr "Alternativ kaldekonvention" + +#~ msgid "Use normal calling convention" +#~ msgstr "Brug normal kaldekonvention" + +#~ msgid "Align some doubles on dword boundary" +#~ msgstr "Justér nogle double-variabler til dword-grænserne" + +#~ msgid "Align doubles on word boundary" +#~ msgstr "Justér double-variabler til word-grænserne" + +#~ msgid "Uninitialized locals in .bss" +#~ msgstr "Lokale variabler uden startværdi i .bss" + +#~ msgid "Uninitialized locals in .data" +#~ msgstr "Lokale variabler uden startværdi i .data" + +#~ msgid "Use IEEE math for fp comparisons" +#~ msgstr "Brug IEEE-matematik til kommatalssammenligninger" + +#~ msgid "Do not use IEEE math for fp comparisons" +#~ msgstr "Brug ikke IEEE-matematik til kommatalssammenligninger" + +#~ msgid "Return values of functions in FPU registers" +#~ msgstr "Returnér værdier fra funktioner i fpu-registre" + +#~ msgid "Do not return values of functions in FPU registers" +#~ msgstr "Returnér ikke værdier fra funktioner i fpu-registre" + +#~ msgid "Do not generate sin, cos, sqrt for FPU" +#~ msgstr "Generér ikke sin, cos, sqrt til fpu" + +#~ msgid "Generate sin, cos, sqrt for FPU" +#~ msgstr "Generér sin, cos og sqrt til fpu" + +#~ msgid "Omit the frame pointer in leaf functions" +#~ msgstr "Udelad rammehenvisningen i de yderste funktioner" + +#~ msgid "Enable stack probing" +#~ msgstr "Aktivér stakprøvning" + +#~ msgid "Align destination of the string operations" +#~ msgstr "Justér strengoperationernes destination" + +#~ msgid "Do not align destination of the string operations" +#~ msgstr "Justér ikke strengoperationernes destination" + +#~ msgid "Inline all known string operations" +#~ msgstr "Indbyg alle kendte strengoperationer" + +#~ msgid "Do not inline all known string operations" +#~ msgstr "Indbyg ikke alle kendte strengoperationer" + +#~ msgid "Use push instructions to save outgoing arguments" +#~ msgstr "Brug push-instruktioner til at gemme udgående parametre" + +#~ msgid "Do not use push instructions to save outgoing arguments" +#~ msgstr "Brug ikke push-instruktioner til at gemme udgående parametre" + +# shadowing betyder at en funktion har samme navn og dermed skjuler en anden +#~ msgid "Support MMX built-in functions" +#~ msgstr "Understøt indbyggede MMX-funktioner" + +#~ msgid "Do not support MMX built-in functions" +#~ msgstr "Understøt ikke indbyggede MMX-funktioner" + +# shadowing betyder at en funktion har samme navn og dermed skjuler en anden +#~ msgid "Support 3DNow! built-in functions" +#~ msgstr "Understøt indbyggede 3DNow!-funktioner" + +#~ msgid "Do not support 3DNow! built-in functions" +#~ msgstr "Understøt ikke indbyggede 3DNow!-funktioner" + +#~ msgid "Support MMX and SSE built-in functions and code generation" +#~ msgstr "Understøt indbyggede MMX- og SSE-funktioner og kodegenerering" + +#~ msgid "Do not support MMX and SSE built-in functions and code generation" +#~ msgstr "Understøt ikke indbyggede MMX- og SSE-funktioner og kodegenerering" + +#~ msgid "Support MMX, SSE and SSE2 built-in functions and code generation" +#~ msgstr "Understøt indbyggede MMX-, SSE- og SSE2-funktioner og kodegenerering" + +#~ msgid "Do not support MMX, SSE and SSE2 built-in functions and code generation" +#~ msgstr "Understøt ikke indbyggede MMX-, SSE- og SSE2-funktioner og kodegenerering" + +#~ msgid "sizeof(long double) is 16" +#~ msgstr "sizeof(long double) er 16" + +#~ msgid "sizeof(long double) is 12" +#~ msgstr "sizeof(long double) er 12" + +#~ msgid "Generate 64bit x86-64 code" +#~ msgstr "Generér 64 bit x86-64-kode" + +#~ msgid "Generate 32bit i386 code" +#~ msgstr "Generér 64 bit i386-kode" + +#~ msgid "Use red-zone in the x86-64 code" +#~ msgstr "Benyt rødzone i x86-64-koden" + +#~ msgid "Do not use red-zone in the x86-64 code" +#~ msgstr "Benyt ikke rødzone i x86-64-koden" + +#~ msgid "Schedule code for given CPU" +#~ msgstr "Planlæg koden til en given processor" + +#~ msgid "Generate floating point mathematics using given instruction set" +#~ msgstr "Generér kommatalsmatematik vha. givent instruktionssæt" + +#~ msgid "Generate code for given CPU" +#~ msgstr "Generér kode til en given processor" + +#~ msgid "Number of registers used to pass integer arguments" +#~ msgstr "Antallet af registre der skal bruges til at overbringe heltalsparametre" + +#~ msgid "Loop code aligned to this power of 2" +#~ msgstr "Løkkekode skal justeres til denne potens af 2" + +#~ msgid "Jump targets are aligned to this power of 2" +#~ msgstr "Steder der skal springes til, justeres til denne potens af 2" + +#~ msgid "Function starts are aligned to this power of 2" +#~ msgstr "Funktionsbegyndelser justeres til denne potens af 2" + +#~ msgid "Attempt to keep stack aligned to this power of 2" +#~ msgstr "Forsøg at holde stakken justeret til denne potens af 2" + +#~ msgid "Branches are this expensive (1-5, arbitrary units)" +#~ msgstr "Forgreninger koster dette (1-5, vilkårlige enheder)" + +#~ msgid "Use given x86-64 code model" +#~ msgstr "Benyt den givne x86-64-kodemodel" + +#~ msgid "Use given assembler dialect" +#~ msgstr "Benyt den givne maskinkodedialekt" + +#~ msgid "Use given thread-local storage dialect" +#~ msgstr "Benyt den givne tråd-lokale lagringsdialekt" + +#~ msgid "Generate ELF output" +#~ msgstr "Generér ELF-uddata" + +#~ msgid "Use Mingw32 interface" +#~ msgstr "Benyt Mingw32-grænseflade" + +#~ msgid "Use Cygwin interface" +#~ msgstr "Benyt Cygwin-grænseflade" + +#~ msgid "Use bare Windows interface" +#~ msgstr "Benyt bar Windows-grænseflade" + +#~ msgid "environment variable DJGPP not defined" +#~ msgstr "miljøvariablen DJGPP er ikke defineret" + +#~ msgid "environment variable DJGPP points to missing file '%s'" +#~ msgstr "miljøvariablen DJGPP peger på den manglende fil '%s'" + +#~ msgid "environment variable DJGPP points to corrupt file '%s'" +#~ msgstr "miljøvariablen DJGPP peger på den ødelagte fil '%s'" + +#~ msgid "sorry, not implemented: #pragma align NAME=SIZE" +#~ msgstr "desværre, ikke implementeret: #pragma align NAVN=STØRRELSE" + +#~ msgid "malformed #pragma align - ignored" +#~ msgstr "forkert udformet '#pragma align' - ignoreret" + +#~ msgid "sorry, not implemented: #pragma noalign NAME" +#~ msgstr "desværre, ikke implementeret: #pragma noalign NAVN" + +#~ msgid "conflicting architectures defined - using C series" +#~ msgstr "modstridende arkitekturer defineret - bruger C-serien" + +#~ msgid "conflicting architectures defined - using K series" +#~ msgstr "modstridende arkitekturer defineret - bruger K-serien" + +#~ msgid "iC2.0 and iC3.0 are incompatible - using iC3.0" +#~ msgstr "iC2.0 og iC3.0 er inkompatible - bruger iC3.0" + +#~ msgid "stack limit expression is not supported" +#~ msgstr "stakgrænseudtryk understøttes ikke" + +#~ msgid "Generate SA code" +#~ msgstr "Generér SA-kode" + +#~ msgid "Generate SB code" +#~ msgstr "Generér SB-kode" + +#~ msgid "Generate KA code" +#~ msgstr "Generér KA-kode" + +#~ msgid "Generate KB code" +#~ msgstr "Generér KB-kode" + +#~ msgid "Generate JA code" +#~ msgstr "Generér JA-kode" + +#~ msgid "Generate JD code" +#~ msgstr "Generér JD-kode" + +#~ msgid "Generate JF code" +#~ msgstr "Generér JF-kode" + +#~ msgid "generate RP code" +#~ msgstr "Generér RP-kode" + +#~ msgid "Generate MC code" +#~ msgstr "Generér MC-kode" + +#~ msgid "Generate CA code" +#~ msgstr "Generér CA-kode" + +#~ msgid "Generate CF code" +#~ msgstr "Generér CF-kode" + +#~ msgid "Use software floating point" +#~ msgstr "Benyt softwarekommatal" + +#~ msgid "Use alternate leaf function entries" +#~ msgstr "Benyt alternative elementer til yderste funktioner" + +#~ msgid "Do not use alternate leaf function entries" +#~ msgstr "Benyt ikke alternative elementer til yderste funktioner" + +#~ msgid "Perform tail call optimization" +#~ msgstr "Udfør halekaldsoptimering" + +#~ msgid "Do not perform tail call optimization" +#~ msgstr "Udfør ikke halekaldsoptimering" + +#~ msgid "Use complex addressing modes" +#~ msgstr "Benyt komplekse adresseringstilstande" + +#~ msgid "Do not use complex addressing modes" +#~ msgstr "Benyt ikke komplekse adresseringstilstande" + +#~ msgid "Align code to 8 byte boundary" +#~ msgstr "Justér kode til 8 byte-grænser" + +#~ msgid "Do not align code to 8 byte boundary" +#~ msgstr "Justér ikke kode til 8 byte-grænser" + +#~ msgid "Enable compatibility with iC960 v2.0" +#~ msgstr "Aktivér kompatibilitet med iC960 v2.0" + +#~ msgid "Enable compatibility with iC960 v3.0" +#~ msgstr "Aktivér kompatibilitet med iC960 v3.0" + +#~ msgid "Enable compatibility with ic960 assembler" +#~ msgstr "Aktivér kompatibilitet med ic960-maskinkodeoversætteren" + +#~ msgid "Do not permit unaligned accesses" +#~ msgstr "Tillad ikke ikke-justeret adgang" + +#~ msgid "Permit unaligned accesses" +#~ msgstr "Tillad ikke-justeret adgang" + +#~ msgid "Layout types like Intel's v1.3 gcc" +#~ msgstr "Sammensæt typer som Intels v1.3 gcc" + +#~ msgid "Do not layout types like Intel's v1.3 gcc" +#~ msgstr "Sammensæt ikke typer som Intels v1.3 gcc" + +#~ msgid "Use 64 bit long doubles" +#~ msgstr "Benyt 64 bit long double" + +#~ msgid "Enable linker relaxation" +#~ msgstr "Aktivér tolerant sammenkæder" + +#~ msgid "Do not enable linker relaxation" +#~ msgstr "Aktivér ikke tolerant sammenkæder" + +#~ msgid "malformed #pragma builtin" +#~ msgstr "forkert udformet '#pragma builtin'" + +#~ msgid "ia64_print_operand: unknown code" +#~ msgstr "ia64_print_operand: ukendt kode" + +#~ msgid "value of -mfixed-range must have form REG1-REG2" +#~ msgstr "værdien af -mfixed-range skal være på formen REG1-REG2" + +#~ msgid "%s-%s is an empty range" +#~ msgstr "%s-%s er et tomt interval" + +#~ msgid "cannot optimize floating point division for both latency and throughput" +#~ msgstr "kan ikke optimere kommatalsdivision for både ventetid og båndbredde" + +#~ msgid "cannot optimize integer division for both latency and throughput" +#~ msgstr "kan ikke optimere heltalsdivision for både ventetid og båndbredde" + +#~ msgid "bad value (%s) for -mtls-size= switch" +#~ msgstr "ugyldig værdi (%s) for tilvalget -mtls-size=" + +#~ msgid "Generate big endian code" +#~ msgstr "Generér storendet kode" + +#~ msgid "Generate little endian code" +#~ msgstr "Generér lilleendet kode" + +#~ msgid "Generate code for GNU as" +#~ msgstr "Generér kode til GNU as" + +#~ msgid "Generate code for Intel as" +#~ msgstr "Generér kode til Intel as" + +#~ msgid "Generate code for GNU ld" +#~ msgstr "Generér kode til GNU ld" + +#~ msgid "Generate code for Intel ld" +#~ msgstr "Generér kode til Intel ld" + +#~ msgid "Generate code without GP reg" +#~ msgstr "Generér kode uden GP-registeret" + +#~ msgid "Emit stop bits before and after volatile extended asms" +#~ msgstr "Udsend stopbit før og efter volatile udvidede asm-sætninger" + +#~ msgid "Don't emit stop bits before and after volatile extended asms" +#~ msgstr "Udsend ikke stopbit før og efter volatile udvidede asm-sætninger" + +#~ msgid "Emit code for Itanium (TM) processor B step" +#~ msgstr "Udsend kode for Itanium (TM) processor B-skridt" + +#~ msgid "Use in/loc/out register names" +#~ msgstr "Benyt in/loc/out-registernavne" + +#~ msgid "Disable use of sdata/scommon/sbss" +#~ msgstr "Deaktivér brug af sdata/scommon/sbss" + +#~ msgid "Enable use of sdata/scommon/sbss" +#~ msgstr "Aktivér brug af sdata/scommon/sbss" + +#~ msgid "gp is constant (but save/restore gp on indirect calls)" +#~ msgstr "gp er konstant (men gem/gendan gp ved indirekte kald)" + +#~ msgid "Generate self-relocatable code" +#~ msgstr "Generér selvflyttende kode" + +#~ msgid "Generate inline floating point division, optimize for latency" +#~ msgstr "Generér indlejrede kommatalsdivisioner, optimér for ventetid" + +#~ msgid "Generate inline floating point division, optimize for throughput" +#~ msgstr "Generér indlejrede kommatalsdivisioner, optimér for båndbredde" + +#~ msgid "Generate inline integer division, optimize for latency" +#~ msgstr "Generér indlejrede heltalsdivisioner, optimér for ventetid" + +#~ msgid "Generate inline integer division, optimize for throughput" +#~ msgstr "Generér indlejrede heltalsdivisioner, optimér for båndbredde" + +#~ msgid "Enable Dwarf 2 line debug info via GNU as" +#~ msgstr "Aktivér Dwarf 2-linjefejlanalyseringsinfo via GNU as" + +#~ msgid "Disable Dwarf 2 line debug info via GNU as" +#~ msgstr "Deaktivér Dwarf 2-linjefejlanalyseringsinfo via GNU as" + +#~ msgid "Specify range of registers to make fixed" +#~ msgstr "Angiv interval af registre der skal gøres faste" + +#~ msgid "bad operand" +#~ msgstr "ugyldig operand" + +#~ msgid "bad value (%s) for -mmodel switch" +#~ msgstr "ugyldig værdi (%s) til tilvalget -mmodel" + +#~ msgid "bad value (%s) for -msdata switch" +#~ msgstr "ugyldig værdi (%s) til tilvalget -msdata" + +#~ msgid "invalid argument of `%s' attribute" +#~ msgstr "ugyldig parameter til egenskaben '%s'" + +#~ msgid "const objects cannot go in .sdata/.sbss" +#~ msgstr "konstante objekter kan ikke anbringes i .sdata/.sbss" + +#~ msgid "invalid operand to %%s code" +#~ msgstr "ugyldig operand til %%s-koden" + +#~ msgid "invalid operand to %%p code" +#~ msgstr "ugyldig operand til %%p-koden" + +#~ msgid "bad insn for 'A'" +#~ msgstr "ugyldig instruktion for 'A'" + +#~ msgid "invalid operand to %%T/%%B code" +#~ msgstr "ugyldig operand til %%T/%%B-koden" + +#~ msgid "invalid operand to %%N code" +#~ msgstr "ugyldig operand til %%N-koden" + +#~ msgid "pre-increment address is not a register" +#~ msgstr "præfiks forøgelsesadresse er ikke et register" + +#~ msgid "pre-decrement address is not a register" +#~ msgstr "præfiks formindskelsesadresse er ikke et register" + +#~ msgid "post-increment address is not a register" +#~ msgstr "postfiks forøgelsesadresse er ikke et register" + +#~ msgid "bad address" +#~ msgstr "ugyldig adresse" + +#~ msgid "lo_sum not of register" +#~ msgstr "lo_sum ikke af register" + +#~ msgid "Display compile time statistics" +#~ msgstr "Vis oversættelsesstatistikker" + +#~ msgid "Align all loops to 32 byte boundary" +#~ msgstr "Justér alle løkker til 32 byte-grænserne" + +#~ msgid "Only issue one instruction per cycle" +#~ msgstr "Udfør kun én instruktion pr. cyklus" + +#~ msgid "Prefer branches over conditional execution" +#~ msgstr "Foretræk forgrening frem for betinget udførelse" + +#~ msgid "Code size: small, medium or large" +#~ msgstr "Kodestørrelse: small, medium eller large" + +#~ msgid "Small data area: none, sdata, use" +#~ msgstr "Område til små data: none, sdata, use" + +#~ msgid "-f%s ignored for 68HC11/68HC12 (not supported)" +#~ msgstr "-f%s ignoreret for 68HC11/68HC12 (ikke understøttet)" + +#~ msgid "`trap' and `far' attributes are not compatible, ignoring `far'" +#~ msgstr "egenskaberne 'trap' og 'far' kan ikke bruges på samme tid, ignorerer 'far'" + +#~ msgid "`trap' attribute is already used" +#~ msgstr "egenskaben 'trap' er allerede benyttet" + +#~ msgid "move insn not handled" +#~ msgstr "flytteinstruktion ikke håndteret" + +#~ msgid "invalid register in the move instruction" +#~ msgstr "ugyldigt register i flytteinstruktionen" + +#~ msgid "invalid operand in the instruction" +#~ msgstr "ugyldig operand i instruktionen" + +#~ msgid "invalid register in the instruction" +#~ msgstr "ugyldigt register i instruktionen" + +#~ msgid "operand 1 must be a hard register" +#~ msgstr "operand 1 skal være et hårdt register" + +#~ msgid "invalid rotate insn" +#~ msgstr "ugyldig roteringsinstruktion" + +#~ msgid "registers IX, IY and Z used in the same INSN" +#~ msgstr "registrene IX, IY og Z benyttet i samme INSN" + +#~ msgid "cannot do z-register replacement" +#~ msgstr "kan ikke udføre Z-registererstatning" + +#~ msgid "invalid Z register replacement for insn" +#~ msgstr "ugyldig Z-registererstatning for instruktion" + +#~ msgid "Compile with 16-bit integer mode" +#~ msgstr "Oversæt med 16 bit-heltalstilstand" + +#~ msgid "Compile with 32-bit integer mode" +#~ msgstr "Oversæt med 32 bit-heltalstilstand" + +#~ msgid "Auto pre/post decrement increment allowed" +#~ msgstr "Selvformindskelse tilladt" + +#~ msgid "Auto pre/post decrement increment not allowed" +#~ msgstr "Selvforøgelse ikke tilladt" + +#~ msgid "Min/max instructions allowed" +#~ msgstr "Min/max-instruktioner tilladt" + +#~ msgid "Min/max instructions not allowed" +#~ msgstr "Min/max-instruktioner ikke tilladt" + +#~ msgid "Use call and rtc for function calls and returns" +#~ msgstr "Benyt call og rtc til funktionskald og returneringer" + +#~ msgid "Use jsr and rts for function calls and returns" +#~ msgstr "Benyt jsr og rts til funktionskald og returneringer" + +#~ msgid "Do not use direct addressing mode for soft registers" +#~ msgstr "Benyt ikke direkte adresseringstilstand til bløde registre" + +#~ msgid "Use direct addressing mode for soft registers" +#~ msgstr "Benyt direkte adresseringstilstand til bløde registre" + +#~ msgid "Compile for a 68HC11" +#~ msgstr "Oversæt til en 68HC11" + +#~ msgid "Compile for a 68HC12" +#~ msgstr "Oversæt til en 68HC12" + +#~ msgid "Compile for a 68HCS12" +#~ msgstr "Oversæt til en 68HCS12" + +#~ msgid "Specify the register allocation order" +#~ msgstr "Angiv registerallokeringsordnen" + +#~ msgid "Indicate the number of soft registers available" +#~ msgstr "Angiv antallet af bløde registre der er til rådighed" + +#~ msgid "-malign-loops=%d is not between 1 and %d" +#~ msgstr "-malign-loops=%d er ikke mellem 1 og %d" + +#~ msgid "-malign-jumps=%d is not between 1 and %d" +#~ msgstr "-malign-jumps=%d er ikke mellem 1 og %d" + +#~ msgid "-malign-functions=%d is not between 1 and %d" +#~ msgstr "-malign-functions=%d er ikke mellem 1 og %d" + +#~ msgid "-fPIC is not currently supported on the 68000 or 68010\n" +#~ msgstr "-fPIC understøttes ikke på nuværende tidspunkt på 68000 og 68010\n" + +#~ msgid "Generate code for a 68020" +#~ msgstr "Generér kode til en 68020" + +#~ msgid "Generate code for a 68000" +#~ msgstr "Generér kode til en 68000" + +#~ msgid "Use the bit-field instructions" +#~ msgstr "Benyt bitfeltinstruktionerne" + +#~ msgid "Do not use the bit-field instructions" +#~ msgstr "Benyt ikke bitfeltinstruktionerne" + +#~ msgid "Use different calling convention using 'rtd'" +#~ msgstr "Benyt anden kaldekonvention vha. 'rtd'" + +#~ msgid "Consider type `int' to be 16 bits wide" +#~ msgstr "Lad typen 'int' være 16 bit bred" + +#~ msgid "Consider type `int' to be 32 bits wide" +#~ msgstr "Lad typen 'int' være 32 bit bred" + +#~ msgid "Generate code for a Sun FPA" +#~ msgstr "Generér kode til en Sun FPA" + +#~ msgid "Do not generate code for a Sun FPA" +#~ msgstr "Generér ikke kode til en Sun FPA" + +#~ msgid "Generate code for a Sun Sky board" +#~ msgstr "Generér kode til et Sun Sky-kort" + +#~ msgid "Do not use Sky linkage convention" +#~ msgstr "Benyt ikke Sky-kædningskonventionen" + +#~ msgid "Generate code for a 68881" +#~ msgstr "Generér kode til en 68881" + +#~ msgid "Generate code with library calls for floating point" +#~ msgstr "Generér kode med bibliotekskald for kommatalsoperationer" + +#~ msgid "Generate code for a 68040, without any new instructions" +#~ msgstr "Generér kode til en 68040 uden nogen nye instruktioner" + +#~ msgid "Generate code for a 68060, without any new instructions" +#~ msgstr "Generér kode til en 68060 uden nogen nye instruktioner" + +#~ msgid "Generate code for a 68030" +#~ msgstr "Generér kode til en 68030" + +#~ msgid "Generate code for a 68040" +#~ msgstr "Generér kode til en 68040" + +#~ msgid "Generate code for a 68060" +#~ msgstr "Generér kode til en 68060" + +#~ msgid "Generate code for a 520X" +#~ msgstr "Generér kode til en 520X" + +#~ msgid "Generate code for a 68851" +#~ msgstr "Generér kode til en 68851" + +#~ msgid "Do no generate code for a 68851" +#~ msgstr "Generér ikke kode til en 68851" + +#~ msgid "Generate code for a 68302" +#~ msgstr "Generér kode til en 68302" + +#~ msgid "Generate code for a 68332" +#~ msgstr "Generér kode til en 68332" + +#~ msgid "Generate code for a cpu32" +#~ msgstr "Generér kode til en cpu32" + +#~ msgid "Align variables on a 32-bit boundary" +#~ msgstr "Justér variabler til 32 bit-grænserne" + +#~ msgid "Align variables on a 16-bit boundary" +#~ msgstr "Justér variabler til 16 bit-grænserne" + +#~ msgid "Generate pc-relative code" +#~ msgstr "Generér pc-relativ kode" + +#~ msgid "Do not use unaligned memory references" +#~ msgstr "Benyt ikke ikke-justerede hukommelsesreferencer" + +#~ msgid "Use unaligned memory references" +#~ msgstr "Benyt ikke-justerede hukommelsesreferencer" + +#~ msgid "internal gcc monitor: short-branch(%x)" +#~ msgstr "intern GCC-overvågning: short-branch(%x)" + +#~ msgid "internal gcc error: Can't express symbolic location" +#~ msgstr "intern GCC-fejl: Kan ikke udtrykke symbolsk placering" + +#~ msgid "argument #%d is a structure" +#~ msgstr "%d. parameter er en struktur" + +#~ msgid "%%R not followed by %%B/C/D/E" +#~ msgstr "%%R efterfølges ikke af %%B/C/D/E" + +#~ msgid "invalid %%x/X value" +#~ msgstr "ugyldig %%x/X-værdi" + +#~ msgid "invalid %%Q value" +#~ msgstr "ugyldig %%Q-værdi" + +#~ msgid "invalid %%q value" +#~ msgstr "ugyldig %%q-værdi" + +#~ msgid "invalid %%o value" +#~ msgstr "ugyldig %%o-værdi" + +#~ msgid "invalid %%p value" +#~ msgstr "ugyldig %%p-værdi" + +#~ msgid "invalid %%s/S value" +#~ msgstr "ugyldig %%s/S-værdi" + +#~ msgid "invalid %%P operand" +#~ msgstr "ugyldig %%P-operand" + +#~ msgid "invalid %%B value" +#~ msgstr "ugyldig %%B-værdi" + +#~ msgid "invalid %%D value" +#~ msgstr "ugyldig %%D-værdi" + +#~ msgid "`%%d' operand isn't a register" +#~ msgstr "operanden '%%d' er ikke et register" + +#~ msgid "operand is r0" +#~ msgstr "operanden er r0" + +#~ msgid "operand is const_double" +#~ msgstr "operanden er const_double" + +#~ msgid "invalid code" +#~ msgstr "ugyldig kode" + +#~ msgid "-mtrap-large-shift and -mhandle-large-shift are incompatible" +#~ msgstr "-mtrap-large-shift og -mhandle-large-shift er indbyrdes uforenelige" + +#~ msgid "invalid option `-mshort-data-%s'" +#~ msgstr "ugyldigt tilvalg '-mshort-data-%s'" + +#~ msgid "-mshort-data-%s is too large " +#~ msgstr "-mshort-data-%s er for stor" + +#~ msgid "-mshort-data-%s and PIC are incompatible" +#~ msgstr "-mshort-data-%s og PIC er indbyrdes uforenelige" + +#~ msgid "invalid option `-mstack-increment=%s'" +#~ msgstr "ugyldigt tilvalg '-mshort-increment=%s'" + +#~ msgid "Inline constants if it can be done in 2 insns or less" +#~ msgstr "Indlejr konstanter hvis det kan gøres med 2 instruktioner eller mindre" + +#~ msgid "Inline constants if it only takes 1 instruction" +#~ msgstr "Indlejr konstanter hvis det kan gøres med 1 instruktion" + +#~ msgid "Set maximum alignment to 4" +#~ msgstr "Sæt maksimal justering til 4" + +#~ msgid "Set maximum alignment to 8" +#~ msgstr "Sæt maksimal justering til 8" + +#~ msgid "Do not use the divide instruction" +#~ msgstr "Benyt ikke divisionsinstruktionen" + +#~ msgid "Do not arbitrary sized immediates in bit operations" +#~ msgstr "Benyt ikke vilkårlige størrelsers umiddelbare værdier i bitoperationer" + +#~ msgid "Always treat bit-field as int-sized" +#~ msgstr "Behandl altid bitfelter som af størrelsen int" + +#~ msgid "Force functions to be aligned to a 4 byte boundary" +#~ msgstr "Tving funktioner til at blive justeret til en 4 byte-grænse" + +#~ msgid "Force functions to be aligned to a 2 byte boundary" +#~ msgstr "Tving funktioner til at blive justeret til en 2 byte-grænse" + +#~ msgid "Emit call graph information" +#~ msgstr "Udsend kaldegrafinfo" + +#~ msgid "Prefer word accesses over byte accesses" +#~ msgstr "Foretræk ord-tilgange frem for byte-tilgange" + +#~ msgid "Generate code for the M*Core M340" +#~ msgstr "Generér kode til en M*Core M340" + +#~ msgid "Maximum amount for a single stack increment operation" +#~ msgstr "Maksimalt antal for en enkelt stakforøgelsesoperation" + +#~ msgid "bad value (%s) for -mabi= switch" +#~ msgstr "ugyldig værdi (%s) til tilvalget -mabi=" + +#~ msgid "-mips%d conflicts with the other architecture options, which specify a MIPS%d processor" +#~ msgstr "-mips%d er i konflikt med de andre arkitekturtilvalg som angiver en MIPS%d-processor" + +#~ msgid "bad value (%s) for -mips switch" +#~ msgstr "ugyldig værdi (%s) til tilvalget -mips" + +#~ msgid "-march=%s is not compatible with the selected ABI" +#~ msgstr "-march=%s er ikke forenelig med den valgte ABI" + +#~ msgid "-mgp64 used with a 32-bit processor" +#~ msgstr "-mgp64 benyttet med en 32 bit-processor" + +#~ msgid "-mgp32 used with a 64-bit ABI" +#~ msgstr "-mgp32 benyttet med et 64 bit-ABI" + +#~ msgid "-mgp64 used with a 32-bit ABI" +#~ msgstr "-mgp64 benyttet med et 32 bit-ABI" + +#~ msgid "unsupported combination: %s" +#~ msgstr "ikke-understøttet kombination: %s" + +#~ msgid "generation of Branch Likely instructions enabled, but not supported by architecture" +#~ msgstr "generering af Branch Likely-instruktioner er aktiveret, men ikke understøttet af arkitekturen" + +#~ msgid "-G is incompatible with PIC code which is the default" +#~ msgstr "-G er uforenelig med PIC-kode som genereres som standard" + +#~ msgid "-membedded-pic and -mabicalls are incompatible" +#~ msgstr "-membedded-pic og -mabicalls er indbyrdes uforenelige" + +#~ msgid "-G and -membedded-pic are incompatible" +#~ msgstr "-G og -membedded-pic er indbyrdes uforenelige" + +#~ msgid "invalid option `entry%s'" +#~ msgstr "ugyldigt tilvalg 'entry%s'" + +#~ msgid "-mentry is only meaningful with -mips-16" +#~ msgstr "-mentry giver kun mening sammen med -mips-16" + +#~ msgid "internal error: %%) found without a %%( in assembler pattern" +#~ msgstr "intern fejl: %%) fundet uden en %%) i maskinkodeoversættermønster" + +#~ msgid "internal error: %%] found without a %%[ in assembler pattern" +#~ msgstr "intern fejl: %%] fundet uden en %%[ i maskinkodeoversættermønster" + +#~ msgid "internal error: %%> found without a %%< in assembler pattern" +#~ msgstr "intern fejl: %%> fundet uden en %%< i maskinkodeoversættermønster" + +#~ msgid "internal error: %%} found without a %%{ in assembler pattern" +#~ msgstr "intern fejl: %%} fundet uden en %%{ i maskinkodeoversættermønster" + +#~ msgid "PRINT_OPERAND: unknown punctuation '%c'" +#~ msgstr "PRINT_OPERAND: ukendt tegnsætning '%c'" + +#~ msgid "PRINT_OPERAND null pointer" +#~ msgstr "PRINT_OPERAND nul-henvisning" + +#~ msgid "invalid use of %%d, %%x, or %%X" +#~ msgstr "ugyldigt brug af %%d, %%x eller %%X" + +#~ msgid "PRINT_OPERAND_ADDRESS, null pointer" +#~ msgstr "PRINT_OPERAND_ADDRESS, nul-henvisning" + +#~ msgid "MIPS ECOFF format does not allow changing filenames within functions with #line" +#~ msgstr "MIPS ECOFF-formatet tillader ikke skift af filnavne inden i funktioner med #line" + +#~ msgid "can't rewind temp file" +#~ msgstr "kan ikke spole midlertidig fil tilbage" + +#~ msgid "can't write to output file" +#~ msgstr "kan ikke skrive i uddatafil" + +#~ msgid "can't read from temp file" +#~ msgstr "kan ikke læse fra midlertidig fil" + +#~ msgid "can't close temp file" +#~ msgstr "kan ikke lukke midlertidig fil" + +#~ msgid "gp_offset (%ld) or end_offset (%ld) is less than zero" +#~ msgstr "gp_offset (%ld) eller end_offset (%ld) er mindre end nul" + +#~ msgid "fp_offset (%ld) or end_offset (%ld) is less than zero" +#~ msgstr "fp_offset (%ld) eller end_offset (%ld) er mindre end nul" + +#~ msgid "can not handle inconsistent calls to `%s'" +#~ msgstr "kan ikke håndtere inkonsistente kald af '%s'" + +#~ msgid "the cpu name must be lower case" +#~ msgstr "processornavnet skal staves med små bogstaver" + +#~ msgid "bad value (%s) for %s" +#~ msgstr "ugyldig værdi (%s) for %s" + +#~ msgid "No default crt0.o" +#~ msgstr "Ingen standard crt0.o" + +#~ msgid "Use 64-bit int type" +#~ msgstr "Benyt 64 bit int-type" + +#~ msgid "Use 64-bit long type" +#~ msgstr "Benyt 64 bit long-type" + +#~ msgid "Use 32-bit long type" +#~ msgstr "Benyt 32 bit long-type" + +#~ msgid "Optimize lui/addiu address loads" +#~ msgstr "Optimér lui/addiu-adresseindlæsninger" + +#~ msgid "Don't optimize lui/addiu address loads" +#~ msgstr "Optimér ikke lui/addiu-adresseindlæsninger" + +# 'as' står for assembler +#~ msgid "Use MIPS as" +#~ msgstr "Benyt MIPS as" + +#~ msgid "Use GNU as" +#~ msgstr "Benyt GNU as" + +#~ msgid "Use symbolic register names" +#~ msgstr "Benyt symbolske registernavne" + +#~ msgid "Don't use symbolic register names" +#~ msgstr "Benyt ikke symbolske registernavne" + +#~ msgid "Use GP relative sdata/sbss sections" +#~ msgstr "Benyt GP-relative sdata/sbss-sektioner" + +#~ msgid "Don't use GP relative sdata/sbss sections" +#~ msgstr "Benyt ikke GP-relative sdata/sbss-sektioner" + +#~ msgid "Output compiler statistics" +#~ msgstr "Udsend oversættelsesstatistik" + +#~ msgid "Don't output compiler statistics" +#~ msgstr "Udsend ikke oversættelsesstatistik" + +#~ msgid "Don't optimize block moves" +#~ msgstr "Optimér ikke blokflytninger" + +#~ msgid "Optimize block moves" +#~ msgstr "Optimér blokflytninger" + +#~ msgid "Use mips-tfile asm postpass" +#~ msgstr "Benyt mips-tfile-maskinkodeefterfase" + +#~ msgid "Don't use mips-tfile asm postpass" +#~ msgstr "Benyt ikke mips-tfile-maskinkodeefterfase" + +#~ msgid "Use hardware floating point" +#~ msgstr "Benyt hardware-kommatal" + +#~ msgid "Use 64-bit FP registers" +#~ msgstr "Benyt 64 bit-kommatalsregistre" + +#~ msgid "Use 32-bit FP registers" +#~ msgstr "Benyt 32 bit-kommatalsregistre" + +#~ msgid "Use 64-bit general registers" +#~ msgstr "Benyt 64 bit almene registre" + +#~ msgid "Use 32-bit general registers" +#~ msgstr "Benyt 32 bit almene registre" + +#~ msgid "Use Irix PIC" +#~ msgstr "Benyt Irix PIC" + +#~ msgid "Don't use Irix PIC" +#~ msgstr "Benyt ikke Irix PIC" + +#~ msgid "Use indirect calls" +#~ msgstr "Benyt indirekte kald" + +#~ msgid "Don't use indirect calls" +#~ msgstr "Benyt ikke indirekte kald" + +#~ msgid "Use embedded PIC" +#~ msgstr "Benyt indlejret PIC" + +#~ msgid "Don't use embedded PIC" +#~ msgstr "Benyt ikke indlejret PIC" + +#~ msgid "Use ROM instead of RAM" +#~ msgstr "Benyt ROM i stedet for RAM" + +#~ msgid "Don't use ROM instead of RAM" +#~ msgstr "Benyt ikke ROM i stedet for RAM" + +#~ msgid "Put uninitialized constants in ROM (needs -membedded-data)" +#~ msgstr "Anbring konstanter uden startværdi i ROM (behøver -membedded-data)" + +#~ msgid "Don't put uninitialized constants in ROM" +#~ msgstr "Anbring ikke konstanter uden startværdi i ROM" + +#~ msgid "Use big-endian byte order" +#~ msgstr "Benyt storendet byteordning" + +#~ msgid "Use little-endian byte order" +#~ msgstr "Benyt lilleendet byteordning" + +#~ msgid "Use single (32-bit) FP only" +#~ msgstr "Benyt kun enkeltpræcisions (32 bit) kommatal" + +#~ msgid "Don't use single (32-bit) FP only" +#~ msgstr "Benyt ikke kun enkeltpræcisions (32 bit) kommatal" + +# hvad så det er... +#~ msgid "Use multiply accumulate" +#~ msgstr "Benyt multiplikationsakkumulering" + +#~ msgid "Don't use multiply accumulate" +#~ msgstr "Benyt ikke multiplikationsakkumulering" + +#~ msgid "Don't generate fused multiply/add instructions" +#~ msgstr "Generér ikke sammensatte gang/addér-instruktioner" + +#~ msgid "Generate fused multiply/add instructions" +#~ msgstr "Generér sammensatte gang/addér-instruktioner" + +#~ msgid "Work around early 4300 hardware bug" +#~ msgstr "Arbejd rundt om tidlig 4300-hardwarefejl" + +#~ msgid "Don't work around early 4300 hardware bug" +#~ msgstr "Arbejd ikke rundt om tidlig 4300-hardwarefejl" + +#~ msgid "Trap on integer divide by zero" +#~ msgstr "Forårsag undtagelse ved heltalsdivision med nul" + +#~ msgid "Don't trap on integer divide by zero" +#~ msgstr "Forårsag ikke undtagelse ved heltalsdivision med nul" + +#~ msgid "Trap on integer divide overflow" +#~ msgstr "Forårsag undtagelse ved heltalsdivisionsoverløb" + +#~ msgid "Don't trap on integer divide overflow" +#~ msgstr "Forårsag ikke undtagelse ved heltalsdivisionsoverløb" + +#~ msgid "Use Branch Likely instructions, overriding default for arch" +#~ msgstr "Benyt Branch Likely-instruktioner, overskrivende forvalget for arkitektur" + +#~ msgid "Don't use Branch Likely instructions, overriding default for arch" +#~ msgstr "Benyt ikke Branch Likely-instruktioner, overskrivende forvalget for arkitektur" + +#~ msgid "Specify CPU for scheduling purposes" +#~ msgstr "Angiv processor til planlægningsformål" + +#~ msgid "Specify CPU for code generation purposes" +#~ msgstr "Angiv processor til kodegenereringsformål" + +#~ msgid "Specify an ABI" +#~ msgstr "Angiv en ABI" + +#~ msgid "Specify a Standard MIPS ISA" +#~ msgstr "Angiv en Standard MIPS ISA" + +#~ msgid "Use mips16 entry/exit psuedo ops" +#~ msgstr "Benyt MIPS16-indtrædelse-/afslutningspseudooperationer" + +#~ msgid "Don't use MIPS16 instructions" +#~ msgstr "Benyt ikke MIPS16-instruktioner" + +#~ msgid "Don't call any cache flush functions" +#~ msgstr "Kald ikke nogen mellemlagertømningsfunktion" + +#~ msgid "Specify cache flush function" +#~ msgstr "Angiv mellemlagertømningsfunktion" + +#~ msgid "mips16 function profiling" +#~ msgstr "MIPS16-funktionsprofilering" + +#~ msgid "-f%s not supported: ignored" +#~ msgstr "-f%s er ikke understøttet: ignoreret" + +#~ msgid "too large function value type, needs %d registers, have only %d registers for this" +#~ msgstr "for stor funktionsværditype, behøver %d registre, har kun %d registre til dette" + +#~ msgid "function_profiler support for MMIX" +#~ msgstr "function_profiler-understøttelse for MMIX" + +#~ msgid "MMIX Internal: Last named vararg would not fit in a register" +#~ msgstr "MMIX-intern: Sidst navngivne variabel parameter kan ikke passes i et register" + +#~ msgid "MMIX Internal: Expected a CONST_INT, not this" +#~ msgstr "MMIX-intern: Forventede en CONST_INT, ikke dette" + +#~ msgid "MMIX Internal: Bad register: %d" +#~ msgstr "MMIX-intern: Ugyldigt register: %d" + +#~ msgid "MMIX Internal: Bad value for 'm', not a CONST_INT" +#~ msgstr "MMIX-intern: Ugyldigt værdi for 'm', ikke en CONST_INT" + +#~ msgid "MMIX Internal: Expected a register, not this" +#~ msgstr "MMIX-intern: Forventede et register, ikke dette" + +#~ msgid "MMIX Internal: Expected a constant, not this" +#~ msgstr "MMIX-intern: Forventede en konstant, ikke dette" + +#~ msgid "MMIX Internal: Missing `%c' case in mmix_print_operand" +#~ msgstr "MMIX-intern: Mangler '%c'-case i mmix_print_operand" + +#~ msgid "MMIX Internal: Cannot decode this operand" +#~ msgstr "MMIX-intern: Kan ikke dekode denne operand" + +#~ msgid "MMIX Internal: This is not a recognized address" +#~ msgstr "MMIX-intern: Dette er ikke en genkendt adresse" + +#~ msgid "stack frame not a multiple of 8 bytes: %d" +#~ msgstr "stakramme ikke et produkt af 8 byte: %d" + +#~ msgid "stack frame not a multiple of octabyte: %d" +#~ msgstr "stakramme ikke et produkt af 8 byte: %d" + +#~ msgid "MMIX Internal: %s is not a shiftable int" +#~ msgstr "MMIX-intern: %s er ikke en int der kan skiftes" + +#~ msgid "MMIX Internal: Trying to output invalidly reversed condition:" +#~ msgstr "MMIX-intern: Forsøger at udskrive ugyldigt omvendt betingelse:" + +#~ msgid "MMIX Internal: What's the CC of this?" +#~ msgstr "MMIX-intern: Hvad er CC af dette?" + +#~ msgid "MMIX Internal: What is the CC of this?" +#~ msgstr "MMIX-intern: Hvad er CC af dette?" + +#~ msgid "MMIX Internal: This is not a constant:" +#~ msgstr "MMIX-intern: Dette er ikke en konstant:" + +#~ msgid "Set start-address of the program" +#~ msgstr "Angiv startadressen for programmet" + +#~ msgid "Set start-address of data" +#~ msgstr "Angiv startadressen for data" + +#~ msgid "For intrinsics library: pass all parameters in registers" +#~ msgstr "For indbyggede biblioteker: overbring alle parametre i registre" + +#~ msgid "Use register stack for parameters and return value" +#~ msgstr "Benyt registerstakken til parametre og returværdier" + +#~ msgid "Use call-clobbered registers for parameters and return value" +#~ msgstr "Benyt kaldeoptagne registre til parametre og returværdier" + +#~ msgid "Use epsilon-respecting floating point compare instructions" +#~ msgstr "Benyt epsilon-respekterende instruktioner til kommatalssammenligning" + +#~ msgid "Use zero-extending memory loads, not sign-extending ones" +#~ msgstr "Benyt nul-udvidende hukommelsesindlæsninger, ikke fortegnsudvidende" + +#~ msgid "Generate divide results with reminder having the same sign as the divisor (not the dividend)" +#~ msgstr "Generér divisionsresultater med rest som har det samme fortegn som nævneren (ikke tælleren)" + +#~ msgid "Prepend global symbols with \":\" (for use with PREFIX)" +#~ msgstr "Tilføj \":\" til starten af globale symboler (til brug sammen med PREFIX)" + +#~ msgid "Do not provide a default start-address 0x100 of the program" +#~ msgstr "Tilbyd ikke standardstartadressen 0x100 for programmet" + +#~ msgid "Link to emit program in ELF format (rather than mmo)" +#~ msgstr "Lad sammenkædningen udsende programmet i ELF-format (i stedet for mmo)" + +#~ msgid "Use P-mnemonics for branches statically predicted as taken" +#~ msgstr "Benyt P-aliaser for forgreninger som statistisk forudses at blive taget" + +#~ msgid "Don't use P-mnemonics for branches" +#~ msgstr "Benyt ikke P-aliaser for forgreninger" + +#~ msgid "Use addresses that allocate global registers" +#~ msgstr "Benyt adresser der allokerer globale registre" + +#~ msgid "Do not use addresses that allocate global registers" +#~ msgstr "Benyt ikke adresser der allokerer globale registre" + +#~ msgid "Generate a single exit point for each function" +#~ msgstr "Generér et enkelt afslutningspunkt for hver funktion" + +#~ msgid "Do not generate a single exit point for each function" +#~ msgstr "Generér ikke et enkelt afslutningspunkt for hver funktion" + +#~ msgid "Work around hardware multiply bug" +#~ msgstr "Arbejd omkring hardware-multiplikationsfejl" + +#~ msgid "Do not work around hardware multiply bug" +#~ msgstr "Arbejd ikke omkring hardware-multiplikationsfejl" + +#~ msgid "Target the AM33 processor" +#~ msgstr "Målret mod AM33-processoren" + +#~ msgid "Enable linker relaxations" +#~ msgstr "Aktivér tolerant sammenkædning" + +#~ msgid "Don't use hardware fp" +#~ msgstr "Benyt ikke hardware-kommatal" + +#~ msgid "Alternative calling convention" +#~ msgstr "Alternativ kaldekonvention" + +#~ msgid "Pass some arguments in registers" +#~ msgstr "Overbring nogle parametre i registre" + +#~ msgid "Pass all arguments on stack" +#~ msgstr "Overbring alle parametre på stakken" + +#~ msgid "Optimize for 32532 cpu" +#~ msgstr "Optimér for en 32532-processor" + +#~ msgid "Optimize for 32332 cpu" +#~ msgstr "Optimér for en 32332-processor" + +#~ msgid "Optimize for 32032" +#~ msgstr "Optimér for en 32032-processor" + +#~ msgid "Register sb is zero. Use for absolute addressing" +#~ msgstr "Registeret 'sb' er nul; benyt til absolut adressering" + +#~ msgid "Do not use register sb" +#~ msgstr "Benyt ikke registeret 'sb'" + +#~ msgid "Use bit-field instructions" +#~ msgstr "Benyt bitfeltinstruktioner" + +#~ msgid "Do not use bit-field instructions" +#~ msgstr "Benyt ikke bitfeltinstruktioner" + +#~ msgid "Generate code for high memory" +#~ msgstr "Generér kode til høj hukommelse" + +#~ msgid "Generate code for low memory" +#~ msgstr "Generér kode til lav hukommelse" + +#~ msgid "32381 fpu" +#~ msgstr "32381-fpu" + +#~ msgid "Use multiply-accumulate fp instructions" +#~ msgstr "Benyt kommatalsinstruktioner til multiplikationsakkumulering" + +#~ msgid "Do not use multiply-accumulate fp instructions" +#~ msgstr "Benyt ikke kommatalsinstruktioner til multiplikationsakkumulering" + +#~ msgid "\"Small register classes\" kludge" +#~ msgstr "\"Små registerklasser\"-lapning" + +#~ msgid "No \"Small register classes\" kludge" +#~ msgstr "Ingen \"Små registerklasser\"-lapning" + +#~ msgid "" +#~ "unknown -mschedule= option (%s).\n" +#~ "Valid options are 700, 7100, 7100LC, 7200, 7300, and 8000\n" +#~ msgstr "" +#~ "ukendt parameter til -mschedule= (%s).\n" +#~ "Gyldige parametre er 700, 7100, 7100LC, 7200, 7300 og 8000\n" + +#~ msgid "" +#~ "unknown -march= option (%s).\n" +#~ "Valid options are 1.0, 1.1, and 2.0\n" +#~ msgstr "" +#~ "ukendt parameter til -march= (%s).\n" +#~ "Gyldige parametre er 1.0, 1.1 og 2.0\n" + +#~ msgid "PIC code generation is not supported in the portable runtime model\n" +#~ msgstr "PIC-kodegenerering er ikke understøttet i den portable kørselsmodel\n" + +#~ msgid "PIC code generation is not compatible with fast indirect calls\n" +#~ msgstr "PIC-kodegenerering er ikke kompatibel med hurtige indirekte kald\n" + +#~ msgid "-g is only supported when using GAS on this processor," +#~ msgstr "-g er kun understøttet ved brug af GAS på denne processor," + +#~ msgid "-g option disabled" +#~ msgstr "tilvalget -g deaktiveret" + +#~ msgid "Generate cpp defines for server IO" +#~ msgstr "Generér CPP-defineringer til server-IO" + +#~ msgid "Generate cpp defines for workstation IO" +#~ msgstr "Generér CPP-defineringer til arbejdsstation-IO" + +#~ msgid "Generate PA1.1 code" +#~ msgstr "Generér PA1.1-kode" + +#~ msgid "Generate PA1.0 code" +#~ msgstr "Generér PA1.0-kode" + +#~ msgid "Generate PA2.0 code (requires binutils 2.10 or later)" +#~ msgstr "Generér PA2.0-kode (kræver binutils 2.10 eller nyere)" + +#~ msgid "Disable FP regs" +#~ msgstr "Deaktivér kommatalsregistre" + +#~ msgid "Do not disable FP regs" +#~ msgstr "Deaktivér ikke kommatalsregistre" + +#~ msgid "Disable space regs" +#~ msgstr "Deaktivér pladsregistre" + +#~ msgid "Do not disable space regs" +#~ msgstr "Deaktivér ikke pladsregistre" + +#~ msgid "Put jumps in call delay slots" +#~ msgstr "Anbring spring på kaldeventetidspladser" + +#~ msgid "Do not put jumps in call delay slots" +#~ msgstr "Anbring ikke spring på kaldeventetidspladser" + +#~ msgid "Disable indexed addressing" +#~ msgstr "Deaktivér indekseret adressering" + +#~ msgid "Do not disable indexed addressing" +#~ msgstr "Deaktivér ikke indekseret adressering" + +#~ msgid "Use portable calling conventions" +#~ msgstr "Benyt portable kaldekonventioner" + +#~ msgid "Do not use portable calling conventions" +#~ msgstr "Benyt ikke portable kaldekonventioner" + +#~ msgid "Assume code will be assembled by GAS" +#~ msgstr "Antag at koden bliver oversat af GAS" + +#~ msgid "Do not assume code will be assembled by GAS" +#~ msgstr "Antag ikke at koden bliver oversat af GAS" + +#~ msgid "Do not use software floating point" +#~ msgstr "Benyt ikke softwarekommatal" + +#~ msgid "Emit long load/store sequences" +#~ msgstr "Udsend lange load/store-sekvenser" + +#~ msgid "Do not emit long load/store sequences" +#~ msgstr "Udsend ikke lange load/store-sekvenser" + +#~ msgid "Generate fast indirect calls" +#~ msgstr "Generér hurtige indirekte kald" + +#~ msgid "Do not generate fast indirect calls" +#~ msgstr "Generér ikke hurtige indirekte kald" + +#~ msgid "Generate code for huge switch statements" +#~ msgstr "Generér kode til store switch-sætninger" + +#~ msgid "Do not generate code for huge switch statements" +#~ msgstr "Generér ikke kode til store switch-sætninger" + +#~ msgid "Always generate long calls" +#~ msgstr "Generér altid lange kalde" + +#~ msgid "Generate long calls only when needed" +#~ msgstr "Generér kun lange kalde når det er nødvendigt" + +#~ msgid "Enable linker optimizations" +#~ msgstr "Aktivér sammenkæderoptimeringer" + +#~ msgid "Specify architecture for code generation. Values are 1.0, 1.1, and 2.0. 2.0 requires gas snapshot 19990413 or later." +#~ msgstr "Angiv arkitekturen for kodegenerering. Mulige værdier er 1.0, 1.1 og 2.0. 2.0 kræver GAS-snapshot 19990413 eller senere." + +#~ msgid "Assume code will be linked by GNU ld" +#~ msgstr "Antag at kode vil blive sammenkædet med GNU ld" + +#~ msgid "Assume code will be linked by HP ld" +#~ msgstr "Antag at kode vil blive sammenkædet med HP ld" + +#~ msgid "Do not use hardware floating point" +#~ msgstr "Benyt ikke hardware-kommatal" + +#~ msgid "Return floating point results in ac0" +#~ msgstr "Returnér kommatalsresultater i ac0" + +#~ msgid "Return floating point results in memory" +#~ msgstr "Returnér kommatalsresultater i hukommelse" + +#~ msgid "Generate code for an 11/40" +#~ msgstr "Generér kode til en 11/40" + +#~ msgid "Generate code for an 11/45" +#~ msgstr "Generér kode til en 11/45" + +#~ msgid "Generate code for an 11/10" +#~ msgstr "Generér kode til en 11/10" + +#~ msgid "Use 32 bit int" +#~ msgstr "Benyt 32 bit int" + +#~ msgid "Use 16 bit int" +#~ msgstr "Benyt 16 bit int" + +#~ msgid "Use 32 bit float" +#~ msgstr "Benyt 32 bit float" + +#~ msgid "Use 64 bit float" +#~ msgstr "Benyt 64 bit float" + +#~ msgid "Target has split I&D" +#~ msgstr "Målarkitektur har delt I&D" + +#~ msgid "Target does not have split I&D" +#~ msgstr "Målarkitektur har ikke delt I&D" + +#~ msgid "Use UNIX assembler syntax" +#~ msgstr "Benyt UNIX-maskinkodesyntaks" + +#~ msgid "Use DEC assembler syntax" +#~ msgstr "Benyt DEC-maskinkodesyntaks" + +#~ msgid "invalid %%S value" +#~ msgstr "ugyldig %%S-værdi" + +#~ msgid "invalid %%b value" +#~ msgstr "ugyldig %%b-værdi" + +#~ msgid "invalid %%z value" +#~ msgstr "ugyldig %%z-værdi" + +#~ msgid "invalid %%Z value" +#~ msgstr "ugyldig %%Z-værdi" + +#~ msgid "invalid %%k value" +#~ msgstr "ugyldig %%k-værdi" + +#~ msgid "invalid %%j value" +#~ msgstr "ugyldig %%j-værdi" + +#~ msgid "can't have varargs with -mfp-arg-in-fp-regs" +#~ msgstr "kan ikke have variable parameterlister med -mfp-arg-in-fp-regs" + +#~ msgid "ignoring malformed #pragma longcall" +#~ msgstr "ignorerer forkert udformet #pragma longcall" + +#~ msgid "missing open paren" +#~ msgstr "manglende startparantes" + +#~ msgid "missing number" +#~ msgstr "manglende tal" + +#~ msgid "missing close paren" +#~ msgstr "manglende slutparantes" + +#~ msgid "number must be 0 or 1" +#~ msgstr "tal skal enten være 0 eller 1" + +#~ msgid "junk at end of #pragma longcall" +#~ msgstr "ragelse i slutningen af #pragma longcall" + +#~ msgid "-mmultiple is not supported on little endian systems" +#~ msgstr "-mmultiple er ikke understøttet på lilleendede systemer" + +#~ msgid "-mstring is not supported on little endian systems" +#~ msgstr "-mstring er ikke understøttet på lilleendede systemer" + +#~ msgid "unknown -mdebug-%s switch" +#~ msgstr "ukendt tilvalg -mdebug-%s" + +#~ msgid "unknown -mtraceback arg `%s'; expecting `full', `partial' or `none'" +#~ msgstr "ukendt parameter '%s' til -mtraceback; forventer 'full', 'partial' eller 'none'" + +#~ msgid "Unknown switch -mlong-double-%s" +#~ msgstr "Ukendt tilvalg -mlong-double-%s" + +#~ msgid "unknown -misel= option specified: '%s'" +#~ msgstr "ukendt tilvalg til -misel= angivet: '%s'" + +#~ msgid "unknown -mvrsave= option specified: '%s'" +#~ msgstr "ukendt tilvalg til -mvrsave= angivet: '%s'" + +#~ msgid "unknown ABI specified: '%s'" +#~ msgstr "ukendt ABI angivet: '%s'" + +#~ msgid "argument 1 must be a 5-bit signed literal" +#~ msgstr "1. parameter skal være en 5 bit-konstant med fortegn" + +#~ msgid "argument 2 must be a 5-bit unsigned literal" +#~ msgstr "2. parameter skal være en 5 bit-konstant uden fortegn" + +#~ msgid "argument 1 of __builtin_altivec_predicate must be a constant" +#~ msgstr "1. parameter til __builtin_altivec_predicate skal være en konstant" + +#~ msgid "argument 1 of __builtin_altivec_predicate is out of range" +#~ msgstr "1. parameter til __builtin_altivec_predicate er uden for det gyldige interval" + +#~ msgid "argument 3 must be a 4-bit unsigned literal" +#~ msgstr "3. parameter skal være en 4 bit-konstant uden fortegn" + +#~ msgid "argument to `%s' must be a 2-bit unsigned literal" +#~ msgstr "parameter til '%s' skal være en 2 bit-konstant uden fortegn" + +#~ msgid "argument to dss must be a 2-bit unsigned literal" +#~ msgstr "parameter til dss skal være en 2 bit-konstant uden fortegn" + +#~ msgid "argument 1 of __builtin_spe_predicate must be a constant" +#~ msgstr "1. parameter til __builtin_spe_predicate skal være en konstant" + +#~ msgid "argument 1 of __builtin_spe_predicate is out of range" +#~ msgstr "1. parameter til __builtin_spe_predicate er uden for det gyldige interval" + +#~ msgid "invalid %%f value" +#~ msgstr "ugyldig %%f-værdi" + +#~ msgid "invalid %%F value" +#~ msgstr "ugyldig %%F-værdi" + +#~ msgid "invalid %%G value" +#~ msgstr "ugyldig %%G-værdi" + +#~ msgid "invalid %%j code" +#~ msgstr "ugyldig %%j-kode" + +#~ msgid "invalid %%J code" +#~ msgstr "ugyldig %%J-kode" + +#~ msgid "invalid %%K value" +#~ msgstr "ugyldig %%K-værdi" + +#~ msgid "invalid %%O value" +#~ msgstr "ugyldig %%O-værdi" + +#~ msgid "invalid %%T value" +#~ msgstr "ugyldig %%T-værdi" + +#~ msgid "invalid %%u value" +#~ msgstr "ugyldig %%u-værdi" + +#~ msgid "invalid %%v value" +#~ msgstr "ugyldig %%v-værdi" + +#~ msgid "no profiling of 64-bit code for this ABI" +#~ msgstr "ingen profilering af 64 bit-kode for denne ABI" + +#~ msgid "Always pass floating-point arguments in memory" +#~ msgstr "Overbring altid kommatalsparametre i hukommelse" + +#~ msgid "Don't always pass floating-point arguments in memory" +#~ msgstr "Overbring ikke altid kommatalsparametre i hukommelse" + +#~ msgid "Support message passing with the Parallel Environment" +#~ msgstr "Understøt meddelelsesoverbringelse med Parallel Environment" + +#~ msgid "Compile for 64-bit pointers" +#~ msgstr "Oversæt for 64 bit-henvisninger" + +#~ msgid "Compile for 32-bit pointers" +#~ msgstr "Oversæt for 32 bit-henvisninger" + +#~ msgid "-maix64 and POWER architecture are incompatible" +#~ msgstr "-maix64 og POWER-arkitekturen er indbyrdes uforenelige" + +#~ msgid "-maix64 requires PowerPC64 architecture remain enabled" +#~ msgstr "-maix64 kræver at PowerPC64-arkitekturen forbliver aktiveret" + +#~ msgid "-maix64 required: 64-bit computation with 32-bit addressing not yet supported" +#~ msgstr "-maix64 påkrævet: 64 bit-beregninger med 32 bit-adressering understøttes endnu ikke" + +#~ msgid "Use POWER instruction set" +#~ msgstr "Benyt POWER-instruktionssættet" + +#~ msgid "Use POWER2 instruction set" +#~ msgstr "Benyt POWER2-instruktionssættet" + +#~ msgid "Do not use POWER2 instruction set" +#~ msgstr "Benyt ikke POWER2-instruktionssættet" + +#~ msgid "Do not use POWER instruction set" +#~ msgstr "Benyt ikke POWER-instruktionssættet" + +#~ msgid "Use PowerPC instruction set" +#~ msgstr "Benyt PowerPC-instruktionssættet" + +#~ msgid "Do not use PowerPC instruction set" +#~ msgstr "Benyt ikke PowerPC-instruktionssættet" + +#~ msgid "Use PowerPC General Purpose group optional instructions" +#~ msgstr "Benyt valgfrie instruktioner fra PowerPC General Purpose-gruppen" + +#~ msgid "Don't use PowerPC General Purpose group optional instructions" +#~ msgstr "Benyt ikke valgfrie instruktioner fra PowerPC General Purpose-gruppen" + +#~ msgid "Use PowerPC Graphics group optional instructions" +#~ msgstr "Benyt valgfrie instruktioner fra PowerPC Graphics-gruppen" + +#~ msgid "Don't use PowerPC Graphics group optional instructions" +#~ msgstr "Benyt ikke valgfrie instruktioner fra PowerPC Graphics-gruppen" + +#~ msgid "Use PowerPC-64 instruction set" +#~ msgstr "Benyt PowerPC-64-instruktionssættet" + +#~ msgid "Don't use PowerPC-64 instruction set" +#~ msgstr "Benyt ikke PowerPC-64-instruktionssættet" + +#~ msgid "Use AltiVec instructions" +#~ msgstr "Benyt AltiVec-instruktioner" + +#~ msgid "Don't use AltiVec instructions" +#~ msgstr "Benyt ikke AltiVec-instruktioner" + +#~ msgid "Use new mnemonics for PowerPC architecture" +#~ msgstr "Benyt nye aliaser for PowerPC-arkitekturen" + +#~ msgid "Use old mnemonics for PowerPC architecture" +#~ msgstr "Benyt tidligere aliaser for PowerPC-arkitekturen" + +#~ msgid "Put everything in the regular TOC" +#~ msgstr "Anbring alting i den regulære indholdsfortegnelse" + +#~ msgid "Place floating point constants in TOC" +#~ msgstr "Anbring kommatalskonstanter i indholdsfortegnelsen" + +#~ msgid "Don't place floating point constants in TOC" +#~ msgstr "Anbring ikke kommatalskonstanter i indholdsfortegnelsen" + +#~ msgid "Place symbol+offset constants in TOC" +#~ msgstr "Anbring symbol+afsæt-konstanter i indholdsfortegnelsen" + +#~ msgid "Don't place symbol+offset constants in TOC" +#~ msgstr "Anbring ikke symbol+afsæt-konstanter i indholdsfortegnelsen" + +#~ msgid "Place variable addresses in the regular TOC" +#~ msgstr "Anbring variabeladresser i den regulære indholdsfortegnelse" + +#~ msgid "Generate load/store multiple instructions" +#~ msgstr "Generér flere indlæsnings-/lagringsinstruktioner" + +#~ msgid "Do not generate load/store multiple instructions" +#~ msgstr "Generér ikke flere indlæsnings-/lagringsinstruktioner" + +#~ msgid "Generate string instructions for block moves" +#~ msgstr "Generér strengoperationer til blokflytninger" + +#~ msgid "Do not generate string instructions for block moves" +#~ msgstr "Generér ikke strengoperationer til blokflytninger" + +#~ msgid "Generate load/store with update instructions" +#~ msgstr "Generér indlæsning/lagring med opdateringsinstruktioner" + +#~ msgid "Do not generate load/store with update instructions" +#~ msgstr "Generér ikke indlæsning/lagring med opdateringsinstruktioner" + +#~ msgid "Don't schedule the start and end of the procedure" +#~ msgstr "Planlæg ikke begyndelsen og slutningen af proceduren" + +#~ msgid "Return all structures in memory (AIX default)" +#~ msgstr "Returnér alle strukturer i hukommelse (SVR4-standard)" + +#~ msgid "Return small structures in registers (SVR4 default)" +#~ msgstr "Returnér små strukturer i registre (SVR4-standard)" + +#~ msgid "Use features of and schedule code for given CPU" +#~ msgstr "Benyt faciliteter fra og planlæg koden til en given processor" + +#~ msgid "Enable debug output" +#~ msgstr "Aktivér fejlanalyseringsuddata" + +#~ msgid "Select full, part, or no traceback table" +#~ msgstr "Vælg komplet, partiel eller ingen tilbagesporingstabel" + +#~ msgid "Specify ABI to use" +#~ msgstr "Angiv ABI der skal bruges" + +#~ msgid "Specify size of long double (64 or 128 bits)" +#~ msgstr "Angiv størrelsen af long double (64 eller 128 bit)" + +#~ msgid "Specify yes/no if isel instructions should be generated" +#~ msgstr "Angiv yes/no hvis isel-instruktioner skal genereres" + +#~ msgid "Specify yes/no if VRSAVE instructions should be generated for AltiVec" +#~ msgstr "Angiv yes/no hvis VRSAVE-instruktioner skal genereres til AltiVec" + +#~ msgid "Avoid all range limits on call instructions" +#~ msgstr "Undgå alle områdegrænser ved kaldeinstruktioner" + +#~ msgid "RETURN_ADDRESS_OFFSET not supported" +#~ msgstr "RETURN_ADDRESS_OFFSET er ikke understøttet" + +#~ msgid "Select ABI calling convention" +#~ msgstr "Angiv ABI-kaldekonvention" + +#~ msgid "Select method for sdata handling" +#~ msgstr "Angiv metode for sdata-håndtering" + +#~ msgid "Align to the base type of the bit-field" +#~ msgstr "Justér til grundtypen for bitfeltet" + +#~ msgid "Don't align to the base type of the bit-field" +#~ msgstr "Justér ikke til grundtypen for bitfeltet" + +#~ msgid "Don't assume that unaligned accesses are handled by the system" +#~ msgstr "Antag ikke at ujusterede tilgange håndteres af systemet" + +#~ msgid "Assume that unaligned accesses are handled by the system" +#~ msgstr "Antag at ujusterede tilgange håndteres af systemet" + +#~ msgid "Produce code relocatable at runtime" +#~ msgstr "Generér kode som kan flyttes på kørselstidspunktet" + +#~ msgid "Don't produce code relocatable at runtime" +#~ msgstr "Generér ikke kode som kan flyttes på kørselstidspunktet" + +#~ msgid "Produce little endian code" +#~ msgstr "Generér lilleendet kode" + +#~ msgid "Produce big endian code" +#~ msgstr "Generér storendet kode" + +#~ msgid "no description yet" +#~ msgstr "ingen beskrivelse endnu" + +#~ msgid "Use EABI" +#~ msgstr "Benyt EABI" + +#~ msgid "Don't use EABI" +#~ msgstr "Benyt ikke EABI" + +#~ msgid "Do not allow bit-fields to cross word boundaries" +#~ msgstr "Tillad ikke bitfelter at krydse ordgrænser" + +#~ msgid "Use alternate register names" +#~ msgstr "Benyt alternative registernavne" + +#~ msgid "Don't use alternate register names" +#~ msgstr "Benyt ikke alternative registernavne" + +#~ msgid "Link with libsim.a, libc.a and sim-crt0.o" +#~ msgstr "Sammenkæd med libsim.a, libc.a og sim-crt0.o" + +#~ msgid "Link with libads.a, libc.a and crt0.o" +#~ msgstr "Sammenkæd med libads.a, libc.a og crt0.o" + +#~ msgid "Link with libyk.a, libc.a and crt0.o" +#~ msgstr "Sammenkæd med libyk.a, libc.a og crt0.o" + +#~ msgid "Link with libmvme.a, libc.a and crt0.o" +#~ msgstr "Sammenkæd med libmvme.a, libc.a og crt0.o" + +#~ msgid "Set the PPC_EMB bit in the ELF flags header" +#~ msgstr "Sæt PPC_EMB-bitten i ELF-tilvalgshovedet" + +#~ msgid "Use the WindISS simulator" +#~ msgstr "Benyt WindISS-simulatoren" + +#~ msgid "bad value for -mcall-%s" +#~ msgstr "ugyldig værdi til -mcall-%s" + +#~ msgid "bad value for -msdata=%s" +#~ msgstr "ugyldig værdi til -msdata=%s" + +#~ msgid "-mrelocatable and -msdata=%s are incompatible" +#~ msgstr "-mrelocatable og -msdata=%s er indbyrdes uforenelige" + +#~ msgid "-f%s and -msdata=%s are incompatible" +#~ msgstr "-f%s og -msdata=%s er indbyrdes uforenelige" + +#~ msgid "-msdata=%s and -mcall-%s are incompatible" +#~ msgstr "-msdata=%s og -mcall-%s er indbyrdes uforenelige" + +#~ msgid "-mrelocatable and -mno-minimal-toc are incompatible" +#~ msgstr "-mrelocatable og -mno-minimal-toc er indbyrdes uforenelige" + +#~ msgid "-mrelocatable and -mcall-%s are incompatible" +#~ msgstr "-mrelocatable og -mcall-%s er indbyrdes uforenelige" + +#~ msgid "-fPIC and -mcall-%s are incompatible" +#~ msgstr "-fPIC og -mcall-%s er indbyrdes uforenelige" + +#~ msgid "-mcall-aixdesc must be big endian" +#~ msgstr "-mcall-aixdesc skal være stor-endet" + +#~ msgid "invalid UNSPEC as operand (1)" +#~ msgstr "ugyldig UNSPEC som operand (1)" + +#~ msgid "invalid UNSPEC as operand (2)" +#~ msgstr "ugyldig UNSPEC som operand (2)" + +#~ msgid "UNKNOWN in s390_output_symbolic_const !?" +#~ msgstr "UNKNOWN i s390_output_symbolic_const !?" + +#~ msgid "Cannot decompose address." +#~ msgstr "Kan ikke adskille adresse." + +#~ msgid "UNKNOWN in print_operand !?" +#~ msgstr "UNKNOWN i print_operand !?" + +#~ msgid "Total size of local variables exceeds architecture limit." +#~ msgstr "Total størrelse af lokale variable overstiger arkitekturgrænsen." + +# RETMIG: hvad er backchain? +#~ msgid "Set backchain" +#~ msgstr "Sæt backchain" + +#~ msgid "Don't set backchain (faster, but debug harder" +#~ msgstr "Sæt ikke backchain (hurtigere, men sværere at fejlanalysere)" + +#~ msgid "Use bras for executable < 64k" +#~ msgstr "Benyt bras til kørbar fil < 64k" + +#~ msgid "Don't use bras" +#~ msgstr "Benyt ikke bras" + +#~ msgid "Additional debug prints" +#~ msgstr "Udskriv ekstra fejlanalyseringsinfo" + +#~ msgid "Don't print additional debug prints" +#~ msgstr "Udskriv ikke ekstra fejlanalyseringsinfo" + +#~ msgid "64 bit mode" +#~ msgstr "64 bit-tilstand" + +#~ msgid "31 bit mode" +#~ msgstr "31 bit-tilstand" + +#~ msgid "mvcle use" +#~ msgstr "Benyt mvcle" + +#~ msgid "mvc&ex" +#~ msgstr "mvc&ex" + +#~ msgid "__builtin_saveregs not supported by this subtarget" +#~ msgstr "__builtin_saveregs understøttes ikke af denne undermålarkitektur" + +#~ msgid "attribute interrupt_handler is not compatible with -m5-compact" +#~ msgstr "egenskaben interrupt_handler er ikke forenelig med -m5-compact" + +#~ msgid "`%s' attribute only applies to interrupt functions" +#~ msgstr "egenskaben '%s' kan kun anvendes sammen med afbrydelsesfunktioner" + +#~ msgid "`%s' attribute argument not a string constant" +#~ msgstr "parameteren til egenskaben '%s' er ikke en strengkonstant" + +#~ msgid "`%s' attribute argument not an integer constant" +#~ msgstr "parameteren til egenskaben '%s' er ikke en heltalskonstant" + +#~ msgid "Profiling is not supported on this target." +#~ msgstr "Profilering er ikke understøttet på målarkitekturen." + +#~ msgid "%s is not supported by this configuration" +#~ msgstr "%s understøttes ikke af denne konfiguration" + +#~ msgid "-mlong-double-64 not allowed with -m64" +#~ msgstr "-mlong-double-64 er ikke tilladt med -m64" + +#~ msgid "-mcmodel= is not supported on 32 bit systems" +#~ msgstr "-mcmodel= understøttes ikke på 32 bit-systemer" + +#~ msgid "invalid %%Y operand" +#~ msgstr "ugyldig %%Y-operand" + +#~ msgid "invalid %%A operand" +#~ msgstr "ugyldig %%A-operand" + +#~ msgid "invalid %%B operand" +#~ msgstr "ugyldig %%B-operand" + +#~ msgid "invalid %%c operand" +#~ msgstr "ugyldig %%c-operand" + +#~ msgid "invalid %%C operand" +#~ msgstr "ugyldig %%C-operand" + +#~ msgid "invalid %%d operand" +#~ msgstr "ugyldig %%d-operand" + +#~ msgid "invalid %%D operand" +#~ msgstr "ugyldig %%D-operand" + +#~ msgid "invalid %%f operand" +#~ msgstr "ugyldig %%f-operand" + +#~ msgid "invalid %%s operand" +#~ msgstr "ugyldig %%s-operand" + +#~ msgid "long long constant not a valid immediate operand" +#~ msgstr "long long-konstant er ikke en gyldig umiddelbar operand" + +#~ msgid "floating point constant not a valid immediate operand" +#~ msgstr "kommatalskonstant er ikke en gyldig umiddelbar operand" + +#~ msgid "Use 128 bit long doubles" +#~ msgstr "Benyt 128 bit long double" + +#~ msgid "Generate code for big endian" +#~ msgstr "Generér kode til storendet" + +#~ msgid "Generate code for little endian" +#~ msgstr "Generér kode til lilleendet" + +#~ msgid "Use little-endian byte order for data" +#~ msgstr "Benyt lilleendet byte-orden til data" + +#~ msgid "Assume possible double misalignment" +#~ msgstr "Antag at double-variabler kan være ujusterede" + +#~ msgid "Assume all doubles are aligned" +#~ msgstr "Antag at alle double-variabler er justerede" + +#~ msgid "Pass -assert pure-text to linker" +#~ msgstr "Overbring -assert pure-text til sammenkæderen" + +#~ msgid "Do not pass -assert pure-text to linker" +#~ msgstr "Overbring ikke -assert pure-text til sammenkæderen" + +#~ msgid "Use flat register window model" +#~ msgstr "Benyt flad registervinduesmodel" + +#~ msgid "Do not use flat register window model" +#~ msgstr "Benyt ikke flad registervinduesmodel" + +#~ msgid "Use ABI reserved registers" +#~ msgstr "Benyt ABI-reserverede registre" + +#~ msgid "Do not use ABI reserved registers" +#~ msgstr "Benyt ikke ABI-reserverede registre" + +#~ msgid "Use hardware quad fp instructions" +#~ msgstr "Benyt hardware quad-kommatalsinstruktioner" + +#~ msgid "Do not use hardware quad fp instructions" +#~ msgstr "Benyt ikke hardware quad-kommatalsinstruktioner" + +#~ msgid "Compile for v8plus ABI" +#~ msgstr "Oversæt for v8plus-ABI" + +#~ msgid "Do not compile for v8plus ABI" +#~ msgstr "Oversæt ikke for v8plus-ABI" + +#~ msgid "Utilize Visual Instruction Set" +#~ msgstr "Benyt Visual Instruction Set" + +#~ msgid "Do not utilize Visual Instruction Set" +#~ msgstr "Benyt ikke Visual Instruction Set" + +#~ msgid "Optimize for Cypress processors" +#~ msgstr "Optimér for Cypress-processorer" + +#~ msgid "Optimize for SPARCLite processors" +#~ msgstr "Optimér for SPARCLite-processorer" + +#~ msgid "Optimize for F930 processors" +#~ msgstr "Optimér for F930-processorer" + +#~ msgid "Optimize for F934 processors" +#~ msgstr "Optimér for F934-processorer" + +#~ msgid "Use V8 SPARC ISA" +#~ msgstr "Benyt V8 SPARC ISA" + +#~ msgid "Optimize for SuperSPARC processors" +#~ msgstr "Optimér for SuperSPARC-processorer" + +#~ msgid "Pointers are 64-bit" +#~ msgstr "Henvisninger er 64 bit" + +#~ msgid "Pointers are 32-bit" +#~ msgstr "Henvisninger er 32 bit" + +#~ msgid "Use 32-bit ABI" +#~ msgstr "Benyt 32 bit-API" + +#~ msgid "Use 64-bit ABI" +#~ msgstr "Benyt 64 bit-API" + +#~ msgid "Use stack bias" +#~ msgstr "Benyt stakafsæt" + +#~ msgid "Do not use stack bias" +#~ msgstr "Benyt ikke stakafsæt" + +#~ msgid "Use structs on stronger alignment for double-word copies" +#~ msgstr "Benyt strukturer på stærkere justering til dobbelt-ord kopier" + +#~ msgid "Do not use structs on stronger alignment for double-word copies" +#~ msgstr "Benyt ikke strukturer på stærkere justering til dobbelt-ord kopier" + +#~ msgid "Optimize tail call instructions in assembler and linker" +#~ msgstr "Optimér halekaldsinstruktioner i maskinkodeoversætteren og sammenkæderen" + +#~ msgid "Do not optimize tail call instructions in assembler or linker" +#~ msgstr "Optimér ikke halekaldsinstruktioner i maskinkodeoversætteren og sammenkæderen" + +#~ msgid "Use given SPARC code model" +#~ msgstr "Benyt given SPARC-kodemodel" + +#~ msgid "cannot use va_start in interrupt function" +#~ msgstr "kan ikke bruge va_start i afbrydelsesfunktion" + +#~ msgid "`B' operand is not constant" +#~ msgstr "'B'-operanden er ikke konstant" + +#~ msgid "`B' operand has multiple bits set" +#~ msgstr "'B'-operanden har flere bit sat" + +#~ msgid "`o' operand is not constant" +#~ msgstr "'o'-operanden er ikke konstant" + +#~ msgid "xstormy16_print_operand: unknown code" +#~ msgstr "xstormy16_print_operand: ukendt kode" + +#~ msgid "switch statement of size %lu entries too large" +#~ msgstr "switch-sætning med %lu elementer er for stor" + +#~ msgid "#pragma GHS endXXXX found without previous startXXX" +#~ msgstr "'#pragma GHS endXXXX' fundet uden forudgående 'startXXX'" + +#~ msgid "#pragma GHS endXXX does not match previous startXXX" +#~ msgstr "'#pragma GHS endXXXX' passer ikke med forudgående 'startXXX'" + +#~ msgid "cannot set interrupt attribute: no current function" +#~ msgstr "kan ikke sætte afbrydelsesegenskaben: ingen aktuel funktion" + +#~ msgid "cannot set interrupt attribute: no such identifier" +#~ msgstr "kan ikke sætte afbrydelsesegenskaben: intet sådant kaldenavn" + +#~ msgid "junk at end of #pragma ghs section" +#~ msgstr "ragelse i slutningen af '#pragma ghs section'" + +#~ msgid "unrecognized section name \"%s\"" +#~ msgstr "ukendt sektionsnavn \"%s\"" + +#~ msgid "malformed #pragma ghs section" +#~ msgstr "forkert udformet '#pragma ghs section'" + +#~ msgid "junk at end of #pragma ghs interrupt" +#~ msgstr "ragelse i slutningen af '#pragma ghs interrupt'" + +#~ msgid "junk at end of #pragma ghs starttda" +#~ msgstr "ragelse i slutningen af '#pragma ghs starttda'" + +#~ msgid "junk at end of #pragma ghs startsda" +#~ msgstr "ragelse i slutningen af '#pragma ghs startsda'" + +#~ msgid "junk at end of #pragma ghs startzda" +#~ msgstr "ragelse i slutningen af '#pragma ghs startzda'" + +#~ msgid "junk at end of #pragma ghs endtda" +#~ msgstr "ragelse i slutningen af '#pragma ghs endtda'" + +#~ msgid "junk at end of #pragma ghs endsda" +#~ msgstr "ragelse i slutningen af '#pragma ghs endsda'" + +#~ msgid "junk at end of #pragma ghs endzda" +#~ msgstr "ragelse i slutningen af '#pragma ghs endzda'" + +#~ msgid "%s=%s is not numeric" +#~ msgstr "%s=%s er ikke et tal" + +#~ msgid "%s=%s is too large" +#~ msgstr "%s=%s er for stor" + +#~ msgid "const_double_split got a bad insn:" +#~ msgstr "const_double_split modtog en ugyldig instruktion:" + +#~ msgid "output_move_single:" +#~ msgstr "output_move_single:" + +#~ msgid "a data area attribute cannot be specified for local variables" +#~ msgstr "en dataområdeegenskab kan ikke angives for lokale variable" + +#~ msgid "data area of '%s' conflicts with previous declaration" +#~ msgstr "dataområdet '%s' er i modstrid med tidligere erklæring" + +#~ msgid "bogus JR construction: %d\n" +#~ msgstr "falsk JR-konstruktion: %d\n" + +#~ msgid "bad amount of stack space removal: %d" +#~ msgstr "ugyldig størrelse af stakpladsfjernelse: %d" + +#~ msgid "bogus JARL construction: %d\n" +#~ msgstr "falsk JARL-konstruktion: %d\n" + +#~ msgid "Bogus DISPOSE construction: %d\n" +#~ msgstr "Falsk DISPOSE-konstruktion: %d\n" + +#~ msgid "Too much stack space to dispose of: %d" +#~ msgstr "For meget stakplads at tage sig af: %d" + +#~ msgid "Bogus PREPEARE construction: %d\n" +#~ msgstr "Falsk PREPARE-konstruktion: %d\n" + +#~ msgid "Too much stack space to prepare: %d" +#~ msgstr "For meget stakplads at forberede: %d" + +#~ msgid "Support Green Hills ABI" +#~ msgstr "Understøt Green Hills-ABI" + +#~ msgid "Prohibit PC relative function calls" +#~ msgstr "Forbyd PC-relative funktionskald" + +#~ msgid "Reuse r30 on a per function basis" +#~ msgstr "Genbrug r30 på et pr. funktionsgrundlag" + +#~ msgid "Use stubs for function prologues" +#~ msgstr "Benyt stubbe til funktionsindledninger" + +#~ msgid "Same as: -mep -mprolog-function" +#~ msgstr "Samme som: -mep -mprolog-function" + +#~ msgid "Enable backend debugging" +#~ msgstr "Aktivér bagendefejlanalyseringsinfo" + +#~ msgid "Compile for the v850 processor" +#~ msgstr "Oversæt for v850-processoren" + +#~ msgid "Compile for v850e processor" +#~ msgstr "Oversæt for v850e-processoren" + +#~ msgid "Enable the use of the short load instructions" +#~ msgstr "Aktivér brug af short load-instruktioner" + +#~ msgid "Do not use the callt instruction" +#~ msgstr "Benyt ikke callt-instruktionen" + +#~ msgid "Do not use registers r2 and r5" +#~ msgstr "Benyt ikke registrene r2 og r5" + +#~ msgid "Enforce strict alignment" +#~ msgstr "Gennemtving streng justering" + +#~ msgid "Use 4 byte entries in switch tables" +#~ msgstr "Benyt 4 byte-elementer i switch-tabeller" + +#~ msgid "Set the max size of data eligible for the TDA area" +#~ msgstr "Angiv den maks. størrelse af data til TDA-området" + +#~ msgid "Set the max size of data eligible for the SDA area" +#~ msgstr "Angiv den maks. størrelse af data til SDA-området" + +#~ msgid "Set the max size of data eligible for the ZDA area" +#~ msgstr "Angiv den maks. størrelse af data til ZDA-området" + +#~ msgid "bad test" +#~ msgstr "ugyldig test" + +#~ msgid "boolean registers required for the floating-point option" +#~ msgstr "booleske registre er påkrævet til kommatalsindstillingen" + +#~ msgid "invalid mask" +#~ msgstr "ugyldig maske" + +#~ msgid "invalid address" +#~ msgstr "ugyldig adresse" + +#~ msgid "no register in address" +#~ msgstr "ingen registre i adresse" + +#~ msgid "address offset not a constant" +#~ msgstr "adresseafsæt er ikke en konstant" + +#~ msgid "only uninitialized variables can be placed in a .bss section" +#~ msgstr "kun variabler uden startværdi kan placeres i .bss-sektionen" + +#~ msgid "Use the Xtensa code density option" +#~ msgstr "Benyt Xtensa-kodetæthedsindstillingen" + +#~ msgid "Do not use the Xtensa code density option" +#~ msgstr "Benyt ikke Xtensa-kodetæthedsindstillingen" + +#~ msgid "Use the Xtensa MAC16 option" +#~ msgstr "Benyt Xtensa-MAC16-indstillingen" + +#~ msgid "Do not use the Xtensa MAC16 option" +#~ msgstr "Benyt ikke Xtensa-MAC16-indstillingen" + +#~ msgid "Use the Xtensa MUL16 option" +#~ msgstr "Benyt Xtensa-MUL16-indstillingen" + +#~ msgid "Do not use the Xtensa MUL16 option" +#~ msgstr "Benyt ikke Xtensa-MUL16-indstillingen" + +#~ msgid "Use the Xtensa MUL32 option" +#~ msgstr "Benyt Xtensa-MUL32-indstillingen" + +#~ msgid "Do not use the Xtensa MUL32 option" +#~ msgstr "Benyt ikke Xtensa-MUL32-indstillingen" + +#~ msgid "Use the Xtensa NSA option" +#~ msgstr "Benyt Xtensa-NSA-indstillingen" + +#~ msgid "Do not use the Xtensa NSA option" +#~ msgstr "Benyt ikke Xtensa-NSA-indstillingen" + +#~ msgid "Use the Xtensa MIN/MAX option" +#~ msgstr "Benyt Xtensa-MIN/MAX-indstillingen" + +#~ msgid "Do not use the Xtensa MIN/MAX option" +#~ msgstr "Benyt ikke Xtensa-MIN/MAX-indstillingen" + +#~ msgid "Use the Xtensa SEXT option" +#~ msgstr "Benyt Xtensa-SEXT-indstillingen" + +#~ msgid "Do not use the Xtensa SEXT option" +#~ msgstr "Benyt ikke Xtensa-SEXT-indstillingen" + +#~ msgid "Use the Xtensa boolean register option" +#~ msgstr "Benyt Xtensa-indstillingen til booleske registre" + +#~ msgid "Do not use the Xtensa boolean register option" +#~ msgstr "Benyt ikke Xtensa-indstillingen til booleske registre" + +#~ msgid "Use the Xtensa floating-point unit" +#~ msgstr "Benyt kommatalsenheden til Xtensa" + +#~ msgid "Do not use the Xtensa floating-point unit" +#~ msgstr "Benyt ikke kommatalsenheden til Xtensa" + +#~ msgid "Disable fused multiply/add and multiply/subtract FP instructions" +#~ msgstr "Deaktivér sammensatte gang/addér- og gang/subtrahér-kommatalsinstruktioner" + +#~ msgid "Enable fused multiply/add and multiply/subtract FP instructions" +#~ msgstr "Aktivér sammensatte gang/addér- og gang/subtrahér-kommatalsinstruktioner" + +#~ msgid "Serialize volatile memory references with MEMW instructions" +#~ msgstr "Serialisér volatile hukommelsesreference med MEMW-instruktioner" + +#~ msgid "Do not serialize volatile memory references with MEMW instructions" +#~ msgstr "Serialisér ikke volatile hukommelsesreference med MEMW-instruktioner" + +#~ msgid "Intersperse literal pools with code in the text section" +#~ msgstr "Fordel konstanter med kode i tekstsektionen" + +#~ msgid "Put literal pools in a separate literal section" +#~ msgstr "Anbring konstanter i en adskilt konstantsektion" + +#~ msgid "Automatically align branch targets to reduce branch penalties" +#~ msgstr "Justér automatisk forgreningsmål for at reducere forgreningsstraffe" + +#~ msgid "Do not automatically align branch targets" +#~ msgstr "Justér ikke automatisk forgreningsmål" + +#~ msgid "Use indirect CALLXn instructions for large programs" +#~ msgstr "Benyt indirekte CALLXn-instruktioner for store programmer" + +#~ msgid "Use direct CALLn instructions for fast calls" +#~ msgstr "Benyt direkte CALLn-instruktioner for hurtige kald" + +#~ msgid "`-gnat' misspelled as `-gant'" +#~ msgstr "'-gnat' stavet forkert som '-gant'" + +#~ msgid "qualified type `%T' does not match destructor name `~%T'" +#~ msgstr "den modificerede type '%T' passer ikke til destruktionsfunktionsnavnet '~%T'" + +#~ msgid "type of `%E' does not match destructor type `%T' (type was `%T')" +#~ msgstr "typen af '%E' passer ikke til destruktionsfunktionstypen '%T' (typen var '%T')" + +#~ msgid "`%D' is a namespace" +#~ msgstr "'%D' er et navnerum" + +#~ msgid "base object `%E' of scoped method call is of non-aggregate type `%T'" +#~ msgstr "stamobjektet '%E' fra metodekald forsynet med virkefelt er af en ikke-sammensat type '%T'" + +#~ msgid "unable to call pointer to member function here" +#~ msgstr "kan ikke kalde henvisning til medlemsfunktion her" + +#~ msgid "destructors take no parameters" +#~ msgstr "destruktionsfunktioner kan ikke have parametre" + +#~ msgid "destructor name `~%T' does not match type `%T' of expression" +#~ msgstr "destruktionsfunktionsnavn '~T' passer ikke med typen '%T' for udtrykket" + +#~ msgid "request for member `%D' in `%E', which is of non-aggregate type `%T'" +#~ msgstr "forespørgsel efter medlemmet '%D' i '%E' som er af en ikke-sammensat type '%T'" + +#~ msgid "request for member `%D' is ambiguous" +#~ msgstr "forespørgsel efter medlemmet '%D' er tvetydigt" + +#~ msgid "%s %D(%T, %T, %T) " +#~ msgstr "%s %D(%T, %T, %T) " + +#~ msgid "%s %D(%T, %T) " +#~ msgstr "%s %D(%T, %T) " + +#~ msgid "%s %D(%T) " +#~ msgstr "%s %D(%T) " + +#~ msgid "%s %T " +#~ msgstr "%s %T " + +#~ msgid "%s %+#D%s" +#~ msgstr "%s %+#D%s" + +#~ msgid "conversion from `%T' to `%T' is ambiguous" +#~ msgstr "konvertering fra '%T' til '%T' er tvetydigt" + +#~ msgid "incomplete type '%T' cannot be used to name a scope" +#~ msgstr "ufuldstændig type '%T' kan ikke bruges til at navngive et virkefelt" + +#~ msgid "'%D' has no member named '%E'" +#~ msgstr "'%D' har intet medlem ved navn '%E'" + +#~ msgid "no matching function for call to `%D(%A)'" +#~ msgstr "ingen passende funktion for kald til '%D(%A)'" + +#~ msgid "call of overloaded `%D(%A)' is ambiguous" +#~ msgstr "kald af flertydig '%D(%A)' er tvetydigt" + +#~ msgid "pointer-to-member function %E cannot be called without an object; consider using .* or ->*" +#~ msgstr "henvisning til medlemsfunktionen %E kan ikke kaldes uden et objekt; overvej at benytte .* eller ->*" + +#~ msgid "no match for call to `(%T) (%A)'" +#~ msgstr "ingen passende fundet for kald til '(%T) (%A)'" + +#~ msgid "call of `(%T) (%A)' is ambiguous" +#~ msgstr "kald af '(%T) (%A)' er tvetydigt" + +#~ msgid "%s for `%T ? %T : %T' operator" +#~ msgstr "%s for operatoren '%T ? %T : %T'" + +#~ msgid "%s for `%T %s' operator" +#~ msgstr "%s for operatoren '%T %s' " + +#~ msgid "%s for `%T [%T]' operator" +#~ msgstr "%s for operatoren '%T [%T]'" + +#~ msgid "%s for `%T %s %T' operator" +#~ msgstr "%s for operatoren '%T %s %T'" + +#~ msgid "%s for `%s %T' operator" +#~ msgstr "%s for operatoren '%s %T'" + +#~ msgid "ISO C++ forbids omitting the middle term of a ?: expression" +#~ msgstr "ISO C++ forbyder udeladelse af den mellemste del af et ?:-udtryk" + +#~ msgid "`%E' has type `void' and is not a throw-expression" +#~ msgstr "'%E' har typen 'void' og er ikke et throw-udtryk" + +#~ msgid "operands to ?: have different types" +#~ msgstr "operander til ?: har forskellige typer" + +#~ msgid "enumeral mismatch in conditional expression: `%T' vs `%T'" +#~ msgstr "enum-typer passer ikke sammen i betinget udtryk: '%T' og '%T'" + +#~ msgid "enumeral and non-enumeral type in conditional expression" +#~ msgstr "enum- og ikke enum-type i betinget udtryk" + +#~ msgid "`%D' must be declared before use" +#~ msgstr "'%D' skal erklæres før brug" + +#~ msgid "no `%D(int)' declared for postfix `%s', trying prefix operator instead" +#~ msgstr "ingen '%D(int)' erklæret for suffiks '%s', prøver præfiksoperatoren i stedet" + +#~ msgid "using synthesized `%#D' for copy assignment" +#~ msgstr "bruger syntetiseret '%#D' for kopitildeling" + +#~ msgid " where cfront would use `%#D'" +#~ msgstr " hvor cfront ville bruge '%#D'" + +#~ msgid "comparison between `%#T' and `%#T'" +#~ msgstr "sammenligning mellem '%#T' og '%#T'" + +#~ msgid "no suitable `operator delete' for `%T'" +#~ msgstr "ingen passende 'operator delete' for '%T'" + +#~ msgid "`%+#D' is private" +#~ msgstr "'%+#D' er privat" + +#~ msgid "`%+#D' is protected" +#~ msgstr "'%+#D' er beskyttet" + +#~ msgid "`%+#D' is inaccessible" +#~ msgstr "'%+#D' er ikke tilgængelig" + +#~ msgid "within this context" +#~ msgstr "i denne kontekst" + +#~ msgid "invalid conversion from `%T' to `%T'" +#~ msgstr "ugyldig konvertering fra '%T' til '%T'" + +#~ msgid " initializing argument %P of `%D'" +#~ msgstr " ved klargøring af parameteren %P til '%D'" + +#~ msgid " initializing argument %P of `%D' from result of `%D'" +#~ msgstr " ved klargøring af parameteren %P til '%D' fra resultatet af '%D'" + +#~ msgid " initializing temporary from result of `%D'" +#~ msgstr " ved klargøring af midlertidig variabel fra resultatet af '%D'" + +#~ msgid "cannot pass objects of non-POD type `%#T' through `...'; call will abort at runtime" +#~ msgstr "kan ikke videregive objekter af en ikke-POD type '%#T' gennem '...'; kald vil afbryde på kørselstidspunktet" + +#~ msgid "cannot receive objects of non-POD type `%#T' through `...'" +#~ msgstr "kan ikke modtage objekter af en ikke-POD type '%#T' gennem '...'" + +#~ msgid "passing `%T' as `this' argument of `%#D' discards qualifiers" +#~ msgstr "videregivelse af '%T' som 'this'-parameteren til '%#D' forkaster modifikationer" + +#~ msgid "could not find class$ field in java interface type `%T'" +#~ msgstr "kunne ikke finde et class$-felt i Java-grænsefladetypen '%T'" + +#~ msgid "call to non-function `%D'" +#~ msgstr "kald af ikke-funktion '%D'" + +#~ msgid "no matching function for call to `%T::%D(%A)%#V'" +#~ msgstr "ingen passende funktion for kald til '%T::%D(%A)%#V'" + +#~ msgid "cannot call member function `%D' without object" +#~ msgstr "kan ikke kalde medlemsfunktionen '%D' uden et objekt" + +#~ msgid "passing `%T' chooses `%T' over `%T'" +#~ msgstr "videregivelse af '%T' vælger '%T' frem for '%T'" + +#~ msgid " in call to `%D'" +#~ msgstr " i kald af '%D'" + +#~ msgid "choosing `%D' over `%D'" +#~ msgstr "vælger '%D' frem for '%D'" + +#~ msgid " for conversion from `%T' to `%T'" +#~ msgstr " for konvertering fra '%T' til '%T'" + +#~ msgid " because conversion sequence for the argument is better" +#~ msgstr " fordi konverteringssekvensen for parameteren er bedre" + +#~ msgid "ISO C++ says that `%D' and `%D' are ambiguous even though the worst conversion for the former is better than the worst conversion for the latter" +#~ msgstr "ifølge ISO C++ er '%D' og '%D' tvetydigt selvom den værste konvertering for førstnævnte er bedre end den værste konvertering for den sidstnævnte" + +#~ msgid "cannot convert from base `%T' to derived type `%T' via virtual base `%T'" +#~ msgstr "kan ikke konvertere fra stamklassen '%T' til den nedarvede type '%T' via den virtuelle stamklasse '%T'" + +#~ msgid "`%#D' and `%#D' cannot be overloaded" +#~ msgstr "'%#D' og '%#D' kan ikke flertydiggøres" + +#~ msgid "duplicate enum value `%D'" +#~ msgstr "enum-værdien '%D' optræder mere end én gang" + +#~ msgid "duplicate field `%D' (as enum and non-enum)" +#~ msgstr "feltet '%D' optræder mere end én gang (som enum og som ikke-enum)" + +#~ msgid "duplicate nested type `%D'" +#~ msgstr "den indlejrede type '%D' optræder mere end én gang" + +#~ msgid "duplicate field `%D' (as type and non-type)" +#~ msgstr "feltet '%D' optræder mere end én gang (som type og som ikke-type)" + +#~ msgid "duplicate member `%D'" +#~ msgstr "medlemmet '%D' optræder mere end én gang" + +#~ msgid "conflicting access specifications for method `%D', ignored" +#~ msgstr "modstridende tilgangsanvisninger til metoden '%D', ignoreret" + +#~ msgid "conflicting access specifications for field `%s', ignored" +#~ msgstr "modstridende tilgangsanvisninger til feltet '%s', ignoreret" + +#~ msgid "`%D' names constructor" +#~ msgstr "'%D' navngiver en konstruktionsfunktion" + +#~ msgid "`%D' invalid in `%T'" +#~ msgstr "'%D' ugyldig i '%T'" + +#~ msgid "no members matching `%D' in `%#T'" +#~ msgstr "ingen medlemmer passer til '%D' i '%#T'" + +#~ msgid "`%D' invalid in `%#T'" +#~ msgstr "'%D' ugyldig i '%#T'" + +#~ msgid " because of local method `%#D' with same name" +#~ msgstr " på grund af den lokale metode '%#D' med det samme navn" + +#~ msgid " because of local member `%#D' with same name" +#~ msgstr " på grund af det lokale medlem '%#D' med det samme navn" + +#~ msgid "base class `%#T' has a non-virtual destructor" +#~ msgstr "stamklassen '%#T' har en ikke-virtuel destruktionsfunktion" + +#~ msgid "base `%T' with only non-default constructor in class without a constructor" +#~ msgstr "stamklasse '%T' med kun ikke-standardkonstruktionsfunktion i klasse uden en konstruktionsfunktion" + +#~ msgid "all member functions in class `%T' are private" +#~ msgstr "alle medlemsfunktioner i klassen '%T' er private" + +#~ msgid "`%#T' only defines a private destructor and has no friends" +#~ msgstr "'%#T' definerer kun en privat destruktionsfunktion og har ingen venner" + +#~ msgid "`%#T' only defines private constructors and has no friends" +#~ msgstr "'%#T' definerer kun private konstruktionsfunktioner og har ingen venner" + +#~ msgid "redefinition of `%#T'" +#~ msgstr "omdefinering af '%#T'" + +#~ msgid "previous definition of `%#T'" +#~ msgstr "tidligere definition af '%#T'" + +# %D er en funktion +#~ msgid "no unique final overrider for `%D' in `%T'" +#~ msgstr "ingen unik endelig overskrivning af '%D' i '%T'" + +#~ msgid "`%D' was hidden" +#~ msgstr "'%D' var skjult" + +#~ msgid " by `%D'" +#~ msgstr " af '%D'" + +#~ msgid "ISO C++ forbids member `%D' with same name as enclosing class" +#~ msgstr "ISO C++ forbyder medlemmet '%D' med samme navn som den omgivende klasse" + +#~ msgid "`%#D' invalid; an anonymous union can only have non-static data members" +#~ msgstr "'%#D' er ugyldig; en anonym union kan kun have ikke-statiske datamedlemmer" + +#~ msgid "private member `%#D' in anonymous union" +#~ msgstr "privat medlem '%#D' i en anonym union" + +#~ msgid "protected member `%#D' in anonymous union" +#~ msgstr "beskyttet medlem '%#D' i en anonym union" + +#~ msgid "vtable layout for class `%T' may not be ABI-compliant and may change in a future version of GCC due to implicit virtual destructor" +#~ msgstr "vtable-layout for klassen '%T' følger ikke nødvendigvis ABI'et og kan ændre sig i en fremtidig version af GCC pga. underforstået virtuel destruktionsfunktion" + +#~ msgid "bit-field `%#D' with non-integral type" +#~ msgstr "bitfelt '%#D' med en ikke-heltalstype" + +#~ msgid "bit-field `%D' width not an integer constant" +#~ msgstr "bredden af bitfeltet '%D' er ikke en heltalskonstant" + +#~ msgid "negative width in bit-field `%D'" +#~ msgstr "negativ bredde i bitfeltet '%D'" + +#~ msgid "zero width for bit-field `%D'" +#~ msgstr "en bredde på nul for bitfeltet '%D'" + +#~ msgid "width of `%D' exceeds its type" +#~ msgstr "bredden af '%D' overstiger typen" + +#~ msgid "`%D' is too small to hold all values of `%#T'" +#~ msgstr "'%D' er for lille til at indeholde alle værdierne af '%#T'" + +#~ msgid "member `%#D' with constructor not allowed in union" +#~ msgstr "medlemmet '%#D' med en konstruktionsfunktion er ikke tilladt i en union" + +#~ msgid "member `%#D' with destructor not allowed in union" +#~ msgstr "medlemmet '%#D' med en destruktionsfunktion er ikke tilladt i en union" + +#~ msgid "member `%#D' with copy assignment operator not allowed in union" +#~ msgstr "medlemmet '%#D' med en kopitildelingsoperator er ikke tilladt i en union" + +#~ msgid "multiple fields in union `%T' initialized" +#~ msgstr "flere felter i union '%T' tildeles startværdi" + +#~ msgid "field `%D' in local class cannot be static" +#~ msgstr "feltet '%D' i lokal klasse kan ikke være statisk" + +#~ msgid "field `%D' invalidly declared function type" +#~ msgstr "feltet '%D' er på ugyldig vis erklæret som en funktionstype" + +#~ msgid "field `%D' invalidly declared method type" +#~ msgstr "feltet '%D' er på ugyldig vis erklæret som en medlemsfunktionstype" + +#~ msgid "field `%D' invalidly declared offset type" +#~ msgstr "feltet '%D' er på ugyldig vis erklæret som en afstandstype" + +#~ msgid "field `%D' declared static in union" +#~ msgstr "feltet '%D' er erklæret statisk i union" + +#~ msgid "non-static reference `%#D' in class without a constructor" +#~ msgstr "ikke-statisk reference '%#D' i klasse uden en konstruktionsfunktion" + +#~ msgid "non-static const member `%#D' in class without a constructor" +#~ msgstr "ikke-statisk konstant medlem '%#D' i klasse uden en konstruktionsfunktion" + +#~ msgid "field `%#D' with same name as class" +#~ msgstr "felt '%#D' med samme navn som klassen" + +#~ msgid "`%#T' has pointer data members" +#~ msgstr "'%#T' har henvisningsdatamedlemmer" + +#~ msgid " but does not override `%T(const %T&)'" +#~ msgstr " men overskriver ikke '%T(const %T&)'" + +#~ msgid " or `operator=(const %T&)'" +#~ msgstr " eller 'operator=(const %T&)'" + +#~ msgid " but does not override `operator=(const %T&)'" +#~ msgstr " men overskriver ikke 'operator=(const %T&)'" + +#~ msgid "offset of empty base `%T' may not be ABI-compliant and maychange in a future version of GCC" +#~ msgstr "afsættet for tom stamklasse '%T' følger ikke nødvendigvis ABI'en og kan ændre sig i en fremtidig version af GCC" + +#~ msgid "class `%T' will be considered nearly empty in a future version of GCC" +#~ msgstr "klassen '%T' vil blive betragtet som næsten tom i en fremtidig version af GCC" + +#~ msgid "initializer specified for non-virtual method `%D'" +#~ msgstr "startværdi angivet for ikke-virtuel medlemsfunktion '%D'" + +#~ msgid "offset of virtual base `%T' is not ABI-compliant and may change in a future version of GCC" +#~ msgstr "afsættet for virtuel stamklasse '%T' følger ikke ABI'en og kan ændre sig i en fremtidig version af GCC" + +#~ msgid "direct base `%T' inaccessible in `%T' due to ambiguity" +#~ msgstr "direkte stamklasse '%T' er ikke tilgængelig i '%T' på grund af tvetydighed" + +#~ msgid "virtual base `%T' inaccessible in `%T' due to ambiguity" +#~ msgstr "virtuel stamklasse '%T' er ikke tilgængelig i '%T' på grund af tvetydighed" + +#~ msgid "size assigned to `%T' may not be ABI-compliant and may change in a future version of GCC" +#~ msgstr "størrelsen der bliver tildelt '%T' følger ikke nødvendigvis ABI'en og kan ændre sig i en fremtidig version af GCC" + +#~ msgid "offset of `%D' is not ABI-compliant and may change in a future version of GCC" +#~ msgstr "afsættet for '%D' følger ikke ABI'en og kan ændre sig i en fremtidig version af GCC" + +#~ msgid "`%D' contains empty classes which may cause base classes to be placed at different locations in a future version of GCC" +#~ msgstr "'%D' indeholder tomme klasser hvad der kan få stamklasser til at blive placeret andre steder i en fremtidig version af GCC" + +#~ msgid "layout of classes derived from empty class `%T' may change in a future version of GCC" +#~ msgstr "layoutet af klasser der nedarver fra den tomme klasse '%T' kan ændre sig i en fremtidig version af GCC" + +#~ msgid "`%#T' has virtual functions but non-virtual destructor" +#~ msgstr "'%#T' har virtuelle funktioner, men ikke-virtuel destruktionsfunktion" + +#~ msgid "trying to finish struct, but kicked out due to previous parse errors" +#~ msgstr "forsøgte at afslutte struct, men blev stoppet af tidligere fortolkningsfejl" + +#~ msgid "language string `\"%s\"' not recognized" +#~ msgstr "sprogstrengen '\"%s\"' ikke genkendt" + +#~ msgid "cannot resolve overloaded function `%D' based on conversion to type `%T'" +#~ msgstr "kan ikke benytte den flertydiggjorte funktion '%D' baseret på konvertering til typen '%T'" + +#~ msgid "no matches converting function `%D' to type `%#T'" +#~ msgstr "ingen passende ved konvertering af funktionen '%D' til typen '%#T'" + +#~ msgid "converting overloaded function `%D' to type `%#T' is ambiguous" +#~ msgstr "konvertering af den flertydiggjorte funktion '%D' til typen '%T' er tvetydig" + +#~ msgid "assuming pointer to member `%D'" +#~ msgstr "antager henvisning til medlemmet '%D'" + +#~ msgid "(a pointer to member can only be formed with `&%E')" +#~ msgstr "(en henvisning til medlem kan kun dannes med '&%E')" + +#~ msgid "not enough type information" +#~ msgstr "ikke tilstrækkelig information om typen" + +#~ msgid "argument of type `%T' does not match `%T'" +#~ msgstr "parameter af typen '%T' passer ikke til '%T'" + +#~ msgid "invalid operation on uninstantiated type" +#~ msgstr "ugyldig operation på uudskiftet type" + +#~ msgid "declaration of `%#D'" +#~ msgstr "omerklæring af '%#D'" + +#~ msgid "changes meaning of `%D' from `%+#D'" +#~ msgstr "skifter betydningen af '%D' fra '%+#D'" + +#~ msgid "can't convert from incomplete type `%T' to `%T'" +#~ msgstr "kan ikke konvertere fra ufuldstændig type '%T' til '%T'" + +#~ msgid "conversion of `%E' from `%T' to `%T' is ambiguous" +#~ msgstr "konvertering af '%E' fra '%T' til '%T' er tvetydigt" + +#~ msgid "converting from `%T' to `%T'" +#~ msgstr "konvertering fra '%T' til '%T'" + +#~ msgid "pointer to member cast from `%T' to `%T' is via virtual base" +#~ msgstr "typekonvertering af henvisning til medlem fra '%T' til '%T' er via virtuel stamklasse" + +#~ msgid "cannot convert `%E' from type `%T' to type `%T'" +#~ msgstr "kan ikke konvertere '%E' fra typen '%T' til typen '%T'" + +#~ msgid "invalid conversion from '%T' to '%T'" +#~ msgstr "ugyldig konvertering fra '%T' til '%T'" + +#~ msgid "conversion from `%T' to `%T' discards qualifiers" +#~ msgstr "konvertering fra '%T' til '%T' forkaster modifikationer" + +#~ msgid "casting `%T' to `%T' does not dereference pointer" +#~ msgstr "typeomtvingning af '%T' til '%T' følger ikke henvisning" + +#~ msgid "cannot convert type `%T' to type `%T'" +#~ msgstr "kan ikke konvertere typen '%T' til typen '%T'" + +#~ msgid "conversion from `%#T' to `%#T'" +#~ msgstr "konvertering fra '%#T' til '%#T'" + +#~ msgid "`%#T' used where a `%T' was expected" +#~ msgstr "'%#T' benyttet hvor '%T' var forventet" + +#~ msgid "the address of `%D', will always be `true'" +#~ msgstr "adressen af '%D' vil altid være 'true'" + +#~ msgid "`%#T' used where a floating point value was expected" +#~ msgstr "'%#T' benyttet hvor der forventedes en kommatalsværdi" + +#~ msgid "conversion from `%T' to non-scalar type `%T' requested" +#~ msgstr "konvertering fra '%T' til en ikke-skalartype '%T' udbedt" + +#~ msgid "object of incomplete type `%T' will not be accessed in %s" +#~ msgstr "objekt af den ufuldstændige type '%T' vil ikke blive tilgået i %s" + +#~ msgid "object of type `%T' will not be accessed in %s" +#~ msgstr "objekt af typen '%T' vil ikke blive tilgået i %s" + +#~ msgid "object `%E' of incomplete type `%T' will not be accessed in %s" +#~ msgstr "objektet '%E' af den ufuldstændige type '%T' vil ikke blive tilgået i %s" + +#~ msgid "%s cannot resolve address of overloaded function" +#~ msgstr "%s kan ikke finde adressen af flertydiggjort funktion" + +#~ msgid "%s is a reference, not call, to function `%E'" +#~ msgstr "%s er en reference til og ikke et kald af funktionen '%E'" + +#~ msgid "ambiguous default type conversion from `%T'" +#~ msgstr "tvetydig standardtypekonvertering fra '%T'" + +#~ msgid " candidate conversions include `%D' and `%D'" +#~ msgstr " kandidater til konverteringen inkluderer '%D' og '%D'" + +#~ msgid "conflicts with previous declaration `%#D'" +#~ msgstr "strider mod tidligere erklæring '%#D'" + +#~ msgid "label `%D' used but not defined" +#~ msgstr "etiketten '%D' er benyttet, men ikke defineret" + +#~ msgid "label `%D' defined but not used" +#~ msgstr "etiketten '%D' er defineret, men ikke benyttet" + +#~ msgid "namespace alias `%D' not allowed here, assuming `%D'" +#~ msgstr "navnerumsalias '%D' er ikke tilladt her, antager '%D'" + +#~ msgid "previous declaration of `%D'" +#~ msgstr "'%D' er tidligere erklæret" + +#~ msgid "shadowing %s function `%#D'" +#~ msgstr "skygger for en %s-funktion '%#D'" + +#~ msgid "library function `%#D' redeclared as non-function `%#D'" +#~ msgstr "biblioteksfunktionen '%#D' er omerklæret som '%#D' der ikke er en funktion" + +#~ msgid "conflicts with built-in declaration `%#D'" +#~ msgstr "strider mod indbygget erklæring '%#D'" + +# følges af næste tekst +#~ msgid "new declaration `%#D'" +#~ msgstr "ny erklæring af '%#D'" + +#~ msgid "ambiguates built-in declaration `%#D'" +#~ msgstr "tvetydiggør indbygget erklæring '%#D'" + +#~ msgid "`%#D' redeclared as different kind of symbol" +#~ msgstr "'%#D' omerklæret som en anden form for symbol" + +#~ msgid "previous declaration of `%#D'" +#~ msgstr "tidligere erklæring af '%#D'" + +#~ msgid "declaration of template `%#D'" +#~ msgstr "erklæring af skabelon '%#D'" + +#~ msgid "ambiguates old declaration `%#D'" +#~ msgstr "tvetydiggør tidligere erklæring '%#D'" + +#~ msgid "declaration of C function `%#D' conflicts with" +#~ msgstr "erklæring af C-funktionen '%#D' strider mod" + +#~ msgid "previous declaration `%#D' here" +#~ msgstr "tidligere erklæring af '%#D' her" + +#~ msgid "conflicting types for `%#D'" +#~ msgstr "modstridende typer for '%#D'" + +#~ msgid "previous declaration as `%#D'" +#~ msgstr "tidligere erklæring som '%#D'" + +#~ msgid "`%#D' previously defined here" +#~ msgstr "'%#D' tidligere defineret her" + +#~ msgid "`%#D' previously declared here" +#~ msgstr "'%#D' tidligere erklæret her" + +#~ msgid "prototype for `%#D'" +#~ msgstr "prototypen for '%#D'" + +#~ msgid "follows non-prototype definition here" +#~ msgstr "følger definition uden prototype her" + +#~ msgid "previous declaration of `%#D' with %L linkage" +#~ msgstr "tidligere erklæring af '%#D' med %L-kædning" + +#~ msgid "conflicts with new declaration with %L linkage" +#~ msgstr "strider mod ny erklæring af med %L-kædning" + +#~ msgid "default argument given for parameter %d of `%#D'" +#~ msgstr "standardparameter givet til %d. parameter for '%#D'" + +#~ msgid "after previous specification in `%#D'" +#~ msgstr "efter tidligere specifikation i '%#D'" + +#~ msgid "`%#D' was used before it was declared inline" +#~ msgstr "'%#D' blev brugt før erklæring som inline" + +#~ msgid "previous non-inline declaration here" +#~ msgstr "tidligere ikke-inline erklæring her" + +#~ msgid "redundant redeclaration of `%D' in same scope" +#~ msgstr "overflødig omerklæring af '%D' i samme virkefelt" + +#~ msgid "declaration of `%F' throws different exceptions" +#~ msgstr "erklæring af '%F' kaster forskellige undtagelser" + +#~ msgid "than previous declaration `%F'" +#~ msgstr "end tidligere erklæring '%F'" + +#~ msgid "explicit specialization of %D after first use" +#~ msgstr "eksplicit specialisering af %D efter første brug" + +#~ msgid "`%#D' used prior to declaration" +#~ msgstr "'%#D' benyttet før erklæring" + +#~ msgid "redeclaration of `wchar_t' as `%T'" +#~ msgstr "omerklæring af 'wchar_t' som '%T'" + +#~ msgid "invalid redeclaration of `%D'" +#~ msgstr "ugyldig omerklæring af '%D'" + +#~ msgid "as `%D'" +#~ msgstr "som '%D'" + +#~ msgid "previous external decl of `%#D'" +#~ msgstr "tidligere ekstern erklæring af '%#D'" + +#~ msgid "`%D' was previously implicitly declared to return `int'" +#~ msgstr "'%D' blev tidligere underforstået erklæret til at returnere 'int'" + +#~ msgid "extern declaration of `%#D' doesn't match" +#~ msgstr "extern-erklæring af '%#D' passer ikke med" + +#~ msgid "global declaration `%#D'" +#~ msgstr "global erklæring '%#D'" + +#~ msgid "declaration of `%#D' shadows a parameter" +#~ msgstr "erklæring af '%#D' skygger for en parameter" + +#~ msgid "declaration of `%s' shadows a member of `this'" +#~ msgstr "erklæring af '%s' skygger for et medlem af 'this'" + +#~ msgid "`%#D' hides constructor for `%#T'" +#~ msgstr "'%#D' skjuler konstruktionsfunktion for '%#T'" + +#~ msgid "`%#D' conflicts with previous using declaration `%#D'" +#~ msgstr "'%#D' strider mod tidligere using-erklæring '%#D'" + +#~ msgid "previous non-function declaration `%#D'" +#~ msgstr "tidligere ikke-funktionserklæring '%#D'" + +#~ msgid "conflicts with function declaration `%#D'" +#~ msgstr "strider mod funktionserklæring '%#D'" + +#~ msgid "implicit declaration of function `%#D'" +#~ msgstr "underforstået erklæring af funktionen '%#D'" + +#~ msgid "label `%s' referenced outside of any function" +#~ msgstr "der er blevet henvist til etiketten '%s' uden for en funktion" + +#~ msgid "jump to label `%D'" +#~ msgstr "spring til etiketten '%D' " + +#~ msgid "jump to case label" +#~ msgstr "spring til case-etiket" + +#~ msgid " crosses initialization of `%#D'" +#~ msgstr " krydser klargøring af '%#D'" + +#~ msgid " enters scope of non-POD `%#D'" +#~ msgstr " går ind i virkefelt af ikke-POD '%#D'" + +#~ msgid " enters try block" +#~ msgstr " går ind i try-blok" + +#~ msgid " enters catch block" +#~ msgstr " går ind i catch-blok" + +#~ msgid " from here" +#~ msgstr " herfra" + +#~ msgid " skips initialization of `%#D'" +#~ msgstr " springer over klargøring af '%#D'" + +#~ msgid "label named wchar_t" +#~ msgstr "etiket med navnet wchar_t" + +#~ msgid "duplicate label `%D'" +#~ msgstr "etiketten '%D' optræder mere end én gang" + +#~ msgid "case label `%E' not within a switch statement" +#~ msgstr "case-etiket '%E' befinder sig ikke inden i en switch-sætning" + +#~ msgid "`%#D' redeclared as %C" +#~ msgstr "'%#D' omerklæret som %C" + +#~ msgid "invalid use of `%D'" +#~ msgstr "ugyldig brug af '%D" + +#~ msgid "`%D::%D' is not a template" +#~ msgstr "'%D::%D' er ikke en skabelon" + +#~ msgid "`%D' undeclared in namespace `%D'" +#~ msgstr "'%D' ikke erklæret i navnerummet '%D'" + +#~ msgid "`%D' used without template parameters" +#~ msgstr "'%D' benyttet uden skabelonsparametre" + +#~ msgid "no class template named `%#T' in `%#T'" +#~ msgstr "ingen klasseskabelon ved navn '%#T' i '%#T'" + +#~ msgid "no type named `%#T' in `%#T'" +#~ msgstr "ingen type ved navn '%#T' i '%#T'" + +#~ msgid "lookup of `%D' finds `%#D'" +#~ msgstr "opslag af '%D' finder '%#D'" + +#~ msgid " instead of `%D' from dependent base class" +#~ msgstr " i stedet for '%D' fra afhængig stamklasse" + +#~ msgid " (use `typename %T::%D' if that's what you meant)" +#~ msgstr " (benyt 'typename %T::%D' hvis det er hvad du mener)" + +#~ msgid "name lookup of `%D' changed" +#~ msgstr "navneopslag for '%D' ændret" + +#~ msgid " matches this `%D' under ISO standard rules" +#~ msgstr " passer med '%D' under ISO-standardreglerne" + +#~ msgid " matches this `%D' under old rules" +#~ msgstr " passer med '%D' under tidligere regler" + +#~ msgid "name lookup of `%D' changed for new ISO `for' scoping" +#~ msgstr "navneopslaget af '%D' er ændret til ISO 'for'-virkefelt" + +#~ msgid " cannot use obsolete binding at `%D' because it has a destructor" +#~ msgstr " kan ikke bruge forældet binding til '%D' fordi den har en destruktionsfunktion" + +#~ msgid " using obsolete binding at `%D'" +#~ msgstr " bruger forældet binding til '%D'" + +#~ msgid "lookup of `%D' in the scope of `%#T' (`%#D') does not match lookup in the current scope (`%#D')" +#~ msgstr "opslag af '%D' i virkefeltet for '%#T' ('%#D') passer ikke med opslaget i det aktuelle virkefelt ('%#D')" + +#~ msgid "an anonymous union cannot have function members" +#~ msgstr "en anonym union kan ikke have funktionsmedlemmer" + +#~ msgid "member %#D' with constructor not allowed in anonymous aggregate" +#~ msgstr "medlemmet '%#D' med konstruktionsfunktion er ikke tilladt i anonym sammensat type" + +#~ msgid "member %#D' with destructor not allowed in anonymous aggregate" +#~ msgstr "medlemmet '%#D' med destruktionsfunktion er ikke tilladt i anonym sammensat type" + +#~ msgid "member %#D' with copy assignment operator not allowed in anonymous aggregate" +#~ msgstr "medlemmet '%#D' med kopitildelingsoperator er ikke tilladt i anonym sammensat type" + +#~ msgid "redeclaration of C++ built-in type `%T'" +#~ msgstr "omerklæring af indbygget type i C++ '%T'" + +#~ msgid "multiple types in one declaration" +#~ msgstr "flere typer i én erklæring" + +#~ msgid "missing type-name in typedef-declaration" +#~ msgstr "manglende typenavn i typedef-erklæring" + +#~ msgid "ISO C++ prohibits anonymous structs" +#~ msgstr "ISO C++ forbyder anonyme strukturer" + +#~ msgid "`%D' can only be specified for functions" +#~ msgstr "'%D' kan kun angives for funktioner" + +#~ msgid "`%D' can only be specified inside a class" +#~ msgstr "'%D' kan kun angives inden i en klasse" + +#~ msgid "`%D' can only be specified for constructors" +#~ msgstr "'%D' kan kun angives for konstruktionsfunktioner" + +#~ msgid "`%D' can only be specified for objects and functions" +#~ msgstr "'%D' kan kun angives for objekter og funktioner" + +# init dækker over værditildeling her - samme for de næste mange +#~ msgid "typedef `%D' is initialized (use __typeof__ instead)" +#~ msgstr "typedef '%D' bliver tildelt en værdi (benyt __typeof__ i stedet)" + +#~ msgid "function `%#D' is initialized like a variable" +#~ msgstr "funktionen '%#D' bliver tildelt en startværdi som en variabel" + +#~ msgid "declaration of `%#D' has `extern' and is initialized" +#~ msgstr "erklæringen af '%#D' indeholder 'extern' og variablen bliver tildelt en startværdi" + +#~ msgid "`%#D' is not a static member of `%#T'" +#~ msgstr "'%#D' er ikke et statisk medlem af '%#T'" + +#~ msgid "ISO C++ does not permit `%T::%D' to be defined as `%T::%D'" +#~ msgstr "ISO C++ tillader ikke '%T::%D' at blive defineret som '%T::%D'" + +#~ msgid "duplicate initialization of %D" +#~ msgstr "%D tildelt startværdi mere end én gang" + +#~ msgid "declaration of `%#D' outside of class is not definition" +#~ msgstr "erklæring af '%#D' uden for en klasse er ikke en definition" + +#~ msgid "variable `%#D' has initializer but incomplete type" +#~ msgstr "variablen '%#D' bliver tildelt en startværdi, men er af en ufuldstændig type" + +#~ msgid "elements of array `%#D' have incomplete type" +#~ msgstr "elementer i tabellen '%#D' er af en ufuldstændig type" + +#~ msgid "aggregate `%#D' has incomplete type and cannot be defined" +#~ msgstr "den sammensatte type '%#D' er af en ufuldstændig type og kan ikke defineres" + +#~ msgid "`%D' declared as reference but not initialized" +#~ msgstr "'%D' erklæret som en reference, men bliver ikke tildelt en startværdi" + +#~ msgid "ISO C++ forbids use of initializer list to initialize reference `%D'" +#~ msgstr "ISO C++ forbyder brug af en startværdiliste til at klargøre referencen '%D'" + +#~ msgid "cannot initialize `%T' from `%T'" +#~ msgstr "kan ikke klargøre '%T' fra %T'" + +#~ msgid "initializer fails to determine size of `%D'" +#~ msgstr "startværdien giver ikke størrelsen af '%D'" + +#~ msgid "array size missing in `%D'" +#~ msgstr "tabelstørrelsen mangler i '%D'" + +#~ msgid "zero-size array `%D'" +#~ msgstr "nulstørrelsestabel '%D'" + +#~ msgid "storage size of `%D' isn't known" +#~ msgstr "lagringsstørrelsen af '%D' er ikke kendt" + +#~ msgid "storage size of `%D' isn't constant" +#~ msgstr "lagringsstørrelsen af '%D' er ikke konstant" + +#~ msgid "sorry: semantics of inline function static data `%#D' are wrong (you'll wind up with multiple copies)" +#~ msgstr "semantikken for indlejret funktionsstatisk data '%#D' er forkert (du ender med flere kopier)" + +#~ msgid " you can work around this by removing the initializer" +#~ msgstr " du kan arbejde dig rundt om dette ved at fjerne startværdien" + +#~ msgid "uninitialized const `%D'" +#~ msgstr "konstant '%D' uden startværdi" + +#~ msgid "brace-enclosed initializer used to initialize `%T'" +#~ msgstr "startværdi i krøllede paranteser benyttet til at klargøre '%T'" + +#~ msgid "initializer for `%T' must be brace-enclosed" +#~ msgstr "startværdi for '%T' skal være indesluttet i krøllede paranteser" + +#~ msgid "ISO C++ does not allow designated initializers" +#~ msgstr "ISO C++ tillader ikke udpegede startværdier" + +#~ msgid "`%T' has no non-static data member named `%D'" +#~ msgstr "'%T' har intet ikke-statisk medlem ved navn '%D'" + +#~ msgid "too many initializers for `%T'" +#~ msgstr "for mange startværdier for '%T'" + +#~ msgid "variable-sized object `%D' may not be initialized" +#~ msgstr "objektet '%D' af variabel størrelse må ikke tildeles en startværdi" + +#~ msgid "`%D' has incomplete type" +#~ msgstr "'%D' er af en ufuldstændig type" + +#~ msgid "`%D' must be initialized by constructor, not by `{...}'" +#~ msgstr "'%D' skal klargøres af en konstruktionsfunktion, ikke af '{...}'" + +#~ msgid "structure `%D' with uninitialized const members" +#~ msgstr "struktur '%D' med konstante medlemmer uden startværdi" + +#~ msgid "structure `%D' with uninitialized reference members" +#~ msgstr "struktur '%D' med referencemedlemmer uden startværdi" + +#~ msgid "assignment (not initialization) in declaration" +#~ msgstr "tildeling (ikke klargøring) i erklæring" + +#~ msgid "cannot initialize `%D' to namespace `%D'" +#~ msgstr "kan ikke tildele startværdi til '%D' med navnerummet '%D'" + +#~ msgid "shadowing previous type declaration of `%#D'" +#~ msgstr "skygger for tidligere typeerklæring af '%#D'" + +#~ msgid "`%D' cannot be thread-local because it has non-POD type `%T'" +#~ msgstr "'%D' kan ikke være trådlokal eftersom den er af en ikke-POD type '%T'" + +#~ msgid "`%D' is thread-local and so cannot be dynamically initialized" +#~ msgstr "'%D' er trådlokal og kan derfor ikke blive tildelt en startværdi dynamisk" + +#~ msgid "multiple initializations given for `%D'" +#~ msgstr "flere startværdier angivet for '%D'" + +#~ msgid "invalid catch parameter" +#~ msgstr "ugyldig catch-parameter" + +#~ msgid "destructor for alien class `%T' cannot be a member" +#~ msgstr "destruktionsfunktionen for den fremmede klasse '%T' kan ikke være et medlem" + +#~ msgid "constructor for alien class `%T' cannot be a member" +#~ msgstr "konstruktionsfunktionen for den fremmede klasse '%T' kan ikke være et medlem" + +#~ msgid "`%D' declared as a `virtual' %s" +#~ msgstr "'%D' erklæret som 'virtual' %s" + +#~ msgid "`%D' declared as an `inline' %s" +#~ msgstr "'%D' erklæret som 'inline' %s" + +# %s bliver omsat til typen +#~ msgid "`const' and `volatile' function specifiers on `%D' invalid in %s declaration" +#~ msgstr "'const'- og 'volatile'-funktionsangivelser til '%D' er ugyldigt i erklæring af %s" + +#~ msgid "`%D' declared as a friend" +#~ msgstr "'%D' er erklæret som en ven" + +#~ msgid "`%D' declared with an exception specification" +#~ msgstr "'%D' erklæret med en undtagelsesspecifikation" + +#~ msgid "cannot declare `::main' to be a template" +#~ msgstr "kan ikke erklære '::main' som en skabelon" + +#~ msgid "cannot declare `::main' to be inline" +#~ msgstr "kan ikke erklære '::main' som indlejret" + +#~ msgid "cannot declare `::main' to be static" +#~ msgstr "kan ikke erklære '::main' som statisk" + +#~ msgid "`main' must return `int'" +#~ msgstr "'main' skal returnere typen 'int'" + +#~ msgid "non-local function `%#D' uses anonymous type" +#~ msgstr "ikke-lokal funktion '%#D' bruger anonym type" + +#~ msgid "`%#D' does not refer to the unqualified type, so it is not used for linkage" +#~ msgstr "'%#D' refererer ikke til den ikkemodificerede type, so den bruges ikke til sammenkædning" + +#~ msgid "non-local function `%#D' uses local type `%T'" +#~ msgstr "ikke-lokal funktion '%#D' bruger lokal type '%T'" + +#~ msgid "%smember function `%D' cannot have `%T' method qualifier" +#~ msgstr "%smedlemsfunktion '%D' kan ikke have metodemodifikationen '%T'" + +#~ msgid "defining explicit specialization `%D' in friend declaration" +#~ msgstr "definering af eksplicit specialisering '%D' i friend-erklæring" + +#~ msgid "invalid use of template-id `%D' in declaration of primary template" +#~ msgstr "ugyldig brug af skabelons-id '%D' i erklæring af primær skabelon" + +#~ msgid "default arguments are not allowed in declaration of friend template specialization `%D'" +#~ msgstr "standardparametre er ikke tilladt i erklæring af venneskabelonsspecialisering '%D'" + +#~ msgid "`inline' is not allowed in declaration of friend template specialization `%D'" +#~ msgstr "'inline' er ikke tilladt i erklæring venneskabelonsspecialisering '%D'" + +#~ msgid "definition of implicitly-declared `%D'" +#~ msgstr "definition af underforstået-erklæret '%D'" + +#~ msgid "no `%#D' member function declared in class `%T'" +#~ msgstr "ingen medlemsfunktion '%#D' erklæret i klassen '%T'" + +#~ msgid "non-local variable `%#D' uses local type `%T'" +#~ msgstr "ikke-lokal variabel '%#D' bruger lokal type '%T'" + +#~ msgid "invalid in-class initialization of static data member of non-integral type `%T'" +#~ msgstr "ugyldig tildeling af startværdi i klasse til statisk datamedlem af en ikke-heltalstype '%T'" + +#~ msgid "ISO C++ forbids in-class initialization of non-const static member `%D'" +#~ msgstr "ISO C++ forbyder tildeling af startværdi i klasse til ikke-konstant statisk medlem '%D'" + +#~ msgid "ISO C++ forbids initialization of member constant `%D' of non-integral type `%T'" +#~ msgstr "ISO C++ forbyder tildeling af startværdi til medlemskonstant '%D' af en ikke-heltallig type" + +#~ msgid "size of array `%D' has non-integer type" +#~ msgstr "størrelsen af tabellen '%D' er ikke af en heltalstype" + +#~ msgid "size of array has non-integer type" +#~ msgstr "størrelsen af tabel er ikke af en heltalstype" + +#~ msgid "size of array `%D' is negative" +#~ msgstr "størrelsen af tabellen '%D' er negativ" + +#~ msgid "size of array is negative" +#~ msgstr "størrelsen af tabel er negativ" + +#~ msgid "ISO C++ forbids zero-size array `%D'" +#~ msgstr "ISO C++ forbyder tabellen '%D' med størrelsen nul" + +#~ msgid "ISO C++ forbids zero-size array" +#~ msgstr "ISO C++ forbyder tabel med størrelsen nul" + +#~ msgid "size of array `%D' is not an integral constant-expression" +#~ msgstr "størrelsen af tabellen '%D' er ikke af et heltalligt konstantudtryk" + +#~ msgid "size of array is not an integral constant-expression" +#~ msgstr "størrelsen af tabel er ikke af et heltalligt konstantudtryk" + +#~ msgid "ISO C++ forbids variable-size array `%D'" +#~ msgstr "ISO C++ forbyder tabellen '%D' med variabel størrelse" + +#~ msgid "ISO C++ forbids variable-size array" +#~ msgstr "ISO C++ forbyder tabel med variabel størrelse" + +#~ msgid "overflow in array dimension" +#~ msgstr "tabeldimension for stor" + +#~ msgid "declaration of `%D' as %s" +#~ msgstr "erklæring af '%D' som %s" + +#~ msgid "creating %s" +#~ msgstr "opretter %s" + +#~ msgid "declaration of `%D' as multidimensional array must have bounds for all dimensions except the first" +#~ msgstr "erklæring af '%D' som flerdimensional tabel skal have grænser for alle dimensioner pånær den første" + +#~ msgid "multidimensional array must have bounds for all dimensions except the first" +#~ msgstr "flerdimensional tabel skal have grænser for alle dimensioner pånær den første" + +#~ msgid "return type specification for constructor invalid" +#~ msgstr "angivelse af returneringstypen til konstruktionsfunktion er ugyldigt" + +#~ msgid "return type specification for destructor invalid" +#~ msgstr "angivelse af returneringstypen til destruktionsfunktion er ugyldigt" + +#~ msgid "operator `%T' declared to return `%T'" +#~ msgstr "operator '%T' erklæret til at returnere '%T'" + +#~ msgid "return type specified for `operator %T'" +#~ msgstr "returtype angivet for 'operator %T'" + +#~ msgid "destructors must be member functions" +#~ msgstr "destruktionsfunktioner skal være medlemmer" + +#~ msgid "destructor `%T' must match class name `%T'" +#~ msgstr "destruktionsfunktion '%T' skal passe til klassenavnet '%T'" + +#~ msgid "variable declaration is not allowed here" +#~ msgstr "variabelerklæring er ikke tilladt her" + +#~ msgid "invalid declarator" +#~ msgstr "ugyldig erklærer" + +#~ msgid "declarator-id missing; using reserved word `%D'" +#~ msgstr "erklærer-id mangler; bruger reserveret ord '%D'" + +#~ msgid "type `%T' is not derived from type `%T'" +#~ msgstr "typen '%T' er ikke nedarvet fra typen '%T'" + +#~ msgid "`%T' specified as declarator-id" +#~ msgstr "'%T' angivet som erklærer-id" + +#~ msgid " perhaps you want `%T' for a constructor" +#~ msgstr " måske ønsker du '%T' for en konstruktionsfunktion" + +#~ msgid "invalid use of template-name '%E' in a declarator" +#~ msgstr "ugyldig brug af skabelonsnavn '%E' i erklæring" + +#~ msgid "declaration of `%D' as non-function" +#~ msgstr "erklæring af '%D' som ikke-funktion" + +#~ msgid "`bool' is now a keyword" +#~ msgstr "'bool' er et reserveret ord" + +#~ msgid "extraneous `%T' ignored" +#~ msgstr "overflødig '%T' ignoreret" + +#~ msgid "multiple declarations `%T' and `%T'" +#~ msgstr "flere erklæringer '%T' og '%T'" + +#~ msgid "ISO C++ does not support `long long'" +#~ msgstr "ISO C++ understøtter ikke 'long long'" + +#~ msgid "ISO C++ forbids declaration of `%s' with no type" +#~ msgstr "ISO C++ forbyder erklæring af '%s' uden en type" + +#~ msgid "`%T' is implicitly a typename" +#~ msgstr "'%T' er underforstået et typenavn" + +#~ msgid "short, signed or unsigned invalid for `%s'" +#~ msgstr "short, signed eller unsigned er ugyldig for '%s'" + +#~ msgid "long and short specified together for `%s'" +#~ msgstr "long og short er begge angivet for '%s'" + +#~ msgid "signed and unsigned given together for `%s'" +#~ msgstr "signed og unsigned er begge angivet for '%s'" + +#~ msgid "qualifiers are not allowed on declaration of `operator %T'" +#~ msgstr "modifikationer er ikke tilladt i erklæring af 'operator %T'" + +#~ msgid "member `%D' cannot be declared both virtual and static" +#~ msgstr "medlemmet '%D' kan ikke afklæres både virtual og static" + +#~ msgid "storage class specifiers invalid in parameter declarations" +#~ msgstr "lagringsklasseanvisninger er ugyldige i parametererklæringer" + +#~ msgid "typedef declaration invalid in parameter declaration" +#~ msgstr "typedef-erklæringer er ugyldig i parametererklæringer" + +#~ msgid "virtual outside class declaration" +#~ msgstr "virtual angivet uden for klasseerklæring" + +#~ msgid "storage class specified for %s `%s'" +#~ msgstr "lagringsklasse angivet for %s '%s'" + +#~ msgid "storage class specifiers invalid in friend function declarations" +#~ msgstr "lagringsklasseanvisninger er ugyldige i vennefunktionserklæringer" + +#~ msgid "destructor cannot be static member function" +#~ msgstr "destruktionsfunktionen kan ikke være en statisk medlemsfunktion" + +#~ msgid "destructors may not be `%s'" +#~ msgstr "destruktionsfunktioner må ikke være '%s'" + +#~ msgid "constructor cannot be static member function" +#~ msgstr "konstruktionsfunktionen kan ikke være en statisk medlemsfunktion" + +#~ msgid "constructors cannot be declared virtual" +#~ msgstr "konstruktionsfunktioner kan ikke erklæres virtual" + +#~ msgid "constructors may not be `%s'" +#~ msgstr "konstruktionsfunktioner må ikke være '%s'" + +#~ msgid "return value type specifier for constructor ignored" +#~ msgstr "angivelse af typen af returværdien til konstruktionsfunktionen ignoreret" + +#~ msgid "can't initialize friend function `%s'" +#~ msgstr "kan ikke tildele en startværdi til vennefunktionen '%s'" + +#~ msgid "virtual functions cannot be friends" +#~ msgstr "en virtuel funktion kan ikke erklæres som friend" + +#~ msgid "friend declaration not in class definition" +#~ msgstr "friend-erklæringen er ikke i klassedefinitionen" + +#~ msgid "can't define friend function `%s' in a local class definition" +#~ msgstr "kan ikke definere vennefunktion '%s' i en lokal klassedefinition" + +#~ msgid "destructors may not have parameters" +#~ msgstr "destruktionsfunktioner må ikke have parametre" + +#~ msgid "cannot declare reference to `%#T'" +#~ msgstr "kan ikke erklære reference til '%#T'" + +#~ msgid "cannot declare pointer to `%#T'" +#~ msgstr "kan ikke erklære henvisning til '%#T'" + +#~ msgid "cannot declare pointer to `%#T' member" +#~ msgstr "kan ikke erklære henvisning til medlemmet '%#T'" + +#~ msgid "extra qualification `%T::' on member `%s' ignored" +#~ msgstr "ekstra modifikation '%T::' af medlemmet '%s' ignoreret" + +#~ msgid "cannot declare member function `%T::%s' within `%T'" +#~ msgstr "kan ikke erklære medlemsfunktion '%T::%s' inde i '%T'" + +#~ msgid "cannot declare member `%T::%s' within `%T'" +#~ msgstr "kan ikke erklære medlem '%T::%s' inde i '%T'" + +#~ msgid "data member may not have variably modified type `%T'" +#~ msgstr "datamedlem må ikke have variabelt ændret type '%T'" + +#~ msgid "parameter may not have variably modified type `%T'" +#~ msgstr "parameter må ikke have variabelt ændret type '%T'" + +#~ msgid "only declarations of constructors can be `explicit'" +#~ msgstr "kun erklæringer af konstruktionsfunktioner kan være 'explicit'" + +#~ msgid "non-member `%s' cannot be declared `mutable'" +#~ msgstr "'%s' som ikke er medlem, kan ikke erklæres 'mutable'" + +#~ msgid "non-object member `%s' cannot be declared `mutable'" +#~ msgstr "'%s' som ikke er objektmedlem, kan ikke erklæres 'mutable'" + +#~ msgid "function `%s' cannot be declared `mutable'" +#~ msgstr "funktionen '%s' kan ikke erklæres 'mutable'" + +#~ msgid "static `%s' cannot be declared `mutable'" +#~ msgstr "static '%s' kan ikke erklæres 'mutable'" + +#~ msgid "const `%s' cannot be declared `mutable'" +#~ msgstr "const '%s' kan ikke erklæres 'mutable'" + +#~ msgid "template-id `%D' used as a declarator" +#~ msgstr "skabelons-id '%D' benyttet som erklærer" + +#~ msgid "ISO C++ forbids nested type `%D' with same name as enclosing class" +#~ msgstr "ISO C++ forbyder indlejret type '%D' med samme navn som den omgivende klasse" + +#~ msgid "typedef name may not be class-qualified" +#~ msgstr "typedef-navn kan ikke klassemodificeres" + +#~ msgid "invalid type qualifier for non-member function type" +#~ msgstr "ugyldig typemodifikation for ikke-medlemsfunktionstype" + +#~ msgid "type qualifiers specified for friend class declaration" +#~ msgstr "typemodifikationer angivet for friend class-erklæring" + +#~ msgid "`inline' specified for friend class declaration" +#~ msgstr "'inline' angivet for friend class-erklæring" + +#~ msgid "template parameters cannot be friends" +#~ msgstr "skabelonsparametre kan ikke være venner" + +#~ msgid "friend declaration requires class-key, i.e. `friend class %T::%D'" +#~ msgstr "friend-erklæring kræver klasseangivelse, dvs. 'friend class %T::%D'" + +#~ msgid "friend declaration requires class-key, i.e. `friend %#T'" +#~ msgstr "friend-erklæring kræver klasseangivelse, dvs. 'friend %#T'" + +#~ msgid "trying to make class `%T' a friend of global scope" +#~ msgstr "forsøg på at gøre klassen '%T' til ven af det globale virkningsfelt" + +#~ msgid "invalid qualifiers on non-member function type" +#~ msgstr "ugyldige modifikationer for ikke-medlemsfunktionstype" + +#~ msgid "abstract declarator `%T' used as declaration" +#~ msgstr "abstrakt erklærer '%T' benyttet som erklæring" + +#~ msgid "unnamed variable or field declared void" +#~ msgstr "unavngiven variabel eller felt erklæret void" + +#~ msgid "variable or field declared void" +#~ msgstr "variabel eller felt erklæret void" + +#~ msgid "cannot use `::' in parameter declaration" +#~ msgstr "kan ikke bruge '::' i parametererklæring" + +#~ msgid "invalid use of `::'" +#~ msgstr "ugyldig brug af '::'" + +#~ msgid "function `%D' cannot be declared friend" +#~ msgstr "funktionen '%D' kan ikke erklæres friend" + +#~ msgid "can't make `%D' into a method -- not in a class" +#~ msgstr "kan ikke gøre '%D' til en metode - er ikke i en klasse" + +#~ msgid "function `%D' declared virtual inside a union" +#~ msgstr "funktionen '%D' erklæret virtual inden i en union" + +#~ msgid "`%D' cannot be declared virtual, since it is always static" +#~ msgstr "'%D' kan ikke erklæres virtual eftersom den altid er statisk" + +#~ msgid "field `%D' has incomplete type" +#~ msgstr "feltet '%D' er af en ufuldstændig type" + +#~ msgid "name `%T' has incomplete type" +#~ msgstr "navnet '%T' er af en ufuldstændig type" + +#~ msgid " in instantiation of template `%T'" +#~ msgstr " i instantiering af skabelonen '%T'" + +#~ msgid "`%s' is neither function nor member function; cannot be declared friend" +#~ msgstr "'%s' er hverken en almindelig funktion eller en medlemsfunktion; kan ikke erklæres som friend" + +#~ msgid "member functions are implicitly friends of their class" +#~ msgstr "medlemsfunktioner er underforstået venner af deres klasse" + +#~ msgid "ISO C++ forbids initialization of member `%D'" +#~ msgstr "ISO C++ forbyder tildeling af startværdi til medlemmet '%D'" + +#~ msgid "making `%D' static" +#~ msgstr "gør '%D' statisk" + +#~ msgid "ISO C++ forbids static data member `%D' with same name as enclosing class" +#~ msgstr "ISO C++ forbyder statisk datamedlem '%D' med samme navn som den omgivende klasse" + +#~ msgid "storage class `auto' invalid for function `%s'" +#~ msgstr "lagringsklassen 'auto' er ugyldig for funktionen '%s'" + +#~ msgid "storage class `register' invalid for function `%s'" +#~ msgstr "lagringsklassen 'register' er ugyldig for funktionen '%s'" + +#~ msgid "storage class `__thread' invalid for function `%s'" +#~ msgstr "lagringsklassen '__thread' er ugyldig for funktionen '%s'" + +#~ msgid "storage class `static' invalid for function `%s' declared out of global scope" +#~ msgstr "lagringsklassen 'static' er ugyldig for funktionen '%s' erklæret uden for det globale virkefelt" + +#~ msgid "storage class `inline' invalid for function `%s' declared out of global scope" +#~ msgstr "lagringsklassen 'inline' er ugyldig for funktionen '%s' erklæret uden for det globale virkefelt" + +#~ msgid "virtual non-class function `%s'" +#~ msgstr "virtuel funktion '%s' tilhører ikke en klasse" + +#~ msgid "cannot declare member function `%D' to have static linkage" +#~ msgstr "kan ikke erklære medlemsfunktion '%D' til at have statisk kædning" + +#~ msgid "cannot declare static function inside another function" +#~ msgstr "kan ikke erklære en funktion for static inden i en anden funktion" + +#~ msgid "`static' may not be used when defining (as opposed to declaring) a static data member" +#~ msgstr "'static' må ikke bruges ved definering (i modsætning til erklæring) af et statisk datamedlem" + +#~ msgid "static member `%D' declared `register'" +#~ msgstr "statisk medlem '%D' erklæret 'register'" + +#~ msgid "cannot explicitly declare member `%#D' to have extern linkage" +#~ msgstr "kan ikke eksplicit erklære medlemmet '%#D' til at have extern-kædning" + +#~ msgid "default argument for `%#D' has type `%T'" +#~ msgstr "standardparameter for '%#D' har typen '%T'" + +#~ msgid "default argument for parameter of type `%T' has type `%T'" +#~ msgstr "standardparameter for parameter af typen '%T' har typen '%T'" + +#~ msgid "default argument `%E' uses local variable `%D'" +#~ msgstr "standardparameter '%E' bruger lokal variabel '%D'" + +#~ msgid "invalid string constant `%E'" +#~ msgstr "ugyldig strengkonstant '%E'" + +#~ msgid "invalid integer constant in parameter list, did you forget to give parameter name?" +#~ msgstr "ugyldig heltalskonstant i parameterlisten, måske mangler parameternavnet?" + +#~ msgid "parameter `%D' invalidly declared method type" +#~ msgstr "parameteren '%D' er på ugyldig vis erklæret som af en medlemsfunktionstype" + +#~ msgid "parameter `%D' invalidly declared offset type" +#~ msgstr "parameteren '%D' er på ugyldig vis erklæret som af en offset-type" + +#~ msgid "parameter `%D' includes %s to array of unknown bound `%T'" +#~ msgstr "parameteren '%D' inkluderer %s til tabel med ukendt grænse '%T'" + +#~ msgid "invalid constructor; you probably meant `%T (const %T&)'" +#~ msgstr "ugyldig konstruktionsfunktion; du mente sandsynligvis '%T (const %T&)'" + +#~ msgid "`%D' must be a nonstatic member function" +#~ msgstr "'%D' skal være en ikke-statisk medlemsfunktion" + +#~ msgid "`%D' must be either a non-static member function or a non-member function" +#~ msgstr "'%D' skal enten være en ikke-statisk medlemsfunktion eller ikke en medlemsfunktion" + +#~ msgid "`%D' must have an argument of class or enumerated type" +#~ msgstr "'%D' skal have en parameter af en klasse- eller enum-type" + +#~ msgid "conversion to %s%s will never use a type conversion operator" +#~ msgstr "konvertering til %s%s vil aldrig bruge en typekonverteringsoperator" + +#~ msgid "ISO C++ prohibits overloading operator ?:" +#~ msgstr "ISO C++ forbyder flertydiggørelse af operatoren ?:" + +#~ msgid "postfix `%D' must take `int' as its argument" +#~ msgstr "postfiks '%D' skal tage mod 'int' som parameter" + +#~ msgid "postfix `%D' must take `int' as its second argument" +#~ msgstr "postfiks '%D' skal tage mod 'int' som den anden parameter" + +#~ msgid "`%D' must take either zero or one argument" +#~ msgstr "'%D' skal tage mod nul eller én parameter" + +#~ msgid "`%D' must take either one or two arguments" +#~ msgstr "'%D' skal tage mod én eller to parametre" + +#~ msgid "prefix `%D' should return `%T'" +#~ msgstr "præfiks '%D' skal returnere '%T'" + +#~ msgid "postfix `%D' should return `%T'" +#~ msgstr "postfiks '%D' skal returnere '%T'" + +#~ msgid "`%D' must take `void'" +#~ msgstr "'%D' skal tage mod 'void'" + +#~ msgid "`%D' must take exactly one argument" +#~ msgstr "'%s' skal tage mod én parameter" + +#~ msgid "`%D' must take exactly two arguments" +#~ msgstr "'%s' skal tage mod to parametre" + +#~ msgid "user-defined `%D' always evaluates both arguments" +#~ msgstr "brugerdefineret '%D' evaluerer altid begge parametre" + +#~ msgid "`%D' should return by value" +#~ msgstr "'%D' skal returnere pr. værdi (ikke reference)" + +#~ msgid "`%D' cannot have default arguments" +#~ msgstr "'%D' kan ikke have standardparametre" + +#~ msgid "using typedef-name `%D' after `%s'" +#~ msgstr "bruger typedef-navn '%D' efter '%s'" + +#~ msgid "using template type parameter `%T' after `%s'" +#~ msgstr "bruger skabelonstypeparameter '%D' efter '%s'" + +#~ msgid "`%s %T' declares a new type at namespace scope" +#~ msgstr "'%s %T' erklærer en ny type ved navnerumsvirkefelt" + +#~ msgid " names from dependent base classes are not visible to unqualified name lookup - to refer to the inherited type, say `%s %T::%T'" +#~ msgstr " navne fra afhængige stamklasser er ikke synlige for umodificerede navneopslag - benyt '%s %T::%T' for at referere til den nedarvede type" + +#~ msgid "use of enum `%#D' without previous declaration" +#~ msgstr "brug af enum '%#D' uden tidligere erklæring" + +#~ msgid "derived union `%T' invalid" +#~ msgstr "nedarvet union '%T' ugyldig" + +#~ msgid "base type `%T' fails to be a struct or class type" +#~ msgstr "stamklassetype '%T' er hverken en struct- eller class-type" + +#~ msgid "base class `%T' has incomplete type" +#~ msgstr "stamklasse '%T' er af en ufuldstændig type" + +#~ msgid "recursive type `%T' undefined" +#~ msgstr "rekursiv type '%T' ikke defineret" + +#~ msgid "duplicate base type `%T' invalid" +#~ msgstr "stamklassetype '%T' optræder mere end én gang" + +#~ msgid "multiple definition of `%#T'" +#~ msgstr "flere definitioner af '%#T'" + +#~ msgid "previous definition here" +#~ msgstr "tidligere definition her" + +#~ msgid "enumerator value for `%D' not integer constant" +#~ msgstr "enum-værdi for '%D' er ikke en heltalskonstant" + +#~ msgid "overflow in enumeration values at `%D'" +#~ msgstr "enum-værdier for store ved '%D'" + +#~ msgid "return type `%#T' is incomplete" +#~ msgstr "returtype '%#T' er ufuldstændig" + +#~ msgid "semicolon missing after declaration of `%#T'" +#~ msgstr "semikolon mangler efter erklæring af '%#T'" + +#~ msgid "return type for `main' changed to `int'" +#~ msgstr "returtype for 'main' ændret til 'int'" + +#~ msgid "`%D' implicitly declared before its definition" +#~ msgstr "'%s' er underforstået erklæret efter dens definition" + +#~ msgid "`operator=' should return a reference to `*this'" +#~ msgstr "'operator=' bør returnere en reference til '*this'" + +#~ msgid "parameter `%D' declared void" +#~ msgstr "parameteren '%D' erklæret void" + +#~ msgid "`%D' is already defined in class `%T'" +#~ msgstr "'%D' er allerede defineret i klassen '%T'" + +#~ msgid "static member function `%#D' declared with type qualifiers" +#~ msgstr "statisk medlemsfunktion '%#D' erklæret med typemodifikationer" + +#~ msgid "duplicate type qualifiers in %s declaration" +#~ msgstr "dobbelte typemodifikationer i %s-erklæring" + +#~ msgid "template `%#D' instantiated in file without #pragma interface" +#~ msgstr "skabelon '%#D' instantieret i fil uden #pragma interface" + +#~ msgid "template `%#D' defined in file without #pragma interface" +#~ msgstr "skabelon '%#D' defineret i fil uden #pragma interface" + +#~ msgid "name missing for member function" +#~ msgstr "navn mangler for medlemsfunktion" + +#~ msgid "parser may be lost: is there a '{' missing somewhere?" +#~ msgstr "fortolkeren kan være faret vild: mangler der en '{' et eller andet sted?" + +#~ msgid "ambiguous conversion for array subscript" +#~ msgstr "tvetydig konvertering af tabelindeks" + +#~ msgid "invalid types `%T[%T]' for array subscript" +#~ msgstr "ugyldige typer '%T[%T]' for tabelopslag" + +#~ msgid "type `%#T' argument given to `delete', expected pointer" +#~ msgstr "parameter af typen '%#T' givet til 'delete', forventede henvisning" + +#~ msgid "anachronistic use of array size in vector delete" +#~ msgstr "forældet brug af tabelstørrelse i tabelformen af delete" + +#~ msgid "cannot delete a function. Only pointer-to-objects are valid arguments to `delete'" +#~ msgstr "kan ikke udføre delete på en funktion; kun henvisninger til objekter er gyldige som parameter til 'delete'" + +#~ msgid "deleting `%T' is undefined" +#~ msgstr "benyttelse af delete på '%T' er ikke defineret" + +#~ msgid "deleting array `%#D'" +#~ msgstr "benyttelse af delete på tabellen '%#D'" + +#~ msgid "invalid declaration of member template `%#D' in local class" +#~ msgstr "ugyldig erklæring af medlemsskabelon '%#D' i lokal klasse" + +#~ msgid "invalid use of `virtual' in template declaration of `%#D'" +#~ msgstr "ugyldig brug af 'virtual' i skabelonserklæring af '%#D'" + +#~ msgid "template declaration of `%#D'" +#~ msgstr "skabelonserklæring af '%#D'" + +#~ msgid "Java method '%D' has non-Java return type `%T'" +#~ msgstr "Java-metoden '%D' har har en returtype '%T' som ikke er fra Java" + +#~ msgid "Java method '%D' has non-Java parameter type `%T'" +#~ msgstr "Java-metoden '%D' har har en parametertype '%T' som ikke er fra Java" + +#~ msgid "prototype for `%#D' does not match any in class `%T'" +#~ msgstr "prototypen for '%#D' passer ikke nogen i klassen '%T'" + +#~ msgid "local class `%#T' shall not have static data member `%#D'" +#~ msgstr "lokal klasse '%#T' må ikke have det statiske datamedlem '%#D'" + +#~ msgid "initializer invalid for static member with constructor" +#~ msgstr "tildeling af startværdi er ugyldig for statisk medlem med konstruktionsfunktion" + +#~ msgid "(an out of class initialization is required)" +#~ msgstr "(en klargøring uden for klassens erklæring er nødvendig)" + +#~ msgid "invalid data member initialization" +#~ msgstr "ugyldig tildeling af startværdi til datamedlem" + +#~ msgid "(use `=' to initialize static data members)" +#~ msgstr "(brug '=' for at klargøre statiske datamedlemmer)" + +#~ msgid "member `%D' conflicts with virtual function table field name" +#~ msgstr "medlemmet '%D' er i konflikt med feltnavn fra den virtuelle funktionstabel" + +#~ msgid "`%D' is already defined in `%T'" +#~ msgstr "'%D' er allerede defineret i '%T'" + +#~ msgid "field initializer is not constant" +#~ msgstr "feltets startværdi er ikke en konstant" + +#~ msgid "`asm' specifiers are not permitted on non-static data members" +#~ msgstr "'asm'-angivelser er ikke tilladt på ikke-statiske datamedlemmer" + +#~ msgid "cannot declare `%D' to be a bit-field type" +#~ msgstr "kan ikke erklære '%D' til at være en bitfeltstype" + +#~ msgid "cannot declare bit-field `%D' with function type" +#~ msgstr "kan ikke erklære bitfelt '%D' med funktionstype" + +#~ msgid "`%D' is already defined in the class %T" +#~ msgstr "'%D' er allerede defineret i klassen '%T'" + +#~ msgid "static member `%D' cannot be a bit-field" +#~ msgstr "statisk medlem '%D' kan ikke være et bitfelt" + +#~ msgid "initializer specified for non-member function `%D'" +#~ msgstr "startværdi angivet for ikke-medlemsfunktion '%D'" + +#~ msgid "invalid initializer for virtual method `%D'" +#~ msgstr "ugyldig startværdi til virtuel medlemsfunktion '%D'" + +#~ msgid "anonymous struct not inside named type" +#~ msgstr "anonym struct er ikke inden i en navngiven type" + +#~ msgid "namespace-scope anonymous aggregates must be static" +#~ msgstr "anonyme variabler af sammensatte typer i navnerumsvirkefelt skal erklæres static" + +#~ msgid "anonymous aggregate with no members" +#~ msgstr "anonym sammensat type uden medlemmer" + +#~ msgid "`operator new' must return type `%T'" +#~ msgstr "'operator new' skal returnere typen '%T'" + +#~ msgid "`operator new' takes type `size_t' (`%T') as first parameter" +#~ msgstr "den første parameter til 'operator new' skal være af typen 'size_t' ('%T')" + +#~ msgid "`operator delete' must return type `%T'" +#~ msgstr "'operator delete' skal returnere typen '%T'" + +#~ msgid "`operator delete' takes type `%T' as first parameter" +#~ msgstr "den første parameter til 'operator delete' skal være af typen '%T'" + +#~ msgid "too many initialization functions required" +#~ msgstr "for mange klargøringsfunktioner påkrævet" + +#~ msgid "inline function `%D' used but never defined" +#~ msgstr "indbygget funktion '%D' benyttet, men aldrig defineret" + +#~ msgid "use of old-style cast" +#~ msgstr "brug af ældre type typeomtvingning" + +#~ msgid "use of `%D' is ambiguous" +#~ msgstr "brug af '%D' er tvetydigt" + +#~ msgid " first declared as `%#D' here" +#~ msgstr " først erklæret som '%#D' her" + +#~ msgid " also declared as `%#D' here" +#~ msgstr " også erklæret som '%#D' her" + +#~ msgid "`%D' denotes an ambiguous type" +#~ msgstr "'%D' angiver en tvetydig type" + +#~ msgid " first type here" +#~ msgstr " første type her" + +#~ msgid " other type here" +#~ msgstr " anden type her" + +#~ msgid "declaration of `%D' not in a namespace surrounding `%D'" +#~ msgstr "erklæring af '%D' er ikke i et navnerum der omgiver '%D'" + +#~ msgid "`%D' should have been declared inside `%D'" +#~ msgstr "'%D' skulle have været erklæret inden i '%D'" + +#~ msgid "`%D' is not a function," +#~ msgstr "'%s' er ikke en funktion," + +#~ msgid " conflict with `%D'" +#~ msgstr " konflikt med '%D'" + +#~ msgid "unknown namespace `%D'" +#~ msgstr "ukendt navnerum '%D'" + +#~ msgid "`%T' is not a namespace" +#~ msgstr "'%T' er ikke et navnerum" + +#~ msgid "`%D' is not a namespace" +#~ msgstr "'%D' er ikke et navnerum" + +#~ msgid "a using-declaration cannot specify a template-id. Try `using %D'" +#~ msgstr "en using-erklæring kan ikke angive en skabelons-id; prøv 'using %D'" + +#~ msgid "namespace `%D' not allowed in using-declaration" +#~ msgstr "navnerum '%D' ikke tilladt i using-erklæring" + +#~ msgid "`%D' not declared" +#~ msgstr "'%D' ikke erklæret" + +#~ msgid "`%D' is already declared in this scope" +#~ msgstr "'%D' er allerede erklæret i dette navnerum" + +#~ msgid "using declaration `%D' introduced ambiguous type `%T'" +#~ msgstr "using-erklæring '%D' introducerede tvetydig type '%T'" + +#~ msgid "using-declaration for non-member at class scope" +#~ msgstr "using-erklæring for ikke-medlem ved klassevirkefelt" + +#~ msgid "using-declaration for destructor" +#~ msgstr "using-erklæring for destruktionsfunktion" + +#~ msgid "a using-declaration cannot specify a template-id. Try `using %T::%D'" +#~ msgstr "en using-erklæring kan ikke angive en skabelons-id; prøv 'using %T::%D'" + +#~ msgid "namespace `%T' undeclared" +#~ msgstr "navnerummet '%T' er ikke erklæret" + +#~ msgid "default argument missing for parameter %P of `%+#D'" +#~ msgstr "standardparameter mangler for parameter %P i '%+#D'" + +#~ msgid "extra qualification `%T::' on member `%D' ignored" +#~ msgstr "ekstra modifikation '%T::' af medlemmet '%D' ignoreret" + +#~ msgid "`%T' does not have a class or union named `%D'" +#~ msgstr "'%T' har ikke en klasse eller en union ved navn '%D'" + +#~ msgid "`%T' is not a class or union type" +#~ msgstr "'%T' er ikke af en klasse- eller union-type" + +#~ msgid "template argument is required for `%T'" +#~ msgstr "skabelonsparameter er påkrævet for '%T'" + +#~ msgid "declaration of `%D' in `%D' which does not enclose `%D'" +#~ msgstr "erklæring af '%D' i '%D' som ikke omgiver '%D'" + +#~ msgid "`%s' not supported by %s" +#~ msgstr "'%s' ikke understøttet af %s" + +#~ msgid "" +#~ msgstr "" + +#~ msgid "(static %s for %s)" +#~ msgstr "(statisk %s for %s)" + +#~ msgid "\\x%x" +#~ msgstr "\\x%x" + +#~ msgid "In %s `%s':" +#~ msgstr "I %s '%s':" + +#~ msgid "%s: In instantiation of `%s':\n" +#~ msgstr "%s: i instantiering af '%s':\n" + +#~ msgid "%s:%d: instantiated from `%s'\n" +#~ msgstr "%s:%d: instantieret fra '%s'\n" + +#~ msgid "%s:%d: instantiated from here\n" +#~ msgstr "%s:%d: instantieret herfra\n" + +#~ msgid "unexpected letter `%c' in locate_error\n" +#~ msgstr "uventet bogstav '%c' i locate_error\n" + +#~ msgid "type `%T' is disallowed in Java `throw' or `catch'" +#~ msgstr "typen '%T' er ikke tilladt i Java 'throw' eller 'catch'" + +#~ msgid "call to Java `catch' or `throw' with `jthrowable' undefined" +#~ msgstr "kald til Java 'catch' eller 'throw' mens 'jthrowable' ikke er defineret" + +#~ msgid "type `%T' is not derived from `java::lang::Throwable'" +#~ msgstr "typen '%T' nedarver ikke fra 'java::lang::Throwable'" + +#~ msgid "mixing C++ and Java catches in a single translation unit" +#~ msgstr "blander C++ og Java 'catch' i én oversættelsesenhed" + +#~ msgid "throwing NULL, which has integral, not pointer type" +#~ msgstr "kaster NULL som har en heltals-, ikke en henvisningstype" + +#~ msgid " in thrown expression" +#~ msgstr " i kastet udtryk" + +#~ msgid "expression '%E' of abstract class type '%T' cannot be used in throw-expression" +#~ msgstr "udtrykket '%E' med den abstrakte klassetype '%T' kan ikke bruges i throw-udtryk" + +#~ msgid "exception of type `%T' will be caught" +#~ msgstr "undtagelse af typen '%T' vil blive fanget" + +#~ msgid " by earlier handler for `%T'" +#~ msgstr " af tidligere håndtering af '%T'" + +#~ msgid "`...' handler must be the last handler for its try block" +#~ msgstr "håndteringen '...' skal være den sidste håndtering i try-blokken" + +#~ msgid "`%D' is already a friend of class `%T'" +#~ msgstr "'%D' er allerede en ven af klassen '%T'" + +#~ msgid "previous friend declaration of `%D'" +#~ msgstr "tidligere friend-erklæring af '%D'" + +#~ msgid "invalid type `%T' declared `friend'" +#~ msgstr "ugyldig type '%T' erklæret 'friend'" + +#~ msgid "partial specialization `%T' declared `friend'" +#~ msgstr "partiel specialisering '%T' erklæret 'friend'" + +#~ msgid "class `%T' is implicitly friends with itself" +#~ msgstr "klassen '%T' er underforstået ven med sig selv" + +#~ msgid "typename type `%#T' declared `friend'" +#~ msgstr "typename-type '%#T' erklæret 'friend'" + +#~ msgid "template parameter type `%T' declared `friend'" +#~ msgstr "skabelonsparametertypen '%T' erklæret 'friend'" + +#~ msgid "`%#T' is not a template" +#~ msgstr "'%#T' er ikke en skabelon" + +#~ msgid "`%T' is already a friend of `%T'" +#~ msgstr "'%T' er allerede en ven af '%T'" + +#~ msgid "member `%D' declared as friend before type `%T' defined" +#~ msgstr "medlemmet '%D' erklæret som friend før typen '%T' er defineret" + +#~ msgid "friend declaration `%#D' declares a non-template function" +#~ msgstr "friend-erklæring '%#D' erklærer en ikke-skabelonsfunktion" + +#~ msgid "(if this is not what you intended, make sure the function template has already been declared and add <> after the function name here) -Wno-non-template-friend disables this warning" +#~ msgstr "(hvis dette er hvad du ønsker, så sikr dig at funktionsskabelonen allerede er blevet erklæret og tilføj <> efter funktionsnavnet her) -Wno-non-template-friend deaktiverer denne advarsel" + +#~ msgid "argument to `%s' missing\n" +#~ msgstr "en parameter til '%s' mangler\n" + +#~ msgid "`%D' should be initialized in the member initialization list" +#~ msgstr "'%D' bør blive klargjort i medlemsklargøringslisten" + +#~ msgid "default-initialization of `%#D', which has reference type" +#~ msgstr "standardklargøring af '%#D' som er af en referencetype" + +#~ msgid "uninitialized reference member `%D'" +#~ msgstr "referencemedlem '%D' uden startværdi" + +#~ msgid "initializer list treated as compound expression" +#~ msgstr "klargøringsliste behandlet som et sammensat udtryk" + +#~ msgid "`%D' will be initialized after" +#~ msgstr "'%D' vil blive klargjort efter" + +#~ msgid "base `%T' will be initialized after" +#~ msgstr "stamklasse '%T' vil blive klargjort efter" + +#~ msgid " `%#D'" +#~ msgstr " '%#D'" + +#~ msgid " base `%T'" +#~ msgstr " stamklasse '%T'" + +#~ msgid "multiple initializations given for base `%T'" +#~ msgstr "flere startværdier angivet for stamklassen '%T'" + +#~ msgid "initializations for multiple members of `%T'" +#~ msgstr "startværdier for flere medlemmer af '%T'" + +#~ msgid "base class `%#T' should be explicitly initialized in the copy constructor" +#~ msgstr "stamklassen '%#T' bør eksplicit blive klargjort i kopikonstruktionsfunktionen" + +#~ msgid "class `%T' does not have any field named `%D'" +#~ msgstr "klassen '%T' har ikke et felt ved navn '%D'" + +#~ msgid "field `%#D' is static; the only point of initialization is its definition" +#~ msgstr "feltet '%#D' er statisk; det eneste sted det kan klargøres er ved dets definition" + +#~ msgid "unnamed initializer for `%T', which has no base classes" +#~ msgstr "unavngiven klargøring af '%T' som ikke har nogen stamklasser" + +#~ msgid "unnamed initializer for `%T', which uses multiple inheritance" +#~ msgstr "unavngiven klargøring af '%T' som benytter multipel nedarvning" + +#~ msgid "type `%D' is not a direct or virtual base of `%T'" +#~ msgstr "typen '%D' er ikke en direkte eller en virtuel stamklasse til '%T'" + +#~ msgid "type `%D' is not a direct base of `%T'" +#~ msgstr "typen '%D' er ikke en direkte stamklasse til '%T'" + +#~ msgid "bad array initializer" +#~ msgstr "ugyldig tildeling af startværdi til tabel" + +#~ msgid "`%T' is not an aggregate type" +#~ msgstr "'%T' er ikke en sammensat type" + +#~ msgid "`%T' fails to be an aggregate typedef" +#~ msgstr "'%T' er ikke en sammensat typedef" + +#~ msgid "type `%T' is of non-aggregate type" +#~ msgstr "typen '%T' er ikke en sammensat type" + +#~ msgid "cannot call destructor `%T::~%T' without object" +#~ msgstr "kan ikke kalde destruktionsfunktion '%T::~%T' uden objekt" + +#~ msgid "invalid use of non-static field `%D'" +#~ msgstr "ugyldig brug af ikke-statisk felt '%D'" + +#~ msgid "invalid use of member `%D'" +#~ msgstr "ugyldig brug af medlemmet '%D'" + +#~ msgid "no method `%T::%D'" +#~ msgstr "ingen metode ved navn '%T::%D'" + +#~ msgid "incomplete type `%T' does not have member `%D'" +#~ msgstr "ufuldstændig type '%T' har ikke medlemmet '%D'" + +#~ msgid "`%D' is not a member of type `%T'" +#~ msgstr "'%D' er ikke et medlem af typen '%T'" + +#~ msgid "invalid pointer to bit-field `%D'" +#~ msgstr "ugyldig henvisning til bitfeltet '%D'" + +#~ msgid "object missing in use of pointer-to-member construct" +#~ msgstr "der mangler et objekt i henvisning til medlem-konstruktion" + +#~ msgid "member `%D' is non-static but referenced as a static member" +#~ msgstr "medlemmet '%D' er ikke statisk, men refereres som et statisk medlem" + +#~ msgid "at this point in file" +#~ msgstr "ved dette sted i filen" + +#~ msgid "object missing in `%E'" +#~ msgstr "objekt mangler i '%E'" + +#~ msgid "new of array type fails to specify size" +#~ msgstr "new virkende på en tabeltype mangler at angive størrelsen" + +#~ msgid "size in array new must have integral type" +#~ msgstr "størrelse i tabel-new skal være en heltalstype" + +#~ msgid "zero size array reserves no space" +#~ msgstr "tabel med størrelsen nul reserverer ingen plads" + +#~ msgid "new cannot be applied to a reference type" +#~ msgstr "new kan ikke bruges på en referencetype" + +#~ msgid "new cannot be applied to a function type" +#~ msgstr "new kan ikke bruges på en funktionstype" + +#~ msgid "call to Java constructor, while `jclass' undefined" +#~ msgstr "kald af Java-konstruktionsfunktion mens 'jclass' ikke er defineret" + +#~ msgid "can't find class$" +#~ msgstr "kan ikke finde class$" + +#~ msgid "invalid type `void' for new" +#~ msgstr "ugyldig type 'void' til new" + +#~ msgid "call to Java constructor with `%s' undefined" +#~ msgstr "kald af Java-konstruktionsfunktion mens '%s' ikke er defineret" + +#~ msgid "ISO C++ forbids initialization in array new" +#~ msgstr "ISO C++ forbyder startværdier i tabel-new" + +#~ msgid "initializer list being treated as compound expression" +#~ msgstr "klargøringsliste bliver behandlet som et sammensat udtryk" + +#~ msgid "ISO C++ forbids aggregate initializer to new" +#~ msgstr "ISO C++ forbyder sammensat startværditildeling ved new" + +#~ msgid "uninitialized const in `new' of `%#T'" +#~ msgstr "konstant uden startværdi i 'new' af '%#T'" + +#~ msgid "initializer ends prematurely" +#~ msgstr "startværdien slutter for tidligt" + +#~ msgid "cannot initialize multi-dimensional array with initializer" +#~ msgstr "kan ikke klargøre multidimensional tabel med startværdi" + +#~ msgid "unknown array size in delete" +#~ msgstr "ukendt tabelstørrelse i delete" + +#~ msgid "type to vector delete is neither pointer or array type" +#~ msgstr "variablen til tabel-delete er hverken af en henvisnings- eller en tabeltype" + +#~ msgid "type name expected before `*'" +#~ msgstr "der forventedes et typenavn før '*'" + +#~ msgid "cannot declare references to references" +#~ msgstr "kan ikke erklære referencer til referencer" + +#~ msgid "cannot declare pointers to references" +#~ msgstr "kan ikke erklære henvisninger til referencer" + +#~ msgid "type name expected before `&'" +#~ msgstr "der forventedes et typenavn før '&'" + +#~ msgid "semicolon missing after %s declaration" +#~ msgstr "semikolon mangler efter %s-erklæring" + +#~ msgid "semicolon missing after declaration of `%T'" +#~ msgstr "semikolon mangler efter erklæring af '%T'" + +#~ msgid "junk at end of #pragma %s" +#~ msgstr "ragelse i slutningen 'af #pragma %s'" + +#~ msgid "invalid #pragma %s" +#~ msgstr "ugyldig #pragma %s" + +#~ msgid "#pragma vtable no longer supported" +#~ msgstr "'#pragma vtable' understøttes ikke længere" + +#~ msgid "#pragma implementation for %s appears after file is included" +#~ msgstr "'#pragma implementation' til %s optræder efter filen er inkluderet" + +#~ msgid "junk at end of #pragma GCC java_exceptions" +#~ msgstr "ragelse i slutningen af #pragma GCC java_exceptions" + +#~ msgid "`%D' not defined" +#~ msgstr "'%D' er ikke defineret" + +#~ msgid "`%D' was not declared in this scope" +#~ msgstr "'%D' blev ikke erklæret i dette virkefelt" + +#~ msgid "`%D' undeclared (first use this function)" +#~ msgstr "'%D' er ikke erklæret (først benyttet i denne funktion)" + +# dækkende, og pænere end original i praktisk brug +#~ msgid "(Each undeclared identifier is reported only once for each function it appears in.)" +#~ msgstr "(et kaldenavn der ikke er erklæret, rapporteres kun én gang per funktion)" + +#~ msgid "`::%D' undeclared (first use here)" +#~ msgstr "'::%D' er ikke erklæret (først benyttet her)" + +#~ msgid "real-valued template parameters when cross-compiling" +#~ msgstr "skabelonsparametre med reelle værdi ved krydsoversættelse" + +#~ msgid "the mangled name of `%D' will change in a future version of GCC" +#~ msgstr "det ABI-navnet for '%D' vil ændre sig i en fremtidig version af GCC" + +#~ msgid "due to a defect in the G++ 3.2 ABI, G++ has assigned the same mangled name to two different types" +#~ msgstr "pga. en fejl i G++ 3.2-ABI'en har G++ tildelt det samme sammensatte navn til det to forskellige typer" + +#~ msgid "invalid use of member `%D' in static member function" +#~ msgstr "ugyldig brug af medlemmet '%D' i statisk medlemsfunktion" + +#~ msgid "use of namespace `%D' as expression" +#~ msgstr "brug af navnerummet '%D' som udtryk" + +#~ msgid "use of class template `%T' as expression" +#~ msgstr "brug af klasseskabelonen '%T' som udtryk" + +#~ msgid "use of %s from containing function" +#~ msgstr "brug af %s fra indeholdende funktion" + +#~ msgid " `%#D' declared here" +#~ msgstr " '%#D' erklæret her" + +#~ msgid "request for member `%D' is ambiguous in multiple inheritance lattice" +#~ msgstr "forespørgsel efter medlemmet '%D' er tvetydigt i det multiple nedarvningsnet" + +#~ msgid "generic thunk code fails for method `%#D' which uses `...'" +#~ msgstr "generel thunk-kode mislykkes for metoden '%#D' som bruger '...'" + +#~ msgid "non-static const member `%#D', can't use default assignment operator" +#~ msgstr "ikke-statisk konstant medlem '%#D' kan ikke bruge standardtildelingsoperatoren" + +#~ msgid "non-static reference member `%#D', can't use default assignment operator" +#~ msgstr "ikke-statisk referencemedlem '%#D' kan ikke bruge standardtildelingsoperatoren" + +#~ msgid "`%s' tag used in naming `%#T'" +#~ msgstr "'%s'-mærke benyttet i navngivning af '%#T'" + +#~ msgid "keyword `export' not implemented, and will be ignored" +#~ msgstr "det reserverede ord 'export' er ikke implementeret og vil blive ignoreret" + +#~ msgid "use of linkage spec `%D' is different from previous spec `%D'" +#~ msgstr "brug af kædningsangivelse '%D' er forskellig fra den tidligere angivelse '%D'" + +#~ msgid "no base or member initializers given following ':'" +#~ msgstr "ingen stamklasse- eller medlemsklargøringer er angivet efter ':'" + +#~ msgid "anachronistic old style base class initializer" +#~ msgstr "forældet stamklasseklargøring" + +#~ msgid "`>>' should be `> >' in template class name" +#~ msgstr "'>>' skulle have været '> >' i skabelonsklassenavn" + +#~ msgid "use of template qualifier outside template" +#~ msgstr "brug af skabelonsmodifikation uden for skabelon" + +#~ msgid "ISO C++ forbids an empty condition for `%s'" +#~ msgstr "ISO C++ forbyder en tom betingelse til '%s'" + +#~ msgid "definition of class `%T' in condition" +#~ msgstr "definition af klassen '%T' i betingelse" + +#~ msgid "definition of enum `%T' in condition" +#~ msgstr "definition af enum '%T' i betingelse" + +#~ msgid "definition of array `%#D' in condition" +#~ msgstr "definition af tabel '%#D' i betingelse" + +#~ msgid "old style placement syntax, use () instead" +#~ msgstr "forældet placeringssyntaks, brug () i stedet" + +#~ msgid "`%T' is not a valid expression" +#~ msgstr "'%T' er ikke et gyldigt udtryk" + +#~ msgid "initialization of new expression with `='" +#~ msgstr "tildeling af startværdi til new-udtryk med '='" + +#~ msgid "ISO C++ forbids compound literals" +#~ msgstr "ISO C++ forbyder sammensatte konstanter" + +#~ msgid "ISO C++ forbids braced-groups within expressions" +#~ msgstr "ISO C++ forbyder krøllet parantes-grupper inden i udtryk" + +#~ msgid "sigof type specifier" +#~ msgstr "sigof-typeangivelse" + +#~ msgid "`sigof' applied to non-aggregate expression" +#~ msgstr "'sigof' benyttet på et udtryk der ikke er af en sammensat type" + +#~ msgid "`sigof' applied to non-aggregate type" +#~ msgstr "'sigof' benyttet på en type der ikke er sammensat" + +#~ msgid "using `typename' outside of template" +#~ msgstr "bruger 'typename' uden for en skabelon" + +#~ msgid "storage class specifier `%s' not allowed after struct or class" +#~ msgstr "lagringsklasseangivelsen '%s' er ikke tilladt efter struct eller class" + +#~ msgid "type specifier `%s' not allowed after struct or class" +#~ msgstr "typeangivelsen '%s' er ikke tilladt efter struct eller class" + +#~ msgid "type qualifier `%s' not allowed after struct or class" +#~ msgstr "typemodifikationen '%s' er ikke tilladt efter struct eller class" + +#~ msgid "no body nor ';' separates two class, struct or union declarations" +#~ msgstr "der er hverken en krop eller et semikolon mellem to class, struct eller union-erklæringer" + +#~ msgid "no bases given following `:'" +#~ msgstr "ingen stamklasse er angivet efter ':'" + +#~ msgid "`%D' access" +#~ msgstr "'%D'-tilgang" + +#~ msgid "multiple access specifiers" +#~ msgstr "mere end én tilgangsangivelse" + +#~ msgid "multiple `virtual' specifiers" +#~ msgstr "mere end én 'virtual'-angivelse" + +#~ msgid "missing ';' before right brace" +#~ msgstr "der mangler et semikolon før en højre krøllet parantes" + +#~ msgid "ISO C++ forbids array dimensions with parenthesized type in new" +#~ msgstr "ISO C++ forbyder tabeldimensioner med parantetiseret type i new" + +#~ msgid "`%T' is not a class or namespace" +#~ msgstr "'%T' er ikke en klasse eller et navnerum" + +#~ msgid "ISO C++ forbids label declarations" +#~ msgstr "ISO C++ forbyder etiketerklæringer" + +#~ msgid "ISO C++ forbids computed gotos" +#~ msgstr "ISO C++ forbyder beregnede goto'er" + +#~ msgid "label must be followed by statement" +#~ msgstr "etiketten skal efterfølges af en sætning" + +#~ msgid "must have at least one catch per try block" +#~ msgstr "skal have mindst én catch pr. try-blok" + +#~ msgid "ISO C++ forbids compound statements inside for initializations" +#~ msgstr "ISO C++ forbyder sammensatte sætninger inden i 'for'-klargøringer" + +#~ msgid "possibly missing ')'" +#~ msgstr "muligvis mangler en ')'" + +#~ msgid "type specifier omitted for parameter" +#~ msgstr "typeangivelsen er ikke angivet for parameteren" + +#~ msgid "`%E' is not a type, use `typename %E' to make it one" +#~ msgstr "'%E' er ikke en type, benyt 'typename %E' for at gøre den til en" + +#~ msgid "no type `%D' in `%T'" +#~ msgstr "ingen type '%D' i '%T'" + +#~ msgid "type specifier omitted for parameter `%E'" +#~ msgstr "typeangivelse udeladt for parameteren '%E'" + +#~ msgid "'%D' is used as a type, but is not defined as a type." +#~ msgstr "'%D' benyttes som en type, men er ikke defineret som en type" + +#~ msgid "data member `%D' cannot be a member template" +#~ msgstr "datamedlem '%D' kan ikke være en medlemsskabelon" + +#~ msgid "invalid member template declaration `%D'" +#~ msgstr "ugyldig medlemsskabelonerklæring '%D'" + +#~ msgid "explicit specialization in non-namespace scope `%D'" +#~ msgstr "eksplicit specialisering i virkefeltet '%D' der ikke er et navnerum" + +#~ msgid "enclosing class templates are not explicitly specialized" +#~ msgstr "omgivende klasseskabeloner er ikke eksplicit specialiserede" + +#~ msgid "specializing `%#T' in different namespace" +#~ msgstr "specialiserer '%#T' i andet navnerum" + +# hænger sammen med foregående tekst, derfor ikke 'fra' +#~ msgid " from definition of `%#D'" +#~ msgstr " i forhold til definition af '%#D'" + +#~ msgid "specialization of `%T' after instantiation" +#~ msgstr "specialisering af '%T' efter instantiering" + +#~ msgid "specialization `%T' after instantiation `%T'" +#~ msgstr "specialisering af '%T' efter instantiering '%T'" + +#~ msgid "explicit specialization of non-template `%T'" +#~ msgstr "eksplicit specialisering af '%T' der ikke er en skabelon" + +#~ msgid "specialization of %D after instantiation" +#~ msgstr "specialisering af '%D' efter instantiering" + +#~ msgid "%s %+#D" +#~ msgstr "%s %+#D" + +#~ msgid "`%D' is not a function template" +#~ msgstr "'%D' er ikke en funktionsskabelon" + +#~ msgid "template-id `%D' for `%+D' does not match any template declaration" +#~ msgstr "skabelons-id '%D' for '%+D' passer ikke til nogen skabelonserklæring" + +#~ msgid "ambiguous template specialization `%D' for `%+D'" +#~ msgstr "tvetydig skabelonsspecialisering '%D' for '%+D'" + +#~ msgid "template-id `%D' in declaration of primary template" +#~ msgstr "skabelons-id '%D' i erklæring af primær skabelon" + +#~ msgid "template parameter list used in explicit instantiation" +#~ msgstr "skabelonsparameterliste benyttet i eksplicit instantiering" + +#~ msgid "definition provided for explicit instantiation" +#~ msgstr "definition angivet for eksplicit instantiering" + +#~ msgid "too many template parameter lists in declaration of `%D'" +#~ msgstr "for mange skabelonsparameterlister angivet i erklæring af '%D'" + +#~ msgid "too few template parameter lists in declaration of `%D'" +#~ msgstr "for få skabelonsparameterlister angivet i erklæring af '%D'" + +#~ msgid "explicit specialization not preceded by `template <>'" +#~ msgstr "eksplicit specialisering følger ikke efter 'template <>'" + +#~ msgid "partial specialization `%D' of function template" +#~ msgstr "partiel specialisering '%D' af funktionsskabelon" + +#~ msgid "default argument specified in explicit specialization" +#~ msgstr "standardparameter angivet i eksplicit specialisering" + +#~ msgid "template specialization with C linkage" +#~ msgstr "skabelonsspecialisering med C-kædning" + +#~ msgid "specialization of implicitly-declared special member function" +#~ msgstr "specialisering af underforstået erklæret speciel medlemsfunktion" + +#~ msgid "no member function `%D' declared in `%T'" +#~ msgstr "ingen medlemsfunktion '%D' erklæret i '%T'" + +#~ msgid "too many template parameter lists in declaration of `%T'" +#~ msgstr "for mange skabelonsparameterlister i erklæringen af '%T'" + +#~ msgid " shadows template parm `%#D'" +#~ msgstr " skygger for skabelonsparameter '%#D'" + +#~ msgid "template parameters not used in partial specialization:" +#~ msgstr "skabelonsparametre der ikke bruges i partiel specialisering:" + +#~ msgid " `%D'" +#~ msgstr " '%D'" + +#~ msgid "partial specialization `%T' does not specialize any template arguments" +#~ msgstr "den partielle specialisering '%T' specialiserer ikke nogen skabelonsparametre" + +# flertalsform unødvendig +#~ msgid "template argument `%E' involves template parameter(s)" +#~ msgstr "skabelonsparameter '%E' involverer skabelonsparameter" + +# flertalsform unødvendig +#~ msgid "type `%T' of template argument `%E' depends on template parameter(s)" +#~ msgstr "typen '%T' af skabelonsparameteren '%E' afhænger af skabelonsparameter" + +#~ msgid "no default argument for `%D'" +#~ msgstr "ingen standardparameter til '%D'" + +#~ msgid "template with C linkage" +#~ msgstr "skabelon med C-kædning" + +#~ msgid "template class without a name" +#~ msgstr "skabelonsklasse uden et navn" + +#~ msgid "`%D' does not declare a template type" +#~ msgstr "'%D' erklærer ikke en skabelonstype" + +#~ msgid "template definition of non-template `%#D'" +#~ msgstr "skabelonsdefinition af ikke-skabelon '%#D'" + +#~ msgid "expected %d levels of template parms for `%#D', got %d" +#~ msgstr "forvented %d niveauer af skabelonsparametre for '%#D', modtog %d" + +#~ msgid "got %d template parameters for `%#D'" +#~ msgstr "modtog %d skabelonsparametre for '%#D'" + +#~ msgid "got %d template parameters for `%#T'" +#~ msgstr "modtog %d skabelonsparametre for '%#T'" + +#~ msgid " but %d required" +#~ msgstr " men %d påkrævet" + +#~ msgid "`%T' is not a template type" +#~ msgstr "'%T' er ikke en skabelonstype" + +# hænger sammen med næste tekst +#~ msgid "previous declaration `%D'" +#~ msgstr "tidligere erklæring '%D'" + +#~ msgid "used %d template parameter%s instead of %d" +#~ msgstr "benyttede %d skabelonsparameter%s i stedet for %d" + +#~ msgid "template parameter `%#D'" +#~ msgstr "skabelonsparameter '%#D'" + +#~ msgid "redeclared here as `%#D'" +#~ msgstr "omerklæret her som '%#D'" + +#~ msgid "redefinition of default argument for `%#D'" +#~ msgstr "omdefinering af standardparameter for '%#D'" + +#~ msgid " original definition appeared here" +#~ msgstr " oprindelig definition er her" + +#~ msgid "`%E' is not a valid template argument" +#~ msgstr "'%E' er ikke en gyldig skabelonsparameter" + +#~ msgid "it must be the address of a function with external linkage" +#~ msgstr "den skal være adressen af en funktion med ekstern kædning" + +#~ msgid "it must be the address of an object with external linkage" +#~ msgstr "den skal være adressen af et objekt med ekstern kædning" + +#~ msgid "it must be a pointer-to-member of the form `&X::Y'" +#~ msgstr "den skal være en henvisning til medlem på formen '&X::Y'" + +#~ msgid "string literal %E is not a valid template argument because it is the address of an object with static linkage" +#~ msgstr "strengkonstanten %E er ikke en gyldig skabelonsparameter fordi den er adressen af et objekt med statisk kædning" + +#~ msgid "address of non-extern `%E' cannot be used as template argument" +#~ msgstr "adresse på ikke-ekstern '%E' kan ikke bruges som skabelonsparameter" + +#~ msgid "non-constant `%E' cannot be used as template argument" +#~ msgstr "ikke-konstant '%E' kan ikke bruges som skabelonsparameter" + +#~ msgid "object `%E' cannot be used as template argument" +#~ msgstr "objektet '%E' kan ikke bruges som skabelonsparameter" + +#~ msgid "to refer to a type member of a template parameter, use `typename %E'" +#~ msgstr "benyt 'typename %E' for at referere til et typemedlem af en skabelonsparameter" + +#~ msgid "type/value mismatch at argument %d in template parameter list for `%D'" +#~ msgstr "type/værdi-konflikt ved %d. parameter i skabelonsparameterliste for '%D'" + +#~ msgid " expected a constant of type `%T', got `%T'" +#~ msgstr " forventede en konstant af typen '%T', modtog '%T'" + +#~ msgid " expected a type, got `%E'" +#~ msgstr " forventede en type, modtog '%E'" + +#~ msgid " expected a type, got `%T'" +#~ msgstr " forventede en type, modtog '%T'" + +#~ msgid " expected a class template, got `%T'" +#~ msgstr " forventede en klasseskabelon, modtog '%T'" + +#~ msgid " expected a template of type `%D', got `%D'" +#~ msgstr " forventede en skabelon af typen '%D', modtog '%D'" + +#~ msgid "template-argument `%T' uses anonymous type" +#~ msgstr "skabelonsparameter '%T' benytter anonym type" + +#~ msgid "template-argument `%T' uses local type `%T'" +#~ msgstr "skabelonsparameter '%T' benytter lokal type '%T'" + +#~ msgid "template-argument `%T' is a variably modified type" +#~ msgstr "skabelonsparameter '%T' er en variabelt ændret type" + +#~ msgid "could not convert template argument `%E' to `%T'" +#~ msgstr "kunne ikke konvertere skabelonsparameteren '%E' til '%T'" + +#~ msgid "wrong number of template arguments (%d, should be %d)" +#~ msgstr "forkert antal skabelonsparametre (%d, skulle være %d)" + +#~ msgid "provided for `%D'" +#~ msgstr "angivet for '%D'" + +#~ msgid "template argument %d is invalid" +#~ msgstr "skabelonsparameter %d er ugyldig" + +#~ msgid "non-template used as template" +#~ msgstr "ikke-skabelon benyttet som skabelon" + +#~ msgid "`%T' is not a template" +#~ msgstr "'%T' er ikke en skabelon" + +#~ msgid "non-template type `%T' used as a template" +#~ msgstr "ikke-skabelonstype '%T' benyttet som skabelon" + +#~ msgid "for template declaration `%D'" +#~ msgstr "til skabelonserklæring '%D'" + +#~ msgid "template instantiation depth exceeds maximum of %d (use -ftemplate-depth-NN to increase the maximum) instantiating `%D'" +#~ msgstr "skabelonsinstantieringsdybden overskrider maksimum på %d (benyt -ftemplate-depth-NN for at forøge maksimum) ved instantiering af '%D'" + +#~ msgid "ambiguous class template instantiation for `%#T'" +#~ msgstr "tvetydig klasseskabelonsinstantiering for '%#T'" + +#~ msgid "%s %+#T" +#~ msgstr "%s %+#T" + +#~ msgid "instantiation of `%D' as type `%T'" +#~ msgstr "instantiering af '%D' som typen '%T'" + +#~ msgid "invalid parameter type `%T'" +#~ msgstr "ugyldig parametertype '%T'" + +#~ msgid "in declaration `%D'" +#~ msgstr "i erklæringen '%D'" + +#~ msgid "creating pointer to member function of non-class type `%T'" +#~ msgstr "opretter henvisning til medlemsfunktion af typen '%T' der ikke er en klasse" + +#~ msgid "creating array with size zero" +#~ msgstr "opretter tabel med størrelsen nul" + +#~ msgid "creating array with size zero (`%E')" +#~ msgstr "opretter tabel med størrelsen nul ('%E')" + +#~ msgid "forming reference to void" +#~ msgstr "danner reference til void" + +#~ msgid "forming %s to reference type `%T'" +#~ msgstr "danner %s til referencetypen '%T'" + +#~ msgid "creating pointer to member of non-class type `%T'" +#~ msgstr "opretter henvisning til medlem af typen '%T' der ikke er en klasse" + +#~ msgid "creating pointer to member reference type `%T'" +#~ msgstr "opretter henvisning til medlemsreference af typen '%T'" + +#~ msgid "creating array of `%T'" +#~ msgstr "opretter tabel af '%T'" + +#~ msgid "`%T' is not a class, struct, or union type" +#~ msgstr "'%T' er ikke en class-, struct- eller union-type" + +#~ msgid "use of `%s' in template" +#~ msgstr "brug af '%s' i skabelon" + +#~ msgid "type `%T' composed from a local class is not a valid template-argument" +#~ msgstr "typen '%T' sammensat fra lokal klasse er ikke en gyldig skabelonsparameter" + +#~ msgid " trying to instantiate `%D'" +#~ msgstr " ved forsøg på at instantiere '%D'" + +#~ msgid "incomplete type unification" +#~ msgstr "ufuldstændig typeforening" + +#~ msgid "use of `%s' in template type unification" +#~ msgstr "brug af '%s' i skabelonstypeforening" + +#~ msgid "explicit instantiation of non-template `%#D'" +#~ msgstr "eksplicit instantiering af ikke-skabelon '%#D'" + +#~ msgid "no matching template for `%D' found" +#~ msgstr "ingen passende skabelon for '%D' fundet" + +#~ msgid "explicit instantiation of `%#D'" +#~ msgstr "eksplicit instantiering af '%#D'" + +#~ msgid "duplicate explicit instantiation of `%#D'" +#~ msgstr "'%#D' er blevet eksplicit instantieret mere end én gang" + +#~ msgid "ISO C++ forbids the use of `extern' on explicit instantiations" +#~ msgstr "ISO C++ forbyder brugen af 'extern' ved eksplicitte instantieringer" + +#~ msgid "storage class `%D' applied to template instantiation" +#~ msgstr "lagringsklasse '%D' anvendt på skabelonsinstantiering" + +#~ msgid "explicit instantiation of non-template type `%T'" +#~ msgstr "eksplicit instantiering af '%T' der ikke er en skabelonstype" + +#~ msgid "explicit instantiation of `%#T' before definition of template" +#~ msgstr "eksplicit instantiering af '%T' før definering af skabelonen" + +#~ msgid "ISO C++ forbids the use of `%s' on explicit instantiations" +#~ msgstr "ISO C++ forbyder brugen af '%s ved eksplicitte instantieringer" + +#~ msgid "duplicate explicit instantiation of `%#T'" +#~ msgstr "'%#T' er blevet eksplicit instantieret mere end én gang" + +#~ msgid "explicit instantiation of `%D' but no definition available" +#~ msgstr "eksplicit instantiering af '%D', men ingen definition tilgængelig" + +#~ msgid "`%#T' is not a valid type for a template constant parameter" +#~ msgstr "'%#T' er ikke en gyldig type for en skabelonsparameterkonstant " + +#~ msgid "-frepo must be used with -c" +#~ msgstr "-frepo skal bruges med -c" + +#~ msgid "mysterious repository information in %s" +#~ msgstr "mystisk info om opbevaringssted i '%s'" + +#~ msgid "can't create repository information file `%s'" +#~ msgstr "kan ikke oprette informationsfilen '%s' til opbevaringssted" + +#~ msgid "cannot use typeid with -fno-rtti" +#~ msgstr "kan ikke bruge typeid med -fno-rtti" + +#~ msgid "must #include before using typeid" +#~ msgstr "'#include ' er nødvendig før typeid kan benyttes" + +#~ msgid "cannot create type information for type `%T' because its size is variable" +#~ msgstr "kan ikke oprette typeinformation for typen '%T' fordi dens størrelse er variabel" + +#~ msgid "dynamic_cast of `%#D' to `%#T' can never succeed" +#~ msgstr "dynamic_cast af '%#D' til '%#T' kan aldrig lykkes" + +#~ msgid "cannot dynamic_cast `%E' (of type `%#T') to type `%#T' (%s)" +#~ msgstr "kan ikke anvende dynamic_cast på '%E' (af typen '%#T') til typen '%#T' (%s)" + +#~ msgid "`%T' is an inaccessible base of `%T'" +#~ msgstr "'%T' er en utilgængelig stamklasse til '%T'" + +#~ msgid "`%T' is an ambiguous base of `%T'" +#~ msgstr "'%T' er en tvetydig stamklasse til '%T'" + +#~ msgid "assignment to non-static member `%D' of enclosing class `%T'" +#~ msgstr "tildeling til ikke-statisk medlem '%D' af omgivende klasse '%T'" + +#~ msgid "adjusting pointers for covariant returns" +#~ msgstr "justerer henvisninger for kovariante returneringer" + +#~ msgid "invalid covariant return type for `%#D'" +#~ msgstr "ugyldig kovariant returneringstype for '%#D'" + +#~ msgid " overriding `%#D' (must be pointer or reference to class)" +#~ msgstr " overskriver '%#D' (skal være en henvisning eller reference til klasse)" + +#~ msgid " overriding `%#D' (must use pointer or reference)" +#~ msgstr " overskriver '%#D' (skal være en henvisning eller reference)" + +#~ msgid "conflicting return type specified for `%#D'" +#~ msgstr "modstridende returtyper angivet for '%#D'" + +#~ msgid " overriding `%#D'" +#~ msgstr " overskriver '%#D'" + +#~ msgid "looser throw specifier for `%#F'" +#~ msgstr "løsere throw-angivelse for '%#F'" + +#~ msgid " overriding `%#F'" +#~ msgstr " overskriver '%#F'" + +#~ msgid "`%#D' cannot be declared" +#~ msgstr "'%#D' kan ikke erklæres" + +#~ msgid " since `%#D' declared in base class" +#~ msgstr " eftersom '%#D' er erklæret i stamklassen" + +#~ msgid "`%#D' needs a final overrider" +#~ msgstr "'%#D' behøver en endelig overskrivning" + +#~ msgid "type of asm operand `%E' could not be determined" +#~ msgstr "typen af asm-operanden '%E' kunne ikke afgøres" + +#~ msgid "ISO C++ does not permit named return values" +#~ msgstr "ISO C++ tillader ikke navngivne returværdier" + +#~ msgid "return identifier `%D' already in place" +#~ msgstr "returkaldenavn '%D' allerede på plads" + +#~ msgid "can't redefine default return value for constructors" +#~ msgstr "kan ikke omdefinere standardreturværdi for konstruktionsfunktioner" + +#~ msgid "only constructors take base initializers" +#~ msgstr "kun konstruktionsfunktioner har stamklasseklargøringer" + +#~ msgid "`this' is unavailable for static member functions" +#~ msgstr "'this' er ikke tilgængelig for statiske medlemsfunktioner" + +#~ msgid "invalid use of `this' in non-member function" +#~ msgstr "ugyldig brug af 'this' i ikke-medlemsfunktion" + +#~ msgid "invalid use of `this' at top level" +#~ msgstr "ugyldig brug af 'this' ved øverste niveau" + +#~ msgid "calling type `%T' like a method" +#~ msgstr "kalder typen '%T' som en metode" + +#~ msgid "destructor specifier `%T::~%T()' must have matching names" +#~ msgstr "destruktionsangivelse '%T::~%T()' skal have ens navne" + +#~ msgid "`%E' is not of type `%T'" +#~ msgstr "'%E' er ikke af typen '%T'" + +#~ msgid "template type parameters must use the keyword `class' or `typename'" +#~ msgstr "skabelonstypeparametre skal begynde med 'class' eller 'typename'" + +#~ msgid "invalid default template argument" +#~ msgstr "ugyldig standardparameter i skabelon" + +#~ msgid "definition of `%#T' inside template parameter list" +#~ msgstr "definition af '%#T' inden i skabelonsparameterliste" + +#~ msgid "invalid definition of qualified type `%T'" +#~ msgstr "ugyldig definition af modificeret type '%T'" + +#~ msgid "invalid base-class specification" +#~ msgstr "ugyldig stamklasseangivelse" + +#~ msgid "base class `%T' has cv qualifiers" +#~ msgstr "stamklassen '%T' har const/volatile-modifikationer" + +#~ msgid "multiple declarators in template declaration" +#~ msgstr "flere erklærerer i skabelonserklæring" + +#~ msgid "type of `%E' is unknown" +#~ msgstr "typen af '%E' er ukendt" + +#~ msgid "identifier name `%s' conflicts with GNU C++ internal naming strategy" +#~ msgstr "kaldenavnet '%s' er i modstrid med den interne navngivningsstrategi i GNU c++" + +#~ msgid "parse error at end of saved function text" +#~ msgstr "tolkningsfejl ved slutningen af gemt funktionstekst" + +#~ msgid "%Hend of file read inside definition" +#~ msgstr "%Hslutningen af filen læst inden i definition" + +#~ msgid "parse error in method specification" +#~ msgstr "tolkningsfejl i medlemsfunktionsangivelsen" + +#~ msgid "function body for constructor missing" +#~ msgstr "kroppen til konstruktionsfunktionen mangler" + +#~ msgid "%Hend of file read inside default argument" +#~ msgstr "%Hslutningen af filen læst inden i standardparameter" + +#~ msgid "circular dependency in default args of `%#D'" +#~ msgstr "cirkulær afhængighed i standardparametre til '%#D'" + +#~ msgid "invalid type `%T' for default argument to `%T'" +#~ msgstr "ugyldig type '%T' for standardparameter til '%T'" + +#~ msgid "%s before `%s'" +#~ msgstr "%s før '%s'" + +#~ msgid "%s before `%c'" +#~ msgstr "%s før '%c'" + +#~ msgid "%s before `\\%o'" +#~ msgstr "%s før '\\%o'" + +#~ msgid "%s before `%s' token" +#~ msgstr "%s før symbolet '%s'" + +#~ msgid "non-lvalue in %s" +#~ msgstr "ikke-venstreværdi i %s" + +#~ msgid "`%V' qualifiers cannot be applied to `%T'" +#~ msgstr "modifikationerne '%V' kan ikke anvendes på '%T'" + +#~ msgid "`%s' attribute can only be applied to Java class definitions" +#~ msgstr "egenskaben '%s' kan kun anvendes med Java-klassedefinitioner" + +#~ msgid "`%s' attribute can only be applied to class definitions" +#~ msgstr "egenskaben '%s' kan kun anvendes med klassedefinitioner" + +#~ msgid "`%s' is obsolete; g++ vtables are now COM-compatible by default" +#~ msgstr "'%s' er forældet; virtuelle tabeller i g++ er nu COM-kompatible som standard" + +#~ msgid "requested init_priority is not an integer constant" +#~ msgstr "den udbedte init_priority er ikke en heltalskonstant" + +#~ msgid "can only use `%s' attribute on file-scope definitions of objects of class type" +#~ msgstr "kan kun bruge egenskaben '%s' på filvirkefeltsdefinitioner af objekter af klassetype" + +#~ msgid "requested init_priority is out of range" +#~ msgstr "den udbedte init_priority er uden for det gyldige interval" + +#~ msgid "requested init_priority is reserved for internal use" +#~ msgstr "den udbedte init_priority er reserveret til intern brug" + +#~ msgid "`%s' attribute is not supported on this platform" +#~ msgstr "egenskaben '%s' er ikke understøttet på denne platform" + +#~ msgid "lang_* check: failed in %s, at %s:%d" +#~ msgstr "lang_*-kontrol: mislykkedes i %s, ved %s:%d" + +#~ msgid "ISO C++ forbids %s between pointer of type `void *' and pointer-to-function" +#~ msgstr "ISO C++ forbyder %s mellem henvisning af typen 'void *' og henvisning til funktion" + +#~ msgid "%s between distinct pointer types `%T' and `%T' lacks a cast" +#~ msgstr "%s mellem forskellige henvisningstyper '%T' og '%T' mangler en typeomtvingelse" + +#~ msgid "ISO C++ prohibits conversion from `%#T' to `(...)'" +#~ msgstr "ISO C++ forbyder konvertering fra '%#T' til '(...)'" + +#~ msgid "invalid application of `%s' to a member function" +#~ msgstr "ugyldig brug af '%s' på en medlemsfunktion" + +#~ msgid "invalid application of `%s' to non-static member" +#~ msgstr "ugyldig brug af '%s' på et ikke-statisk medlem" + +#~ msgid "sizeof applied to a bit-field" +#~ msgstr "'sizeof' benyttet på et bitfelt" + +#~ msgid "ISO C++ forbids applying `sizeof' to an expression of function type" +#~ msgstr "ISO C++ forbyder anvendelse af 'sizeof' på et udtryk af en funktionstype" + +#~ msgid "invalid use of non-lvalue array" +#~ msgstr "ugyldig brug af en tabel der ikke kan optræde som en venstreværdi" + +#~ msgid "deprecated conversion from string constant to `%T'" +#~ msgstr "forældet konvertering fra strengkonstant til '%T'" + +#~ msgid "request for member `%D' in `%E', which is of non-class type `%T'" +#~ msgstr "forespørgsel efter medlemmet '%D' i '%E' som er af en ikke-klassetype '%T'" + +#~ msgid "`%D' is not a member of `%T'" +#~ msgstr "'%D' er ikke et medlem af '%T'" + +#~ msgid "invalid access to non-static data member `%D' of NULL object" +#~ msgstr "ugyldig tilgang til ikke-statisk datamedlem '%D' af NULL-objekt" + +#~ msgid "(perhaps the `offsetof' macro was used incorrectly)" +#~ msgstr "(måske blev 'offsetof'-makroen benyttet forkert)" + +#~ msgid "`%D::%D' is not a member of `%T'" +#~ msgstr "'%D::%D' er ikke et medlem af '%T'" + +#~ msgid "destructor specifier `%T::~%T' must have matching names" +#~ msgstr "destruktionsangivelse '%T::~%T' skal have ens navne" + +#~ msgid "type `%T' has no destructor" +#~ msgstr "typen '%T' har ingen destruktionsfunktion" + +#~ msgid "`%D' is not a member template function" +#~ msgstr "'%D' er ikke en medlemsskabelonfunktion" + +#~ msgid "`%T' is not a pointer-to-object type" +#~ msgstr "'%T' er ikke af en henvisning til objekt-type" + +#~ msgid "invalid use of `%s' on pointer to member" +#~ msgstr "ugyldig brug af '%s' på henvisning til medlem" + +#~ msgid "invalid type argument" +#~ msgstr "ugyldig typeparameter" + +#~ msgid "ISO C++ forbids subscripting non-lvalue array" +#~ msgstr "ISO C++ forbyder indeksering af en ikke-venstreværdis tabel" + +#~ msgid "subscripting array declared `register'" +#~ msgstr "indeksering af tabel som er erklæret 'register'" + +#~ msgid "object missing in use of `%E'" +#~ msgstr "objekt mangler i brug af '%E'" + +#~ msgid "ISO C++ forbids calling `::main' from within program" +#~ msgstr "ISO C++ forbyder kald af '::main' inde fra programmet" + +#~ msgid "must use .* or ->* to call pointer-to-member function in `%E (...)'" +#~ msgstr "brug .* eller ->* i kald af henvisning til medlemsfunktion i '%E (...)'" + +#~ msgid "`%E' cannot be used as a function" +#~ msgstr "'%E' kan ikke bruges som en funktion" + +#~ msgid "too many arguments to %s `%+#D'" +#~ msgstr "for mange parametre til %s '%+#D'" + +#~ msgid "parameter type of called function is incomplete" +#~ msgstr "parametertypen for den kaldte funktion er ufuldstændig" + +#~ msgid "too few arguments to %s `%+#D'" +#~ msgstr "for få parametre til %s '%+#D'" + +#~ msgid "assuming cast to type `%T' from overloaded function" +#~ msgstr "antager typeomtvingning til typen '%T' fra flertydig funktion" + +#~ msgid "division by zero in `%E / 0'" +#~ msgstr "division med nul i '%E / 0'" + +#~ msgid "division by zero in `%E / 0.'" +#~ msgstr "division med nul i '%E / 0.'" + +#~ msgid "division by zero in `%E %% 0'" +#~ msgstr "division med nul i '%E %% 0'" + +#~ msgid "division by zero in `%E %% 0.'" +#~ msgstr "division med nul i '%E %% 0.'" + +#~ msgid "%s rotate count is negative" +#~ msgstr "%s-roteringsantal er negativt" + +#~ msgid "%s rotate count >= width of type" +#~ msgstr "%s-roteringsantal >= bredden af typen" + +#~ msgid "ISO C++ forbids comparison between pointer and integer" +#~ msgstr "ISO C++ forbyder sammenligning mellem henvisningsvariabel og heltal" + +#~ msgid "comparison between types `%#T' and `%#T'" +#~ msgstr "sammenligning mellem typerne '%#T' og '%#T'" + +#~ msgid "comparison between signed and unsigned integer expressions" +#~ msgstr "sammenlign mellem signed og unsigned heltalsudtryk" + +#~ msgid "invalid operands of types `%T' and `%T' to binary `%O'" +#~ msgstr "ugyldige operander af typerne '%T' og '%T' til binær '%O'" + +#~ msgid "NULL used in arithmetic" +#~ msgstr "NULL benyttet i udregning" + +#~ msgid "ISO C++ forbids using pointer of type `void *' in subtraction" +#~ msgstr "ISO C++ forbyder brug af henvisning af typen 'void *' i fratrækning" + +#~ msgid "ISO C++ forbids using pointer to a function in subtraction" +#~ msgstr "ISO C++ forbyder brug af henvisning til funktion i fratrækning" + +#~ msgid "ISO C++ forbids using pointer to a method in subtraction" +#~ msgstr "ISO C++ forbyder brug af henvisning til medlemsfunktion i fratrækning" + +#~ msgid "ISO C++ forbids using pointer to a member in subtraction" +#~ msgstr "ISO C++ forbyder brug af henvisning til medlem i fratrækning" + +#~ msgid "invalid use of a pointer to an incomplete type in pointer arithmetic" +#~ msgstr "ugyldig brug af en henvisning til en ufuldstændig type i henvisningsberegning" + +#~ msgid "invalid use of '%E' to form a pointer-to-member-function. Use a qualified-id." +#~ msgstr "ugyldig brug af '%E' til at danne en henvisning til medlemsfunktion; benyt et kaldenavn med klassepræfiks" + +#~ msgid "parenthesis around '%E' cannot be used to form a pointer-to-member-function" +#~ msgstr "paranteser omkring '%E' kan ikke bruges til at danne en henvisning til medlemsfunktion" + +#~ msgid "taking address of temporary" +#~ msgstr "tager adressen på midlertidig variabel" + +#~ msgid "ISO C++ forbids %sing an enum" +#~ msgstr "ISO C++ forbyder %s af en enum" + +#~ msgid "cannot %s a pointer to incomplete type `%T'" +#~ msgstr "kan ikke %s en henvisning til en ufuldstændig type '%T'" + +#~ msgid "ISO C++ forbids %sing a pointer of type `%T'" +#~ msgstr "ISO C++ forbyder %s af en henvisning af typen '%T'" + +#~ msgid "cast to non-reference type used as lvalue" +#~ msgstr "typeomtvingning til ikke-reference-type benyttet som venstreværdi" + +#~ msgid "invalid use of `--' on bool variable `%D'" +#~ msgstr "ugyldig brug af '--' på den booleske variabel '%D'" + +#~ msgid "ISO C++ forbids taking address of function `::main'" +#~ msgstr "ISO C++ forbyder at tage adressen på funktionen '::main'" + +#~ msgid "ISO C++ forbids taking the address of an unqualified non-static member function to form a pointer to member function. Say `&%T::%D'" +#~ msgstr "ISO C++ forbyder at tage adressen på en ikke-modificeret, ikke-statisk medlemsfunktion for at danne en henvisning til medlemsfunktion; brug '&%T::%D'" + +#~ msgid "ISO C++ forbids taking the address of a bound member function to form a pointer to member function. Say `&%T::%D'" +#~ msgstr "ISO C++ forbyder at tage adressen på en bundet medlemsfunktion for at danne en henvisning til medlemsfunktion; brug '&%T::%D'" + +#~ msgid "ISO C++ forbids taking the address of a cast to a non-lvalue expression" +#~ msgstr "ISO C++ forbyder at tage adressen på en typeomtvingning til et udtryk der ikke er en venstreværdi" + +#~ msgid "attempt to take address of bit-field structure member `%D'" +#~ msgstr "forsøg på at finde adressen af bitfeltstrukturmedlemmet '%D'" + +#~ msgid "taking address of destructor" +#~ msgstr "tager adressen på en destruktionsfunktion" + +#~ msgid "taking address of bound pointer-to-member expression" +#~ msgstr "tager adressen på et bundet henvisning til medlem-udtryk" + +#~ msgid "cannot create pointer to reference member `%D'" +#~ msgstr "kan ikke oprette henvisning til reference medlemmet '%D'" + +#~ msgid "cannot take the address of `this', which is an rvalue expression" +#~ msgstr "kan ikke tage adressen af 'this' som er et højreværdiudtryk" + +#~ msgid "address requested for `%D', which is declared `register'" +#~ msgstr "adresse forespurgt for '%D' som er erklæret 'register'" + +#~ msgid "static_cast from type `%T' to type `%T' casts away constness" +#~ msgstr "static_cast fra typen '%T' til typen '%T' fjerner konstanthed" + +#~ msgid "invalid static_cast from type `%T' to type `%T'" +#~ msgstr "ugyldig static_cast fra typen '%T' til typen '%T'" + +#~ msgid "invalid reinterpret_cast of an rvalue expression of type `%T' to type `%T'" +#~ msgstr "ugyldig reinterpret_cast af et højreværdiudtryk fra typen '%T' til typen '%T'" + +#~ msgid "reinterpret_cast from `%T' to `%T' loses precision" +#~ msgstr "reinterpret_cast fra '%T' til '%T' mister præcision" + +#~ msgid "reinterpret_cast from `%T' to `%T' casts away const (or volatile)" +#~ msgstr "reinterpret_cast fra '%T' til '%T' fjerner const (eller volatile)" + +#~ msgid "ISO C++ forbids casting between pointer-to-function and pointer-to-object" +#~ msgstr "ISO C++ forbyder sammenligninger mellem henvisning til funktion og henvisning til objekt" + +#~ msgid "invalid reinterpret_cast from type `%T' to type `%T'" +#~ msgstr "ugyldig reinterpret_cast fra typen '%T' til typen '%T'" + +#~ msgid "invalid use of const_cast with type `%T', which is not a pointer, reference, nor a pointer-to-data-member type" +#~ msgstr "ugyldig brug af const_cast med typen '%T' som ikke er en henvisnings-, reference- eller en henvisning til datamedlem-type" + +#~ msgid "invalid use of const_cast with type `%T', which is a pointer or reference to a function type" +#~ msgstr "ugyldig brug af const_cast med typen '%T' som er en henvisning eller reference til funktion" + +#~ msgid "invalid const_cast of an rvalue of type `%T' to type `%T'" +#~ msgstr "ugyldig const_cast af en højreværdi fra typen '%T' til typen '%T'" + +#~ msgid "invalid const_cast from type `%T' to type `%T'" +#~ msgstr "ugyldig const_cast fra typen '%T' til typen '%T'" + +#~ msgid "ISO C++ forbids casting to an array type `%T'" +#~ msgstr "ISO C++ forbyder omtvingelse af typen til en tabeltype '%T'" + +#~ msgid "invalid cast to function type `%T'" +#~ msgstr "ugyldig omtvingelse til funktionstypen '%T'" + +#~ msgid "cast from `%T' to `%T' discards qualifiers from pointer target type" +#~ msgstr "typeomtvingning fra '%T' til '%T' kasserer modifikationer på henvisningsmålets type" + +#~ msgid "cast from `%T' to `%T' increases required alignment of target type" +#~ msgstr "typeomtvingning fra '%T' til '%T' forøger den påkrævede justering af målets type" + +#~ msgid " in evaluation of `%Q(%#T, %#T)'" +#~ msgstr " i evaluering af '%Q(%#T, %#T)'" + +#~ msgid "ISO C++ forbids cast to non-reference type used as lvalue" +#~ msgstr "ISO C++ forbyder omtvingelse af typen til en ikke-reference-type benyttet som venstreværdi" + +#~ msgid "incompatible types in assignment of `%T' to `%T'" +#~ msgstr "uforenelige typer i tildeling af '%T' til '%T'" + +#~ msgid "ISO C++ forbids assignment of arrays" +#~ msgstr "ISO C++ forbyder tildeling af tabeller" + +#~ msgid " in pointer to member function conversion" +#~ msgstr " i henvisning til medlemsfunktion-omdannelse" + +#~ msgid " in pointer to member conversion" +#~ msgstr " i henvisning til medlem-omdannelse" + +#~ msgid "pointer to member cast via virtual base `%T' of `%T'" +#~ msgstr "henvisning til medlem-typeomtvingning via den virtuelle stamklasse '%T' af '%T'" + +#~ msgid "pointer to member conversion via virtual base `%T' of `%T'" +#~ msgstr "henvisning til medlem-omdannelse via den virtuelle stamklasse '%T' af '%T'" + +#~ msgid "invalid conversion to type `%T' from type `%T'" +#~ msgstr "ugyldig omdannelse til typen '%T' fra typen '%T'" + +# %s bliver til returnering eller tildeling eller noget i den retning +#~ msgid "passing NULL used for non-pointer %s %P of `%D'" +#~ msgstr "overbringelse af NULL benyttet for ikke-henvisnings%s %P af '%D'" + +#~ msgid "%s to non-pointer type `%T' from NULL" +#~ msgstr "%s til ikke-henvisningstypen '%T' fra NULL" + +#~ msgid "passing `%T' for %s %P of `%D'" +#~ msgstr "overbringelse af '%T' for ikke-henvisnings%s %P af '%D'" + +#~ msgid "%s to `%T' from `%T'" +#~ msgstr "%s til '%T' fra '%T'" + +#~ msgid "passing negative value `%E' for %s %P of `%D'" +#~ msgstr "overbringelse af negativ værdi '%E' for %s %P af '%D'" + +#~ msgid "%s of negative value `%E' to `%T'" +#~ msgstr "%s af negativ værdi '%E' til `%T'" + +#~ msgid "cannot convert `%T' to `%T' for argument `%P' to `%D'" +#~ msgstr "kan ikke konvertere '%T' til '%T' for parameter '%P' til '%D'" + +#~ msgid "cannot convert `%T' to `%T' in %s" +#~ msgstr "kan ikke konvertere '%T' til '%T' i %s" + +#~ msgid "in passing argument %P of `%+D'" +#~ msgstr "i overbringelse af parameter %P af '%+D'" + +#~ msgid "returning reference to temporary" +#~ msgstr "returnerer reference til midlertidig variabel" + +#~ msgid "reference to non-lvalue returned" +#~ msgstr "reference til ikke-venstreværdi returneret" + +#~ msgid "reference to local variable `%D' returned" +#~ msgstr "reference til den lokale variabel '%D' returneret" + +#~ msgid "address of local variable `%D' returned" +#~ msgstr "adresse af den lokale variabel '%D' returneret" + +#~ msgid "returning a value from a destructor" +#~ msgstr "returnerer en værdi fra en destruktionsfunktion" + +#~ msgid "cannot return from a handler of a function-try-block of a constructor" +#~ msgstr "kan ikke returnere fra en håndtering af en funktions-try-blok i en konstruktionsfunktion" + +#~ msgid "returning a value from a constructor" +#~ msgstr "returnerer en værdi fra en konstruktionsfunktion" + +#~ msgid "return-statement with no value, in function declared with a non-void return type" +#~ msgstr "return-sætning uden en værdi i en funktion der er erklæret med en ikke-void returtype" + +#~ msgid "return-statement with a value, in function declared with a void return type" +#~ msgstr "return-sætning med en værdi i en funktion der er erklæret med en void returtype" + +#~ msgid "`operator new' must not return NULL unless it is declared `throw()' (or -fcheck-new is in effect)" +#~ msgstr "'operator new' må ikke returnere NULL medmindre den er erklæret 'throw()' (eller -fcheck-new er benyttet)" + +#~ msgid "type `%T' is not a base type for type `%T'" +#~ msgstr "typen '%T' er ikke en grundtype for typen '%T'" + +#~ msgid "cannot declare variable `%D' to be of type `%T'" +#~ msgstr "kan ikke erklære variablen '%D' til at være af typen '%T'" + +#~ msgid "cannot declare parameter `%D' to be of type `%T'" +#~ msgstr "kan ikke erklære parameteren '%D' til at være af typen '%T'" + +#~ msgid "cannot declare field `%D' to be of type `%T'" +#~ msgstr "kan ikke erklære feltet '%D' til at være af typen '%T'" + +#~ msgid "invalid return type for member function `%#D'" +#~ msgstr "ugyldig returtype for medlemsfunktionen '%#D'" + +#~ msgid "invalid return type for function `%#D'" +#~ msgstr "ugyldig returtype for funktionen '%#D'" + +#~ msgid "cannot allocate an object of type `%T'" +#~ msgstr "kan ikke allokere et objekt af typen '%T'" + +#~ msgid " because the following virtual functions are abstract:" +#~ msgstr " eftersom de følgende virtuelle funktioner er abstrakte:" + +#~ msgid "\t%#D" +#~ msgstr "\t%#D" + +#~ msgid " since type `%T' has abstract virtual functions" +#~ msgstr " eftersom typen '%T' har abstrakte virtuelle funktioner" + +#~ msgid "constructor syntax used, but no constructor declared for type `%T'" +#~ msgstr "konstruktionsfunktionsyntaks benyttet, men ingen konstruktionsfunktion er erklæret for typen '%T'" + +#~ msgid "comma expression used to initialize return value" +#~ msgstr "kommaudtryk benyttet til at klargøre returværdi" + +#~ msgid "cannot initialize arrays using this syntax" +#~ msgstr "kan ikke tildele tabeller startværdier med denne syntaks" + +#~ msgid "initializing array with parameter list" +#~ msgstr "klargør tabel med en parameterliste" + +#~ msgid "initializer for scalar variable requires one element" +#~ msgstr "startværdien for en skalarvariabel kan kun bestå af ét element" + +#~ msgid "braces around scalar initializer for `%T'" +#~ msgstr "krøllede paranteser omkring skalarstartværdi for '%T'" + +#~ msgid "ignoring extra initializers for `%T'" +#~ msgstr "ignorerer ekstra startværdier for '%T'" + +#~ msgid "variable-sized object of type `%T' may not be initialized" +#~ msgstr "objekt af typen '%T' med variabel størrelse må ikke tildeles en startværdi" + +#~ msgid "subobject of type `%T' must be initialized by constructor, not by `%E'" +#~ msgstr "underobjekt af typen '%T' skal klargøres af en konstruktionsfunktion, ikke af '%E'" + +#~ msgid "aggregate has a partly bracketed initializer" +#~ msgstr "sammensat type har delvis indklammet startværdi" + +#~ msgid "non-trivial labeled initializers" +#~ msgstr "ikke-trivielle navngivne startværdier" + +#~ msgid "non-empty initializer for array of empty elements" +#~ msgstr "en startværdi der ikke er tom, tildeles til en tabel med tomme elementer" + +#~ msgid "initializer list for object of class with virtual base classes" +#~ msgstr "klargøringsliste for objekt af en klasse med virtuelle stamklasser" + +#~ msgid "initializer list for object of class with base classes" +#~ msgstr "klargøringsliste for objekt af en klasse med stamklasser" + +#~ msgid "initializer list for object using virtual functions" +#~ msgstr "klargøringsliste for objekt med virtuelle funktioner" + +#~ msgid "missing initializer for member `%D'" +#~ msgstr "manglende startværdi for medlemmet '%D'" + +#~ msgid "uninitialized const member `%D'" +#~ msgstr "konstant medlem '%D' uden startværdi" + +#~ msgid "member `%D' with uninitialized const fields" +#~ msgstr "medlem '%D' med konstante felter uden startværdi" + +#~ msgid "member `%D' is uninitialized reference" +#~ msgstr "medlemmet '%D' er en reference uden startværdi" + +#~ msgid "index value instead of field name in union initializer" +#~ msgstr "indeksværdi i stedet for feltnavn i union-startværdi" + +#~ msgid "no field `%D' in union being initialized" +#~ msgstr "intet felt '%D' i union der tildeles startværdi" + +#~ msgid "union `%T' with no named members cannot be initialized" +#~ msgstr "union '%T' uden navngivne elementer kan ikke tildeles startværdi" + +#~ msgid "excess elements in aggregate initializer" +#~ msgstr "for mange elementer i startværdi til sammensat type" + +#~ msgid "circular pointer delegation detected" +#~ msgstr "fundet en henvisningsefterfølgelse der går i ring" + +#~ msgid "base operand of `->' has non-pointer type `%T'" +#~ msgstr "grundoperanden til '->' har en ikke-henvisningstype '%T'" + +#~ msgid "result of `operator->()' yields non-pointer result" +#~ msgstr "resultatet af 'operator->()' er ikke en henvisning" + +#~ msgid "base operand of `->' is not a pointer" +#~ msgstr "grundoperanden til '->' er ikke en henvisning" + +#~ msgid "`%E' cannot be used as a member pointer, since it is of type `%T'" +#~ msgstr "'%E' kan ikke bruges som en medlemshenvisning eftersom udtrykkets type er '%T'" + +#~ msgid "cannot apply member pointer `%E' to `%E', which is of non-aggregate type `%T'" +#~ msgstr "kan ikke anvende medlemshenvisning '%E' på '%E' som er af den ikke-sammensatte type '%T'" + +#~ msgid "member type `%T::' incompatible with object type `%T'" +#~ msgstr "medlemstypen '%T::' uforenelige med objekttypen '%T'" + +#~ msgid "`%T' fails to be a typedef or built-in type" +#~ msgstr "'%T' er hverken en typedef eller en indbygget type" + +#~ msgid "ISO C++ forbids defining types within %s" +#~ msgstr "ISO C++ forbyder definering af typer inden i %s" + +#~ msgid "call to function `%D' which throws incomplete type `%#T'" +#~ msgstr "kald af en funktion '%D' som kaster en ufuldstændig type '%#T'" + +#~ msgid "call to function which throws incomplete type `%#T'" +#~ msgstr "kald af en funktion som kaster en ufuldstændig type '%#T'" + +#~ msgid "%s is deprecated, please see the documentation for details" +#~ msgstr "%s er forældet, se venligst dokumentationen for detaljer" + +#~ msgid "Do not obey access control semantics" +#~ msgstr "Adlyd ikke tilgangskontrolsemantikker" + +#~ msgid "Change when template instances are emitted" +#~ msgstr "Skift hvornår skabelonsinstanser udsendes" + +#~ msgid "Check the return value of new" +#~ msgstr "Kontrollér returværdien for new" + +#~ msgid "Reduce size of object files" +#~ msgstr "Reducér størrelsen af objektfiler" + +#~ msgid "Make string literals `char[]' instead of `const char[]'" +#~ msgstr "Gør strengkonstanter til 'char[]' i stedet for 'const char[]'" + +#~ msgid "Dump the entire translation unit to a file" +#~ msgstr "Anbring hele oversættelsesenheden i en fil" + +#~ msgid "Do not inline member functions by default" +#~ msgstr "Integrér ikke medlemsfunktioner som standard" + +#~ msgid "Do not generate run time type descriptor information" +#~ msgstr "Generér ikke typebeskrivelsesoplysninger til kørselstidspunktet" + +#~ msgid "Do not generate code to check exception specifications" +#~ msgstr "Generér ikke kode til at kontrollere undtagelsesspecifikationer" + +#~ msgid "Scope of for-init-statement vars extends outside" +#~ msgstr "Udvid virkefeltet for variabler i for-klargøringssætninger" + +#~ msgid "Do not recognize GNU defined keywords" +#~ msgstr "Genkend ikke GNU-definerede reserverede ord" + +#~ msgid "Enable support for huge objects" +#~ msgstr "Aktivér understøttelse af enorme objekter" + +#~ msgid "Export functions even if they can be inlined" +#~ msgstr "Eksportér funktioner også selvom de kan integreres" + +#~ msgid "Only emit explicit template instantiations" +#~ msgstr "Udsend kun eksplicitte skabelonsinstatieringer" + +#~ msgid "Only emit explicit instantiations of inline templates" +#~ msgstr "Udsend kun eksplicitte instatieringer af indlejrede skabeloner" + +#~ msgid "Don't pedwarn about uses of Microsoft extensions" +#~ msgstr "Udsend ikke pedantiske advarsler om brug af Microsoft-udvidelser" + +#~ msgid "Recognize and/bitand/bitor/compl/not/or/xor" +#~ msgstr "Genkend and/bitand/bitor/compl/not/or/xor" + +#~ msgid "Disable optional diagnostics" +#~ msgstr "Deaktivér valgfrie diagnosticeringer" + +#~ msgid "Downgrade conformance errors to warnings" +#~ msgstr "Nedgradér standardoverholdelsesfejl til advarsler" + +#~ msgid "Enable automatic template instantiation" +#~ msgstr "Aktivér automatisk skabelonsinstantiering" + +#~ msgid "Display statistics accumulated during compilation" +#~ msgstr "Vis statistik som indsamles under oversættelsen" + +#~ msgid "Specify maximum template instantiation depth" +#~ msgstr "Angiv maksimal skabelonsinstantieringsdybde" + +#~ msgid "Use __cxa_atexit to register destructors" +#~ msgstr "Benyt __cxa_atexit til at registrere destruktionsfunktioner" + +#~ msgid "Discard unused virtual functions" +#~ msgstr "Kassér ubrugte virtuelle funktioner" + +#~ msgid "Implement vtables using thunks" +#~ msgstr "Implementér virtuelle tabeller vha. thunk-kode" + +#~ msgid "Emit common-like symbols as weak symbols" +#~ msgstr "Udsend almindelige symboler som svage symboler" + +#~ msgid "Emit cross referencing information" +#~ msgstr "Udsend krydsreferenceoplysninger" + +#~ msgid "Warn about inconsistent return types" +#~ msgstr "Advar om inkonsistente returtyper" + +#~ msgid "Warn about overloaded virtual function names" +#~ msgstr "Advar om flertydige virtuelle funktionsnavne" + +#~ msgid "Don't warn when all ctors/dtors are private" +#~ msgstr "Advar ikke når alle konstruktions-/destruktionsfunktioner er private" + +#~ msgid "Warn about non virtual destructors" +#~ msgstr "Advar om ikke-virtuelle destruktionsfunktioner" + +#~ msgid "Warn when a function is declared extern, then inline" +#~ msgstr "Advar når en funktion erklæret extern erklæres inline" + +#~ msgid "Warn when the compiler reorders code" +#~ msgstr "Advar når oversætteren ændrer på ordenen af kode" + +#~ msgid "Warn when synthesis behavior differs from Cfront" +#~ msgstr "Advar når synteseopførslen adskiller sig fra Cfront" + +#~ msgid "Don't warn when type converting pointers to member functions" +#~ msgstr "Advar ikke ved typeomdannelse af henvisninger til medlemsfunktioner" + +#~ msgid "Warn about violations of Effective C++ style rules" +#~ msgstr "Advar om overtrædelser af stilreglerne fra Effective C++" + +#~ msgid "Warn when overload promotes from unsigned to signed" +#~ msgstr "Advar når flertydiggørelse forfremmer fra unsigned til signed" + +#~ msgid "Warn if a C style cast is used in a program" +#~ msgstr "Advar hvis en typeomtvingning i C-stil benyttes" + +#~ msgid "Don't warn when non-templatized friend functions are declared within a template" +#~ msgstr "Advar ikke når ikke-skabelonsvennefunktioner erklæres inde i en skabelon" + +#~ msgid "Don't announce deprecation of compiler features" +#~ msgstr "Annoncér ikke forældelse af oversætterfaciliteter" + +#~ msgid "note:" +#~ msgstr "bemærk:" + +#~ msgid "warning:" +#~ msgstr "advarsel: " + +#~ msgid "fatal:" +#~ msgstr "fatal:" + +#~ msgid "(continued):" +#~ msgstr "(fortsat):" + +#~ msgid "[REPORT BUG!!] %" +#~ msgstr "[RAPPORTER FEJL!] %" + +#~ msgid "[REPORT BUG!!]" +#~ msgstr "[RAPPORTER FEJL!]" + +#~ msgid "ASSIGN'ed label cannot fit into `%A' at %0 -- using wider sibling" +#~ msgstr "ASSIGN'et etiket kan ikke passe i '%A' ved %0 - bruger bredere søskende" + +#~ msgid "no INTEGER type can hold a pointer on this configuration" +#~ msgstr "ingen INTEGER-type kan opbevare en henvisning i denne konfiguration" + +#~ msgid "configuration: REAL, INTEGER, and LOGICAL are %d bits wide," +#~ msgstr "konfiguration: REAL, INTEGER og LOGICAL er %d bit brede," + +#~ msgid "and pointers are %d bits wide, but g77 doesn't yet work" +#~ msgstr "og henvisninger er %d bit brede, men g77 virker endnu ikke" + +#~ msgid "properly unless they all are 32 bits wide" +#~ msgstr "ordentligt medmindre de alle er 32 bit brede" + +#~ msgid "Please keep this in mind before you report bugs." +#~ msgstr "Husk venligst på dette før du rapporterer fejl." + +#~ msgid "configuration: char * holds %d bits, but ftnlen only %d" +#~ msgstr "konfiguration: char * holder %d bit, men ftnlen kun %d" + +#~ msgid "" +#~ "configuration: char * holds %d bits, but INTEGER only %d --\n" +#~ " ASSIGN statement might fail" +#~ msgstr "konfiguration: char * holder %d bit, men INTEGER kun %d - ASSIGN-sætning kan mislykkes" + +#~ msgid "In statement function" +#~ msgstr "I sætningsfunktion" + +#~ msgid "Outside of any program unit:\n" +#~ msgstr "Uden for nogen programenhed:\n" + +#~ msgid "%A from %B at %0%C" +#~ msgstr "%A fra %B ved %0%C" + +#~ msgid "directory name must immediately follow -I" +#~ msgstr "et katalognavn skal følge umiddelbart efter -I" + +#~ msgid "At %0, INCLUDE file %A exists, but is not readable" +#~ msgstr "Ved %0 eksisterer INCLUDE-filen %A, men kan ikke læses" + +#~ msgid "At %0, INCLUDE nesting too deep" +#~ msgstr "Ved %0 er INCLUDE-indlejring for dyb" + +#~ msgid "Two arithmetic operators in a row at %0 and %1 -- use parentheses" +#~ msgstr "To aritmetiske operatorer efter hinanden ved %0 og %1 - benyt paranteser" + +#~ msgid "Operator at %0 has lower precedence than that at %1 -- use parentheses" +#~ msgstr "Operatoren ved %0 har lavere prioritet end den ved %1 - benyt paranteser" + +#~ msgid "Use .EQV./.NEQV. instead of .EQ./.NE. at %0 for LOGICAL operands at %1 and %2" +#~ msgstr "Benyt .EQV./.NEQV. i stedet for .EQ./.NE. ved %0 for LOGICAL-operander ved %1 og %2" + +#~ msgid "Unsupported operand for ** at %1 -- converting to default INTEGER" +#~ msgstr "Ikke-understøttet operand for ** ved %1 - konverterer til standard-INTEGER" + +#~ msgid "overflowed output arg list for `%s'" +#~ msgstr "overløb i uddataparameterlist for '%s'" + +#~ msgid "--driver no longer supported" +#~ msgstr "--driver understøttes ikke længere" + +#~ msgid "argument to `%s' missing" +#~ msgstr "parameter til '%s' mangler" + +#~ msgid "no input files; unwilling to write output files" +#~ msgstr "ingen inputfiler; vil ikke skrive outputfiler" + +#~ msgid "Implicit declaration of `%A' at %0" +#~ msgstr "Implicit erklæring af '%A' ved %0" + +#~ msgid "Non-ISO-C-standard escape sequence `\\%A' at %0" +#~ msgstr "Undvigesekvensen '\\%A' ved %0 følger ikke ISO C-standarden" + +#~ msgid "Unknown escape sequence `\\%A' at %0" +#~ msgstr "Ukendt undvigesekvens '\\%A' ved %0" + +#~ msgid "Unterminated escape sequence `\\' at %0" +#~ msgstr "Uafsluttet undvigsekvens '\\' ved %0" + +#~ msgid "Unknown escape sequence `\\' followed by char code 0x%A at %0" +#~ msgstr "Ukendt undvigesekvens '\\' efterfulgt af tegnkode 0x%A ved %0" + +#~ msgid "\\x used at %0 with no following hex digits" +#~ msgstr "\\x angivet ved %0 uden efterfølgende hexadecimale cifre" + +#~ msgid "Hex escape at %0 out of range" +#~ msgstr "Hexadecimal undvigesekvens ved %0 er uden for det gyldige interval" + +#~ msgid "Escape sequence at %0 out of range for character" +#~ msgstr "Undvigesekvens ved %0 er uden for det gyldig interval for tegn" + +#~ msgid "hex escape out of range" +#~ msgstr "hexadecimal undvigesekvens er uden for det gyldige interval" + +#~ msgid "non-ANSI-standard escape sequence, `\\%c'" +#~ msgstr "undvigesekvensen '\\%c' følger ikke ANSI-standarden" + +#~ msgid "non-ISO escape sequence `\\%c'" +#~ msgstr "undvigesekvensen '\\%c' følger ikke ISO-standarden" + +#~ msgid "unknown escape sequence `\\%c'" +#~ msgstr "ukendt undvigesekvens '\\%c'" + +#~ msgid "unknown escape sequence: `\\' followed by char code 0x%x" +#~ msgstr "ukendt undvigesekvens: '\\' efterfulgt af tegnkoden 0x%x" + +#~ msgid "badly formed directive -- no closing quote" +#~ msgstr "forkert udformet direktiv - intet afsluttende anførselstegn" + +#~ msgid "#-lines for entering and leaving files don't match" +#~ msgstr "#-linjer til at træde ind og ud af filer passer ikke" + +#~ msgid "bad directive -- missing close-quote" +#~ msgstr "forkert udformet direktiv - intet afsluttende anførselstegn" + +#~ msgid "ignoring pragma: %s" +#~ msgstr "ignorerer pragma: %s" + +#~ msgid "invalid #ident" +#~ msgstr "ugyldig #ident" + +#~ msgid "undefined or invalid # directive" +#~ msgstr "ugyldigt eller ikke-defineret #-direktiv" + +#~ msgid "invalid #line" +#~ msgstr "ugyldig #line" + +#~ msgid "use `#line ...' instead of `# ...' in first line" +#~ msgstr "benyt '#line ...' i stedet for '# ...' i første linje" + +#~ msgid "invalid #-line" +#~ msgstr "ugyldig #-linje" + +#~ msgid "Null character at %0 -- line ignored" +#~ msgstr "Nultegn ved %0 - linje ignoreret" + +#~ msgid "INCLUDE at %0 not the only statement on the source line" +#~ msgstr "INCLUDE ved %0 er ikke den eneste sætning på kildekodelinjen" + +#~ msgid "ASSIGNed FORMAT specifier is too small" +#~ msgstr "ASSIGN'et FORMAT-angivelse er for lille" + +#~ msgid "SELECT CASE on CHARACTER type (at %0) not supported -- sorry" +#~ msgstr "SELECT CASE på CHARACTER-type (ved %0) er ikke understøttet - desværre" + +#~ msgid "SELECT (at %0) has duplicate cases -- check integer overflow of CASE(s)" +#~ msgstr "SELECT (ved %0) har ens tilfælde -- tjek heltalsoverløb af CASEs" + +#~ msgid "ASSIGN to variable that is too small" +#~ msgstr "ASSIGN til variabel der er for lille" + +#~ msgid "ASSIGNed GOTO target variable is too small" +#~ msgstr "ASSIGN'et GOTO-målvariabel er for lille" + +#~ msgid "Local adjustable symbol `%A' at %0" +#~ msgstr "Lokalt justerbart symbol '%A' ved %0" + +#~ msgid "data initializer on host with different endianness" +#~ msgstr "datastartværdi på vært med anden endethed" + +#~ msgid "%s no longer supported -- try -fvxt" +#~ msgstr "%s er ikke længere understøttet - prøv -fvxt" + +#~ msgid "%s no longer supported -- try -fno-vxt -ff90" +#~ msgstr "%s er ikke længere understøttet - prøv -fno-vxt -ff90" + +#~ msgid "%s disabled, use normal debugging flags" +#~ msgstr "%s deaktiveret, benyt normale fejlanalyseringstilvalg" + +#~ msgid "Print g77-specific compiler version info, run internal tests" +#~ msgstr "Udskriv g77-specifik oversætterversioninfo, kør interne test" + +#~ msgid "Program is written in typical FORTRAN 66 dialect" +#~ msgstr "Program er skrevet i typisk FORTRAN 66-dialekt" + +#~ msgid "Program is written in typical Unix f77 dialect" +#~ msgstr "Program er skrevet i typisk Unix f77-dialekt" + +#~ msgid "Program does not use Unix-f77 dialectal features" +#~ msgstr "Program benytter ikke Unix f77-dialektiske faciliteter" + +#~ msgid "Program is written in Fortran-90-ish dialect" +#~ msgstr "Program er skrevet i Fortran 90-agtig dialekt" + +#~ msgid "Treat local vars and COMMON blocks as if they were named in SAVE statements" +#~ msgstr "Behandl lokale variable og COMMON-blokke som om de var nævnt i SAVE-sætninger" + +#~ msgid "Allow $ in symbol names" +#~ msgstr "Tillad $ i symbolnavne" + +#~ msgid "f2c-compatible code need not be generated" +#~ msgstr "f2c-kompatibel kode behøver ikke at blive genereret" + +#~ msgid "Unsupported; do not generate libf2c-calling code" +#~ msgstr "Ikke-understøttet; generér ikke libf2c-kaldende kode" + +#~ msgid "Unsupported; affects code-generation of arrays" +#~ msgstr "Ikke-understøttet; påvirker kodegenerering af tabeller" + +#~ msgid "Program is written in Fortran-90-ish free form" +#~ msgstr "Program er skrevet i Fortran 90-agtig fri stil" + +#~ msgid "Warn about use of (only a few for now) Fortran extensions" +#~ msgstr "Advar om brug af (i øjeblikket kun nogle få) Fortran-udvidelser" + +#~ msgid "Program is written in VXT (Digital-like) FORTRAN" +#~ msgstr "Program er skrevet i VXT (Digital-agtig) FORTRAN" + +#~ msgid "Disallow all ugly features" +#~ msgstr "Forbyd alle grimme faciliteter" + +# hollerith? +#~ msgid "Hollerith and typeless constants not passed as arguments" +#~ msgstr "Hollerith og typeløse konstanter overbringes ikke som parametre" + +#~ msgid "Allow ordinary copying of ASSIGN'ed vars" +#~ msgstr "Tillad almindelig kopiering af ASSIGN'ede variable" + +# RETMIG: ? +#~ msgid "Dummy array dimensioned to (1) is assumed-size" +#~ msgstr "Dummy-tabel dimensioneret til (1) er antaget størrelse" + +#~ msgid "Trailing comma in procedure call denotes null argument" +#~ msgstr "Afsluttende komma i procedurekald angiver nulparameter" + +#~ msgid "Allow REAL(Z) and AIMAG(Z) given DOUBLE COMPLEX Z" +#~ msgstr "Tillad REAL(Z) og AIMAG(Z) givet DOUBLE COMPLEX Z" + +#~ msgid "Initialization via DATA and PARAMETER is type-compatible" +#~ msgstr "Klargøring via DATA og PARAMETER er type-kompatible" + +#~ msgid "Allow INTEGER and LOGICAL interchangeability" +#~ msgstr "Tillad INTEGER og LOGICAL på hinandens plads" + +#~ msgid "Print internal debugging-related info" +#~ msgstr "Udskriv intern fejlanalyseringsrelateret info" + +#~ msgid "Initialize local vars and arrays to zero" +#~ msgstr "Klargør lokale variable og tabeller til nul" + +#~ msgid "Backslashes in character/hollerith constants not special (C-style)" +#~ msgstr "Omvendte skråstreger i tegn/hollerith-konstanter er ikke specielle (C-stil)" + +#~ msgid "Have front end emulate COMPLEX arithmetic to avoid bugs" +#~ msgstr "Lad forenden emulere COMPLEX-beregninger for at undgå fejl" + +#~ msgid "Disable the appending of underscores to externals" +#~ msgstr "Deaktivér tilføjelse af understreger bag på eksterne variable" + +#~ msgid "Never append a second underscore to externals" +#~ msgstr "Tilføj aldrig en anden understreg til eksterne variable" + +#~ msgid "Intrinsics spelled as e.g. SqRt" +#~ msgstr "Indbyggede staves som f.eks. SqRt" + +#~ msgid "Intrinsics in uppercase" +#~ msgstr "Indbyggede staves med store bogstaver" + +#~ msgid "Intrinsics letters in arbitrary cases" +#~ msgstr "Der skelnes ikke mellem små og store bogstaver i indbyggede" + +#~ msgid "Language keywords spelled as e.g. IOStat" +#~ msgstr "Sprognøgleord staves som f.eks. IOStat" + +#~ msgid "Language keywords in uppercase" +#~ msgstr "Sprognøgleord staves med store bogstaver" + +#~ msgid "Language keyword letters in arbitrary cases" +#~ msgstr "Der skelnes ikke mellem små og store bogstaver i sprognøgleord" + +#~ msgid "Internally convert most source to uppercase" +#~ msgstr "Konvertér det meste kildekode til store bogstaver internt" + +#~ msgid "Internally preserve source case" +#~ msgstr "Bevar de store/små bogstaver i kildekoden internt" + +#~ msgid "Symbol names spelled in mixed case" +#~ msgstr "Symbolnavne staves med en blanding af store og små bogstaver" + +#~ msgid "Symbol names in uppercase" +#~ msgstr "Symbolnavne staves med store bogstaver" + +#~ msgid "Symbol names in lowercase" +#~ msgstr "Symbolnavne staves med små bogstaver" + +#~ msgid "Program written in uppercase" +#~ msgstr "Program skrives med store bogstaver" + +#~ msgid "Program written in lowercase" +#~ msgstr "Program skrives med små bogstaver" + +#~ msgid "Program written in strict mixed-case" +#~ msgstr "Program skrives med streng blanding af store/små bogstaver" + +#~ msgid "Compile as if program written in uppercase" +#~ msgstr "Oversæt som hvis programmet var skrevet med store bogstaver" + +#~ msgid "Compile as if program written in lowercase" +#~ msgstr "Oversæt som hvis programmet var skrevet med små bogstaver" + +#~ msgid "Preserve all spelling (case) used in program" +#~ msgstr "Bevar al stavning (store/små bogstaver) benyttet i programmet" + +#~ msgid "Delete libU77 intrinsics with bad interfaces" +#~ msgstr "Slet libU77-indbyggede med dårlige grænseflader" + +#~ msgid "Disable libU77 intrinsics with bad interfaces" +#~ msgstr "Deaktivér libU77-indbyggede med dårlige grænseflader" + +#~ msgid "Hide libU77 intrinsics with bad interfaces" +#~ msgstr "Skjul libU77-indbyggede med dårlige grænseflader" + +#~ msgid "Delete non-FORTRAN-77 intrinsics f2c supports" +#~ msgstr "Slet f2c-understøttelse af ikke-FORTRAN-77-indbyggede" + +#~ msgid "Disable non-FORTRAN-77 intrinsics f2c supports" +#~ msgstr "Deaktivér f2c-understøttelse af ikke-FORTRAN-77-indbyggede" + +#~ msgid "Hide non-FORTRAN-77 intrinsics f2c supports" +#~ msgstr "Skjul f2c-understøttelse af ikke-FORTRAN-77-indbyggede" + +#~ msgid "Delete non-FORTRAN-77 intrinsics F90 supports" +#~ msgstr "Slet F90-understøttelse af ikke-FORTRAN-77-indbyggede " + +#~ msgid "Disable non-FORTRAN-77 intrinsics F90 supports" +#~ msgstr "Deaktivér F90-understøttelse af ikke-FORTRAN-77-indbyggede" + +#~ msgid "Hide non-FORTRAN-77 intrinsics F90 supports" +#~ msgstr "Skjul F90-understøttelse af ikke-FORTRAN-77-indbyggede" + +#~ msgid "Delete non-FORTRAN-77 intrinsics g77 supports" +#~ msgstr "Slet g77-understøttelse af ikke-FORTRAN-77-indbyggede " + +#~ msgid "Disable non-FORTRAN 77 intrinsics F90 supports" +#~ msgstr "Deaktivér g77-understøttelse af ikke-FORTRAN-77-indbyggede" + +#~ msgid "Hide non-FORTRAN 77 intrinsics F90 supports" +#~ msgstr "Skjul g77-understøttelse af ikke-FORTRAN-77-indbyggede" + +#~ msgid "Delete MIL-STD 1753 intrinsics" +#~ msgstr "Slet MIL-STD 1753-indbyggede" + +#~ msgid "Disable MIL-STD 1753 intrinsics" +#~ msgstr "Deaktivér MIL-STD 1753-indbyggede" + +#~ msgid "Hide MIL-STD 1753 intrinsics" +#~ msgstr "Skjul MIL-STD 1753-indbyggede" + +#~ msgid "Delete libU77 intrinsics" +#~ msgstr "Slet libU77-indbyggede" + +#~ msgid "Disable libU77 intrinsics" +#~ msgstr "Deaktivér libU77-indbyggede" + +#~ msgid "Hide libU77 intrinsics" +#~ msgstr "Skjul libU77-indbyggede" + +#~ msgid "Delete non-FORTRAN-77 intrinsics VXT FORTRAN supports" +#~ msgstr "Slet VXT FORTRAN-understøttelse af ikke-FORTRAN-77-indbyggede " + +#~ msgid "Disable non-FORTRAN-77 intrinsics VXT FORTRAN supports" +#~ msgstr "Deaktivér VXT FORTRAN-understøttelse af ikke-FORTRAN-77-indbyggede " + +#~ msgid "Hide non-FORTRAN-77 intrinsics VXT FORTRAN supports" +#~ msgstr "Skjul VXT FORTRAN-understøttelse af ikke-FORTRAN-77-indbyggede " + +#~ msgid "Treat initial values of 0 like non-zero values" +#~ msgstr "Behandl begyndelsesværdier på 0 som værdier forskellig fra nul" + +#~ msgid "Emit special debugging information for COMMON and EQUIVALENCE (disabled)" +#~ msgstr "Udsend speciel fejlanalyseringsinfo for COMMON og EQUIVALENCE (deaktiveret)" + +#~ msgid "Take at least one trip through each iterative DO loop" +#~ msgstr "Tag i det mindste et skridt gennem hver DO-løkke" + +#~ msgid "Print names of program units as they are compiled" +#~ msgstr "Udskriv navne på programenheder efterhånden som de oversættes" + +#~ msgid "Disable fatal diagnostics about inter-procedural problems" +#~ msgstr "Deaktivér fatale diagnosticeringer af interprocedurale procedurer" + +#~ msgid "Make prefix-radix non-decimal constants be typeless" +#~ msgstr "Gør præfiks-grundtal ikke-decimale konstanter typeløse" + +#~ msgid "Generate code to check subscript and substring bounds" +#~ msgstr "Generér kode for at tjekke indekserings- og understrengsgrænser" + +#~ msgid "Fortran-specific form of -fbounds-check" +#~ msgstr "Fortran-specifik form for -fbounds-check" + +#~ msgid "Disable warnings about inter-procedural problems" +#~ msgstr "Deaktivér advarsler om interprocedurale problemer" + +#~ msgid "Warn about constructs with surprising meanings" +#~ msgstr "Advar om konstruktioner med overraskende betydninger" + +#~ msgid "Add a directory for INCLUDE searching" +#~ msgstr "Tilføj et katalog til INCLUDE-søgning" + +#~ msgid "Set the maximum line length" +#~ msgstr "Angiv den maksimale linjelængde" + +#~ msgid "Missing first operand for binary operator at %0" +#~ msgstr "Manglende første operand for binær operator ved %0" + +#~ msgid "Zero-length character constant at %0" +#~ msgstr "Nul-længde tegnkonstant ved %0" + +#~ msgid "Invalid token at %0 in expression or subexpression at %1" +#~ msgstr "Ugyldigt symbol ved %0 i udtryk eller underudtryk ved %1" + +#~ msgid "Missing operand for operator at %1 at end of expression at %0" +#~ msgstr "Manglende operand for operator ved %1 i slutningen af udtryk ved %0" + +#~ msgid "Label %A already defined at %1 when redefined at %0" +#~ msgstr "Etiket %A er allerede defineret ved %1 ved omdefinering ved %0" + +#~ msgid "Unrecognized character at %0 [info -f g77 M LEX]" +#~ msgstr "Ukendt tegn ved %0 [info -f g77 M LEX]" + +#~ msgid "Label definition %A at %0 on empty statement (as of %1)" +#~ msgstr "Etiketdefinition %A ved %0 i tom sætning (ved %1)" + +#~ msgid "Invalid first character at %0 [info -f g77 M LEX]" +#~ msgstr "Ugyldig første tegn ved %0 [info -f g77 M LEX]" + +#~ msgid "Line too long as of %0 [info -f g77 M LEX]" +#~ msgstr "Linje for lang ved %0 [info -f g77 M LEX]" + +#~ msgid "Non-numeric character at %0 in label field [info -f g77 M LEX]" +#~ msgstr "Tegn der ikke er tal ved %0 i etiketfelt [info -f g77 M LEX]" + +#~ msgid "Label number at %0 not in range 1-99999" +#~ msgstr "Etiketnummer ved %0 er ikke i intervallet 1-99999" + +#~ msgid "At %0, '!' and '/*' are not valid comment delimiters" +#~ msgstr "Ved %0 er '!' og '/*' ikke gyldige kommentarafgrænsninger" + +#~ msgid "Continuation indicator at %0 must appear in column 6 [info -f g77 M LEX]" +#~ msgstr "Fortsættelsesindikator ved %0 skal optræde i kolonne 6 [info -f g77 M LEX]" + +#~ msgid "Label at %0 invalid with continuation line indicator at %1 [info -f g77 M LEX]" +#~ msgstr "Etiket ved %0 er ugyldig med fortsættelseslinjeindikator ved %1 [info -f g77 M LEX]" + +#~ msgid "Character constant at %0 has no closing apostrophe at %1" +#~ msgstr "Tenkonstant ved %0 har ingen afsluttende apostrof ved %1" + +#~ msgid "Hollerith constant at %0 specified %A more characters than are present as of %1" +#~ msgstr "Hollerith-konstant ved %0 angiver %A flere tegn end der optræder ved %1" + +#~ msgid "Missing close parenthese at %0 needed to match open parenthese at %1" +#~ msgstr "Afsluttende parantes ved %0 behøves for at svare til åben parantes ved %1" + +#~ msgid "Integer at %0 too large" +#~ msgstr "Heltal ved %0 for stort" + +#~ msgid "Period at %0 not followed by digits for floating-point number or by `NOT.', `TRUE.', or `FALSE.'" +#~ msgstr "Punktum ved %0 efterfølges ikke af cifre til kommatal eller af 'NOT.', 'TRUE.' eller 'FALSE.'" + +#~ msgid "Missing close-period between `.%A' at %0 and %1" +#~ msgstr "Manglende afsluttende punktum mellem '.%A' ved %0 og %1" + +#~ msgid "Invalid exponent at %0 for real constant at %1; nondigit `%A' in exponent field" +#~ msgstr "Ugyldig eksponent ved %0 for reel konstant ved %1; ikke-ciffer '%A' i eksponentfelt" + +#~ msgid "Missing value at %1 for real-number exponent at %0" +#~ msgstr "Manglende værdi ved %1 for reel eksponent ved %0" + +#~ msgid "Expected binary operator between expressions at %0 and at %1" +#~ msgstr "Forventede binær operator mellem udtryk ved %0 og ved %1" + +#~ msgid "Semicolon at %0 is an invalid token" +#~ msgstr "Semikolon ved %0 er et ugyldigt symbol" + +#~ msgid "Extraneous comma in FORMAT statement at %0" +#~ msgstr "Ekstra komma i FORMAT-sætning ved %0" + +#~ msgid "Missing comma in FORMAT statement at %0" +#~ msgstr "Manglende komma i FORMAT-sætning ved %0" + +#~ msgid "Spurious sign in FORMAT statement at %0" +#~ msgstr "Mystisk fortegn i FORMAT-sætning ved %0" + +#~ msgid "Spurious number in FORMAT statement at %0" +#~ msgstr "Mystisk tal i FORMAT-sætning ved %0" + +#~ msgid "Spurious text trailing number in FORMAT statement at %0" +#~ msgstr "Mystisk tekstafsluttende tal i FORMAT-sætning ved %0" + +#~ msgid "Unrecognized FORMAT specifier at %0" +#~ msgstr "Ukendt FORMAT-angivelse ved %0" + +#~ msgid "Missing close-parenthese(s) in FORMAT statement at %0" +#~ msgstr "Manglende afsluttende parantes i FORMAT-sætning ved %0" + +#~ msgid "Missing number following period in FORMAT statement at %0" +#~ msgstr "Manglende tal efter punktum i FORMAT-sætning ved %0" + +#~ msgid "Missing number following `E' in FORMAT statement at %0" +#~ msgstr "Manglende tal efter 'E' i FORMAT-sætning ved %0" + +#~ msgid "Spurious trailing comma preceding terminator at %0" +#~ msgstr "Mystisk afsluttende komma før afslutningssymbol ved %0" + +#~ msgid "At %0, specify OPERATOR instead of ASSIGNMENT for INTERFACE statement not specifying the assignment operator (=)" +#~ msgstr "Angiv OPERATOR i stedet for ASSIGNMENT ved %0 for INTERFACE-sætning der ikke angiver tildelingsoperatoren (=)" + +#~ msgid "At %0, specify ASSIGNMENT instead of OPERATOR for INTERFACE statement specifying the assignment operator (=)" +#~ msgstr "Angiv ASSIGNMENT i stedet for OPERATOR ved %0 for INTERFACE-sætning der angiver tildelingsoperatoren (=)" + +#~ msgid "Cannot specify =initialization-expr at %0 unless `::' appears before list of objects" +#~ msgstr "Kan ikke angive =klargøringsudtryk ved %0 medmindre '::' optræder før listen af objekter" + +#~ msgid "Reference to label at %1 inconsistent with its definition at %0" +#~ msgstr "Reference til etiket ved %1 er inkonsistent med dens definition ved %0" + +#~ msgid "Reference to label at %1 inconsistent with earlier reference at %0" +#~ msgstr "Reference til etiket ved %1 er inkonsistent med tidligere reference ved %0" + +#~ msgid "DO-statement reference to label at %1 follows its definition at %0" +#~ msgstr "DO-sætningsreference til etiket ved %1 følger dens definition ved %0" + +#~ msgid "Reference to label at %1 is outside block containing definition at %0" +#~ msgstr "Reference til etiket ved %1 er uden for blok der indeholder definitionen ved %0" + +#~ msgid "DO-statement references to label at %0 and %2 separated by unterminated block starting at %1" +#~ msgstr "DO-sætningsreferencer til etiket ved %0 og %2 adskilt af uafsluttet blok der begynder ved %1" + +#~ msgid "DO-statement reference to label at %0 and label definition at %2 separated by unterminated block starting at %1" +#~ msgstr "DO-sætningsreference til etiket ved %0 og etiketdefinition ved %2 adskilt af uafsluttet blok der begynder ved %1" + +#~ msgid "Label definition at %0 invalid on this kind of statement" +#~ msgstr "Etiketdefinition ved %0 er ugyldig ved denne slags sætning" + +#~ msgid "Statement at %0 invalid in this context" +#~ msgstr "Sætning ved %0 er ugyldig i denne kontekst" + +#~ msgid "Statement at %0 invalid in context established by statement at %1" +#~ msgstr "Sætning ved %0 er ugyldig i den kontekst der er etableret af sætning ved %1" + +#~ msgid "Statement at %0 must specify construct name specified at %1" +#~ msgstr "Sætning ved %0 skal angive konstruktionsnavn angivet ved %1" + +#~ msgid "Construct name at %0 superfluous, no construct name specified at %1" +#~ msgstr "Kontruktionsnavn ved %0 er overflødigt, intet kontruktionsnavn angivet ved %1" + +#~ msgid "Construct name at %0 not the same as construct name at %1" +#~ msgstr "Kontruktionsnavn ved %0 er ikke det samme som konstruktionsnavn ved %1" + +#~ msgid "Construct name at %0 does not match construct name for any containing DO constructs" +#~ msgstr "Kontruktionsnavn ved %0 passer ikke med konstruktionsnavn for nogen indeholdende DO-konstruktioner" + +#~ msgid "Label definition missing at %0 for DO construct specifying label at %1" +#~ msgstr "Etiketdefinition mangler ved %0 for DO-konstruktion der angiver etiket ved %1" + +#~ msgid "Statement at %0 follows ELSE block for IF construct at %1" +#~ msgstr "Sætning ved %0 følger ELSE-blok for IF-konstruktion ved %1" + +#~ msgid "No label definition for FORMAT statement at %0" +#~ msgstr "Ingen etiketdefinition for FORMAT-sætning ved %0" + +#~ msgid "Second occurrence of ELSE WHERE at %0 within WHERE at %1" +#~ msgstr "Anden forekomst af ELSE WHERE ved %0 inden i WHERE ved %1" + +#~ msgid "END statement at %0 missing `%A' keyword required for internal or module procedure(s) bounded by %1" +#~ msgstr "END-sætning ved %0 mangler nøgleordet '%A' som er påkrævet for interne eller modul-procedurer afgrænset af %1" + +#~ msgid "MODULE PROCEDURE statement at %0 disallowed because INTERFACE at %1 specifies no generic name, operator, or assignment" +#~ msgstr "MODULE PROCEDURE-sætning ved %0 er ikke tilladt da INTERFACE ved %1 ikke angiver generisk navn, operator eller tildeling" + +#~ msgid "BLOCK DATA name at %0 superfluous, no name specified at %1" +#~ msgstr "BLOCK DATA-navn ved %0 er overflødigt, intet navn angivet ved %1" + +#~ msgid "Program name at %0 superfluous, no PROGRAM statement specified at %1" +#~ msgstr "Programnavn ved %0 er overflødigt, ingen PROGRAM-sætning angivet ved %1" + +#~ msgid "Program unit name at %0 not the same as name at %1" +#~ msgstr "Programenhedsnavn ved %0 er ikke det samme som navn ved %1" + +#~ msgid "Type name at %0 not the same as name at %1" +#~ msgstr "Typenavn ved %0 er ikke det samme som navn ved %1" + +#~ msgid "End of source file before end of block started at %0" +#~ msgstr "Slutning på kildekodefil før slutning af blok begyndt ved %0" + +#~ msgid "Undefined label, first referenced at %0" +#~ msgstr "Ikke-defineret etiket, første reference er ved %0" + +#~ msgid "SAVE statement or attribute at %1 cannot be specified along with SAVE statement or attribute at %0" +#~ msgstr "SAVE-sætning eller -egenskab ved %1 kan ikke angives sammen med SAVE-sætning eller -egenskab ved %0" + +#~ msgid "PUBLIC or PRIVATE statement at %1 cannot be specified along with PUBLIC or PRIVATE statement at %0" +#~ msgstr "PUBLIC- eller PRIVATE-sætning ved %1 kan ikke angives sammen med PUBLIC- eller PRIVATE-sætning ved %0" + +#~ msgid "RETURN statement at %0 invalid within a main program unit" +#~ msgstr "RETURN-sætning ved %0 ugyldig inden i en hovedprogramenhed" + +#~ msgid "Alternate return specifier at %0 invalid within a main program unit" +#~ msgstr "Alternativ returangivelse ved %0 er ugyldig inden i en hovedprogramenhed" + +#~ msgid "Alternate return specifier at %0 invalid within a function" +#~ msgstr "Alternativ returangivelse ved %0 er ugyldig inden i en funktion" + +#~ msgid "Access specifier or PRIVATE statement at %0 invalid for derived-type definition within other than the specification part of a module" +#~ msgstr "Tilgangsangivelse eller PRIVATE-sætning ved %0 er ugyldig for nedarvet typedefinition som ikke er i specifikationsdelen af et modul" + +#~ msgid "Access specifier at %0 must immediately follow derived-type statement at %1 with no intervening statements" +#~ msgstr "Tilgangsangivelse ved %0 skal umiddelbart følge nedarvet type-sætning ved %1 uden nogen mellemliggende sætninger" + +#~ msgid "No components specified as of %0 for derived-type definition beginning at %1" +#~ msgstr "Ingen komponenter angivet ved %0 for nedarvet typedefinition begyndende ved %1" + +#~ msgid "No components specified as of %0 for structure definition beginning at %1" +#~ msgstr "Ingen komponenter angivet ved %0 for strukturdefinition begyndende ved %1" + +#~ msgid "Missing structure name for outer structure definition at %0" +#~ msgstr "Manglende strukturnavn for ydre strukturdefinition ved %0" + +#~ msgid "Field names at %0 for outer structure definition -- specify them in a subsequent RECORD statement instead" +#~ msgstr "Feltnavne ved %0 for ydre strukturdefinition - angiv dem i en efterfølgende RECORD-sætning i stedet" + +#~ msgid "Missing field name(s) for structure definition at %0 within structure definition at %1" +#~ msgstr "Manglende feltnavne for strukturdefinition ved %0 inden i strukturdefinition ved %1" + +#~ msgid "No components specified as of %0 for map beginning at %1" +#~ msgstr "Ingen komponenter angivet ved %0 for map begyndende ved %1" + +#~ msgid "Zero or one maps specified as of %0 for union beginning at %1 -- at least two are required" +#~ msgstr "Nul eller en map angivet ved %0 for union begyndende ved %1 - mindst to er påkrævet" + +#~ msgid "Missing %A specifier in statement at %0" +#~ msgstr "Manglende %A-angivelse i sætning ved %0" + +#~ msgid "Items in I/O list starting at %0 invalid for namelist-directed I/O" +#~ msgstr "Elementer i I/O-liste begyndende ved %0 er ugyldigt for navnlistedirigeret I/O" + +#~ msgid "Conflicting I/O control specifications at %0 and %1" +#~ msgstr "Modstridende I/O-kontrolangivelser ved %0 og %1" + +#~ msgid "No UNIT= specifier in I/O control list at %0" +#~ msgstr "Inge UNIT=-angivelse i I/O-kontrolliste ved %0" + +#~ msgid "Specification at %0 requires ADVANCE=`NO' specification in same I/O control list" +#~ msgstr "Specifikation ved %0 kræver ADVANCE='NO'-specifikation i samme I/O-kontrolliste" + +#~ msgid "Specification at %0 requires explicit FMT= specification in same I/O control list" +#~ msgstr "Specifikation ved %0 kræver eksplicit FMT=-specifikation i samme I/O-kontrolliste" + +#~ msgid "Second occurrence of CASE DEFAULT at %0 within SELECT CASE at %1" +#~ msgstr "Anden forekomst af CASE DEFAULT ved %0 inden i SELECT CASE ved %1" + +#~ msgid "Duplicate or overlapping case values/ranges at %0 and %1" +#~ msgstr "CASE-værdi optræder mere end én gang eller intervaller overlapper ved %0 og %1" + +#~ msgid "Type and/or kind-type parameter disagreement between CASE value or value within range at %0 and SELECT CASE at %1" +#~ msgstr "Type og/eller form for type-parameter konflikt mellem CASE-værdi eller værdi i interval ved %0 og SELECT CASE ved %1" + +#~ msgid "Range specification at %0 invalid for CASE statement within logical-type SELECT CASE statement" +#~ msgstr "Intervalangivelse ved %0 er ugyldig for CASE-sætning inden i SELECT CASE-sætning med logisk type" + +#~ msgid "Fortran 90 feature at %0 unsupported" +#~ msgstr "Fortran 90-facilitet ved %0 er ikke understøttet" + +#~ msgid "Invalid declaration of or reference to symbol `%A' at %0 [initially seen at %1]" +#~ msgstr "Ugyldig erklæring af reference til symbolet '%A' ved %0 (først set ved %1)" + +#~ msgid "Null element at %0 for array reference at %1" +#~ msgstr "Nulelement ved %0 for tabelreference ved %1" + +#~ msgid "Too few elements (%A missing) as of %0 for array reference at %1" +#~ msgstr "For få elementer (%A mangler) ved %0 for tabelreference ved %1" + +#~ msgid "Too many elements as of %0 for array reference at %1" +#~ msgstr "For mange elementer ved %0 for tabelreference ved %1" + +#~ msgid "Missing colon as of %0 in substring reference for %1" +#~ msgstr "Manglende kolon ved %0 i understrengsreference for %1" + +#~ msgid "Invalid use at %0 of substring operator on %1" +#~ msgstr "Ugyldig brug ved %0 af understrengsoperator på %1" + +#~ msgid "Substring begin/end point at %0 out of defined range" +#~ msgstr "Understrengs begyndelses-/slutpunkt ved %0 er uden for det definerede interval" + +#~ msgid "Array element value at %0 out of defined range" +#~ msgstr "Tabelelementværdi ved %0 er uden for det definerede interval" + +#~ msgid "Expression at %0 has incorrect data type or rank for its context" +#~ msgstr "Udtryk ved %0 har forkert datatype eller rang for dets kontekst" + +#~ msgid "Division by 0 (zero) at %0 (IEEE not yet supported)" +#~ msgstr "Division med nul ved %0 (IEEE understøttes ikke endnu)" + +#~ msgid "%A step count known to be 0 (zero) at %0" +#~ msgstr "%A-skridttæller vides at være nul ved %0" + +#~ msgid "%A end value plus step count known to overflow at %0" +#~ msgstr "%A-slutværdi plus skridttæller vides at forårsage overløb ved %0" + +#~ msgid "%A begin, end, and step-count values known to result in implementation-dependent behavior due to overflow(s) in intermediate calculations at %0" +#~ msgstr "%A-begyndelses-, slut- og skridttæller-værdier vides at resultere i implementeringsafhængig opførsel pga. overløb i mellemregninger ved %0" + +#~ msgid "%A begin, end, and step-count values known to result in no iterations at %0" +#~ msgstr "%A-begyndelses-, slut- og skridttæller-værdier vides at resultere i at der ikke foretages nogen iterationer ved %0" + +#~ msgid "Type disagreement between expressions at %0 and %1" +#~ msgstr "Typekonflikt mellem udtryk ved %0 og %1" + +#~ msgid "No specification for implied-DO iterator `%A' at %0" +#~ msgstr "Ingen angivelse af underforstået DO-iterator '%A' ved %0" + +#~ msgid "Gratuitous parentheses surround implied-DO construct at %0" +#~ msgstr "Ekstra paranteser omkring underforstået DO-konstruktion ved %0" + +#~ msgid "Zero-size specification invalid at %0" +#~ msgstr "Nulstørrelses angivelse ugyldig ved %0" + +#~ msgid "Zero-size array at %0" +#~ msgstr "Nulstørrelsestabel ved %0" + +#~ msgid "Target machine does not support complex entity of kind specified at %0" +#~ msgstr "Målarkitekturen understøtter ikke den form for kompleks enhed der er angivet ved %0" + +#~ msgid "Target machine does not support DOUBLE COMPLEX, specified at %0" +#~ msgstr "Målarkitekturen understøtter ikke DOUBLE COMPLEX, som angivet ved %0" + +#~ msgid "Attempt to raise constant zero to a power at %0" +#~ msgstr "Forsøg at opløfte konstant nul til en potens af %0" + +#~ msgid "Reference to generic intrinsic `%A' at %0 could be to form %B or %C" +#~ msgstr "Reference til generisk indbygget '%A' ved %0 kunne være for at danne %B eller %C" + +#~ msgid "Ambiguous use of intrinsic `%A' at %0 [info -f g77 M CMPAMBIG]" +#~ msgstr "Tvetydig brug af indbygget '%A' ved %0 [info -f g77 M CMPAMBIG]" + +#~ msgid "Intrinsic `%A' referenced %Bly at %0, %Cly at %1 [info -f g77 M EXPIMP]" +#~ msgstr "Indbygget '%A' refereret til som %B ved %0, som %C ved %1 [info -f g77 M EXPIMP]" + +#~ msgid "Same name `%A' used for %B at %0 and %C at %1 [info -f g77 M INTGLOB]" +#~ msgstr "Samme navn '%A' benyttet for %B ved %0 og %C ved %1 [info -f g77 M INTGLOB]" + +#~ msgid "Explicit type declaration for intrinsic `%A' disagrees with invocation at %0" +#~ msgstr "Eksplicit typeerklæring for indbygget '%A' er i modstrid med kald ved %0" + +#~ msgid "Unable to open INCLUDE file `%A' at %0" +#~ msgstr "Kunne ikke åbne INCLUDE-filen '%A' ved %0" + +#~ msgid "Null argument at %0 for statement function reference at %1" +#~ msgstr "Nulparameter ved %0 for sætningsfunktionsreference ved %1" + +#~ msgid "Null argument at %0 for procedure invocation at %1" +#~ msgstr "Nulparameter ved %0 for procedurekald ved %1" + +#~ msgid "%A too few arguments (starting with dummy argument `%B') as of %0 for statement function reference at %1" +#~ msgstr "%A for få parametre (begyndende ved dummy-parameter '%B') ved %0 for sætningsfunktionsreference ved %1" + +#~ msgid "%A too many arguments as of %0 for statement function reference at %1" +#~ msgstr "%A for mange parametre ved %0 for sætningsfunktionsreference ved %1" + +#~ msgid "Array supplied at %1 for dummy argument `%A' in statement function reference at %0" +#~ msgstr "Tabel angivet ved %1 for dummy-parameter '%A' i sætningsfunktionsreference ved %1" + +#~ msgid "Unsupported FORMAT specifier at %0" +#~ msgstr "Ikke-understøttet FORMAT-angivelse ved %0" + +#~ msgid "Variable-expression FORMAT specifier at %0 -- unsupported" +#~ msgstr "Variabel-udtryks FORMAT-angivelse ved %0 - ikke-understøttet" + +#~ msgid "Unsupported VXT statement at %0" +#~ msgstr "Ikke-understøttet VXT-sætning ved %0" + +#~ msgid "Attempt to specify second initial value for `%A' at %0" +#~ msgstr "Forsøg på at angive anden startværdi for '%A' ved %0" + +#~ msgid "Too few initial values in list of initializers for `%A' at %0" +#~ msgstr "For få startværdier i klargøringsliste for '%A' ved %0" + +#~ msgid "Too many initial values in list of initializers starting at %0" +#~ msgstr "For mange startværdier i klargøringsliste ved %0" + +#~ msgid "Array or substring specification for `%A' out of range in statement at %0" +#~ msgstr "Tabel- eller understrengsangivelse for '%A' er uden for det gyldige interval i sætning ved %0" + +#~ msgid "Array subscript #%B out of range for initialization of `%A' in statement at %0" +#~ msgstr "Tabelindeks nr. %B er uden for det gyldig interval ved klargøring af '%A' i sætning ved %0" + +#~ msgid "Implied do-loop step count of 0 (zero) for iteration variable `%A' in statement at %0" +#~ msgstr "Underforstået do-løkkeskridttæller på nul for iterationsvariablen '%A' i sætning ved %0" + +#~ msgid "Implied do-loop iteration count of 0 (zero) for iteration variable `%A' in statement at %0" +#~ msgstr "Underforstået do-løkkegentagelsestæller på nul for iterationsvariablen '%A' i sætning ved %0" + +#~ msgid "Not an integer constant expression in implied do-loop in statement at %0" +#~ msgstr "Ikke et heltalskonstantudtryk i underforstået do-løkke i sætning ved %0" + +#~ msgid "Attempt to specify second initial value for element of `%A' at %0" +#~ msgstr "Forsøg på at angive anden startvædi for element af '%A' ved %0" + +#~ msgid "Attempt to EQUIVALENCE common areas `%A' and `%B' at %0" +#~ msgstr "Forsøg på at anvende EQUIVALENCE mellem de almene områder '%A' og '%B' ved %0" + +#~ msgid "Can't place `%A' as directed by EQUIVALENCE due to alignment restrictions" +#~ msgstr "Kan ikke placere '%A' som angivet af EQUIVALENCE pga. justeringsrestriktioner" + +#~ msgid "Mismatched EQUIVALENCE requirements for placement of `%A' at both %C and %D bytes offset from `%B'" +#~ msgstr "Forkerte EQUIVALENCE-krav for placering af '%A' ved både %C og %D bytes afstand fra '%B'" + +#~ msgid "Array or substring specification for `%A' out of range in EQUIVALENCE statement" +#~ msgstr "Tabel- eller understrengsspecifikation for '%A' er uden for det gyldige interval i EQUIVALENCE-sætning" + +#~ msgid "Substring of non-CHARACTER entity `%A' in EQUIVALENCE statement" +#~ msgstr "Understreng af ikke-CHARACTER enhed '%A' i EQUIVALENCE-sætning" + +#~ msgid "Array reference to scalar variable `%A' in EQUIVALENCE statement" +#~ msgstr "Tabelreference til skalar variabel '%A' i EQUIVALENCE-sætning" + +#~ msgid "Array subscript #%B out of range for EQUIVALENCE of `%A'" +#~ msgstr "Tabelindeks nr. %B er uden for det gyldige interval for EQUIVALENCE '%A'" + +#~ msgid "Attempt to extend COMMON area beyond its starting point via EQUIVALENCE of `%A'" +#~ msgstr "Forsøg på at udvide COMMON-område over dets begyndelsespunkt vha. EQUIVALENCE '%A'" + +#~ msgid "Too few elements in reference to array `%A' in EQUIVALENCE statement" +#~ msgstr "For få elementer i reference til tabllen '%A' i EQUIVALENCE-sætning" + +#~ msgid "Too many elements in reference to array `%A' in EQUIVALENCE statement" +#~ msgstr "For mange elementer i reference til tabllen '%A' i EQUIVALENCE-sætning" + +#~ msgid "Mixed CHARACTER and non-CHARACTER types via COMMON/EQUIVALENCE -- for example, `%A' and `%B'" +#~ msgstr "Blandede CHARACTER- og ikke-CHARACTER-typer vha. COMMON/EQUIVALENCE - f.eks. '%A' og '%B'" + +#~ msgid "Return value `%A' for FUNCTION at %0 not referenced in subprogram" +#~ msgstr "Returværdi `%A' for FUNCTION ved %0 refereres ikke i underprogram" + +#~ msgid "Common block `%A' is SAVEd, explicitly or implicitly, at %0 but not SAVEd at %1" +#~ msgstr "Almen blok '%A' er SAVEd, eksplicit eller implicit, ved %0, men ikke ved %1" + +#~ msgid "Common block `%A' is %B %D in length at %0 but %C %E at %1" +#~ msgstr "Almen blok '%A' er %B %D i længde ved %0, men %C %E ved %1" + +#~ msgid "Blank common initialized at %0" +#~ msgstr "Tom almen tildelt startværdi ved %0" + +#~ msgid "Intrinsic `%A' is passed as actual argument at %0 but not explicitly declared INTRINSIC" +#~ msgstr "Indbygget '%A' er overbragt som faktisk parameter ved %0, men ikke eksplicit erklæret INTRINSIC" + +#~ msgid "External procedure `%A' is passed as actual argument at %0 but not explicitly declared EXTERNAL" +#~ msgstr "Ekstern procedure '%A' er overbragt som faktisk parameter ved %0, men ikke eksplicit erklæret EXTERNAL" + +#~ msgid "Character `%A' (for example) is upper-case in symbol name at %0" +#~ msgstr "Tegn '%A' (f.eks.) er et stort bogstav i symbolnavn ved %0" + +#~ msgid "Character `%A' (for example) is lower-case in symbol name at %0" +#~ msgstr "Tegn '%A' (f.eks.) er et lille bogstav i symbolnavn ved %0" + +#~ msgid "Character `%A' not followed at some point by lower-case character in symbol name at %0" +#~ msgstr "Tegn '%A' følges ikke af lille bogstav i symbolnavn ved %0" + +#~ msgid "Initial character `%A' is lower-case in symbol name at %0" +#~ msgstr "Begyndelsestegn '%A' er et lille bogstav i symbolnavn ved %0" + +#~ msgid "NAMELIST not adequately supported by run-time library for source files with case preserved" +#~ msgstr "NAMELIST er ikke tilstrækkeligt understøttet af kørselsbiblioteket for kildefiler med store/små bogstaver bevaret" + +#~ msgid "Nested %% construct (%%VAL, %%REF, or %%DESCR) at %0" +#~ msgstr "Indlejret %%-konstruktion (%%VAL, %%REF eller %%DESCR) ved %0" + +#~ msgid "Statement at %0 invalid in BLOCK DATA program unit at %1" +#~ msgstr "Sætning ved %0 er ugyldig i BLOCK DATA-programenhed ved %1" + +#~ msgid "Truncating characters on right side of character constant at %0" +#~ msgstr "Fjerner tegn på den højre side af tegnkonstant ved %0" + +#~ msgid "Truncating characters on right side of hollerith constant at %0" +#~ msgstr "Fjerner tegn på den højre side af hollerith-konstant ved %0" + +#~ msgid "Truncating non-zero data on left side of numeric constant at %0" +#~ msgstr "Fjerner data der ikke er nul, på den venstre side af numerisk konstant ved %0" + +#~ msgid "Truncating non-zero data on left side of typeless constant at %0" +#~ msgstr "Fjerner data der ikke er nul, på den venstre side af typeløs konstant ved %0" + +#~ msgid "Typeless constant at %0 too large" +#~ msgstr "Typeløs konstant ved %0 er for stor" + +#~ msgid "First-column ampersand continuation at %0" +#~ msgstr "Førstekolonne og-tegnsfortsættelse ved %0" + +#~ msgid "Global name `%A' defined at %0 already defined at %1 [info -f g77 M GLOBALS]" +#~ msgstr "Globalt navn '%A' defineret ved %0 er allerede defineret ved %1 [info -f g77 M GLOBALS]" + +#~ msgid "Global name `%A' is %B at %0 but is %C at %1 [info -f g77 M GLOBALS]" +#~ msgstr "Globalt navn '%A' er %B ved %0, men er %C ved %1 [info -f g77 M GLOBALS]" + +#~ msgid "Global name `%A' at %0 has different type at %1 [info -f g77 M GLOBALS]" +#~ msgstr "Globalt navn '%A' ved %0 har anden type ved %1 [info -f g77 M GLOBALS]" + +#~ msgid "Too %B arguments passed to `%A' at %0 versus definition at %1 [info -f g77 M GLOBALS]" +#~ msgstr "For %B parameter overbragt til '%A' ved %0 mod definitionen ved %1 [info -f g77 M GLOBALS]" + +#~ msgid "Too %B arguments for `%A' at %0 versus invocation at %1 [info -f g77 M GLOBALS]" +#~ msgstr "For %B parametre til '%A' ved %0 mod kald ved %1 [info -f g77 M GLOBALS]" + +#~ msgid "Argument #%B of `%A' is %C at %0 but is %D at %1 [info -f g77 M GLOBALS]" +#~ msgstr "Parameter nr. %B for '%A' er %C ved %0, men er %D ved %1 [info -f g77 M GLOBALS]" + +#~ msgid "Array `%A' at %0 is too large to handle" +#~ msgstr "Tabellen '%A' ved %0 er for stor til at håndtere" + +#~ msgid "Statement function `%A' defined at %0 is not used" +#~ msgstr "Sætningsfunktion '%A' defineret ved %0, men er ikke brugt" + +#~ msgid "Intrinsic `%A', invoked at %0, known to be non-Y2K-compliant [info -f g77 M Y2KBAD]" +#~ msgstr "Indbygget '%A', kaldt ved %0, vides ikke være år 2000-sikker [info -f g77 M Y2KBAD]" + +#~ msgid "Internal compiler error -- cannot perform operation" +#~ msgstr "Intern oversætterfejl - kan ikke udføre operation" + +#~ msgid "In unknown kind" +#~ msgstr "I ukendt ting" + +#~ msgid "In entity" +#~ msgstr "I enheden" + +#~ msgid "In function" +#~ msgstr "I funktionen" + +#~ msgid "In subroutine" +#~ msgstr "I underrutinen" + +#~ msgid "In program" +#~ msgstr "I programmet" + +#~ msgid "In block-data unit" +#~ msgstr "I blokdataenheden" + +#~ msgid "In common block" +#~ msgstr "I den almene blok" + +#~ msgid "In construct" +#~ msgstr "I konstruktionen" + +#~ msgid "In namelist" +#~ msgstr "I navnelisten" + +#~ msgid "In anything" +#~ msgstr "I et eller andet" + +#~ msgid "internal error in check-init: tree code not implemented: %s" +#~ msgstr "intern fejl i check-init: trækode ikke implementeret: %s" + +#~ msgid "final field '%s' may not have been initialized" +#~ msgstr "slutfeltet '%s' bliver måske ikke klargjort" + +#~ msgid "internal error - too many interface type" +#~ msgstr "intern fejl - for mange grænsefladetyper" + +#~ msgid "bad method signature" +#~ msgstr "ugyldig metodesignatur" + +#~ msgid "misplaced ConstantValue attribute (not in any field)" +#~ msgstr "forkert placeret ConstantValue-egenskab (ikke i noget felt)" + +#~ msgid "duplicate ConstantValue attribute for field '%s'" +#~ msgstr "mere end én ConstantValue-egenskab for feltet '%s'" + +#~ msgid "ConstantValue attribute of field '%s' has wrong type" +#~ msgstr "ConstantValue-egenskaben for feltet '%s' har forkert type" + +#~ msgid "field '%s' not found in class" +#~ msgstr "feltet '%s' blev ikke fundet i klassen" + +#~ msgid "abstract method in non-abstract class" +#~ msgstr "abstrakt metode i ikke-abstrakt klasse" + +#~ msgid "non-static method '%s' overrides static method" +#~ msgstr "ikke-statisk metode '%s' overskriver statisk metode" + +#~ msgid "In %s: overlapped variable and exception ranges at %d" +#~ msgstr "I %s: overlappende variabel- og undtagelsesintervaller ved %d" + +#~ msgid "bad type in parameter debug info" +#~ msgstr "ugyldig type i parameterfejlanalyseringsinfo" + +#~ msgid "bad PC range for debug info for local `%s'" +#~ msgstr "ugyldig PC-interval for fejlanalyseringsinfo for lokal '%s'" + +#~ msgid "stack underflow - dup* operation" +#~ msgstr "stakunderløb - dup*-operation" + +#~ msgid "reference `%s' is ambiguous: appears in interface `%s' and interface `%s'" +#~ msgstr "reference '%s' er tvetydig: den optræder i grænsefladen '%s' og grænsefladen '%s'" + +#~ msgid "field `%s' not found" +#~ msgstr "feltet '%s' ikke fundet" + +#~ msgid "ret instruction not implemented" +#~ msgstr "ret-instruktion ikke implementeret" + +#~ msgid "method '%s' not found in class" +#~ msgstr "metoden '%s' ikke fundet i klassen" + +#~ msgid "failed to find class '%s'" +#~ msgstr "kunne ikke finde klassen '%s'" + +#~ msgid "class '%s' has no method named '%s' matching signature '%s'" +#~ msgstr "klassen '%s' har ingen metode ved navn '%s' der passer med signaturen '%s'" + +#~ msgid "invokestatic on non static method" +#~ msgstr "invokestatic på en ikke-statisk metode" + +#~ msgid "invokestatic on abstract method" +#~ msgstr "invokestatic på en abstrakt metode" + +#~ msgid "invoke[non-static] on static method" +#~ msgstr "invoke[non-static] på en statisk metode" + +#~ msgid "missing field '%s' in '%s'" +#~ msgstr "manglende felt '%s' i '%s'" + +#~ msgid "mismatching signature for field '%s' in '%s'" +#~ msgstr "signatur passer ikke med feltet '%s' i '%s'" + +#~ msgid "assignment to final field `%s' not in field's class" +#~ msgstr "tildeling til endeligt felt '%s' er ikke i feltets klasse" + +#~ msgid "assignment to final static field `%s' not in class initializer" +#~ msgstr "tildeling til endeligt statisk felt '%s' er ikke i klassens klargøring" + +#~ msgid "assignment to final field `%s' not in constructor" +#~ msgstr "tildeling til endeligt felt '%s' er ikke i konstruktionsfunktion" + +#~ msgid "can't expand %s" +#~ msgstr "kan ikke udfolde %s" + +#~ msgid "invalid PC in line number table" +#~ msgstr "ugyldig PC i linjetalstabel" + +#~ msgid "unreachable bytecode from %d to before %d" +#~ msgstr "kan ikke nå bytekode fra %d til før %d" + +#~ msgid "unreachable bytecode from %d to the end of the method" +#~ msgstr "kan ikke nå bytekode fra %d til slutningen af metoden" + +#~ msgid "unrecogized wide sub-instruction" +#~ msgstr "ukendt bred underinstruktion" + +#~ msgid "source file for class `%s' is newer than its matching class file. Source file `%s' used instead" +#~ msgstr "kildekodefilen for klassen '%s' er nyere end dens tilsvarende klassefil; kildekodefilen '%s' benyttet i stedet" + +#~ msgid "bad string constant" +#~ msgstr "ugyldig strengkonstant" + +#~ msgid "bad value constant type %d, index %d" +#~ msgstr "ugyldig værdikonstanttype %d, indeks %d" + +#~ msgid "can't reopen %s" +#~ msgstr "kan ikke genåbne %s" + +#~ msgid "can't close %s" +#~ msgstr "kan ikke lukke %s" + +#~ msgid "cannot find file for class %s" +#~ msgstr "kan ikke finde filen for klassen %s" + +#~ msgid "not a valid Java .class file" +#~ msgstr "ikke en gyldig Java .class-fil" + +#~ msgid "error while parsing constant pool" +#~ msgstr "fejl ved tolkning af konstant område" + +#~ msgid "error in constant pool entry #%d\n" +#~ msgstr "fejl i konstantområdelement nr. %d\n" + +#~ msgid "reading class %s for the second time from %s" +#~ msgstr "læser klassen %s for anden gang fra %s" + +#~ msgid "error while parsing fields" +#~ msgstr "fejl ved tolkning af felter" + +#~ msgid "error while parsing methods" +#~ msgstr "fejl ved tolkning af metoder" + +#~ msgid "error while parsing final attributes" +#~ msgstr "fejl ved tolkning af endelige egenskaber" + +#~ msgid "the `java.lang.Object' that was found in `%s' didn't have the special zero-length `gnu.gcj.gcj-compiled' attribute. This generally means that your classpath is incorrectly set. Use `info gcj \"Input Options\"' to see the info page describing how to set the classpath" +#~ msgstr "det 'java.lang.Object' som blev fundet i '%s' havde ikke den specielle nullængdes egenskab 'gnu.gcj.gcj-compiled'. Dette betyder som regel at din klassesti er angivet forkert. Prøv 'info gcj \"Input Options\"' for at se en infoside der beskriver hvordan man angiver klassestien" + +#~ msgid "missing Code attribute" +#~ msgstr "manglende Code-egenskab" + +#~ msgid "source file seen twice on command line and will be compiled only once" +#~ msgstr "kildekodefil angivet to gange i kommandolinjen og vil kun blive oversat én gang" + +#~ msgid "no input file specified" +#~ msgstr "ingen inddatafiler angivet" + +#~ msgid "can't close input file %s" +#~ msgstr "kan ikke lukke inddatafilen %s" + +#~ msgid "bad zip/jar file %s" +#~ msgstr "ødelagt zip/jar-fil %s" + +#~ msgid "internal error in generate_bytecode_insn - tree code not implemented: %s" +#~ msgstr "intern fejl i generate_bytecode_insn - trækode er ikke implementeret: %s" + +#~ msgid "field initializer type mismatch" +#~ msgstr "typen af startværdien for feltet passer ikke" + +#~ msgid "can't create directory %s" +#~ msgstr "kan ikke oprette kataloget %s" + +#~ msgid "can't create %s" +#~ msgstr "kan ikke oprette %s" + +#~ msgid "only one of `--print-main', `--list-class', and `--complexity' allowed" +#~ msgstr "kun én af '--print-main', '--list-class' og '--complexity' tilladt" + +#~ msgid "can't open output file `%s'" +#~ msgstr "kan ikke åbne uddatafilen '%s'" + +#~ msgid "file not found `%s'" +#~ msgstr "filen '%s' blev ikke fundet" + +#~ msgid "can't specify `-D' without `--main'\n" +#~ msgstr "kan ikke angive '-D' uden '--main'\n" + +#~ msgid "`%s' is not a valid class name" +#~ msgstr "'%s' er et ugyldigt klassenavn" + +#~ msgid "--resource requires -o" +#~ msgstr "--resource påkræver -o" + +#~ msgid "warning: already-compiled .class files ignored with -C" +#~ msgstr "advarsel: allerede oversatte .class-filer ignoreret med -C" + +#~ msgid "cannot specify both -C and -o" +#~ msgstr "-C og -o er indbyrdes uforenelige" + +#~ msgid "cannot create temporary file" +#~ msgstr "kan ikke oprette midlertidig fil" + +#~ msgid "using both @FILE with multiple files not implemented" +#~ msgstr "brug af @FILE med flere filer er ikke implementeret" + +#~ msgid "cannot specify `main' class when not linking" +#~ msgstr "kan ikke angive 'main'-klassen når der ikke sammenkædes" + +#~ msgid "can't do dependency tracking with input from stdin" +#~ msgstr "kan ikke udføre afhængighedsfølgning med inddata fra standard-ind" + +#~ msgid "couldn't determine target name for dependency tracking" +#~ msgstr "kunne ikke bestemme målnavn for afhængighedsfølgning" + +#~ msgid "" +#~ "unknown encoding: `%s'\n" +#~ "This might mean that your locale's encoding is not supported\n" +#~ "by your system's iconv(3) implementation. If you aren't trying\n" +#~ "to use a particular encoding for your input file, try the\n" +#~ "`--encoding=UTF-8' option" +#~ msgstr "" +#~ "ukendt kodning: '%s'\n" +#~ "Dette betyder muligvis at kodningen fra dine regionaldata ikke\n" +#~ "understøttes af dit systems iconv(3)-implementering. Hvis du \n" +#~ "ikke ønske at bruge en bestemt kodning for dine inddatafiler, \n" +#~ "så prøv tilvalget '--encoding=UTF-8'" + +#~ msgid "can't mangle %s" +#~ msgstr "kan ikke sammensætte %s" + +#~ msgid "internal error - invalid Utf8 name" +#~ msgstr "intern fejl - ugyldigt UTF-8-navn" + +#~ msgid "Missing term" +#~ msgstr "Manglende term" + +#~ msgid "';' expected" +#~ msgstr "';' forventet" + +#~ msgid "Missing name" +#~ msgstr "Manglende navn" + +#~ msgid "'*' expected" +#~ msgstr "'*' forventet" + +#~ msgid "Class or interface declaration expected" +#~ msgstr "Klasse- eller grænsefladeerklæring forventet" + +#~ msgid "Missing class name" +#~ msgstr "Manglende klassenavn" + +#~ msgid "'{' expected" +#~ msgstr "'{' forventet" + +#~ msgid "Missing super class name" +#~ msgstr "Manglende superklassenavn" + +#~ msgid "Missing interface name" +#~ msgstr "Manglende grænsefladenavn" + +#~ msgid "Missing variable initializer" +#~ msgstr "Manglende variabelstartværdi" + +#~ msgid "Invalid declaration" +#~ msgstr "Ugyldig erklæring" + +#~ msgid "']' expected" +#~ msgstr "']' forventet" + +#~ msgid "Unbalanced ']'" +#~ msgstr "Uafbalanceret ']'" + +#~ msgid "Invalid method declaration, method name required" +#~ msgstr "Ugyldig metodeerklæring, metodenavn påkrævet" + +#~ msgid "Identifier expected" +#~ msgstr "Kaldenavn forventet" + +#~ msgid "Invalid method declaration, return type required" +#~ msgstr "Ugyldig metodeerklæring, returtype påkrævet" + +#~ msgid "')' expected" +#~ msgstr "')' forventet" + +#~ msgid "Missing formal parameter term" +#~ msgstr "Manglende formel parameterterm" + +#~ msgid "Missing identifier" +#~ msgstr "Manglende kaldenavn" + +#~ msgid "Missing class type term" +#~ msgstr "Manglende klassetypeterm" + +#~ msgid "Invalid interface type" +#~ msgstr "Ugyldig grænsefladetype" + +#~ msgid "':' expected" +#~ msgstr "':' forventet" + +#~ msgid "Invalid expression statement" +#~ msgstr "Ugyldig udtrykssætning" + +#~ msgid "'(' expected" +#~ msgstr "'(' forventet" + +#~ msgid "Missing term or ')'" +#~ msgstr "Manglende term eller ')'" + +#~ msgid "Missing or invalid constant expression" +#~ msgstr "Manglende eller ugyldigt konstant udtryk" + +#~ msgid "Missing term and ')' expected" +#~ msgstr "Manglende term eller ')' forventet" + +#~ msgid "Invalid control expression" +#~ msgstr "Ugyldigt kontroludtryk" + +#~ msgid "Invalid update expression" +#~ msgstr "Ugyldigt opdateringsudtryk" + +#~ msgid "Invalid init statement" +#~ msgstr "Ugyldig klargøringssætning" + +#~ msgid "Missing term or ')' expected" +#~ msgstr "Manglende term eller ')' forventet" + +#~ msgid "'class' or 'this' expected" +#~ msgstr "'class' eller 'this' forventet" + +#~ msgid "'class' expected" +#~ msgstr "'class' forventet" + +#~ msgid "')' or term expected" +#~ msgstr "')' eller term forventet" + +#~ msgid "'[' expected" +#~ msgstr "'[' forventet" + +#~ msgid "Field expected" +#~ msgstr "Felt forventet" + +#~ msgid "Missing term and ']' expected" +#~ msgstr "Manglende term og ']' forventet" + +#~ msgid "']' expected, invalid type expression" +#~ msgstr "']' forventet, ugyldigt typeudtryk" + +#~ msgid "Invalid type expression" +#~ msgstr "Ugyldigt typeudtryk" + +#~ msgid "Invalid reference type" +#~ msgstr "Ugyldig referencetype" + +#~ msgid "Constructor invocation must be first thing in a constructor" +#~ msgstr "Konstruktionsfunktionskald skal være det første i en konstruktionsfunktion" + +#~ msgid "Only constructors can invoke constructors" +#~ msgstr "Kun konstruktionsfunktioner kan kalde konstruktionsfunktioner" + +#~ msgid ": `%s' JDK1.1(TM) feature" +#~ msgstr ": '%s' JDK1.1(TM)-facilitet" + +#~ msgid "" +#~ "%s.\n" +#~ "%s" +#~ msgstr "" +#~ "%s.\n" +#~ "%s" + +#~ msgid "malformed .zip archive in CLASSPATH: %s" +#~ msgstr "ugyldigt udformet .zip-arkiv i CLASSPATH: %s" + +#~ msgid "Can't find default package `%s'. Check the CLASSPATH environment variable and the access to the archives" +#~ msgstr "Kan ikke finde standardpakken '%s'. Kontrollér CLASSPATH-miljøvariablen og tilgangen til arkiverne" + +#~ msgid "missing static field `%s'" +#~ msgstr "manglende statisk felt '%s'" + +#~ msgid "not a static field `%s'" +#~ msgstr "ikke et statisk felt '%s'" + +#~ msgid "No case for %s" +#~ msgstr "Ingen case for %s" + +#~ msgid "unregistered operator %s" +#~ msgstr "ikke-registreret operator %s" + +#~ msgid "junk at end of signature string" +#~ msgstr "ragelse i slutningen signaturstreng" + +#~ msgid "bad pc in exception_table" +#~ msgstr "ugyldig pc i exception_table" + +#~ msgid "exception handler inside code that is being protected" +#~ msgstr "undtagelseshåndtering inden i kode der bliver beskyttet" + +#~ msgid "unknown opcode %d@pc=%d during verification" +#~ msgstr "ukendt kode %d@pc=%d under verifikation" + +#~ msgid "verification error at PC=%d" +#~ msgstr "verifikationsfejl ved PC=%d" + +#~ msgid "Disable automatic array bounds checking" +#~ msgstr "Deaktivér automatisk tabelgrænsekontrollering" + +#~ msgid "Disable assignability checks for stores into object arrays" +#~ msgstr "Deaktivér tildelingstjek for lagringer i objekttabeller" + +#~ msgid "Assume native functions are implemented using JNI" +#~ msgstr "Antag at indfødte funktioner er implementeret vha. JNI" + +#~ msgid "Replace system path" +#~ msgstr "Erstat systemsti" + +#~ msgid "Set class path" +#~ msgstr "Angiv klassesti" + +#~ msgid "Set class path (deprecated: use --classpath instead)" +#~ msgstr "Angiv klassesti (forældet: benyt --classpath i stedet)" + +#~ msgid "Choose class whose main method should be used" +#~ msgstr "Vælg klasse hvis main-metode skal bruges" + +#~ msgid "Choose input encoding (default comes from locale)" +#~ msgstr "Vælg inddatakodning (standardværdi kommer fra regionalindstillinger)" + +#~ msgid "Add directory to class path" +#~ msgstr "Tilføj katalog til klassesti" + +#~ msgid "Directory where class files should be written" +#~ msgstr "Katalog som klassefiler skrives i" + +#~ msgid "Warn if modifiers are specified when not necessary" +#~ msgstr "Advar hvis modifikationer angives når det ikke er nødvendigt" + +#~ msgid "Warn if deprecated empty statements are found" +#~ msgstr "Advar hvis forældede tomme sætninger bliver fundet" + +#~ msgid "Warn if .class files are out of date" +#~ msgstr "Advar hvis .class-filer er forældede" + +#~ msgid "Always check for non gcj generated classes archives" +#~ msgstr "Kontrollér altid for ikke-GCJ-genererede klassearkiver" + +#~ msgid "Never optimize static class initialization code" +#~ msgstr "Optimér aldrig statiske klassers klargøringskode" + +#~ msgid "Use offset tables for virtual method calls" +#~ msgstr "Benyt afsætstabeller til virtuelle metodekald" + +#~ msgid "object does not conform to the `%s' protocol" +#~ msgstr "objekt overholder ikke protokollen '%s'" + +#~ msgid "class `%s' does not implement the `%s' protocol" +#~ msgstr "klassen '%s' implementerer ikke protokollen '%s'" + +#~ msgid "`%s' cannot be statically allocated" +#~ msgstr "'%s' kan ikke allokeres statisk" + +#~ msgid "unexpected type for `id' (%s)" +#~ msgstr "uventet type for 'id' (%s)" + +#~ msgid "undefined type `id', please import " +#~ msgstr "typen 'id' er ikke defineret, importér venligst " + +#~ msgid "protocol `%s' has circular dependency" +#~ msgstr "protokollen '%s' har cirkulær afhængighed" + +#~ msgid "cannot find protocol declaration for `%s'" +#~ msgstr "kan ikke finde protokolerklæringen af '%s'" + +#~ msgid "cannot find interface declaration for `%s'" +#~ msgstr "kan ikke finde grænsefladeerklæringen af '%s'" + +#~ msgid "cannot find reference tag for class `%s'" +#~ msgstr "kan ikke finde referencemærket for klassen '%s'" + +#~ msgid "creating selector for non existant method %s" +#~ msgstr "opretter vælger for ikke-eksisterende metode '%s'" + +#~ msgid "cannot find class `%s'" +#~ msgstr "kan ikke finde klassen '%s'" + +#~ msgid "class `%s' already exists" +#~ msgstr "klassen '%s' eksisterer allerede" + +#~ msgid "cannot find interface declaration for `%s', superclass of `%s'" +#~ msgstr "kan ikke grænsefladeerklæringen af '%s', superklasse til '%s'" + +#~ msgid "circular inheritance in interface declaration for `%s'" +#~ msgstr "cirkulær nedarvning i interface-erklæringen af '%s'" + +#~ msgid "inconsistent instance variable specification" +#~ msgstr "inkonsistent instansvariabelangivelse" + +#~ msgid "can not use an object as parameter to a method\n" +#~ msgstr "kan ikke benytte et objekt som parameter til en metode\n" + +#~ msgid "multiple declarations for method `%s'" +#~ msgstr "mere end én erklæring af metoden '%s'" + +#~ msgid "invalid receiver type `%s'" +#~ msgstr "ugyldig modtagertype '%s'" + +#~ msgid "`%s' does not respond to `%s'" +#~ msgstr "'%s' svarer ikke på '%s'" + +#~ msgid "no super class declared in interface for `%s'" +#~ msgstr "ingen superklasse erklæret i grænsefladen for '%s'" + +#~ msgid "cannot find class (factory) method" +#~ msgstr "kan ikke finde klasse(fabriks)metode" + +#~ msgid "return type for `%s' defaults to id" +#~ msgstr "returtypen for '%s' får standardværdien id" + +#~ msgid "method `%s' not implemented by protocol" +#~ msgstr "metoden '%s' er ikke implementeret af protokollen" + +#~ msgid "return type defaults to id" +#~ msgstr "returtype får standardværdien id" + +#~ msgid "cannot find method" +#~ msgstr "kan ikke finde metode" + +#~ msgid "undeclared selector `%s'" +#~ msgstr "uerklæret vælger '%s'" + +#~ msgid "instance variable `%s' accessed in class method" +#~ msgstr "instansvariablen '%s' tilgået i klassemetode" + +#~ msgid "duplicate definition of class method `%s'" +#~ msgstr "mere end én definition af klassemetoden '%s'" + +#~ msgid "duplicate declaration of class method `%s'" +#~ msgstr "mere end én erklæring af klassemetoden '%s'" + +#~ msgid "duplicate definition of instance method `%s'" +#~ msgstr "mere end én definition af instansmetoden '%s'" + +#~ msgid "duplicate declaration of instance method `%s'" +#~ msgstr "mere end én erklæring af instansmetoden '%s'" + +#~ msgid "duplicate interface declaration for category `%s(%s)'" +#~ msgstr "mere end én grænsefladeerklæring af kategorien '%s(%s)'" + +#~ msgid "instance variable `%s' is declared private" +#~ msgstr "instansvariablen '%s' er erklæret privat" + +#~ msgid "instance variable `%s' is declared %s" +#~ msgstr "instansvariablen '%s' er erklæret '%s'" + +#~ msgid "static access to object of type `id'" +#~ msgstr "statisk tilgang til objekt af typen 'id'" + +#~ msgid "incomplete implementation of class `%s'" +#~ msgstr "ufuldstændig implementering af klassen '%s'" + +#~ msgid "incomplete implementation of category `%s'" +#~ msgstr "ufuldstændig implementering af kategorien '%s'" + +#~ msgid "method definition for `%c%s' not found" +#~ msgstr "metodedefinitionen for '%c%s' ikke fundet" + +#~ msgid "%s `%s' does not fully implement the `%s' protocol" +#~ msgstr "%s '%s' implementerer ikke helt protokollen '%s'" + +#~ msgid "`@end' missing in implementation context" +#~ msgstr "'@end' mangler i implementationskontekst" + +#~ msgid "reimplementation of class `%s'" +#~ msgstr "omimplementering af klassen '%s'" + +#~ msgid "conflicting super class name `%s'" +#~ msgstr "modstridende superklassenavn '%s'" + +#~ msgid "duplicate interface declaration for class `%s'" +#~ msgstr "mere end én grænsefladeerklæring af klassen '%s'" + +#~ msgid "duplicate declaration for protocol `%s'" +#~ msgstr "mere end én erklæring af protokollen '%s'" + +#~ msgid "[super ...] must appear in a method context" +#~ msgstr "[super ...] skal optræde i en metodekontekst" + +#~ msgid "potential selector conflict for method `%s'" +#~ msgstr "potentiel vælgerkonflikt for metoden '%s'" + +#~ msgid "`@end' must appear in an implementation context" +#~ msgstr "'@end' skal optræde i en implementationskontekst" + +#~ msgid "method definition not in class context" +#~ msgstr "metodedefinitionen optræder ikke i en klassekontekst" + +#~ msgid "Dump decls to a .decl file" +#~ msgstr "Udskriv erklæringer i en .decl-fil" + +#~ msgid "Generate code for GNU runtime environment" +#~ msgstr "Generér kode til GNU-kørselmiljø" + +#~ msgid "Generate code for NeXT runtime environment" +#~ msgstr "Generér kode til NeXT-kørselmiljø" + +#~ msgid "Warn if a selector has multiple methods" +#~ msgstr "Advar hvis en vælger har flere metoder" + +#~ msgid "Do not warn if inherited methods are unimplemented" +#~ msgstr "Advar ikk hvis nedarvede metoder ikke implementeres" + +#~ msgid "Generate C header of platform specific features" +#~ msgstr "Generér C-inkluderingsfil med platformspecifikke faciliteter" + +#~ msgid "Specify the name of the class for constant strings" +#~ msgstr "Angiv navnet på klassen til konstante strenge" + +#~ msgid "(debug) trace parsing process" +#~ msgstr "(fejlretning) følg fortolkningsprocessen" + +#~ msgid "(debug) trace lexical analysis" +#~ msgstr "(fejlretning) følg lexikalsk analyse" + +#~ msgid "-current_version only allowed with -dynamiclib" +#~ msgstr "-current_version er kun tilladt med -dynamiclib" + +#~ msgid "-install_name only allowed with -dynamiclib" +#~ msgstr "-install_name er kun tilladt med -dynamiclib" + +#~ msgid "-bundle not allowed with -dynamiclib" +#~ msgstr "-bundle er ikke tilladt med -dynamiclib" + +#~ msgid "-bundle_loader not allowed with -dynamiclib" +#~ msgstr "-bundle_loader er ikke tilladt med -dynamiclib" + +#~ msgid "-client_name not allowed with -dynamiclib" +#~ msgstr "-client_name er ikke tilladt med -dynamiclib" + +#~ msgid "-force_cpusubtype_ALL not allowed with -dynamiclib" +#~ msgstr "-force_cpusubtype_ALL er ikke tilladt med -dynamiclib" + +#~ msgid "-force_flat_namespace not allowed with -dynamiclib" +#~ msgstr "-force_flat_namespace er ikke tilladt med -dynamiclib" + +#~ msgid "-keep_private_externs not allowed with -dynamiclib" +#~ msgstr "-keep_private_externs er ikke tilladt med -dynamiclib" + +#~ msgid "-private_bundle not allowed with -dynamiclib" +#~ msgstr "-private_bundle er ikke tilladt med -dynamiclib" + +#~ msgid "GNU C does not support -C without using -E" +#~ msgstr "GNU C understøtter ikke -C uden -E" + +#~ msgid "GNU C does not support -CC without using -E" +#~ msgstr "GNU C understøtter ikke -CC uden -E" + +#~ msgid "`-p' not supported; use `-pg' and gprof(1)" +#~ msgstr "'-p' understøttes ikke; brug '-pg' og gprof(1)" + +#~ msgid "may not use both -m32 and -m64" +#~ msgstr "-m32 og -m64 er indbyrdes uforenelige" + +#~ msgid "The -shared option is not currently supported for VAX ELF." +#~ msgstr "Tilvalget -shared understøttes i øjeblikket ikke for VAX ELF." + +#~ msgid "profiling not supported with -mg\n" +#~ msgstr "profilgenerering understøttes ikke med -mg\n" + +#~ msgid "-pipe is not supported" +#~ msgstr "-pipe understøttes ikke" + +#~ msgid "may not use both -EB and -EL" +#~ msgstr "kan ikke bruge både -EB og -EL" + +#~ msgid "-pg and -fomit-frame-pointer are incompatible" +#~ msgstr "-pg og -fomit-frame-pointer er indbyrdes uforenelige" + +#~ msgid "mno-cygwin and mno-win32 are not compatible" +#~ msgstr "-mno-cygwin og -mnowin32 er indbyrdes uforenelige" + +#~ msgid "shared and mdll are not compatible" +#~ msgstr "shared og mdll er indbyrdes uforenelige" + +#~ msgid "-E required when input is from standard input" +#~ msgstr "-E påkrævet når inddata kommer fra standardind" + +#~ msgid "compilation of header file requested" +#~ msgstr "oversættelse af inkluderingsfil udbedt" + +#~ msgid " conflicting code gen style switches are used" +#~ msgstr " konfliktende kodegenereringstilvalg er benyttet" + +#~ msgid "-pg or -p and -fomit-frame-pointer are incompatible" +#~ msgstr "-pg eller -p og -fomit-frame-pointer er indbyrdes uforenelige" + +#~ msgid "choose either big or little endian, not both" +#~ msgstr "vælg enten stor- eller lilleendet, ikke begge" + +#~ msgid "choose either m340 or m210 not both" +#~ msgstr "vælg enten m340 eller m210, ikke begge" + +#~ msgid "the m210 does not have little endian support" +#~ msgstr "m210 har ikke understøttelse for lilleendet" + +#~ msgid "-mapcs-26 and -mapcs-32 may not be used together" +#~ msgstr "-mapcs-26 og -mapcs-32 kan ikke bruges på samme tid" + +#~ msgid "-msoft-float and -mhard_float may not be used together" +#~ msgstr "-msoft-float og -mhard_float kan ikke bruges på samme tid" + +#~ msgid "-mbig-endian and -mlittle-endian may not be used together" +#~ msgstr "-mbig-endian og -mlittle-endian kan ikke bruges på samme tid" + +#~ msgid "-mhard-float not supported" +#~ msgstr "-mhard-float understøttes ikke" + +#~ msgid "-msingle-float and -msoft-float can not both be specified" +#~ msgstr "-msingle-float og -msoft-float er indbyrdes uforenelige" + +#~ msgid "-c or -S required for Ada" +#~ msgstr "-c eller -S kræves til Ada" + +#~ msgid "-fjni and -femit-class-files are incompatible" +#~ msgstr "-fjni og -femit-class-files er indbyrdes uforenelige" + +#~ msgid "-fjni and -femit-class-file are incompatible" +#~ msgstr "-fjni og -femit-class-file er indbyrdes uforenelige" + +#~ msgid "-femit-class-file should used along with -fsyntax-only" +#~ msgstr "-femit-class-file skal bruges sammen med -fsyntax-only" + +#~ msgid "-static not valid with -mcoff" +#~ msgstr "-static er ikke gyldig sammen med -mcoff" + +#~ msgid "-shared not valid with -mcoff" +#~ msgstr "-shared er ikke gyldig sammen med -mcoff" + +#~ msgid "-symbolic not valid with -mcoff" +#~ msgstr "-symbolic er ikke gyldig sammen med -mcoff" + +#~ msgid "-fpic is not valid with -mcoff" +#~ msgstr "-fpic er ikke gyldig sammen med -mcoff" + +#~ msgid "-fPIC is not valid with -mcoff" +#~ msgstr "-fPIC er ikke gyldig sammen med -mcoff" + +#~ msgid "-fpic not valid with -mcoff" +#~ msgstr "-fpic er ikke gyldig sammen med -mcoff" + +#~ msgid "-fPIC not valid with -mcoff" +#~ msgstr "-fPIC er ikke gyldig sammen med -mcoff" + +#~ msgid "__alignof__ applied to an incomplete type" +#~ msgstr "__alignof__ benyttet på en ufuldstændig type" + +#~ msgid "-traditional is deprecated and may be removed" +#~ msgstr "-traditional er forældet og kan blive fjernet" + +#~ msgid "unknown C standard `%s'" +#~ msgstr "ukendt C-standard '%s'" + +#~ msgid "type of external `%s' is not global" +#~ msgstr "typen af den eksterne '%s' er ikke global" + +#~ msgid "typedef `%s' is initialized" +#~ msgstr "typedef '%s' bliver tildelt en startværdi" + +#~ msgid "unnamed fields of type other than struct or union are not allowed" +#~ msgstr "unavngivne felter af andre typer end struct eller union er ikke tilladt" + +#~ msgid "null format string" +#~ msgstr "formateringsstreng er nul" + +#~ msgid "ignoring #pragma %s" +#~ msgstr "ignorerer #pragma: %s" + +#~ msgid "both 'f' and 'l' suffixes on floating constant" +#~ msgstr "både 'f'- og 'l'-endelser i kommatalskonstant" + +#~ msgid "floating point number exceeds range of '%s'" +#~ msgstr "kommatal overskrider intervallet for '%s" + +#~ msgid "decimal point in exponent - impossible!" +#~ msgstr "decimalkomma i eksponent - umuligt!" + +#~ msgid "underscore in number" +#~ msgstr "understreg i tal" + +#~ msgid "numeric constant with no digits" +#~ msgstr "talkonstant uden cifre" + +#~ msgid "numeric constant contains digits beyond the radix" +#~ msgstr "talkonstant indeholder cifre der ligger ud over grundtallet" + +#~ msgid "floating constant may not be in radix 16" +#~ msgstr "kommatalskonstant må ikke skrives med grundtal 16" + +#~ msgid "more than one 'f' suffix on floating constant" +#~ msgstr "mere end én 'f'-endelse i kommatalskonstant" + +#~ msgid "traditional C rejects the 'f' suffix" +#~ msgstr "traditionel C tillader ikke endelsen 'f'" + +#~ msgid "more than one 'l' suffix on floating constant" +#~ msgstr "mere end én 'l'-endelse i kommatalskonstant" + +#~ msgid "traditional C rejects the 'l' suffix" +#~ msgstr "traditionel C tillader ikke endelsen 'l'" + +#~ msgid "more than one 'i' or 'j' suffix on floating constant" +#~ msgstr "mere end én 'i'- eller 'j'-endelse i kommatalskonstant" + +#~ msgid "ISO C forbids imaginary numeric constants" +#~ msgstr "ISO C forbyder imaginære talkonstanter" + +#~ msgid "floating constant out of range" +#~ msgstr "kommatalskonstant er uden for det gyldige interval" + +#~ msgid "floating point number exceeds range of 'double'" +#~ msgstr "kommatal overskrider intervallet for 'double'" + +#~ msgid "two 'u' suffixes on integer constant" +#~ msgstr "to 'u'-endelser i heltalskonstant" + +#~ msgid "traditional C rejects the 'u' suffix" +#~ msgstr "traditionel C tillader ikke 'u'-endelsen" + +#~ msgid "three 'l' suffixes on integer constant" +#~ msgstr "tre 'l'-endelser i heltalskonstant" + +#~ msgid "'lul' is not a valid integer suffix" +#~ msgstr "'lul' er ikke en gyldig heltalsendelse" + +#~ msgid "'Ll' and 'lL' are not valid integer suffixes" +#~ msgstr "'Ll' og 'lL' er ikke gyldige heltalsendelser" + +#~ msgid "more than one 'i' or 'j' suffix on integer constant" +#~ msgstr "mere end én 'i'- eller 'j'-endelse i heltalskonstant" + +#~ msgid "invalid suffix on integer constant" +#~ msgstr "ugyldig endelse i heltalskonstant" + +#~ msgid "integer constant is too large for this configuration of the compiler - truncated to %d bits" +#~ msgstr "heltalskonstant er for stor til denne konfiguration af oversætteren - afkortet til %d bit" + +#~ msgid "width of integer constant changes with -traditional" +#~ msgstr "bredden af heltalskonstant skifter med -traditional" + +#~ msgid "integer constant is unsigned in ISO C, signed with -traditional" +#~ msgstr "heltalskonstant er unsigned i ISO C, signed med -traditional" + +#~ msgid "width of integer constant may change on other systems with -traditional" +#~ msgstr "bredden af heltalskonstant kan skifte på andre systemer med -traditional" + +#~ msgid "integer constant larger than the maximum value of %s" +#~ msgstr "heltalskonstant er større end den maksimale værdi for %s" + +#~ msgid "an unsigned long long int" +#~ msgstr "en unsigned long long int" + +#~ msgid "a long long int" +#~ msgstr "en long long int" + +#~ msgid "an unsigned long int" +#~ msgstr "en unsigned long int" + +#~ msgid "decimal constant is so large that it is unsigned" +#~ msgstr "decimalkonstant er så stor at den er unsigned" + +#~ msgid "complex integer constant is too wide for 'complex int'" +#~ msgstr "kompleks heltalskonstant er for bred til 'complex int'" + +#~ msgid "integer constant is larger than the maximum value for its type" +#~ msgstr "heltalskonstant er større end den maksimale værdi for dens type" + +#~ msgid "missing white space after number '%.*s'" +#~ msgstr "manglende mellemrum efter tallet '%.*s'" + +#~ msgid "ISO C does not permit use of `varargs.h'" +#~ msgstr "ISO C tillader ikke brug af 'varargs.h'" + +#~ msgid "storage class specifier in array declarator" +#~ msgstr "lagringsklasseanvisning i tabelerklæring" + +#~ msgid "sizeof applied to a function type" +#~ msgstr "sizeof benyttet på en funktionstype" + +#~ msgid "sizeof applied to a void type" +#~ msgstr "sizeof benyttet på en void-type" + +#~ msgid "sizeof applied to an incomplete type" +#~ msgstr "sizeof benyttet på en ufuldstændig type" + +#~ msgid "variable offset is passed partially in stack and in reg" +#~ msgstr "variabelafsæt bliver viderebragt delvis i stak og i register" + +#~ msgid "variable size is passed partially in stack and in reg" +#~ msgstr "variabelstørrelse bliver viderebragt delvis i stak og i register" + +#~ msgid "execvp %s" +#~ msgstr "execvp %s" + +#~ msgid "floating point numbers are not valid in #if" +#~ msgstr "kommatal er ikke tilladt i #if" + +#~ msgid "traditional C rejects the `U' suffix" +#~ msgstr "traditionel C forbyder 'U'-endelsen" + +#~ msgid "too many 'l' suffixes in integer constant" +#~ msgstr "for mange 'l'-endelser i heltalskonstant" + +#~ msgid "integer constant contains digits beyond the radix" +#~ msgstr "heltalskonstanten indeholder cifre der er større end grundtallet" + +#~ msgid "integer constant out of range" +#~ msgstr "heltalskonstanten er uden for det gyldige interval" + +#~ msgid "string constants are not valid in #if" +#~ msgstr "strengkonstanter er ikke tilladt i #if" + +#~ msgid "missing binary operator" +#~ msgstr "manglende binær operator" + +#~ msgid "changing search order for system directory \"%s\"" +#~ msgstr "skifter søgeorden for systemkataloget \"%s\"" + +#~ msgid " as it is the same as non-system directory \"%s\"" +#~ msgstr " da det er det samme som ikke-system-kataloget \"%s\"" + +#~ msgid " as it has already been specified as a non-system directory" +#~ msgstr " da det allerede er blevet angivet som et ikke-system-katalog" + +#~ msgid "I/O error on output" +#~ msgstr "I/O-fejl på uddata" + +#~ msgid "argument missing after %s" +#~ msgstr "en parameter mangler efter %s" + +#~ msgid "number missing after %s" +#~ msgstr "et tal mangler efter %s" + +#~ msgid "target missing after %s" +#~ msgstr "et mål mangler efter %s" + +#~ msgid "GNU CPP version %s (cpplib)" +#~ msgstr "GNU CPP version %s (cpplib)" + +#~ msgid "" +#~ " -pedantic Issue all warnings demanded by strict ISO C\n" +#~ " -pedantic-errors Issue -pedantic warnings as errors instead\n" +#~ " -trigraphs Support ISO C trigraphs\n" +#~ " -lang-c Assume that the input sources are in C\n" +#~ " -lang-c89 Assume that the input sources are in C89\n" +#~ msgstr "" +#~ " -pedantic Fremkom med alle advarsler påkrævet for nøje ISO C\n" +#~ " -pedantic-errors Behandl '-pedantic'-advarsler som fejl\n" +#~ " -traditional Iagttag opførsel som en K&R-præprocessor\n" +#~ " -trigraphs Understøt ANSI C-trigrafer\n" +#~ " -lang-c Antag at inddata er C\n" +#~ " -lang-c89 Antag at inddata er C89\n" + +#~ msgid "" +#~ " -lang-c++ Assume that the input sources are in C++\n" +#~ " -lang-objc Assume that the input sources are in ObjectiveC\n" +#~ " -lang-objc++ Assume that the input sources are in ObjectiveC++\n" +#~ " -lang-asm Assume that the input sources are in assembler\n" +#~ msgstr "" +#~ " -lang-c++ Antag at inddata er C++\n" +#~ " -lang-cobjc Antag at inddata er Objective C\n" +#~ " -lang-cobjc++ Antag at inddata er Objective C++\n" +#~ " -lang-asm Antag at inddata er maskinkode\n" + +#~ msgid "possible start of unterminated string literal" +#~ msgstr "muligvis begyndelsen af uafsluttet strengkonstant" + +#~ msgid "multi-line string literals are deprecated" +#~ msgstr "flerlinjers strengkonstanter er forældede" + +#~ msgid "the meaning of '\\%c' varies with -traditional" +#~ msgstr "betydningen af '\\%c' skifter med -traditional" + +#~ msgid "the meaning of '\\a' varies with -traditional" +#~ msgstr "betydningen af '\\a' skifter med -traditional" + +#~ msgid "the meaning of '\\x' varies with -traditional" +#~ msgstr "betydningen af '\\x' skifter med -traditional" + +#~ msgid "\"%s\" cannot be used as a macro name" +#~ msgstr "\"%s\" kan ikke bruges som et makronavn" + +#~ msgid "directives may not be used inside a macro argument" +#~ msgstr "direktiver må ikke optræde inden i en makroparameter" + +#~ msgid "invalid option %s" +#~ msgstr "ugyldigt tilvalg %s" + +#~ msgid "%s:%d: warning: " +#~ msgstr "%s:%d: advarsel: " + +#~ msgid "%s: warning: " +#~ msgstr "%s: advarsel: " + +#~ msgid "sorry, not implemented: " +#~ msgstr "desværre, ikke implementeret: " + +#~ msgid "Internal compiler error in %s, at %s:%d" +#~ msgstr "Intern oversætterfejl i %s ved %s:%d." + +#~ msgid "Copyright (C) 2002 Free Software Foundation, Inc.\n" +#~ msgstr "Copyright © 2002 Free Software Foundation, Inc.\n" + +#~ msgid "argument to `-b' is missing" +#~ msgstr "der mangler en parameter til '-b'" + +#~ msgid "argument to `-V' is missing" +#~ msgstr "der mangler en parameter til '-V'" + +#~ msgid "invalid version number format" +#~ msgstr "ugyldigt versionsnummerformat" + +#~ msgid ".da file contents exhausted too early\n" +#~ msgstr "indholdet af .da-filen er udtømt for tidligt\n" + +#~ msgid ".da file contents not exhausted\n" +#~ msgstr "indholdet af .da-filen ikke udtømt\n" + +#~ msgid "%6.2f%% of %d source lines executed in function %s\n" +#~ msgstr "%6.2f%% af %d kildekodelinjer udført i funktionen %s\n" + +#~ msgid "No executable source lines in function %s\n" +#~ msgstr "Ingen kørbare kildelinjer i funktionen %s\n" + +#~ msgid "%6.2f%% of %d branches executed in function %s\n" +#~ msgstr "%6.2f%% af %d forgreninger udført i funktionen %s\n" + +#~ msgid "%6.2f%% of %d branches taken at least once in function %s\n" +#~ msgstr "%6.2f%% af %d forgreninger valgt mindst én gang i funktionen %s\n" + +#~ msgid "No branches in function %s\n" +#~ msgstr "Ingen forgreninger i funktionen %s\n" + +#~ msgid "%6.2f%% of %d calls executed in function %s\n" +#~ msgstr "%6.2f%% af %d kald udført i funktionen %s\n" + +#~ msgid "No calls in function %s\n" +#~ msgstr "Ingen kald i funktionen %s\n" + +#~ msgid "%6.2f%% of %d source lines executed in file %s\n" +#~ msgstr "%6.2f%% af %d kildekodelinjer udført i filen %s\n" + +#~ msgid "%6.2f%% of %d branches executed in file %s\n" +#~ msgstr "%6.2f%% af %d forgreninger udført i filen %s\n" + +#~ msgid "%6.2f%% of %d branches taken at least once in file %s\n" +#~ msgstr "%6.2f%% af %d forgreninger valgt mindst én gang i filen %s\n" + +#~ msgid "%6.2f%% of %d calls executed in file %s\n" +#~ msgstr "%6.2f%% af %d kald udført i filen %s\n" + +#~ msgid "call %d returns = %s\n" +#~ msgstr "kald %d returnerer = %s\n" + +#~ msgid "call %d returns = %s%%\n" +#~ msgstr "kald %d returnerer = %s%%\n" + +#~ msgid "branch %d taken = %s\n" +#~ msgstr "forgrening %d valgt = %s\n" + +#~ msgid "branch %d taken = %s%%\n" +#~ msgstr "forgrening %d valgt = %s%%\n" + +#~ msgid ".da file contents exhausted too early" +#~ msgstr "indholdet af .da-filen er udtømt for tidligt" + +#~ msgid ".da file contents not exhausted" +#~ msgstr "indholdet af .da-filen ikke udtømt" + +#~ msgid "conversion from NaN to int" +#~ msgstr "konvertering fra NaN til int" + +#~ msgid "floating point overflow" +#~ msgstr "kommatalsoverløb" + +#~ msgid "overflow on truncation to integer" +#~ msgstr "overløb ved afkortelse til heltal" + +#~ msgid "overflow on truncation to unsigned integer" +#~ msgstr "overløb ved afkortelse til heltal uden fortegn" + +#~ msgid "%s: argument domain error" +#~ msgstr "%s: parameterdomænefejl" + +#~ msgid "%s: function singularity" +#~ msgstr "%s: funktionssingularitet" + +#~ msgid "%s: overflow range error" +#~ msgstr "%s: overløbsintervalfejl" + +#~ msgid "%s: underflow range error" +#~ msgstr "%s: underløbsintervalfejl" + +#~ msgid "%s: total loss of precision" +#~ msgstr "%s: samlet tab af præcision" + +#~ msgid "%s: partial loss of precision" +#~ msgstr "%s: delvist tab af præcision" + +#~ msgid "%s: NaN - producing operation" +#~ msgstr "%s: NaN - producerer operation" + +#~ msgid "Pretend that host and target use the same FP format" +#~ msgstr "Lad som om værten og målet bruger samme kommatalsformat" + +#~ msgid "Compile pointers as triples: value, base & end" +#~ msgstr "Oversæt henvisningsvariabler som tretupler: værdi, basis og slut" + +#~ msgid "Do not promote floats to double if using -traditional" +#~ msgstr "Forfrem ikke float til double hvis -traditional benyttes" + +#~ msgid "Attempt to support traditional K&R style C" +#~ msgstr "Forsøg at understøtte traditionel K&R C" + +#~ msgid "internal error: %s" +#~ msgstr "intern fejl: %s" + +#~ msgid "crossjump disabled: %d > 1000 basic blocks and %d >= 20 edges/basic block" +#~ msgstr "krydsspring deaktiveret: %d > 1000 basisblokke og %d >= 20 kanter/basisblok" + +#~ msgid " -a Enable block profiling \n" +#~ msgstr " -a Aktivér blokprofilering\n" + +#~ msgid " -ax Enable jump profiling \n" +#~ msgstr " -ax Aktivér springprofilering\n" + +#~ msgid "profiling does not work without a frame pointer" +#~ msgstr "profilering virker ikke uden en rammehenvisning" + +#~ msgid "floating point numbers not allowed in #if expressions" +#~ msgstr "kommatal er ikke tilladt i #if-udtryk" + +#~ msgid "invalid number in #if expression" +#~ msgstr "ugyldigt tal i #if-udtryk" + +#~ msgid "invalid character constant in #if" +#~ msgstr "ugyldig tegnkonstant i #if" + +#~ msgid "double quoted strings not allowed in #if expressions" +#~ msgstr "strenge med dobbelte anførselstegn er ikke tilladte i #if-udtryk" + +#~ msgid "invalid token in expression" +#~ msgstr "ugyldigt symbol udtryk" + +#~ msgid "octal character constant does not fit in a byte" +#~ msgstr "oktal tegnkonstant kan ikke være i en byte" + +#~ msgid "hex character constant does not fit in a byte" +#~ msgstr "hexadecimal tegnkonstant kan ikke være i en byte" + +#~ msgid "empty #if expression" +#~ msgstr "tomt #if-udtryk" + +#~ msgid "Junk after end of expression." +#~ msgstr "ragelse efter slutningen af udtryk" + +#~ msgid "macro or #include recursion too deep" +#~ msgstr "makro eller #include-rekursion er for dyb" + +#~ msgid "usage: %s [switches] input output" +#~ msgstr "brug: %s [tilvalg] inddata uddata" + +#~ msgid "-traditional is not supported in C++" +#~ msgstr "-traditional understøttes ikke i C++" + +#~ msgid "-traditional and -ansi are mutually exclusive" +#~ msgstr "-traditional og -ansi er indbyrdes uforenelige" + +#~ msgid "filename missing after -i option" +#~ msgstr "et filnavn mangler efter tilvalget -i" + +#~ msgid "filename missing after -o option" +#~ msgstr "et filnavn mangler efter tilvalget -o" + +#~ msgid "target missing after %s option" +#~ msgstr "et mål mangler efter tilvalget %s" + +#~ msgid "filename missing after %s option" +#~ msgstr "et filnavn mangler efter tilvalget %s" + +#~ msgid "macro name missing after -%c option" +#~ msgstr "et makronavn mangler efter tilvalget -%c" + +#~ msgid "-pedantic and -traditional are mutually exclusive" +#~ msgstr "-pedantic og -traditional er indbyrdes uforenelige" + +#~ msgid "-trigraphs and -traditional are mutually exclusive" +#~ msgstr "-trigraphs og -traditional er indbyrdes uforenelige" + +#~ msgid "directory name missing after -I option" +#~ msgstr "et katalognavn mangler efter '-I'-tilvalg" + +#~ msgid "`/*' within comment" +#~ msgstr "'/*' i en kommentar" + +#~ msgid "unterminated #%s conditional" +#~ msgstr "uafsluttet #%s-betingelse" + +#~ msgid "not in any file?!" +#~ msgstr "ikke i nogen fil?!" + +#~ msgid "`defined' must be followed by ident or (ident)" +#~ msgstr "'defined' skal efterfølges af et kaldenavn eller (kaldenavn)" + +#~ msgid "cccp error: invalid special hash type" +#~ msgstr "cccp-fejl: ugyldig speciel hash-type" + +#~ msgid "#include expects \"fname\" or " +#~ msgstr "#include forventer \"filnavn\" eller " + +#~ msgid "no include path in which to find %.*s" +#~ msgstr "der er ingen inkluderingssti at finde %.*s i" + +#~ msgid "invalid macro name" +#~ msgstr "ugyldigt makronavn" + +#~ msgid "invalid macro name `%s'" +#~ msgstr "ugyldigt makronavn '%s'" + +#~ msgid "parameter name starts with a digit in #define" +#~ msgstr "parameternavn begynder med et ciffer i #define" + +#~ msgid "badly punctuated parameter list in #define" +#~ msgstr "ugyldigt punktueret parameterliste i #define" + +#~ msgid "unterminated parameter list in #define" +#~ msgstr "uafsluttet parameterliste i #define" + +#~ msgid "\"%.*s\" redefined" +#~ msgstr "\"%.*s\" omdefineret" + +#~ msgid "# operator should be followed by a macro argument name" +#~ msgstr "operatoren # skal efterfølges af et makroparameternavn" + +#~ msgid "invalid format #line command" +#~ msgstr "ugyldigt formateret #line-kommando" + +#~ msgid "undefining `defined'" +#~ msgstr "glemmer definitionen af 'defined'" + +#~ msgid "undefining `%s'" +#~ msgstr "glemmer definitionen af '%s'" + +#~ msgid "extra text at end of directive" +#~ msgstr "ekstra tekst i slutningen af direktiv" + +#~ msgid "#error%.*s" +#~ msgstr "#error%.*s" + +#~ msgid "#warning%.*s" +#~ msgstr "#warning%.*s" + +#~ msgid "#elif not within a conditional" +#~ msgstr "#elif er ikke inde i betingelsessætning" + +#~ msgid "#%s not within a conditional" +#~ msgstr "#%s ikke inde i betingelsessætning" + +#~ msgid "#else or #elif after #else" +#~ msgstr "#else eller #elif efter #else" + +#~ msgid "#else not within a conditional" +#~ msgstr "#else er ikke inde i betingelsessætning" + +#~ msgid "unbalanced #endif" +#~ msgstr "uafbalanceret #endif" + +#~ msgid "unterminated string or character constant" +#~ msgstr "uafsluttet streng- eller tegnkonstant" + +#~ msgid "arguments given to macro `%s'" +#~ msgstr "parametre givet til makroen '%s'" + +#~ msgid "no args to macro `%s'" +#~ msgstr "ingen parametre givet til makroen '%s'" + +#~ msgid "only 1 arg to macro `%s'" +#~ msgstr "kun 1 parameter givet til makroen '%s'" + +#~ msgid "only %d args to macro `%s'" +#~ msgstr "kun %d parametre givet til makroen '%s'" + +#~ msgid "too many (%d) args to macro `%s'" +#~ msgstr "for mange (%d) parametre givet til makroen '%s'" + +#~ msgid "" +#~ "internal error in %s, at tradcpp.c:%d\n" +#~ "Please submit a full bug report.\n" +#~ "See %s for instructions." +#~ msgstr "" +#~ "intern fejl i '%s', ved tradcpp:%d\n" +#~ "Send venligst en komplet fejlrapport.\n" +#~ "Se %s for instruktioner." + +#~ msgid "optimization turned on" +#~ msgstr "optimeringer slået til" + +#~ msgid "optimization turned off" +#~ msgstr "optimeringer slået fra" + +#~ msgid "optimization level restored" +#~ msgstr "optimeringsniveau gendannet" + +#~ msgid "Use VAX-C alignment" +#~ msgstr "Brug VAX-C-justering" + +#~ msgid "invalid %%V value" +#~ msgstr "ugyldig %%V-værdi" + +#~ msgid "Generate code assuming DW bit is set" +#~ msgstr "Generér kode der antager at DW-bitten er sat" + +#~ msgid "Generate code assuming DW bit is not set" +#~ msgstr "Generér kode der antager at DW-bitten ikke er sat" + +#~ msgid "Generate code using byte writes" +#~ msgstr "Generér kode der bruger byte-skrivninger" + +#~ msgid "Do not generate byte writes" +#~ msgstr "Generér ikke byte-skrivninger" + +#~ msgid "Use small memory model" +#~ msgstr "Brug en lille hukommelsesmodel" + +#~ msgid "Use normal memory model" +#~ msgstr "Brug en normal hukommelsesmodel" + +#~ msgid "Use large memory model" +#~ msgstr "Brug en stor hukommelsesmodel" + +#~ msgid "Generate 29050 code" +#~ msgstr "Generér 29050-kode" + +#~ msgid "Generate 29000 code" +#~ msgstr "Generér 29000-kode" + +#~ msgid "Use kernel global registers" +#~ msgstr "Bruge kerneglobale registre" + +#~ msgid "Use user global registers" +#~ msgstr "Bruge brugerglobale registre" + +#~ msgid "Emit stack checking code" +#~ msgstr "Generér stakkontrolleringskode" + +#~ msgid "Do not emit stack checking code" +#~ msgstr "Generér ikke stakkontrolleringskode" + +#~ msgid "Work around storem hardware bug" +#~ msgstr "Arbejd rundt om storem-hardwarefejl" + +#~ msgid "Do not work around storem hardware bug" +#~ msgstr "Arbejd ikke rundt om storem-hardwarefejl" + +#~ msgid "Store locals in argument registers" +#~ msgstr "Gem lokale variable i parameterregistre" + +#~ msgid "Do not store locals in arg registers" +#~ msgstr "Gem ikke lokale variable i parameterregistre" + +#~ msgid "Do not generate multm instructions" +#~ msgstr "Generér ikke multm-instruktioner" + +#~ msgid "Do symbol renaming for BSD" +#~ msgstr "Foretag symbolomdøbning for BSD" + +#~ msgid "Do symbol renaming for X/OPEN" +#~ msgstr "Foretag symbolomdøbning for X/OPEN" + +#~ msgid "Don't do symbol renaming" +#~ msgstr "Foretag ikke symbolomdøbning" + +#~ msgid "MCU `%s' not supported" +#~ msgstr "MCU '%s' ikke understøttet" + +#~ msgid "Generate code for the C400" +#~ msgstr "Generér kode til en C400" + +#~ msgid "Generate code for the C300" +#~ msgstr "Generér kode til en C300" + +#~ msgid "Generate code for c1" +#~ msgstr "Generér kode til en c1" + +#~ msgid "Generate code for c2" +#~ msgstr "Generér kode til en c2" + +#~ msgid "Generate code for c32" +#~ msgstr "Generér kode til en c32" + +#~ msgid "Generate code for c34" +#~ msgstr "Generér kode til en c34" + +#~ msgid "Use standard calling sequence, with arg count word" +#~ msgstr "Benyt standardkaldesekvens, med parameterantalsord" + +#~ msgid "Place arg count in a nop instruction (faster than push)" +#~ msgstr "Anbring parameterantal i en nop-instruktion (hurtigere end push)" + +#~ msgid "Don't push arg count, depend on symbol table" +#~ msgstr "Videresend ikke parameterantal, afhæng af symboltabel" + +#~ msgid "Use data cache for volatile mem refs (default)" +#~ msgstr "Benyt datamellemlager for volatile hukommelsesreferencer (standard)" + +#~ msgid "Don't use data cache for volatile mem refs" +#~ msgstr "Benyt ikke datamellemlager for volatile hukommelsesreferencer" + +#~ msgid "Bypass data cache for volatile mem refs" +#~ msgstr "Forbigå datamellemlager for volatile hukommelsesreferencer" + +#~ msgid "Use 64-bit longs" +#~ msgstr "Benyt 64 bit-long" + +#~ msgid "Use cc- and libc-compatible 32-bit longs" +#~ msgstr "Benyt cc- og libc-kompatibel 32 bit-long" + +#~ msgid "inline float constants not supported on this host" +#~ msgstr "integrerede kommatalskonstanter er ikke understøttede på denne vært" + +#~ msgid "Generate code the unix assembler can handle" +#~ msgstr "Generér kode som Unix-maskinkodeoversætteren kan håndtere" + +#~ msgid "Generate code an embedded assembler can handle" +#~ msgstr "Generér kode som en indlejret maskinkodeoversætter kan håndtere" + +#~ msgid "Retain standard MXDB information" +#~ msgstr "Bevar standard-MXDB-info" + +#~ msgid "Retain legend information" +#~ msgstr "Bevar indholdsinfo" + +#~ msgid "Generate external legend information" +#~ msgstr "Generér ekstern indholdsinfo" + +#~ msgid "Emit identifying info in .s file" +#~ msgstr "Udsend identificerende info i .s-fil" + +#~ msgid "Warn when a function arg is a structure" +#~ msgstr "Advar når en funktionsparameter er en struktur" + +#~ msgid "argument is a structure" +#~ msgstr "parameter er en struktur" + +#~ msgid "half-pic init called on systems that don't support it" +#~ msgstr "half-PIC-klargøring kaldt på systemer der ikke understøtter det" + +#~ msgid "Profiling uses mcount" +#~ msgstr "Profilering benytter mcount" + +#~ msgid "Emit half-PIC code" +#~ msgstr "Udsend half-PIC-kode" + +#~ msgid "Emit ELF object code" +#~ msgstr "Udsend ELF-objektkode" + +#~ msgid "Emit ROSE object code" +#~ msgstr "Udsend ROSE-objektkode" + +#~ msgid "Symbols have a leading underscore" +#~ msgstr "Symboler har en indledende understreg" + +#~ msgid "Align to >word boundaries" +#~ msgstr "Justér til >word-grænserne" + +#~ msgid "Use mcount for profiling" +#~ msgstr "Benyt mcount til profilering" + +#~ msgid "Use mcount_ptr for profiling" +#~ msgstr "Benyt mcount_ptr til profilering" + +#~ msgid "Generate code which uses the FPU" +#~ msgstr "Generér kode som bruger FPU'en" + +#~ msgid "Do not generate code which uses the FPU" +#~ msgstr "Generér ikke kode som bruger FPU'en" + +#~ msgid "the -mlong-double-64 option does not work yet" +#~ msgstr "tilvalget -mlong-double-64 virker ikke endnu" + +#~ msgid "The -march option is incompatible to -mipsN and therefore ignored." +#~ msgstr "Tilvalget -march er uforeneligt med -mipsN og derfor ignoreret." + +#~ msgid "-mips%d not supported" +#~ msgstr "-mips%d er ikke understøttet" + +#~ msgid "-mabi=%s does not support -mips%d" +#~ msgstr "-mabi=%s understøtter ikke -mips%d" + +#~ msgid "this target does not support the -mabi switch" +#~ msgstr "denne målarkitektur understøtter ikke tilvalget -mabi" + +#~ msgid "bad value (%s) for -mtune= switch" +#~ msgstr "ugyldig værdi (%s) til tilvalget -mcpu=" + +#~ msgid "-mips%d does not support 64 bit fp registers" +#~ msgstr "-mips%d understøtter ikke 64-bit kommatalsregistre" + +#~ msgid "-mips%d does not support 64 bit gp registers" +#~ msgstr "-mips%d understøtter ikke 64-bit almene registre" + +#~ msgid "Use OSF PIC" +#~ msgstr "Benyt OSF PIC" + +#~ msgid "Don't use OSF PIC" +#~ msgstr "Benyt ikke OSF PIC" + +#~ msgid "Optimize for 3900" +#~ msgstr "Optimér for 3900" + +#~ msgid "Optimize for 4650" +#~ msgstr "Optimér for 4650" + +#~ msgid "stack frame too big" +#~ msgstr "stakramme for stor" + +#~ msgid "neither varargs or stdarg in mmix_setup_incoming_varargs" +#~ msgstr "hverken variable parametre eller standardparametre mmix_setup_incoming_varargs" + +#~ msgid "oops, not debugged; fixing up value:" +#~ msgstr "ups, ikke fejlanalyseret; retter værdi:" + +#~ msgid "Generate little endian data" +#~ msgstr "Generér lilleendet data" + +#~ msgid "Generate big endian data" +#~ msgstr "Generér storendet data" + +#~ msgid "Turn on maintainer testing code" +#~ msgstr "Aktivér vedligeholdertestkode" + +#~ msgid "Enable Transmeta picoJava extensions" +#~ msgstr "Aktivér Transmeta picoJava-udvidelser" + +#~ msgid "Disable Transmeta picoJava extensions" +#~ msgstr "Deaktivér Transmeta picoJava-udvidelser" + +#~ msgid "Disable reorganization pass" +#~ msgstr "Deaktivér omorganiseringsfase" + +#~ msgid "-f%s ignored (all code is position independent)" +#~ msgstr "-f%s ignoreret (al kode er positionsuafhængigt)" + +#~ msgid "-ffunction-sections disabled on AIX when debugging" +#~ msgstr "-ffunction-sections deaktiveret på AIX ved fejlanalysering" + +#~ msgid "-fdata-sections not supported on AIX" +#~ msgstr "-fdata-sections er ikke understøttet på AIX" + +#~ msgid "argument 3 of `%s' must be a 2-bit literal" +#~ msgstr "parameter til '%s' skal være en 2 bit-konstant" + +#~ msgid "%%S computed all 1's mask" +#~ msgstr "%%S beregnede alle 1'eres maske" + +#~ msgid "%%S computed all 0's mask" +#~ msgstr "%%S beregnede alle 0's maske" + +#~ msgid "no viable candidates" +#~ msgstr "ingen mulige kandidater" + +#~ msgid "cannot pass objects of non-POD type `%#T' through `...'" +#~ msgstr "kan ikke videregive objekter af en ikke-POD type '%#T' gennem '...'" + +#~ msgid "`%D' has already been declared in `%T'" +#~ msgstr "'%D' er allerede blevet erklæret i '%T'" + +#~ msgid "typedef `%D' is initialized" +#~ msgstr "typedef '%D' bliver tildelt en startværdi" + +#~ msgid "`%D' as declarator" +#~ msgstr "'%D' som erklærer" + +#~ msgid "size of member `%D' is not constant" +#~ msgstr "størrelsen af medlemmet '%D' er ikke konstant" + +#~ msgid "cannot declare %s to references" +#~ msgstr "kan ikke erklære %s til referencer" + +#~ msgid "invalid type: `void &'" +#~ msgstr "ugyldig type: 'void &'" + +#~ msgid "typedef declaration includes an initializer" +#~ msgstr "typedef-erklæringen indeholder en startværdi" + +#~ msgid "-fname-mangling-version is no longer supported" +#~ msgstr "-fname-mangling-version understøttes ikke længere" + +#~ msgid "candidate%s: %+#D" +#~ msgstr "candidate%s: %+#D" + +#~ msgid " %#D" +#~ msgstr " %#D" + +#~ msgid "member initializers for `%#D'" +#~ msgstr "medlemsstartværdier for '%#D'" + +#~ msgid " will be re-ordered to match declaration order" +#~ msgstr " vil blive omordnet for at passe til erklæringsordenen" + +#~ msgid "multiple initializations given for member `%D'" +#~ msgstr "flere startværdier angivet for medlemmet '%D'" + +#~ msgid "base initializers for `%#T'" +#~ msgstr "stamklasseklargøring for '%#T'" + +#~ msgid " will be re-ordered to match inheritance order" +#~ msgstr " vil blive omordnet for at passe til nedarvningsordenen" + +#~ msgid "base class `%T' already initialized" +#~ msgstr "stamklassen '%T' er allerede klargjort" + +#~ msgid "implementation-reserved name `%D' used" +#~ msgstr "implementationsreserveret navn '%D' benyttet" + +#~ msgid "explicit instantiation of `%#D' after" +#~ msgstr "eksplicit instantiering af '%#D' efter" + +#~ msgid "explicit specialization here" +#~ msgstr "eksplicit specialisering her" + +#~ msgid "explicit instantiation of `%#T' after" +#~ msgstr "eksplicit instantiering af '%#T' efter" + +#~ msgid "base initializer for `%T'" +#~ msgstr "stamklasseklargøring for '%T'" + +#~ msgid " will be re-ordered to precede member initializations" +#~ msgstr " vil blive omordnet for at komme før medlemsklargøringer" + +#~ msgid "ignoring `%V' qualifiers on `%T'" +#~ msgstr "ignorerer modifikationerne '%V' til '%T'" + +#~ msgid "ISO C++ forbids applying `sizeof' to a function type" +#~ msgstr "ISO C++ forbyder anvendelse af 'sizeof' på en funktionstype" + +#~ msgid "ISO C++ forbids applying `sizeof' to a member function" +#~ msgstr "ISO C++ forbyder anvendelse af 'sizeof' på en medlemsfunktion" + +#~ msgid "ISO C++ forbids applying `sizeof' to type `void' which is an incomplete type" +#~ msgstr "ISO C++ forbyder anvendelse af 'sizeof' på typen 'void' som er en ufuldstændig type" + +#~ msgid "`sizeof' applied to non-static member" +#~ msgstr "'sizeof' benyttet på et ikke-statisk medlem" + +#~ msgid "`sizeof' applied to incomplete type `%T'" +#~ msgstr "'sizeof' benyttet på en ufuldstændig type '%T'" + +#~ msgid "request for member `%T::%D' in expression of non-aggregate type `%T'" +#~ msgstr "forespørgsel for medlemmet '%T::%D' i udtryk med den ikke-sammensatte type '%T'" + +#~ msgid "invalid use of type decl `%#D' as expression" +#~ msgstr "ugyldig brug af typeerklæring '%#D' som udtryk" + +#~ msgid "invalid use of template `%#D' as expression" +#~ msgstr "ugyldig brug af skabelon '%#D' som udtryk" + +#~ msgid "invalid offsetof from non-POD type `%#T'; use pointer to member instead" +#~ msgstr "ugyldig offsetof fra ikke-POD type '%#T'; benyt henvisning til medlem i stedet" + +#~ msgid "pointer to member function called, but not in class scope" +#~ msgstr "henvisning til medlem-funktion kaldt, men ikke i klassevirkefelt" + +#~ msgid "object missing in call to method `%D'" +#~ msgstr "objekt mangler i kald til metoden '%D'" + +#~ msgid "function `%D' declared overloaded, but no definitions appear with which to resolve it?!?" +#~ msgstr "funktionen '%D' erklæret flertydigt, men ingen definition optræder til at passe den sammen med?!?" + +#~ msgid "invalid call to member function needing `this' in static member function scope" +#~ msgstr "ugyldigt kald af medlemsfunktion som har brug for 'this', i et statisk medlemsfunktionsvirkefelt" + +#~ msgid "unary `&'" +#~ msgstr "unær '&'" + +#~ msgid "invalid use of undefined type `%#T'" +#~ msgstr "ugyldig brug af en ikke-defineret type '%#T'" + +#~ msgid "forward declaration of `%#T'" +#~ msgstr "forhåndserklæring af '%#T'" + +#~ msgid "invalid use of `%T'" +#~ msgstr "ugyldig brug af '%T'" + +#~ msgid "invalid use of member (did you forget the `&' ?)" +#~ msgstr "ugyldig brug af medlem (glemte du en '&'?)" + +#~ msgid "invalid use of template type parameter" +#~ msgstr "ugyldig brug af skabelonstypeparameter" + +#~ msgid "address of overloaded function with no contextual type information" +#~ msgstr "adresse af flertydig funktion uden kontekstuelle typeoplysninger" + +#~ msgid "overloaded function with no contextual type information" +#~ msgstr "flertydig funktion uden kontekstuelle typeoplysninger" + +#~ msgid "insufficient contextual information to determine type" +#~ msgstr "utilstrækkelige kontekstuelle oplysninger til at afgøre typen" + +#~ msgid "initializer list construction invalid for derived class object `%D'" +#~ msgstr "klargøringslistekonstruktion er ugyldig for nedarvet klasseobjekt '%D'" + +#~ msgid "initializer list construction invalid for polymorphic class object `%D'" +#~ msgstr "klargøringslistekonstruktion er ugyldig for polymorfisk klasseobjekt '%D'" + +#~ msgid "initializer list construction invalid for `%D'" +#~ msgstr "klargøringslistekonstruktion er ugyldig for '%D'" + +#~ msgid "due to the presence of a constructor" +#~ msgstr "pga. af tilstedeværelsen af en konstruktionsfunktion" + +#~ msgid "due to non-public access of member `%D'" +#~ msgstr "pga. ikke-public tilgang af medlemmet '%D'" + +#~ msgid "ISO C++ forbids non-constant aggregate initializer expressions" +#~ msgstr "ISO C++ forbyder ikke-konstante startværdiudtryk for sammensatte typer" + +#~ msgid "The meaning of `\\x' (at %0) varies with -traditional" +#~ msgstr "Betydningen af '\\x' (ved %0) skifter med -traditional" + +#~ msgid "The meaning of `\\a' (at %0) varies with -traditional" +#~ msgstr "Betydningen af '\\a' (ved %0) skifter med -traditional" + +#~ msgid "the meaning of `\\x' varies with -traditional" +#~ msgstr "betydningen af '\\x' skifter med -traditional" + +#~ msgid "the meaning of `\\a' varies with -traditional" +#~ msgstr "betydningen af '\\a' skifter med -traditional" + +#~ msgid "parse error; also virtual memory exceeded" +#~ msgstr "tolkningsfejl; desuden løbet tør for virtuel hukommelse" + +#~ msgid "Can't specify array dimension in a declaration" +#~ msgstr "Kan ikke angive tabeldimension i en erklæring" + +#~ msgid "internal error - use of undefined type" +#~ msgstr "intern fejl - brug af ikke-defineret type" + +#~ msgid "no class name specified as argument to -fconstant-string-class" +#~ msgstr "intet klassenavn angivet som parameter til -fconstant-string-class" + +#~ msgid "-p profiling is no longer supported. Use -pg instead" +#~ msgstr "profilgenerering med -p understøttes ikke længere; benyt -pg i stedet for" + +#~ msgid "incompatible interworking options" +#~ msgstr "uforenelige samvirkende tilvalg" + +#~ msgid "options -mabi=mmixware and -mabi=gnu are mutually exclusive" +#~ msgstr "-mabi=mmixware og -mabi=gnu er indbyrdes uforenelige" + +#~ msgid "-p option not supported: use -pg instead" +#~ msgstr "tilvalget -p understøttes ikke; benyt -pg i stedet" + +#~ msgid "-mbsd and -pedantic incompatible" +#~ msgstr "-mbsd og -pedantic er indbyrdes uforenelige" + +#~ msgid "-mbsd and -mxopen incompatible" +#~ msgstr "-mbsd og -mxopen er indbyrdes uforenelige" + +#~ msgid "-mxopen and -pedantic incompatible" +#~ msgstr "-mxopen og -pedantic er indbyrdes uforenelige" + +#~ msgid "may not use both -mfp64 and -msingle-float" +#~ msgstr "-mfp64 og -msingle-float er indbyrdes uforenelige" + +#~ msgid "may not use both -mfp64 and -m4650" +#~ msgstr "-mfp64 og -m4650 er indbyrdes uforenelige" + +#~ msgid "may not use both -mgp32 and -mfp64" +#~ msgstr "-mgp32 og -mfp64 er indbyrdes uforenelige" + +#~ msgid "Only initialized variables can be placed into program memory area." +#~ msgstr "Kun variabler med startværdi kan placeres i programhukommelsesområdet." + +#~ msgid "declaration of `%#T'" +#~ msgstr "erklæring af '%#T'" + +#~ msgid "a -ifile option requires a -map option" +#~ msgstr "et '-ifile'-tilvalg kræver et '-map'-tilvalg" + +#~ msgid "%s before character constant" +#~ msgstr "%s før tegnkonstant" + +#~ msgid "%s before character 0%o" +#~ msgstr "%s før tegn 0%o" + +#~ msgid "invalid identifier `%s'" +#~ msgstr "ugyldigt kaldenavn '%s'" + +#~ msgid "parse error at `..'" +#~ msgstr "tolkningsfejl ved '..'" + +#~ msgid "nondigits in number and not hexadecimal" +#~ msgstr "tegn der ikke er cifre, optræder i tal" + +#~ msgid "two `u's in integer constant" +#~ msgstr "to 'u'-endelser i heltalskonstant" + +#~ msgid "`[*]' in parameter declaration only allowed in ISO C 99" +#~ msgstr "'[*]' i parametererklæring kun tilladt i ISO C 99" + +#~ msgid "invalid `for (ITERATOR)' syntax" +#~ msgstr "ugyldigt 'for (LØKKEVARIABEL)'-syntaks" + +#~ msgid "`for (%s)' inside expansion of same iterator" +#~ msgstr "'for (%s)' inden i udfoldning af samme løkkevariabel" + +#~ msgid "case label within scope of cleanup or variable array" +#~ msgstr "case-etiket i oprydningsområde eller i en variabel tabel" + +#~ msgid "wrong type argument to %s" +#~ msgstr "forkert parametertype til %s" + +#~ msgid "invalid lvalue in increment" +#~ msgstr "ugyldig venstreværdi i forøgelse" + +#~ msgid "invalid lvalue in decrement" +#~ msgstr "ugyldig venstreværdi i formindskelse" + +#~ msgid "increment" +#~ msgstr "forøgelse" + +#~ msgid "decrement" +#~ msgstr "formindskelse" + +#~ msgid "duplicate array index in initializer" +#~ msgstr "tabelindeks i startværdi optræder mere end én gang" + +#~ msgid "thumb_load_double_from_address: destination is not a register" +#~ msgstr "thumb_load_double_from_adress: destination er ikke et register" + +#~ msgid "thumb_load_double_from_address: source is not a computed memory address" +#~ msgstr "thumb_load_double_from_adress: kilden er ikke en beregnet hukommelsesadresse" + +#~ msgid "thumb_load_double_from_address: Unhandled address calculation" +#~ msgstr "thumb_load_double_from_adress: adresseberegningen er ikke håndteret" + +#~ msgid "ACCUM_HIGH_REGS class in limit_reload_class" +#~ msgstr "ACCUM_HIGH_REGS-klasse i limit_reload_class" + +#~ msgid "YH_OR_ACCUM_HIGH_REGS found in limit_reload_class" +#~ msgstr "YH_OR_ACCUM_HIGH_REGS fundet i limit_reload_class" + +#~ msgid "YL found in limit_reload_class" +#~ msgstr "YL fundet i limit_reload_class" + +#~ msgid "Invalid register for compare" +#~ msgstr "Ugyldigt register til sammenligningen" + +#~ msgid "Internal gcc abort from %s:%d" +#~ msgstr "Intern GCC-afbrydelse fra %s:%d" + +#~ msgid "Register '%c' already specified in allocation order" +#~ msgstr "Registret '%c' er allerede angivet i tildelingsordenen" + +#~ msgid "Same as -mcpu=i386" +#~ msgstr "Magen til -mcpu=i386" + +#~ msgid "Same as -mcpu=i486" +#~ msgstr "Magen til -mcpu=i486" + +#~ msgid "Same as -mcpu=pentium" +#~ msgstr "Magen til -mcpu=pentium" + +#~ msgid "Same as -mcpu=pentiumpro" +#~ msgstr "Magen til -mcpu=pentiumpro" + +#~ msgid "Emit Intel syntax assembler opcodes" +#~ msgstr "Konstruér instruktionerne til maskinkodeoversætteren med Intel-syntaks" + +#~ msgid "invalid %H value" +#~ msgstr "ugyldig %H-værdi" + +#~ msgid "invalid %h value" +#~ msgstr "ugyldig %h-værdi" + +#~ msgid "invalid %Q value" +#~ msgstr "ugyldig %Q-værdi" + +#~ msgid "invalid %q value" +#~ msgstr "ugyldig %q-værdi" + +#~ msgid "invalid %p value" +#~ msgstr "ugyldig %p-værdi" + +#~ msgid "invalid %B value" +#~ msgstr "ugyldig %B-værdi" + +#~ msgid "invalid %C value" +#~ msgstr "ugyldig %C-værdi" + +#~ msgid "invalid %E value" +#~ msgstr "ugyldig %E-værdi" + +#~ msgid "invalid %r value" +#~ msgstr "ugyldig %r-værdi" + +#~ msgid "-mcpu=%s does not support -mips%d" +#~ msgstr "-mcpu=%s understøtter ikke -mips%d" + +#~ msgid "PRINT_OPERAND: letter %c was found & insn was not CONST_INT" +#~ msgstr "PRINT_OPERAND: bogstavet %c blev fundet og instruktionen var ikke CONST_INT" + +#~ msgid "-mptr%d not allowed on -m%d" +#~ msgstr "-mptr%d er ikke tilladt på -m%d" + +#~ msgid "parse errors have confused me too much" +#~ msgstr "tolkningsfejl er blevet for forvirrende" + +#~ msgid "virtual memory exhausted" +#~ msgstr "løbet tør for virtuel hukommelse" + +#~ msgid "the new ABI requires vtable thunks" +#~ msgstr "den nye binære grænseflade kræver virtuel tabel-afdelinger" + +#~ msgid "`void' in parameter list must be entire list" +#~ msgstr "'void' i en parameterliste skal udgøre hele listen" + +#~ msgid "no file specified with -fdump-translation-unit" +#~ msgstr "ingen filer angivet med -fdump-translation-unit" + +#~ msgid "`__alignof__' applied to a bit-field" +#~ msgstr "'__alignof__' brugt på et bitfelt" + +#~ msgid "(you really want to initialize it separately)" +#~ msgstr "(klargør den separat)" + +#~ msgid "`operator new' takes type `size_t' parameter" +#~ msgstr "'operator new' skal have en parameter af typen 'size_t'" + +#~ msgid "`...' invalid in specification of `operator delete'" +#~ msgstr "'...' er ugyldigt i angivelsen af 'operator delete'" + +#~ msgid "`default' label within scope of cleanup or variable array" +#~ msgstr "'default'-etiket i oprydningsområde eller i en variabel tabel" + +#~ msgid "initializer for unnamed base class ambiguous" +#~ msgstr "klargøring af unavngiven stamklasse er flertydig" + +#~ msgid "invalid #pragma vtable" +#~ msgstr "ugyldig #pragma vtable" + +#~ msgid "%s at end of saved text" +#~ msgstr "%s ved slutningen af den gemte tekst" + +#~ msgid "complex integer constant is too wide for `__complex int'" +#~ msgstr "kompleks heltalskonstant er for bred til '__complex int'" + +#~ msgid "ambiguous request for method pointer `%s'" +#~ msgstr "flertydig forespørgsel efter medlemsfunktionshenvisningen '%s'" + +#~ msgid "taking dynamic typeid of object with -fno-rtti" +#~ msgstr "forsøg på at finde den dynamiske typeid af et objekt med -fno-rtti" + +#~ msgid "`com_interface' only supported with -fvtable-thunks" +#~ msgstr "'com_interface' understøttes kun med -fvtable-thunks" + +#~ msgid "invalid reference to NULL ptr, use ptr-to-member instead" +#~ msgstr "ugyldig reference til NULL-henvisning, benyt en henvisning til medlem i stedet" + +#~ msgid "Please submit a full bug report." +#~ msgstr "Send venligst en komplet fejlrapport." + +#~ msgid "duplicate label `%s' in switch statement" +#~ msgstr "mere end én '%s'-etiket i switch-sætningen" + +#~ msgid "duplicate label (%d) in switch statement" +#~ msgstr "mere end én etiket (%d) i switch-sætningen" + +#~ msgid "range values `%s' and `%s' reversed" +#~ msgstr "intervalværdierne '%s' og '%s' vender omvendt" + +#~ msgid "range values reversed" +#~ msgstr "intervalværdierne vender omvendt" + +#~ msgid "Can't create cross-reference file `%s'" +#~ msgstr "Kan ikke oprette krydsreferencefilen '%s'" + +#~ msgid "bad is_error(%d) in v_message" +#~ msgstr "ugyldig is_error(%d) i v_message" + +#~ msgid "'defined' without an identifier" +#~ msgstr "'defined' optræder uden et kaldenavn" + +#~ msgid "`##' at start of macro definition" +#~ msgstr "'##' i begyndelsen af makrodefinitionen" + +#~ msgid "empty object-like macro went through full #define" +#~ msgstr "en tom objektlignende makro gik gennem komplet #define" + +#~ msgid "first token = %d not %d in collect_formal_parameters" +#~ msgstr "første symbol = %d er ikke %d i collect_formal_parameters" + +#~ msgid "impossible token in macro argument list" +#~ msgstr "umuligt symbol i makroparameterlisten" + +#~ msgid "illegal token in macro argument list" +#~ msgstr "ugyldigt symbol i makroparameterlisten" + +#~ msgid "another parameter follows \"...\"" +#~ msgstr "der optræder en parameter mere efter \"...\"" + +#~ msgid "collect_params: argc=%d argslen=0" +#~ msgstr "collect_params: argc=%d argslen=0" + +#~ msgid "C99 does not permit use of __VA_ARGS__ as a macro argument name" +#~ msgstr "C99 tillader ikke brug af __VA_ARGS__ som makroparameternavn" + +#~ msgid "C89 does not permit varargs macros" +#~ msgstr "C89 tillader ikke variabel parameterliste-makroer" + +#~ msgid "collect_params: impossible token type %d" +#~ msgstr "collect_params: umulig symboltype %d" + +#~ msgid "attempt to use poisoned `%s'." +#~ msgstr "forsøg på at bruge forgiftet '%s'" + +#~ msgid "macroexpand: unexpected token %d (wanted LPAREN)" +#~ msgstr "macroexpand: forventede ikke symbol %d (skulle have været LPAREN)" + +#~ msgid "unterminated macro call" +#~ msgstr "uafsluttet makrokald" + +#~ msgid "macro `%s' used with just one arg" +#~ msgstr "makroen '%s' kaldt med kun én parameter" + +#~ msgid "macro `%s' used with only %d args" +#~ msgstr "makroen '%s' kaldt med kun %d parametre" + +#~ msgid "macro `%s' used with too many (%d) args" +#~ msgstr "makroen '%s' kaldt med for mange (%d) parametre" + +#~ msgid "buffers still stacked in cpp_finish" +#~ msgstr "mellemlagre er stadig stakket op i cpp_finish" + +#~ msgid "" +#~ "Switches:\n" +#~ " -include Include the contents of before other files\n" +#~ " -imacros Accept definition of macros in \n" +#~ " -iprefix Specify as a prefix for next two options\n" +#~ " -iwithprefix Add to the end of the system include path\n" +#~ " -iwithprefixbefore Add to the end of the main include path\n" +#~ " -isystem Add to the start of the system include path\n" +#~ " -idirafter Add to the end of the system include path\n" +#~ " -I Add to the end of the main include path\n" +#~ " -I- Fine-grained include path control; see info docs\n" +#~ " -nostdinc Do not search system include directories\n" +#~ " (dirs specified with -isystem will still be used)\n" +#~ " -nostdinc++ Do not search system include directories for C++\n" +#~ " -o Put output into \n" +#~ " -pedantic Issue all warnings demanded by strict ANSI C\n" +#~ " -pedantic-errors Issue -pedantic warnings as errors instead\n" +#~ " -traditional Follow K&R pre-processor behaviour\n" +#~ " -trigraphs Support ANSI C trigraphs\n" +#~ " -lang-c Assume that the input sources are in C\n" +#~ " -lang-c89 Assume that the input sources are in C89\n" +#~ " -lang-c++ Assume that the input sources are in C++\n" +#~ " -lang-objc Assume that the input sources are in ObjectiveC\n" +#~ " -lang-objc++ Assume that the input sources are in ObjectiveC++\n" +#~ " -lang-asm Assume that the input sources are in assembler\n" +#~ " -lang-fortran\t\t Assume that the input sources are in Fortran\n" +#~ " -lang-chill Assume that the input sources are in Chill\n" +#~ " -std= Specify the conformance standard; one of:\n" +#~ " gnu89, gnu99, c89, c99, iso9899:1990,\n" +#~ " iso9899:199409, iso9899:1999\n" +#~ " -+ Allow parsing of C++ style features\n" +#~ " -w Inhibit warning messages\n" +#~ " -Wtrigraphs Warn if trigraphs are encountered\n" +#~ " -Wno-trigraphs Do not warn about trigraphs\n" +#~ " -Wcomment{s} Warn if one comment starts inside another\n" +#~ " -Wno-comment{s} Do not warn about comments\n" +#~ " -Wtraditional Warn if a macro argument is/would be turned into\n" +#~ " a string if -traditional is specified\n" +#~ " -Wno-traditional Do not warn about stringification\n" +#~ " -Wundef Warn if an undefined macro is used by #if\n" +#~ " -Wno-undef Do not warn about testing undefined macros\n" +#~ " -Wimport Warn about the use of the #import directive\n" +#~ " -Wno-import Do not warn about the use of #import\n" +#~ " -Werror Treat all warnings as errors\n" +#~ " -Wno-error Do not treat warnings as errors\n" +#~ " -Wall Enable all preprocessor warnings\n" +#~ " -M Generate make dependencies\n" +#~ " -MM As -M, but ignore system header files\n" +#~ " -MD As -M, but put output in a .d file\n" +#~ " -MMD As -MD, but ignore system header files\n" +#~ " -MG Treat missing header file as generated files\n" +#~ " -g3 Include #define and #undef directives in the output\n" +#~ " -D Define a with string '1' as its value\n" +#~ " -D= Define a with as its value\n" +#~ " -A () Assert the to \n" +#~ " -A- () Disable the to \n" +#~ " -U Undefine \n" +#~ " -v Display the version number\n" +#~ " -H Print the name of header files as they are used\n" +#~ " -C Do not discard comments\n" +#~ " -dM Display a list of macro definitions active at end\n" +#~ " -dD Preserve macro definitions in output\n" +#~ " -dN As -dD except that only the names are preserved\n" +#~ " -dI Include #include directives in the output\n" +#~ " -ftabstop= Distance between tab stops for column reporting\n" +#~ " -P Do not generate #line directives\n" +#~ " -$ Do not allow '$' in identifiers\n" +#~ " -remap Remap file names when including files.\n" +#~ " --version Display version information\n" +#~ " -h or --help Display this information\n" +#~ msgstr "" +#~ "Tilvalg:\n" +#~ " -include Inkludér indholdet af før andre filer\n" +#~ " -imacros Læs makrodefinitionerne i \n" +#~ " -iprefix Angiv som et præfiks til de næste to tilvalg\n" +#~ " -iwithprefix Føj til slutningen af systeminkluderingsstien\n" +#~ " -withprefixbefore Føj til slutningen af den alm. inkluderingssti\n" +#~ " -isystem Føj til begyndelsen af systeminkluderingsstien\n" +#~ " -idirafter Føj til slutningen af systeminkluderingsstien\n" +#~ " -I Føj til slutningen af den alm. inkluderingssti\n" +#~ " -I- Nøje kontrolleret inkluderingssti; se info-hjælpen\n" +#~ " -nostdinc Søg ikke i systeminkluderingskataloger\n" +#~ " (kataloger angivet med -isystem søges dog stadig)\n" +#~ " -nostdinc++ Søg ikke i systeminkluderingskataloger til C++\n" +#~ " -o Send uddata til \n" +#~ " -pedantic Fremkom med alle advarsler påkrævet for nøje ISO C\n" +#~ " -pedantic-errors Behandl '-pedantic'-advarsler som fejl\n" +#~ " -traditional Iagttag opførsel som en K&R-præprocessor\n" +#~ " -trigraphs Understøt ANSI C-trigrafer\n" +#~ " -lang-c Antag at inddata er C\n" +#~ " -lang-c89 Antag at inddata er C89\n" +#~ " -lang-c++ Antag at inddata er C++\n" +#~ " -lang-cobjc Antag at inddata er Objective C\n" +#~ " -lang-cobjc++ Antag at inddata er Objective C++\n" +#~ " -lang-asm Antag at inddata er maskinkode\n" +#~ " -lang-fortran Antag at inddata er Fortran\n" +#~ " -lang-chill Antag at inddata er Chill\n" +#~ " -std= Angiv at koden retter sig efter en af standarderne:\n" +#~ " gnu89, gnu99, c89, c99, iso9899:1990,\n" +#~ " iso9899:199409, iso9899:1999\n" +#~ " -+ Tillad fortolkning af faciliteter i C++-stil\n" +#~ " -w Blokér advarselsmeddelelser\n" +#~ " -Wtrigraphs Advar hvis der optræder trigrafer\n" +#~ " -Wno-trigraphs Advar ikke om trigrafer\n" +#~ " -Wcomment{s} Advar hvis en kommentar begynder inden i en anden\n" +#~ " -Wno-comment{s} Advar ikke om kommentarer\n" +#~ " -Wtraditional Advar hvis en makroparameter vil blive gjort til en\n" +#~ " streng med -traditional\n" +#~ " -Wno-traditional Advar ikke om omdannelse til streng\n" +#~ " -Wundef Advar hvis en ikkedefineret makro bruges med #if\n" +#~ " -Wno-undef Advar ikke om test på makroer der ikke er definerede\n" +#~ " -Wimport Advar om brug af #import\n" +#~ " -Wno-import Advar ikke om brug af #import\n" +#~ " -Werror Behandl alle advarsler som fejl\n" +#~ " -Wno-error Behandl ikke alle advarsler som fejl\n" +#~ " -Wall Slå alle præprocessoradvarsler til\n" +#~ " -M Generér afhængigheder til make\n" +#~ " -MM Som -M, men ignorér systeminkluderingsfiler\n" +#~ " -MD Som -M, men anbring uddata i en '.d'-fil\n" +#~ " -MMD Som -MD, men ignorér systeminkluderingsfiler\n" +#~ " -MG Behandl manglende inkl.-filer som genererede filer\n" +#~ " -g3 Inkludér #define- og #undef-direktiver i uddata\n" +#~ " -D Definér makroen med strengen '1' som værdi\n" +#~ " -D= Definér makroen med værdien \n" +#~ " -A () Angiv at er svar på \n" +#~ " -A- () Angiv at ikke er svar på \n" +#~ " -U Glem definitionen af \n" +#~ " -v Skriv versionsnummeret\n" +#~ " -H Skriv navnene på inkluderingsfilerne når de bruges\n" +#~ " -C Fjern ikke kommentarer\n" +#~ " -dM Vis til sidst de aktive makrodefinitioner\n" +#~ " -dD Bevar makrodefinitioner i uddata\n" +#~ " -dN Som -dD bortset fra at kun navnene bevares\n" +#~ " -dI Inkludér #include-anvisninger i uddata\n" +#~ " -ftabstop= Afstand mellem tabulatorstop i kolonnerapportering\n" +#~ " -P Generér ikke #line-angivelser\n" +#~ " -$ Tillad ikke '$' i kaldenavne\n" +#~ " -remap Omdan filnavne ved filinkludering\n" +#~ " --version Udskriv versionsinformation\n" +#~ " -h eller --help Vis denne vejledning\n" + +#~ msgid "mark active in cpp_pop_buffer" +#~ msgstr "markér aktiv i cpp_pop_buffer" + +#~ msgid "length < 0 in cpp_expand_to_buffer" +#~ msgstr "længden < 0 i cpp_expand_to_buffer" + +#~ msgid "backslash-newline within line comment" +#~ msgstr "omvendt skråstreg efterfulgt af linjeskift fundet i en enkeltlinjeskommentar" + +#~ msgid "C++ style comments are not allowed in traditional C" +#~ msgstr "kommentarer i C++-stil er ikke tilladt i traditionel C" + +#~ msgid "string constant runs past end of line" +#~ msgstr "strengkonstanten går ud over slutningen af linjen" + +#~ msgid "missing '>' in `#include '" +#~ msgstr "manglende '>' i '#include '" + +#~ msgid "vertical tab in preprocessing directive" +#~ msgstr "lodret tabulator i præprocessordirektiv" + +#~ msgid "form feed in preprocessing directive" +#~ msgstr "sideskift i præprocessordirektiv" + +#~ msgid "null character preserved" +#~ msgstr "nultegn bevaret" + +#~ msgid "comment start split across lines" +#~ msgstr "kommentarbegyndelsen delt over to linjer" + +#~ msgid "comment start '/*' split across lines" +#~ msgstr "kommentarbegyndelsen '/*' delt over to linjer" + +#~ msgid "comment end '*/' split across lines" +#~ msgstr "kommentarslutningen '*/' delt over to linjer" + +#~ msgid "handle_directive called on macro buffer" +#~ msgstr "handle_directive kaldt med et makromellemlager" + +#~ msgid "ignoring #%s because of its indented #" +#~ msgstr "ignorerer #%s på grund af den indrykkede '#'" + +#~ msgid "ISO C does not allow #%s" +#~ msgstr "ISO C tillader ikke #%s" + +#~ msgid "redefining poisoned `%.*s'" +#~ msgstr "omdefinerer forgiftet '%.*s'" + +#~ msgid "garbage at end of #line" +#~ msgstr "ragelse i slutningen af #line" + +#~ msgid "second token after #line is not a string" +#~ msgstr "det andet symbol efter #line er ikke en streng" + +#~ msgid "junk on line after #undef" +#~ msgstr "ragelse på linjen efter #undef" + +#~ msgid "cannot undefine poisoned \"%s\"" +#~ msgstr "kan ikke glemme definitionen af forgiftet \"%s\"" + +#~ msgid "#%s with invalid argument" +#~ msgstr "#%s med ugyldig parameter" + +#~ msgid "Cannot duplicate non-existant exception region." +#~ msgstr "Kan ikke mangfoldiggøre en ikkeeksisterende undtagelsesregion." + +#~ msgid "Never issued previous false_label" +#~ msgstr "Sørgede ikke for tidligere false_label" + +#~ msgid "output_operand: %s" +#~ msgstr "output_operand: %s" + +#~ msgid "NOTE_INSN_BASIC_BLOCK is missing for block %d\n" +#~ msgstr "NOTE_INSN_BASIC_BLOCK mangler for blok %d\n" + +#~ msgid "file path prefix `%s%s' never used" +#~ msgstr "stipræfikset '%s%s' blev aldrig brugt" + +#~ msgid "file path prefix `%s' never used" +#~ msgstr "stipræfikset '%s' blev aldrig brugt" + +#~ msgid "gcov [-b] [-v] [-n] [-l] [-f] [-o OBJDIR] file\n" +#~ msgstr "gcov [-b] [-v] [-n] [-l] [-f] [-o OBJKAT] fil\n" + +#~ msgid "%s: option `--%s' doesn't allow an argument\n" +#~ msgstr "%s: tilvalget '--%s' tillader ikke en parameter\n" + +#~ msgid "%s: option `%c%s' doesn't allow an argument\n" +#~ msgstr "%s: tilvalget '%c%s' tillader ikke en parameter\n" + +#~ msgid "%s: option `%s' requires an argument\n" +#~ msgstr "%s: tilvalget '%s' skal have en parameter\n" + +#~ msgid "%s: unrecognized option `--%s'\n" +#~ msgstr "%s: ukendt tilvalg '--%s'\n" + +#~ msgid "%s: unrecognized option `%c%s'\n" +#~ msgstr "%s: ukendt tilvalg '%c%s'\n" + +#~ msgid "%s: illegal option -- %c\n" +#~ msgstr "%s: ugyldigt tilvalg -- %c\n" + +#~ msgid "%s: invalid option -- %c\n" +#~ msgstr "%s: ugyldigt tilvalg -- %c\n" + +#~ msgid "%s: option requires an argument -- %c\n" +#~ msgstr "%s: tilvalget skal have en parameter -- %c\n" + +#~ msgid "%s: option `-W %s' doesn't allow an argument\n" +#~ msgstr "%s: tilvalget '-W %s' tillader ikke en parameter\n" + +#~ msgid "Objective-C text in C source file" +#~ msgstr "Objective C-tekst i C-kildekodefil" + +#~ msgid "statically allocated objects not supported" +#~ msgstr "statisk allokerede objekter understøttes ikke" + +#~ msgid "`asm' cannot be used in function where memory usage is checked" +#~ msgstr "'asm' kan ikke benyttes i funktioner hvor hukommelsesforbruget bliver tjekket" + +#~ msgid "`asm' cannot be used with `-fcheck-memory-usage'" +#~ msgstr "'asm' kan ikke benyttes sammen med '-fcheck-memory-usage'" + +#~ msgid "output operand constraint %d contains `+'" +#~ msgstr "uddataoperandbegrænsning %d indeholder '+'" + +#~ msgid "hard register `%s' listed as input operand to `asm'" +#~ msgstr "hardware-register '%s' angivet som inddataoperand til 'asm'" + +#~ msgid "output pipe has been closed" +#~ msgstr "uddataledningen er blevet lukket" + +#~ msgid "Errors detected in input file (your bison.simple is out of date)\n" +#~ msgstr "Fandt fejl i inddatafilen (din bison.simple er forældet)\n" + +#~ msgid "Data size %ld.\n" +#~ msgstr "Datastørrelse %ld.\n" + +#~ msgid "Unknown stab %s: : 0x%x\n" +#~ msgstr "Ukendt stab %s: : 0x%x\n" + +#~ msgid "__builtin_trap not supported by this target" +#~ msgstr "__builtin_trap understøttes ikke på denne målarkitektur" + +#~ msgid "`%s' previously defined here" +#~ msgstr "'%s' tidligere defineret her" + +#~ msgid "`%s' previously declared here" +#~ msgstr "'%s' tidligere erklæret her" + +#~ msgid "profiling does not support code models other than medlow" +#~ msgstr "profilgenerering understøtter ikke andre kodemodeller end medlow" + +#~ msgid "Control allocation order of integer registers" +#~ msgstr "Kontrollér tildelingsordenen for heltalsregistrene" diff --git a/libcpp/po/de.po b/libcpp/po/de.po new file mode 100644 index 0000000..57dc56c --- /dev/null +++ b/libcpp/po/de.po @@ -0,0 +1,6550 @@ +# German translation of gcc messages. +# Copyright © 2002, 2003, 2004, 2005 Free Software Foundation, Inc. +# Karl Eichwalder , 2002, 2003. +# Roland Stigge , 2003, 2004, 2005, 2006, 2007. +# This file is distributed under the same license as the gcc package. +# +msgid "" +msgstr "" +"Project-Id-Version: cpplib 4.3-b20071109\n" +"Report-Msgid-Bugs-To: http://gcc.gnu.org/bugs.html\n" +"POT-Creation-Date: 2007-11-08 21:08+0000\n" +"PO-Revision-Date: 2007-11-11 11:11+0100\n" +"Last-Translator: Roland Stigge \n" +"Language-Team: German \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: charset.c:654 +#, c-format +msgid "conversion from %s to %s not supported by iconv" +msgstr "Konvertierung von %s nach %s wird von iconv nicht unterstützt" + +#: charset.c:657 +msgid "iconv_open" +msgstr "iconv_open" + +#: charset.c:665 +#, c-format +msgid "no iconv implementation, cannot convert from %s to %s" +msgstr "keine Implementation für iconv, es kann nicht von %s nach %s konvertiert werden" + +#: charset.c:742 +#, c-format +msgid "character 0x%lx is not in the basic source character set\n" +msgstr "Zeichen 0x%lx ist nicht im regulären Quellzeichensatz\n" + +#: charset.c:759 charset.c:1352 +msgid "converting to execution character set" +msgstr "Konvertierung in Zeichensatz der Ausführung" + +#: charset.c:765 +#, c-format +msgid "character 0x%lx is not unibyte in execution character set" +msgstr "Zeichen 0x%lx ist kein Unibyte im Ausführungs-Zeichensatz" + +#: charset.c:889 +#, c-format +msgid "Character %x might not be NFKC" +msgstr "Zeichen %x ist nicht in NFKC" + +#: charset.c:949 +msgid "universal character names are only valid in C++ and C99" +msgstr "universelle Zeichennamen sind nur in C++ und C99 gültig" + +#: charset.c:952 +#, c-format +msgid "the meaning of '\\%c' is different in traditional C" +msgstr "die Bedeutung von '\\%c' ist in traditionellem C anders" + +#: charset.c:961 +msgid "In _cpp_valid_ucn but not a UCN" +msgstr "In _cpp_valid_ucn, aber kein UCN" + +#: charset.c:986 +#, c-format +msgid "incomplete universal character name %.*s" +msgstr "unvollständiger Universal-Zeichenname %.*s" + +#: charset.c:998 +#, c-format +msgid "%.*s is not a valid universal character" +msgstr "»%.*s« ist kein gültiges universelles Zeichen" + +#: charset.c:1008 lex.c:484 +msgid "'$' in identifier or number" +msgstr "'$' in Bezeichner oder Zahl" + +#: charset.c:1018 +#, c-format +msgid "universal character %.*s is not valid in an identifier" +msgstr "universelles Zeichen %.*s ist nicht gültig in Bezeichner" + +#: charset.c:1022 +#, c-format +msgid "universal character %.*s is not valid at the start of an identifier" +msgstr "universelles Zeichen %.*s ist nicht gültig am Anfang eines Bezeichners" + +#: charset.c:1056 charset.c:1571 +msgid "converting UCN to source character set" +msgstr "UCN wird in Quellzeichensatz konvertiert" + +#: charset.c:1060 +msgid "converting UCN to execution character set" +msgstr "UCN wird in Ausführungszeichensatz konvertiert" + +#: charset.c:1132 +msgid "the meaning of '\\x' is different in traditional C" +msgstr "die Bedeutung von '\\x' ist in traditionellem C anders" + +#: charset.c:1149 +msgid "\\x used with no following hex digits" +msgstr "\\x ohne folgende Hex-Ziffern verwendet" + +#: charset.c:1156 +msgid "hex escape sequence out of range" +msgstr "Hex-Fluchtsequenz außerhalb des Wertebereiches" + +#: charset.c:1195 +msgid "octal escape sequence out of range" +msgstr "Oktal-Fluchtsequenz außerhalb des Wertebereiches" + +#: charset.c:1263 +msgid "the meaning of '\\a' is different in traditional C" +msgstr "die Bedeutung von '\\a' ist in traditionellem C anders" + +#: charset.c:1270 +#, c-format +msgid "non-ISO-standard escape sequence, '\\%c'" +msgstr "nicht-ISO-standardkonforme Fluchtsequenz '\\%c'" + +#: charset.c:1278 +#, c-format +msgid "unknown escape sequence '\\%c'" +msgstr "unbekannte Fluchtsequenz '\\%c'" + +#: charset.c:1286 +#, c-format +msgid "unknown escape sequence: '\\%s'" +msgstr "unbekannte Fluchtsequenz: '\\%s'" + +#: charset.c:1293 +msgid "converting escape sequence to execution character set" +msgstr "Fluchtsequenz wird in Zeichensatz der Ausführung konvertiert" + +#: charset.c:1415 charset.c:1478 +msgid "character constant too long for its type" +msgstr "Zeichenkonstante zu lang für ihren Typ" + +#: charset.c:1418 +msgid "multi-character character constant" +msgstr "Zeichenkonstante mit mehreren Zeichen" + +#: charset.c:1510 +msgid "empty character constant" +msgstr "Leere Zeichenkonstante" + +#: charset.c:1612 +#, c-format +msgid "failure to convert %s to %s" +msgstr "Fehler beim Konvertieren von %s nach %s" + +#: directives.c:215 directives.c:241 +#, c-format +msgid "extra tokens at end of #%s directive" +msgstr "mehrere Token am Ende der Direktive #%s" + +#: directives.c:344 +#, c-format +msgid "#%s is a GCC extension" +msgstr "#%s ist eine Erweiterung des GCC" + +#: directives.c:356 +msgid "suggest not using #elif in traditional C" +msgstr "es wird empfohlen, in traditionellem C nicht #elif zu verwenden" + +#: directives.c:359 +#, c-format +msgid "traditional C ignores #%s with the # indented" +msgstr "traditionelles C ignoriert #%s mit eingerücktem #" + +#: directives.c:363 +#, c-format +msgid "suggest hiding #%s from traditional C with an indented #" +msgstr "es wird empfohlen, #%s vor traditionellem C mit # zu verbergen" + +#: directives.c:389 +msgid "embedding a directive within macro arguments is not portable" +msgstr "das Einbetten einer Direktive innerhalb von Makroargumenten ist nicht portierbar" + +#: directives.c:409 +msgid "style of line directive is a GCC extension" +msgstr "der Stil der line-Direktive ist eine Erweiterung des GCC" + +#: directives.c:464 +#, c-format +msgid "invalid preprocessing directive #%s" +msgstr "ungültige Präprozessordirektive #%s" + +#: directives.c:532 +msgid "\"defined\" cannot be used as a macro name" +msgstr "»defined« kann nicht als Makroname verwendet werden" + +#: directives.c:538 +#, c-format +msgid "\"%s\" cannot be used as a macro name as it is an operator in C++" +msgstr "»%s« kann nicht als Makroname verwendet werden, da es ein Operator in C++ ist" + +#: directives.c:541 +#, c-format +msgid "no macro name given in #%s directive" +msgstr "kein Makroname in Direktive #%s angegeben" + +#: directives.c:544 +msgid "macro names must be identifiers" +msgstr "Makronamen müssen Bezeichner sein" + +#: directives.c:585 +#, c-format +msgid "undefining \"%s\"" +msgstr "»%s« wird un-definiert" + +#: directives.c:640 +msgid "missing terminating > character" +msgstr "fehlendes abschließendes »>«-Zeichen" + +#: directives.c:695 +#, c-format +msgid "#%s expects \"FILENAME\" or " +msgstr "#%s erwartet \"DATEINAME\" oder " + +#: directives.c:739 +#, c-format +msgid "empty filename in #%s" +msgstr "leerer Dateiname in #%s" + +#: directives.c:749 +msgid "#include nested too deeply" +msgstr "#include ist zu tief geschachtelt" + +#: directives.c:790 +msgid "#include_next in primary source file" +msgstr "#include_next in erster Quelldatei" + +#: directives.c:816 +#, c-format +msgid "invalid flag \"%s\" in line directive" +msgstr "ungültiges Kennzeichen »%s« in line-Direktive" + +#: directives.c:868 +#, c-format +msgid "\"%s\" after #line is not a positive integer" +msgstr "»%s« hinter #line ist keine positive Ganzzahl" + +#: directives.c:874 +msgid "line number out of range" +msgstr "Zeilennummer ist außerhalb des Wertebereiches" + +#: directives.c:887 directives.c:964 +#, c-format +msgid "\"%s\" is not a valid filename" +msgstr "»%s« ist kein gültiger Dateiname" + +#: directives.c:924 +#, c-format +msgid "\"%s\" after # is not a positive integer" +msgstr "»%s« hinter # ist keine positive Ganzzahl" + +#: directives.c:1026 +#, c-format +msgid "invalid #%s directive" +msgstr "ungültige #%s-Direktive" + +#: directives.c:1089 +#, c-format +msgid "registering pragmas in namespace \"%s\" with mismatched name expansion" +msgstr "Pragmas im Namespace »%s« werden ohne passende Namensauflösung registriert" + +#: directives.c:1098 +#, c-format +msgid "registering pragma \"%s\" with name expansion and no namespace" +msgstr "Pragma »%s« wird mit Namensauflösung und ohne Namespace registriert" + +#: directives.c:1116 +#, c-format +msgid "registering \"%s\" as both a pragma and a pragma namespace" +msgstr "»%s« wird sowohl als Pragma als auch als Pragma-Namespace registriert" + +#: directives.c:1119 +#, c-format +msgid "#pragma %s %s is already registered" +msgstr "#pragma %s %s ist bereits registriert" + +#: directives.c:1122 +#, c-format +msgid "#pragma %s is already registered" +msgstr "#pragma %s ist bereits registriert" + +#: directives.c:1152 +msgid "registering pragma with NULL handler" +msgstr "Pragma mit NULL-Handler wird registriert" + +#: directives.c:1362 +msgid "#pragma once in main file" +msgstr "#pragma once in Hauptdatei" + +#: directives.c:1385 +msgid "invalid #pragma GCC poison directive" +msgstr "ungültige #pragma GCC Poison Direktive" + +#: directives.c:1394 +#, c-format +msgid "poisoning existing macro \"%s\"" +msgstr "schlechtes existierendes Makro »%s«" + +#: directives.c:1413 +msgid "#pragma system_header ignored outside include file" +msgstr "#pragma system_header außerhalb include-Datei ignoriert" + +#: directives.c:1437 +#, c-format +msgid "cannot find source file %s" +msgstr "Quelldatei %s kann nicht gefunden werden" + +#: directives.c:1441 +#, c-format +msgid "current file is older than %s" +msgstr "aktuelle Datei ist älter als %s" + +#: directives.c:1620 +msgid "_Pragma takes a parenthesized string literal" +msgstr "_Pragma nimmt ein geklammertes Zeichenkettenliteral" + +#: directives.c:1693 +msgid "#else without #if" +msgstr "#else ohne #if" + +#: directives.c:1698 +msgid "#else after #else" +msgstr "#else hinter #else" + +#: directives.c:1700 directives.c:1733 +msgid "the conditional began here" +msgstr "die Bedingung begann hier" + +#: directives.c:1726 +msgid "#elif without #if" +msgstr "#elif ohne #if" + +#: directives.c:1731 +msgid "#elif after #else" +msgstr "#elif hinter #else" + +#: directives.c:1761 +msgid "#endif without #if" +msgstr "#endif ohne #if" + +#: directives.c:1838 +msgid "missing '(' after predicate" +msgstr "fehlendes '(' hinter Prädikat" + +#: directives.c:1853 +msgid "missing ')' to complete answer" +msgstr "fehlendes ')', um Antwort abzuschließen" + +#: directives.c:1873 +msgid "predicate's answer is empty" +msgstr "Prädikatantwort ist leer" + +#: directives.c:1900 +msgid "assertion without predicate" +msgstr "Behauptung ohne Prädikat" + +#: directives.c:1902 +msgid "predicate must be an identifier" +msgstr "Prädikat muss ein Bezeichner sein" + +#: directives.c:1988 +#, c-format +msgid "\"%s\" re-asserted" +msgstr "»%s« wieder behauptet" + +#: directives.c:2271 +#, c-format +msgid "unterminated #%s" +msgstr "unbeendetes #%s" + +#: directives-only.c:221 lex.c:1016 traditional.c:162 +msgid "unterminated comment" +msgstr "nicht beendeter Kommentar" + +#: errors.c:118 +msgid "warning: " +msgstr "Warnung: " + +#: errors.c:120 +msgid "internal error: " +msgstr "interner Fehler: " + +#: errors.c:122 +msgid "error: " +msgstr "Fehler: " + +#: errors.c:186 +msgid "stdout" +msgstr "Standardausgabe" + +#: errors.c:188 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: expr.c:261 +msgid "too many decimal points in number" +msgstr "zu viele Dezimalpunkte in Zahl" + +#: expr.c:290 expr.c:365 +msgid "fixed-point constants are a GCC extension" +msgstr "Festkommakonstanten sind eine GCC-Erweiterung" + +#: expr.c:303 +#, c-format +msgid "invalid digit \"%c\" in binary constant" +msgstr "ungültige Ziffer »%c« in binärer Konstante" + +#: expr.c:305 +#, c-format +msgid "invalid digit \"%c\" in octal constant" +msgstr "ungültige Ziffer »%c« in Oktal-Konstante" + +#: expr.c:313 +msgid "invalid prefix \"0b\" for floating constant" +msgstr "ungültiger Prefix »0b« für Gleitkommakonstante" + +#: expr.c:319 +msgid "use of C99 hexadecimal floating constant" +msgstr "Verwendung von hexadezimaler C99-Gleitkommakonstante" + +#: expr.c:328 +msgid "exponent has no digits" +msgstr "Exponent hat keine Ziffern" + +#: expr.c:335 +msgid "hexadecimal floating constants require an exponent" +msgstr "hexadezimale Gleitkommakonstanten benötigen Exponenten" + +#: expr.c:341 +#, c-format +msgid "invalid suffix \"%.*s\" on floating constant" +msgstr "ungültiger Suffix »%.*s« an Gleitkommakonstante" + +#: expr.c:351 expr.c:393 +#, c-format +msgid "traditional C rejects the \"%.*s\" suffix" +msgstr "traditionelles C lehnt den Suffix »%.*s« ab" + +#: expr.c:358 +#, c-format +msgid "invalid suffix \"%.*s\" with hexadecimal floating constant" +msgstr "ungültiger Suffix »%.*s« mit hexadezimaler Gleitkommakonstante" + +#: expr.c:369 +msgid "decimal float constants are a GCC extension" +msgstr "dezimale Gleitkommakonstanten sind eine GCC-Erweiterung" + +#: expr.c:379 +#, c-format +msgid "invalid suffix \"%.*s\" on integer constant" +msgstr "ungültiger Suffix »%.*s« an Ganzzahlkonstante" + +#: expr.c:401 +msgid "use of C99 long long integer constant" +msgstr "C99 long long Ganzzahlkonstante verwendet" + +#: expr.c:409 +msgid "imaginary constants are a GCC extension" +msgstr "imaginäre Konstanten sind eine GCC-Erweiterung" + +#: expr.c:412 +msgid "binary constants are a GCC extension" +msgstr "binäre Konstanten sind eine GCC-Erweiterung" + +#: expr.c:505 +msgid "integer constant is too large for its type" +msgstr "Ganzzahlkonstante ist zu groß für ihren Typ" + +#: expr.c:517 +msgid "integer constant is so large that it is unsigned" +msgstr "Ganzzahlkonstante ist so groß, dass sie vorzeichenlos ist" + +#: expr.c:612 +msgid "missing ')' after \"defined\"" +msgstr "fehlendes ')' hinter »defined«" + +#: expr.c:619 +msgid "operator \"defined\" requires an identifier" +msgstr "Operator »defined« erfordert einen Bezeichner" + +#: expr.c:627 +#, c-format +msgid "(\"%s\" is an alternative token for \"%s\" in C++)" +msgstr "(»%s« ist ein alternatives Token for »%s« in C++)" + +#: expr.c:637 +msgid "this use of \"defined\" may not be portable" +msgstr "diese Verwendung von »defined« könnte nicht portierbar sein" + +#: expr.c:676 +msgid "floating constant in preprocessor expression" +msgstr "Gleitkommakonstante in Präprozessorausdruck" + +#: expr.c:682 +msgid "imaginary number in preprocessor expression" +msgstr "imaginäre Zahl in Präprozessorausdruck" + +#: expr.c:727 +#, c-format +msgid "\"%s\" is not defined" +msgstr "»%s« ist nicht definiert" + +#: expr.c:855 expr.c:884 +#, c-format +msgid "missing binary operator before token \"%s\"" +msgstr "fehlender binärer Operator vor Token »%s«" + +#: expr.c:875 +#, c-format +msgid "token \"%s\" is not valid in preprocessor expressions" +msgstr "Token »%s« ist nicht gültig in Präprozessorausdrücken" + +#: expr.c:892 +msgid "missing expression between '(' and ')'" +msgstr "fehlender Ausdruck zwischen '(' und ')'" + +#: expr.c:895 +msgid "#if with no expression" +msgstr "#if ohne Ausdruck" + +#: expr.c:898 +#, c-format +msgid "operator '%s' has no right operand" +msgstr "Operator »%s« hat keinen rechten Operanden" + +#: expr.c:903 +#, c-format +msgid "operator '%s' has no left operand" +msgstr "Operator »%s« hat keinen linken Operanden" + +#: expr.c:929 +msgid " ':' without preceding '?'" +msgstr " ':' ohne vorangehendes '?'" + +#: expr.c:956 +msgid "unbalanced stack in #if" +msgstr "unausgeglichener Keller in #if" + +#: expr.c:975 +#, c-format +msgid "impossible operator '%u'" +msgstr "unmöglicher Operator '%u'" + +#: expr.c:1065 +msgid "missing ')' in expression" +msgstr "fehlendes ')' in Ausdruck" + +#: expr.c:1086 +msgid "'?' without following ':'" +msgstr "'?' ohne folgendes ':'" + +#: expr.c:1096 +msgid "integer overflow in preprocessor expression" +msgstr "Ganzzahlüberlauf in Präprozessorausdruck" + +#: expr.c:1101 +msgid "missing '(' in expression" +msgstr "fehlendes '(' in Ausdruck" + +#: expr.c:1133 +#, c-format +msgid "the left operand of \"%s\" changes sign when promoted" +msgstr "der linke Operand von »%s« ändert bei der Weitergabe das Vorzeichen" + +#: expr.c:1138 +#, c-format +msgid "the right operand of \"%s\" changes sign when promoted" +msgstr "der rechte Operand von »%s« ändert bei der Weitergabe das Vorzeichen" + +#: expr.c:1397 +msgid "traditional C rejects the unary plus operator" +msgstr "traditionelles C weist den unären Plus-Operator zurück" + +#: expr.c:1480 +msgid "comma operator in operand of #if" +msgstr "Kommaoperator in Operand von #if" + +#: expr.c:1612 +msgid "division by zero in #if" +msgstr "Division durch Null in #if" + +#: files.c:442 +msgid "NULL directory in find_file" +msgstr "NULL-Verzeichnis in find_file" + +#: files.c:480 +msgid "one or more PCH files were found, but they were invalid" +msgstr "ein oder mehrere PCH-Dateien wurden gefunden, aber sie sind ungültig" + +#: files.c:483 +msgid "use -Winvalid-pch for more information" +msgstr "-Winvalid-pch für mehr Informationen verwenden" + +#: files.c:570 +#, c-format +msgid "%s is a block device" +msgstr "%s ist ein Block-Gerät" + +#: files.c:587 +#, c-format +msgid "%s is too large" +msgstr "%s ist zu groß" + +#: files.c:622 +#, c-format +msgid "%s is shorter than expected" +msgstr "%s ist kürzer als erwartet" + +#: files.c:852 +#, c-format +msgid "no include path in which to search for %s" +msgstr "kein Include-Pfad, um %s zu finden" + +#: files.c:1157 +msgid "Multiple include guards may be useful for:\n" +msgstr "Mehrere Include-Wächter könnten nützlich sein für:\n" + +#: init.c:426 +msgid "cppchar_t must be an unsigned type" +msgstr "cppchar_t muss ein vorzeichenloser Typ sein" + +#: init.c:430 +#, c-format +msgid "preprocessor arithmetic has maximum precision of %lu bits; target requires %lu bits" +msgstr "Präprozessorarithmetik hat maximale Präzision von %lu Bits; Ziel erfordert %lu Bits" + +#: init.c:437 +msgid "CPP arithmetic must be at least as precise as a target int" +msgstr "CPP-Arithmetik muss mindestens so genau sein wie das Ziel int" + +#: init.c:440 +msgid "target char is less than 8 bits wide" +msgstr "Ziel-char ist weniger als 8 Bits breit" + +#: init.c:444 +msgid "target wchar_t is narrower than target char" +msgstr "Ziel-wchar_t ist schmaler als Ziel char" + +#: init.c:448 +msgid "target int is narrower than target char" +msgstr "Ziel-int ist schmaler als Ziel-char" + +#: init.c:453 +msgid "CPP half-integer narrower than CPP character" +msgstr "CPP Halb-Ganzzahl ist schmaler als CPP-Zeichen" + +#: init.c:457 +#, c-format +msgid "CPP on this host cannot handle wide character constants over %lu bits, but the target requires %lu bits" +msgstr "CPP kann auf diesem Computer keine Wide-Zeichenkonstanten über %lu Bits Breite behandeln, das Ziel benötigt %lu Bits" + +#: lex.c:283 +msgid "backslash and newline separated by space" +msgstr "Backslash und Newline durch Leerzeichen getrennt" + +#: lex.c:288 +msgid "backslash-newline at end of file" +msgstr "Backslash-Newline am Dateiende" + +#: lex.c:303 +#, c-format +msgid "trigraph ??%c converted to %c" +msgstr "Trigraph ??%c in %c konvertiert" + +#: lex.c:310 +#, c-format +msgid "trigraph ??%c ignored, use -trigraphs to enable" +msgstr "Trigraph ??%c ignoriert, -trigraphs zum Aktivieren verwenden" + +#: lex.c:356 +msgid "\"/*\" within comment" +msgstr "»/*« innerhalb des Kommentars" + +#: lex.c:414 +#, c-format +msgid "%s in preprocessing directive" +msgstr "%s in Präprozessordirektive" + +#: lex.c:423 +msgid "null character(s) ignored" +msgstr "Null-Zeichen ignoriert" + +#: lex.c:460 +#, c-format +msgid "`%.*s' is not in NFKC" +msgstr "»%.*s« ist nicht in NFKC" + +#: lex.c:463 +#, c-format +msgid "`%.*s' is not in NFC" +msgstr "»%.*s« ist nicht in NFC" + +#: lex.c:551 +#, c-format +msgid "attempt to use poisoned \"%s\"" +msgstr "Versuch, schlechtes »%s« zu verwenden" + +#: lex.c:559 +msgid "__VA_ARGS__ can only appear in the expansion of a C99 variadic macro" +msgstr "__VA_ARGS__ kann nur in Erweiterung eines variadischen C99-Makros auftreten" + +#: lex.c:659 +msgid "null character(s) preserved in literal" +msgstr "Null-Zeichen im Literal erhalten" + +#: lex.c:662 +#, c-format +msgid "missing terminating %c character" +msgstr "fehlendes abschließendes Zeichen %c" + +#: lex.c:1027 +msgid "C++ style comments are not allowed in ISO C90" +msgstr "C++-Stil-Kommentare sind in ISO-C90 nicht erlaubt" + +#: lex.c:1029 +msgid "(this will be reported only once per input file)" +msgstr "(dies wird nur einmal pro Eingabedatei gemeldet)" + +#: lex.c:1034 +msgid "multi-line comment" +msgstr "mehrzeiliger Kommentar" + +#: lex.c:1347 +#, c-format +msgid "unspellable token %s" +msgstr "nicht buchstabierbares Token %s" + +#: line-map.c:320 +#, c-format +msgid "In file included from %s:%u" +msgstr "In Datei, eingefügt von %s:%u" + +#: line-map.c:338 +#, c-format +msgid "" +",\n" +" from %s:%u" +msgstr "" +",\n" +" von %s:%u" + +#: macro.c:84 +#, c-format +msgid "macro \"%s\" is not used" +msgstr "Makro »%s« wird nicht benutzt" + +#: macro.c:123 macro.c:319 +#, c-format +msgid "invalid built-in macro \"%s\"" +msgstr "ungültiges eingebautes Makro »%s«" + +#: macro.c:157 +msgid "could not determine file timestamp" +msgstr "Datum und Zeit der Datei konnten nicht bestimmt werden" + +#: macro.c:254 +msgid "could not determine date and time" +msgstr "Datum und Zeit konnten nicht bestimmt werden" + +#: macro.c:270 +msgid "__COUNTER__ expanded inside directive with -fdirectives-only" +msgstr "__COUNTER__ innerhalb von Anweisung mit -fdirectives-only expandiert" + +#: macro.c:423 +msgid "invalid string literal, ignoring final '\\'" +msgstr "ungültiges Zeichenkettenliteral, abschließendes '\\' wird ignoriert" + +#: macro.c:483 +#, c-format +msgid "pasting \"%s\" and \"%s\" does not give a valid preprocessing token" +msgstr "das Einfügen von »%s« und »%s« ergibt kein gültiges Präprozessor-Token" + +#: macro.c:558 +msgid "ISO C99 requires rest arguments to be used" +msgstr "ISO-C99 erfordert, dass Restargumente verwendet werden" + +#: macro.c:563 +#, c-format +msgid "macro \"%s\" requires %u arguments, but only %u given" +msgstr "Makro »%s« erfordert %u Argumente, aber nur %u wurden angegeben" + +#: macro.c:568 +#, c-format +msgid "macro \"%s\" passed %u arguments, but takes just %u" +msgstr "dem Makro »%s« wurden %u Argumente übergeben, aber es nimmt nur %u" + +#: macro.c:679 traditional.c:680 +#, c-format +msgid "unterminated argument list invoking macro \"%s\"" +msgstr "unvollendete Argumentliste beim Makroaufruf »%s«" + +#: macro.c:782 +#, c-format +msgid "function-like macro \"%s\" must be used with arguments in traditional C" +msgstr "funktionsähnliches Makro »%s« muss mit Argumenten in traditionellem C verwendet werden" + +#: macro.c:1325 +#, c-format +msgid "duplicate macro parameter \"%s\"" +msgstr "doppelter Makroparameter »%s«" + +#: macro.c:1371 +#, c-format +msgid "\"%s\" may not appear in macro parameter list" +msgstr "»%s« darf nicht in Makroparameterliste auftreten" + +#: macro.c:1379 +msgid "macro parameters must be comma-separated" +msgstr "Makroparameter müssen mit Komma getrennt sein" + +#: macro.c:1396 +msgid "parameter name missing" +msgstr "Parametername fehlt" + +#: macro.c:1413 +msgid "anonymous variadic macros were introduced in C99" +msgstr "anonyme variadische Makros wurden in C99 eingeführt" + +#: macro.c:1418 +msgid "ISO C does not permit named variadic macros" +msgstr "ISO-C erlaubt keine benannten variadischen Makros" + +#: macro.c:1427 +msgid "missing ')' in macro parameter list" +msgstr "fehlendes ')' in Makroparameterliste" + +#: macro.c:1476 +msgid "'##' cannot appear at either end of a macro expansion" +msgstr "'##' kann nicht an den Enden einer Makroexpansion auftreten" + +#: macro.c:1510 +msgid "ISO C99 requires whitespace after the macro name" +msgstr "ISO-C99 erfordert Whitespace hinter Makroname" + +#: macro.c:1534 +msgid "missing whitespace after the macro name" +msgstr "Whitespace hinter Makroname fehlt" + +#: macro.c:1564 +msgid "'#' is not followed by a macro parameter" +msgstr "'#' wird nicht von einem Makroparameter gefolgt" + +#: macro.c:1683 +#, c-format +msgid "\"%s\" redefined" +msgstr "»%s« redefiniert" + +#: macro.c:1688 +msgid "this is the location of the previous definition" +msgstr "dies ist die Stelle der vorherigen Definition" + +#: macro.c:1738 +#, c-format +msgid "macro argument \"%s\" would be stringified in traditional C" +msgstr "Makroargument »%s« würde in traditionellem C zum String gewandelt werden" + +#: macro.c:1761 +#, c-format +msgid "invalid hash type %d in cpp_macro_definition" +msgstr "ungültiger Hash-Typ %d in cpp_macro_definition" + +#: pch.c:84 pch.c:332 pch.c:344 pch.c:362 pch.c:368 pch.c:377 +msgid "while writing precompiled header" +msgstr "beim Schreiben des vorkompilierten Headers" + +#: pch.c:485 +#, c-format +msgid "%s: not used because `%.*s' not defined" +msgstr "%s: nicht verwendet, da »%.*s« nicht definiert" + +#: pch.c:497 +#, c-format +msgid "%s: not used because `%.*s' defined as `%s' not `%.*s'" +msgstr "%s: nicht verwendet, da »%.*s« als »%s« statt als »%.*s« definiert wurde" + +#: pch.c:538 +#, c-format +msgid "%s: not used because `%s' is defined" +msgstr "%s: nicht verwendet, da »%s« definiert ist" + +#: pch.c:558 +#, c-format +msgid "%s: not used because `__COUNTER__' is invalid" +msgstr "%s: nicht verwendet, da »__COUNTER__« ungültig ist" + +#: pch.c:567 pch.c:737 +msgid "while reading precompiled header" +msgstr "beim Lesen des vorkompilierten Headers" + +#: traditional.c:750 +#, c-format +msgid "detected recursion whilst expanding macro \"%s\"" +msgstr "Rekursion bei Expansion des Makros »%s« entdeckt" + +#: traditional.c:917 +msgid "syntax error in macro parameter list" +msgstr "Syntaxfehler in Makroparameterliste" + +#~ msgid "no newline at end of file" +#~ msgstr "Kein Newline am Dateiende" + +#~ msgid "unknown escape sequence: '\\%03o'" +#~ msgstr "unbekannte Fluchtsequenz: '\\%03o'" + +#~ msgid "`%s' attribute directive ignored" +#~ msgstr "Attribut-Anweisung »%s« wird ignoriert" + +#~ msgid "wrong number of arguments specified for `%s' attribute" +#~ msgstr "falsche Anzahl an Argumenten für das Attribut »%s« angegeben" + +#~ msgid "`%s' attribute does not apply to types" +#~ msgstr "Attribut »%s« kann nicht auf Typen angewandt werden" + +#~ msgid "`%s' attribute only applies to function types" +#~ msgstr "Attribut »%s« kann nur auf Funktionstypen angewandt werden" + +#~ msgid "`%s' attribute ignored" +#~ msgstr "Attribut »%s« wird ignoriert" + +#~ msgid "offset outside bounds of constant string" +#~ msgstr "Adressabstand ist außerhalb der Grenzen der konstanten Zeichenkette" + +#~ msgid "second arg to `__builtin_prefetch' must be a constant" +#~ msgstr "zweites Argument für »__builtin_prefetch« muss eine Konstante sein" + +#~ msgid "invalid second arg to __builtin_prefetch; using zero" +#~ msgstr "ungültiges zweites Argument für »__builtin_prefetch«; es wird Null verwendet" + +#~ msgid "third arg to `__builtin_prefetch' must be a constant" +#~ msgstr "drittes Argument für »__builtin_prefetch« muss eine Konstante sein" + +#~ msgid "invalid third arg to __builtin_prefetch; using zero" +#~ msgstr "ungültiges drittes Argument für »__builtin_prefetch«; es wird Null verwendet" + +#~ msgid "argument of `__builtin_args_info' must be constant" +#~ msgstr "Argument von »__builtin_args_info« muss konstant sein" + +#~ msgid "argument of `__builtin_args_info' out of range" +#~ msgstr "Argument von »__builtin_args_info« außerhalb des Wertebereichs" + +#~ msgid "missing argument in `__builtin_args_info'" +#~ msgstr "fehlendes Argument in »__builtin_args_info«" + +#~ msgid "`va_start' used in function with fixed args" +#~ msgstr "»va_start« in Funktion mit fester Parameterzahl verwendet" + +#~ msgid "second parameter of `va_start' not last named argument" +#~ msgstr "zweiter Parameter von »va_start« ist nicht letztgenanntes Argument" + +#~ msgid "`__builtin_next_arg' called without an argument" +#~ msgstr "»__builtin_next_arg« ohne Argument gerufen" + +#~ msgid "too many arguments to function `va_start'" +#~ msgstr "zu viele Argumente für »va_start«" + +#~ msgid "first argument to `va_arg' not of type `va_list'" +#~ msgstr "erstes Argument für »va_arg« nicht vom Typ »va_list«" + +#~ msgid "`%s' is promoted to `%s' when passed through `...'" +#~ msgstr "»%s« auf »%s« gesetzt beim Durchlaufen von »...«" + +#~ msgid "(so you should pass `%s' not `%s' to `va_arg')" +#~ msgstr "(Sie sollten also »%s« statt »%s« an »va_arg« übergeben)" + +#~ msgid "invalid arg to `__builtin_frame_address'" +#~ msgstr "ungültiges Argument für »__builtin_frame_address«" + +#~ msgid "invalid arg to `__builtin_return_address'" +#~ msgstr "ungültiges Argument für »__builtin_return_address«" + +#~ msgid "unsupported arg to `__builtin_frame_address'" +#~ msgstr "nicht unterstütztes Argument für »__builtin_frame_address«" + +#~ msgid "unsupported arg to `__builtin_return_address'" +#~ msgstr "nicht unterstütztes Argument für »__builtin_return_address«" + +#~ msgid "second arg to `__builtin_expect' must be a constant" +#~ msgstr "zweites Argument für »__builtin_expect« muss eine Konstante sein" + +#~ msgid "__builtin_longjmp second argument must be 1" +#~ msgstr "zweites Argument für __builtin_longjmp muss 1 sein" + +#~ msgid "built-in function `%s' not currently supported" +#~ msgstr "eingebaute Funktion »%s« gegenwärtig nicht unterstützt" + +#~ msgid "target format does not support infinity" +#~ msgstr "Zielformat unterstützt nicht »unendlich«" + +#~ msgid "%Hsuggest explicit braces to avoid ambiguous `else'" +#~ msgstr "%Hes wird empfohlen, explizite geschweifte Klammern zu setzen, um mehrdeutiges »else« zu vermeiden" + +#~ msgid "%J'%D' is not defined outside of function scope" +#~ msgstr "%J»%D« ist außerhalb des Funktionsgültigkeitsbereiches nicht definiert" + +#~ msgid "string length `%d' is greater than the length `%d' ISO C%d compilers are required to support" +#~ msgstr "Zeichenkettenlänge »%d« ist größer als die Länge »%d«, die von ISO-C%d-Compilern unterstützt werden muss" + +#~ msgid "overflow in constant expression" +#~ msgstr "Überlauf in Konstanten-Ausdruck" + +#~ msgid "integer overflow in expression" +#~ msgstr "Ganzzahlüberlauf in Ausdruck" + +#~ msgid "floating point overflow in expression" +#~ msgstr "Gleitkommaüberlauf in Ausdruck" + +#~ msgid "vector overflow in expression" +#~ msgstr "Vektorüberlauf in Ausdruck" + +#~ msgid "large integer implicitly truncated to unsigned type" +#~ msgstr "große Ganzzahl implizit auf vorzeichenlosen Typen abgeschnitten" + +#~ msgid "negative integer implicitly converted to unsigned type" +#~ msgstr "negative Ganzzahl implizit in vorzeichenlosen Typen konvertiert" + +#~ msgid "overflow in implicit constant conversion" +#~ msgstr "Überlauf in impliziter Konstantenkonvertierung" + +#~ msgid "operation on `%s' may be undefined" +#~ msgstr "Operation auf »%s« könnte undefiniert sein" + +#~ msgid "expression statement has incomplete type" +#~ msgstr "Ausdrucksanweisung hat unvollständigen Typ" + +#~ msgid "case label does not reduce to an integer constant" +#~ msgstr "case-Marke reduziert nicht auf Ganzzahlkonstante" + +#~ msgid "invalid truth-value expression" +#~ msgstr "ungültiger Wahrheitswert-Ausdruck" + +#~ msgid "invalid operands to binary %s" +#~ msgstr "ungültige Operanden für binäres %s" + +#~ msgid "comparison is always false due to limited range of data type" +#~ msgstr "Vergleich ist durch beschränkten Wertebereich des Datentyps stets »unwahr«" + +#~ msgid "comparison is always true due to limited range of data type" +#~ msgstr "Vergleich ist durch beschränkten Wertebereich des Datentyps stets »wahr«" + +#~ msgid "comparison of unsigned expression >= 0 is always true" +#~ msgstr "Vergleich eines vorzeichenlosen Ausdrucks >= 0 ist stets »wahr«" + +#~ msgid "comparison of unsigned expression < 0 is always false" +#~ msgstr "Vergleich eines vorzeichenlosen Ausdrucks < 0 ist stets »unwahr«" + +#~ msgid "pointer of type `void *' used in arithmetic" +#~ msgstr "Zeiger auf Typen »void *« in Arithmetik verwendet" + +#~ msgid "pointer to a function used in arithmetic" +#~ msgstr "Zeiger auf Funktion in Arithmetik verwendet" + +#~ msgid "pointer to member function used in arithmetic" +#~ msgstr "Zeiger auf Elementfunktion in Arithmetik verwendet" + +#~ msgid "pointer to a member used in arithmetic" +#~ msgstr "Zeiger auf Element in Arithmetik verwendet" + +#~ msgid "struct type value used where scalar is required" +#~ msgstr "Wert eines struct-Typs anstelle des geforderten Skalars verwendet" + +#~ msgid "union type value used where scalar is required" +#~ msgstr "Wert eines union-Typs anstelle des geforderten Skalars verwendet" + +#~ msgid "array type value used where scalar is required" +#~ msgstr "Wert eines array-Typs anstelle des geforderten Skalars verwendet" + +#~ msgid "the address of `%D', will always evaluate as `true'" +#~ msgstr "die Adresse von »%D« wird immer zu »true« auswerten" + +#~ msgid "suggest parentheses around assignment used as truth value" +#~ msgstr "um Zuweisung, die als Wahrheitswert verwendet wird, werden Klammern vorgeschlagen" + +#~ msgid "invalid use of `restrict'" +#~ msgstr "ungültige Verwendung von »restrict«" + +#~ msgid "invalid application of `sizeof' to a function type" +#~ msgstr "ungültige Anwendung von »sizeof« auf einen Funktionstypen" + +#~ msgid "invalid application of `%s' to a void type" +#~ msgstr "ungültige Anwendung von »%s« auf einen void-Typen" + +#~ msgid "invalid application of `%s' to an incomplete type" +#~ msgstr "ungültige Anwendung von »%s« auf einen unvollständigen Typen" + +#~ msgid "`__alignof' applied to a bit-field" +#~ msgstr "»__alignof« auf Bitfeld angewandt" + +#~ msgid "cannot disable built-in function `%s'" +#~ msgstr "kann eingebaute Funktion »%s« nicht abschalten" + +#~ msgid "too few arguments to function `%s'" +#~ msgstr "zu wenig Argumente für Funktion »%s«" + +#~ msgid "too many arguments to function `%s'" +#~ msgstr "zu viele Argumente für Funktion »%s«" + +#~ msgid "non-floating-point argument to function `%s'" +#~ msgstr "nicht-Gleitkomma-Argument für Funktion »%s«" + +#~ msgid "pointers are not permitted as case values" +#~ msgstr "Zeiger sind nicht als case-Werte zugelassen" + +#~ msgid "range expressions in switch statements are non-standard" +#~ msgstr "Wertebereichsausdrücke in switch-Anweisungen sind nicht standardkonform" + +#~ msgid "empty range specified" +#~ msgstr "leerer Wertebereich angegeben" + +#~ msgid "duplicate (or overlapping) case value" +#~ msgstr "doppelte (oder sich überschneidende) case-Werte" + +#~ msgid "%Jthis is the first entry overlapping that value" +#~ msgstr "%Jdies ist der erste Eintrag, der diesen Wert überschneidet" + +#~ msgid "duplicate case value" +#~ msgstr "doppelter case-Wert" + +#~ msgid "%Jpreviously used here" +#~ msgstr "%Jbereits hier verwendet" + +#~ msgid "multiple default labels in one switch" +#~ msgstr "mehrere Standardmarken in einem »switch«" + +#~ msgid "%Jthis is the first default label" +#~ msgstr "%Jdies ist die erste Standardmarke" + +#~ msgid "taking the address of a label is non-standard" +#~ msgstr "das Ermitteln der Adresse einer Marke ist nicht standardkonform" + +#~ msgid "%Hignoring return value of `%D', declared with attribute warn_unused_result" +#~ msgstr "%Hder Rückgabewert von »%D« mit dem Attribut warn_unused_result wird ignoriert" + +#~ msgid "%Hignoring return value of function declared with attribute warn_unused_result" +#~ msgstr "%Hder Rückgabewert der Funktion, die mit dem Attribut warn_unused_result deklariert wurde, wird ignoriert" + +#~ msgid "declaration of \"%s\" shadows a parameter" +#~ msgstr "Deklaration von »%s« überdeckt einen Parameter" + +#~ msgid "declaration of \"%s\" shadows a previous local" +#~ msgstr "Deklaration von »%s« überdeckt einen vorhergehenden lokalen Bezeichner" + +#~ msgid "declaration of \"%s\" shadows a global declaration" +#~ msgstr "Deklaration von »%s« überdeckt eine globale Deklaration" + +#~ msgid "%Jshadowed declaration is here" +#~ msgstr "%Jverdeckte Deklaration ist hier" + +#~ msgid "unknown machine mode `%s'" +#~ msgstr "unbekannter Maschinenzustand »%s«" + +#~ msgid "no data type for mode `%s'" +#~ msgstr "kein Datentyp für Zustand »%s«" + +#~ msgid "invalid pointer mode `%s'" +#~ msgstr "ungültiger Zeigermodus »%s«" + +#~ msgid "unable to emulate '%s'" +#~ msgstr "»%s« kann nicht emuliert werden" + +#~ msgid "%Jsection attribute cannot be specified for local variables" +#~ msgstr "%JAbschnitts-Attribut kann nicht für lokale Variablen angegeben werden" + +#~ msgid "%Jsection of '%D' conflicts with previous declaration" +#~ msgstr "%JAbschnitt von »%D« in Konflikt mit vorheriger Deklaration" + +#~ msgid "%Jsection attribute not allowed for '%D'" +#~ msgstr "%JAbschnitts-Attribute nicht erlaubt für »%D«" + +#~ msgid "%Jsection attributes are not supported for this target" +#~ msgstr "%JAbschnitts-Attribute werden für dieses Ziel nicht unterstützt" + +#~ msgid "requested alignment is not a constant" +#~ msgstr "verlangte Ausrichtung ist keine Konstante" + +#~ msgid "requested alignment is not a power of 2" +#~ msgstr "verlangte Ausrichtung ist keine Zweierpotenz" + +#~ msgid "requested alignment is too large" +#~ msgstr "verlangte Ausrichtung ist zu groß" + +#~ msgid "%Jalignment may not be specified for '%D'" +#~ msgstr "%Jfür »%D« darf keine Ausrichtung angegeben werden" + +#~ msgid "%J'%D' defined both normally and as an alias" +#~ msgstr "%J»%D« sowohl normal als auch als Alias definiert" + +#~ msgid "alias arg not a string" +#~ msgstr "Alias-Argument ist keine Zeichenkette" + +#~ msgid "visibility arg not a string" +#~ msgstr "Sichtbarkeitsargument ist keine Zeichenkette" + +#~ msgid "visibility arg must be one of \"default\", \"hidden\", \"protected\" or \"internal\"" +#~ msgstr "Sichtbarkeitsargument muss »default«, »hidden«, »protected« oder »internal« sein" + +#~ msgid "tls_model arg not a string" +#~ msgstr "Argument für tls_model ist keine Zeichenkette" + +#~ msgid "tls_model arg must be one of \"local-exec\", \"initial-exec\", \"local-dynamic\" or \"global-dynamic\"" +#~ msgstr "Argument für tls_model muss »local-exec«, »initial-exec«, »local-dynamic« oder »global-dynamic« sein" + +#~ msgid "%J'%E' attribute applies only to functions" +#~ msgstr "%JAttribut »%E« kann nur auf Funktionen angewandt werden" + +#~ msgid "%Jcan't set '%E' attribute after definition" +#~ msgstr "%Jkann Attribut »%E« nicht nach der Definition setzen" + +#~ msgid "`%s' attribute ignored for `%s'" +#~ msgstr "Attribut »%s« ignoriert für »%s«" + +#~ msgid "invalid vector type for attribute `%s'" +#~ msgstr "ungültiger Vektortyp für Attribut »%s«" + +#~ msgid "no vector mode with the size and type specified could be found" +#~ msgstr "Vektorzustand mit der angegebenen Größe und dem angegebenen Typ konnte nicht gefunden werden" + +#~ msgid "nonnull attribute without arguments on a non-prototype" +#~ msgstr "Nicht-Null-Attribut ohne Argumente für einen Nicht-Prototyp" + +#~ msgid "nonnull argument has invalid operand number (arg %lu)" +#~ msgstr "Nicht-Null-Argument hat ungültige Operandenzahl (Argument %lu)" + +#~ msgid "nonnull argument with out-of-range operand number (arg %lu, operand %lu)" +#~ msgstr "Nicht-Null-Argument mit Operandenzahl außerhalb des Wertebereiches (Argument %lu, Operand %lu)" + +#~ msgid "nonnull argument references non-pointer operand (arg %lu, operand %lu)" +#~ msgstr "Nicht-Null-Argument referenziert Nicht-Zeiger-Operanden (Argument %lu, Operand %lu)" + +#~ msgid "null argument where non-null required (arg %lu)" +#~ msgstr "Null-Argument, wo Nicht-Null erwartet (Argument %lu)" + +#~ msgid "cleanup arg not an identifier" +#~ msgstr "Argument für cleanup ist kein Bezeichner" + +#~ msgid "cleanup arg not a function" +#~ msgstr "Argument für cleanup ist keine Funktion" + +#~ msgid "%s at end of input" +#~ msgstr "%s am Ende der Eingabe" + +#~ msgid "%s before %s'%c'" +#~ msgstr "%s vor %s'%c'" + +#~ msgid "%s before %s'\\x%x'" +#~ msgstr "%s vor %s'\\x%x'" + +#~ msgid "%s before string constant" +#~ msgstr "%s vor Zeichenkettenkonstante" + +#~ msgid "%s before numeric constant" +#~ msgstr "%s vor numerischer Konstante" + +#~ msgid "%s before \"%s\"" +#~ msgstr "%s vor \"%s\"" + +#~ msgid "%s before '%s' token" +#~ msgstr "%s vor »%s«" + +#~ msgid "%s" +#~ msgstr "%s" + +#~ msgid "void value not ignored as it ought to be" +#~ msgstr "void-Wert nicht ignoriert wie es sein sollte" + +#~ msgid "conversion to non-scalar type requested" +#~ msgstr "Konvertierung zu Nicht-Skalar-Typ verlangt" + +#~ msgid "%Jarray '%D' assumed to have one element" +#~ msgstr "%JFeld »%D« als einelementig betrachtet" + +#~ msgid "%Jlabel `%D' used but not defined" +#~ msgstr "%JMarke »%D« verwendet, aber nicht definiert" + +#~ msgid "%Jlabel `%D' defined but not used" +#~ msgstr "%JMarke »%D« definiert aber nicht verwendet" + +#~ msgid "%Jlabel `%D' declared but not defined" +#~ msgstr "%JMarke »%D« deklariert, aber nicht definiert" + +#~ msgid "%Junused variable `%D'" +#~ msgstr "%JVariable »%D« wird nicht verwendet" + +#~ msgid "a parameter list with an ellipsis can't match an empty parameter name list declaration" +#~ msgstr "eine Parameterliste mit Auslassung passt nicht zu einer leeren Parameternamenslistendeklaration" + +#~ msgid "an argument type that has a default promotion can't match an empty parameter name list declaration" +#~ msgstr "ein Argumenttyp mit Standard-Promotion passt nicht zu leerer Parameternamenslistendeklaration" + +#~ msgid "%Jprototype for '%D' declares more arguments than previous old-style definition" +#~ msgstr "%JPrototyp für »%D« deklariert mehr Argumente als vorherige Definition im alten Stil" + +#~ msgid "%Jprototype for '%D' declares fewer arguments than previous old-style definition" +#~ msgstr "%JPrototyp für »%D« deklariert weniger Argumente als vorherige Definition im alten Stil" + +#~ msgid "%Jprototype for '%D' declares arg %d with incompatible type" +#~ msgstr "%JPrototyp für »%D« deklariert Argument %d mit inkompatiblem Typen" + +#~ msgid "%Jprototype for '%D' follows non-prototype definition" +#~ msgstr "%JPrototyp für »%D« folgt einer Nicht-Prototyp-Definition" + +#~ msgid "%Jprevious definition of '%D' was here" +#~ msgstr "%Jvorherige Definition von »%D« war hier" + +#~ msgid "%Jprevious implicit declaration of '%D' was here" +#~ msgstr "%Jvorherige implizite Deklaration von »%D« war hier" + +#~ msgid "%Jprevious declaration of '%D' was here" +#~ msgstr "%Jvorherige Deklaration von »%D« war hier" + +#~ msgid "%J'%D' redeclared as different kind of symbol" +#~ msgstr "%J»%D« redeklariert als andere Symbolart" + +#~ msgid "%Jbuilt-in function '%D' declared as non-function" +#~ msgstr "%Jeingebaute Funktion »%D« als Nicht-Funktion deklariert" + +#~ msgid "%Jshadowing built-in function '%D'" +#~ msgstr "%Jeingebaute Funktion »%D« überdeckt" + +#~ msgid "%Jconflicting types for built-in function '%D'" +#~ msgstr "%Jin Konflikt stehende Typen für eingebaute Funktion »%D«" + +#~ msgid "%Jconflicting types for '%D'" +#~ msgstr "%Jin Konflikt stehende Typen für »%D«" + +#~ msgid "%Jredefinition of typedef '%D'" +#~ msgstr "%JRedefinition des typedef »%D«" + +#~ msgid "%Jredefinition of '%D'" +#~ msgstr "%JRedefinition von »%D«" + +#~ msgid "%Jstatic declaration of '%D' follows non-static declaration" +#~ msgstr "%Jstatische Deklaration von »%D« folgt Nicht-statischer Deklaration" + +#~ msgid "%Jnon-static declaration of '%D' follows static declaration" +#~ msgstr "%JNicht-statische-Deklaration von »%D« folgt statischer Deklaration" + +#~ msgid "%Jthread-local declaration of '%D' follows non-thread-local declaration" +#~ msgstr "%JThread-lokale Deklaration von »%D« folgt nicht-Thread-lokaler Deklaration" + +#~ msgid "%Jnon-thread-local declaration of '%D' follows thread-local declaration" +#~ msgstr "%JNicht-Thread-lokale Deklaration von »%D« folgt Thread-lokaler Deklaration" + +#~ msgid "%Jextern declaration of '%D' follows declaration with no linkage" +#~ msgstr "%Jextern-Deklaration von »%D« folgt Deklaration ohne Bindung" + +#~ msgid "%Jdeclaration of '%D' with no linkage follows extern declaration" +#~ msgstr "%JDeklaration von »%D« ohne Bindung folgt einer externen Deklaration" + +#~ msgid "%Jredeclaration of '%D' with no linkage" +#~ msgstr "%JRedeklarationen von »%D« ohne Bindung" + +#~ msgid "%Jredeclaration of '%D' with different visibility (old visibility preserved)" +#~ msgstr "%JRedeklaration von »%D« mit anderer Sichtbarkeit (alte Sichtbarkeit beibehalten)" + +#~ msgid "%Jinline declaration of '%D' follows declaration with attribute noinline" +#~ msgstr "%Jinline-Deklaration von »%D« folgt Deklaration mit Attribut noinline" + +#~ msgid "%Jdeclaration of '%D' with attribute noinline follows inline declaration " +#~ msgstr "%JDeklaration von »%D« mit Attribut noinline folgt inline-Deklaration " + +#~ msgid "%J'%D' declared inline after being called" +#~ msgstr "%J»%D« als inline deklariert nachdem es aufgerufen wurde" + +#~ msgid "%J'%D' declared inline after its definition" +#~ msgstr "%J»%D« nach der Definition als inline deklariert" + +#~ msgid "%Jvolatile declaration of '%D' follows non-volatile declaration" +#~ msgstr "%J»volatile«-Deklaration von »%D« folgt nicht-»volatile«-Deklaration" + +#~ msgid "%Jnon-volatile declaration of '%D' follows volatile declaration" +#~ msgstr "%JNicht-»volatile«-Deklaration von »%D« folgt »volatile«-Deklaration" + +#~ msgid "%Jconst declaration of '%D' follows non-const declaration" +#~ msgstr "%Jconst-Deklaration für »%D« folgt Nicht-const Deklaration" + +#~ msgid "%Jnon-const declaration of '%D' follows const declaration" +#~ msgstr "%JNicht-const-Deklaration von »%D« folgt const-Deklaration" + +#~ msgid "%Jredundant redeclaration of '%D'" +#~ msgstr "%Jredundante Redeklaration von »%D«" + +#~ msgid "nested extern declaration of `%s'" +#~ msgstr "geschachtelte extern-Deklaration von »%s«" + +#~ msgid "%Jprevious declaration of '%D'" +#~ msgstr "%Jvorherige Deklaration von »%D«" + +#~ msgid "implicit declaration of function `%s'" +#~ msgstr "implizite Deklaration der Funktion »%s«" + +#~ msgid "`%s' undeclared here (not in a function)" +#~ msgstr "»%s« ist hier nicht deklariert (nicht in einer Funktion)" + +#~ msgid "`%s' undeclared (first use in this function)" +#~ msgstr "»%s« nicht deklariert (erste Benutzung in dieser Funktion)" + +#~ msgid "(Each undeclared identifier is reported only once" +#~ msgstr "(Jeder nicht deklarierte Bezeichner wird nur einmal aufgeführt" + +#~ msgid "for each function it appears in.)" +#~ msgstr "für jede Funktion in der er auftritt.)" + +#~ msgid "label %s referenced outside of any function" +#~ msgstr "Marke %s außerhalb einer Funktion referenziert" + +#~ msgid "duplicate label declaration `%s'" +#~ msgstr "doppelte Markendeklaration »%s«" + +#~ msgid "%Jthis is a previous declaration" +#~ msgstr "%Jdies ist eine vorherige Deklaration" + +#~ msgid "%Hduplicate label `%D'" +#~ msgstr "%Hdoppelte Marke »%D«" + +#~ msgid "%J`%D' previously defined here" +#~ msgstr "%J»%D« bereits hier definiert" + +#~ msgid "%J`%D' previously declared here" +#~ msgstr "%J»%D« bereits hier deklariert" + +#~ msgid "%Htraditional C lacks a separate namespace for labels, identifier `%s' conflicts" +#~ msgstr "%Htraditionelles C bietet keinen separaten Namespace für Marken an, Bezeichner »%s« steht in Konflikt" + +#~ msgid "%H`%s' defined as wrong kind of tag" +#~ msgstr "%H»%s« definiert als falsche Symbolart" + +#~ msgid "unnamed struct/union that defines no instances" +#~ msgstr "unbenannte struct/union, die keine Instanzen definiert" + +#~ msgid "useless keyword or type name in empty declaration" +#~ msgstr "nutzloses Schlüsselwort oder Typenname in leerer Deklaration" + +#~ msgid "two types specified in one empty declaration" +#~ msgstr "zwei Typen in einer leeren Deklaration angegeben" + +#~ msgid "empty declaration" +#~ msgstr "leere Deklaration" + +#~ msgid "ISO C90 does not support `static' or type qualifiers in parameter array declarators" +#~ msgstr "ISO-C90 unterstützt kein »static« oder Typkennzeichner in Parameterfelddeklaratoren" + +#~ msgid "ISO C90 does not support `[*]' array declarators" +#~ msgstr "ISO-C90 unterstützt nicht »[*]«-Felddeklaratoren" + +#~ msgid "GCC does not yet properly implement `[*]' array declarators" +#~ msgstr "GCC implementiert noch keine richtigen »[*]«-Felddeklaratoren" + +#~ msgid "static or type qualifiers in abstract declarator" +#~ msgstr "static oder Typkennzeichner in abstraktem Deklarator" + +#~ msgid "%J'%D' is usually a function" +#~ msgstr "%J»%D« ist üblicherweise eine Funktion" + +#~ msgid "typedef `%s' is initialized (use __typeof__ instead)" +#~ msgstr "typedef »%s« ist initialisiert (benutzen Sie stattdessen __typeof__)" + +#~ msgid "function `%s' is initialized like a variable" +#~ msgstr "Funktion »%s« ist wie eine Variable initialisiert" + +#~ msgid "parameter `%s' is initialized" +#~ msgstr "Parameter »%s« ist initialisiert" + +#~ msgid "variable-sized object may not be initialized" +#~ msgstr "Objekt variabler Größe darf nicht initialisiert werden" + +#~ msgid "variable `%s' has initializer but incomplete type" +#~ msgstr "Variable »%s« hat Initialisierung, aber unvollständigen Typ" + +#~ msgid "elements of array `%s' have incomplete type" +#~ msgstr "Elemente des Feldes »%s« haben unvollständigen Typ" + +#~ msgid "%Jinline function '%D' given attribute noinline" +#~ msgstr "%Jinline-Funktion »%D« wurde das Attribut »noinline« gegeben" + +#~ msgid "%Jinitializer fails to determine size of '%D'" +#~ msgstr "%JInitialisierung scheitert an Größenbestimmung von »%D«" + +#~ msgid "%Jarray size missing in '%D'" +#~ msgstr "%JFeldgröße in »%D« fehlt" + +#~ msgid "%Jzero or negative size array '%D'" +#~ msgstr "%JFeldgröße von »%D« ist null oder negativ" + +#~ msgid "%Jstorage size of '%D' isn't known" +#~ msgstr "%JSpeichergröße von »%D« ist unbekannt" + +#~ msgid "%Jstorage size of '%D' isn't constant" +#~ msgstr "%JSpeichergröße von »%D« ist nicht konstant" + +#~ msgid "%Jignoring asm-specifier for non-static local variable '%D'" +#~ msgstr "%Jasm-Symbol für nicht-statische lokale Variable »%D« wird ignoriert" + +#~ msgid "ISO C forbids forward parameter declarations" +#~ msgstr "ISO-C verbietet Vorwärtsdeklaration für Parameter" + +#~ msgid "" +#~ msgstr "" + +#~ msgid "bit-field `%s' width not an integer constant" +#~ msgstr "Breite des Bitfeldes »%s« ist keine Ganzzahlkonstante" + +#~ msgid "negative width in bit-field `%s'" +#~ msgstr "negative Breite in Bitfeld »%s«" + +#~ msgid "zero width for bit-field `%s'" +#~ msgstr "Breite null für Bitfeld »%s«" + +#~ msgid "bit-field `%s' has invalid type" +#~ msgstr "Bitfeld »%s« hat ungültigen Typen" + +#~ msgid "type of bit-field `%s' is a GCC extension" +#~ msgstr "der Typ des Bitfeldes »%s« ist eine Erweiterung des GCC" + +#~ msgid "width of `%s' exceeds its type" +#~ msgstr "Breite von »%s« überschreitet dessen Typen" + +#~ msgid "`%s' is narrower than values of its type" +#~ msgstr "»%s« ist schmaler als die Werte seines Typs" + +#~ msgid "`long long long' is too long for GCC" +#~ msgstr "»long long long« ist für GCC zu lang" + +#~ msgid "ISO C90 does not support `long long'" +#~ msgstr "ISO-C90 unterstützt nicht »long long«" + +#~ msgid "duplicate `%s'" +#~ msgstr "doppeltes »%s«" + +#~ msgid "`__thread' before `extern'" +#~ msgstr "»__thread« vor »extern«" + +#~ msgid "`__thread' before `static'" +#~ msgstr "»__thread« vor »static«" + +#~ msgid "two or more data types in declaration of `%s'" +#~ msgstr "zwei oder mehr Datentypen in Deklaration von »%s«" + +#~ msgid "`%s' fails to be a typedef or built in type" +#~ msgstr "»%s« ist kein typedef oder eingebauter Typ" + +#~ msgid "type defaults to `int' in declaration of `%s'" +#~ msgstr "»int« ist Standardtyp in Deklaration von »%s«" + +#~ msgid "both long and short specified for `%s'" +#~ msgstr "sowohl »long« als auch »short« für »%s« angegeben" + +#~ msgid "long or short specified with char for `%s'" +#~ msgstr "»long« oder »short« mit »char« für »%s« angegeben" + +#~ msgid "long or short specified with floating type for `%s'" +#~ msgstr "»long« oder »short« mit Gleitkommatyp für »%s« angegeben" + +#~ msgid "the only valid combination is `long double'" +#~ msgstr "die einzig gültige Kombination ist »long double«" + +#~ msgid "both signed and unsigned specified for `%s'" +#~ msgstr "sowohl »signed« als auch »unsigned« für »%s« angegeben" + +#~ msgid "long, short, signed or unsigned invalid for `%s'" +#~ msgstr "long, short, signed oder unsigned ist ungültig für »%s«" + +#~ msgid "long, short, signed or unsigned used invalidly for `%s'" +#~ msgstr "long, short, signed oder unsigned ungültig verwendet für »%s«" + +#~ msgid "complex invalid for `%s'" +#~ msgstr "complex ungültig für »%s«" + +#~ msgid "ISO C90 does not support complex types" +#~ msgstr "ISO-C90 unterstützt nicht komplexe Typen" + +#~ msgid "ISO C does not support plain `complex' meaning `double complex'" +#~ msgstr "ISO-C unterstützt nicht »double complex« bedeutendes »complex«" + +#~ msgid "ISO C does not support complex integer types" +#~ msgstr "ISO-C unterstützt keine komplexen Ganzzahltypen" + +#~ msgid "duplicate `const'" +#~ msgstr "doppeltes »const«" + +#~ msgid "duplicate `restrict'" +#~ msgstr "doppeltes »restrict«" + +#~ msgid "duplicate `volatile'" +#~ msgstr "doppeltes »volatile«" + +#~ msgid "multiple storage classes in declaration of `%s'" +#~ msgstr "mehrere Speicherklassen in Deklaration von »%s«" + +#~ msgid "function definition declared `auto'" +#~ msgstr "Funktionsdefinition deklarierte »auto«" + +#~ msgid "function definition declared `register'" +#~ msgstr "Funktionsdefinition deklarierte »register«" + +#~ msgid "function definition declared `typedef'" +#~ msgstr "Funktionsdefinition deklarierte »typedef«" + +#~ msgid "function definition declared `__thread'" +#~ msgstr "Funktionsdefinition deklarierte »__thread«" + +#~ msgid "storage class specified for structure field `%s'" +#~ msgstr "Speicherklasse für Strukturfeld »%s« angegeben" + +#~ msgid "storage class specified for parameter `%s'" +#~ msgstr "Speicherklasse für Parameter »%s« angegeben" + +#~ msgid "storage class specified for typename" +#~ msgstr "Speicherklasse für Typnamen angegeben" + +#~ msgid "`%s' initialized and declared `extern'" +#~ msgstr "»%s« initialisiert und als »extern« deklariert" + +#~ msgid "`%s' has both `extern' and initializer" +#~ msgstr "»%s« hat sowohl »extern« als auch Initialisierung" + +#~ msgid "file-scope declaration of `%s' specifies `auto'" +#~ msgstr "Deklaration von »%s« in Datei-Sichtbarkeitsbereich spezifiziert »auto«" + +#~ msgid "nested function `%s' declared `extern'" +#~ msgstr "geschachtelte Funktion »%s« als »extern« deklariert" + +#~ msgid "function-scope `%s' implicitly auto and declared `__thread'" +#~ msgstr "Funktions-Gültigkeitsbereich »%s« ist implizit auto und deklarierte »__thread«" + +#~ msgid "static or type qualifiers in non-parameter array declarator" +#~ msgstr "»static« oder Typkennzeichner in Nicht-Parameter-Felddeklarator" + +#~ msgid "declaration of `%s' as array of voids" +#~ msgstr "Deklaration von »%s« als Feld von voids" + +#~ msgid "declaration of `%s' as array of functions" +#~ msgstr "Deklaration von »%s« als Feld von Funtionen" + +#~ msgid "invalid use of structure with flexible array member" +#~ msgstr "ungültige Verwendung einer Struktur mit flexiblem Feldelement" + +#~ msgid "size of array `%s' has non-integer type" +#~ msgstr "Feldgröße von »%s« hat Nicht-Ganzzahltyp" + +#~ msgid "ISO C forbids zero-size array `%s'" +#~ msgstr "ISO-C verbietet Feld »%s« der Größe null" + +#~ msgid "size of array `%s' is negative" +#~ msgstr "Feldgröße von »%s« ist negativ" + +#~ msgid "ISO C90 forbids array `%s' whose size can't be evaluated" +#~ msgstr "ISO-C90 verbietet Feld »%s«, dessen Größe nicht ausgewertet werden kann" + +#~ msgid "ISO C90 forbids variable-size array `%s'" +#~ msgstr "ISO-C90 verbietet Feld »%s« variabler Größe" + +#~ msgid "size of array `%s' is too large" +#~ msgstr "Feldgröße von »%s« ist zu groß" + +#~ msgid "ISO C90 does not support flexible array members" +#~ msgstr "ISO-C90 unterstützt keine flexiblen Felder als Elemente" + +#~ msgid "array type has incomplete element type" +#~ msgstr "Feldtyp hat unvollständigen Elementtypen" + +#~ msgid "`%s' declared as function returning a function" +#~ msgstr "»%s« als Funktion, die eine Funktion zurückgibt, deklariert" + +#~ msgid "`%s' declared as function returning an array" +#~ msgstr "»%s« als Funktion, die ein Feld zurückgibt, deklariert" + +#~ msgid "ISO C forbids qualified void function return type" +#~ msgstr "ISO-C verbietet qualifiziertes void als Funktions-Rückgabetypen" + +#~ msgid "type qualifiers ignored on function return type" +#~ msgstr "Typkennzeichner ignoriert an Funktions-Rückgabewert" + +#~ msgid "ISO C forbids qualified function types" +#~ msgstr "ISO-C verbietet qualifizierte Funktionstypen" + +#~ msgid "invalid type modifier within pointer declarator" +#~ msgstr "ungültiger Typmodifizierer innerhalb Zeigerdeklarator" + +#~ msgid "ISO C forbids const or volatile function types" +#~ msgstr "ISO-C verbietet const- oder volatile-Funktionstypen" + +#~ msgid "variable or field `%s' declared void" +#~ msgstr "Variable oder Feld »%s« als »void« deklariert" + +#~ msgid "attributes in parameter array declarator ignored" +#~ msgstr "Attribute in Parameterfelddeklarator ignoriert" + +#~ msgid "invalid type modifier within array declarator" +#~ msgstr "ungültiger Typmodifizierer in Felddeklarator" + +#~ msgid "field `%s' declared as a function" +#~ msgstr "Feld »%s« als Funktion deklariert" + +#~ msgid "field `%s' has incomplete type" +#~ msgstr "Feld »%s« hat unvollständigen Typen" + +#~ msgid "invalid storage class for function `%s'" +#~ msgstr "ungültige Speicherklasse für Funktion »%s«" + +#~ msgid "`noreturn' function returns non-void value" +#~ msgstr "»noreturn«-Funktion gibt nicht-void-Wert zurück" + +#~ msgid "cannot inline function `main'" +#~ msgstr "»main« ist nicht als »inline« möglich" + +#~ msgid "variable previously declared `static' redeclared `extern'" +#~ msgstr "als »extern« redeklarierte Variable war bereits als »static« deklariert" + +#~ msgid "%Jvariable '%D' declared `inline'" +#~ msgstr "%JVariable »%D« als »inline« deklariert" + +#~ msgid "thread-local storage not supported for this target" +#~ msgstr "Thread-lokaler Speicher wird für dieses Ziel nicht unterstützt" + +#~ msgid "function declaration isn't a prototype" +#~ msgstr "Funktionsdeklaration ist kein Prototyp" + +#~ msgid "parameter names (without types) in function declaration" +#~ msgstr "Parameternamen (ohne Typen) in Funktionsdeklaration" + +#~ msgid "parameter `%s' has incomplete type" +#~ msgstr "Parameter »%s« hat unvollständigen Typen" + +#~ msgid "parameter has incomplete type" +#~ msgstr "Parameter hat unvollständigen Typen" + +#~ msgid "\"void\" as only parameter may not be qualified" +#~ msgstr "\"void\" kann als einziger Parameter nicht qualifiziert werden" + +#~ msgid "\"void\" must be the only parameter" +#~ msgstr "\"void\" muss der einzige Parameter sein" + +#~ msgid "%Jparameter \"%D\" has just a forward declaration" +#~ msgstr "%JParameter »%D« hat nur eine Vorwärtsdeklaration" + +#~ msgid "\"%s %s\" declared inside parameter list" +#~ msgstr "\"%s %s\" innerhalb Parameterliste deklariert" + +#~ msgid "anonymous %s declared inside parameter list" +#~ msgstr "anonymes %s innerhalb Parameterliste deklariert" + +#~ msgid "its scope is only this definition or declaration, which is probably not what you want" +#~ msgstr "sein Gültigkeitsbereich umfasst nur diese Definition bzw. Deklaration, was Sie wahrscheinlich nicht wollten" + +#~ msgid "redefinition of `union %s'" +#~ msgstr "Redefinition von »union %s«" + +#~ msgid "redefinition of `struct %s'" +#~ msgstr "Redefinition von »struct %s«" + +#~ msgid "declaration does not declare anything" +#~ msgstr "Deklaration deklariert nichts" + +#~ msgid "%Jduplicate member '%D'" +#~ msgstr "%Jdoppeltes Element »%D«" + +#~ msgid "%s defined inside parms" +#~ msgstr "%s innerhalb Parameter definiert" + +#~ msgid "union" +#~ msgstr "Union" + +#~ msgid "structure" +#~ msgstr "Struktur" + +#~ msgid "%s has no %s" +#~ msgstr "%s hat kein %s" + +#~ msgid "struct" +#~ msgstr "struct" + +#~ msgid "named members" +#~ msgstr "benannte Elemente" + +#~ msgid "members" +#~ msgstr "Elemente" + +#~ msgid "nested redefinition of `%s'" +#~ msgstr "Verschachtelte Redefinition von »%s«" + +#~ msgid "%Jflexible array member in union" +#~ msgstr "%Jflexibles Feldelement in Union" + +#~ msgid "%Jflexible array member not at end of struct" +#~ msgstr "%Jflexibles Feld-Element nicht am Ende von struct" + +#~ msgid "%Jflexible array member in otherwise empty struct" +#~ msgstr "%Jlexibler Feld-Element in ansonsten leerem struct" + +#~ msgid "%Jinvalid use of structure with flexible array member" +#~ msgstr "%Jungültige Verwendung einer Struktur mit flexiblem Feld-Element" + +#~ msgid "union cannot be made transparent" +#~ msgstr "union kann nicht transparent gemacht werden" + +#~ msgid "redeclaration of `enum %s'" +#~ msgstr "Redeklaration von »enum %s«" + +#~ msgid "enum defined inside parms" +#~ msgstr "enum innerhalb von Parametern definiert" + +#~ msgid "enumeration values exceed range of largest integer" +#~ msgstr "Aufzählungswerte überschreiten Wertebereich des größten Ganzzahltypen" + +#~ msgid "enumerator value for `%s' not integer constant" +#~ msgstr "Aufzählungswert für »%s« ist keine Ganzzahlkonstante" + +#~ msgid "overflow in enumeration values" +#~ msgstr "Überlauf in Aufzählungswerten" + +#~ msgid "ISO C restricts enumerator values to range of `int'" +#~ msgstr "ISO-C beschränkt Aufzählungswerte auf Bereich von »int«" + +#~ msgid "return type is an incomplete type" +#~ msgstr "Rückgabetyp ist unvollständig" + +#~ msgid "return type defaults to `int'" +#~ msgstr "Rückgabetyp ist auf »int« voreingestellt" + +#~ msgid "%Jno previous prototype for '%D'" +#~ msgstr "%Jkein vorheriger Prototyp für »%D«" + +#~ msgid "%J'%D' was used with no prototype before its definition" +#~ msgstr "%J»%D« wurde vor seiner Definition ohne Prototyp verwendet" + +#~ msgid "%Jno previous declaration for '%D'" +#~ msgstr "%Jkeine vorherige Deklaration für »%D«" + +#~ msgid "%J`%D' was used with no declaration before its definition" +#~ msgstr "%J»%D« wurde vor seiner Definition ohne Deklaration verwendet" + +#~ msgid "%Jreturn type of '%D' is not `int'" +#~ msgstr "%JRückgabetyp von »%D« ist nicht »int«" + +#~ msgid "%Jfirst argument of '%D' should be `int'" +#~ msgstr "%Jerstes Argument von »%D« sollte »int« sein" + +#~ msgid "%Jsecond argument of '%D' should be 'char **'" +#~ msgstr "%Jzweites Argument von »%D« sollte »char **« sein" + +#~ msgid "%Jthird argument of '%D' should probably be 'char **'" +#~ msgstr "%Jdrittes Argument von »%D« sollte wahrscheinlich »char **« sein" + +#~ msgid "%J'%D' takes only zero or two arguments" +#~ msgstr "%J»%D« benötigt entweder null oder zwei Argumente" + +#~ msgid "%J'%D' is normally a non-static function" +#~ msgstr "%J»%D« ist normalerweise eine Nicht-static-Funktion" + +#~ msgid "%Jold-style parameter declarations in prototyped function definition" +#~ msgstr "%JParameterdeklarationen alten Stils in Prototyp-Funktionsdeklaration" + +#~ msgid "%Jparameter name omitted" +#~ msgstr "%JParametername ausgelassen" + +#~ msgid "%Jparameter name missing from parameter list" +#~ msgstr "%JParametername fehlt in Parameterliste" + +#~ msgid "%J\"%D\" declared as a non-parameter" +#~ msgstr "%J\"%D\" als Nicht-Parameter deklariert" + +#~ msgid "%Jmultiple parameters named \"%D\"" +#~ msgstr "%Jmehrere Parameter wurden »%D« genannt" + +#~ msgid "%Jparameter \"%D\" declared void" +#~ msgstr "%JParameter »%D« als void deklariert" + +#~ msgid "%Jtype of \"%D\" defaults to \"int\"" +#~ msgstr "%JTyp von »%D« ist auf »int« voreingestellt" + +#~ msgid "%Jparameter \"%D\" has incomplete type" +#~ msgstr "%JParameter \"%D\" hat unvollständigen Typen" + +#~ msgid "%Jdeclaration for parameter \"%D\" but no such parameter" +#~ msgstr "%Jnicht vorhandener Parameter »%D« deklariert" + +#~ msgid "number of arguments doesn't match prototype" +#~ msgstr "Anzahl der Argumente passt nicht zum Prototypen" + +#~ msgid "%Hprototype declaration" +#~ msgstr "%HPrototyp-Deklaration" + +#~ msgid "promoted argument \"%D\" doesn't match prototype" +#~ msgstr "weitergegebenes Argument »%D« passt nicht zum Prototypen" + +#~ msgid "argument \"%D\" doesn't match prototype" +#~ msgstr "Argument »%D« passt nicht zum Prototypen" + +#~ msgid "no return statement in function returning non-void" +#~ msgstr "keine return-Anweisung in nicht void zurückgebender Funktion" + +#~ msgid "this function may return with or without a value" +#~ msgstr "diese Funktion kann mit oder ohne Wert zurückkehren" + +#~ msgid "'for' loop initial declaration used outside C99 mode" +#~ msgstr "Anfangsdeklaration in »for«-Schleife außerhalb C99-Modus verwendet" + +#~ msgid "'struct %s' declared in 'for' loop initial declaration" +#~ msgstr "»struct %s« in Anfangsdeklaration einer »for«-Schleife deklariert" + +#~ msgid "'union %s' declared in 'for' loop initial declaration" +#~ msgstr "»union %s« in Anfangsdeklaration einer »for«-Schleife deklariert" + +#~ msgid "'enum %s' declared in 'for' loop initial declaration" +#~ msgstr "»enum %s« in Anfangsdeklaration einer »for«-Schleife deklariert" + +#~ msgid "%Jdeclaration of non-variable '%D' in 'for' loop initial declaration" +#~ msgstr "%JDeklaration der Nicht-Variablen »%D« in Anfangsdeklaration einer »for«-Schleife" + +#~ msgid "%Jdeclaration of static variable '%D' in 'for' loop initial declaration" +#~ msgstr "%JDeklaration der »static«-Variablen »%D« in Anfangsdeklaration einer »for«-Schleife" + +#~ msgid "%Jdeclaration of 'extern' variable '%D' in 'for' loop initial declaration" +#~ msgstr "%JDeklaration der »extern«-Variablen »%D« in Anfangsdeklaration einer »for«-Schleife" + +#~ msgid "%Jredefinition of global '%D'" +#~ msgstr "%JRedefinition des globalen »%D«" + +#~ msgid "%J'%D' previously defined here" +#~ msgstr "%J»%D« bereits hier verwendet" + +#~ msgid "format string has invalid operand number" +#~ msgstr "Formatzeichenkette hat ungültige Operandenzahl" + +#~ msgid "function does not return string type" +#~ msgstr "Funktion gibt keinen Zeichenkettentypen zurück" + +#~ msgid "format string arg not a string type" +#~ msgstr "Format-Zeichenkettenargument ist kein Zeichenkettentyp" + +#~ msgid "unrecognized format specifier" +#~ msgstr "unerkannte Formatangabe" + +#~ msgid "`%s' is an unrecognized format function type" +#~ msgstr "»%s« ist ein nicht erkannter Formatfunktionstyp" + +#~ msgid "'...' has invalid operand number" +#~ msgstr "»...« hat ungültige Operandenzahl" + +#~ msgid "format string arg follows the args to be formatted" +#~ msgstr "Format-Zeichenkettenargument folgt den zu formatierenden Argumenten" + +#~ msgid "` ' flag" +#~ msgstr "» «-Kennzeichen" + +#~ msgid "the ` ' printf flag" +#~ msgstr "das » «-printf-Kennzeichen" + +#~ msgid "`+' flag" +#~ msgstr "»+«-Kennzeichen" + +#~ msgid "the `+' printf flag" +#~ msgstr "das »+«-printf-Kennzeichen" + +#~ msgid "`#' flag" +#~ msgstr "»#«-Kennzeichen" + +#~ msgid "the `#' printf flag" +#~ msgstr "das »#«-printf-Kennzeichen" + +#~ msgid "`0' flag" +#~ msgstr "»0«-Kennzeichen" + +#~ msgid "the `0' printf flag" +#~ msgstr "das »0«-printf-Kennzeichen" + +#~ msgid "`-' flag" +#~ msgstr "»-«-Kennzeichen" + +#~ msgid "the `-' printf flag" +#~ msgstr "das »-«-printf-Kennzeichen" + +#~ msgid "`'' flag" +#~ msgstr "»'«-Kennzeichen" + +#~ msgid "the `'' printf flag" +#~ msgstr "das »'«-printf-Kennzeichen" + +#~ msgid "`I' flag" +#~ msgstr "»I«-Kennzeichen" + +#~ msgid "the `I' printf flag" +#~ msgstr "das »I«-printf-Kennzeichen" + +#~ msgid "field width" +#~ msgstr "Feldbreite" + +#~ msgid "field width in printf format" +#~ msgstr "Feldbreite im printf-Format" + +#~ msgid "precision" +#~ msgstr "Genauigkeit" + +#~ msgid "precision in printf format" +#~ msgstr "Genauigkeit im printf-Format" + +#~ msgid "length modifier" +#~ msgstr "Längenmodifizierer" + +#~ msgid "length modifier in printf format" +#~ msgstr "Längenmodifizierer im printf-Format" + +#~ msgid "assignment suppression" +#~ msgstr "Zuweisungsunterdrückung" + +#~ msgid "the assignment suppression scanf feature" +#~ msgstr "das scanf-Merkmal der Zuweisungsunterdrückung" + +#~ msgid "`a' flag" +#~ msgstr "»a«-Kennzeichen" + +#~ msgid "the `a' scanf flag" +#~ msgstr "das »a«-scanf-Kennzeichen" + +#~ msgid "field width in scanf format" +#~ msgstr "Feldbreite im scanf-Format" + +#~ msgid "length modifier in scanf format" +#~ msgstr "Längenmodifizierer im scanf-Format" + +#~ msgid "the `'' scanf flag" +#~ msgstr "das »'«-scanf-Kennzeichen" + +#~ msgid "the `I' scanf flag" +#~ msgstr "das »I«-scanf-Kennzeichen" + +#~ msgid "`_' flag" +#~ msgstr "»_«-Kennzeichen" + +#~ msgid "the `_' strftime flag" +#~ msgstr "das »_«-strftime-Kennzeichen" + +#~ msgid "the `-' strftime flag" +#~ msgstr "das »-«-strftime-Kennzeichen" + +#~ msgid "the `0' strftime flag" +#~ msgstr "das »0«-strftime-Kennzeichen" + +#~ msgid "`^' flag" +#~ msgstr "»^«-Kennzeichen" + +#~ msgid "the `^' strftime flag" +#~ msgstr "das »^«-strftime-Kennzeichen" + +#~ msgid "the `#' strftime flag" +#~ msgstr "das »#«-strftime-Kennzeichen" + +#~ msgid "field width in strftime format" +#~ msgstr "Feldbreite im strftime-Format" + +#~ msgid "`E' modifier" +#~ msgstr "»E«-Modifizierer" + +#~ msgid "the `E' strftime modifier" +#~ msgstr "der »E«-strftime-Modifizierer" + +#~ msgid "`O' modifier" +#~ msgstr "»O«-Modifizierer" + +#~ msgid "the `O' strftime modifier" +#~ msgstr "der »O«-strftime-Modifizierer" + +#~ msgid "the `O' modifier" +#~ msgstr "der »O«-Modifizierer" + +#~ msgid "fill character" +#~ msgstr "Füllzeichen" + +#~ msgid "fill character in strfmon format" +#~ msgstr "Füllzeichen im strfmon-Format" + +#~ msgid "the `^' strfmon flag" +#~ msgstr "das »^«-strfmon-Kennzeichen" + +#~ msgid "the `+' strfmon flag" +#~ msgstr "das »+«-strfmon-Kennzeichen" + +#~ msgid "`(' flag" +#~ msgstr "»(«-Kennzeichen" + +#~ msgid "the `(' strfmon flag" +#~ msgstr "das »(«-strfmon-Kennzeichen" + +#~ msgid "`!' flag" +#~ msgstr "»!«-Kennzeichen" + +#~ msgid "the `!' strfmon flag" +#~ msgstr "das »!«-strfmon-Kennzeichen" + +#~ msgid "the `-' strfmon flag" +#~ msgstr "das »-«-strfmon-Kennzeichen" + +#~ msgid "field width in strfmon format" +#~ msgstr "Feldbreite im strfmon-Format" + +#~ msgid "left precision" +#~ msgstr "linke Präzision" + +#~ msgid "left precision in strfmon format" +#~ msgstr "linke Präzision im strfmon-Format" + +#~ msgid "right precision" +#~ msgstr "rechte Präzision" + +#~ msgid "right precision in strfmon format" +#~ msgstr "rechte Präzision im strfmon-Format" + +#~ msgid "length modifier in strfmon format" +#~ msgstr "Längenmodifizierer im strfmon-Format" + +#~ msgid "function might be possible candidate for `%s' format attribute" +#~ msgstr "Funktion könnte möglicher Kandidat für Formatattribut »%s« sein" + +#~ msgid "missing $ operand number in format" +#~ msgstr "fehlende $-Operandennummer im Format" + +#~ msgid "%s does not support %%n$ operand number formats" +#~ msgstr "%s unterstützt nicht %%n$-Operandennummerformate" + +#~ msgid "operand number out of range in format" +#~ msgstr "Operandennummer außerhalb des Wertebereiches im Format" + +#~ msgid "format argument %d used more than once in %s format" +#~ msgstr "Formatargument %d mehr als einmal im %s-Format verwendet" + +#~ msgid "format argument %d unused before used argument %d in $-style format" +#~ msgstr "Formatargument %d nicht verwendet vor benutztem Argument %d im $-Stil-Format" + +#~ msgid "format not a string literal, format string not checked" +#~ msgstr "Format ist kein Zeichenkettenliteral, Formatzeichenkette ungeprüft" + +#~ msgid "format not a string literal and no format arguments" +#~ msgstr "Format ist kein Zeichenkettenliteral, und keine Formatargumente" + +#~ msgid "format not a string literal, argument types not checked" +#~ msgstr "Format ist kein Zeichenkettenliteral, Argumenttypen ungeprüft" + +#~ msgid "too many arguments for format" +#~ msgstr "zu viele Argumente für Format" + +#~ msgid "unused arguments in $-style format" +#~ msgstr "unbenutzte Argumente in $-Stil-Format" + +#~ msgid "zero-length %s format string" +#~ msgstr "Format-Zeichenkette %s der Länge null" + +#~ msgid "format is a wide character string" +#~ msgstr "Format ist »wide character«-Zeichenkette" + +#~ msgid "unterminated format string" +#~ msgstr "unbeendete Formatzeichenkette" + +#~ msgid "embedded `\\0' in format" +#~ msgstr "eingebettetes »\\0« im Format" + +#~ msgid "spurious trailing `%%' in format" +#~ msgstr "störendes letztes »%%« im Format" + +#~ msgid "repeated %s in format" +#~ msgstr "wiederholtes %s im Format" + +#~ msgid "missing fill character at end of strfmon format" +#~ msgstr "fehlendes Füllzeichen am Ende des strfmon-Formates" + +#~ msgid "too few arguments for format" +#~ msgstr "zu wenig Argumente für Format" + +#~ msgid "zero width in %s format" +#~ msgstr "Breite null im Format %s" + +#~ msgid "empty left precision in %s format" +#~ msgstr "leere linke Präzision im Format %s" + +#~ msgid "field precision" +#~ msgstr "Feldpräzision" + +#~ msgid "empty precision in %s format" +#~ msgstr "fehlende Präzision im Format %s" + +#~ msgid "%s does not support the `%s' %s length modifier" +#~ msgstr "%s unterstützt nicht den Längenmodifizierer »%s« %s" + +#~ msgid "conversion lacks type at end of format" +#~ msgstr "Konvertierung fehlt der Typ am Ende des Formates" + +#~ msgid "unknown conversion type character `%c' in format" +#~ msgstr "unbekanntes Konvertierungstyp-Zeichen »%c« im Format" + +#~ msgid "unknown conversion type character 0x%x in format" +#~ msgstr "unbekanntes Konvertierungstyp-Zeichen 0x%x im Format" + +#~ msgid "%s does not support the `%%%c' %s format" +#~ msgstr "%s unterstützt nicht das Format »%%%c« %s" + +#~ msgid "%s used with `%%%c' %s format" +#~ msgstr "%s verwendet mit Format »%%%c« %s" + +#~ msgid "%s does not support %s" +#~ msgstr "%s unterstützt nicht %s" + +#~ msgid "%s does not support %s with the `%%%c' %s format" +#~ msgstr "%s unterstützt nicht %s mit dem Format »%%%c« %s" + +#~ msgid "%s ignored with %s and `%%%c' %s format" +#~ msgstr "%s ignoriert mit %s und Format »%%%c« %s" + +#~ msgid "%s ignored with %s in %s format" +#~ msgstr "%s ignoriert mit %s im Format %s" + +#~ msgid "use of %s and %s together with `%%%c' %s format" +#~ msgstr "Verwendung von %s und %s zusammen mit Format »%%%c« %s" + +#~ msgid "use of %s and %s together in %s format" +#~ msgstr "Verwendung von %s und %s zusammen im Format %s" + +#~ msgid "`%%%c' yields only last 2 digits of year in some locales" +#~ msgstr "»%%%c« liefert in manchen Locales nur die letzten 2 Ziffern des Jahres" + +#~ msgid "`%%%c' yields only last 2 digits of year" +#~ msgstr "»%%%c« liefert nur die letzten 2 Ziffern des Jahres" + +#~ msgid "no closing `]' for `%%[' format" +#~ msgstr "kein schließendes »]« für »%%[«-Format" + +#~ msgid "use of `%s' length modifier with `%c' type character" +#~ msgstr "Verwendung des »%s«-Längenmodifizierers mit »%c«-Typ-Zeichen" + +#~ msgid "%s does not support the `%%%s%c' %s format" +#~ msgstr "%s unterstützt nicht das Format »%%%s%c« %s" + +#~ msgid "operand number specified with suppressed assignment" +#~ msgstr "Operandennummer mit unterdrückter Zuweisung angegeben" + +#~ msgid "operand number specified for format taking no argument" +#~ msgstr "Operandennummer für Format ohne Argumente angegeben" + +#~ msgid "writing through null pointer (arg %d)" +#~ msgstr "Schreiben mit Null-Zeiger (Argument %d)" + +#~ msgid "reading through null pointer (arg %d)" +#~ msgstr "Lesen mit Null-Zeiger (Argument %d)" + +#~ msgid "writing into constant object (arg %d)" +#~ msgstr "Schreiben in konstantes Objekt (Argument %d)" + +#~ msgid "extra type qualifiers in format argument (arg %d)" +#~ msgstr "zusätzliche Typqualifizierer in Format-Argument (Argument %d)" + +#~ msgid "format argument is not a pointer (arg %d)" +#~ msgstr "Format-Argument ist kein Zeiger (Argument %d)" + +#~ msgid "format argument is not a pointer to a pointer (arg %d)" +#~ msgstr "Format-Argument ist kein Zeiger auf einen Zeiger (Argument %d)" + +#~ msgid "pointer" +#~ msgstr "Zeiger" + +#~ msgid "different type" +#~ msgstr "anderer Typ" + +#~ msgid "%s is not type %s (arg %d)" +#~ msgstr "%s ist nicht vom Typ %s (Argument %d)" + +#~ msgid "%s format, %s arg (arg %d)" +#~ msgstr "%s Format, %s Argument (Argument %d)" + +#~ msgid "args to be formatted is not '...'" +#~ msgstr "zu formatierendes Argument ist nicht »...«" + +#~ msgid "strftime formats cannot format arguments" +#~ msgstr "strftime-Formate können keine Argumente formatieren" + +#~ msgid "ignoring duplicate directory \"%s\"\n" +#~ msgstr "doppeltes Verzeichnis »%s« wird ignoriert\n" + +#~ msgid " as it is a non-system directory that duplicates a system directory\n" +#~ msgstr " da es ein Nicht-Systemverzeichnis ist, das ein Systemverzeichnis dupliziert\n" + +#~ msgid "ignoring nonexistent directory \"%s\"\n" +#~ msgstr "nicht vorhandenes Verzeichnis »%s« wird ignoriert\n" + +#~ msgid "#include \"...\" search starts here:\n" +#~ msgstr "#include \"...\" - Suche beginnt hier:\n" + +#~ msgid "#include <...> search starts here:\n" +#~ msgstr "#include <...> - Suche beginnt hier:\n" + +#~ msgid "End of search list.\n" +#~ msgstr "Ende der Suchliste.\n" + +#~ msgid "badly nested C headers from preprocessor" +#~ msgstr "schlecht geschachtelte C-Header vom Präprozessor" + +#~ msgid "ignoring #pragma %s %s" +#~ msgstr "ignoriere #pragma %s %s" + +#~ msgid "%Hstray '@' in program" +#~ msgstr "%Hverirrtes »@« im Programm" + +#~ msgid "stray '%c' in program" +#~ msgstr "verirrtes »%c« im Programm" + +#~ msgid "stray '\\%o' in program" +#~ msgstr "verirrtes »\\%o« im Programm" + +#~ msgid "this decimal constant is unsigned only in ISO C90" +#~ msgstr "diese Dezimalkonstante ist nur in ISO-C90 vorzeichenlos" + +#~ msgid "this decimal constant would be unsigned in ISO C90" +#~ msgstr "diese Dezimalkonstante wäre in ISO-C90 vorzeichenlos" + +#~ msgid "integer constant is too large for \"%s\" type" +#~ msgstr "Ganzzahlkonstante ist zu groß für »%s«-Typ" + +#~ msgid "floating constant exceeds range of \"%s\"" +#~ msgstr "Gleitkommakonstante überschreitet Wertebereich von »%s«" + +#~ msgid "traditional C rejects string constant concatenation" +#~ msgstr "traditionelles C weist Stringkonstantenverkettung zurück" + +#~ msgid "%Jfunction '%F' can never be inlined because it is supressed using -fno-inline" +#~ msgstr "%JFunktion »%F« kann nie inline sein, da dies mit -fno-inline unterdrückt wird" + +#~ msgid "%Jfunction '%F' can never be inlined because it might not be bound within this unit of translation" +#~ msgstr "%JFunktion »%F« kann nie inline sein, da sie nicht in diese Übersetzungseinheit gebunden wird" + +#~ msgid "%Jfunction '%F' can never be inlined because it uses attributes conflicting with inlining" +#~ msgstr "%JFunktion »%F« kann nie inline sein, da sie mit inline in Konflikt stehende Attribute hat" + +#~ msgid "%Jfunction '%F' can never be inlined because it has pending sizes" +#~ msgstr "%JFunktion »%F« kann nie inline sein, da sie noch offene Größen hat" + +#~ msgid "%Jnested function '%F' can never be inlined because it has possibly saved pending sizes" +#~ msgstr "%Jdie geschachtelte Funktion »%F« kann nie inline sein, da sie möglicherweise gespeicherte, noch offene Größen hat" + +#~ msgid "no class name specified with \"%s\"" +#~ msgstr "kein Klassenname mit \"%s\" angegeben" + +#~ msgid "assertion missing after \"%s\"" +#~ msgstr "Behauptung fehlt hinter \"%s\"" + +#~ msgid "macro name missing after \"%s\"" +#~ msgstr "Makroname fehlt hinter \"%s\"" + +#~ msgid "missing path after \"%s\"" +#~ msgstr "fehlender Pfad hinter \"%s\"" + +#~ msgid "missing filename after \"%s\"" +#~ msgstr "fehlender Dateiname hinter \"%s\"" + +#~ msgid "missing makefile target after \"%s\"" +#~ msgstr "fehlendes Makefile-Ziel hinter \"%s\"" + +#~ msgid "-I- specified twice" +#~ msgstr "-I- doppelt angegeben" + +#~ msgid "switch \"%s\" is no longer supported" +#~ msgstr "Option »%s« wird nicht mehr unterstützt" + +#~ msgid "-fhandle-exceptions has been renamed -fexceptions (and is now on by default)" +#~ msgstr "-fhandle-exceptions wurde in -fexceptions umbenannt (und ist nun voreingestellt)" + +#~ msgid "output filename specified twice" +#~ msgstr "Ausgabedatei doppelt angegeben" + +#~ msgid "-Wformat-y2k ignored without -Wformat" +#~ msgstr "-Wformat-y2k wird ohne -Wformat ignoriert" + +#~ msgid "-Wformat-extra-args ignored without -Wformat" +#~ msgstr "-Wformat-extra-args wird ohne -Wformat ignoriert" + +#~ msgid "-Wformat-zero-length ignored without -Wformat" +#~ msgstr "-Wformat-zero-length wird ohne -Wformat ignoriert" + +#~ msgid "-Wformat-nonliteral ignored without -Wformat" +#~ msgstr "-Wformat-nonliteral wird ohne -Wformat ignoriert" + +#~ msgid "-Wformat-security ignored without -Wformat" +#~ msgstr "-Wformat-security wird ohne -Wformat ignoriert" + +#~ msgid "-Wmissing-format-attribute ignored without -Wformat" +#~ msgstr "-Wmissing-format-attribute wird ohne -Wformat ignoriert" + +#~ msgid "opening output file %s: %m" +#~ msgstr "Ausgabedatei »%s« wird geöffnet: %m" + +#~ msgid "too many filenames given. Type %s --help for usage" +#~ msgstr "zu viele Dateinamen angegeben. Geben sie »%s --help« für Hilfe ein" + +#~ msgid "YYDEBUG not defined" +#~ msgstr "YYDEBUG ist nicht definiert" + +#~ msgid "opening dependency file %s: %m" +#~ msgstr "Abhängigkeitsdatei »%s« wird geöffnet: %m" + +#~ msgid "closing dependency file %s: %m" +#~ msgstr "Abhängigkeitsdatei »%s« wird geschlossen: %m" + +#~ msgid "when writing output to %s: %m" +#~ msgstr "beim Schreiben der Ausgabe nach %s: %m" + +#~ msgid "to generate dependencies you must specify either -M or -MM" +#~ msgstr "um Abhängigkeiten zu erzeugen, müssen Sie entweder -M oder -MM angeben" + +#~ msgid "" +#~ msgstr "" + +#~ msgid "" +#~ msgstr "" + +#~ msgid "too late for # directive to set debug directory" +#~ msgstr "zu spät für »#«-Direktive, um Debug-Verzeichnis festzulegen" + +#~ msgid "syntax error" +#~ msgstr "Syntaxfehler" + +#~ msgid "syntax error: cannot back up" +#~ msgstr "Syntaxfehler: es kann nicht zurückgesetzt werden" + +#~ msgid "ISO C forbids an empty source file" +#~ msgstr "ISO-C erlaubt keine leeren Quelldateien" + +#~ msgid "argument of `asm' is not a constant string" +#~ msgstr "Argument von »asm« ist keine konstante Zeichenkette" + +#~ msgid "ISO C forbids data definition with no type or storage class" +#~ msgstr "ISO-C verbietet Datendefinition ohne Typ und Speicherklasse" + +#~ msgid "data definition has no type or storage class" +#~ msgstr "Datendefinition hat keinen Typ oder Speicherklasse" + +#~ msgid "ISO C does not allow extra `;' outside of a function" +#~ msgstr "ISO-C erlaubt kein extra »;« außerhalb einer Funktion" + +#~ msgid "`sizeof' applied to a bit-field" +#~ msgstr "»sizeof«-Operator auf ein Bitfeld angewandt" + +#~ msgid "ISO C forbids omitting the middle term of a ?: expression" +#~ msgstr "ISO-C verbietet das Weglassen des mittleren Terms eines ?:-Ausdruckes" + +#~ msgid "ISO C89 forbids compound literals" +#~ msgstr "ISO-C89 verbietet zusammengesetzte Literale" + +#~ msgid "ISO C forbids braced-groups within expressions" +#~ msgstr "ISO-C verbietet geklammerte Gruppen innerhalb von Ausdrücken" + +#~ msgid "first argument to __builtin_choose_expr not a constant" +#~ msgstr "das erste Argument für __builtin_choose_expr ist keine Konstante" + +#~ msgid "traditional C rejects ISO C style function definitions" +#~ msgstr "traditionelles C weist Funktionsdefinitionen im ISO-C-Stil zurück" + +#~ msgid "old-style parameter declaration" +#~ msgstr "Parameterdeklaration alten Stils" + +#~ msgid "`%s' is not at beginning of declaration" +#~ msgstr "»%s« ist nicht am Beginn einer Deklaration" + +#~ msgid "`typeof' applied to a bit-field" +#~ msgstr "»typeof« auf ein Bitfeld angewandt" + +#~ msgid "ISO C forbids empty initializer braces" +#~ msgstr "ISO-C verbietet leere Initialisierungsklammern" + +#~ msgid "ISO C89 forbids specifying subobject to initialize" +#~ msgstr "ISO-C89 verbietet die Angabe von zu initialisierenden Unterobjekten" + +#~ msgid "obsolete use of designated initializer without `='" +#~ msgstr "veraltete Verwendung einer bestimmten Initialisierung ohne »=«" + +#~ msgid "obsolete use of designated initializer with `:'" +#~ msgstr "veraltete Verwendung einer bestimmten Initialisierung mit »:«" + +#~ msgid "ISO C forbids specifying range of elements to initialize" +#~ msgstr "ISO-C verbietet die Angabe eines zu initialisierenden Wertebereiches" + +#~ msgid "ISO C forbids nested functions" +#~ msgstr "ISO-C verbietet verschachtelte Funktionen" + +#~ msgid "ISO C forbids forward references to `enum' types" +#~ msgstr "ISO-C verbietet Vorwärts-Referenzen auf »enum«-Typen" + +#~ msgid "comma at end of enumerator list" +#~ msgstr "Komma am Ende der Aufzählungsliste" + +#~ msgid "no semicolon at end of struct or union" +#~ msgstr "kein Semikolon am Ende von »struct« oder »union«" + +#~ msgid "extra semicolon in struct or union specified" +#~ msgstr "zusätzliches Semikolon in »struct« oder »union« angegeben" + +#~ msgid "ISO C doesn't support unnamed structs/unions" +#~ msgstr "ISO-C unterstützt keine namenlosen structs/unions" + +#~ msgid "ISO C forbids member declarations with no members" +#~ msgstr "ISO-C verbietet Elementdeklarationen ohne Elemente" + +#~ msgid "label at end of compound statement" +#~ msgstr "Marke am Ende einer Verbundanweisung" + +#~ msgid "ISO C90 forbids mixed declarations and code" +#~ msgstr "ISO-C90 verbietet gemischte Deklarationen und Code" + +#~ msgid "ISO C forbids label declarations" +#~ msgstr "ISO-C verbietet Markendeklarationen" + +#~ msgid "braced-group within expression allowed only inside a function" +#~ msgstr "geklammerte Gruppe innerhalb eines Ausdrucks nur in Funktion erlaubt" + +#~ msgid "empty body in an else-statement" +#~ msgstr "leerer Körper in einer else-Anweisung" + +#~ msgid "%Hempty body in an if-statement" +#~ msgstr "%Hleerer Körper in einer if-Anweisung" + +#~ msgid "break statement not within loop or switch" +#~ msgstr "break-Anweisung nicht innerhalb einer Schleife oder »switch«" + +#~ msgid "continue statement not within a loop" +#~ msgstr "continue-Anweisung nicht innerhalb einer Schleife" + +#~ msgid "ISO C forbids `goto *expr;'" +#~ msgstr "ISO-C verbietet »goto *expr;«" + +#~ msgid "ISO C requires a named argument before `...'" +#~ msgstr "ISO-C erfordert ein benanntes Argument vor »...«" + +#~ msgid "`...' in old-style identifier list" +#~ msgstr "»...« in einer Bezeichnerliste alten Stils" + +#~ msgid "syntax error; also virtual memory exhausted" +#~ msgstr "Syntaxfehler; auch virtueller Speicher verbraucht" + +#~ msgid "parser stack overflow" +#~ msgstr "Parser-Keller-Überlauf" + +#~ msgid "syntax error at '%s' token" +#~ msgstr "Syntaxfehler beim Token »%s«" + +#~ msgid "can't create precompiled header %s: %m" +#~ msgstr "der vorkompilierte Header »%s« kann nicht erzeugt werden: %m" + +#~ msgid "can't write to %s: %m" +#~ msgstr "in %s kann nicht geschrieben werden: %m" + +#~ msgid "`%s' is not a valid output file" +#~ msgstr "»%s« ist keine gültige Ausgabedatei" + +#~ msgid "can't write %s: %m" +#~ msgstr "%s kann nicht geschrieben werden: %m" + +#~ msgid "can't seek in %s: %m" +#~ msgstr "in %s kann nicht positioniert werden: %m" + +#~ msgid "can't read %s: %m" +#~ msgstr "%s kann nicht gelesen werden: %m" + +#~ msgid "%s: not compatible with this GCC version" +#~ msgstr "%s: nicht kompatibel mit dieser Version des GCC" + +#~ msgid "%s: not for %s" +#~ msgstr "%s: nicht für %s" + +#~ msgid "%s: not a PCH file" +#~ msgstr "%s: keine PCH-Datei" + +#~ msgid "%s: created on host `%.*s', but used on host `%s'" +#~ msgstr "%s: auf Rechner »%.*s« erzeugt, aber auf Rechner »%s« verwendet" + +#~ msgid "%s: created for target `%.*s', but used for target `%s'" +#~ msgstr "%s: für das Ziel »%.*s« erzeugt, aber für das Ziel »%s« verwendet" + +#~ msgid "%s: created by version `%.*s', but this is version `%s'" +#~ msgstr "%s: durch Version »%.*s« erzeugt, aber dies ist Version »%s«" + +#~ msgid "%s: created with -g%s, but used with -g%s" +#~ msgstr "%s: mit -g%s erzeugt, aber mit -g%s verwendet" + +#~ msgid "%s: had text segment at different address" +#~ msgstr "%s: Textsegment trat an anderer Adresse auf" + +#~ msgid "calling fdopen" +#~ msgstr "fdopen wird aufgerufen" + +#~ msgid "reading" +#~ msgstr "Lesen" + +#~ msgid "#pragma pack (pop) encountered without matching #pragma pack (push, )" +#~ msgstr "#pragma pack (pop) gefunden ohne passendes #pragma pack (push, )" + +#~ msgid "#pragma pack(pop, %s) encountered without matching #pragma pack(push, %s, )" +#~ msgstr "#pragma pack(pop, %s) gefunden ohne passendes #pragma pack(push, %s, )" + +#~ msgid "#pragma pack(push[, id], ) is not supported on this target" +#~ msgstr "#pragma pack(push[, id], ) wird von diesem Ziel nicht unterstützt" + +#~ msgid "#pragma pack(pop[, id], ) is not supported on this target" +#~ msgstr "#pragma pack(pop[, id], ) wird von diesem Ziel nicht unterstützt" + +#~ msgid "missing '(' after '#pragma pack' - ignored" +#~ msgstr "fehlendes »(« hinter »#pragma pack« - ignoriert" + +#~ msgid "malformed '#pragma pack' - ignored" +#~ msgstr "falsch geformtes »#pragma pack« - ignoriert" + +#~ msgid "malformed '#pragma pack(push[, id], )' - ignored" +#~ msgstr "falsch geformtes »#pragma pack(push[, id], )« - ignoriert" + +#~ msgid "malformed '#pragma pack(pop[, id])' - ignored" +#~ msgstr "falsch geformtes »#pragma pack(pop[, id])« - ignoriert" + +#~ msgid "unknown action '%s' for '#pragma pack' - ignored" +#~ msgstr "unbekannte Aktion »%s« für »#pragma pack« - ignoriert" + +#~ msgid "junk at end of '#pragma pack'" +#~ msgstr "Ausschuss am Ende von »#pragma pack«" + +#~ msgid "alignment must be a small power of two, not %d" +#~ msgstr "Ausrichtung muss eine kleine Zweierpotenz sein, nicht %d" + +#~ msgid "%Japplying #pragma weak '%D' after first use results in unspecified behavior" +#~ msgstr "%JAnwendung von #pragma weak »%D« nach erster Benutzung führt zu nicht spezifiziertem Verhalten" + +#~ msgid "malformed #pragma weak, ignored" +#~ msgstr "falsch geformtes #pragma weak, ignoriert" + +#~ msgid "junk at end of #pragma weak" +#~ msgstr "Ausschuss am Ende von #pragma weak" + +#~ msgid "malformed #pragma redefine_extname, ignored" +#~ msgstr "falsch geformtes #pragma redefine_extname, ignoriert" + +#~ msgid "junk at end of #pragma redefine_extname" +#~ msgstr "Ausschuss am Ende von #pragma redefine_extname" + +#~ msgid "#pragma redefine_extname conflicts with declaration" +#~ msgstr "#pragma redefine_extname steht in Konflikt mit Deklaration" + +#~ msgid "malformed #pragma extern_prefix, ignored" +#~ msgstr "falsch geformtes #pragma extern_prefix, ignoriert" + +#~ msgid "junk at end of #pragma extern_prefix" +#~ msgstr "Ausschuss am Ende von #pragma extern_prefix" + +#~ msgid "asm declaration conflicts with previous rename" +#~ msgstr "asm-Deklaration steht in Konflikt mit vorheriger Umbenennung" + +#~ msgid "destructor needed for `%D'" +#~ msgstr "Destruktor für »%D« benötigt" + +#~ msgid "where case label appears here" +#~ msgstr "wobei die case-Marke hier auftritt" + +#~ msgid "(enclose actions of previous case statements requiring destructors in their own scope.)" +#~ msgstr "(schließen Sie Aktionen vorheriger case-Anweisungen, die Destruktoren benötigen, in ihrem eigenen Gültigkeitsbereich ein)" + +#~ msgid "%s qualifier ignored on asm" +#~ msgstr "%s-Qualifizierer für asm ignoriert" + +#~ msgid "will never be executed" +#~ msgstr "wird niemals ausgeführt" + +#~ msgid "`%s' has an incomplete type" +#~ msgstr "»%s« hat unvollständigen Typ" + +#~ msgid "invalid use of void expression" +#~ msgstr "falsche Benutzung eines void-Ausdruckes" + +#~ msgid "invalid use of flexible array member" +#~ msgstr "falsche Benutzung eines flexiblen Feldelements" + +#~ msgid "invalid use of array with unspecified bounds" +#~ msgstr "falsche Benutzung eines Feldes mit unbekannten Grenzen" + +#~ msgid "invalid use of undefined type `%s %s'" +#~ msgstr "falsche Benutzung des undefinierten Typs »%s %s«" + +#~ msgid "invalid use of incomplete typedef `%s'" +#~ msgstr "falsche Benutzung des unvollständigen typedef »%s«" + +#~ msgid "function types not truly compatible in ISO C" +#~ msgstr "Funktionstypen nicht wirklich kompatibel in ISO-C" + +#~ msgid "types are not quite compatible" +#~ msgstr "Typen nicht sehr kompatibel" + +#~ msgid "function return types not compatible due to `volatile'" +#~ msgstr "Funktionsrückgabetypen nicht kompatibel wegen »volatile«" + +#~ msgid "arithmetic on pointer to an incomplete type" +#~ msgstr "Arithmetik mit Zeiger auf unvollständigen Typen" + +#~ msgid "%s has no member named `%s'" +#~ msgstr "%s hat kein Element namens »%s«" + +#~ msgid "request for member `%s' in something not a structure or union" +#~ msgstr "Anfrage nach Element »%s« in etwas, was keine Struktur oder Variante ist" + +#~ msgid "dereferencing pointer to incomplete type" +#~ msgstr "Dereferenzierung eines Zeigers auf unvollständigen Typen" + +#~ msgid "dereferencing `void *' pointer" +#~ msgstr "Dereferenzierung eines »void *«-Zeigers" + +#~ msgid "invalid type argument of `%s'" +#~ msgstr "falsches Typ-Argument von »%s«" + +#~ msgid "subscript missing in array reference" +#~ msgstr "Index fehlt in Feldreferenz" + +#~ msgid "array subscript has type `char'" +#~ msgstr "Feldindex hat Typ »char«" + +#~ msgid "array subscript is not an integer" +#~ msgstr "Feldindex ist keine Ganzzahl" + +#~ msgid "ISO C forbids subscripting `register' array" +#~ msgstr "ISO-C verbietet, ein »register«-Array zu indizieren" + +#~ msgid "ISO C90 forbids subscripting non-lvalue array" +#~ msgstr "ISO-C90 verbietet, ein Nicht-L-Wert-Feld zu indizieren" + +#~ msgid "subscript has type `char'" +#~ msgstr "Index hat Typ »char«" + +#~ msgid "subscripted value is neither array nor pointer" +#~ msgstr "indizierter Wert ist weder ein Feld noch ein Zeiger" + +#~ msgid "local declaration of `%s' hides instance variable" +#~ msgstr "lokale Deklaration von »%s« verdeckt Instanzvariable" + +#~ msgid "called object is not a function" +#~ msgstr "gerufenes Objekt ist keine Funktion" + +#~ msgid "function called through a non-compatible type" +#~ msgstr "Funktion über nicht kompatiblen Typen aufgerufen" + +#~ msgid "too many arguments to function" +#~ msgstr "zu viele Argumente für Funktion" + +#~ msgid "type of formal parameter %d is incomplete" +#~ msgstr "Typ des formalen Parameters %d ist unvollständig" + +#~ msgid "%s as integer rather than floating due to prototype" +#~ msgstr "%s als Ganzzahl statt Gleitkomma aufgrund des Prototyps" + +#~ msgid "%s as integer rather than complex due to prototype" +#~ msgstr "%s als Ganzzahl statt komplex aufgrund des Prototyps" + +#~ msgid "%s as complex rather than floating due to prototype" +#~ msgstr "%s als komplex statt Gleitkomma aufgrund des Prototyps" + +#~ msgid "%s as floating rather than integer due to prototype" +#~ msgstr "%s als Gleitkomma statt Ganzzahl aufgrund des Prototyps" + +#~ msgid "%s as complex rather than integer due to prototype" +#~ msgstr "%s als komplex statt Ganzzahl aufgrund des Prototyps" + +#~ msgid "%s as floating rather than complex due to prototype" +#~ msgstr "%s als Gleitkomma statt komplex aufgrund des Prototyps" + +#~ msgid "%s as `float' rather than `double' due to prototype" +#~ msgstr "%s als »float« statt »double« aufgrund des Prototyps" + +#~ msgid "%s with different width due to prototype" +#~ msgstr "%s mit anderer Breite aufgrund des Prototyps" + +#~ msgid "%s as unsigned due to prototype" +#~ msgstr "%s als vorzeichenlos aufgrund des Prototyps" + +#~ msgid "%s as signed due to prototype" +#~ msgstr "%s als vorzeichenbehaftet aufgrund des Prototyps" + +#~ msgid "too few arguments to function" +#~ msgstr "zu wenige Argumente für Funktion" + +#~ msgid "suggest parentheses around + or - inside shift" +#~ msgstr "Klammern um + oder - innerhalb von Schiebeoperation empfohlen" + +#~ msgid "suggest parentheses around && within ||" +#~ msgstr "Klammern um && innerhalb von || empfohlen" + +#~ msgid "suggest parentheses around arithmetic in operand of |" +#~ msgstr "Klammern um Arithmetik in Operand von | empfohlen" + +#~ msgid "suggest parentheses around comparison in operand of |" +#~ msgstr "Klammern um Vergleich in Operand von | empfohlen" + +#~ msgid "suggest parentheses around arithmetic in operand of ^" +#~ msgstr "Klammern um Arithmetik in Operand von ^ empfohlen" + +#~ msgid "suggest parentheses around comparison in operand of ^" +#~ msgstr "Klammern um Vergleich in Operand von ^ empfohlen" + +#~ msgid "suggest parentheses around + or - in operand of &" +#~ msgstr "Klammern um + oder - in Operand von & empfohlen" + +#~ msgid "suggest parentheses around comparison in operand of &" +#~ msgstr "Klammern um Vergleich in Operand von & empfohlen" + +#~ msgid "comparisons like X<=Y<=Z do not have their mathematical meaning" +#~ msgstr "Vergleiche wie X<=Y<=Z haben nicht ihre mathematische Bedeutung" + +#~ msgid "pointer of type `void *' used in subtraction" +#~ msgstr "Zeiger des Typs »void *« in Subtraktion verwendet" + +#~ msgid "pointer to a function used in subtraction" +#~ msgstr "Zeiger auf eine Funktion in Subtraktion verwendet" + +#~ msgid "wrong type argument to unary plus" +#~ msgstr "Argument falschen Typs für unäres Plus" + +#~ msgid "wrong type argument to unary minus" +#~ msgstr "Argument falschen Typs für unäres Minus" + +#~ msgid "ISO C does not support `~' for complex conjugation" +#~ msgstr "ISO-C unterstützt nicht »~« für komplexe Konjugation" + +#~ msgid "wrong type argument to bit-complement" +#~ msgstr "Argument falschen Typs für Bit-Komplement" + +#~ msgid "wrong type argument to abs" +#~ msgstr "Argument falschen Typs für abs" + +#~ msgid "wrong type argument to conjugation" +#~ msgstr "Argument falschen Typs für Konjugation" + +#~ msgid "wrong type argument to unary exclamation mark" +#~ msgstr "Argument falschen Typs für unäres Ausrufungszeichen" + +#~ msgid "ISO C does not support `++' and `--' on complex types" +#~ msgstr "ISO-C unterstützt kein »++« und »--« für komplexe Typen" + +#~ msgid "wrong type argument to increment" +#~ msgstr "Argument falschen Typs für Inkrementierung" + +#~ msgid "wrong type argument to decrement" +#~ msgstr "Argument falschen Typs für Dekrementierung" + +#~ msgid "increment of pointer to unknown structure" +#~ msgstr "Erhöhung eines Zeigers auf unbekannte Struktur" + +#~ msgid "decrement of pointer to unknown structure" +#~ msgstr "Verminderung eines Zeigers auf unbekannte Struktur" + +#~ msgid "invalid lvalue in unary `&'" +#~ msgstr "ungültiger L-Wert in unärem »&«" + +#~ msgid "attempt to take address of bit-field structure member `%s'" +#~ msgstr "Versuch, die Adresse des Bitfeld-Element »%s« einer Struktur zu verwenden" + +#~ msgid "use of conditional expressions as lvalues is deprecated" +#~ msgstr "die Verwendung bedingter Ausdrücke als L-Werte ist veraltet" + +#~ msgid "use of compound expressions as lvalues is deprecated" +#~ msgstr "Verwendung zusammengesetzter Ausdrücke als L-Werte ist veraltet" + +#~ msgid "use of cast expressions as lvalues is deprecated" +#~ msgstr "die Verwendung von cast-Ausdrücken als L-Werte ist veraltet" + +#~ msgid "%s of read-only member `%s'" +#~ msgstr "%s des schreibgeschützten Elementes »%s«" + +#~ msgid "%s of read-only variable `%s'" +#~ msgstr "%s der schreibgeschützten Variable »%s«" + +#~ msgid "%s of read-only location" +#~ msgstr "%s der schreibgeschützten Speicherstelle" + +#~ msgid "cannot take address of bit-field `%s'" +#~ msgstr "die Adresse des Bit-Feldes »%s« kann nicht ermittelt werden" + +#~ msgid "global register variable `%s' used in nested function" +#~ msgstr "globale Register-Variable »%s« in verschachtelter Funktion verwendet" + +#~ msgid "register variable `%s' used in nested function" +#~ msgstr "Register-Variable »%s« in verschachtelter Funktion verwendet" + +#~ msgid "address of global register variable `%s' requested" +#~ msgstr "Adresse der globalen Variable »%s« angefordert" + +#~ msgid "cannot put object with volatile field into register" +#~ msgstr "kann kein Objekt mit volatile-Feld in Register laden" + +#~ msgid "address of register variable `%s' requested" +#~ msgstr "Adresse der Register-Variablen »%s« angefordert" + +#~ msgid "signed and unsigned type in conditional expression" +#~ msgstr "Vorzeichenloser und -behafteter Typ in bedingtem Ausdruck" + +#~ msgid "ISO C forbids conditional expr with only one void side" +#~ msgstr "ISO-C verbietet bedingten Ausdruck mit nur einer void-Seite" + +#~ msgid "ISO C forbids conditional expr between `void *' and function pointer" +#~ msgstr "ISO-C verbietet bedingten Ausdruck zwischen »void *« und Funktionszeiger" + +#~ msgid "pointer type mismatch in conditional expression" +#~ msgstr "Zeigertyp passt nicht in bedingtem Ausdruck" + +#~ msgid "pointer/integer type mismatch in conditional expression" +#~ msgstr "Zeiger-/Ganzzahltyp passt nicht in bedingtem Ausdruck" + +#~ msgid "type mismatch in conditional expression" +#~ msgstr "Typ passt nicht in bedingtem Ausdruck" + +#~ msgid "left-hand operand of comma expression has no effect" +#~ msgstr "linker Operand des Komma-Ausdrucks hat keinen Effekt" + +#~ msgid "cast specifies array type" +#~ msgstr "Typkonvertierung gibt Feldtyp an" + +#~ msgid "cast specifies function type" +#~ msgstr "Typkonvertierung gibt Funktionstyp an" + +#~ msgid "ISO C forbids casting nonscalar to the same type" +#~ msgstr "ISO-C verbietet Typkonvertierung von Nicht-Skalar auf selben Typen" + +#~ msgid "ISO C forbids casts to union type" +#~ msgstr "ISO-C verbietet Typkonvertierung auf union-Typ" + +#~ msgid "cast to union type from type not present in union" +#~ msgstr "Typkonvertierung in union-Typ von nicht in union vorhandenem Typen" + +#~ msgid "cast adds new qualifiers to function type" +#~ msgstr "Typkonvertierung fügt neue Typqualifizierer zu Funktionstypen hinzu" + +#~ msgid "cast discards qualifiers from pointer target type" +#~ msgstr "Typkonvertierung streicht Qualifizierer von Zeiger-Zieltyp" + +#~ msgid "cast increases required alignment of target type" +#~ msgstr "Typkonvertierung erfordert Ausrichtung des Zieltyps" + +#~ msgid "cast from pointer to integer of different size" +#~ msgstr "Typkonvertierung von Zeiger auf Ganzzahl anderer Breite" + +#~ msgid "cast does not match function type" +#~ msgstr "Typkonvertierung passt nicht zum Funktionstypen" + +#~ msgid "cast to pointer from integer of different size" +#~ msgstr "Typkonvertierung in Zeiger von Ganzzahl anderer Breite" + +#~ msgid "type-punning to incomplete type might break strict-aliasing rules" +#~ msgstr "Type-Punning auf unvollständigen Typen kann strict-aliasing-Regeln verletzen" + +#~ msgid "dereferencing type-punned pointer will break strict-aliasing rules" +#~ msgstr "Dereferenzierung eines Type-Pun-Zeigers verletzt strict-aliasing-Regeln" + +#~ msgid "ISO C forbids conversion of function pointer to object pointer type" +#~ msgstr "ISO-C verbietet Konvertierung von Funktionszeigern in Objektzeigertyp" + +#~ msgid "ISO C forbids conversion of object pointer to function pointer type" +#~ msgstr "ISO-C verbietet Konvertierung von Objektzeigertypen in Funktionszeigertyp" + +#~ msgid "invalid lvalue in assignment" +#~ msgstr "ungültiger L-Wert in Zuweisung" + +#~ msgid "assignment" +#~ msgstr "Zuweisung" + +#~ msgid "cannot pass rvalue to reference parameter" +#~ msgstr "kann R-Wert nicht an Referenzparameter übergeben" + +#~ msgid "%s makes qualified function pointer from unqualified" +#~ msgstr "%s erzeugt aus unqualifiziertem einen qualifizierten Funktionszeiger" + +#~ msgid "%s discards qualifiers from pointer target type" +#~ msgstr "%s streicht Qualifizierer von Zeiger-Zieltypen" + +#~ msgid "ISO C prohibits argument conversion to union type" +#~ msgstr "ISO-C verbietet Argumentkonvertierung in union-Typ" + +#~ msgid "ISO C forbids %s between function pointer and `void *'" +#~ msgstr "ISO-C verbietet %s zwischen Funktionszeiger und »void *«" + +#~ msgid "pointer targets in %s differ in signedness" +#~ msgstr "Zeigerziele in %s unterscheiden sich im Vorzeichenbesitz" + +#~ msgid "%s from incompatible pointer type" +#~ msgstr "%s von inkompatiblem Zeigertyp" + +#~ msgid "invalid use of non-lvalue array" +#~ msgstr "ungültige Verwendung eines Nicht-L-Wert-Feldes" + +#~ msgid "%s makes pointer from integer without a cast" +#~ msgstr "%s erzeugt Zeiger von Ganzzahl ohne Typkonvertierung" + +#~ msgid "%s makes integer from pointer without a cast" +#~ msgstr "%s erzeugt Ganzzahl von Zeiger ohne Typkonvertierung" + +#~ msgid "incompatible type for argument %d of `%s'" +#~ msgstr "inkompatibler Typ für Argument %d von »%s«" + +#~ msgid "incompatible type for argument %d of indirect function call" +#~ msgstr "inkompatibler Typ für Argument %d eines indirekten Funktionsaufrufes" + +#~ msgid "incompatible types in %s" +#~ msgstr "inkompatible Typen in %s" + +#~ msgid "passing arg of `%s'" +#~ msgstr "Verarbeiten des Argumentes von »%s«" + +#~ msgid "passing arg of pointer to function" +#~ msgstr "Verarbeiten des Zeigerargumentes an Funktion" + +#~ msgid "passing arg %d of `%s'" +#~ msgstr "Verarbeiten des Argumentes %d von »%s«" + +#~ msgid "passing arg %d of pointer to function" +#~ msgstr "Verarbeiten des Argumentes %d von Zeiger auf Funktion" + +#~ msgid "traditional C rejects automatic aggregate initialization" +#~ msgstr "traditionelles C lehnt automatische Gesamt-Initialisierung ab" + +#~ msgid "(near initialization for `%s')" +#~ msgstr "(nahe der Initialisierung für »%s«)" + +#~ msgid "char-array initialized from wide string" +#~ msgstr "char-Feld mit wide-Zeichenkette initialisiert" + +#~ msgid "int-array initialized from non-wide string" +#~ msgstr "int-Feld mit Nicht-wide-Zeichenkette initialisiert" + +#~ msgid "initializer-string for array of chars is too long" +#~ msgstr "Initialisierungs-Zeichenkette für char-Feld ist zu lang" + +#~ msgid "array initialized from non-constant array expression" +#~ msgstr "Feld mit nicht konstantem Feldausdruck initialisiert" + +#~ msgid "initializer element is not constant" +#~ msgstr "Initialisierungselement ist nicht konstant" + +#~ msgid "initialization" +#~ msgstr "Initialisierung" + +#~ msgid "initializer element is not computable at load time" +#~ msgstr "Initialisierungs-Element ist zur Lade-Zeit nicht berechenbar" + +#~ msgid "invalid initializer" +#~ msgstr "ungültige Initialisierung" + +#~ msgid "opaque vector types cannot be initialized" +#~ msgstr "opake Vektortypen können nicht initialisiert werden" + +#~ msgid "extra brace group at end of initializer" +#~ msgstr "zusätzliche geschweifte Klammern am Ende der Initialisierung" + +#~ msgid "missing braces around initializer" +#~ msgstr "geschweifte Klammern fehlen um Initialisierung" + +#~ msgid "braces around scalar initializer" +#~ msgstr "geschweifte Klammern um Skalar-Initialisierung" + +#~ msgid "initialization of flexible array member in a nested context" +#~ msgstr "Initialisierung eines flexiblen Feld-Elements in geschachteltem Kontext" + +#~ msgid "initialization of a flexible array member" +#~ msgstr "Initialisierung eines flexiblen Feld-Elements" + +#~ msgid "missing initializer" +#~ msgstr "fehlende Initialisierung" + +#~ msgid "empty scalar initializer" +#~ msgstr "leere Skalar-Initialisierung" + +#~ msgid "extra elements in scalar initializer" +#~ msgstr "zusätzliche Elemente in Skalar-Initialisierung" + +#~ msgid "initialization designators may not nest" +#~ msgstr "Initialisierungs-Bezeichner dürfen nicht geschachtelt werden" + +#~ msgid "array index in non-array initializer" +#~ msgstr "Feldindex in Nicht-Feld-Initialisierung" + +#~ msgid "field name not in record or union initializer" +#~ msgstr "Feldname nicht in Datensatz- oder union-Initialisierung" + +#~ msgid "nonconstant array index in initializer" +#~ msgstr "nichtkonstanter Feldindex in Initialisierung" + +#~ msgid "array index in initializer exceeds array bounds" +#~ msgstr "Feldindex in Initialisierung überschreitet Feldgrenzen" + +#~ msgid "empty index range in initializer" +#~ msgstr "leerer Indexbereich in Initialisierung" + +#~ msgid "array index range in initializer exceeds array bounds" +#~ msgstr "Feldindexbereich in Initialisierung überschreitet Feldgrenzen" + +#~ msgid "unknown field `%s' specified in initializer" +#~ msgstr "unbekanntes Feld »%s« in Initialisierung angegeben" + +#~ msgid "initialized field with side-effects overwritten" +#~ msgstr "initialisiertes Feld mit Seiteneffekten überschrieben" + +#~ msgid "excess elements in char array initializer" +#~ msgstr "Elementüberschreitung in char-Feld-Initialisierung" + +#~ msgid "excess elements in struct initializer" +#~ msgstr "Elementüberschreitung in struct-Initialisierung" + +#~ msgid "non-static initialization of a flexible array member" +#~ msgstr "nicht-statische Initialisierung eines flexiblen Feldelements" + +#~ msgid "excess elements in union initializer" +#~ msgstr "Elementüberschreitung in union-Initialisierung" + +#~ msgid "traditional C rejects initialization of unions" +#~ msgstr "traditionelles C lehnt Initialisierung von unions ab" + +#~ msgid "excess elements in array initializer" +#~ msgstr "Elementüberschreitung in Feldinitialisierung" + +#~ msgid "excess elements in vector initializer" +#~ msgstr "Elementüberschreitung in Vektorinitialisierung" + +#~ msgid "excess elements in scalar initializer" +#~ msgstr "Elementüberschreitung in Skalar-Initialisierung" + +#~ msgid "asm template is not a string constant" +#~ msgstr "asm-Template ist keine Zeichenkettenkonstante" + +#~ msgid "invalid lvalue in asm statement" +#~ msgstr "ungültiger L-Wert in asm-Anweisung" + +#~ msgid "modification by `asm'" +#~ msgstr "Modifizierung durch »asm«" + +#~ msgid "function declared `noreturn' has a `return' statement" +#~ msgstr "als »noreturn« deklarierte Funktion hat »return«-Anweisung" + +#~ msgid "`return' with no value, in function returning non-void" +#~ msgstr "»return« ohne Wert in nicht void zurückgebender Funktion" + +#~ msgid "`return' with a value, in function returning void" +#~ msgstr "»return« mit Wert in void zurückgebender Funktion" + +#~ msgid "return" +#~ msgstr "return" + +#~ msgid "function returns address of local variable" +#~ msgstr "Funktion liefert Adresse einer lokalen Variablen zurück" + +#~ msgid "switch quantity not an integer" +#~ msgstr "switch-Größe keine Ganzzahl" + +#~ msgid "`long' switch expression not converted to `int' in ISO C" +#~ msgstr "»long« switch-Ausdruck nicht nach »int« konvertiert in ISO C" + +#~ msgid "case label not within a switch statement" +#~ msgstr "case-Marke nicht innerhalb einer switch-Anweisung" + +#~ msgid "`default' label not within a switch statement" +#~ msgstr "»default«-Marke nicht innerhalb einer switch-Anweisung" + +#~ msgid "division by zero" +#~ msgstr "Teilung durch Null" + +#~ msgid "right shift count is negative" +#~ msgstr "Rechts-Schiebe-Weite ist negativ" + +#~ msgid "right shift count >= width of type" +#~ msgstr "Rechts-Schiebe-Weite >= Breite des Typs" + +#~ msgid "left shift count is negative" +#~ msgstr "Links-Schiebe-Weite ist negativ" + +#~ msgid "left shift count >= width of type" +#~ msgstr "Links-Schiebe-Weite >= Breite des Typs" + +#~ msgid "shift count is negative" +#~ msgstr "Schiebeweite ist negativ" + +#~ msgid "shift count >= width of type" +#~ msgstr "Schiebeweite >= Breite des Typs" + +#~ msgid "comparing floating point with == or != is unsafe" +#~ msgstr "Vergleich von Gleitkomma mit == oder != ist unsicher" + +#~ msgid "ISO C forbids comparison of `void *' with function pointer" +#~ msgstr "ISO-C verbietet Vergleich von »void *« mit Funktionszeiger" + +#~ msgid "comparison of distinct pointer types lacks a cast" +#~ msgstr "in Vergleich verschiedener Zeigertypen fehlt Typkonvertierung" + +#~ msgid "comparison between pointer and integer" +#~ msgstr "Vergleich zwischen Zeiger und Ganzzahl" + +#~ msgid "ISO C forbids ordered comparisons of pointers to functions" +#~ msgstr "ISO-C verbietet geordnete Vergleiche zwischen Zeigern auf Funktionen" + +#~ msgid "comparison of complete and incomplete pointers" +#~ msgstr "Vergleich von vollständigen und unvollständigen Zeigern" + +#~ msgid "ordered comparison of pointer with integer zero" +#~ msgstr "geordneter Vergleich von Zeiger mit Ganzzahlnull" + +#~ msgid "unordered comparison on non-floating point argument" +#~ msgstr "ungeordneter Vergleich mit Nicht-Gleitkomma-Argument" + +#~ msgid "comparison between signed and unsigned" +#~ msgstr "Vergleich zwischen vorzeichenbehaftet und vorzeichenlos" + +#~ msgid "comparison of promoted ~unsigned with constant" +#~ msgstr "Vergleich von weitergegebenem ~unsigned mit Konstante" + +#~ msgid "comparison of promoted ~unsigned with unsigned" +#~ msgstr "Vergleich von weitergegebenem ~unsigned mit unsigned" + +#~ msgid "%Jinlining failed in call to '%F'" +#~ msgstr "%J»inline« beim Aufruf von »%F« gescheitert" + +#~ msgid "called from here" +#~ msgstr "von hier aufgerufen" + +#~ msgid "%Jcan't inline call to '%F'" +#~ msgstr "%JAufruf von »%F« kann nicht »inline« erfolgen" + +#~ msgid "ignoring return value of `%D', declared with attribute warn_unused_result" +#~ msgstr "Rückgabewert von »%D«, das mit dem Attribut warn_unused_result definiert wurde, wird ignoriert" + +#~ msgid "ignoring return value of function declared with attribute warn_unused_result" +#~ msgstr "Rückgabewert der mit dem Attribut warn_unused_result definierten Funktion wird ignoriert" + +#~ msgid "function call has aggregate value" +#~ msgstr "Funktionsaufruf hat zusammengesetzten Wert" + +#~ msgid "bb %d on wrong place" +#~ msgstr "bb %d an falscher Stelle" + +#~ msgid "prev_bb of %d should be %d, not %d" +#~ msgstr "prev_bb von %d sollte %d sein, nicht %d" + +#~ msgid "verify_flow_info: Wrong count of block %i %i" +#~ msgstr "verify_flow_info: Falsche Blockzahl %i %i" + +#~ msgid "verify_flow_info: Wrong frequency of block %i %i" +#~ msgstr "verify_flow_info: Falsche Blockfrequenz %i %i" + +#~ msgid "verify_flow_info: Duplicate edge %i->%i" +#~ msgstr "verify_flow_info: Doppelte Kante %i->%i" + +#~ msgid "verify_flow_info: Wrong probability of edge %i->%i %i" +#~ msgstr "verify_flow_info: Falsche Wahrscheinlichkeit der Kante %i->%i %i" + +#~ msgid "verify_flow_info: Wrong count of edge %i->%i %i" +#~ msgstr "verify_flow_info: Falsche Kantenzahl %i->%i %i" + +#~ msgid "verify_flow_info: Basic block %d succ edge is corrupted" +#~ msgstr "verify_flow_info: Nachfolgekante des Basis-Blocks %d ist beschädigt" + +#~ msgid "Wrong amount of branch edges after unconditional jump %i" +#~ msgstr "Falsche Summe der Zweig-Kanten nach unbedingtem Sprung %i" + +#~ msgid "basic block %d pred edge is corrupted" +#~ msgstr "Vorgänger des Basis-Blocks %d ist beschädigt" + +#~ msgid "basic block %i edge lists are corrupted" +#~ msgstr "Kantenlisten des Basis-Blockes %i sind beschädigt" + +#~ msgid "verify_flow_info failed" +#~ msgstr "verify_flow_info gescheitert" + +#~ msgid "Size of loop %d should be %d, not %d." +#~ msgstr "Größe der Schleife %d sollte %d sein, nicht %d" + +#~ msgid "Bb %d do not belong to loop %d." +#~ msgstr "Bb %d gehört nicht zur Schleife %d." + +#~ msgid "Loop %d's header does not have exactly 2 entries." +#~ msgstr "Kopf der Schleife %d hat nicht genau 2 Einträge." + +#~ msgid "Loop %d's latch does not have exactly 1 successor." +#~ msgstr "Falle der Schleife %d hat nicht genau einen Nachfolger." + +#~ msgid "Loop %d's latch does not have header as successor." +#~ msgstr "Falle der Schleife %d hat nicht den Kopf als Nachfolger." + +#~ msgid "Loop %d's latch does not belong directly to it." +#~ msgstr "Falle der Schleife %d gehört nicht direkt zu ihr." + +#~ msgid "Loop %d's header does not belong directly to it." +#~ msgstr "Kopf der Schleife %d gehört nicht direkt zu ihr." + +#~ msgid "Loop %d's latch is marked as part of irreducible region." +#~ msgstr "Falle der Schleife %d ist als Teil einer irreduziblen Region markiert." + +#~ msgid "Basic block %d should be marked irreducible." +#~ msgstr "Basisblock %d sollte als irreduzibel markiert werden." + +#~ msgid "Basic block %d should not be marked irreducible." +#~ msgstr "Basisblock %d sollte nicht als irreduzibel markiert werden." + +#~ msgid "Edge from %d to %d should be marked irreducible." +#~ msgstr "Kante von %d nach %d sollte als irreduzibel markiert werden." + +#~ msgid "Edge from %d to %d should not be marked irreducible." +#~ msgstr "Kante von %d nach %d sollte nicht als irreduzibel markiert werden." + +#~ msgid "end insn %d for block %d not found in the insn stream" +#~ msgstr "Ende-insn %d für Block %d nicht im insn-Stream gefunden" + +#~ msgid "insn %d is in multiple basic blocks (%d and %d)" +#~ msgstr "insn %d ist in mehreren Basisblöcken (%d und %d)" + +#~ msgid "head insn %d for block %d not found in the insn stream" +#~ msgstr "Kopf-insn %d für Block %d nicht im insn-Stream gefunden" + +#~ msgid "verify_flow_info: REG_BR_PROB does not match cfg %wi %i" +#~ msgstr "verify_flow_info: REG_BR_PROB passt nicht zu cfg %wi %i" + +#~ msgid "Missing REG_EH_REGION note in the end of bb %i" +#~ msgstr "Fehlender Vermerk von REG_EH_REGION am Ende vom bb %i" + +#~ msgid "Too many outgoing branch edges from bb %i" +#~ msgstr "Zu viele abgehende Zweig-Kanten vom bb %i" + +#~ msgid "Fallthru edge after unconditional jump %i" +#~ msgstr "Fallthru-Kante nach unbedingtem Sprung %i" + +#~ msgid "Wrong amount of branch edges after conditional jump %i" +#~ msgstr "Falsche Summe der Zweig-Kanten nach bedingtem Sprung %i" + +#~ msgid "Call edges for non-call insn in bb %i" +#~ msgstr "Ruf-Kanten für Nicht-Aufruf-insn im bb %i" + +#~ msgid "Abnormal edges for no purpose in bb %i" +#~ msgstr "Abnormale Kanten ohne Grund in bb %i" + +#~ msgid "insn %d inside basic block %d but block_for_insn is NULL" +#~ msgstr "insn %d innerhalb des Basis-Blockes %d, aber block_for_insn ist NULL" + +#~ msgid "insn %d inside basic block %d but block_for_insn is %i" +#~ msgstr "insn %d innerhalb Basis-Blockes %d, aber block_for_insn ist %i" + +#~ msgid "NOTE_INSN_BASIC_BLOCK is missing for block %d" +#~ msgstr "NOTE_INSN_BASIC_BLOCK fehlt für Block %d" + +#~ msgid "NOTE_INSN_BASIC_BLOCK %d in middle of basic block %d" +#~ msgstr "NOTE_INSN_BASIC_BLOCK %d in der Mitte des Basis-Blocks %d" + +#~ msgid "in basic block %d:" +#~ msgstr "im Basis-Block %d:" + +#~ msgid "flow control insn inside a basic block" +#~ msgstr "Flusskontroll-insn innerhalb eines Basis-Blockes" + +#~ msgid "missing barrier after block %i" +#~ msgstr "fehlende Sperre nach Block %i" + +#~ msgid "verify_flow_info: Incorrect blocks for fallthru %i->%i" +#~ msgstr "verify_flow_info: Falsche Blöcke für »fallthru« %i->%i" + +#~ msgid "verify_flow_info: Incorrect fallthru %i->%i" +#~ msgstr "verify_flow_info: Falsches »fallthru« %i->%i" + +#~ msgid "wrong insn in the fallthru edge" +#~ msgstr "falsche insn in »fallthru«-Kante" + +#~ msgid "basic blocks not laid down consecutively" +#~ msgstr "Basis-Blöcke sind nicht fortlaufend" + +#~ msgid "insn outside basic block" +#~ msgstr "insn außerhalb eines Basis-Blockes" + +#~ msgid "return not followed by barrier" +#~ msgstr "»return« nicht gefolgt von Sperre" + +#~ msgid "number of bb notes in insn chain (%d) != n_basic_blocks (%d)" +#~ msgstr "Anzahl der bb-Vermerke in insn-Kette (%d) != n_basic_blocks (%d)" + +#~ msgid "function body not available" +#~ msgstr "Funktionskörper nicht verfügbar" + +#~ msgid "redefined extern inline functions are not considered for inlining" +#~ msgstr "redefinierte »extern inline«-Funktionen kommen nicht als »inline« in Betracht" + +#~ msgid "function not considered for inlining" +#~ msgstr "Funktion kommt nicht für »inline« in Betracht" + +#~ msgid "function not inlinable" +#~ msgstr "Funktion kann nicht »inline« sein" + +#~ msgid "%D renamed after being referenced in assembly" +#~ msgstr "%D nach Referenzierung in Assemblierung umbenannt" + +#~ msgid "--param large-function-growth limit reached" +#~ msgstr "--param large-function-growth: Limit erreicht" + +#~ msgid "--param large-function-growth limit reached while inlining the caller" +#~ msgstr "--param large-function-growth: Limit bei »inline« des Aufrufers erreicht" + +#~ msgid "--param max-inline-insns-single limit reached" +#~ msgstr "--param max-inline-insns-single: Limit erreicht" + +#~ msgid "--param max-inline-insns-single limit reached after inlining into the callee" +#~ msgstr "--param max-inline-insns-single: Limit nach »inline« im Aufgerufenen erreicht" + +#~ msgid "--param inline-unit-growth limit reached" +#~ msgstr "--param inline-unit-growth: Limit erreicht" + +#~ msgid "recursive inlining" +#~ msgstr "rekursives inline" + +#~ msgid "internal error" +#~ msgstr "interner Fehler" + +#~ msgid "no arguments" +#~ msgstr "Keiner Argumente" + +#~ msgid "fopen %s" +#~ msgstr "fopen %s" + +#~ msgid "fclose %s" +#~ msgstr "fclose %s" + +#~ msgid "collect2 version %s" +#~ msgstr "collect2-Version %s" + +#~ msgid "%d constructor(s) found\n" +#~ msgstr "%d Konstruktor(en) gefunden\n" + +#~ msgid "%d destructor(s) found\n" +#~ msgstr "%d Destruktor(en) gefunden\n" + +#~ msgid "%d frame table(s) found\n" +#~ msgstr "%d Rahmentabelle(n) gefunden\n" + +#~ msgid "%s terminated with signal %d [%s]%s" +#~ msgstr "%s mit Signal %d [%s]%s beendet" + +#~ msgid "%s returned %d exit status" +#~ msgstr "%s gab Ende-Status %d zurück" + +#~ msgid "[cannot find %s]" +#~ msgstr "[kann %s nicht finden]" + +#~ msgid "cannot find `%s'" +#~ msgstr "kann »%s« nicht finden" + +#~ msgid "redirecting stdout: %s" +#~ msgstr "leite Standardausgabe um: %s" + +#~ msgid "[Leaving %s]\n" +#~ msgstr "[Verlasse %s]\n" + +#~ msgid "" +#~ "\n" +#~ "write_c_file - output name is %s, prefix is %s\n" +#~ msgstr "" +#~ "\n" +#~ "write_c_file - Ausgabename ist %s, Präfix ist %s\n" + +#~ msgid "cannot find `nm'" +#~ msgstr "kann »nm« nicht finden" + +#~ msgid "pipe" +#~ msgstr "Pipe" + +#~ msgid "fdopen" +#~ msgstr "fdopen" + +#~ msgid "dup2 %d 1" +#~ msgstr "dup2 %d 1" + +#~ msgid "close %d" +#~ msgstr "close %d" + +#~ msgid "execv %s" +#~ msgstr "execv %s" + +#~ msgid "init function found in object %s" +#~ msgstr "init-Funktion im Objekt %s gefunden" + +#~ msgid "fini function found in object %s" +#~ msgstr "fini-Funktion im Objekt %s gefunden" + +#~ msgid "fclose" +#~ msgstr "fclose" + +#~ msgid "unable to open file '%s'" +#~ msgstr "kann Datei »%s« nicht öffnen" + +#~ msgid "unable to stat file '%s'" +#~ msgstr "kann Dateistatus für »%s« nicht ermitteln" + +#~ msgid "unable to mmap file '%s'" +#~ msgstr "kann mmap nicht auf Datei »%s« anwenden" + +#~ msgid "not found\n" +#~ msgstr "nicht gefunden\n" + +#~ msgid "dynamic dependency %s not found" +#~ msgstr "dynamische Abhängigkeit %s nicht gefunden" + +#~ msgid "bad magic number in file '%s'" +#~ msgstr "Falsche magische Zahl in Datei »%s«" + +#~ msgid "dynamic dependencies.\n" +#~ msgstr "dynamische Abhängigkeiten.\n" + +#~ msgid "cannot find `ldd'" +#~ msgstr "kann »ldd« nicht finden" + +#~ msgid "" +#~ "\n" +#~ "ldd output with constructors/destructors.\n" +#~ msgstr "" +#~ "\n" +#~ "Ausgabe von ldd mit Konstruktoren/Destruktoren.\n" + +#~ msgid "unable to open dynamic dependency '%s'" +#~ msgstr "kann dynamische Abhängigkeit »%s« nicht öffnen" + +#~ msgid "%s: not a COFF file" +#~ msgstr "%s: keine COFF-Datei" + +#~ msgid "%s: cannot open as COFF file" +#~ msgstr "kann %s nicht als COFF-Datei öffnen" + +#~ msgid "library lib%s not found" +#~ msgstr "Bibliothek lib%s nicht gefunden" + +#~ msgid "" +#~ ";; Combiner statistics: %d attempts, %d substitutions (%d requiring new space),\n" +#~ ";; %d successes.\n" +#~ "\n" +#~ msgstr "" +#~ ";; Kombinierer-Statistik: %d Versuche, %d Ersetzungen (%d benötigten neuen Platz),\n" +#~ ";; %d Erfolge.\n" +#~ "\n" + +#~ msgid "" +#~ "\n" +#~ ";; Combiner totals: %d attempts, %d substitutions (%d requiring new space),\n" +#~ ";; %d successes.\n" +#~ msgstr "" +#~ "\n" +#~ ";; Kombinierer-Gesamtwerte: %d Versuche, %d Ersetzungen (%d benötigten neuen Platz),\n" +#~ ";; %d Erfolge.\n" + +#~ msgid "cannot convert to a pointer type" +#~ msgstr "kann nicht in Zeigertyp konvertieren" + +#~ msgid "pointer value used where a floating point value was expected" +#~ msgstr "Zeigerwert verwendet, wo Gleitkommawert erwartet wurde" + +#~ msgid "aggregate value used where a float was expected" +#~ msgstr "zusammengesetzten Wert verwendet, wo Gleitkomma erwartet wurde" + +#~ msgid "conversion to incomplete type" +#~ msgstr "Konvertierung in unvollständigen Typen" + +#~ msgid "can't convert between vector values of different size" +#~ msgstr "kann nicht zwischen Vektorwerten verschiedener Größen konvertieren" + +#~ msgid "aggregate value used where an integer was expected" +#~ msgstr "zusammengesetzter Wert verwendet, wo Ganzzahl erwartet wurde" + +#~ msgid "pointer value used where a complex was expected" +#~ msgstr "Zeigerwert verwendet, wo »complex« erwartet wurde" + +#~ msgid "aggregate value used where a complex was expected" +#~ msgstr "zusammengesetzer Wert verwendet, wo »complex« erwartet wurde" + +#~ msgid "can't convert value to a vector" +#~ msgstr "kann Wert nicht in Vektor konvertieren" + +#~ msgid "`%s' is not a gcov data file" +#~ msgstr "»%s« ist keine gcov-Datei" + +#~ msgid "`%s' is version `%.4s', expected version `%.4s'" +#~ msgstr "»%s« hat Version »%.4s«, Version »%.4s« erwartet" + +#~ msgid "coverage mismatch for function %u while reading execution counters." +#~ msgstr "Überdeckung passt nicht für Funktion %u beim Lesen der Ausführungszähler." + +#~ msgid "checksum is %x instead of %x" +#~ msgstr "Prüfsumme ist %x statt %x" + +#~ msgid "number of counters is %d instead of %d" +#~ msgstr "Zahl der Zähler ist %d statt %d" + +#~ msgid "cannot merge separate %s counters for function %u" +#~ msgstr "separate %s Zähler für die Funktion %u können nicht verschmolzen werden" + +#~ msgid "`%s' has overflowed" +#~ msgstr "»%s« übergelaufen" + +#~ msgid "`%s' is corrupted" +#~ msgstr "»%s« ist beschädigt" + +#~ msgid "file %s not found, execution counts assumed to be zero" +#~ msgstr "Datei %s nicht gefunden, Ausführungszähler als null angenommen" + +#~ msgid "no coverage for function '%s' found." +#~ msgstr "keine Überdeckung für Funktion »%s« gefunden." + +#~ msgid "coverage mismatch for function '%s' while reading counter '%s'." +#~ msgstr "Überdeckung passt nicht bei Funktion »%s« beim Lesen des Zählers »%s«." + +#~ msgid "cannot open %s" +#~ msgstr "Es ist nicht möglich, »%s« zu öffnen" + +#~ msgid "error writing `%s'" +#~ msgstr "Fehler beim Schreiben der Datei »%s«" + +#~ msgid "\"%s\" is not a valid option to the preprocessor" +#~ msgstr "»%s« ist keine gültige Präprozessoroption" + +#~ msgid "too many input files" +#~ msgstr "zu viele Eingabedateien" + +#~ msgid ";; Processing block from %d to %d, %d sets.\n" +#~ msgstr ";; Bearbeite Block von %d bis %d, %d Sets.\n" + +#~ msgid "%s:%d: confused by earlier errors, bailing out\n" +#~ msgstr "%s:%d: durch frühere Fehler verwirrt, Abbruch\n" + +#~ msgid "compilation terminated.\n" +#~ msgstr "Kompilierung beendet.\n" + +#~ msgid "Internal compiler error: Error reporting routines re-entered.\n" +#~ msgstr "Interner Compilerfehler: Fehlerbehandlungsroutinen doppelt betreten.\n" + +#~ msgid "in %s, at %s:%d" +#~ msgstr "in %s, bei %s:%d" + +#~ msgid "dominator of %d should be %d, not %d" +#~ msgstr "Herrscher über %d sollte %d sein, nicht %d" + +#~ msgid "DW_LOC_OP %s not implemented\n" +#~ msgstr "DW_LOC_OP %s nicht implementiert\n" + +#~ msgid "can't access real part of complex value in hard register" +#~ msgstr "kann nicht auf realen Teil des komplexen Wertes im festen Register zugreifen" + +#~ msgid "can't access imaginary part of complex value in hard register" +#~ msgstr "kann nicht auf imaginären Teil des komplexen Wertes im festen Register zugreifen" + +#~ msgid "Invalid rtl sharing found in the insn" +#~ msgstr "ungültige gemeinsame rtl-Benutzung in insn gefunden" + +#~ msgid "Shared rtx" +#~ msgstr "Gemeinsames rtx" + +#~ msgid "ICE: emit_insn used where emit_jump_insn needed:\n" +#~ msgstr "ICE: emit_insn verwendet, wo emit_jump_insn erforderlich:\n" + +#~ msgid "abort in %s, at %s:%d" +#~ msgstr "Abbruch in %s, bei %s:%d" + +#~ msgid "exception handling disabled, use -fexceptions to enable" +#~ msgstr "Ausnahmebehandlung ausgeschaltet, benutzen Sie -fexeptions zum Anschalten" + +#~ msgid "argument of `__builtin_eh_return_regno' must be constant" +#~ msgstr "Argument für »__builtin_eh_return_regno« muss konstant sein" + +#~ msgid "__builtin_eh_return not supported on this target" +#~ msgstr "__builtin_eh_return für dieses Ziel nicht unterstützt" + +#~ msgid "stack limits not supported on this target" +#~ msgstr "Kellergrenzen nicht für dieses Ziel unterstützt" + +#~ msgid "function using short complex types cannot be inline" +#~ msgstr "Funktion, die komplexe »short«-Typen verwendet, kann nicht »inline« sein" + +#~ msgid "%Jprior parameter's size depends on '%D'" +#~ msgstr "%Jvorherige Parametergröße hängt von »%D« ab" + +#~ msgid "returned value in block_exit_expr" +#~ msgstr "zurückgelieferter Wert in block_exit_expr" + +#~ msgid "cannot take the address of an unaligned member" +#~ msgstr "die Adresse eines nicht ausgerichteten Elements kann nicht ermittelt werden" + +#~ msgid "negative insn length" +#~ msgstr "negative insn-Länge" + +#~ msgid "could not split insn" +#~ msgstr "insn kann nicht aufgeteilt werden" + +#~ msgid "invalid `asm': " +#~ msgstr "ungültiges »asm«: " + +#~ msgid "nested assembly dialect alternatives" +#~ msgstr "geschachtelte Assemblerdialekt-Alternativen" + +#~ msgid "unterminated assembly dialect alternative" +#~ msgstr "unbeendete Assemblerdialekt-Alternative" + +#~ msgid "operand number missing after %%-letter" +#~ msgstr "Operandenzahl fehlt hinter %%-Buchstabe" + +#~ msgid "operand number out of range" +#~ msgstr "Operandenzahl außerhalb des Wertebereiches" + +#~ msgid "invalid %%-code" +#~ msgstr "ungültiger %%-Code" + +#~ msgid "`%%l' operand isn't a label" +#~ msgstr "»%%l«-Operand ist keine Marke" + +#~ msgid "floating constant misused" +#~ msgstr "Gleitkommakonstante falsch benutzt" + +#~ msgid "invalid expression as operand" +#~ msgstr "ungültiger Ausdruck als Operand" + +#~ msgid "function might be possible candidate for attribute `noreturn'" +#~ msgstr "Funktion könnte möglicher Kandidat für Attribut »noreturn« sein" + +#~ msgid "`noreturn' function does return" +#~ msgstr "»noreturn«-Funktion kehrt zurück" + +#~ msgid "control reaches end of non-void function" +#~ msgstr "Kontrollfluss erreicht Ende einer Nicht-void-Funktion" + +#~ msgid "Attempt to delete prologue/epilogue insn:" +#~ msgstr "Versuch, Prolog/Epilog-insn zu löschen" + +#~ msgid "comparison is always %d due to width of bit-field" +#~ msgstr "Vergleich ist immer %d wegen Breite des Bitfeldes" + +#~ msgid "comparison is always %d" +#~ msgstr "Vergleich ist immer %d" + +#~ msgid "`or' of unmatched not-equal tests is always 1" +#~ msgstr "»oder« nicht passender Ungleichheits-Tests ist immer 1" + +#~ msgid "`and' of mutually exclusive equal-tests is always 0" +#~ msgstr "»und« gegenseitig ausschließender Gleichheits-Tests ist immer 0" + +#~ msgid "fold check: original tree changed by fold" +#~ msgstr "Faltungstest: ursprünglicher Baum durch Faltung geändert" + +#~ msgid "%Jsize of variable '%D' is too large" +#~ msgstr "%JGröße der Variable »%D« ist zu hoch" + +#~ msgid "impossible constraint in `asm'" +#~ msgstr "unmögliche Bedingung in »asm«" + +#~ msgid "%J'%D' might be used uninitialized in this function" +#~ msgstr "%J»%D« könnte in dieser Funktion uninitialisiert bleiben" + +#~ msgid "%Jvariable '%D' might be clobbered by `longjmp' or `vfork'" +#~ msgstr "%JVariable »%D« könnte von »longjmp« oder »vfork« zerstört werden" + +#~ msgid "%Jargument '%D' might be clobbered by `longjmp' or `vfork'" +#~ msgstr "%JArgument »%D« könnte von »longjmp« oder »vfork« zerstört werden" + +#~ msgid "function returns an aggregate" +#~ msgstr "Funktion gibt Aggregat zurück" + +#~ msgid "%Junused parameter '%D'" +#~ msgstr "%Jnicht benutzter Parameter »%D«" + +#~ msgid "ambiguous abbreviation %s" +#~ msgstr "mehrdeutige Abkürzung %s" + +#~ msgid "incomplete `%s' option" +#~ msgstr "unvollständige »%s«-Option" + +#~ msgid "missing argument to `%s' option" +#~ msgstr "fehlendes Argument für »%s«-Option" + +#~ msgid "extraneous argument to `%s' option" +#~ msgstr "zusätzliches (belangloses) Argument für »%s«-Option" + +#~ msgid "Using built-in specs.\n" +#~ msgstr "Benutze eingebaute Spezifikationen.\n" + +#~ msgid "" +#~ "Setting spec %s to '%s'\n" +#~ "\n" +#~ msgstr "" +#~ "Setze Spezifikation %s auf '%s'\n" +#~ "\n" + +#~ msgid "Reading specs from %s\n" +#~ msgstr "Lese Spezifikationen von %s\n" + +#~ msgid "specs %%include syntax malformed after %ld characters" +#~ msgstr "falsche %%include-Syntax für Spezifikationen nach %ld Zeichen" + +#~ msgid "could not find specs file %s\n" +#~ msgstr "konnte Spezifikationsdatei %s nicht finden\n" + +#~ msgid "specs %%rename syntax malformed after %ld characters" +#~ msgstr "falsche %%rename-Syntax für Spezifikationen nach %ld Zeichen" + +#~ msgid "specs %s spec was not found to be renamed" +#~ msgstr "keine %s-Spezifikation zum Umbenennen gefunden" + +#~ msgid "%s: attempt to rename spec '%s' to already defined spec '%s'" +#~ msgstr "%s: Versuch, Spezifikation »%s« in bereits definierte Spezifikation »%s« umzubenennen" + +#~ msgid "rename spec %s to %s\n" +#~ msgstr "benenne Spezifikation %s nach %s um\n" + +#~ msgid "" +#~ "spec is '%s'\n" +#~ "\n" +#~ msgstr "" +#~ "Spezifikation ist '%s'\n" +#~ "\n" + +#~ msgid "specs unknown %% command after %ld characters" +#~ msgstr "Spezifikation: unbekannter %%-Befehl nach %ld Zeichen" + +#~ msgid "specs file malformed after %ld characters" +#~ msgstr "Fehler in Spezifikationsdatei nach %ld Zeichen" + +#~ msgid "spec file has no spec for linking" +#~ msgstr "Spezifikationsdatei hat keine Spezifikation zum Binden" + +#~ msgid "-pipe not supported" +#~ msgstr "-pipe wird nicht unterstützt" + +# can we use j/n here, too? +# 2002-04-23 18:57:43 CEST -ke- +#~ msgid "" +#~ "\n" +#~ "Go ahead? (y or n) " +#~ msgstr "" +#~ "\n" +#~ "Fortfahren? (y oder n) " + +#~ msgid "" +#~ "Internal error: %s (program %s)\n" +#~ "Please submit a full bug report.\n" +#~ "See %s for instructions." +#~ msgstr "" +#~ "Interner Fehler: %s (Programm %s)\n" +#~ "Bitte senden Sie einen vollständigen Fehlerbericht\n" +#~ "auf Englisch ein; Fehler in der deutschen Übersetzung\n" +#~ "sind an de@li.org zu melden.\n" +#~ "Gehen Sie gemäß den Hinweisen in %s vor." + +#~ msgid "# %s %.2f %.2f\n" +#~ msgstr "# %s %.2f %.2f\n" + +#~ msgid "Usage: %s [options] file...\n" +#~ msgstr "Aufruf: %s [Optionen] Datei...\n" + +#~ msgid "Options:\n" +#~ msgstr "Optionen:\n" + +#~ msgid " -pass-exit-codes Exit with highest error code from a phase\n" +#~ msgstr " -pass-exit-codes Ende mit höchstem Rückgabe-Code einer Phase\n" + +#~ msgid " --help Display this information\n" +#~ msgstr " --help Diese Informationen anzeigen\n" + +#~ msgid " --target-help Display target specific command line options\n" +#~ msgstr " --target-help Zielspezifische Kommandozeilenoptionen anzeigen\n" + +#~ msgid " (Use '-v --help' to display command line options of sub-processes)\n" +#~ msgstr " ('-v --help' zum Anzeigen der Kommandozeilenoptionen von Subprozessen verwenden)\n" + +#~ msgid " -dumpspecs Display all of the built in spec strings\n" +#~ msgstr " -dumpspecs Alle eingebauten Spezifikationszeichenketten anzeigen\n" + +#~ msgid " -dumpversion Display the version of the compiler\n" +#~ msgstr " -dumpversion Compilerversion anzeigen\n" + +#~ msgid " -dumpmachine Display the compiler's target processor\n" +#~ msgstr " -dumpmachine Zielprozessor des Compilers anzeigen\n" + +#~ msgid " -print-search-dirs Display the directories in the compiler's search path\n" +#~ msgstr " -print-search-dirs Verzeichnisse im Suchpfad des Compilers anzeigen\n" + +#~ msgid " -print-libgcc-file-name Display the name of the compiler's companion library\n" +#~ msgstr " -print-libgcc-file-name Name der Begleitbibliothek des Compilers anzeigen\n" + +#~ msgid " -print-file-name= Display the full path to library \n" +#~ msgstr " -print-file-name= Vollen Pfad zur Bibliothek anzeigen\n" + +#~ msgid " -print-prog-name= Display the full path to compiler component \n" +#~ msgstr " -print-prog-name= Vollen Pfad zur Compilerkomponente anzeigen\n" + +#~ msgid " -print-multi-directory Display the root directory for versions of libgcc\n" +#~ msgstr " -print-multi-directory Wurzelverzeichnis für Versionen von libgcc anzeigen\n" + +#~ msgid "" +#~ " -print-multi-lib Display the mapping between command line options and\n" +#~ " multiple library search directories\n" +#~ msgstr "" +#~ " -print-multi-lib Abbildung zwischen Kommandozeilenoptionen und\n" +#~ " mehreren Suchverzeichnissen für Bibliotheken anzeigen\n" + +#~ msgid " -print-multi-os-directory Display the relative path to OS libraries\n" +#~ msgstr "" +#~ " -print-multi-os-directory Relativen Pfad zu Betriebssystembibliotheken\n" +#~ " anzeigen\n" + +#~ msgid " -Wa, Pass comma-separated on to the assembler\n" +#~ msgstr " -Wa, Komma-getrennte an Assembler übergeben\n" + +#~ msgid " -Wp, Pass comma-separated on to the preprocessor\n" +#~ msgstr " -Wp, Komma-getrennte an Präprozessor übergeben\n" + +#~ msgid " -Wl, Pass comma-separated on to the linker\n" +#~ msgstr " -Wl, Komma-getrennte an Linker übergeben\n" + +#~ msgid " -Xassembler Pass on to the assembler\n" +#~ msgstr " -Xassembler an den Assembler übergeben\n" + +#~ msgid " -Xpreprocessor Pass on to the preprocessor\n" +#~ msgstr " -Xpreprocessor an den Präprozessor übergeben\n" + +#~ msgid " -Xlinker Pass on to the linker\n" +#~ msgstr " -Xlinker an den Linker übergeben\n" + +#~ msgid " -save-temps Do not delete intermediate files\n" +#~ msgstr " -save-temps Temporäre Dateien nicht löschen\n" + +#~ msgid " -pipe Use pipes rather than intermediate files\n" +#~ msgstr " -pipe Pipes statt temporärer Dateien verwenden\n" + +#~ msgid " -time Time the execution of each subprocess\n" +#~ msgstr " -time Zeit für Ausführung jedes Subprozesses stoppen\n" + +#~ msgid " -specs= Override built-in specs with the contents of \n" +#~ msgstr "" +#~ " -specs= Eingebaute Spezifikationen mit Inhalt der \n" +#~ " überschreiben\n" + +#~ msgid " -std= Assume that the input sources are for \n" +#~ msgstr " -std= Annehmen, dass die Eingabequellen für sind\n" + +#~ msgid " -B Add to the compiler's search paths\n" +#~ msgstr " -B zum Suchpfad des Compilers hinzufügen\n" + +#~ msgid " -b Run gcc for target , if installed\n" +#~ msgstr "" +#~ " -b GCC für die Ziel- laufen lassen, falls\n" +#~ " installiert\n" + +#~ msgid " -V Run gcc version number , if installed\n" +#~ msgstr " -V GCC laufen lassen, falls installiert\n" + +#~ msgid " -v Display the programs invoked by the compiler\n" +#~ msgstr " -v Vom Compiler aufgerufene Programme anzeigen\n" + +#~ msgid " -### Like -v but options quoted and commands not executed\n" +#~ msgstr "" +#~ " -### Wie -v, aber mit zitierten Optionen und nicht\n" +#~ " ausgeführten Befehlen\n" + +#~ msgid " -E Preprocess only; do not compile, assemble or link\n" +#~ msgstr "" +#~ " -E Nur Präprozessor, kein Compiler, Assembler oder\n" +#~ " Binder\n" + +#~ msgid " -S Compile only; do not assemble or link\n" +#~ msgstr " -S Nur kompilieren, nicht assemblieren oder binden\n" + +#~ msgid " -c Compile and assemble, but do not link\n" +#~ msgstr " -c Nur kompilieren und assemblieren, aber nicht binden\n" + +#~ msgid " -o Place the output into \n" +#~ msgstr " -o Ausgabe in schreiben\n" + +#~ msgid "" +#~ " -x Specify the language of the following input files\n" +#~ " Permissible languages include: c c++ assembler none\n" +#~ " 'none' means revert to the default behavior of\n" +#~ " guessing the language based on the file's extension\n" +#~ msgstr "" +#~ " -x Sprache der folgenden Eingabedateien angeben\n" +#~ " Zulässige Sprachen sind: c c++ assembler none\n" +#~ " 'none' bedeutet den Rückfall auf das Standard-\n" +#~ " verhalten, die Sprache aufgrund der Dateinamens-\n" +#~ " erweiterung zu vermuten\n" + +#~ msgid "" +#~ "\n" +#~ "Options starting with -g, -f, -m, -O, -W, or --param are automatically\n" +#~ " passed on to the various sub-processes invoked by %s. In order to pass\n" +#~ " other options on to these processes the -W options must be used.\n" +#~ msgstr "" +#~ "\n" +#~ "Optionen, die mit -g, -f, -m, -O, -W, oder --param beginnen, werden automatisch\n" +#~ " an die verschiedenen Subprozesse, die von %s aufgerufen werden, übergeben.\n" +#~ " Um andere Optionen an diese Prozesse zu übergeben, müssen die Optionen\n" +#~ " -W verwendet werden.\n" + +#~ msgid "`-%c' option must have argument" +#~ msgstr "Die Option »-%c« muss ein Argument haben" + +#~ msgid "couldn't run `%s': %s" +#~ msgstr "konnte »%s« nicht ausführen: %s" + +#~ msgid "%s (GCC) %s\n" +#~ msgstr "%s (GCC) %s\n" + +#~ msgid "" +#~ "This is free software; see the source for copying conditions. There is NO\n" +#~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" +#~ "\n" +#~ msgstr "" +#~ "Dies ist freie Software; die Kopierbedingungen stehen in den Quellen. Es\n" +#~ "gibt KEINE Garantie; auch nicht für VERKAUFBARKEIT oder FÜR SPEZIELLE ZWECKE.\n" +#~ "\n" + +#~ msgid "argument to `-Xlinker' is missing" +#~ msgstr "Argument für »-Xlinker« fehlt" + +#~ msgid "argument to `-Xpreprocessor' is missing" +#~ msgstr "Argument für »-Xpreprocessor« fehlt" + +#~ msgid "argument to `-Xassembler' is missing" +#~ msgstr "Argument für »-Xassembler« fehlt" + +#~ msgid "argument to `-l' is missing" +#~ msgstr "Argument für »-l« fehlt" + +#~ msgid "argument to `-specs' is missing" +#~ msgstr "Argument für »-specs« fehlt" + +#~ msgid "argument to `-specs=' is missing" +#~ msgstr "Argument für »-specs=« fehlt" + +#~ msgid "`-%c' must come at the start of the command line" +#~ msgstr "»-%c« muss am Anfang der Kommandozeile stehen" + +#~ msgid "argument to `-B' is missing" +#~ msgstr "Argument für »-B« fehlt" + +#~ msgid "warning: -pipe ignored because -save-temps specified" +#~ msgstr "Warnung: -pipe ignoriert, da -save-temps angegeben" + +#~ msgid "warning: -pipe ignored because -time specified" +#~ msgstr "Warnung: -pipe ignoriert, da -time angegeben" + +#~ msgid "argument to `-x' is missing" +#~ msgstr "Argument für »-x« fehlt" + +#~ msgid "argument to `-%s' is missing" +#~ msgstr "Argument für »-%s« fehlt" + +#~ msgid "warning: `-x %s' after last input file has no effect" +#~ msgstr "Warnung: »-x %s« hinter letzter Eingabedatei hat keine Wirkung" + +#~ msgid "invalid specification! Bug in cc" +#~ msgstr "ungültige Spezifikation! Fehler in cc" + +#~ msgid "%s\n" +#~ msgstr "%s\n" + +#~ msgid "spec failure: '%%*' has not been initialized by pattern match" +#~ msgstr "Spezifikationsfehler: »%%*« wurde nicht durch Mustererkennung initialisiert" + +#~ msgid "warning: use of obsolete %%[ operator in specs" +#~ msgstr "Warnung: Verwendung des veralteten Operators %%[ in Spezifikation" + +#~ msgid "Processing spec %c%s%c, which is '%s'\n" +#~ msgstr "Verarbeite Spezifikation %c%s%c, welche »%s« ist\n" + +#~ msgid "spec failure: unrecognized spec option '%c'" +#~ msgstr "Spezifikationsfehler: nicht erkannte Option »%c«" + +#~ msgid "unknown spec function `%s'" +#~ msgstr "unbekannte Spezifikationsfunktion »%s«" + +#~ msgid "error in args to spec function `%s'" +#~ msgstr "Fehler in Argumenten für Spezifikationsfunktion »%s«" + +#~ msgid "malformed spec function name" +#~ msgstr "schlechter Name für Spezifikationsfunktion" + +#~ msgid "no arguments for spec function" +#~ msgstr "keine Argumente für Spezifikationsfunktion" + +#~ msgid "malformed spec function arguments" +#~ msgstr "schlechte Argumente für Spezifikationsfunktion" + +#~ msgid "spec failure: more than one arg to SYSROOT_SUFFIX_SPEC." +#~ msgstr "Spezifikationsfehler: mehr als ein Argument für SYSROOT_SUFFIX_SPEC." + +#~ msgid "spec failure: more than one arg to SYSROOT_HEADERS_SUFFIX_SPEC." +#~ msgstr "Spezifikationsfehler: mehr als ein Argument für SYSROOT_HEADERS_SUFFIX_SPEC." + +#~ msgid "unrecognized option `-%s'" +#~ msgstr "nicht erkannte Option »-%s«" + +#~ msgid "install: %s%s\n" +#~ msgstr "installiere: %s%s\n" + +#~ msgid "programs: %s\n" +#~ msgstr "Programme: %s\n" + +#~ msgid "libraries: %s\n" +#~ msgstr "Bibliotheken: %s\n" + +#~ msgid "" +#~ "\n" +#~ "For bug reporting instructions, please see:\n" +#~ msgstr "" +#~ "\n" +#~ "Zum Einsenden von Fehlerberichten (auf Englisch) lesen Sie bitte die\n" +#~ "folgenden Hinweise; Fehler in der deutschen Übersetzung sind an de@li.org\n" +#~ "zu melden:\n" + +#~ msgid "Configured with: %s\n" +#~ msgstr "Konfiguriert mit: %s\n" + +#~ msgid "Thread model: %s\n" +#~ msgstr "Thread-Modell: %s\n" + +#~ msgid "gcc version %s\n" +#~ msgstr "gcc-Version %s\n" + +#~ msgid "gcc driver version %s executing gcc version %s\n" +#~ msgstr "gcc-Treiberversion %s führt gcc Version %s aus\n" + +#~ msgid "no input files" +#~ msgstr "keine Eingabedateien" + +#~ msgid "%s: linker input file unused because linking not done" +#~ msgstr "%s: Eingabedateien des Binders unbenutzt, da keine Bindung geschieht" + +#~ msgid "cannot specify -o with -c or -S and multiple languages" +#~ msgstr "-o kann nicht mit -c oder -S und mehreren Sprachen angegeben werden" + +#~ msgid "%s: %s compiler not installed on this system" +#~ msgstr "%s: %s-Compiler ist auf diesem System nicht installiert" + +#~ msgid "language %s not recognized" +#~ msgstr "Sprache %s nicht erkannt" + +#~ msgid "internal gcc abort" +#~ msgstr "interner Abruch des gcc" + +#~ msgid "Internal gcov abort.\n" +#~ msgstr "Interner gcov-Abbruch.\n" + +#~ msgid "" +#~ "Usage: gcov [OPTION]... SOURCEFILE\n" +#~ "\n" +#~ msgstr "" +#~ "Aufruf: gcov [OPTION]... QUELLDATEI\n" +#~ "\n" + +#~ msgid "" +#~ "Print code coverage information.\n" +#~ "\n" +#~ msgstr "" +#~ "Information zur Code-Überdeckung ausgeben.\n" +#~ "\n" + +#~ msgid " -h, --help Print this help, then exit\n" +#~ msgstr " -h, --help Diese Hilfe anzeigen\n" + +#~ msgid " -v, --version Print version number, then exit\n" +#~ msgstr " -v, --version Versionsnummer anzeigen\n" + +#~ msgid " -a, --all-blocks Show information for every basic block\n" +#~ msgstr " -a, --all-blocks Informationen für jeden Basisblock zeigen\n" + +#~ msgid " -b, --branch-probabilities Include branch probabilities in output\n" +#~ msgstr " -b, --branch-probabilities Zweigwahrscheinlichkeiten in Ausgabe aufnehmen\n" + +#~ msgid "" +#~ " -c, --branch-counts Given counts of branches taken\n" +#~ " rather than percentages\n" +#~ msgstr " -c, --branch-counts Angegebene Zweigzahlen statt Anteilen nehmen\n" + +#~ msgid " -n, --no-output Do not create an output file\n" +#~ msgstr " -n, --no-output Keine Ausgabedatei erzeugen\n" + +#~ msgid "" +#~ " -l, --long-file-names Use long output file names for included\n" +#~ " source files\n" +#~ msgstr "" +#~ " -l, --long-file-names Lange Dateinamen für Ausgabedateien für\n" +#~ " eingefügte Quelldateien verwenden\n" + +#~ msgid " -f, --function-summaries Output summaries for each function\n" +#~ msgstr " -f, --function-summaries Ausgabezusammenfassungen für jede Funktion\n" + +#~ msgid " -o, --object-directory DIR|FILE Search for object files in DIR or called FILE\n" +#~ msgstr "" +#~ " -o, --object-directory DIR|FILE In DIR oder aufgerufener Datei FILE nach\n" +#~ " Objektdateien suchen\n" + +#~ msgid " -p, --preserve-paths Preserve all pathname components\n" +#~ msgstr " -p, --preserve-paths Alle Pfadnamenskomponenten bewahren\n" + +#~ msgid " -u, --unconditional-branches Show unconditional branch counts too\n" +#~ msgstr " -u, --unconditional-branches Auch unbedingte Zweigzähler zeigen\n" + +#~ msgid "" +#~ "\n" +#~ "For bug reporting instructions, please see:\n" +#~ "%s.\n" +#~ msgstr "" +#~ "\n" +#~ "Zum Einsenden von Fehlerberichten (auf Englisch) lesen Sie bitte die Hinweise in:\n" +#~ "%s.\n" +#~ "Fehler in der deutschen Übersetzung sind an de@li.org zu melden.\n" + +#~ msgid "gcov (GCC) %s\n" +#~ msgstr "gcov (GCC) %s\n" + +#~ msgid "Copyright (C) 2003 Free Software Foundation, Inc.\n" +#~ msgstr "Copyright © 2003 Free Software Foundation, Inc.\n" + +#~ msgid "" +#~ "This is free software; see the source for copying conditions.\n" +#~ "There is NO warranty; not even for MERCHANTABILITY or \n" +#~ "FITNESS FOR A PARTICULAR PURPOSE.\n" +#~ "\n" +#~ msgstr "" +#~ "Dies ist freie Software; die Kopierbedingungen stehen in den Quellen. Es\n" +#~ "gibt KEINE Garantie; auch nicht für VERKAUFBARKEIT oder FÜR SPEZIELLE ZWECKE.\n" +#~ "\n" + +#~ msgid "%s:no functions found\n" +#~ msgstr "%s: keine Funktionen gefunden\n" + +#~ msgid "\n" +#~ msgstr "\n" + +#~ msgid "%s:creating `%s'\n" +#~ msgstr "%s: Erzeugen von »%s«\n" + +#~ msgid "%s:error writing output file `%s'\n" +#~ msgstr "%s: Fehler beim Schreiben der Ausgabedatei »%s«\n" + +#~ msgid "%s:could not open output file `%s'\n" +#~ msgstr "%s: Ausgabedatei %s konnte nicht geöffnet werden\n" + +#~ msgid "%s:cannot open graph file\n" +#~ msgstr "%s: Graph-Datei kann nicht geöffnet werden\n" + +#~ msgid "%s:not a gcov graph file\n" +#~ msgstr "%s: keine gcov-Graph-Datei\n" + +#~ msgid "%s:version `%.4s', prefer `%.4s'\n" +#~ msgstr "%s: Version »%.4s«, aber »%.4s« wird bevorzugt\n" + +#~ msgid "%s:already seen blocks for `%s'\n" +#~ msgstr "%s: bereits gesehene Blöcke für »%s«\n" + +#~ msgid "%s:corrupted\n" +#~ msgstr "%s: beschädigt\n" + +#~ msgid "%s:cannot open data file\n" +#~ msgstr "%s: kann nicht geöffnet werden\n" + +#~ msgid "%s:not a gcov data file\n" +#~ msgstr "%s: keine gcov-Datei\n" + +#~ msgid "%s:version `%.4s', prefer version `%.4s'\n" +#~ msgstr "%s: Version »%.4s«, aber Version »%.4s« wird bevorzugt\n" + +#~ msgid "%s:stamp mismatch with graph file\n" +#~ msgstr "%s: Marke passt nicht zur Graph-Datei\n" + +#~ msgid "%s:unknown function `%u'\n" +#~ msgstr "%s: unbekannte Funktion »%u«\n" + +#~ msgid "%s:profile mismatch for `%s'\n" +#~ msgstr "%s: Profil passt nicht für `%s'\n" + +#~ msgid "%s:overflowed\n" +#~ msgstr "%s: übergelaufen\n" + +#~ msgid "%s:`%s' lacks entry and/or exit blocks\n" +#~ msgstr "%s: Eintrag und/oder Exit-Blöcke fehlen in »%s«\n" + +#~ msgid "%s:`%s' has arcs to entry block\n" +#~ msgstr "%s: »%s« hat Bögen zum Eintrittsblock\n" + +#~ msgid "%s:`%s' has arcs from exit block\n" +#~ msgstr "%s: »%s« hat Bögen vom Eintrittsblock\n" + +#~ msgid "%s:graph is unsolvable for `%s'\n" +#~ msgstr "%s: Graph ist für »%s« unlösbar\n" + +#~ msgid "%s `%s'\n" +#~ msgstr "%s: »%s«\n" + +#~ msgid "Lines executed:%s of %d\n" +#~ msgstr "%s von %d Zeilen ausgeführt\n" + +#~ msgid "No executable lines" +#~ msgstr "Keine ausführbaren Zeilen" + +#~ msgid "Branches executed:%s of %d\n" +#~ msgstr "%s von %d Zweigen ausgeführt\n" + +#~ msgid "Taken at least once:%s of %d\n" +#~ msgstr "%s von %d Zweigen mindestens einmal genommen\n" + +#~ msgid "No branches\n" +#~ msgstr "Keine Zweige\n" + +#~ msgid "Calls executed:%s of %d\n" +#~ msgstr "%s von %d Aufrufe ausgeführt\n" + +#~ msgid "No calls\n" +#~ msgstr "Keine Aufrufe\n" + +#~ msgid "%s:no lines for `%s'\n" +#~ msgstr "%s: keine Zeilen für »%s«\n" + +#~ msgid "call %2d returned %s\n" +#~ msgstr "Aufruf %2d gab %s zurück\n" + +#~ msgid "call %2d never executed\n" +#~ msgstr "Aufruf %2d niemals ausgeführt\n" + +#~ msgid "branch %2d taken %s%s\n" +#~ msgstr "Zweig %2d wurde genommen: %s%s\n" + +#~ msgid "branch %2d never executed\n" +#~ msgstr "Zweig %2d niemals ausgeführt\n" + +#~ msgid "unconditional %2d taken %s\n" +#~ msgstr "unbedingtes %2d, genommen: %s\n" + +#~ msgid "unconditional %2d never executed\n" +#~ msgstr "unbedingtes %2d niemals ausgeführt\n" + +#~ msgid "%s:cannot open source file\n" +#~ msgstr "%s: Quelldatei kann nicht geöffnet werden\n" + +#~ msgid "%s:source file is newer than graph file `%s'\n" +#~ msgstr "%s: Quelldatei ist neuer als Graph-Datei »%s«\n" + +#~ msgid "GCSE disabled" +#~ msgstr "GCSE ausgeschaltet" + +#~ msgid "NULL pointer checks disabled" +#~ msgstr "NULL-Zeiger Tests ausgeschaltet" + +#~ msgid "jump bypassing disabled" +#~ msgstr "Sprungumgehungen ausgeschaltet" + +#~ msgid "%s: %d basic blocks and %d edges/basic block" +#~ msgstr "%s: %d Basis-Blöcke und %d Kanten/Basis-Blöcke" + +#~ msgid "%s: %d basic blocks and %d registers" +#~ msgstr "%s: %d Basis-Blöcke und %d Register" + +#~ msgid "can't write PCH file: %m" +#~ msgstr "PCH-Datei kann nicht geschrieben werden: %m" + +#~ msgid "can't get position in PCH file: %m" +#~ msgstr "Position in PCH-Datei kann nicht ermittelt werden: %m" + +#~ msgid "can't write padding to PCH file: %m" +#~ msgstr "Auffüllung für PCH-Datei kann nicht geschrieben werden: %m" + +#~ msgid "can't read PCH file: %m" +#~ msgstr "PCH-Datei kann nicht gelesen werden: %m" + +#~ msgid "had to relocate PCH" +#~ msgstr "PCH musste verschoben werden" + +#~ msgid "open /dev/zero: %m" +#~ msgstr "/dev/zero öffnen: %m" + +#~ msgid "can't write PCH file" +#~ msgstr "PCH-Datei kann nicht geschrieben werden" + +#~ msgid "Generating PCH files is not supported when using ggc-simple.c" +#~ msgstr "Das Erzeugen von PCH-Dateien wird bei Verwendung von ggc-simple.c nicht unterstützt" + +#~ msgid "%s cannot be used in asm here" +#~ msgstr "%s kann nicht hier in »asm« verwendet werden" + +#~ msgid "can't open %s: %m" +#~ msgstr "%s kann nicht geöffnet werden: %m" + +#~ msgid "fix_sched_param: unknown param: %s" +#~ msgstr "fix_sched_param: unbekannter Parameter: %s" + +#~ msgid "function cannot be inline" +#~ msgstr "Funktion kann nicht »inline« sein" + +#~ msgid "varargs function cannot be inline" +#~ msgstr "Varargs-Funktion kann nicht »inline« sein" + +#~ msgid "function using alloca cannot be inline" +#~ msgstr "alloca benutzende Funktion kann nicht »inline« sein" + +#~ msgid "function using longjmp cannot be inline" +#~ msgstr "longjmp benutzende Funktion kann nicht »inline« sein" + +#~ msgid "function using setjmp cannot be inline" +#~ msgstr "setjmp benutzende Funktion kann nicht »inline« sein" + +#~ msgid "function uses __builtin_eh_return" +#~ msgstr "Funktion verwendet __builtin_eh_return" + +#~ msgid "function with nested functions cannot be inline" +#~ msgstr "Funktion mit geschachtelten Funktionen kann nicht »inline« sein" + +#~ msgid "function with label addresses used in initializers cannot inline" +#~ msgstr "Funktion mit Markenadressen in Initialisierungen kann nicht »inline« sein" + +#~ msgid "function too large to be inline" +#~ msgstr "Funktion zu groß um »inline« sein zu können" + +#~ msgid "no prototype, and parameter address used; cannot be inline" +#~ msgstr "kein Prototyp, und Parameteradresse verwendet; kann nicht »inline« sein" + +#~ msgid "inline functions not supported for this return value type" +#~ msgstr "»inline«-Funktionen für diesen Rückgabetyp nicht unterstützt" + +#~ msgid "function with varying-size return value cannot be inline" +#~ msgstr "Funktion mit Rückgabetyp variabler Größe kann nicht »inline« sein" + +#~ msgid "function with varying-size parameter cannot be inline" +#~ msgstr "Funktion mit Parameter variabler Größe kann nicht »inline« sein" + +#~ msgid "function with transparent unit parameter cannot be inline" +#~ msgstr "Funktion mit transparentem Einheiten-Parameter kann nicht »inline« sein" + +#~ msgid "function with computed jump cannot inline" +#~ msgstr "Funktion mit berechnetem Sprung kann nicht »inline« sein" + +#~ msgid "function with nonlocal goto cannot be inline" +#~ msgstr "Funktion mit nichtlokalem Goto kann nicht »inline« sein" + +#~ msgid "function with target specific attribute(s) cannot be inlined" +#~ msgstr "Funktion mit zielspezifischen Attributen kann nicht »inline« sein" + +#~ msgid "%Hwill never be executed" +#~ msgstr "%Hwird niemals ausgeführt" + +#~ msgid "This switch lacks documentation" +#~ msgstr "Dieser Schalter ist undokumentiert" + +#~ msgid "command line option \"%s\" is valid for %s but not for %s" +#~ msgstr "Kommandozeilenoption \"%s\" ist gültig für %s, aber nicht für %s" + +#~ msgid "missing argument to \"%s\"" +#~ msgstr "fehlendes Argument für »%s«" + +#~ msgid "argument to \"%s\" should be a non-negative integer" +#~ msgstr "Argument von »%s« sollte eine nicht-negative Ganzzahl sein" + +#~ msgid "unrecognized command line option \"%s\"" +#~ msgstr "nicht erkannte Kommandozeilenoption »%s«" + +#~ msgid "-Wuninitialized is not supported without -O" +#~ msgstr "-Wuninitialized wird nicht ohne -O unterstützt" + +#~ msgid "unrecognized register name \"%s\"" +#~ msgstr "unbekannter Registername: \"%s\"" + +#~ msgid "unknown tls-model \"%s\"" +#~ msgstr "unbekanntes tls-Modell »%s«" + +#~ msgid "-fwritable-strings is deprecated; see documentation for details" +#~ msgstr "-fwritable-strings veraltet, schauen Sie in die Dokumentation für Details" + +#~ msgid "%s: --param arguments should be of the form NAME=VALUE" +#~ msgstr "%s: »--param«-Argumente sollten von der Form NAME=VALUE sein" + +#~ msgid "invalid --param value `%s'" +#~ msgstr "ungültiger Wert für --param: »%s«" + +#~ msgid "target system does not support debug output" +#~ msgstr "Zielsystem unterstützt nicht Testausgaben" + +#~ msgid "debug format \"%s\" conflicts with prior selection" +#~ msgstr "Testformat »%s« steht in Konflikt mit vorheriger Auswahl" + +#~ msgid "unrecognised debug output level \"%s\"" +#~ msgstr "Testausgabestufe »%s« nicht erkannt" + +#~ msgid "debug output level %s is too high" +#~ msgstr "Testausgabestufe »%s« ist zu groß" + +#~ msgid "The following options are language-independent:\n" +#~ msgstr "Die folgenden Optionen sind sprach-unabhängig:\n" + +#~ msgid "" +#~ "The %s front end recognizes the following options:\n" +#~ "\n" +#~ msgstr "" +#~ "Das %s-Frontend erkennt die folgenden Optionen:\n" +#~ "\n" + +#~ msgid "The --param option recognizes the following as parameters:\n" +#~ msgstr "Die Option »--param« erkennt die folgenden Parameter:\n" + +#~ msgid "invalid parameter `%s'" +#~ msgstr "ungültiger Parameter »%s«" + +#~ msgid "corrupted profile info: run_max * runs < sum_max" +#~ msgstr "beschädigte Profilinformation: run_max * runs < sum_max" + +#~ msgid "corrupted profile info: sum_all is smaller than sum_max" +#~ msgstr "beschädigte Profilinformation: sum_all ist kleiner als sum_max" + +#~ msgid "corrupted profile info: edge from %i to %i exceeds maximal count" +#~ msgstr "Info zum beschädigten Profil: Kante von %i nach %i überschreitet Höchstzahl" + +#~ msgid "corrupted profile info: number of iterations for basic block %d thought to be %i" +#~ msgstr "Info zum beschädigten Profil: Anzahl der Durchläufe des Basisblocks %d sollte %i sein" + +#~ msgid "corrupted profile info: number of executions for edge %d-%d thought to be %i" +#~ msgstr "Info zum beschädigten Profil: Anzahl der Ausführungen der Kante »%d-%d« sollte %i sein" + +#~ msgid "%s: internal abort\n" +#~ msgstr "%s: interner Abbruch\n" + +#~ msgid "%s: error writing file `%s': %s\n" +#~ msgstr "%s: Fehler beim Schreiben der Datei »%s«: %s\n" + +#~ msgid "%s: usage '%s [ -VqfnkN ] [ -i ] [ filename ... ]'\n" +#~ msgstr "%s: Aufruf '%s [ -VqfnkN ] [ -i ] [ Dateiname ... ]'\n" + +#~ msgid "%s: usage '%s [ -VqfnkNlgC ] [ -B ] [ filename ... ]'\n" +#~ msgstr "%s: Aufruf '%s [ -VqfnkNlgC ] [ -B ] [ Dateiname ... ]'\n" + +#~ msgid "%s: warning: no read access for file `%s'\n" +#~ msgstr "%s: Warnung: kein Leserecht für Datei »%s«\n" + +#~ msgid "%s: warning: no write access for file `%s'\n" +#~ msgstr "%s: Warnung: kein Schreibrecht für Datei »%s«\n" + +#~ msgid "%s: warning: no write access for dir containing `%s'\n" +#~ msgstr "%s: Warnung: kein Schreibrecht für Verzeichnis von »%s«\n" + +#~ msgid "%s: invalid file name: %s\n" +#~ msgstr "%s: ungültiger Dateiname: %s\n" + +#~ msgid "%s: %s: can't get status: %s\n" +#~ msgstr "%s: %s: kann Status nicht ermitteln: %s\n" + +#~ msgid "" +#~ "\n" +#~ "%s: fatal error: aux info file corrupted at line %d\n" +#~ msgstr "" +#~ "\n" +#~ "%s: kritischer Fehler: Datei mit Hilfsinformationen beschädigt in Zeile %d\n" + +#~ msgid "%s:%d: declaration of function `%s' takes different forms\n" +#~ msgstr "%s:%d: Deklaration der Funktion »%s« nimmt verschiedene Formen an\n" + +#~ msgid "%s: compiling `%s'\n" +#~ msgstr "%s: »%s« wird kompiliert\n" + +#~ msgid "%s: wait: %s\n" +#~ msgstr "%s: warten: %s\n" + +#~ msgid "%s: subprocess got fatal signal %d\n" +#~ msgstr "%s: Subprozess empfing kritischen Fehler %d\n" + +#~ msgid "%s: %s exited with status %d\n" +#~ msgstr "%s: %s beendet mit Status %d\n" + +#~ msgid "%s: warning: missing SYSCALLS file `%s'\n" +#~ msgstr "%s: Warnung: SYSCALLS-Datei »%s« fehlt\n" + +#~ msgid "%s: can't read aux info file `%s': %s\n" +#~ msgstr "%s: Datei mit Hilfsinformationen »%s« kann nicht gelesen werden: %s\n" + +#~ msgid "%s: can't get status of aux info file `%s': %s\n" +#~ msgstr "%s: Status der Datei mit Hilfsinformationen »%s« kann nicht ermittelt werden: %s\n" + +#~ msgid "%s: can't open aux info file `%s' for reading: %s\n" +#~ msgstr "%s: Datei mit Hilfsinformationen »%s« kann nicht zum Lesen geöffnet werden: %s\n" + +#~ msgid "%s: error reading aux info file `%s': %s\n" +#~ msgstr "%s: Fehler beim Lesen der Datei mit Hilfsinformationen »%s«: %s\n" + +#~ msgid "%s: error closing aux info file `%s': %s\n" +#~ msgstr "%s: Fehler beim Schließen der Datei mit Hilfsinformationen »%s«: %s\n" + +#~ msgid "%s: can't delete aux info file `%s': %s\n" +#~ msgstr "%s: Fehler beim Löschen der Datei mit Hilfsinformationen »%s«: %s\n" + +#~ msgid "%s: can't delete file `%s': %s\n" +#~ msgstr "%s: Fehler beim Löschen der Datei »%s«: %s\n" + +#~ msgid "%s: warning: can't rename file `%s' to `%s': %s\n" +#~ msgstr "%s: Warnung: Fehler beim Umbenennen der Datei »%s« in »%s«: %s\n" + +#~ msgid "%s: conflicting extern definitions of '%s'\n" +#~ msgstr "%s: externe Definitionen von »%s« stehen in Konflikt\n" + +#~ msgid "%s: declarations of '%s' will not be converted\n" +#~ msgstr "%s: Deklarationen von »%s« werden nicht konvertiert\n" + +#~ msgid "%s: conflict list for '%s' follows:\n" +#~ msgstr "%s: Konfliktliste für »%s« folgt:\n" + +#~ msgid "%s: warning: using formals list from %s(%d) for function `%s'\n" +#~ msgstr "%s: Warnung: Formalliste von %s(%d) für Funktion »%s« verwendet\n" + +#~ msgid "%s: %d: `%s' used but missing from SYSCALLS\n" +#~ msgstr "%s: %d: »%s« verwendet, fehlt jedoch in SYSCALLS\n" + +#~ msgid "%s: %d: warning: no extern definition for `%s'\n" +#~ msgstr "%s: %d: Warnung: keine externe Definition für »%s«\n" + +#~ msgid "%s: warning: no static definition for `%s' in file `%s'\n" +#~ msgstr "%s: Warnung: keine statische Definition für »%s« in Datei »%s«\n" + +#~ msgid "%s: multiple static defs of `%s' in file `%s'\n" +#~ msgstr "%s: mehrere statische Definitionen von »%s« in Datei »%s«\n" + +#~ msgid "%s: %d: warning: source too confusing\n" +#~ msgstr "%s: %d: Warnung: Quelle zu verworren\n" + +#~ msgid "%s: %d: warning: varargs function declaration not converted\n" +#~ msgstr "%s: %d: Warnung: Funktionsdeklaration mit variablen Argumenten nicht konvertiert\n" + +#~ msgid "%s: declaration of function `%s' not converted\n" +#~ msgstr "%s: Deklaration der Funktion »%s« nicht konvertiert\n" + +#~ msgid "%s: warning: too many parameter lists in declaration of `%s'\n" +#~ msgstr "%s: Warnung: zu viele Parameterlisten in Deklaration von »%s«\n" + +#~ msgid "" +#~ "\n" +#~ "%s: warning: too few parameter lists in declaration of `%s'\n" +#~ msgstr "" +#~ "\n" +#~ "%s: Warnung: zu wenige Parameterlisten in Deklaration von »%s«\n" + +#~ msgid "%s: %d: warning: found `%s' but expected `%s'\n" +#~ msgstr "%s: %d: Warnung: »%s« gefunden, aber »%s« erwartet\n" + +#~ msgid "%s: local declaration for function `%s' not inserted\n" +#~ msgstr "%s: lokale Deklaration für Funktion »%s« nicht eingefügt\n" + +#~ msgid "" +#~ "\n" +#~ "%s: %d: warning: can't add declaration of `%s' into macro call\n" +#~ msgstr "" +#~ "\n" +#~ "%s: %d: Warnung: kann Deklaration von »%s« nicht zu Makro-Aufruf hinzufügen\n" + +#~ msgid "%s: global declarations for file `%s' not inserted\n" +#~ msgstr "%s: globale Deklarationen für Datei »%s« wurden nicht eingefügt\n" + +#~ msgid "%s: definition of function `%s' not converted\n" +#~ msgstr "%s: Definition der Funktion »%s« nicht konvertiert\n" + +#~ msgid "%s: %d: warning: definition of %s not converted\n" +#~ msgstr "%s: %d: Warnung: Definition von %s nicht konvertiert\n" + +#~ msgid "%s: found definition of `%s' at %s(%d)\n" +#~ msgstr "%s: Definition von »%s« an Stelle %s(%d) gefunden\n" + +#~ msgid "%s: %d: warning: `%s' excluded by preprocessing\n" +#~ msgstr "%s: %d: Warnung: »%s« durch Präprozessor ausgeschlossen\n" + +#~ msgid "%s: function definition not converted\n" +#~ msgstr "%s: Funktionsdefinition nicht konvertiert\n" + +#~ msgid "%s: `%s' not converted\n" +#~ msgstr "%s: »%s« nicht konvertiert\n" + +#~ msgid "%s: would convert file `%s'\n" +#~ msgstr "%s: würde Datei »%s« konvertieren\n" + +#~ msgid "%s: converting file `%s'\n" +#~ msgstr "%s: Datei »%s« wird konvertiert\n" + +#~ msgid "%s: can't get status for file `%s': %s\n" +#~ msgstr "%s: Status der Datei »%s« kann nicht ermittelt werden: %s\n" + +#~ msgid "%s: can't open file `%s' for reading: %s\n" +#~ msgstr "%s: Datei »%s« kann nicht zum Schreiben geöffnet werden: %s\n" + +#~ msgid "" +#~ "\n" +#~ "%s: error reading input file `%s': %s\n" +#~ msgstr "" +#~ "\n" +#~ "%s: Fehler beim Lesen der Eingabedatei »%s«: %s\n" + +#~ msgid "%s: can't create/open clean file `%s': %s\n" +#~ msgstr "%s: die leere Datei »%s« kann nicht erzeugt oder geöffnet werden: %s\n" + +#~ msgid "%s: warning: file `%s' already saved in `%s'\n" +#~ msgstr "%s: Warnung: Datei »%s« bereits in »%s« gesichert\n" + +#~ msgid "%s: can't link file `%s' to `%s': %s\n" +#~ msgstr "%s: die Datei »%s« kann nicht mit »%s« verbunden werden (Link): %s\n" + +#~ msgid "%s: can't create/open output file `%s': %s\n" +#~ msgstr "%s: die Ausgabedatei »%s« kann nicht erzeugt oder geöffnet werden: %s\n" + +#~ msgid "%s: can't change mode of file `%s': %s\n" +#~ msgstr "%s: Rechte der Datei »%s« können nicht geändert werden: %s\n" + +#~ msgid "%s: cannot get working directory: %s\n" +#~ msgstr "%s: aktuelles Verzeichnis kann nicht ermittelt werden: %s\n" + +#~ msgid "%s: input file names must have .c suffixes: %s\n" +#~ msgstr "%s: Namen der Eingabedateien müssen Suffix ».c« haben: %s\n" + +#~ msgid "Didn't find a coloring.\n" +#~ msgstr "Färbung konnte nicht gefunden werden.\n" + +#~ msgid "output constraint %d must specify a single register" +#~ msgstr "Ausgabebedingung %d muss ein einzelnes Register angeben" + +#~ msgid "output constraint %d cannot be specified together with \"%s\" clobber" +#~ msgstr "Ausgabebedingung %d kann nicht zusammen mit »%s« angegeben werden" + +#~ msgid "output regs must be grouped at top of stack" +#~ msgstr "Ausgaberegister müssen oben auf dem Stack gruppiert werden" + +#~ msgid "implicitly popped regs must be grouped at top of stack" +#~ msgstr "implizit geholte (»pop«) Register müssen oben auf dem Stack gruppiert werden" + +#~ msgid "output operand %d must use `&' constraint" +#~ msgstr "Ausgabeoperand %d muss »&«-Bedingung benutzen" + +#~ msgid "can't use '%s' as a %s register" +#~ msgstr "»%s« kann nicht als ein %s-Register verwendet werden" + +#~ msgid "unknown register name: %s" +#~ msgstr "unbekannter Registername: %s" + +#~ msgid "global register variable follows a function definition" +#~ msgstr "globale Registervariable folgt einer Funktionsdefinition" + +#~ msgid "register used for two global register variables" +#~ msgstr "Register für zwei globale Registervariablen verwendet" + +#~ msgid "call-clobbered register used for global register variable" +#~ msgstr "für Ruf vorgesehenes Register wurde für globale Registervariable verwendet" + +#~ msgid "validate_value_data: [%u] Bad next_regno for empty chain (%u)" +#~ msgstr "validate_value_data: [%u] Falsches next_regno für leere Kette (%u)" + +#~ msgid "validate_value_data: Loop in regno chain (%u)" +#~ msgstr "validate_value_data: Zyklus in regno-Kette (%u)" + +#~ msgid "validate_value_data: [%u] Bad oldest_regno (%u)" +#~ msgstr "validate_value_data: [%u] Falsches oldest_regno (%u)" + +#~ msgid "validate_value_data: [%u] Non-empty reg in chain (%s %u %i)" +#~ msgstr "validate_value_data: [%u] Nicht leeres Register in Kette (%s %u %i)" + +#~ msgid "cannot reload integer constant operand in `asm'" +#~ msgstr "Ganzzahlkonstantenoperand kann in »asm« nicht neu geladen werden" + +#~ msgid "impossible register constraint in `asm'" +#~ msgstr "unmögliche Registerbedingung in »asm«" + +#~ msgid "`&' constraint used with no register class" +#~ msgstr "»&«-Bedingung ohne Registerklasse verwendet" + +#~ msgid "unable to generate reloads for:" +#~ msgstr "Neuladungen konnten nicht generiert werden für:" + +#~ msgid "inconsistent operand constraints in an `asm'" +#~ msgstr "inkonsistente Operandenbedingungen in einem »asm«" + +#~ msgid "frame size too large for reliable stack checking" +#~ msgstr "Rahmengröße zu groß für zuverlässige Kellerüberprüfung" + +#~ msgid "try reducing the number of local variables" +#~ msgstr "versuchen Sie, die Anzahl der lokalen Variablen zu verringern" + +#~ msgid "can't find a register in class `%s' while reloading `asm'" +#~ msgstr "in der Klasse »%s« konnte während des Neuladens von »asm« kein Register gefunden werden" + +#~ msgid "unable to find a register to spill in class `%s'" +#~ msgstr "in Klasse »%s« konnte kein Register für Überlauf gefunden werden" + +#~ msgid "this is the insn:" +#~ msgstr "dies ist das insn:" + +#~ msgid "`asm' operand requires impossible reload" +#~ msgstr "»asm«-Operand erfordert unmögliches Neuladen" + +#~ msgid "could not find a spill register" +#~ msgstr "es konnte kein Überlaufregister gefunden werden" + +#~ msgid "`asm' operand constraint incompatible with operand size" +#~ msgstr "»asm«-Operandenbedingung inkompatibel mit Operandengröße" + +#~ msgid "VOIDmode on an output" +#~ msgstr "VOIDmode bei einer Ausgabe" + +#~ msgid "output operand is constant in `asm'" +#~ msgstr "Ausgabeoperand ist in »asm« konstant" + +#~ msgid "unrecognizable insn:" +#~ msgstr "unerkennbares insn:" + +#~ msgid "insn does not satisfy its constraints:" +#~ msgstr "insn erfüllt nicht seine Bedingungen:" + +#~ msgid "RTL check: access of elt %d of `%s' with last elt %d in %s, at %s:%d" +#~ msgstr "RTL-Überprüfung: Zugriff von Elt %d von »%s« mit letztem Elt %d in %s, bei %s:%d" + +#~ msgid "RTL check: expected elt %d type '%c', have '%c' (rtx %s) in %s, at %s:%d" +#~ msgstr "RTL-Überprüfung: Elt-%d-Typ %c erwartet, haben Typ %c (rtx %s) in %s, bei %s:%d" + +#~ msgid "RTL check: expected elt %d type '%c' or '%c', have '%c' (rtx %s) in %s, at %s:%d" +#~ msgstr "RTL-Überprüfung: Elt-%d-Typ %c oder %c erwartet, haben Typ %c (rtx %s) in %s, bei %s:%d" + +#~ msgid "RTL check: expected code `%s', have `%s' in %s, at %s:%d" +#~ msgstr "RTL-Überprüfung: Code »%s« erwartet, haben »%s« in %s, bei %s:%d" + +#~ msgid "RTL check: expected code `%s' or `%s', have `%s' in %s, at %s:%d" +#~ msgstr "RTL-Überprüfung: Code »%s« oder »%s« erwartet, haben »%s« in %s, bei %s:%d" + +#~ msgid "RTL check: access of elt %d of vector with last elt %d in %s, at %s:%d" +#~ msgstr "RTL-Überprüfung: Zugriff von Elt %d von Vektor mit letztem Elt %d in %s, bei %s:%d" + +#~ msgid "RTL flag check: %s used with unexpected rtx code `%s' in %s, at %s:%d" +#~ msgstr "RTL-Kennzeichenüberprüfung: %s mit unerwartetem RTX-Code »%s« in %s bei %s:%d verwendet" + +#~ msgid "jump to `%s' invalidly jumps into binding contour" +#~ msgstr "Sprung zu »%s« springt ungültig in bindenden Querschnitt" + +#~ msgid "%Jlabel '%D' used before containing binding contour" +#~ msgstr "%JMarke »%D« verwendet vor enthaltendem bindenden Querschnitt" + +#~ msgid "output operand constraint lacks `='" +#~ msgstr "Bedingung des Ausgabeoperanden erfordert »=«" + +#~ msgid "output constraint `%c' for operand %d is not at the beginning" +#~ msgstr "Ausgabebedingung »%c« für Operand %d steht nicht am Anfang" + +#~ msgid "operand constraint contains incorrectly positioned '+' or '='" +#~ msgstr "Operandenbedingung enthält falsch positioniertes »+« oder »=«" + +#~ msgid "`%%' constraint used with last operand" +#~ msgstr "»%%«-Bedingung mit letztem Operanden verwendet" + +#~ msgid "matching constraint not valid in output operand" +#~ msgstr "dazu passende Bedingung in Ausgabeoperanden ungültig" + +#~ msgid "read-write constraint does not allow a register" +#~ msgstr "Schreib- und Lesebeschränkungen erlauben kein Register" + +#~ msgid "input operand constraint contains `%c'" +#~ msgstr "Bedingung für Eingabeoperanden enthält »%c«" + +#~ msgid "matching constraint references invalid operand number" +#~ msgstr "dazu passende Bedingung referenziert ungültige Operandennummer" + +#~ msgid "invalid punctuation `%c' in constraint" +#~ msgstr "ungültiges Zeichen »%c« in Bedingung" + +#~ msgid "matching constraint does not allow a register" +#~ msgstr "dazu passende Bedingung erlaubt kein Register" + +#~ msgid "asm-specifier for variable `%s' conflicts with asm clobber list" +#~ msgstr "asm-Spezifizierer für Variable »%s« steht in Konflikt mit asm-Konflikt-Liste" + +#~ msgid "unknown register name `%s' in `asm'" +#~ msgstr "unbekannter Registername »%s« in »asm«" + +#~ msgid "PIC register `%s' clobbered in `asm'" +#~ msgstr "PIC-Register »%s« wird in »asm« zerstört" + +#~ msgid "more than %d operands in `asm'" +#~ msgstr "mehr als %d Operanden in »asm«" + +#~ msgid "output number %d not directly addressable" +#~ msgstr "Ausgabezahl %d nicht direkt adressierbar" + +#~ msgid "asm operand %d probably doesn't match constraints" +#~ msgstr "asm-Operand %d passt wahrscheinlich nicht zu den Bedingungen" + +#~ msgid "use of memory input without lvalue in asm operand %d is deprecated" +#~ msgstr "die Verwendung einer Speichereingabe ohne L-Wert in asm-Operand %d ist veraltet" + +#~ msgid "asm clobber conflict with output operand" +#~ msgstr "asm-Konflikt mit Ausgabeoperand" + +#~ msgid "asm clobber conflict with input operand" +#~ msgstr "asm-Konflikt mit Eingabeoperand" + +#~ msgid "too many alternatives in `asm'" +#~ msgstr "zu viele Alternativen in »asm«" + +#~ msgid "operand constraints for `asm' differ in number of alternatives" +#~ msgstr "Operandenbedingungen für »asm« unterscheiden sich in der Anzahl der Alternativen" + +#~ msgid "duplicate asm operand name '%s'" +#~ msgstr "doppelter asm-Operandenname »%s«" + +#~ msgid "missing close brace for named operand" +#~ msgstr "schließende geschweifte Klammer für benannten Operanden fehlt" + +#~ msgid "undefined named operand '%s'" +#~ msgstr "benannter Operand »%s« ist nicht definiert" + +#~ msgid "%Hstatement with no effect" +#~ msgstr "%HAnweisung ohne Effekt" + +#~ msgid "%Hvalue computed is not used" +#~ msgstr "%Hberechneter Wert ist unbenutzt" + +#~ msgid "%Junused variable '%D'" +#~ msgstr "%JVariable »%D« wird nicht verwendet" + +#~ msgid "%Hunreachable code at beginning of %s" +#~ msgstr "%Hunerreichbarer Code am Anfang von %s" + +#~ msgid "enumeration value `%s' not handled in switch" +#~ msgstr "Aufzählungswert »%s« wird nicht von switch behandelt" + +#~ msgid "case value `%ld' not in enumerated type" +#~ msgstr "case-Wert »%ld« nicht in Aufzählungstyp" + +#~ msgid "case value `%ld' not in enumerated type `%s'" +#~ msgstr "case-Wert »%ld« nicht in Aufzählungstyp »%s«" + +#~ msgid "switch missing default case" +#~ msgstr "die Standardfallbehandlung in switch fehlt" + +#~ msgid "type size can't be explicitly evaluated" +#~ msgstr "die Typgröße kann nicht explizit ausgewertet werden" + +#~ msgid "variable-size type declared outside of any function" +#~ msgstr "Typ mit variabler Größe wurde außerhalb einer Funktion definiert" + +#~ msgid "%Jsize of '%D' is %d bytes" +#~ msgstr "%JGröße von »%Ds« ist %d Bytes" + +#~ msgid "%Jsize of '%D' is larger than %d bytes" +#~ msgstr "%JGröße von »%D« übertrifft %d Bytes" + +#~ msgid "%Jpacked attribute causes inefficient alignment for '%D'" +#~ msgstr "%Jgepacktes Attribut verursacht ineffiziente Ausrichtung für »%D«" + +#~ msgid "%Jpacked attribute is unnecessary for '%D'" +#~ msgstr "%Jgepacktes Attribut ist unnötig für »%D«" + +#~ msgid "%Jpadding struct to align '%D'" +#~ msgstr "%Jstruct wird aufgefüllt, um »%D« auszurichten" + +#~ msgid "padding struct size to alignment boundary" +#~ msgstr "struct wird bis zur Ausrichtungsgrenze aufgefüllt" + +#~ msgid "packed attribute causes inefficient alignment for `%s'" +#~ msgstr "gepacktes Attribut verursacht ineffiziente Ausrichtung für »%s«" + +#~ msgid "packed attribute is unnecessary for `%s'" +#~ msgstr "gepacktes Attribut ist unnötig für »%s«" + +#~ msgid "packed attribute causes inefficient alignment" +#~ msgstr "gepacktes Attribut führt zu ineffizienter Ausrichtung" + +#~ msgid "packed attribute is unnecessary" +#~ msgstr "gepacktes Attribut ist unnötig" + +#~ msgid "__builtin_saveregs not supported by this target" +#~ msgstr "__builtin_saveregs wird von diesem Ziel nicht unterstützt" + +#~ msgid "cannot timevar_pop '%s' when top of timevars stack is '%s'" +#~ msgstr "timevar_pop '%s' kann nicht ausgeführt werden, wenn am Anfang des timevars-Stacks '%s' steht" + +#~ msgid "" +#~ "\n" +#~ "Execution times (seconds)\n" +#~ msgstr "" +#~ "\n" +#~ "Ausführungszeiten (Sekunden)\n" + +#~ msgid " TOTAL :" +#~ msgstr " GESAMT :" + +#~ msgid "time in %s: %ld.%06ld (%ld%%)\n" +#~ msgstr "Zeit in %s: %ld.%06ld (%ld%%)\n" + +#~ msgid "collect: reading %s\n" +#~ msgstr "sammeln: %s lesen\n" + +#~ msgid "collect: recompiling %s\n" +#~ msgstr "sammeln: %s neu kompilieren\n" + +#~ msgid "collect: tweaking %s in %s\n" +#~ msgstr "sammeln: %s wird in %s eingestellt\n" + +#~ msgid "collect: relinking\n" +#~ msgstr "sammeln: neu binden\n" + +#~ msgid "ld returned %d exit status" +#~ msgstr "ld gab %d als Ende-Status zurück" + +#~ msgid "%s " +#~ msgstr "%s " + +#~ msgid " %s" +#~ msgstr " %s" + +#~ msgid "invalid option argument `%s'" +#~ msgstr "ungültiges Optionsargument »%s«" + +#~ msgid "getting core file size maximum limit: %m" +#~ msgstr "Kern-Dateigrößenlimit wird geholt: %m" + +#~ msgid "setting core file size limit to maximum: %m" +#~ msgstr "Kern-Dateigrößenlimit wird gesetzt: %m" + +#~ msgid "%J'%F' used but never defined" +#~ msgstr "%J»%F« verwendet, aber nirgendwo definiert" + +#~ msgid "%J'%F' declared `static' but never defined" +#~ msgstr "%J»%F« als »static« deklariert, aber nirgendwo definiert" + +#~ msgid "%J'%D' defined but not used" +#~ msgstr "%J»%D« definiert, aber nicht verwendet" + +#~ msgid "`%s' is deprecated (declared at %s:%d)" +#~ msgstr "»%s« ist veraltet (deklariert bei %s:%d)" + +#~ msgid "`%s' is deprecated" +#~ msgstr "»%s« ist veraltet" + +#~ msgid "type is deprecated (declared at %s:%d)" +#~ msgstr "Typ ist veraltet (in %s:%d deklariert)" + +#~ msgid "type is deprecated" +#~ msgstr "Typ ist veraltet" + +#~ msgid "invalid register name `%s' for register variable" +#~ msgstr "ungültiger Registername »%s« für Registervariable" + +#~ msgid "branch target register load optimization is not intended to be run twice" +#~ msgstr "Ladeoptimierung für Zweig-Zielregister ist nicht dafür vorgesehen, mehrfach zu laufen" + +#~ msgid "" +#~ "\n" +#~ "Target specific options:\n" +#~ msgstr "" +#~ "\n" +#~ "Zielspezifische Optionen:\n" + +#~ msgid " -m%-23s [undocumented]\n" +#~ msgstr " -m%-23s [undokumentiert]\n" + +#~ msgid "" +#~ "\n" +#~ "There are undocumented target specific options as well.\n" +#~ msgstr "" +#~ "\n" +#~ "Es gibt auch undokumentierte zielspezifische Optionen.\n" + +#~ msgid " They exist, but they are not documented.\n" +#~ msgstr " Es gibt sie, aber sie sind nicht dokumentiert.\n" + +#~ msgid "unrecognized gcc debugging option: %c" +#~ msgstr "gcc-Debuggingoption nicht erkannt: %c" + +#~ msgid "invalid option `%s'" +#~ msgstr "ungültige Option »%s«" + +#~ msgid "" +#~ "%s%s%s version %s (%s)\n" +#~ "%s\tcompiled by GNU C version %s.\n" +#~ "%s%s%s version %s (%s) compiled by CC.\n" +#~ msgstr "" +#~ "%s%s%s Version %s (%s)\n" +#~ "%s\tkompiliert von GNU-C-Version %s.\n" +#~ "%s%s%s Version %s (%s) kompiliert von CC.\n" + +#~ msgid "%s%sGGC heuristics: --param ggc-min-expand=%d --param ggc-min-heapsize=%d\n" +#~ msgstr "%s%sGGC-Heuristik: --param ggc-min-expand=%d --param ggc-min-heapsize=%d\n" + +#~ msgid "options passed: " +#~ msgstr "angegebene Optionen: " + +#~ msgid "options enabled: " +#~ msgstr "angeschaltete Optionen: " + +#~ msgid "can't open %s for writing: %m" +#~ msgstr "Datei »%s« kann nicht zum Schreiben geöffnet werden: %m" + +#~ msgid "created and used with different settings of -fpic" +#~ msgstr "erzeugt und mit anderen Einstellungen von -fpic verwendet" + +#~ msgid "created and used with different settings of -fpie" +#~ msgstr "erzeugt und mit anderen Einstellungen von -fpie verwendet" + +#~ msgid "created and used with differing settings of `-m%s'" +#~ msgstr "erzeugt und mit anderen Einstellungen von »-m%s« verwendet" + +#~ msgid "out of memory" +#~ msgstr "Platz im Hauptspeicher reicht nicht aus" + +#~ msgid "instruction scheduling not supported on this target machine" +#~ msgstr "Befehlsplanung wird von dieser Zielmaschine nicht unterstützt" + +#~ msgid "this target machine does not have delayed branches" +#~ msgstr "diese Zielmaschine hat keine verzögerten Zweige" + +#~ msgid "-f%sleading-underscore not supported on this target machine" +#~ msgstr "-f%sleading-underscore wird auf dieser Zielmaschine nicht unterstützt" + +#~ msgid "target system does not support the \"%s\" debug format" +#~ msgstr "Zielsystem unterstützt nicht das Testformat \"%s\"" + +#~ msgid "-ffunction-sections not supported for this target" +#~ msgstr "-ffunction-sections wird für dieses Ziel nicht unterstützt" + +#~ msgid "-fdata-sections not supported for this target" +#~ msgstr "-fdata-sections wird für dieses Ziel nicht unterstützt" + +#~ msgid "-ffunction-sections disabled; it makes profiling impossible" +#~ msgstr "-ffunction-sections ausgeschaltet; das macht Profiling unmöglich" + +#~ msgid "-fprefetch-loop-arrays not supported for this target" +#~ msgstr "-fprefetch-loop-arrays wird für dieses Ziel nicht unterstützt" + +#~ msgid "-fprefetch-loop-arrays not supported for this target (try -march switches)" +#~ msgstr "-fprefetch-loop-arrays wird für dieses Ziel nicht unterstützt (versuchen Sie die »-march«-Schalter)" + +#~ msgid "-fprefetch-loop-arrays is not supported with -Os" +#~ msgstr "-fprefetch-loop-arrays wird nicht mit -Os unterstützt" + +#~ msgid "-ffunction-sections may affect debugging on some targets" +#~ msgstr "-ffunction-sections kann für verschiedene Ziele die Fehlersuche beeinträchtigen" + +#~ msgid "error writing to %s: %m" +#~ msgstr "Fehler beim Schreiben der Datei %s: %m" + +#~ msgid "error closing %s: %m" +#~ msgstr "Fehler beim Schließen von %s: %m" + +#~ msgid "could not open dump file `%s'" +#~ msgstr "Abzugsdatei »%s« konnte nicht geöffnet werden" + +#~ msgid "ignoring unknown option `%.*s' in `-fdump-%s'" +#~ msgstr "unbekannte Option »%.*s« in »-fdump-%s« wird ignoriert" + +#~ msgid "%Jfunction '%F' can never be inlined because it uses alloca (override using the always_inline attribute)" +#~ msgstr "%Jdie Funktion »%F« kann nie »inline« sein, da sie alloca verwendet (zum Aufheben: Attribut »always_inline« verwenden)" + +#~ msgid "%Jfunction '%F' can never be inlined because it uses setjmp" +#~ msgstr "%Jdie Funktion »%F« kann nie »inline« sein, da sie setjmp verwendet" + +#~ msgid "%Jfunction '%F' can never be inlined because it uses variable argument lists" +#~ msgstr "%Jdie Funktion »%F« kann nie »inline« sein, da sie eine variable Argumentliste verwendet" + +#~ msgid "%Jfunction '%F' can never be inlined because it uses setjmp-longjmp exception handling" +#~ msgstr "%Jdie Funktion »%F« kann nie »inline« sein, da sie »setjmp-longjmp«-Ausnahmebehandlung verwendet" + +#~ msgid "%Jfunction '%F' can never be inlined because it contains a nested function" +#~ msgstr "%Jdie Funktion »%F« kann nie »inline« sein, da sie eine geschachtelte Funktion enthält" + +#~ msgid "%Jfunction '%F' can never be inlined because it contains a computed goto" +#~ msgstr "%Jdie Funktion »%F« kann nie »inline« sein, da sie ein berechnetes »goto« enthält" + +#~ msgid "%Jfunction '%F' can never be inlined because it contains a nonlocal goto" +#~ msgstr "%Jdie Funktion »%F« kann nie »inline« sein, da sie ein nichtlokales »goto« enthält" + +#~ msgid "%Jfunction '%F' can never be inlined because it uses variable sized variables" +#~ msgstr "%Jdie Funktion »%F« kann nie »inline« sein, da sie Variablen variabler Größe verwendet" + +#~ msgid "%Jinlining failed in call to '%F': %s" +#~ msgstr "%J»inline« beim Aufruf von »%F« gescheitert: %s" + +#~ msgid "%Jsize of return value of '%D' is %u bytes" +#~ msgstr "%JGröße des Rückgabewertes von »%D« ist %u Bytes" + +#~ msgid "%Jsize of return value of '%D' is larger than %wd bytes" +#~ msgstr "%JGröße des Rückgabewertes von »%D« ist größer als %wd Bytes" + +#~ msgid "arrays of functions are not meaningful" +#~ msgstr "Felder von Funktionen sind sinnlos" + +#~ msgid "function return type cannot be function" +#~ msgstr "Rückgabetyp der Funktion kann keine Funktion sein" + +#~ msgid "invalid initializer for bit string" +#~ msgstr "ungültige Initialisierung für Bitstring" + +#~ msgid "tree check: expected %s, have %s in %s, at %s:%d" +#~ msgstr "Baumprüfung: %s erwartet, haben %s in %s, bei %s:%d" + +#~ msgid "tree check: expected class '%c', have '%c' (%s) in %s, at %s:%d" +#~ msgstr "Baumprüfung: Klasse %c erwartet, haben '%c' (%s) in %s, bei %s:%d" + +#~ msgid "tree check: accessed elt %d of tree_vec with %d elts in %s, at %s:%d" +#~ msgstr "Baumprüfung: auf Elt %d von tree_vec mit %d Elts in %s bei %s:%d zugegriffen" + +#~ msgid "tree check: accessed operand %d of %s with %d operands in %s, at %s:%d" +#~ msgstr "Baumprüfung: auf Operand %d von %s mit %d Operanden in %s bei %s:%d zugegriffen" + +#~ msgid "%J%D causes a section type conflict" +#~ msgstr "%J%D löst einen Abschnittstypkonflikt aus" + +#~ msgid "%Jregister name not specified for '%D'" +#~ msgstr "%Jfür »%D« wurde kein Registername angegeben" + +#~ msgid "%Jinvalid register name for '%D'" +#~ msgstr "%Jungültiger Registername für »%D«" + +#~ msgid "%Jdata type of '%D' isn't suitable for a register" +#~ msgstr "%JDatentyp von »%D« eignet sich nicht für Register" + +#~ msgid "%Jregister specified for '%D' isn't suitable for data type" +#~ msgstr "%Jfür »%D« angegebenes Register eignet sich nicht für Datentyp" + +#~ msgid "global register variable has initial value" +#~ msgstr "globle Registervariable hat Anfangswert" + +#~ msgid "volatile register variables don't work as you might wish" +#~ msgstr "»volatile«-Registervariablen funktionieren oft nicht so wie erhofft" + +#~ msgid "%Jregister name given for non-register variable '%D'" +#~ msgstr "%JRegistername für Nicht-Registervariable »%D« verwendet" + +#~ msgid "%Jstorage size of `%D' isn't known" +#~ msgstr "%JSpeichergröße von »%D« ist unbekannt" + +#~ msgid "%Jalignment of '%D' is greater than maximum object file alignment. Using %d" +#~ msgstr "%JAusrichtung von »%D ist größer als maximale Objektdateiausrichtung. %d verwendet«" + +#~ msgid "thread-local COMMON data not implemented" +#~ msgstr "Thread-lokale COMMON-Daten nicht implementiert" + +#~ msgid "%Jrequested alignment for '%D' is greater than implemented alignment of %d" +#~ msgstr "%Jangeforderte Ausrichtung für »%D« ist größer als die implementierte Ausrichtung von %d" + +#~ msgid "initializer for integer value is too complicated" +#~ msgstr "Initialisierung für Ganzzahlwert ist zu kompliziert" + +#~ msgid "initializer for floating value is not a floating constant" +#~ msgstr "Initialisierung für Gleitkommawert ist keine Gleitkommakonstante" + +#~ msgid "unknown set constructor type" +#~ msgstr "unbekannter Mengenkonstruktortyp" + +#~ msgid "invalid initial value for member `%s'" +#~ msgstr "ungültiger Anfangswert für Element »%s«" + +#~ msgid "%Jweak declaration of '%D' must precede definition" +#~ msgstr "%Jschwache Deklaration von »%D« muss der Definition vorangehen" + +#~ msgid "%Jweak declaration of '%D' after first use results in unspecified behavior" +#~ msgstr "%Jschwache Deklaration von »%D« nach erster Benutzung führt zu undefiniertem Verhalten" + +#~ msgid "%Jweak declaration of '%D' must be public" +#~ msgstr "%Jschwache Deklaration von »%D« muss öffentlich sein" + +#~ msgid "%Jweak declaration of '%D' not supported" +#~ msgstr "%Jschwache Deklaration von »%D« wird nicht unterstützt" + +#~ msgid "only weak aliases are supported in this configuration" +#~ msgstr "in dieser Konfiguration werden nur schwache Aliase unterstützt" + +#~ msgid "alias definitions not supported in this configuration; ignored" +#~ msgstr "Alias-Definitionen werden in dieser Konfiguration nicht unterstützt; ignoriert" + +#~ msgid "visibility attribute not supported in this configuration; ignored" +#~ msgstr "Sichtbarkeitsattribute werden in dieser Konfiguration nicht unterstützt; ignoriert" + +#~ msgid "virtual array %s[%lu]: element %lu out of bounds in %s, at %s:%d" +#~ msgstr "virtuelles Feld %s[%lu]: Element %lu außerhalb der Grenzen in %s, bei %s:%d" + +#~ msgid "underflowed virtual array %s in %s, at %s:%d" +#~ msgstr "Unterlauf im virtuellen Feld %s in %s bei %s:%d" + +#~ msgid "no sclass for %s stab (0x%x)\n" +#~ msgstr "kein »sclass« für %s Stab (0x%x)\n" + +#~ msgid "fatal error: " +#~ msgstr "schwerwiegender Fehler: " + +#~ msgid "internal compiler error: " +#~ msgstr "interner Compiler-Fehler: " + +#~ msgid "sorry, unimplemented: " +#~ msgstr "nicht implementiert: " + +#~ msgid "anachronism: " +#~ msgstr "Anachronismus: " + +#~ msgid "note: " +#~ msgstr "Anmerkung: " + +#~ msgid "debug: " +#~ msgstr "zur Fehlersuche: " + +#~ msgid "The maximum number of instructions in a single function eligible for inlining" +#~ msgstr "Die Höchstzahl der Anweisungen in einer einzelnen für »inline« geeigneten Funktion" + +#~ msgid "The maximum number of instructions when automatically inlining" +#~ msgstr "Die Höchstzahl der Anweisungen für automatisches »inline«" + +#~ msgid "The maximum number of instructions for the RTL inliner" +#~ msgstr "Die Höchstzahl der Anweisungen für RTL »inline«" + +#~ msgid "The maximum number of instructions to consider to fill a delay slot" +#~ msgstr "Die Höchstzahl der zu betrachtenden Anweisungen um Verzögerungsschlitz zu füllen" + +#~ msgid "The maximum number of instructions to consider to find accurate live register information" +#~ msgstr "Die Höchstzahl der zu betrachtenden Anweisungen um richtige aktive Registerinformationen zu finden" + +#~ msgid "The maximum length of scheduling's pending operations list" +#~ msgstr "Die Maximallänge der Liste der anhängigen geplanten Operationen" + +#~ msgid "The size of function body to be considered large" +#~ msgstr "Die Größe eines als groß angesehenen Funktionskörpers" + +#~ msgid "Maximal growth due to inlining of large function (in percent)" +#~ msgstr "Maximales Wachstum durch »inline« einer großen Funktion (in Prozent)" + +#~ msgid "how much can given compilation unit grow because of the inlining (in percent)" +#~ msgstr "um wie viel eine Übersetzungseinheit durch »inline« wachsen kann (in Prozent)" + +#~ msgid "The maximum amount of memory to be allocated by GCSE" +#~ msgstr "Maximalbetrag des von GCSE zu belegenden Speichers" + +#~ msgid "The maximum number of passes to make when doing GCSE" +#~ msgstr "Die Höchstzahl der Durchläufe für GCSE" + +#~ msgid "The maximum number of instructions to consider to unroll in a loop" +#~ msgstr "Die Höchstzahl der zum Aufrollen von Schleifen zu betrachtenden Anweisungen" + +#~ msgid "The maximum number of instructions to consider to unroll in a loop on average" +#~ msgstr "Die Höchstzahl der zum Aufrollen von Schleifen im Mittel zu betrachtenden Anweisungen" + +#~ msgid "The maximum number of unrollings of a single loop" +#~ msgstr "Die Höchstzahl der Iterationen zum Aufrollen in einzelner Schleife" + +#~ msgid "The maximum number of insns of a peeled loop" +#~ msgstr "Die Höchstzahl der insns einer geschälten Schleife" + +#~ msgid "The maximum number of peelings of a single loop" +#~ msgstr "Die Höchstzahl der Schälvorgänge einer einzelnen Schleife" + +#~ msgid "The maximum number of insns of a completely peeled loop" +#~ msgstr "Die Höchstzahl der insns einer vollständig geschälten Schleife" + +#~ msgid "The maximum number of peelings of a single loop that is peeled completely" +#~ msgstr "Die Höchstzahl der Schälvorgänge einer einzelnen Schleife, die vollständig geschält wird" + +#~ msgid "The maximum number of insns of a peeled loop that rolls only once" +#~ msgstr "Die Höchstzahl der insns einer geschälten Schleife, die nur einmal rollt" + +#~ msgid "`%s' incompatible attribute ignored" +#~ msgstr "»%s«-inkompatibles Attribut wird ignoriert" + +#~ msgid "%Jfunction `%D' definition is marked dllimport." +#~ msgstr "%JFunktionsdefinition von »%D« ist als »dllimport« markiert" + +#~ msgid "%Jinline function '%D' is declared as dllimport: attribute ignored." +#~ msgstr "%J»inline«-Funktion »%D« ist als »dllimport« deklariert: Attribute ignoriert." + +#~ msgid "ms-bitfields not supported for objc" +#~ msgstr "ms-Bitfelder nicht unterstützt für objc" + +#~ msgid "%Jan address area attribute cannot be specified for local variables" +#~ msgstr "%Jfür lokale Variablen kann kein Adressabschnittsattribut angegeben werden" + +#~ msgid "%Jaddress area of '%s' conflicts with previous declaration" +#~ msgstr "%JAdressabschnitt von »%s« in Konflikt mit vorheriger Deklaration" + +#~ msgid "%Jaddress area attribute cannot be specified for functions" +#~ msgstr "%JAdressabschnittsattribut kann nicht für Funktionen angegeben werden" + +#~ msgid "The compiler does not support -march=%s." +#~ msgstr "Der Compiler unterstützt nicht -march=%s." + +#~ msgid "argument `%d' is not a constant" +#~ msgstr "Argument »%d« ist keine Konstante" + +#~ msgid "`trap' attribute is already used" +#~ msgstr "»trap«-Attribut wird bereits verwendet" + +#~ msgid "cannot specify both -msep-data and -mid-shared-library" +#~ msgstr "-msep-data und -mid-shared-library können nicht zusammen angegeben werden" + +#~ msgid "Generate code for a 68040, without any new instructions" +#~ msgstr "Code für einen 68040 ohne neue Befehle erzeugen" + +#~ msgid "Generate code for a 68060, without any new instructions" +#~ msgstr "Code für einen 68060 ohne neue Befehle erzeugen" + +#~ msgid "Generate code for a 68030" +#~ msgstr "Code für einen 68030 erzeugen" + +#~ msgid "Generate code for a 68040" +#~ msgstr "Code für einen 68040 erzeugen" + +#~ msgid "Generate code for a 68060" +#~ msgstr "Code für einen 68060 erzeugen" + +#~ msgid "Generate code for a 520X" +#~ msgstr "Code für einen 520X erzeugen" + +#~ msgid "Generate code for a 5206e" +#~ msgstr "Code für einen 5206e erzeugen" + +#~ msgid "Generate code for a 528x" +#~ msgstr "Code für einen 528x erzeugen" + +#~ msgid "Generate code for a 5307" +#~ msgstr "Code für einen 5307 erzeugen" + +#~ msgid "Generate code for a 5407" +#~ msgstr "Code für einen 5407 erzeugen" + +#~ msgid "Generate code for a 68851" +#~ msgstr "Code für einen 68851 erzeugen" + +#~ msgid "Do no generate code for a 68851" +#~ msgstr "Code für einen 68851 erzeugen" + +#~ msgid "Generate code for a 68302" +#~ msgstr "Code für einen 68302 erzeugen" + +#~ msgid "Generate code for a 68332" +#~ msgstr "Code für einen 68332 erzeugen" + +#~ msgid "Generate code for a cpu32" +#~ msgstr "Code für eine cpu32 erzeugen" + +#~ msgid "can't rewind temp file: %m" +#~ msgstr "temporäre Datei konnte nicht zurückgesetzt werden: %m" + +#~ msgid "can't write to output file: %m" +#~ msgstr "in die Ausgabedatei kann nicht geschrieben werden: %m" + +#~ msgid "can't read from temp file: %m" +#~ msgstr "von der temporären Datei kann nicht gelesen werden: %m" + +#~ msgid "can't close temp file: %m" +#~ msgstr "die temporäre Datei kann nicht geschlossen werden: %m" + +#~ msgid "-fpic is not supported; -fPIC assumed" +#~ msgstr "-fpic wird nicht unterstützt; -fPIC angenommen" + +#~ msgid "-m%s not supported in this configuration" +#~ msgstr "-m%s wird in dieser Konfiguration nicht unterstützt" + +#~ msgid "%Jdata area attributes cannot be specified for local variables" +#~ msgstr "%JDatenabschnittsattribute können nicht für lokale Variablen angegeben werden" + +#~ msgid "%Jdata area of '%D' conflicts with previous declaration" +#~ msgstr "%JDatenabschnitt von »%D« in Konflikt mit vorheriger Deklaration" + +#~ msgid "invalid %%x value" +#~ msgstr "ungültiger %%x-Wert" + +#~ msgid "invalid %%d value" +#~ msgstr "ungültiger %%x-Wert" + +#~ msgid "invalid %%t/%%b value" +#~ msgstr "ungültiger %%t/%%b-Wert" + +#~ msgid "missing argument to \"-%s\"" +#~ msgstr "fehlendes Argument für »-%s«" + +#~ msgid "%s for '%s' in '%s %E'" +#~ msgstr "%s vor »%s« in »%s %E«" + +#~ msgid "no suitable `operator %s' for `%T'" +#~ msgstr "kein geeigneter »operator %s« für »%T«" + +#~ msgid "cannot bind bitfield `%E' to `%T'" +#~ msgstr "das Bitfeld »%E« kann nicht mit »%T« verbunden werden" + +#~ msgid "cannot bind packed field `%E' to `%T'" +#~ msgstr "das gepackte Feld »%E« kann nicht mit »%T« verbunden werden" + +#~ msgid "cannot bind rvalue `%E' to `%T'" +#~ msgstr "der R-Wert »%E« kann nicht mit »%T« verbunden werden" + +#~ msgid "%s has no effect" +#~ msgstr "%s hat keinen Effekt" + +#~ msgid "%Jfunction '%D' redeclared as inline" +#~ msgstr "%JFunktion »%D« als inline redeklariert" + +#~ msgid "%Jprevious declaration of '%D' with attribute noinline" +#~ msgstr "%Jvorherige Deklaration von »%D« mit Attribut noinline" + +#~ msgid "%Jfunction '%D' redeclared with attribute noinline" +#~ msgstr "%JFunktion »%D« redeklariert mit Attribut noinline" + +#~ msgid "%Jprevious declaration of '%D' was inline" +#~ msgstr "%Jvorherige Deklaration von »%D« war inline" + +#~ msgid "conflicting declaration '%#D'" +#~ msgstr "in Konflikt stehende Deklaration »%#D«" + +#~ msgid "'%D' has a previous declaration as `%#D'" +#~ msgstr "»%D« hat eine vorherige Deklaration als »%#Ds«" + +#~ msgid "%Jfollows non-prototype definition here" +#~ msgstr "%Jfolgt Nicht-Prototyp-Definition hier" + +#~ msgid "%Jprevious non-inline declaration here" +#~ msgstr "%Jvorherige nicht-inline-Deklaration hier" + +#~ msgid "%Jconflicts with previous declaration here" +#~ msgstr "%Jin Konflikt mit vorheriger Deklaration hier" + +#~ msgid "%H from here" +#~ msgstr "%H von hier" + +#~ msgid "too many initializers for `%T'" +#~ msgstr "zu viele Initialisierer für »%T«" + +#~ msgid "size of array `%D' has non-integral type `%T'" +#~ msgstr "Feldgröße von »%D« hat Nicht-Ganzzahltyp »%T«" + +#~ msgid "size of array has non-integral type `%T'" +#~ msgstr "Feldgröße hat Nicht-Ganzzahltyp »%T«" + +#~ msgid "declaration of `%D' as %s" +#~ msgstr "Deklaration von »%D« als %s" + +#~ msgid "creating %s" +#~ msgstr "Erzeugen von %s" + +#~ msgid "top-level declaration of `%s' specifies `auto'" +#~ msgstr "Deklaration höchster Ebene von »%s« spezifiziert »auto«" + +#~ msgid "%Jinvalid type qualifier for non-member function type" +#~ msgstr "%Jungültiger Typkennzeichner für Nicht-Element-Funktionstyp" + +#~ msgid "%Jprevious definition here" +#~ msgstr "%Jvorherige Definition hier" + +#~ msgid "invalid member function declaration" +#~ msgstr "ungültige Elementfunktionsdeklaration" + +#~ msgid "anonymous union with no members" +#~ msgstr "anonymes union ohne Element" + +#~ msgid "inline function `%D' used but never defined" +#~ msgstr "inline-Funktion »%D«, aber nirgendwo definiert" + +#~ msgid " when initialized here" +#~ msgstr " während es hier initialisiert wurde" + +#~ msgid "`%#D' is not a non-static data member of `%T'" +#~ msgstr "»%#D« ist kein Nicht-static-Datenelement von »%T«" + +#~ msgid "invalid use of non-static member function `%D'" +#~ msgstr "ungültige Verwendung der Nicht-static-Elementfunktion »%D«" + +#~ msgid "invalid use of non-static data member `%D'" +#~ msgstr "ungültige Verwendung des Nicht-static-Datenelementes »%D«" + +#~ msgid "type mismatch with previous external decl of `%#D'" +#~ msgstr "Typen passen nicht zu vorheriger externer Deklaration von »%#D«" + +#~ msgid "%s %s %p %d\n" +#~ msgstr "%s %s %p %d\n" + +#~ msgid "`%D' attribute directive ignored" +#~ msgstr "Attribut-Anweisung »%D« wird ignoriert" + +#~ msgid "invalid token" +#~ msgstr "ungültiges Token" + +#~ msgid "`%D::%D' has not been declared" +#~ msgstr "»%D::%D« wurde nicht deklariert" + +#~ msgid "`::%D' has not been declared" +#~ msgstr "»::%D« wurde nicht deklariert" + +#~ msgid "`%D' has not been declared" +#~ msgstr "»%D« wurde nicht deklariert" + +#~ msgid "`%D' %s" +#~ msgstr "»%D« %s" + +#~ msgid "invalid template-id" +#~ msgstr "ungültige Template-ID" + +#~ msgid "%s cannot appear in a constant-expression" +#~ msgstr "%s kann nicht in einem Konstanten-Ausdruck auftreten" + +#~ msgid "`%s' does not name a type" +#~ msgstr "»%s« bezeichnet keinen Typ" + +#~ msgid "statement-expressions are allowed only inside functions" +#~ msgstr "Anweisungs-Ausdrücke sind nur innerhalb von Funktionen erlaubt" + +#~ msgid "ISO C++ forbids compound-literals" +#~ msgstr "ISO-C++ verbietet zusammengesetzte Literale" + +#~ msgid "duplicate `friend'" +#~ msgstr "doppeltes »friend«" + +#~ msgid "attributes are not allowed on a function-definition" +#~ msgstr "bei einer Funktionsdefinition sind keine Attribute erlaubt" + +#~ msgid "attributes after parenthesized initializer ignored" +#~ msgstr "Attribute hinter geklammerter Initialisierung werden ignoriert" + +#~ msgid "friend declaration does not name a class or function" +#~ msgstr "»friend«-Deklaration benennt keine Klasse oder Funktion" + +#~ msgid "invalid function declaration" +#~ msgstr "ungültige Funktionsdeklaration" + +#~ msgid "named return values are no longer supported" +#~ msgstr "benannte Rückgabewerte werden nicht mehr unterstützt" + +#~ msgid "%D redeclared with different access" +#~ msgstr "%D mit anderem Zugriff redeklariert" + +#~ msgid "destructor `%D' declared as member template" +#~ msgstr "Destruktor »%D« als Element-Template deklariert" + +#~ msgid "%J original definition appeared here" +#~ msgstr "%J ursprüngliche Definition trat hier auf" + +#~ msgid "`%T' uses anonymous type" +#~ msgstr "»%T« verwendet anonymen Typen" + +#~ msgid "`%T' uses local type `%T'" +#~ msgstr "»%T« verwendet lokalen Typen »%T«" + +#~ msgid "integral expression `%E' is not constant" +#~ msgstr "Integralausdruck »%E« ist nicht konstant" + +#~ msgid "object missing in reference to `%D'" +#~ msgstr "Objekt fehlt in Referenz auf »%D«" + +#~ msgid "`%D' is not a member of `%D'" +#~ msgstr "»%D« ist kein Element von »%D«" + +#~ msgid "`%D' cannot appear in a constant-expression" +#~ msgstr "»%D« kann nicht in Konstanten-Ausdruck auftreten" + +#~ msgid "%s between distinct pointer-to-member types `%T' and `%T' lacks a cast" +#~ msgstr "%s zwischen verschiedenen Zeiger-auf-Element-Typen »%T« und »%T« fehlt eine Typkonvertierung" + +#~ msgid "invalid application of `%s' to a bit-field" +#~ msgstr "ungültige Anwendung von »%s« auf ein Bitfeld" + +#~ msgid "ISO C++ forbids applying `%s' to an expression of function type" +#~ msgstr "ISO-C++ verbietet Anwendung von »%s« auf einen Ausdruck mit Funktionstyp" + +#~ msgid "invalid use of non-static member function" +#~ msgstr "falsche Benutzung einer nicht-statischen Elementfunktion" + +#~ msgid "invalid use of nonstatic data member '%E'" +#~ msgstr "ungültige Benutzung des nicht-statischen Datenelements »%E«" + +#~ msgid "parameter %P of `%D' has incomplete type `%T'" +#~ msgstr "Parameter %P von »%D« hat unvollständigen Typen »%T«" + +#~ msgid "parameter %P has incomplete type `%T'" +#~ msgstr "Parameter %P hat unvollständigen Typen »%T«" + +#~ msgid "%s expression list treated as compound expression" +#~ msgstr "%s Ausdrucksliste als zusammengesetzten Ausdruck behandelt" + +#~ msgid "pointer to member cast via virtual base `%T'" +#~ msgstr "Typumwandlung von Zeiger in Element über virtuelle Basis »%T«" + +#~ msgid "pointer to member conversion via virtual base `%T'" +#~ msgstr "Konvertierung von Zeiger in Element über virtuelle Basis »%T«" + +#~ msgid "return-statement with no value, in function returning '%T'" +#~ msgstr "Return-Anweisung ohne Wert, in »%T« zurückgebender Funktion" + +#~ msgid "return-statement with a value, in function returning 'void'" +#~ msgstr "Return-Anweisung mit Wert in »void« zurückgebender Funktion" + +#~ msgid "Please keep this in mind before you report bugs." +#~ msgstr "Bitte bedenken Sie dies, wenn Sie einen Fehlerbericht einsenden." + +#~ msgid "%Jfinal field '%D' may not have been initialized" +#~ msgstr "%Jletztes Feld »%D« könnte nicht initialisiert worden sein" + +#~ msgid "%J'%D' used prior to declaration" +#~ msgstr "%J»%D« bereits vor Deklaration benutzt" + +#~ msgid "declaration of `%s' shadows a parameter" +#~ msgstr "Deklaration von »%s« überdeckt einen Parameter" + +#~ msgid "declaration of `%s' shadows a symbol from the parameter list" +#~ msgstr "Deklaration von »%s« überdeckt ein Symbol aus der Parameterliste" + +#~ msgid "%Jlabel '%D' used but not defined" +#~ msgstr "%JMarke »%D« verwendet, aber nicht definiert" + +#~ msgid "%Jlabel '%D' defined but not used" +#~ msgstr "%JMarke »%D« definiert, aber nicht verwendet" + +#~ msgid "can't reopen %s: %m" +#~ msgstr "Es ist nicht möglich, »%s« erneut zu öffnen: %m" + +#~ msgid "can't close %s: %m" +#~ msgstr "Es ist nicht möglich, »%s« zu schließen: %m" + +#~ msgid "can't close input file %s: %m" +#~ msgstr "die Eingabedatei »%s« kann nicht geschlossen werden: %m" + +#~ msgid "can't create directory %s: %m" +#~ msgstr "das Verzeichnis %s kann nicht erzeugt werden: %m" + +#~ msgid "can't create %s: %m" +#~ msgstr "Es ist nicht möglich, %s zu erzeugen: %m" + +#~ msgid "`%s' is not a valid class name" +#~ msgstr "»%s« ist kein gültiger Klassenname" + +#~ msgid "--resource requires -o" +#~ msgstr "--resource erfordert -o" + +#~ msgid "cannot specify both -C and -o" +#~ msgstr "-C und -o können nicht zusammen angegeben werden" + +#~ msgid "cannot create temporary file" +#~ msgstr "temporäre Datei konnte nicht angelegt werden" + +#~ msgid "interface `%s' does not have valid constant string layout" +#~ msgstr "die Schnittstelle »%s« hat nicht die Form einer konstanten Zeichenkette" + +#~ msgid "`%s' is not an Objective-C class name or alias" +#~ msgstr "»%s« ist kein Klassenname oder Alias in Objective-C" + +#~ msgid "`%s' redeclared as different kind of symbol" +#~ msgstr "»%s« redeklariert als andere Symbolart" + +#~ msgid "%J%s `%s'" +#~ msgstr "%J%s: »%s«" + +#~ msgid "multiple %s named `%c%s' found" +#~ msgstr "mehrere %s namens »%c%s« gefunden" + +#~ msgid "no super class declared in @interface for `%s'" +#~ msgstr "keine Superklasse im @interface für »%s« deklariert" + +#~ msgid "`%s' may not respond to `%c%s'" +#~ msgstr "»%s« antwortet möglicherweise nicht auf »%c%s«" + +#~ msgid "`%c%s' not implemented by protocol(s)" +#~ msgstr "»%c%s« nicht von Protokoll(en) implementiert" + +#~ msgid "`...' as arguments.)" +#~ msgstr "»...« als Argumente.)" + +#~ msgid "duplicate declaration of method `%c%s'" +#~ msgstr "doppelte Deklaration der Methode »%c%s«" + +#~ msgid "illegal reference type specified for instance variable `%s'" +#~ msgstr "unzulässiger Referenztyp für Instanzvariable »%s« angegeben" + +#~ msgid "instance variable `%s' has unknown size" +#~ msgstr "Instanzvariable »%s« hat unbekannte Größe" + +#~ msgid "type `%s' has virtual member functions" +#~ msgstr "der Typ »%s« hat virtuelle Elementfunktionen" + +#~ msgid "illegal aggregate type `%s' specified for instance variable `%s'" +#~ msgstr "unzulässiger Aggregattyp »%s« für Instanzvariable »%s« angegeben" + +#~ msgid "%s `%s' does not fully implement the `%s' protocol" +#~ msgstr "%s »%s« implementiert das »%s«-Protokoll nicht vollständig" + +#~ msgid "previous declaration of `%s'" +#~ msgstr "vorherige Deklaration von »%s«" + +#~ msgid "Display this information" +#~ msgstr "Diese Informationen anzeigen" + +#~ msgid "Do not discard comments" +#~ msgstr "Kommentare nicht verwerfen" + +#~ msgid "Warn about subscripts whose type is \"char\"" +#~ msgstr "Vor Indizes mit Typ \"char\" warnen" + +#~ msgid "Make implicit function declarations an error" +#~ msgstr "Fehler bei impliziten Funktionsdeklaration erzeugen" + +#~ msgid "Warn if passing too many arguments to a function for its format string" +#~ msgstr "Bei zu vielen Argumenten für eine Funktion (anhand Formatzeichenkette) warnen" + +#~ msgid "Warn about suspicious declarations of \"main\"" +#~ msgstr "Vor verdächtigen Deklarationen von \"main\" warnen" + +#~ msgid "Warn about global functions without previous declarations" +#~ msgstr "Vor globalen Funktionen ohne vorherige Deklaration warnen" + +#~ msgid "Warn about functions which might be candidates for __attribute__((noreturn))" +#~ msgstr "Vor Funktionen, die Kandidaten für __attribute__((noreturn)) sind, warnen" + +#~ msgid "Warn about use of multi-character character constants" +#~ msgstr "Bei Verwendung von Zeichenkonstanten mit mehreren Zeichen warnen" + +#~ msgid "Warn about \"extern\" declarations not at file scope" +#~ msgstr "Vor \"extern\"-Deklarationen außerhalb des Dateisichtbarkeitsbereiches warnen" + +#~ msgid "Warn about code which might break strict aliasing rules" +#~ msgstr "Vor Code warnen, der strict-aliasing-Regeln verletzen könnte" + +#~ msgid "Warn about unprototyped function declarations" +#~ msgstr "Vor Funktionsdeklarationen ohne Prototyp warnen" + +#~ msgid "Warn about features not present in traditional C" +#~ msgstr "Vor Sprachmerkmalen, die in traditionellem C nicht verfügbar sind, warnen" + +#~ msgid "Recognize built-in functions" +#~ msgstr "Eingebaute Funktionen erkennen" + +#~ msgid "Preserve case used in program" +#~ msgstr "Im Programm verwendete Groß-/Kleinschreibung beibehalten" + +#~ msgid "Inline member functions by default" +#~ msgstr "Standardmäßig »inline«-Elementfunktionen" + +#~ msgid "Permit '$' as an identifier character" +#~ msgstr "'$' als Bezeichnerzeichen zulassen" + +#~ msgid "Generate code to check exception specifications" +#~ msgstr "Code zur Überprüfung von Exception-Spezifikationen erzeugen" + +#~ msgid "Place each function into its own section" +#~ msgstr "Jede Funktion in ihren eigenen Abschnitt platzieren" + +#~ msgid "Generate code for GNU runtime environment" +#~ msgstr "Code für die GNU-Laufzeitumgebung erzeugen" + +#~ msgid "Generate code for NeXT (Apple Mac OS X) runtime environment" +#~ msgstr "Code für die NeXT (Apple Mac OS X) Laufzeitumgebung erzeugen" + +#~ msgid "Convert floating point constants to single precision constants" +#~ msgstr "Fließkommakonstanten in Konstanten einfacher Genauigkeit konvertieren" + +#~ msgid "Print internal debugging-related information" +#~ msgstr "Interne Testinformationen ausgeben" + +#~ msgid "Dump declarations to a .decl file" +#~ msgstr "Deklaration in .decl-Datei ausgeben" + +#~ msgid "-o \tPlace output into " +#~ msgstr "-o \tAusgabe in schreiben" + +#~ msgid "Generate C header of platform-specific features" +#~ msgstr "C-Header mit Plattform-spezifischen Merkmalen erzeugen" + +#~ msgid "Remap file names when including files" +#~ msgstr "Dateinamen beim Einfügen von Dateien neu abbilden" + +#~ msgid "GCC does not support -C or -CC without -E" +#~ msgstr "GCC unterstützt nicht -C oder -CC ohne -E" + +#~ msgid "-pipe is not supported" +#~ msgstr "-pipe wird nicht unterstützt" + +#~ msgid "-keep_private_externs not allowed with -dynamiclib" +#~ msgstr "-keep_private_externs ist mit -dynamiclib nicht erlaubt" + +#~ msgid "-private_bundle not allowed with -dynamiclib" +#~ msgstr "-private_bundle ist mit -dynamiclib nicht erlaubt" + +#~ msgid "-pg not supported on this platform" +#~ msgstr "-pg wird auf dieser Plattform nicht unterstützt" + +#~ msgid "GCC does not support -C without using -E" +#~ msgstr "GCC unterstützt nicht -C ohne -E" + +#~ msgid "GCC does not support -CC without using -E" +#~ msgstr "GCC unterstützt nicht -CC ohne -E" + +#~ msgid "`-p' not supported; use `-pg' and gprof(1)" +#~ msgstr "»-p« wird nicht unterstützt; verwenden Sie »-pg« und gprof(1)" + +#~ msgid "may not use both -m32 and -m64" +#~ msgstr "-m32 und -m64 können nicht zusammen angegeben werden" + +#~ msgid "profiling not supported with -mg\n" +#~ msgstr "Profiling wird mit -mg nicht unterstützt\n" + +#~ msgid "does not support multilib" +#~ msgstr "unterstützt nicht multilib" + +#~ msgid "concatenation of string literals with __FUNCTION__ is deprecated" +#~ msgstr "Verkettung von Zeichenkettenliteralen mit __FUNCTION__ ist veraltet" + +#~ msgid "ISO C++ forbids range expressions in switch statements" +#~ msgstr "ISO-C++ verbietet Wertebereichsausdrücke in switch-Anweisungen" + +#~ msgid "ISO C++ forbids taking the address of a label" +#~ msgstr "ISO-C++ verbietet die Adresse einer Marke" + +#~ msgid "declaration of `%s' shadows %s" +#~ msgstr "Deklaration von »%s« verdeckt %s" + +#~ msgid "`struct %s' incomplete in scope ending here" +#~ msgstr "»struct %s« im Gültigkeitsbereich, der hier endet, unvollständig" + +#~ msgid "`union %s' incomplete in scope ending here" +#~ msgstr "»union %s« im Gültigkeitsbereich, der hier endet, unvollständig" + +#~ msgid "`enum %s' incomplete in scope ending here" +#~ msgstr "»enum %s« im Gültigkeitsbereich, der hier endet, unvollständig" + +#~ msgid "shadowing library function `%s'" +#~ msgstr "Bibliotheksfunktion »%s« überdeckt" + +#~ msgid "library function `%s' declared as non-function" +#~ msgstr "Bibliotheksfunktion »%s« als Nicht-Funktion deklariert" + +#~ msgid "redeclaration of `%s'" +#~ msgstr "Redeklaration von »%s«" + +#~ msgid "prototype for `%s' follows and number of arguments doesn't match" +#~ msgstr "Prototyp für »%s« folgt und Anzahl der Argumente passt nicht" + +#~ msgid "prototype for `%s' follows and argument %d doesn't match" +#~ msgstr "Prototyp für »%s« folgt und Argument %d passt nicht" + +#~ msgid "type qualifiers for `%s' conflict with previous decl" +#~ msgstr "Typ-Kennzeichner für »%s« stehen in Konflikt mit vorheriger Deklaration" + +#~ msgid "a parameter" +#~ msgstr "ein Parameter" + +#~ msgid "a previous local" +#~ msgstr "ein vorheriges »local«" + +#~ msgid "a global declaration" +#~ msgstr "eine globale Deklaration" + +#~ msgid "`%s' was declared implicitly `extern' and later `static'" +#~ msgstr "»%s« wurde implizit als »extern« und später als »static« deklariert" + +#~ msgid "previous external decl of `%s'" +#~ msgstr "vorherige externe Deklaration von »%s«" + +#~ msgid "type mismatch with previous implicit declaration" +#~ msgstr "Typen passen nicht zu vorheriger impliziter Deklaration" + +#~ msgid "`%s' was previously implicitly declared to return `int'" +#~ msgstr "»%s« wurde bereits implizit deklariert, »int« zurückzugeben" + +#~ msgid "`%s' was declared `extern' and later `static'" +#~ msgstr "»%s« wurde »extern« deklariert und später »static«" + +#~ msgid "`%s' locally external but globally static" +#~ msgstr "»%s« ist lokal extern, aber global »static«" + +#~ msgid "function `%s' was previously declared within a block" +#~ msgstr "Funktion »%s« wurde bereits innerhalb eines Blockes deklariert" + +#~ msgid "declaration of `%s' has `extern' and is initialized" +#~ msgstr "Deklaration von »%s« hat »extern« und ist initialisiert" + +#~ msgid "ISO C forbids parameter `%s' shadowing typedef" +#~ msgstr "ISO-C verbietet typedef verdeckenden Parameter »%s«" + +#~ msgid "parameter `%s' points to incomplete type" +#~ msgstr "Parameter »%s« zeigt auf unvollständigen Typen" + +#~ msgid "parameter points to incomplete type" +#~ msgstr "Parameter zeigt auf unvollständigen Typen" + +#~ msgid "`void' in parameter list must be the entire list" +#~ msgstr "»void« in Parameterliste muss die gesamte Liste sein" + +#~ msgid "`union %s' declared inside parameter list" +#~ msgstr "»union %s« innerhalb Parameterliste deklariert" + +#~ msgid "`enum %s' declared inside parameter list" +#~ msgstr "»enum %s« innerhalb Parameterliste deklariert" + +#~ msgid "anonymous enum declared inside parameter list" +#~ msgstr "anonymes »enum« innerhalb Parameterliste deklariert" + +#~ msgid "bit-field `%s' type invalid in ISO C" +#~ msgstr "Typ des Bitfeldes »%s« ist ungültig in ISO-C" + +#~ msgid "parm types given both in parmlist and separately" +#~ msgstr "Parametertypen sowohl in Parameterliste als auch separat angegeben" + +#~ msgid "universal-character-name '\\u%04x' not valid in identifier" +#~ msgstr "universeller Zeichenname »\\u%04x« nicht gültig in Bezeichner" + +#~ msgid "ignoring invalid multibyte character" +#~ msgstr "ungültiges Multibyte-Zeichen wird ignoriert" + +#~ msgid "options array incorrectly sorted: %s is before %s" +#~ msgstr "Optionenliste falsch sortiert: %s kommt vor %s" + +#~ msgid "-Wno-strict-prototypes is not supported in C++" +#~ msgstr "-Wno-strict-prototypes wird in C++ nicht unterstützt" + +#~ msgid "" +#~ "Switches:\n" +#~ " -include Include the contents of before other files\n" +#~ " -imacros Accept definition of macros in \n" +#~ " -iprefix Specify as a prefix for next two options\n" +#~ " -iwithprefix Add to the end of the system include path\n" +#~ " -iwithprefixbefore Add to the end of the main include path\n" +#~ " -isystem Add to the start of the system include path\n" +#~ msgstr "" +#~ "Optionen:\n" +#~ " -include Inhalt von vor anderen Dateien einfügen\n" +#~ " -imacros die Definition von Makros in akzeptieren\n" +#~ " -iprefix als Präfix für die nächsten beiden Optionen\n" +#~ " angeben\n" +#~ " -iwithprefix zum Ende des System-Einfüge-Pfades\n" +#~ " hinzufügen\n" +#~ " -iwithprefixbefore zum das Ende des Haupt-Einfüge-Pfades\n" +#~ " hinzufügen\n" +#~ " -isystem zum Anfang des System-Einfüge-Pfades\n" +#~ " hinzufügen\n" + +#~ msgid "" +#~ " -idirafter Add to the end of the system include path\n" +#~ " -I Add to the end of the main include path\n" +#~ " -I- Fine-grained include path control; see info docs\n" +#~ " -nostdinc Do not search system include directories\n" +#~ " (dirs specified with -isystem will still be used)\n" +#~ " -nostdinc++ Do not search system include directories for C++\n" +#~ " -o Put output into \n" +#~ msgstr "" +#~ " -idirafter zum Ende des System-Einfüge-Pfades\n" +#~ " hinzufügen\n" +#~ " -I zum Anfang des Haupt-Einfüge-Pfades\n" +#~ " hinzufügen\n" +#~ " -I- Feineinstellung des Einfügepfades; siehe info-\n" +#~ " Seiten\n" +#~ " -nostdinc keine System-Einfüge-Verzeichnisse durchsuchen\n" +#~ " (-isystem Verzeichnisse werden aber verwendet)\n" +#~ " -nostdinc++ keine System-Einfüge-Verzeichnisse nach C++\n" +#~ " durchsuchen\n" +#~ " -o Ausgabe in leiten\n" + +#~ msgid "" +#~ " -trigraphs Support ISO C trigraphs\n" +#~ " -std= Specify the conformance standard; one of:\n" +#~ " gnu89, gnu99, c89, c99, iso9899:1990,\n" +#~ " iso9899:199409, iso9899:1999, c++98\n" +#~ " -w Inhibit warning messages\n" +#~ " -W[no-]trigraphs Warn if trigraphs are encountered\n" +#~ " -W[no-]comment{s} Warn if one comment starts inside another\n" +#~ msgstr "" +#~ " -trigraphs ISO-C-»Trigraphs« unterstützen\n" +#~ " -std= Standardkonformität angeben; eines von:\n" +#~ " gnu89, gnu99, c89, c99, iso9899:1990,\n" +#~ " iso9899:199409, iso9899:1999, c++98\n" +#~ " -w Warnungen unterdrücken\n" +#~ " -W[no-]trigraphs Warnungen bei »Trigraphs«\n" +#~ " -W[no-]comment{s} Warnungen bei geschachtelten Kommentaren\n" + +#~ msgid "" +#~ " -W[no-]traditional Warn about features not present in traditional C\n" +#~ " -W[no-]undef Warn if an undefined macro is used by #if\n" +#~ " -W[no-]import Warn about the use of the #import directive\n" +#~ msgstr "" +#~ " -W[no-]traditional Warnungen bei Merkmalen von traditionellem C\n" +#~ " -W[no-]undef Warnungen bei Verwendung undefinierter Makros\n" +#~ " mit #if\n" +#~ " -W[no-]import Warnungen über die Verwendung der Direktive\n" +#~ " #import\n" + +#~ msgid "" +#~ " -W[no-]error Treat all warnings as errors\n" +#~ " -W[no-]system-headers Do not suppress warnings from system headers\n" +#~ " -W[no-]all Enable most preprocessor warnings\n" +#~ msgstr "" +#~ " -W[no-]error alle Warnungen als Fehler behandeln\n" +#~ " -W[no-]system-headers keine Warnungen von System-Headern unterdrücken\n" +#~ " -W[no-]all die meisten Präprozessorwarnungen einschalten\n" + +#~ msgid "" +#~ " -M Generate make dependencies\n" +#~ " -MM As -M, but ignore system header files\n" +#~ " -MD Generate make dependencies and compile\n" +#~ " -MMD As -MD, but ignore system header files\n" +#~ " -MF Write dependency output to the given file\n" +#~ " -MG Treat missing header file as generated files\n" +#~ msgstr "" +#~ " -M make-Abhängigkeiten generieren\n" +#~ " -MM wie -M, aber System-Header ignorieren\n" +#~ " -MD make-Abhängigkeiten generieren und kompilieren\n" +#~ " -MMD wie -MD, aber System-Header ignorieren\n" +#~ " -MF Abhängigkeiten-Ausgabe in die angegebene Datei\n" +#~ " schreiben\n" +#~ " -MG fehlende Header-Dateien als generierte Dateien\n" +#~ " behandeln\n" + +#~ msgid "" +#~ " -MP\t\t\t Generate phony targets for all headers\n" +#~ " -MQ Add a MAKE-quoted target\n" +#~ " -MT Add an unquoted target\n" +#~ msgstr "" +#~ " -MP\t\t\t Generiere falsche (phony) Ziele für Header\n" +#~ " -MQ MAKE-zitiertes Ziel hinzufügen\n" +#~ " -MT ein unzitiertes Ziel hinzufügen\n" + +#~ msgid "" +#~ " -D Define a with string '1' as its value\n" +#~ " -D= Define a with as its value\n" +#~ " -A= Assert the to \n" +#~ " -A-= Disable the to \n" +#~ " -U Undefine \n" +#~ " -v Display the version number\n" +#~ msgstr "" +#~ " -D mit Wert \"1\" definieren\n" +#~ " -D= mit Wert definieren\n" +#~ " -A= die auf annehmen\n" +#~ " -A-= die auf abschalten\n" +#~ " -U löschen\n" +#~ " -v Version anzeigen\n" + +#~ msgid "" +#~ " -H Print the name of header files as they are used\n" +#~ " -C Do not discard comments\n" +#~ " -dM Display a list of macro definitions active at end\n" +#~ " -dD Preserve macro definitions in output\n" +#~ " -dN As -dD except that only the names are preserved\n" +#~ " -dI Include #include directives in the output\n" +#~ msgstr "" +#~ " -H Namen von Header-Dateien anzeigen wenn sie\n" +#~ " verwendet werden\n" +#~ " -C Kommentare nicht streichen\n" +#~ " -dM am Ende eine Liste von Makrodefinitionen anzeigen\n" +#~ " -dD Makrodefinitionen in der Ausgabe bewahren\n" +#~ " -dN wie -dD nur dass die Namen bewahrt werden\n" +#~ " -dI #include-Anweisungen in die Ausgabe einfügen\n" + +#~ msgid "" +#~ " -f[no-]preprocessed Treat the input file as already preprocessed\n" +#~ " -ftabstop= Distance between tab stops for column reporting\n" +#~ " -P Do not generate #line directives\n" +#~ " -remap Remap file names when including files\n" +#~ " --help Display this information\n" +#~ msgstr "" +#~ " -f[no-]preprocessed Eingabedatei als bereits vorverarbeitet behandeln\n" +#~ " -ftabstop= Tabulatorenabstand für Spaltenmeldungen\n" +#~ " -P keine #line-Direktiven generieren\n" +#~ " -remap Dateinamen beim Einfügen neu abbilden\n" +#~ " --help diese Information anzeigen\n" + +#~ msgid "parse error" +#~ msgstr "Fehler beim Parsen" + +#~ msgid "ISO C forbids the address of a cast expression" +#~ msgstr "ISO-C verbietet die Adresse eines cast-Ausdruckes" + +#~ msgid "initializer for static variable is not constant" +#~ msgstr "Initialisierer für statische Variable ist nicht konstant" + +#~ msgid "initializer for static variable uses complicated arithmetic" +#~ msgstr "Initialisierer für statische Variable verwendet komplizierte Arithmetik" + +#~ msgid "aggregate initializer is not constant" +#~ msgstr "Gesamt-Initialisierer ist nicht konstant" + +#~ msgid "aggregate initializer uses complicated arithmetic" +#~ msgstr "Gesamt-Initialisierer verwendet komplizierte Arithmetik" + +#~ msgid "open %s" +#~ msgstr "öffne %s" + +#~ msgid "incompatibilities between object file & expected values" +#~ msgstr "Inkompatibilitäten zwischen Objektdatei und erwarteten Werten" + +#~ msgid "" +#~ "\n" +#~ "Processing symbol table #%d, offset = 0x%.8lx, kind = %s\n" +#~ msgstr "" +#~ "\n" +#~ "Verarbeite Symboltabelle #%d, Versatz = 0x%.8lx, Art = %s\n" + +#~ msgid "string section missing" +#~ msgstr "Zeichenkettenabschnitt fehlt" + +#~ msgid "section pointer missing" +#~ msgstr "Abschnittszeiger fehlt" + +#~ msgid "no symbol table found" +#~ msgstr "keine Symboltabelle gefunden" + +#~ msgid "" +#~ "\n" +#~ "Updating header and load commands.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Aktualisiere Kopf und lokale Befehle.\n" +#~ "\n" + +#~ msgid "load command map, %d cmds, new size %ld.\n" +#~ msgstr "lade Befehlstabelle, %d Befehle, neue Größe: %ld.\n" + +#~ msgid "" +#~ "writing load commands.\n" +#~ "\n" +#~ msgstr "" +#~ "schreibe Ladebefehle.\n" +#~ "\n" + +#~ msgid "close %s" +#~ msgstr "schließe %s" + +#~ msgid "could not convert 0x%l.8x into a region" +#~ msgstr "konnte 0x%l.8x nicht in eine Region konvertieren" + +#~ msgid "%s function, region %d, offset = %ld (0x%.8lx)\n" +#~ msgstr "Funktion %s, Region %d, Versatz = %ld (0x%.8lx)\n" + +#~ msgid "bad magic number" +#~ msgstr "falsche magische Zahl" + +#~ msgid "bad header version" +#~ msgstr "falsche Kopf-Version" + +#~ msgid "bad raw header version" +#~ msgstr "falsche Version des Original-Kopfes" + +#~ msgid "raw header buffer too small" +#~ msgstr "Original-Kopf-Puffer zu klein" + +#~ msgid "old raw header file" +#~ msgstr "alte Original-Kopf-Datei" + +#~ msgid "unsupported version" +#~ msgstr "nicht unterstützte Version" + +#~ msgid "unknown {de,en}code_mach_o_hdr return value %d" +#~ msgstr "unbekannter Rückgabewert %d für {de,en}code_mach_o_hdr" + +#~ msgid "fstat %s" +#~ msgstr "fstat %s" + +#~ msgid "lseek %s 0" +#~ msgstr "lseek %s 0" + +#~ msgid "read %s" +#~ msgstr "Lese %s" + +#~ msgid "read %ld bytes, expected %ld, from %s" +#~ msgstr "%ld Bytes gelesen, %ld erwartet, von %s" + +#~ msgid "msync %s" +#~ msgstr "msync %s" + +#~ msgid "munmap %s" +#~ msgstr "munmap %s" + +#~ msgid "write %s" +#~ msgstr "schreibe %s" + +#~ msgid "wrote %ld bytes, expected %ld, to %s" +#~ msgstr "%ld Bytes geschrieben, %ld erwartet, nach %s" + +#~ msgid "ISO C++ does not permit \"%s\" in #if" +#~ msgstr "ISO-C++ lässt nicht »%s« in #if zu" + +#~ msgid "invalid character '%c' in #if" +#~ msgstr "ungültiges Zeichen '%c' in #if" + +#~ msgid "invalid character '\\%03o' in #if" +#~ msgstr "ungültiges Zeichen '\\%03o' in #if" + +#~ msgid "absolute file name in remap_filename" +#~ msgstr "absoluter Dateiname in remap_filename" + +#~ msgid "%s: Not a directory" +#~ msgstr "%s: Kein Verzeichnis" + +#~ msgid "directory name missing after %s" +#~ msgstr "Verzeichnisname fehlt hinter %s" + +#~ msgid "file name missing after %s" +#~ msgstr "Dateiname fehlt hinter %s" + +#~ msgid "path name missing after %s" +#~ msgstr "Pfadname fehlt hinter %s" + +#~ msgid "unknown string token %s\n" +#~ msgstr "Unbekanntes Zeichenketten-Token %s\n" + +#~ msgid "non-hex digit '%c' in universal-character-name" +#~ msgstr "Nicht-Hex-Ziffer '%c' in Universal-Zeichen-Name" + +#~ msgid "universal-character-name on EBCDIC target" +#~ msgstr "Universal-Zeichen-Name auf EBCDIC Ziel" + +#~ msgid "universal-character-name out of range" +#~ msgstr "Universal-Zeichen-Name außerhalb des Wertebereiches" + +#~ msgid "escape sequence out of range for its type" +#~ msgstr "Fluchtsequenz außerhalb des Wertebereiches seines Typs" + +#~ msgid "#import is obsolete, use an #ifndef wrapper in the header file" +#~ msgstr "#import ist veraltet, benutzen Sie einen #ifndef-Wrapper in der Header-Datei" + +#~ msgid "#pragma once is obsolete" +#~ msgstr "#pragma once ist veraltet" + +#~ msgid "%s: warnings being treated as errors\n" +#~ msgstr "%s: Warnungen als Fehler behandelt\n" + +#~ msgid "At top level:" +#~ msgstr "Auf höchster Ebene:" + +#~ msgid "In function `%s':" +#~ msgstr "In Funktion »%s«:" + +#~ msgid "" +#~ "Please submit a full bug report,\n" +#~ "with preprocessed source if appropriate.\n" +#~ "See %s for instructions.\n" +#~ msgstr "" +#~ "Bitte senden Sie einen vollständigen Fehlerbericht auf Englisch ein;\n" +#~ "bearbeiten Sie die Quellen zunächst mit einem Präprozessor, wenn es\n" +#~ "dienlich ist.\n" +#~ "Fehler in der deutschen Übersetzung sind an de@li.org zu melden.\n" +#~ "\n" +#~ "Gehen Sie gemäß den Hinweisen in %s vor.\n" + +#~ msgid "In file included from %s:%d" +#~ msgstr "In von %s:%d eingefügter Datei" + +#~ msgid "" +#~ ",\n" +#~ " from %s:%d" +#~ msgstr "" +#~ ",\n" +#~ " von %s:%d" + +#~ msgid "internal regno botch: `%s' has regno = %d\n" +#~ msgstr "interner RegNr-Fehler: »%s« hat RegNr = %d\n" + +#~ msgid "support for the DWARF1 debugging format is deprecated" +#~ msgstr "Unterstützung für das DWARF1-Debugging-Format ist veraltet" + +#~ msgid "unsupported wide integer operation" +#~ msgstr "breite Ganzzahloperation nicht unterstützt" + +#~ msgid "mismatched braces in specs" +#~ msgstr "unpassende geschweifte Klammern in Spezifikation" + +#~ msgid "Copyright (C) 2001 Free Software Foundation, Inc.\n" +#~ msgstr "Copyright © 2001 Free Software Foundation, Inc.\n" + +#~ msgid "Could not open basic block file %s.\n" +#~ msgstr "Konnte einfache Blockdatei %s nicht öffnen.\n" + +#~ msgid "Could not open program flow graph file %s.\n" +#~ msgstr "Konnte Programmflussgraphdatei %s nicht öffnen.\n" + +#~ msgid "Could not open data file %s.\n" +#~ msgstr "Konnte Datei %s nicht öffnen.\n" + +#~ msgid "Assuming that all execution counts are zero.\n" +#~ msgstr "Angenommen, dass alle Ausführungszähler null sind.\n" + +#~ msgid "No executable code associated with file %s.\n" +#~ msgstr "Kein ausführbarer Code mit Datei %s verbunden.\n" + +#~ msgid "didn't use all bb entries of graph, function %s\n" +#~ msgstr "nicht alle bb-Einträge des Graphen wurden benutzt, Funktion %s\n" + +#~ msgid "block_num = %ld, num_blocks = %d\n" +#~ msgstr "block_num = %ld, num_blocks = %d\n" + +#~ msgid "ERROR: unexpected line number %ld\n" +#~ msgstr "FEHLER: nicht erwartete Zeilennummer %ld\n" + +#~ msgid "ERROR: too many basic blocks in function %s\n" +#~ msgstr "FEHLER: zu viele Basis-Blöcke in Funktion %s\n" + +#~ msgid "ERROR: out of range line number in function %s\n" +#~ msgstr "FEHLER: Zeilennummer außerhalb des Wertebereiches in Funktion %s\n" + +#~ msgid "Could not open source file %s.\n" +#~ msgstr "Konnte Quelldatei %s nicht öffnen.\n" + +#~ msgid "Unexpected EOF while reading source file %s.\n" +#~ msgstr "Unerwartetes Dateiende beim Lesen der Quelldatei %s.\n" + +#~ msgid "Creating %s.\n" +#~ msgstr "Erzeuge %s.\n" + +#~ msgid "Name `%s' contains quotes" +#~ msgstr "Name »%s« enthält Anführungszeichen" + +#~ msgid "invalid string `%s' in define_cpu_unit" +#~ msgstr "ungültige Zeichenkette »%s« in define_cpu_unit" + +#~ msgid "invalid string `%s' in define_query_cpu_unit" +#~ msgstr "ungültige Zeichenkette »%s« in define_query_cpu_unit" + +#~ msgid "invalid string `%s' in define_bypass" +#~ msgstr "ungültige Zeichenkette »%s« in define_bypass" + +#~ msgid "invalid second string `%s' in exclusion_set" +#~ msgstr "ungültige zweite Zeichenkette »%s« in exclusion_set" + +#~ msgid "invalid first string `%s' in presence_set" +#~ msgstr "ungültige erste Zeichenkette »%s« in presence_set" + +#~ msgid "invalid second string `%s' in presence_set" +#~ msgstr "ungültige zweite Zeichenkette »%s« in presence_set" + +#~ msgid "invalid first string `%s' in absence_set" +#~ msgstr "ungültige erste Zeichenkette »%s« in absence_set" + +#~ msgid "invalid second string `%s' in absence_set" +#~ msgstr "ungültige zweite Zeichenkette »%s« in absence_set" + +#~ msgid "invalid string `%s' in define_automaton" +#~ msgstr "ungültige Zeichenkette »%s« in define_automaton" + +#~ msgid "invalid option `%s' in automata_option" +#~ msgstr "ungültige Option »%s« in automata_option" + +#~ msgid "garbage after ) in reservation `%s'" +#~ msgstr "Müll hinter ) in Reservierung »%s«" + +#~ msgid "invalid `%s' in reservation `%s'" +#~ msgstr "ungültiges »%s« in Reservierung »%s«" + +#~ msgid "repetition `%s' <= 1 in reservation `%s'" +#~ msgstr "Wiederholung »%s« <= 1 in Reservierung »%s«" + +#~ msgid "unit `%s' in exclusion is not declared" +#~ msgstr "Einheit »%s« ist nicht im Ausschluss deklariert" + +#~ msgid "`%s' in exclusion is not unit" +#~ msgstr "»%s« im Ausschluss ist keine Einheit" + +#~ msgid "unit `%s' excludes itself" +#~ msgstr "Einheit »%s« schließt sich selbst aus" + +#~ msgid "units `%s' and `%s' in exclusion set belong to different automata" +#~ msgstr "Einheiten »%s« und »%s« in Ausschlussmenge gehören zu verschiedenen Automaten" + +#~ msgid "unit `%s' excludes and requires presence of `%s'" +#~ msgstr "Einheit »%s« schließt »%s« aus und erfordert dessen Anwesenheit" + +#~ msgid "unit `%s' requires absence and presence of `%s'" +#~ msgstr "Einheit »%s« erfordert die An- und Abwesenheit von »%s«" + +#~ msgid "repeated declaration of automaton `%s'" +#~ msgstr "wiederholte Deklaration des Automaten %s" + +#~ msgid "define_insn_reservation `%s' has negative latency time" +#~ msgstr "define_insn_reservation »%s« hat negative Latenzzeit" + +#~ msgid "`%s' is already used as insn reservation name" +#~ msgstr "»%s« wurde bereits als insn Reservierungsname verwendet" + +#~ msgid "define_bypass `%s - %s' has negative latency time" +#~ msgstr "define_bypass »%s - %s« hat negative Latenzzeit" + +#~ msgid "define_unit `%s' without automaton when one defined" +#~ msgstr "define_unit »%s« ohne Automat trotz Automatendefinition" + +#~ msgid "`%s' is declared as cpu unit" +#~ msgstr "»%s« wurde als CPU-Einheit deklariert" + +#~ msgid "`%s' is declared as cpu reservation" +#~ msgstr "»%s« wurde als CPU-Reservierung deklariert" + +#~ msgid "repeated declaration of unit `%s'" +#~ msgstr "wiederholte Deklaration der Einheit »%s«" + +#~ msgid "repeated declaration of reservation `%s'" +#~ msgstr "wiederholte Deklaration der Reservierung »%s«" + +#~ msgid "there is no insn reservation `%s'" +#~ msgstr "es gibt keine insn-Reservierung »%s«" + +#~ msgid "the same bypass `%s - %s' is already defined" +#~ msgstr "die selbe Überbrückung »%s - %s« wurde bereits definiert" + +#~ msgid "bypass `%s - %s' is already defined" +#~ msgstr "Überbrückung »%s - %s« wurde bereits definiert" + +#~ msgid "undeclared unit or reservation `%s'" +#~ msgstr "nicht deklarierte Einheit oder Reservierung »%s«" + +#~ msgid "unit `%s' is not used" +#~ msgstr "Einheit »%s« wird nicht verwendet" + +#~ msgid "reservation `%s' is not used" +#~ msgstr "Reservierung »%s« ist unbenutzt" + +#~ msgid "cycle in definition of reservation `%s'" +#~ msgstr "Zyklus in Definition der Reservierung »%s«" + +#~ msgid "Units `%s' and `%s' should be in the same automaton" +#~ msgstr "Einheiten »%s« und »%s« sollten im selben Automat sein" + +#~ msgid "-split has no argument." +#~ msgstr "-split hat kein Argument." + +#~ msgid "option `-split' has not been implemented yet\n" +#~ msgstr "Option »-split« wurde noch nicht implementiert\n" + +#~ msgid "Automaton `%s': Insn `%s' will never be issued" +#~ msgstr "Automat »%s«: Insn »%s« wird nie verwendet" + +#~ msgid "Insn `%s' will never be issued" +#~ msgstr "Insn »%s« wird nie verwendet" + +#~ msgid "Errors in DFA description" +#~ msgstr "Fehler in DFA-Beschreibung" + +#~ msgid "Error in writing DFA description file %s" +#~ msgstr "Fehler beim Schreiben der DFA-Definitionsdatei %s" + +#~ msgid "No input file name." +#~ msgstr "Kein Eingabedateiname." + +#~ msgid "Profile does not match flowgraph of function %s (out of date?)" +#~ msgstr "Profil passt nicht zum Flussgraphen der Funktion %s (veraltet?)" + +#~ msgid ".da file corrupted" +#~ msgstr ".da-Datei beschädigt" + +#~ msgid "#`%s' not supported by %s#" +#~ msgstr "#»%s« wird von %s# nicht unterstützt" + +#~ msgid "Copyright (C) 2002 Free Software Foundation, Inc.\n" +#~ msgstr "Copyright © 2002 Free Software Foundation, Inc.\n" + +#~ msgid "I/O error on output" +#~ msgstr "Ein-/Ausgabefehler bei der Ausgabe" + +#~ msgid "" +#~ "internal error in %s, at tradcpp.c:%d\n" +#~ "Please submit a full bug report.\n" +#~ "See %s for instructions." +#~ msgstr "" +#~ "Interner Fehler in %s bei tradcpp.c:%d\n" +#~ "Bitte senden Sie einen vollständigen Fehlerbericht\n" +#~ "auf Englisch ein; Fehler in der deutschen Übersetzung\n" +#~ "sind an de@li.org zu melden.\n" +#~ "Gehen Sie gemäß den Hinweisen in %s vor." diff --git a/libcpp/po/el.po b/libcpp/po/el.po new file mode 100644 index 0000000..cad6334 --- /dev/null +++ b/libcpp/po/el.po @@ -0,0 +1,5276 @@ +# Greek translation of gcc. +# Copyright (C) 2001, 2002 Free Software Foundation, Inc. +# Simos Xenitellis , 2001, 2002. +# +msgid "" +msgstr "" +"Project-Id-Version: gcc 3.2\n" +"Report-Msgid-Bugs-To: http://gcc.gnu.org/bugs.html\n" +"POT-Creation-Date: 2007-11-08 21:08+0000\n" +"PO-Revision-Date: 2002-08-18 15:46+0100\n" +"Last-Translator: Simos Xenitellis \n" +"Language-Team: Greek \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=iso-8859-7\n" +"Content-Transfer-Encoding: 8bit\n" + +#: charset.c:654 +#, fuzzy, c-format +msgid "conversion from %s to %s not supported by iconv" +msgstr "ç ìåôáôñïðÞ áðü `%s' óå `%s' äåí õðïóôçñßæåôå" + +#: charset.c:657 +msgid "iconv_open" +msgstr "" + +#: charset.c:665 +#, c-format +msgid "no iconv implementation, cannot convert from %s to %s" +msgstr "" + +#: charset.c:742 +#, c-format +msgid "character 0x%lx is not in the basic source character set\n" +msgstr "" + +#: charset.c:759 charset.c:1352 +msgid "converting to execution character set" +msgstr "" + +#: charset.c:765 +#, c-format +msgid "character 0x%lx is not unibyte in execution character set" +msgstr "" + +#: charset.c:889 +#, c-format +msgid "Character %x might not be NFKC" +msgstr "" + +#: charset.c:949 +#, fuzzy +msgid "universal character names are only valid in C++ and C99" +msgstr "U+%04X: åêôüò ïñßùí ÷áñáêôÞñáò" + +#: charset.c:952 +#, c-format +msgid "the meaning of '\\%c' is different in traditional C" +msgstr "" + +#: charset.c:961 +msgid "In _cpp_valid_ucn but not a UCN" +msgstr "" + +#: charset.c:986 +#, c-format +msgid "incomplete universal character name %.*s" +msgstr "" + +#: charset.c:998 +#, fuzzy, c-format +msgid "%.*s is not a valid universal character" +msgstr "Ôï `%s' äåí åßíáé êáôÜëïãïò." + +#: charset.c:1008 lex.c:484 +msgid "'$' in identifier or number" +msgstr "" + +#: charset.c:1018 +#, c-format +msgid "universal character %.*s is not valid in an identifier" +msgstr "" + +#: charset.c:1022 +#, c-format +msgid "universal character %.*s is not valid at the start of an identifier" +msgstr "" + +#: charset.c:1056 charset.c:1571 +msgid "converting UCN to source character set" +msgstr "" + +#: charset.c:1060 +msgid "converting UCN to execution character set" +msgstr "" + +#: charset.c:1132 +msgid "the meaning of '\\x' is different in traditional C" +msgstr "" + +#: charset.c:1149 +msgid "\\x used with no following hex digits" +msgstr "" + +#: charset.c:1156 +#, fuzzy +msgid "hex escape sequence out of range" +msgstr "ìç Ýãêõñç äéáäéêáóßá äéáöõãÞò óôï ôÝëïò ôïõ áëöáñéèìéôéêïý" + +#: charset.c:1195 +#, fuzzy +msgid "octal escape sequence out of range" +msgstr "ìç Ýãêõñç äéáäéêáóßá äéáöõãÞò óôï ôÝëïò ôïõ áëöáñéèìéôéêïý" + +#: charset.c:1263 +msgid "the meaning of '\\a' is different in traditional C" +msgstr "" + +#: charset.c:1270 +#, c-format +msgid "non-ISO-standard escape sequence, '\\%c'" +msgstr "" + +# src/main.c:663 +#: charset.c:1278 +#, fuzzy, c-format +msgid "unknown escape sequence '\\%c'" +msgstr "¶ãíùóôç óõìâïëïóåéñÜ `%s'" + +# src/main.c:663 +#: charset.c:1286 +#, fuzzy, c-format +msgid "unknown escape sequence: '\\%s'" +msgstr "¶ãíùóôç óõìâïëïóåéñÜ `%s'" + +#: charset.c:1293 +#, fuzzy +msgid "converting escape sequence to execution character set" +msgstr "ìç Ýãêõñç äéáäéêáóßá äéáöõãÞò óôï ôÝëïò ôïõ áëöáñéèìéôéêïý" + +#: charset.c:1415 charset.c:1478 +#, fuzzy +msgid "character constant too long for its type" +msgstr "ìç Ýãêõñïò óôáèåñüò ÷áñáêôÞñáò óôï áëöáñéèìéôéêü" + +#: charset.c:1418 +#, fuzzy +msgid "multi-character character constant" +msgstr "äéðëü üíïìá ÷áñáêôÞñá `%s'" + +#: charset.c:1510 +#, fuzzy +msgid "empty character constant" +msgstr "êåíü áëöáñéèìçôéêü" + +#: charset.c:1612 +#, fuzzy, c-format +msgid "failure to convert %s to %s" +msgstr "äåí åßíáé äõíáôü íá äçìéïõñãçèåß ôï %s `%s' óôï `%s'" + +#: directives.c:215 directives.c:241 +#, c-format +msgid "extra tokens at end of #%s directive" +msgstr "" + +#: directives.c:344 +#, c-format +msgid "#%s is a GCC extension" +msgstr "" + +#: directives.c:356 +msgid "suggest not using #elif in traditional C" +msgstr "" + +#: directives.c:359 +#, c-format +msgid "traditional C ignores #%s with the # indented" +msgstr "" + +#: directives.c:363 +#, c-format +msgid "suggest hiding #%s from traditional C with an indented #" +msgstr "" + +#: directives.c:389 +msgid "embedding a directive within macro arguments is not portable" +msgstr "" + +#: directives.c:409 +msgid "style of line directive is a GCC extension" +msgstr "" + +#: directives.c:464 +#, c-format +msgid "invalid preprocessing directive #%s" +msgstr "" + +#: directives.c:532 +msgid "\"defined\" cannot be used as a macro name" +msgstr "" + +#: directives.c:538 +#, c-format +msgid "\"%s\" cannot be used as a macro name as it is an operator in C++" +msgstr "" + +#: directives.c:541 +#, c-format +msgid "no macro name given in #%s directive" +msgstr "" + +#: directives.c:544 +#, fuzzy +msgid "macro names must be identifiers" +msgstr "äéðëüò ðñïóäéïñéóôÞò ìçíýìáôïò" + +#: directives.c:585 +#, fuzzy, c-format +msgid "undefining \"%s\"" +msgstr "Ìç ïñéóìÝíï üíïìá %s" + +#: directives.c:640 +#, fuzzy +msgid "missing terminating > character" +msgstr "Ý÷åé ðáñáëçöèåß ôï áñ÷åßï ðñïïñéóìïý" + +#: directives.c:695 +#, c-format +msgid "#%s expects \"FILENAME\" or " +msgstr "" + +#: directives.c:739 +#, fuzzy, c-format +msgid "empty filename in #%s" +msgstr "Ìç ïñéóìÝíï üíïìá %s" + +#: directives.c:749 +msgid "#include nested too deeply" +msgstr "" + +#: directives.c:790 +msgid "#include_next in primary source file" +msgstr "" + +#: directives.c:816 +#, c-format +msgid "invalid flag \"%s\" in line directive" +msgstr "" + +#: directives.c:868 +#, fuzzy, c-format +msgid "\"%s\" after #line is not a positive integer" +msgstr "%s' äåí åßíáé éó÷ýùí èåôéêüò áêÝñáéïò." + +#: directives.c:874 +#, fuzzy +msgid "line number out of range" +msgstr "%s: áñéèìüò ãñáììÞò Ýîù áðü ôá üñéá" + +#: directives.c:887 directives.c:964 +#, fuzzy, c-format +msgid "\"%s\" is not a valid filename" +msgstr "%s' äåí åßíáé éó÷ýùí èåôéêüò áêÝñáéïò." + +#: directives.c:924 +#, fuzzy, c-format +msgid "\"%s\" after # is not a positive integer" +msgstr "%s' äåí åßíáé éó÷ýùí èåôéêüò áêÝñáéïò." + +#: directives.c:1026 +#, fuzzy, c-format +msgid "invalid #%s directive" +msgstr "%%%c: êáôåõèõíôÞñéïò ãñáììÞ ìç Ýãêõñç." + +#: directives.c:1089 +#, c-format +msgid "registering pragmas in namespace \"%s\" with mismatched name expansion" +msgstr "" + +#: directives.c:1098 +#, c-format +msgid "registering pragma \"%s\" with name expansion and no namespace" +msgstr "" + +#: directives.c:1116 +#, c-format +msgid "registering \"%s\" as both a pragma and a pragma namespace" +msgstr "" + +#: directives.c:1119 +#, c-format +msgid "#pragma %s %s is already registered" +msgstr "" + +#: directives.c:1122 +#, fuzzy, c-format +msgid "#pragma %s is already registered" +msgstr "ï ÷Üñôçò ÷áñáêôÞñùí `%s' ïñßóôçêå Þäç" + +#: directives.c:1152 +msgid "registering pragma with NULL handler" +msgstr "" + +#: directives.c:1362 +msgid "#pragma once in main file" +msgstr "" + +#: directives.c:1385 +msgid "invalid #pragma GCC poison directive" +msgstr "" + +#: directives.c:1394 +#, c-format +msgid "poisoning existing macro \"%s\"" +msgstr "" + +#: directives.c:1413 +msgid "#pragma system_header ignored outside include file" +msgstr "" + +#: directives.c:1437 +#, fuzzy, c-format +msgid "cannot find source file %s" +msgstr "áäõíáìßá áíïßãìáôïò õðïäï÷Þò: %s" + +#: directives.c:1441 +#, c-format +msgid "current file is older than %s" +msgstr "" + +#: directives.c:1620 +msgid "_Pragma takes a parenthesized string literal" +msgstr "" + +#: directives.c:1693 +msgid "#else without #if" +msgstr "" + +#: directives.c:1698 +msgid "#else after #else" +msgstr "#else ìåôÜ áðü #else" + +#: directives.c:1700 directives.c:1733 +msgid "the conditional began here" +msgstr "" + +#: directives.c:1726 +msgid "#elif without #if" +msgstr "" + +#: directives.c:1731 +msgid "#elif after #else" +msgstr "#elif ìåôÜ áðü #else" + +#: directives.c:1761 +msgid "#endif without #if" +msgstr "" + +#: directives.c:1838 +msgid "missing '(' after predicate" +msgstr "" + +#: directives.c:1853 +msgid "missing ')' to complete answer" +msgstr "" + +#: directives.c:1873 +msgid "predicate's answer is empty" +msgstr "" + +#: directives.c:1900 +#, fuzzy +msgid "assertion without predicate" +msgstr "Ç ëåéôïõñãßá äåí åðéôñÝðåôáé" + +#: directives.c:1902 +#, fuzzy +msgid "predicate must be an identifier" +msgstr "äéðëüò ðñïóäéïñéóôÞò ìçíýìáôïò" + +#: directives.c:1988 +#, c-format +msgid "\"%s\" re-asserted" +msgstr "" + +#: directives.c:2271 +#, fuzzy, c-format +msgid "unterminated #%s" +msgstr "ìç ôåñìáôéæüìåío áëöáñéèìçôéêü" + +#: directives-only.c:221 lex.c:1016 traditional.c:162 +#, fuzzy +msgid "unterminated comment" +msgstr "Ìç ôåñìáôéóìÝíç åíôïëÞ `s'" + +#: errors.c:118 +msgid "warning: " +msgstr "ðñïåéäïðïßçóç: " + +#: errors.c:120 +msgid "internal error: " +msgstr "åóùôåñéêü óöÜëìá: " + +#: errors.c:122 +#, fuzzy +msgid "error: " +msgstr "åóùôåñéêü óöÜëìá: " + +#: errors.c:186 +#, fuzzy +msgid "stdout" +msgstr "äïìÞ" + +# src/request.c:37 +#: errors.c:188 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: expr.c:261 +#, fuzzy +msgid "too many decimal points in number" +msgstr "Õðåñâïëéêá ðïëëÜ áíïéêôÜ áñ÷åßá óôï óýóôçìá" + +#: expr.c:290 expr.c:365 +msgid "fixed-point constants are a GCC extension" +msgstr "" + +#: expr.c:303 +#, fuzzy, c-format +msgid "invalid digit \"%c\" in binary constant" +msgstr "Ìç Ýãêõñç áêÝñáéá ðáñÜìåôñïò `%s'" + +#: expr.c:305 +#, fuzzy, c-format +msgid "invalid digit \"%c\" in octal constant" +msgstr "Ìç Ýãêõñç áêÝñáéá ðáñÜìåôñïò `%s'" + +#: expr.c:313 +#, fuzzy +msgid "invalid prefix \"0b\" for floating constant" +msgstr "Ç ðáñÜìåôñïò êéíçôÞò õðïäéáóôïëÞò äåí åßíáé Ýãêõñç: %s" + +#: expr.c:319 +msgid "use of C99 hexadecimal floating constant" +msgstr "" + +#: expr.c:328 +msgid "exponent has no digits" +msgstr "" + +#: expr.c:335 +msgid "hexadecimal floating constants require an exponent" +msgstr "" + +#: expr.c:341 +#, fuzzy, c-format +msgid "invalid suffix \"%.*s\" on floating constant" +msgstr "Ç ðáñÜìåôñïò êéíçôÞò õðïäéáóôïëÞò äåí åßíáé Ýãêõñç: %s" + +#: expr.c:351 expr.c:393 +#, c-format +msgid "traditional C rejects the \"%.*s\" suffix" +msgstr "" + +#: expr.c:358 +#, fuzzy, c-format +msgid "invalid suffix \"%.*s\" with hexadecimal floating constant" +msgstr "Ç ðáñÜìåôñïò êéíçôÞò õðïäéáóôïëÞò äåí åßíáé Ýãêõñç: %s" + +#: expr.c:369 +#, fuzzy +msgid "decimal float constants are a GCC extension" +msgstr "%s: ôï %s åßíáé ôüóï ìåãÜëï ðïõ äå ìðïñåß íá áíáðáñáóôáèåß" + +#: expr.c:379 +#, fuzzy, c-format +msgid "invalid suffix \"%.*s\" on integer constant" +msgstr "Ìç Ýãêõñç áêÝñáéá ðáñÜìåôñïò `%s'" + +#: expr.c:401 +#, fuzzy +msgid "use of C99 long long integer constant" +msgstr "Ìç Ýãêõñç áêÝñáéá ðáñÜìåôñïò `%s'" + +#: expr.c:409 +msgid "imaginary constants are a GCC extension" +msgstr "" + +#: expr.c:412 +msgid "binary constants are a GCC extension" +msgstr "" + +#: expr.c:505 +#, fuzzy +msgid "integer constant is too large for its type" +msgstr "%s: ôï %s åßíáé ôüóï ìåãÜëï ðïõ äå ìðïñåß íá áíáðáñáóôáèåß" + +#: expr.c:517 +#, fuzzy +msgid "integer constant is so large that it is unsigned" +msgstr "%s: ôï %s åßíáé ôüóï ìåãÜëï ðïõ äå ìðïñåß íá áíáðáñáóôáèåß" + +#: expr.c:612 +#, fuzzy +msgid "missing ')' after \"defined\"" +msgstr "Ý÷åé ðáñáëçöèåß ç ëßóôá ìå ôá ðåäßá" + +#: expr.c:619 +msgid "operator \"defined\" requires an identifier" +msgstr "" + +#: expr.c:627 +#, c-format +msgid "(\"%s\" is an alternative token for \"%s\" in C++)" +msgstr "" + +#: expr.c:637 +msgid "this use of \"defined\" may not be portable" +msgstr "" + +#: expr.c:676 +#, fuzzy +msgid "floating constant in preprocessor expression" +msgstr "Åîáßñåóç êéíçôÞò õðïäéáóôïëÞò" + +#: expr.c:682 +#, fuzzy +msgid "imaginary number in preprocessor expression" +msgstr "ìç Ýãêõñïò áñéèìüò áðü ãñáììÝò" + +#: expr.c:727 +#, fuzzy, c-format +msgid "\"%s\" is not defined" +msgstr "ôï `%s' äåí åßíáé êáíïíéêü áñ÷åßï" + +#: expr.c:855 expr.c:884 +#, fuzzy, c-format +msgid "missing binary operator before token \"%s\"" +msgstr "%s: Áíáìåíüôáí äõáäéêüò ÷åéñéóôÞò.\n" + +#: expr.c:875 +#, fuzzy, c-format +msgid "token \"%s\" is not valid in preprocessor expressions" +msgstr "%s: ìç Ýãêõñç êáíïíéêÞ Ýêöñáóç: %s" + +#: expr.c:892 +msgid "missing expression between '(' and ')'" +msgstr "" + +#: expr.c:895 +msgid "#if with no expression" +msgstr "" + +#: expr.c:898 +#, c-format +msgid "operator '%s' has no right operand" +msgstr "" + +#: expr.c:903 +#, c-format +msgid "operator '%s' has no left operand" +msgstr "" + +#: expr.c:929 +msgid " ':' without preceding '?'" +msgstr "" + +#: expr.c:956 +msgid "unbalanced stack in #if" +msgstr "" + +#: expr.c:975 +#, fuzzy, c-format +msgid "impossible operator '%u'" +msgstr "RPC: Ìç óõìâáôÝò åêäüóåéò ôïõ RPC" + +#: expr.c:1065 +#, fuzzy +msgid "missing ')' in expression" +msgstr "Ý÷åé ðáñáëçöèåß ç ëßóôá ìå ôéò èÝóåéò" + +#: expr.c:1086 +#, fuzzy +msgid "'?' without following ':'" +msgstr "óõíôáêôéêü óöÜëìá óôïí ðñüëïãï: %s" + +#: expr.c:1096 +msgid "integer overflow in preprocessor expression" +msgstr "" + +#: expr.c:1101 +#, fuzzy +msgid "missing '(' in expression" +msgstr "Ý÷åé ðáñáëçöèåß ç ëßóôá ìå ôéò èÝóåéò" + +#: expr.c:1133 +#, c-format +msgid "the left operand of \"%s\" changes sign when promoted" +msgstr "" + +#: expr.c:1138 +#, c-format +msgid "the right operand of \"%s\" changes sign when promoted" +msgstr "" + +#: expr.c:1397 +msgid "traditional C rejects the unary plus operator" +msgstr "" + +#: expr.c:1480 +msgid "comma operator in operand of #if" +msgstr "" + +#: expr.c:1612 +#, fuzzy +msgid "division by zero in #if" +msgstr "Äéáßñåóç ìå ìçäÝí óôçí áðïôßìçóç: %s" + +#: files.c:442 +msgid "NULL directory in find_file" +msgstr "" + +#: files.c:480 +msgid "one or more PCH files were found, but they were invalid" +msgstr "" + +#: files.c:483 +msgid "use -Winvalid-pch for more information" +msgstr "" + +#: files.c:570 +#, fuzzy, c-format +msgid "%s is a block device" +msgstr "Äåí Ýìåéíå êáèüëïõ ÷þñïò óôç óõóêåõÞ" + +# src/shred.c:1134 +#: files.c:587 +#, fuzzy, c-format +msgid "%s is too large" +msgstr "%s: ôï áñ÷åßï åßíáé ðïëý ìåãÜëï" + +#: files.c:622 +#, fuzzy, c-format +msgid "%s is shorter than expected" +msgstr "%s: Áíáìåíüôáí äõáäéêüò ÷åéñéóôÞò.\n" + +#: files.c:852 +#, c-format +msgid "no include path in which to search for %s" +msgstr "" + +#: files.c:1157 +msgid "Multiple include guards may be useful for:\n" +msgstr "" + +#: init.c:426 +#, fuzzy +msgid "cppchar_t must be an unsigned type" +msgstr "äéðëüò ðñïóäéïñéóôÞò ìçíýìáôïò" + +#: init.c:430 +#, c-format +msgid "preprocessor arithmetic has maximum precision of %lu bits; target requires %lu bits" +msgstr "" + +#: init.c:437 +msgid "CPP arithmetic must be at least as precise as a target int" +msgstr "" + +#: init.c:440 +msgid "target char is less than 8 bits wide" +msgstr "" + +#: init.c:444 +msgid "target wchar_t is narrower than target char" +msgstr "" + +#: init.c:448 +msgid "target int is narrower than target char" +msgstr "" + +#: init.c:453 +msgid "CPP half-integer narrower than CPP character" +msgstr "" + +#: init.c:457 +#, c-format +msgid "CPP on this host cannot handle wide character constants over %lu bits, but the target requires %lu bits" +msgstr "" + +#: lex.c:283 +msgid "backslash and newline separated by space" +msgstr "" + +#: lex.c:288 +#, fuzzy +msgid "backslash-newline at end of file" +msgstr "ìç Ýãêõñç äéáöõãÞ ìå ðéóùêÜèåôï óôï ôÝëïò ôïõ áëöáñéèìçôéêïý" + +#: lex.c:303 +#, c-format +msgid "trigraph ??%c converted to %c" +msgstr "" + +#: lex.c:310 +#, c-format +msgid "trigraph ??%c ignored, use -trigraphs to enable" +msgstr "" + +#: lex.c:356 +msgid "\"/*\" within comment" +msgstr "" + +#: lex.c:414 +#, c-format +msgid "%s in preprocessing directive" +msgstr "" + +#: lex.c:423 +#, fuzzy +msgid "null character(s) ignored" +msgstr "ìç Ýãêõñïò ÷áñáêôÞñáò óôï áñ÷åßï: " + +#: lex.c:460 +#, fuzzy, c-format +msgid "`%.*s' is not in NFKC" +msgstr "ôï `%s' äåí åßíáé êáíïíéêü áñ÷åßï" + +#: lex.c:463 +#, fuzzy, c-format +msgid "`%.*s' is not in NFC" +msgstr "ôï `%s' äåí åßíáé êáíïíéêü áñ÷åßï" + +#: lex.c:551 +#, c-format +msgid "attempt to use poisoned \"%s\"" +msgstr "" + +#: lex.c:559 +msgid "__VA_ARGS__ can only appear in the expansion of a C99 variadic macro" +msgstr "" + +#: lex.c:659 +msgid "null character(s) preserved in literal" +msgstr "" + +#: lex.c:662 +#, c-format +msgid "missing terminating %c character" +msgstr "Ý÷åé ðáñáëçöèåß ôåñìáôéêüò ÷áñáêôÞñáò %c" + +#: lex.c:1027 +msgid "C++ style comments are not allowed in ISO C90" +msgstr "" + +#: lex.c:1029 +msgid "(this will be reported only once per input file)" +msgstr "" + +#: lex.c:1034 +msgid "multi-line comment" +msgstr "" + +#: lex.c:1347 +#, fuzzy, c-format +msgid "unspellable token %s" +msgstr "%s: áäýíáôï ôï Üíïéãìá ôïõ %s: %m\n" + +#: line-map.c:320 +#, c-format +msgid "In file included from %s:%u" +msgstr "" + +#: line-map.c:338 +#, c-format +msgid "" +",\n" +" from %s:%u" +msgstr "" + +#: macro.c:84 +#, fuzzy, c-format +msgid "macro \"%s\" is not used" +msgstr "ôï `%s' äåí åßíáé êáíïíéêü áñ÷åßï" + +#: macro.c:123 macro.c:319 +#, fuzzy, c-format +msgid "invalid built-in macro \"%s\"" +msgstr "ìç Ýãêõñï ìÞêïò ãñáììÞò: %s" + +#: macro.c:157 +#, fuzzy +msgid "could not determine file timestamp" +msgstr "Äåí ìðüñåóá íá áíïßîù ôï áñ÷åßï %s" + +#: macro.c:254 +#, fuzzy +msgid "could not determine date and time" +msgstr "Äåí ìðüñåóá íá áíïßîù ôï áñ÷åßï %s" + +#: macro.c:270 +msgid "__COUNTER__ expanded inside directive with -fdirectives-only" +msgstr "" + +#: macro.c:423 +#, fuzzy +msgid "invalid string literal, ignoring final '\\'" +msgstr "ìç Ýãêõñïò áñ÷éêüò áñéèìüò ãñáììÞò: `%s'" + +#: macro.c:483 +#, c-format +msgid "pasting \"%s\" and \"%s\" does not give a valid preprocessing token" +msgstr "" + +#: macro.c:558 +#, fuzzy +msgid "ISO C99 requires rest arguments to be used" +msgstr "ÊáêÞ áßôçóç ðáñáìÝôñùí" + +#: macro.c:563 +#, c-format +msgid "macro \"%s\" requires %u arguments, but only %u given" +msgstr "" + +#: macro.c:568 +#, c-format +msgid "macro \"%s\" passed %u arguments, but takes just %u" +msgstr "" + +#: macro.c:679 traditional.c:680 +#, c-format +msgid "unterminated argument list invoking macro \"%s\"" +msgstr "" + +#: macro.c:782 +#, c-format +msgid "function-like macro \"%s\" must be used with arguments in traditional C" +msgstr "" + +#: macro.c:1325 +#, fuzzy, c-format +msgid "duplicate macro parameter \"%s\"" +msgstr "äéðëü üíïìá ÷áñáêôÞñá `%s'" + +#: macro.c:1371 +#, c-format +msgid "\"%s\" may not appear in macro parameter list" +msgstr "" + +#: macro.c:1379 +msgid "macro parameters must be comma-separated" +msgstr "" + +#: macro.c:1396 +msgid "parameter name missing" +msgstr "" + +#: macro.c:1413 +msgid "anonymous variadic macros were introduced in C99" +msgstr "" + +#: macro.c:1418 +msgid "ISO C does not permit named variadic macros" +msgstr "" + +#: macro.c:1427 +msgid "missing ')' in macro parameter list" +msgstr "" + +#: macro.c:1476 +msgid "'##' cannot appear at either end of a macro expansion" +msgstr "" + +#: macro.c:1510 +#, fuzzy +msgid "ISO C99 requires whitespace after the macro name" +msgstr "ÊáêÞ áßôçóç ðáñáìÝôñùí" + +#: macro.c:1534 +msgid "missing whitespace after the macro name" +msgstr "" + +#: macro.c:1564 +msgid "'#' is not followed by a macro parameter" +msgstr "" + +#: macro.c:1683 +#, fuzzy, c-format +msgid "\"%s\" redefined" +msgstr "áüñéóôï" + +#: macro.c:1688 +#, fuzzy +msgid "this is the location of the previous definition" +msgstr "áõôÞ åßíáé ç èÝóç ôïõ ðñþôïõ ïñéóìïý" + +#: macro.c:1738 +#, c-format +msgid "macro argument \"%s\" would be stringified in traditional C" +msgstr "" + +#: macro.c:1761 +#, c-format +msgid "invalid hash type %d in cpp_macro_definition" +msgstr "" + +#: pch.c:84 pch.c:332 pch.c:344 pch.c:362 pch.c:368 pch.c:377 +msgid "while writing precompiled header" +msgstr "" + +#: pch.c:485 +#, c-format +msgid "%s: not used because `%.*s' not defined" +msgstr "" + +#: pch.c:497 +#, c-format +msgid "%s: not used because `%.*s' defined as `%s' not `%.*s'" +msgstr "" + +#: pch.c:538 +#, c-format +msgid "%s: not used because `%s' is defined" +msgstr "" + +#: pch.c:558 +#, c-format +msgid "%s: not used because `__COUNTER__' is invalid" +msgstr "" + +#: pch.c:567 pch.c:737 +msgid "while reading precompiled header" +msgstr "" + +#: traditional.c:750 +#, c-format +msgid "detected recursion whilst expanding macro \"%s\"" +msgstr "" + +#: traditional.c:917 +#, fuzzy +msgid "syntax error in macro parameter list" +msgstr "óõíôáêôéêü óöÜëìá óôïí ïñéóìü êëÜóçò ÷áñáêôÞñùí" + +#, fuzzy +#~ msgid "wrong number of arguments specified for `%s' attribute" +#~ msgstr "ëÜèïò áñéèìüò ïñéóìÜôùí" + +#, fuzzy +#~ msgid "unknown machine mode `%s'" +#~ msgstr "Üãíùóôï óåô `%s'" + +#, fuzzy +#~ msgid "no data type for mode `%s'" +#~ msgstr "äåí ïñßóôçêå âáñýôçôá ãéá ôï óýìâïëï `%s'" + +#, fuzzy +#~ msgid "section attributes are not supported for this target" +#~ msgstr "óõìâïëéêïß óýíäåóìïé äåí õðïóôçñßæïíôáé óôï óýóôçìá áõôü" + +#, fuzzy +#~ msgid "requested alignment is too large" +#~ msgstr "ÊáêÞ áßôçóç ðáñáìÝôñùí" + +#, fuzzy +#~ msgid "alignment may not be specified for `%s'" +#~ msgstr "ìüíï Ýíá üñéóìá ìðïñåß íá äçëùèåß" + +#, fuzzy +#~ msgid "can't set `%s' attribute after definition" +#~ msgstr "áõôüò åßíáé ï ðñþôïò ïñéóìüò" + +#, fuzzy +#~ msgid "`%s' attribute ignored for `%s'" +#~ msgstr "ôï `%s' åßíáé ðñüãïíïò ôïõ `%s'" + +#, fuzzy +#~ msgid "invalid vector type for attribute `%s'" +#~ msgstr "ìç Ýãêõñï åßäïò áëöáñéèìçôéêïý `%s'" + +#, fuzzy +#~ msgid "__builtin_saveregs not supported by this target" +#~ msgstr "óõìâïëéêïß óýíäåóìïé äåí õðïóôçñßæïíôáé óôï óýóôçìá áõôü" + +#, fuzzy +#~ msgid "missing argument in `__builtin_args_info'" +#~ msgstr "Ëåßðåé ðáñÜìåôñïò ãéá `%s'" + +#, fuzzy +#~ msgid "too many arguments to function `va_start'" +#~ msgstr "ðÜñá ðïëëÜ ïñßóìáôá" + +#, fuzzy +#~ msgid "vector overflow in expression" +#~ msgstr "Åîáßñåóç êéíçôÞò õðïäéáóôïëÞò" + +#, fuzzy +#~ msgid "invalid truth-value expression" +#~ msgstr "Ìç Ýãêõñç êáíïíéêÞ Ýêöñáóç" + +#, fuzzy +#~ msgid "invalid operands to binary %s" +#~ msgstr "Ìç Ýãêõñç åðéëïãÞ `%s'" + +#, fuzzy +#~ msgid "invalid use of `restrict'" +#~ msgstr "ìç Ýãêõñïò áñéèìüò áðü ãñáììÝò" + +#, fuzzy +#~ msgid "cannot disable built-in function `%s'" +#~ msgstr "áäõíáìßá åêôÝëåóçò ioctl óôï `%s'" + +#, fuzzy +#~ msgid "too few arguments to function `%s'" +#~ msgstr "Ðñïåéäïðïßçóç: Ðïëý ëßãá ïñßóìáôá óôï åóùäïìçìÝíï `%s'" + +#, fuzzy +#~ msgid "too many arguments to function `%s'" +#~ msgstr "ðÜñá ðïëëÜ ïñßóìáôá" + +#, fuzzy +#~ msgid "empty range specified" +#~ msgstr "ìç ïñéóìÝíï" + +#, fuzzy +#~ msgid "this is the first entry overlapping that value" +#~ msgstr "áõôüò åßíáé ï ðñþôïò ïñéóìüò" + +#, fuzzy +#~ msgid "duplicate case value" +#~ msgstr "äéðëüò áñéèìüò ìçíýìáôïò" + +#, fuzzy +#~ msgid "this is the first default label" +#~ msgstr "áõôüò åßíáé ï ðñþôïò ïñéóìüò" + +#, fuzzy +#~ msgid "unknown C standard `%s'" +#~ msgstr "Üãíùóôï óåô `%s'" + +#, fuzzy +#~ msgid "conflicting types for `%s'" +#~ msgstr "ìç Ýãêõñï åßäïò áëöáñéèìçôéêïý `%s'" + +#, fuzzy +#~ msgid "redefinition of `%s'" +#~ msgstr "êáíÝíáò ïñéóìüò ôïõ `UNDEFINED'" + +#, fuzzy +#~ msgid "redeclaration of `%s'" +#~ msgstr "äçìéïõñãßá áñ÷åßïõ `%s'\n" + +#, fuzzy +#~ msgid "`%s' declared inline after its definition" +#~ msgstr "%s: äéðëüò ïñéóìüò Ýêäïóçò êáôçãïñßáò" + +#, fuzzy +#~ msgid "a parameter" +#~ msgstr "êáêü üñéóìá" + +#~ msgid "type mismatch with previous implicit declaration" +#~ msgstr "óöÜëìá ôáéñéÜóìáôïò ôýðïõ ìå ðñïçãïýìåíç áõôïíüçôç äéáêýñçîç" + +#~ msgid "previous implicit declaration of `%s'" +#~ msgstr "ðñïçãïýìåíç áõôïíüçôç äéáêýñçîç ôïõ `%s'" + +#~ msgid "implicit declaration of function `%s'" +#~ msgstr "áõôïíüçôç äéáêýñçîç ôçò óõíÜñôçóçò `%s'" + +#, fuzzy +#~ msgid "duplicate label declaration `%s'" +#~ msgstr "äéðëü üíïìá ÷áñáêôÞñá `%s'" + +#, fuzzy +#~ msgid "this is a previous declaration" +#~ msgstr "áõôüò åßíáé ï ðñþôïò ïñéóìüò" + +#, fuzzy +#~ msgid "empty declaration" +#~ msgstr "êåíü áëöáñéèìçôéêü" + +#, fuzzy +#~ msgid "array size missing in `%s'" +#~ msgstr "óöÜëìá êáôÜ ôï êëåßóéìï ôçò åéóüäïõ `%s'" + +#, fuzzy +#~ msgid "storage size of `%s' isn't known" +#~ msgstr "Ôï üíïìá `%s' åßíáé Üãíùóôï\n" + +#, fuzzy +#~ msgid "duplicate `%s'" +#~ msgstr "äéðëü êëåéäß" + +#, fuzzy +#~ msgid "both signed and unsigned specified for `%s'" +#~ msgstr "ìç Ýãêõñïò äçëùôÞò ðåäßïõ: `%s'" + +#, fuzzy +#~ msgid "complex invalid for `%s'" +#~ msgstr "Ìç Ýãêõñç ðñïôåñáéüôçôá `%s'" + +#, fuzzy +#~ msgid "duplicate `const'" +#~ msgstr "äéðëü êëåéäß" + +#, fuzzy +#~ msgid "duplicate `restrict'" +#~ msgstr "äéðëü êëåéäß" + +#, fuzzy +#~ msgid "duplicate `volatile'" +#~ msgstr "äéðëü êëåéäß" + +#, fuzzy +#~ msgid "size of array `%s' is too large" +#~ msgstr "Ï êáôÜëïãïò `%s' äåí åßíáé ðñïóéôüò." + +#, fuzzy +#~ msgid "invalid storage class for function `%s'" +#~ msgstr "ìç Ýãêõñç ôÜîç ÷áñáêôÞñùí `%s'" + +#, fuzzy +#~ msgid "cannot inline function `main'" +#~ msgstr "äåí åßíáé äõíáôü íá äçìéïõñãçèåß ôï áñ÷åßï fifo `%s'" + +#, fuzzy +#~ msgid "parameter has incomplete type" +#~ msgstr "ìç ðëÞñçò åããñáöÞ" + +#, fuzzy +#~ msgid "redefinition of `union %s'" +#~ msgstr "Ïé ïñéóìïß ðçãÞ âñßóêïíôáé óôï ÁÑ×ÅÉÏ" + +#, fuzzy +#~ msgid "%s defined inside parms" +#~ msgstr "óõíå÷ßæåôáé óôï ôìÞìá" + +#~ msgid "union" +#~ msgstr "Ýíùóç" + +#~ msgid "structure" +#~ msgstr "äïìÞ" + +# src/request.c:37 +#, fuzzy +#~ msgid "%s has no %s" +#~ msgstr "%s óå %s" + +#~ msgid "named members" +#~ msgstr "åðþíõìá ìÝëç" + +#~ msgid "members" +#~ msgstr "ìÝëç" + +#, fuzzy +#~ msgid "nested redefinition of `%s'" +#~ msgstr "áäõíáìßá áíïßãìáôïò áñ÷åßïõ ïñéóìïý locale `%s'" + +#, fuzzy +#~ msgid "negative width in bit-field `%s'" +#~ msgstr "Áñíçôéêü ðëÜôïò óôçí áðïôßìçóç" + +#, fuzzy +#~ msgid "`%s' is narrower than values of its type" +#~ msgstr "%s' äåí åßíáé éó÷ýùí èåôéêüò áêÝñáéïò." + +#, fuzzy +#~ msgid "duplicate member `%s'" +#~ msgstr "äéðëü üíïìá ÷áñáêôÞñá `%s'" + +#, fuzzy +#~ msgid "enum defined inside parms" +#~ msgstr "Ìç ïñéóìÝíï üíïìá %s" + +#~ msgid "return type defaults to `int'" +#~ msgstr "ï åðéóôñåöüìåíïò ôýðïò ðñïêáèïñßæåôáé óå `int'" + +#, fuzzy +#~ msgid "`%s' was used with no declaration before its definition" +#~ msgstr "áõôÞ åßíáé ç èÝóç ôïõ ðñþôïõ ïñéóìïý" + +#~ msgid "return type of `%s' is not `int'" +#~ msgstr "ç åðéóôñåöüìåíç ôéìÞ ôçò `%s' äåí åßíáé `int'" + +#~ msgid "first argument of `%s' should be `int'" +#~ msgstr "ôï ðñþôï üñéóìá ôçò `%s' ðñÝðåé íá åßíáé `int'" + +#~ msgid "second argument of `%s' should be `char **'" +#~ msgstr "ôï äåýôåñï üñéóìá ôçò `%s' ðñÝðåé íá åßíáé `char **'" + +#~ msgid "third argument of `%s' should probably be `char **'" +#~ msgstr "ôï ôñßôï üñéóìá ôçò `%s' ðñÝðåé íá åßíáé `char **'" + +#~ msgid "`%s' takes only zero or two arguments" +#~ msgstr "ç `%s' ðáßñíåé åßôå êáíÝíá åßôå äýï ïñßóìáôá" + +#~ msgid "`%s' is normally a non-static function" +#~ msgstr "ç `%s' åßíáé óõíÞèùò ìç-óôáôéêÞ óõíÜñôçóç" + +#~ msgid "parameter name omitted" +#~ msgstr "Ý÷åé ðáñáëçöèåß ôï üíïìá ôçò ðáñáìÝôñïõ" + +#, fuzzy +#~ msgid "parameter `%s' declared void" +#~ msgstr "ï ÷Üñôçò ÷áñáêôÞñùí `%s' ïñßóôçêå Þäç" + +#, fuzzy +#~ msgid "multiple parameters named `%s'" +#~ msgstr "äéðëü üíïìá ÷áñáêôÞñá `%s'" + +#, fuzzy +#~ msgid "no return statement in function returning non-void" +#~ msgstr "`return' ÷ùñßò ôéìÞ, óå óõíÜñôçóç ðïõ åðéóôñÝöåé ìç-êåíü" + +#, fuzzy +#~ msgid "size of return value of `%s' is larger than %d bytes" +#~ msgstr "%s: ïé ôéìÝò ôïõ ðåäßïõ `%s' äåí ðñÝðåé íá åßíáé ìåãáëýôåñåò áðü %d" + +#, fuzzy +#~ msgid "unrecognized format specifier" +#~ msgstr "Üãíùóôï ðñüèåìá: %s" + +#~ msgid "field width" +#~ msgstr "ìÝãåèïò ðåäßïõ" + +#~ msgid "precision" +#~ msgstr "áêñßâåéá" + +#, fuzzy +#~ msgid "fill character" +#~ msgstr "Ìç Ýãêõñïò ÷áñáêôÞñáò ðáñáâïëÞò" + +#, fuzzy +#~ msgid "fill character in strfmon format" +#~ msgstr "ìç Ýãêõñïò ÷áñáêôÞñáò óôï áñ÷åßï: " + +#, fuzzy +#~ msgid "right precision" +#~ msgstr "ÅìöÜíéóç Ýêäïóçò ðñïãñÜììáôïò" + +#, fuzzy +#~ msgid "missing $ operand number in format" +#~ msgstr "Ëåßðåé ï äåêáåîáäéêüò áñéèìüò óôïí ÷áñáêôÞñá äéáöõãÞò." + +#, fuzzy +#~ msgid "operand number out of range in format" +#~ msgstr "Ï áñéèìüò óýíäåóìïõ åßíáé Ýîù áðü ôï üñéï" + +#, fuzzy +#~ msgid "too many arguments for format" +#~ msgstr "ðÜñá ðïëëÜ ïñßóìáôá" + +#, fuzzy +#~ msgid "format is a wide character string" +#~ msgstr "ëßóôá ìå üëá ôá ãíùóôÜ óýíïëá ÷áñáêôÞñùí" + +#, fuzzy +#~ msgid "unterminated format string" +#~ msgstr "ìç ôåñìáôéæüìåío áëöáñéèìçôéêü" + +#, fuzzy +#~ msgid "null format string" +#~ msgstr "Ç áëõóßäá ìïñöÞò äåí åßíáé Ýãêõñç: `%s'" + +#, fuzzy +#~ msgid "repeated %s in format" +#~ msgstr "repeated leap second moment" + +#, fuzzy +#~ msgid "too few arguments for format" +#~ msgstr "ðïëý ëßãá ïñßóìáôá" + +#, fuzzy +#~ msgid "zero width in %s format" +#~ msgstr "óöÜëìá åããñáöÞò %s" + +#, fuzzy +#~ msgid "unknown conversion type character `%c' in format" +#~ msgstr "Üãíùóôïò ÷áñáêôÞñáò `%s'" + +#, fuzzy +#~ msgid "%s does not support %s" +#~ msgstr "áñ÷åßá fifo äåí õðïóôçñßæïíôáé" + +#, fuzzy +#~ msgid "different type" +#~ msgstr "åßäïò ìïñöÞò" + +#, fuzzy +#~ msgid "floating constant out of range" +#~ msgstr "ó÷åôéêÞ èÝóç áñ÷åßïõ åßíáé åêôüò ïñßùí" + +#, fuzzy +#~ msgid "'lul' is not a valid integer suffix" +#~ msgstr "%s' äåí åßíáé éó÷ýùí èåôéêüò áêÝñáéïò." + +#, fuzzy +#~ msgid "integer constant is larger than the maximum value for its type" +#~ msgstr "" +#~ "ï äçëùìÝíïò áñéèìüò bytes `%s' åßíáé ìåãáëýôåñïò áðü ôï ìÝãéóôï\n" +#~ "ðïõ ìðïñåß íá áíáðáñáóôáèåß áðü ôï ôýðï äåäïìÝíùí `long'" + +#, fuzzy +#~ msgid "ignoring invalid multibyte character" +#~ msgstr "Ìç Ýãêõñï Þ áóõìðëÞñùôï multibyte Þ ðëáôýò ÷áñáêôÞñáò" + +#~ msgid "syntax error" +#~ msgstr "óöÜëìá óýíôáîçò" + +#, fuzzy +#~ msgid "syntax error: cannot back up" +#~ msgstr "ï äéá÷ùñéóôÞò äå ìðïñåß íá åßíáé êåíüò" + +#, fuzzy +#~ msgid "parser stack overflow" +#~ msgstr "Õðåñ÷åßëéóç ðßíáêá áñ÷åßïõ" + +#, fuzzy +#~ msgid "`%s' is not at beginning of declaration" +#~ msgstr "ôï `%s' äåí åßíáé êáíïíéêü áñ÷åßï" + +#, fuzzy +#~ msgid "comma at end of enumerator list" +#~ msgstr "óêïõðßäéá óôï ôÝëïò ôïõ áñéèìïý" + +#~ msgid "parse error; also virtual memory exceeded" +#~ msgstr "óöÜëìá åðåîåñãáóßáò· åðßóçò ç ìíÞìç åîáíôëÞèçêå" + +#~ msgid "parse error" +#~ msgstr "óöÜëìá åðåîåñãáóßáò" + +#~ msgid "%s at end of input" +#~ msgstr "%s óôï ôÝëïò ôçò åéóüäïõ" + +#~ msgid "%s before %s'%c'" +#~ msgstr "%s ðñéí áðü %s'%c'" + +#~ msgid "%s before %s'\\x%x'" +#~ msgstr "%s ðñéí áðü %s'\\x%x'" + +#, fuzzy +#~ msgid "%s before string constant" +#~ msgstr "ìç ôåñìáôéæìÝíï áëöáñéèìçôéêü óôáèåñÜò" + +#~ msgid "%s before numeric constant" +#~ msgstr "%s ðñéí áðü áñéèìçôéêÞ óôáèåñÜ" + +# src/request.c:37 +#~ msgid "%s before \"%s\"" +#~ msgstr "%s ðñéí áðü \"%s\"" + +#~ msgid "%s before '%s' token" +#~ msgstr "%s ðñéí áðü ôï óýìâïëï '%s'" + +#~ msgid "syntax error at '%s' token" +#~ msgstr "óõíôáêôéêü óöÜëìá óôï óýìâïëï '%s'" + +#, fuzzy +#~ msgid "#pragma pack(push[, id], ) is not supported on this target" +#~ msgstr "ðñïåéäïðïßçóç: ôï --pid=PID äåí õðïóôçñßæåôáé óå áõôü ôï óýóôçìá" + +#, fuzzy +#~ msgid "#pragma pack(pop[, id], ) is not supported on this target" +#~ msgstr "ðñïåéäïðïßçóç: ôï --pid=PID äåí õðïóôçñßæåôáé óå áõôü ôï óýóôçìá" + +#, fuzzy +#~ msgid "malformed '#pragma pack' - ignored" +#~ msgstr "êáêïäéáìïñöùìÝíç ãñáììÞ áãíïÞèçêå" + +#, fuzzy +#~ msgid "malformed #pragma weak, ignored" +#~ msgstr "êáêïäéáìïñöùìÝíç ãñáììÞ áãíïÞèçêå" + +#, fuzzy +#~ msgid "malformed #pragma redefine_extname, ignored" +#~ msgstr "êáêïäéáìïñöùìÝíç ãñáììÞ áãíïÞèçêå" + +#, fuzzy +#~ msgid "junk at end of #pragma redefine_extname" +#~ msgstr "ìç ôåñìáôéæüìåío áëöáñéèìçôéêü" + +#, fuzzy +#~ msgid "malformed #pragma extern_prefix, ignored" +#~ msgstr "êáêïäéáìïñöùìÝíç ãñáììÞ áãíïÞèçêå" + +#, fuzzy +#~ msgid "junk at end of #pragma extern_prefix" +#~ msgstr "ìç ôåñìáôéæüìåío áëöáñéèìçôéêü" + +#, fuzzy +#~ msgid "invalid use of void expression" +#~ msgstr "Ìç Ýãêõñç êáíïíéêÞ Ýêöñáóç" + +#, fuzzy +#~ msgid "invalid use of flexible array member" +#~ msgstr "ìç Ýãêõñç þñá ôçò ìÝñáò" + +#, fuzzy +#~ msgid "invalid use of undefined type `%s %s'" +#~ msgstr "ìç Ýãêõñïò áñéèìüò áðü êåíÝò ãñáììÝò: `%s'" + +#, fuzzy +#~ msgid "invalid use of incomplete typedef `%s'" +#~ msgstr "ìç Ýãêõñïò äåýôåñïò ôåëåóôÞò óå êáôÜóôáóç óõìâáôüôçôáò `%s'" + +#, fuzzy +#~ msgid "invalid type argument of `%s'" +#~ msgstr "Ç ðáñÜìåôñïò `%s' äåí åßíáé Ýãêõñç." + +#, fuzzy +#~ msgid "called object is not a function" +#~ msgstr "Ôï åðþíõìï áíôéêåßìåíï äåí åßíáé áíáæçôÞóéìï" + +#, fuzzy +#~ msgid "too many arguments to function" +#~ msgstr "ðÜñá ðïëëÜ ïñßóìáôá" + +#, fuzzy +#~ msgid "too few arguments to function" +#~ msgstr "ðïëý ëßãá ïñßóìáôá" + +#~ msgid "division by zero" +#~ msgstr "äéáßñåóç ìå ìçäÝí" + +#, fuzzy +#~ msgid "unordered comparison on non-floating point argument" +#~ msgstr "Ç ðáñÜìåôñïò êéíçôÞò õðïäéáóôïëÞò äåí åßíáé Ýãêõñç: %s" + +#, fuzzy +#~ msgid "wrong type argument to abs" +#~ msgstr "ëÜèïò áñéèìüò ïñéóìÜôùí" + +#, fuzzy +#~ msgid "invalid lvalue in unary `&'" +#~ msgstr "ìç Ýãêõñïò ÷ñüíïò áíáðÞäçò" + +#~ msgid "%s" +#~ msgstr "%s" + +#, fuzzy +#~ msgid "%s of read-only variable `%s'" +#~ msgstr "Ìç áíáãíùñßóéìç ìåôáâëçôÞ `%s'" + +#, fuzzy +#~ msgid "cannot take address of bit-field `%s'" +#~ msgstr "äåí åßíáé äõíáôü íá äçìéïõñãçèåß ôï áñ÷åßï fifo `%s'" + +#, fuzzy +#~ msgid "invalid lvalue in assignment" +#~ msgstr "Ç ðáñÜìåôñïò êéíçôÞò õðïäéáóôïëÞò äåí åßíáé Ýãêõñç: %s" + +#, fuzzy +#~ msgid "assignment" +#~ msgstr "ðñïóðÝñáóìá ïñßóìáôïò" + +#~ msgid "%s makes pointer from integer without a cast" +#~ msgstr "%s ìåôáôñÝðåé áêÝñáéï óå äåßêôç ÷ùñßò ìåôáôñïðÝá" + +#, fuzzy +#~ msgid "incompatible type for argument %d of `%s'" +#~ msgstr "Ìç Ýãêõñç áêÝñáéá ðáñÜìåôñïò `%s'" + +#, fuzzy +#~ msgid "incompatible types in %s" +#~ msgstr "ìç Ýãêõñï åßäïò áëöáñéèìçôéêïý `%s'" + +#~ msgid "passing arg %d of `%s'" +#~ msgstr "ôï ðÝñáóìá ôïõ ïñßóìáôïò %d áðü `%s'" + +#~ msgid "passing arg %d of pointer to function" +#~ msgstr "ôï ðÝñáóìá ôïõ ïñßóìáôïò %d ôïõ äåßêôç óôç óõíÜñôçóç" + +# src/request.c:263 +#, fuzzy +#~ msgid "(near initialization for `%s')" +#~ msgstr "Ôï âÞìá áñ÷éêïðïßçóçò áðÝôõ÷å" + +#, fuzzy +#~ msgid "initializer element is not constant" +#~ msgstr "ìç ôåñìáôéæìÝíï áëöáñéèìçôéêü óôáèåñÜò" + +# src/request.c:263 +#~ msgid "initialization" +#~ msgstr "áñ÷éêïðïßçóç" + +#, fuzzy +#~ msgid "invalid initializer" +#~ msgstr "ìç Ýãêõñï ìÝãåèïò ïñéæüíôéïõ óôçëïèÝôç: %s" + +#, fuzzy +#~ msgid "extra brace group at end of initializer" +#~ msgstr "áêïëïõèïýí óêïõðßäéá óôï ôÝëïò ôçò ãñáììÞò" + +#, fuzzy +#~ msgid "missing initializer" +#~ msgstr "Ý÷åé ðáñáëçöèåß ôï áñ÷åßï ðñïïñéóìïý" + +#, fuzzy +#~ msgid "asm template is not a string constant" +#~ msgstr "ìç ôåñìáôéæìÝíï áëöáñéèìçôéêü óôáèåñÜò" + +#, fuzzy +#~ msgid "modification by `asm'" +#~ msgstr "Ç ôñïðïðïßçóç áðÝôõ÷å" + +#~ msgid "`return' with no value, in function returning non-void" +#~ msgstr "`return' ÷ùñßò ôéìÞ, óå óõíÜñôçóç ðïõ åðéóôñÝöåé ìç-êåíü" + +#~ msgid "return" +#~ msgstr "åðéóôñïöÞ" + +#, fuzzy +#~ msgid "can't inline call to `%s'" +#~ msgstr "áäõíáìßá åêôÝëåóçò ioctl óôï `%s'" + +#~ msgid "internal error" +#~ msgstr "åóùôåñéêü óöÜëìá" + +#~ msgid "no arguments" +#~ msgstr "÷ùñßò ïñßóìáôá" + +# src/getopt1.c:132 +# src/getopt1.c:132 +#~ msgid "fopen %s" +#~ msgstr "fopen %s" + +#~ msgid "fclose %s" +#~ msgstr "fclose %s" + +#, fuzzy +#~ msgid "%s terminated with signal %d [%s]%s" +#~ msgstr "%s: Ï ðñïåðåîåñãáóôÞò C áðÝôõ÷å ìå óÞìá %d\n" + +#, fuzzy +#~ msgid "[cannot find %s]" +#~ msgstr "Äåí åßíáé äõíáôüí íá åêôåëåóôåß ôï %s" + +#, fuzzy +#~ msgid "cannot find `%s'" +#~ msgstr "áäõíáìßá áíïßãìáôïò ôïõ `%s'" + +#, fuzzy +#~ msgid "[Leaving %s]\n" +#~ msgstr "äéáãñáöÞ êáôáëüãïõ %s\n" + +#, fuzzy +#~ msgid "cannot find `nm'" +#~ msgstr "áäõíáìßá áíïßãìáôïò ôïõ `%s'" + +#~ msgid "pipe" +#~ msgstr "óùëÞíùóç" + +#~ msgid "fdopen" +#~ msgstr "fdopen" + +#~ msgid "dup2 %d 1" +#~ msgstr "dup2 %d 1" + +#~ msgid "close %d" +#~ msgstr "close %d" + +#~ msgid "execvp %s" +#~ msgstr "execvp %s" + +#~ msgid "fclose" +#~ msgstr "fclose" + +#, fuzzy +#~ msgid "unable to open file '%s'" +#~ msgstr "Äåí ìðüñåóá íá áíïßîù ôï áñ÷åßï %s" + +#, fuzzy +#~ msgid "unable to stat file '%s'" +#~ msgstr "áäõíáìßá ðñïóðÝëáóçò(stat()) áñ÷åßïõ `%s': %s" + +#, fuzzy +#~ msgid "unable to mmap file '%s'" +#~ msgstr "Áäõíáìßá ìåôáöïñÜò óôç ìíÞìç (mmap) ôïõ áñ÷åßïõ %s.\n" + +#~ msgid "not found\n" +#~ msgstr "äå âñÝèçêå\n" + +#, fuzzy +#~ msgid "bad magic number in file '%s'" +#~ msgstr "ìç Ýãêõñïò áñéèìüò áñ÷åßïõ óôç äÞëùóç ðåäßïõ: `%s'" + +#~ msgid "dynamic dependencies.\n" +#~ msgstr "äõíáìéêÝò åîáñôÞóåéò.\n" + +#, fuzzy +#~ msgid "cannot find `ldd'" +#~ msgstr "áäõíáìßá áíïßãìáôïò ôïõ `%s'" + +#~ msgid "execv %s" +#~ msgstr "execv %s" + +#, fuzzy +#~ msgid "%s: not a COFF file" +#~ msgstr "%s: Äåí åßíáé êáíïíéêü áñ÷åßï" + +#, fuzzy +#~ msgid "%s: cannot open as COFF file" +#~ msgstr "áäõíáìßá áíïßãìáôïò áñ÷åßïõ åîüäïõ" + +#, fuzzy +#~ msgid "library lib%s not found" +#~ msgstr "Ðéèáíüí äå âñÝèçêå" + +# src/getopt1.c:132 +# src/getopt1.c:132 +#~ msgid "open %s" +#~ msgstr "open %s" + +#, fuzzy +#~ msgid "section pointer missing" +#~ msgstr "ïñéóìüò äéêáéùìÜôùí óôï %s" + +#, fuzzy +#~ msgid "no symbol table found" +#~ msgstr "äåí äþèçêå óõìâïëéêü üíïìá" + +#, fuzzy +#~ msgid "no cmd_strings found" +#~ msgstr "Äåí âñÝèçêå ìÝóï" + +#, fuzzy +#~ msgid "" +#~ "writing load commands.\n" +#~ "\n" +#~ msgstr "¸÷åé ðáñáëçöèåß åíôïëÞ" + +#~ msgid "close %s" +#~ msgstr "close %s" + +#, fuzzy +#~ msgid "bad magic number" +#~ msgstr "ÅóöáëìÝíïò áñéèìüò áñ÷åßïõ" + +#~ msgid "bad header version" +#~ msgstr "åóöáëìÝíç Ýêäïóç êåöáëßäáò" + +#, fuzzy +#~ msgid "old raw header file" +#~ msgstr "Äåí åßíáé åðþíõìï áñ÷åßï" + +#, fuzzy +#~ msgid "unsupported version" +#~ msgstr "ÅìöÜíéóç Ýêäïóçò ðñïãñÜììáôïò" + +# src/request.c:37 +#~ msgid "fstat %s" +#~ msgstr "fstat %s" + +#~ msgid "lseek %s 0" +#~ msgstr "lseek %s 0" + +#~ msgid "read %s" +#~ msgstr "read %s" + +#~ msgid "msync %s" +#~ msgstr "msync %s" + +#~ msgid "munmap %s" +#~ msgstr "munmap %s" + +#~ msgid "write %s" +#~ msgstr "write %s" + +#, fuzzy +#~ msgid "cannot convert to a pointer type" +#~ msgstr "Äåí åßíáé äõíáôüí íá âñåèåß ï ôýðïò ôïõ åðåîåñãáóôÞ." + +#, fuzzy +#~ msgid "conversion to incomplete type" +#~ msgstr "ìç ðëÞñçò åããñáöÞ" + +#, fuzzy +#~ msgid "integer constant out of range" +#~ msgstr "ó÷åôéêÞ èÝóç áñ÷åßïõ åßíáé åêôüò ïñßùí" + +#, fuzzy +#~ msgid "invalid character '%c' in #if" +#~ msgstr "ìç Ýãêõñïò ÷áñáêôÞñáò `%c' óôï ôýðï áëöáñéèìçôéêïý `%s'" + +#, fuzzy +#~ msgid "invalid character '\\%03o' in #if" +#~ msgstr "ìç Ýãêõñïò ÷áñáêôÞñáò `%c' óôï ôýðï áëöáñéèìçôéêïý `%s'" + +#, fuzzy +#~ msgid "missing binary operator" +#~ msgstr "Áãíùóôïò äõáäéêüò ÷åéñéóôÞò." + +#, fuzzy +#~ msgid "ignoring nonexistent directory \"%s\"\n" +#~ msgstr "äéáãñáöÞ ìç-êáôáëüãïõ `%s'\n" + +#, fuzzy +#~ msgid "%s: Not a directory" +#~ msgstr "Äåí åßíáé êáôÜëïãïò" + +#, fuzzy +#~ msgid "ignoring duplicate directory \"%s\"\n" +#~ msgstr "áäõíáìßá áëëáãÞò óôï êáôÜëïãï \"%s\"" + +#, fuzzy +#~ msgid "changing search order for system directory \"%s\"" +#~ msgstr "áäõíáìßá áëëáãÞò óôï êáôÜëïãï \"%s\"" + +#, fuzzy +#~ msgid "End of search list.\n" +#~ msgstr "ÔÝëïò ôìÞìáôïò" + +#, fuzzy +#~ msgid "I/O error on output" +#~ msgstr "ÓöÜëìá åéóüäïõ/åîüäïõ" + +#, fuzzy +#~ msgid "argument missing after %s" +#~ msgstr "Ý÷ïõí ðáñáëçöèåß ïñßóìáôá" + +#, fuzzy +#~ msgid "assertion missing after %s" +#~ msgstr "ïñéóìüò äéêáéùìÜôùí óôï %s" + +#, fuzzy +#~ msgid "file name missing after %s" +#~ msgstr "Ý÷ïõí ðáñáëçöèåß ïñßóìáôá" + +#, fuzzy +#~ msgid "number missing after %s" +#~ msgstr "ïñéóìüò äéêáéùìÜôùí óôï %s" + +#, fuzzy +#~ msgid "target missing after %s" +#~ msgstr "Áñ÷Þ áñ÷åßïõ %s\n" + +#, fuzzy +#~ msgid "-I- specified twice" +#~ msgstr "ìç ïñéóìÝíï" + +#, fuzzy +#~ msgid "possible start of unterminated string literal" +#~ msgstr "ìç ôåñìáôéæìÝíï áëöáñéèìçôéêü óôáèåñÜò" + +#~ msgid "multi-line string literals are deprecated" +#~ msgstr "äå óõíßóôáôáé ðéá ç ÷ñÞóç áëöáñéèìçôéêþí óôáèåñþí ðïëëáðëþí ãñáììþí" + +#, fuzzy +#~ msgid "no newline at end of file" +#~ msgstr "%s: ðñüùñï ôÝëïò áñ÷åßïõ" + +#, fuzzy +#~ msgid "unknown string token %s\n" +#~ msgstr "¶ãíùóôÞ åðéëïãÞ ãéá ôï `s'" + +# src/main.c:663 +#, fuzzy +#~ msgid "unknown escape sequence: '\\%03o'" +#~ msgstr "¶ãíùóôç óõìâïëïóåéñÜ `%s'" + +#~ msgid "invalid option %s" +#~ msgstr "ìç Ýãêõñç åðéëïãÞ %s" + +#, fuzzy +#~ msgid "\"%s\" is not a valid option to the preprocessor" +#~ msgstr "%s' äåí åßíáé éó÷ýùí èåôéêüò áêÝñáéïò." + +#~ msgid "too many input files" +#~ msgstr "õðåñâïëéêÜ ðïëëÜ áñ÷åßá åéóüäïõ" + +#~ msgid "%s:%d: warning: " +#~ msgstr "%s:%d: ðñïåéäïðïßçóç: " + +#~ msgid "%s: warning: " +#~ msgstr "%s: ðñïåéäïðïßçóç: " + +#~ msgid "((anonymous))" +#~ msgstr "((áíþíõìï))" + +# src/request.c:37 +#~ msgid "%s: %s: " +#~ msgstr "%s: %s: " + +#~ msgid "sorry, not implemented: " +#~ msgstr "óõããíþìç, ç ëåéôïõñãßá äåí Ý÷åé õëïðïéçèåß: " + +#~ msgid "%s " +#~ msgstr "%s " + +#~ msgid " %s" +#~ msgstr " %s" + +#~ msgid "In member function `%s':" +#~ msgstr "Óôç óõíÜñôçóç ìÝëïò `%s':" + +#~ msgid "In function `%s':" +#~ msgstr "Óôç óõíÜñôçóç `%s':" + +#, fuzzy +#~ msgid "compilation terminated.\n" +#~ msgstr "Ç ëåéôïõñãßá äåí åðéôñÝðåôáé" + +#, fuzzy +#~ msgid "Internal compiler error in %s, at %s:%d" +#~ msgstr "åóùôåñéêü óöÜëìá óôï %s, ãñáììÞ %u" + +#~ msgid ":\n" +#~ msgstr ":\n" + +#, fuzzy +#~ msgid "`%s' is deprecated" +#~ msgstr "ôï `%s' äåí åßíáé êáíïíéêü áñ÷åßï" + +#, fuzzy +#~ msgid "DW_LOC_OP %s not implemented\n" +#~ msgstr "Ç ëåéôïõñãßá äåí Ý÷åé õëïðïéçèåß" + +#, fuzzy +#~ msgid "can't get current directory" +#~ msgstr "Äåí åßíáé äõíáôüí íá ëçöèåß ï ôñÝ÷ùí êáôÜëïãïò." + +#, fuzzy +#~ msgid "__builtin_eh_return not supported on this target" +#~ msgstr "óõìâïëéêïß óýíäåóìïé äåí õðïóôçñßæïíôáé óôï óýóôçìá áõôü" + +#, fuzzy +#~ msgid "stack limits not supported on this target" +#~ msgstr "óõìâïëéêïß óýíäåóìïé äåí õðïóôçñßæïíôáé óôï óýóôçìá áõôü" + +#, fuzzy +#~ msgid "could not split insn" +#~ msgstr "áäõíáìßá åýñåóçò âñü÷ïõ" + +#, fuzzy +#~ msgid "invalid `asm': " +#~ msgstr "ìç Ýãêõñï ìÝãåèïò ïñéæüíôéïõ óôçëïèÝôç: %s" + +#, fuzzy +#~ msgid "unterminated assembly dialect alternative" +#~ msgstr "ìç ôåñìáôéæüìåíï óõìâïëéêü üíïìá" + +#, fuzzy +#~ msgid "operand number missing after %%-letter" +#~ msgstr "ïñéóìüò äéêáéùìÜôùí óôï %s" + +#, fuzzy +#~ msgid "operand number out of range" +#~ msgstr "Ï áñéèìüò óýíäåóìïõ åßíáé Ýîù áðü ôï üñéï" + +#, fuzzy +#~ msgid "invalid %%-code" +#~ msgstr "ìç Ýãêõñï äéêáßùìá" + +#, fuzzy +#~ msgid "invalid expression as operand" +#~ msgstr "%s: ìç Ýãêõñç êáíïíéêÞ Ýêöñáóç: %s" + +#~ msgid "control reaches end of non-void function" +#~ msgstr "ï Ýëåã÷ïò öèÜíåé óôï ôÝëïò ìç-êåíÞò óõíÜñôçóçò" + +# src/shred.c:1134 +#, fuzzy +#~ msgid "size of variable `%s' is too large" +#~ msgstr "%s: ôï áñ÷åßï åßíáé ðïëý ìåãÜëï" + +#, fuzzy +#~ msgid "unused parameter `%s'" +#~ msgstr "Üãíùóôïò ÷áñáêôÞñáò `%s'" + +# src/main.c:785 +#, fuzzy +#~ msgid "ambiguous abbreviation %s" +#~ msgstr "ÁóáöÞò ìïñöÞ `%s'" + +#, fuzzy +#~ msgid "missing argument to `%s' option" +#~ msgstr "Ëåßðåé ðáñÜìåôñïò ãéá `%s'" + +#, fuzzy +#~ msgid "extraneous argument to `%s' option" +#~ msgstr "Ëåßðåé ðáñÜìåôñïò ãéá `%s'" + +#, fuzzy +#~ msgid "" +#~ "Setting spec %s to '%s'\n" +#~ "\n" +#~ msgstr "äçìéïõñãßá %s %s óôï %s" + +#, fuzzy +#~ msgid "rename spec %s to %s\n" +#~ msgstr "äçìéïõñãßá %s %s óôï %s" + +#, fuzzy +#~ msgid "specs unknown %% command after %ld characters" +#~ msgstr "ëßóôá ìå üëá ôá ãíùóôÜ óýíïëá ÷áñáêôÞñùí" + +#~ msgid "-pipe not supported" +#~ msgstr "ôï -pipe äåí õðïóôçñßæåôáé" + +#~ msgid "" +#~ "\n" +#~ "Go ahead? (y or n) " +#~ msgstr "" +#~ "\n" +#~ "Íá óõíå÷ßóåôå; (y Þ n) " + +#~ msgid "# %s %.2f %.2f\n" +#~ msgstr "# %s %.2f %.2f\n" + +#~ msgid "Usage: %s [options] file...\n" +#~ msgstr "÷ñÞóç: %s [åðéëïãÝò] áñ÷åßï...\n" + +#~ msgid "Options:\n" +#~ msgstr "ÅðéëïãÝò:\n" + +#~ msgid " -pass-exit-codes Exit with highest error code from a phase\n" +#~ msgstr " -pass-exit-codes ¸îïäïò ìå ôï õøçëüôåñï êùäéêü óöÜëìáôïò ôçò öÜóçò\n" + +#~ msgid " --help Display this information\n" +#~ msgstr " --help ÅìöÜíéóç áõôþí ôùí ðëçñïöïñéþí\n" + +#~ msgid " --target-help Display target specific command line options\n" +#~ msgstr " --target-help ÅìöÜíéóç åðéëïãÝò ãñáììþí åíôïëÞò ó÷åôéêÝò ìå ôï óôü÷ï\n" + +#~ msgid " (Use '-v --help' to display command line options of sub-processes)\n" +#~ msgstr " (×ñÞóç '-v --help' ãéá ôçí åìöÜíéóç åðéëïãþí ãñáììÞò åíôïëÞò õðïäéåñãáóéþí)\n" + +#~ msgid " -dumpspecs Display all of the built in spec strings\n" +#~ msgstr " -dumpspecs ÅìöÜíéóç üëùí ôùí ðñïêáèïñéóìÝíùí áëöáñéèìçôéêþí ôùí ðñïóäéïñéóìþí\n" + +#~ msgid " -dumpversion Display the version of the compiler\n" +#~ msgstr " -dumpversion ÅìöÜíéóç ôçò Ýêäïóçò ôïõ ìåôáãëùôôéóôÞ\n" + +#~ msgid " -dumpmachine Display the compiler's target processor\n" +#~ msgstr " -dumpmachine ÅìöÜíéóç ôïõ åðåîåñãáóôÞ óôü÷ïõ ôïõ ìåôáãëùôôéóôÞ\n" + +#~ msgid " -print-search-dirs Display the directories in the compiler's search path\n" +#~ msgstr " -print-search-dirs ÅìöÜíéóç ôùí êáôáëüãùí óôéò äéáäñïìÝò áíáæÞôçóçò ôïõ ìåôáãëùôôéóôÞ\n" + +#~ msgid " -print-libgcc-file-name Display the name of the compiler's companion library\n" +#~ msgstr " -print-libgcc-file-name ÅìöÜíéóç ôïõ ïíüìáôïò ôçò óõíïäåõôéêÞò âéâëéïèÞêçò ôïõ ìåôáãëùôôéóôÞ\n" + +#~ msgid " -print-file-name= Display the full path to library \n" +#~ msgstr " -print-file-name=<âéâëéïè> ÅìöÜíéóç ôçò ðëÞñçò äéáäñïìÞò óôç âéâëéïèÞêç <âéâëéïè>\n" + +#~ msgid " -print-prog-name= Display the full path to compiler component \n" +#~ msgstr " -print-prog-name=<ðñüãñ> ÅìöÜíéóç ôçò ðëÞñçò äéáäñïìÞò óôï óõóôáôéêü ìåôáãëùôôéóôÞ <ðñüãñ>\n" + +#~ msgid " -print-multi-directory Display the root directory for versions of libgcc\n" +#~ msgstr " -print-multi-directory ÅìöÜíéóç ôïõ ñéæéêïý êáôáëüãïõ ãéá åêäüóåéò ôçò libgcc\n" + +#~ msgid "" +#~ " -print-multi-lib Display the mapping between command line options and\n" +#~ " multiple library search directories\n" +#~ msgstr "" +#~ " -print-multi-lib ÅìöÜíéóç ôçò áíôéóôïß÷éóçò ìåôáîý åðéëïãþí ãñáììÞò\n" +#~ " åíôïëÞò êáé êáôáëüãùí áíáæÞôçóçò ðïëëáðëþí\n" +#~ " âéâëéïèçêþí\n" + +#~ msgid " -Wa, Pass comma-separated on to the assembler\n" +#~ msgstr " -Wa,<åðéëïãÝò> ÐÝñáóìá <åðéëïãþí> äéá÷ùñéóìÝíùí ìå êüììá óôï óõíáñìïëïãçôÞ\n" + +#~ msgid " -Wp, Pass comma-separated on to the preprocessor\n" +#~ msgstr " -Wp,<åðéëïãÝò> ÐÝñáóìá <åðéëïãþí> äéá÷ùñéóìÝíùí ìå êüììá óôïí ðñï-åðåîåñãáóôÞ\n" + +#~ msgid " -Wl, Pass comma-separated on to the linker\n" +#~ msgstr " -Wl,<åðéëïãÝò> ÐÝñáóìá <åðéëïãþí> äéá÷ùñéóìÝíùí ìå êüììá óôï óõíäÝôç\n" + +#~ msgid " -Xlinker Pass on to the linker\n" +#~ msgstr " -Xlinker <üñéóìá> ÐÝñáóìá <ïñßóìáôïò> óôï óõíäÝôç\n" + +#~ msgid " -save-temps Do not delete intermediate files\n" +#~ msgstr " -save-temps Íá ìç äéáãñáöïýí ôá åíäéÜìåóá áñ÷åßá\n" + +#~ msgid " -pipe Use pipes rather than intermediate files\n" +#~ msgstr " -pipe ×ñÞóç óùëçíþóåùí áíôß åíäéÜìåóùí áñ÷åßùí\n" + +#~ msgid " -time Time the execution of each subprocess\n" +#~ msgstr " -time ÌÝôñçóç ôïõ ÷ñüíïõ åêôÝëåóçò êÜèå õðïäéåñãáóßáò\n" + +#~ msgid " -specs= Override built-in specs with the contents of \n" +#~ msgstr " -specs=<áñ÷åßï> ×ñÞóç ôïõ ðåñéå÷ïìÝíïõ ôïõ <áñ÷åßïõ> áíôß ôùí ðñïêáèïñéóìÝíùí ðñïóäéïñéóìþí\n" + +#~ msgid " -std= Assume that the input sources are for \n" +#~ msgstr "" +#~ " -std=<ðñüôõðï> Èåþñçóå üôé ïé ðçãÝò êþäéêá åßíáé ãéá ôï <ðñüôõðï>\n" +#~ "\n" + +#~ msgid " -B Add to the compiler's search paths\n" +#~ msgstr " -B <êáôÜëïãïò> ÐñïóèÞêç ôïõ <êáôáëüãïõ> óôéò äéáäñïìÝò áíáæÞôçóçò ôïõ ìåôáãëùôôéóôÞ\n" + +#~ msgid " -b Run gcc for target , if installed\n" +#~ msgstr " -b <ìç÷áíÞ> ÅêôÝëåóç ôïõ gcc ãéá ôï óôü÷ï <ìç÷áíÞ>, áí åßíáé åãêáôåóôçìÝíïò\n" + +#~ msgid " -V Run gcc version number , if installed\n" +#~ msgstr " -V <Ýêäïóç> ÅêôÝëåóç ôçò Ýêäïóçò <Ýêäïóç> ôïõ gcc, áí åßíáé åãêáôåóôçìÝíç\n" + +#~ msgid " -v Display the programs invoked by the compiler\n" +#~ msgstr " -v ÅìöÜíéóç ôùí ðñïãñáììÜôùí ðïõ êáëåß ï ìåôáãëùôôéóôÞò\n" + +#~ msgid " -E Preprocess only; do not compile, assemble or link\n" +#~ msgstr " -E Ðñïåðåîåñãáóßá ìüíï· ü÷é ìåôáãëþôôéóç, óõíáñìïëüãçóç Þ óýíäåóç\n" + +#~ msgid " -S Compile only; do not assemble or link\n" +#~ msgstr " -S Ìåôáãëþôôéóç ìüíï· ü÷é óõíáñìïëüãçóç Þóýíäåóç\n" + +#~ msgid " -c Compile and assemble, but do not link\n" +#~ msgstr " -c Ìåôáãëþôôéóç êáé óõíáñìïëüãçóç, ü÷éüìùò óýíäåóç\n" + +#~ msgid " -o Place the output into \n" +#~ msgstr " -o <áñ÷åßï> ÔïðïèÝôçóç ôçò åîüäïõ óôï <áñ÷åßï>\n" + +#~ msgid "" +#~ " -x Specify the language of the following input files\n" +#~ " Permissable languages include: c c++ assembler none\n" +#~ " 'none' means revert to the default behavior of\n" +#~ " guessing the language based on the file's extension\n" +#~ msgstr "" +#~ " -x <ãëþóóá> Êáèïñéóìüò ôçò ãëþóóáò ôùí åðüìåíùí áñ÷Ýéùí åéóüäïõ\n" +#~ " ÁðïäåêôÝò ãëþóóåò åßíáé: c c++ assembler none\n" +#~ " Ôï 'none' óçìáßíåé åðáíáöïñÜ óôçí åî ïñéóìïý\n" +#~ " óõìðåñéöïñÜ åýñåóçò ôçò ãëþóóáò âÜóåé ôçò åðÝêôáóçò\n" +#~ " ôïõ áñ÷åßïõ\n" + +#~ msgid "" +#~ "\n" +#~ "Options starting with -g, -f, -m, -O, -W, or --param are automatically\n" +#~ " passed on to the various sub-processes invoked by %s. In order to pass\n" +#~ " other options on to these processes the -W options must be used.\n" +#~ msgstr "" +#~ "\n" +#~ "Ïé åðéëïãÝò ðïõ îåêéíïýí ìå -g, -f, -m, -O, -W Þ --param ðåñíïýí áõôüìáôá\n" +#~ " óôéò äéÜöïñåò õðïäéåñãáóßåò ðïõ êáëåß ôï %s. Ãéá íá ðåñÜóåôå Üëëåò\n" +#~ " åðéëïãÝò óå áõôÝò ôéò äéåñãáóßåò, ðñÝðåé íá ÷ñçóéìïðïéÞóåôå ôéò åðéëïãÝò\n" +#~ " -W<ãñÜììá>.\n" + +#~ msgid "%s (GCC) %s\n" +#~ msgstr "%s (GCC) %s\n" + +#~ msgid "Copyright (C) 2002 Free Software Foundation, Inc.\n" +#~ msgstr "ÐíåõìáôéêÜ Äéêáéþìáôá (C) 2002 Free Software Foundation, Inc.\n" + +# src/main.c:850 +#, fuzzy +#~ msgid "" +#~ "This is free software; see the source for copying conditions. There is NO\n" +#~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" +#~ "\n" +#~ msgstr "" +#~ "Áõôü åßíáé åëåýèåñï ëïãéóìéêü· äåßôå ôïí ðçãáßï êþäéêá ãéá ôïõò êáíïíéóìïýò\n" +#~ "áíôéãñáöÞò. Äåí õðÜñ÷åé ÊÁÌÉÁ åããýçóç· ïýôå áêüìá ãéá ËÅÉÔÏÕÑÃÉÊÏÔÇÔÁ Þ \n" +#~ "ÊÁÔÁËËÇËÏÔÇÔÁ ÃÉÁ ÅÍÁ ÓÕÃÊÅÊÑÉÌÅÍÏ ÓÊÏÐÏ.\n" + +#, fuzzy +#~ msgid "argument to `-Xlinker' is missing" +#~ msgstr "Ý÷ïõí ðáñáëçöèåß ïñßóìáôá" + +#, fuzzy +#~ msgid "argument to `-l' is missing" +#~ msgstr "Ý÷ïõí ðáñáëçöèåß ïñßóìáôá" + +#, fuzzy +#~ msgid "argument to `-specs' is missing" +#~ msgstr "Ý÷ïõí ðáñáëçöèåß ïñßóìáôá" + +#, fuzzy +#~ msgid "argument to `-specs=' is missing" +#~ msgstr "Ý÷ïõí ðáñáëçöèåß ïñßóìáôá" + +#, fuzzy +#~ msgid "argument to `-b' is missing" +#~ msgstr "Ý÷ïõí ðáñáëçöèåß ïñßóìáôá" + +#, fuzzy +#~ msgid "argument to `-B' is missing" +#~ msgstr "Ý÷ïõí ðáñáëçöèåß ïñßóìáôá" + +#, fuzzy +#~ msgid "argument to `-V' is missing" +#~ msgstr "Ý÷ïõí ðáñáëçöèåß ïñßóìáôá" + +#, fuzzy +#~ msgid "invalid version number format" +#~ msgstr "ìç Ýãêõñç äéáìüñöùóç óõíôüìåõóçò" + +#, fuzzy +#~ msgid "argument to `-x' is missing" +#~ msgstr "Ý÷ïõí ðáñáëçöèåß ïñßóìáôá" + +#, fuzzy +#~ msgid "argument to `-%s' is missing" +#~ msgstr "Ý÷ïõí ðáñáëçöèåß ïñßóìáôá" + +#, fuzzy +#~ msgid "invalid specification! Bug in cc" +#~ msgstr "Ìç Ýãêõñç ñýèìéóç èýñáò (port)" + +#, fuzzy +#~ msgid "spec failure: unrecognized spec option '%c'" +#~ msgstr "%s: ìç áíáãíùñßóéìç åðéëïãÞ `-%c'\n" + +#~ msgid "unrecognized option `-%s'" +#~ msgstr "ìç áíáãíùñßóçìç åðéëïãÞ `-%s'" + +#~ msgid "install: %s%s\n" +#~ msgstr "åãêáôÜóôáóç: %s%s\n" + +#~ msgid "programs: %s\n" +#~ msgstr "ðñïãñÜììáôá: %s\n" + +#~ msgid "libraries: %s\n" +#~ msgstr "âéâëéïèÞêåò: %s\n" + +#~ msgid "" +#~ "\n" +#~ "For bug reporting instructions, please see:\n" +#~ msgstr "" +#~ "\n" +#~ "Ãéá ïäçãßåò ãéá áíáöïñÝò óöáëìÜôùí. ðáñáêáëþ äåßôå:\n" + +#~ msgid "Configured with: %s\n" +#~ msgstr "¸÷åé ñõèìéóôåß ìå: %s\n" + +#~ msgid "Thread model: %s\n" +#~ msgstr "ÌïíôÝëï íçìÜôùí: %s\n" + +#~ msgid "gcc version %s\n" +#~ msgstr "Ýêäïóç gcc %s\n" + +#~ msgid "gcc driver version %s executing gcc version %s\n" +#~ msgstr "Ýêäïóç ïäçãïý gcc %s åêôåëåß ôçí Ýêäïóç gcc %s\n" + +#~ msgid "no input files" +#~ msgstr "äåí õðÜñ÷ïõí áñ÷åßá åéóüäïõ" + +#~ msgid "%s: %s compiler not installed on this system" +#~ msgstr "%s: ï ìåôáãëùôôéóôÞò %s äåí Ý÷åé åãêáôáóôáèåß óôï óýóôçìá áõôü" + +#~ msgid "internal gcc abort" +#~ msgstr "åóùôåñéêü óöÜëìá gcc" + +# src/main.c:178 +#, fuzzy +#~ msgid "Internal gcov abort.\n" +#~ msgstr "Åóùôåñéêü óöÜëìá (recoding)" + +#~ msgid "" +#~ "Usage: gcov [OPTION]... SOURCEFILE\n" +#~ "\n" +#~ msgstr "" +#~ "×ñÞóç: gcov [ÅÐÉËÏÃÇ]... [ÁÑןÏÐÇÃÇÓ]\n" +#~ "\n" + +#~ msgid "" +#~ "Print code coverage information.\n" +#~ "\n" +#~ msgstr "" +#~ "EìöÜíéóç ðëçñïöïñéþí êÜëõøçò êþäéêá.\n" +#~ "\n" + +#~ msgid " -h, --help Print this help, then exit\n" +#~ msgstr " -h, --help ÅìöÜíéóç áõôÞò ôçò âïÞèåéáò, ìåôÜ Ýîïäïò\n" + +#~ msgid " -v, --version Print version number, then exit\n" +#~ msgstr " -v, --version ÅìöÜíéóç áñéèìïý Ýêäïóçò, ìåôÜ Ýîïäïò\n" + +#~ msgid "" +#~ "\n" +#~ "For bug reporting instructions, please see:\n" +#~ "%s.\n" +#~ msgstr "" +#~ "\n" +#~ "Ãéá ïäçãßåò óôéò áíáöïñÝò óöáëìÜôùí, ðáñáêáëþ äåßôå:\n" +#~ "%s.\n" + +#~ msgid "gcov (GCC) %s\n" +#~ msgstr "gcov (GCC) %s\n" + +#~ msgid "Copyright (C) 2001 Free Software Foundation, Inc.\n" +#~ msgstr "ÐíåõìáôéêÜ Äéêáéþìáôá (C) 2001 Free Software Foundation, Inc.\n" + +#, fuzzy +#~ msgid "Could not open basic block file %s.\n" +#~ msgstr "Äåí ìðüñåóá íá áíïßîù ôï áñ÷åßï %s" + +#, fuzzy +#~ msgid "Could not open program flow graph file %s.\n" +#~ msgstr "Áäýíáôç ç äçìéïõñãßá áñ÷åßïõ êáôáãñáöþí \"%s\"" + +#, fuzzy +#~ msgid "No executable code associated with file %s.\n" +#~ msgstr "ÊáìéÜ äéåýèõíóç äåí óõíäÝåôáé ìå ôï üíïìá" + +#, fuzzy +#~ msgid "No branches in function %s\n" +#~ msgstr "Äåí âñÝèçêáí ôáéñéÜóìáôá óôç ìïñöÞ `%s'.\n" + +#, fuzzy +#~ msgid "No calls in function %s\n" +#~ msgstr "Äåí âñÝèçêáí URL óôï %s.\n" + +#, fuzzy +#~ msgid "didn't use all bb entries of graph, function %s\n" +#~ msgstr "äéáãñáöÞ üëùí ôùí åããñáöþí ôïõ êáôáëüãïõ %s\n" + +#, fuzzy +#~ msgid "No branches in file %s\n" +#~ msgstr "" +#~ "Äåí õðÜñ÷åé áñ÷åßï `%s'.\n" +#~ "\n" + +#, fuzzy +#~ msgid "No calls in file %s\n" +#~ msgstr "äçìéïõñãßá áñ÷åßïõ `%s'\n" + +#, fuzzy +#~ msgid "Could not open source file %s.\n" +#~ msgstr "Äåí ìðüñåóá íá áíïßîù ôï áñ÷åßï %s" + +#, fuzzy +#~ msgid "Could not open output file %s.\n" +#~ msgstr "áäõíáìßá áíïßãìáôïò áñ÷åßïõ åîüäïõ `%s'" + +#~ msgid "Creating %s.\n" +#~ msgstr "Äçìéïõñãßá ôïõ %s.\n" + +#, fuzzy +#~ msgid "can't open %s" +#~ msgstr "áäõíáìßá áíïßãìáôïò ôïõ `%s'" + +#, fuzzy +#~ msgid "function cannot be inline" +#~ msgstr "Ç ëåéôïõñãßá äåí Ý÷åé õëïðïéçèåß" + +#, fuzzy +#~ msgid "invalid parameter `%s'" +#~ msgstr "Ç ðáñÜìåôñïò `%s' äåí åßíáé Ýãêõñç." + +#, fuzzy +#~ msgid "%s: internal abort\n" +#~ msgstr "Åóùôåñéêü óöÜëìá ôïõ áíáëõôÞ äéåõèýíóåùí" + +#, fuzzy +#~ msgid "%s: error writing file `%s': %s\n" +#~ msgstr "%s: ÓöÜëìá êáôÜ ôçí åããñáöÞ ôïõ %s\n" + +#, fuzzy +#~ msgid "%s: usage '%s [ -VqfnkN ] [ -i ] [ filename ... ]'\n" +#~ msgstr "%s: ç ÷ñÞóç åßíáé %s [ -v ] [ -c äéáêïðÞ ] ïíïìáóßá æþíçò ...\n" + +#, fuzzy +#~ msgid "%s: usage '%s [ -VqfnkNlgC ] [ -B ] [ filename ... ]'\n" +#~ msgstr "%s: ç ÷ñÞóç åßíáé %s [ -v ] [ -c äéáêïðÞ ] ïíïìáóßá æþíçò ...\n" + +#, fuzzy +#~ msgid "%s: warning: no read access for file `%s'\n" +#~ msgstr "%s: Ðñïåéäïðïßçóç: ç uname áðÝôõ÷å: %s\n" + +#, fuzzy +#~ msgid "%s: warning: no write access for file `%s'\n" +#~ msgstr "%s: Ðñïåéäïðïßçóç: ç uname áðÝôõ÷å: %s\n" + +#, fuzzy +#~ msgid "%s: invalid file name: %s\n" +#~ msgstr "%s: ìç Ýãêõñï åßäïò áñ÷åßïõ" + +#, fuzzy +#~ msgid "%s: %s: can't get status: %s\n" +#~ msgstr "%s: áäõíáìßá ðñüóâáóçò óôï %s: %s\n" + +#, fuzzy +#~ msgid "%s: compiling `%s'\n" +#~ msgstr "%s: ÓöÜëìá êáôÜ ôçí åããñáöÞ ôïõ %s\n" + +# src/request.c:37 +#, fuzzy +#~ msgid "%s: wait: %s\n" +#~ msgstr "%s óå %s" + +#, fuzzy +#~ msgid "%s: subprocess got fatal signal %d\n" +#~ msgstr "%s: Ï ðñïåðåîåñãáóôÞò C áðÝôõ÷å ìå óÞìá %d\n" + +#, fuzzy +#~ msgid "%s: %s exited with status %d\n" +#~ msgstr "%s: Ï ðñïåðåîåñãáóôÞò C áðÝôõ÷å ìå óÞìá %d\n" + +#, fuzzy +#~ msgid "%s: warning: missing SYSCALLS file `%s'\n" +#~ msgstr "%s: Ðñïåéäïðïßçóç: ç uname áðÝôõ÷å: %s\n" + +#, fuzzy +#~ msgid "%s: can't read aux info file `%s': %s\n" +#~ msgstr "%s: áäõíáìßá óôçí áíÜãíùóç %s: %s\n" + +#, fuzzy +#~ msgid "%s: can't get status of aux info file `%s': %s\n" +#~ msgstr "áäõíáìßá ðñïóðÝëáóçò(stat()) áñ÷åßïõ `%s': %s" + +#, fuzzy +#~ msgid "%s: can't open aux info file `%s' for reading: %s\n" +#~ msgstr "áäõíáìßá áíïßãìáôïò áñ÷åßïõ åîüäï `%s' ãéá ôçí êáôçãïñßá `%s'" + +# src/shred.c:1103 +#, fuzzy +#~ msgid "%s: error reading aux info file `%s': %s\n" +#~ msgstr "%s: óöÜëìá åããñáöÞò óôç èÝóç %s" + +#, fuzzy +#~ msgid "%s: error closing aux info file `%s': %s\n" +#~ msgstr "%s: ÓöÜëìá êáôÜ ôï êëåßóéìï ôïõ %s: %s\n" + +#, fuzzy +#~ msgid "%s: can't delete aux info file `%s': %s\n" +#~ msgstr "%s: Äå ìðïñåß íá äéáãñáöåß ôï %s: %s\n" + +#, fuzzy +#~ msgid "%s: can't delete file `%s': %s\n" +#~ msgstr "%s: Äåí åßíáé äõíáôüí íá äçìéïõñãçèåß %s: %s\n" + +#, fuzzy +#~ msgid "%s: warning: can't rename file `%s' to `%s': %s\n" +#~ msgstr "%s: Ðñïåéäïðïßçóç: ç uname áðÝôõ÷å: %s\n" + +#, fuzzy +#~ msgid "%s: %d: warning: no extern definition for `%s'\n" +#~ msgstr "%s: ðñïåéäïðïßçóç: äå âñÝèçêå áñ÷Þ êåöáëßäáò" + +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%s: warning: too few parameter lists in declaration of `%s'\n" +#~ msgstr "Ðñïåéäïðïßçóç: Ðïëý ëßãá ïñßóìáôá óôï åóùäïìçìÝíï `%s'" + +#, fuzzy +#~ msgid "%s: `%s' not converted\n" +#~ msgstr "%s: `%s': äåí âñÝèçêå ôáßñéáóìá" + +#, fuzzy +#~ msgid "%s: would convert file `%s'\n" +#~ msgstr "%s: ç Ýîïäïò èá åðéêáëýøåé ôï %s\n" + +#, fuzzy +#~ msgid "%s: converting file `%s'\n" +#~ msgstr "äçìéïõñãßá áñ÷åßïõ `%s'\n" + +#, fuzzy +#~ msgid "%s: can't get status for file `%s': %s\n" +#~ msgstr "áäõíáìßá ðñïóðÝëáóçò(stat()) áñ÷åßïõ `%s': %s" + +#, fuzzy +#~ msgid "%s: can't open file `%s' for reading: %s\n" +#~ msgstr "%s: Äåí åßíáé äõíáôüí íá áíïé÷ôåß ôï %s: %s\n" + +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%s: error reading input file `%s': %s\n" +#~ msgstr "%s: ÓöÜëìá êáôÜ ôçí áíÜãíùóç ôïõ %s\n" + +#, fuzzy +#~ msgid "%s: can't create/open clean file `%s': %s\n" +#~ msgstr "%s: Äåí åßíáé äõíáôüí íá äçìéïõñãçèåß %s: %s\n" + +#, fuzzy +#~ msgid "%s: can't link file `%s' to `%s': %s\n" +#~ msgstr "%s: Äåí åßíáé äõíáôüí íá óõíäåèåß ôï %s ìå ôï %s: %s\n" + +#, fuzzy +#~ msgid "%s: can't create/open output file `%s': %s\n" +#~ msgstr "áäõíáìßá áíïßãìáôïò áñ÷åßïõ åîüäïõ `%s'" + +#, fuzzy +#~ msgid "%s: can't change mode of file `%s': %s\n" +#~ msgstr "%s: Äåí åßíáé äõíáôüí íá áöáéñåèåß ôï %s: %s\n" + +#, fuzzy +#~ msgid "%s: cannot get working directory: %s\n" +#~ msgstr "%s: äåí åßíáé äõíáôü íá ãñáöôåß ðÜíù óå êáôÜëïãï" + +#, fuzzy +#~ msgid "%s: input file names must have .c suffixes: %s\n" +#~ msgstr "%s: ôï áñ÷åßï åéóüäïõ åßíáé ôï áñ÷åßï åîüäïõ" + +#, fuzzy +#~ msgid "conversion from NaN to int" +#~ msgstr "ç ìåôáôñïðÞ áðü `%s' óå `%s' äåí õðïóôçñßæåôå" + +#, fuzzy +#~ msgid "floating point overflow" +#~ msgstr "Åîáßñåóç êéíçôÞò õðïäéáóôïëÞò" + +#, fuzzy +#~ msgid "%s: argument domain error" +#~ msgstr "%s: óöÜëìá áíÜãíùóçò" + +#, fuzzy +#~ msgid "%s: overflow range error" +#~ msgstr "%s: óöÜëìá åããñáöÞò" + +#, fuzzy +#~ msgid "%s: underflow range error" +#~ msgstr "%s: óöÜëìá åããñáöÞò" + +#, fuzzy +#~ msgid "unknown register name: %s" +#~ msgstr "Üãíùóôïò ÷áñáêôÞñáò `%s'" + +#, fuzzy +#~ msgid "unable to generate reloads for:" +#~ msgstr "Áäýíáôç ç äçìéïõñãßá äéåñãáóßáò óôïí åîõðçñåôçôÞ" + +#, fuzzy +#~ msgid "this is the insn:" +#~ msgstr "áõôüò åßíáé ï ðñþôïò ïñéóìüò" + +#, fuzzy +#~ msgid "could not find a spill register" +#~ msgstr "áäõíáìßá åýñåóçò âñü÷ïõ" + +#, fuzzy +#~ msgid "unrecognizable insn:" +#~ msgstr "Ìç áíáãíùñßóéìç ìåôáâëçôÞ `%s'" + +#, fuzzy +#~ msgid "invalid punctuation `%c' in constraint" +#~ msgstr "ìç Ýãêõñç ìÝôñçóç åðáíÜëçøçò `%s' óôç êáôáóêåõÞ [c*n]" + +#, fuzzy +#~ msgid "unknown register name `%s' in `asm'" +#~ msgstr "Üãíùóôïò ÷áñáêôÞñáò óôï ðåäßï `%s' ôçò êáôçãïñßáò `%s'" + +#, fuzzy +#~ msgid "duplicate asm operand name '%s'" +#~ msgstr "äéðëü üíïìá ÷áñáêôÞñá `%s'" + +#, fuzzy +#~ msgid "undefined named operand '%s'" +#~ msgstr "Ìç ïñéóìÝíï üíïìá %s" + +#~ msgid "unused variable `%s'" +#~ msgstr "á÷ñçóéìïðïßçôç ìåôáâëçôÞ `%s'" + +#, fuzzy +#~ msgid "size of `%s' is larger than %d bytes" +#~ msgstr "%s: ïé ôéìÝò ôïõ ðåäßïõ `%s' äåí ðñÝðåé íá åßíáé ìåãáëýôåñåò áðü %d" + +#~ msgid " TOTAL :" +#~ msgstr " ÓÕÍÏËÉÊÁ :" + +#, fuzzy +#~ msgid "collect: reading %s\n" +#~ msgstr "óöÜëìá áíÜãíùóçò %s" + +#~ msgid "ld returned %d exit status" +#~ msgstr "ç ld åðÝóôñåøå êáôÜóôáóç åîüäïõ %d" + +#, fuzzy +#~ msgid "Floating-point operations can trap" +#~ msgstr "Åîáßñåóç êéíçôÞò õðïäéáóôïëÞò" + +#, fuzzy +#~ msgid "Do not suppress warnings from system headers" +#~ msgstr "Áðïóéþðçóç ðñïçäïðïéÞóåùí êáé ìçíõìÜôùí ðëçñïöüñçóçò" + +#~ msgid "invalid option `%s'" +#~ msgstr "ìç Ýãêõñç åðéëïãÞ `%s'" + +#, fuzzy +#~ msgid "internal error: %s" +#~ msgstr "óöÜëìá óôçí áíÜãíùóç åéóüäïõ: %s" + +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "Target specific options:\n" +#~ msgstr "äÞëùóç ðëÜôïõò" + +#, fuzzy +#~ msgid "unrecognized gcc debugging option: %c" +#~ msgstr "ìç áíáãíùñßóçìç åðéëïãÞ `-%c'" + +# src/request.c:806 src/request.c:912 +#, fuzzy +#~ msgid "unrecognized register name `%s'" +#~ msgstr "Ìç áíáãíùñßóçìï üíïìá åðéöÜíåéáò `%s'" + +#, fuzzy +#~ msgid "unrecognized option `%s'" +#~ msgstr "ìç áíáãíùñßóçìç åðéëïãÞ `-%c'" + +#, fuzzy +#~ msgid "`%s': unknown or unsupported -g option" +#~ msgstr "%s: Üãíùóôï/ìç õðïóôçñéæüìåíï åßäïò áñ÷åßïõ.\n" + +#, fuzzy +#~ msgid "-param option missing argument" +#~ msgstr "ðáñÜëçøç ïñßóìáôïò áñ÷åßïõ" + +#, fuzzy +#~ msgid "invalid --param option: %s" +#~ msgstr "Ìç Ýãêõñç åðéëïãÞ `%s'" + +#, fuzzy +#~ msgid "invalid parameter value `%s'" +#~ msgstr "Ìç Ýãêõñï äéÜóôçìá ÷ñüíïõ `%s'" + +# src/getopt1.c:132 +# src/getopt1.c:132 +#, fuzzy +#~ msgid "options passed: " +#~ msgstr "åðéëïãÞ %s" + +# src/getopt1.c:155 +# src/getopt1.c:155 +#, fuzzy +#~ msgid "options enabled: " +#~ msgstr "åðéëïãÞ á\n" + +#, fuzzy +#~ msgid "can't open %s for writing" +#~ msgstr "%s: ÓöÜëìá åããñáöÞò " + +#, fuzzy +#~ msgid "ignoring command line option '%s'" +#~ msgstr "Ìç Ýãêõñç åðéëïãÞ `%s'" + +#, fuzzy +#~ msgid "instruction scheduling not supported on this target machine" +#~ msgstr "óõìâïëéêïß óýíäåóìïé äåí õðïóôçñßæïíôáé óôï óýóôçìá áõôü" + +#, fuzzy +#~ msgid "-f%sleading-underscore not supported on this target machine" +#~ msgstr "óõìâïëéêïß óýíäåóìïé äåí õðïóôçñßæïíôáé óôï óýóôçìá áõôü" + +#, fuzzy +#~ msgid "-ffunction-sections not supported for this target" +#~ msgstr "ôï --no-dereference (-h) äåí õðïóôçñßæåôáé óå áõôü ôï óýóôçìá" + +#, fuzzy +#~ msgid "-fdata-sections not supported for this target" +#~ msgstr "óõìâïëéêïß óýíäåóìïé äåí õðïóôçñßæïíôáé óôï óýóôçìá áõôü" + +#, fuzzy +#~ msgid "-fprefetch-loop-arrays not supported for this target" +#~ msgstr "ôï --no-dereference (-h) äåí õðïóôçñßæåôáé óå áõôü ôï óýóôçìá" + +#, fuzzy +#~ msgid "-fprefetch-loop-arrays is not supported with -Os" +#~ msgstr "ôï --no-dereference (-h) äåí õðïóôçñßæåôáé óå áõôü ôï óýóôçìá" + +#, fuzzy +#~ msgid "error writing to %s" +#~ msgstr "óöÜëìá åããñáöÞò %s" + +#, fuzzy +#~ msgid "error closing %s" +#~ msgstr "óöÜëìá áíÜãíùóçò %s" + +#, fuzzy +#~ msgid "invalid character constant in #if" +#~ msgstr "ìç Ýãêõñïò óôáèåñüò ÷áñáêôÞñáò óôï áëöáñéèìéôéêü" + +#, fuzzy +#~ msgid "invalid token in expression" +#~ msgstr "Ìç Ýãêõñç êáíïíéêÞ Ýêöñáóç" + +#, fuzzy +#~ msgid "octal character constant does not fit in a byte" +#~ msgstr "ìç Ýãêõñïò óôáèåñüò ÷áñáêôÞñáò óôï áëöáñéèìéôéêü" + +#, fuzzy +#~ msgid "hex character constant does not fit in a byte" +#~ msgstr "ìç Ýãêõñïò óôáèåñüò ÷áñáêôÞñáò óôï áëöáñéèìéôéêü" + +#, fuzzy +#~ msgid "Junk after end of expression." +#~ msgstr "Ðñüùñï ôÝëïò ôçò êáíïíéêÞò Ýêöñáóçò" + +#, fuzzy +#~ msgid "-traditional is not supported in C++" +#~ msgstr "Ç ëåéôïõñãßá äåí õðïóôçñßæåôáé" + +#, fuzzy +#~ msgid "-traditional and -ansi are mutually exclusive" +#~ msgstr "ïé åðéëïãÝò --string êáé --check åßíáé áìïéâáßùò áðïêëåéüìåíåò" + +#, fuzzy +#~ msgid "-pedantic and -traditional are mutually exclusive" +#~ msgstr "\"Æþíç %s\" ãñáììÞ êáé åðéëïãÞ -l åßíáé áìïéâáßùò áðïêëåéüìåíá" + +#, fuzzy +#~ msgid "-trigraphs and -traditional are mutually exclusive" +#~ msgstr "ïé åðéëïãÝò --string êáé --check åßíáé áìïéâáßùò áðïêëåéüìåíåò" + +#, fuzzy +#~ msgid "unterminated #%s conditional" +#~ msgstr "ìç ôåñìáôéæüìåío áëöáñéèìçôéêü" + +#, fuzzy +#~ msgid "not in any file?!" +#~ msgstr "Äåí åßíáé åðþíõìï áñ÷åßï" + +#, fuzzy +#~ msgid "invalid macro name" +#~ msgstr "ìç Ýãêõñï üíïìá ìÞíá" + +#, fuzzy +#~ msgid "invalid macro name `%s'" +#~ msgstr "Ç ðáñÜìåôñïò `%s' äåí åßíáé Ýãêõñç." + +#, fuzzy +#~ msgid "unterminated parameter list in #define" +#~ msgstr "ìç ôåñìáôéæüìåíï üíïìá âÜñïõò" + +#, fuzzy +#~ msgid "invalid format #line command" +#~ msgstr "Ç áëõóßäá ìïñöÞò äåí åßíáé Ýãêõñç: `%s'" + +#, fuzzy +#~ msgid "undefining `defined'" +#~ msgstr "áüñéóôï" + +#, fuzzy +#~ msgid "undefining `%s'" +#~ msgstr "¶íïéãìá ôïõ `%s'" + +#, fuzzy +#~ msgid "#warning%.*s" +#~ msgstr "ðñïåéäïðïßçóç: " + +# src/dfa.c:652 src/dfa.c:655 src/dfa.c:682 src/dfa.c:686 src/dfa.c:687 +# src/dfa.c:690 src/dfa.c:703 src/dfa.c:704 +# src/dfa.c:660 src/dfa.c:663 src/dfa.c:690 src/dfa.c:694 src/dfa.c:695 +# src/dfa.c:698 src/dfa.c:711 src/dfa.c:712 +#, fuzzy +#~ msgid "unbalanced #endif" +#~ msgstr "Ìç éóóïñïðçìÝíï [" + +#, fuzzy +#~ msgid "unterminated string or character constant" +#~ msgstr "ìç ôåñìáôéæìÝíï áëöáñéèìçôéêü óôáèåñÜò" + +#, fuzzy +#~ msgid "arguments given to macro `%s'" +#~ msgstr "Ëåßðåé ðáñÜìåôñïò ãéá `%s'" + +#, fuzzy +#~ msgid "no args to macro `%s'" +#~ msgstr "Üãíùóôïò ÷áñáêôÞñáò `%s'" + +#, fuzzy +#~ msgid "could not open dump file `%s'" +#~ msgstr "áäõíáìßá áíïßãìáôïò áñ÷åßïõ åîüäïõ `%s'" + +#, fuzzy +#~ msgid "ignoring unknown option `%.*s' in `-f%s'" +#~ msgstr "¶ãíùóôç åðéëïãÞ: %s %s %s" + +#, fuzzy +#~ msgid "invalid initializer for bit string" +#~ msgstr "Ç áëõóßäá ìïñöÞò äåí åßíáé Ýãêõñç: `%s'" + +#, fuzzy +#~ msgid "register name not specified for `%s'" +#~ msgstr "ÅããñáöÞ ïíïìÜôùí ôùí åðéëåãìÝíùí ëÝîåùí-êëåéäéþí" + +#, fuzzy +#~ msgid "invalid register name for `%s'" +#~ msgstr "ìç Ýãêõñïò áñéèìüò ðåäßïõ: `%s'" + +#, fuzzy +#~ msgid "unknown set constructor type" +#~ msgstr "Äåí åßíáé äõíáôüí íá âñåèåß ï ôýðïò ôïõ åðåîåñãáóôÞ." + +#, fuzzy +#~ msgid "invalid initial value for member `%s'" +#~ msgstr "ìç Ýãêõñïò áñéèìüò ðåäßïõ: `%s'" + +#, fuzzy +#~ msgid "weak declaration of `%s' after first use results in unspecified behavior" +#~ msgstr "Ç ëåéôïõñãßá äåí õðïóôçñßæåôáé" + +#, fuzzy +#~ msgid "weak declaration of `%s' not supported" +#~ msgstr "Ç ëåéôïõñãßá äåí õðïóôçñßæåôáé" + +#, fuzzy +#~ msgid "too many #pragma options align=reset" +#~ msgstr "ÕðåñâïëéêÝò ðáñÜìåôñïé ðïõ äåí åßíáé åðéëïãÝò." + +#, fuzzy +#~ msgid "malformed '#pragma options', ignoring" +#~ msgstr "êáêïäéáìïñöùìÝíç ãñáììÞ áãíïÞèçêå" + +#, fuzzy +#~ msgid "invalid %%Q value" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %%C value" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %%N value" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %%M value" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %%m value" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %%L value" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %%O value" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %%P value" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %%V value" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "-f%s ignored for Unicos/Mk (not supported)" +#~ msgstr "áñ÷åßá fifo äåí õðïóôçñßæïíôáé" + +#, fuzzy +#~ msgid "-mieee not supported on Unicos/Mk" +#~ msgstr "Ôï servname äåí õðïóôçñßæåôáé áðü ôï ai_socktype" + +#, fuzzy +#~ msgid "trap mode not supported on Unicos/Mk" +#~ msgstr "Ôï servname äåí õðïóôçñßæåôáé áðü ôï ai_socktype" + +#, fuzzy +#~ msgid "rounding mode not supported for VAX floats" +#~ msgstr "Ôï servname äåí õðïóôçñßæåôáé áðü ôï ai_socktype" + +#, fuzzy +#~ msgid "trap mode not supported for VAX floats" +#~ msgstr "Ôï servname äåí õðïóôçñßæåôáé áðü ôï ai_socktype" + +#, fuzzy +#~ msgid "invalid %%H value" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %%J value" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %%r value" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %%R value" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %%h value" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %%U value" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %%s value" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %%E value" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %%xn code" +#~ msgstr "ìç Ýãêõñï äéêáßùìá" + +#, fuzzy +#~ msgid "argument of `%s' attribute is not a string constant" +#~ msgstr "Ç ðáñÜìåôñïò óôï `%s' ðñÝðåé íá åßíáé Ýíáò áðëüò ÷áñáêôÞñáò" + +#, fuzzy +#~ msgid "invalid operand to %%R code" +#~ msgstr "Ìç Ýãêõñç åðéëïãÞ `%s'" + +#, fuzzy +#~ msgid "invalid operand to %%H/%%L code" +#~ msgstr "Ìç Ýãêõñç åðéëïãÞ `%s'" + +#, fuzzy +#~ msgid "invalid operand to %%U code" +#~ msgstr "Ìç Ýãêõñç åðéëïãÞ `%s'" + +#, fuzzy +#~ msgid "invalid operand to %%V code" +#~ msgstr "Ìç Ýãêõñç åðéëïãÞ `%s'" + +#, fuzzy +#~ msgid "invalid operand output code" +#~ msgstr "Ìç Ýãêõñïò êþäéêáò áßôçóçò" + +#, fuzzy +#~ msgid "invalid floating point emulation option: -mfpe-%s" +#~ msgstr "Ç ðáñÜìåôñïò êéíçôÞò õðïäéáóôïëÞò äåí åßíáé Ýãêõñç: %s" + +#, fuzzy +#~ msgid "Don't do symbol renaming" +#~ msgstr "äåí äþèçêå óõìâïëéêü üíïìá" + +#, fuzzy +#~ msgid "MCU `%s' not supported" +#~ msgstr "áñ÷åßá fifo äåí õðïóôçñßæïíôáé" + +#, fuzzy +#~ msgid "invalid insn:" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "incorrect insn:" +#~ msgstr "ëÜèïò óõíèçìáôéêü" + +#, fuzzy +#~ msgid "unknown move insn:" +#~ msgstr "Üãíùóôï óåô `%s'" + +#, fuzzy +#~ msgid "Specify the MCU name" +#~ msgstr "Ïñéóìüò ïíüìáôïò ðñïãñÜììáôïò" + +#, fuzzy +#~ msgid "trampolines not supported" +#~ msgstr "Ç ëåéôïõñãßá äåí õðïóôçñßæåôáé" + +#, fuzzy +#~ msgid "malformed '#pragma %s' - ignored" +#~ msgstr "êáêïäéáìïñöùìÝíç ãñáììÞ áãíïÞèçêå" + +#, fuzzy +#~ msgid "mode not QImode" +#~ msgstr "íåá_êáôÜóôáóç: êáôÜóôáóç ëåéôïõñãßáò\n" + +#, fuzzy +#~ msgid "invalid indirect memory address" +#~ msgstr "ìç Ýãêõñïò ÷ñüíïò ëÞîçò" + +#, fuzzy +#~ msgid "Do not allocate BK register" +#~ msgstr "Äåí åßíáé äõíáôü íá äåóìåõôåß ìíÞìç" + +#, fuzzy +#~ msgid "Enable parallel instructions" +#~ msgstr "ÁêáôÜëëçëç åíôïëÞ" + +#, fuzzy +#~ msgid "Disable parallel instructions" +#~ msgstr "ÁêáôÜëëçëç åíôïëÞ" + +#, fuzzy +#~ msgid "invalid operand for 'b' modifier" +#~ msgstr "Ìç Ýãêõñç åðéëïãÞ `%s'" + +#, fuzzy +#~ msgid "invalid operand for 'v' modifier" +#~ msgstr "Ìç Ýãêõñç åðéëïãÞ `%s'" + +#, fuzzy +#~ msgid "invalid operand for 'P' modifier" +#~ msgstr "Ìç Ýãêõñç åðéëïãÞ `%s'" + +#, fuzzy +#~ msgid "invalid operand for 'p' modifier" +#~ msgstr "Ìç Ýãêõñç åðéëïãÞ `%s'" + +#, fuzzy +#~ msgid "invalid operand for 'z' modifier" +#~ msgstr "Ìç Ýãêõñç åðéëïãÞ `%s'" + +#, fuzzy +#~ msgid "invalid operand for 'H' modifier" +#~ msgstr "Ìç Ýãêõñç åðéëïãÞ `%s'" + +#, fuzzy +#~ msgid "bad register" +#~ msgstr "Äåí åßíáé äõíáôÞ ç êáôá÷þñçóç ôçò õðçñåóßáò" + +#, fuzzy +#~ msgid "invalid operand for 'e' modifier" +#~ msgstr "Ìç Ýãêõñç åðéëïãÞ `%s'" + +#, fuzzy +#~ msgid "invalid operand for 'm' modifier" +#~ msgstr "Ìç Ýãêõñç åðéëïãÞ `%s'" + +#, fuzzy +#~ msgid "invalid operand for 'A' modifier" +#~ msgstr "Ìç Ýãêõñç åðéëïãÞ `%s'" + +#, fuzzy +#~ msgid "invalid operand for 'D' modifier" +#~ msgstr "Ìç Ýãêõñç åðéëïãÞ `%s'" + +#, fuzzy +#~ msgid "invalid operand for 'T' modifier" +#~ msgstr "Ìç Ýãêõñç åðéëïãÞ `%s'" + +#, fuzzy +#~ msgid "invalid operand modifier letter" +#~ msgstr "Ìç Ýãêõñç åðéëïãÞ `%s'" + +#, fuzzy +#~ msgid "internal error: bad register: %d" +#~ msgstr "åóùôåñéêü óöÜëìá óôï %s, ãñáììÞ %u" + +#, fuzzy +#~ msgid "unexpected operand" +#~ msgstr "Ìç ïñéóìÝíï üíïìá %s" + +# src/request.c:806 src/request.c:912 +#, fuzzy +#~ msgid "unrecognized address" +#~ msgstr "Ìç áíáãíùñßóçìï üíïìá åðéöÜíåéáò `%s'" + +#, fuzzy +#~ msgid "unrecognized supposed constant" +#~ msgstr "Üãíùóôï ðñüèåìá: %s" + +#, fuzzy +#~ msgid "unknown CRIS cpu version specification in -mtune= : %s" +#~ msgstr "ðÜñá ðïëëÝò äçëþóåéò ìåôáôñïðÞò óôçí êáôÜëçîç" + +#, fuzzy +#~ msgid "-fPIC and -fpic are not supported in this configuration" +#~ msgstr "Ç ïéêïãÝíåéá äéåõèýíóåùí äåí õðïóôçñßæåôáé áðü ôçí ïéêïãÝíåéá ðñùôïêüëëïõ" + +#, fuzzy +#~ msgid "unexpected address expression" +#~ msgstr "Ìç Ýãêõñç ðñïðïñåõüìåíç êáíïíéêÞ Ýêöñáóç" + +#, fuzzy +#~ msgid "Debug argument support in compiler" +#~ msgstr "%s: ç õðïóôÞñéîç åêóöáëìÜôùóçò äåí Ý÷åé óõìðåñéëçöèåß óôç ìåôáãëþôôéóç.\n" + +#, fuzzy +#~ msgid "Debug stack support in compiler" +#~ msgstr "%s: ç õðïóôÞñéîç åêóöáëìÜôùóçò äåí Ý÷åé óõìðåñéëçöèåß óôç ìåôáãëþôôéóç.\n" + +#, fuzzy +#~ msgid "invalid addressing mode" +#~ msgstr "ÁêáôÜëëçëç ÷ñÞóç ôïõ äéáìïñöùôÞ äéåýèõíóçò" + +#, fuzzy +#~ msgid "bad register extension code" +#~ msgstr "Äåí åßíáé äõíáôÞ ç êáôá÷þñçóç ôçò õðçñåóßáò" + +#, fuzzy +#~ msgid "invalid offset in ybase addressing" +#~ msgstr "ìç Ýãêõñïò ÷ñüíïò Ýíáñîçò" + +#, fuzzy +#~ msgid "invalid register in ybase addressing" +#~ msgstr "ìç Ýãêõñïò ÷ñüíïò Ýíáñîçò" + +#, fuzzy +#~ msgid "inline float constants not supported on this host" +#~ msgstr "óõìâïëéêïß óýíäåóìïé äåí õðïóôçñßæïíôáé óôï óýóôçìá áõôü" + +#, fuzzy +#~ msgid "invalid mode for gen_tst_reg" +#~ msgstr "ìç Ýãêõñç êáôÜóôáóç ãéá ôçí dlopen()" + +#, fuzzy +#~ msgid "Generate code for near calls" +#~ msgstr "×ñÞóç îå÷ùñéóôÞò ëáíèÜíïõóáò ìíÞìçò ãéá êÜèå ÷ñÞóôç" + +#, fuzzy +#~ msgid "Generate code for near jumps" +#~ msgstr "×ñÞóç îå÷ùñéóôÞò ëáíèÜíïõóáò ìíÞìçò ãéá êÜèå ÷ñÞóôç" + +#, fuzzy +#~ msgid "profiling not implemented yet" +#~ msgstr "Ç ëåéôïõñãßá äåí Ý÷åé õëïðïéçèåß" + +#, fuzzy +#~ msgid "trampolines not yet implemented" +#~ msgstr "Ç ëåéôïõñãßá äåí Ý÷åé õëïðïéçèåß" + +#, fuzzy +#~ msgid "fr30_print_operand: invalid operand to %%A code" +#~ msgstr "Ìç Ýãêõñç åðéëïãÞ `%s'" + +#, fuzzy +#~ msgid "fr30_print_operand: invalid %%x code" +#~ msgstr "ìç Ýãêõñï äéêáßùìá" + +#, fuzzy +#~ msgid "Use registers for argument passing" +#~ msgstr "Ý÷ïõí ðáñáëçöèåß ïñßóìáôá" + +#, fuzzy +#~ msgid "malformed #pragma map, ignored" +#~ msgstr "êáêïäéáìïñöùìÝíç ãñáììÞ áãíïÞèçêå" + +#, fuzzy +#~ msgid "Generate char instructions" +#~ msgstr "ÁêáôÜëëçëç åíôïëÞ" + +#, fuzzy +#~ msgid "code model `large' not supported yet" +#~ msgstr "åéäéêÜ áñ÷åßá ìðëïê äåí õðïóôçñßæïíôáé" + +#, fuzzy +#~ msgid "%i-bit mode not compiled in" +#~ msgstr "%s: ç õðïóôÞñéîç åêóöáëìÜôùóçò äåí Ý÷åé óõìðåñéëçöèåß óôç ìåôáãëþôôéóç.\n" + +#, fuzzy +#~ msgid "argument to `%s' attribute larger than %d" +#~ msgstr "%s: ïé ôéìÝò ôïõ ðåäßïõ `%s' äåí ðñÝðåé íá åßíáé ìåãáëýôåñåò áðü %d" + +#, fuzzy +#~ msgid "invalid UNSPEC as operand" +#~ msgstr "ìç Ýãêõñç ìåôáôüðéóç UTC" + +#, fuzzy +#~ msgid "invalid operand code `%c'" +#~ msgstr "Ìç Ýãêõñç åðéëïãÞ `%s'" + +# src/grep.c:1133 +#, fuzzy +#~ msgid "unknown insn mode" +#~ msgstr "Üãíùóôç ìÝèïäïò êáôáëüãùí" + +#, fuzzy +#~ msgid "selector must be an immediate" +#~ msgstr "ç ôéìÞ ãéá ôï %s ðñÝðåé íá åßíáé áêÝñáéïò" + +#, fuzzy +#~ msgid "mask must be an immediate" +#~ msgstr "ç ôéìÞ ãéá ôï %s ðñÝðåé íá åßíáé áêÝñáéïò" + +#, fuzzy +#~ msgid "Retain legend information" +#~ msgstr "åìöÜíéóç ðëçñïöïñéþí ðñïüäïõ" + +# lib/argmatch.c:188 +#, fuzzy +#~ msgid "argument is a structure" +#~ msgstr "¸ãêõñá ïñßóìáôá åßíáé:" + +#, fuzzy +#~ msgid "Alternate calling convention" +#~ msgstr "ìç ôåñìáôéæìÝíï áëöáñéèìçôéêü óôáèåñÜò" + +#, fuzzy +#~ msgid "Use mcount for profiling" +#~ msgstr "áäýíáôç ç öüñôùóç äåäïìÝíùí ðñïößë" + +#, fuzzy +#~ msgid "malformed #pragma align - ignored" +#~ msgstr "êáêïäéáìïñöùìÝíç ãñáììÞ áãíïÞèçêå" + +#, fuzzy +#~ msgid "stack limit expression is not supported" +#~ msgstr "åéäéêÜ áñ÷åßá ìðëïê äåí õðïóôçñßæïíôáé" + +#, fuzzy +#~ msgid "Do not use complex addressing modes" +#~ msgstr "ÁêáôÜëëçëç ÷ñÞóç ôïõ äéáìïñöùôÞ äéåýèõíóçò" + +#, fuzzy +#~ msgid "invalid argument of `%s' attribute" +#~ msgstr "Ç ðáñÜìåôñïò `%s' äåí åßíáé Ýãêõñç." + +#, fuzzy +#~ msgid "invalid operand to %%s code" +#~ msgstr "Ìç Ýãêõñç åðéëïãÞ `%s'" + +#, fuzzy +#~ msgid "invalid operand to %%p code" +#~ msgstr "Ìç Ýãêõñç åðéëïãÞ `%s'" + +#, fuzzy +#~ msgid "invalid operand to %%T/%%B code" +#~ msgstr "Ìç Ýãêõñç åðéëïãÞ `%s'" + +#, fuzzy +#~ msgid "invalid operand to %%N code" +#~ msgstr "Ìç Ýãêõñç åðéëïãÞ `%s'" + +#, fuzzy +#~ msgid "bad address" +#~ msgstr "ÅóöáëìÝíç äéåýèõíóç" + +#, fuzzy +#~ msgid "lo_sum not of register" +#~ msgstr "RPC: Ôï ðñüãñáììá äåí Ý÷åé êáôá÷ùñçèåß" + +#, fuzzy +#~ msgid "invalid operand in the instruction" +#~ msgstr "ìç Ýãêõñç ìÝôñçóç åðáíÜëçøçò `%s' óôç êáôáóêåõÞ [c*n]" + +#, fuzzy +#~ msgid "invalid register in the instruction" +#~ msgstr "ìç Ýãêõñïò ÷áñáêôÞñáò `%c' óôï ôýðï áëöáñéèìçôéêïý `%s'" + +#, fuzzy +#~ msgid "invalid rotate insn" +#~ msgstr "Ìç Ýãêõñç çìåñïìçíßá `%s'." + +#, fuzzy +#~ msgid "cannot do z-register replacement" +#~ msgstr "Äåí åßíáé äõíáôÞ ç êáôá÷þñçóç ôçò õðçñåóßáò" + +#, fuzzy +#~ msgid "Do not use direct addressing mode for soft registers" +#~ msgstr "ÁêáôÜëëçëç ÷ñÞóç ôïõ äéáìïñöùôÞ äéåýèõíóçò" + +#, fuzzy +#~ msgid "Specify the register allocation order" +#~ msgstr "Áðïôõ÷ßá äÝóìåõóçò ðüñùí óõóôÞìáôïò" + +#, fuzzy +#~ msgid "Use unaligned memory references" +#~ msgstr "Ìç Ýãêõñç ðéóù-ðáñáðïìðÞ" + +#, fuzzy +#~ msgid "invalid %%x/X value" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %%q value" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %%o value" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %%p value" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %%s/S value" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %%P operand" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %%B value" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %%D value" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid code" +#~ msgstr "ìç Ýãêõñï äéêáßùìá" + +#, fuzzy +#~ msgid "invalid option `-mshort-data-%s'" +#~ msgstr "Ìç Ýãêõñç åðéëïãÞ `%s'" + +#, fuzzy +#~ msgid "invalid option `-mstack-increment=%s'" +#~ msgstr "Ìç Ýãêõñç åðéëïãÞ `%s'" + +#, fuzzy +#~ msgid "Emit call graph information" +#~ msgstr "åìöÜíéóç ðëçñïöïñéþí ðñïüäïõ" + +#, fuzzy +#~ msgid "-mips%d not supported" +#~ msgstr "Ôï ai_family äåí õðïóôçñßæåôáé" + +#, fuzzy +#~ msgid "-mabi=%s does not support -mips%d" +#~ msgstr "Ôï ai_socktype äåí õðïóôçñßæåôáé" + +#, fuzzy +#~ msgid "invalid option `entry%s'" +#~ msgstr "Ìç Ýãêõñç åðéëïãÞ `%s'" + +#, fuzzy +#~ msgid "can't rewind temp file" +#~ msgstr "áäõíáìßá áíïßãìáôïò áñ÷åßïõ åîüäïõ" + +#, fuzzy +#~ msgid "can't write to output file" +#~ msgstr "áäõíáìßá åããñáöÞò áñ÷åßùí åîüäïõ óôï `%s'" + +#, fuzzy +#~ msgid "can't read from temp file" +#~ msgstr "áäõíáìßá áíïßãìáôïò áñ÷åßïõ åîüäïõ" + +#, fuzzy +#~ msgid "can't close temp file" +#~ msgstr "áäõíáìßá áíïßãìáôïò áñ÷åßïõ åîüäïõ" + +#, fuzzy +#~ msgid "can not handle inconsistent calls to `%s'" +#~ msgstr "áäõíáìßá åêôÝëåóçò ioctl óôï `%s'" + +#, fuzzy +#~ msgid "Use symbolic register names" +#~ msgstr "äåí äþèçêå óõìâïëéêü üíïìá" + +#, fuzzy +#~ msgid "-f%s not supported: ignored" +#~ msgstr "áñ÷åßá fifo äåí õðïóôçñßæïíôáé" + +#, fuzzy +#~ msgid "stack frame not a multiple of 8 bytes: %d" +#~ msgstr "ï ßäéïò êáíüíáò óå ðïëëáðëÜ áñ÷åßá" + +#, fuzzy +#~ msgid "Do not use addresses that allocate global registers" +#~ msgstr "Äåí åßíáé äõíáôü íá äåóìåõôåß ìíÞìç" + +#, fuzzy +#~ msgid "Do not use register sb" +#~ msgstr "Äåí åßíáé äõíáôÞ ç êáôá÷þñçóç ôçò õðçñåóßáò" + +#, fuzzy +#~ msgid "Use bit-field instructions" +#~ msgstr "ÁêáôÜëëçëç åíôïëÞ" + +#, fuzzy +#~ msgid "-g option disabled" +#~ msgstr "Ç ëåéôïõñãßá NIS+ áðÝôõ÷å" + +#, fuzzy +#~ msgid "Return floating point results in ac0" +#~ msgstr "Åîáßñåóç êéíçôÞò õðïäéáóôïëÞò" + +#, fuzzy +#~ msgid "Target does not have split I&D" +#~ msgstr "-nt äåí äÝ÷åôáé -l\n" + +#, fuzzy +#~ msgid "invalid %%S value" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %%b value" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %%z value" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %%Z value" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %%k value" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %%j value" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "-mmultiple is not supported on little endian systems" +#~ msgstr "óõìâïëéêïß óýíäåóìïé äåí õðïóôçñßæïíôáé óôï óýóôçìá áõôü" + +#, fuzzy +#~ msgid "-mstring is not supported on little endian systems" +#~ msgstr "ðñïåéäïðïßçóç: ôï --pid=PID äåí õðïóôçñßæåôáé óå áõôü ôï óýóôçìá" + +#, fuzzy +#~ msgid "-fdata-sections not supported on AIX" +#~ msgstr "Ç ëåéôïõñãßá äåí õðïóôçñßæåôáé" + +#, fuzzy +#~ msgid "unknown ABI specified: '%s'" +#~ msgstr "Üãíùóôï óåô `%s'" + +#, fuzzy +#~ msgid "argument 3 of `%s' must be a 2-bit literal" +#~ msgstr "Ç ðáñÜìåôñïò óôï `%s' ðñÝðåé íá åßíáé Ýíáò áðëüò ÷áñáêôÞñáò" + +#, fuzzy +#~ msgid "invalid %%f value" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %%F value" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %%G value" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %%j code" +#~ msgstr "ìç Ýãêõñï äéêáßùìá" + +#, fuzzy +#~ msgid "invalid %%J code" +#~ msgstr "ìç Ýãêõñï äéêáßùìá" + +#, fuzzy +#~ msgid "invalid %%K value" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %%T value" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %%u value" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %%v value" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "Always pass floating-point arguments in memory" +#~ msgstr "Ç ðáñÜìåôñïò êéíçôÞò õðïäéáóôïëÞò äåí åßíáé Ýãêõñç: %s" + +#, fuzzy +#~ msgid "Don't always pass floating-point arguments in memory" +#~ msgstr "Ç ðáñÜìåôñïò êéíçôÞò õðïäéáóôïëÞò äåí åßíáé Ýãêõñç: %s" + +#, fuzzy +#~ msgid "Use AltiVec instructions" +#~ msgstr "ÁêáôÜëëçëç åíôïëÞ" + +#, fuzzy +#~ msgid "no description yet" +#~ msgstr "(÷ùñßò ðåñéãñáöÞ)" + +#, fuzzy +#~ msgid "Use alternate register names" +#~ msgstr "ìç ôåñìáôéæüìåíï üíïìá âÜñïõò" + +#, fuzzy +#~ msgid "bad value for -mcall-%s" +#~ msgstr "ÁêáôÜëëçëç ôéìÞ óôï ai_flags" + +#, fuzzy +#~ msgid "bad value for -msdata=%s" +#~ msgstr "ÁêáôÜëëçëç ôéìÞ óôï ai_flags" + +#, fuzzy +#~ msgid "-mcall-aixdesc must be big endian" +#~ msgstr "ôá ìåãÝèç ôïõ óôçëïãíþìïíá ðñÝðåé íá åßíáé êáôÜ áýîïõóá óåéñÜ" + +#, fuzzy +#~ msgid "Cannot decompose address." +#~ msgstr "Äåí åßíáé äõíáôÞ ç åê÷þñçóç ôçò æçôçèÞóáò äéåýèõíóçò" + +#~ msgid "64 bit mode" +#~ msgstr "êáôÜóôáóç 64 bit" + +#~ msgid "31 bit mode" +#~ msgstr "êáôÜóôáóç 31 bit" + +#, fuzzy +#~ msgid "mvcle use" +#~ msgstr "Ç óõóêåõÞ åßíáé áðáó÷ïëçìÝíç" + +#, fuzzy +#~ msgid "__builtin_saveregs not supported by this subtarget" +#~ msgstr "óõìâïëéêïß óýíäåóìïé äåí õðïóôçñßæïíôáé óôï óýóôçìá áõôü" + +#, fuzzy +#~ msgid "`%s' attribute argument not a string constant" +#~ msgstr "ìç ôåñìáôéæìÝíï áëöáñéèìçôéêü óôáèåñÜò" + +#, fuzzy +#~ msgid "Profiling is not supported on this target." +#~ msgstr "óõìâïëéêïß óýíäåóìïé äåí õðïóôçñßæïíôáé óôï óýóôçìá áõôü" + +#, fuzzy +#~ msgid "%s is not supported by this configuration" +#~ msgstr "Ç ïéêïãÝíåéá äéåõèýíóåùí äåí õðïóôçñßæåôáé áðü ôçí ïéêïãÝíåéá ðñùôïêüëëïõ" + +#, fuzzy +#~ msgid "-mcmodel= is not supported on 32 bit systems" +#~ msgstr "óõìâïëéêïß óýíäåóìïé äåí õðïóôçñßæïíôáé óôï óýóôçìá áõôü" + +#, fuzzy +#~ msgid "invalid %%Y operand" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %%A operand" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %%B operand" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %%c operand" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %%C operand" +#~ msgstr "ìç Ýãêõñç ìåôáôüðéóç UTC" + +#, fuzzy +#~ msgid "invalid %%d operand" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %%D operand" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %%f operand" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "Utilize Visual Instruction Set" +#~ msgstr "ÐáñÜíïìç ÅíôïëÞ" + +#~ msgid "Use 32-bit ABI" +#~ msgstr "×ñÞóç ABI 32-bit" + +#~ msgid "Use 64-bit ABI" +#~ msgstr "×ñÞóç ABI 64-bit" + +# src/request.c:806 src/request.c:912 +#, fuzzy +#~ msgid "unrecognized section name \"%s\"" +#~ msgstr "Ìç áíáãíùñßóçìï üíïìá åðéöÜíåéáò `%s'" + +# src/dfa.c:569 src/dfa.c:583 src/dfa.c:587 +# src/dfa.c:577 src/dfa.c:591 src/dfa.c:595 +#, fuzzy +#~ msgid "malformed #pragma ghs section" +#~ msgstr "êáêïó÷çìáôéóìÝíïò ìåôñçôÞò åðáíÜëçøçò" + +# src/shred.c:1134 +#, fuzzy +#~ msgid "%s=%s is too large" +#~ msgstr "%s: ôï áñ÷åßï åßíáé ðïëý ìåãÜëï" + +#, fuzzy +#~ msgid "output_move_single:" +#~ msgstr "áñ÷åßï åîüäïõ" + +#, fuzzy +#~ msgid "bad test" +#~ msgstr "ÅóöáëìÝíç äéåýèõíóç" + +#, fuzzy +#~ msgid "invalid mask" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid address" +#~ msgstr "ÁêáôÜëëçëç ÷ñÞóç ôïõ äéáìïñöùôÞ äéåýèõíóçò" + +#, fuzzy +#~ msgid "no register in address" +#~ msgstr "ìç Ýãêõñïò ÷ñüíïò Ýíáñîçò" + +#, fuzzy +#~ msgid "address offset not a constant" +#~ msgstr "%s' äåí åßíáé éó÷ýùí èåôéêüò áêÝñáéïò." + +#, fuzzy +#~ msgid "Use the Xtensa boolean register option" +#~ msgstr "ìç ôåñìáôéæüìåíï üíïìá âÜñïõò" + +#, fuzzy +#~ msgid "conversion from `%T' to `%T' is ambiguous" +#~ msgstr "ç ìåôáôñïðÞ áðü `%s' óå `%s' äåí õðïóôçñßæåôå" + +# src/getopt.c:813 +# src/getopt.c:813 +#, fuzzy +#~ msgid "call of `(%T) (%A)' is ambiguous" +#~ msgstr "%s: ç åðéëïãÞ `-W %s' åßíáé äéöïñïýìåíç\n" + +#, fuzzy +#~ msgid "`%+#D' is inaccessible" +#~ msgstr "ôï `%s' åßíáé ìç-ðñïóðåëÜóéìï" + +#, fuzzy +#~ msgid "invalid conversion from `%T' to `%T'" +#~ msgstr "ç ìåôáôñïðÞ áðü `%s' óå `%s' äåí õðïóôçñßæåôå" + +#, fuzzy +#~ msgid " initializing argument %P of `%D'" +#~ msgstr "Ìç Ýãêõñç áêÝñáéá ðáñÜìåôñïò `%s'" + +#, fuzzy +#~ msgid " in call to `%D'" +#~ msgstr "Ìç Ýãêõñç åðéëïãÞ `%s'" + +#, fuzzy +#~ msgid " for conversion from `%T' to `%T'" +#~ msgstr "ç ìåôáôñïðÞ áðü `%s' óå `%s' äåí õðïóôçñßæåôå" + +#, fuzzy +#~ msgid "duplicate enum value `%D'" +#~ msgstr "äéðëü üíïìá ÷áñáêôÞñá `%s'" + +#, fuzzy +#~ msgid "duplicate nested type `%D'" +#~ msgstr "äéðëü üíïìá ÷áñáêôÞñá `%s'" + +#, fuzzy +#~ msgid "duplicate member `%D'" +#~ msgstr "äéðëüò áñéèìüò ìçíýìáôïò" + +#, fuzzy +#~ msgid "`%D' invalid in `%T'" +#~ msgstr "Ìç Ýãêõñç åðéëïãÞ `%s'" + +#, fuzzy +#~ msgid "`%D' invalid in `%#T'" +#~ msgstr "Ìç Ýãêõñç åðéëïãÞ `%s'" + +#, fuzzy +#~ msgid "redefinition of `%#T'" +#~ msgstr "êáíÝíáò ïñéóìüò ôïõ `UNDEFINED'" + +#, fuzzy +#~ msgid "previous definition of `%#T'" +#~ msgstr "êáíÝíáò ïñéóìüò ôïõ `UNDEFINED'" + +#~ msgid " by `%D'" +#~ msgstr " êáôÜ `%D'" + +#, fuzzy +#~ msgid "negative width in bit-field `%D'" +#~ msgstr "Áñíçôéêü ðëÜôïò óôçí áðïôßìçóç" + +#, fuzzy +#~ msgid "field `%#D' with same name as class" +#~ msgstr "ÕðÜñ÷åé áíôéêåßìåíï ìå ôï ßäéï üíïìá" + +#, fuzzy +#~ msgid "not enough type information" +#~ msgstr "åìöÜíéóç ðëçñïöïñéþí ðñïüäïõ" + +#, fuzzy +#~ msgid "declaration of `%#D'" +#~ msgstr "äçìéïõñãßá áñ÷åßïõ `%s'\n" + +#, fuzzy +#~ msgid "conversion of `%E' from `%T' to `%T' is ambiguous" +#~ msgstr "ç ìåôáôñïðÞ áðü `%s' óå `%s' äåí õðïóôçñßæåôå" + +#, fuzzy +#~ msgid "converting from `%T' to `%T'" +#~ msgstr "ç ìåôáôñïðÞ áðü `%s' óå `%s' äåí õðïóôçñßæåôå" + +#, fuzzy +#~ msgid "cannot convert `%E' from type `%T' to type `%T'" +#~ msgstr "äåí åßíáé äõíáôü íá äçìéïõñãçèåß ôï %s `%s' óôï `%s'" + +#, fuzzy +#~ msgid "conversion from `%T' to `%T' discards qualifiers" +#~ msgstr "ç ìåôáôñïðÞ áðü `%s' óå `%s' äåí õðïóôçñßæåôå" + +#, fuzzy +#~ msgid "cannot convert type `%T' to type `%T'" +#~ msgstr "äåí åßíáé äõíáôü íá äçìéïõñãçèåß ôï %s `%s' óôï `%s'" + +#, fuzzy +#~ msgid "conversion from `%#T' to `%#T'" +#~ msgstr "ç ìåôáôñïðÞ áðü `%s' óå `%s' äåí õðïóôçñßæåôå" + +#, fuzzy +#~ msgid "conversion from `%T' to non-scalar type `%T' requested" +#~ msgstr "ç ìåôáôñïðÞ áðü `%s' óå `%s' äåí õðïóôçñßæåôå" + +#, fuzzy +#~ msgid "`%#D' previously declared here" +#~ msgstr "Äåí õðÜñ÷åé ðñïçãïýìåíç êáíïíéêÞ Ýêöñáóç" + +#, fuzzy +#~ msgid "after previous specification in `%#D'" +#~ msgstr "%s: Ìç Ýãêõñç ñýèìéóç `%s'.\n" + +#, fuzzy +#~ msgid "invalid redeclaration of `%D'" +#~ msgstr "Ìç Ýãêõñç åðéëïãÞ `%s'" + +#, fuzzy +#~ msgid "`%#D' hides constructor for `%#T'" +#~ msgstr "ôï `%s' åßíáé ðñüãïíïò ôïõ `%s'" + +#~ msgid "implicit declaration of function `%#D'" +#~ msgstr "áõôïíüçôç äéáêýñçîç ôçò óõíÜñôçóçò `%#D'" + +#, fuzzy +#~ msgid "duplicate label `%D'" +#~ msgstr "äéðëü êëåéäß" + +#, fuzzy +#~ msgid "invalid use of `%D'" +#~ msgstr "Ìç Ýãêõñç çìåñïìçíßá `%s'." + +#, fuzzy +#~ msgid "`%D::%D' is not a template" +#~ msgstr "ôï `%s' äåí åßíáé êáíïíéêü áñ÷åßï" + +#, fuzzy +#~ msgid "`%#D' is not a static member of `%#T'" +#~ msgstr "ôï `%s' åßíáé ðñüãïíïò ôïõ `%s'" + +# src/request.c:263 +#, fuzzy +#~ msgid "duplicate initialization of %D" +#~ msgstr "Ôï âÞìá áñ÷éêïðïßçóçò áðÝôõ÷å" + +#, fuzzy +#~ msgid "cannot initialize `%T' from `%T'" +#~ msgstr "äåí åßíáé äõíáôü íá ìåôáíïìáóôåß ôï `.' Þ ôï `..'" + +#, fuzzy +#~ msgid "array size missing in `%D'" +#~ msgstr "óöÜëìá êáôÜ ôï êëåßóéìï ôçò åéóüäïõ `%s'" + +#, fuzzy +#~ msgid "uninitialized const `%D'" +#~ msgstr "Ìç Ýãêõñç åðéëïãÞ `%s'" + +#, fuzzy +#~ msgid "invalid catch parameter" +#~ msgstr "Ìç Ýãêõñïò ÷áñáêôÞñáò ðáñáâïëÞò" + +#, fuzzy +#~ msgid "creating %s" +#~ msgstr "äçìéïõñãßá áñ÷åßïõ `%s'\n" + +#, fuzzy +#~ msgid "invalid declarator" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "`%D' as declarator" +#~ msgstr "ôï `%s' åßíáé êáôÜëïãïò" + +#, fuzzy +#~ msgid "`bool' is now a keyword" +#~ msgstr "Ôï `%s' äåí åßíáé êáôÜëïãïò." + +#, fuzzy +#~ msgid "multiple declarations `%T' and `%T'" +#~ msgstr "ðïëëáðëüò áñéèìüò åðéëïãþí ôçí åíôïëÞ `s'" + +#, fuzzy +#~ msgid "can't initialize friend function `%s'" +#~ msgstr "Äåí Þôáí äõíáôÞ ç åýñåóç åôéêÝôôáò ãéá ìåôáãùãÞ óôï `%s'" + +#, fuzzy +#~ msgid "friend declaration not in class definition" +#~ msgstr "óõíôáêôéêü óöÜëìá óôïí ïñéóìü êëÜóçò ÷áñáêôÞñùí" + +#, fuzzy +#~ msgid "cannot declare %s to references" +#~ msgstr "áäõíáìßá áëëáãÞò óôï êáôÜëïãï %s" + +#, fuzzy +#~ msgid "invalid type: `void &'" +#~ msgstr "Ìç Ýãêõñç çìåñïìçíßá `%s'" + +#, fuzzy +#~ msgid "cannot declare member `%T::%s' within `%T'" +#~ msgstr "äåí åßíáé äõíáôü íá äçìéïõñãçèåß ôï %s `%s' óôï `%s'" + +#, fuzzy +#~ msgid "template parameters cannot be friends" +#~ msgstr "ï äéá÷ùñéóôÞò äå ìðïñåß íá åßíáé êåíüò" + +#, fuzzy +#~ msgid "invalid use of `::'" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid string constant `%E'" +#~ msgstr "ìç ôåñìáôéæìÝíï áëöáñéèìçôéêü óôáèåñÜò" + +#, fuzzy +#~ msgid "duplicate base type `%T' invalid" +#~ msgstr "äéðëüò ïñéóìüò óõíüëïõ" + +#, fuzzy +#~ msgid "multiple definition of `%#T'" +#~ msgstr "áäõíáìßá áíïßãìáôïò áñ÷åßïõ ïñéóìïý locale `%s'" + +#, fuzzy +#~ msgid "-f%s is no longer supported" +#~ msgstr "áñ÷åßá fifo äåí õðïóôçñßæïíôáé" + +#, fuzzy +#~ msgid "prototype for `%#D' does not match any in class `%T'" +#~ msgstr "ôï áñ÷åßï äåäïìÝíùí ðñïößë `%s' äåí ôáéñéÜæåé ìå ôï äéáìïéñáæüìåíï áíôéêåßìåíï `%s'" + +#~ msgid " %#D" +#~ msgstr " %#D" + +#, fuzzy +#~ msgid "local class `%#T' shall not have static data member `%#D'" +#~ msgstr "ôï `%s' åßíáé ðñüãïíïò ôïõ `%s'" + +#, fuzzy +#~ msgid "invalid initializer for virtual method `%D'" +#~ msgstr "Ìç Ýãêõñç áêÝñáéá ðáñÜìåôñïò `%s'" + +#, fuzzy +#~ msgid "use of old-style cast" +#~ msgstr "ðáëáéïý åßäïõò èÝóç" + +# src/getopt.c:628 +# src/getopt.c:628 +#, fuzzy +#~ msgid "use of `%D' is ambiguous" +#~ msgstr "%s: ç åðéëïãÞ `%s' åßíáé áóáöÞò\n" + +#, fuzzy +#~ msgid "`%D' is not a function," +#~ msgstr "Ôï `%s' äåí åßíáé êáôÜëïãïò." + +#, fuzzy +#~ msgid "unknown namespace `%D'" +#~ msgstr "Üãíùóôï óåô `%s'" + +#, fuzzy +#~ msgid "`%T' is not a namespace" +#~ msgstr "ôï `%s' äåí åßíáé êáíïíéêü áñ÷åßï" + +#, fuzzy +#~ msgid "`%D' is not a namespace" +#~ msgstr "ôï `%s' äåí åßíáé êáíïíéêü áñ÷åßï" + +#, fuzzy +#~ msgid "`%D' not declared" +#~ msgstr "ôï `%s' äåí åßíáé êáíïíéêü áñ÷åßï" + +#, fuzzy +#~ msgid "`%T' does not have a class or union named `%D'" +#~ msgstr "ôï `%s' äåí åßíáé êáíïíéêü áñ÷åßï" + +#, fuzzy +#~ msgid "`%T' is not a class or union type" +#~ msgstr "ôï `%s' äåí åßíáé êáíïíéêü áñ÷åßï" + +#, fuzzy +#~ msgid "`%s' not supported by %s" +#~ msgstr "Äåí õðïóôçñßæåôáé" + +#, fuzzy +#~ msgid "%s: In instantiation of `%s':\n" +#~ msgstr "%s: Ìç Ýãêõñç ñýèìéóç `%s'.\n" + +#, fuzzy +#~ msgid "`%#T' is not a template" +#~ msgstr "ôï `%s' äåí åßíáé êáíïíéêü áñ÷åßï" + +#, fuzzy +#~ msgid "`%T' is already a friend of `%T'" +#~ msgstr "ôï `%s' åßíáé ðñüãïíïò ôïõ `%s'" + +#, fuzzy +#~ msgid "argument to `%s' missing\n" +#~ msgstr "Ý÷ïõí ðáñáëçöèåß ïñßóìáôá" + +#, fuzzy +#~ msgid "base class `%T' already initialized" +#~ msgstr "ç êëÜóç ÷áñáêôÞñùí `%s' ïñßóôçêå Þäç" + +#, fuzzy +#~ msgid "type `%D' is not a direct base of `%T'" +#~ msgstr "Ôï `%s' äåí åßíáé êáôÜëïãïò." + +#, fuzzy +#~ msgid "`%T' is not an aggregate type" +#~ msgstr "ôï `%s' äåí åßíáé êáíïíéêü áñ÷åßï" + +#, fuzzy +#~ msgid "invalid use of non-static field `%D'" +#~ msgstr "ìç Ýãêõñïò áñéèìüò áðü óôÞëåò: `%s'" + +#, fuzzy +#~ msgid "invalid use of member `%D'" +#~ msgstr "ìç Ýãêõñïò áñéèìüò ðåäßïõ: `%s'" + +#, fuzzy +#~ msgid "`%D' is not a member of type `%T'" +#~ msgstr "äåí åßóôå ìÝëïò ôçò ïìÜäáò `%s'" + +#, fuzzy +#~ msgid "illegal pointer to bit-field `%D'" +#~ msgstr "áêáôÜëëçëïò ôýðïò äéêôýïõ :`%s'\n" + +#, fuzzy +#~ msgid "invalid type `void' for new" +#~ msgstr "ìç Ýãêõñç êáôÜóôáóç ãéá ôçí dlopen()" + +#, fuzzy +#~ msgid "type name expected before `*'" +#~ msgstr "ÅããñáöÞ ïíïìÜôùí ôùí åðéëåãìÝíùí êáôçãïñéþí" + +#, fuzzy +#~ msgid "type name expected before `&'" +#~ msgstr "ÅããñáöÞ ïíïìÜôùí ôùí åðéëåãìÝíùí êáôçãïñéþí" + +#, fuzzy +#~ msgid "invalid #pragma %s" +#~ msgstr "Ç ðáñÜìåôñïò `%s' äåí åßíáé Ýãêõñç." + +#, fuzzy +#~ msgid "`%D' not defined" +#~ msgstr "áüñéóôï" + +#, fuzzy +#~ msgid "name lookup of `%s' changed" +#~ msgstr "ç ïìÜäá ôïõ %s Üëëáîå óå %s\n" + +#, fuzzy +#~ msgid "`%s' tag used in naming `%#T'" +#~ msgstr "Ìç Ýãêõñç åðéëïãÞ `%s'" + +# src/grep.c:785 src/grep.c:792 +# src/grep.c:1060 src/grep.c:1067 src/grep.c:1076 +#, fuzzy +#~ msgid "invalid default template argument" +#~ msgstr "ìç Ýãêõñï üñéóìá ìÞêïõò ðåñéå÷ïìÝíïõ" + +#, fuzzy +#~ msgid "`%T' is not a valid expression" +#~ msgstr "%s' äåí åßíáé éó÷ýùí èåôéêüò áêÝñáéïò." + +# src/dfa.c:962 +# src/dfa.c:970 +#, fuzzy +#~ msgid "sigof type specifier" +#~ msgstr "Äåí ïñßóôçêå óõíôáêôéêü" + +#, fuzzy +#~ msgid "`%T' is not a class or namespace" +#~ msgstr "ôï `%s' äåí åßíáé êáíïíéêü áñ÷åßï" + +#, fuzzy +#~ msgid "no type `%D' in `%T'" +#~ msgstr "Ìç Ýãêõñç åðéëïãÞ `%s'" + +#, fuzzy +#~ msgid "invalid member template declaration `%D'" +#~ msgstr "ìç Ýãêõñïò áñéèìüò áðü êåíÝò ãñáììÝò: `%s'" + +#, fuzzy +#~ msgid " from definition of `%#D'" +#~ msgstr "êáíÝíáò ïñéóìüò ôïõ `UNDEFINED'" + +#~ msgid " `%D'" +#~ msgstr " `%D'" + +#, fuzzy +#~ msgid "no default argument for `%D'" +#~ msgstr "Ç ðáñÜìåôñïò `%s' äåí åßíáé Ýãêõñç." + +#, fuzzy +#~ msgid "template class without a name" +#~ msgstr "ìç ôåñìáôéæüìåíï üíïìá âÜñïõò" + +#, fuzzy +#~ msgid "template definition of non-template `%#D'" +#~ msgstr "áäõíáìßá áíïßãìáôïò áñ÷åßïõ ïñéóìïý locale `%s'" + +#~ msgid " but %d required" +#~ msgstr " áëëÜ %d áðáéôïýíôáé" + +#, fuzzy +#~ msgid "`%T' is not a template type" +#~ msgstr "ôï `%s' äåí åßíáé êáíïíéêü áñ÷åßï" + +#, fuzzy +#~ msgid "template parameter `%#D'" +#~ msgstr "äéðëü üíïìá ÷áñáêôÞñá `%s'" + +#, fuzzy +#~ msgid "`%E' is not a valid template argument" +#~ msgstr "%s' äåí åßíáé éó÷ýùí èåôéêüò áêÝñáéïò." + +#, fuzzy +#~ msgid " expected a type, got `%E'" +#~ msgstr "%s: áíáìåíüôáí áêÝñáéïò ìåôÜ ôï `%c'" + +#, fuzzy +#~ msgid " expected a type, got `%T'" +#~ msgstr "%s: áíáìåíüôáí áêÝñáéïò ìåôÜ ôï `%c'" + +#, fuzzy +#~ msgid "wrong number of template arguments (%d, should be %d)" +#~ msgstr "ëÜèïò áñéèìüò ïñéóìÜôùí" + +#, fuzzy +#~ msgid "template argument %d is invalid" +#~ msgstr "Ý÷ïõí ðáñáëçöèåß ïñßóìáôá" + +#, fuzzy +#~ msgid "`%T' is not a template" +#~ msgstr "ôï `%s' äåí åßíáé êáíïíéêü áñ÷åßï" + +#, fuzzy +#~ msgid "invalid parameter type `%T'" +#~ msgstr "Ìç Ýãêõñç ðñïôåñáéüôçôá `%s'" + +#, fuzzy +#~ msgid "creating pointer to member reference type `%T'" +#~ msgstr "äåí åßóôå ìÝëïò ôçò ïìÜäáò `%s'" + +#, fuzzy +#~ msgid "creating array of `%T'" +#~ msgstr "äçìéïõñãßá áñ÷åßïõ `%s'\n" + +#, fuzzy +#~ msgid "incomplete type unification" +#~ msgstr "Ìåôáãëùôôéóìüò ðñïäéáãñáöþí ôïðéêþí ñõèìßóåùí" + +#, fuzzy +#~ msgid "no matching template for `%D' found" +#~ msgstr "Ï Ýëåã÷ïò ìïíïðáôéïý ãéá ôï `%s' âñÞêå `%s'" + +#, fuzzy +#~ msgid "duplicate explicit instantiation of `%#D'" +#~ msgstr "äéðëüò ïñéóìüò óõíüëïõ" + +#, fuzzy +#~ msgid "duplicate explicit instantiation of `%#T'" +#~ msgstr "äéðëüò ïñéóìüò óõíüëïõ" + +#, fuzzy +#~ msgid "`%#T' is not a valid type for a template constant parameter" +#~ msgstr "%s' äåí åßíáé éó÷ýùí èåôéêüò áêÝñáéïò." + +#, fuzzy +#~ msgid "can't create repository information file `%s'" +#~ msgstr "áäõíáìßá áíïßãìáôïò áñ÷åßïõ ïñéóìïý locale `%s'" + +#, fuzzy +#~ msgid "cannot use typeid with -fno-rtti" +#~ msgstr "Äåí åßíáé äõíáôü íá ÷ñçóéìïðïéçèåß ç åðéëïãÞ -a ÷ùñßò ôï -n" + +#, fuzzy +#~ msgid "`%T' is an inaccessible base of `%T'" +#~ msgstr "ôï `%s' åßíáé ðñüãïíïò ôïõ `%s'" + +#, fuzzy +#~ msgid "`%T' is an ambiguous base of `%T'" +#~ msgstr "ôï `%s' åßíáé ðñüãïíïò ôïõ `%s'" + +#, fuzzy +#~ msgid "invalid covariant return type for `%#D'" +#~ msgstr "ìç Ýãêõñïò ÷áñáêôÞñáò `%c' óôï ôýðï áëöáñéèìçôéêïý `%s'" + +#, fuzzy +#~ msgid " overriding `%#D'" +#~ msgstr "áíôéãñÜöåôáé áðü ðÜíù" + +#, fuzzy +#~ msgid " overriding `%#F'" +#~ msgstr "áíôéãñÜöåôáé áðü ðÜíù" + +#, fuzzy +#~ msgid "`%#D' cannot be declared" +#~ msgstr "Äåí ìðïñåß íá ôåèåß ç çìåñïìçíßá." + +#, fuzzy +#~ msgid "`%E' is not of type `%T'" +#~ msgstr "ôï `%s' åßíáé ðñüãïíïò ôïõ `%s'" + +#, fuzzy +#~ msgid "invalid definition of qualified type `%T'" +#~ msgstr "ìç Ýãêõñïò áñéèìüò áñ÷åßïõ óôç äÞëùóç ðåäßïõ: `%s'" + +#, fuzzy +#~ msgid "parse error in method specification" +#~ msgstr "óõíôáêôéêü óöÜëìá óôïí êáèïñéóìü óåéñÜò" + +#, fuzzy +#~ msgid "invalid type `%T' for default argument to `%T'" +#~ msgstr "Ìç Ýãêõñç áêÝñáéá ðáñÜìåôñïò `%s'" + +#~ msgid "%s before `%s'" +#~ msgstr "%s ðñéí áðü `%s'" + +#~ msgid "%s before `%c'" +#~ msgstr "%s ðñéí áðü `%c'" + +#~ msgid "%s before `\\%o'" +#~ msgstr "%s ðñéí áðü `\\%o'" + +#, fuzzy +#~ msgid "%s before `%s' token" +#~ msgstr "%s (ãéá êáíïíéêÞ Ýêöñáóç `%s')" + +#, fuzzy +#~ msgid "`%V' qualifiers cannot be applied to `%T'" +#~ msgstr "ôï `%s' åßíáé ðñüãïíïò ôïõ `%s'" + +#, fuzzy +#~ msgid "`%s' attribute is not supported on this platform" +#~ msgstr "ðñïåéäïðïßçóç: ôï --pid=PID äåí õðïóôçñßæåôáé óå áõôü ôï óýóôçìá" + +#, fuzzy +#~ msgid "invalid use of non-lvalue array" +#~ msgstr "ìç Ýãêõñç þñá ôçò ìÝñáò" + +#, fuzzy +#~ msgid "type `%T' has no destructor" +#~ msgstr "Ôï `%s' äåí åßíáé êáôÜëïãïò." + +#, fuzzy +#~ msgid "invalid use of type decl `%#D' as expression" +#~ msgstr "Ìç Ýãêõñç ðñïðïñåõüìåíç êáíïíéêÞ Ýêöñáóç" + +#, fuzzy +#~ msgid "invalid use of template `%#D' as expression" +#~ msgstr "Ìç Ýãêõñç êáíïíéêÞ Ýêöñáóç" + +#, fuzzy +#~ msgid "`%T' is not a pointer-to-object type" +#~ msgstr "Ôï `%s' äåí åßíáé êáôÜëïãïò." + +#, fuzzy +#~ msgid "invalid type argument" +#~ msgstr "Ìç Ýãêõñç ðáñÜìåôñïò" + +#, fuzzy +#~ msgid "too many arguments to %s `%+#D'" +#~ msgstr "ðÜñá ðïëëÜ ïñßóìáôá" + +#, fuzzy +#~ msgid "too few arguments to %s `%+#D'" +#~ msgstr "ðïëý ëßãá ïñßóìáôá" + +#, fuzzy +#~ msgid "division by zero in `%E %% 0'" +#~ msgstr "Äéáßñåóç ìå ìçäÝí óôçí áðïôßìçóç: %s" + +#, fuzzy +#~ msgid "division by zero in `%E %% 0.'" +#~ msgstr "Äéáßñåóç ìå ìçäÝí óôçí áðïôßìçóç: %s" + +#, fuzzy +#~ msgid "invalid use of `--' on bool variable `%D'" +#~ msgstr "ìç Ýãêõñïò áñéèìüò áðü êåíÝò ãñáììÝò: `%s'" + +#, fuzzy +#~ msgid "cannot create pointer to reference member `%D'" +#~ msgstr "äåí åßíáé äõíáôüí íá ãßíåé `stat' ôï locale áñ÷åßï `%s'" + +#, fuzzy +#~ msgid "invalid static_cast from type `%T' to type `%T'" +#~ msgstr "ìç Ýãêõñïò ÷áñáêôÞñáò `%c' óôï ôýðï áëöáñéèìçôéêïý `%s'" + +#, fuzzy +#~ msgid "invalid const_cast from type `%T' to type `%T'" +#~ msgstr "ìç Ýãêõñïò ÷áñáêôÞñáò `%c' óôï ôýðï áëöáñéèìçôéêïý `%s'" + +#, fuzzy +#~ msgid "invalid cast to function type `%T'" +#~ msgstr "Ìç Ýãêõñç åðéëïãÞ `%s'" + +#, fuzzy +#~ msgid "cannot convert `%T' to `%T' in %s" +#~ msgstr "äåí åßíáé äõíáôü íá äçìéïõñãçèåß ôï %s `%s' óôï `%s'" + +#, fuzzy +#~ msgid "in passing argument %P of `%+D'" +#~ msgstr "Ëåßðåé ðáñÜìåôñïò ãéá `%s'" + +#, fuzzy +#~ msgid "returning reference to temporary" +#~ msgstr "xdr_reference: ç ìíÞìç åîáíôëÞèçêå\n" + +#, fuzzy +#~ msgid "cannot declare variable `%D' to be of type `%T'" +#~ msgstr "äåí åßíáé äõíáôü íá äçìéïõñãçèåß ôï %s `%s' óôï `%s'" + +#, fuzzy +#~ msgid "cannot declare parameter `%D' to be of type `%T'" +#~ msgstr "äåí åßíáé äõíáôü íá äçìéïõñãçèåß ôï %s `%s' óôï `%s'" + +#, fuzzy +#~ msgid "cannot declare field `%D' to be of type `%T'" +#~ msgstr "Üãíùóôïò ÷áñáêôÞñáò óôï ðåäßï `%s' ôçò êáôçãïñßáò `%s'" + +#, fuzzy +#~ msgid "invalid return type for function `%#D'" +#~ msgstr "ìç Ýãêõñï åßäïò áëöáñéèìçôéêïý `%s'" + +#, fuzzy +#~ msgid "cannot allocate an object of type `%T'" +#~ msgstr "áäõíáìßá áíÜãíùóçò êáôáëüãïõ locale `%s'" + +#, fuzzy +#~ msgid "invalid use of undefined type `%#T'" +#~ msgstr "ìç Ýãêõñïò áñéèìüò áðü êåíÝò ãñáììÝò: `%s'" + +#, fuzzy +#~ msgid "declaration of `%#T'" +#~ msgstr "äçìéïõñãßá áñ÷åßïõ `%s'\n" + +#, fuzzy +#~ msgid "invalid use of `%T'" +#~ msgstr "Ìç Ýãêõñç çìåñïìçíßá `%s'." + +#, fuzzy +#~ msgid "Emit cross referencing information" +#~ msgstr "åìöÜíéóç ðëçñïöïñéþí ðñïüäïõ" + +#~ msgid "note:" +#~ msgstr "óçìåßùóç:" + +#, fuzzy +#~ msgid "warning:" +#~ msgstr "ðñïåéäïðïßçóç: " + +#~ msgid "fatal:" +#~ msgstr "ìïéñáßï:" + +#~ msgid "(continued):" +#~ msgstr "(óõíå÷ßæåôáé):" + +#~ msgid "[REPORT BUG!!] %" +#~ msgstr "[ÁÍÁÖ¸ÑÅÔÅ ÔÏ ÓÖ¶ËÌÁ!!] %" + +#~ msgid "[REPORT BUG!!]" +#~ msgstr "[ÁÍÁÖ¸ÑÅÔÅ ÔÏ ÓÖÁËÌÁ!!]" + +#, fuzzy +#~ msgid "In statement function" +#~ msgstr "ðÜñá ðïëëÜ ïñßóìáôá" + +#, fuzzy +#~ msgid "argument to `%s' missing" +#~ msgstr "Ý÷ïõí ðáñáëçöèåß ïñßóìáôá" + +#, fuzzy +#~ msgid "no input files; unwilling to write output files" +#~ msgstr "%s: ôï áñ÷åßï åéóüäïõ åßíáé ôï áñ÷åßï åîüäïõ" + +#, fuzzy +#~ msgid "Implicit declaration of `%A' at %0" +#~ msgstr "ðñïçãïýìåíç áõôïíüçôç äéáêýñçîç ôïõ `%s'" + +# src/main.c:663 +#, fuzzy +#~ msgid "Non-ISO-C-standard escape sequence `\\%A' at %0" +#~ msgstr "¶ãíùóôç óõìâïëïóåéñÜ `%s'" + +# src/main.c:663 +#, fuzzy +#~ msgid "Unknown escape sequence `\\%A' at %0" +#~ msgstr "¶ãíùóôç óõìâïëïóåéñÜ `%s'" + +#, fuzzy +#~ msgid "Unterminated escape sequence `\\' at %0" +#~ msgstr "ìç ôåñìáôéæüìåío áëöáñéèìçôéêü" + +#, fuzzy +#~ msgid "Hex escape at %0 out of range" +#~ msgstr "ó÷åôéêÞ èÝóç áñ÷åßïõ åßíáé åêôüò ïñßùí" + +#, fuzzy +#~ msgid "Escape sequence at %0 out of range for character" +#~ msgstr "ìç Ýãêõñç äéáäéêáóßá äéáöõãÞò óôï ôÝëïò ôïõ áëöáñéèìéôéêïý" + +#, fuzzy +#~ msgid "hex escape out of range" +#~ msgstr "ó÷åôéêÞ èÝóç áñ÷åßïõ åßíáé åêôüò ïñßùí" + +# src/main.c:663 +#, fuzzy +#~ msgid "non-ISO escape sequence `\\%c'" +#~ msgstr "¶ãíùóôç óõìâïëïóåéñÜ `%s'" + +# src/main.c:663 +#, fuzzy +#~ msgid "unknown escape sequence `\\%c'" +#~ msgstr "¶ãíùóôç óõìâïëïóåéñÜ `%s'" + +#, fuzzy +#~ msgid "ignoring pragma: %s" +#~ msgstr "áãíïïýíôáé üëá ôá ïñßóìáôá" + +#, fuzzy +#~ msgid "invalid #ident" +#~ msgstr "ìç Ýãêõñï äéêáßùìá" + +#, fuzzy +#~ msgid "undefined or invalid # directive" +#~ msgstr "%%%c: êáôåõèõíôÞñéïò ãñáììÞ ìç Ýãêõñç." + +#, fuzzy +#~ msgid "invalid #line" +#~ msgstr "ìç Ýãêõñïò áñéèìüò" + +#, fuzzy +#~ msgid "invalid #-line" +#~ msgstr "ìç Ýãêõñïò áñéèìüò" + +#, fuzzy +#~ msgid "Null character at %0 -- line ignored" +#~ msgstr "ìç Ýãêõñïò ÷áñáêôÞñáò óôï áñ÷åßï: " + +#, fuzzy +#~ msgid "Set the maximum line length" +#~ msgstr "åëÜ÷éóôï ìÝãåèïò áëöáñéèìçôéêïý" + +#, fuzzy +#~ msgid "Missing first operand for binary operator at %0" +#~ msgstr "Áãíùóôïò äõáäéêüò ÷åéñéóôÞò." + +#, fuzzy +#~ msgid "Zero-length character constant at %0" +#~ msgstr "êåíü áëöáñéèìçôéêü" + +#, fuzzy +#~ msgid "Invalid token at %0 in expression or subexpression at %1" +#~ msgstr "Ìç Ýãêõñç êáíïíéêÞ Ýêöñáóç" + +#, fuzzy +#~ msgid "Character constant at %0 has no closing apostrophe at %1" +#~ msgstr "ìç Ýãêõñïò óôáèåñüò ÷áñáêôÞñáò óôï áëöáñéèìéôéêü" + +#, fuzzy +#~ msgid "Integer at %0 too large" +#~ msgstr "ó÷åôéêÞ èÝóç áñ÷åßïõ åßíáé åêôüò ïñßùí" + +#, fuzzy +#~ msgid "Unrecognized FORMAT specifier at %0" +#~ msgstr "Üãíùóôï ðñüèåìá: %s" + +#, fuzzy +#~ msgid "Zero-size specification invalid at %0" +#~ msgstr "%s: Ìç Ýãêõñç ñýèìéóç `%s'.\n" + +#, fuzzy +#~ msgid "Unable to open INCLUDE file `%A' at %0" +#~ msgstr "Äåí ìðüñåóá íá áíïßîù ôï áñ÷åßï %s" + +#, fuzzy +#~ msgid "Truncating characters on right side of character constant at %0" +#~ msgstr "äéðëü üíïìá ÷áñáêôÞñá `%s'" + +#, fuzzy +#~ msgid "Typeless constant at %0 too large" +#~ msgstr "ó÷åôéêÞ èÝóç áñ÷åßïõ åßíáé åêôüò ïñßùí" + +#, fuzzy +#~ msgid "Array `%A' at %0 is too large to handle" +#~ msgstr "Ï êáôÜëïãïò `%s' äåí åßíáé ðñïóéôüò." + +#, fuzzy +#~ msgid "Internal compiler error -- cannot perform operation" +#~ msgstr "åóùôåñéêü óöÜëìá óôï %s, ãñáììÞ %u" + +# src/grep.c:1133 +#, fuzzy +#~ msgid "In unknown kind" +#~ msgstr "Üãíùóôç ìÝèïäïò êáôáëüãùí" + +#~ msgid "In function" +#~ msgstr "Óôç óõíÜñôçóç" + +#~ msgid "In subroutine" +#~ msgstr "Óôçí õðïñïõôßíá" + +#~ msgid "In program" +#~ msgstr "Óôï ðñüãñáììá" + +#~ msgid "In block-data unit" +#~ msgstr "Óôç ìïíÜäá ìðëïê-äåäïìÝíùí" + +#~ msgid "In common block" +#~ msgstr "Óôï êïéíü ìðëïê" + +#, fuzzy +#~ msgid "internal error - too many interface type" +#~ msgstr "åóùôåñéêü óöÜëìá óôï %s, ãñáììÞ %u" + +#, fuzzy +#~ msgid "field `%s' not found" +#~ msgstr "ôï áñ÷åßï ÷Üñôç ÷áñáêôÞñùí `%s' äåí âñÝèçêå" + +#, fuzzy +#~ msgid "ret instruction not implemented" +#~ msgstr "Ç ëåéôïõñãßá äåí Ý÷åé õëïðïéçèåß" + +#, fuzzy +#~ msgid "can't expand %s" +#~ msgstr "%s: áäõíáìßá óôçí áíÜãíùóç %s: %s\n" + +#, fuzzy +#~ msgid "invalid PC in line number table" +#~ msgstr "ìç Ýãêõñïò áñ÷éêüò áñéèìüò ãñáììÞò: `%s'" + +#, fuzzy +#~ msgid "bad string constant" +#~ msgstr "ìç ôåñìáôéæìÝíï áëöáñéèìçôéêü óôáèåñÜò" + +#, fuzzy +#~ msgid "can't reopen %s" +#~ msgstr "áäõíáìßá áíïßãìáôïò ôïõ `%s'" + +#, fuzzy +#~ msgid "can't close %s" +#~ msgstr "äåí åßíáé äõíáôü íá áëëá÷ôïýí ôá äéêáéþìáôá ôïõ `%s'" + +#, fuzzy +#~ msgid "cannot find file for class %s" +#~ msgstr "äå âñÝèçêå ï ðñïåðåîåñãáóôÞò C: %s \n" + +#, fuzzy +#~ msgid "not a valid Java .class file" +#~ msgstr "Ìç Ýãêõñïò ÷áñáêôÞñáò ïíüìáôïò êëÜóçò" + +#, fuzzy +#~ msgid "error while parsing constant pool" +#~ msgstr "óöÜëìá êáôÜ ôï êëåßóéìï ôïõ áñ÷åßïõ åîüäïõ" + +#, fuzzy +#~ msgid "error while parsing fields" +#~ msgstr "óöÜëìá êáôÜ ôï êëåßóéìï ôïõ áñ÷åßïõ åîüäïõ" + +#, fuzzy +#~ msgid "error while parsing methods" +#~ msgstr "óöÜëìá êáôÜ ôçí áíÜãíùóç ôçò åéóüäïõ" + +#, fuzzy +#~ msgid "error while parsing final attributes" +#~ msgstr "óöÜëìá êáôÜ ôï êëåßóéìï ôçò åéóüäïõ `%s'" + +#, fuzzy +#~ msgid "missing Code attribute" +#~ msgstr "ÅëëéðÞò Þ êáêïó÷çìáôéóìÝíç éäéüôçôá" + +#, fuzzy +#~ msgid "no input file specified" +#~ msgstr "Äåí õðÜñ÷ïõí áñ÷åßá åéóüäïõ" + +#, fuzzy +#~ msgid "can't close input file %s" +#~ msgstr "áäõíáìßá áíïßãìáôïò áñ÷åßïõ åéóüäïõ `%s'" + +#, fuzzy +#~ msgid "field initializer type mismatch" +#~ msgstr "Êáêïóõíôáßñéáóìá ôýðùí êáôá÷þñçóçò/ðßíáêá" + +#, fuzzy +#~ msgid "can't create directory %s" +#~ msgstr "%s: Äåí åßíáé äõíáôüí íá äçìéïõñãçèåß ï êáôÜëïãïò %s: %s\n" + +#, fuzzy +#~ msgid "can't create %s" +#~ msgstr "áäõíáìßá áíïßãìáôïò ôïõ `%s'" + +#, fuzzy +#~ msgid "can't open output file `%s'" +#~ msgstr "áäõíáìßá áíïßãìáôïò áñ÷åßïõ åîüäïõ `%s'" + +#, fuzzy +#~ msgid "file not found `%s'" +#~ msgstr "Ìç Ýãêõñç åðéëïãÞ `%s'" + +#, fuzzy +#~ msgid "`%s' is not a valid class name" +#~ msgstr "%s' äåí åßíáé éó÷ýùí èåôéêüò áêÝñáéïò." + +#, fuzzy +#~ msgid "--resource requires -o" +#~ msgstr "ÅóöáëìÝíïò êþäéêáò áßôçóçò" + +#, fuzzy +#~ msgid "cannot specify both -C and -o" +#~ msgstr "äåí åßíáé äõíáôü íá ðáñáëçöèåß ï ÷ñÞóôçò êáé ç ïìÜäá" + +#, fuzzy +#~ msgid "cannot create temporary file" +#~ msgstr "ÓÖÁËÌÁ: Áäõíáìßá äçìéïõñãßáò ðñïóùñéíïý áñ÷åßïõ ãéá áëëáãÞ" + +#, fuzzy +#~ msgid "cannot specify `main' class when not linking" +#~ msgstr "Äåí åßíáé äõíáôü íá äçëùèåß áñéèìüò óôçëþí óôçí ðáñÜëëçëç åêôýðùóç." + +#, fuzzy +#~ msgid "can't mangle %s" +#~ msgstr "Äåí åßíáé äõíáôüí íá åêôåëåóôåß ôï %s" + +#, fuzzy +#~ msgid "internal error - invalid Utf8 name" +#~ msgstr "åóùôåñéêü óöÜëìá óôï %s, ãñáììÞ %u" + +#, fuzzy +#~ msgid "Missing name" +#~ msgstr "¸÷åé ðáñáëçöèåß åíôïëÞ" + +#~ msgid "';' expected" +#~ msgstr "áíáìåíüôáí ';'" + +#~ msgid "'*' expected" +#~ msgstr "áíáìåíüôáí '*'" + +#, fuzzy +#~ msgid "Missing class name" +#~ msgstr "¸÷åé ðáñáëçöèåß åíôïëÞ" + +#~ msgid "'{' expected" +#~ msgstr "áíáìåíüôáí '{'" + +#, fuzzy +#~ msgid "Missing interface name" +#~ msgstr "ðáñÜëçøç ïñßóìáôïò áñ÷åßïõ" + +#, fuzzy +#~ msgid "Missing term" +#~ msgstr "¸÷åé ðáñáëçöèåß åíôïëÞ" + +#, fuzzy +#~ msgid "Invalid declaration" +#~ msgstr "Ìç Ýãêõñç áíôáëëáãÞ" + +#~ msgid "']' expected" +#~ msgstr "áíáìåíüôáí ']'" + +# src/dfa.c:652 src/dfa.c:655 src/dfa.c:682 src/dfa.c:686 src/dfa.c:687 +# src/dfa.c:690 src/dfa.c:703 src/dfa.c:704 +# src/dfa.c:660 src/dfa.c:663 src/dfa.c:690 src/dfa.c:694 src/dfa.c:695 +# src/dfa.c:698 src/dfa.c:711 src/dfa.c:712 +#, fuzzy +#~ msgid "Unbalanced ']'" +#~ msgstr "Ìç éóóïñïðçìÝíï [" + +#, fuzzy +#~ msgid "Identifier expected" +#~ msgstr "ÐñïóäéïñéóôÞò áöáéñÝèçêå" + +#~ msgid "')' expected" +#~ msgstr "áíáìåíüôáí '('" + +#, fuzzy +#~ msgid "Missing formal parameter term" +#~ msgstr "ÅëëéðÞò Þ êáêïó÷çìáôéóìÝíç éäéüôçôá" + +#, fuzzy +#~ msgid "Missing identifier" +#~ msgstr "Ý÷åé ðáñáëçöèåß ôï áñ÷åßï ðñïïñéóìïý" + +#, fuzzy +#~ msgid "Invalid interface type" +#~ msgstr "Ìç Ýãêõñïò åîáêñéâùôÞò(verifier) åîõðçñåôïýìåíïõ" + +#~ msgid "':' expected" +#~ msgstr "áíáìåíüôáí ':'" + +#, fuzzy +#~ msgid "Invalid expression statement" +#~ msgstr "Ìç Ýãêõñç êáíïíéêÞ Ýêöñáóç" + +#~ msgid "'(' expected" +#~ msgstr "áíáìåíüôáí '('" + +#, fuzzy +#~ msgid "Missing term or ')'" +#~ msgstr "Ëåßðåé ðáñÜìåôñïò ãéá `%s'" + +#, fuzzy +#~ msgid "Missing or invalid constant expression" +#~ msgstr "%s: ìç Ýãêõñç êáíïíéêÞ Ýêöñáóç: %s" + +#, fuzzy +#~ msgid "Invalid control expression" +#~ msgstr "Ìç Ýãêõñç êáíïíéêÞ Ýêöñáóç" + +#, fuzzy +#~ msgid "Invalid update expression" +#~ msgstr "Ìç Ýãêõñç êáíïíéêÞ Ýêöñáóç" + +#, fuzzy +#~ msgid "Invalid init statement" +#~ msgstr "Ìç Ýãêõñç ðáñÜìåôñïò" + +#, fuzzy +#~ msgid "'class' expected" +#~ msgstr "áíáìåíüôáí ')'\n" + +#, fuzzy +#~ msgid "')' or term expected" +#~ msgstr "áíáìåíüôáí ')'\n" + +#~ msgid "'[' expected" +#~ msgstr "áíáìåíüôáí '['" + +#, fuzzy +#~ msgid "Field expected" +#~ msgstr "Ç èõãáôñéêÞ äéåñãáóßá ôåñìáôßóôçêå" + +#, fuzzy +#~ msgid "']' expected, invalid type expression" +#~ msgstr "Ìç Ýãêõñç êáíïíéêÞ Ýêöñáóç" + +#, fuzzy +#~ msgid "Invalid type expression" +#~ msgstr "Ìç Ýãêõñç êáíïíéêÞ Ýêöñáóç" + +#, fuzzy +#~ msgid "Invalid reference type" +#~ msgstr "Ìç Ýãêõñç ðéóù-ðáñáðïìðÞ" + +#~ msgid "" +#~ "%s.\n" +#~ "%s" +#~ msgstr "" +#~ "%s.\n" +#~ "%s" + +#, fuzzy +#~ msgid "missing static field `%s'" +#~ msgstr "Ý÷åé ðáñáëçöèåß ç ëßóôá ìå ôá ðåäßá" + +#, fuzzy +#~ msgid "not a static field `%s'" +#~ msgstr "áäõíáìßá ðñïóðÝëáóçò(stat()) áñ÷åßïõ `%s': %s" + +#, fuzzy +#~ msgid "No case for %s" +#~ msgstr "ÓöÜëìá åðåîåñãáóßáò: %s" + +#, fuzzy +#~ msgid "unregistered operator %s" +#~ msgstr "ðïôÝ äåí äçëþèçêå ôï ðñüãñáììá %d\n" + +#, fuzzy +#~ msgid "internal error - use of undefined type" +#~ msgstr "åóùôåñéêü óöÜëìá óôï %s, ãñáììÞ %u" + +#, fuzzy +#~ msgid "junk at end of signature string" +#~ msgstr "ìç ôåñìáôéæüìåío áëöáñéèìçôéêü" + +#, fuzzy +#~ msgid "bad pc in exception_table" +#~ msgstr "Åîáßñåóç êéíçôÞò õðïäéáóôïëÞò" + +#, fuzzy +#~ msgid "Warn if modifiers are specified when not necessary" +#~ msgstr "äå ìðïñïýí íá äçëþíïíôáé áñ÷åßá üôáí ãßíåôáé ÷ñÞóç ôïõ --string" + +#, fuzzy +#~ msgid "cannot find protocol declaration for `%s'" +#~ msgstr "áäõíáìßá åéóáãùãÞò óôïé÷åßï ðáñáâïëÞò `%.*s'" + +#, fuzzy +#~ msgid "cannot find interface declaration for `%s'" +#~ msgstr "áäõíáìßá áíÜãíùóçò êåöáëßäáò áðü ôï `%s'" + +#, fuzzy +#~ msgid "cannot find reference tag for class `%s'" +#~ msgstr "äå âñÝèçêå ï ðñïåðåîåñãáóôÞò C: %s \n" + +#, fuzzy +#~ msgid "cannot find class `%s'" +#~ msgstr "áäõíáìßá åêôÝëåóçò ioctl óôï `%s'" + +#, fuzzy +#~ msgid "class `%s' already exists" +#~ msgstr "(ôï áñ÷åßï Þäç õðÜñ÷åé)" + +#, fuzzy +#~ msgid "inconsistent instance variable specification" +#~ msgstr "Ìåôáãëùôôéóìüò ðñïäéáãñáöþí ôïðéêþí ñõèìßóåùí" + +#, fuzzy +#~ msgid "multiple declarations for method `%s'" +#~ msgstr "ðïëëáðëüò áñéèìüò åðéëïãþí ôçí åíôïëÞ `s'" + +#, fuzzy +#~ msgid "invalid receiver type `%s'" +#~ msgstr "Ìç Ýãêõñç ðñïôåñáéüôçôá `%s'" + +#, fuzzy +#~ msgid "`%s' does not respond to `%s'" +#~ msgstr "ôï `%s' åßíáé ðñüãïíïò ôïõ `%s'" + +# src/outer.c:102 +#, fuzzy +#~ msgid "no super class declared in interface for `%s'" +#~ msgstr "Ï áíôéôïðïèåôçôÞò åðéöÜíåéáò Ý÷åé ôåèåß ðåñéóóüôåñï áðü ìéá öïñÜ ãéá ôï `%s'" + +#, fuzzy +#~ msgid "method `%s' not implemented by protocol" +#~ msgstr "Ç ëåéôïõñãßá äåí õðïóôçñßæåôáé áðü ôï ðñùôüêïëëï" + +# src/install.c:562 +#, fuzzy +#~ msgid "cannot find method" +#~ msgstr "áäõíáìßá äéêñÜíùóçò" + +#, fuzzy +#~ msgid "duplicate definition of class method `%s'" +#~ msgstr "áäõíáìßá áíïßãìáôïò áñ÷åßïõ ïñéóìïý locale `%s'" + +#, fuzzy +#~ msgid "duplicate declaration of class method `%s'" +#~ msgstr "äéðëü üíïìá ÷áñáêôÞñá `%s'" + +#, fuzzy +#~ msgid "duplicate definition of instance method `%s'" +#~ msgstr "áäõíáìßá áíïßãìáôïò áñ÷åßïõ ïñéóìïý locale `%s'" + +#, fuzzy +#~ msgid "duplicate declaration of instance method `%s'" +#~ msgstr "äéðëü üíïìá ÷áñáêôÞñá `%s'" + +#, fuzzy +#~ msgid "incomplete implementation of category `%s'" +#~ msgstr "áðïôõ÷ßá êáôÜ ôçí åããñáöÞ äåäïìÝíùí ãéá ôçí êáôçãïñßá `%s'" + +# src/request.c:806 src/request.c:912 +#, fuzzy +#~ msgid "conflicting super class name `%s'" +#~ msgstr "Ìç áíáãíùñßóçìï üíïìá åðéöÜíåéáò `%s'" + +#, fuzzy +#~ msgid "duplicate interface declaration for class `%s'" +#~ msgstr "äéðëü üíïìá ÷áñáêôÞñá `%s'" + +#, fuzzy +#~ msgid "duplicate declaration for protocol `%s'" +#~ msgstr "äéðëü üíïìá ÷áñáêôÞñá `%s'" + +#, fuzzy +#~ msgid "profiling not supported with -mg\n" +#~ msgstr "Ç ëåéôïõñãßá äåí õðïóôçñßæåôáé" + +#, fuzzy +#~ msgid "may not use both -m32 and -m64" +#~ msgstr "äåí åßíáé äõíáôü íá ðáñáëçöèåß ï ÷ñÞóôçò êáé ç ïìÜäá" + +#, fuzzy +#~ msgid "-mapcs-26 and -mapcs-32 may not be used together" +#~ msgstr "" +#~ "Ïé åðéëïãÝò ãéá íá åêôõðùèåß êáé íá ïñéóôåß ç þñá äåí ìðïñïýí íá\n" +#~ "÷ñçóéìïðïéçèïýí ðáñÜëëçëá." + +#, fuzzy +#~ msgid "-msoft-float and -mhard_float may not be used together" +#~ msgstr "" +#~ "Ïé åðéëïãÝò ãéá íá åêôõðùèåß êáé íá ïñéóôåß ç þñá äåí ìðïñïýí íá\n" +#~ "÷ñçóéìïðïéçèïýí ðáñÜëëçëá." + +#, fuzzy +#~ msgid "-mbig-endian and -mlittle-endian may not be used together" +#~ msgstr "" +#~ "Ïé åðéëïãÝò ãéá íá åêôõðùèåß êáé íá ïñéóôåß ç þñá äåí ìðïñïýí íá\n" +#~ "÷ñçóéìïðïéçèïýí ðáñÜëëçëá." + +#, fuzzy +#~ msgid "-p option not supported: use -pg instead" +#~ msgstr "ôï -C äåí óõíßóôáôáé ðéá, ÷ñçóéìïðïéÞóôå -Z" + +#~ msgid "-pipe is not supported" +#~ msgstr "ôï -pipe äåí õðïóôçñßæåôáé" + +#, fuzzy +#~ msgid "-mhard-float not supported" +#~ msgstr "Ôï ðñùôüêïëëï äåí õðïóôçñßæåôáé" + +#, fuzzy +#~ msgid "options -mabi=mmixware and -mabi=gnu are mutually exclusive" +#~ msgstr "\"Æþíç %s\" ãñáììÞ êáé åðéëïãÞ -l åßíáé áìïéâáßùò áðïêëåéüìåíá" + +#, fuzzy +#~ msgid "__builtin_trap not supported by this target" +#~ msgstr "óõìâïëéêïß óýíäåóìïé äåí õðïóôçñßæïíôáé óôï óýóôçìá áõôü" + +#, fuzzy +#~ msgid "ignoring #pragma %s" +#~ msgstr "áãíïïýíôáé üëá ôá ïñßóìáôá" + +#, fuzzy +#~ msgid "invalid %H value" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %h value" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %Q value" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %q value" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %p value" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %B value" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %C value" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %E value" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "invalid %r value" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "bad string length in %s" +#~ msgstr "åëÜ÷éóôï ìÝãåèïò áëöáñéèìçôéêïý" + +#, fuzzy +#~ msgid "mode mismatch in %s expression" +#~ msgstr "ÓöÜëìá óôï ôáßñéáóìá óôçí êáíïíéêÞ Ýêöñáóç `%s'" + +# src/main.c:697 src/main.c:751 +#, fuzzy +#~ msgid "no label named `%s'" +#~ msgstr "¶ãíùóôç ãëþóóá `%s'" + +#, fuzzy +#~ msgid "this is the first ELSE label" +#~ msgstr "áõôüò åßíáé ï ðñþôïò ïñéóìüò" + +#, fuzzy +#~ msgid "duplicate CASE value" +#~ msgstr "äéðëü êëåéäß" + +#, fuzzy +#~ msgid "this is the first entry for that value" +#~ msgstr "áõôüò åßíáé ï ðñþôïò ïñéóìüò" + +#, fuzzy +#~ msgid "CASE value out of range" +#~ msgstr "Ï áñéèìüò ôùí êáíáëéþí åßíáé Ýîù áðü ôá üñéá" + +#, fuzzy +#~ msgid "empty range" +#~ msgstr "êåíü áëöáñéèìçôéêü" + +#, fuzzy +#~ msgid "internal error - unknown type in multiple assignment" +#~ msgstr "åóùôåñéêü óöÜëìá - êëÞèçêå ç addtype ìå êáêü ttisgmt" + +#, fuzzy +#~ msgid "cannot convert to a boolean mode" +#~ msgstr "áäýíáôç ç ìåôáôñïðÞ ôïõ U+%04X óôï ôïðéêü óýíïëï ÷áñáêôÞñùí" + +#, fuzzy +#~ msgid "cannot convert to a char mode" +#~ msgstr "áäýíáôç ç ìåôáôñïðÞ ôïõ U+%04X óôï ôïðéêü óýíïëï ÷áñáêôÞñùí" + +#, fuzzy +#~ msgid "powerset tuple element out of range" +#~ msgstr "%s: áñéèìüò ãñáììÞò Ýîù áðü ôá üñéá" + +#, fuzzy +#~ msgid "missing variant fields (at least `%s')" +#~ msgstr "Ëåßðåé ðáñÜìåôñïò ãéá `%s'" + +#, fuzzy +#~ msgid "bad initializer for field `%s'" +#~ msgstr "ìç Ýãêõñï byte Þ ëßóôá ðåäßùí" + +#, fuzzy +#~ msgid "invalid array tuple label" +#~ msgstr "Ìç Ýãêõñïò ÷áñáêôÞñáò ïíüìáôïò êëÜóçò" + +#, fuzzy +#~ msgid "array tuple index out of range" +#~ msgstr "%s: áñéèìüò ãñáììÞò Ýîù áðü ôá üñéá" + +#, fuzzy +#~ msgid "too many array tuple values" +#~ msgstr "ðÜñá ðïëëÜ ïñßóìáôá" + +#, fuzzy +#~ msgid "missing array tuple element %s" +#~ msgstr "Ëåßðåé ðáñÜìåôñïò ãéá `%s'" + +#, fuzzy +#~ msgid "missing array tuple elements %s : %s" +#~ msgstr "Ëåßðåé ðáñÜìåôñïò ãéá `%s'" + +#, fuzzy +#~ msgid "`%s' must not be declared readonly" +#~ msgstr "ôï `%s' äåí åßíáé êáíïíéêü áñ÷åßï" + +# src/request.c:263 +#, fuzzy +#~ msgid "no initialization allowed for `%s'" +#~ msgstr "Ôï âÞìá áñ÷éêïðïßçóçò áðÝôõ÷å" + +#, fuzzy +#~ msgid "location for `%s' not read-compatible" +#~ msgstr "Ï êáôÜëïãïò `%s' äåí åßíáé ðñïóéôüò." + +#, fuzzy +#~ msgid "too few tag labels" +#~ msgstr "ðïëý ëßãá ïñßóìáôá" + +#, fuzzy +#~ msgid "too many tag labels" +#~ msgstr "ðÜñá ðïëëÜ ïñßóìáôá" + +#, fuzzy +#~ msgid "...is duplicated here" +#~ msgstr "äéðëü êëåéäß" + +#, fuzzy +#~ msgid "mode of `%s' is not a mode" +#~ msgstr "Ôï `%s' äåí åßíáé êáôÜëïãïò." + +#, fuzzy +#~ msgid "duplicate grant for `%s'" +#~ msgstr "äéðëü üíïìá ÷áñáêôÞñá `%s'" + +#, fuzzy +#~ msgid "previous grant for `%s'" +#~ msgstr "äéáôÞñçóç ùñþí óôï %s" + +#, fuzzy +#~ msgid "duplicate definition `%s'" +#~ msgstr "äéðëüò ïñéóìüò óõíüëïõ" + +#, fuzzy +#~ msgid "previous definition of `%s'" +#~ msgstr "êáíÝíáò ïñéóìüò ôïõ `UNDEFINED'" + +# src/main.c:785 +#, fuzzy +#~ msgid "ambiguous choice for seize `%s' -" +#~ msgstr "ÁóáöÞò ìïñöÞ `%s'" + +#, fuzzy +#~ msgid "INTERNAL ERROR: handle_one_level is broken" +#~ msgstr "ÅÓÙÔÅÑÉÊÏ ÓÖÁËÌÁ: ËÜèïò åßäïò áíôéêåéìÝíïõ óôï expand_token ()" + +#, fuzzy +#~ msgid "conditional expression not allowed in %s" +#~ msgstr "ËÜèïò Ýêöñáóç óôçí áðïôßìçóç (ëÜèïò åßóïäïò): %s" + +#, fuzzy +#~ msgid "internal error: unknown expression mode in %s" +#~ msgstr "åóùôåñéêü óöÜëìá óôï %s, ãñáììÞ %u" + +#, fuzzy +#~ msgid "array is not addressable" +#~ msgstr "Ï êáôÜëïãïò `%s' äåí åßíáé ðñïóéôüò." + +#~ msgid "too few arguments in call to `%s'" +#~ msgstr "ðïëý ëßãá ïñßóìáôá óôç êëÞóç ôçò `%s'" + +#~ msgid "too many arguments in call to `%s'" +#~ msgstr "ðÜñá ðïëëÜ ïñßóìáôá óôç êëÞóç ôçò `%s'" + +#, fuzzy +#~ msgid "cannot dereference, not a pointer" +#~ msgstr "Äåí ìðïñåß íá êáèïñéóôåß ôï üíïìá ôïõ óõóôÞìáôïò" + +#, fuzzy +#~ msgid "invalid type argument of `->'" +#~ msgstr "Ç ðáñÜìåôñïò `%s' äåí åßíáé Ýãêõñç." + +#, fuzzy +#~ msgid "no field named `%s'" +#~ msgstr "Ìç ïñéóìÝíï üíïìá %s" + +#, fuzzy +#~ msgid "argument %d to ABSTIME must be of integer type" +#~ msgstr "Ç ðáñÜìåôñïò óôï <%s> ðñÝðåé íá åßíáé Ýíáò áðëüò ÷áñáêôÞñáò" + +#, fuzzy +#~ msgid "parameter 2 must be a positive integer" +#~ msgstr "ç ôéìÞ ãéá ôï %s ðñÝðåé íá åßíáé áêÝñáéïò" + +#, fuzzy +#~ msgid "argument 1 to `%s' must be of floating point mode" +#~ msgstr "Ç ðáñÜìåôñïò óôï `%s' ðñÝðåé íá åßíáé Ýíáò áðëüò ÷áñáêôÞñáò" + +#, fuzzy +#~ msgid "first argument to `%s' must be a mode" +#~ msgstr "Ç ðáñÜìåôñïò óôï `%s' ðñÝðåé íá åßíáé Ýíáò áðëüò ÷áñáêôÞñáò" + +#~ msgid "too many arguments to procedure `%s'" +#~ msgstr "ðÜñá ðïëëÜ ïñßóìáôá óôç ñïõôßíá `%s'" + +#~ msgid "too many arguments to procedure" +#~ msgstr "ðÜñá ðïëëÜ ïñßóìáôá óôç ñïõôßíá" + +#, fuzzy +#~ msgid "too few arguments to procedure `%s'" +#~ msgstr "Ðñïåéäïðïßçóç: Ðïëý ëßãá ïñßóìáôá óôï åóùäïìçìÝíï `%s'" + +#, fuzzy +#~ msgid "too few arguments to procedure" +#~ msgstr "ðïëý ëßãá ïñßóìáôá" + +#, fuzzy +#~ msgid "syntax error (integer used as function)" +#~ msgstr "óõíôáêôéêü óöÜëìá óôïí êáèïñéóìü óåéñÜò" + +#, fuzzy +#~ msgid "syntax error - missing operator, comma, or '('?" +#~ msgstr "óõíôáêôéêü óöÜëìá óôïí ïñéóìü ôïõ ðßíáêá ñåðåñôïñßïõ: %s" + +#, fuzzy +#~ msgid "internal error - bad built-in function `%s'" +#~ msgstr "åóùôåñéêü óöÜëìá óôï %s, ãñáììÞ %u" + +#, fuzzy +#~ msgid "invalid operation on array of chars" +#~ msgstr "Ìç Ýãêõñïò ÷áñáêôÞñáò ðáñáâïëÞò" + +#, fuzzy +#~ msgid "invalid left operand of %s" +#~ msgstr "ìç Ýãêõñï åßäïò áëöáñéèìçôéêïý `%s'" + +#, fuzzy +#~ msgid "invalid right operand of %s" +#~ msgstr "ìç Ýãêõñï åßäïò áëöáñéèìçôéêïý `%s'" + +#, fuzzy +#~ msgid "ADDR requires a LOCATION argument" +#~ msgstr "ç åðéëïãÞ `-k' áðáéôåß Ýíá üñéóìá" + +#, fuzzy +#~ msgid "-> expression is not addressable" +#~ msgstr "ËÜèïò Ýêöñáóç óôçí áðïôßìçóç: %s" + +#, fuzzy +#~ msgid "%s is not addressable" +#~ msgstr "ôï `%s' äåí åßíáé êáíïíéêü áñ÷åßï" + +#, fuzzy +#~ msgid "can't write to %s" +#~ msgstr "áäõíáìßá åããñáöÞò áðïôåëÝóìáôïò: %s" + +#, fuzzy +#~ msgid "FORBID is not yet implemented" +#~ msgstr "Ç ëåéôïõñãßá äåí Ý÷åé õëïðïéçèåß" + +#, fuzzy +#~ msgid "text length must be greater then 0" +#~ msgstr "%s: ï áñéèìüò ãñáììÞò ðñÝðåé íá åßíáé ìåãáëýôåñïò áðü ôï ìçäÝí" + +#, fuzzy +#~ msgid "argument %d of %s must be a location" +#~ msgstr "Ç ðáñÜìåôñïò óôï <%s> ðñÝðåé íá åßíáé Ýíáò áðëüò ÷áñáêôÞñáò" + +#, fuzzy +#~ msgid "argument 2 of ASSOCIATE must not be an empty string" +#~ msgstr "%s: ç ôéìÞ ãéá ôï ðåäßï `%s' äåí ðñÝðåé íá åßíáé Ýíá êåíü áëöáñéèìçôéêü" + +#, fuzzy +#~ msgid "argument 2 to ASSOCIATE must be a string" +#~ msgstr "Ç ðáñÜìåôñïò óôï <%s> ðñÝðåé íá åßíáé Ýíáò áðëüò ÷áñáêôÞñáò" + +#, fuzzy +#~ msgid "argument 3 to ASSOCIATE must be a string" +#~ msgstr "Ç ðáñÜìåôñïò óôï <%s> ðñÝðåé íá åßíáé Ýíáò áðëüò ÷áñáêôÞñáò" + +#, fuzzy +#~ msgid "too many arguments in call to MODIFY" +#~ msgstr "ðÜñá ðïëëÜ ïñßóìáôá" + +#, fuzzy +#~ msgid "argument 2 of MODIFY must not be an empty string" +#~ msgstr "%s: ç ôéìÞ ãéá ôï ðåäßï `%s' äåí ðñÝðåé íá åßíáé Ýíá êåíü áëöáñéèìçôéêü" + +#, fuzzy +#~ msgid "argument 2 to MODIFY must be a string" +#~ msgstr "Ç ðáñÜìåôñïò óôï <%s> ðñÝðåé íá åßíáé Ýíáò áðëüò ÷áñáêôÞñáò" + +#, fuzzy +#~ msgid "argument 3 to MODIFY must be a string" +#~ msgstr "Ç ðáñÜìåôñïò óôï <%s> ðñÝðåé íá åßíáé Ýíáò áðëüò ÷áñáêôÞñáò" + +#, fuzzy +#~ msgid "incompatible index mode" +#~ msgstr "ìç Ýãêõñï äéêáßùìá" + +#, fuzzy +#~ msgid "argument %d of %s must be of mode ACCESS" +#~ msgstr "Ç ðáñÜìåôñïò óôï <%s> ðñÝðåé íá åßíáé Ýíáò áðëüò ÷áñáêôÞñáò" + +#, fuzzy +#~ msgid "too few arguments in call to `readrecord'" +#~ msgstr "ðïëý ëßãá bytes óôçí êùäéêïðïßçóç ÷áñáêôÞñá" + +#, fuzzy +#~ msgid "incompatible record mode" +#~ msgstr "ìçäåíéóìÝíç åããñáöÞ êáé ãñÜøéìï ðÜíù óå áõôÞ (truncated)" + +#, fuzzy +#~ msgid "too few arguments in call to `writerecord'" +#~ msgstr "ðïëý ëßãá bytes óôçí êùäéêïðïßçóç ÷áñáêôÞñá" + +#, fuzzy +#~ msgid "argument %d of %s must be of mode TEXT" +#~ msgstr "Ç ðáñÜìåôñïò óôï <%s> ðñÝðåé íá åßíáé Ýíáò áðëüò ÷áñáêôÞñáò" + +#, fuzzy +#~ msgid "argument %d must be referable" +#~ msgstr "Ç ðáñÜìåôñïò óôï <%s> ðñÝðåé íá åßíáé Ýíáò áðëüò ÷áñáêôÞñáò" + +#, fuzzy +#~ msgid "too few arguments for this format string" +#~ msgstr "Ý÷ïõí ðáñáëçöèåß ïñßóìáôá" + +#, fuzzy +#~ msgid "internal error in check_format_string" +#~ msgstr "åóùôåñéêü óöÜëìá óôï %s, ãñáììÞ %u" + +# src/recode.c:171 +#, fuzzy +#~ msgid "no padding character (offset %d)" +#~ msgstr "ÊáíÝíáò ÷áñáêôÞñáò äåí ìåôáôñÝðåôáé óå %3d" + +#, fuzzy +#~ msgid "too many arguments for this format string" +#~ msgstr "ðÜñá ðïëëÜ ïñßóìáôá óå áõôü ôï áëöáñéèìçôéêü ìïñöÞò" + +#, fuzzy +#~ msgid "missing index expression" +#~ msgstr "ðáñÜëçøç ïñßóìáôïò áñ÷åßïõ" + +#, fuzzy +#~ msgid "too few arguments in call to `readtext'" +#~ msgstr "ðïëý ëßãá ïñßóìáôá" + +#, fuzzy +#~ msgid "non-constant expression" +#~ msgstr "Áäõíáìßá ðñïóðÝëáóçò ôïõ áñ÷åßïõ ôçò áëëáãÞò" + +#, fuzzy +#~ msgid "invalid C'xx' " +#~ msgstr "ìç Ýãêõñç ìåôáôüðéóç UTC" + +#, fuzzy +#~ msgid "unrecognized compiler directive" +#~ msgstr "ìç áíáãíùñßóçìç åðéëïãÞ `-%c'" + +#, fuzzy +#~ msgid "unrecognized compiler directive `%s'" +#~ msgstr "ìç áíáãíùñßóçìç åðéëïãÞ `-%c'" + +#, fuzzy +#~ msgid "invalid control sequence" +#~ msgstr "ìç Ýãêõñï üíïìá ìÞíá" + +#, fuzzy +#~ msgid "unterminated string literal" +#~ msgstr "ìç ôåñìáôéæüìåío áëöáñéèìçôéêü" + +#, fuzzy +#~ msgid "invalid number format `%s'" +#~ msgstr "ìç Ýãêõñïò áñéèìüò áðü óôÞëåò: `%s'" + +#, fuzzy +#~ msgid "can't find %s" +#~ msgstr "Äåí åßíáé äõíáôüí íá åêôåëåóôåß ôï %s" + +#, fuzzy +#~ msgid "invalid `%c' character in name" +#~ msgstr "Ìç Ýãêõñïò ÷áñáêôÞñáò ïíüìáôïò êëÜóçò" + +#, fuzzy +#~ msgid "loop identifier undeclared" +#~ msgstr "áíáìåíüôáí óôáèåñÜ Þ ðñïóäéïñéóôÞò" + +#, fuzzy +#~ msgid "BY expression is negative or zero" +#~ msgstr "ËÜèïò Ýêöñáóç óôçí áðïôßìçóç: %s" + +#, fuzzy +#~ msgid "start label '%s' does not match end label '%s'" +#~ msgstr "ôï áñ÷åßï äåäïìÝíùí ðñïößë `%s' äåí ôáéñéÜæåé ìå ôï äéáìïéñáæüìåíï áíôéêåßìåíï `%s'" + +#, fuzzy +#~ msgid "expected a name here" +#~ msgstr "%s: áíáìåíüôáí áñéèìçôéêÞ ôéìÞ." + +#, fuzzy +#~ msgid "expected a name string here" +#~ msgstr "%s: áíáìåíüôáí áñéèìçôéêÞ ôéìÞ." + +#, fuzzy +#~ msgid "missing defining occurrence" +#~ msgstr "Ý÷åé ðáñáëçöèåß ôï áñ÷åßï ðñïïñéóìïý" + +#, fuzzy +#~ msgid "missing '(' in exception list" +#~ msgstr "Ý÷åé ðáñáëçöèåß ôï áñ÷åßï ðñïïñéóìïý" + +#, fuzzy +#~ msgid "syntax error in exception list" +#~ msgstr "óõíôáêôéêü óöÜëìá óôï ïñéóìü ôïõ %s: %s" + +#, fuzzy +#~ msgid "empty ON-condition" +#~ msgstr "Åðåßãïõóá êáôÜóôáóç åéóüäïõ/åîüäïõ" + +#, fuzzy +#~ msgid "expected another rename clause" +#~ msgstr "%s: áíáìåíüôáí áñéèìçôéêÞ ôéìÞ." + +#, fuzzy +#~ msgid "syntax error while parsing signal definition statement" +#~ msgstr "óõíôáêôéêü óöÜëìá óôï ïñéóìü ôïõ %s: %s" + +#, fuzzy +#~ msgid "expression is not an action" +#~ msgstr "ËÜèïò Ýêöñáóç óôçí áðïôßìçóç: %s" + +#, fuzzy +#~ msgid "syntax error in action" +#~ msgstr "óõíôáêôéêü óöÜëìá óôïí êáèïñéóìü óåéñÜò" + +#, fuzzy +#~ msgid "bad tuple field name list" +#~ msgstr "ìç Ýãêõñï byte Þ ëßóôá ðåäßùí" + +#, fuzzy +#~ msgid "invalid syntax for label in tuple" +#~ msgstr "ìç Ýãêõñï byte Þ ëßóôá ðåäßùí" + +#, fuzzy +#~ msgid "missing field name" +#~ msgstr "ðáñÜëçøç ïñßóìáôïò áñ÷åßïõ" + +#, fuzzy +#~ msgid "missing field" +#~ msgstr "Ý÷åé ðáñáëçöèåß ç ëßóôá ìå ôá ðåäßá" + +#, fuzzy +#~ msgid "VARYING bit-strings not implemented" +#~ msgstr "Ç ëåéôïõñãßá äåí Ý÷åé õëïðïéçèåß" + +#, fuzzy +#~ msgid "SIGNAL is not a valid mode" +#~ msgstr "ìç Ýãêõñï äéêáßùìá" + +#, fuzzy +#~ msgid "syntax error - missing mode" +#~ msgstr "óõíôáêôéêü óöÜëìá óôïí ïñéóìïý locale ìçíýìáôïò" + +#~ msgid " `%s'" +#~ msgstr " `%s'" + +#, fuzzy +#~ msgid "undeclared identifier `%s'" +#~ msgstr "ìç Ýãêõñïò äçëùôÞò ðåäßïõ: `%s'" + +#, fuzzy +#~ msgid "too many arguments to process `%s'" +#~ msgstr "ðÜñá ðïëëÜ ïñßóìáôá" + +#, fuzzy +#~ msgid "too many arguments to process" +#~ msgstr "ðÜñá ðïëëÜ ïñßóìáôá" + +#, fuzzy +#~ msgid "too few arguments to process `%s'" +#~ msgstr "ðïëý ëßãá ïñßóìáôá" + +#, fuzzy +#~ msgid "too few arguments to process" +#~ msgstr "ðïëý ëßãá ïñßóìáôá" + +#, fuzzy +#~ msgid "GEN_INST parameter 2 must be an integer mode" +#~ msgstr "ç ôéìÞ ãéá ôï %s ðñÝðåé íá åßíáé áêÝñáéïò" + +#, fuzzy +#~ msgid "%s is not a declared process" +#~ msgstr "ôï `%s' äåí åßíáé êáíïíéêü áñ÷åßï" + +#, fuzzy +#~ msgid " and no default priority was set." +#~ msgstr "Äåí åßíáé äõíáôüí íá âñåèåß ç ðñïôåñáéüôçôá." + +#, fuzzy +#~ msgid " and no destination process specified" +#~ msgstr "Áðáéôåßôáé äéåýèõíóç ðñïïñéóìïý" + +#, fuzzy +#~ msgid "slice length out-of-range" +#~ msgstr "ó÷åôéêÞ èÝóç áñ÷åßïõ åßíáé åêôüò ïñßùí" + +#, fuzzy +#~ msgid "too many index expressions" +#~ msgstr "õðåñâïëéêÜ ðïëëÜ äåõôåñüëåðôá áíáðÞäçóçò" + +#, fuzzy +#~ msgid "cannot convert to float" +#~ msgstr "áäýíáôç ç ìåôáôñïðÞ ôïõ U+%04X óôï ôïðéêü óýíïëï ÷áñáêôÞñùí" + +#, fuzzy +#~ msgid "cannot convert float to this mode" +#~ msgstr "yp_update: áäõíáìßá ìåôáôñïðÞò ïíüìáôïò óõóôÞìáôïò óå üíïìá äéêôýïõ\n" + +#, fuzzy +#~ msgid "internal error in chill_root_resulting_mode" +#~ msgstr "åóùôåñéêü óöÜëìá óôï %s, ãñáììÞ %u" + +#, fuzzy +#~ msgid "cannot process BIN (>32)" +#~ msgstr "Äåí åßíáé äõíáôüí íá âñåèåß ï ôýðïò ôïõ åðåîåñãáóôÞ." + +#, fuzzy +#~ msgid "negative string length" +#~ msgstr "åëÜ÷éóôï ìÝãåèïò áëöáñéèìçôéêïý" + +#, fuzzy +#~ msgid "floating point ranges" +#~ msgstr "Ç ðáñÜìåôñïò êéíçôÞò õðïäéáóôïëÞò äåí åßíáé Ýãêõñç: %s" + +#, fuzzy +#~ msgid "starting word in POS must be an integer constant" +#~ msgstr "ç ôéìÞ ãéá ôï %s ðñÝðåé íá åßíáé áêÝñáéïò" + +#, fuzzy +#~ msgid "length in POS must be an integer constant" +#~ msgstr "ç ôéìÞ ãéá ôï %s ðñÝðåé íá åßíáé áêÝñáéïò" + +#, fuzzy +#~ msgid "end bit in POS must be an integer constant" +#~ msgstr "ç ôéìÞ ãéá ôï %s ðñÝðåé íá åßíáé áêÝñáéïò" + +#, fuzzy +#~ msgid "invalid parameterized type" +#~ msgstr "%s: ìç Ýãêõñï åßäïò áñ÷åßïõ" + +# src/main.c:659 +#, fuzzy +#~ msgid "ambiguous request for method pointer `%s'" +#~ msgstr "ÁóáöÞò óõìâïëïóåéñÜ `%s'" + +#, fuzzy +#~ msgid "invalid use of %D" +#~ msgstr "ìç Ýãêõñïò ÷ñÞóôçò" + +#, fuzzy +#~ msgid "internal error #%d" +#~ msgstr "Åóùôåñéêü óöÜëìá NIS" + +#, fuzzy +#~ msgid "can't to open %s" +#~ msgstr "áäõíáìßá áíïßãìáôïò ôïõ `%s'" diff --git a/libcpp/po/es.po b/libcpp/po/es.po new file mode 100644 index 0000000..f027364 --- /dev/null +++ b/libcpp/po/es.po @@ -0,0 +1,909 @@ +# Mensajes en español para cpplib-4.3-b20071109 +# Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +# Cristian Othón Martínez Vera , 2001, 2002, 2003, 2004, 2005, 2006, 2007. +# +msgid "" +msgstr "" +"Project-Id-Version: cpplib-4.3-b20071109\n" +"Report-Msgid-Bugs-To: http://gcc.gnu.org/bugs.html\n" +"POT-Creation-Date: 2007-11-08 21:08+0000\n" +"PO-Revision-Date: 2007-11-13 19:48-0600\n" +"Last-Translator: Cristian Othón Martínez Vera \n" +"Language-Team: Spanish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" + +#: charset.c:654 +#, c-format +msgid "conversion from %s to %s not supported by iconv" +msgstr "la conversión de %s a %s no está soportada por iconv" + +#: charset.c:657 +msgid "iconv_open" +msgstr "iconv_open" + +#: charset.c:665 +#, c-format +msgid "no iconv implementation, cannot convert from %s to %s" +msgstr "no hay una implementación de iconv, no se puede convertir de %s a %s" + +#: charset.c:742 +#, c-format +msgid "character 0x%lx is not in the basic source character set\n" +msgstr "el carácter 0x%lx no está en el conjunto básico de caracteres fuente\n" + +#: charset.c:759 charset.c:1352 +msgid "converting to execution character set" +msgstr "convirtiendo al conjunto de caracteres de ejecución" + +#: charset.c:765 +#, c-format +msgid "character 0x%lx is not unibyte in execution character set" +msgstr "el carácter 0x%lx no es unibyte en el conjunto de caracteres de ejecución" + +#: charset.c:889 +#, c-format +msgid "Character %x might not be NFKC" +msgstr "El carácter %x puede no ser NFKC" + +#: charset.c:949 +msgid "universal character names are only valid in C++ and C99" +msgstr "los nombres universales de carácter sólo son válidos en C++ y C99" + +#: charset.c:952 +#, c-format +msgid "the meaning of '\\%c' is different in traditional C" +msgstr "el significado de '\\%c' es diferente en C tradicional" + +#: charset.c:961 +msgid "In _cpp_valid_ucn but not a UCN" +msgstr "En _cpp_valid_unc pero no es un UCN" + +#: charset.c:986 +#, c-format +msgid "incomplete universal character name %.*s" +msgstr "nombre universal de carácter %.*s incompleto" + +#: charset.c:998 +#, c-format +msgid "%.*s is not a valid universal character" +msgstr "%.*s no es un carácter universal válido" + +#: charset.c:1008 lex.c:484 +msgid "'$' in identifier or number" +msgstr "'$' en el identificador o número" + +#: charset.c:1018 +#, c-format +msgid "universal character %.*s is not valid in an identifier" +msgstr "el carácter universal %.*s no es válido en un identificador" + +#: charset.c:1022 +#, c-format +msgid "universal character %.*s is not valid at the start of an identifier" +msgstr "el carácter universal %.*s no es válido al inicio de un identificador" + +#: charset.c:1056 charset.c:1571 +msgid "converting UCN to source character set" +msgstr "convirtiendo un NUC al conjunto de caracteres fuente" + +#: charset.c:1060 +msgid "converting UCN to execution character set" +msgstr "convirtiendo un NUC al conjunto de caracteres de ejecución" + +#: charset.c:1132 +msgid "the meaning of '\\x' is different in traditional C" +msgstr "el significado de '\\x' es diferente en C tradicional" + +#: charset.c:1149 +msgid "\\x used with no following hex digits" +msgstr "se usó \\x sin dígitos hexadecimales a continuación" + +#: charset.c:1156 +msgid "hex escape sequence out of range" +msgstr "secuencia de escape hexadecimal fuera de rango" + +#: charset.c:1195 +msgid "octal escape sequence out of range" +msgstr "secuencia de escape octal fuera de rango" + +#: charset.c:1263 +msgid "the meaning of '\\a' is different in traditional C" +msgstr "el significado de '\\a' es diferente en C tradicional" + +#: charset.c:1270 +#, c-format +msgid "non-ISO-standard escape sequence, '\\%c'" +msgstr "secuencia de escape que no es estándard ISO, '\\%c'" + +#: charset.c:1278 +#, c-format +msgid "unknown escape sequence '\\%c'" +msgstr "secuencia de escape desconocida, '\\%c'" + +#: charset.c:1286 +#, c-format +msgid "unknown escape sequence: '\\%s'" +msgstr "secuencia de escape desconocida: '\\%s'" + +#: charset.c:1293 +msgid "converting escape sequence to execution character set" +msgstr "convirtiendo una secuencia de escape al conjunto de caracteres de ejecución" + +#: charset.c:1415 charset.c:1478 +msgid "character constant too long for its type" +msgstr "constante de carácter demasiado grande para su tipo" + +#: charset.c:1418 +msgid "multi-character character constant" +msgstr "constante de carácter con múltiples caracteres" + +#: charset.c:1510 +msgid "empty character constant" +msgstr "constante de carácter vacía" + +#: charset.c:1612 +#, c-format +msgid "failure to convert %s to %s" +msgstr "no se puede convertir %s a %s" + +#: directives.c:215 directives.c:241 +#, c-format +msgid "extra tokens at end of #%s directive" +msgstr "elementos extra al final de la directiva #%s" + +#: directives.c:344 +#, c-format +msgid "#%s is a GCC extension" +msgstr "#%s es una extensión de GCC" + +#: directives.c:356 +msgid "suggest not using #elif in traditional C" +msgstr "se sugiere no usar #elif en C tradicional" + +#: directives.c:359 +#, c-format +msgid "traditional C ignores #%s with the # indented" +msgstr "C tradicional ignora #%s con el # indentado" + +#: directives.c:363 +#, c-format +msgid "suggest hiding #%s from traditional C with an indented #" +msgstr "se sugiere ocultar #%s de C tradicional con un # indentado" + +#: directives.c:389 +msgid "embedding a directive within macro arguments is not portable" +msgstr "imbuir una directiva dentro de los argumentos de una macro no es transportable" + +#: directives.c:409 +msgid "style of line directive is a GCC extension" +msgstr "la directiva de estilo de línea es una extensión de GCC" + +#: directives.c:464 +#, c-format +msgid "invalid preprocessing directive #%s" +msgstr "directiva de preprocesamiento #%s inválida" + +#: directives.c:532 +msgid "\"defined\" cannot be used as a macro name" +msgstr "\"defined\" no se puede usar como un nombre de macro" + +#: directives.c:538 +#, c-format +msgid "\"%s\" cannot be used as a macro name as it is an operator in C++" +msgstr "no se puede usar \"%s\" como un nombre de macro porque es un operador en C++" + +#: directives.c:541 +#, c-format +msgid "no macro name given in #%s directive" +msgstr "no se dio un nombre de macro en la directiva #%s" + +#: directives.c:544 +msgid "macro names must be identifiers" +msgstr "los nombres de macro deben ser identificadores" + +#: directives.c:585 +#, c-format +msgid "undefining \"%s\"" +msgstr "borrando la definición de \"%s\"" + +#: directives.c:640 +msgid "missing terminating > character" +msgstr "falta el carácter de terminación >" + +#: directives.c:695 +#, c-format +msgid "#%s expects \"FILENAME\" or " +msgstr "#%s espera \"NOMBRE_ARCHIVO\" ó " + +#: directives.c:739 +#, c-format +msgid "empty filename in #%s" +msgstr "nombre de fichero vacío en #%s" + +#: directives.c:749 +msgid "#include nested too deeply" +msgstr "#include anidado con demasiada profundidad" + +#: directives.c:790 +msgid "#include_next in primary source file" +msgstr "#include_next en fichero primario de código fuente" + +#: directives.c:816 +#, c-format +msgid "invalid flag \"%s\" in line directive" +msgstr "indicador \"%s\" inválido en la línea de la directiva" + +#: directives.c:868 +#, c-format +msgid "\"%s\" after #line is not a positive integer" +msgstr "\"%s\" después de #line no es un entero positivo" + +#: directives.c:874 +msgid "line number out of range" +msgstr "número de línea fuera de rango" + +#: directives.c:887 directives.c:964 +#, c-format +msgid "\"%s\" is not a valid filename" +msgstr "\"%s\" no es un nombre de fichero válido" + +#: directives.c:924 +#, c-format +msgid "\"%s\" after # is not a positive integer" +msgstr "\"%s\" después de # no es un entero positivo" + +#: directives.c:1026 +#, c-format +msgid "invalid #%s directive" +msgstr "directiva #%s inválida" + +#: directives.c:1089 +#, c-format +msgid "registering pragmas in namespace \"%s\" with mismatched name expansion" +msgstr "registrando pragmas en el espaco de nombres \"%s\" con una expansión de nombre que no coincide" + +#: directives.c:1098 +#, c-format +msgid "registering pragma \"%s\" with name expansion and no namespace" +msgstr "registrando el pragma \"%s\" con expansión de nombre y sin un espacio de nombres" + +#: directives.c:1116 +#, c-format +msgid "registering \"%s\" as both a pragma and a pragma namespace" +msgstr "registrando \"%s\" como un pragma y como un espacio de nombres de pragma" + +#: directives.c:1119 +#, c-format +msgid "#pragma %s %s is already registered" +msgstr "#pragma %s %s ya está registrado" + +#: directives.c:1122 +#, c-format +msgid "#pragma %s is already registered" +msgstr "#pragma %s ya está registrado" + +#: directives.c:1152 +msgid "registering pragma with NULL handler" +msgstr "registrando un pragma con manejador NULL" + +#: directives.c:1362 +msgid "#pragma once in main file" +msgstr "#pragma una vez en el fichero principal" + +#: directives.c:1385 +msgid "invalid #pragma GCC poison directive" +msgstr "directiva #pragma de GCC envenenada inválida" + +#: directives.c:1394 +#, c-format +msgid "poisoning existing macro \"%s\"" +msgstr "envenenando la macro existente \"%s\"" + +#: directives.c:1413 +msgid "#pragma system_header ignored outside include file" +msgstr "#pragma system_header ignorado fuera del fichero a incluir" + +#: directives.c:1437 +#, c-format +msgid "cannot find source file %s" +msgstr "no se puede encontrar el fichero fuente %s" + +#: directives.c:1441 +#, c-format +msgid "current file is older than %s" +msgstr "el fichero actual es más antiguo que %s" + +#: directives.c:1620 +msgid "_Pragma takes a parenthesized string literal" +msgstr "_Pragma lleva una cadena literal entre paréntesis" + +#: directives.c:1693 +msgid "#else without #if" +msgstr "#else sin #if" + +#: directives.c:1698 +msgid "#else after #else" +msgstr "#else después de #else" + +#: directives.c:1700 directives.c:1733 +msgid "the conditional began here" +msgstr "el condicional empezó aquí" + +#: directives.c:1726 +msgid "#elif without #if" +msgstr "#elif sin #if" + +#: directives.c:1731 +msgid "#elif after #else" +msgstr "#elif después de #else" + +#: directives.c:1761 +msgid "#endif without #if" +msgstr "#endif sin #if" + +#: directives.c:1838 +msgid "missing '(' after predicate" +msgstr "falta '(' antes del predicado" + +#: directives.c:1853 +msgid "missing ')' to complete answer" +msgstr "falta ')' para completar la respuesta" + +#: directives.c:1873 +msgid "predicate's answer is empty" +msgstr "el predicado de la respuesta está vacío" + +#: directives.c:1900 +msgid "assertion without predicate" +msgstr "afirmación sin predicado" + +#: directives.c:1902 +msgid "predicate must be an identifier" +msgstr "el predicado debe ser un identificador" + +#: directives.c:1988 +#, c-format +msgid "\"%s\" re-asserted" +msgstr "\"%s\" reafirmado" + +#: directives.c:2271 +#, c-format +msgid "unterminated #%s" +msgstr "#%s sin terminar" + +#: directives-only.c:221 lex.c:1016 traditional.c:162 +msgid "unterminated comment" +msgstr "comentario sin terminar" + +#: errors.c:118 +msgid "warning: " +msgstr "aviso: " + +#: errors.c:120 +msgid "internal error: " +msgstr "error interno: " + +#: errors.c:122 +msgid "error: " +msgstr "error: " + +#: errors.c:186 +msgid "stdout" +msgstr "salida estándard" + +#: errors.c:188 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: expr.c:261 +msgid "too many decimal points in number" +msgstr "demasiados puntos decimales en el número" + +#: expr.c:290 expr.c:365 +msgid "fixed-point constants are a GCC extension" +msgstr "las constantes de coma fija son una extensión GCC" + +#: expr.c:303 +#, c-format +msgid "invalid digit \"%c\" in binary constant" +msgstr "dígito \"%c\" inválido en la constante binaria" + +#: expr.c:305 +#, c-format +msgid "invalid digit \"%c\" in octal constant" +msgstr "dígito \"%c\" inválido en la constante octal" + +#: expr.c:313 +msgid "invalid prefix \"0b\" for floating constant" +msgstr "prefijo \"0b\" inválido en la constante de coma flotante" + +#: expr.c:319 +msgid "use of C99 hexadecimal floating constant" +msgstr "uso de una constante de coma flotante hexadecimal C99" + +#: expr.c:328 +msgid "exponent has no digits" +msgstr "el exponente no tiene dígitos" + +#: expr.c:335 +msgid "hexadecimal floating constants require an exponent" +msgstr "las constantes de coma flotante hexadecimal requieren un exponente" + +#: expr.c:341 +#, c-format +msgid "invalid suffix \"%.*s\" on floating constant" +msgstr "sufijo \"%.*s\" inválido en la constante de coma flotante" + +#: expr.c:351 expr.c:393 +#, c-format +msgid "traditional C rejects the \"%.*s\" suffix" +msgstr "C tradicional rechaza el sufijo \"%.*s\"" + +#: expr.c:358 +#, c-format +msgid "invalid suffix \"%.*s\" with hexadecimal floating constant" +msgstr "sufijo \"%.*s\" inválido en la constante de coma flotante hexadecimal" + +#: expr.c:369 +msgid "decimal float constants are a GCC extension" +msgstr "las constantes de coma flotante decimal son una extensión GCC" + +#: expr.c:379 +#, c-format +msgid "invalid suffix \"%.*s\" on integer constant" +msgstr "sufijo \"%.*s\" inválido en la constante entera" + +#: expr.c:401 +msgid "use of C99 long long integer constant" +msgstr "uso de una constante entera long long C99" + +#: expr.c:409 +msgid "imaginary constants are a GCC extension" +msgstr "las constantes imaginarias son una extensión GCC" + +#: expr.c:412 +msgid "binary constants are a GCC extension" +msgstr "las constantes binarias son una extensión GCC" + +#: expr.c:505 +msgid "integer constant is too large for its type" +msgstr "la constante entera es demasiado grande para su tipo" + +#: expr.c:517 +msgid "integer constant is so large that it is unsigned" +msgstr "la constante entera es tan grande que es unsigned" + +#: expr.c:612 +msgid "missing ')' after \"defined\"" +msgstr "falta `)' después de \"defined\"" + +#: expr.c:619 +msgid "operator \"defined\" requires an identifier" +msgstr "el operador \"defined\" requiere un identificador" + +#: expr.c:627 +#, c-format +msgid "(\"%s\" is an alternative token for \"%s\" in C++)" +msgstr "(\"%s\" es un elemento alternativo para \"%s\" en C++)" + +#: expr.c:637 +msgid "this use of \"defined\" may not be portable" +msgstr "este uso de \"defined\" puede no ser transportable" + +#: expr.c:676 +msgid "floating constant in preprocessor expression" +msgstr "constante de coma flotante en una expresión del preprocesador" + +#: expr.c:682 +msgid "imaginary number in preprocessor expression" +msgstr "número imaginario en una expresión del preprocesador" + +#: expr.c:727 +#, c-format +msgid "\"%s\" is not defined" +msgstr "\"%s\" no está definido" + +#: expr.c:855 expr.c:884 +#, c-format +msgid "missing binary operator before token \"%s\"" +msgstr "falta un operador binario antes del elemento \"%s\"" + +#: expr.c:875 +#, c-format +msgid "token \"%s\" is not valid in preprocessor expressions" +msgstr "el elemento \"%s\" no es válido en las expresiones del preprocesador" + +#: expr.c:892 +msgid "missing expression between '(' and ')'" +msgstr "falta una expresión entre '(' y ')'" + +#: expr.c:895 +msgid "#if with no expression" +msgstr "#if sin expresión" + +#: expr.c:898 +#, c-format +msgid "operator '%s' has no right operand" +msgstr "el operador '%s' no tiene operando derecho" + +#: expr.c:903 +#, c-format +msgid "operator '%s' has no left operand" +msgstr "el operador `%s' no tiene operando izquierdo" + +#: expr.c:929 +msgid " ':' without preceding '?'" +msgstr " ':' sin una '?' precedente" + +#: expr.c:956 +msgid "unbalanced stack in #if" +msgstr "pila desbalanceada en #if" + +#: expr.c:975 +#, c-format +msgid "impossible operator '%u'" +msgstr "operador '%u' imposible" + +#: expr.c:1065 +msgid "missing ')' in expression" +msgstr "falta un ')' en la expresión" + +#: expr.c:1086 +msgid "'?' without following ':'" +msgstr "'?' sin ':' a continuación" + +#: expr.c:1096 +msgid "integer overflow in preprocessor expression" +msgstr "desbordamiento entero en expresión del preprocesador" + +#: expr.c:1101 +msgid "missing '(' in expression" +msgstr "falta un '(' en la expresión" + +#: expr.c:1133 +#, c-format +msgid "the left operand of \"%s\" changes sign when promoted" +msgstr "el operando izquierdo de \"%s\" cambia el signo cuando es promovido" + +#: expr.c:1138 +#, c-format +msgid "the right operand of \"%s\" changes sign when promoted" +msgstr "el operando derecho de \"%s\" cambia el signo cuando es promovido" + +#: expr.c:1397 +msgid "traditional C rejects the unary plus operator" +msgstr "C tradicional rechaza el operador unario mas" + +#: expr.c:1480 +msgid "comma operator in operand of #if" +msgstr "operador coma en operando de #if" + +#: expr.c:1612 +msgid "division by zero in #if" +msgstr "división por cero en #if" + +#: files.c:442 +msgid "NULL directory in find_file" +msgstr "directorio NULL en find_file" + +#: files.c:480 +msgid "one or more PCH files were found, but they were invalid" +msgstr "se encontró uno o más ficheros PCH, pero eran inválidos" + +#: files.c:483 +msgid "use -Winvalid-pch for more information" +msgstr "use -Winvalid-pch para más información" + +#: files.c:570 +#, c-format +msgid "%s is a block device" +msgstr "%s es un dispositivo de bloques" + +#: files.c:587 +#, c-format +msgid "%s is too large" +msgstr "%s es demasiado grande" + +#: files.c:622 +#, c-format +msgid "%s is shorter than expected" +msgstr "%s es más corto de lo esperado" + +#: files.c:852 +#, c-format +msgid "no include path in which to search for %s" +msgstr "no hay ruta de inclusión en la cual se pueda buscar %s" + +#: files.c:1157 +msgid "Multiple include guards may be useful for:\n" +msgstr "Guardias múltiples de include pueden ser útiles para:\n" + +#: init.c:426 +msgid "cppchar_t must be an unsigned type" +msgstr "cppchar_t debe ser de un tipo unsigned" + +#: init.c:430 +#, c-format +msgid "preprocessor arithmetic has maximum precision of %lu bits; target requires %lu bits" +msgstr "la aritmética del preprocesador tiene una precisión máxima de %lu bits; el objetivo requiere de %lu bits" + +#: init.c:437 +msgid "CPP arithmetic must be at least as precise as a target int" +msgstr "la aritmética de CPP debe se al menos tan precisa como un int del objetivo" + +#: init.c:440 +msgid "target char is less than 8 bits wide" +msgstr "el char del objetivo tiene menos de 8 bits de ancho" + +#: init.c:444 +msgid "target wchar_t is narrower than target char" +msgstr "el wchar_t del objetivo es más estrecho que el char del objetivo" + +#: init.c:448 +msgid "target int is narrower than target char" +msgstr "el int del objetivo es más estrecho que el char del objetivo" + +#: init.c:453 +msgid "CPP half-integer narrower than CPP character" +msgstr "el medio-entero de CPP es más estrecho que el carácter de CPP" + +#: init.c:457 +#, c-format +msgid "CPP on this host cannot handle wide character constants over %lu bits, but the target requires %lu bits" +msgstr "CPP no puede manejar constantes de carácter anchas más allá de %lu bits en este objetivo, pero el objetivo requiere %lu bits" + +#: lex.c:283 +msgid "backslash and newline separated by space" +msgstr "caracteres de barra invertida y fin de línea separados por espacio" + +#: lex.c:288 +msgid "backslash-newline at end of file" +msgstr "no hay caractér de barra invertida o fin de línea al final del fichero" + +#: lex.c:303 +#, c-format +msgid "trigraph ??%c converted to %c" +msgstr "trigrafo ??%c convertido a %c" + +#: lex.c:310 +#, c-format +msgid "trigraph ??%c ignored, use -trigraphs to enable" +msgstr "se ignora el trigrafo ??%c, use -trigraphs para reconocerlo" + +#: lex.c:356 +msgid "\"/*\" within comment" +msgstr "\"/*\" dentro de un comentario" + +#: lex.c:414 +#, c-format +msgid "%s in preprocessing directive" +msgstr "%s en la directiva de preprocesamiento" + +#: lex.c:423 +msgid "null character(s) ignored" +msgstr "caracter(es) nulo(s) ignorados" + +#: lex.c:460 +#, c-format +msgid "`%.*s' is not in NFKC" +msgstr "`%.*s' no está en NFKC" + +#: lex.c:463 +#, c-format +msgid "`%.*s' is not in NFC" +msgstr "`%.*s' no está en NFC" + +#: lex.c:551 +#, c-format +msgid "attempt to use poisoned \"%s\"" +msgstr "intento de usar \"%s\" envenenado" + +#: lex.c:559 +msgid "__VA_ARGS__ can only appear in the expansion of a C99 variadic macro" +msgstr "__VA_ARGS__ solamente puede aparecer en la expansión de una macro variadic C99" + +#: lex.c:659 +msgid "null character(s) preserved in literal" +msgstr "caracter(es) nulo(s) preservados en la literal" + +#: lex.c:662 +#, c-format +msgid "missing terminating %c character" +msgstr "falta el carácter de terminación %c" + +#: lex.c:1027 +msgid "C++ style comments are not allowed in ISO C90" +msgstr "los comentarios de estilo C++ no se permiten en ISO C90" + +#: lex.c:1029 +msgid "(this will be reported only once per input file)" +msgstr "(esto se reportará solamente una vez por cada fichero de entrada)" + +#: lex.c:1034 +msgid "multi-line comment" +msgstr "comentario en múltiples líneas" + +#: lex.c:1347 +#, c-format +msgid "unspellable token %s" +msgstr "elemento %s impronunciable" + +#: line-map.c:320 +#, c-format +msgid "In file included from %s:%u" +msgstr "En el fichero incluído de %s:%u" + +#: line-map.c:338 +#, c-format +msgid "" +",\n" +" from %s:%u" +msgstr "" +",\n" +" de %s:%u" + +#: macro.c:84 +#, c-format +msgid "macro \"%s\" is not used" +msgstr "la macro \"%s\" no se utiliza" + +#: macro.c:123 macro.c:319 +#, c-format +msgid "invalid built-in macro \"%s\"" +msgstr "macro interna \"%s\" inválida" + +#: macro.c:157 +msgid "could not determine file timestamp" +msgstr "no se puede determinar la marca de fecha del fichero" + +#: macro.c:254 +msgid "could not determine date and time" +msgstr "no se puede determinar la fecha y la hora" + +#: macro.c:270 +msgid "__COUNTER__ expanded inside directive with -fdirectives-only" +msgstr "se expande __COUNTER__ dentro de una directiva con -fdirectives-only" + +#: macro.c:423 +msgid "invalid string literal, ignoring final '\\'" +msgstr "cadena literal inválida, se ignora el '\\' final" + +#: macro.c:483 +#, c-format +msgid "pasting \"%s\" and \"%s\" does not give a valid preprocessing token" +msgstr "pegar \"%s\" y \"%s\" no da un elemento válido de preprocesamiento" + +#: macro.c:558 +msgid "ISO C99 requires rest arguments to be used" +msgstr "ISO C99 requiere que el resto de los argumentos sea usado" + +#: macro.c:563 +#, c-format +msgid "macro \"%s\" requires %u arguments, but only %u given" +msgstr "la macro \"%s\" requiere %u argumentos, pero solo se proporcionan %u" + +#: macro.c:568 +#, c-format +msgid "macro \"%s\" passed %u arguments, but takes just %u" +msgstr "la macro \"%s\" recibió %u argumentos, pero solamente tomó %u" + +#: macro.c:679 traditional.c:680 +#, c-format +msgid "unterminated argument list invoking macro \"%s\"" +msgstr "lista de argumentos sin terminar al invocar la macro \"%s\"" + +#: macro.c:782 +#, c-format +msgid "function-like macro \"%s\" must be used with arguments in traditional C" +msgstr "la función de macro \"%s\" se debe usar con argumentos en C tradicional" + +#: macro.c:1325 +#, c-format +msgid "duplicate macro parameter \"%s\"" +msgstr "parámetro de macro \"%s\" duplicado" + +#: macro.c:1371 +#, c-format +msgid "\"%s\" may not appear in macro parameter list" +msgstr "\"%s\" podría faltar en la lista de parámetro de macro" + +#: macro.c:1379 +msgid "macro parameters must be comma-separated" +msgstr "los parámetros de macro deben ser separados por comas" + +#: macro.c:1396 +msgid "parameter name missing" +msgstr "falta el nombre del parámetro" + +#: macro.c:1413 +msgid "anonymous variadic macros were introduced in C99" +msgstr "los macros variadic anónimos se introdujeron en C99" + +#: macro.c:1418 +msgid "ISO C does not permit named variadic macros" +msgstr "ISO C no permite macros variadic nombrados" + +#: macro.c:1427 +msgid "missing ')' in macro parameter list" +msgstr "falta paréntesis derecho en la lista de parámetros de macro" + +#: macro.c:1476 +msgid "'##' cannot appear at either end of a macro expansion" +msgstr "'##' no puede aparece en o al final de una expansión de macro" + +#: macro.c:1510 +msgid "ISO C99 requires whitespace after the macro name" +msgstr "ISO C99 requiere espacios en blanco después del nombre de macro" + +#: macro.c:1534 +msgid "missing whitespace after the macro name" +msgstr "faltan espacios en blanco después del nombre de macro" + +#: macro.c:1564 +msgid "'#' is not followed by a macro parameter" +msgstr "'#' no es seguido por un parámetro de macro" + +#: macro.c:1683 +#, c-format +msgid "\"%s\" redefined" +msgstr "se redefinió \"%s\"" + +#: macro.c:1688 +msgid "this is the location of the previous definition" +msgstr "esta es la ubicación de la definición previa" + +#: macro.c:1738 +#, c-format +msgid "macro argument \"%s\" would be stringified in traditional C" +msgstr "el argumento de macro \"%s\" debería ser convertido a cadena en C tradicional" + +#: macro.c:1761 +#, c-format +msgid "invalid hash type %d in cpp_macro_definition" +msgstr "tipo de hash %d inválido en cpp_macro_definition" + +#: pch.c:84 pch.c:332 pch.c:344 pch.c:362 pch.c:368 pch.c:377 +msgid "while writing precompiled header" +msgstr "al escribir el encabezado precompilado" + +#: pch.c:485 +#, c-format +msgid "%s: not used because `%.*s' not defined" +msgstr "%s: no se usa porque `%.*s' no está definido" + +#: pch.c:497 +#, c-format +msgid "%s: not used because `%.*s' defined as `%s' not `%.*s'" +msgstr "%s: no se usa porque `%.*s' está definido como `%s' no como `%.*s'" + +#: pch.c:538 +#, c-format +msgid "%s: not used because `%s' is defined" +msgstr "%s: no se usa porque `%s' está definido" + +#: pch.c:558 +#, c-format +msgid "%s: not used because `__COUNTER__' is invalid" +msgstr "%s: no se usa porque `__COUNTER__' es inválido" + +#: pch.c:567 pch.c:737 +msgid "while reading precompiled header" +msgstr "al leer el encabezado precompilado" + +#: traditional.c:750 +#, c-format +msgid "detected recursion whilst expanding macro \"%s\"" +msgstr "se detectó recursión al expandir la macro \"%s\"" + +#: traditional.c:917 +msgid "syntax error in macro parameter list" +msgstr "error de sintaxis en la lista de parámetros de macro" + +#~ msgid "no newline at end of file" +#~ msgstr "no hay caractér de fin de línea al final del fichero" + +#~ msgid "unknown escape sequence: '\\%03o'" +#~ msgstr "secuencia de escape desconocida: '\\%03o'" diff --git a/libcpp/po/fr.po b/libcpp/po/fr.po new file mode 100644 index 0000000..313bb89 --- /dev/null +++ b/libcpp/po/fr.po @@ -0,0 +1,19955 @@ +# Messages français pour GNU concernant gcc. +# Copyright © 2001 Free Software Foundation, Inc. +# Michel Robitaille , traducteur depuis/since 1996. +# +# Vocabulaire utilisé +# lvalue = membre gauche +# deprecated = obsolète +# out of range = hors des limites +# range = gamme +# scope = porté, champ +# shadowing = masquer +# embedded PIC = PIC enchâssé +# CPU = processeur +# structure with flexible member +# = structure ayant un membre flexible +# flag = fanion +# forward declaration +# = déclaration anticipée +# token = élément lexical (dans le contexte du parsing) +# to subscript = indicer +# top-level = hors de toute fonction +# member function = fonction membre +# +# Pas traduit: +# thread +# +# J'ai des doutes pour : +# inline = enligne (pas systématiquement) +# oui dans le contexte du langage C par exemple MR +# non autrement ...de manière générale MR +# section attribute attribut de section OK MR +# wide char caractère long ...non mieux caractère large MR +# plus conforme à l'esprit. +# +# ------ +# literals littéral, ou mot composé ? +# msgid "ISO C89 forbids compound literals" +# msgstr "le C89 ISO interdit les mots composés" +# +# symbol table table des symboles ou table de symbole +# command map carte des commandes +# Combiner combinateur +# msgid "" +# ";; Combiner statistics: %d attempts, %d substitutions (%d requiring new space),\n" +# ";; %d successes.\n" +# "\n" +# msgstr "" +# ";; Statistiques du combinateur : %d tentatives, %d substitutions (%d requérant un nouvel espace),\n" +# ";; %d succès.\n" +# "\n" +# +# promote promouvoir +# msgid "the left operand of \"%s\" changes sign when promoted" +# msgstr "L'opérande gauche de « %s » change de signe lors de sa promotion" +# +# include guards ??? +# msgid "Multiple include guards may be useful for:\n" +# msgstr "De multiples balises pour les inclusions peuvent être utiles pour :\n" +# +# +# universal-character-name ??? +# msgid "incomplete universal-character-name" +# msgid "non-hex digit '%c' in universal-character-name" +# msgid "universal-character-name on EBCDIC target" +# +# poisoning empoisonnement +# msgid "poisoning existing macro \"%s\"" +# msgstr "empoisonnement de la macro existente « %s »" +# MR 9-jan 2004: poisoning etc... transformé par corruption corrompu etc.. +# MR 24-mai 2004: poison etc...suite au msg concernant le #pragma once et #pragma poison +# +# Autres règles: +# - j'ai ajouté un adjectif par rapport à l'anglais si le message est +# une phrase avec verbe conjugé. +# - ISO est considéré comme un adjectif dans « C ISO » +# +# Erreurs corrigées: +# librairies, assumer +# +# A faire: +# - s/en ligne/en-ligne/ modifié 9-janv-2004 MR +# - s/en-ligne/enligne/ modifié 18-février-2004 MR pcq expression ou terme enlignage vs inlining +# - hors gamme a été changé pour hors limite ...MR 09-jan-2004 +# - literal +# - chaîne de format => formatage +# - scope +# - supporté est un faux ami +# +# A rapporter upstream: +# <<<<<<<< +# In c-opts.c, begining line 1732, a lot of options are of the kind: +# " -W[no-]trigraphs Warn if trigraphs are encountered\n" +# I guess it would be better to change them all to something like +# " -W[no-]trigraphs Warn [or not] if trigraphs are encountered\n" +# +# +# #: c-opts.c:1759 +# " -MP\t\t\t Generate phony targets for all headers\n" +# you may want to change the \t to spaces, as it is done for the other lines. +# +# #: c-typeck.c:3166 c-typeck.c:4632 c-typeck.c:4648 c-typeck.c:4664 +# #: final.c:3146 final.c:3148 gcc.c:4397 rtl-error.c:122 toplev.c:1694 +# #: config/cris/cris.c:529 cp/typeck.c:4341 java/expr.c:364 java/verify.c:1467 +# #: java/verify.c:1468 java/verify.c:1483 +# #, c-format +# msgid "%s" +# msgstr "%s" +# +# Are you sure you want to translate the messages in cfgrtl.c, or are they +# debugging informations ? +# +# You may want to use ngettext instead of putting (s) in text. +# msgid "null character(s) preserved in literal" +# +# >>>>>>>>> +# +msgid "" +msgstr "" +"Project-Id-Version: GNU cpplib 4.0.0\n" +"Report-Msgid-Bugs-To: http://gcc.gnu.org/bugs.html\n" +"POT-Creation-Date: 2007-11-08 21:08+0000\n" +"PO-Revision-Date: 2005-06-12 08:00-0500\n" +"Last-Translator: Michel Robitaille \n" +"Language-Team: French \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8-bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: charset.c:654 +#, c-format +msgid "conversion from %s to %s not supported by iconv" +msgstr "conversion de %s vers %s n'est pas supporté par iconv" + +#: charset.c:657 +msgid "iconv_open" +msgstr "iconv_open" + +#: charset.c:665 +#, c-format +msgid "no iconv implementation, cannot convert from %s to %s" +msgstr "pas d'implantation iconv, ne peut convertir de %s vers %s" + +#: charset.c:742 +#, c-format +msgid "character 0x%lx is not in the basic source character set\n" +msgstr "caractère 0x%lx n'est pas dans le jeu de caractères de base\n" + +#: charset.c:759 charset.c:1352 +msgid "converting to execution character set" +msgstr "conversion vers un jeu d'exécution de caractères" + +#: charset.c:765 +#, c-format +msgid "character 0x%lx is not unibyte in execution character set" +msgstr "caractère 0x%lx n'est pas unibyte dans le jeu de caractères d'exécution" + +#: charset.c:889 +#, c-format +msgid "Character %x might not be NFKC" +msgstr "" + +#: charset.c:949 +msgid "universal character names are only valid in C++ and C99" +msgstr "noms de caractère universel sont seulement valides en C++ et C89" + +#: charset.c:952 +#, c-format +msgid "the meaning of '\\%c' is different in traditional C" +msgstr "la signification de « \\%c » est différente en C traditionel" + +#: charset.c:961 +msgid "In _cpp_valid_ucn but not a UCN" +msgstr "" + +# FIXME +#: charset.c:986 +#, c-format +msgid "incomplete universal character name %.*s" +msgstr "nom de caractère universel incomplet %.*s" + +#: charset.c:998 +#, c-format +msgid "%.*s is not a valid universal character" +msgstr "%.*s n'est pas un caractère universel valide" + +#: charset.c:1008 lex.c:484 +msgid "'$' in identifier or number" +msgstr "« $ » dans un identificateur ou un nombre" + +#: charset.c:1018 +#, c-format +msgid "universal character %.*s is not valid in an identifier" +msgstr "caractère universel %.*s n'est pas valide dans un identificcateur" + +#: charset.c:1022 +#, c-format +msgid "universal character %.*s is not valid at the start of an identifier" +msgstr "caractère universel %.*s n'est pas valide au début d'un identificcateur" + +#: charset.c:1056 charset.c:1571 +msgid "converting UCN to source character set" +msgstr "conversion UCN vers le jeu source de caractères" + +#: charset.c:1060 +msgid "converting UCN to execution character set" +msgstr "conversion UCN vers le jeu d'exécution de caractères" + +#: charset.c:1132 +msgid "the meaning of '\\x' is different in traditional C" +msgstr "la signification de « \\x » est différente en C traditionel" + +#: charset.c:1149 +msgid "\\x used with no following hex digits" +msgstr "\\x utilisé sans être suivi de chiffres en hexdécimal" + +#: charset.c:1156 +msgid "hex escape sequence out of range" +msgstr "séquence d'échappement hexadécimale hors limite" + +#: charset.c:1195 +msgid "octal escape sequence out of range" +msgstr "séquence d'échappement octale hors limite" + +#: charset.c:1263 +msgid "the meaning of '\\a' is different in traditional C" +msgstr "la signification de « \\a » est différente en C traditionel" + +#: charset.c:1270 +#, c-format +msgid "non-ISO-standard escape sequence, '\\%c'" +msgstr "séquence d'échappement « \\%c » non conforme au standard ISO" + +#: charset.c:1278 +#, c-format +msgid "unknown escape sequence '\\%c'" +msgstr "séquence d'échappement « \\%c » inconnue" + +#: charset.c:1286 +#, fuzzy, c-format +msgid "unknown escape sequence: '\\%s'" +msgstr "séquence d'échappement « \\%c » inconnue" + +#: charset.c:1293 +msgid "converting escape sequence to execution character set" +msgstr "conversion d'une séquence d'échappement vers un jeu d'exécution de caractères" + +#: charset.c:1415 charset.c:1478 +msgid "character constant too long for its type" +msgstr "constante caractère trop longue pour son type" + +#: charset.c:1418 +msgid "multi-character character constant" +msgstr "constante caractère multi-caractères" + +#: charset.c:1510 +msgid "empty character constant" +msgstr "constante caractère vide" + +#: charset.c:1612 +#, c-format +msgid "failure to convert %s to %s" +msgstr "échec de conversion de %s vers %s" + +#: directives.c:215 directives.c:241 +#, c-format +msgid "extra tokens at end of #%s directive" +msgstr "éléments lexicaux superflus à la fin de la directive #%s" + +#: directives.c:344 +#, c-format +msgid "#%s is a GCC extension" +msgstr "#%s est une extension GCC" + +#: directives.c:356 +msgid "suggest not using #elif in traditional C" +msgstr "il est suggéré de ne pas utiliser #elif en C traditionnel" + +#: directives.c:359 +#, c-format +msgid "traditional C ignores #%s with the # indented" +msgstr "le C traditionel ignore la directive #%s si le caractère # est indenté" + +#: directives.c:363 +#, c-format +msgid "suggest hiding #%s from traditional C with an indented #" +msgstr "il est suggéré de cacher #%s au C traditionel en indentant le « # »" + +#: directives.c:389 +msgid "embedding a directive within macro arguments is not portable" +msgstr "placer une directive dans les arguments d'une macro n'est pas portable" + +#: directives.c:409 +msgid "style of line directive is a GCC extension" +msgstr "la directive de style de ligne est extension GCC" + +#: directives.c:464 +#, c-format +msgid "invalid preprocessing directive #%s" +msgstr "directive de pré-traitement #%s invalide" + +#: directives.c:532 +msgid "\"defined\" cannot be used as a macro name" +msgstr "« defined » ne peut être utilisé comme nom de macro" + +#: directives.c:538 +#, c-format +msgid "\"%s\" cannot be used as a macro name as it is an operator in C++" +msgstr "« %s » ne peut être utilisé comme nom de macro car c'est un opérateur en C++" + +#: directives.c:541 +#, c-format +msgid "no macro name given in #%s directive" +msgstr "aucun nom de macro donné dans la directive #%s" + +#: directives.c:544 +msgid "macro names must be identifiers" +msgstr "les noms de macro doivent être des identificateurs" + +#: directives.c:585 +#, c-format +msgid "undefining \"%s\"" +msgstr "indéfinition de « %s »" + +#: directives.c:640 +msgid "missing terminating > character" +msgstr "caractère > de terminaison manquant" + +#: directives.c:695 +#, c-format +msgid "#%s expects \"FILENAME\" or " +msgstr "#%s attend \"NOM_DE_FICHIER\" ou " + +#: directives.c:739 +#, c-format +msgid "empty filename in #%s" +msgstr "nom de fichier vide dans #%s" + +#: directives.c:749 +msgid "#include nested too deeply" +msgstr "#include imbriqué trop profondément" + +#: directives.c:790 +msgid "#include_next in primary source file" +msgstr "#include_next dans un fichier source primaire" + +#: directives.c:816 +#, c-format +msgid "invalid flag \"%s\" in line directive" +msgstr "fanion « %s » invalide dans la ligne de directive" + +#: directives.c:868 +#, c-format +msgid "\"%s\" after #line is not a positive integer" +msgstr "« %s » après #line n'est pas un nombre entier positif" + +#: directives.c:874 +msgid "line number out of range" +msgstr "numéro de ligne hors limite" + +#: directives.c:887 directives.c:964 +#, c-format +msgid "\"%s\" is not a valid filename" +msgstr "« %s » n'est pas un nom de fichier valide" + +#: directives.c:924 +#, c-format +msgid "\"%s\" after # is not a positive integer" +msgstr "« %s » après # n'est pas un nombre entier positif" + +#: directives.c:1026 +#, fuzzy, c-format +msgid "invalid #%s directive" +msgstr "directive #ident invalide" + +#: directives.c:1089 +#, c-format +msgid "registering pragmas in namespace \"%s\" with mismatched name expansion" +msgstr "" + +# FIXME +#: directives.c:1098 +#, fuzzy, c-format +msgid "registering pragma \"%s\" with name expansion and no namespace" +msgstr "enregistrement de \"%s\" à la fois comme une pragma et un espace de nom de pragma" + +# FIXME +#: directives.c:1116 +#, c-format +msgid "registering \"%s\" as both a pragma and a pragma namespace" +msgstr "enregistrement de \"%s\" à la fois comme une pragma et un espace de nom de pragma" + +#: directives.c:1119 +#, c-format +msgid "#pragma %s %s is already registered" +msgstr "la #pragma %s %s est déjà enregistrée" + +#: directives.c:1122 +#, c-format +msgid "#pragma %s is already registered" +msgstr "la #pragma %s est déjà enregistrée" + +#: directives.c:1152 +msgid "registering pragma with NULL handler" +msgstr "" + +# FIXME +#: directives.c:1362 +msgid "#pragma once in main file" +msgstr "#pragma once utilisée une seule fois dans le fichier principal" + +# FIXME +#: directives.c:1385 +msgid "invalid #pragma GCC poison directive" +msgstr "la directive GCC #pragma poison est invalide" + +# FIXME +#: directives.c:1394 +#, c-format +msgid "poisoning existing macro \"%s\"" +msgstr "élimination de la macro existente « %s »" + +#: directives.c:1413 +msgid "#pragma system_header ignored outside include file" +msgstr "#pragma system_header ignorée en dehors du fichier d'inclusion" + +#: directives.c:1437 +#, c-format +msgid "cannot find source file %s" +msgstr "impossible de trouver le fichier source %s" + +#: directives.c:1441 +#, c-format +msgid "current file is older than %s" +msgstr "le fichier courant est plus vieux que %s" + +#: directives.c:1620 +msgid "_Pragma takes a parenthesized string literal" +msgstr "_Pragma prend une chaîne entourée de parenthèrese" + +#: directives.c:1693 +msgid "#else without #if" +msgstr "#else sans #if" + +#: directives.c:1698 +msgid "#else after #else" +msgstr "#else après #else" + +#: directives.c:1700 directives.c:1733 +msgid "the conditional began here" +msgstr "la condition débute ici" + +#: directives.c:1726 +msgid "#elif without #if" +msgstr "#elif sans #if" + +#: directives.c:1731 +msgid "#elif after #else" +msgstr "#elif après #else" + +#: directives.c:1761 +msgid "#endif without #if" +msgstr "#endif sans #if" + +#: directives.c:1838 +msgid "missing '(' after predicate" +msgstr "« ( » manquante après le prédicat" + +#: directives.c:1853 +msgid "missing ')' to complete answer" +msgstr "« ) » manquante pour completer la réponse" + +#: directives.c:1873 +msgid "predicate's answer is empty" +msgstr "la réponse du prédicat est vide" + +#: directives.c:1900 +msgid "assertion without predicate" +msgstr "assertion sans prédicat" + +#: directives.c:1902 +msgid "predicate must be an identifier" +msgstr "le prédicat doit être un identificateur" + +# FIXME +#: directives.c:1988 +#, c-format +msgid "\"%s\" re-asserted" +msgstr "« %s » re-asserti" + +#: directives.c:2271 +#, c-format +msgid "unterminated #%s" +msgstr "#%s non terminé" + +#: directives-only.c:221 lex.c:1016 traditional.c:162 +msgid "unterminated comment" +msgstr "commentaire non terminé" + +#: errors.c:118 +msgid "warning: " +msgstr "attention : " + +#: errors.c:120 +msgid "internal error: " +msgstr "erreur interne : " + +#: errors.c:122 +msgid "error: " +msgstr "erreur: " + +#: errors.c:186 +msgid "stdout" +msgstr "stdout" + +#: errors.c:188 +#, c-format +msgid "%s: %s" +msgstr "%s : %s" + +#: expr.c:261 +msgid "too many decimal points in number" +msgstr "trop de points décimaux dans le nombre" + +#: expr.c:290 expr.c:365 +#, fuzzy +msgid "fixed-point constants are a GCC extension" +msgstr "les constantes imaginaires sont une extension GCC" + +#: expr.c:303 +#, fuzzy, c-format +msgid "invalid digit \"%c\" in binary constant" +msgstr "chiffre « %c » invalide dans la constante en base 8" + +#: expr.c:305 +#, c-format +msgid "invalid digit \"%c\" in octal constant" +msgstr "chiffre « %c » invalide dans la constante en base 8" + +#: expr.c:313 +#, fuzzy +msgid "invalid prefix \"0b\" for floating constant" +msgstr "suffixe « %.*s » invalide pour une constante flottante" + +#: expr.c:319 +msgid "use of C99 hexadecimal floating constant" +msgstr "usage d'une constante hexadécimale constante à la C99" + +#: expr.c:328 +msgid "exponent has no digits" +msgstr "l'exposant n'a pas de chiffre" + +#: expr.c:335 +msgid "hexadecimal floating constants require an exponent" +msgstr "la contante hexadécimale flottante requière un exposant" + +#: expr.c:341 +#, c-format +msgid "invalid suffix \"%.*s\" on floating constant" +msgstr "suffixe « %.*s » invalide pour une constante flottante" + +#: expr.c:351 expr.c:393 +#, c-format +msgid "traditional C rejects the \"%.*s\" suffix" +msgstr "le C traditionnel interdit le suffixe « %.*s »" + +#: expr.c:358 +#, fuzzy, c-format +msgid "invalid suffix \"%.*s\" with hexadecimal floating constant" +msgstr "suffixe « %.*s » invalide pour une constante flottante" + +#: expr.c:369 +#, fuzzy +msgid "decimal float constants are a GCC extension" +msgstr "les constantes imaginaires sont une extension GCC" + +#: expr.c:379 +#, c-format +msgid "invalid suffix \"%.*s\" on integer constant" +msgstr "suffixe « %.*s » invalide pour une constante entière" + +#: expr.c:401 +msgid "use of C99 long long integer constant" +msgstr "usage d'une constante entière « long long » à la C99" + +#: expr.c:409 +msgid "imaginary constants are a GCC extension" +msgstr "les constantes imaginaires sont une extension GCC" + +#: expr.c:412 +#, fuzzy +msgid "binary constants are a GCC extension" +msgstr "les constantes imaginaires sont une extension GCC" + +#: expr.c:505 +msgid "integer constant is too large for its type" +msgstr "constante entière trop grande pour tenir dans son type" + +#: expr.c:517 +msgid "integer constant is so large that it is unsigned" +msgstr "cette constante entière est si grande qu'elle ne peut être signée" + +#: expr.c:612 +msgid "missing ')' after \"defined\"" +msgstr "« ) » manquant après « defined »" + +#: expr.c:619 +msgid "operator \"defined\" requires an identifier" +msgstr "l'opérateur « defined » requiert un identificateur" + +#: expr.c:627 +#, c-format +msgid "(\"%s\" is an alternative token for \"%s\" in C++)" +msgstr "(« %s » est un élément lexical alternatif pour « %s » en C++)" + +#: expr.c:637 +msgid "this use of \"defined\" may not be portable" +msgstr "cette utilisation de « defined » peut ne pas être portable" + +#: expr.c:676 +msgid "floating constant in preprocessor expression" +msgstr "constante flottante dans une expresion pour le préprocesseur" + +#: expr.c:682 +msgid "imaginary number in preprocessor expression" +msgstr "constante complexe dans une expresion pour le préprocesseur" + +#: expr.c:727 +#, c-format +msgid "\"%s\" is not defined" +msgstr "« %s » n'est pas défini" + +#: expr.c:855 expr.c:884 +#, c-format +msgid "missing binary operator before token \"%s\"" +msgstr "opérateur binaire manquant avant l'élément lexical « %s »" + +#: expr.c:875 +#, c-format +msgid "token \"%s\" is not valid in preprocessor expressions" +msgstr "l'élément lexical « %s » n'est pas valide dans les expressions pour le préprocesseur" + +#: expr.c:892 +msgid "missing expression between '(' and ')'" +msgstr "expression manquante entre '(' et ')'" + +#: expr.c:895 +msgid "#if with no expression" +msgstr "#if sans expression" + +#: expr.c:898 +#, c-format +msgid "operator '%s' has no right operand" +msgstr "l'opérateur « %s » n'a pas d'opérande droite" + +#: expr.c:903 +#, c-format +msgid "operator '%s' has no left operand" +msgstr "opérateur « %s » n'a pas d'opérande gauche" + +#: expr.c:929 +msgid " ':' without preceding '?'" +msgstr "« : » n'est pas précédé de « ? »" + +#: expr.c:956 +msgid "unbalanced stack in #if" +msgstr "pile non balancée dans #if" + +#: expr.c:975 +#, c-format +msgid "impossible operator '%u'" +msgstr "opérateur impossible « %u »" + +#: expr.c:1065 +msgid "missing ')' in expression" +msgstr "« ) » manquante dans l'expresion" + +#: expr.c:1086 +msgid "'?' without following ':'" +msgstr "« ? » n'est pas suivi de « : »" + +#: expr.c:1096 +msgid "integer overflow in preprocessor expression" +msgstr "débordement d'entier dans l'expresion pour le préprocesseur" + +#: expr.c:1101 +msgid "missing '(' in expression" +msgstr "« ( » manquante dans l'expresion" + +#: expr.c:1133 +#, c-format +msgid "the left operand of \"%s\" changes sign when promoted" +msgstr "L'opérande gauche de « %s » change de signe lors de sa promotion" + +#: expr.c:1138 +#, c-format +msgid "the right operand of \"%s\" changes sign when promoted" +msgstr "L'opérande droite de « %s » change de signe lors de sa promotion" + +#: expr.c:1397 +msgid "traditional C rejects the unary plus operator" +msgstr "le C traditionnel rejette le plus unaire" + +#: expr.c:1480 +msgid "comma operator in operand of #if" +msgstr "opérateur virgule dans l'opérande de #if" + +#: expr.c:1612 +msgid "division by zero in #if" +msgstr "division par zéro dans #if" + +#: files.c:442 +msgid "NULL directory in find_file" +msgstr "répertoire NUL dans find_file" + +#: files.c:480 +msgid "one or more PCH files were found, but they were invalid" +msgstr "un ou plusieurs fichiers PCH ont été repérés, mais ils étaient invalides" + +#: files.c:483 +msgid "use -Winvalid-pch for more information" +msgstr "utiliser -Winvalid-pch pour plus d'informations" + +# FIXME +#: files.c:570 +#, c-format +msgid "%s is a block device" +msgstr "%s est un périphérique de blocs" + +#: files.c:587 +#, c-format +msgid "%s is too large" +msgstr "%s est trop grand" + +#: files.c:622 +#, c-format +msgid "%s is shorter than expected" +msgstr "%s est plus petit que prévu" + +#: files.c:852 +#, c-format +msgid "no include path in which to search for %s" +msgstr "aucun chemin d'inclusion dans lequel on pourrait repérer %s" + +# FIXME +#: files.c:1157 +msgid "Multiple include guards may be useful for:\n" +msgstr "De multiples balises pour les inclusions peuvent être utiles pour:\n" + +#: init.c:426 +msgid "cppchar_t must be an unsigned type" +msgstr "cppchar_t doit être d'un type non signé" + +#: init.c:430 +#, c-format +msgid "preprocessor arithmetic has maximum precision of %lu bits; target requires %lu bits" +msgstr "l'arithmétique du préprocesseur a une précision maximale de %lu bits ; la cible requière %lu bits" + +#: init.c:437 +msgid "CPP arithmetic must be at least as precise as a target int" +msgstr "l'arithmétique de CPP doit être au moins aussi précise que le type int de la cible" + +#: init.c:440 +msgid "target char is less than 8 bits wide" +msgstr "sur la cible, « char » fait moins de 8 bits" + +#: init.c:444 +msgid "target wchar_t is narrower than target char" +msgstr "sur la cible, « wchar_t » est plus petit que « char »" + +#: init.c:448 +msgid "target int is narrower than target char" +msgstr "sur la cible, « int » est plus petit que « char »" + +#: init.c:453 +msgid "CPP half-integer narrower than CPP character" +msgstr "les demi-entiers de CPP sont plus petit que les caractères de CPP" + +#: init.c:457 +#, c-format +msgid "CPP on this host cannot handle wide character constants over %lu bits, but the target requires %lu bits" +msgstr "CPP sur cette machine ne peut gérer les constantes larges de caractères de plus de %lu bits, mais la cible requière %lu bits" + +#: lex.c:283 +msgid "backslash and newline separated by space" +msgstr "« \\ » et retour de chariot séparés par un blanc" + +#: lex.c:288 +msgid "backslash-newline at end of file" +msgstr "« \\ » en fin de ligne à la fin du fichier" + +#: lex.c:303 +#, c-format +msgid "trigraph ??%c converted to %c" +msgstr "trigraphe ??%c converti en %c" + +#: lex.c:310 +#, c-format +msgid "trigraph ??%c ignored, use -trigraphs to enable" +msgstr "trigraphe ??%c ignoré, utilisez -trigraphs pour le permettre" + +#: lex.c:356 +msgid "\"/*\" within comment" +msgstr "« /* » à l'intérieur d'un commentaire" + +#: lex.c:414 +#, c-format +msgid "%s in preprocessing directive" +msgstr "%s dans la directive du préprocesseur" + +# I18N +#: lex.c:423 +msgid "null character(s) ignored" +msgstr "caractère(s) nul(s) ignoré(s)" + +#: lex.c:460 +#, fuzzy, c-format +msgid "`%.*s' is not in NFKC" +msgstr "« %s » n'est pas un canevas" + +#: lex.c:463 +#, fuzzy, c-format +msgid "`%.*s' is not in NFC" +msgstr "« %s » n'est pas un canevas" + +# FIXME +#: lex.c:551 +#, c-format +msgid "attempt to use poisoned \"%s\"" +msgstr "tentative d'utilisation d'un « %s » corrompu" + +#: lex.c:559 +msgid "__VA_ARGS__ can only appear in the expansion of a C99 variadic macro" +msgstr "« __VA_ARGS__ » peut seulement appraître dans l'expansion des macros C99 à nombre variable d'arguments" + +#: lex.c:659 +msgid "null character(s) preserved in literal" +msgstr "caractère(s) nul préservé(s) dans la chaîne" + +#: lex.c:662 +#, c-format +msgid "missing terminating %c character" +msgstr "caractère %c de terminaison manquant" + +#: lex.c:1027 +msgid "C++ style comments are not allowed in ISO C90" +msgstr "Les commentaires à la C++ ne sont pas permis en C89 ISO" + +#: lex.c:1029 +msgid "(this will be reported only once per input file)" +msgstr "(ceci sera rapporté une seule fois seulement par fichier d'entrée)" + +#: lex.c:1034 +msgid "multi-line comment" +msgstr "commentaire multi-lignes" + +#: lex.c:1347 +#, c-format +msgid "unspellable token %s" +msgstr "l'élément lexical %s ne peut être épelé" + +#: line-map.c:320 +#, c-format +msgid "In file included from %s:%u" +msgstr "Dans le fichier inclus à partir de %s:%u" + +#: line-map.c:338 +#, c-format +msgid "" +",\n" +" from %s:%u" +msgstr "" +",\n" +" à partir de %s:%u" + +#: macro.c:84 +#, c-format +msgid "macro \"%s\" is not used" +msgstr "la macro « %s » n'est pas utilisée" + +#: macro.c:123 macro.c:319 +#, c-format +msgid "invalid built-in macro \"%s\"" +msgstr "macro interne invalide « %s »" + +#: macro.c:157 +#, fuzzy +msgid "could not determine file timestamp" +msgstr "ne peut déterminer la date et l'heure" + +#: macro.c:254 +msgid "could not determine date and time" +msgstr "ne peut déterminer la date et l'heure" + +#: macro.c:270 +msgid "__COUNTER__ expanded inside directive with -fdirectives-only" +msgstr "" + +#: macro.c:423 +msgid "invalid string literal, ignoring final '\\'" +msgstr "chaîne invalide, « \\ » final ignoré" + +#: macro.c:483 +#, c-format +msgid "pasting \"%s\" and \"%s\" does not give a valid preprocessing token" +msgstr "le collage de « %s » et de « %s » ne donne pas d'élément lexical de pré-traitement valide" + +#: macro.c:558 +msgid "ISO C99 requires rest arguments to be used" +msgstr "ISO C99 requiert que tous les arguments soient utilisés" + +#: macro.c:563 +#, c-format +msgid "macro \"%s\" requires %u arguments, but only %u given" +msgstr "macro « %s » requiert %u arguments, mais seulement %u ont été passés" + +#: macro.c:568 +#, c-format +msgid "macro \"%s\" passed %u arguments, but takes just %u" +msgstr "la macro « %s » a reçu %u arguments, mais elle n'en prend que %u" + +#: macro.c:679 traditional.c:680 +#, c-format +msgid "unterminated argument list invoking macro \"%s\"" +msgstr "liste d'arguments non terminée invoquant la macro « %s »" + +#: macro.c:782 +#, c-format +msgid "function-like macro \"%s\" must be used with arguments in traditional C" +msgstr "la macro « %s » ressemblant à une fonction doit utilisée avec des arguments en C traditionnel" + +#: macro.c:1325 +#, c-format +msgid "duplicate macro parameter \"%s\"" +msgstr "paramètre de macro « %s » en double" + +#: macro.c:1371 +#, c-format +msgid "\"%s\" may not appear in macro parameter list" +msgstr "« %s » peut ne pas apparaître parmi les paramètres de macros" + +#: macro.c:1379 +msgid "macro parameters must be comma-separated" +msgstr "les paramètres de macro doivent être séparés par des virgules" + +#: macro.c:1396 +msgid "parameter name missing" +msgstr "nom de paramètre manquant" + +#: macro.c:1413 +msgid "anonymous variadic macros were introduced in C99" +msgstr "les macros anonymes à nombre variable d'arguments ont été introduites avec le C99" + +#: macro.c:1418 +msgid "ISO C does not permit named variadic macros" +msgstr "ISO C ne permet pas les macros nommées à nombre variable d'arguments" + +#: macro.c:1427 +msgid "missing ')' in macro parameter list" +msgstr "« ) » manquante dans la liste des paramètres de macros" + +# FIXME +#: macro.c:1476 +msgid "'##' cannot appear at either end of a macro expansion" +msgstr "« ## » ne peut apparaître à chacune des fins de l'expansion de macros" + +#: macro.c:1510 +msgid "ISO C99 requires whitespace after the macro name" +msgstr "ISO C99 requiert un blanc après le nom de la macro" + +#: macro.c:1534 +msgid "missing whitespace after the macro name" +msgstr "blanc d'espacement manquant après le nom de la macro" + +#: macro.c:1564 +msgid "'#' is not followed by a macro parameter" +msgstr "« # » n'est pas suivi d'un paramètre de macro" + +#: macro.c:1683 +#, c-format +msgid "\"%s\" redefined" +msgstr "« %s » redéfini" + +#: macro.c:1688 +msgid "this is the location of the previous definition" +msgstr "ceci est la localisation d'une précédente définition" + +#: macro.c:1738 +#, c-format +msgid "macro argument \"%s\" would be stringified in traditional C" +msgstr "l'argument macro « %s » serait changé en chaine en C traditionnel" + +#: macro.c:1761 +#, c-format +msgid "invalid hash type %d in cpp_macro_definition" +msgstr "type de hachage %d invalide dans cpp_macro_definition" + +#: pch.c:84 pch.c:332 pch.c:344 pch.c:362 pch.c:368 pch.c:377 +msgid "while writing precompiled header" +msgstr "lors de l'écriture de l'en-tête pré-compilée" + +#: pch.c:485 +#, c-format +msgid "%s: not used because `%.*s' not defined" +msgstr "%s: n'est pas utilisé parce que « %.*s » n'est pas définie" + +#: pch.c:497 +#, c-format +msgid "%s: not used because `%.*s' defined as `%s' not `%.*s'" +msgstr "%s: n'est pas utilisé parce que « %.*s » est défini en tant « %s » et non pas « %.*s »" + +#: pch.c:538 +#, c-format +msgid "%s: not used because `%s' is defined" +msgstr "%s: non utilisé parce que « %s » est défini" + +#: pch.c:558 +#, fuzzy, c-format +msgid "%s: not used because `__COUNTER__' is invalid" +msgstr "%s: non utilisé parce que « %s » est défini" + +#: pch.c:567 pch.c:737 +msgid "while reading precompiled header" +msgstr "lors de la lecture de l'en-tête pré-compilée" + +#: traditional.c:750 +#, c-format +msgid "detected recursion whilst expanding macro \"%s\"" +msgstr "récursion détectée lors de l'expansion de la macro « %s »" + +#: traditional.c:917 +msgid "syntax error in macro parameter list" +msgstr "erreur de syntaxe dans la liste de paramètres macro" + +#~ msgid "unknown escape sequence: '\\%03o'" +#~ msgstr "séquence d'échappement « \\%03o » inconnue" + +#~ msgid "no newline at end of file" +#~ msgstr "pas de retour chariot à la fin du fichier" + +#~ msgid "`%s' attribute directive ignored" +#~ msgstr "attribut de directive « %s » ignoré" + +#~ msgid "wrong number of arguments specified for `%s' attribute" +#~ msgstr "nombre erroné d'arguments spécifié pour l'attribut « %s »" + +#~ msgid "`%s' attribute does not apply to types" +#~ msgstr "l'attribut « %s » ne s'applique pas aux types" + +#~ msgid "`%s' attribute only applies to function types" +#~ msgstr "l'attribut « %s » ne s'applique qu'à des types de fonction" + +#~ msgid "`%s' attribute ignored" +#~ msgstr "attribut « %s » ignoré" + +#~ msgid "offset outside bounds of constant string" +#~ msgstr "décalage hors des limites d'une chaîne de constante" + +#~ msgid "second arg to `__builtin_prefetch' must be a constant" +#~ msgstr "second argument de « __builtin_prefetch » doit être une constante" + +#~ msgid "invalid second arg to __builtin_prefetch; using zero" +#~ msgstr "second argument invalide de « __builtin_prefetch »; utilisation de zéro" + +#~ msgid "third arg to `__builtin_prefetch' must be a constant" +#~ msgstr "troisième argument de « __builtin_prefetch » doit être une constante" + +#~ msgid "invalid third arg to __builtin_prefetch; using zero" +#~ msgstr "troisième argument invalide de « __builtin_prefetch »; utilisation de zéro" + +#~ msgid "argument of `__builtin_args_info' must be constant" +#~ msgstr "argument de « __builtin_args_info » doit être une constante" + +#~ msgid "argument of `__builtin_args_info' out of range" +#~ msgstr "argument de « __builtin_args_info » hors des limites" + +#~ msgid "missing argument in `__builtin_args_info'" +#~ msgstr "argument manquant dans « __builtin_args_info »" + +#~ msgid "`va_start' used in function with fixed args" +#~ msgstr "« va_start » utilisé dans une fonction ayant des arguments fixes" + +#~ msgid "second parameter of `va_start' not last named argument" +#~ msgstr "second paramètre de « va_start » n'est pas le dernier argument nommé" + +#~ msgid "`__builtin_next_arg' called without an argument" +#~ msgstr "« __builtin_next_arg » appelé sans argument" + +#~ msgid "too many arguments to function `va_start'" +#~ msgstr "trop d'arguments pour la function « va_start »" + +#~ msgid "first argument to `va_arg' not of type `va_list'" +#~ msgstr "premier argument de « va_arg » n'est pas de type « va_list »" + +#~ msgid "`%s' is promoted to `%s' when passed through `...'" +#~ msgstr "« %s » a été promu à « %s » lors du passage à travers « ... »" + +#~ msgid "(so you should pass `%s' not `%s' to `va_arg')" +#~ msgstr "(vous devriez donc passer « %s » et non « %s » à « va_arg »)" + +#~ msgid "if this code is reached, the program will abort" +#~ msgstr "si ce code est atteint, le programme s'arrêtera" + +#~ msgid "invalid arg to `__builtin_frame_address'" +#~ msgstr "argument de « __builtin_frame_address » invalide" + +#~ msgid "invalid arg to `__builtin_return_address'" +#~ msgstr "argument de « __builtin_return_address » invalide" + +#~ msgid "unsupported arg to `__builtin_frame_address'" +#~ msgstr "argument de « __builtin_frame_address » non supporté" + +#~ msgid "unsupported arg to `__builtin_return_address'" +#~ msgstr "argument de « __builtin_return_address » non supporté" + +#~ msgid "second arg to `__builtin_expect' must be a constant" +#~ msgstr "le second argument de « __builtin_expect » doit être une constante" + +#~ msgid "__builtin_longjmp second argument must be 1" +#~ msgstr "le second argument de « __builtin_longjmp » doit être 1" + +#~ msgid "built-in function `%s' not currently supported" +#~ msgstr "fonction interne « %s » n'est pas actuellement supportée" + +#~ msgid "target format does not support infinity" +#~ msgstr "le format cible ne supporte pas l'infini" + +#~ msgid "%Hsuggest explicit braces to avoid ambiguous `else'" +#~ msgstr "%Hon vous suggère des accolades explicitement pour éviter des « else » ambiguës" + +#~ msgid "%J'%D' is not defined outside of function scope" +#~ msgstr "%J« %D » n'est pas défini à l'extérieur de la portée de la fonction" + +#~ msgid "string length `%d' is greater than the length `%d' ISO C%d compilers are required to support" +#~ msgstr "longueur de la chaîne « %d » plus grande que la longueur « %d » que les compilateurs ISO C%d doivent supporter" + +#~ msgid "overflow in constant expression" +#~ msgstr "débordement dans l'expression de la constante" + +#~ msgid "integer overflow in expression" +#~ msgstr "débordement d'entier dans l'expression" + +#~ msgid "floating point overflow in expression" +#~ msgstr "débordement d'un nombre en virgule flottante dans l'expression" + +#~ msgid "vector overflow in expression" +#~ msgstr "débordement du vecteur dans l'expression" + +#~ msgid "large integer implicitly truncated to unsigned type" +#~ msgstr "grand entier implicitement tronqué pour un type non signé" + +#~ msgid "negative integer implicitly converted to unsigned type" +#~ msgstr "entier négatif implicitement converti en un type non signé" + +#~ msgid "overflow in implicit constant conversion" +#~ msgstr "débordement dans la conversion implicte de la constante" + +#~ msgid "operation on `%s' may be undefined" +#~ msgstr "l'opération portant sur « %s » est peut être indéfinie" + +#~ msgid "expression statement has incomplete type" +#~ msgstr "la déclaration de l'expression a un type incomplet" + +#~ msgid "case label does not reduce to an integer constant" +#~ msgstr "l'étiquette du « case » ne se réduit pas en une constante entière" + +#~ msgid "invalid truth-value expression" +#~ msgstr "expression valeur de vérité invalide" + +#~ msgid "invalid operands to binary %s" +#~ msgstr "opérandes invalides pour le binaire %s" + +#~ msgid "comparison is always false due to limited range of data type" +#~ msgstr "comparaison est toujours fausse en raison d'une gamme limitée de type de données" + +#~ msgid "comparison is always true due to limited range of data type" +#~ msgstr "comparaison est toujours vraie en raison d'une gamme limitée de type de données" + +#~ msgid "comparison of unsigned expression >= 0 is always true" +#~ msgstr "comparaison d'une expression non signée >=0 est toujours vraie" + +#~ msgid "comparison of unsigned expression < 0 is always false" +#~ msgstr "comparaison d'une expression non signée < 0 est toujours fausse" + +#~ msgid "pointer of type `void *' used in arithmetic" +#~ msgstr "usage en arithmétique d'un pointeur de type « void * »" + +#~ msgid "pointer to a function used in arithmetic" +#~ msgstr "usage en arithmétique d'un pointeur vers une fonction" + +#~ msgid "pointer to member function used in arithmetic" +#~ msgstr "usage en arithmétique d'un pointeur vers une fonction membre" + +#~ msgid "struct type value used where scalar is required" +#~ msgstr "valeur de type « struct » utilisé là où un scalaire est attendu" + +#~ msgid "union type value used where scalar is required" +#~ msgstr "valeur de type « union » utilisé là où un scalaire est attendu" + +#~ msgid "array type value used where scalar is required" +#~ msgstr "valeur de type « array » utilisé là où un scalaire est attendu" + +#~ msgid "the address of `%D', will always evaluate as `true'" +#~ msgstr "l'adresse de « %D » sera toujours évaluée comme étant « true »" + +#~ msgid "suggest parentheses around assignment used as truth value" +#~ msgstr "parenthèses suggérées autour de l'affectation utilisée comme valeur de vérité" + +#~ msgid "invalid use of `restrict'" +#~ msgstr "usage de « restrict » invalide" + +#~ msgid "invalid application of `sizeof' to a function type" +#~ msgstr "application de « sizeof » sur un type de fonction invalide" + +#~ msgid "invalid application of `%s' to a void type" +#~ msgstr "application invalide de « %s » sur un type void" + +#~ msgid "invalid application of `%s' to an incomplete type" +#~ msgstr "application invalide de « %s » sur un type incomplet" + +#~ msgid "`__alignof' applied to a bit-field" +#~ msgstr "« __alignof » appliqué sur un champ de bits" + +#~ msgid "cannot disable built-in function `%s'" +#~ msgstr "ne peut désactiver la fonction interne « %s »" + +#~ msgid "too few arguments to function `%s'" +#~ msgstr "pas assez d'arguments pour la fonction « %s »" + +#~ msgid "too many arguments to function `%s'" +#~ msgstr "trop d'arguments pour la fonction « %s »" + +#~ msgid "non-floating-point argument to function `%s'" +#~ msgstr "argument pour la fonction « %s » n'étant pas en virgule flottante" + +#~ msgid "pointers are not permitted as case values" +#~ msgstr "les pointeurs ne sont pas permis comme valeurs de « case »" + +#~ msgid "range expressions in switch statements are non-standard" +#~ msgstr "l'étendue des expressions dans les déclarations switch ne sont pas standard" + +#~ msgid "empty range specified" +#~ msgstr "intervalle vide spécifié" + +#~ msgid "duplicate (or overlapping) case value" +#~ msgstr "valeur du « case » duppliquée (ou en chevauchant une autre)" + +#~ msgid "%Jthis is the first entry overlapping that value" +#~ msgstr "%Jest la première entrée chevauchant cette valeur" + +#~ msgid "duplicate case value" +#~ msgstr "valeur du « case » duppliquée" + +#~ msgid "%Jpreviously used here" +#~ msgstr "%Jprécédemment utilisé ici" + +#~ msgid "multiple default labels in one switch" +#~ msgstr "plusieurs étiquettes par défaut dans un « switch »" + +#~ msgid "%Jthis is the first default label" +#~ msgstr "%Jest la première étiquette par défaut" + +#~ msgid "taking the address of a label is non-standard" +#~ msgstr "prendre l'adresse d'une étiquette n'est pas standard" + +#~ msgid "%Hignoring return value of `%D', declared with attribute warn_unused_result" +#~ msgstr "%Hvaleur à retourner « %D » ignorée, déclarée avec l'attribut warn_unused_result" + +#~ msgid "%Hignoring return value of function declared with attribute warn_unused_result" +#~ msgstr "%Hvaleur à retourner ignorée de la fonction déclarée avec l'attribut warn_unused_result" + +#~ msgid "unknown machine mode `%s'" +#~ msgstr "mode machine « %s » inconnu" + +#~ msgid "no data type for mode `%s'" +#~ msgstr "aucun type de données pour le mode « %s »" + +#~ msgid "invalid pointer mode `%s'" +#~ msgstr "mode pointeur invalide « %s »" + +#~ msgid "unable to emulate '%s'" +#~ msgstr "impossible d'émuler « %s »" + +#~ msgid "%Jsection attribute cannot be specified for local variables" +#~ msgstr "%Jl'attribut de section ne peut être spécifié pour des variables locales" + +#~ msgid "%Jsection of '%D' conflicts with previous declaration" +#~ msgstr "%Jsection de « %D » en conflit avec une déclaration précédente" + +#~ msgid "%Jsection attribute not allowed for '%D'" +#~ msgstr "%Jattribut de section n'est pas permis pour « %D »" + +#~ msgid "%Jsection attributes are not supported for this target" +#~ msgstr "%Jattributs de section ne sont pas supportés pour la cible" + +#~ msgid "requested alignment is not a constant" +#~ msgstr "l'alignement demandé n'est pas une constante" + +#~ msgid "requested alignment is not a power of 2" +#~ msgstr "l'alignement demandé n'est pas une puissance de 2" + +#~ msgid "requested alignment is too large" +#~ msgstr "l'alignement demandé est trop grand" + +#~ msgid "%Jalignment may not be specified for '%D'" +#~ msgstr "%Jl'alignement ne peut pas être spécifié pour « %D »" + +#~ msgid "%J'%D' defined both normally and as an alias" +#~ msgstr "%J'%D défini à la fois normalement et en tant qu'alias" + +#~ msgid "alias arg not a string" +#~ msgstr "l'argument d'alias n'est pas une chaîne" + +#~ msgid "visibility arg not a string" +#~ msgstr "l'argument de visibilité n'est pas une chaîne" + +#~ msgid "visibility arg must be one of \"default\", \"hidden\", \"protected\" or \"internal\"" +#~ msgstr "l'argument de visibilité doit être l'un de « default » (par défaut), « hidden » (masqué), « protected » (protégé) ou « internal » (interne)" + +#~ msgid "tls_model arg not a string" +#~ msgstr "l'argument de tls_model n'est pas une chaîne" + +#~ msgid "tls_model arg must be one of \"local-exec\", \"initial-exec\", \"local-dynamic\" or \"global-dynamic\"" +#~ msgstr "l'argument de tls_model doit être l'un de « local-exec », « initial-exec », « local-dynamic » or « global-dynamic »" + +#~ msgid "%J'%E' attribute applies only to functions" +#~ msgstr "%J'%E l'attribut ne s'applique seulement qu'à des fonctions" + +#~ msgid "%Jcan't set '%E' attribute after definition" +#~ msgstr "%Jne peut initialiser l'attribut « %E » après définition" + +#~ msgid "`%s' attribute ignored for `%s'" +#~ msgstr "attribut « %s » ignoré pour « %s »" + +#~ msgid "invalid vector type for attribute `%s'" +#~ msgstr "type de vecteur invalide pour l'attribut « %s »" + +#~ msgid "no vector mode with the size and type specified could be found" +#~ msgstr "aucun mode vecteur avec la taille et le type spécifié n'a été trouvé" + +#~ msgid "nonnull attribute without arguments on a non-prototype" +#~ msgstr "attribut non nul sans argument sur un non-prototype" + +#~ msgid "nonnull argument has invalid operand number (arg %lu)" +#~ msgstr "un argument non nul a un nombre d'opérande invalide (argument %lu)" + +#~ msgid "nonnull argument with out-of-range operand number (arg %lu, operand %lu)" +#~ msgstr "un argument non nul a un nombre d'opérande hors des bornes (arg %lu, opérande %lu)" + +#~ msgid "nonnull argument references non-pointer operand (arg %lu, operand %lu)" +#~ msgstr "un argument non nul référence une opérande qui n'est pas un pointeur (arg %lu, opérande %lu)" + +#~ msgid "null argument where non-null required (arg %lu)" +#~ msgstr "argument nul là où un non-nul est requis (arg %lu)" + +#~ msgid "cleanup arg not an identifier" +#~ msgstr "argument de nettoyage n'est pas un identificateur" + +#~ msgid "cleanup arg not a function" +#~ msgstr "argument de nettoyage n'est pas une fonction" + +#~ msgid "%s at end of input" +#~ msgstr "%s à la fin de l'entrée" + +#~ msgid "%s before %s'%c'" +#~ msgstr "%s avant %s« %c »" + +#~ msgid "%s before %s'\\x%x'" +#~ msgstr "%s avant %s'\\x%x'" + +#~ msgid "%s before string constant" +#~ msgstr "%s avant une chaîne constante" + +#~ msgid "%s before numeric constant" +#~ msgstr "%s avant une constante numérique" + +#~ msgid "%s before \"%s\"" +#~ msgstr "%s avant « %s »" + +#~ msgid "%s before '%s' token" +#~ msgstr "%s avant un élément lexical « %s »" + +#~ msgid "%s" +#~ msgstr "%s" + +#~ msgid "void value not ignored as it ought to be" +#~ msgstr "valeur void n'a pas été ignorée comme elle aurait dû l'être" + +#~ msgid "conversion to non-scalar type requested" +#~ msgstr "conversion vers un type non scalaire demandée" + +#~ msgid "%Jarray '%D' assumed to have one element" +#~ msgstr "%Jon assume que le tableau « %D » n'a qu'un seul élément" + +#~ msgid "%Jlabel `%D' used but not defined" +#~ msgstr "%Jétiquette « %D » utilisée mais non définie" + +#~ msgid "%Jlabel `%D' defined but not used" +#~ msgstr "%Jétiquette « %D » définie mais non utilisée" + +#~ msgid "%Jlabel `%D' declared but not defined" +#~ msgstr "%Jétiquette « %D » utilisée mais non définie" + +#~ msgid "%Junused variable `%D'" +#~ msgstr "%Jvariable inutilisée « %D »" + +#~ msgid "a parameter list with an ellipsis can't match an empty parameter name list declaration" +#~ msgstr "un paramètre de la liste avec une ellipse ne peut concorder une déclaration vide de liste de noms de paramètres" + +#~ msgid "an argument type that has a default promotion can't match an empty parameter name list declaration" +#~ msgstr "un type d'argument ayant une promotion par défaut ne peut concorder avec une déclaration vide de noms de paramètres" + +#~ msgid "%Jprototype for '%D' declares more arguments than previous old-style definition" +#~ msgstr "%Jprototype pour « %D » déclare plus d'arguments que la définition précédente de style ancien" + +#~ msgid "%Jprototype for '%D' declares fewer arguments than previous old-style definition" +#~ msgstr "%Jprototype pour « %D » déclare moins d'arguments que la définition précédente de style ancien" + +#~ msgid "%Jprototype for '%D' declares arg %d with incompatible type" +#~ msgstr "%Jprototype pour « %D » déclare l'arguments %d avec un type incompatible" + +#~ msgid "%Jprototype for '%D' follows non-prototype definition" +#~ msgstr "%Jprototype pour « %D » suit la définition d'un non prototype" + +#~ msgid "%Jprevious definition of '%D' was here" +#~ msgstr "%Jdéfinition précédente de « %D » était ici" + +#~ msgid "%Jprevious implicit declaration of '%D' was here" +#~ msgstr "%Jdéclaration précédente implicite de « %D » était ici" + +#~ msgid "%Jprevious declaration of '%D' was here" +#~ msgstr "%Jdéclaration précédente de « %D » était ici" + +#~ msgid "%J'%D' redeclared as different kind of symbol" +#~ msgstr "%J« %D » redéclaré comme une sorte différente de symbole" + +#~ msgid "%Jbuilt-in function '%D' declared as non-function" +#~ msgstr "%Jfonction interne « %D » n'est pas déclarée comme une fonction" + +#~ msgid "%Jshadowing built-in function '%D'" +#~ msgstr "%Jmasquage de la fonction interne « %D »" + +#~ msgid "%Jconflicting types for built-in function '%D'" +#~ msgstr "%Jtypes conflictuels pour la fonction interne « %D »" + +#~ msgid "%Jconflicting types for '%D'" +#~ msgstr "%Jtypes conflictuels pour « %D »" + +#~ msgid "%Jredefinition of typedef '%D'" +#~ msgstr "%Jredéfinition de « %D »" + +#~ msgid "%Jredefinition of '%D'" +#~ msgstr "%Jredéfinition de « %D »" + +#~ msgid "%Jstatic declaration of '%D' follows non-static declaration" +#~ msgstr "%Jdéclaration statique de « %D » suit une déclaration non statique" + +#~ msgid "%Jnon-static declaration of '%D' follows static declaration" +#~ msgstr "%Jdéclaration non statique de « %D » suite une déclaration statique" + +#~ msgid "%Jthread-local declaration of '%D' follows non-thread-local declaration" +#~ msgstr "%Jdéclaration de thread local de « %D » suit une déclaration non thread-local" + +#~ msgid "%Jnon-thread-local declaration of '%D' follows thread-local declaration" +#~ msgstr "%Jdéclaration non thread local de « %D » suit une déclaration de thread local" + +#~ msgid "%Jextern declaration of '%D' follows declaration with no linkage" +#~ msgstr "%Jdéclaration externe de « %D » suit une déclaraion sans lien" + +#~ msgid "%Jdeclaration of '%D' with no linkage follows extern declaration" +#~ msgstr "%Jdéclaration de « %D » sasn lien suivant une déclaration externe" + +#~ msgid "%Jredeclaration of '%D' with no linkage" +#~ msgstr "%Jredéclaration de « %D » sans lien" + +#~ msgid "%Jredeclaration of '%D' with different visibility (old visibility preserved)" +#~ msgstr "%Jredéclaration de « %D » avec une visibilité différente (visibilité précédente conservée)" + +#~ msgid "%Jinline declaration of '%D' follows declaration with attribute noinline" +#~ msgstr "%Jdéclaration enligne de « %D » suit la déclaration avec un attribut non enligne" + +#~ msgid "%Jdeclaration of '%D' with attribute noinline follows inline declaration " +#~ msgstr "%Jéclaration de « %D » avec un attribut non enligne suit une déclaration enligne" + +#~ msgid "%J'%D' declared inline after being called" +#~ msgstr "%J« %D » déclaré enligne après avoir été appelé" + +#~ msgid "%J'%D' declared inline after its definition" +#~ msgstr "%J« %D » déclaré enligne après sa définition" + +#~ msgid "%Jredefinition of parameter '%D'" +#~ msgstr "%Jredéfinition du paramètre « %D »" + +#~ msgid "%Jvolatile declaration of '%D' follows non-volatile declaration" +#~ msgstr "%Jdéclaration volatile de « %D » suit une déclaration non volatile" + +#~ msgid "%Jnon-volatile declaration of '%D' follows volatile declaration" +#~ msgstr "%Jdéclaration non volatile de « %D » suit une déclaration volatile" + +#~ msgid "%Jconst declaration of '%D' follows non-const declaration" +#~ msgstr "%Jdéclaration de constante de « %D » suit une déclaration de non constante" + +#~ msgid "%Jnon-const declaration of '%D' follows const declaration" +#~ msgstr "%Jdéclaration de non constante de « %D » suit une déclaration de constante" + +#~ msgid "%Jredundant redeclaration of '%D'" +#~ msgstr "%Jdéclaration redondante de « %D »" + +#~ msgid "%Jdeclaration of '%D' shadows a parameter" +#~ msgstr "%Jdéclaration de « %D » masque un paramètre" + +#~ msgid "%Jdeclaration of '%D' shadows a global declaration" +#~ msgstr "%Jdéclaration de « %D » masque une déclaration globale" + +#~ msgid "%Jdeclaration of '%D' shadows a previous local" +#~ msgstr "%Jdéclaration de « %D » masque la déclaration d'un local précédent" + +#~ msgid "%Jshadowed declaration is here" +#~ msgstr "%Jdéclaration est masquée ici" + +#~ msgid "nested extern declaration of `%s'" +#~ msgstr "déclaration de « %s » externe imbriquée" + +#~ msgid "%Jprevious declaration of '%D'" +#~ msgstr "%Jdéclaration précédente de « %D »" + +#~ msgid "implicit declaration of function `%s'" +#~ msgstr "déclaration implicite de la fonction « %s »" + +#~ msgid "`%s' undeclared here (not in a function)" +#~ msgstr "« %s » non déclaré ici (hors de toute fonction)" + +#~ msgid "`%s' undeclared (first use in this function)" +#~ msgstr "« %s » non déclaré (première utilisation dans cette fonction)" + +#~ msgid "(Each undeclared identifier is reported only once" +#~ msgstr "(Chaque identificateur non déclaré est rapporté une seule fois" + +#~ msgid "for each function it appears in.)" +#~ msgstr "pour chaque fonction dans laquelle il apparaît.)" + +#~ msgid "label %s referenced outside of any function" +#~ msgstr "étiquette %s référencée à l'extérieur de toute fonction" + +#~ msgid "duplicate label declaration `%s'" +#~ msgstr "déclaration de l'étiquette « %s » en double" + +#~ msgid "%Jthis is a previous declaration" +#~ msgstr "%Jest la déclaration précédente" + +#~ msgid "%Hduplicate label `%D'" +#~ msgstr "%Hétiquette « %D » apparaît en double" + +#~ msgid "%J`%D' previously defined here" +#~ msgstr "%J« %D » précédemment défini ici" + +#~ msgid "%J`%D' previously declared here" +#~ msgstr "%J« %D » précédemment déclaré ici" + +#~ msgid "%Htraditional C lacks a separate namespace for labels, identifier `%s' conflicts" +#~ msgstr "%HC traditionnel manque d'un espace nom séparé pour les étiquettes, identificateur « %D » est en conflit" + +#~ msgid "%H`%s' defined as wrong kind of tag" +#~ msgstr "%H« %s » défini incorrectement comme une mauvais sorte d'étiquette" + +#~ msgid "unnamed struct/union that defines no instances" +#~ msgstr "struct/union sans nom ne définissant aucune instance" + +#~ msgid "useless keyword or type name in empty declaration" +#~ msgstr "mot clé ou nom de type inutile dans une déclaration vide" + +#~ msgid "two types specified in one empty declaration" +#~ msgstr "deux types spécifiés dans une déclaration vide" + +#~ msgid "empty declaration" +#~ msgstr "déclaration vide" + +#~ msgid "ISO C90 does not support `static' or type qualifiers in parameter array declarators" +#~ msgstr "ISO C90 ne supporte pas « static » ou les qualificateurs de type dans les déclarateurs de tableau de paramètres" + +#~ msgid "ISO C90 does not support `[*]' array declarators" +#~ msgstr "ISO C90 ne supporte pas « [*] » dans les déclarateurs de tableau" + +#~ msgid "GCC does not yet properly implement `[*]' array declarators" +#~ msgstr "GCC n'implémente pas encore correctement les déclarateurs de tableau « [*] »" + +#~ msgid "static or type qualifiers in abstract declarator" +#~ msgstr "static ou qualificateurs de type dans un déclarateur abstrait" + +#~ msgid "%J'%D' is usually a function" +#~ msgstr "%J« %D » est habituellement une fonction" + +#~ msgid "typedef `%s' is initialized (use __typeof__ instead)" +#~ msgstr "typedef « %s » est initialisé (utilisez __typeof__ à la place)" + +#~ msgid "function `%s' is initialized like a variable" +#~ msgstr "la fonction « %s » est initialisée comme une variable" + +#~ msgid "parameter `%s' is initialized" +#~ msgstr "le paramètre « %s » est initialisé" + +#~ msgid "variable-sized object may not be initialized" +#~ msgstr "un objet de taille variable peut ne pas être initialisé" + +#~ msgid "variable `%s' has initializer but incomplete type" +#~ msgstr "la variable « %s » est initialisée alors qu'elle est de type incomplet" + +#~ msgid "elements of array `%s' have incomplete type" +#~ msgstr "les éléments du tableau « %s » ont des types incomplets" + +#~ msgid "%Jinline function '%D' given attribute noinline" +#~ msgstr "%J fonction enligne « %D » a reçu l'attribut non enligne" + +#~ msgid "%Jinitializer fails to determine size of '%D'" +#~ msgstr "%Jinitialisateur a échoué à déterminer la taille de « %D »" + +#~ msgid "%Jarray size missing in '%D'" +#~ msgstr "%Jtaille du tableau est manquante dans « %D »" + +#~ msgid "%Jzero or negative size array '%D'" +#~ msgstr "%Jtableau « %D » de taille zéro ou négative" + +#~ msgid "%Jstorage size of '%D' isn't known" +#~ msgstr "%Jtaille de stockage de « %D » n'est pas connue" + +#~ msgid "%Jstorage size of '%D' isn't constant" +#~ msgstr "%Jtaille de stockage de « %D » n'est pas une constante" + +#~ msgid "%Jignoring asm-specifier for non-static local variable '%D'" +#~ msgstr "%Jspécificateur asm ignoré pour la variable locale non statique « %D »" + +#~ msgid "ISO C forbids forward parameter declarations" +#~ msgstr "ISO C interdit la déclaration anticipée de paramètres" + +#~ msgid "" +#~ msgstr "" + +#~ msgid "bit-field `%s' width not an integer constant" +#~ msgstr "la largeur du champ de bits « %s » n'est pas une constante entière" + +#~ msgid "negative width in bit-field `%s'" +#~ msgstr "largeur négative du champ de bits « %s »" + +#~ msgid "zero width for bit-field `%s'" +#~ msgstr "largeur nulle pour le champ de bits « %s »" + +#~ msgid "bit-field `%s' has invalid type" +#~ msgstr "le champ de bits « %s » a un type invalide" + +#~ msgid "type of bit-field `%s' is a GCC extension" +#~ msgstr "le type de champ de bit « %s » est une extension GCC" + +#~ msgid "width of `%s' exceeds its type" +#~ msgstr "la largeur de « %s » excède son type" + +#~ msgid "`%s' is narrower than values of its type" +#~ msgstr "« %s » est plus étroit que les valeurs de son type" + +#~ msgid "`long long long' is too long for GCC" +#~ msgstr "« long long long » est trop long pour GCC" + +#~ msgid "ISO C90 does not support `long long'" +#~ msgstr "ISO C90 ne permet pas « long long »" + +#~ msgid "duplicate `%s'" +#~ msgstr "« %s » apparaît en double" + +#~ msgid "`__thread' before `extern'" +#~ msgstr "« __thread » avant « extern »" + +#~ msgid "`__thread' before `static'" +#~ msgstr "« __thread » avant « static »" + +#~ msgid "two or more data types in declaration of `%s'" +#~ msgstr "deux types de données ou plus dans la déclaration de « %s »" + +#~ msgid "`%s' fails to be a typedef or built in type" +#~ msgstr "« %s » n'a pu devenir un typedef ou un type construit" + +#~ msgid "type defaults to `int' in declaration of `%s'" +#~ msgstr "dans la déclaration de « %s », utilisation de « int » par défaut pour le type" + +#~ msgid "both long and short specified for `%s'" +#~ msgstr "« long » et « short » spécifiés à la fois pour « %s »" + +#~ msgid "long or short specified with char for `%s'" +#~ msgstr "« long » ou « short » spécifié avec « char » pour « %s »" + +#~ msgid "long or short specified with floating type for `%s'" +#~ msgstr "« long » ou « short » spécifié avec un type flottant pour « %s »" + +#~ msgid "the only valid combination is `long double'" +#~ msgstr "la seule combinaison valide est « long double »" + +#~ msgid "both signed and unsigned specified for `%s'" +#~ msgstr "« %s » est à la fois signé et non signé" + +#~ msgid "long, short, signed or unsigned invalid for `%s'" +#~ msgstr "« long », « short », « signed » ou « unsigned » invalide pour « %s »" + +#~ msgid "long, short, signed or unsigned used invalidly for `%s'" +#~ msgstr "« long », « short », « signed » ou « unsigned » utilisé incorrectement pour « %s »" + +#~ msgid "complex invalid for `%s'" +#~ msgstr "« complex » invalide pour « %s »" + +#~ msgid "ISO C90 does not support complex types" +#~ msgstr "ISO C90 ne permet pas les types « complex »" + +#~ msgid "ISO C does not support plain `complex' meaning `double complex'" +#~ msgstr "ISO C ne permet pas d'utiliser « complex » à la place de « double complex »" + +#~ msgid "ISO C does not support complex integer types" +#~ msgstr "ISO C interdit le type d'entiers complexes" + +#~ msgid "duplicate `const'" +#~ msgstr "« const » apparaît en double" + +#~ msgid "duplicate `restrict'" +#~ msgstr "« restrict » apparaît en double" + +#~ msgid "duplicate `volatile'" +#~ msgstr "« volatile » apparaît en double" + +#~ msgid "multiple storage classes in declaration of `%s'" +#~ msgstr "multiples classes de stockage dans la déclaration de « %s »" + +#~ msgid "function definition declared `auto'" +#~ msgstr "définition de fonction déclaré « auto »" + +#~ msgid "function definition declared `register'" +#~ msgstr "définition de fonction déclarée « register »" + +#~ msgid "function definition declared `typedef'" +#~ msgstr "définition de fonction déclarée « typedef »" + +#~ msgid "function definition declared `__thread'" +#~ msgstr "définition de fonction déclarée « __thread »" + +#~ msgid "storage class specified for structure field `%s'" +#~ msgstr "classe de stockage spécifiée pour le champ de structure « %s »" + +#~ msgid "storage class specified for parameter `%s'" +#~ msgstr "classe de stockage spécifiée pour le paramètre « %s »" + +#~ msgid "storage class specified for typename" +#~ msgstr "classe de stockage spécifié pour un typename" + +#~ msgid "`%s' initialized and declared `extern'" +#~ msgstr "« %s » initialisé et déclaré « extern »" + +#~ msgid "`%s' has both `extern' and initializer" +#~ msgstr "« %s » a les deux « extern » et initialisateur" + +#~ msgid "file-scope declaration of `%s' specifies `auto'" +#~ msgstr "la déclaration de l'étendue de fichier « %s » spécifie « auto »" + +#~ msgid "nested function `%s' declared `extern'" +#~ msgstr "fonction imbriquée « %s » déclarée « extern »" + +#~ msgid "function-scope `%s' implicitly auto and declared `__thread'" +#~ msgstr "« %s » dans le champ de la fonction est implicitement déclaré auto, et déclaré « __thread »" + +#~ msgid "static or type qualifiers in non-parameter array declarator" +#~ msgstr "static ou qualificateurs de type dans un déclarateur de tableau n'étant pas un paramètre" + +#~ msgid "declaration of `%s' as array of voids" +#~ msgstr "déclaration de « %s » comme un tableau de « void »" + +#~ msgid "declaration of `%s' as array of functions" +#~ msgstr "déclaration de « %s » comme un tableau de fonctions" + +#~ msgid "invalid use of structure with flexible array member" +#~ msgstr "utilisation invalide d'une structure ayant un membre flexible" + +#~ msgid "size of array `%s' has non-integer type" +#~ msgstr "la taille du tableau « %s » n'est pas de type entier" + +#~ msgid "ISO C forbids zero-size array `%s'" +#~ msgstr "ISO C interdit le tableau de taille zéro « %s »" + +#~ msgid "size of array `%s' is negative" +#~ msgstr "la taille du tableau « %s » est négative" + +#~ msgid "ISO C90 forbids array `%s' whose size can't be evaluated" +#~ msgstr "ISO C90 interdit le tableau « %s » dont la taille ne peut être évaluée" + +#~ msgid "ISO C90 forbids variable-size array `%s'" +#~ msgstr "ISO C90 interdit le tableau « %s » de taille variable" + +#~ msgid "size of array `%s' is too large" +#~ msgstr "la taille du tableau « %s » est trop grande" + +#~ msgid "ISO C90 does not support flexible array members" +#~ msgstr "ISO C90 interdit les tableaux ayant des membres flexibles" + +#~ msgid "array type has incomplete element type" +#~ msgstr "les éléments du tableau sont de type incomplet" + +#~ msgid "`%s' declared as function returning a function" +#~ msgstr "« %s » déclaré comme une fonction retournant une fonction" + +#~ msgid "`%s' declared as function returning an array" +#~ msgstr "« %s » déclaré comme une fonction retournant un tableau" + +#~ msgid "ISO C forbids qualified void function return type" +#~ msgstr "ISO C interdit d'utiliser un void qualifié en valeur à retourner par la fonction" + +#~ msgid "type qualifiers ignored on function return type" +#~ msgstr "qualificateurs de type ignorés pour le type à retourner par la fonction" + +#~ msgid "ISO C forbids qualified function types" +#~ msgstr "ISO C interdit les types de fonction qualifiés" + +#~ msgid "invalid type modifier within pointer declarator" +#~ msgstr "modificateur de type invalide dans la déclaration de pointeur" + +#~ msgid "ISO C forbids const or volatile function types" +#~ msgstr "ISO C interdit les fonction de type volatile ou constante" + +#~ msgid "variable or field `%s' declared void" +#~ msgstr "variable ou champ « %s » déclaré « void »" + +#~ msgid "attributes in parameter array declarator ignored" +#~ msgstr "les attributs dans un déclarateur de tableau de paramètres sont ignorés" + +#~ msgid "invalid type modifier within array declarator" +#~ msgstr "modificateur invalide de type à l'intérieur d'un déclarateur de tableau" + +#~ msgid "field `%s' declared as a function" +#~ msgstr "champ « %s » déclaré comme une fonction" + +#~ msgid "field `%s' has incomplete type" +#~ msgstr "champ « %s » est de type incomplet" + +#~ msgid "invalid storage class for function `%s'" +#~ msgstr "classe de stockage invalide pour la fonction « %s »" + +#~ msgid "`noreturn' function returns non-void value" +#~ msgstr "fonction marquée « noreturn » retourne une valeur n'étant pas de type « void »" + +#~ msgid "cannot inline function `main'" +#~ msgstr "ne peut transformer « main » en fonction enligne" + +#~ msgid "variable previously declared `static' redeclared `extern'" +#~ msgstr "variable précédemment déclarée « static » redéclarée « extern »" + +#~ msgid "%Jvariable '%D' declared `inline'" +#~ msgstr "%Jvariable « %D » déclarée « inline »" + +#~ msgid "thread-local storage not supported for this target" +#~ msgstr "cette cible ne permet pas le stockage en local au thread" + +#~ msgid "function declaration isn't a prototype" +#~ msgstr "la déclaration de fonction n'est pas un prototype valide" + +#~ msgid "parameter names (without types) in function declaration" +#~ msgstr "noms de paramètres (sans type) dans la déclaration de fonction" + +#~ msgid "parameter `%s' has incomplete type" +#~ msgstr "le paramètre « %s » a un type incomplet" + +#~ msgid "parameter has incomplete type" +#~ msgstr "le paramètre a un type incomplet" + +#~ msgid "\"void\" as only parameter may not be qualified" +#~ msgstr "\"void\" comme seul paramètre ne peut être qualifié" + +#~ msgid "\"void\" must be the only parameter" +#~ msgstr "\"void\" doit être le seul paramètre" + +#~ msgid "%Jparameter \"%D\" has just a forward declaration" +#~ msgstr "%Jparamètre « %D » n'a qu'une déclaration anticipée" + +#~ msgid "\"%s %s\" declared inside parameter list" +#~ msgstr "\"%s %s\" déclarée à l'intérieur de la liste de paramètres" + +#~ msgid "anonymous %s declared inside parameter list" +#~ msgstr "structure anonyme %s déclarée à l'intérieur de la liste des paramètres" + +#~ msgid "its scope is only this definition or declaration, which is probably not what you want" +#~ msgstr "visible uniquement depuis cette définition ou déclaration, ce qui n'est probablement pas ce que vous désirez" + +#~ msgid "redefinition of `union %s'" +#~ msgstr "redéfinition de « union %s »" + +#~ msgid "redefinition of `struct %s'" +#~ msgstr "redéfinition de « struct %s »" + +#~ msgid "declaration does not declare anything" +#~ msgstr "déclaration ne déclarant rien du tout" + +#~ msgid "%Jduplicate member '%D'" +#~ msgstr "%Jmembre « %D » est double" + +#~ msgid "%s defined inside parms" +#~ msgstr "%s défini à l'intérieur des paramètres" + +#~ msgid "union" +#~ msgstr "union" + +#~ msgid "structure" +#~ msgstr "structure" + +#~ msgid "%s has no %s" +#~ msgstr "%s n'a pas de %s" + +#~ msgid "struct" +#~ msgstr "struct" + +#~ msgid "named members" +#~ msgstr "membres nommés" + +#~ msgid "members" +#~ msgstr "membres" + +#~ msgid "nested redefinition of `%s'" +#~ msgstr "redéfinition imbriquée de « %s »" + +#~ msgid "%Jflexible array member in union" +#~ msgstr "%Jmembre flexible de tableau dans l'union" + +#~ msgid "%Jflexible array member not at end of struct" +#~ msgstr "%Jle membre flexible de tableau n'est pas à la fin de la structure" + +#~ msgid "%Jflexible array member in otherwise empty struct" +#~ msgstr "%Jmembre flexible de tableau dans une structure vide par ailleurs" + +#~ msgid "%Jinvalid use of structure with flexible array member" +#~ msgstr "%Jutilisation invalide d'une structure ayant un membre flexible" + +#~ msgid "union cannot be made transparent" +#~ msgstr "union ne peut pas être rendu transparente" + +#~ msgid "redeclaration of `enum %s'" +#~ msgstr "redéclaration de « enum %s »" + +#~ msgid "enum defined inside parms" +#~ msgstr "enum défini à l'intérieur des paramètres" + +#~ msgid "enumeration values exceed range of largest integer" +#~ msgstr "valeurs d'énumération excède les bornes du plus grand entier" + +#~ msgid "enumerator value for `%s' not integer constant" +#~ msgstr "valeur de l'énumérateur pour « %s » n'est pas une constante entière" + +#~ msgid "overflow in enumeration values" +#~ msgstr "débordement dans les valeurs de l'énumération" + +#~ msgid "ISO C restricts enumerator values to range of `int'" +#~ msgstr "ISO C restreint les valeurs de l'énumérateur aux bornes d'un « int »" + +#~ msgid "return type is an incomplete type" +#~ msgstr "le type du retour est incomplet" + +#~ msgid "return type defaults to `int'" +#~ msgstr "le type du retour est « int » par défaut" + +#~ msgid "%Jno previous prototype for '%D'" +#~ msgstr "%Jaucun prototype précédent pour « %D »" + +#~ msgid "%J'%D' was used with no prototype before its definition" +#~ msgstr "%J« %D » a été utilisé sans prototype avant sa définition" + +#~ msgid "%Jno previous declaration for '%D'" +#~ msgstr "%Jaucune déclaration précédente pour « %D »" + +#~ msgid "%J`%D' was used with no declaration before its definition" +#~ msgstr "%J« %D » a été utilisé sans déclaration avant sa définition" + +#~ msgid "%Jreturn type of '%D' is not `int'" +#~ msgstr "%Jle type de retour de « %D » n'est pas « int »" + +#~ msgid "%Jfirst argument of '%D' should be `int'" +#~ msgstr "%Jle premier argument de « %D » devrait être « int »" + +#~ msgid "%Jsecond argument of '%D' should be 'char **'" +#~ msgstr "%Jle second argument de « %D » devrait être « char ** »" + +#~ msgid "%Jthird argument of '%D' should probably be 'char **'" +#~ msgstr "%Jle troisième argument de « %D » devrait probablement être « char ** »" + +#~ msgid "%J'%D' takes only zero or two arguments" +#~ msgstr "%J« %D » prend soit aucun argument ou soit deux arguments" + +#~ msgid "%J'%D' is normally a non-static function" +#~ msgstr "%J« %D » n'est pas normalement une fonction statique" + +#~ msgid "%Jold-style parameter declarations in prototyped function definition" +#~ msgstr "%Jdéclaration de paramètre d'ancien style dans la définition prototypée de fonction" + +#~ msgid "%Jparameter name omitted" +#~ msgstr "%Jnom de paramètre omis" + +#~ msgid "%Jparameter name missing from parameter list" +#~ msgstr "%Jnom du paramètre manquant dans la liste des paramètres" + +#~ msgid "%J\"%D\" declared as a non-parameter" +#~ msgstr "%J\"%D\" déclaré comme un non paramètre" + +#~ msgid "%Jmultiple parameters named \"%D\"" +#~ msgstr "%Jplusieurs paramètres nommés « %D »" + +#~ msgid "%Jparameter \"%D\" declared void" +#~ msgstr "%Jparamètre \"%D\" déclaré «void »" + +#~ msgid "%Jtype of \"%D\" defaults to \"int\"" +#~ msgstr "%Jtype de « %D » est « int » par défaut" + +#~ msgid "%Jparameter \"%D\" has incomplete type" +#~ msgstr "%Jparamètre \"%D\" a un type incomplet" + +#~ msgid "%Jdeclaration for parameter \"%D\" but no such parameter" +#~ msgstr "%Jdéclaration du paramètre « %D » mais pas de tel paramètre" + +#~ msgid "number of arguments doesn't match prototype" +#~ msgstr "le nombre d'arguments ne concorde pas avec celui du prototype" + +#~ msgid "%Hprototype declaration" +#~ msgstr "%Hdéclaration de prototype" + +#~ msgid "promoted argument \"%D\" doesn't match prototype" +#~ msgstr "argument promu \"%D\" ne concorde pas avec le prototype" + +#~ msgid "argument \"%D\" doesn't match prototype" +#~ msgstr "argument \"%D\" ne concorde pas avec le prototype" + +#~ msgid "no return statement in function returning non-void" +#~ msgstr "« return » manquant dans une fonction devant retourner une valeur" + +#~ msgid "this function may return with or without a value" +#~ msgstr "cette fonction devrait finir en retournant ou non une valeur" + +#~ msgid "'for' loop initial declaration used outside C99 mode" +#~ msgstr "déclaration initiale de la boucle « for » utilisée en dehors du mode C99" + +#~ msgid "'struct %s' declared in 'for' loop initial declaration" +#~ msgstr "« struct %s » déclarée dans la déclaration initiale de la boucle « for »" + +#~ msgid "'union %s' declared in 'for' loop initial declaration" +#~ msgstr "« union %s » déclarée dans la déclaration initiale de la boucle « for »" + +#~ msgid "'enum %s' declared in 'for' loop initial declaration" +#~ msgstr "« enum %s » déclarée dans la déclaration initiale de la boucle « for »" + +#~ msgid "%Jdeclaration of non-variable '%D' in 'for' loop initial declaration" +#~ msgstr "%Jdéclaration de « %D » (qui n'est pas une variable) dans la déclaration initiale de « for »" + +#~ msgid "%Jdeclaration of static variable '%D' in 'for' loop initial declaration" +#~ msgstr "%Jdéclaration de la variable statique « %D » dans la déclaration initiale de la boucle « for »" + +#~ msgid "%Jdeclaration of 'extern' variable '%D' in 'for' loop initial declaration" +#~ msgstr "%Jdéclaration de la variable externe « %D » dans la déclaration initiale « for »" + +#~ msgid "%Jredefinition of global '%D'" +#~ msgstr "%Jredéfinition globale de « %D »" + +#~ msgid "%J'%D' previously defined here" +#~ msgstr "%J« %D » précédemment défini ici" + +#~ msgid "format string has invalid operand number" +#~ msgstr "la chaîne de format a un nombre invalide d'opérandes" + +#~ msgid "function does not return string type" +#~ msgstr "fonction ne retourne pas un type « string »" + +#~ msgid "format string arg not a string type" +#~ msgstr "l'argument de la chaîne de format n'est pas de type « string »" + +#~ msgid "unrecognized format specifier" +#~ msgstr "spécificateur de format non reconnu" + +#~ msgid "`%s' is an unrecognized format function type" +#~ msgstr "« %s » a un format de type de fonction non reconnu" + +#~ msgid "'...' has invalid operand number" +#~ msgstr "« ... » a un nombre invalide d'opérandes" + +#~ msgid "format string arg follows the args to be formatted" +#~ msgstr "l'argument de la chaîne de format suit les arguments devant être formatés" + +#~ msgid "` ' flag" +#~ msgstr "fanion « »" + +#~ msgid "the ` ' printf flag" +#~ msgstr "le fanion « » de printf" + +#~ msgid "`+' flag" +#~ msgstr "fanion « + »" + +#~ msgid "the `+' printf flag" +#~ msgstr "le fanion « + » de printf" + +#~ msgid "`#' flag" +#~ msgstr "fanion « # »" + +#~ msgid "the `#' printf flag" +#~ msgstr "le fanion « # » de printf" + +#~ msgid "`0' flag" +#~ msgstr "fanion « 0 »" + +#~ msgid "the `0' printf flag" +#~ msgstr "le fanion « 0 » de printf" + +#~ msgid "`-' flag" +#~ msgstr "fanion « - »" + +#~ msgid "the `-' printf flag" +#~ msgstr "le fanion « - » de printf" + +#~ msgid "`'' flag" +#~ msgstr "fanion « ' »" + +#~ msgid "the `'' printf flag" +#~ msgstr "le fanion « ' » de printf" + +#~ msgid "`I' flag" +#~ msgstr "fanion « I »" + +#~ msgid "the `I' printf flag" +#~ msgstr "le fanion « I » de printf" + +#~ msgid "field width" +#~ msgstr "largeur de champ" + +#~ msgid "field width in printf format" +#~ msgstr "largeur de champ dans le format de printf" + +#~ msgid "precision" +#~ msgstr "précision" + +#~ msgid "precision in printf format" +#~ msgstr "précision dans le format de printf" + +#~ msgid "length modifier" +#~ msgstr "modificateur de longueur" + +#~ msgid "length modifier in printf format" +#~ msgstr "modificateur de longueur dans le format printf" + +#~ msgid "assignment suppression" +#~ msgstr "suppression d'affectation" + +#~ msgid "the assignment suppression scanf feature" +#~ msgstr "options de scanf pour la suppression d'affectation" + +#~ msgid "`a' flag" +#~ msgstr "fanion « a »" + +#~ msgid "the `a' scanf flag" +#~ msgstr "le fanion « a » de scanf" + +#~ msgid "field width in scanf format" +#~ msgstr "largeur de champ dans le format de scanf" + +#~ msgid "length modifier in scanf format" +#~ msgstr "modificateur de longueur dans le format de scanf" + +#~ msgid "the `'' scanf flag" +#~ msgstr "la fanion « ' » de scanf" + +#~ msgid "the `I' scanf flag" +#~ msgstr "le fanion « I » de scanf" + +#~ msgid "`_' flag" +#~ msgstr "fanion « _ »" + +#~ msgid "the `_' strftime flag" +#~ msgstr "le fanion « _ » de strftime" + +#~ msgid "the `-' strftime flag" +#~ msgstr "le fanion « - » de strftime" + +#~ msgid "the `0' strftime flag" +#~ msgstr "le fanion « 0 » de strftime" + +#~ msgid "`^' flag" +#~ msgstr "fanion « ^ »" + +#~ msgid "the `^' strftime flag" +#~ msgstr "la fanion « ^ » de strftime" + +#~ msgid "the `#' strftime flag" +#~ msgstr "le fanion « # » de strftime" + +#~ msgid "field width in strftime format" +#~ msgstr "largeur de champ dans le format de strftime" + +#~ msgid "`E' modifier" +#~ msgstr "modificateur « E »" + +#~ msgid "the `E' strftime modifier" +#~ msgstr "le modificateur « E » de strftime" + +#~ msgid "`O' modifier" +#~ msgstr "modificateur « O »" + +#~ msgid "the `O' strftime modifier" +#~ msgstr "le modificateur « O » de strftime" + +#~ msgid "the `O' modifier" +#~ msgstr "le modificateur « O »" + +#~ msgid "fill character" +#~ msgstr "caractère de remplissage" + +#~ msgid "fill character in strfmon format" +#~ msgstr "caractère de remplissage dans le format de strfmon" + +#~ msgid "the `^' strfmon flag" +#~ msgstr "le fanion « ^ » de strfmon" + +#~ msgid "the `+' strfmon flag" +#~ msgstr "le fanion « + » de strfmon" + +#~ msgid "`(' flag" +#~ msgstr "fanion « ( »" + +#~ msgid "the `(' strfmon flag" +#~ msgstr "le fanion « ( » de strfmon" + +#~ msgid "`!' flag" +#~ msgstr "fanion « ! »" + +#~ msgid "the `!' strfmon flag" +#~ msgstr "le fanion « ! » de strfmon" + +#~ msgid "the `-' strfmon flag" +#~ msgstr "le fanion « - » de strfmon" + +#~ msgid "field width in strfmon format" +#~ msgstr "largeur de champ dans le format de strfmon" + +#~ msgid "left precision" +#~ msgstr "précision de gauche" + +#~ msgid "left precision in strfmon format" +#~ msgstr "précision de gauche dans le format de strfmon" + +#~ msgid "right precision" +#~ msgstr "précision de droite" + +#~ msgid "right precision in strfmon format" +#~ msgstr "précision de droite dans le format de strfmon" + +#~ msgid "length modifier in strfmon format" +#~ msgstr "modificateur de longueur dans le format de strfmon" + +#~ msgid "function might be possible candidate for `%s' format attribute" +#~ msgstr "la fonction est peut être candidate pour l'attribut de format de « %s »" + +#~ msgid "missing $ operand number in format" +#~ msgstr "$ manquant dans le format pour l'opérande du nombre" + +#~ msgid "%s does not support %%n$ operand number formats" +#~ msgstr "%s ne permet pas le format d'opérande de nombre %%n$" + +#~ msgid "operand number out of range in format" +#~ msgstr "opérande de nombre au delà de la limite dans le format" + +#~ msgid "format argument %d used more than once in %s format" +#~ msgstr "argument de format %d utilisé plus d'une fois dans le format %s" + +#~ msgid "format argument %d unused before used argument %d in $-style format" +#~ msgstr "argument de format %d inutilisé avant l'utilisation de l'argument %d dans le format de style $" + +#~ msgid "format not a string literal, format string not checked" +#~ msgstr "le format n'est pas une chaîne littérale, le format n'est pas vérifé" + +#~ msgid "format not a string literal and no format arguments" +#~ msgstr "le format n'est pas une chaîne littérale et pas d'argument de format" + +#~ msgid "format not a string literal, argument types not checked" +#~ msgstr "le format n'est pas une chaîne littérale, le type des arguments n'est pas vérifié" + +#~ msgid "too many arguments for format" +#~ msgstr "trop d'arguments pour le format" + +#~ msgid "unused arguments in $-style format" +#~ msgstr "arguments inutilisés dans le format de style $" + +#~ msgid "zero-length %s format string" +#~ msgstr "chaîne de format de longueur nulle %s" + +#~ msgid "format is a wide character string" +#~ msgstr "le format est une chaîne large de caractères" + +#~ msgid "unterminated format string" +#~ msgstr "chaîne de format non terminée" + +#~ msgid "embedded `\\0' in format" +#~ msgstr "« \\0 » inclu dans le format" + +#~ msgid "spurious trailing `%%' in format" +#~ msgstr "des caractères « %% » douteux traînent dans le format" + +#~ msgid "repeated %s in format" +#~ msgstr "%s répété dans le format" + +#~ msgid "missing fill character at end of strfmon format" +#~ msgstr "caractère de remplissage manquant à la fin du format pour strfmon" + +#~ msgid "too few arguments for format" +#~ msgstr "trop peu d'arguments dans le format" + +#~ msgid "zero width in %s format" +#~ msgstr "largeur zéro dans le format %s" + +#~ msgid "empty left precision in %s format" +#~ msgstr "précision de gauche vide dans le format %s" + +#~ msgid "field precision" +#~ msgstr "champ de précision" + +#~ msgid "empty precision in %s format" +#~ msgstr "précision vide dans le format %s" + +#~ msgid "%s does not support the `%s' %s length modifier" +#~ msgstr "%s ne supporte pas « %s » %s comme modificateur de longueur" + +#~ msgid "conversion lacks type at end of format" +#~ msgstr "il manque un type pour la conversion à la fin du format" + +#~ msgid "unknown conversion type character `%c' in format" +#~ msgstr "type de caractère de conversion inconnu « %c » dans le format" + +#~ msgid "unknown conversion type character 0x%x in format" +#~ msgstr "type de caractère de conversion inconnu 0x%x dans le format" + +#~ msgid "%s does not support the `%%%c' %s format" +#~ msgstr "%s ne supporte pas le format « %%%c » %s" + +#~ msgid "%s used with `%%%c' %s format" +#~ msgstr "%s utilisé avec le format « %%%c » %s" + +#~ msgid "%s does not support %s" +#~ msgstr "%s ne supporte pas %s" + +#~ msgid "%s does not support %s with the `%%%c' %s format" +#~ msgstr "%s ne supporte pas %s avec le format « %%%c » %s " + +#~ msgid "%s ignored with %s and `%%%c' %s format" +#~ msgstr "%s ignoré avec %s et le format « %%%c » %s" + +#~ msgid "%s ignored with %s in %s format" +#~ msgstr "%s ignoré avec %s dans le format %s" + +#~ msgid "use of %s and %s together with `%%%c' %s format" +#~ msgstr "utilisation de %s et de %s ensemble dans le format « %%%c » %s" + +#~ msgid "use of %s and %s together in %s format" +#~ msgstr "utilisation de %s et de %s ensemble dans le format %s" + +#~ msgid "`%%%c' yields only last 2 digits of year in some locales" +#~ msgstr "« %%%c » laisse seulement les 2 derniers chiffres de l'année avec certaines locales" + +#~ msgid "`%%%c' yields only last 2 digits of year" +#~ msgstr "« %%%c » laisse seulement les 2 derniers chiffres de l'année" + +#~ msgid "no closing `]' for `%%[' format" +#~ msgstr "pas de « ] » fermant pour le format « %%[ »" + +#~ msgid "use of `%s' length modifier with `%c' type character" +#~ msgstr "utilisation du modificateur de longueur « %s » avec le type de caractère « %c »" + +#~ msgid "%s does not support the `%%%s%c' %s format" +#~ msgstr "%s ne supporte par le format « %%%s%c » %s" + +#~ msgid "operand number specified with suppressed assignment" +#~ msgstr "nombre d'opérandes spécifié avec des affectations suprimées" + +#~ msgid "operand number specified for format taking no argument" +#~ msgstr "nombre d'opérandes spécifié pour un format n'acceptant aucun argument" + +#~ msgid "writing through null pointer (arg %d)" +#~ msgstr "écriture à travers un pointeur nul (arg %d)" + +#~ msgid "reading through null pointer (arg %d)" +#~ msgstr "lecture à l'aide d'un pointeur nul (arg %d)" + +#~ msgid "writing into constant object (arg %d)" +#~ msgstr "écriture dans un objet constant (arg %d)" + +#~ msgid "extra type qualifiers in format argument (arg %d)" +#~ msgstr "qualificateur de type additionnel dans l'argument du format (arg %d)" + +#~ msgid "format argument is not a pointer (arg %d)" +#~ msgstr "l'argument de format n'est pas un pointeur (arg %d)" + +#~ msgid "format argument is not a pointer to a pointer (arg %d)" +#~ msgstr "l'argument de format n'est pas un pointeur de pointeur (arg %d)" + +#~ msgid "pointer" +#~ msgstr "pointeur" + +#~ msgid "different type" +#~ msgstr "type différent" + +#~ msgid "%s is not type %s (arg %d)" +#~ msgstr "%s n'est pas de type %s (arg %d)" + +#~ msgid "%s format, %s arg (arg %d)" +#~ msgstr "format %s, arg %s (arg %d)" + +#~ msgid "args to be formatted is not '...'" +#~ msgstr "les arguments devant être formatés ne sont pas « ... »" + +#~ msgid "strftime formats cannot format arguments" +#~ msgstr "Les formats de strftime ne peuvent pas formater d'argument" + +#~ msgid "ignoring duplicate directory \"%s\"\n" +#~ msgstr "le répertoire « %s » est ignoré car présent deux fois\n" + +#~ msgid " as it is a non-system directory that duplicates a system directory\n" +#~ msgstr " car il s'agit d'un répertoire non système dupliquant un répertoire système\n" + +#~ msgid "ignoring nonexistent directory \"%s\"\n" +#~ msgstr "le répertoire « %s » est ignoré car inexistant\n" + +#~ msgid "#include \"...\" search starts here:\n" +#~ msgstr "la recherche pour #include \"...\" débute ici :\n" + +#~ msgid "#include <...> search starts here:\n" +#~ msgstr "la recherche pour #include <...> débute ici:\n" + +#~ msgid "End of search list.\n" +#~ msgstr "Fin de la liste de recherche.\n" + +#~ msgid "badly nested C headers from preprocessor" +#~ msgstr "en-têtes C du préprocesseur incorrectement imbriqués" + +#~ msgid "ignoring #pragma %s %s" +#~ msgstr "#pragma %s %s ignoré" + +#~ msgid "%Hstray '@' in program" +#~ msgstr "%H« @ » perdu dans le programme" + +#~ msgid "stray '%c' in program" +#~ msgstr "« %c » perdu dans le programme" + +#~ msgid "stray '\\%o' in program" +#~ msgstr "« \\%o » perdu dans le programme" + +#~ msgid "this decimal constant is unsigned only in ISO C90" +#~ msgstr "cette constante décimale est « unsigned » seulement en C90 ISO" + +#~ msgid "this decimal constant would be unsigned in ISO C90" +#~ msgstr "cette constante décimale serait « unsigned » en C90 ISO" + +#~ msgid "integer constant is too large for \"%s\" type" +#~ msgstr "constante entière trop grande pour le type « %s »" + +#~ msgid "floating constant exceeds range of \"%s\"" +#~ msgstr "constante en nombre flottant excédant les limites de « %s »" + +#~ msgid "traditional C rejects string constant concatenation" +#~ msgstr "le C traditionel rejette la concaténation de chaînes de constantes" + +#~ msgid "%Jfunction '%F' can never be inlined because it is suppressed using -fno-inline" +#~ msgstr "%Jfonction « %F » ne jamais être enlignée parce qu'elle supprime l'utilisation de -fno-inline" + +#~ msgid "%Jfunction '%F' can never be inlined because it might not be bound within this unit of translation" +#~ msgstr "%Jfonction « %F » ne jamais être enlignée parce qu'elle ne peut être lié dans cette unité de traduction" + +#~ msgid "%Jfunction '%F' can never be inlined because it uses attributes conflicting with inlining" +#~ msgstr "%Jfonction « %F » ne jamais être enlignée parce qu'elle utilise un attribut en conflit avec l'enlignage" + +#~ msgid "%Jfunction '%F' can never be inlined because it has pending sizes" +#~ msgstr "%Jfonction « %F » ne jamais être enlignée parce qu'elle a des tailles en attente" + +#~ msgid "%Jnested function '%F' can never be inlined because it has possibly saved pending sizes" +#~ msgstr "%Jfonction imbriqué « %F » ne peut jamais être enlignée parce qu'ella possiblement sauvegardé des tailles en attente" + +#~ msgid "no class name specified with \"%s\"" +#~ msgstr "aucun nom de classe spécifié avec \"%s\"" + +#~ msgid "assertion missing after \"%s\"" +#~ msgstr "assertion manquante après \"%s\"" + +#~ msgid "macro name missing after \"%s\"" +#~ msgstr "nom de macro manquant après \"%s\"" + +#~ msgid "missing path after \"%s\"" +#~ msgstr "cible manquante après \"%s\"" + +#~ msgid "missing filename after \"%s\"" +#~ msgstr "nom de fichier manquant après \"%s\"" + +#~ msgid "missing makefile target after \"%s\"" +#~ msgstr "cible manquante dans le makefile après \"%s\"" + +#~ msgid "-I- specified twice" +#~ msgstr "-I- spécifié deux fois" + +#~ msgid "switch \"%s\" is no longer supported" +#~ msgstr "l'option « %s » n'est plus supportée" + +#~ msgid "-fhandle-exceptions has been renamed -fexceptions (and is now on by default)" +#~ msgstr "-fhandle-exceptions a été renommé -fexceptions (et est maintenant utilisé par défaut)" + +#~ msgid "output filename specified twice" +#~ msgstr "nom du fichier de sortie spécifié deux fois" + +#~ msgid "-Wformat-y2k ignored without -Wformat" +#~ msgstr "-Wformat-y2k ignorée sans -Wformat" + +#~ msgid "-Wformat-extra-args ignored without -Wformat" +#~ msgstr "-Wformat-extra-args ignorée sans -Wformat" + +#~ msgid "-Wformat-zero-length ignored without -Wformat" +#~ msgstr "-Wformat-zero-length ignorée sans -Wformat" + +#~ msgid "-Wformat-nonliteral ignored without -Wformat" +#~ msgstr "-Wformat-nonliteral ignorée sans -Wformat" + +#~ msgid "-Wformat-security ignored without -Wformat" +#~ msgstr "-Wformat-security ignorée sans -Wformat" + +#~ msgid "-Wmissing-format-attribute ignored without -Wformat" +#~ msgstr "-Wmissing-format-attribute ignorée sans -Wformat" + +#~ msgid "opening output file %s: %m" +#~ msgstr "ouverture du fichier de sortie %s: %m" + +#~ msgid "too many filenames given. Type %s --help for usage" +#~ msgstr "trop de noms de fichiers. Taper %s --help pour en connaître l'usage" + +#~ msgid "YYDEBUG not defined" +#~ msgstr "YYDEBUG n'est pas défini" + +#~ msgid "opening dependency file %s: %m" +#~ msgstr "ouverture du fichier de dépendances %s: %m" + +#~ msgid "closing dependency file %s: %m" +#~ msgstr "fermeture du fichier de dépendances %s: %m" + +#~ msgid "when writing output to %s: %m" +#~ msgstr "lors de l'écriture de la sortie dans %s: %m" + +#~ msgid "to generate dependencies you must specify either -M or -MM" +#~ msgstr "pour générer les dépendances, vous devez spécifier -M ou -MM" + +#~ msgid "" +#~ msgstr "" + +#~ msgid "" +#~ msgstr "" + +#~ msgid "too late for # directive to set debug directory" +#~ msgstr "il est trop tard pour la directive # pour fixer un répertoire de mise au point" + +#~ msgid "syntax error" +#~ msgstr "erreur de syntaxe" + +# FIXME +#~ msgid "syntax error: cannot back up" +#~ msgstr "erreur de syntaxe : impossible de reculer" + +#~ msgid "ISO C forbids an empty source file" +#~ msgstr "ISO C interdit un fichier source vide" + +#~ msgid "argument of `asm' is not a constant string" +#~ msgstr "l'argument de « asm » n'est pas une chaîne de constante" + +#~ msgid "ISO C forbids data definition with no type or storage class" +#~ msgstr "ISO C interdit la définition de données sans type ni classe de stockage" + +#~ msgid "data definition has no type or storage class" +#~ msgstr "la définition de données n'a pas de type ni de classe de stockage" + +#~ msgid "ISO C does not allow extra `;' outside of a function" +#~ msgstr "ISO C ne permet pas de « ; » additionnel en dehors d'une fonction" + +#~ msgid "`sizeof' applied to a bit-field" +#~ msgstr "« sizeof » appliqué à un champ de bits" + +#~ msgid "ISO C forbids omitting the middle term of a ?: expression" +#~ msgstr "ISO C interdit l'omission du terme central de l'expression ?:" + +# FIXME +#~ msgid "ISO C90 forbids compound literals" +#~ msgstr "ISO C90 interdit les mots composés" + +#~ msgid "ISO C forbids braced-groups within expressions" +#~ msgstr "ISO C interdit les groupes d'accolades à l'intérieur d'expressions" + +#~ msgid "first argument to __builtin_choose_expr not a constant" +#~ msgstr "le premier argument de « __builtin_choose_expr » n'est pas une constante" + +#~ msgid "traditional C rejects ISO C style function definitions" +#~ msgstr "le C traditionel rejette les définitions de fonction de style ISO C" + +#~ msgid "old-style parameter declaration" +#~ msgstr "déclaration de paramètre d'un style désuet" + +#~ msgid "`%s' is not at beginning of declaration" +#~ msgstr "« %s » n'est pas au début de la déclaration" + +#~ msgid "`typeof' applied to a bit-field" +#~ msgstr "« typeof » appliqué à un champ de bits" + +#~ msgid "ISO C forbids empty initializer braces" +#~ msgstr "ISO C interdit d'initialiser avec des accolades vides" + +#~ msgid "ISO C90 forbids specifying subobject to initialize" +#~ msgstr "ISO C90 interdit de spécifier des sous-objets à initialiser" + +#~ msgid "obsolete use of designated initializer without `='" +#~ msgstr "utilisation obsolète d'une initialisation désignée sans « = »" + +#~ msgid "obsolete use of designated initializer with `:'" +#~ msgstr "utilisation obsolète d'une initialisation désignée avec « : »" + +#~ msgid "ISO C forbids specifying range of elements to initialize" +#~ msgstr "ISO C interdit de spécifier les bornes des éléments à initaliser" + +#~ msgid "ISO C forbids nested functions" +#~ msgstr "ISO C interdit les fonctions imbriquées" + +#~ msgid "ISO C forbids forward references to `enum' types" +#~ msgstr "ISO C interdit les références anticipée vers un type « enum »" + +#~ msgid "comma at end of enumerator list" +#~ msgstr "virgule à la fin de liste d'énumerateurs" + +#~ msgid "no semicolon at end of struct or union" +#~ msgstr "pas de point virgule à la fin de la structure ou de l'union" + +#~ msgid "extra semicolon in struct or union specified" +#~ msgstr "point virgule superflu dans la structure ou dans l'union" + +#~ msgid "ISO C doesn't support unnamed structs/unions" +#~ msgstr "ISO C ne permet pas les structures et unions sans nom" + +#~ msgid "ISO C forbids member declarations with no members" +#~ msgstr "ISO C interdit les déclarations de membre sans aucun membre" + +#~ msgid "label at end of compound statement" +#~ msgstr "étiquette à la fin d'une déclaration composée" + +#~ msgid "ISO C90 forbids mixed declarations and code" +#~ msgstr "ISO C89 interdit les mélanges de déclarations et de code" + +#~ msgid "ISO C forbids label declarations" +#~ msgstr "ISO C interdit la déclaration d'étiquette" + +#~ msgid "braced-group within expression allowed only inside a function" +#~ msgstr "groupe entre accolades à l'intérieur d'expression permis seulement à l'intérieur d'une fonction" + +#~ msgid "empty body in an else-statement" +#~ msgstr "le corps du else est vide" + +#~ msgid "%Hempty body in an if-statement" +#~ msgstr "%Hle corps de la déclaration du if est vide" + +#~ msgid "break statement not within loop or switch" +#~ msgstr "mot-clé « break » à l'extérieur de toute boucle ou « switch »" + +#~ msgid "continue statement not within a loop" +#~ msgstr "mot-clé « continue » à l'extérieur de toute boucle" + +#~ msgid "ISO C forbids `goto *expr;'" +#~ msgstr "ISO C interdit « goto *expr; »" + +#~ msgid "ISO C requires a named argument before `...'" +#~ msgstr "ISO C requiert un argument nommé devant « ... »" + +#~ msgid "`...' in old-style identifier list" +#~ msgstr "« ... » dans une liste d'identificateurs de style ancien" + +#~ msgid "parse error; also virtual memory exhausted" +#~ msgstr "erreur d'analyse syntaxique; et la mémoire virtuelle est épuisée" + +#~ msgid "parse error" +#~ msgstr "erreur d'analyse syntaxique" + +#~ msgid "parser stack overflow" +#~ msgstr "débordement de la pile de l'analyseur syntaxique" + +#~ msgid "syntax error at '%s' token" +#~ msgstr "erreur de syntaxe à l'élément lexical « %s »" + +#~ msgid "can't create precompiled header %s: %m" +#~ msgstr "ne peut créer une en-tête précompilée %s: %m" + +#~ msgid "can't write to %s: %m" +#~ msgstr "ne peut écrire dans %s: %m" + +#~ msgid "`%s' is not a valid output file" +#~ msgstr "« %s » n'est pas un nom de fichier valide" + +#~ msgid "can't write %s: %m" +#~ msgstr "ne peut écrire dans %s: %m" + +#~ msgid "can't seek in %s: %m" +#~ msgstr "ne peut se positionner dans %s: %m" + +#~ msgid "can't read %s: %m" +#~ msgstr "ne peut lire %s: %m" + +#~ msgid "%s: not compatible with this GCC version" +#~ msgstr "%s: n'est pas compatible avec cette version de GCC" + +#~ msgid "%s: not for %s" +#~ msgstr "%s: non pour %s" + +#~ msgid "%s: not a PCH file" +#~ msgstr "%s: n'est pas un fichier PCH" + +#~ msgid "%s: created on host `%.*s', but used on host `%s'" +#~ msgstr "%s: créé sur l'hôte « %.*s », mais utilisé sur l'hôte « %s »" + +#~ msgid "%s: created for target `%.*s', but used for target `%s'" +#~ msgstr "%s: créé pour la cible « %.*s », mais utilisé pour la cible « %s »" + +#~ msgid "%s: created by version `%.*s', but this is version `%s'" +#~ msgstr "%s: créé pour la version « %.*s », mais utilisé avec la version « %s »" + +#~ msgid "%s: created using different flags" +#~ msgstr "%s: créé en utilisant des fanions différents" + +#~ msgid "%s: created with -g%s, but used with -g%s" +#~ msgstr "%s: créé avec -g%s, mais utilisé avec -g%s" + +#~ msgid "%s: had text segment at different address" +#~ msgstr "%s: a un segment texte à une adresse différente" + +# I18N +#~ msgid "calling fdopen" +#~ msgstr "appel de fdopen()" + +#~ msgid "reading" +#~ msgstr "en lecture" + +#~ msgid "#pragma pack (pop) encountered without matching #pragma pack (push, )" +#~ msgstr "#pragma pack (pop) rencontré sans #pragma pack (push, ) correspondant" + +#~ msgid "#pragma pack(pop, %s) encountered without matching #pragma pack(push, %s, )" +#~ msgstr "#pragma pack(pop, %s) rencontré sans #pragma pack(push, %s, ) correspondant" + +#~ msgid "#pragma pack(push[, id], ) is not supported on this target" +#~ msgstr "#pragma pack(push[, id], ) n'est pas permis sur cette cible" + +#~ msgid "#pragma pack(pop[, id], ) is not supported on this target" +#~ msgstr "#pragma pack(pop[, id], ) n'est pas permis sur cette cible" + +#~ msgid "missing '(' after '#pragma pack' - ignored" +#~ msgstr "« ( » manquante après « #pragma pack » - ignoré" + +#~ msgid "malformed '#pragma pack' - ignored" +#~ msgstr "« #pragma pack » mal composée - ignoré" + +#~ msgid "malformed '#pragma pack(push[, id], )' - ignored" +#~ msgstr "« #pragma pack(push[, id], ) » mal composée - ignoré" + +#~ msgid "malformed '#pragma pack(pop[, id])' - ignored" +#~ msgstr "« #pragma pack(pop[, id]) » mal composée, ignoré" + +#~ msgid "unknown action '%s' for '#pragma pack' - ignored" +#~ msgstr "action « %s » inconnue pour « #pragma pack » - ignoré" + +#~ msgid "junk at end of '#pragma pack'" +#~ msgstr "rebut à la fin de « #pragma pack »" + +#~ msgid "alignment must be a small power of two, not %d" +#~ msgstr "l'alignement doit être une petite puissance de 2, pas %d" + +#~ msgid "%Japplying #pragma weak '%D' after first use results in unspecified behavior" +#~ msgstr "%Japplication de la #pragma weak « %D » après la première utilisation conduit à un comportement non spécifié" + +#~ msgid "malformed #pragma weak, ignored" +#~ msgstr "#pragma weak mal composée, ignoré" + +#~ msgid "junk at end of #pragma weak" +#~ msgstr "rebut à la fin de #pragma weak" + +#~ msgid "malformed #pragma redefine_extname, ignored" +#~ msgstr "#pragma redefine_extname mal composée, ignoré" + +#~ msgid "junk at end of #pragma redefine_extname" +#~ msgstr "rebut à la fin de #pragma redefine_extname" + +#~ msgid "#pragma redefine_extname conflicts with declaration" +#~ msgstr "#pragma redefine_extname en conflit avec la déclaration" + +#~ msgid "malformed #pragma extern_prefix, ignored" +#~ msgstr "#pragma extern_prefix mal composée, ignoré" + +#~ msgid "junk at end of #pragma extern_prefix" +#~ msgstr "rebut à la fin de #pragma extern_prefix" + +#~ msgid "asm declaration conflicts with previous rename" +#~ msgstr "déclaration asm en conflit avec le changement de nom précédent" + +#~ msgid "destructor needed for `%D'" +#~ msgstr "destructeur requis pour « %D »" + +#~ msgid "where case label appears here" +#~ msgstr "où les étiquettes de « case » apparaissent ici" + +# FIXME +#~ msgid "(enclose actions of previous case statements requiring destructors in their own scope.)" +#~ msgstr "(les actions dans les « case » précédents requierent des destructeurs dans leur propre champ.)" + +#~ msgid "%s qualifier ignored on asm" +#~ msgstr "%s qualificateur ignoré avec asm" + +# FIXME: c'est de l'assembleur ? +#~ msgid "will never be executed" +#~ msgstr "ne sera jamais exécuté" + +#~ msgid "`%s' has an incomplete type" +#~ msgstr "« %s » a un type incomplet" + +#~ msgid "invalid use of void expression" +#~ msgstr "utilisation invalide d'expression void" + +#~ msgid "invalid use of flexible array member" +#~ msgstr "utilisation invalide d'un membre flexible de tableau" + +#~ msgid "invalid use of array with unspecified bounds" +#~ msgstr "utilisation invalide d'un tableau sans borne spécifiée" + +#~ msgid "invalid use of undefined type `%s %s'" +#~ msgstr "utilisation invalide d'un type indéfini « %s %s »" + +#~ msgid "invalid use of incomplete typedef `%s'" +#~ msgstr "utilisation invalide d'un typedef incomplet « %s »" + +#~ msgid "function types not truly compatible in ISO C" +#~ msgstr "types de fonction pas vraiment compatibles en C ISO" + +#~ msgid "types are not quite compatible" +#~ msgstr "les types ne sont pas vraiment compatibles" + +#~ msgid "function return types not compatible due to `volatile'" +#~ msgstr "les types retournés d'une fonction ne sont pas compatibles en raison de « volatile »" + +#~ msgid "arithmetic on pointer to an incomplete type" +#~ msgstr "arithmétique sur un pointeur vers un type incomplet" + +#~ msgid "%s has no member named `%s'" +#~ msgstr "%s n'a pas de membre nommé « %s »" + +#~ msgid "request for member `%s' in something not a structure or union" +#~ msgstr "requête du membre « %s » dans quelque chose n'étant ni une structure ni une union" + +#~ msgid "dereferencing pointer to incomplete type" +#~ msgstr "déréférencement d'un pointeur de type incomplet" + +#~ msgid "dereferencing `void *' pointer" +#~ msgstr "déréférencement d'un pointeur « void * »" + +#~ msgid "invalid type argument of `%s'" +#~ msgstr "type d'argument invalide pour « %s »" + +#~ msgid "subscript missing in array reference" +#~ msgstr "indice manquant dans la référence du tableau" + +#~ msgid "array subscript has type `char'" +#~ msgstr "l'indice du tableau est de type « char »" + +#~ msgid "array subscript is not an integer" +#~ msgstr "l'indice du tableau n'est pas un entier" + +#~ msgid "ISO C forbids subscripting `register' array" +#~ msgstr "ISO C interdit de sous-indicer des tableaux « register »" + +#~ msgid "ISO C90 forbids subscripting non-lvalue array" +#~ msgstr "ISO C90 interdit d'indicer de tableau n'étant pas membre gauche" + +#~ msgid "subscript has type `char'" +#~ msgstr "indice de type « char »" + +#~ msgid "subscripted value is neither array nor pointer" +#~ msgstr "la valeur indicée n'est ni un tableau ni un pointeur" + +#~ msgid "local declaration of `%s' hides instance variable" +#~ msgstr "la déclaration locale de « %s » masque l'instance d'une variable" + +#~ msgid "called object is not a function" +#~ msgstr "l'objet appelé n'est pas une fonction" + +#~ msgid "function called through a non-compatible type" +#~ msgstr "fonction appellée à travers un type non compatible" + +#~ msgid "too many arguments to function" +#~ msgstr "trop d'arguments pour la fonction" + +#~ msgid "type of formal parameter %d is incomplete" +#~ msgstr "le type du paramètre formel %d est incomplet" + +#~ msgid "%s as integer rather than floating due to prototype" +#~ msgstr "%s est entier plutôt que flottant en raison du prototype" + +#~ msgid "%s as integer rather than complex due to prototype" +#~ msgstr "%s est entier plutôt que complexe en raison du prototype" + +#~ msgid "%s as complex rather than floating due to prototype" +#~ msgstr "%s est complexe plutôt que flottant en raison du prototype" + +#~ msgid "%s as floating rather than integer due to prototype" +#~ msgstr "%s est flottant plutôt qu'entier en raison du prototype" + +#~ msgid "%s as complex rather than integer due to prototype" +#~ msgstr "%s est complexe plutôt qu'entier en raison du prototype" + +#~ msgid "%s as floating rather than complex due to prototype" +#~ msgstr "%s est flottant plutôt que complexe en raison du prototype" + +#~ msgid "%s as `float' rather than `double' due to prototype" +#~ msgstr "%s est « float » plutôt qu'un « double » en raison du prototype" + +#~ msgid "%s with different width due to prototype" +#~ msgstr "%s a une largeur différente en raison du prototype" + +#~ msgid "%s as unsigned due to prototype" +#~ msgstr "%s est non signé en raison du prototype" + +#~ msgid "%s as signed due to prototype" +#~ msgstr "%s est signé en raison du prototype" + +#~ msgid "too few arguments to function" +#~ msgstr "trop peu d'arguments pour la fonction" + +#~ msgid "suggest parentheses around + or - inside shift" +#~ msgstr "parenthèses suggérées autour de + ou - à l'intérieur du décalage" + +#~ msgid "suggest parentheses around && within ||" +#~ msgstr "parenthèses suggérées autour de && à l'intérieur de ||" + +#~ msgid "suggest parentheses around arithmetic in operand of |" +#~ msgstr "parenthèses suggérées autour de l'arithmétique dans l'opérande de |" + +#~ msgid "suggest parentheses around comparison in operand of |" +#~ msgstr "parenthèses suggérées autour de la comparaison dans l'opérande de |" + +#~ msgid "suggest parentheses around arithmetic in operand of ^" +#~ msgstr "parenthèses suggérées autour de l'arithmétique dans l'opérande de ^" + +#~ msgid "suggest parentheses around comparison in operand of ^" +#~ msgstr "parenthèses suggérées autour de la comparaison dans l'opérande de ^" + +#~ msgid "suggest parentheses around + or - in operand of &" +#~ msgstr "parenthèses suggérées autour de + ou - dans l'opérande de &" + +#~ msgid "suggest parentheses around comparison in operand of &" +#~ msgstr "parenthèses suggérées autour de la comparaison dans l'opérande de &" + +#~ msgid "comparisons like X<=Y<=Z do not have their mathematical meaning" +#~ msgstr "les comparaisons telles que X<=Y<=Z n'ont pas de signification mathématique" + +#~ msgid "pointer of type `void *' used in subtraction" +#~ msgstr "pointeur de type « void * » utilisé dans une soustraction" + +#~ msgid "pointer to a function used in subtraction" +#~ msgstr "pointeur vers un fonction utilisé dans une soustraction" + +#~ msgid "wrong type argument to unary plus" +#~ msgstr "type d'argument erroné pour le plus unaire" + +#~ msgid "wrong type argument to unary minus" +#~ msgstr "type d'argument erroné pour le moins unaire" + +#~ msgid "ISO C does not support `~' for complex conjugation" +#~ msgstr "ISO C ne permet pas d'utiliser « ~ » pour le complexe conjugué" + +#~ msgid "wrong type argument to bit-complement" +#~ msgstr "type d'argument erroné pour un complément de bit" + +#~ msgid "wrong type argument to abs" +#~ msgstr "type d'argument erroné pour abs" + +#~ msgid "wrong type argument to conjugation" +#~ msgstr "type d'argument erroné pour la conjugaison" + +#~ msgid "wrong type argument to unary exclamation mark" +#~ msgstr "type d'argument erroné pour le point d'exclamation unaire" + +#~ msgid "ISO C does not support `++' and `--' on complex types" +#~ msgstr "ISO C ne permet pas « ++ » ni « -- » sur les types complexes" + +#~ msgid "wrong type argument to increment" +#~ msgstr "type d'argument erroné pour un incrément" + +#~ msgid "wrong type argument to decrement" +#~ msgstr "type d'argument erroné pour un décrément" + +#~ msgid "increment of pointer to unknown structure" +#~ msgstr "incrément d'un pointeur vers une structure inconnue" + +#~ msgid "decrement of pointer to unknown structure" +#~ msgstr "décrément d'un pointeur vers une structure inconnue" + +#~ msgid "invalid lvalue in unary `&'" +#~ msgstr "membre gauche invalide pour le « & » unaire" + +#~ msgid "attempt to take address of bit-field structure member `%s'" +#~ msgstr "tentative pour prendre l'adresse du membre « %s » d'une structure de champ de bits" + +#~ msgid "use of conditional expressions as lvalues is deprecated" +#~ msgstr "utilisation d'expressions conditionnelles comme lvalues est obsolète" + +#~ msgid "use of compound expressions as lvalues is deprecated" +#~ msgstr "utilisation d'expressions composées comme lvalues est obsolète" + +#~ msgid "use of cast expressions as lvalues is deprecated" +#~ msgstr "utilisation de transtypage d'expressions comme lvalues est obsolète" + +#~ msgid "%s of read-only member `%s'" +#~ msgstr "%s d'un membre en lecture seule « %s »" + +#~ msgid "%s of read-only variable `%s'" +#~ msgstr "%s d'une variable en lecture seule « %s »" + +#~ msgid "%s of read-only location" +#~ msgstr "%s d'une position en lecture seule" + +#~ msgid "cannot take address of bit-field `%s'" +#~ msgstr "ne peut prendre l'adresse du champ de bits « %s »" + +#~ msgid "global register variable `%s' used in nested function" +#~ msgstr "variable globale de registre « %s » utilisée dans une fonction imbriquée" + +#~ msgid "register variable `%s' used in nested function" +#~ msgstr "variable de registre « %s » utilisée dans une fonction imbriquée" + +#~ msgid "address of global register variable `%s' requested" +#~ msgstr "adresse d'une variable registre globale « %s » requise" + +#~ msgid "cannot put object with volatile field into register" +#~ msgstr "impossible de mettre un objet avec un champ volatile dans un registre" + +#~ msgid "address of register variable `%s' requested" +#~ msgstr "adresse d'une variable registre « %s » requise" + +#~ msgid "signed and unsigned type in conditional expression" +#~ msgstr "type signé et non signé dans une expression conditionnelle" + +#~ msgid "ISO C forbids conditional expr with only one void side" +#~ msgstr "ISO C interdit une expression conditionnelle dont un seul côté est « void »" + +#~ msgid "ISO C forbids conditional expr between `void *' and function pointer" +#~ msgstr "ISO C interdit une expression conditionnelle entre « void * » et un pointeur de fonction" + +#~ msgid "pointer type mismatch in conditional expression" +#~ msgstr "non concordance de type de pointeurs dans un expression conditionnelle" + +#~ msgid "pointer/integer type mismatch in conditional expression" +#~ msgstr "non concordance entre pointeur et entier dans une expression conditionnelle" + +#~ msgid "type mismatch in conditional expression" +#~ msgstr "non concordance de type dans une expression conditionnelle" + +#~ msgid "left-hand operand of comma expression has no effect" +#~ msgstr "l'opérande à gauche de la virgule n'a pas d'effet" + +#~ msgid "cast specifies array type" +#~ msgstr "le transtypage spécifie un type de tableau" + +#~ msgid "cast specifies function type" +#~ msgstr "le transtypage spécifie un type de fonction" + +#~ msgid "ISO C forbids casting nonscalar to the same type" +#~ msgstr "ISO C interdit le transtypage d'un type non scalaire vers lui-même" + +#~ msgid "ISO C forbids casts to union type" +#~ msgstr "ISO C interdit le transtypage vers un type union" + +#~ msgid "cast to union type from type not present in union" +#~ msgstr "transtypage vers un type union depuis un type absent de l'union" + +#~ msgid "cast adds new qualifiers to function type" +#~ msgstr "le transtypage ajoute un nouveau qualificateur au type de la fonction" + +#~ msgid "cast discards qualifiers from pointer target type" +#~ msgstr "le transtypage annule des qualificateurs du type pointeur ciblé" + +#~ msgid "cast increases required alignment of target type" +#~ msgstr "le transtypage augmente l'alignement requis pour le type ciblé" + +#~ msgid "cast from pointer to integer of different size" +#~ msgstr "transtypage d'un pointeur vers un entier de taille différente" + +#~ msgid "cast does not match function type" +#~ msgstr "le transtypage ne concorde pas avec le type de la fonction" + +#~ msgid "cast to pointer from integer of different size" +#~ msgstr "transtypage vers un pointeur depuis un entier de taille différente" + +# FIXME +#~ msgid "type-punning to incomplete type might break strict-aliasing rules" +#~ msgstr "type-punning vers un type incomplet peut briser les règles stricte d'aliases" + +# FIXME +#~ msgid "dereferencing type-punned pointer will break strict-aliasing rules" +#~ msgstr "déréférencement du pointeur type-punned brisera les strictes d'aliases" + +#~ msgid "ISO C forbids conversion of function pointer to object pointer type" +#~ msgstr "ISO C interdit la conversion d'un pointeur de fonction en un type pointeur d'objet" + +#~ msgid "ISO C forbids conversion of object pointer to function pointer type" +#~ msgstr "ISO C interdit la conversion d'un pointeur d'objet vers un type de pointeur à une fonction" + +#~ msgid "invalid lvalue in assignment" +#~ msgstr "membre gauche de l'affectation invalide" + +#~ msgid "assignment" +#~ msgstr "affectation" + +#~ msgid "cannot pass rvalue to reference parameter" +#~ msgstr "impossible de passer un membre droit en paramètre par référence" + +#~ msgid "%s makes qualified function pointer from unqualified" +#~ msgstr "%s qualifie un pointeur de fonction non qualifié" + +#~ msgid "%s discards qualifiers from pointer target type" +#~ msgstr "%s annule des qualificateurs du type du pointeur cible" + +#~ msgid "ISO C prohibits argument conversion to union type" +#~ msgstr "ISO C interdit la conversion d'argument en type union" + +#~ msgid "ISO C forbids %s between function pointer and `void *'" +#~ msgstr "ISO C interdit %s entre pointeur de fonction et « void * »" + +#~ msgid "pointer targets in %s differ in signedness" +#~ msgstr "les cibles des pointeurs dans %s n'ont pas toutes de signe" + +#~ msgid "%s from incompatible pointer type" +#~ msgstr "%s d'un type pointeur incompatible" + +#~ msgid "invalid use of non-lvalue array" +#~ msgstr "utilisation invalide d'un tableau n'étant pas membre gauche" + +#~ msgid "%s makes pointer from integer without a cast" +#~ msgstr "%s transforme un entier en pointeur sans transtypage" + +#~ msgid "%s makes integer from pointer without a cast" +#~ msgstr "%s transforme un pointeur en entier sans transtypage" + +#~ msgid "incompatible type for argument %d of `%s'" +#~ msgstr "type incompatible pour l'argument n°%d de « %s »" + +#~ msgid "incompatible type for argument %d of indirect function call" +#~ msgstr "type incompatible pour l'argument n°%d de l'appel indirect de fonction" + +#~ msgid "incompatible types in %s" +#~ msgstr "type incompatibles dans %s" + +#~ msgid "passing arg of `%s'" +#~ msgstr "passage des arguments de « %s »" + +#~ msgid "passing arg of pointer to function" +#~ msgstr "passage des arguments au pointeur de fonction" + +#~ msgid "passing arg %d of `%s'" +#~ msgstr "passage de l'argument n°%d de « %s »" + +#~ msgid "passing arg %d of pointer to function" +#~ msgstr "passage de l'argument n°%d au pointeur de fonction" + +#~ msgid "traditional C rejects automatic aggregate initialization" +#~ msgstr "le C traditionel rejette l'initialisation automatique d'aggrégats" + +#~ msgid "(near initialization for `%s')" +#~ msgstr "(près de l'initialisation de « %s »)" + +#~ msgid "char-array initialized from wide string" +#~ msgstr "tableau de caractères initialisé à l'aide d'une chaîne large de caractères" + +#~ msgid "int-array initialized from non-wide string" +#~ msgstr "tableau d'entier initialisé à l'aide d'une chaîne non-large" + +#~ msgid "initializer-string for array of chars is too long" +#~ msgstr "la chaîne d'initialisation est trop longue pour le tableau de caractères" + +#~ msgid "array initialized from non-constant array expression" +#~ msgstr "tableau initialisé à l'aide de l'expression de tableau non constante" + +#~ msgid "initializer element is not constant" +#~ msgstr "un élément de l'initialisation n'est pas une constante" + +#~ msgid "initialization" +#~ msgstr "initialisation" + +#~ msgid "initializer element is not computable at load time" +#~ msgstr "un élément de l'initialisation n'est pas évaluable lors du chargement" + +#~ msgid "invalid initializer" +#~ msgstr "initialisation invalide" + +#~ msgid "opaque vector types cannot be initialized" +#~ msgstr "type de vecteur opaque ne peut être initialisé" + +#~ msgid "extra brace group at end of initializer" +#~ msgstr "groupe d'accolades superflu à la fin de l'initialisation" + +#~ msgid "missing braces around initializer" +#~ msgstr "accolades manquantes autour de l'initialisation" + +#~ msgid "braces around scalar initializer" +#~ msgstr "accolades autour d'une initialisation de scalaire" + +#~ msgid "initialization of flexible array member in a nested context" +#~ msgstr "initialisation d'un membre de tableau flexible dans un contexte imbriqué" + +#~ msgid "initialization of a flexible array member" +#~ msgstr "initialisation d'un membre de tableau flexible" + +#~ msgid "missing initializer" +#~ msgstr "initialisation manquante" + +#~ msgid "empty scalar initializer" +#~ msgstr "initialisation vide de scalaire" + +#~ msgid "extra elements in scalar initializer" +#~ msgstr "éléments superflus dans l'initialisation de scalaire" + +#~ msgid "initialization designators may not nest" +#~ msgstr "l'initialisation des désignateurs ne doit pas être imbriquée" + +#~ msgid "array index in non-array initializer" +#~ msgstr "index de tableau dans l'initialisation de quelque chose n'étant pas un tableau" + +#~ msgid "field name not in record or union initializer" +#~ msgstr "nom de champ dans l'initialisation de quelque chose n'étant ni un enregistrement ni une union" + +#~ msgid "nonconstant array index in initializer" +#~ msgstr "index de tableau non constant dans l'initialisation" + +#~ msgid "array index in initializer exceeds array bounds" +#~ msgstr "index de tableau hors limites lors de l'initialisation" + +#~ msgid "empty index range in initializer" +#~ msgstr "borne d'index vide lors de l'initialisation" + +#~ msgid "array index range in initializer exceeds array bounds" +#~ msgstr "plage d'index du tableau excédant les bornes lors de l'initialisation" + +#~ msgid "unknown field `%s' specified in initializer" +#~ msgstr "champ inconnu « %s » spécifié lors de l'initialisation" + +#~ msgid "initialized field with side-effects overwritten" +#~ msgstr "le champ initialisé par effet de bord a été écrasé" + +#~ msgid "excess elements in char array initializer" +#~ msgstr "éléments en excès dans l'initialisation de tableau de caractères" + +#~ msgid "excess elements in struct initializer" +#~ msgstr "éléments en excès dans l'initialisation de la structure" + +#~ msgid "non-static initialization of a flexible array member" +#~ msgstr "initialisation non statique d'un membre de tableau flexible" + +#~ msgid "excess elements in union initializer" +#~ msgstr "éléments en excès dans l'initialisation d'union" + +#~ msgid "traditional C rejects initialization of unions" +#~ msgstr "le C traditionel rejette l'initialisation d'union" + +#~ msgid "excess elements in array initializer" +#~ msgstr "éléments en excès dans l'initialisation de tableau" + +#~ msgid "excess elements in vector initializer" +#~ msgstr "éléments en excès dans l'initialisation du vecteur" + +#~ msgid "excess elements in scalar initializer" +#~ msgstr "éléments en excès dans l'initialisation d'un scalaire" + +#~ msgid "asm template is not a string constant" +#~ msgstr "le canevas asm n'est pas une chaîne de constante" + +#~ msgid "invalid lvalue in asm statement" +#~ msgstr "membre gauche invalide avec asm" + +#~ msgid "modification by `asm'" +#~ msgstr "modification par « asm »" + +#~ msgid "function declared `noreturn' has a `return' statement" +#~ msgstr "fonction déclarée avec « noreturn» utilisant le mot-clé « return »" + +#~ msgid "`return' with no value, in function returning non-void" +#~ msgstr "« return » sans valeur dans une fonction retournant autre chose que void" + +#~ msgid "`return' with a value, in function returning void" +#~ msgstr "« return » avec une valeur dans une fonction retournant un void" + +#~ msgid "return" +#~ msgstr "return" + +#~ msgid "function returns address of local variable" +#~ msgstr "cette fonction retourne l'adresse d'une variable locale" + +#~ msgid "switch quantity not an integer" +#~ msgstr "quantité du switch n'est pas un entier" + +#~ msgid "`long' switch expression not converted to `int' in ISO C" +#~ msgstr "expression « long » du switch non convertie en « int » par ISO C" + +#~ msgid "case label not within a switch statement" +#~ msgstr "étiquette de « case » en dehors de tout switch" + +#~ msgid "`default' label not within a switch statement" +#~ msgstr "étiquette « default » en dehors de tout switch" + +#~ msgid "division by zero" +#~ msgstr "division par zéro" + +#~ msgid "right shift count is negative" +#~ msgstr "le compteur de décalage vers la droite est négatif" + +#~ msgid "right shift count >= width of type" +#~ msgstr "compteur de décalage vers la droite >= à la largeur du type" + +#~ msgid "left shift count is negative" +#~ msgstr "le compteur de décalage vers la gauche est négatif" + +#~ msgid "left shift count >= width of type" +#~ msgstr "compteur de décalage vers la gauche >= à la largeur du type" + +#~ msgid "shift count is negative" +#~ msgstr "le compteur de décalage est négatif" + +#~ msgid "shift count >= width of type" +#~ msgstr "compteur de décalage >= à la largeur du type" + +#~ msgid "comparing floating point with == or != is unsafe" +#~ msgstr "comparer des nombres flottants à l'aide de == ou != n'est pas sûr" + +#~ msgid "ISO C forbids comparison of `void *' with function pointer" +#~ msgstr "ISO C interdit la comparaison de « void * » avec un pointeur de fonction" + +#~ msgid "comparison of distinct pointer types lacks a cast" +#~ msgstr "il manque un transtypage pour comparer des types distincts de pointeur" + +#~ msgid "comparison between pointer and integer" +#~ msgstr "comparaison entre un pointeur et un entier" + +#~ msgid "ISO C forbids ordered comparisons of pointers to functions" +#~ msgstr "ISO C interdit les comparaisons ordonnées de pointeurs vers des fonctions" + +#~ msgid "comparison of complete and incomplete pointers" +#~ msgstr "comparaison de pointeurs complet et incomplet" + +#~ msgid "ordered comparison of pointer with integer zero" +#~ msgstr "comparaison ordonnée de pointeur avec le zéro entier" + +#~ msgid "unordered comparison on non-floating point argument" +#~ msgstr "comparaison non ordonnée sur un argument n'étant pas en virgule flottante" + +#~ msgid "comparison between signed and unsigned" +#~ msgstr "comparaison entre élément signé et élément non signé" + +#~ msgid "comparison of promoted ~unsigned with constant" +#~ msgstr "comparaison entre élément promu ~unsigned et une constante" + +#~ msgid "comparison of promoted ~unsigned with unsigned" +#~ msgstr "comparaison entre élément promu ~unsigned et un élément non signé" + +#~ msgid "%Jinlining failed in call to '%F'" +#~ msgstr "%Jenlignage a échoué dans l'appel à « %F »" + +#~ msgid "called from here" +#~ msgstr "appelé d'ici" + +#~ msgid "%Jcan't inline call to '%F'" +#~ msgstr "%Jimpossible d'enligner l'appel à « %F »" + +#~ msgid "ignoring return value of `%D', declared with attribute warn_unused_result" +#~ msgstr "valeur à retourner « %D » ignorée, déclaré avec l'attribut warn_unused_result" + +#~ msgid "ignoring return value of function declared with attribute warn_unused_result" +#~ msgstr "valeur à retourner d'une fonction ignorée, déclaré avec l'attribut warn_unused_result" + +#~ msgid "function call has aggregate value" +#~ msgstr "l'appel de fonction a une valeur d'aggrégat" + +#~ msgid "bb %d on wrong place" +#~ msgstr "bb %d au mauvais endroit" + +#~ msgid "prev_bb of %d should be %d, not %d" +#~ msgstr "prev_bb de %d devrait être %d, pas %d" + +#~ msgid "verify_flow_info: Wrong count of block %i %i" +#~ msgstr "verify_flow_info: Nombre de blocs erroné %i %i" + +#~ msgid "verify_flow_info: Wrong frequency of block %i %i" +#~ msgstr "verify_flow_info: Fréquence de blocs erronée %i %i" + +#~ msgid "verify_flow_info: Duplicate edge %i->%i" +#~ msgstr "verify_flow_info: arrête dupliquée %i->%i" + +#~ msgid "verify_flow_info: Wrong probability of edge %i->%i %i" +#~ msgstr "verify_flow_info: probabilité de l'arrête %i->%i %i erronée" + +#~ msgid "verify_flow_info: Wrong count of edge %i->%i %i" +#~ msgstr "verify_flow_info: Mauvais nombre d'arrête %i->%i %i" + +#~ msgid "verify_flow_info: Basic block %d succ edge is corrupted" +#~ msgstr "verify_flow_info: l'arrête succ du bloc de base %d est corrompue" + +#~ msgid "Wrong amount of branch edges after unconditional jump %i" +#~ msgstr "Mauvais nombre d'arrêtes de branchement après le branchement inconditionnel %i" + +#~ msgid "basic block %d pred edge is corrupted" +#~ msgstr "arrête pred du bloc de base %d corrompue" + +#~ msgid "basic block %i edge lists are corrupted" +#~ msgstr "les listes d'arrêtes du bloc de base %i sont corrompues" + +#~ msgid "verify_flow_info failed" +#~ msgstr "verify_flow_info a échoué" + +#~ msgid "Size of loop %d should be %d, not %d." +#~ msgstr "La taille de la boucle %d devrait être %d, et non %d." + +# FIXME +#~ msgid "Bb %d do not belong to loop %d." +#~ msgstr "Bb %d n'appartient pas à la boucle %d." + +#~ msgid "Loop %d's header does not have exactly 2 entries." +#~ msgstr "L'en-tête de la boucle %d n'a pas exactement 2 entrées." + +#~ msgid "Loop %d's latch does not have exactly 1 successor." +#~ msgstr "Le verrou %d de la boucle n'a pas exactement 1 successeur." + +#~ msgid "Loop %d's latch does not have header as successor." +#~ msgstr "Le verrou %d de la boucle n'a pas une en-tête comme successeur." + +#~ msgid "Loop %d's latch does not belong directly to it." +#~ msgstr "Le verrou %d de la boucle ne lui appartient pas directement." + +#~ msgid "Loop %d's header does not belong directly to it." +#~ msgstr "L'entête de la boucle %d ne lui appartient pas directement." + +#~ msgid "Loop %d's latch is marked as part of irreducible region." +#~ msgstr "Le verrou %d de la boucle est défini comme faisant partie d'une zone irréductible" + +#~ msgid "Basic block %d should be marked irreducible." +#~ msgstr "bloc de base %d devrait être marqué irréductible." + +#~ msgid "Basic block %d should not be marked irreducible." +#~ msgstr "bloc de base %d ne devrait pas être marqué irréductible." + +#~ msgid "Edge from %d to %d should be marked irreducible." +#~ msgstr "Bordures à partir de %d à %d devraient être marqués irréductibles." + +#~ msgid "Edge from %d to %d should not be marked irreducible." +#~ msgstr "Bordures à partir de %d à %d ne devraient être marquées irréductibles." + +#~ msgid "end insn %d for block %d not found in the insn stream" +#~ msgstr "fin insn %d du bloc %d n'a pas été repéré dans le flot insn" + +#~ msgid "insn %d is in multiple basic blocks (%d and %d)" +#~ msgstr "insn %d est dans de multiples blocs de base (%d et %d)" + +#~ msgid "head insn %d for block %d not found in the insn stream" +#~ msgstr "en-tête insn %d du bloc %d n'a pas été repérée dans le flot insn" + +#~ msgid "verify_flow_info: REG_BR_PROB does not match cfg %wi %i" +#~ msgstr "verify_flow_info: REG_BR_PROB ne correspond pas à la config %wi %i" + +#~ msgid "Missing REG_EH_REGION note in the end of bb %i" +#~ msgstr "REG_EH_REGION note manquante à la fin du bb %i" + +#~ msgid "Too many outgoing branch edges from bb %i" +#~ msgstr "Trop d'arrêtes de branchement sortantes dans le bb %i" + +#~ msgid "Fallthru edge after unconditional jump %i" +#~ msgstr "Arrête fallthru après le branchement inconditionnel %i" + +#~ msgid "Wrong amount of branch edges after conditional jump %i" +#~ msgstr "Mauvais nombre d'arrêtes de branchement après le branchement conditionnel %i" + +#~ msgid "Call edges for non-call insn in bb %i" +#~ msgstr "Arrêtes d'appel pour un insn n'étant pas d'appel dans le bb %i" + +#~ msgid "Abnormal edges for no purpose in bb %i" +#~ msgstr "Arrête anormale sans but dans le bb %i" + +#~ msgid "insn %d inside basic block %d but block_for_insn is NULL" +#~ msgstr "insn %d à l'intérieur du bloc de base %d mais block_for_insn est NULL" + +#~ msgid "insn %d inside basic block %d but block_for_insn is %i" +#~ msgstr "insn %d à l'intérieur du bloc de base %d mais block_for_insn est %i" + +#~ msgid "NOTE_INSN_BASIC_BLOCK is missing for block %d" +#~ msgstr "NOTE_INSN_BASIC_BLOCK manquant pour le bloc %d" + +#~ msgid "NOTE_INSN_BASIC_BLOCK %d in middle of basic block %d" +#~ msgstr "NOTE_INSN_BASIC_BLOCK %d au milieu du bloc de base %d" + +#~ msgid "in basic block %d:" +#~ msgstr "dans le bloc de base %d :" + +#~ msgid "flow control insn inside a basic block" +#~ msgstr "insn de contrôle de flot à l'intérieur d'un bloc de base" + +#~ msgid "missing barrier after block %i" +#~ msgstr "barrière manquante après le boc %i" + +#~ msgid "verify_flow_info: Incorrect blocks for fallthru %i->%i" +#~ msgstr "verify_flow_info: blocs incorrects pour le fallthru %i->%i" + +#~ msgid "verify_flow_info: Incorrect fallthru %i->%i" +#~ msgstr "verify_flow_info: fallthru incorrect %i->%i" + +#~ msgid "wrong insn in the fallthru edge" +#~ msgstr "insn erronée dans l'arrête fallthru" + +#~ msgid "basic blocks not laid down consecutively" +#~ msgstr "les blocs de base ne se suivent pas consécutivement" + +#~ msgid "insn outside basic block" +#~ msgstr "insn à l'extérieur de tout bloc de base" + +#~ msgid "return not followed by barrier" +#~ msgstr "return n'est pas suivi d'une barrière" + +# FIXME +# bb est une abréviation courante dans cette partie du fichier pour « basic block » +#~ msgid "number of bb notes in insn chain (%d) != n_basic_blocks (%d)" +#~ msgstr "nombre de bb noté dans la chaîne d'insn (%d) != n_basic_blocks (%d)" + +#~ msgid "function body not available" +#~ msgstr "corps de la fonction n'est pas disponible" + +#~ msgid "redefined extern inline functions are not considered for inlining" +#~ msgstr "fonctions externes enlignes redéfinies n'ont pas été retenues pour l'enlignage" + +#~ msgid "function not considered for inlining" +#~ msgstr "fonction n'a pas été retenue pour l'enlignage" + +#~ msgid "function not inlinable" +#~ msgstr "fonction ne peut être enligne" + +#~ msgid "%D renamed after being referenced in assembly" +#~ msgstr "« %D » renommé après avoir été référencé durant l'assemblage" + +#~ msgid "--param large-function-growth limit reached" +#~ msgstr "--param large-function-growth limite atteinte" + +#~ msgid "--param large-function-growth limit reached while inlining the caller" +#~ msgstr "--param large-function-growth limite atteinte lors de l'enlignage de l'appelant" + +#~ msgid "--param max-inline-insns-single limit reached" +#~ msgstr "--param max-inline-insns-single limite atteinte" + +#~ msgid "--param max-inline-insns-single limit reached after inlining into the callee" +#~ msgstr "--param max-inline-insns-single limite atteinte après l'enlignage dans l'appellé" + +#~ msgid "--param inline-unit-growth limit reached" +#~ msgstr "--param inline-unit-growth limite atteinte" + +#~ msgid "recursive inlining" +#~ msgstr "enlignage récursif" + +#~ msgid "internal error" +#~ msgstr "erreur interne" + +#~ msgid "no arguments" +#~ msgstr "pas d'argument" + +# I18N +#~ msgid "fopen %s" +#~ msgstr "fopen() %s" + +# I18N +#~ msgid "fclose %s" +#~ msgstr "fclose() %s" + +#~ msgid "collect2 version %s" +#~ msgstr "collect2 version %s" + +#~ msgid "%d constructor(s) found\n" +#~ msgstr "%d constructeur(s) trouvé(s)\n" + +#~ msgid "%d destructor(s) found\n" +#~ msgstr "%d destructeur(s) trouvé(s)\n" + +#~ msgid "%d frame table(s) found\n" +#~ msgstr "%d table(s) de trame trouvée(s)\n" + +#~ msgid "%s terminated with signal %d [%s]%s" +#~ msgstr "%s terminé par le signal %d [%s]%s" + +#~ msgid "%s returned %d exit status" +#~ msgstr "%s a retourné %d comme valeur de sortie" + +#~ msgid "[cannot find %s]" +#~ msgstr "[%s introuvable]" + +#~ msgid "cannot find `%s'" +#~ msgstr "« %s » introuvable" + +#~ msgid "redirecting stdout: %s" +#~ msgstr "redirection de stdout : %s" + +# FIXME +#~ msgid "[Leaving %s]\n" +#~ msgstr "[Laissant %s]\n" + +#~ msgid "" +#~ "\n" +#~ "write_c_file - output name is %s, prefix is %s\n" +#~ msgstr "" +#~ "\n" +#~ "write_c_file - le nom de sortie est %s, le préfixe est %s\n" + +#~ msgid "cannot find `nm'" +#~ msgstr "« nm » introuvable" + +# I18N +#~ msgid "pipe" +#~ msgstr "pipe" + +# I18N +#~ msgid "fdopen" +#~ msgstr "fdopen" + +# I18N +#~ msgid "dup2 %d 1" +#~ msgstr "dup2 %d 1" + +# I18N +#~ msgid "close %d" +#~ msgstr "close %d" + +# I18N +#~ msgid "execv %s" +#~ msgstr "execv %s" + +#~ msgid "init function found in object %s" +#~ msgstr "fonction init trouvée dans l'objet %s" + +#~ msgid "fini function found in object %s" +#~ msgstr "fonction fini() trouvée dans l'objet %s" + +# I18N +#~ msgid "fclose" +#~ msgstr "fclose" + +#~ msgid "unable to open file '%s'" +#~ msgstr "impossible d'ouvrir le fichier « %s »" + +#~ msgid "unable to stat file '%s'" +#~ msgstr "impossible d'analyser le fichier « %s » avec stat()" + +#~ msgid "unable to mmap file '%s'" +#~ msgstr "incpable de projeter en mémoire le fichier « %s » avec nmap()" + +#~ msgid "not found\n" +#~ msgstr "introuvable\n" + +#~ msgid "dynamic dependency %s not found" +#~ msgstr "dépendance dynamique %s introuvable" + +#~ msgid "bad magic number in file '%s'" +#~ msgstr "le nombre magique du fichier « %s » est erroné" + +#~ msgid "dynamic dependencies.\n" +#~ msgstr "dépendances dynamiques.\n" + +#~ msgid "cannot find `ldd'" +#~ msgstr "« ldd » introuvable" + +#~ msgid "" +#~ "\n" +#~ "ldd output with constructors/destructors.\n" +#~ msgstr "" +#~ "\n" +#~ "sortie de ldd avec constructeurs/destructeurs.\n" + +#~ msgid "unable to open dynamic dependency '%s'" +#~ msgstr "incapable d'ouvrir la dépendance dynamique « %s »" + +#~ msgid "%s: not a COFF file" +#~ msgstr "%s : n'est pas un fichier COFF" + +#~ msgid "%s: cannot open as COFF file" +#~ msgstr "%s : ne peut ouvrir en tant que fichier COFF" + +# I18N +#~ msgid "library lib%s not found" +#~ msgstr "bibliothèque lib%s introuvable" + +#~ msgid "" +#~ ";; Combiner statistics: %d attempts, %d substitutions (%d requiring new space),\n" +#~ ";; %d successes.\n" +#~ "\n" +#~ msgstr "" +#~ ";; Statistiques du combinateur : %d tentatives, %d substitutions (%d requérant un nouvel espace),\n" +#~ ";; %d succès.\n" +#~ "\n" + +#~ msgid "" +#~ "\n" +#~ ";; Combiner totals: %d attempts, %d substitutions (%d requiring new space),\n" +#~ ";; %d successes.\n" +#~ msgstr "" +#~ "\n" +#~ ";; Totaux du combinateur : %d tentatives, %d substitutions (%d requérant un nouvel espace),\n" +#~ ";; %d succès.\n" +#~ "\n" + +#~ msgid "cannot convert to a pointer type" +#~ msgstr "ne peut convertir en un type pointeur" + +#~ msgid "pointer value used where a floating point value was expected" +#~ msgstr "valeur de pointeur utilisée là où une valeur à virgule flottante était attendue" + +#~ msgid "aggregate value used where a float was expected" +#~ msgstr "valeur d'aggrégat utilisée là où un flottant était attendu" + +#~ msgid "conversion to incomplete type" +#~ msgstr "conversion vers un type incomplet" + +#~ msgid "can't convert between vector values of different size" +#~ msgstr "ne peut convertir entre des valeurs de vecteurs de tailles différentes" + +#~ msgid "aggregate value used where an integer was expected" +#~ msgstr "valeur d'aggrégat utilisée là où un entier était attendu" + +#~ msgid "pointer value used where a complex was expected" +#~ msgstr "valeur de pointeur utilisée là où un complexe était attendu" + +#~ msgid "aggregate value used where a complex was expected" +#~ msgstr "valeur d'aggrégat utilisée là où un complexe était attendu" + +#~ msgid "can't convert value to a vector" +#~ msgstr "ne peut convertir une valeur en vecteur" + +#~ msgid "`%s' is not a gcov data file" +#~ msgstr "« %s » n'est pas un fichier de données gcov" + +#~ msgid "`%s' is version `%.4s', expected version `%.4s'" +#~ msgstr "« %s » est de version « %.4s », version « %.4s » attendue" + +#~ msgid "coverage mismatch for function %u while reading execution counters." +#~ msgstr "non concordance de la couverture pour la fonction %u lors de la lecture des compteurs d'exécution" + +#~ msgid "checksum is %x instead of %x" +#~ msgstr "somme de contrôle est %x au lieu de %x" + +#~ msgid "number of counters is %d instead of %d" +#~ msgstr "nombre de compteurs est %d au lieu de %d" + +#~ msgid "cannot merge separate %s counters for function %u" +#~ msgstr "ne peut faire la fusion séparée des compteurs %s pour la fonction %u" + +#~ msgid "`%s' has overflowed" +#~ msgstr "« %s » a déborbé" + +#~ msgid "`%s' is corrupted" +#~ msgstr "« %s » est corrompu" + +#~ msgid "file %s not found, execution counts assumed to be zero" +#~ msgstr "fichier %s non repéré, compteur d'exécution assumé être à zéro" + +#~ msgid "no coverage for function '%s' found." +#~ msgstr "pas de couverture repérée pour la fonction « %s »" + +#~ msgid "coverage mismatch for function '%s' while reading counter '%s'." +#~ msgstr "non concordance de la couverture pour la fonction « %s » lors de la lecture des compteurs d'exécution « %s »" + +#~ msgid "cannot open %s" +#~ msgstr "ne peut ouvrir %s" + +#~ msgid "error writing `%s'" +#~ msgstr "erreur d'écriture dans %s" + +#~ msgid "\"%s\" is not a valid option to the preprocessor" +#~ msgstr "« %s » n'est pas une option valide pour le préprocesseur" + +#~ msgid "too many input files" +#~ msgstr "trop de fichiers d'entrée" + +# FIXME: Initialisé, ou ensembles? +#~ msgid ";; Processing block from %d to %d, %d sets.\n" +#~ msgstr ";; traitement du bloc de %d à %d, %d initialisés.\n" + +#~ msgid "%s:%d: confused by earlier errors, bailing out\n" +#~ msgstr "%s:%d: embrouillé par les erreurs précédentes, abandon\n" + +#~ msgid "compilation terminated.\n" +#~ msgstr "compilation terminée.\n" + +# FIXME +#~ msgid "Internal compiler error: Error reporting routines re-entered.\n" +#~ msgstr "erreur interne au compilateur : routine de rapport d'erreur préemptée.\n" + +#~ msgid "in %s, at %s:%d" +#~ msgstr "dans %s, à %s:%d" + +# FIXME +#~ msgid "dominator of %d should be %d, not %d" +#~ msgstr "le dominateur de %d devrait être %d, et non %d" + +#~ msgid "DW_LOC_OP %s not implemented\n" +#~ msgstr "DW_LOC_OP %s n'est pas implanté\n" + +#~ msgid "can't access real part of complex value in hard register" +#~ msgstr "ne peut accéder à la partie réelle d'une valeur complexe dans un registre matériel" + +#~ msgid "can't access imaginary part of complex value in hard register" +#~ msgstr "ne peut accéder à la partie imaginaire d'une valeur complexe dans un registre matériel" + +#~ msgid "Invalid rtl sharing found in the insn" +#~ msgstr "partage rtl invalide repéré dans l'insn" + +#~ msgid "Shared rtx" +#~ msgstr "rtx partagé" + +#~ msgid "ICE: emit_insn used where emit_jump_insn needed:\n" +#~ msgstr "ICE : emit_insn utilisé là où emit_jump_insn était attendu :\n" + +#~ msgid "abort in %s, at %s:%d" +#~ msgstr "abandon dans %s, à %s:%d" + +#~ msgid "exception handling disabled, use -fexceptions to enable" +#~ msgstr "traitement des exceptions désactivé, utiliser -fexceptions pour l'activer" + +#~ msgid "argument of `__builtin_eh_return_regno' must be constant" +#~ msgstr "l'argument de « __builtin_eh_return_regno » doit être une constante" + +#~ msgid "__builtin_eh_return not supported on this target" +#~ msgstr "« __builtin_eh_return » n'est pas possible sur cette cible" + +# FIXME +#~ msgid "stack limits not supported on this target" +#~ msgstr "les limites de la pile ne sont pas supportées sur cette cible" + +#~ msgid "function using short complex types cannot be inline" +#~ msgstr "un foncton utilisant un type « complex short » ne peut être enligne" + +#~ msgid "%Jprior parameter's size depends on '%D'" +#~ msgstr "%Jtaille du paramètre précédent dépend de « %D »" + +#~ msgid "returned value in block_exit_expr" +#~ msgstr "valeur retournée dans block_exit_expr" + +#~ msgid "cannot take the address of an unaligned member" +#~ msgstr "ne peut prendre l'adresse d'un membre non aligné" + +#~ msgid "negative insn length" +#~ msgstr "longueur négative insn" + +#~ msgid "could not split insn" +#~ msgstr "n'a pu séparer insn" + +#~ msgid "invalid `asm': " +#~ msgstr "« asm » invalide: " + +#~ msgid "nested assembly dialect alternatives" +#~ msgstr "assemblage de dialectes alternatifs imbriqués" + +#~ msgid "unterminated assembly dialect alternative" +#~ msgstr "assemblage de dialectes alternatifs non terminé" + +#~ msgid "operand number missing after %%-letter" +#~ msgstr "numéro d'opérande manquant après %%-letter" + +#~ msgid "operand number out of range" +#~ msgstr "nombre d'opérandes hors limite" + +#~ msgid "invalid %%-code" +#~ msgstr "%%-code est invalide" + +#~ msgid "`%%l' operand isn't a label" +#~ msgstr "opérande « %%l » n'est pas une étiquette" + +#~ msgid "floating constant misused" +#~ msgstr "constante flottante mal utilisée" + +#~ msgid "invalid expression as operand" +#~ msgstr "expression invalide comme opérande" + +#~ msgid "function might be possible candidate for attribute `noreturn'" +#~ msgstr "fonction peut être une possible candidate pour l'attribut « norreturn »" + +#~ msgid "`noreturn' function does return" +#~ msgstr "fonction avec « noreturn » effectue des retour" + +#~ msgid "control reaches end of non-void function" +#~ msgstr "contrôle a atteint la fin non void de la fonction" + +#~ msgid "Attempt to delete prologue/epilogue insn:" +#~ msgstr "Tentative pour détruire le prologue/épilogue insn:" + +#~ msgid "comparison is always %d due to width of bit-field" +#~ msgstr "comparaison est toujours %d en raison de la largeur du champ de bits" + +#~ msgid "comparison is always %d" +#~ msgstr "comparaison est toujours %d" + +#~ msgid "`or' of unmatched not-equal tests is always 1" +#~ msgstr "« or » de tests non pairé de non égalité est troujours 1" + +#~ msgid "`and' of mutually exclusive equal-tests is always 0" +#~ msgstr "« and » de tests d'égalité mutuellement exclusifs est toujours 0" + +#~ msgid "fold check: original tree changed by fold" +#~ msgstr "vérification fold: arbre originale modifié par fold" + +#~ msgid "%Jsize of variable '%D' is too large" +#~ msgstr "%Jtaille de la variable « %D » est trop grande" + +#~ msgid "impossible constraint in `asm'" +#~ msgstr "contrainte impossible dans « asm »" + +#~ msgid "%J'%D' might be used uninitialized in this function" +#~ msgstr "%J« %D » pourrait être utilisé sans être initialisé dans cette fonction" + +#~ msgid "%Jvariable '%D' might be clobbered by `longjmp' or `vfork'" +#~ msgstr "%Jvariable « %D » pourrait être maltraitée par un «longjmp» ou un «vfork »" + +#~ msgid "%Jargument '%D' might be clobbered by `longjmp' or `vfork'" +#~ msgstr "%Jargument « %D » pourrait être maltraitée par un «longjmp» ou un «vfork »" + +#~ msgid "function returns an aggregate" +#~ msgstr "fonction retourne un aggrégat" + +#~ msgid "%Junused parameter '%D'" +#~ msgstr "%Jparamètre « %D » inutilisé" + +#~ msgid "ambiguous abbreviation %s" +#~ msgstr "abréviation %s est ambiguë" + +#~ msgid "incomplete `%s' option" +#~ msgstr "option « %s » est incomplète" + +#~ msgid "missing argument to `%s' option" +#~ msgstr "argument manquant à l'option « %s »" + +#~ msgid "extraneous argument to `%s' option" +#~ msgstr "argument superflu à l'option « %s »" + +#~ msgid "Using built-in specs.\n" +#~ msgstr "Utilisation des specs internes.\n" + +#~ msgid "" +#~ "Setting spec %s to '%s'\n" +#~ "\n" +#~ msgstr "" +#~ "Initialisation des spec %s à « %s »\n" +#~ "\n" + +#~ msgid "Reading specs from %s\n" +#~ msgstr "Lecture des spécification à partir de %s\n" + +#~ msgid "specs %%include syntax malformed after %ld characters" +#~ msgstr "syntaxe des specs %%include mal composée après %ld caractères" + +#~ msgid "could not find specs file %s\n" +#~ msgstr "ne peut repérer le fichiers des specs %s\n" + +#~ msgid "specs %%rename syntax malformed after %ld characters" +#~ msgstr "specs de la syntaxe %%rename mal composées après %ld caractères" + +#~ msgid "specs %s spec was not found to be renamed" +#~ msgstr "specs de la spécification %s n'a pas été trouvé pour être renommer" + +#~ msgid "%s: attempt to rename spec '%s' to already defined spec '%s'" +#~ msgstr "%s: tentative pour renommner la spécification « %s » à un spécification « %s » déjà définie" + +#~ msgid "rename spec %s to %s\n" +#~ msgstr "renommé les specs %s à %s\n" + +#~ msgid "" +#~ "spec is '%s'\n" +#~ "\n" +#~ msgstr "" +#~ "spec est « %s »\n" +#~ "\n" + +#~ msgid "specs unknown %% command after %ld characters" +#~ msgstr "specs inconnus de la commande %% après %ld caractères" + +#~ msgid "specs file malformed after %ld characters" +#~ msgstr "fichier de specs mal composé après %ld caractères" + +#~ msgid "spec file has no spec for linking" +#~ msgstr "fichier de specs n'a pas de spécification pour l'édition de liens" + +#~ msgid "-pipe not supported" +#~ msgstr "-pipe n'est pas supporté" + +#~ msgid "" +#~ "\n" +#~ "Go ahead? (y or n) " +#~ msgstr "" +#~ "\n" +#~ "Aller de l'avant? (y ou n) " + +#~ msgid "" +#~ "Internal error: %s (program %s)\n" +#~ "Please submit a full bug report.\n" +#~ "See %s for instructions." +#~ msgstr "" +#~ "Erreur internal error: %s (programme %s)\n" +#~ "SVP soumettre un rapport complet d'anomalies.\n" +#~ "Consulter %s pour les instructions." + +#~ msgid "# %s %.2f %.2f\n" +#~ msgstr "# %s %.2f %.2f\n" + +#~ msgid "Usage: %s [options] file...\n" +#~ msgstr "Usage: %s [options] fichier...\n" + +#~ msgid "Options:\n" +#~ msgstr "Options:\n" + +#~ msgid " -pass-exit-codes Exit with highest error code from a phase\n" +#~ msgstr " -pass-exit-codes quitter avec le plus grand code d'erreur de la phase\n" + +#~ msgid " --help Display this information\n" +#~ msgstr " --help afficher l'aide mémoire\n" + +#~ msgid " --target-help Display target specific command line options\n" +#~ msgstr " --target-help afficher les options spécifiques de la ligne de commande\n" + +#~ msgid " (Use '-v --help' to display command line options of sub-processes)\n" +#~ msgstr " (Utiliser «-v --help» pour afficher les options de la ligne de commande des sous-processus)\n" + +#~ msgid " -dumpspecs Display all of the built in spec strings\n" +#~ msgstr " -dumpspecs afficher tous les construits des chaînes de specs\n" + +#~ msgid " -dumpversion Display the version of the compiler\n" +#~ msgstr " -dumpversion afficher la version du compilateur\n" + +#~ msgid " -dumpmachine Display the compiler's target processor\n" +#~ msgstr " -dumpmachine afficher le processeur ciblé par le compilateur\n" + +#~ msgid " -print-search-dirs Display the directories in the compiler's search path\n" +#~ msgstr " -print-search-dirs afficher les répertoires du chemin de recherche du compiltateur\n" + +#~ msgid " -print-libgcc-file-name Display the name of the compiler's companion library\n" +#~ msgstr " -print-libgcc-file-name afficher le nom de la bibliothèque compagne du compilateur\n" + +#~ msgid " -print-file-name= Display the full path to library \n" +#~ msgstr " -print-file-name= afficher le chemin d'accès complet vers la bibliothèque \n" + +#~ msgid " -print-prog-name= Display the full path to compiler component \n" +#~ msgstr " -print-prog-name= afficher le chemin d'accès complet vers le composant du compilateur \n" + +#~ msgid " -print-multi-directory Display the root directory for versions of libgcc\n" +#~ msgstr " -print-multi-directory afficher la racine du répertoire des version libgcc\n" + +#~ msgid "" +#~ " -print-multi-lib Display the mapping between command line options and\n" +#~ " multiple library search directories\n" +#~ msgstr "" +#~ " -print-multi-lib Afficher la table de projection entre les options de\n" +#~ " la ligne de commande et les multiples répertoires de\n" +#~ " recherches des bibliothèques\n" + +#~ msgid " -print-multi-os-directory Display the relative path to OS libraries\n" +#~ msgstr " -print-multi-os-directory afficher le chemin relatif du répertoire vers les librairies de l'OS\n" + +#~ msgid " -Wa, Pass comma-separated on to the assembler\n" +#~ msgstr " -Wa, passer les séparées par des virgules à l'assembleur\n" + +#~ msgid " -Wp, Pass comma-separated on to the preprocessor\n" +#~ msgstr " -Wp, passer les séparées par des virgules au préprocesseur\n" + +#~ msgid " -Wl, Pass comma-separated on to the linker\n" +#~ msgstr " -Wl, passer les séparées par des virgules à l'éditeur de liens\n" + +#~ msgid " -Xassembler Pass on to the assembler\n" +#~ msgstr " -Xassembler passer l'ument à l'assembleur\n" + +#~ msgid " -Xpreprocessor Pass on to the preprocessor\n" +#~ msgstr " -Xpreprocessor passer l'ument au pré-processeur\n" + +#~ msgid " -Xlinker Pass on to the linker\n" +#~ msgstr " -Xlinker passer l' à l'éditeur de liens\n" + +#~ msgid " -save-temps Do not delete intermediate files\n" +#~ msgstr " -save-temps ne pas détruire les fichiers intermédiaires\n" + +#~ msgid " -pipe Use pipes rather than intermediate files\n" +#~ msgstr " -pipe utiliser des pipes au lieu de fichiers intermédiares\n" + +#~ msgid " -time Time the execution of each subprocess\n" +#~ msgstr " -time mesurer le temps d'exécution de chaque sous-processus\n" + +#~ msgid " -specs= Override built-in specs with the contents of \n" +#~ msgstr " -specs= écraser les specs internes à l'aide du contenu du \n" + +#~ msgid " -std= Assume that the input sources are for \n" +#~ msgstr " -std= Présumer que les fichiers sources respectent le \n" + +#~ msgid " -B Add to the compiler's search paths\n" +#~ msgstr " -B ajouter le aux chemins de recherche du compilateur\n" + +#~ msgid " -b Run gcc for target , if installed\n" +#~ msgstr " -b exécuter gcc pour la cible, si installé\n" + +#~ msgid " -V Run gcc version number , if installed\n" +#~ msgstr " -V exécuter le numéro de de gcc, si installée\n" + +#~ msgid " -v Display the programs invoked by the compiler\n" +#~ msgstr " -v afficher les programmes invoqués par le compilateur\n" + +#~ msgid " -### Like -v but options quoted and commands not executed\n" +#~ msgstr " -### identique à -v mais les options et les commandes entre guillemets ne sont pas exécutées\n" + +#~ msgid " -E Preprocess only; do not compile, assemble or link\n" +#~ msgstr " -E pré-traiter seulement; ne pas compiler, assembler ou éditer les liens\n" + +#~ msgid " -S Compile only; do not assemble or link\n" +#~ msgstr " -S compiler seulement; ne pas assembler ou éditer les liens\n" + +#~ msgid " -c Compile and assemble, but do not link\n" +#~ msgstr " -S compiler et assembler, mais ne pas éditer les liens\n" + +#~ msgid " -o Place the output into \n" +#~ msgstr " -o placer la sortie dans le \n" + +#~ msgid "" +#~ " -x Specify the language of the following input files\n" +#~ " Permissible languages include: c c++ assembler none\n" +#~ " 'none' means revert to the default behavior of\n" +#~ " guessing the language based on the file's extension\n" +#~ msgstr "" +#~ " -x spécifier le langage des fichiers suivants d'entrée\n" +#~ " Les langages permis sont: c c++ assembler none\n" +#~ " « none » signifiant d'utiliser le comportement par défaut\n" +#~ " en tentant d'identifier le langage par l'extension du fichier\n" + +#~ msgid "" +#~ "\n" +#~ "Options starting with -g, -f, -m, -O, -W, or --param are automatically\n" +#~ " passed on to the various sub-processes invoked by %s. In order to pass\n" +#~ " other options on to these processes the -W options must be used.\n" +#~ msgstr "" +#~ "\n" +#~ "Options débutant par -g, -f, -m, -O, -W, ou --param sont automatiquement\n" +#~ " passés aux divers sous-processus invoqués par %s. Afin de passer\n" +#~ " les autres options à ces processus l'option -W doit être utilisé.\n" + +#~ msgid "`-%c' option must have argument" +#~ msgstr "l'option « -%c » requière un argument" + +#~ msgid "couldn't run `%s': %s" +#~ msgstr "impossible d'exécuter « %s » : %s" + +#~ msgid "%s (GCC) %s\n" +#~ msgstr "%s (GCC) %s\n" + +#~ msgid "(C)" +#~ msgstr "©" + +#~ msgid "" +#~ "This is free software; see the source for copying conditions. There is NO\n" +#~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" +#~ "\n" +#~ msgstr "" +#~ "Ce logiciel est libre; voir les sources pour les conditions de copie. Il n'y a PAS\n" +#~ "GARANTIE; ni implicite pour le MARCHANDAGE ou pour un BUT PARTICULIER.\n" +#~ "\n" + +#~ msgid "argument to `-Xlinker' is missing" +#~ msgstr "argument de «-Xlinker» est manquant" + +#~ msgid "argument to `-Xpreprocessor' is missing" +#~ msgstr "argument de « -Xpreprocessor » est manquant" + +#~ msgid "argument to `-Xassembler' is missing" +#~ msgstr "argument de « -Xassembler » est manquant" + +#~ msgid "argument to `-l' is missing" +#~ msgstr "argument pour « -l » est manquant" + +#~ msgid "argument to `-specs' is missing" +#~ msgstr "argument de « -specs » est manquant" + +#~ msgid "argument to `-specs=' is missing" +#~ msgstr "argument de «-specs=» est manquant" + +#~ msgid "`-%c' must come at the start of the command line" +#~ msgstr "« -%c » doit apparaître au début de la ligne de commande" + +#~ msgid "argument to `-B' is missing" +#~ msgstr "argument de « -B » est manquant" + +#~ msgid "warning: -pipe ignored because -save-temps specified" +#~ msgstr "AVERTISSEMENT: -pipe ignoré parce que -save-temps a été spécifié" + +#~ msgid "warning: -pipe ignored because -time specified" +#~ msgstr "AVERTISSEMENT: -pipe ignoré parce que -time a été spécifié" + +#~ msgid "argument to `-x' is missing" +#~ msgstr "argument pour « -x » est manquant" + +#~ msgid "argument to `-%s' is missing" +#~ msgstr "argument pour « -%s » est manquant" + +#~ msgid "warning: `-x %s' after last input file has no effect" +#~ msgstr "AVERTISSEMENT: « -x %s » après le dernier fichier d'entrée n'a pas d'effet" + +#~ msgid "invalid specification! Bug in cc" +#~ msgstr "spécification invalide! Bug dans cc." + +#~ msgid "%s\n" +#~ msgstr "%s\n" + +#~ msgid "spec failure: '%%*' has not been initialized by pattern match" +#~ msgstr "échec du spec: « %%* » n'a pas été initialisé par concordance du canevas" + +#~ msgid "warning: use of obsolete %%[ operator in specs" +#~ msgstr "AVERTISSEMENT: utilisation obsolète de l'opérateur %%[ dans les specs" + +#~ msgid "Processing spec %c%s%c, which is '%s'\n" +#~ msgstr "Traitement du spec %c%s%c, lequel est « %s »\n" + +#~ msgid "spec failure: unrecognized spec option '%c'" +#~ msgstr "échec de spec: option « %c » de spec non reconnue" + +#~ msgid "unknown spec function `%s'" +#~ msgstr "spécification de fonction inconnue « %s »:" + +#~ msgid "error in args to spec function `%s'" +#~ msgstr "ERREUR d'arguments pour la spécification de fonction « %s »" + +#~ msgid "malformed spec function name" +#~ msgstr "nom de spécification de fonction mal composé" + +#~ msgid "no arguments for spec function" +#~ msgstr "aucun argument pour la spécification de fonction" + +#~ msgid "malformed spec function arguments" +#~ msgstr "arguments de spécification de fonction mal composés" + +#~ msgid "spec failure: more than one arg to SYSROOT_SUFFIX_SPEC." +#~ msgstr "échec de spécification: plus d'un argument à SYSROOT_SUFFIX_SPEC." + +#~ msgid "spec failure: more than one arg to SYSROOT_HEADERS_SUFFIX_SPEC." +#~ msgstr "échec de spécification: plus d'un argument à SYSROOT_HEADERS_SUFFIX_SPEC." + +#~ msgid "unrecognized option `-%s'" +#~ msgstr "option « -%s » non reconnue" + +#~ msgid "install: %s%s\n" +#~ msgstr "installés: %s%s\n" + +#~ msgid "programs: %s\n" +#~ msgstr "programmes: %s\n" + +#~ msgid "libraries: %s\n" +#~ msgstr "libraries: %s\n" + +#~ msgid "" +#~ "\n" +#~ "For bug reporting instructions, please see:\n" +#~ msgstr "" +#~ "\n" +#~ "Pour les instructons afin de rapporter des anomales, SVP consulter:\n" + +#~ msgid "Configured with: %s\n" +#~ msgstr "Configuré avec: %s\n" + +#~ msgid "Thread model: %s\n" +#~ msgstr "Modèle de thread: %s\n" + +#~ msgid "gcc version %s\n" +#~ msgstr "version gcc %s\n" + +#~ msgid "gcc driver version %s executing gcc version %s\n" +#~ msgstr "version du pilote gcc %s exécutant le version %s de gcc\n" + +#~ msgid "no input files" +#~ msgstr "pas de fichier à l'entrée" + +#~ msgid "%s: linker input file unused because linking not done" +#~ msgstr "%s: fichier d'entrée d'édition de liens n'est pas utilisé parce l'édition de lien n'a pas été faite" + +#~ msgid "cannot specify -o with -c or -S and multiple languages" +#~ msgstr "ne peut spécifier -o avec -c ou -S et de multiples langages" + +#~ msgid "%s: %s compiler not installed on this system" +#~ msgstr "%s: %s compilateur n'est pas installé sur ce système" + +#~ msgid "language %s not recognized" +#~ msgstr "language %s n'est pas reconnu" + +#~ msgid "internal gcc abort" +#~ msgstr "abandon interne de gcc" + +#~ msgid "Internal gcov abort.\n" +#~ msgstr "Abandon interne de gcov.\n" + +#~ msgid "" +#~ "Usage: gcov [OPTION]... SOURCEFILE\n" +#~ "\n" +#~ msgstr "" +#~ "Usage: gcov [OPTION]... FICHIER-SOURCE\n" +#~ "\n" + +#~ msgid "" +#~ "Print code coverage information.\n" +#~ "\n" +#~ msgstr "" +#~ "Produire les informations de la couverture du code.\n" +#~ "\n" + +#~ msgid " -h, --help Print this help, then exit\n" +#~ msgstr " -h, --help afficher l'aide mémoire\n" + +#~ msgid " -v, --version Print version number, then exit\n" +#~ msgstr " -v, --version exécuter le numéro de de gcc, si installée\n" + +#~ msgid " -a, --all-blocks Show information for every basic block\n" +#~ msgstr " -a, --all-blocks afficher l'information pour chaque bloc de base\n" + +#~ msgid " -b, --branch-probabilities Include branch probabilities in output\n" +#~ msgstr " -b, --branch-probabilities inclure les probabilités de branchement dans la sortie\n" + +#~ msgid "" +#~ " -c, --branch-counts Given counts of branches taken\n" +#~ " rather than percentages\n" +#~ msgstr "" +#~ " -c, --branch-counts donner le décompte de branchements pris\n" +#~ " plutôt que les pourcentages\n" + +#~ msgid " -n, --no-output Do not create an output file\n" +#~ msgstr " -n, --no-output ne créer de fichier de sortie\n" + +#~ msgid "" +#~ " -l, --long-file-names Use long output file names for included\n" +#~ " source files\n" +#~ msgstr "" +#~ " -l, --long-file-names utiliser des longs noms de fichiers pour\n" +#~ " les fichier sources d'inclusion\n" + +#~ msgid " -f, --function-summaries Output summaries for each function\n" +#~ msgstr " -f, --function-summaries produire un sommaire pour chaque fonction\n" + +#~ msgid " -o, --object-directory DIR|FILE Search for object files in DIR or called FILE\n" +#~ msgstr " -o, --object-directory RÉP|FICHIERS rechercher les fichiers objets dans le RÉPertoire ou appellés FICHIERS\n" + +#~ msgid " -p, --preserve-paths Preserve all pathname components\n" +#~ msgstr " -p, --preserve-paths préserver tous les composants des chemins d'accès\n" + +#~ msgid " -u, --unconditional-branches Show unconditional branch counts too\n" +#~ msgstr " -u, --unconditional-branches afficher les compteurs de branchement inconditionnel aussi\n" + +#~ msgid "" +#~ "\n" +#~ "For bug reporting instructions, please see:\n" +#~ "%s.\n" +#~ msgstr "" +#~ "\n" +#~ "Pour les instructons afin de rapporter des anomales, SVP consulter:\n" +#~ "%s.\n" + +#~ msgid "gcov (GCC) %s\n" +#~ msgstr "gcov (GCC) %s\n" + +#~ msgid "" +#~ "This is free software; see the source for copying conditions.\n" +#~ "There is NO warranty; not even for MERCHANTABILITY or \n" +#~ "FITNESS FOR A PARTICULAR PURPOSE.\n" +#~ "\n" +#~ msgstr "" +#~ "Ce logiciel est libre; voir les sources pour les conditions de copie. \n" +#~ "Il n'y a PAS GARANTIE; ni implicite pour le MARCHANDAGE ou\n" +#~ "pour un BUT PARTICULIER.\n" +#~ "\n" + +#~ msgid "%s:no functions found\n" +#~ msgstr "%s: aucune fonction repérée\n" + +# I18N +#~ msgid "\n" +#~ msgstr "\n" + +#~ msgid "%s:creating `%s'\n" +#~ msgstr "%s: création de « %s »\n" + +#~ msgid "%s:error writing output file `%s'\n" +#~ msgstr "%s: ERREUR d'écriture dans le fichier de sortie « %s ».\n" + +#~ msgid "%s:could not open output file `%s'\n" +#~ msgstr "%s: ne peut ouvrir le fichier de sortie « %s ».\n" + +#~ msgid "%s:cannot open graph file\n" +#~ msgstr "%s: ne peut ouvrir le fichier de graphe\n" + +#~ msgid "%s:not a gcov graph file\n" +#~ msgstr "%s: n'est pas un fichier de graphe gcov\n" + +#~ msgid "%s:version `%.4s', prefer `%.4s'\n" +#~ msgstr "%s:version « %.4s », préfère « %.4s »\n" + +#~ msgid "%s:already seen blocks for `%s'\n" +#~ msgstr "%s:blocs déjà vus pour « %s »\n" + +#~ msgid "%s:corrupted\n" +#~ msgstr "%s:corrompu\n" + +#~ msgid "%s:cannot open data file\n" +#~ msgstr "%s: ne peut ouvrir le fichier de données\n" + +#~ msgid "%s:not a gcov data file\n" +#~ msgstr "%s: n'est pas un fichier de données gcov\n" + +#~ msgid "%s:version `%.4s', prefer version `%.4s'\n" +#~ msgstr "%s:version « %.4s », préfère la version « %.4s »\n" + +#~ msgid "%s:stamp mismatch with graph file\n" +#~ msgstr "%s: estampille ne concorde par avec le fichier de graphe\n" + +#~ msgid "%s:unknown function `%u'\n" +#~ msgstr "%s: fonction inconnue « %u »\n" + +#~ msgid "%s:profile mismatch for `%s'\n" +#~ msgstr "%s: profile ne concorde pas pour « %s »\n" + +#~ msgid "%s:overflowed\n" +#~ msgstr "%s: débordement\n" + +#~ msgid "%s:`%s' lacks entry and/or exit blocks\n" +#~ msgstr "%s:« %s » manque de blocs d'entrée et/ou de sortie\n" + +#~ msgid "%s:`%s' has arcs to entry block\n" +#~ msgstr "%s:« %s » possède des arcs vers un bloc d'entrée\n" + +#~ msgid "%s:`%s' has arcs from exit block\n" +#~ msgstr "%s:« %s » possèdes des arcs à partir du bloc de sortie\n" + +#~ msgid "%s:graph is unsolvable for `%s'\n" +#~ msgstr "%s: graphe n'a pas de solution pour « %s »\n" + +#~ msgid "%s `%s'\n" +#~ msgstr "%s « %s »\n" + +#~ msgid "Lines executed:%s of %d\n" +#~ msgstr "Lignes exécutées: %s de %d\n" + +#~ msgid "No executable lines" +#~ msgstr "Auncue ligne exécutable" + +#~ msgid "Branches executed:%s of %d\n" +#~ msgstr "Branchements exécutés: %s de %d\n" + +#~ msgid "Taken at least once:%s of %d\n" +#~ msgstr "Branchements pris au moins une fois: %s de %d\n" + +#~ msgid "No branches\n" +#~ msgstr "Pas de branchement\n" + +#~ msgid "Calls executed:%s of %d\n" +#~ msgstr "Appels exécutés: %s de %d\n" + +#~ msgid "No calls\n" +#~ msgstr "Pas d'appel\n" + +#~ msgid "%s:no lines for `%s'\n" +#~ msgstr "%s: pas de ligne pour « %s »\n" + +#~ msgid "call %2d returned %s\n" +#~ msgstr "appel %2d a retourné %s\n" + +# FIXME: c'est de l'assembleur ? +#~ msgid "call %2d never executed\n" +#~ msgstr "call %2d n'est jamais été exécuté\n" + +#~ msgid "branch %2d taken %s%s\n" +#~ msgstr "branchement %2d a pris %s%s\n" + +#~ msgid "branch %2d never executed\n" +#~ msgstr "branchement %2d n'a jamais été exécuté\n" + +#~ msgid "unconditional %2d taken %s\n" +#~ msgstr "inconditionnel %2d a pris %s\n" + +# FIXME: c'est de l'assembleur ? +#~ msgid "unconditional %2d never executed\n" +#~ msgstr "inconditionnel %2d n'a jamais été exécuté\n" + +#~ msgid "%s:cannot open source file\n" +#~ msgstr "%s: ne peut ouvrir le fichier source\n" + +#~ msgid "%s:source file is newer than graph file `%s'\n" +#~ msgstr "%s: fichier source est plus récent que le fichier graphe « %s »\n" + +#~ msgid "GCSE disabled" +#~ msgstr "GCSE désactivé" + +#~ msgid "NULL pointer checks disabled" +#~ msgstr "vérification des pointeurs NULS désactivée" + +#~ msgid "jump bypassing disabled" +#~ msgstr "saut d'évitement désactivé" + +#~ msgid "%s: %d basic blocks and %d edges/basic block" +#~ msgstr "%s: %d blocs de base et %d blocs edges/basic" + +#~ msgid "%s: %d basic blocks and %d registers" +#~ msgstr "%s: %d blocs basic et %d registres" + +#~ msgid "can't write PCH file: %m" +#~ msgstr "ne peut écrire le fichier PCH: %m" + +#~ msgid "can't get position in PCH file: %m" +#~ msgstr "ne peut obtenir la position dans le fichier PCH: %m" + +#~ msgid "can't write padding to PCH file: %m" +#~ msgstr "ne peut écrire de remplissage dans le fichier PCH: %m" + +#~ msgid "can't read PCH file: %m" +#~ msgstr "ne peut lire le fichier PCH: %m" + +#~ msgid "had to relocate PCH" +#~ msgstr "a dû relocaliser PCH" + +#~ msgid "open /dev/zero: %m" +#~ msgstr "ouverture de /dev/zero: %m" + +#~ msgid "can't write PCH file" +#~ msgstr "ne peut écrire dans le fichier PCH" + +#~ msgid "Generating PCH files is not supported when using ggc-simple.c" +#~ msgstr "Génération des ficheirs PCH n'est pas supporté lors de l'utilisation de ggc-simple.c" + +#~ msgid "%s cannot be used in asm here" +#~ msgstr "%s ne peut être utilisé dans asm ici" + +#~ msgid "can't open %s: %m" +#~ msgstr "ne peut ouvrir %s: %m" + +#~ msgid "fix_sched_param: unknown param: %s" +#~ msgstr "fix_sched_param: paramètre inconnu: %s" + +#~ msgid "function cannot be inline" +#~ msgstr "fonction ne pas pas être enligne" + +#~ msgid "varargs function cannot be inline" +#~ msgstr "varargs de fonction ne peuvent par être enligne" + +#~ msgid "function using alloca cannot be inline" +#~ msgstr "fonction utilisant alloca ne pas pas être enligne" + +#~ msgid "function using longjmp cannot be inline" +#~ msgstr "fonction utilisant longjmp ne peut pas être enligne" + +#~ msgid "function using setjmp cannot be inline" +#~ msgstr "fonction utilisant setjmp ne peut pas être enligne" + +#~ msgid "function uses __builtin_eh_return" +#~ msgstr "fonction utilise « __builtin_eh_return »" + +#~ msgid "function with nested functions cannot be inline" +#~ msgstr "fonction avec fonctions imbriquées ne peut pas être enligne" + +#~ msgid "function with label addresses used in initializers cannot inline" +#~ msgstr "un fonction avec étiquette d'adresses utilisée pour l'initialisation ne peut pas être enligne (inline)" + +#~ msgid "function too large to be inline" +#~ msgstr "fonction trop grande pour être enligne" + +#~ msgid "no prototype, and parameter address used; cannot be inline" +#~ msgstr "pas de prototpe, et de adresse de paramètre utilisée; ne peut pas être enligne" + +#~ msgid "inline functions not supported for this return value type" +#~ msgstr "fonctions enligne ne peuvent pas être supportées pour ce type de valeur retournée" + +#~ msgid "function with varying-size return value cannot be inline" +#~ msgstr "fonction avec une valeur retournée de taille variable ne peut pas être enligne" + +#~ msgid "function with varying-size parameter cannot be inline" +#~ msgstr "fonction avec un paramètre de taille variable ne peut pas être enligne" + +#~ msgid "function with transparent unit parameter cannot be inline" +#~ msgstr "fonction avec une unité transparente de paramètre ne peut pas être enligne" + +#~ msgid "function with computed jump cannot inline" +#~ msgstr "fonction avec un saut calculé ne peut pas être enligne" + +#~ msgid "function with nonlocal goto cannot be inline" +#~ msgstr "fonction avec un goto non local ne peut pas être enligne" + +#~ msgid "function with target specific attribute(s) cannot be inlined" +#~ msgstr "fonction avec des attributs spécifiques à la cible ne peut pas être enligne" + +# FIXME: c'est de l'assembleur ? +#~ msgid "%Hwill never be executed" +#~ msgstr "%Hne sera jamais exécuté" + +#~ msgid "This switch lacks documentation" +#~ msgstr "Cette option manque de documentation" + +#~ msgid "command line option \"%s\" is valid for %s but not for %s" +#~ msgstr "l'option de la ligne de commande \"%s\" est valide pour %s mais pas pour %s" + +#~ msgid "missing argument to \"%s\"" +#~ msgstr "argument manquant à \"%s\"" + +#~ msgid "argument to \"%s\" should be a non-negative integer" +#~ msgstr "argument de \"%s\" doit être un entier non négatif" + +#~ msgid "unrecognized command line option \"%s\"" +#~ msgstr "option \"%s\" de la ligne de commande non reconnue" + +#~ msgid "-Wuninitialized is not supported without -O" +#~ msgstr "-Wuninitialized n'est pas supporté sans -O" + +#~ msgid "unrecognized register name \"%s\"" +#~ msgstr "nom de registre non reconnue \"%s\"" + +#~ msgid "unknown tls-model \"%s\"" +#~ msgstr "tls-model \"%s\" inconnu" + +#~ msgid "-fwritable-strings is deprecated; see documentation for details" +#~ msgstr "-fwritable-strings est obsolète, voir la documentation pour les détails" + +#~ msgid "%s: --param arguments should be of the form NAME=VALUE" +#~ msgstr "%s: arguments de --param devrait être de la forme NOM=VALEUR" + +#~ msgid "invalid --param value `%s'" +#~ msgstr "valeur de --param invalide « %s »" + +#~ msgid "target system does not support debug output" +#~ msgstr "le ssytème cible ne supporte pas la sortie pour mise au point" + +#~ msgid "debug format \"%s\" conflicts with prior selection" +#~ msgstr "le format de mise au point \"%s\" entre en conflit avec une sélection précédente" + +#~ msgid "unrecognised debug output level \"%s\"" +#~ msgstr "niveau de sortie de mise au point non reconnu \"%s\"" + +#~ msgid "debug output level %s is too high" +#~ msgstr "niveau de sortie de mise au point %s est trop élevé" + +#~ msgid "The following options are language-independent:\n" +#~ msgstr "Les options suivantes sont indépendantes du langage:\n" + +#~ msgid "" +#~ "The %s front end recognizes the following options:\n" +#~ "\n" +#~ msgstr "" +#~ "L'interface %s reconnaît les options suivantes:\n" +#~ "\n" + +#~ msgid "The --param option recognizes the following as parameters:\n" +#~ msgstr "L'option --param reconnaît les paramètres suivant:\n" + +#~ msgid "invalid parameter `%s'" +#~ msgstr "paramètre invalide « %s »" + +#~ msgid "corrupted profile info: run_max * runs < sum_max" +#~ msgstr "profile info corrompu: run_max * runs < sum_max" + +#~ msgid "corrupted profile info: sum_all is smaller than sum_max" +#~ msgstr "info profile corrompu: sum_all est plus petit que sum_max" + +#~ msgid "corrupted profile info: edge from %i to %i exceeds maximal count" +#~ msgstr "info de profilage corrompu: bordure (edge) %i à %i excède le compte maximal" + +#~ msgid "corrupted profile info: number of iterations for basic block %d thought to be %i" +#~ msgstr "info de profilage corrompu: nombre d'itérations pour un bloc basic %d devrait être %i" + +#~ msgid "corrupted profile info: number of executions for edge %d-%d thought to be %i" +#~ msgstr "info de profilage corrompu: nombre d'exécutions pour bordures (edge) %d-%d devrait être %i" + +#~ msgid "%s: internal abort\n" +#~ msgstr "%s: abandon interne\n" + +#~ msgid "%s: error writing file `%s': %s\n" +#~ msgstr "%s: erreur d'écriture au fichier « %s »: %s\n" + +#~ msgid "%s: usage '%s [ -VqfnkN ] [ -i ] [ filename ... ]'\n" +#~ msgstr "%s: usage « %s [ -VqfnkN ] [ -i ] [ nom-de-fichier ... ] »\n" + +#~ msgid "%s: usage '%s [ -VqfnkNlgC ] [ -B ] [ filename ... ]'\n" +#~ msgstr "%s: usage « %s [ -VqfnkNlgC ] [ -B ] [ nom-de-fichier ... ] »\n" + +#~ msgid "%s: warning: no read access for file `%s'\n" +#~ msgstr "%s: AVERTISSEMENT: aucun accès en lecture du fichier « %s »\n" + +#~ msgid "%s: warning: no write access for file `%s'\n" +#~ msgstr "%s: AVERTISSEMENT: aucun accès en écriture du fichier « %s »\n" + +#~ msgid "%s: warning: no write access for dir containing `%s'\n" +#~ msgstr "%s: AVERTISSEMENT: aucun accès en écriture du répertoire contenant « %s »\n" + +#~ msgid "%s: invalid file name: %s\n" +#~ msgstr "%s: nom de fichier invalide: %s\n" + +#~ msgid "%s: %s: can't get status: %s\n" +#~ msgstr "%s: %s: ne peut obtenir l'état: %s\n" + +#~ msgid "" +#~ "\n" +#~ "%s: fatal error: aux info file corrupted at line %d\n" +#~ msgstr "" +#~ "\n" +#~ "%s: erreur fatale: fichier auxiliaire d'infos à la ligne %d\n" + +#~ msgid "%s:%d: declaration of function `%s' takes different forms\n" +#~ msgstr "%s:%d: déclaration de fonction « %s » prend différentes formes\n" + +#~ msgid "%s: compiling `%s'\n" +#~ msgstr "%s: en compilation « %s »\n" + +#~ msgid "%s: wait: %s\n" +#~ msgstr "%s: en attente: %s\n" + +#~ msgid "%s: subprocess got fatal signal %d\n" +#~ msgstr "%s: sous-processus a reçu le signal fatal %d\n" + +#~ msgid "%s: %s exited with status %d\n" +#~ msgstr "%s: %s a terminé avec le statut %d\n" + +#~ msgid "%s: warning: missing SYSCALLS file `%s'\n" +#~ msgstr "%s: AVERTISSEMENT: fichier des SYSCALLS « %s » est manquant\n" + +#~ msgid "%s: can't read aux info file `%s': %s\n" +#~ msgstr "%s: ne peut lire le fichier auxiliaire d'infos « %s »: %s\n" + +#~ msgid "%s: can't get status of aux info file `%s': %s\n" +#~ msgstr "%s: ne peut obtenir l'état du fichier auxiliaire d'infos « %s »: %s\n" + +#~ msgid "%s: can't open aux info file `%s' for reading: %s\n" +#~ msgstr "%s: ne peut ouvrir le fichier auxiliaire d'infos « %s » en lecture: %s\n" + +#~ msgid "%s: error reading aux info file `%s': %s\n" +#~ msgstr "%s: erreur lors de la lecture du fichier auxilaire d'infos « %s »: %s\n" + +#~ msgid "%s: error closing aux info file `%s': %s\n" +#~ msgstr "%s: erreur lors de la fermeture du fichier auxiliaire d'infos « %s »: %s\n" + +#~ msgid "%s: can't delete aux info file `%s': %s\n" +#~ msgstr "%s: ne peut détruire le fichier auxiliaire d'infos « %s »: %s\n" + +#~ msgid "%s: can't delete file `%s': %s\n" +#~ msgstr "%s: ne peut détruire le fichier « %s »: %s\n" + +#~ msgid "%s: warning: can't rename file `%s' to `%s': %s\n" +#~ msgstr "%s: AVERTISSEMENT: ne peut renommer le fichier « %s » à « %s »: %s\n" + +#~ msgid "%s: conflicting extern definitions of '%s'\n" +#~ msgstr "%s: définitions externes conflictuelles de « %s »\n" + +#~ msgid "%s: declarations of '%s' will not be converted\n" +#~ msgstr "%s: déclarations de « %s » ne seront pas converties\n" + +#~ msgid "%s: conflict list for '%s' follows:\n" +#~ msgstr "%s: liste conflictuelle pour « %s » suit:\n" + +#~ msgid "%s: warning: using formals list from %s(%d) for function `%s'\n" +#~ msgstr "%s: AVERTISSEMENT: using la liste des formels de %s(%d) pour la fonction « %s »\n" + +#~ msgid "%s: %d: `%s' used but missing from SYSCALLS\n" +#~ msgstr "%s: %d: « %s » utilisé mais manquant dans les SYSCALLS\n" + +#~ msgid "%s: %d: warning: no extern definition for `%s'\n" +#~ msgstr "%s: %d: AVERTISSEMENT: pas de définition externe pour « %s »\n" + +#~ msgid "%s: warning: no static definition for `%s' in file `%s'\n" +#~ msgstr "%s: AVERTISSEMENT: pas de définition statique pour « %s » dans le fichier« %s »\n" + +#~ msgid "%s: multiple static defs of `%s' in file `%s'\n" +#~ msgstr "%s: multiples définitions statiques de « %s » dans le fichier « %s »\n" + +#~ msgid "%s: %d: warning: source too confusing\n" +#~ msgstr "%s: %d: AVERTISSEMENT: trop de confusions dans le source\n" + +#~ msgid "%s: %d: warning: varargs function declaration not converted\n" +#~ msgstr "%s: %d: AVERTISSEMENT: déclaration de varargs de fonction non convertis\n" + +#~ msgid "%s: declaration of function `%s' not converted\n" +#~ msgstr "%s: déclaration de la fonction « %s » non convertie\n" + +#~ msgid "%s: warning: too many parameter lists in declaration of `%s'\n" +#~ msgstr "%s: AVERTISSEMENT: trop de paramètres de listes dans la déclaration de « %s »\n" + +#~ msgid "" +#~ "\n" +#~ "%s: warning: too few parameter lists in declaration of `%s'\n" +#~ msgstr "" +#~ "\n" +#~ "%s: AVERTISSEMENT: trop peu de paramètres de listes dans la déclaration de « %s »\n" + +#~ msgid "%s: %d: warning: found `%s' but expected `%s'\n" +#~ msgstr "%s: %d: AVERTISSEMENT: a obtenu « %s » mais attendait « %s »\n" + +#~ msgid "%s: local declaration for function `%s' not inserted\n" +#~ msgstr "%s: déclaration locale pour la fonction « %s » n'a pas été insérée\n" + +#~ msgid "" +#~ "\n" +#~ "%s: %d: warning: can't add declaration of `%s' into macro call\n" +#~ msgstr "" +#~ "\n" +#~ "%s: %d: AVERTISSEMENT: ne peut ajouter une déclaration de « %s » dans l'appel macro\n" + +#~ msgid "%s: global declarations for file `%s' not inserted\n" +#~ msgstr "%s: déclarations globale du fichier « %s » n'ont pas été insérées\n" + +#~ msgid "%s: definition of function `%s' not converted\n" +#~ msgstr "%s: définition de la fonction « %s » n'a pas été convertie\n" + +#~ msgid "%s: %d: warning: definition of %s not converted\n" +#~ msgstr "%s: %d: AVERTISSEMENT: définition de %s n'a pas été convertie\n" + +#~ msgid "%s: found definition of `%s' at %s(%d)\n" +#~ msgstr "%s: définition de « %s » trouvé à %s(%d)\n" + +#~ msgid "%s: %d: warning: `%s' excluded by preprocessing\n" +#~ msgstr "%s: %d: AVERTISSEMENT: « %s » exclu par le préprocesseur\n" + +#~ msgid "%s: function definition not converted\n" +#~ msgstr "%s: définition de fonction n'a pas été convertie\n" + +#~ msgid "%s: `%s' not converted\n" +#~ msgstr "%s: « %s » n'a pas été converti\n" + +#~ msgid "%s: would convert file `%s'\n" +#~ msgstr "%s: devrait convertir le fichier « %s »\n" + +#~ msgid "%s: converting file `%s'\n" +#~ msgstr "%s: conversion du fichier « %s »\n" + +#~ msgid "%s: can't get status for file `%s': %s\n" +#~ msgstr "%s: ne peut obtenur l'état du fichier « %s »: %s\n" + +#~ msgid "%s: can't open file `%s' for reading: %s\n" +#~ msgstr "%s: ne peut ouvrir le fichier « %s » en lecture: %s\n" + +#~ msgid "" +#~ "\n" +#~ "%s: error reading input file `%s': %s\n" +#~ msgstr "" +#~ "\n" +#~ "%s: erreur de lecture du fichier d'entrée « %s »: %s\n" + +#~ msgid "%s: can't create/open clean file `%s': %s\n" +#~ msgstr "%s: ne peut créer/ouvrir un fichier propre « %s »: %s\n" + +#~ msgid "%s: warning: file `%s' already saved in `%s'\n" +#~ msgstr "%s: AVERTISSEMENT: fichier « %s » est déjà sauvegardé dans « %s »\n" + +#~ msgid "%s: can't link file `%s' to `%s': %s\n" +#~ msgstr "%s: ne peut lier le fichier « %s » à « %s »: %s\n" + +#~ msgid "%s: can't create/open output file `%s': %s\n" +#~ msgstr "%s: ne peut créer/ouvrier le fichier de sortie « %s »: %s\n" + +#~ msgid "%s: can't change mode of file `%s': %s\n" +#~ msgstr "%s: ne peut changer le mode du fichier « %s »: %s\n" + +#~ msgid "%s: cannot get working directory: %s\n" +#~ msgstr "%s: ne peut repérer le répertoire de travail: %s\n" + +#~ msgid "%s: input file names must have .c suffixes: %s\n" +#~ msgstr "%s: noms de fichiers d'entrée doivent avoir le suffixe .c: %s\n" + +#~ msgid "Didn't find a coloring.\n" +#~ msgstr "N'a pas repéré une coloration.\n" + +#~ msgid "output constraint %d must specify a single register" +#~ msgstr "Contrainte de sortie %d doit spécifier un simple registre" + +#~ msgid "output constraint %d cannot be specified together with \"%s\" clobber" +#~ msgstr "contrainte de sortie %d ne doit pas être spécifié avec « %s » clobber" + +#~ msgid "output regs must be grouped at top of stack" +#~ msgstr "registres de sortie doivent être regroupés au haut de la pile" + +#~ msgid "implicitly popped regs must be grouped at top of stack" +#~ msgstr "les registres implicitement dépilés doivent être groupés au haut de la pile" + +#~ msgid "output operand %d must use `&' constraint" +#~ msgstr "opérande de sortie %d doit utiliser la contrainte « & »" + +#~ msgid "can't use '%s' as a %s register" +#~ msgstr "ne peut utiliser « %s » comme le registre %s" + +#~ msgid "unknown register name: %s" +#~ msgstr "nom de registre inconnu: %s" + +#~ msgid "global register variable follows a function definition" +#~ msgstr "variable registre globale suit la définition d'une fonction" + +#~ msgid "register used for two global register variables" +#~ msgstr "registre utilisé pour deux variables registres globales" + +#~ msgid "call-clobbered register used for global register variable" +#~ msgstr "registre maltraité par un appel utilisé par un variable registre globale" + +#~ msgid "validate_value_data: [%u] Bad next_regno for empty chain (%u)" +#~ msgstr "validate_value_data: [%u] next_regno erroné pour une chaîne vide (%u)" + +#~ msgid "validate_value_data: Loop in regno chain (%u)" +#~ msgstr "validate_value_data: boucle dans la chaîne regno (%u)" + +#~ msgid "validate_value_data: [%u] Bad oldest_regno (%u)" +#~ msgstr "validate_value_data: [%u] oldest_regno erroné (%u)" + +#~ msgid "validate_value_data: [%u] Non-empty reg in chain (%s %u %i)" +#~ msgstr "validate_value_data: [%u] registre non vide dans la chaîne (%s %u %i)" + +#~ msgid "cannot reload integer constant operand in `asm'" +#~ msgstr "ne peut recharger l'opérande de constante entière dans « asm »" + +#~ msgid "impossible register constraint in `asm'" +#~ msgstr "impossible de contraindre les registres en « asm »" + +#~ msgid "`&' constraint used with no register class" +#~ msgstr "contrainte « & » utilisé sans classe registre" + +#~ msgid "unable to generate reloads for:" +#~ msgstr "incapable de générer des recharges pour:" + +#~ msgid "inconsistent operand constraints in an `asm'" +#~ msgstr "contrainte d'opérande inconsistente en « asm »" + +#~ msgid "frame size too large for reliable stack checking" +#~ msgstr "taille de trame trop grande pour une vérification fiable de la pile" + +#~ msgid "try reducing the number of local variables" +#~ msgstr "essayer de réduire le nombre de variables locales" + +#~ msgid "can't find a register in class `%s' while reloading `asm'" +#~ msgstr "ne peut repérer un registre dans la classe « %s » durant le rechargement «asm »" + +#~ msgid "unable to find a register to spill in class `%s'" +#~ msgstr "incapable de trouver un registre de déversement dans la classe « %s »" + +#~ msgid "this is the insn:" +#~ msgstr "ceci est le insn:" + +#~ msgid "`asm' operand requires impossible reload" +#~ msgstr "opérande « asm » requiert une recharge impossible" + +#~ msgid "could not find a spill register" +#~ msgstr "ne peut repérer un registre de déversement" + +#~ msgid "`asm' operand constraint incompatible with operand size" +#~ msgstr "contrainte de l'opérande « asm » incompatible avec la taille de l'opérande" + +#~ msgid "VOIDmode on an output" +#~ msgstr "mode VOID sur une sortie" + +#~ msgid "output operand is constant in `asm'" +#~ msgstr "opérande de sortie est une constante dans « asm »" + +#~ msgid "unrecognizable insn:" +#~ msgstr "insn non reconnaissable:" + +#~ msgid "insn does not satisfy its constraints:" +#~ msgstr "insn ne satisfait pas à ses contraintes:" + +#~ msgid "RTL check: access of elt %d of `%s' with last elt %d in %s, at %s:%d" +#~ msgstr "vérification RTL: accès de elt %d de « %s » avec le dernier elt %d dans %s, à %s:%d" + +#~ msgid "RTL check: expected elt %d type '%c', have '%c' (rtx %s) in %s, at %s:%d" +#~ msgstr "vérification RTL: attendu elt %d de type « %c », a « %c » (rtx %s) dans %s, à %s:%d" + +#~ msgid "RTL check: expected elt %d type '%c' or '%c', have '%c' (rtx %s) in %s, at %s:%d" +#~ msgstr "vérification RTL: attendu elt %d de type « %c » ou « %c », a « %c » (rtx %s) dans %s, à %s:%d" + +#~ msgid "RTL check: expected code `%s', have `%s' in %s, at %s:%d" +#~ msgstr "vérification RTL: code attendu « %s », a « %s » dans %s, à %s:%d" + +#~ msgid "RTL check: expected code `%s' or `%s', have `%s' in %s, at %s:%d" +#~ msgstr "vérification RTL: code attendu « %s » ou « %s », a « %s » dans %s, à %s:%d" + +#~ msgid "RTL check: access of elt %d of vector with last elt %d in %s, at %s:%d" +#~ msgstr "vérification RTL: accès de elt %d du vecteur avec le dernier elt %d dans %s, à %s:%d" + +#~ msgid "RTL flag check: %s used with unexpected rtx code `%s' in %s, at %s:%d" +#~ msgstr "vérification du fanion RTL: %s utilisé avec un code rtx inattendu, « %s » dans %s, à %s:%d" + +#~ msgid "jump to `%s' invalidly jumps into binding contour" +#~ msgstr "saut vers « %s » saute de manière invalide dans un contour de liaison" + +#~ msgid "%Jlabel '%D' used before containing binding contour" +#~ msgstr "%Jétiquette « %D » utilisé avant de contenir le contour de liaison" + +#~ msgid "output operand constraint lacks `='" +#~ msgstr "contrainte de sortie de l'opérande manque « = »" + +#~ msgid "output constraint `%c' for operand %d is not at the beginning" +#~ msgstr "contrainte de sortie « %c » pour l'opérande %d n'est pas au début" + +#~ msgid "operand constraint contains incorrectly positioned '+' or '='" +#~ msgstr "contrainte de l'opérande contient « + » ou « - » incorrectement positionné" + +#~ msgid "`%%' constraint used with last operand" +#~ msgstr "contrainte « %% » utilisée avec la dernière opérande" + +#~ msgid "matching constraint not valid in output operand" +#~ msgstr "contrainte concordante n'est pas valide dans une opérande de sortie" + +#~ msgid "read-write constraint does not allow a register" +#~ msgstr "contrainte de lecture-éccriture ne permet pas de registre" + +#~ msgid "input operand constraint contains `%c'" +#~ msgstr "contrainte d'entrée de l'opérande contient « %c »" + +#~ msgid "matching constraint references invalid operand number" +#~ msgstr "nombre d'opérandes invalides pour références de containte concordantes" + +#~ msgid "invalid punctuation `%c' in constraint" +#~ msgstr "ponctuation invalide « %c » dans la contrainte" + +#~ msgid "matching constraint does not allow a register" +#~ msgstr "contrainte de concordance ne permet pas de reigstre" + +#~ msgid "asm-specifier for variable `%s' conflicts with asm clobber list" +#~ msgstr "asm-specifier pour la variable « %s » est en conflit avec la liste asm clobber" + +#~ msgid "unknown register name `%s' in `asm'" +#~ msgstr "nom de registre inconnu « %s » dans «asm »" + +#~ msgid "PIC register `%s' clobbered in `asm'" +#~ msgstr "registre PIC « %s » est maltraité dans «asm »" + +#~ msgid "more than %d operands in `asm'" +#~ msgstr "plus que %d opérandes dans « asm »" + +#~ msgid "output number %d not directly addressable" +#~ msgstr "nombre de sortie %d n,est pas directement adressable" + +#~ msgid "asm operand %d probably doesn't match constraints" +#~ msgstr "opérande asm %d ne concorde pas probablement avec les contraintes" + +#~ msgid "use of memory input without lvalue in asm operand %d is deprecated" +#~ msgstr "utilisation de l'entré mémoire sans lvalue dans l'opérande asm %d est obsolète" + +#~ msgid "asm clobber conflict with output operand" +#~ msgstr "asm clobber est en conflit sans opérande de sortie" + +#~ msgid "asm clobber conflict with input operand" +#~ msgstr "asm globber est en conflit avec l'opérande d'entrée" + +#~ msgid "too many alternatives in `asm'" +#~ msgstr "trop d'alternatives dans « asm »" + +#~ msgid "operand constraints for `asm' differ in number of alternatives" +#~ msgstr "contraintes de l'opérande pour « asm » diffèrent en nombre d'alternatives" + +#~ msgid "duplicate asm operand name '%s'" +#~ msgstr "nom d'opérande asm « %s » apparaît en double" + +#~ msgid "missing close brace for named operand" +#~ msgstr "accolade de fermeture manquante pour l'opérandé nommée" + +#~ msgid "undefined named operand '%s'" +#~ msgstr "opérande nommée « %s » indéfinie" + +#~ msgid "%Hstatement with no effect" +#~ msgstr "%Hdéclaration sasn effet" + +#~ msgid "%Hvalue computed is not used" +#~ msgstr "%Hvaleur calculée n'est pas utilisée" + +#~ msgid "%Junused variable '%D'" +#~ msgstr "%Jvariable « %D » inutilisée" + +#~ msgid "%Hunreachable code at beginning of %s" +#~ msgstr "%Hcode inatteignable au début de %s" + +#~ msgid "enumeration value `%s' not handled in switch" +#~ msgstr "valeur d'énumération « %s » n'est pas traitée dans le switch" + +#~ msgid "case value `%ld' not in enumerated type" +#~ msgstr "valeur du case « %ld » n'est pas dans le type énuméré" + +#~ msgid "case value `%ld' not in enumerated type `%s'" +#~ msgstr "valeur du case « %ld » n'est pas dans le type énuméré « %s »" + +#~ msgid "switch missing default case" +#~ msgstr "switch n'a pas de case par défaut" + +#~ msgid "type size can't be explicitly evaluated" +#~ msgstr "taille du type ne peut être explicitement évaluée" + +#~ msgid "variable-size type declared outside of any function" +#~ msgstr "type de taille variable déclaré à l'extérieur den'importe quelle fonction" + +#~ msgid "%Jsize of '%D' is %d bytes" +#~ msgstr "%Jtaille de « %D » est de %d octets" + +#~ msgid "%Jsize of '%D' is larger than %d bytes" +#~ msgstr "%Jtaille de « %D » est plus grande que %d octets" + +#~ msgid "%Jpacked attribute causes inefficient alignment for '%D'" +#~ msgstr "%Jattribut empaqueté provoque un alignement inefficient pour « %D »" + +#~ msgid "%Jpacked attribute is unnecessary for '%D'" +#~ msgstr "%Jattribut empaqueté n'est pas nécessaire pour « %D »" + +#~ msgid "%Jpadding struct to align '%D'" +#~ msgstr "%Jremplissage du struct pour aligner « %D »" + +#~ msgid "padding struct size to alignment boundary" +#~ msgstr "remplissage la taille du struct pour aligner les frontières" + +#~ msgid "packed attribute causes inefficient alignment for `%s'" +#~ msgstr "attribut empaqueté provoque un alignement inefficient pour « %s »" + +#~ msgid "packed attribute is unnecessary for `%s'" +#~ msgstr "attribut empaqueté n'est pas nécessaire pour « %s »" + +#~ msgid "packed attribute causes inefficient alignment" +#~ msgstr "attribut empaqueté provoque un alignement inefficient" + +#~ msgid "packed attribute is unnecessary" +#~ msgstr "attribut empaqueté n'est pas nécessaire" + +#~ msgid "__builtin_saveregs not supported by this target" +#~ msgstr "« __builtin_saveregs » n'est pas supporté par cette cible" + +#~ msgid "cannot timevar_pop '%s' when top of timevars stack is '%s'" +#~ msgstr "ne peut faire timevar_pop « %s » lorsque le haut de la pile timevars est « %s »" + +#~ msgid "" +#~ "\n" +#~ "Execution times (seconds)\n" +#~ msgstr "" +#~ "\n" +#~ "Temps d'exécution (secondes)\n" + +#~ msgid " TOTAL :" +#~ msgstr " TOTAL :" + +#~ msgid "time in %s: %ld.%06ld (%ld%%)\n" +#~ msgstr "temps passé dans %s: %ld.%06ld (%ld%%)\n" + +#~ msgid "collect: reading %s\n" +#~ msgstr "collect: lecture de %s\n" + +#~ msgid "collect: recompiling %s\n" +#~ msgstr "collect: recompilation de %s\n" + +#~ msgid "collect: tweaking %s in %s\n" +#~ msgstr "collect: tordage de %s dans %s\n" + +#~ msgid "collect: relinking\n" +#~ msgstr "collect: ré-édition des liens\n" + +#~ msgid "ld returned %d exit status" +#~ msgstr "ld a retourné %d code d'état d'exécution" + +# I18N +#~ msgid "%s " +#~ msgstr "%s " + +# I18N +#~ msgid " %s" +#~ msgstr " %s" + +#~ msgid "invalid option argument `%s'" +#~ msgstr "argument de l'option invalide « %s »" + +#~ msgid "getting core file size maximum limit: %m" +#~ msgstr "limite maximale obtenue de la taille du fichier de vidange (core file): %m" + +#~ msgid "setting core file size limit to maximum: %m" +#~ msgstr "initialisation de la limite maximal de la taille du fichier de vidance (core file): %m" + +#~ msgid "%J'%F' used but never defined" +#~ msgstr "%J« %F » utilisé mais n'a jamais été défini" + +#~ msgid "%J'%F' declared `static' but never defined" +#~ msgstr "%J« %F » déclaré « static » mais n'a jamais été définie" + +#~ msgid "%J'%D' defined but not used" +#~ msgstr "%J« %F » défini mais n'a pas été utilisé" + +#~ msgid "`%s' is deprecated (declared at %s:%d)" +#~ msgstr "« %s » est obsolète (déclaré à %s:%d)" + +#~ msgid "`%s' is deprecated" +#~ msgstr "« %s » est obsolète" + +#~ msgid "type is deprecated (declared at %s:%d)" +#~ msgstr "type est obsolète (déclaré à %s:%d)" + +#~ msgid "type is deprecated" +#~ msgstr "type est obsolète" + +#~ msgid "invalid register name `%s' for register variable" +#~ msgstr "nom de registre invalide « %s » pour un variable registre" + +#~ msgid "branch target register load optimization is not intended to be run twice" +#~ msgstr "optimisation du chargement du registre cible de branchement est pas prévu pour être exécuté deux fois" + +#~ msgid "" +#~ "\n" +#~ "Target specific options:\n" +#~ msgstr "" +#~ "\n" +#~ "Options spécifiques à la cible:\n" + +#~ msgid " -m%-23s [undocumented]\n" +#~ msgstr " -m%-23s [non documenté]\n" + +#~ msgid "" +#~ "\n" +#~ "There are undocumented target specific options as well.\n" +#~ msgstr "" +#~ "\n" +#~ "Il y a des options spécifiques à la cible qui ne sont pas documentés aussi.\n" + +#~ msgid " They exist, but they are not documented.\n" +#~ msgstr " Ils existent, mais ils ne sont pas documentés.\n" + +#~ msgid "unrecognized gcc debugging option: %c" +#~ msgstr "option gcc de mise au point non reconnue: %c" + +#~ msgid "invalid option `%s'" +#~ msgstr "option invalide « %s »" + +#~ msgid "" +#~ "%s%s%s version %s (%s)\n" +#~ "%s\tcompiled by GNU C version %s.\n" +#~ "%s%s%s version %s (%s) compiled by CC.\n" +#~ msgstr "" +#~ "%s%s%s version %s (%s)\n" +#~ "%s\tcompilé par GNU C version %s.\n" +#~ "%s%s%s version %s (%s) compilé par CC.\n" + +#~ msgid "%s%sGGC heuristics: --param ggc-min-expand=%d --param ggc-min-heapsize=%d\n" +#~ msgstr "heuristiques %s%sGGC: --param ggc-min-expand=%d --param ggc-min-heapsize=%d\n" + +#~ msgid "options passed: " +#~ msgstr "options passées: " + +#~ msgid "options enabled: " +#~ msgstr "options autorisées: " + +#~ msgid "can't open %s for writing: %m" +#~ msgstr "ne peut ouvrir %s en écriture: %m" + +#~ msgid "created and used with different settings of -fpic" +#~ msgstr "créé et utilisé avec des configurations différentes de -fpic" + +#~ msgid "created and used with different settings of -fpie" +#~ msgstr "créé et utilisé avec des configurations différentes de -fpie" + +#~ msgid "created and used with differing settings of `-m%s'" +#~ msgstr "créé et utilisé avec des configurations différentes de « -m%s »" + +#~ msgid "out of memory" +#~ msgstr "mémoire épuisée" + +#~ msgid "instruction scheduling not supported on this target machine" +#~ msgstr "instruction d'ordonnancement n'est pas supportée sur cette machine cible" + +#~ msgid "this target machine does not have delayed branches" +#~ msgstr "cette machine cible n'a pas de branchments avec délais" + +#~ msgid "-f%sleading-underscore not supported on this target machine" +#~ msgstr "-f%sleading-underscore n'est pas supporté sur cette machine cible" + +#~ msgid "target system does not support the \"%s\" debug format" +#~ msgstr "système cible ne supporte par le format \"%s\" de mise au point" + +#~ msgid "-ffunction-sections not supported for this target" +#~ msgstr "-ffunction-sections n'est pas supporté pour cette cible" + +#~ msgid "-fdata-sections not supported for this target" +#~ msgstr "-fdata-sections n'est pas supporté pour cette machine cible" + +#~ msgid "-ffunction-sections disabled; it makes profiling impossible" +#~ msgstr "-ffunction-sections désactivé; cela rend le profilage impossible" + +#~ msgid "-fprefetch-loop-arrays not supported for this target" +#~ msgstr "-fprefetch-loop-arrays n'est pas supporté pour cette machine cible" + +#~ msgid "-fprefetch-loop-arrays not supported for this target (try -march switches)" +#~ msgstr "-fprefetch-loop-arrays n'est pas supporté sur cette machine cible (essayer -march options)" + +#~ msgid "-fprefetch-loop-arrays is not supported with -Os" +#~ msgstr "-fprefetch-loop-arrays n'est pas supporté avec -Os" + +#~ msgid "-ffunction-sections may affect debugging on some targets" +#~ msgstr "-ffunction-sections peut affecter la mise au point sur quelques machines cibles." + +#~ msgid "error writing to %s: %m" +#~ msgstr "erreur d'écriture dans %s: %m" + +#~ msgid "error closing %s: %m" +#~ msgstr "erreur de fermeture %s: %m" + +#~ msgid "could not open dump file `%s'" +#~ msgstr "ne peut ouvrir le fichier de vidange « %s »" + +#~ msgid "ignoring unknown option `%.*s' in `-fdump-%s'" +#~ msgstr "option inconnue « %.*s » ignorée dans « -fdump-%s »" + +#~ msgid "%Jfunction '%F' can never be inlined because it uses alloca (override using the always_inline attribute)" +#~ msgstr "%Jfonction « %F » ne peut être enligne parce qu'elle utilise alloca (écrasant l'utiliastion de l'attribut always_inline)" + +#~ msgid "%Jfunction '%F' can never be inlined because it uses setjmp" +#~ msgstr "%Jfonction « %F » ne peut être enligne parce qu'elle utilise setjmp" + +#~ msgid "%Jfunction '%F' can never be inlined because it uses variable argument lists" +#~ msgstr "%Jfonction « %F » ne peut être enligne parce qu'elle utilise une liste variable d'arguments" + +#~ msgid "%Jfunction '%F' can never be inlined because it uses setjmp-longjmp exception handling" +#~ msgstr "%Jfonction « %F » ne peut être enligne parce qu'elle utilise le traitement d'exception setjmp-longjmp" + +#~ msgid "%Jfunction '%F' can never be inlined because it contains a nested function" +#~ msgstr "%Jfonction « %F » ne peut être enligne parce qu'elle contient une fonction imbriquée" + +#~ msgid "%Jfunction '%F' can never be inlined because it contains a computed goto" +#~ msgstr "%Jfonction « %F » ne peut être enligne parce qu'elle contient un goto calculé" + +#~ msgid "%Jfunction '%F' can never be inlined because it contains a nonlocal goto" +#~ msgstr "%Jfonction « %F » ne peut être enligne parce qu'elle contient un goto qui n'est pas local" + +#~ msgid "%Jfunction '%F' can never be inlined because it uses variable sized variables" +#~ msgstr "%Jfonction « %F » ne peut être enligne parce qu'elle utilise une taille variable de variables" + +#~ msgid "%Jinlining failed in call to '%F': %s" +#~ msgstr "%Jl'enlignage de l'appel à « %F »: %s a échoué" + +#~ msgid "%Jsize of return value of '%D' is %u bytes" +#~ msgstr "%Jtaille de la valeur retournée par « %D » est %u octets" + +#~ msgid "%Jsize of return value of '%D' is larger than %wd bytes" +#~ msgstr "%Jtaille de la valeur retournée par « %D » supérieure à %wd octets" + +#~ msgid "arrays of functions are not meaningful" +#~ msgstr "tableaux de fonctions n'a pas grand sens" + +#~ msgid "function return type cannot be function" +#~ msgstr "Le type retourné d'une fonction ne peut être une fonction" + +#~ msgid "invalid initializer for bit string" +#~ msgstr "initialisation invalide pour une chaîne de bits" + +#~ msgid "tree check: expected %s, have %s in %s, at %s:%d" +#~ msgstr "vérification de l'arbre: attendait %s, obtenu %s dans %s, à %s:%d" + +#~ msgid "tree check: expected class '%c', have '%c' (%s) in %s, at %s:%d" +#~ msgstr "vérification de l'arbre: attendait classe « %c », obtenu « %c » (%s) dans %s, à %s:%d" + +#~ msgid "tree check: accessed elt %d of tree_vec with %d elts in %s, at %s:%d" +#~ msgstr "vérification de l'arbre: accès de elt %d de tree-vec avec %d elts dans %s, à %s:%d" + +#~ msgid "tree check: accessed operand %d of %s with %d operands in %s, at %s:%d" +#~ msgstr "vérification de l'arbre: opérande accédé %d de %s avec %d opérandes dans %s, à %s:%d" + +#~ msgid "%J%D causes a section type conflict" +#~ msgstr "%J%D cause un conflit du type de section" + +#~ msgid "%Jregister name not specified for '%D'" +#~ msgstr "%Jnom de registre n'est pas spécifié pour « %D »" + +#~ msgid "%Jinvalid register name for '%D'" +#~ msgstr "%Jnom de registre invalide pour « %D »" + +#~ msgid "%Jdata type of '%D' isn't suitable for a register" +#~ msgstr "%Jtype de données de « %D » n'est pas applicable pour un registre" + +#~ msgid "%Jregister specified for '%D' isn't suitable for data type" +#~ msgstr "%Jregistre spécifié pour « %D » n'est applicable à un type de données" + +#~ msgid "global register variable has initial value" +#~ msgstr "variable globale registre a une valeur initiale" + +#~ msgid "volatile register variables don't work as you might wish" +#~ msgstr "variables resgistres volatiles ne fonctionne pas comme vous le souhaiteriez" + +#~ msgid "%Jregister name given for non-register variable '%D'" +#~ msgstr "%Jnom de registre donné pour une variable non registre « %D »" + +#~ msgid "%Jstorage size of `%D' isn't known" +#~ msgstr "%Jtaille de stockage de « %D » n'est pas connue" + +#~ msgid "%Jalignment of '%D' is greater than maximum object file alignment. Using %d" +#~ msgstr "%Jalignement de « %D » est plus grand que l'alignement maximal du fichier objet. %d est utilisé." + +#~ msgid "thread-local COMMON data not implemented" +#~ msgstr "thread-local COMMON data n'est pas implanté" + +#~ msgid "%Jrequested alignment for '%D' is greater than implemented alignment of %d" +#~ msgstr "%Jrequête d'alignement pour '%D' est plus grand que l'alignement implanté de %d" + +#~ msgid "initializer for integer value is too complicated" +#~ msgstr "initialisation d'entier trop compliquée" + +#~ msgid "initializer for floating value is not a floating constant" +#~ msgstr "l'initialisation d'une valeur à virgule flottante n'est pas une constante à virgule flottante" + +#~ msgid "unknown set constructor type" +#~ msgstr "type de jeu de constructeurs inconnu" + +#~ msgid "invalid initial value for member `%s'" +#~ msgstr "valeur initiale invalide pour le membre « %s »" + +#~ msgid "%Jweak declaration of '%D' must precede definition" +#~ msgstr "%Jdéclaration faible de « %D » qui doit être précédée d'une définition" + +#~ msgid "%Jweak declaration of '%D' after first use results in unspecified behavior" +#~ msgstr "%Jdéclaration faible de « %D » après une première utilisation des résultats d'un comportement non spécifié" + +#~ msgid "%Jweak declaration of '%D' must be public" +#~ msgstr "%Jdéclaration faible de « %D » doit être publique" + +#~ msgid "%Jweak declaration of '%D' not supported" +#~ msgstr "%Jdéclaration faible de « %D » n'est pas supportée" + +#~ msgid "only weak aliases are supported in this configuration" +#~ msgstr "seulement les alias faibles sont supportés dans cette configuration" + +#~ msgid "alias definitions not supported in this configuration; ignored" +#~ msgstr "définitions d'alias ne sont pas supportés dans cette configuration; ignoré" + +#~ msgid "visibility attribute not supported in this configuration; ignored" +#~ msgstr "visibilité de l'attribut n'est pas supporté dans cette configuration; ignoré" + +#~ msgid "virtual array %s[%lu]: element %lu out of bounds in %s, at %s:%d" +#~ msgstr "tableau virtuel %s[%lu]: élément %lu hors limite dans %s, à %s:%d" + +#~ msgid "underflowed virtual array %s in %s, at %s:%d" +#~ msgstr "sous débordement du tableau virtuele %s dans %s, à %s:%d" + +#~ msgid "no sclass for %s stab (0x%x)\n" +#~ msgstr "pas de sclass pour le stab %s (0x%x)\n" + +#~ msgid "fatal error: " +#~ msgstr "erreur fatale: " + +#~ msgid "internal compiler error: " +#~ msgstr "erreur interne du compilateur: " + +#~ msgid "sorry, unimplemented: " +#~ msgstr "désolé, pas implanté: " + +#~ msgid "anachronism: " +#~ msgstr "anachronisme: " + +#~ msgid "note: " +#~ msgstr "note: " + +#~ msgid "debug: " +#~ msgstr "mise au point: " + +#~ msgid "The maximum number of instructions in a single function eligible for inlining" +#~ msgstr "Le nombre maximum d'instructions dans une fonction simple éligible au type enligne" + +#~ msgid "The maximum number of instructions when automatically inlining" +#~ msgstr "Le nombre maximum d'instructions lorsqu'automatiquement de type enligne" + +#~ msgid "The maximum number of instructions for the RTL inliner" +#~ msgstr "Le nombre maximum d'instructions pour la fonction d'enlignage RTL" + +#~ msgid "The maximum number of instructions to consider to fill a delay slot" +#~ msgstr "Le nombre maximum d'instructions à considérer pour remplir une slot délai" + +#~ msgid "The maximum number of instructions to consider to find accurate live register information" +#~ msgstr "Le nombre maximum d'instructions à considérer pour repérer un registre d'information actif et précis" + +#~ msgid "The maximum length of scheduling's pending operations list" +#~ msgstr "La longueur maximale de la liste des opération en attente d'ordonnancement" + +#~ msgid "The size of function body to be considered large" +#~ msgstr "La taille du corps de la fonction est considéré comme étant grande" + +#~ msgid "Maximal growth due to inlining of large function (in percent)" +#~ msgstr "Croissance maximal en raison de l'enlignage d'une grande fonction (en pourcent)" + +#~ msgid "how much can given compilation unit grow because of the inlining (in percent)" +#~ msgstr "quelle croissance d'une unité de compilation peut être tolérée en raison de l'enlignage (en pourcent)" + +#~ msgid "The maximum amount of memory to be allocated by GCSE" +#~ msgstr "La taille maximale de mémoire à être alloué par GCSE" + +#~ msgid "The maximum number of passes to make when doing GCSE" +#~ msgstr "Le nombre maxium de passes à effectuer lors de l'exécution de GCSE" + +#~ msgid "The maximum number of instructions to consider to unroll in a loop" +#~ msgstr "Le nombre maximum d'instructions à considérer à inclure dans une boucle" + +#~ msgid "The maximum number of instructions to consider to unroll in a loop on average" +#~ msgstr "Le nombre maximum d'instructions à considérer à inclure dans une boucle en moyenne" + +#~ msgid "The maximum number of unrollings of a single loop" +#~ msgstr "Le nombre maximum d'instructions à inclure dans une boucle simple" + +#~ msgid "The maximum number of insns of a peeled loop" +#~ msgstr "Le nombre maximum d'insns de boucle réduite" + +#~ msgid "The maximum number of peelings of a single loop" +#~ msgstr "Le nombre maxium de passes de réduction d'une boucle simple" + +#~ msgid "The maximum number of insns of a completely peeled loop" +#~ msgstr "Le nombre maximum d'insns d'une boucle complètement réduite" + +#~ msgid "The maximum number of peelings of a single loop that is peeled completely" +#~ msgstr "Le nombre maximum de réductions d'une boucle simple qui a été complètement réduite" + +#~ msgid "The maximum number of insns of a peeled loop that rolls only once" +#~ msgstr "Le nombre maximum d'insns d'une boucle réduite qui tourne une seule fois" + +#~ msgid "The maximum number of insns of an unswitched loop" +#~ msgstr "Le nombre maximum d'insns d'une boucle sans branchement" + +#~ msgid "The maximum number of unswitchings in a single loop" +#~ msgstr "Le nombre maximum de non branchement dans une boucle simple" + +#~ msgid "Select fraction of the maximal count of repetitions of basic block in program given basic block needs to have to be considered hot" +#~ msgstr "Sélectionner la fraction du décompte maximal de répétition du bloc de base dans le programme selon le bloc de bsae donné doit être considéré comme chaud « hot »" + +#~ msgid "Select fraction of the maximal frequency of executions of basic block in function given basic block needs to have to be considered hot" +#~ msgstr "Sélectionner la fraction de la fréquence maximale d'exécutions du bloc de base dans la fonction selon le bloc de bsae donné doit être considéré comme chaud « hot »" + +#~ msgid "The percentage of function, weighted by execution frequency, that must be covered by trace formation. Used when profile feedback is available" +#~ msgstr "Le pourcentage de fonction, pondéré par la fréquence d'exécutions, qui doit être couvert la formation de la trace. Utilisé lorsque le feedback par profile est disponible" + +#~ msgid "The percentage of function, weighted by execution frequency, that must be covered by trace formation. Used when profile feedback is not available" +#~ msgstr "Le pourcentage de fonction, pondéré par la fréquence d'exécutions, qui doit être couvert la formation de la trace. Utilisé lorsque le feedback par profilage n'est disponible" + +#~ msgid "Maximal code growth caused by tail duplication (in percent)" +#~ msgstr "Croissance maximal du code en raison de duplication de queue (en pourcent)" + +#~ msgid "Stop reverse growth if the reverse probability of best edge is less than this threshold (in percent)" +#~ msgstr "Stopper la croissance renversée si la probabilité inverse des meilleures bordures est inférieure à ce seuil (en pourcent)" + +#~ msgid "Stop forward growth if the probability of best edge is less than this threshold (in percent). Used when profile feedback is available" +#~ msgstr "Stopper la croissance anticipée si la probabilité des meilleures bordures est inférieure à ce seuil (en pourcent). Utilisé lorsque le feedback par profilage est disponible" + +#~ msgid "Stop forward growth if the probability of best edge is less than this threshold (in percent). Used when profile feedback is not available" +#~ msgstr "Stopper la croissance anticipée si la probabilité des meilleures bordures est inférieure à ce seuil (en pourcent). Utilisé lorsque le feedback par profilage n'est pas disponible" + +#~ msgid "The maximum number of incoming edges to consider for crossjumping" +#~ msgstr "Le nombre maximum de bordures à considérer pour les sauts croisés" + +#~ msgid "The maximum length of path considered in cse" +#~ msgstr "La longueur maximale des chemins considérés dans cse" + +#~ msgid "The maximum memory locations recorded by cselib" +#~ msgstr "Le nombre maximum de localisations mémoire enregistrées par cselib" + +#~ msgid "Minimum heap expansion to trigger garbage collection, as a percentage of the total size of the heap" +#~ msgstr "L'expansion minimale des tas pour lancer la collecte des rebuts, en pourcentage de la taille totale du tas." + +#~ msgid "Minimum heap size before we start collecting garbage, in kilobytes" +#~ msgstr "La taille minimale du tas avant de lancer la collecte des rebuts, en kilo-octets." + +#~ msgid "The maximum number of instructions to search backward when looking for equivalent reload" +#~ msgstr "Le nombre maximum d'instructions à rechercher antérieurement lors d'une recherche d'une recharge équivalente" + +#~ msgid "too many #pragma options align=reset" +#~ msgstr "trop d'options pour #pragma pour align=reset" + +#~ msgid "malformed '#pragma options', ignoring" +#~ msgstr "« #pragma options » mal composé, ignoré" + +#~ msgid "junk at end of '#pragma options'" +#~ msgstr "rebut à la fin de « #pragma options »" + +#~ msgid "malformed '#pragma options align={mac68k|power|reset}', ignoring" +#~ msgstr "« #pragma options align={mac68k|power|reset} » mal composé, ignoré" + +#~ msgid "missing '(' after '#pragma unused', ignoring" +#~ msgstr "« ( » manquante après « #pragma unused », ignoré" + +#~ msgid "missing ')' after '#pragma unused', ignoring" +#~ msgstr "« ( » manquante après « #pragma unused », ignoré" + +#~ msgid "junk at end of '#pragma unused'" +#~ msgstr "rebut à la fin de « #pragma unused »" + +#~ msgid "internal and protected visibility attributes not supportedin this configuration; ignored" +#~ msgstr "visibilité des attributs internes et protégées n'est pas supportée dans cette configuration; ignoré" + +#~ msgid "-msystem-v and -p are incompatible" +#~ msgstr "-msystem-v et -p sont incompatibles" + +#~ msgid "-msystem-v and -mthreads are incompatible" +#~ msgstr "-msystem-v et -mthreads sont incompatibles" + +#~ msgid "profiler support for WindISS" +#~ msgstr "support du profileur pour WindISS" + +#~ msgid "-f%s ignored for Unicos/Mk (not supported)" +#~ msgstr "-f%s ignoré pour Unicos/Mk (non supporté)" + +#~ msgid "-mieee not supported on Unicos/Mk" +#~ msgstr "-mieee n'est pas supporté sur Unicos/Mk" + +#~ msgid "-mieee-with-inexact not supported on Unicos/Mk" +#~ msgstr "-mieee-with-inexact n'est pas supporté sur Unicos/Mk" + +#~ msgid "bad value `%s' for -mtrap-precision switch" +#~ msgstr "valeur « %s » erronée pour l'option -mtrap-precision" + +#~ msgid "bad value `%s' for -mfp-rounding-mode switch" +#~ msgstr "valeur « %s » erronée pour l'option -mfp-rounding-mode" + +#~ msgid "bad value `%s' for -mfp-trap-mode switch" +#~ msgstr "valeur « %s » erronée pour l'option -mfp-trap-mode" + +#~ msgid "bad value `%s' for -mtls-size switch" +#~ msgstr "valeur « %s » erronée pour l'option -mtls-size" + +#~ msgid "bad value `%s' for -mcpu switch" +#~ msgstr "valeur « %s » erronée pour l'option -mcpu" + +#~ msgid "trap mode not supported on Unicos/Mk" +#~ msgstr "mode trappe n'est pas supporté sur Unicos/Mk" + +#~ msgid "fp software completion requires -mtrap-precision=i" +#~ msgstr "complétion logicielle FP requiert -mtrap-precision=i" + +#~ msgid "rounding mode not supported for VAX floats" +#~ msgstr "mode d'arondissement n'est pas supporté pour les flottants sur VAX" + +#~ msgid "trap mode not supported for VAX floats" +#~ msgstr "mode trappe n'est pas supporté avec les flottants sur VAX" + +#~ msgid "128-bit long double not supported for VAX floats" +#~ msgstr "long double de 128 bits ne sont pas supporté pour les flottants sur VAX" + +#~ msgid "L%d cache latency unknown for %s" +#~ msgstr "latence de la cache L%d inconnue pour %s" + +#~ msgid "bad value `%s' for -mmemory-latency" +#~ msgstr "valeur « %s » erronée pour -mmemory-latency" + +#~ msgid "invalid %%H value" +#~ msgstr "valeur %%H invalide" + +#~ msgid "invalid %%J value" +#~ msgstr "valeur %%J invalide" + +#~ msgid "invalid %%r value" +#~ msgstr "valeur %%r invalide" + +#~ msgid "invalid %%R value" +#~ msgstr "valeur %%R invalide" + +#~ msgid "invalid %%N value" +#~ msgstr "valeur %%N invalide" + +#~ msgid "invalid %%P value" +#~ msgstr "valeur %%P invalide" + +#~ msgid "invalid %%h value" +#~ msgstr "valeur %%h invalide" + +#~ msgid "invalid %%L value" +#~ msgstr "valeur %%L invalide" + +#~ msgid "invalid %%m value" +#~ msgstr "valeur %%m invalide" + +#~ msgid "invalid %%M value" +#~ msgstr "valeur %%M invalide" + +#~ msgid "invalid %%U value" +#~ msgstr "valeur %%U invalide" + +#~ msgid "invalid %%s value" +#~ msgstr "valeur %%s invalide" + +#~ msgid "invalid %%C value" +#~ msgstr "valeur %%C invalide" + +#~ msgid "invalid %%E value" +#~ msgstr "valeur %%E invalide" + +#~ msgid "unknown relocation unspec" +#~ msgstr "relocalisation unspec inconnue" + +#~ msgid "invalid %%xn code" +#~ msgstr "valeur %%xn invalide" + +#~ msgid "bad builtin fcode" +#~ msgstr "construit interne erroné de fcode" + +#~ msgid "Use hardware fp" +#~ msgstr "Utiliser le FP matériel" + +#~ msgid "Do not use hardware fp" +#~ msgstr "Ne pas utiliser l'unité FP matérielle" + +#~ msgid "Use fp registers" +#~ msgstr "Utiliser les registres FP" + +#~ msgid "Do not use fp registers" +#~ msgstr "Ne pas utiliser les registres FP" + +#~ msgid "Do not assume GAS" +#~ msgstr "Ne pas présumer la présence de GAS" + +#~ msgid "Assume GAS" +#~ msgstr "Présumer la présence de GAS" + +#~ msgid "Request IEEE-conformant math library routines (OSF/1)" +#~ msgstr "Requête des routine de la bibliothèque mathématique conforme IEEE (OSF/1)" + +#~ msgid "Emit IEEE-conformant code, without inexact exceptions" +#~ msgstr "Produire du code conforme IEEE, sans exceptions inexactes" + +#~ msgid "Emit IEEE-conformant code, with inexact exceptions" +#~ msgstr "Produire du code conforme IEEE, avec exceptions inexactes" + +#~ msgid "Do not emit complex integer constants to read-only memory" +#~ msgstr "Ne pas produire des constantes entières complexes en mémoire en mode lecture seulement" + +#~ msgid "Use VAX fp" +#~ msgstr "Utiliser les registres FP sur VAX" + +#~ msgid "Do not use VAX fp" +#~ msgstr "Ne pas utiliser les registres FP sur VAX" + +#~ msgid "Emit code for the byte/word ISA extension" +#~ msgstr "Produire du code pour les octets/mots des extensions ISA" + +#~ msgid "Emit code for the motion video ISA extension" +#~ msgstr "Produire du code pour les extensions vidéo ISA" + +#~ msgid "Emit code for the fp move and sqrt ISA extension" +#~ msgstr "Produire du code pour les déplacements FP et sqrt des extensions ISA" + +#~ msgid "Emit code for the counting ISA extension" +#~ msgstr "Produire du code pour les extensions ISA de comptage" + +#~ msgid "Emit code using explicit relocation directives" +#~ msgstr "Produire du code utilisant des directives explicites de relocalisation" + +#~ msgid "Emit 16-bit relocations to the small data areas" +#~ msgstr "Produire du code de 16 bits pour le relocalisation des petites zones de données" + +#~ msgid "Emit 32-bit relocations to the small data areas" +#~ msgstr "Produire du code de 32 bits pour le relocalisation des petites zones de données" + +#~ msgid "Emit direct branches to local functions" +#~ msgstr "Omettre le branchement direct aux fonctions locales" + +#~ msgid "Emit rdval instead of rduniq for thread pointer" +#~ msgstr "Produire rdval au lieu de rduniq pour le pointeur de thread" + +#~ msgid "Use 128-bit long double" +#~ msgstr "Utiliser un long double de 128 bits" + +#~ msgid "Use 64-bit long double" +#~ msgstr "Utiliser un long double de 64 bits" + +#~ msgid "Use features of and schedule given CPU" +#~ msgstr "Utiliser les options et ordonnancer pour le processeur donné " + +#~ msgid "Schedule given CPU" +#~ msgstr "Ordonnancer le processeur donné" + +#~ msgid "Control the generated fp rounding mode" +#~ msgstr "Contrôler le mode d'arondissement FP généré" + +#~ msgid "Control the IEEE trap mode" +#~ msgstr "Contrôler le mode trappe IEEE" + +#~ msgid "Control the precision given to fp exceptions" +#~ msgstr "Contrôler la précision donnée des exceptions FP" + +#~ msgid "Tune expected memory latency" +#~ msgstr "Ajuster la latence mémoire attendue" + +#~ msgid "Specify bit size of immediate TLS offsets" +#~ msgstr "Spécifier la taille de bit des décalages immédiats TLS" + +#~ msgid "bad value (%s) for -mcpu switch" +#~ msgstr "valeur (%s) erronée pour l'option -mcpu" + +#~ msgid "argument of `%s' attribute is not a string constant" +#~ msgstr "argument de l'attribut « %s » n'est pas une chaîne de constante" + +#~ msgid "argument of `%s' attribute is not \"ilink1\" or \"ilink2\"" +#~ msgstr "l'argument de l'attribut « %s » n'est pas «ilink1» ou «ilink2 »" + +#~ msgid "invalid operand to %%R code" +#~ msgstr "opérande invalide pour le code %%R" + +#~ msgid "invalid operand to %%H/%%L code" +#~ msgstr "opérande invalide pour le code %%H/%%L" + +#~ msgid "invalid operand to %%U code" +#~ msgstr "opérande invalide pour le code %%U" + +#~ msgid "invalid operand to %%V code" +#~ msgstr "opérande invalide pour le code %%V" + +#~ msgid "invalid operand output code" +#~ msgstr "opérande invalide pour le code de sortie" + +#~ msgid "switch -mcpu=%s conflicts with -march= switch" +#~ msgstr "l'option -mcpu=%s est en conflit avec l'option -march= " + +#~ msgid "bad value (%s) for %s switch" +#~ msgstr "valeur (%s) erronée pour l'option %s" + +#~ msgid "target CPU does not support APCS-32" +#~ msgstr "le processeur cible ne supporte pas APCS-32" + +#~ msgid "target CPU does not support APCS-26" +#~ msgstr "le processeur cible ne supporte pas APCS-26" + +#~ msgid "target CPU does not support interworking" +#~ msgstr "le processeur cible ne supporte pas l'inter-réseautage" + +#~ msgid "target CPU does not support THUMB instructions" +#~ msgstr "le processeur cible ne supporte pas les instructions THUMB" + +#~ msgid "future releases of GCC will not support -mapcs-26" +#~ msgstr "les prochaines versions de GCC ne supporteront pas -mapcs-26" + +#~ msgid "enabling backtrace support is only meaningful when compiling for the Thumb" +#~ msgstr "autoriser le support de pistage arrière si seulement significatif lors de la compilation pour le Thumb" + +#~ msgid "enabling callee interworking support is only meaningful when compiling for the Thumb" +#~ msgstr "autoriser le support d'inter-réseautage des appelés si seulement significatif lors de la compilation pour le Thumb" + +#~ msgid "enabling caller interworking support is only meaningful when compiling for the Thumb" +#~ msgstr "autoriser le support d'inter-réseautage des appelants si seulement significatif lors de la compilation pour le Thumb" + +#~ msgid "interworking forces APCS-32 to be used" +#~ msgstr "l'inter-réseautage force l'utilisation de APCS-32" + +#~ msgid "-mapcs-stack-check incompatible with -mno-apcs-frame" +#~ msgstr "-mapcs-stack-check incompatible avec -mno-apcs-frame" + +#~ msgid "-fpic and -mapcs-reent are incompatible" +#~ msgstr "-fpic et -mapcs-reent sont incompatibles" + +#~ msgid "APCS reentrant code not supported. Ignored" +#~ msgstr "Code réentrant APCS n'est pas supporté. Ignoré" + +#~ msgid "-g with -mno-apcs-frame may not give sensible debugging" +#~ msgstr "-g avec -mno-apcs-frame peut ne pas donner une mise au point sensée" + +#~ msgid "passing floating point arguments in fp regs not yet supported" +#~ msgstr "passage d'argument en virgule flottante dans les registres FP n'est pas encore supporté" + +#~ msgid "invalid floating point emulation option: -mfpe-%s" +#~ msgstr "option d'émulation en virgule flottante invalide: -mfpe-%s" + +#~ msgid "-mfpe switch not supported by ep9312 target cpu - ignored." +#~ msgstr "opeion -mfpe n'est pas supportée par le processeur cible ep9312 - ignoré" + +#~ msgid "structure size boundary can only be set to 8 or 32" +#~ msgstr "taille des bornes de la structure peut seulement être 8 ou 32" + +#~ msgid "-mpic-register= is useless without -fpic" +#~ msgstr "-mpic-register= est inutile sans -fpic" + +#~ msgid "unable to use '%s' for PIC register" +#~ msgstr "incapable d'utiliser « %s » pour un registre PIC" + +#~ msgid "`%s' attribute only applies to functions" +#~ msgstr "attribut « %s » s'applique seulement aux fonctions" + +#~ msgid "unable to compute real location of stacked parameter" +#~ msgstr "incapable de calculer la localisation réelle de la pile de paramètres" + +#~ msgid "selector must be an immediate" +#~ msgstr "sélecteur doit être un immédiat" + +#~ msgid "mask must be an immediate" +#~ msgstr "masque doit être un immédiat" + +#~ msgid "no low registers available for popping high registers" +#~ msgstr "pas de registre bas disponible pour faire ressortir les registres du haut" + +#~ msgid "interrupt Service Routines cannot be coded in Thumb mode" +#~ msgstr "routines d'interruption de service ne peuvent être codées en mode THUMB" + +#~ msgid "%Jinitialized variable '%D' is marked dllimport" +#~ msgstr "%Jvariable initialisé « %D » est marquée dllimport" + +#~ msgid "%Jstatic variable '%D' is marked dllimport" +#~ msgstr "%Jvariable statique « %D » est marquée dllimport" + +#~ msgid "Generate APCS conformant stack frames" +#~ msgstr "Générer des trames de pile conformes à APCS" + +#~ msgid "Store function names in object code" +#~ msgstr "Sotcker les noms de fonctions dans le code objet" + +#~ msgid "Use the 32-bit version of the APCS" +#~ msgstr "Utilise la version 32 bts de APCS" + +#~ msgid "Pass FP arguments in FP registers" +#~ msgstr "Passer les arguments FP par les registres FP" + +#~ msgid "Generate re-entrant, PIC code" +#~ msgstr "Générer du code PIC ré-entrant" + +#~ msgid "The MMU will trap on unaligned accesses" +#~ msgstr "Le MMU va intercepter les accès mal alignés" + +#~ msgid "Use library calls to perform FP operations" +#~ msgstr "Utiliser les appels de bibliothèque pour exécuter les opérations FP" + +#~ msgid "Use hardware floating point instructions" +#~ msgstr "Utiliser les instructions matérielles en virgule flottante" + +#~ msgid "Assume target CPU is configured as big endian" +#~ msgstr "Présumer que le processeur cible est un système à octets de poids fort" + +#~ msgid "Assume target CPU is configured as little endian" +#~ msgstr "Présumer que le processeur cible est un système à octets de poids faible" + +#~ msgid "Assume big endian bytes, little endian words" +#~ msgstr "Présumer un système à octets de poids fort pour les octets et faible pour les mots" + +#~ msgid "Support calls between Thumb and ARM instruction sets" +#~ msgstr "Supporter les appels des jeux d'instructions THUMB et ARM" + +#~ msgid "Generate a call to abort if a noreturn function returns" +#~ msgstr "Générer un appel pour stopper si une fonction sans retour retourne un résultat" + +#~ msgid "Do not move instructions into a function's prologue" +#~ msgstr "Ne pas déplacer les instruction dans le prologue de fonction" + +#~ msgid "Do not load the PIC register in function prologues" +#~ msgstr "Ne pas charger le registre PIC dans les prologue de fonction" + +#~ msgid "Generate call insns as indirect calls, if necessary" +#~ msgstr "Générer l'appel insn comme un appel indirect, si nécessaire" + +#~ msgid "Compile for the Thumb not the ARM" +#~ msgstr "Compiler pour le THUMB et non pas le ARM" + +#~ msgid "Thumb: Generate (non-leaf) stack frames even if not needed" +#~ msgstr "Thumb: générer (non feuilles) trames de pile même si non nécessaire" + +#~ msgid "Thumb: Generate (leaf) stack frames even if not needed" +#~ msgstr "Thumb : Générer (feuilles) trames de pile même si non nécessaire" + +#~ msgid "Thumb: Assume non-static functions may be called from ARM code" +#~ msgstr "Thumb : Présumer que les fonctions non statiques peuvent être appelées du code ARM" + +#~ msgid "Thumb: Assume function pointers may go to non-Thumb aware code" +#~ msgstr "Thumb : Présumer que les pointeurs de fonction peuvent tomber dans le code en dehors non sensible au Thumb" + +#~ msgid "Cirrus: Place NOPs to avoid invalid instruction combinations" +#~ msgstr "Cirrus: insérer des NOP pour éviter un combinaison d'instructions invalides" + +#~ msgid "Cirrus: Do not break up invalid instruction combinations with NOPs" +#~ msgstr "Cirrus: ne pas briser la combinaison d'instructions invalides avec des NOP" + +#~ msgid "Specify the name of the target CPU" +#~ msgstr "Spécifier le nom du processeur cible" + +#~ msgid "Specify the name of the target architecture" +#~ msgstr "Spécifier le nom de l'architecture cible" + +#~ msgid "Specify the version of the floating point emulator" +#~ msgstr "Spécifier la version de l'émulateur en virgule flottante" + +#~ msgid "Specify the minimum bit alignment of structures" +#~ msgstr "Spécifier le minimum de bits pour l'alignement de structures" + +#~ msgid "Specify the register to be used for PIC addressing" +#~ msgstr "Spécifier le registre à utiliser pour l'adressage PIC" + +#~ msgid "Ignore dllimport attribute for functions" +#~ msgstr "Ignorer l'attribut dllimport pour les fonctions" + +#~ msgid "large frame pointer change (%d) with -mtiny-stack" +#~ msgstr "grand pointeur de trames change (%d) avec -mtiny-stack" + +#~ msgid "bad address, not (reg+disp):" +#~ msgstr "adresse erronée, pas (reg+disp):" + +#~ msgid "internal compiler error. Bad address:" +#~ msgstr "erreur internal du compilateur. Adresse erronée:" + +#~ msgid "internal compiler error. Unknown mode:" +#~ msgstr "erreur internal du compilateur. Mode inconnu:" + +#~ msgid "invalid insn:" +#~ msgstr "insn invalide:" + +#~ msgid "incorrect insn:" +#~ msgstr "insn incoorect:" + +#~ msgid "unknown move insn:" +#~ msgstr "insn de déplacement inconnu:" + +#~ msgid "bad shift insn:" +#~ msgstr "décalage insn erroné:" + +#~ msgid "internal compiler error. Incorrect shift:" +#~ msgstr "erreur internal du compilateur. Décalage incorrect:" + +#~ msgid "only initialized variables can be placed into program memory area" +#~ msgstr "seules les variables initialisées peuvent être placées dans la zone mémoire du programme" + +#~ msgid "only uninitialized variables can be placed in the .noinit section" +#~ msgstr "seuls les variables non initialisées peuvent être placées dans une section .noinit" + +#~ msgid "MCU `%s' supported for assembler only" +#~ msgstr "MCU « %s » est supporté pour l'assembleur seulement" + +#~ msgid "Assume int to be 8 bit integer" +#~ msgstr "Présumer que les int sont des entiers de 8 bits" + +#~ msgid "Change the stack pointer without disabling interrupts" +#~ msgstr "Changer le pointeur de pile sans désactiver les interruptions" + +#~ msgid "Use subroutines for function prologue/epilogue" +#~ msgstr "Utiliser des sous-routines pour le prologue/epilogue de fonction" + +#~ msgid "Change only the low 8 bits of the stack pointer" +#~ msgstr "Changer seulement les 8 bits du bas du pointeur de pile" + +#~ msgid "Do not generate tablejump insns" +#~ msgstr "Ne pas générer les sauts de table insns" + +#~ msgid "Use rjmp/rcall (limited range) on >8K devices" +#~ msgstr "Utiliser rjpm/rcall (étendue limitée) sur des périphériques >8K" + +#~ msgid "Output instruction sizes to the asm file" +#~ msgstr "Produire les tailles d'instructions dans le fichier asm" + +#~ msgid "Specify the initial stack address" +#~ msgstr "Spécifier l'adresse initiale de la pile" + +#~ msgid "Specify the MCU name" +#~ msgstr "Spécifier le nom du MCU" + +#~ msgid "trampolines not supported" +#~ msgstr "trampolines ne sont pas supportées" + +#~ msgid "missing '(' after '#pragma %s' - ignored" +#~ msgstr "«(» manquante après «#pragma %s» - ignoré" + +#~ msgid "missing function name in '#pragma %s' - ignored" +#~ msgstr "nom de fonction manquant dans «#pragma %s» - ignoré" + +#~ msgid "malformed '#pragma %s' - ignored" +#~ msgstr "«#pragma %s» mal composé - ignoré" + +#~ msgid "missing section name in '#pragma %s' - ignored" +#~ msgstr "nom de section manquant dans «#pragma %s» - ignoré" + +#~ msgid "missing ')' for '#pragma %s' - ignored" +#~ msgstr "«)» manquante pour «#pragma %s» - ignoré" + +#~ msgid "junk at end of '#pragma %s'" +#~ msgstr "rebut à la fin de «#pragma %s'" + +#~ msgid "unknown CPU version %d, using 40.\n" +#~ msgstr "version de processeur %d inconnue, 40 est utilisé.\n" + +#~ msgid "ISR %s requires %d words of local vars, max is 32767" +#~ msgstr "ISR %s requiert %d mots de var. locales, max est 32767." + +#~ msgid "using CONST_DOUBLE for address" +#~ msgstr "CONST_DOUBLE utilisé pour l'adresse" + +#~ msgid "c4x_address_cost: Invalid addressing mode" +#~ msgstr "c4x_address_cost: mode d'adressage invalide" + +#~ msgid "c4x_print_operand: %%L inconsistency" +#~ msgstr "c4x_print_operand: %%L inconsistent" + +#~ msgid "c4x_print_operand: %%N inconsistency" +#~ msgstr "c4x_print_operand: %%N inconsistent" + +#~ msgid "c4x_print_operand: %%O inconsistency" +#~ msgstr "c4x_print_operand: %%O inconsisten" + +#~ msgid "c4x_print_operand: Bad operand case" +#~ msgstr "c4x_print_operand: opérande erronée pour un case" + +#~ msgid "c4x_print_operand_address: Bad post_modify" +#~ msgstr "c4x_print_operand_address: post-modification erronée" + +#~ msgid "c4x_print_operand_address: Bad pre_modify" +#~ msgstr "c4x_print_operand_address: pré-modification erronée" + +#~ msgid "c4x_print_operand_address: Bad operand case" +#~ msgstr "c4x_print_operand_address: opérande erronée pour un case" + +#~ msgid "c4x_rptb_insert: Cannot find start label" +#~ msgstr "c4x_rptb_insert: ne peut repérer l'étiquette de départ" + +#~ msgid "mode not QImode" +#~ msgstr "mode n'est pas QImode" + +#~ msgid "invalid indirect memory address" +#~ msgstr "adresse mémoire d'indirection invalide" + +#~ msgid "invalid indirect (S) memory address" +#~ msgstr "adresse mémoire (S) d'indirection invalide" + +#~ msgid "c4x_valid_operands: Internal error" +#~ msgstr "c4x_valid_operands: erreur interne" + +#~ msgid "c4x_operand_subword: invalid mode" +#~ msgstr "c4x_oprande_subword: mode invalide" + +#~ msgid "c4x_operand_subword: invalid operand" +#~ msgstr "c4x_operand_subword: opérande invalide" + +#~ msgid "c4x_operand_subword: invalid autoincrement" +#~ msgstr "c4x_operand_subword: autoincrement invalide" + +#~ msgid "c4x_operand_subword: invalid address" +#~ msgstr "c4x_operand_subword: adresse invalide" + +#~ msgid "c4x_operand_subword: address not offsettable" +#~ msgstr "c4x_operand_subword: un décalage d'adresse ne peut s'appliquer sur cette adresse" + +#~ msgid "c4x_rptb_rpts_p: Repeat block top label moved\n" +#~ msgstr "c4x_rptb_rpts_p: étiquette supérieur de bloc de répétition déplacée\n" + +#~ msgid "Small memory model" +#~ msgstr "Modèle de mémoire petite" + +#~ msgid "Big memory model" +#~ msgstr "Modèle de mémoire grande" + +#~ msgid "Use MPYI instruction for C3x" +#~ msgstr "Utiliser les instructions MPYI pour C3x" + +#~ msgid "Do not use MPYI instruction for C3x" +#~ msgstr "Ne pas utiliser les instructions MPYI pour C3x" + +#~ msgid "Use fast but approximate float to integer conversion" +#~ msgstr "Utiliser le mode rapide mais approximatif de conversion de flottant à entier" + +#~ msgid "Use slow but accurate float to integer conversion" +#~ msgstr "Utiliser le mode lent mais précis de conversion de flottant à entier" + +#~ msgid "Enable use of RTPS instruction" +#~ msgstr "Autoriser l'utilisation de l'instruction RTPS" + +#~ msgid "Disable use of RTPS instruction" +#~ msgstr "Interdire l'utilisation de l'instruction RTPS" + +#~ msgid "Enable use of RTPB instruction" +#~ msgstr "Autoriser l'utilisation de l'instruction RTPB" + +#~ msgid "Disable use of RTPB instruction" +#~ msgstr "Interdire l'utilisation de l'instruction RTPB" + +#~ msgid "Generate code for C30 CPU" +#~ msgstr "Générer du code pour processeur C30" + +#~ msgid "Generate code for C31 CPU" +#~ msgstr "Générer du code pour processeur C31" + +#~ msgid "Generate code for C32 CPU" +#~ msgstr "Générer du code pour processeur C32" + +#~ msgid "Generate code for C33 CPU" +#~ msgstr "Générer du code pour processeur C33" + +#~ msgid "Generate code for C40 CPU" +#~ msgstr "Générer du code pour processeur C40" + +#~ msgid "Generate code for C44 CPU" +#~ msgstr "Générer du code pour processeur C44" + +#~ msgid "Emit code compatible with TI tools" +#~ msgstr "Produire du code compatible avec les outils TI" + +#~ msgid "Emit code to use GAS extensions" +#~ msgstr "Produire du code pour utiliser les extensions GAS" + +#~ msgid "Save DP across ISR in small memory model" +#~ msgstr "Sauvegarder DP à travers ISR dans le modèle de mémoire restreinte" + +#~ msgid "Don't save DP across ISR in small memory model" +#~ msgstr "Ne pas sauvegarder DP à travers ISR dans le modèle de mémoire restreinte" + +#~ msgid "Pass arguments on the stack" +#~ msgstr "Passer les arguments sur la pile" + +#~ msgid "Pass arguments in registers" +#~ msgstr "Passer les arguments par les registres" + +#~ msgid "Enable new features under development" +#~ msgstr "Autoriser les nouvelles options en développement" + +#~ msgid "Disable new features under development" +#~ msgstr "Désactiver les nouvelles options en développement" + +#~ msgid "Use the BK register as a general purpose register" +#~ msgstr "Utiliser le registre BK comme registre général tout usage" + +#~ msgid "Do not allocate BK register" +#~ msgstr "Ne pas allouer de registre BK" + +#~ msgid "Enable use of DB instruction" +#~ msgstr "Activer l'utilisation d'instruction DB" + +#~ msgid "Disable use of DB instruction" +#~ msgstr "Désactiver l'utilisation d'instruction DB" + +#~ msgid "Enable debugging" +#~ msgstr "Permettre la mise au point" + +#~ msgid "Disable debugging" +#~ msgstr "Désactiver la mise au point" + +#~ msgid "Force constants into registers to improve hoisting" +#~ msgstr "Forcer les constantes dans les registres pour améliorer la montée" + +#~ msgid "Don't force constants into registers" +#~ msgstr "Ne pas forcer les constantes dans les registres" + +#~ msgid "Force RTL generation to emit valid 3 operand insns" +#~ msgstr "Forcer la génération RTL pour produire des opérandes insn 3 valides" + +#~ msgid "Allow RTL generation to emit invalid 3 operand insns" +#~ msgstr "Autoriser la génération RTL pour produire des opérandes insn 3 invalides" + +#~ msgid "Allow unsigned iteration counts for RPTB/DB" +#~ msgstr "Autoriser un compteur non signé d'itérations pour RPTB/DB" + +#~ msgid "Disallow unsigned iteration counts for RPTB/DB" +#~ msgstr "Interdire un compteur non signé d'itération pour RPTB/DB" + +#~ msgid "Preserve all 40 bits of FP reg across call" +#~ msgstr "Préserver tous les 40 bits du registre FP à travers les appels" + +#~ msgid "Only preserve 32 bits of FP reg across call" +#~ msgstr "Préserver seulement 32 bits du registre FP à travers les appels" + +#~ msgid "Enable parallel instructions" +#~ msgstr "Autoriser les instructions parallèles" + +#~ msgid "Disable parallel instructions" +#~ msgstr "Interdire les instructions parallèles" + +#~ msgid "Enable MPY||ADD and MPY||SUB instructions" +#~ msgstr "Autoriser les instructions MPY||ADD et MPY||SUB" + +#~ msgid "Disable MPY||ADD and MPY||SUB instructions" +#~ msgstr "Interdire les instructions MPY||ADD et MPY||SUB" + +#~ msgid "Assume that pointers may be aliased" +#~ msgstr "Présumer que les pointeurs peuvent être aliasés" + +#~ msgid "Assume that pointers not aliased" +#~ msgstr "Présumer que les pointeurs ne peuvent pas être aliasés" + +#~ msgid "Specify maximum number of iterations for RPTS" +#~ msgstr "Spécifier le nombre maximum d'itérations pour RPTS" + +#~ msgid "Select CPU to generate code for" +#~ msgstr "Sélectionner le processeur pour lequel le code doit être généré" + +#~ msgid "unexpected index-type in cris_print_index" +#~ msgstr "type d'index inattendu dans cris_print_index" + +#~ msgid "unexpected base-type in cris_print_base" +#~ msgstr "type de base inattendu dans cris_print_base" + +#~ msgid "stackframe too big: %d bytes" +#~ msgstr "trame de pile trop grande: %d octets" + +#~ msgid "allocated but unused delay list in epilogue" +#~ msgstr "alloué mais liste de délai non utilisée dans l'épilogue" + +#~ msgid "unexpected function type needing stack adjustment for __builtin_eh_return" +#~ msgstr "type de fonction inattendue ajustement de la pile nécessaire pour « __builtin_eh_return »" + +#~ msgid "invalid operand for 'b' modifier" +#~ msgstr "opérande invalide pour le modificateur « b »" + +#~ msgid "invalid operand for 'v' modifier" +#~ msgstr "opérande invalide pour le modificateur « v »" + +#~ msgid "invalid operand for 'P' modifier" +#~ msgstr "opérande invalide pour le modificateur « P »" + +#~ msgid "invalid operand for 'p' modifier" +#~ msgstr "opérande invalide pour le modificateur « p »" + +#~ msgid "invalid operand for 'z' modifier" +#~ msgstr "opérande invalide pour le modificateur « z »" + +#~ msgid "invalid operand for 'H' modifier" +#~ msgstr "opérande invalide pour le modificateur « H »" + +#~ msgid "bad register" +#~ msgstr "registre erroné" + +#~ msgid "invalid operand for 'e' modifier" +#~ msgstr "opérande invalide pour le modificateur « e »" + +#~ msgid "invalid operand for 'm' modifier" +#~ msgstr "opérande invalide pour le modificateur « m »" + +#~ msgid "invalid operand for 'A' modifier" +#~ msgstr "opérande invalide pour le modificateur « A »" + +#~ msgid "invalid operand for 'D' modifier" +#~ msgstr "opérande invalide pour le modificateur « D »" + +#~ msgid "invalid operand for 'T' modifier" +#~ msgstr "opérande invalide pour le modificateur « T »" + +#~ msgid "invalid operand modifier letter" +#~ msgstr "opérande invalide pour le modificateur de lettre" + +#~ msgid "internal error: bad register: %d" +#~ msgstr "erreur interne: registre erroné: %d" + +#~ msgid "unexpected multiplicative operand" +#~ msgstr "opérande multiplicative inattendue" + +#~ msgid "unexpected operand" +#~ msgstr "opérande inattendue" + +#~ msgid "unrecognized address" +#~ msgstr "adresse non reconnue" + +#~ msgid "internal error: sideeffect-insn affecting main effect" +#~ msgstr "erreur interne: effet de bord de insn sideeffect-insn ayant un effet principal" + +#~ msgid "internal error: cris_side_effect_mode_ok with bad operands" +#~ msgstr "erreur interne: cris_side_effect_mode_ok avec des opérandes erronées" + +#~ msgid "unrecognized supposed constant" +#~ msgstr "supposée constante non reconnue" + +#~ msgid "unrecognized supposed constant in cris_global_pic_symbol" +#~ msgstr "supposée constante non reconnue dans cris_global_pic_symbol" + +#~ msgid "-max-stackframe=%d is not usable, not between 0 and %d" +#~ msgstr "-max-stackframe=%d n'est pas utilisable, n'est pas entre 0 et %d" + +#~ msgid "unknown CRIS version specification in -march= or -mcpu= : %s" +#~ msgstr "spécification de version CRIS inconnue dans -march= ou -mcpu= : %s" + +#~ msgid "unknown CRIS cpu version specification in -mtune= : %s" +#~ msgstr "spécification de version CRIS inconnue dans -mtune= : %s" + +#~ msgid "-fPIC and -fpic are not supported in this configuration" +#~ msgstr "-fPIC et -fpic ne sont pas supportées par cette configuration" + +#~ msgid "that particular -g option is invalid with -maout and -melinux" +#~ msgstr "l'option particulière -g est invalide avec -maout et -melinux" + +#~ msgid "unexpected side-effects in address" +#~ msgstr "effets de bord inattendue dans l'adresse" + +#~ msgid "unexpected PIC symbol" +#~ msgstr "symbole PIC inattendue" + +#~ msgid "PIC register isn't set up" +#~ msgstr "le registre n'est pas initialisé" + +#~ msgid "unexpected address expression" +#~ msgstr "expression d'adresse inattendue" + +#~ msgid "emitting PIC operand, but PIC register isn't set up" +#~ msgstr "génération d'une opérande PIC mais le registre PIC n'est pas initialisé" + +#~ msgid "unexpected NOTE as addr_const:" +#~ msgstr "NOTE inattendu comme addr_conts:" + +#~ msgid "Compile for the MMU-less Etrax 100-based elinux system" +#~ msgstr "Compiler pour le MMU-less Etrax 100-based de système elinux" + +#~ msgid "For elinux, request a specified stack-size for this program" +#~ msgstr "Pour elinux, faire la requête pour un taille de pile spécifique pour ce programme" + +#~ msgid "Work around bug in multiplication instruction" +#~ msgstr "Travailler autour de l'anomalie dans l'instructions de multiplication" + +#~ msgid "Compile for ETRAX 4 (CRIS v3)" +#~ msgstr "Compilé pour ETRAX 4 (CRIS v3)" + +#~ msgid "Compile for ETRAX 100 (CRIS v8)" +#~ msgstr "Compile pour ETRAX 100 (CRIS v8)" + +#~ msgid "Emit verbose debug information in assembly code" +#~ msgstr "Produire des informations de mise au point dans le code assemblé" + +#~ msgid "Do not use condition codes from normal instructions" +#~ msgstr "Ne pas utiliser du code conditionnel pour des instructions normales" + +#~ msgid "Do not emit addressing modes with side-effect assignment" +#~ msgstr "Ne pas produire de modes d'adressage avec des affectations avec effet de bord" + +#~ msgid "Do not tune stack alignment" +#~ msgstr "Ne pas ajuster l'alignement de la pile" + +#~ msgid "Do not tune writable data alignment" +#~ msgstr "Ne pas ajuster l'alignement les sections de données dynamiques" + +#~ msgid "Do not tune code and read-only data alignment" +#~ msgstr "Ne pas ajuster l'alignement du code et des sections de données statiques" + +#~ msgid "Align code and data to 32 bits" +#~ msgstr "Aligner le code et les données sur 32 bits" + +#~ msgid "Don't align items in code or data" +#~ msgstr "Ne pas aligner les items dans le code ou les données" + +#~ msgid "Do not emit function prologue or epilogue" +#~ msgstr "Ne pas générer de prologue ou d'épilogue de fonction" + +#~ msgid "Use the most feature-enabling options allowed by other options" +#~ msgstr "Utiliser le plus d'options autorisant autorisant des options permises par les autres options" + +#~ msgid "Override -mbest-lib-options" +#~ msgstr "Écraser -mbest-lib-options" + +#~ msgid "Generate code for the specified chip or CPU version" +#~ msgstr "Générer le code pour la version de processeur ou de circuit spécifiée" + +#~ msgid "Tune alignment for the specified chip or CPU version" +#~ msgstr "Ajuster l'alignement pour la version de processeur ou de circuit spécifiée" + +#~ msgid "Warn when a stackframe is larger than the specified size" +#~ msgstr "Avertir lorsqu'une trame de pile est plus grande que la taille spécifiée" + +#~ msgid "no FUNCTION_PROFILER for CRIS" +#~ msgstr "pas de FUNCTION_PROFILER pour CRIS" + +#~ msgid "Together with -fpic and -fPIC, do not use GOTPLT references" +#~ msgstr "ensemble avec -fpic et -fPIC, ne pas utiliser les références GOTPLT" + +#~ msgid "bad modes_tieable_p for register %s, mode1 %s, mode2 %s" +#~ msgstr "modes_tieable_p erronée pour le registre %s, mode1 %s, mode2 %s" + +#~ msgid "bad insn to d30v_print_operand_address:" +#~ msgstr "insn erroné pour d30v_print_operand_addresse:" + +#~ msgid "bad insn to d30v_print_operand_memory_reference:" +#~ msgstr "insn erroné pour d30v_print_operand_memory_reference:" + +#~ msgid "bad insn to d30v_print_operand, 'f' modifier:" +#~ msgstr "insn erroné pour d30v_print_operand, modificateur « f »:" + +#~ msgid "bad insn to d30v_print_operand, 'A' modifier:" +#~ msgstr "insn erroné pour d30v_print_operand, modificateur « A »:" + +#~ msgid "bad insn to d30v_print_operand, 'M' modifier:" +#~ msgstr "insn erroné pour d30v_print_operand, modificateur « M »:" + +#~ msgid "bad insn to print_operand, 'F' or 'T' modifier:" +#~ msgstr "insn erroné pour print_operand, modificateur « F » ou « T »:" + +#~ msgid "bad insn to print_operand, 'B' modifier:" +#~ msgstr "insn erroné pour print_operand, modificateur « B »:" + +#~ msgid "bad insn to print_operand, 'E' modifier:" +#~ msgstr "insn erroné pour print_operand, modificateur « E »:" + +#~ msgid "bad insn to print_operand, 'R' modifier:" +#~ msgstr "insn erroné to print_operand, modificateur « R »:" + +#~ msgid "bad insn to print_operand, 's' modifier:" +#~ msgstr "insn erroné to print_operand, modificateur « s »:" + +#~ msgid "bad insn in d30v_print_operand, 0 case" +#~ msgstr "insn erroné dans d30v_print_operand, cas 0" + +#~ msgid "d30v_emit_comparison" +#~ msgstr "d30v_emit_comparison" + +#~ msgid "bad call to d30v_move_2words" +#~ msgstr "appel erroné à d30v_move_2words" + +#~ msgid "Enable use of conditional move instructions" +#~ msgstr "Autoriser l'utilisation des instructions conditionnelles move" + +#~ msgid "Disable use of conditional move instructions" +#~ msgstr "Interdire l'utilisation des instructions conditionnelles move" + +#~ msgid "Debug argument support in compiler" +#~ msgstr "Mettre au point le support d'argument dans le compilateur" + +#~ msgid "Debug stack support in compiler" +#~ msgstr "Mettre au point le support de la pile dans le compilateur" + +#~ msgid "Debug memory address support in compiler" +#~ msgstr "Mettre au point le support d'adresses dans le compilateur" + +#~ msgid "Make adjacent short instructions parallel if possible" +#~ msgstr "Rendre adjacentes les instructions short en instructions parallèles si possible" + +#~ msgid "Do not make adjacent short instructions parallel" +#~ msgstr "Ne pas rendre adjacentes les instructions short en instructions parallèles" + +#~ msgid "Link programs/data to be in external memory by default" +#~ msgstr "Faire l'édition de lien des programmes/données comme étant externe à la mémoire par défaut" + +#~ msgid "Link programs/data to be in onchip memory by default" +#~ msgstr "Faire l'édition de lien des programmes/données comme étant interne dans la circuiterie de la mémoire par défaut" + +#~ msgid "Change the branch costs within the compiler" +#~ msgstr "Changer les coûts de branchement à l'intérieur du compilateur" + +#~ msgid "Change the threshold for conversion to conditional execution" +#~ msgstr "Changer le seuil pour la conversion en une exécution conditionnelle" + +#~ msgid "stack size > 32k" +#~ msgstr "taille de la pile > 32k" + +#~ msgid "invalid addressing mode" +#~ msgstr "mode d'adressage invalide" + +#~ msgid "bad register extension code" +#~ msgstr "code d'extension de registre erroné" + +#~ msgid "invalid offset in ybase addressing" +#~ msgstr "décalage invalide dans l'adresse ybase" + +#~ msgid "invalid register in ybase addressing" +#~ msgstr "registre invalide dans l'adressage ybase" + +#~ msgid "invalid shift operator in emit_1600_core_shift" +#~ msgstr "opérateur de décalage invalide dans emit_1600_core_shift" + +#~ msgid "invalid mode for gen_tst_reg" +#~ msgstr "mode invalide pour gen_tst_reg" + +#~ msgid "invalid mode for integer comparison in gen_compare_reg" +#~ msgstr "mode invalide pour la comparaison d'entiers dans gen_compare_reg" + +#~ msgid "Pass parameters in registers (default)" +#~ msgstr "Passer les paramètres par les registres (par défaut)" + +#~ msgid "Don't pass parameters in registers" +#~ msgstr "Ne pas passer les paramètres par les registres" + +#~ msgid "Generate code for near calls" +#~ msgstr "Générer du code pour les appels proches" + +#~ msgid "Don't generate code for near calls" +#~ msgstr "Ne pas générer du code pour les appels proches" + +#~ msgid "Generate code for near jumps" +#~ msgstr "Générer du code pour les sauts proches" + +#~ msgid "Don't generate code for near jumps" +#~ msgstr "Ne pas générer du code pour les sauts proches" + +#~ msgid "Generate code for a bit-manipulation unit" +#~ msgstr "Générer du code pour une unité de manipulation de bits" + +#~ msgid "Don't generate code for a bit-manipulation unit" +#~ msgstr "Ne pas générer du code pour une unité de manipulation de bits" + +#~ msgid "Generate code for memory map1" +#~ msgstr "Générer du code pour la mémoire map1" + +#~ msgid "Generate code for memory map2" +#~ msgstr "Générer du code pour la mémoire map2" + +#~ msgid "Generate code for memory map3" +#~ msgstr "Générer du code pour la mémoire map3" + +#~ msgid "Generate code for memory map4" +#~ msgstr "Générer du code pour la mémoire map4" + +#~ msgid "Ouput extra code for initialized data" +#~ msgstr "Produire du code additionnel pour les données initialisées" + +#~ msgid "Don't let reg. allocator use ybase registers" +#~ msgstr "Ne pas laisser l'allocateur de registres utiliser les registres ybase" + +#~ msgid "Output extra debug info in Luxworks environment" +#~ msgstr "Produire des informations supplémentaires de mise au point dans l'environnement Luxworks" + +#~ msgid "Save temp. files in Luxworks environment" +#~ msgstr "Sauvegarder les fichiers temporaires dans l'environnement Luxworks" + +#~ msgid "Specify alternate name for text section" +#~ msgstr "Spécifier un nom alternatif pour la section texte" + +#~ msgid "Specify alternate name for data section" +#~ msgstr "Spécifier un nom alternatif pour la section données" + +#~ msgid "Specify alternate name for bss section" +#~ msgstr "Spécifier un nom alternatif pour la section bss" + +#~ msgid "Specify alternate name for constant section" +#~ msgstr "Spécifier un nom alternatif pour la section des constantes" + +#~ msgid "Specify alternate name for dsp16xx chip" +#~ msgstr "Spécifier un nom alternatif pour le cirsuit dsp16xx" + +#~ msgid "profiling not implemented yet" +#~ msgstr "profilage n'est pas implanté encore" + +#~ msgid "trampolines not yet implemented" +#~ msgstr "trampolines ne sont pas encore implantées" + +#~ msgid "fr30_print_operand_address: unhandled address" +#~ msgstr "fr30_print_operand_address: adresse non traitée" + +#~ msgid "fr30_print_operand: unrecognized %%p code" +#~ msgstr "fr30_print_operand: code %%p non reconnue" + +#~ msgid "fr30_print_operand: unrecognized %%b code" +#~ msgstr "fr30_print_operand: code %%b non reconnue" + +#~ msgid "fr30_print_operand: unrecognized %%B code" +#~ msgstr "fr30_print_operand: code %%B non reconnu" + +#~ msgid "fr30_print_operand: invalid operand to %%A code" +#~ msgstr "fr30_print_operand: opérande invalide pour code %%A" + +#~ msgid "fr30_print_operand: invalid %%x code" +#~ msgstr "fr30_print_operand: code %%x invalide" + +#~ msgid "fr30_print_operand: invalid %%F code" +#~ msgstr "fr30_print_operand: code %%F invalide" + +#~ msgid "fr30_print_operand: unknown code" +#~ msgstr "fr30_print_operand: code inconnu" + +#~ msgid "fr30_print_operand: unhandled MEM" +#~ msgstr "fr30_print_operand: MEM non traité" + +#~ msgid "Assume small address space" +#~ msgstr "Présumer un petit espace d'adressage" + +#~ msgid "Unknown cpu: -mcpu=%s" +#~ msgstr "Processeur inconnu : -mcpu=%s" + +#~ msgid "-fpic and -gdwarf are incompatible (-fpic and -g/-gdwarf-2 are fine)" +#~ msgstr "-fpic et -gdwarf sont incompatibles (-fpic et -g/-gdwarf-2 sont acceptables)" + +#~ msgid "Bad insn to frv_print_operand_address:" +#~ msgstr "insn erroné pour frv_print_operand_addresse:" + +#~ msgid "Bad register to frv_print_operand_memory_reference_reg:" +#~ msgstr "registre erroné pour frv_print_operand_memory_reference_reg:" + +#~ msgid "Bad insn to frv_print_operand_memory_reference:" +#~ msgstr "insn erroné pour frv_print_operand_memory_reference:" + +#~ msgid "Bad insn in frv_print_operand, bad const_double" +#~ msgstr "insn erroné dans frv_print_operand, bad const_double" + +#~ msgid "Bad insn to frv_print_operand, 'C' modifier:" +#~ msgstr "insn erroné pour frv_print_operand, modificateur « C »:" + +#~ msgid "Bad insn to frv_print_operand, 'c' modifier:" +#~ msgstr "insn erroné pour frv_print_operand, modificateur « c »:" + +#~ msgid "Bad insn to frv_print_operand, 'e' modifier:" +#~ msgstr "insn erroné pour frv_print_operand, modificateur « e »:" + +#~ msgid "Bad insn to frv_print_operand, 'F' modifier:" +#~ msgstr "insn erroné pour frv_print_operand, modificateur « F »:" + +#~ msgid "Bad insn to frv_print_operand, 'f' modifier:" +#~ msgstr "insn erroné pour frv_print_operand, modificateur « f »:" + +#~ msgid "Bad insn to frv_print_operand, 'L' modifier:" +#~ msgstr "insn erroné pour frv_print_operand, modificateur « L »:" + +#~ msgid "Bad insn to frv_print_operand, 'M/N' modifier:" +#~ msgstr "insn erroné pour frv_print_operand, modificateur « M/N »:" + +#~ msgid "Bad insn to frv_print_operand, 'O' modifier:" +#~ msgstr "insn erroné pour frv_print_operand, modificateur « O »:" + +#~ msgid "Bad insn to frv_print_operand, P modifier:" +#~ msgstr "insn erroné pour frv_print_operand, modificateur « P »:" + +#~ msgid "Bad insn in frv_print_operand, z case" +#~ msgstr "insn erroné dans frv_print_operand, case z" + +#~ msgid "Bad insn in frv_print_operand, 0 case" +#~ msgstr "insn erroné dans frv_print_operand, case 0" + +#~ msgid "frv_print_operand: unknown code" +#~ msgstr "frv_print_operand: code inconnu" + +#~ msgid "Bad output_move_single operand" +#~ msgstr "opérande output_move_single erronée" + +#~ msgid "Bad output_move_double operand" +#~ msgstr "opérande output_move_double erronée" + +#~ msgid "Bad output_condmove_single operand" +#~ msgstr "opérande output_condmove_single erronée" + +#~ msgid "frv_registers_update" +#~ msgstr "frv_registers_update" + +#~ msgid "frv_registers_used_p" +#~ msgstr "frv_registers_used_p" + +#~ msgid "frv_registers_set_p" +#~ msgstr "frv_registers_set_p" + +#~ msgid "accumulator is not a constant integer" +#~ msgstr "accumulateur n'est pas une constante en entier" + +#~ msgid "accumulator number is out of bounds" +#~ msgstr "numéro de l'accumulateur est hors limite" + +#~ msgid "inappropriate accumulator for `%s'" +#~ msgstr "accumulateur inapproprié pour « %s »" + +#~ msgid "`%s' expects a constant argument" +#~ msgstr "« %s » attend un argument de constante" + +#~ msgid "constant argument out of range for `%s'" +#~ msgstr "argument de constante hors limite pour « %s »" + +#~ msgid "media functions are not available unless -mmedia is used" +#~ msgstr "fonctions média ne sont pas disponibles à mois que -mmedia soit utilisé" + +#~ msgid "this media function is only available on the fr500" +#~ msgstr "cette fonction média est seulement disponible sur le fr500" + +#~ msgid "this media function is only available on the fr400" +#~ msgstr "cette fonction média est seulement disponible sur le fr400" + +#~ msgid " (frv)" +#~ msgstr " (frv)" + +#~ msgid "-ms2600 is used without -ms" +#~ msgstr "-ms2600 est utilisé sans -ms" + +#~ msgid "-mn is used without -mh or -ms" +#~ msgstr "-mm est utilisé sans -mh ou -ms" + +#~ msgid "Generate H8S code" +#~ msgstr "Générer du code H8S" + +#~ msgid "Do not generate H8S code" +#~ msgstr "Ne pas générer du code H8S" + +#~ msgid "Generate H8S/2600 code" +#~ msgstr "Générer du code H8S/S2600" + +#~ msgid "Do not generate H8S/2600 code" +#~ msgstr "Ne pas générer du code H8S/2600" + +#~ msgid "Make integers 32 bits wide" +#~ msgstr "Rendre les entiers larges de 32 bits" + +#~ msgid "Use registers for argument passing" +#~ msgstr "Utiliser les registres pour le passage d'arguments" + +#~ msgid "Do not use registers for argument passing" +#~ msgstr "Ne pas utiliser les registres pour le passage d'arguments" + +#~ msgid "Consider access to byte sized memory slow" +#~ msgstr "Considérer l'accès mémoire lent pour la taille d'octets" + +#~ msgid "Enable linker relaxing" +#~ msgstr "Activer la rélâche par l'éditeur de liens" + +#~ msgid "Generate H8/300H code" +#~ msgstr "Générer du code H8/300H" + +#~ msgid "Enable the normal mode" +#~ msgstr "Activer le mode normal" + +#~ msgid "Do not generate H8/300H code" +#~ msgstr "Ne pas générer du code H8/300H" + +#~ msgid "Use H8/300 alignment rules" +#~ msgstr "Utiliser les règles d'alignement H8/300" + +#~ msgid "junk at end of #pragma map" +#~ msgstr "rebut à la fin de #pragma map" + +#~ msgid "malformed #pragma map, ignored" +#~ msgstr "#pragma map mal composé, ignoré" + +#~ msgid "real name is too long - alias ignored" +#~ msgstr "nom réel est trop long - alias ignoré" + +#~ msgid "alias name is too long - alias ignored" +#~ msgstr "nom d'alias est trop long - alias ignoré" + +#~ msgid "internal error--no jump follows compare:" +#~ msgstr "erreur interne--pas de saut suivant la comparaison:" + +#~ msgid "Generate char instructions" +#~ msgstr "Générer des instructions « char »" + +#~ msgid "Do not generate char instructions" +#~ msgstr "Ne pas générer des instructions « char »" + +#~ msgid "code model %s not supported in PIC mode" +#~ msgstr "model de code %s n'est pas supporté en mode PIC" + +#~ msgid "bad value (%s) for -mcmodel= switch" +#~ msgstr "valeur erronée (%s) pour l'opton -mcmodel=" + +#~ msgid "bad value (%s) for -masm= switch" +#~ msgstr "valeur erronée (%s) pour l'option -masm" + +#~ msgid "code model `%s' not supported in the %s bit mode" +#~ msgstr "model de code « %s » n'est pas supporté dans le mode %s bits" + +#~ msgid "code model `large' not supported yet" +#~ msgstr "model de code « large » n'est pas supporté encore" + +#~ msgid "%i-bit mode not compiled in" +#~ msgstr "mode %i bits pas compilé en" + +#~ msgid "CPU you selected does not support x86-64 instruction set" +#~ msgstr "le processeur sélectionné ne supporte pas le jeu d'instructions x86-64" + +#~ msgid "bad value (%s) for -march= switch" +#~ msgstr "valeur erronée (%s) pour l'option -march=" + +#~ msgid "bad value (%s) for -mtune= switch" +#~ msgstr "valeur erronée (%s) pour l'option -mtune=" + +#~ msgid "-mregparm=%d is not between 0 and %d" +#~ msgstr "-mregparm=%d n'est pas entre 0 et %d" + +#~ msgid "-malign-loops is obsolete, use -falign-loops" +#~ msgstr "-malign-loops est obsolète, utiliser -falign-loops" + +#~ msgid "-malign-loops=%d is not between 0 and %d" +#~ msgstr "-malign-loops=%d n'est pas entre 0 et %d" + +#~ msgid "-malign-jumps is obsolete, use -falign-jumps" +#~ msgstr "-malign-jumps est obsolète, utiliser -falign-loops" + +#~ msgid "-malign-functions is obsolete, use -falign-functions" +#~ msgstr "-malign-functions est obsolète, utiliser -falign-loops" + +#~ msgid "-mpreferred-stack-boundary=%d is not between %d and 12" +#~ msgstr "-mpreferred-stack-boundary=%d n'est pas entre %d et 12" + +#~ msgid "-mbranch-cost=%d is not between 0 and 5" +#~ msgstr "-mbranch-cost=%d n'est pas entre 0 et 5" + +#~ msgid "bad value (%s) for -mtls-dialect= switch" +#~ msgstr "valeur erronée (%s) pour l'option -mtls-dialect" + +#~ msgid "-malign-double makes no sense in the 64bit mode" +#~ msgstr "-malign-double n'a aucun sens en mode 64 bits" + +#~ msgid "-mrtd calling convention not supported in the 64bit mode" +#~ msgstr "la conversion d'appel -mrtd n'est pas supporté en mode 64 bits" + +#~ msgid "SSE instruction set disabled, using 387 arithmetics" +#~ msgstr "jeu d'instructions SSE désactivé, arithmétique 387 est utilisé" + +#~ msgid "387 instruction set disabled, using SSE arithmetics" +#~ msgstr "jeu d'instructions 387 désactivé, arithmétique SSE est utilisé" + +#~ msgid "bad value (%s) for -mfpmath= switch" +#~ msgstr "valeur erronée (%s) pour l'option -mfpmath" + +#~ msgid "fastcall and stdcall attributes are not compatible" +#~ msgstr "les attributs fastcall et stdcall ne sont pas compatibles" + +#~ msgid "fastcall and regparm attributes are not compatible" +#~ msgstr "les attributs fastcall et regparm ne sont pas compatibles" + +#~ msgid "`%s' attribute requires an integer constant argument" +#~ msgstr "l'attribut « %s » requiert un argument de type constante entière" + +#~ msgid "argument to `%s' attribute larger than %d" +#~ msgstr "l'argument pour l'attribut « %s » est plus grand que %d" + +#~ msgid "SSE vector argument without SSE enabled changes the ABI" +#~ msgstr "l'argument vecteur SSE sans autorisation SSE modifie l'ABI " + +#~ msgid "MMX vector argument without MMX enabled changes the ABI" +#~ msgstr "l'argument vecteur SSE sans autorisation MXX modifie l'ABI " + +#~ msgid "SSE vector return without SSE enabled changes the ABI" +#~ msgstr "vecteur SSE retourné sans autorisation SSE des changements de l'ABI " + +#~ msgid "invalid UNSPEC as operand" +#~ msgstr "UNSPEC invalide comme opérande" + +#~ msgid "extended registers have no high halves" +#~ msgstr "registres étendus n'a pas de demis hauts" + +#~ msgid "unsupported operand size for extended register" +#~ msgstr "taille d'opérande non supportée pour un registre étendu" + +#~ msgid "operand is neither a constant nor a condition code, invalid operand code 'c'" +#~ msgstr "l'opérande n'est ni une constante ni du code de condition, code d'opérande invalide « c »" + +#~ msgid "invalid operand code `%c'" +#~ msgstr "opérande invalide pour « %c »" + +#~ msgid "invalid constraints for operand" +#~ msgstr "contrainte invalide pour l'opérande" + +#~ msgid "unknown insn mode" +#~ msgstr "mode insn inconnu" + +#~ msgid "selector must be an integer constant in the range 0..%i" +#~ msgstr "le sélecteur doit être une constante entière entre les bornes 0..%i" + +#~ msgid "shift must be an immediate" +#~ msgstr "décalage doit être un immédiat" + +#~ msgid "`%s' incompatible attribute ignored" +#~ msgstr "attribut « %s » incompatible ignoré" + +#~ msgid "%Jfunction `%D' definition is marked dllimport." +#~ msgstr "%Jdéfinition de la fonction « %D » est marquée dllimport" + +#~ msgid "%Jvariable `%D' definition is marked dllimport." +#~ msgstr "%Jdéfinition de la variable « %D » est marquée dllimport" + +#~ msgid "%Jexternal linkage required for symbol '%D' because of '%s' attribute." +#~ msgstr "%Jédition de lien externe requise pour le symbole « %D » en raison de l'attribut « %s »" + +#~ msgid "`%s' attribute only applies to variables" +#~ msgstr "attribut « %s » s'applique seulement aux variables" + +#~ msgid "%Jfunction '%D' is defined after prior declaration as dllimport: attribute ignored" +#~ msgstr "%Jfonction « %D » est définie après un déclaration antérieure en tant que dllimport: attribut ignoré" + +#~ msgid "%Jinline function '%D' is declared as dllimport: attribute ignored." +#~ msgstr "%Jfonction enligne « %D » est déclarée en tant que dllimport: attribut ignoré." + +#~ msgid "%Jdefinition of static data member '%D' of dllimport'd class." +#~ msgstr "%Jdéfinition d'un membre statique de données « %D » de la classe dllimport" + +#~ msgid "%Jinconsistent dll linkage for '%D', dllexport assumed." +#~ msgstr "%Jédition de lien dll inconsistent pour « %D »: dllexport assumé." + +#~ msgid "`%s' declared as both exported to and imported from a DLL" +#~ msgstr "« %s » déclaré à la fois comme exporté et importé d'une DLL" + +#~ msgid "%Jfailure in redeclaration of '%D': dllimport'd symbol lacks external linkage." +#~ msgstr "%Jéchec dans la redéclation de « %D »: symbol dllimporté manque de liens externes." + +#~ msgid "%J'%D' defined locally after being referenced with dllimport linkage" +#~ msgstr "%J« %D » défini localement après avoir été référencé avec lien dllimport." + +#~ msgid "%J'%D' redeclared without dllimport attribute after being referenced with dllimport linkage" +#~ msgstr "%J« %D » redéclaré sans attribut dllimport après avoir été référencé avec lien dllimport." + +#~ msgid "%J'%D' causes a section type conflict" +#~ msgstr "%J« %D » cause un conflit du type de section" + +#~ msgid "Use the Cygwin interface" +#~ msgstr "Utiliser l'interface Cygwin" + +#~ msgid "Use the Mingw32 interface" +#~ msgstr "Utiliser l'interface Mingw32" + +#~ msgid "Create GUI application" +#~ msgstr "Créer une application de type GUI" + +#~ msgid "Don't set Windows defines" +#~ msgstr "Ne pas initialiser les définitions Windows" + +#~ msgid "Set Windows defines" +#~ msgstr "Initialiser les définitions Windows" + +#~ msgid "Create console application" +#~ msgstr "Créer une application de type console" + +#~ msgid "Generate code for a DLL" +#~ msgstr "Générer le code pour un DLL" + +#~ msgid "Ignore dllimport for functions" +#~ msgstr "Ignorer dllimport pour fonctions" + +#~ msgid "Use Mingw-specific thread support" +#~ msgstr "Utilise le support de thread spécifique à Mingw" + +#~ msgid "-f%s ignored for target (all code is position independent)" +#~ msgstr "-f%s ignoré pour la cible (tout le code set indépendant de la position)" + +#~ msgid "-mbnu210 is ignored (option is obsolete)" +#~ msgstr "-mbnu210 est ignoré (option obsolète)" + +#~ msgid "ms-bitfields not supported for objc" +#~ msgstr "ms-bitfields n'est pas supporté pour objc" + +#~ msgid "Alternate calling convention" +#~ msgstr "Convention alternative d'appels" + +#~ msgid "Use normal calling convention" +#~ msgstr "Utiliser la convention normale d'appels" + +#~ msgid "Align some doubles on dword boundary" +#~ msgstr "Aligner quelques doubles sur des frontières de mots doubles" + +#~ msgid "Align doubles on word boundary" +#~ msgstr "Aligner les doubles sur des frontières de mots" + +#~ msgid "Uninitialized locals in .bss" +#~ msgstr "Var. locales non initialisées dans .bss" + +#~ msgid "Uninitialized locals in .data" +#~ msgstr "Var. locales non initialisées dans .data" + +#~ msgid "Use IEEE math for fp comparisons" +#~ msgstr "Utiliser les mathématiques IEEE pour les comparaisons FP" + +#~ msgid "Do not use IEEE math for fp comparisons" +#~ msgstr "Ne pas utiliser les mathématiques IEEE pour les comparaisons FP" + +#~ msgid "Return values of functions in FPU registers" +#~ msgstr "Retourner les valeurs de fonctions dans les registres FPU" + +#~ msgid "Do not return values of functions in FPU registers" +#~ msgstr "Ne pas retourner les valeurs de fonctions dans les registres FPU" + +#~ msgid "Do not generate sin, cos, sqrt for FPU" +#~ msgstr "Ne pas générer sin, cos, sqrt pour le FPU" + +#~ msgid "Generate sin, cos, sqrt for FPU" +#~ msgstr "Générer sin, cos, sqrt pour le FPU" + +#~ msgid "Omit the frame pointer in leaf functions" +#~ msgstr "Omettre le pointeur de trame dans les fonctions feuilles" + +#~ msgid "Enable stack probing" +#~ msgstr "Autoriser le sondage de la pile" + +#~ msgid "Align destination of the string operations" +#~ msgstr "Aligner la destination des opérations sur les chaînes" + +#~ msgid "Do not align destination of the string operations" +#~ msgstr "Ne pas aligner la destination des opérations sur les chaînes" + +#~ msgid "Inline all known string operations" +#~ msgstr "Permettre l'enlignage dans toutes les opérations portant sur les chaînes" + +#~ msgid "Do not inline all known string operations" +#~ msgstr "Ne pas permettre l'enlignage dans toutes les opérations portant sur les chaînes" + +#~ msgid "Use push instructions to save outgoing arguments" +#~ msgstr "Utiliser les instructions push pour sauvegardes les arguments sortants" + +#~ msgid "Do not use push instructions to save outgoing arguments" +#~ msgstr "Ne pas utiliser les instructions push pour sauvegardes les arguments sortants" + +#~ msgid "Support MMX built-in functions" +#~ msgstr "Supporte les fonctions internes MMX" + +#~ msgid "Do not support MMX built-in functions" +#~ msgstr "Ne supporte pas les fonctions internes MMX" + +#~ msgid "Support 3DNow! built-in functions" +#~ msgstr "Supporte les fonctions internes 3DNOW!" + +#~ msgid "Do not support 3DNow! built-in functions" +#~ msgstr "Ne supporte pas les fonctions internes 3DNOW!" + +#~ msgid "Support MMX and SSE built-in functions and code generation" +#~ msgstr "Supporte les fonctions internes MMX et SSE et la génération de code" + +#~ msgid "Do not support MMX and SSE built-in functions and code generation" +#~ msgstr "Ne supporte pas les fonctions internes MMX et SSE et la génération de code" + +#~ msgid "Support MMX, SSE and SSE2 built-in functions and code generation" +#~ msgstr "Supporte les fonctions internes MMX, SSE et SSE2 et la génération de code" + +#~ msgid "Do not support MMX, SSE and SSE2 built-in functions and code generation" +#~ msgstr "Ne supporte pas les fonctions internes MMX, SSE et SSE2 et la génération de code" + +#~ msgid "Support MMX, SSE, SSE2 and SSE3 built-in functions and code generation" +#~ msgstr "Supporte les fonctions internes MMX, SSE, SSE2 et SSE3 et la génération de code" + +#~ msgid "Do not support MMX, SSE, SSE2 and SSE3 built-in functions and code generation" +#~ msgstr "Ne supporte pas les fonctions internes MMX, SSE, SSE2 et SSE3 et la génération de code" + +#~ msgid "sizeof(long double) is 16" +#~ msgstr "sizeof(long double) est 16" + +#~ msgid "sizeof(long double) is 12" +#~ msgstr "sizeof(long double) est 12" + +#~ msgid "Generate 64bit x86-64 code" +#~ msgstr "Générer du code 64 bits pour x86-64" + +#~ msgid "Generate 32bit i386 code" +#~ msgstr "Générer du code 32 bits pour i386" + +#~ msgid "Use native (MS) bitfield layout" +#~ msgstr "Utiliser une configuration de champ de bits native (MS)" + +#~ msgid "Use gcc default bitfield layout" +#~ msgstr "Utiliser la configuration par défaut de gcc pour les champs de bits" + +#~ msgid "Use red-zone in the x86-64 code" +#~ msgstr "Utiliser la zone-rouge pour le code x86-64" + +#~ msgid "Do not use red-zone in the x86-64 code" +#~ msgstr "Ne pas utiliser la zone-rouge pour le code x86-64" + +#~ msgid "Use direct references against %gs when accessing tls data" +#~ msgstr "Utiliser la référence directe envers %gs lors de l'accès des données tls" + +#~ msgid "Do not use direct references against %gs when accessing tls data" +#~ msgstr "Ne pas utiliser la référence directe envers %gs lors de l'accès des données tls" + +#~ msgid "Schedule code for given CPU" +#~ msgstr "Ordonnancer le code pour le processeur donné" + +#~ msgid "Generate floating point mathematics using given instruction set" +#~ msgstr "Générer les mathématiques en virgule flottante avec le jeu d'instructions données" + +#~ msgid "Generate code for given CPU" +#~ msgstr "Générer le code pour le processeur donné" + +#~ msgid "Number of registers used to pass integer arguments" +#~ msgstr "Nombre de registres utilisés pour passer les arguments entiers" + +#~ msgid "Loop code aligned to this power of 2" +#~ msgstr "Codes de boucles alignés selon une puissance de 2" + +#~ msgid "Jump targets are aligned to this power of 2" +#~ msgstr "Sauts de cibles alignés selon une puissance de 2" + +#~ msgid "Function starts are aligned to this power of 2" +#~ msgstr "Débuts des fonction alignés selon une puissance de 2" + +#~ msgid "Attempt to keep stack aligned to this power of 2" +#~ msgstr "Tentative de conservation de la pile alignée selon une puissance de 2" + +#~ msgid "Branches are this expensive (1-5, arbitrary units)" +#~ msgstr "Branchements coûteux à ce point (1-4, unités arbitraires)" + +#~ msgid "Use given x86-64 code model" +#~ msgstr "Utiliser le modèle de x86-64 donné" + +#~ msgid "Use given assembler dialect" +#~ msgstr "Utiliser la syntaxe de l'assembleur donné" + +#~ msgid "Use given thread-local storage dialect" +#~ msgstr "Utiliser le dialecte de stockage du thread local fourni" + +#~ msgid "Generate ELF output" +#~ msgstr "Générer la sortie ELF" + +#~ msgid "environment variable DJGPP not defined" +#~ msgstr "variable d'environment DJGPP non définie" + +#~ msgid "environment variable DJGPP points to missing file '%s'" +#~ msgstr "variable d'environment DJGPP pointe sur un fichier manquant « %s »" + +#~ msgid "environment variable DJGPP points to corrupt file '%s'" +#~ msgstr "variable d'environment DJGPP pointe vers un fichier corrompu « %s »" + +#~ msgid "Generate code which uses the FPU" +#~ msgstr "Générer du code qui utilise le FPU" + +#~ msgid "Do not generate code which uses the FPU" +#~ msgstr "Ne pas générer du code qui utilise le FPU" + +#~ msgid "sorry, not implemented: #pragma align NAME=SIZE" +#~ msgstr "désolé, pas implanté: #pragma align NOM=TAILLE" + +#~ msgid "malformed #pragma align - ignored" +#~ msgstr "#pragma align mal composé - ignoré" + +#~ msgid "sorry, not implemented: #pragma noalign NAME" +#~ msgstr "désolé, pas implanté: #pragma noalign NOM" + +#~ msgid "conflicting architectures defined - using C series" +#~ msgstr "architectures conflictuelles définies - utilise les séries C" + +#~ msgid "conflicting architectures defined - using K series" +#~ msgstr "architectures conflictuelles définies - utilise les séries K" + +#~ msgid "iC2.0 and iC3.0 are incompatible - using iC3.0" +#~ msgstr "iC2.0 et iC3.0 sont incompatibles - utilise iC3.0" + +#~ msgid "stack limit expression is not supported" +#~ msgstr "expression limitant la pile n'est pas supportée" + +#~ msgid "Generate SA code" +#~ msgstr "Générer du code SA" + +#~ msgid "Generate SB code" +#~ msgstr "Générer du code SB" + +#~ msgid "Generate KA code" +#~ msgstr "Générer du code KA" + +#~ msgid "Generate KB code" +#~ msgstr "Générer du code KB" + +#~ msgid "Generate JA code" +#~ msgstr "Générer du code JA" + +#~ msgid "Generate JD code" +#~ msgstr "Générer du code JD" + +#~ msgid "Generate JF code" +#~ msgstr "Générer du code JF" + +#~ msgid "generate RP code" +#~ msgstr "Générer du code RP" + +#~ msgid "Generate MC code" +#~ msgstr "Générer du code MC" + +#~ msgid "Generate CA code" +#~ msgstr "Générer du code CA" + +#~ msgid "Generate CF code" +#~ msgstr "Générer du code CF" + +#~ msgid "Use software floating point" +#~ msgstr "Utiliser le traitement par logiciel des nombres flottants" + +#~ msgid "Use alternate leaf function entries" +#~ msgstr "Utiliser les entrées alternatives pour les fonctions de feuilles" + +#~ msgid "Do not use alternate leaf function entries" +#~ msgstr "Ne pas utiliser les entrées alternatives pour les fonctions de feuilles" + +#~ msgid "Perform tail call optimization" +#~ msgstr "Effectuer une optimisation sur mesure des appels" + +#~ msgid "Do not perform tail call optimization" +#~ msgstr "Ne pas effectuer une optimisation sur mesure des appels" + +#~ msgid "Use complex addressing modes" +#~ msgstr "Utiliser les modes d'adressage complexes" + +#~ msgid "Do not use complex addressing modes" +#~ msgstr "Ne pas utiliser les modes d'adressage complexes" + +#~ msgid "Align code to 8 byte boundary" +#~ msgstr "Aligner le code sur des frontières de 8 octets" + +#~ msgid "Do not align code to 8 byte boundary" +#~ msgstr "Ne pas aligner le code sur des frontières de 8 octets" + +#~ msgid "Enable compatibility with iC960 v2.0" +#~ msgstr "Autoriser la compatibilité avec iC960 v2.0" + +#~ msgid "Enable compatibility with iC960 v3.0" +#~ msgstr "Autoriser la compatibilité avec iC960 v3.0" + +#~ msgid "Enable compatibility with ic960 assembler" +#~ msgstr "Autoriser la compatibilité avec l'assembleur iC960" + +#~ msgid "Do not permit unaligned accesses" +#~ msgstr "Ne pas permettre les accès non alignés" + +#~ msgid "Permit unaligned accesses" +#~ msgstr "Permettre les accès non alignés" + +#~ msgid "Layout types like Intel's v1.3 gcc" +#~ msgstr "Utiliser une disposition de type Intel's v1.3 gcc" + +#~ msgid "Do not layout types like Intel's v1.3 gcc" +#~ msgstr "Ne pas utiliser une disposition de type Intel's v1.3 gcc" + +#~ msgid "Use 64 bit long doubles" +#~ msgstr "Utiliser les doubles longs de 64 bits" + +#~ msgid "Enable linker relaxation" +#~ msgstr "Autoriser la relâche par l'éditeur de liens" + +#~ msgid "Do not enable linker relaxation" +#~ msgstr "Ne pas autoriser la relâche par l'éditeur de liens" + +#~ msgid "malformed #pragma builtin" +#~ msgstr "construit #pragma mal composé" + +#~ msgid "invalid argument of `%s' attribute" +#~ msgstr "type d'argument invalide pour l'attribut « %s »" + +#~ msgid "%Jan address area attribute cannot be specified for local variables" +#~ msgstr "%Jun attribut d'adresse de zone de données ne peut pas être spécifié pour des variables locales" + +#~ msgid "%Jaddress area of '%s' conflicts with previous declaration" +#~ msgstr "%Jl'adresse de la zone « %s » entre en conflit avec un déclaration précédente" + +#~ msgid "%Jaddress area attribute cannot be specified for functions" +#~ msgstr "%Jl'attribut de la zone d'adresse ne peut pas être spécifié pour des fonctiones" + +#~ msgid "ia64_print_operand: unknown code" +#~ msgstr "ia64_print_operand: code inconnu" + +#~ msgid "value of -mfixed-range must have form REG1-REG2" +#~ msgstr "valeur de -mfixed-range doit avoir la forme REG1-REG2" + +#~ msgid "%s-%s is an empty range" +#~ msgstr "%s-%s est une étendue vide" + +#~ msgid "cannot optimize floating point division for both latency and throughput" +#~ msgstr "ne peut optimiser la division en point flottant à la fois pour la latence et le débit" + +#~ msgid "cannot optimize integer division for both latency and throughput" +#~ msgstr "ne peut optimiser la division entière à la fois pour la latence et le débit" + +#~ msgid "cannot optimize square root for both latency and throughput" +#~ msgstr "ne peut optimiser la racine carrée à la fois pour la latence et le débit" + +#~ msgid "not yet implemented: latency-optimized inline square root" +#~ msgstr "pas encore implanté: racine carrée enligne optimisée pour la latence" + +#~ msgid "bad value (%s) for -mtls-size= switch" +#~ msgstr "valeur erronée (%s) pour l'option -mtls-size" + +#~ msgid "bad value (%s) for -tune= switch" +#~ msgstr "valeur erronée (%s) pour l'option -tune=" + +#~ msgid "Generate big endian code" +#~ msgstr "Générer du code de système à octets de poids fort" + +#~ msgid "Generate little endian code" +#~ msgstr "Générer du code de système à octets de poids faible" + +#~ msgid "Generate code for GNU as" +#~ msgstr "Générer du code pour GNU tel que" + +#~ msgid "Generate code for Intel as" +#~ msgstr "Générer du code pour Intel tel que" + +#~ msgid "Generate code for GNU ld" +#~ msgstr "Générer du code pour GNU ld" + +#~ msgid "Generate code for Intel ld" +#~ msgstr "Générer du code pour Intel ld" + +#~ msgid "Generate code without GP reg" +#~ msgstr "Générer du code sans registre GP" + +#~ msgid "Emit stop bits before and after volatile extended asms" +#~ msgstr "Produire de stop bits avant et après les asms étendus" + +#~ msgid "Don't emit stop bits before and after volatile extended asms" +#~ msgstr "Ne pas produire de stop bits avant et après les asms étendus" + +#~ msgid "Emit code for Itanium (TM) processor B step" +#~ msgstr "Produire du code pour le processeur B Itanium (TM)" + +#~ msgid "Use in/loc/out register names" +#~ msgstr "Utilise les noms des registres in/loc/out " + +#~ msgid "Disable use of sdata/scommon/sbss" +#~ msgstr "Interdire l'utilisation de sdata/scommon/sbss" + +#~ msgid "Enable use of sdata/scommon/sbss" +#~ msgstr "Autoriser l'utilisation de sdata/scommon/sbss" + +#~ msgid "gp is constant (but save/restore gp on indirect calls)" +#~ msgstr "gp est une constante (mais save/restore gp fait par appels indirects)" + +#~ msgid "Generate self-relocatable code" +#~ msgstr "Générer du code auto-relocalisable" + +#~ msgid "Generate inline floating point division, optimize for latency" +#~ msgstr "Générer la division enligne en point flottant, optimiser pour la latence" + +#~ msgid "Generate inline floating point division, optimize for throughput" +#~ msgstr "Générer la division en point flottant enligne, optimiser pour le débit" + +#~ msgid "Generate inline integer division, optimize for latency" +#~ msgstr "Générer la division entière enligne, optimiser pour la latence" + +#~ msgid "Generate inline integer division, optimize for throughput" +#~ msgstr "Générer la divisions entière enligne, optimiser pour le débit" + +#~ msgid "Generate inline square root, optimize for latency" +#~ msgstr "Générer la racine carrée enligne, optimiser pour la latence" + +#~ msgid "Generate inline square root, optimize for throughput" +#~ msgstr "Générer la racine carrée enligne, optimiser pour le débit" + +#~ msgid "Enable Dwarf 2 line debug info via GNU as" +#~ msgstr "Autoriser les infos de lignes de mise au point Dwarf 2 via GNU tel que" + +#~ msgid "Disable Dwarf 2 line debug info via GNU as" +#~ msgstr "Interdire les infos de lignes de mise au point Dwarf 2 via GNU tel que" + +#~ msgid "Enable earlier placing stop bits for better scheduling" +#~ msgstr "Autoriser l'insertion antérieure de stop bits pour un meilleur ordonnancement" + +#~ msgid "Disable earlier placing stop bits" +#~ msgstr "Interdire l'installation antérieure de bits d'arrêt" + +#~ msgid "Specify range of registers to make fixed" +#~ msgstr "spécifier l'étendue des registres pour la rendre fixe" + +#~ msgid "bad operand" +#~ msgstr "opérande erronée" + +#~ msgid "bad value (%s) for -mcpu= switch" +#~ msgstr "valeur erronée (%s) pour l'option -mcpu=" + +#~ msgid "The compiler does not support -march=%s." +#~ msgstr "Le compilateur ne supporte pas -march=%s." + +#~ msgid "gp_offset (%ld) or end_offset (%ld) is less than zero." +#~ msgstr "gp_offset (%ld) ou end_offset (%ld) est plus petit que zéro." + +#~ msgid "argument `%d' is not a constant" +#~ msgstr "l'argument de « %d » n'est pas une constante" + +#~ msgid "PRINT_OPERAND_ADDRESS, null pointer" +#~ msgstr "PRINT_OPERAND_ADDRESS, pointeur nul" + +#~ msgid "PRINT_OPERAND: Unknown punctuation '%c'" +#~ msgstr "PRINT_OPERAND: ponctuation « %c » inconnue" + +#~ msgid "PRINT_OPERAND null pointer" +#~ msgstr "PRINT_OPERAND pointeur nul" + +#~ msgid "invalid %%P operand" +#~ msgstr "opérande %%P invalide" + +#~ msgid "invalid %%p value" +#~ msgstr "valeur %%p invalide" + +#~ msgid "invalid use of %%d, %%x, or %%X" +#~ msgstr "utilisation invalide de %%d, %%x, ou %%X" + +#~ msgid "No default crt0.o" +#~ msgstr "Aucun défaut pour crt0.o" + +#~ msgid "Use GP relative sdata/sbss sections" +#~ msgstr "Utiliser GP en mode relatif aux sections sdata/sbss" + +#~ msgid "Don't use GP relative sdata/sbss sections" +#~ msgstr "Ne pas utiliser GP en mode relatif aux sections sdata/sbss" + +#~ msgid "Use ROM instead of RAM" +#~ msgstr "Utiliser le ROM au lieu de la RAM" + +#~ msgid "Don't use ROM instead of RAM" +#~ msgstr "Ne pas utiliser le ROM au lieu de la RAM" + +#~ msgid "Put uninitialized constants in ROM (needs -membedded-data)" +#~ msgstr "Placer les constantes non itialisées dans le ROM (a besoin de -membedded-data)" + +#~ msgid "Don't put uninitialized constants in ROM" +#~ msgstr "Ne pas placer les constantes non itialisées dans le ROM (a besoin de -membedded-data)" + +#~ msgid "Specify CPU for scheduling purposes" +#~ msgstr "Spécifier le processeur pour les besoins de l'ordonnancement" + +#~ msgid "Specify CPU for code generation purposes" +#~ msgstr "Spécifier le processeur pour les besoins de la génération de code" + +#~ msgid "bad value (%s) for -mmodel switch" +#~ msgstr "valeur erronée (%s) pour l'option -mmodel" + +#~ msgid "bad value (%s) for -msdata switch" +#~ msgstr "valeur erronée (%s) pour l'option -msdata" + +#~ msgid "bad value (%s) for -flush-trap=n (0= found without a %%< in assembler pattern" +#~ msgstr "erreur interne: %%> trouvé sans %%< dans le canevas d'assemblage" + +#~ msgid "internal error: %%} found without a %%{ in assembler pattern" +#~ msgstr "erreur interne: %%} trouvé sans %%{ dans le canevas d'assemblage" + +#~ msgid "PRINT_OPERAND: unknown punctuation '%c'" +#~ msgstr "PRINT_OPERAND: ponctuation « %c » inconnue" + +#~ msgid "PRINT_OPERAND, invalid insn for %%C" +#~ msgstr "PRINT_OPERAND insn invalide pour %%C" + +#~ msgid "PRINT_OPERAND, invalid insn for %%N" +#~ msgstr "PRINT_OPERAND insn invalide pour %%N" + +#~ msgid "PRINT_OPERAND, invalid insn for %%F" +#~ msgstr "PRINT_OPERAND insn invalide pour %%F" + +#~ msgid "PRINT_OPERAND, invalid insn for %%W" +#~ msgstr "PRINT_OPERAND insn invalide pour %%W" + +#~ msgid "PRINT_OPERAND, invalid operand for relocation" +#~ msgstr "PRINT_OPERAND, opérande invalide pour la relocalisation" + +#~ msgid "can not handle inconsistent calls to `%s'" +#~ msgstr "ne peut traiter des appels inconsistents à « %s »" + +#~ msgid "the cpu name must be lower case" +#~ msgstr "le nom du cpu doit être en minuscules" + +#~ msgid "bad value (%s) for %s" +#~ msgstr "valeur (%s) erronée pour %s" + +#~ msgid "can't rewind temp file: %m" +#~ msgstr "ne peut rembobiner le fichier temporaire: %m" + +#~ msgid "can't write to output file: %m" +#~ msgstr "ne peut écrire dans le fichier de sortie: %m" + +#~ msgid "can't read from temp file: %m" +#~ msgstr "ne peut lire du fichier temporaire: %m" + +#~ msgid "can't close temp file: %m" +#~ msgstr "ne peut fermer le fichier temporaire: %m" + +#~ msgid "Same as -mabi=32, just trickier" +#~ msgstr "Identique à -mabi=32, juste plus complexe" + +#~ msgid "Use 64-bit int type" +#~ msgstr "Utiliser le type int de 64 bits" + +#~ msgid "Use 64-bit long type" +#~ msgstr "Utiliser le type long de 64 bits" + +#~ msgid "Use 32-bit long type" +#~ msgstr "Utiliser le type long de 32 bits" + +#~ msgid "Optimize lui/addiu address loads" +#~ msgstr "Optimiser les chargements d'adresses lui/addiu" + +#~ msgid "Don't optimize lui/addiu address loads" +#~ msgstr "Ne pas optimiser les chargements d'adresses lui/addiu" + +#~ msgid "Use MIPS as" +#~ msgstr "Utiliser MIPS tel que" + +#~ msgid "Use GNU as" +#~ msgstr "Utiliser GNU tel que" + +#~ msgid "Use symbolic register names" +#~ msgstr "Utiliser les noms de registres symboliques" + +#~ msgid "Don't use symbolic register names" +#~ msgstr "Ne pas utiliser les noms de registres symboliques" + +#~ msgid "Use GP relative sdata/sbss sections (now ignored)" +#~ msgstr "Utiliser GP en mode relatif aux sections sdata/sbss (maintenant ignoré)" + +#~ msgid "Don't use GP relative sdata/sbss sections (now ignored)" +#~ msgstr "Ne pas utiliser GP en mode relatif aux sections sdata/sbss (maintenant ignoré)" + +#~ msgid "Output compiler statistics (now ignored)" +#~ msgstr "Afficher les statistiques de compilation (maintenant ignoré)" + +#~ msgid "Don't output compiler statistics" +#~ msgstr "Ne pas afficher les statistiques de compilation" + +#~ msgid "Don't optimize block moves" +#~ msgstr "Ne pas optimiser les déplacements de blocs" + +#~ msgid "Optimize block moves" +#~ msgstr "Optimiser les déplacements de blocs" + +#~ msgid "Use mips-tfile asm postpass" +#~ msgstr "Utiliser la post-passe de type mips-tfile de l'assembleur" + +#~ msgid "Don't use mips-tfile asm postpass" +#~ msgstr "Ne pas utiliser la post-passe de type mips-tfile de l'assembleur" + +#~ msgid "Use hardware floating point" +#~ msgstr "Utiliser l'unité matérielle en virgule flottante" + +#~ msgid "Use 64-bit FP registers" +#~ msgstr "Utiliser les registres FP de 64 bits" + +#~ msgid "Use 32-bit FP registers" +#~ msgstr "Utiliser les registres FP de 32 bits" + +#~ msgid "Use 64-bit general registers" +#~ msgstr "Utiliser les registres généraux de 64 bits" + +#~ msgid "Use 32-bit general registers" +#~ msgstr "Utiliser les registres généraux de 32 bits" + +#~ msgid "Use Irix PIC" +#~ msgstr "Utiliser le code PIC Irix" + +#~ msgid "Don't use Irix PIC" +#~ msgstr "Ne pas utiliser le code PIC Irix" + +#~ msgid "Use indirect calls" +#~ msgstr "Utiliser les appels indirects" + +#~ msgid "Don't use indirect calls" +#~ msgstr "Ne pas utiliser les appels indirects" + +#~ msgid "Use embedded PIC" +#~ msgstr "Utiliser le code PIC enchâssé" + +#~ msgid "Don't use embedded PIC" +#~ msgstr "Ne pas utiliser le code PIC enchâssé" + +#~ msgid "Use big-endian byte order" +#~ msgstr "Utiliser l'ordre des octets pour système à octets de poids fort" + +#~ msgid "Use little-endian byte order" +#~ msgstr "Utiliser l'ordre des octets pour système à octets de poids faible" + +#~ msgid "Use single (32-bit) FP only" +#~ msgstr "Utiliser un simple FP (32 bits) seulement" + +#~ msgid "Don't use single (32-bit) FP only" +#~ msgstr "Ne pas utiliser un simple FP (32 bits) seulement" + +#~ msgid "Use multiply accumulate" +#~ msgstr "Utiliser les multiplications par accumulations" + +#~ msgid "Don't use multiply accumulate" +#~ msgstr "Ne pas utiliser les multiplications par accumulations" + +#~ msgid "Don't generate fused multiply/add instructions" +#~ msgstr "Ne pas générer des instructions fusionnés de multiplication/addition" + +#~ msgid "Generate fused multiply/add instructions" +#~ msgstr "Générer des instructions fusionnés de multiplication/addition" + +#~ msgid "Work around early 4300 hardware bug" +#~ msgstr "Contourner le bug matériel des premiers 4300" + +#~ msgid "Don't work around early 4300 hardware bug" +#~ msgstr "Ne pas contourner le bug matériel des premiers 4300" + +#~ msgid "Work around errata for early SB-1 revision 2 cores" +#~ msgstr "Contourner l'erreur pour la révision 2 du noyau des versions initiales SB-1" + +#~ msgid "Don't work around errata for early SB-1 revision 2 cores" +#~ msgstr "Ne pas contourner l'erreur pour la révision 2 du noyau des versions initiales SB-1" + +#~ msgid "Trap on integer divide by zero" +#~ msgstr "Intercepter les divisions par zéros sur des entiers" + +#~ msgid "Don't trap on integer divide by zero" +#~ msgstr "Ne pas intercepter les divisions par zéros sur des entiers" + +#~ msgid "Use Branch Likely instructions, overriding default for arch" +#~ msgstr "Utiliser des instructions se comportant comme des branchements, écrasant le défaut de l'architecture" + +#~ msgid "Don't use Branch Likely instructions, overriding default for arch" +#~ msgstr "Ne pas utiliser des instructions se comportant comme des branchements, écrasant le défaut de l'architecture" + +#~ msgid "Use NewABI-style %reloc() assembly operators" +#~ msgstr "Utiliser NewABI-style %reloc() les opérateurs d'assemblage" + +#~ msgid "Use assembler macros instead of relocation operators" +#~ msgstr "Utiliser les macros assembleurs au lieu des opérateurs de relocalisation" + +#~ msgid "Generate mips16 code" +#~ msgstr "Générer du code mips16" + +#~ msgid "Generate normal-mode code" +#~ msgstr "Générer du code en mode normal" + +#~ msgid "Lift restrictions on GOT size" +#~ msgstr "Enlever les restrictions sur la taille GOT" + +#~ msgid "Do not lift restrictions on GOT size" +#~ msgstr "Ne pas enlever les restrictions sur la taille GOT" + +#~ msgid "Specify an ABI" +#~ msgstr "Spécifier une ABI" + +#~ msgid "Specify a Standard MIPS ISA" +#~ msgstr "Spécifier le standard MIPS ISA" + +#~ msgid "mips16 function profiling" +#~ msgstr "profilage de fonction mips16" + +#~ msgid "-f%s not supported: ignored" +#~ msgstr "-f%s n'est pas supporté: ignoré" + +#~ msgid "too large function value type, needs %d registers, have only %d registers for this" +#~ msgstr "valeur de type de fonction trop grande, a besoin de %d registres mais seuls %d disponibles" + +#~ msgid "function_profiler support for MMIX" +#~ msgstr "function_profiler supporté pour MMIX" + +#~ msgid "MMIX Internal: Last named vararg would not fit in a register" +#~ msgstr "MMIX interne: dernier vararg nommé ne pourra être inséré dans un registre" + +#~ msgid "MMIX Internal: Expected a CONST_INT, not this" +#~ msgstr "MMIX interne: attendait CONST_INT, pas ceci" + +#~ msgid "MMIX Internal: Bad register: %d" +#~ msgstr "MMIX interne: registre erroné: %d" + +#~ msgid "MMIX Internal: Bad value for 'm', not a CONST_INT" +#~ msgstr "MMIX interne: valeur erronée pour « m », pas un CONST_INT" + +#~ msgid "MMIX Internal: Expected a register, not this" +#~ msgstr "MMIX interne: attendait un registre, pas ceci" + +#~ msgid "MMIX Internal: Expected a constant, not this" +#~ msgstr "MMIX interne: attendait une constante, pas ceci" + +#~ msgid "MMIX Internal: Missing `%c' case in mmix_print_operand" +#~ msgstr "MMIX interne: cas « %c » manquant dans mmix_print_operand" + +#~ msgid "MMIX Internal: Cannot decode this operand" +#~ msgstr "MMIX interne: ne peut décoder cette opérande" + +#~ msgid "MMIX Internal: This is not a recognized address" +#~ msgstr "MMIX interne: ce n'est pas une adresse reconnue" + +#~ msgid "stack frame not a multiple of 8 bytes: %d" +#~ msgstr "trame de pile n'est pas un multiple de 8 octets: %d" + +#~ msgid "stack frame not a multiple of octabyte: %d" +#~ msgstr "trame de pile n'est pas un multiple de 8 octets: %d" + +#~ msgid "MMIX Internal: %s is not a shiftable int" +#~ msgstr "MMIX interne: %s n'est pas un entier pouvant décalé" + +#~ msgid "MMIX Internal: Trying to output invalidly reversed condition:" +#~ msgstr "MMIX interne: tentative de produire incorrectement une condition renversée:" + +#~ msgid "MMIX Internal: What's the CC of this?" +#~ msgstr "MMIX interne: quel sorte de CC est-ce?" + +#~ msgid "MMIX Internal: What is the CC of this?" +#~ msgstr "MMIX interne: quel sorte de CC est-ce?" + +#~ msgid "MMIX Internal: This is not a constant:" +#~ msgstr "interne MMIX: ce n'est pas une constante:" + +#~ msgid "Set start-address of the program" +#~ msgstr "Adress de départ du programme fixée" + +#~ msgid "Set start-address of data" +#~ msgstr "Adresse de départ des données fixée" + +#~ msgid "For intrinsics library: pass all parameters in registers" +#~ msgstr "Pour les bibliothèques intrinsèques : passer tous les paramètres par registre" + +#~ msgid "Use register stack for parameters and return value" +#~ msgstr "Utiliser le registre de la pile pour les paramètres et la valeur retournée" + +#~ msgid "Use call-clobbered registers for parameters and return value" +#~ msgstr "utiliser les registres d'appels maltraités pour les paramètres et les valeurs retournées" + +#~ msgid "Use epsilon-respecting floating point compare instructions" +#~ msgstr "Utiliser un epsilon respectant les instructions de comparaison en virgule flottante" + +#~ msgid "Use zero-extending memory loads, not sign-extending ones" +#~ msgstr "utiliser des chargements mémoire avec zéro extension, pas celles avec signe d'extension" + +#~ msgid "Generate divide results with reminder having the same sign as the divisor (not the dividend)" +#~ msgstr "générer des résultats de division avec reste ayant le même signe que le diviseur (pas le dividende)" + +#~ msgid "Prepend global symbols with \":\" (for use with PREFIX)" +#~ msgstr "pré ajouter les symboles globaux avec «:» (pour l'utilisation avec PREFIX)" + +#~ msgid "Do not provide a default start-address 0x100 of the program" +#~ msgstr "Ne pas fournir d'adresse de départ par défaut 0x100 du programme" + +#~ msgid "Link to emit program in ELF format (rather than mmo)" +#~ msgstr "Faire l'édition de liens pour produire le programme en format ELF (au lieu de mmo)" + +#~ msgid "Use P-mnemonics for branches statically predicted as taken" +#~ msgstr "Utiliser les mnémoniques P pour les branchements statiquement prévus à être pris" + +#~ msgid "Don't use P-mnemonics for branches" +#~ msgstr "Ne pas utiliser les mnémoniques P pour les branchements" + +#~ msgid "Use addresses that allocate global registers" +#~ msgstr "Utiliser les adresses qui allouent des registres globaux" + +#~ msgid "Do not use addresses that allocate global registers" +#~ msgstr "Ne pas utiliser des adresses qui allouent des registres globaux" + +#~ msgid "Generate a single exit point for each function" +#~ msgstr "Générer un point de sortie simple pour chaque fonction" + +#~ msgid "Do not generate a single exit point for each function" +#~ msgstr "Ne pas générer un point de sortie simple pour chaque fonction" + +#~ msgid "Target the AM33 processor" +#~ msgstr "Cible le processeur AM33" + +#~ msgid "Target the AM33/2.0 processor" +#~ msgstr "Cibler le processeur AM33/2.0" + +#~ msgid "Enable linker relaxations" +#~ msgstr "Autoriser la relâche de l'éditeur de liens" + +#~ msgid "Work around hardware multiply bug" +#~ msgstr "Contourner le bug matériel de la multiplication" + +#~ msgid "Do not work around hardware multiply bug" +#~ msgstr "Ne pas contourner le bug matériel de la multiplication" + +#~ msgid "Don't use hardware fp" +#~ msgstr "Ne pas utiliser le FP matériel" + +#~ msgid "Alternative calling convention" +#~ msgstr "Convention alternative d'appels" + +#~ msgid "Pass some arguments in registers" +#~ msgstr "Passer quelques arguments par les registres" + +#~ msgid "Pass all arguments on stack" +#~ msgstr "PAsser tous les arguments par la pile" + +#~ msgid "Optimize for 32532 cpu" +#~ msgstr "Optimiser pour le processeur 32532" + +#~ msgid "Optimize for 32332 cpu" +#~ msgstr "Optimiser pour le processeur 32332" + +#~ msgid "Optimize for 32032" +#~ msgstr "Optimiser pour le 32022" + +#~ msgid "Register sb is zero. Use for absolute addressing" +#~ msgstr "Registre sb est zéro. Utilisé pour l'adressage absolu" + +#~ msgid "Do not use register sb" +#~ msgstr "Ne pas utiliser le registre sb" + +#~ msgid "Use bit-field instructions" +#~ msgstr "Utiliser les instructions de champs de bits" + +#~ msgid "Do not use bit-field instructions" +#~ msgstr "Ne pas utiliser les instructions de champs de bits" + +#~ msgid "Generate code for high memory" +#~ msgstr "Générer du code pour la partie haute de la mémoire" + +#~ msgid "Generate code for low memory" +#~ msgstr "Générer du code pour la partie basse de la mémoire" + +#~ msgid "32381 fpu" +#~ msgstr "FPU 32381" + +#~ msgid "Use multiply-accumulate fp instructions" +#~ msgstr "Utiliser les instructions FP de multiplications avec accumulations" + +#~ msgid "Do not use multiply-accumulate fp instructions" +#~ msgstr "Ne pas utiliser les instructions FP de multiplications avec accumulations" + +#~ msgid "\"Small register classes\" kludge" +#~ msgstr "\"Petites classes de registres\" kludge" + +#~ msgid "No \"Small register classes\" kludge" +#~ msgstr "Pas de \"Petites classes de registres\" kludge" + +#~ msgid "" +#~ "unknown -mschedule= option (%s).\n" +#~ "Valid options are 700, 7100, 7100LC, 7200, 7300, and 8000\n" +#~ msgstr "" +#~ "Option inconnue -mschedule= (%s)\n" +#~ "Les options valides sont 700, 7100, 7100LC, 7200, 7300 et 8000\n" + +#~ msgid "" +#~ "unknown -march= option (%s).\n" +#~ "Valid options are 1.0, 1.1, and 2.0\n" +#~ msgstr "" +#~ "Option inconnue -march= (%s)\n" +#~ "Les options valides sont 1.0, 1.1 et 2.0\n" + +#~ msgid "PIC code generation is not supported in the portable runtime model\n" +#~ msgstr "La génération de code PIC n'est pas supportée dans le modèle portable d'exécution\n" + +#~ msgid "PIC code generation is not compatible with fast indirect calls\n" +#~ msgstr "La génération de code PIC n'est pas compatible avec les appels indirects rapides.\n" + +#~ msgid "-g is only supported when using GAS on this processor," +#~ msgstr "L'option -g est seulement supportée lorsque GAS est utilisé sur ce processeur," + +#~ msgid "Generate cpp defines for server IO" +#~ msgstr "Générer les defines pour les IO d'un serveur" + +#~ msgid "Generate cpp defines for workstation IO" +#~ msgstr "Générer les defines pour les IO d'une station de travail" + +#~ msgid "Generate PA1.1 code" +#~ msgstr "Générer du code PA1.1" + +#~ msgid "Generate PA1.0 code" +#~ msgstr "Générer du code PA1.0" + +#~ msgid "Generate PA2.0 code (requires binutils 2.10 or later)" +#~ msgstr "Générer du code PA2.0 (nécessite binutils 2.10 ou supérieur)" + +#~ msgid "Disable FP regs" +#~ msgstr "Désactiver les registres FP" + +#~ msgid "Do not disable FP regs" +#~ msgstr "Ne pas désactiver les registres FP" + +#~ msgid "Disable space regs" +#~ msgstr "Désactiver l'espace registre" + +#~ msgid "Do not disable space regs" +#~ msgstr "Ne pas désactiver l'espace registre" + +#~ msgid "Put jumps in call delay slots" +#~ msgstr "Mettre des sauts dant les fentes de délais" + +#~ msgid "Do not put jumps in call delay slots" +#~ msgstr "Ne pas mettre des sauts dant les fentes de délais" + +#~ msgid "Disable indexed addressing" +#~ msgstr "désactiver l'adressage indexé" + +#~ msgid "Do not disable indexed addressing" +#~ msgstr "Ne pas désactiver l'adressage indexé" + +#~ msgid "Use portable calling conventions" +#~ msgstr "Utiliser les conventions d'appels portables" + +#~ msgid "Do not use portable calling conventions" +#~ msgstr "Ne pas utiliser les conventions d'appel portables" + +#~ msgid "Assume code will be assembled by GAS" +#~ msgstr "Assumer que le code sera assemblé par GAS" + +#~ msgid "Do not assume code will be assembled by GAS" +#~ msgstr "Ne pas assumer que le code sera assemblé par GAS" + +#~ msgid "Do not use software floating point" +#~ msgstr "Ne pas utiliser le logiciel pour virgule flottante" + +#~ msgid "Emit long load/store sequences" +#~ msgstr "Générer des instructions multiples pour chargement/stockage" + +#~ msgid "Do not emit long load/store sequences" +#~ msgstr "Ne pas générer les instructions multiples de chargement/stockage" + +#~ msgid "Generate fast indirect calls" +#~ msgstr "Ne pas utiliser les appels rapides indirects" + +#~ msgid "Do not generate fast indirect calls" +#~ msgstr "Ne pas générer de directives rapides indirects" + +#~ msgid "Generate code for huge switch statements" +#~ msgstr "Générer du code pour les grandes déclarations de branchements" + +#~ msgid "Do not generate code for huge switch statements" +#~ msgstr "Ne pas générer du code pour les grandes déclarations de branchement" + +#~ msgid "Always generate long calls" +#~ msgstr "Générer toujours des appels longs" + +#~ msgid "Generate long calls only when needed" +#~ msgstr "Générer des appels longs lorsque nécessaire" + +#~ msgid "Enable linker optimizations" +#~ msgstr "Activer les optimisations par l'éditeur de liens" + +#~ msgid "Specify architecture for code generation. Values are 1.0, 1.1, and 2.0. 2.0 requires gas snapshot 19990413 or later." +#~ msgstr "Spécifier l'architecture pour la génération de code. Les valeurs sont 1.0, 1.1 et 2.0. 2.0 requiert gas snapshot 19990413 ou plus récent." + +#~ msgid "Assume code will be linked by GNU ld" +#~ msgstr "Assumer que le code sera lié par GNU ld" + +#~ msgid "Assume code will be linked by HP ld" +#~ msgstr "Assumer que le code sera lié par HP ld" + +#~ msgid "Do not use hardware floating point" +#~ msgstr "Ne pas utiliser le matériel pour virgule flottante" + +#~ msgid "Return floating point results in ac0" +#~ msgstr "Le résultat retourné en virgule flottante se retrouve dans AC0." + +#~ msgid "Return floating point results in memory" +#~ msgstr "Le résultat retourné en virgule flottante se retrouve en mémoire." + +#~ msgid "Generate code for an 11/40" +#~ msgstr "Générer du code pour un 11/40" + +#~ msgid "Generate code for an 11/45" +#~ msgstr "Générer du code pour un 11/45" + +#~ msgid "Generate code for an 11/10" +#~ msgstr "Générer du code pour un 11/10" + +#~ msgid "Use 32 bit int" +#~ msgstr "Utiliser des int de 32 bits" + +#~ msgid "Use 16 bit int" +#~ msgstr "Utiliser des int de 16 bits" + +#~ msgid "Use 32 bit float" +#~ msgstr "Utiliser des flottants de 32 bits" + +#~ msgid "Use 64 bit float" +#~ msgstr "Utiliser des flottants de 64 bits" + +#~ msgid "Target has split I&D" +#~ msgstr "Cible a un I&D séparé" + +#~ msgid "Target does not have split I&D" +#~ msgstr "Cible n'a pas un I&D séparé" + +#~ msgid "Use UNIX assembler syntax" +#~ msgstr "Utliser la syntaxe de l'assembleur UNIX" + +#~ msgid "Use DEC assembler syntax" +#~ msgstr "Utliser la syntaxe de l'assembleur DEC" + +#~ msgid "Segmentation Fault (code)" +#~ msgstr "Faute de segmentation (code)" + +#~ msgid "Out of stack space.\n" +#~ msgstr "Manque d'espace sur la pile.\n" + +#~ msgid "Try running `%s' in the shell to raise its limit.\n" +#~ msgstr "Essayer d'exécuter « %s » dans le shell pour augmenter la limite.\n" + +#~ msgid "Segmentation Fault" +#~ msgstr "Faute de segmentation" + +#~ msgid "While setting up signal stack: %m" +#~ msgstr "Lors de la configuration de la pile de signaux: %m" + +#~ msgid "While setting up signal handler: %m" +#~ msgstr "Lors de la configuration de la routine de traitement de signal: %m" + +#~ msgid "couldn't unmap pch_address_space: %m\n" +#~ msgstr "ne peut défaire la map pch_address_space: %m\n" + +#~ msgid "ignoring malformed #pragma longcall" +#~ msgstr "#pragma longcall mal composé" + +#~ msgid "missing open paren" +#~ msgstr "parenthèse ouvrante manquante" + +#~ msgid "missing number" +#~ msgstr "nombre manquant" + +#~ msgid "missing close paren" +#~ msgstr "parenthèse fermante manquante" + +#~ msgid "number must be 0 or 1" +#~ msgstr "le nombre doit être 0 ou 1" + +#~ msgid "junk at end of #pragma longcall" +#~ msgstr "rebut à la fin de #pragma longcall" + +#~ msgid "-mmultiple is not supported on little endian systems" +#~ msgstr "-mmultiple n'est pas supporté sur des système à octets de poids faible" + +#~ msgid "-mstring is not supported on little endian systems" +#~ msgstr "-mstring n'est pas supporté sur des système à octets de poids faible" + +#~ msgid "unknown -mdebug-%s switch" +#~ msgstr "option -mdebug-%s inconnue" + +#~ msgid "unknown -mtraceback arg `%s'; expecting `full', `partial' or `none'" +#~ msgstr "argument « %s » inconnu de l'option -mtraceback; attendu « full », « partial » ou « none »" + +#~ msgid "Unknown switch -mlong-double-%s" +#~ msgstr "option -mlong-double-%s inconnue" + +#~ msgid "unknown -m%s= option specified: '%s'" +#~ msgstr "option -m%s= inconnue spécifiée: « %s »" + +#~ msgid "not configured for ABI: '%s'" +#~ msgstr "pas configuré pour ABI: « %s »" + +#~ msgid "unknown ABI specified: '%s'" +#~ msgstr "ABI spécifié inconnu: « %s »" + +#~ msgid "unknown -malign-XXXXX option specified: '%s'" +#~ msgstr "option -malign-XXXXX inconnue spécifiée: « %s »" + +#~ msgid "Cannot return value in vector register because altivec instructions are disabled, use -maltivec to enable them." +#~ msgstr "Ne peut retourner la valeur dans le registre de vecteur parce que les instructions altivec sont désactivées, utiliser -maltivec pour les autoriser" + +#~ msgid "Cannot pass argument in vector register because altivec instructions are disabled, use -maltivec to enable them." +#~ msgstr "Ne peut relayer l'argument dans le registre de vecteur parce que les instructions altivec sont désactivées, utiliser -maltivec pour les autoriser" + +#~ msgid "argument 1 must be a 5-bit signed literal" +#~ msgstr "argument 1 doit être un litéral signé de 5 bits" + +#~ msgid "argument 2 must be a 5-bit unsigned literal" +#~ msgstr "argument 2 doit être un litéral non signé de 5 bits" + +#~ msgid "argument 1 of __builtin_altivec_predicate must be a constant" +#~ msgstr "argument 1 de « __builtin_altivec_predicate » doit être une constante" + +#~ msgid "argument 1 of __builtin_altivec_predicate is out of range" +#~ msgstr "argument 1 de « __builtin_altivec_predicate » est hors limite" + +#~ msgid "argument 3 must be a 4-bit unsigned literal" +#~ msgstr "argument 3 doit être un litéral non signé de 4 bits" + +#~ msgid "argument to `%s' must be a 2-bit unsigned literal" +#~ msgstr "argument de « %s » doit être un litéral non signé de 2 bits" + +#~ msgid "argument to dss must be a 2-bit unsigned literal" +#~ msgstr "argument de dss doit être un litéral non signé de 2 bits" + +#~ msgid "argument 1 of __builtin_spe_predicate must be a constant" +#~ msgstr "argument 1 de « __builtin_spe_predicate » doit être une constante" + +#~ msgid "argument 1 of __builtin_spe_predicate is out of range" +#~ msgstr "argument 1 de « __builtin_spe_predicate » est hors limite" + +#~ msgid "your function will be miscompiled" +#~ msgstr "votre fonction sera mal compilée" + +#~ msgid "invalid %%f value" +#~ msgstr "valeur %%f invalide" + +#~ msgid "invalid %%F value" +#~ msgstr "valeur %%F invalide" + +#~ msgid "invalid %%G value" +#~ msgstr "valeur %%G invalide" + +#~ msgid "invalid %%j code" +#~ msgstr "valeur %%j invalide" + +#~ msgid "invalid %%J code" +#~ msgstr "valeur %%J invalide" + +#~ msgid "invalid %%k value" +#~ msgstr "valeur %%k invalide" + +#~ msgid "invalid %%K value" +#~ msgstr "valeur %%K invalide" + +#~ msgid "invalid %%O value" +#~ msgstr "valeur %%O invalide" + +#~ msgid "invalid %%q value" +#~ msgstr "valeur %%q invalide" + +#~ msgid "invalid %%S value" +#~ msgstr "valeur %%S invalide" + +#~ msgid "invalid %%T value" +#~ msgstr "valeur %%T invalide" + +#~ msgid "invalid %%u value" +#~ msgstr "valeur %%u invalide" + +#~ msgid "invalid %%v value" +#~ msgstr "valeur %%v invalide" + +#~ msgid "no profiling of 64-bit code for this ABI" +#~ msgstr "pas de profilage du code de 64 bits pour cet ABI" + +#~ msgid "Always pass floating-point arguments in memory" +#~ msgstr "Toujours passer des arguments en virgule flottante en mémoire" + +#~ msgid "Don't always pass floating-point arguments in memory" +#~ msgstr "Na pas toujours passer des arguments en virgule flottante en mémoire" + +#~ msgid "Support message passing with the Parallel Environment" +#~ msgstr "Supporter le passage de messages dans un environnement parallèle" + +#~ msgid "Compile for 64-bit pointers" +#~ msgstr "Compiler pour des pointeurs de 64 bits" + +#~ msgid "Compile for 32-bit pointers" +#~ msgstr "Compiler pour des pointeurs de 32 bits" + +#~ msgid "-maix64 and POWER architecture are incompatible" +#~ msgstr "-maix64 et architecture POWER sont incompatibles" + +#~ msgid "-maix64 requires PowerPC64 architecture remain enabled" +#~ msgstr "-maix64 requiert une architecture PowerPC64 qui demeure sélectionnée" + +#~ msgid "-maix64 required: 64-bit computation with 32-bit addressing not yet supported" +#~ msgstr "-maix64 requis: calcul en 64 bits avec un adressage de 32 bits n'est pas encore supporté" + +#~ msgid "Generate code suitable for executables (NOT shared libs)" +#~ msgstr "Générer du code adapté pour les exécutables (PAS les librairies partagées)" + +#~ msgid "-mdynamic-no-pic overrides -fpic or -fPIC" +#~ msgstr "-mdynamic-no-pic écrase -fpic ou -fPIC" + +#~ msgid "-fpic is not supported; -fPIC assumed" +#~ msgstr "-fpic n'est pas supporté; -fPIC assumé" + +#~ msgid "-m64 requires a PowerPC64 cpu" +#~ msgstr "-m64 requiert un processeur PowerPC64" + +#~ msgid "Call mcount for profiling before a function prologue" +#~ msgstr "Appeller mcount pour le profilage avant le prologue de la fonction" + +#~ msgid "Call mcount for profiling after a function prologue" +#~ msgstr "Ne pas appeller mcount pour le profilage avant le prologue de la fonction" + +#~ msgid "Use POWER instruction set" +#~ msgstr "Utiliser le jeu d'instructions du POWER" + +#~ msgid "Use POWER2 instruction set" +#~ msgstr "Utiliser le jeu d'instructions du POWER2" + +#~ msgid "Do not use POWER2 instruction set" +#~ msgstr "Ne pas utiliser le jeu d'instructions du POWER2" + +#~ msgid "Do not use POWER instruction set" +#~ msgstr "Ne pas utiliser le jeu d'instructions du POWER" + +#~ msgid "Use PowerPC instruction set" +#~ msgstr "Utiliser le jeu d'instructions du PowerPC" + +#~ msgid "Do not use PowerPC instruction set" +#~ msgstr "Ne pas utiliser le jeu d'instructions du PowerPC" + +#~ msgid "Use PowerPC General Purpose group optional instructions" +#~ msgstr "Utiliser le groupe d'instructions optionnelles d'utilité général du PowerPC" + +#~ msgid "Do not use PowerPC General Purpose group optional instructions" +#~ msgstr "Ne pas utiliser le groupe d'instructions optionnelles d'usage général du PowerPC" + +#~ msgid "Use PowerPC Graphics group optional instructions" +#~ msgstr "Utiliser le groupe d'instructions graphiques optionnelles du PowerPC" + +#~ msgid "Do not use PowerPC Graphics group optional instructions" +#~ msgstr "Ne pas utiliser le groupe d'instructions optionnelles graphiques du PowerPC" + +#~ msgid "Use PowerPC-64 instruction set" +#~ msgstr "Utiliser le jeu d'instructions du PowerPC-64" + +#~ msgid "Do not use PowerPC-64 instruction set" +#~ msgstr "Ne pas utiliser le jeu d'instructions du PowerPC-64" + +#~ msgid "Use AltiVec instructions" +#~ msgstr "Utiliser les instructions AltiVec" + +#~ msgid "Do not use AltiVec instructions" +#~ msgstr "Ne pas utiliser les instructions AltiVec" + +#~ msgid "Use new mnemonics for PowerPC architecture" +#~ msgstr "Utiliser les nouvelles mnémoniques pour l'architecture du PowerPC" + +#~ msgid "Use old mnemonics for PowerPC architecture" +#~ msgstr "Utiliser les anciennes mnémoniques pour l'architecture du PowerPC" + +#~ msgid "Put everything in the regular TOC" +#~ msgstr "Place tout dans le TOC régulier" + +#~ msgid "Place floating point constants in TOC" +#~ msgstr "Placer les constantes en virgule flottante dans le TOC" + +#~ msgid "Do not place floating point constants in TOC" +#~ msgstr "Ne pas placer les constantes en virgule flottante dans le TOC" + +#~ msgid "Place symbol+offset constants in TOC" +#~ msgstr "Placer les constantes symboles+décalages dans le TOC" + +#~ msgid "Do not place symbol+offset constants in TOC" +#~ msgstr "Ne pas placer les constantes symboles+décalages dans le TOC" + +#~ msgid "Place variable addresses in the regular TOC" +#~ msgstr "Placer les adresses variables dans un TOC régulier" + +#~ msgid "Generate load/store multiple instructions" +#~ msgstr "Générer les instructions multiples de chargement/stockage" + +#~ msgid "Do not generate load/store multiple instructions" +#~ msgstr "Ne pas générer les instructions multiples de chargement/stockage" + +#~ msgid "Generate string instructions for block moves" +#~ msgstr "Générer les instructions chaînes pour les déplacements de blocs" + +#~ msgid "Do not generate string instructions for block moves" +#~ msgstr "Ne pas générer les instructions chaînes pour les déplacements de blocs" + +#~ msgid "Generate load/store with update instructions" +#~ msgstr "Générer les instructions de mise à jour de chargement/stockage" + +#~ msgid "Do not generate load/store with update instructions" +#~ msgstr "Ne pas générer les instructions de mise à jour de chargement/stockage" + +#~ msgid "Do not generate fused multiply/add instructions" +#~ msgstr "Ne pas générer des instructions fusionnés de multiplication/addition" + +#~ msgid "Do not schedule the start and end of the procedure" +#~ msgstr "Ne pas ordonnancer le début et la fin de la procédure" + +#~ msgid "Return all structures in memory (AIX default)" +#~ msgstr "Retourner toutes les structures en mémoire (par défaut sur AIX)" + +#~ msgid "Return small structures in registers (SVR4 default)" +#~ msgstr "Retourner les petites structures par les registres (par défaut sur SVR4)" + +#~ msgid "Generate single field mfcr instruction" +#~ msgstr "Générer des instructions à champ simple mfcr" + +#~ msgid "Do not generate single field mfcr instruction" +#~ msgstr "Ne pas générer des instructions à champ simple mfcr" + +#~ msgid "Use features of and schedule code for given CPU" +#~ msgstr "Utiliser les options et ordonnancer le code pour le processeur donné" + +#~ msgid "Enable debug output" +#~ msgstr "Autoriser la sortie lors de la mise au point" + +#~ msgid "Select full, part, or no traceback table" +#~ msgstr "Sélectionner « full », « part » ou « none »" + +#~ msgid "Specify ABI to use" +#~ msgstr "Spécifier l'ABI à utiliser" + +#~ msgid "Specify size of long double (64 or 128 bits)" +#~ msgstr "Spécifier la taille des long double (64 ou 128 bits)" + +#~ msgid "Specify yes/no if isel instructions should be generated" +#~ msgstr "Spécifier yes (pour oui)/ no (pour non) si les instruction isel doivent être générés" + +#~ msgid "Specify yes/no if SPE SIMD instructions should be generated" +#~ msgstr "Spécifier yes (pour oui) /no (pour non) si les instructions SPE SIMD doivent être générées" + +#~ msgid "Specify yes/no if using floating point in the GPRs" +#~ msgstr "Spécifier yes (pour oui) /no (pour non) si les nombres en virgule flottante sont utilisés dans le GPR" + +#~ msgid "Specify yes/no if VRSAVE instructions should be generated for AltiVec" +#~ msgstr "Spécifier yes (pour oui)/ no (pour non) si les instruction VRSAVE doivent être générés pour ALtiVec" + +#~ msgid "Avoid all range limits on call instructions" +#~ msgstr "Éviter toutes les limites sur les instructions d'appel" + +#~ msgid "Determine which dependences between insns are considered costly" +#~ msgstr "Déterminer laquelle des dépendances entre les insns qui sont considérées coûteuses" + +#~ msgid "Specify which post scheduling nop insertion scheme to apply" +#~ msgstr "Spécifier lequel schème de post ordonnancement d'insertion de NOP doit être appliqué" + +#~ msgid "Specify alignment of structure fields default/natural" +#~ msgstr "Spécifier l'alignement des champs de structure par défaut/naturel" + +#~ msgid "Specify scheduling priority for dispatch slot restricted insns" +#~ msgstr "Spécifier la priorité d'ordonnancement pour la répartition de fentes insns restreintes" + +#~ msgid "RETURN_ADDRESS_OFFSET not supported" +#~ msgstr "RETURN_ADDRESS_OFFSET n'est pas supporté" + +#~ msgid "Select ABI calling convention" +#~ msgstr "Sélectionner la convention d'appel ABI" + +#~ msgid "Select method for sdata handling" +#~ msgstr "Sélectionner la méthode de traitement sdata" + +#~ msgid "Align to the base type of the bit-field" +#~ msgstr "Aligner à la base du type du champ de bits" + +#~ msgid "Don't align to the base type of the bit-field" +#~ msgstr "Ne pas aligner à la base du type du champ de bits" + +#~ msgid "Don't assume that unaligned accesses are handled by the system" +#~ msgstr "Ne pas présumer que les accès non alignées sont traités par le système" + +#~ msgid "Assume that unaligned accesses are handled by the system" +#~ msgstr "Présumer que les accès non alignées sont traités par le système" + +#~ msgid "Produce code relocatable at runtime" +#~ msgstr "Produire du code relocalisable au moment de l'exécution" + +#~ msgid "Don't produce code relocatable at runtime" +#~ msgstr "Ne pas produire du code relocalisable au moment de l'exécution" + +#~ msgid "Produce little endian code" +#~ msgstr "Produire du code pour système à octets de poids faible (little endian)" + +#~ msgid "Produce big endian code" +#~ msgstr "Produire du code pour système à octets de poids fort (big endian)" + +#~ msgid "no description yet" +#~ msgstr "aucune description encore" + +#~ msgid "Use EABI" +#~ msgstr "Utiliser EABI" + +#~ msgid "Don't use EABI" +#~ msgstr "Ne pas utiliser EABI" + +#~ msgid "Do not allow bit-fields to cross word boundaries" +#~ msgstr "Ne pas permettre les champs de bits de traverser des frontières de mots" + +#~ msgid "Use alternate register names" +#~ msgstr "Utiliser les noms alternatifs de registres" + +#~ msgid "Don't use alternate register names" +#~ msgstr "Ne pas utiliser les noms alternatifs de registres" + +#~ msgid "Link with libsim.a, libc.a and sim-crt0.o" +#~ msgstr "Faire l'édition de liens avec libsim.a, libc.a et sim-crt0.o" + +#~ msgid "Link with libads.a, libc.a and crt0.o" +#~ msgstr "Faire l'édition de liens avec libads.a, libc.a and crt0.o" + +#~ msgid "Link with libyk.a, libc.a and crt0.o" +#~ msgstr "Faire l'édition de liens avec libyk.a, libc.a and crt0.o" + +#~ msgid "Link with libmvme.a, libc.a and crt0.o" +#~ msgstr "Faire l'édition de liens avec libmvme.a, libc.a and crt0.o" + +#~ msgid "Set the PPC_EMB bit in the ELF flags header" +#~ msgstr "Initialiser le bit PPC_EMB bit dans l'en-tête des fanions ELF" + +#~ msgid "Use the WindISS simulator" +#~ msgstr "Utiliser le simulateur WindISS" + +#~ msgid "Generate 64-bit code" +#~ msgstr "Générer du code 64 bits" + +#~ msgid "Generate 32-bit code" +#~ msgstr "Générer du code 32 bits" + +#~ msgid "bad value for -mcall-%s" +#~ msgstr "valeur erronée pour -mcall-%s" + +#~ msgid "bad value for -msdata=%s" +#~ msgstr "valeur erronée pour -msdata=%s" + +#~ msgid "-mrelocatable and -msdata=%s are incompatible" +#~ msgstr "-mrelocatable et -msdata=%s sont incompatibles" + +#~ msgid "-f%s and -msdata=%s are incompatible" +#~ msgstr "-f%s et -msdata=%s sont incompatibles" + +#~ msgid "-msdata=%s and -mcall-%s are incompatible" +#~ msgstr "-msdata=%s et -mcall-%s sont incompatibles" + +#~ msgid "-mrelocatable and -mno-minimal-toc are incompatible" +#~ msgstr "-mrelocatable et -mno-minimal-toc sont incompatibles" + +#~ msgid "-mrelocatable and -mcall-%s are incompatible" +#~ msgstr "-mrelocatable et -mcall-%s sont incompatibles" + +#~ msgid "-fPIC and -mcall-%s are incompatible" +#~ msgstr "-fPIC et -mcall-%s sont incompatibles" + +#~ msgid "-mcall-aixdesc must be big endian" +#~ msgstr "-mcall-aixdesc doit être pour un système à octets de poids fort" + +#~ msgid "-m%s not supported in this configuration" +#~ msgstr "-m%s n'est pas supporté par cette configuration" + +#~ msgid "Unknown cpu used in -march=%s." +#~ msgstr "Processeur inconnu utilisé dans -march=%s" + +#~ msgid "Unknown cpu used in -mtune=%s." +#~ msgstr "Processeur inconnu dans -mtune=%s" + +#~ msgid "z/Architecture mode not supported on %s." +#~ msgstr "z/mode d'architecture n'est pas supporté sur %s" + +#~ msgid "64-bit ABI not supported in ESA/390 mode." +#~ msgstr "ABI 64 bits n'est pas supporté en mode ESA/390" + +#~ msgid "invalid UNSPEC as operand (1)" +#~ msgstr "UNSPEC invalide comme opérande (1)" + +#~ msgid "invalid UNSPEC as operand (2)" +#~ msgstr "UNSPEC invalide comme opérande (2)" + +#~ msgid "UNKNOWN in s390_output_symbolic_const !?" +#~ msgstr "INCONNU dans s390_output_symbolic_const !?" + +#~ msgid "Cannot decompose address." +#~ msgstr "Ne pas décomposer l'adresse" + +#~ msgid "UNKNOWN in print_operand !?" +#~ msgstr "INCONNNU dans print_operand !?" + +#~ msgid "Total size of local variables exceeds architecture limit." +#~ msgstr "Taille totale des variables locales excède la limite de l'architecture" + +#~ msgid "Set backchain" +#~ msgstr "Fixer la chaîne arrière" + +#~ msgid "Don't set backchain (faster, but debug harder" +#~ msgstr "Ne pas fixer la chaîne arrière (plus rapide mais plus difficle à mettre au point)" + +#~ msgid "Use bras for executable < 64k" +#~ msgstr "Utiliser « bras » pour les exécutables < 64k" + +#~ msgid "Don't use bras" +#~ msgstr "Ne pas utiliser bras" + +#~ msgid "Additional debug prints" +#~ msgstr "Imprimer des informations additionnelles en mode débug" + +#~ msgid "Don't print additional debug prints" +#~ msgstr "Ne pas imprimer des informations additionnelles en mode débug" + +#~ msgid "64 bit ABI" +#~ msgstr "ABI de 64 bits" + +#~ msgid "31 bit ABI" +#~ msgstr "ABI de 64 bits" + +#~ msgid "z/Architecture" +#~ msgstr "z/Architecture" + +#~ msgid "ESA/390 architecture" +#~ msgstr "architecture ESA/390" + +#~ msgid "mvcle use" +#~ msgstr "mvcle utilisé" + +#~ msgid "mvc&ex" +#~ msgstr "mvc&ex" + +#~ msgid "enable tpf OS code" +#~ msgstr "autoriser le code OS tpf" + +#~ msgid "disable tpf OS code" +#~ msgstr "interdire le code OS tpf" + +#~ msgid "disable fused multiply/add instructions" +#~ msgstr "interdire les instructions fusionnés de multiplication/addition" + +#~ msgid "enable fused multiply/add instructions" +#~ msgstr "autoriser les instructions fusionnés de multiplication/addition" + +#~ msgid "__builtin_saveregs not supported by this subtarget" +#~ msgstr "__builtin_saveregs n'est pas supporté par la sous-cible" + +#~ msgid "attribute interrupt_handler is not compatible with -m5-compact" +#~ msgstr "attribut interrupt_handler n'est pas compatible avec -m5-compact" + +#~ msgid "`%s' attribute only applies to interrupt functions" +#~ msgstr "attribut « %s » s'applique seulement à des fonctions d'interruption" + +#~ msgid "`%s' attribute argument not a string constant" +#~ msgstr "l'attribut « %s » de l'argument n'est pas une contante chaîne" + +#~ msgid "`%s' attribute argument not an integer constant" +#~ msgstr "l'attribut « %s » de l'argument n'est pas une contante entière" + +#~ msgid "Profiling is not supported on this target." +#~ msgstr "le profilage n'est pas supporté sur cette cible" + +#~ msgid "%s is not supported by this configuration" +#~ msgstr "%s n'est pas supporté par cette configuration" + +#~ msgid "-mlong-double-64 not allowed with -m64" +#~ msgstr "-mlong-double-64 n'est pas permis avec -m64" + +#~ msgid "-mcmodel= is not supported on 32 bit systems" +#~ msgstr "-mcmodel= n'est pas supporté sur les systèmes de 32 bits" + +#~ msgid "invalid %%Y operand" +#~ msgstr "opérande %%Y invalide" + +#~ msgid "invalid %%A operand" +#~ msgstr "opérande %%A invalide" + +#~ msgid "invalid %%B operand" +#~ msgstr "Opérande %%B invalide" + +#~ msgid "invalid %%c operand" +#~ msgstr "opérande %%c invalide" + +#~ msgid "invalid %%C operand" +#~ msgstr "opérande %%C invalide" + +#~ msgid "invalid %%d operand" +#~ msgstr "opérande %%d invalide" + +#~ msgid "invalid %%D operand" +#~ msgstr "opérande %%D invalide" + +#~ msgid "invalid %%f operand" +#~ msgstr "opérande %%f invalide" + +#~ msgid "invalid %%s operand" +#~ msgstr "opérande %%s invalide" + +#~ msgid "long long constant not a valid immediate operand" +#~ msgstr "constante long long n'est pas une opérande immédiate valide" + +#~ msgid "floating point constant not a valid immediate operand" +#~ msgstr "constante en virgule flottante n'est pas une opérande immédiate valide" + +#~ msgid "Use 128 bit long doubles" +#~ msgstr "Utiliser des longs doubles de 128 bits" + +#~ msgid "Generate code for big endian" +#~ msgstr "Générer du code pour un système à octets de poids fort" + +#~ msgid "Generate code for little endian" +#~ msgstr "Générer du code pour un système à octets de poids faible" + +#~ msgid "Use little-endian byte order for data" +#~ msgstr "Utiliser l'ordre des octets de poids faible pour les données" + +#~ msgid "Assume possible double misalignment" +#~ msgstr "Présumer un possible mauvais alignement des doubles" + +#~ msgid "Assume all doubles are aligned" +#~ msgstr "Présumer que tous les doubles sont alignés" + +#~ msgid "Pass -assert pure-text to linker" +#~ msgstr "Passer -assert pure-text à l'éditeur de liens" + +#~ msgid "Do not pass -assert pure-text to linker" +#~ msgstr "Ne pas passer -assert pure-text à l'éditeur de liens" + +#~ msgid "Use flat register window model" +#~ msgstr "Utiliser le modèle de fenêtre de registre plat" + +#~ msgid "Do not use flat register window model" +#~ msgstr "Ne pas utiliser le modèle de fenêtre de registre plat" + +#~ msgid "Use ABI reserved registers" +#~ msgstr "Utiliser les registres réservés ABI" + +#~ msgid "Do not use ABI reserved registers" +#~ msgstr "Ne pas utiliser les registres réservés ABI" + +#~ msgid "Use hardware quad fp instructions" +#~ msgstr "Utiliser les instructions matérielles quad FP" + +#~ msgid "Do not use hardware quad fp instructions" +#~ msgstr "Ne pas utiliser les instructions matérielles quad FP" + +#~ msgid "Compile for v8plus ABI" +#~ msgstr "Compiler pour ABI v8plus" + +#~ msgid "Do not compile for v8plus ABI" +#~ msgstr "Ne pas compiler pour ABI v8plus" + +#~ msgid "Utilize Visual Instruction Set" +#~ msgstr "Utiliser le jeu d'instructions Visual" + +#~ msgid "Do not utilize Visual Instruction Set" +#~ msgstr "Ne pas utiliser le jeu d'instructions Visual" + +#~ msgid "Optimize for Cypress processors" +#~ msgstr "Optimiser pour les processeurs Cypress" + +#~ msgid "Optimize for SPARCLite processors" +#~ msgstr "Optimiser pour les processeurs SPARCLite" + +#~ msgid "Optimize for F930 processors" +#~ msgstr "Optimiser pour les processeurs F930" + +#~ msgid "Optimize for F934 processors" +#~ msgstr "Optimiser pour les processeurs F934" + +#~ msgid "Use V8 SPARC ISA" +#~ msgstr "Utiliser le V8 SPARC ISA" + +#~ msgid "Optimize for SuperSPARC processors" +#~ msgstr "Optimiser pour les processeurs SuperSPARC" + +#~ msgid "Pointers are 64-bit" +#~ msgstr "Pointeurs sont de 64 bits" + +#~ msgid "Pointers are 32-bit" +#~ msgstr "Pointeurs sont de 32 bits" + +#~ msgid "Use 32-bit ABI" +#~ msgstr "Utiliser ABI de 32 bits" + +#~ msgid "Use 64-bit ABI" +#~ msgstr "Utiliser ABI de 64 bits" + +#~ msgid "Use stack bias" +#~ msgstr "Utiliser le biais de la pile" + +#~ msgid "Do not use stack bias" +#~ msgstr "Ne pas utiliser le biais de la pile" + +#~ msgid "Use structs on stronger alignment for double-word copies" +#~ msgstr "Utiliser des structs avec alignement plus fort pour les copies de mots-doubles" + +#~ msgid "Do not use structs on stronger alignment for double-word copies" +#~ msgstr "Ne pas utiliser des structs avec alignement plus fort pour les copies de mots-doubles" + +#~ msgid "Optimize tail call instructions in assembler and linker" +#~ msgstr "Optimiser sur mesure les instructions d'appel avec l'assembleur et l'éditeur de liens" + +#~ msgid "Do not optimize tail call instructions in assembler or linker" +#~ msgstr "Ne pas optimiser sur mesure les instructions d'appel avec l'assembleur et l'éditeur de liens" + +#~ msgid "Use given SPARC code model" +#~ msgstr "Utiliser le modèle donné de code pour le SPARC" + +#~ msgid "Constant halfword load operand out of range." +#~ msgstr "chargement de l'opérande de la constante demi-mot est hors limite" + +#~ msgid "Constant arithmetic operand out of range." +#~ msgstr "opérande arithmétique de la constante est hors limite" + +#~ msgid "Local variable memory requirements exceed capacity." +#~ msgstr "La mémoire requise pour les variables locales excède la capacité disponible." + +#~ msgid "function_profiler support" +#~ msgstr "function_profiler supporté" + +#~ msgid "cannot use va_start in interrupt function" +#~ msgstr "ne peut utiliser va-start dans une fonction d'interruption" + +#~ msgid "`B' operand is not constant" +#~ msgstr "opérande « B » n'est pas une constante" + +#~ msgid "`B' operand has multiple bits set" +#~ msgstr "l'opérande « B » a de multiples jeux de bits" + +#~ msgid "`o' operand is not constant" +#~ msgstr "opérande « o » n'est pas une constante" + +#~ msgid "xstormy16_print_operand: unknown code" +#~ msgstr "xstormy16_print_operand: code inconnu" + +#~ msgid "switch statement of size %lu entries too large" +#~ msgstr "déclaration de switch de taille %lu entrée est trop grande" + +#~ msgid "#pragma GHS endXXXX found without previous startXXX" +#~ msgstr "#pragma GHS endXXXX repéré sans être précédé de startXXX" + +#~ msgid "#pragma GHS endXXX does not match previous startXXX" +#~ msgstr "#pragma GHS endXXX ne concorde pas avec le précédent startXXX" + +#~ msgid "cannot set interrupt attribute: no current function" +#~ msgstr "ne peut initialiser l'attribut d'interruption: aucune fonction courante" + +#~ msgid "cannot set interrupt attribute: no such identifier" +#~ msgstr "ne peut initialiser l'attribut d'interruption: pas de tel identificateur" + +#~ msgid "junk at end of #pragma ghs section" +#~ msgstr "rebut à la fin de la section #pragma ghs" + +#~ msgid "unrecognized section name \"%s\"" +#~ msgstr "nom de section non reconnue « %s »" + +#~ msgid "malformed #pragma ghs section" +#~ msgstr "sectin mal composée #pragma ghs" + +#~ msgid "junk at end of #pragma ghs interrupt" +#~ msgstr "rebut à la fin de l'interruption #pragma ghs" + +#~ msgid "junk at end of #pragma ghs starttda" +#~ msgstr "rebut à la fin de #pragma ghs starttda" + +#~ msgid "junk at end of #pragma ghs startsda" +#~ msgstr "rebut à la fin de #pragma ghs startsda" + +#~ msgid "junk at end of #pragma ghs startzda" +#~ msgstr "rebut à la fin de #pragma ghs startzda" + +#~ msgid "junk at end of #pragma ghs endtda" +#~ msgstr "rebut à la fin de #pragma ghs endtda" + +#~ msgid "junk at end of #pragma ghs endsda" +#~ msgstr "rebut à la fin de #pragma ghs endsda" + +#~ msgid "junk at end of #pragma ghs endzda" +#~ msgstr "rebut à la fin de #pragma ghs endzda" + +#~ msgid "%s=%s is not numeric" +#~ msgstr "%s=%s n'est pas numérique" + +#~ msgid "%s=%s is too large" +#~ msgstr "%s=%s est trop grand" + +#~ msgid "const_double_split got a bad insn:" +#~ msgstr "const_double_split a reçu un insn erroné:" + +#~ msgid "output_move_single:" +#~ msgstr "output_move_single:" + +#~ msgid "%Jdata area attributes cannot be specified for local variables" +#~ msgstr "%Jattribut de zone de donnéées ne peut être spécifié pour des variables locales" + +#~ msgid "%Jdata area of '%D' conflicts with previous declaration" +#~ msgstr "%Jzone de données de « %D » entre en conflit avec un déclaration précédente" + +#~ msgid "bogus JR construction: %d\n" +#~ msgstr "construction JR boggé: %d\n" + +#~ msgid "bad amount of stack space removal: %d" +#~ msgstr "taille erronée pour l'enlèvement d'espace de la pile: %d" + +#~ msgid "bogus JARL construction: %d\n" +#~ msgstr "construction JARL boggée: %d\n" + +#~ msgid "Bogus DISPOSE construction: %d\n" +#~ msgstr "construction DISPOSE boggé: %d\n" + +#~ msgid "Too much stack space to dispose of: %d" +#~ msgstr "Trop d'espace pour l'empilage pour la disposition de: %d" + +#~ msgid "Bogus PREPEARE construction: %d\n" +#~ msgstr "construction PREPEARE boggée: %d\n" + +#~ msgid "Too much stack space to prepare: %d" +#~ msgstr "Trop d'espace pour l'empilage pour la préparation: %d" + +#~ msgid "Support Green Hills ABI" +#~ msgstr "Supporter l'ABI Green Hills" + +#~ msgid "Prohibit PC relative function calls" +#~ msgstr "Interdire les appels relatifs de fonctions par le PC" + +#~ msgid "Reuse r30 on a per function basis" +#~ msgstr "Ré-utiliser R30 sur une base par fonction" + +#~ msgid "Use stubs for function prologues" +#~ msgstr "Utiliser des stubs pour les prologues de fonction" + +#~ msgid "Same as: -mep -mprolog-function" +#~ msgstr "Identique à: -mep -mprolog-function" + +#~ msgid "Enable backend debugging" +#~ msgstr "Autoriser la mise au point par la fin" + +#~ msgid "Compile for the v850 processor" +#~ msgstr "Compiler pour le processeur v850" + +#~ msgid "Compile for v850e1 processor" +#~ msgstr "Compiler pour le processeur v850e1" + +#~ msgid "Compile for v850e processor" +#~ msgstr "Compiler pour le processeur v850e" + +#~ msgid "Enable the use of the short load instructions" +#~ msgstr "Activer l'utilisation d'instructions courtes de chargement" + +#~ msgid "Do not use the callt instruction" +#~ msgstr "Ne pas utiliser l'instruction callt" + +#~ msgid "Do not use registers r2 and r5" +#~ msgstr "Ne pas utiliser les registres r2 et r5" + +#~ msgid "Enforce strict alignment" +#~ msgstr "Forcer l'alignement stricte" + +#~ msgid "Use 4 byte entries in switch tables" +#~ msgstr "Utiliser des entrées de 4 octets dans les tables de switch" + +#~ msgid "Set the max size of data eligible for the TDA area" +#~ msgstr "Initialiser la taille maximale des données éligibles pour la zone TDA" + +#~ msgid "Set the max size of data eligible for the SDA area" +#~ msgstr "Initialiser la taille maximale des données éligibles pour la zone SDA" + +#~ msgid "Set the max size of data eligible for the ZDA area" +#~ msgstr "Initialiser la taille maximale des données éligibles pour la zone ZDA" + +#~ msgid "boolean registers required for the floating-point option" +#~ msgstr "registres booléens requis pour l'option de virgule flottante" + +#~ msgid "-f%s is not supported with CONST16 instructions" +#~ msgstr "-f%s n'est pas supporté avec les instructions CONST16" + +#~ msgid "PIC is required but not supported with CONST16 instructions" +#~ msgstr "PIC est requis mais non supporté avec des instructions CONST16" + +#~ msgid "invalid %%D value" +#~ msgstr "valeur %%D invalide" + +#~ msgid "invalid mask" +#~ msgstr "masque invalide" + +#~ msgid "invalid %%x value" +#~ msgstr "valeur %%x invalide" + +#~ msgid "invalid %%d value" +#~ msgstr "valeur %%d invalide" + +#~ msgid "invalid %%t/%%b value" +#~ msgstr "valeur %%t/%%b invalide" + +#~ msgid "invalid address" +#~ msgstr "adresse invalide" + +#~ msgid "no register in address" +#~ msgstr "pas de registre dans l'adresse" + +#~ msgid "address offset not a constant" +#~ msgstr "décalage d'adresse n'est pas une constante" + +#~ msgid "only uninitialized variables can be placed in a .bss section" +#~ msgstr "seules les variables non initialisées peuvent être placées dans une section .bss" + +#~ msgid "Use CONST16 instruction to load constants" +#~ msgstr "Utiliser les instructions CONST16 pour charger les constantes" + +#~ msgid "Use PC-relative L32R instruction to load constants" +#~ msgstr "Utiliser les instructions L32R relatives au PC pour charger les constantes" + +#~ msgid "Disable fused multiply/add and multiply/subtract FP instructions" +#~ msgstr "Interdire les instructions fusionnés FP de multiplication/addition et de multiplication/soustraction" + +#~ msgid "Enable fused multiply/add and multiply/subtract FP instructions" +#~ msgstr "Permettre les instructions fusionnés FP de multiplication/addition et de multiplication/soustraction" + +#~ msgid "Intersperse literal pools with code in the text section" +#~ msgstr "Entrecouper les lots de litéraux avec le code dans la section texte" + +#~ msgid "Put literal pools in a separate literal section" +#~ msgstr "Placer les lots de litéraux dans des sections séparées de litéraux" + +#~ msgid "Automatically align branch targets to reduce branch penalties" +#~ msgstr "Aligner automatiquement les branchements cibles pour réduire les pénalités de branchement" + +#~ msgid "Do not automatically align branch targets" +#~ msgstr "Ne pas aligner automatiquement les branchements cibles pour réduire les pénalités de branchement" + +#~ msgid "Use indirect CALLXn instructions for large programs" +#~ msgstr "Utiliser les instructions indirectes CALLXn pour les grands programmes" + +#~ msgid "Use direct CALLn instructions for fast calls" +#~ msgstr "Utiliser les instructions directes CALLn pour des appels rapides" + +#~ msgid "missing argument to \"-%s\"" +#~ msgstr "argument manquant à « -%s »" + +#~ msgid "`-gnat' misspelled as `-gant'" +#~ msgstr "« -gnat » mal épellé comme « -gant »" + +#~ msgid "unable to call pointer to member function here" +#~ msgstr "incapable de faire l'appel avec le pointeur vers la fonction membre ici" + +#~ msgid "%s %D(%T, %T, %T) " +#~ msgstr "%s %D(%T, %T, %T) " + +#~ msgid "%s %D(%T, %T) " +#~ msgstr "%s %D(%T, %T) " + +#~ msgid "%s %D(%T) " +#~ msgstr "%s %D(%T) " + +#~ msgid "%s %T " +#~ msgstr "%s %T " + +#~ msgid "%J%s %+#D " +#~ msgstr "%J%s %+#D " + +#~ msgid "%J%s %+#D" +#~ msgstr "%J%s %+#D" + +#~ msgid "candidates are:" +#~ msgstr "candidats sont:" + +#~ msgid "conversion from `%T' to `%T' is ambiguous" +#~ msgstr "conversion de « %T » vers « %T » est ambiguë" + +#~ msgid "no matching function for call to `%D(%A)'" +#~ msgstr "pas de fonction concordante pour l'appel de « %D(%A) »" + +#~ msgid "call of overloaded `%D(%A)' is ambiguous" +#~ msgstr "appel du surchargé « %D(%A) » est ambiguë" + +#~ msgid "pointer-to-member function %E cannot be called without an object; consider using .* or ->*" +#~ msgstr "pointeur vers fonction membre %E ne peut être appelé sans un objet; utilisez .* ou ->*" + +#~ msgid "no match for call to `(%T) (%A)'" +#~ msgstr "pas de concordance pour l'appel de « (%T) (%A) »" + +#~ msgid "call of `(%T) (%A)' is ambiguous" +#~ msgstr "appel de « (%T) (%A) » est ambiguë" + +#~ msgid "%s for ternary 'operator?:' in '%E ? %E : %E'" +#~ msgstr "%s pour « operator?: » ternaire dans « %E ? %E : %E »" + +#~ msgid "%s for 'operator%s' in '%E%s'" +#~ msgstr "%s pour « operator%s » dans « %E%s »" + +#~ msgid "%s for 'operator[]' in '%E[%E]'" +#~ msgstr "%s pour « operator[] » dans « %E[%E] »" + +#~ msgid "%s for '%s' in '%s %E'" +#~ msgstr "%s pour « %s » dans « %s %E »" + +#~ msgid "%s for 'operator%s' in '%E %s %E'" +#~ msgstr "%s pour « operator%s » dans « %E %s %E »" + +#~ msgid "%s for 'operator%s' in '%s%E'" +#~ msgstr "%s pour « operator%s » dans « %s%E »" + +#~ msgid "ISO C++ forbids omitting the middle term of a ?: expression" +#~ msgstr "ISO C++ interdit l'omission du terme milieu de l'expression ?:" + +#~ msgid "`%E' has type `void' and is not a throw-expression" +#~ msgstr "« %E » a le type « void » et n'est pas une expression de retour de type throw" + +#~ msgid "operands to ?: have different types" +#~ msgstr "opérande vers ?: a différents types" + +#~ msgid "enumeral mismatch in conditional expression: `%T' vs `%T'" +#~ msgstr "non concordance de type énuméré dans l'expression conditionnelle: « %T » vs « %T »" + +#~ msgid "enumeral and non-enumeral type in conditional expression" +#~ msgstr "type énuméré et non énuméré dans l'expression conditionnelle" + +#~ msgid "no `%D(int)' declared for postfix `%s', trying prefix operator instead" +#~ msgstr "pas « %D(int) » déclaré pour le postfixe « %s », essaie avec l'oprateur préfixe à la place" + +#~ msgid "using synthesized `%#D' for copy assignment" +#~ msgstr "utilisation du synthétisé « %#D » pour l'affectaion par copie" + +#~ msgid " where cfront would use `%#D'" +#~ msgstr " où cfront utiliserait « %#D »" + +#~ msgid "comparison between `%#T' and `%#T'" +#~ msgstr "comparaison entre « %#T » et « %#T »" + +#~ msgid "no suitable `operator %s' for `%T'" +#~ msgstr "pas « operator %s » adapté pour « %T »" + +#~ msgid "`%+#D' is private" +#~ msgstr "« %+#D » est privé" + +#~ msgid "`%+#D' is protected" +#~ msgstr "« %+#D » est protégé" + +#~ msgid "`%+#D' is inaccessible" +#~ msgstr "« %+#D » et inaccessible" + +#~ msgid "within this context" +#~ msgstr "à l'intérieur du contexte" + +#~ msgid "invalid conversion from `%T' to `%T'" +#~ msgstr "conversion invalide de « %T » vers « %T »" + +#~ msgid " initializing argument %P of `%D'" +#~ msgstr " initialisation de l'argument %P de « %D »" + +#~ msgid "cannot bind bitfield `%E' to `%T'" +#~ msgstr "ne peut lier le champ de bits « %E » avec « %T »" + +#~ msgid "cannot bind packed field `%E' to `%T'" +#~ msgstr "ne peut lier le champs empaqueté « %E » avec « %T »" + +#~ msgid "cannot bind rvalue `%E' to `%T'" +#~ msgstr "ne peut lier la rvalue « %E » avec « %T »" + +#~ msgid "cannot pass objects of non-POD type `%#T' through `...'; call will abort at runtime" +#~ msgstr "ne peut recevoir d'objets de type non POD « %#T » through « ... »; l'appel échouera lors de l'éxecution" + +#~ msgid "cannot receive objects of non-POD type `%#T' through `...'; call will abort at runtime" +#~ msgstr "ne peut recevoir d'objets de type non POD « %#T » through « ... »; l'appel échouera lors de l'éxecution" + +#~ msgid "the default argument for parameter %d of `%D' has not yet been parsed" +#~ msgstr "argument par défaut pour le paramètre %d de « %D » n'a pas encore été analysé" + +#~ msgid "passing `%T' as `this' argument of `%#D' discards qualifiers" +#~ msgstr "passant « %T» comme «cet» argument de « %#D » écarte les qualificateurs" + +#~ msgid "`%T' is not an accessible base of `%T'" +#~ msgstr "« %T » est une base accessible de « %T »" + +#~ msgid "could not find class$ field in java interface type `%T'" +#~ msgstr "ne peut repérer le champ classe$ dans le type d'interface JAVA « %T »" + +#~ msgid "call to non-function `%D'" +#~ msgstr "appel à une non fonction « %D »" + +#~ msgid "request for member `%D' in `%E', which is of non-aggregate type `%T'" +#~ msgstr "requête du membre « %D » dans « %E », lequel n'est pas de type aggrégat « %T »" + +#~ msgid "no matching function for call to `%T::%s(%A)%#V'" +#~ msgstr "pas de fonction concordante pour l'appel à « %T::%s(%A)%#V »" + +#~ msgid "call of overloaded `%s(%A)' is ambiguous" +#~ msgstr "appel du surchargé « %s(%A) » est ambiguë" + +#~ msgid "cannot call member function `%D' without object" +#~ msgstr "ne peut appeler la fonction membre « %D » sans objet" + +#~ msgid "passing `%T' chooses `%T' over `%T'" +#~ msgstr "passant « %T » à choisit « %T » au lieu de « %T »" + +#~ msgid " in call to `%D'" +#~ msgstr " dans l'appel de « %D »" + +#~ msgid "choosing `%D' over `%D'" +#~ msgstr "choix de « %D » à la place de « %D »" + +#~ msgid " for conversion from `%T' to `%T'" +#~ msgstr " pour la conversion de « %T » vers « %T »" + +#~ msgid " because conversion sequence for the argument is better" +#~ msgstr " parce que la séquence de conversion pour l'argument est meilleure" + +#~ msgid "ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second:" +#~ msgstr "ISO C++ indique qu'ils sont ambiguës même à travers la plus mauvaise conversion pour le premier que la plus mauvaise pour la seconde:" + +#~ msgid "candidate 1:" +#~ msgstr "candidat 1:" + +#~ msgid "candidate 2:" +#~ msgstr "candidat 2:" + +#~ msgid "could not convert `%E' to `%T'" +#~ msgstr "ne peut convertir « %E » vers « %T »" + +#~ msgid "invalid initialization of non-const reference of type '%T' from a temporary of type '%T'" +#~ msgstr "initialisation invalide pour une référence à un non constante de type « %T » à partir d'un type temporaire de type « %T »" + +#~ msgid "invalid initialization of reference of type '%T' from expression of type '%T'" +#~ msgstr "initialisation invalide de référence d'un type « %T » à partir d'une expression de type « %T »" + +#~ msgid "cannot convert from base `%T' to derived type `%T' via virtual base `%T'" +#~ msgstr "ne peut convertir de la base « %T » à un type dérivé « %T » via la base virtuel « %T »" + +#~ msgid "Java class '%T' cannot have an implicit non-trivial destructor" +#~ msgstr "classe Java « %T » ne peut avoir un destructeur implicite non trivial" + +#~ msgid "Java class '%T' cannot have a destructor" +#~ msgstr "classe Java « %T » ne peut avoir un destructeur" + +#~ msgid "`%#D' and `%#D' cannot be overloaded" +#~ msgstr "« %#D » et « %#D » ne peut être surchargé" + +#~ msgid "conflicting access specifications for method `%D', ignored" +#~ msgstr "spécifications d'accès conflictuelles pour la méthode « %D », ignoré" + +#~ msgid "conflicting access specifications for field `%s', ignored" +#~ msgstr "spécifications d'accès conflictuelles pour le champ « %s », ignoré" + +#~ msgid "`%D' names constructor" +#~ msgstr "« %D » nomme le constructeur" + +#~ msgid "`%D' invalid in `%T'" +#~ msgstr "« %D » invalide dans « %T »" + +#~ msgid "no members matching `%D' in `%#T'" +#~ msgstr "aucun membre concordant « %D » dans « %#T »" + +#~ msgid "`%D' invalid in `%#T'" +#~ msgstr "« %D » invalide dans « %#T »" + +#~ msgid " because of local method `%#D' with same name" +#~ msgstr " parce que la méthode locale « %#D » a le même nom" + +#~ msgid " because of local member `%#D' with same name" +#~ msgstr " parce que le membre local « %#D » a le même nom" + +#~ msgid "base class `%#T' has a non-virtual destructor" +#~ msgstr "classe de base « %#T » a un destructeur non virtuel" + +#~ msgid "base `%T' with only non-default constructor in class without a constructor" +#~ msgstr "base « %T » avec seulement le constructeur non par défaut dans la classe sans un constructeur" + +#~ msgid "all member functions in class `%T' are private" +#~ msgstr "toutes les fonctions membres de la classe « %T » sont privés" + +#~ msgid "`%#T' only defines a private destructor and has no friends" +#~ msgstr "« %#T » définit seulement les constructeurs privés et n'a pas d'amis" + +#~ msgid "`%#T' only defines private constructors and has no friends" +#~ msgstr "« %#T » définit seulement les constructeurs privés et n'a pas d'amis" + +#~ msgid "no unique final overrider for `%D' in `%T'" +#~ msgstr "pas d'écraseur unique final pour « %D » dans « %T »" + +#~ msgid "`%D' was hidden" +#~ msgstr "« %D » était caché" + +#~ msgid " by `%D'" +#~ msgstr " par « %D »" + +#~ msgid "`%#D' invalid; an anonymous union can only have non-static data members" +#~ msgstr "« %#D » invalide; une union anonyme peut seulement avoir des données non statiques de membres" + +#~ msgid "private member `%#D' in anonymous union" +#~ msgstr "membre privé « %#D » dans une union anonyme" + +#~ msgid "protected member `%#D' in anonymous union" +#~ msgstr "membre protégé « %#D » dans une union anonyme" + +#~ msgid "vtable layout for class `%T' may not be ABI-compliant and may change in a future version of GCC due to implicit virtual destructor" +#~ msgstr "disposition vtable pour la classe « %T » peut ne pas être compatible avec l'ABI et peut être modifié dans une version future deGCC en raison d'un destructeur virtuel implicite" + +#~ msgid "bit-field `%#D' with non-integral type" +#~ msgstr "largeur du champ de bits « %#D » n'est pas une constante entière" + +#~ msgid "bit-field `%D' width not an integer constant" +#~ msgstr "largeur du champ de bits « %D » n'est pas une constante entière" + +#~ msgid "negative width in bit-field `%D'" +#~ msgstr "largeur négative du champ de bits « %D »" + +#~ msgid "zero width for bit-field `%D'" +#~ msgstr "largeur zéro pour le champ de bits « %D »" + +#~ msgid "width of `%D' exceeds its type" +#~ msgstr "largeur de « %D » excède son type" + +#~ msgid "`%D' is too small to hold all values of `%#T'" +#~ msgstr "« %D » est trop petit pour contenir toutes les valeurs de « %#T »" + +#~ msgid "member `%#D' with constructor not allowed in union" +#~ msgstr "membre « %#D » avec consructeur n'est pas permis dans l'union" + +#~ msgid "member `%#D' with destructor not allowed in union" +#~ msgstr "membre « %#D » avec destructeur n'est pas permis dans l'union" + +#~ msgid "member `%#D' with copy assignment operator not allowed in union" +#~ msgstr "membre « %#D » avec opérateur d,affectation par copie n'st pas permis dans l'union" + +#~ msgid "multiple fields in union `%T' initialized" +#~ msgstr "champs multiples dans l'union « %T » initialisés" + +#~ msgid "ignoring packed attribute on unpacked non-POD field `%#D'" +#~ msgstr "attribut empaqueté ignoré sur un champ non POD non paqueté « %#D »" + +#~ msgid "`%D' may not be static because it is a member of a union" +#~ msgstr "« %D » peut ne pas être statique parce qu'il est membre de l'uniont" + +#~ msgid "`%D' may not have reference type `%T' because it is a member of a union" +#~ msgstr "« %D » peut ne pas avoir de type référencé « %T » parce qu'il est membre de l'union" + +#~ msgid "field `%D' in local class cannot be static" +#~ msgstr "champ « %D » dans une classe locale ne peut être statique" + +#~ msgid "field `%D' invalidly declared function type" +#~ msgstr "champ « %D » incorrectement validé comme un type de fonction" + +#~ msgid "field `%D' invalidly declared method type" +#~ msgstr "champ « %D » incorrectement validé comme un type de méthode" + +#~ msgid "non-static reference `%#D' in class without a constructor" +#~ msgstr "référence non statique « %#D » dans la classe sans un constructeur" + +#~ msgid "non-static const member `%#D' in class without a constructor" +#~ msgstr "constante non statique de membre « %#D » dans la classe sans un constructeur" + +#~ msgid "field `%#D' with same name as class" +#~ msgstr "champ « %#D » avec le même nom qu'une classe" + +#~ msgid "`%#T' has pointer data members" +#~ msgstr "« %#T » a un pointeur vers un membre de données" + +#~ msgid " but does not override `%T(const %T&)'" +#~ msgstr " mais n'écrase pas « %T(const %T&) »" + +#~ msgid " or `operator=(const %T&)'" +#~ msgstr " ou « operator=(const %T&) »" + +#~ msgid " but does not override `operator=(const %T&)'" +#~ msgstr " mais n'écrase pas « operator=(const %T&) »" + +#~ msgid "offset of empty base `%T' may not be ABI-compliant and maychange in a future version of GCC" +#~ msgstr "décalage d'une base vide « %T » peut ne pas être compatible avec l'ABI et peut être modifié dans une version future de GCC" + +#~ msgid "class `%T' will be considered nearly empty in a future version of GCC" +#~ msgstr "classe « %T » devra être considérée pratiquement vide dans une version future de GCC" + +#~ msgid "initializer specified for non-virtual method `%D'" +#~ msgstr "initialisation spécifiée pour une méthode non virtuelle « %D »" + +#~ msgid "offset of virtual base `%T' is not ABI-compliant and may change in a future version of GCC" +#~ msgstr "décalage relatif d'une base virtuelle « %T » n'est pas compatible avec l'ABI et peut être modifié dans une version future de GCC" + +#~ msgid "direct base `%T' inaccessible in `%T' due to ambiguity" +#~ msgstr "base directe « %T » inaccessible dans « %T » en raison de l'ambiguité" + +#~ msgid "virtual base `%T' inaccessible in `%T' due to ambiguity" +#~ msgstr "base virtuelle « %T » inaccessible dans « %T » en raison de l'ambiguité" + +#~ msgid "size assigned to `%T' may not be ABI-compliant and may change in a future version of GCC" +#~ msgstr "taille assignée à « %T » peut ne pas être compatible avec l'ABI et peut être modifié dans une version future de GCC" + +#~ msgid "the offset of `%D' may not be ABI-compliant and may change in a future version of GCC" +#~ msgstr "le décalage relatif de « %D » peut ne pas être compatible avec l'ABI et peut être modifié dans une version future de GCC" + +#~ msgid "offset of `%D' is not ABI-compliant and may change in a future version of GCC" +#~ msgstr "le décalage relatif de « %D » peut ne pas être compatible avec l'ABI et peut être modifié dans une version future de GCC" + +#~ msgid "`%D' contains empty classes which may cause base classes to be placed at different locations in a future version of GCC" +#~ msgstr "« %D » contient des classes vides lesquelles peuvent placer les classes de base à une localisation différente dans une version future de GCC" + +#~ msgid "layout of classes derived from empty class `%T' may change in a future version of GCC" +#~ msgstr "disposition des classes est dérivés de la classe vide « %T » peut être modifiée dans une version future de GCC" + +#~ msgid "redefinition of `%#T'" +#~ msgstr "redéfinition de « %#T »" + +#~ msgid "`%#T' has virtual functions but non-virtual destructor" +#~ msgstr "« %#T » a des fonctions virtuelles mais un destructeur non virtuel" + +#~ msgid "trying to finish struct, but kicked out due to previous parse errors" +#~ msgstr "tentative de complétion du struct, mais a été stoppé en raison d'erreurs précédentes d'analyses syntaxiques" + +#~ msgid "language string `\"%s\"' not recognized" +#~ msgstr "chaîne du langage « \"%s\" » n'est pas reconnue" + +#~ msgid "cannot resolve overloaded function `%D' based on conversion to type `%T'" +#~ msgstr "ne peut résoudre la fonction surchargé « %D » basé sur la conversion vers le type « %T »" + +#~ msgid "no matches converting function `%D' to type `%#T'" +#~ msgstr "pas de concordance de conversion de fonction « %D » vers le type « %#T »" + +#~ msgid "converting overloaded function `%D' to type `%#T' is ambiguous" +#~ msgstr "conversion d'une fonction surchargée « %D » vers le type « %#T » est ambiguë" + +#~ msgid "assuming pointer to member `%D'" +#~ msgstr "pointeur assumé vers le membre « %D »" + +#~ msgid "(a pointer to member can only be formed with `&%E')" +#~ msgstr "(un pointeur vers un membre peut seulement être formé avec «&%E»)" + +#~ msgid "not enough type information" +#~ msgstr "pas assez d'information sur le type" + +#~ msgid "argument of type `%T' does not match `%T'" +#~ msgstr "argument de type « %T » ne concorde pas avec « %T »" + +#~ msgid "invalid operation on uninstantiated type" +#~ msgstr "opération invalide sur un type non instancié" + +#~ msgid "declaration of `%#D'" +#~ msgstr "déclaration de « %#D »" + +#~ msgid "changes meaning of `%D' from `%+#D'" +#~ msgstr "changements signifiant de « %D » à partir de « %+#D »" + +#~ msgid "inter-module optimisations not implemented yet" +#~ msgstr "les optimisations inter-module n'est pas implanté encore" + +#~ msgid "can't convert from incomplete type `%T' to `%T'" +#~ msgstr "ne peut convertir d'un type incomplet « %T » vers « %T »" + +#~ msgid "conversion of `%E' from `%T' to `%T' is ambiguous" +#~ msgstr "conversion de « %E » à partir de « %T » vers « %T » est ambiguë" + +#~ msgid "converting from `%T' to `%T'" +#~ msgstr "conversion de « %T » vers « %T »" + +#~ msgid "cannot convert `%E' from type `%T' to type `%T'" +#~ msgstr "ne peut convertir « %E » du type « %T » vers le type « %T »" + +#~ msgid "pointer to member cast from `%T' to `%T' is via virtual base" +#~ msgstr "pointeur vers un membre transtypé de « %T » à « %T » est fait via une base virtuelle" + +#~ msgid "invalid conversion from '%T' to '%T'" +#~ msgstr "conversion invalide de « %T » vers « %T »" + +#~ msgid "conversion from `%T' to `%T' discards qualifiers" +#~ msgstr "conversion de « %T » à « %T » écarte les qualificateurs" + +#~ msgid "casting `%T' to `%T' does not dereference pointer" +#~ msgstr "transtypage de « %T » vers « %T » ne fait pas de dé-référence de pointeur" + +#~ msgid "cannot convert type `%T' to type `%T'" +#~ msgstr "ne peut convertir type « %T » vers le type « %T »" + +#~ msgid "conversion from `%#T' to `%#T'" +#~ msgstr "conversion de « %#T » vers « %#T »" + +#~ msgid "`%#T' used where a `%T' was expected" +#~ msgstr "« %#T » utilisé où « %T » était attendu" + +#~ msgid "`%#T' used where a floating point value was expected" +#~ msgstr "« %#T » utilisé où un nombre flottant était attendu" + +#~ msgid "conversion from `%T' to non-scalar type `%T' requested" +#~ msgstr "conversion de « %T » vers un type non scalaire « %T » demandée" + +#~ msgid "object of incomplete type `%T' will not be accessed in %s" +#~ msgstr "objet de type incomplet « %T » ne sera pas accessible dans %s" + +#~ msgid "object of type `%T' will not be accessed in %s" +#~ msgstr "objet de type « %T » ne sera pas acccessible dans %s" + +#~ msgid "object `%E' of incomplete type `%T' will not be accessed in %s" +#~ msgstr "objet « %E » d'un type incomplet « %T » ne sera pas accessible dans %s" + +#~ msgid "%s cannot resolve address of overloaded function" +#~ msgstr "%s ne peut résoudre l'adresse la fonction surchargée" + +#~ msgid "%s is a reference, not call, to function `%E'" +#~ msgstr "%s est un référence, pas un appel, à la fonction « %E »" + +#~ msgid "%s has no effect" +#~ msgstr "%s n'a pas d'effet" + +#~ msgid "converting NULL to non-pointer type" +#~ msgstr "conversion d'un NULL vers un type non pointeur" + +#~ msgid "ambiguous default type conversion from `%T'" +#~ msgstr "conversion de type par défaut ambiguë à partir de « %T »" + +#~ msgid " candidate conversions include `%D' and `%D'" +#~ msgstr " conversions de candidat inclut « %D » et « %D »" + +#~ msgid "label `%D' used but not defined" +#~ msgstr "étiquette « %D » utilisée mais non définie" + +#~ msgid "label `%D' defined but not used" +#~ msgstr "étiquette « %D » définie mais non utilisée" + +#~ msgid "previous declaration of `%D'" +#~ msgstr "déclaration précédente de « %D »" + +#~ msgid "%Jfunction '%D' redeclared as inline" +#~ msgstr "%Jfonction « %D » redéclarée comme étant enligne" + +#~ msgid "%Jprevious declaration of '%D' with attribute noinline" +#~ msgstr "%Jdéclaration précédente de « %D » avec l'attribut non enligne" + +#~ msgid "%Jfunction '%D' redeclared with attribute noinline" +#~ msgstr "%Jfonction « %D » redéclarée avec l'attribut non enligne" + +#~ msgid "%Jprevious declaration of '%D' was inline" +#~ msgstr "%Jdéclaration précédente de « %D » était enligne" + +#~ msgid "shadowing %s function `%#D'" +#~ msgstr "%s masque la fonction « %#D »" + +#~ msgid "library function `%#D' redeclared as non-function `%#D'" +#~ msgstr "fonction « %#D » de la bibliothèque redéclarée comme n'étant pas une fonction « %#D »" + +#~ msgid "conflicts with built-in declaration `%#D'" +#~ msgstr "conflits avec la déclaration interne de « %#D »" + +#~ msgid "new declaration `%#D'" +#~ msgstr "nouvelle déclaration de « %#D »" + +#~ msgid "ambiguates built-in declaration `%#D'" +#~ msgstr "ambiguités de la déclaration interne de « %#D »" + +#~ msgid "`%#D' redeclared as different kind of symbol" +#~ msgstr "« %#D » redéclaré comme une sorte différente de symbole" + +#~ msgid "previous declaration of `%#D'" +#~ msgstr "déclaration précédente de « %#D »" + +#~ msgid "declaration of template `%#D'" +#~ msgstr "déclaration du canevas « %#D »" + +#~ msgid "conflicts with previous declaration `%#D'" +#~ msgstr "conflits avec la déclaration précédente de « %#D »" + +#~ msgid "ambiguates old declaration `%#D'" +#~ msgstr "ambiguités d'une vieille déclaration de « %#D »" + +#~ msgid "declaration of C function `%#D' conflicts with" +#~ msgstr "déclaration de la fonction C « %#D » en conflit avec" + +#~ msgid "previous declaration `%#D' here" +#~ msgstr "déclaration précédente de « %#D » ici" + +#~ msgid "conflicting declaration '%#D'" +#~ msgstr "déclaration conflictuelle « %#D »" + +#~ msgid "'%D' has a previous declaration as `%#D'" +#~ msgstr "« %D » a une déclaration précédente tel que « %#D »" + +#~ msgid "`%#D' previously defined here" +#~ msgstr "« %#D » précédemment défini ici" + +#~ msgid "`%#D' previously declared here" +#~ msgstr "« %#D » précédemment déclaré ici" + +#~ msgid "prototype for `%#D'" +#~ msgstr "prototype de « %#D »" + +#~ msgid "%Jfollows non-prototype definition here" +#~ msgstr "%Jsuit la définition d'un non prototype ici" + +#~ msgid "previous declaration of `%#D' with %L linkage" +#~ msgstr "déclaration précédente de « %#D » avec le lien %L" + +#~ msgid "conflicts with new declaration with %L linkage" +#~ msgstr "conflits avec la nouvelle déclaration avec le lien %L" + +#~ msgid "default argument given for parameter %d of `%#D'" +#~ msgstr "argument par défaut donné pour le paramètre %d de « %#D »" + +#~ msgid "after previous specification in `%#D'" +#~ msgstr "après la déclaration précédente dans « %#D »" + +#~ msgid "`%#D' was used before it was declared inline" +#~ msgstr "« %#D » a été utilisé avant qu'il ne soit déclaré enligne" + +#~ msgid "%Jprevious non-inline declaration here" +#~ msgstr "%Jdéclaration précédente non enligne ici" + +#~ msgid "redundant redeclaration of `%D' in same scope" +#~ msgstr "déclaration redondante de « %D » dans la même étendue" + +#~ msgid "declaration of `%F' throws different exceptions" +#~ msgstr "déclaration de « %F » amène différentes exceptions" + +#~ msgid "than previous declaration `%F'" +#~ msgstr "qu'une précédente déclaratio « %F »" + +#~ msgid "explicit specialization of %D after first use" +#~ msgstr "spécialisation explicite de %D après la première utilisation" + +#~ msgid "%J'%D': visibility attribute ignored because it" +#~ msgstr "%J« %D »: attribut de visibilité ignoré en cause de lui" + +#~ msgid "%Jconflicts with previous declaration here" +#~ msgstr "%Jentre en conflit avec la déclaration précédente ici" + +#~ msgid "implicit declaration of function `%#D'" +#~ msgstr "déclaration implicite de la fonction « %#D »" + +#~ msgid "label `%s' referenced outside of any function" +#~ msgstr "étiquette « %s » référencée à l'extérieur de n'importe quelle fonction" + +#~ msgid "jump to label `%D'" +#~ msgstr "saut à l'étiquette « %D »" + +#~ msgid "jump to case label" +#~ msgstr "saut à l'étiquette du « case »" + +#~ msgid "%H from here" +#~ msgstr "%H à partir d'ici" + +#~ msgid " crosses initialization of `%#D'" +#~ msgstr " initialisation croisée pour « %#D »" + +#~ msgid " enters scope of non-POD `%#D'" +#~ msgstr " entre dans la porté d'un non POD « %#D »" + +#~ msgid " enters try block" +#~ msgstr " entre dans le bloc d'essais" + +#~ msgid " enters catch block" +#~ msgstr " entre dans le bloc d'interceptions" + +#~ msgid " from here" +#~ msgstr " à partir d'ici" + +#~ msgid "%J enters catch block" +#~ msgstr "%J entre dans le bloc d'interception" + +#~ msgid " skips initialization of `%#D'" +#~ msgstr " saut d'initialisation pour « %#D »" + +#~ msgid "label named wchar_t" +#~ msgstr "étiquette nommée wchar_t" + +#~ msgid "duplicate label `%D'" +#~ msgstr "étiquette « %D » apparaît en double" + +#~ msgid "`%D' used without template parameters" +#~ msgstr "« %D » utilisé sans canevas de paramétres" + +#~ msgid "no class template named `%#T' in `%#T'" +#~ msgstr "pas de canevas de classe nommé « %#T » in « %#T »" + +#~ msgid "no type named `%#T' in `%#T'" +#~ msgstr "pas de type nommé dans « %#T » dans « %#T »" + +#~ msgid "%Jan anonymous union cannot have function members" +#~ msgstr "%Jun UNION anonyme ne peut avoir de fonctions membres" + +#~ msgid "member %#D' with constructor not allowed in anonymous aggregate" +#~ msgstr "membre « %#D » avec constructeur n'est pas permis dans un aggrégat anonyme" + +#~ msgid "member %#D' with destructor not allowed in anonymous aggregate" +#~ msgstr "membre « %#D » avec destructeur n'est pas permis dans un aggrégat anonyme" + +#~ msgid "member %#D' with copy assignment operator not allowed in anonymous aggregate" +#~ msgstr "membre « %#D » avec opérateur d'affectation par copie n'est pas permis dans un aggrégat anonyme" + +#~ msgid "redeclaration of C++ built-in type `%T'" +#~ msgstr "redéclaration du type interne C++ « %T »" + +#~ msgid "multiple types in one declaration" +#~ msgstr "types multiples dans une déclaration" + +#~ msgid "missing type-name in typedef-declaration" +#~ msgstr "nom de type manquant dans la déclaration typedef" + +#~ msgid "ISO C++ prohibits anonymous structs" +#~ msgstr "ISO C++ interdit les structures anonymes" + +#~ msgid "`%D' can only be specified for functions" +#~ msgstr "« %D » ne peut seulement être spécifier pour les fonctions" + +#~ msgid "`%D' can only be specified inside a class" +#~ msgstr "« %D » peut seulement être spécifié à l'intérieur d'une classe" + +#~ msgid "`%D' can only be specified for constructors" +#~ msgstr "« %D » ne peut seulement être spécifié pour les constructeurs" + +#~ msgid "`%D' can only be specified for objects and functions" +#~ msgstr "« %D » ne peut seulement être spécifié pour les objets et les fonctions" + +#~ msgid "typedef `%D' is initialized (use __typeof__ instead)" +#~ msgstr "typedef « %D » est initialisé (use __typeof__ instead)" + +#~ msgid "function `%#D' is initialized like a variable" +#~ msgstr "fonction « %#D » est initialisée comme une variable" + +#~ msgid "declaration of `%#D' has `extern' and is initialized" +#~ msgstr "déclaration de « %#D » est externe et initialisé" + +#~ msgid "`%#D' is not a static member of `%#T'" +#~ msgstr "« %#D » n'est pas un membre statique de « %#T »" + +#~ msgid "ISO C++ does not permit `%T::%D' to be defined as `%T::%D'" +#~ msgstr "ISO C++ ne permet pas que « %T::%D » soit défini comme « %T::%D »" + +#~ msgid "duplicate initialization of %D" +#~ msgstr "initialisation en double de %D" + +#~ msgid "declaration of `%#D' outside of class is not definition" +#~ msgstr "déclaraion de « %#D » en dehors de la classe n'est pas une définition" + +#~ msgid "variable `%#D' has initializer but incomplete type" +#~ msgstr "la variable « %#D » est initialisée, mais a un type incomplet" + +#~ msgid "elements of array `%#D' have incomplete type" +#~ msgstr "éléments du tableau « %#D » ont un type incomplet" + +#~ msgid "aggregate `%#D' has incomplete type and cannot be defined" +#~ msgstr "aggrégat « %#D » a un type incomplet et ne peut être défini" + +#~ msgid "`%D' declared as reference but not initialized" +#~ msgstr "« %D » déclaré comme référence mais n'est pas initialisé" + +#~ msgid "ISO C++ forbids use of initializer list to initialize reference `%D'" +#~ msgstr "ISO C++ interdit l'usage de liste d'initialiseur pour initialiser la référence « %D »" + +#~ msgid "cannot initialize `%T' from `%T'" +#~ msgstr "ne peut initialiser « %T » à partir de « %T »" + +#~ msgid "initializer fails to determine size of `%D'" +#~ msgstr "l'initialisation n'a pu déterminer la taille de « %D »" + +#~ msgid "array size missing in `%D'" +#~ msgstr "taille de tableau manquante dans « %D »" + +#~ msgid "zero-size array `%D'" +#~ msgstr "tableau « %D » de taille zéro" + +#~ msgid "storage size of `%D' isn't known" +#~ msgstr "taille de stockage de « %D » n'est pas connue" + +#~ msgid "storage size of `%D' isn't constant" +#~ msgstr "taille de stockage de « %D » n'est pas une constante" + +#~ msgid "sorry: semantics of inline function static data `%#D' are wrong (you'll wind up with multiple copies)" +#~ msgstr "désolé: sémantique de fonction enligne de données statiques « %#D » est erronée (vous obtiendrez de multiples copies)" + +#~ msgid "%J you can work around this by removing the initializer" +#~ msgstr "%J vous pouvez contourner cela en enlevant l'initialiseur" + +#~ msgid "uninitialized const `%D'" +#~ msgstr "constante « %D » non initialisée" + +#~ msgid "brace-enclosed initializer used to initialize `%T'" +#~ msgstr "initialiseur utilisé entre accolades pour initialiser « %T »" + +#~ msgid "initializer for `%T' must be brace-enclosed" +#~ msgstr "initialiseur de « %T » doit être entre accolades" + +#~ msgid "ISO C++ does not allow designated initializers" +#~ msgstr "ISO C++ ne permet de désigner les initialiseurs" + +#~ msgid "`%T' has no non-static data member named `%D'" +#~ msgstr "« %T » n'a pas de membre de données non statique nommé « %D »" + +#~ msgid "name `%D' used in a GNU-style designated initializer for an array" +#~ msgstr "nom « %D » utilisé dans un style GNU de l'initialisateur désigné pour un tableau" + +#~ msgid "too many initializers for `%T'" +#~ msgstr "trop d'initialiseurs pour « %T »" + +#~ msgid "variable-sized object `%D' may not be initialized" +#~ msgstr "objet de taille variable « %D » peut ne pas être initialisé" + +#~ msgid "`%D' has incomplete type" +#~ msgstr "« %D » a un type incomplet" + +#~ msgid "`%D' must be initialized by constructor, not by `{...}'" +#~ msgstr "« %D » doit être initialisé par un constructeur, non pas par « {...} »" + +#~ msgid "structure `%D' with uninitialized const members" +#~ msgstr "structure « %D » avec constantes non initialisées de membres" + +#~ msgid "structure `%D' with uninitialized reference members" +#~ msgstr "structure « %D » avec références non initialisées de membres" + +#~ msgid "assignment (not initialization) in declaration" +#~ msgstr "affectation (non pas l'initialisation) dans la déclaration" + +#~ msgid "cannot initialize `%D' to namespace `%D'" +#~ msgstr "ne peut initialiser « %D » à l'espace de noms « %D »" + +#~ msgid "shadowing previous type declaration of `%#D'" +#~ msgstr "masque la déclaration précédente de « %#D »" + +#~ msgid "`%D' cannot be thread-local because it has non-POD type `%T'" +#~ msgstr "« %D » ne peut être utilisé comme un thread local parce qu'il a un non POD de type « %T »" + +#~ msgid "`%D' is thread-local and so cannot be dynamically initialized" +#~ msgstr "« %D » est un thread local et ne peut donc pas être initialisé dynamiquement" + +#~ msgid "invalid catch parameter" +#~ msgstr "paramètre d'interception invalide" + +#~ msgid "destructor for alien class `%T' cannot be a member" +#~ msgstr "destructeur pour la classe étrangère « %T » ne peut être un membre" + +#~ msgid "constructor for alien class `%T' cannot be a member" +#~ msgstr "constructeur pour la classe étrangère « %T » ne peut être un membre" + +#~ msgid "`%D' declared as a `virtual' %s" +#~ msgstr "« %D» déclaré comme « virtual » %s" + +#~ msgid "`%D' declared as an `inline' %s" +#~ msgstr "« %D» déclaré comme « inline » %s" + +#~ msgid "`const' and `volatile' function specifiers on `%D' invalid in %s declaration" +#~ msgstr "spécificateurs de fonction « const» et «volatile» invalide pour « %D » dans la déclaration %s" + +#~ msgid "`%D' declared as a friend" +#~ msgstr "« %D » déclaré comme un ami" + +#~ msgid "`%D' declared with an exception specification" +#~ msgstr "« %D » déclaré avec une exception de spécification" + +#~ msgid "cannot declare `::main' to be a template" +#~ msgstr "ne peut déclarer « ::main » comme étant un canevas" + +#~ msgid "cannot declare `::main' to be inline" +#~ msgstr "ne peut déclarer «::main» à être enligne" + +#~ msgid "cannot declare `::main' to be static" +#~ msgstr "ne peut déclarer « ::main » comme étant static" + +#~ msgid "`main' must return `int'" +#~ msgstr "« main» doit retourner « int »" + +#~ msgid "non-local function `%#D' uses anonymous type" +#~ msgstr "fonction non locale « %#D » utilise un type anonyme" + +#~ msgid "`%#D' does not refer to the unqualified type, so it is not used for linkage" +#~ msgstr "« %#D » ne réfère pas à un type non qualifié, aussi il n'est pas utilisé pour la liaison" + +#~ msgid "non-local function `%#D' uses local type `%T'" +#~ msgstr "fonction non locale « %#D » utilise un type local « %T »" + +#~ msgid "%smember function `%D' cannot have `%T' method qualifier" +#~ msgstr "%sfonction membre « %D » ne peut avoir « %T » comme qualificateur de méthode" + +#~ msgid "defining explicit specialization `%D' in friend declaration" +#~ msgstr "définition explicite de spécialisation « %D » dans lka déclaration ami" + +#~ msgid "invalid use of template-id `%D' in declaration of primary template" +#~ msgstr "utilisation invalide du template-id « %D » dans la déclaration du canevas primaire" + +#~ msgid "default arguments are not allowed in declaration of friend template specialization `%D'" +#~ msgstr "arguments par défaut ne sont pas permis dans la déclaration amie de la spécialisation du canevas « %D »" + +#~ msgid "`inline' is not allowed in declaration of friend template specialization `%D'" +#~ msgstr "« inline» n'estpas permis dans la déclaration amie de la spécialisation du canevas « %D »" + +#~ msgid "definition of implicitly-declared `%D'" +#~ msgstr "définition implicitement déclarée « %D »" + +#~ msgid "no `%#D' member function declared in class `%T'" +#~ msgstr "pas de fonction membre « %#D » déclarée dans la classe « %T »" + +#~ msgid "non-local variable `%#D' uses local type `%T'" +#~ msgstr "variable non locale « %#D » utilise un type local « %T »" + +#~ msgid "invalid in-class initialization of static data member of non-integral type `%T'" +#~ msgstr "initialisation invalide dans la class de données de membre statiques d'un non entier de type « %T »" + +#~ msgid "ISO C++ forbids in-class initialization of non-const static member `%D'" +#~ msgstr "ISO C++ interdit l'initialisation intra-classe d'un membre statique non constant « %D »" + +#~ msgid "ISO C++ forbids initialization of member constant `%D' of non-integral type `%T'" +#~ msgstr "ISO C++ interdit l'initialisation d'une membre constant « %D » d'un type non entier « %T »" + +#~ msgid "size of array `%D' has non-integral type `%T'" +#~ msgstr "taille du tableau « %D » n'est pas de type entier « %T »" + +#~ msgid "size of array has non-integral type `%T'" +#~ msgstr "taille du tableau a type non entier « %T »" + +#~ msgid "size of array `%D' is negative" +#~ msgstr "taille du tableau « %D » est négative" + +#~ msgid "size of array is negative" +#~ msgstr "taille du tableau est négative" + +#~ msgid "ISO C++ forbids zero-size array `%D'" +#~ msgstr "ISO C++ interdit les tableaux de taille zéro « %D »" + +#~ msgid "ISO C++ forbids zero-size array" +#~ msgstr "ISO C++ interdit les tableaux de taille zéro" + +#~ msgid "size of array `%D' is not an integral constant-expression" +#~ msgstr "taille du tableau « %D » n'a pas une expression de constante de type entier" + +#~ msgid "size of array is not an integral constant-expression" +#~ msgstr "taille du tableau n'est pas une expression de constante de type entier" + +#~ msgid "ISO C++ forbids variable-size array `%D'" +#~ msgstr "ISO C++ interdit les tableaus de taille variable « %D »" + +#~ msgid "ISO C++ forbids variable-size array" +#~ msgstr "ISO C++ interdit le tableau de taille variable" + +#~ msgid "overflow in array dimension" +#~ msgstr "débordement dans les dimensions du tableau" + +#~ msgid "declaration of `%D' as %s" +#~ msgstr "déclaration de « %D » comme « %s »" + +#~ msgid "creating %s" +#~ msgstr "création de %s" + +#~ msgid "declaration of `%D' as multidimensional array must have bounds for all dimensions except the first" +#~ msgstr "déclaration de « %D » comme tableau multidimensionel doit avoir des bornes pour chaque dimension excepté pour la première" + +#~ msgid "multidimensional array must have bounds for all dimensions except the first" +#~ msgstr "tableau multidimensionel doit avoir des bornes pour chaque dimension excepté pour la première" + +#~ msgid "return type specification for constructor invalid" +#~ msgstr "spécification de type retourné pour un constructeur est invalide" + +#~ msgid "return type specification for destructor invalid" +#~ msgstr "spécification de type retourné pour un destructeur est invalide" + +#~ msgid "operator `%T' declared to return `%T'" +#~ msgstr "opérateur « %T » déclaré comme retournant « %T »" + +#~ msgid "return type specified for `operator %T'" +#~ msgstr "type spécifié retourné pour l'opérateur « %T »" + +#~ msgid "destructors must be member functions" +#~ msgstr "les destructeurs doivent être des fonctions membres" + +#~ msgid "destructor `%T' must match class name `%T'" +#~ msgstr "destructeur « %T » doit concorder avec le nom de la classe « %T »" + +#~ msgid "declarator-id missing; using reserved word `%D'" +#~ msgstr "declarator-id manquant; utilisation du mot réservé « %D »" + +#~ msgid "type `%T' is not derived from type `%T'" +#~ msgstr "type « %T » n'est pas dérivé du type « %T »" + +#~ msgid "`%T' specified as declarator-id" +#~ msgstr "« %T » spécifié comme declarator-id" + +#~ msgid " perhaps you want `%T' for a constructor" +#~ msgstr " peut-être que vous voulez « %T » comme constructeur" + +#~ msgid "invalid use of template-name '%E' in a declarator" +#~ msgstr "utilisation invalide du template-name « %E » dans le déclarateur" + +#~ msgid "declaration of `%D' as non-function" +#~ msgstr "déclaration de « %D » comme non-fonction" + +#~ msgid "`bool' is now a keyword" +#~ msgstr "« bool » est maintenant un mot clé" + +#~ msgid "extraneous `%T' ignored" +#~ msgstr "« %T » surperflu ignoré" + +#~ msgid "multiple declarations `%T' and `%T'" +#~ msgstr "multiples déclarations « %T » et « %T »" + +#~ msgid "ISO C++ does not support `long long'" +#~ msgstr "ISO C++ ne permet pas « long long »" + +#~ msgid "ISO C++ forbids declaration of `%s' with no type" +#~ msgstr "ISO C++ interdit la déclaration de « %s » sans type" + +#~ msgid "short, signed or unsigned invalid for `%s'" +#~ msgstr "short, signed ou unsigned est invalide pour « %s »" + +#~ msgid "long and short specified together for `%s'" +#~ msgstr "long et short spécifiés ensembles pour « %s »" + +#~ msgid "signed and unsigned given together for `%s'" +#~ msgstr "signed et unsigned donnés ensembles pour « %s »" + +#~ msgid "qualifiers are not allowed on declaration of `operator %T'" +#~ msgstr "qualificateurs ne sont pas permis dans la déclaration de « operator %T »" + +#~ msgid "member `%D' cannot be declared both virtual and static" +#~ msgstr "membre « %D » ne peut être déclaré virtuel et statique" + +#~ msgid "`%T::%D' is not a valid declarator" +#~ msgstr "« %T::%D » n'est pas un déclarateur valide" + +#~ msgid "storage class specifiers invalid in parameter declarations" +#~ msgstr "spécificateurs de classe de stockage invalides dans la déclaration des paramètres" + +#~ msgid "typedef declaration invalid in parameter declaration" +#~ msgstr "déclaration typedef invalide dans le paramètre de la déclaration" + +#~ msgid "virtual outside class declaration" +#~ msgstr "virtuel en dehors de la déclaration de classe" + +#~ msgid "storage class specified for %s `%s'" +#~ msgstr "classe de stockage spécifiée pour %s « %s »" + +#~ msgid "top-level declaration of `%s' specifies `auto'" +#~ msgstr "la déclaration hors de toute fonction de « %s » a spécifié « auto »" + +#~ msgid "storage class specifiers invalid in friend function declarations" +#~ msgstr "spécificateurs de classe de stockage invalide dans les déclarations de fonction amie" + +#~ msgid "destructor cannot be static member function" +#~ msgstr "le destructeur ne peut être une fonction membre statique" + +#~ msgid "destructors may not be `%s'" +#~ msgstr "destructeurs ne peut être « %s »" + +#~ msgid "constructor cannot be static member function" +#~ msgstr "le constructeur ne peut être une fonction membre statique" + +#~ msgid "constructors cannot be declared virtual" +#~ msgstr "constructeurs ne peut être déclarés virtuels" + +#~ msgid "constructors may not be `%s'" +#~ msgstr "constructeurs ne peuvent pas être « %s »" + +#~ msgid "return value type specifier for constructor ignored" +#~ msgstr "type de valeur retournée d'un spécificateur pour un constructeur est ignoré" + +#~ msgid "can't initialize friend function `%s'" +#~ msgstr "ne peut initialiser la fonction amie « %s »" + +#~ msgid "virtual functions cannot be friends" +#~ msgstr "fonctions virtuelles ne peuvent être amies" + +#~ msgid "friend declaration not in class definition" +#~ msgstr "déclaration amie n'est pas dans la définition de classe" + +#~ msgid "can't define friend function `%s' in a local class definition" +#~ msgstr "ne peut définir une fonction amie « %s » dans une définition locale de classe" + +#~ msgid "destructors may not have parameters" +#~ msgstr "destructeurs ne peuvent pas avoir de paramètre" + +#~ msgid "cannot declare reference to `%#T'" +#~ msgstr "ne peut déclarer une référence vers « %#T »" + +#~ msgid "cannot declare pointer to `%#T'" +#~ msgstr "ne peut déclarer un pointeur vers « %#T »" + +#~ msgid "cannot declare pointer to `%#T' member" +#~ msgstr "ne peut déclarer un pointeur vers le membre « %#T »" + +#~ msgid "extra qualification `%T::' on member `%s' ignored" +#~ msgstr "qualification additionnelle « %T:: » sur le membre « %s » est ignorée" + +#~ msgid "cannot declare member function `%T::%s' within `%T'" +#~ msgstr "ne peut déclarer la fonction membre « %T::%s » à l'intérieur de « %T »" + +#~ msgid "cannot declare member `%T::%s' within `%T'" +#~ msgstr "ne peut déclarer le membre « %T::%s » à l'intérieur de « %T »" + +#~ msgid "data member may not have variably modified type `%T'" +#~ msgstr "membre de données peut ne pas avoir de type « %T » modifié de manière variable" + +#~ msgid "parameter may not have variably modified type `%T'" +#~ msgstr "paramètre peut ne pas avoir de type « %T » modifié de manière variable" + +#~ msgid "only declarations of constructors can be `explicit'" +#~ msgstr "seuls les déclarations de constructeurs peuvent être « explicit »" + +#~ msgid "non-member `%s' cannot be declared `mutable'" +#~ msgstr "le non membre « %s » ne peut être déclaré « mutable »" + +#~ msgid "non-object member `%s' cannot be declared `mutable'" +#~ msgstr "un membre non objet « %s » ne peut être déclaré « mutable »" + +#~ msgid "function `%s' cannot be declared `mutable'" +#~ msgstr "fonction « %s » ne peut être déclarée « mutable »" + +#~ msgid "static `%s' cannot be declared `mutable'" +#~ msgstr "static « %s » ne peut être déclaré « mutable »" + +#~ msgid "const `%s' cannot be declared `mutable'" +#~ msgstr "const « %s » ne peut être déclaré « mutable »" + +#~ msgid "template-id `%D' used as a declarator" +#~ msgstr "identificateur de canevas « %D » utilisé comme déclarateur" + +#~ msgid "ISO C++ forbids nested type `%D' with same name as enclosing class" +#~ msgstr "ISO C++ interdit le type imbriqué « %D » avec le même nom que la classe de fermeture" + +#~ msgid "%Jtypedef name may not be a nested-name-specifier" +#~ msgstr "%Jnom du typedef peut ne pas être un nom de spécificateur imbriqué" + +#~ msgid "%Jinvalid type qualifier for non-member function type" +#~ msgstr "%Jqualificateur de type invalide pour un type de fonction non membre" + +#~ msgid "type qualifiers specified for friend class declaration" +#~ msgstr "qulificateurs de types spécifiés pour la déclaration d'une classe amie" + +#~ msgid "`inline' specified for friend class declaration" +#~ msgstr "« inline » spécifié pour la déclaration d'une classe amie" + +#~ msgid "template parameters cannot be friends" +#~ msgstr "paramètres du canevas ne peuvent pas être amis" + +#~ msgid "friend declaration requires class-key, i.e. `friend class %T::%D'" +#~ msgstr "déclaration ami requiert une clé de classe, i.e. « friend class %T::%D »" + +#~ msgid "friend declaration requires class-key, i.e. `friend %#T'" +#~ msgstr "déclaration amie requiert une clé de classes, i.e. « friend %#T »" + +#~ msgid "trying to make class `%T' a friend of global scope" +#~ msgstr "tentative de rendre la classe « %T » un ami de la portée globale" + +#~ msgid "invalid qualifiers on non-member function type" +#~ msgstr "qualificteurs invalide pour un type de fonction (autre que fonction membre)" + +#~ msgid "abstract declarator `%T' used as declaration" +#~ msgstr "déclaration abstrait « %T » utilisé dans la déclaration" + +#~ msgid "unnamed variable or field declared void" +#~ msgstr "variable non nommée ou champ déclaré void" + +#~ msgid "variable or field declared void" +#~ msgstr "variable ou champ déclaré void" + +#~ msgid "cannot use `::' in parameter declaration" +#~ msgstr "ne peut utiliser «::» dans le paramètre d'un déclaration" + +#~ msgid "invalid use of `::'" +#~ msgstr "utilisation invalide de « :: »" + +#~ msgid "function `%D' cannot be declared friend" +#~ msgstr "fonction « %D » ne peut être déclarée amie" + +#~ msgid "can't make `%D' into a method -- not in a class" +#~ msgstr "ne peut rendre « %D » dans la méthode -- n'est pas dans la classe" + +#~ msgid "function `%D' declared virtual inside a union" +#~ msgstr "fonction « %D » déclaré comme virtuelle à l'intérieur d'un agrégat" + +#~ msgid "`%D' cannot be declared virtual, since it is always static" +#~ msgstr "« %D » ne peut être déclaré virtuel, alors qu'il est toujours statique" + +#~ msgid "field `%D' has incomplete type" +#~ msgstr "champ « %D » a un type incomplet" + +#~ msgid "name `%T' has incomplete type" +#~ msgstr "nom « %T » a un type incomplet" + +#~ msgid " in instantiation of template `%T'" +#~ msgstr " dans l'instanciation du canevas « %T »" + +#~ msgid "`%s' is neither function nor member function; cannot be declared friend" +#~ msgstr "« %s » n'est ni une fonction ni une fonction membre ; ne peut être déclaré ami" + +#~ msgid "member functions are implicitly friends of their class" +#~ msgstr "les fonctions membres sont implicitement amis de leur classe" + +#~ msgid "ISO C++ forbids initialization of member `%D'" +#~ msgstr "ISO C++ interdit l'initialisation du membre « %D »" + +#~ msgid "making `%D' static" +#~ msgstr "rendant « %D » statique" + +#~ msgid "storage class `auto' invalid for function `%s'" +#~ msgstr "classe de stockage « auto» invalide pour une fonction « %s »" + +#~ msgid "storage class `register' invalid for function `%s'" +#~ msgstr "classe de stockage « register» invalide pour une fonction « %s »" + +#~ msgid "storage class `__thread' invalid for function `%s'" +#~ msgstr "classe de stockage « __thread » invalide pour la fonction « %s »" + +#~ msgid "storage class `static' invalid for function `%s' declared out of global scope" +#~ msgstr "classe de stockage « static» invalide pour une fonction « %s » déclarée en dehors de la portée globale" + +#~ msgid "storage class `inline' invalid for function `%s' declared out of global scope" +#~ msgstr "classe de stockage « inline» invalide pour une fonction « %s » déclarée en dehors de la portée globale" + +#~ msgid "virtual non-class function `%s'" +#~ msgstr "fonction virtuelle d'une non classe « %s »" + +#~ msgid "cannot declare member function `%D' to have static linkage" +#~ msgstr "ne peut déclarer la fonction membre « %D » comme ayant un lien statique" + +#~ msgid "cannot declare static function inside another function" +#~ msgstr "ne peut déclarer une fonction statique à l'intérieur d'une autre fonction" + +#~ msgid "`static' may not be used when defining (as opposed to declaring) a static data member" +#~ msgstr "« static » ne peut pas être utilisé lors de la définition (contrairement à la déclaration) de données de membres statiques" + +#~ msgid "static member `%D' declared `register'" +#~ msgstr "mambre statique « %D» déclaré «register »" + +#~ msgid "cannot explicitly declare member `%#D' to have extern linkage" +#~ msgstr "ne peut explicitement déclarer le membre « %#D » comme ayant une liaison externe" + +#~ msgid "default argument for `%#D' has type `%T'" +#~ msgstr "argument par défaut pour « %#D » à un type « %T »" + +#~ msgid "default argument for parameter of type `%T' has type `%T'" +#~ msgstr "argument par défaut pour le paramètre de type « %T » a le type « %T »" + +#~ msgid "default argument `%E' uses local variable `%D'" +#~ msgstr "argument par défaut « %E » utiliser une variable locale « %D »" + +#~ msgid "invalid string constant `%E'" +#~ msgstr "constante chaîne invalide « %E »" + +#~ msgid "invalid integer constant in parameter list, did you forget to give parameter name?" +#~ msgstr "constante entière invalide dans la liste de paramètre, avez-vous oublier de donner un nom de paramètre?" + +#~ msgid "parameter `%D' invalidly declared method type" +#~ msgstr "paramètre « %D » incorrectement validé comme type de méthode" + +#~ msgid "parameter `%D' includes %s to array of unknown bound `%T'" +#~ msgstr "paramètre « %D » inclut %s au tableau de bornes inconnues « %T »" + +#~ msgid "invalid constructor; you probably meant `%T (const %T&)'" +#~ msgstr "constructeur invalide; vous vouliez probablement dire « %T (const %T&) »" + +#~ msgid "`%D' must be a nonstatic member function" +#~ msgstr "« %D » doit être une fonction membre non statique" + +#~ msgid "`%D' must be either a non-static member function or a non-member function" +#~ msgstr "« %D » doit être soit un membre non statique de fonction ou une fonction non membre" + +#~ msgid "`%D' must have an argument of class or enumerated type" +#~ msgstr "« %D » doit avoir un argument de classe ou de type énuméré" + +#~ msgid "conversion to %s%s will never use a type conversion operator" +#~ msgstr "conversion de %s%s ne sera jamais utilisé dans un type d'opérateur de conversion" + +#~ msgid "ISO C++ prohibits overloading operator ?:" +#~ msgstr "ISO C++ interdit la surcharge de l'opérateur ?:" + +#~ msgid "postfix `%D' must take `int' as its argument" +#~ msgstr "postfixe « %D» doit prendre « int » comme argument" + +#~ msgid "postfix `%D' must take `int' as its second argument" +#~ msgstr "postfixe « %D» doit prndre « int » pour son second argument" + +#~ msgid "`%D' must take either zero or one argument" +#~ msgstr "« %D » doit prendre seulement zéro ou un autre argument" + +#~ msgid "`%D' must take either one or two arguments" +#~ msgstr "« %D » doit prendre seulement un OU deux arguments" + +#~ msgid "prefix `%D' should return `%T'" +#~ msgstr "préfixe « %D » devrait retourner « %T »" + +#~ msgid "postfix `%D' should return `%T'" +#~ msgstr "postfixe « %D » devrait retourner « %T »" + +#~ msgid "`%D' must take `void'" +#~ msgstr "« %D» doit prendre « void »" + +#~ msgid "`%D' must take exactly one argument" +#~ msgstr "« %D » doit prendre exactement un argument" + +#~ msgid "`%D' must take exactly two arguments" +#~ msgstr "« %D » doit prendre exactemenr deux arguments" + +#~ msgid "user-defined `%D' always evaluates both arguments" +#~ msgstr "« %D » défini par l'usager évalue toujours les 2 arguments" + +#~ msgid "`%D' should return by value" +#~ msgstr "« %D » devrait retourner par valeur" + +#~ msgid "`%D' cannot have default arguments" +#~ msgstr "« %D » ne peut avoir d'arguments par défaut" + +#~ msgid "using typedef-name `%D' after `%s'" +#~ msgstr "utilisation d'un nom de typedef « %D » après « %s »" + +#~ msgid "using template type parameter `%T' after `%s'" +#~ msgstr "utilisation de type de canevas de paramètre « %T » après « %s »" + +#~ msgid "`%T' referred to as `%s'" +#~ msgstr "« %TD » référé comme « %s »" + +#~ msgid "`%T' referred to as enum" +#~ msgstr "« %T » référé comme enum" + +#~ msgid "template argument required for `%s %T'" +#~ msgstr "argument du canevas est requis pour « %s %T »" + +#~ msgid "use of enum `%#D' without previous declaration" +#~ msgstr "utilisation de enum « %#D » sans déclaration précédente" + +#~ msgid "derived union `%T' invalid" +#~ msgstr "union dérivée « %T » invalide" + +#~ msgid "base type `%T' fails to be a struct or class type" +#~ msgstr "type de base « %T » a échoué pour devenir un type de classe ou un type construit" + +#~ msgid "recursive type `%T' undefined" +#~ msgstr "type récursif « %T » non défini" + +#~ msgid "duplicate base type `%T' invalid" +#~ msgstr "duplication du type de base « %T » invalide" + +#~ msgid "Java class '%T' cannot have multiple bases" +#~ msgstr "classe Java « %T » ne peut avoir de bases multiples" + +#~ msgid "Java class '%T' cannot have virtual bases" +#~ msgstr "classe Java « %T » ne peut avoir de bases virtuelles" + +#~ msgid "multiple definition of `%#T'" +#~ msgstr "définition multiple de « %#T »" + +#~ msgid "%Jprevious definition here" +#~ msgstr "%Jdéfinition précédente ici" + +#~ msgid "no integral type can represent all of the enumerator values for `%T'" +#~ msgstr "aucun type entier peut représenter toutes les valeurs de l'énumérateur pour « %T »" + +#~ msgid "enumerator value for `%D' not integer constant" +#~ msgstr "valeur de l'énumérateur pour « %D » n'est pas une constante entière" + +#~ msgid "overflow in enumeration values at `%D'" +#~ msgstr "débordement dans les valeurs de l'énumération à « %D »" + +#~ msgid "return type `%#T' is incomplete" +#~ msgstr "type retourné « %#T » est incomplet" + +#~ msgid "return type for `main' changed to `int'" +#~ msgstr "type retourné pour « main » est changé pour «int »" + +#~ msgid "`%D' implicitly declared before its definition" +#~ msgstr "« %D » implicitement déclaré avant sa définition" + +#~ msgid "`operator=' should return a reference to `*this'" +#~ msgstr "« operator= » devrait retourner une référence à «*ceci »" + +#~ msgid "parameter `%D' declared void" +#~ msgstr "paramètre « %D » déclaré «void »" + +#~ msgid "invalid member function declaration" +#~ msgstr "déclaration de membre de fonction invalide" + +#~ msgid "`%D' is already defined in class `%T'" +#~ msgstr "« %D » est déjà défini dans la classe « %T »" + +#~ msgid "static member function `%#D' declared with type qualifiers" +#~ msgstr "membre de fonction statique « %#D » déclaré avec des qualificateurs de tyep" + +#~ msgid "duplicate type qualifiers in %s declaration" +#~ msgstr "qualificateurs de types dupliqués dans déclaration %s" + +#~ msgid "name missing for member function" +#~ msgstr "nom manquant pour le membre d'une fonction" + +#~ msgid "ambiguous conversion for array subscript" +#~ msgstr "comversion ambigue pour un sous-tableau" + +#~ msgid "invalid types `%T[%T]' for array subscript" +#~ msgstr "types invalides « %T[%T] » pour un sous-script de tableau" + +#~ msgid "deleting array `%#D'" +#~ msgstr "destruction du tableau « %#D »" + +#~ msgid "type `%#T' argument given to `delete', expected pointer" +#~ msgstr "type « %#T » de l'argument donné pour « delete », attendait un pointeur" + +#~ msgid "cannot delete a function. Only pointer-to-objects are valid arguments to `delete'" +#~ msgstr "ne peut détruire une fonction. Seuls les pointeurs-d'objets sont des arguments valable pour destruction" + +#~ msgid "deleting `%T' is undefined" +#~ msgstr "destruction de « %T » est indéfinie" + +#~ msgid "invalid declaration of member template `%#D' in local class" +#~ msgstr "déclaration invalide du canevas de membre « %#D » dans la classe locale" + +#~ msgid "invalid use of `virtual' in template declaration of `%#D'" +#~ msgstr "utilisation invalide de « virtual» dans la déclaration d'un canevas de « %#D »" + +#~ msgid "template declaration of `%#D'" +#~ msgstr "déclaration du canevas de « %#D »" + +#~ msgid "Java method '%D' has non-Java return type `%T'" +#~ msgstr "méthode Java « %D » a un type non Java retourné « %T »" + +#~ msgid "Java method '%D' has non-Java parameter type `%T'" +#~ msgstr "méthode Java « %D » a un paramètre non Java de type « %T »" + +#~ msgid "prototype for `%#D' does not match any in class `%T'" +#~ msgstr "prototype pour « %#D » ne concorde avec aucun dans la classe « %T »" + +#~ msgid "local class `%#T' shall not have static data member `%#D'" +#~ msgstr "la classe locale « %#T » ne doit pas être un membre de données statiques de « %#D »" + +#~ msgid "initializer invalid for static member with constructor" +#~ msgstr "initialisation invalide pour un membre statique avec constructeur" + +#~ msgid "(an out of class initialization is required)" +#~ msgstr "(une initialisation en dehors de la classe est requise)" + +#~ msgid "member `%D' conflicts with virtual function table field name" +#~ msgstr "membre « %D » en conflit avec un nom de champ de table d'une fonction virtuelle" + +#~ msgid "`%D' is already defined in `%T'" +#~ msgstr "« %D » est déjà défini dans « %T »" + +#~ msgid "field initializer is not constant" +#~ msgstr "l'initialisation du champ n'est pas une constante" + +#~ msgid "`asm' specifiers are not permitted on non-static data members" +#~ msgstr "spécificateurs « asm » ne sont pas permis pour des données de membres non statiques" + +#~ msgid "cannot declare `%D' to be a bit-field type" +#~ msgstr "ne peut déclarer « %D » comme étant un type de champ de bits" + +#~ msgid "cannot declare bit-field `%D' with function type" +#~ msgstr "ne peut déclarer un champ de bits « %D » avec un type de fonction" + +#~ msgid "`%D' is already defined in the class %T" +#~ msgstr "« %D » est déjà défini dans la classe %T" + +#~ msgid "static member `%D' cannot be a bit-field" +#~ msgstr "membre statique « %D » ne peut être un champ de bits" + +#~ msgid "initializer specified for non-member function `%D'" +#~ msgstr "initialisation spécifiée pour une fonction « %D » n'étant pas membre" + +#~ msgid "invalid initializer for virtual method `%D'" +#~ msgstr "initialisation invalide pour la méthode virtuelle « %D »" + +#~ msgid "anonymous struct not inside named type" +#~ msgstr "struct anonyme n'est pas l'intérieur du type nommé" + +#~ msgid "namespace-scope anonymous aggregates must be static" +#~ msgstr "aggrégats anonymes de champs d'espace nom doit être statique" + +#~ msgid "anonymous union with no members" +#~ msgstr "aggrégat anonyme sans aucun membre" + +#~ msgid "`operator new' must return type `%T'" +#~ msgstr "« operator new » doit retourner un type « %T »" + +#~ msgid "`operator new' takes type `size_t' (`%T') as first parameter" +#~ msgstr "« operator new » prend le type « size_t » (« %T ») comme premier paramètre" + +#~ msgid "`operator delete' must return type `%T'" +#~ msgstr "« operator delete » doit retourner le type « %T »" + +#~ msgid "`operator delete' takes type `%T' as first parameter" +#~ msgstr "« operator delete » prend le type « %T » comme premier paramètre" + +#~ msgid "inline function `%D' used but never defined" +#~ msgstr "fonction enligne « %D » utilisé mais n'a jamais été défini" + +#~ msgid "default argument missing for parameter %P of `%+#D'" +#~ msgstr "argument par défaut manquant pour le paramètre %P de « %+#D »" + +#~ msgid "unexpected letter `%c' in locate_error\n" +#~ msgstr "lettre inattendue « %c » dans locate_error\n" + +#~ msgid "type `%T' is disallowed in Java `throw' or `catch'" +#~ msgstr "type « %T» n'est pas permis en Java «throw» ou «catch »" + +#~ msgid "call to Java `catch' or `throw' with `jthrowable' undefined" +#~ msgstr "appel en Java de « catch» ou «throw» avec «jthrowable » undéfini" + +#~ msgid "type `%T' is not derived from `java::lang::Throwable'" +#~ msgstr "type « %T» n'est pas dérivé de «java::lang::Throwable »" + +#~ msgid "mixing C++ and Java catches in a single translation unit" +#~ msgstr "mélange des interceptions C++ et Java dans une unité simple de traduction " + +#~ msgid "throwing NULL, which has integral, not pointer type" +#~ msgstr "retounrnant NULL (par throw), lequel est entier, pas de type pointeur" + +#~ msgid "`%D' should never be overloaded" +#~ msgstr "« %D » ne devrait jamais être surchargé" + +#~ msgid " in thrown expression" +#~ msgstr " dans l'expression projetée" + +#~ msgid "expression '%E' of abstract class type '%T' cannot be used in throw-expression" +#~ msgstr "expression « %E » de la classe abstraite de type « %T » ne peut être utilisé dans une expression throw" + +#~ msgid "exception of type `%T' will be caught" +#~ msgstr "exception du type « %T » sera interceptée" + +#~ msgid " by earlier handler for `%T'" +#~ msgstr " par un handler antérieur pour « %T »" + +#~ msgid "`...' handler must be the last handler for its try block" +#~ msgstr "« ... » handler doit être le dernier handler de son bloc d'essai" + +#~ msgid "`%D' is already a friend of class `%T'" +#~ msgstr "« %D » est déjà un ami de la classe « %T »" + +#~ msgid "invalid type `%T' declared `friend'" +#~ msgstr "type invalide « %T» déclaré «friend »" + +#~ msgid "partial specialization `%T' declared `friend'" +#~ msgstr "spécialisation partielle « %T» déclarée «friend »" + +#~ msgid "class `%T' is implicitly friends with itself" +#~ msgstr "classe « %T » est implicitement ami avec elle-même" + +#~ msgid "typename type `%#T' declared `friend'" +#~ msgstr "type typename « %#T» déclaré «friend »" + +#~ msgid "template parameter type `%T' declared `friend'" +#~ msgstr "type paramètre du canevas « %T» déclaré «friend »" + +#~ msgid "`%#T' is not a template" +#~ msgstr "« %#T » n'est pas un canevas" + +#~ msgid "`%D' is already a friend of `%T'" +#~ msgstr "« %D » est déjà un ami de « %T »" + +#~ msgid "`%T' is already a friend of `%T'" +#~ msgstr "« %T » est déjà un ami de « %T »" + +#~ msgid "member `%D' declared as friend before type `%T' defined" +#~ msgstr "membre « %D » déclaré comme ami avant la définition du type « %T »" + +#~ msgid "friend declaration `%#D' declares a non-template function" +#~ msgstr "déclaration amie « %#D » déclare une fonction non canevas" + +#~ msgid "(if this is not what you intended, make sure the function template has already been declared and add <> after the function name here) -Wno-non-template-friend disables this warning" +#~ msgstr "(si ce n'est pas ce que vous vouliez faire, soyez sûr que le canevas de la fonction a déjà été déclaré et ajouter <> après le nom de la fonction ici) -Wno-non-template-friend désactive le présent avertissement" + +#~ msgid "argument to `%s' missing\n" +#~ msgstr "argument pour « %s » est manquant\n" + +#~ msgid "`%D' should be initialized in the member initialization list" +#~ msgstr "« %D » devrait être initialisé dans la liste d'initialisation du membre" + +#~ msgid "default-initialization of `%#D', which has reference type" +#~ msgstr "initialisation par défaut de « %#D », lequel a un type référencé" + +#~ msgid "uninitialized reference member `%D'" +#~ msgstr "référence de membre non initialisé « %D »" + +#~ msgid "uninitialized member `%D' with `const' type `%T'" +#~ msgstr "membre non initialisé « %D » avec « const » type « %T »" + +#~ msgid "`%D' will be initialized after" +#~ msgstr "« %D » sera initialisé après" + +#~ msgid "base `%T' will be initialized after" +#~ msgstr "base « %T » sera initialisé après" + +#~ msgid " `%#D'" +#~ msgstr " « %D »" + +#~ msgid " base `%T'" +#~ msgstr " base « %T »" + +#~ msgid " when initialized here" +#~ msgstr " lorsqu'initialisé ici" + +#~ msgid "multiple initializations given for `%D'" +#~ msgstr "multiples initialisations données pour « %D »" + +#~ msgid "multiple initializations given for base `%T'" +#~ msgstr "multiples initialisations données pour base « %T »" + +#~ msgid "initializations for multiple members of `%T'" +#~ msgstr "initialisation de multiples membres de « %T »" + +#~ msgid "base class `%#T' should be explicitly initialized in the copy constructor" +#~ msgstr "classe de base « %#T » devrait être explicitement initialisé dans la copie du constructeur" + +#~ msgid "class `%T' does not have any field named `%D'" +#~ msgstr "classe « %T » n'a pas aucun champ nommé « %D »" + +#~ msgid "`%#D' is a static data member; it can only be initialized at its definition" +#~ msgstr "« %#D » est un membre statique de données; il peut seulement être initialisée lors de sa définition" + +#~ msgid "`%#D' is not a non-static data member of `%T'" +#~ msgstr "« %#D » n'est pas un membre statique de données de « %T »" + +#~ msgid "unnamed initializer for `%T', which has no base classes" +#~ msgstr "initialiseur sans nom pour « %T », lequel n'a pas de classe de base" + +#~ msgid "unnamed initializer for `%T', which uses multiple inheritance" +#~ msgstr "initialiseur sans nom pour « %T », lequel utilise de multiples héritages" + +#~ msgid "'%D' is both a direct base and an indirect virtual base" +#~ msgstr "« %D » est à la fois une base directe et indirecte virtuelle" + +#~ msgid "type `%D' is not a direct or virtual base of `%T'" +#~ msgstr "type « %D » n'est pas une base directe ou virtuelle de « %T »" + +#~ msgid "type `%D' is not a direct base of `%T'" +#~ msgstr "type « %D » n'est pas une base directe de « %T »" + +#~ msgid "bad array initializer" +#~ msgstr "mauvaise initialisation de tableau" + +#~ msgid "`%T' is not an aggregate type" +#~ msgstr "« %T » n'est pas de type aggrégat" + +#~ msgid "`%T' fails to be an aggregate typedef" +#~ msgstr "« %T » a échoué à être un typedef d'aggrégat" + +#~ msgid "type `%T' is of non-aggregate type" +#~ msgstr "type « %T » est un type qui n'est pas d'aggrégat" + +#~ msgid "qualified type `%T' does not match destructor name `~%T'" +#~ msgstr "type qualifé « %T » ne concorde pas le nom du destructeur «~%T»" + +#~ msgid "incomplete type `%T' does not have member `%D'" +#~ msgstr "type incomplet « %T » n'a pas de membre « %D »" + +#~ msgid "`%D' is not a member of type `%T'" +#~ msgstr "« %D » n'est pas un membre de type « %T »" + +#~ msgid "invalid pointer to bit-field `%D'" +#~ msgstr "pointeur invalide pour un champ de bits « %D »" + +#~ msgid "invalid use of non-static member function `%D'" +#~ msgstr "utilisation invalide d'un membre non statique de fonction « %D »" + +#~ msgid "invalid use of non-static data member `%D'" +#~ msgstr "utilisation invalide d'un membre non statique de données « %D »" + +#~ msgid "new of array type fails to specify size" +#~ msgstr "new sur un type tableau a échoué dans l'évaluation de la taille" + +#~ msgid "size in array new must have integral type" +#~ msgstr "taille d'un nouveau tableau (new) doit avoir un type entier" + +#~ msgid "zero size array reserves no space" +#~ msgstr "tableau de taille zéro ne réserve pas d'espace" + +#~ msgid "new cannot be applied to a reference type" +#~ msgstr "new ne peut être appliqué à un type référencé" + +#~ msgid "new cannot be applied to a function type" +#~ msgstr "new ne peut être appliqué à un type de fonction" + +#~ msgid "call to Java constructor, while `jclass' undefined" +#~ msgstr "appel d'un constructeur Java, alors que « jclass » est indéfini" + +#~ msgid "can't find class$" +#~ msgstr "ne peut repérer class$" + +#~ msgid "invalid type `void' for new" +#~ msgstr "type « void » invalide pour new" + +#~ msgid "uninitialized const in `new' of `%#T'" +#~ msgstr "constante non initialisée dans « new» pour « %#T »" + +#~ msgid "call to Java constructor with `%s' undefined" +#~ msgstr "appel au constructeur Java avec « %s » indéfini" + +#~ msgid "request for member `%D' is ambiguous" +#~ msgstr "la requête pour le membre « %D » est ambiguë" + +#~ msgid "ISO C++ forbids initialization in array new" +#~ msgstr "ISO C++ interdit l'initialisation d'un nouveau tableau" + +#~ msgid "initializer ends prematurely" +#~ msgstr "fin prématurée de l'initialisation" + +#~ msgid "cannot initialize multi-dimensional array with initializer" +#~ msgstr "ne peut initialiser un table multi-dimensionnel avec initialiseur" + +#~ msgid "possible problem detected in invocation of delete operator:" +#~ msgstr "problème possible détecté dans l'invocation de l'opérateur delete:" + +#~ msgid "neither the destructor nor the class-specific " +#~ msgstr "ni le destructeur ni la classe spécifique" + +#~ msgid "operator delete will be called, even if they are " +#~ msgstr "l'opérateur de destruction sera appellé, même s'ils sont " + +#~ msgid "declared when the class is defined." +#~ msgstr "déclarés lorsque la classe est définie." + +#~ msgid "unknown array size in delete" +#~ msgstr "taille du tableau inconnue dans delete" + +#~ msgid "type to vector delete is neither pointer or array type" +#~ msgstr "type du vesteur delete n'est ni un pointeur ou un type tableau" + +#~ msgid "type name expected before `*'" +#~ msgstr "nom de type attendu avec «*»" + +#~ msgid "junk at end of #pragma %s" +#~ msgstr "rebut à la fin de #pragma %s" + +#~ msgid "invalid #pragma %s" +#~ msgstr "#pragma %s invalde" + +#~ msgid "#pragma vtable no longer supported" +#~ msgstr "#pragma vtable n'est plus supporté" + +#~ msgid "#pragma implementation for %s appears after file is included" +#~ msgstr "implantation de #pragma pour %s apparaît après l'inclusion du fichier" + +#~ msgid "junk at end of #pragma GCC java_exceptions" +#~ msgstr "rebut à la fin de #pragma GCC java_exceptions" + +#~ msgid "`%D' not defined" +#~ msgstr "« %D » n'est pas défini" + +#~ msgid "`%D' was not declared in this scope" +#~ msgstr "« %D » n'a pas été déclaré dans cet horizon" + +#~ msgid "`%D' undeclared (first use this function)" +#~ msgstr "« %D » non déclaré (première utilisation dans cette fonction)" + +#~ msgid "(Each undeclared identifier is reported only once for each function it appears in.)" +#~ msgstr "(Chaque identificateur non déclaré est rapporté seulement une seule fois pour la fonction dans laquelle il apparaît.)" + +#~ msgid "there are no arguments to `%D' that depend on a template parameter, so a declaration of `%D' must be available" +#~ msgstr "il n'y a pas d'argument à « %D » qui dépend d'un paramètre du canevas, aussi une déclaration de « %D » doit être disponible" + +#~ msgid "(if you use `-fpermissive', G++ will accept your code, but allowing the use of an undeclared name is deprecated)" +#~ msgstr "(si vous utilisez « -fpermissive », G++ acceptera votre core, mais permettre l'utilisation d'un nom non déclaré est obsolète)" + +#~ msgid "call_expr cannot be mangled due to a defect in the C++ ABI" +#~ msgstr "call_expr ne peut être mutilé en raison d'un faute dans l'ABI C++" + +#~ msgid "omitted middle operand to `?:' operand cannot be mangled" +#~ msgstr "opérande du milieu « ?: » omise, l'opérande ne peut être mutilée" + +#~ msgid "the mangled name of `%D' will change in a future version of GCC" +#~ msgstr "le nom mutilé de « %D » sera modifié dans une version future de GCC" + +#~ msgid "generic thunk code fails for method `%#D' which uses `...'" +#~ msgstr "code « thunk» générique a échoué pour la méthode « %#D » laquelle utilise « ... »" + +#~ msgid "non-static const member `%#D', can't use default assignment operator" +#~ msgstr "constante non statique du membre « %#D », ne peut utiliser l'opérateur d'affectation par défaut" + +#~ msgid "non-static reference member `%#D', can't use default assignment operator" +#~ msgstr "référence non statique du membre « %#D », ne peut utiliser l'opérateur d'affectation par défaut" + +#~ msgid "`%#D' used prior to declaration" +#~ msgstr "« %#D » utilisé précédemment avant sa déclaration" + +#~ msgid "redeclaration of `wchar_t' as `%T'" +#~ msgstr "redéclaration de « wchar_t» comme « %T »" + +#~ msgid "invalid redeclaration of `%D'" +#~ msgstr "redéclaration invalide de « %D »" + +#~ msgid "as `%D'" +#~ msgstr "comme « %D »" + +#~ msgid "type mismatch with previous external decl of `%#D'" +#~ msgstr "non concordance de type avec la déclaration externe précédente de « %D »" + +#~ msgid "previous external decl of `%#D'" +#~ msgstr "déclaration externe précédente de « %#D »" + +#~ msgid "`%D' was previously implicitly declared to return `int'" +#~ msgstr "« %D » a été précédemment implicitement déclaré comme retournant un entier" + +#~ msgid "extern declaration of `%#D' doesn't match" +#~ msgstr "déclaration externe de « %#D » ne concorde pas" + +#~ msgid "global declaration `%#D'" +#~ msgstr "déclaration globale « %#D »" + +#~ msgid "declaration of '%#D' shadows a parameter" +#~ msgstr "déclaration de « %#D » masque un paramètre" + +#~ msgid "declaration of '%D' shadows a member of 'this'" +#~ msgstr "déclaration de « %D » masque un membre de « this »" + +#~ msgid "declaration of '%D' shadows a previous local" +#~ msgstr "déclaration de « %D » masque la déclaration d'un local précédent" + +#~ msgid "declaration of '%D' shadows a global declaration" +#~ msgstr "déclaration de « %D » masque une déclaration globale" + +#~ msgid "name lookup of `%D' changed" +#~ msgstr "recherche du nom « %D » a changé" + +#~ msgid " matches this `%D' under ISO standard rules" +#~ msgstr " concorde avec « %D » selon les règles standards ISO" + +#~ msgid " matches this `%D' under old rules" +#~ msgstr " concorde avec « %D » selon les vieilles règles" + +#~ msgid "name lookup of `%D' changed for new ISO `for' scoping" +#~ msgstr "recherche du nom de « %D » changé pour la nouvelle étendue ISO pour le « for »" + +#~ msgid " cannot use obsolete binding at `%D' because it has a destructor" +#~ msgstr " ne peut utiliser une liaison obsolète à « %D » parce qu'il a un destructeur" + +#~ msgid " using obsolete binding at `%D'" +#~ msgstr " utilisation de liaison obsolète à « %D »" + +#~ msgid "%s %s(%E) %p %d\n" +#~ msgstr "%s %s(%E) %p %d\n" + +#~ msgid "%s %s %p %d\n" +#~ msgstr "%s %s %p %d\n" + +#~ msgid "XXX is_class_level != (current_scope == class_scope)\n" +#~ msgstr "XXX is_class_level != (current_scope == class_scope)\n" + +#~ msgid "`%#D' hides constructor for `%#T'" +#~ msgstr "« %#D » cache un constructeur pour « %#T »" + +#~ msgid "`%#D' conflicts with previous using declaration `%#D'" +#~ msgstr "« %#D » en conflit avec une déclaration précédente « %#D »" + +#~ msgid "previous non-function declaration `%#D'" +#~ msgstr "déclaration précédente d'un non fonction « %#D »" + +#~ msgid "conflicts with function declaration `%#D'" +#~ msgstr "conflits avec la déclaration de fonction de « %#D »" + +#~ msgid "a using-declaration cannot specify a template-id. Try `using %D'" +#~ msgstr "l'utilisation d'une déclaration ne peut spécifier un template-id. Essayer « using %D »" + +#~ msgid "namespace `%D' not allowed in using-declaration" +#~ msgstr "espace de noms « %D » n'est pas permis dans l'utilisation d'une déclaration" + +#~ msgid "`%T' is not a namespace" +#~ msgstr "« %T » n'est pas un espace de noms" + +#~ msgid "`%D' not declared" +#~ msgstr "« %D » n'est pas déclaré" + +#~ msgid "`%D' is already declared in this scope" +#~ msgstr "« %D » est déjà déclaré dans cette portée" + +#~ msgid "using declaration `%D' introduced ambiguous type `%T'" +#~ msgstr "l'utlisation de la déclaration « %D » introduit un type ambigu « %T »" + +#~ msgid "`%#D' redeclared as %C" +#~ msgstr "« %#D » rédéclaré comme %C" + +#~ msgid "`%D' has the same name as the class in which it is declared" +#~ msgstr "« %D » a le même nom que la classe dans laquelle il est déclaré" + +#~ msgid "using-declaration for non-member at class scope" +#~ msgstr "l'utilisation de déclaration pour un non membre au niveau de la portée de la classe" + +#~ msgid "using-declaration cannot name destructor" +#~ msgstr "utilisation de déclaration ne peut nommer le destructeur" + +#~ msgid "declaration of `%D' not in a namespace surrounding `%D'" +#~ msgstr "déclaration de « %D » n'est pas dans l'espace de noms entourant « %D »" + +#~ msgid "`%D' should have been declared inside `%D'" +#~ msgstr "« %D » devrait avoir été déclaré à l'intérieur de « %D »" + +#~ msgid "namespace alias `%D' not allowed here, assuming `%D'" +#~ msgstr "alias d'espace de noms « %D » n'est pas permis ici, on assume « %D »" + +#~ msgid "unknown namespace `%D'" +#~ msgstr "espace de nomes inconnu « %D »" + +#~ msgid "namespace `%T' undeclared" +#~ msgstr "espace de noms « %T » n'est pas déclaré" + +#~ msgid "strong using only meaningful at namespace scope" +#~ msgstr "forte n'ayant un sens seulement sur l'étendue de l'espace nom" + +#~ msgid "`%D' attribute directive ignored" +#~ msgstr "« %D » attribut de directive ignoré" + +#~ msgid "use of `%D' is ambiguous" +#~ msgstr "utilisation de « %D » est ambiguë" + +#~ msgid " first declared as `%#D' here" +#~ msgstr " d'abord déclaré comme « %#D » ici" + +#~ msgid " also declared as `%#D' here" +#~ msgstr " aussi déclaré comme « %#D » ici" + +#~ msgid "`%D' denotes an ambiguous type" +#~ msgstr "« %D » dénote un type ambigu" + +#~ msgid "%J first type here" +#~ msgstr "%J premier type ici" + +#~ msgid "%J other type here" +#~ msgstr "%J autre type ici" + +#~ msgid "invalid use of `%D'" +#~ msgstr "utilisation invalide de « %D »" + +#~ msgid "`%D::%D' is not a template" +#~ msgstr "« %D::%D » n'est pas un canevas" + +#~ msgid "`%D' undeclared in namespace `%D'" +#~ msgstr "« %D » non déclaré dans l'espace de noms « %D »" + +#~ msgid "`%D' is not a function," +#~ msgstr "« %D » n'est pas une fonction" + +#~ msgid " conflict with `%D'" +#~ msgstr " en conflit avec « %D »" + +#~ msgid "XXX entering pop_everything ()\n" +#~ msgstr "XXX on entre dans pop_everything ()\n" + +#~ msgid "XXX leaving pop_everything ()\n" +#~ msgstr "XXX on quitte pop_everything ()\n" + +#~ msgid "invalid token" +#~ msgstr "jeton invalide" + +#~ msgid "`%D::%D' has not been declared" +#~ msgstr "« %D::%D » n'a pas été déclaré" + +#~ msgid "`::%D' has not been declared" +#~ msgstr "« ::%D » n'a pas été déclaré" + +#~ msgid "`%D' has not been declared" +#~ msgstr "« %D » n'a pas été déclaré" + +#~ msgid "`%D::%D' %s" +#~ msgstr "« %D::%D » %s" + +#~ msgid "`::%D' %s" +#~ msgstr "« ::%D » %s" + +#~ msgid "`%D' %s" +#~ msgstr "« %D » %s" + +#~ msgid "new types may not be defined in a return type" +#~ msgstr "nouveaux types ne peuvent être définis dans un type à retourner" + +#~ msgid "`%T' is not a template" +#~ msgstr "« %T » n'est pas un canevas" + +#~ msgid "invalid template-id" +#~ msgstr "id de canevas invalide" + +#~ msgid "%s cannot appear in a constant-expression" +#~ msgstr "%s ne peut apparaître dans une expression de constante" + +#~ msgid "`%s' does not name a type" +#~ msgstr "« %s » ne nomme pas un type" + +#~ msgid "(perhaps `typename %T::%s' was intended)" +#~ msgstr "(peut-être « typename %T::%s » était votre intention" + +#~ msgid "ISO C++ forbids braced-groups within expressions" +#~ msgstr "ISO C++ interdit les groupes d'accolades à l'intérieur des expressions" + +#~ msgid "statement-expressions are allowed only inside functions" +#~ msgstr "expression de déclaration sont permises seulement à l'intérieur de fonctions" + +#~ msgid "`this' may not be used in this context" +#~ msgstr "« cela » ne peut être utilisé dans ce contexte" + +#~ msgid "local variable `%D' may not appear in this context" +#~ msgstr "variable locale « %D » ne peut apparaître dans ce contexte" + +#~ msgid "typedef-name `%D' used as destructor declarator" +#~ msgstr "nom du typdef « %D » utilisé comme déclarateur de destructeur" + +#~ msgid "ISO C++ forbids compound-literals" +#~ msgstr "ISO C++ interdit les chaînes composées" + +#~ msgid "array bound forbidden after parenthesized type-id" +#~ msgstr "les limites du tableau interdisent ce qui suit après le type-id mis entre parenthèses" + +#~ msgid "try removing the parentheses around the type-id" +#~ msgstr "essayer d'enlever les parenthèses autour du type-id" + +#~ msgid "expression in new-declarator must have integral or enumeration type" +#~ msgstr "expression dans le nouveau déclarateur doit être un type entier ou d'énumération" + +#~ msgid "use of old-style cast" +#~ msgstr "utilisation d'un vieux style de transtypage (cast)" + +#~ msgid "case label `%E' not within a switch statement" +#~ msgstr "étiquette du CASE « %E » n'est pas à l'intérieur de la déclaration du SWITCH" + +#~ msgid "ISO C++ forbids computed gotos" +#~ msgstr "ISO C++ interdit les gotos calculés" + +#~ msgid "extra `;'" +#~ msgstr "« ; » superflu" + +#~ msgid "mixing declarations and function-definitions is forbidden" +#~ msgstr "mélange de déclarations et de définitions de fonction est interdit" + +#~ msgid "duplicate `friend'" +#~ msgstr "« friend » apparaît en double" + +#~ msgid "class definition may not be declared a friend" +#~ msgstr "définition de classe ne peut pas être déclaré comme ami" + +#~ msgid "only constructors take base initializers" +#~ msgstr "seuls les constructeurs prennent des initialiseurs de base" + +#~ msgid "anachronistic old-style base class initializer" +#~ msgstr "ancien style anachronique d'initialiseur de classe de base" + +#~ msgid "keyword `export' not implemented, and will be ignored" +#~ msgstr "mot clé « export » n'est pas implanté et sera ignoré" + +#~ msgid "`<::' cannot begin a template-argument list" +#~ msgstr "« <:: » ne peut pas être au début d'une liste d'un canevas d'arguments" + +#~ msgid "`<:' is an alternate spelling for `['. Insert whitespace between `<' and `::'" +#~ msgstr "« <: » est une épellation alternative pour « [ ». Insérer des blancs d,espacement entre « < » et « :: »" + +#~ msgid "(if you use `-fpermissive' G++ will accept your code)" +#~ msgstr "(si vous utiliser « -fpermissive » G++ acceptera votre code)" + +#~ msgid "non-template `%D' used as template" +#~ msgstr "« %D » qui n'est pas un canevas est utilisé comme canevas" + +#~ msgid "(use `%T::template %D' to indicate that it is a template)" +#~ msgstr "(utiliser « %T::template %D » pour indiquer que c'est un canevas)" + +#~ msgid "using `typename' outside of template" +#~ msgstr "utilisation de « typename » en dehors du canevas" + +#~ msgid "expected type-name" +#~ msgstr "un nom de type attendu" + +#~ msgid "type attributes are honored only at type definition" +#~ msgstr "type d'attributs sont honorés seulement lors de la définitions de type" + +#~ msgid "a template-id may not appear in a using-declaration" +#~ msgstr "un id de canevas ne peut pas apparaître dans l'utilisation de la déclaration" + +#~ msgid "an asm-specification is not allowed on a function-definition" +#~ msgstr "une spécification asm n'est pas permise dans la définition de fonction" + +#~ msgid "attributes are not allowed on a function-definition" +#~ msgstr "attributs ne sont pas permis dans la définition de fonction" + +#~ msgid "attributes after parenthesized initializer ignored" +#~ msgstr "attributs après l'initialisateur mis entre parenthèses sont ignorés" + +#~ msgid "file ends in default argument" +#~ msgstr "fin de fichier dans l'argument par défaut" + +#~ msgid "deprecated use of default argument for parameter of non-function" +#~ msgstr "utilisation de l'argument par défaut pour un paramètre d'une non fonction" + +#~ msgid "default arguments are only permitted for function parameters" +#~ msgstr "arguments par défaut sont permis seulement pour les paramètres de fonction" + +#~ msgid "declaration of `%D' in `%D' which does not enclose `%D'" +#~ msgstr "déclaration de « %D » dans « %D » lequel n'entoure pas « %D »" + +#~ msgid "extra qualification ignored" +#~ msgstr "qualification superflue ignorée" + +#~ msgid "an explicit specialization must be preceded by 'template <>'" +#~ msgstr "spécialisation explicite doit être précédé par « template <> »" + +#~ msgid "extra semicolon" +#~ msgstr "« ; » superflu" + +#~ msgid "a class-key must be used when declaring a friend" +#~ msgstr "une clé de classe doit être utilise lors de la déclaration d'un ami" + +#~ msgid "friend declaration does not name a class or function" +#~ msgstr "déclaration amie ne nomme pas une classe ou une fonction" + +#~ msgid "pure-specifier on function-definition" +#~ msgstr "spécificateur pur lors de la définition d'une fonction" + +#~ msgid "keyword `typename' not allowed outside of templates" +#~ msgstr "mot clé « typename » n'est pas permis en dehors du canevas" + +#~ msgid "keyword `typename' not allowed in this context (the base class is implicitly a type)" +#~ msgstr "mot clé « typename » n'est pas permis dans ce contexte (la classe de base est implicitement un type)" + +#~ msgid "reference to `%D' is ambiguous" +#~ msgstr "référence à « %D » est ambiguë" + +#~ msgid "too few template-parameter-lists" +#~ msgstr "trop peu de canevas de listes de paramètres" + +#~ msgid "too many template-parameter-lists" +#~ msgstr "trop de canevas de listes de paramètres" + +#~ msgid "invalid function declaration" +#~ msgstr "déclaration de fonction invalide" + +#~ msgid "named return values are no longer supported" +#~ msgstr "valeurs nommées à retourner ne sont plus supportées" + +#~ msgid "`>>' should be `> >' within a nested template argument list" +#~ msgstr "« >> » devrait être « > > » à l'intérieur du canevas de la liste d'arguments" + +#~ msgid "spurious `>>', use `>' to terminate a template argument list" +#~ msgstr "faux « >> », utiliser « > » pour terminer la liste d'argument du canevas" + +#~ msgid "missing `>' to terminate the template argument list" +#~ msgstr "« > » manquant pour terminer la liste d'argument du canevas" + +#~ msgid "`%s' tag used in naming `%#T'" +#~ msgstr "étiquette « %s » utilisée dans la dénomination de « %#T »" + +#~ msgid "%D redeclared with different access" +#~ msgstr "« %#D » redéclaré avec un accès différent" + +#~ msgid "`template' (as a disambiguator) is only allowed within templates" +#~ msgstr "« template » (afin de rendre moins ambiguë) est seulement permis à l'intérieur des canevas" + +#~ msgid "data member `%D' cannot be a member template" +#~ msgstr "membre de données « %D » ne peut être membre du canevas" + +#~ msgid "invalid member template declaration `%D'" +#~ msgstr "déclaration de membre de canevas invalide « %D »" + +#~ msgid "explicit specialization in non-namespace scope `%D'" +#~ msgstr "spécialisation explicite dans la portée d'un non espace de noms « %D »" + +#~ msgid "enclosing class templates are not explicitly specialized" +#~ msgstr "fermetures de canevass de classe ne sont pas explicitement spécialisées" + +#~ msgid "specializing `%#T' in different namespace" +#~ msgstr "spécialisation de « %#T » dans différents espaces de noms" + +#~ msgid " from definition of `%#D'" +#~ msgstr " à partir de la définition de « %#D »" + +#~ msgid "specialization of `%T' after instantiation" +#~ msgstr "spécialisation de « %T » après instanciation" + +#~ msgid "specialization `%T' after instantiation `%T'" +#~ msgstr "spécialisation de « %T » après instanciation « %T »" + +#~ msgid "explicit specialization of non-template `%T'" +#~ msgstr "spécialisation explicite du non canevas « %T »" + +#~ msgid "specialization of %D after instantiation" +#~ msgstr "spécialisation de %D après instanciation" + +#~ msgid "%s %+#D" +#~ msgstr "%s %+#D" + +#~ msgid "`%D' is not a function template" +#~ msgstr "« %D » n'est pas un canevas de fonction" + +#~ msgid "template-id `%D' for `%+D' does not match any template declaration" +#~ msgstr "template-id « %D » pour « %+D » ne concorde pas avec aucune déclaration de canevas" + +#~ msgid "ambiguous template specialization `%D' for `%+D'" +#~ msgstr "spécialisation de canevas amibiguë « %D » pour « %+D »" + +#~ msgid "template-id `%D' in declaration of primary template" +#~ msgstr "template-id « %D » dans la déclaration de canevas primaire" + +#~ msgid "template parameter list used in explicit instantiation" +#~ msgstr "canevas de liste de paramètres utilisé dans une instanciation explicite" + +#~ msgid "definition provided for explicit instantiation" +#~ msgstr "définition fournie pour une instanciation explicite" + +#~ msgid "too many template parameter lists in declaration of `%D'" +#~ msgstr "trop de canevass de listes de paramètres dans la déclaration de « %D »" + +#~ msgid "too few template parameter lists in declaration of `%D'" +#~ msgstr "trop peu de canevass de listes de paramètres dans la déclaration de « %D »" + +#~ msgid "explicit specialization not preceded by `template <>'" +#~ msgstr "spécialisation explicite n'est pas précédée de « template <> »" + +#~ msgid "partial specialization `%D' of function template" +#~ msgstr "spécialisation partielle « %D » du canevas de fonction" + +#~ msgid "default argument specified in explicit specialization" +#~ msgstr "argument par défaut spécifié dans la spécialisation explicite" + +#~ msgid "template specialization with C linkage" +#~ msgstr "spécialisation de canevas avec édition de liens C" + +#~ msgid "specialization of implicitly-declared special member function" +#~ msgstr "spécialisation d'un membre spécial d'nue fonction déclaré implicitement" + +#~ msgid "no member function `%D' declared in `%T'" +#~ msgstr "pas de membre de fonction « %D » déclaré dans « %T »" + +#~ msgid "too many template parameter lists in declaration of `%T'" +#~ msgstr "trop de canevass de listes de paramètres dans la déclaration de « %T »" + +#~ msgid " shadows template parm `%#D'" +#~ msgstr " masque le paramètre du canevas « %#D »" + +#~ msgid "template parameters not used in partial specialization:" +#~ msgstr "paramètres du canevas ne sont pas utilisés dans la spécialisation partielle:" + +#~ msgid " `%D'" +#~ msgstr " « %D »" + +#~ msgid "partial specialization `%T' does not specialize any template arguments" +#~ msgstr "spécialisation partielle « %T » ne spécialise pas aucun canevas d'arguments" + +#~ msgid "template argument `%E' involves template parameter(s)" +#~ msgstr "canevas d'argument « %E » implique des paramètres du canevas" + +#~ msgid "type `%T' of template argument `%E' depends on template parameter(s)" +#~ msgstr "type « %T » du canevas d'argument « %E » dépend des paramètres du canevas" + +#~ msgid "no default argument for `%D'" +#~ msgstr "pas d'argument par défaut pour « %D »" + +#~ msgid "template with C linkage" +#~ msgstr "canevas avec liaison C" + +#~ msgid "template class without a name" +#~ msgstr "canevas de classe sans nom" + +#~ msgid "destructor `%D' declared as member template" +#~ msgstr "destructeur « %D » déclaré en tant que membre du canevas" + +#~ msgid "`%D' does not declare a template type" +#~ msgstr "« %D » ne déclare pas un type de canevas" + +#~ msgid "template definition of non-template `%#D'" +#~ msgstr "définition de canevas d'un non canevas « %#D »" + +#~ msgid "expected %d levels of template parms for `%#D', got %d" +#~ msgstr "attendait %d niveaux de canevas de paramètres pour « %#D », obtenu %d" + +#~ msgid "got %d template parameters for `%#D'" +#~ msgstr "a obtenu %d paramètres de canevas pour « %#D »" + +#~ msgid "got %d template parameters for `%#T'" +#~ msgstr "a obtenu %d paramètres de canevas pour « %#T »" + +#~ msgid " but %d required" +#~ msgstr " mais %d son requis" + +#~ msgid "`%T' is not a template type" +#~ msgstr "« %T » n'est pas un type canevas" + +#~ msgid "previous declaration `%D'" +#~ msgstr "déclaration précédente de « %D »" + +#~ msgid "used %d template parameter%s instead of %d" +#~ msgstr "utilisé %d canevass paramètre%s au lieu de %d" + +#~ msgid "template parameter `%#D'" +#~ msgstr "canevas de paramètre « %#D »" + +#~ msgid "redeclared here as `%#D'" +#~ msgstr "redéclaré ici comme « %#D »" + +#~ msgid "redefinition of default argument for `%#D'" +#~ msgstr "redéfinition de l'argument par défaut pour « %#D »" + +#~ msgid "%J original definition appeared here" +#~ msgstr "%J définition originale apparaît ici" + +#~ msgid "`%E' is not a valid template argument" +#~ msgstr "« %E » n'est pas un argument valide pour le canevas" + +#~ msgid "it must be the address of a function with external linkage" +#~ msgstr "il doit être l'adresse d'une fonction avec lien externe" + +#~ msgid "it must be the address of an object with external linkage" +#~ msgstr "il doît être l'adresse d'un objet avec lien externe" + +#~ msgid "it must be a pointer-to-member of the form `&X::Y'" +#~ msgstr "il doit être un pointeur-vers-un-membre de la forme «&X::Y»" + +#~ msgid "string literal %E is not a valid template argument because it is the address of an object with static linkage" +#~ msgstr "chaîne %E n'est pas un canevas d'argument valide parce que c'est l'adresse d'un objet avec lien statique" + +#~ msgid "address of non-extern `%E' cannot be used as template argument" +#~ msgstr "adresse du non externe « %E » ne peut être utilisé comme canevas d'argument" + +#~ msgid "non-constant `%E' cannot be used as template argument" +#~ msgstr "la non const « %E » ne peut être utilisé comme un canevas d'argument" + +#~ msgid "type '%T' cannot be used as a value for a non-type template-parameter" +#~ msgstr "type « %T » ne peut être utilisé comme une valeur pour un non type de paramètre de canevas" + +#~ msgid "invalid use of '%D' as a non-type template-argument" +#~ msgstr "utilisation invalide de « %D » pour un non type de paramètre de canevas" + +#~ msgid "invalid use of '%E' as a non-type template-argument" +#~ msgstr "utilisation invalide de « %E » pour un non type de paramètre de canevas" + +#~ msgid "to refer to a type member of a template parameter, use `typename %E'" +#~ msgstr "pour référencer un type de membre de canevas de paramètres, utiliser « typename %E »" + +#~ msgid "type/value mismatch at argument %d in template parameter list for `%D'" +#~ msgstr "non concordance de type/valeur pour l'argument %d dans la liste des paramètres du canevas de « %D »" + +#~ msgid " expected a constant of type `%T', got `%T'" +#~ msgstr " attendait une constante de type « %T », a obtenu « %T »" + +#~ msgid " expected a class template, got `%E'" +#~ msgstr " attendait un canevas de classe, a obtenu « %E »" + +#~ msgid " expected a type, got `%E'" +#~ msgstr " attendait un type, a obtenu « %E »" + +#~ msgid " expected a type, got `%T'" +#~ msgstr " attendait un type, a obtenu « %T »" + +#~ msgid " expected a class template, got `%T'" +#~ msgstr " attendait un canevas de classe, a obtenu « %T »" + +#~ msgid " expected a template of type `%D', got `%D'" +#~ msgstr " attendait un canevas de type « %D », a obtenu « %D »" + +#~ msgid "could not convert template argument `%E' to `%T'" +#~ msgstr "ne peut convertir l'argument du canevas « %E » vers « %T »" + +#~ msgid "wrong number of template arguments (%d, should be %d)" +#~ msgstr "nombre erroné d'arguments du canevas (%d devrait être %d)" + +#~ msgid "provided for `%D'" +#~ msgstr "fournie pour « %D »" + +#~ msgid "template argument %d is invalid" +#~ msgstr "canevas de l'argument %d est invalide" + +#~ msgid "non-template used as template" +#~ msgstr "non canevas utilisé comme canevas" + +#~ msgid "non-template type `%T' used as a template" +#~ msgstr "type non canevas « %T » utilisé comme un canevas" + +#~ msgid "for template declaration `%D'" +#~ msgstr "pour la déclaration du canevas « %D »" + +#~ msgid "template instantiation depth exceeds maximum of %d (use -ftemplate-depth-NN to increase the maximum) instantiating `%D'" +#~ msgstr "instantiation de la profondeur du canevas excède le maximum de %d (utiliser -ftemplate-depth-NN pour augmenter le maximum) lors de l'instanciation de « %D »" + +#~ msgid "ambiguous class template instantiation for `%#T'" +#~ msgstr "instanciation ambiguë de canevas de classe pour « %#T »" + +#~ msgid "%s %+#T" +#~ msgstr "%s %+#T" + +#~ msgid "instantiation of `%D' as type `%T'" +#~ msgstr "instanciation de « %D » comme type « %T »" + +#~ msgid "invalid parameter type `%T'" +#~ msgstr "paramètre invalide pour le type « %T »" + +#~ msgid "in declaration `%D'" +#~ msgstr "dans la déclaration de « %D »" + +#~ msgid "creating pointer to member function of non-class type `%T'" +#~ msgstr "création d'un pointeur vers le membre d'une fonction d'un type non classe « %T »" + +#~ msgid "creating array with size zero" +#~ msgstr "création d'un tableau de taille zéro" + +#~ msgid "creating array with size zero (`%E')" +#~ msgstr "création d'un tableau de taille zéro (« %E »)" + +#~ msgid "forming reference to void" +#~ msgstr "formation d'une référence en void" + +#~ msgid "forming %s to reference type `%T'" +#~ msgstr "formant %s pour référencer le type « %T »" + +#~ msgid "creating pointer to member of non-class type `%T'" +#~ msgstr "création d'un pointeur vers le membre d'un type non classe « %T »" + +#~ msgid "creating pointer to member reference type `%T'" +#~ msgstr "création d'un pointeur vers le membre de référence du type « %T »" + +#~ msgid "creating array of `%T'" +#~ msgstr "création du tableau « %T »" + +#~ msgid "creating array of `%T', which is an abstract class type" +#~ msgstr "création d'un tableau « %T », lequel est un type de classe abstraite" + +#~ msgid "`%T' is not a class, struct, or union type" +#~ msgstr "« %T » n'est pas une classe, struct ou un type d'union" + +#~ msgid "use of `%s' in template" +#~ msgstr "utilisation de « %s » dans le canevas" + +#~ msgid "dependent-name `%E' is parsed as a non-type, but instantiation yields a type" +#~ msgstr "nom dépendant « %E » est analysé comme un non type, mais son instantiation le rend comme un type" + +#~ msgid "say `typename %E' if a type is meant" +#~ msgstr "utiliser « typename %E » si un type est désiré" + +#~ msgid "`%T' uses anonymous type" +#~ msgstr "« %T » utilise un type anonyme" + +#~ msgid "`%T' uses local type `%T'" +#~ msgstr "« %T » utilise un type local « %T »" + +#~ msgid "`%T' is a variably modified type" +#~ msgstr "« %T » est type modifié de manière variable" + +#~ msgid "integral expression `%E' is not constant" +#~ msgstr "expression intégrale « %E » n'est pas une constante" + +#~ msgid " trying to instantiate `%D'" +#~ msgstr " tentative d'instanciation « %D »" + +#~ msgid "incomplete type unification" +#~ msgstr "type d'unification incomplète" + +#~ msgid "use of `%s' in template type unification" +#~ msgstr "utilisation de « %s » dans le canevas du type d'unification" + +#~ msgid "explicit instantiation of non-template `%#D'" +#~ msgstr "instanciation explicite d'un non canevas « %#D »" + +#~ msgid "no matching template for `%D' found" +#~ msgstr "non concordance de canevas pour « %D » repéré" + +#~ msgid "explicit instantiation of `%#D'" +#~ msgstr "instanciation explicite de « %#D »" + +#~ msgid "duplicate explicit instantiation of `%#D'" +#~ msgstr "duplication d'instanciation explicite de « %#D »" + +#~ msgid "ISO C++ forbids the use of `extern' on explicit instantiations" +#~ msgstr "ISO C++ interdit l'utilisation de « extern » sur instanciations explicites" + +#~ msgid "storage class `%D' applied to template instantiation" +#~ msgstr "classe de stockage « %D » appliqué à l'instanciation du canevas" + +#~ msgid "explicit instantiation of non-template type `%T'" +#~ msgstr "instanciation explicite de type non canevas « %T »" + +#~ msgid "explicit instantiation of `%#T' before definition of template" +#~ msgstr "instanciation explicite de « %#T » avant la définition de canevas" + +#~ msgid "ISO C++ forbids the use of `%s' on explicit instantiations" +#~ msgstr "ISO C++ interdit l'utilisation de « %s » sur instanciations explicites" + +#~ msgid "duplicate explicit instantiation of `%#T'" +#~ msgstr "duplication d'instanciation explicite de « %#T »" + +#~ msgid "explicit instantiation of `%D' but no definition available" +#~ msgstr "instanciation explicite de « %D » mais pas de définition disponible" + +#~ msgid "`%#T' is not a valid type for a template constant parameter" +#~ msgstr "« %#T » n'a pas un type valide pour un canevas de parametre de constante" + +#~ msgid "-frepo must be used with -c" +#~ msgstr "-frepo doit être utilisé avec -c" + +#~ msgid "mysterious repository information in %s" +#~ msgstr "dépôt mystérieux d'informations dans %s" + +#~ msgid "can't create repository information file `%s'" +#~ msgstr "ne peut créer le fichier « %s » pour dépôt d'informations" + +#~ msgid "cannot use typeid with -fno-rtti" +#~ msgstr "ne peut utiliser typeid avec -fno-rtti" + +#~ msgid "must #include before using typeid" +#~ msgstr "doit utiliser #include avant d'utiliser typeid" + +#~ msgid "cannot create type information for type `%T' because its size is variable" +#~ msgstr "ne peut créer une information pour le type « %T » parce que sa taille est variable" + +#~ msgid "dynamic_cast of `%#D' to `%#T' can never succeed" +#~ msgstr "dynamic_cast de « %#D » vers « %#T » ne pourra jamais réussir" + +#~ msgid "cannot dynamic_cast `%E' (of type `%#T') to type `%#T' (%s)" +#~ msgstr "ne peut effectuer un dynamic_cast « %E » (du type « %#T ») vers le type « %#T » (%s)" + +#~ msgid "`%T' is an ambiguous base of `%T'" +#~ msgstr "« %T » est une base ambiguë de « %T »" + +#~ msgid "`%T' is an inaccessible base of `%T'" +#~ msgstr "« %T » est une base inaccessible de « %T »" + +#~ msgid "invalid covariant return type for `%#D'" +#~ msgstr "type retourné covariant invalide pour « %#D »" + +#~ msgid " overriding `%#D'" +#~ msgstr " écrasant « %#D »" + +#~ msgid "conflicting return type specified for `%#D'" +#~ msgstr "types retournés conflictuels spécifiés pour « %#D »" + +#~ msgid "looser throw specifier for `%#F'" +#~ msgstr "a placé un spécificateur pour « %#F »" + +#~ msgid " overriding `%#F'" +#~ msgstr " écrasant « %#F »" + +#~ msgid "`%#D' cannot be declared" +#~ msgstr "« %#D » ne peut être déclaré" + +#~ msgid " since `%#D' declared in base class" +#~ msgstr " alors que « %#D » est déclaré dans la classe de base" + +#~ msgid "`%#D' needs a final overrider" +#~ msgstr "« %#D » a besoin d'un écraseur final" + +#~ msgid "type of asm operand `%E' could not be determined" +#~ msgstr "type d'opérande asm « %E » ne peut être déterminé" + +#~ msgid "invalid use of member `%D' in static member function" +#~ msgstr "utilisation invalide du membre « %D » dans un membre statique de fonction" + +#~ msgid "from this location" +#~ msgstr "à partir de cette localisation" + +#~ msgid "object missing in reference to `%D'" +#~ msgstr "objet manquant dans la référence à « %D »" + +#~ msgid "arguments to destructor are not allowed" +#~ msgstr "arguments au destructeur ne sont pas permis" + +#~ msgid "`this' is unavailable for static member functions" +#~ msgstr "« cela » n'est pas disponible pour les membres statiques de fonctions" + +#~ msgid "invalid use of `this' in non-member function" +#~ msgstr "utilisation invalide de « ceci » dans un non membre de fonction" + +#~ msgid "invalid use of `this' at top level" +#~ msgstr "utilisation invalide de « this » hors de toute fonction" + +#~ msgid "invalid qualifying scope in pseudo-destructor name" +#~ msgstr "étendue invalide du qualificateur dans un nom de pseudo-destructeur" + +#~ msgid "`%E' is not of type `%T'" +#~ msgstr "« %E » n'est pas un type « %T »" + +#~ msgid "template type parameters must use the keyword `class' or `typename'" +#~ msgstr "canevas de type de paramètres doit utiliser le mot clé « class» ou «typename »" + +#~ msgid "invalid use of type `%T' as a default value for a template template-parameter" +#~ msgstr "utilisation invalide du type « %T » comme valeur par défaut pour un canevas de paramètres de canevas" + +#~ msgid "invalid use of `%D' as a default value for a template template-parameter" +#~ msgstr "utilisation invalide de « %D » comme valeur par défaut pour un canevas de paramètres de canevas" + +#~ msgid "invalid default argument for a template template parameter" +#~ msgstr "utilisation invalide d'argumenet pour un canevas de paramètres de canevas" + +#~ msgid "definition of `%#T' inside template parameter list" +#~ msgstr "définition de « %#T » à l'intérieur d'un canevas de liste de paramètres" + +#~ msgid "invalid definition of qualified type `%T'" +#~ msgstr "définition invalide d'un type qualifié « %T »" + +#~ msgid "previous definition of `%#T'" +#~ msgstr "définition précédente de « %#T »" + +#~ msgid "invalid base-class specification" +#~ msgstr "spécification de base de classe invalide" + +#~ msgid "base class `%T' has cv qualifiers" +#~ msgstr "classe de base « %T » a des qualificateurs cv" + +#~ msgid "multiple declarators in template declaration" +#~ msgstr "déclarateurs multiples dans la déclaration de canevas" + +#~ msgid "incomplete type `%T' used in nested name specifier" +#~ msgstr "type « %T » incomplet utilisé dans un spécificateur de noms imbriqué" + +#~ msgid "`%D' is not a member of `%T'" +#~ msgstr "« %D » n'est pas un membre de « %T »" + +#~ msgid "`%D' is not a member of `%D'" +#~ msgstr "« %D » n'est pas un membre de « %D »" + +#~ msgid "template parameter `%D' of type `%T' is not allowed in an integral constant expression because it is not of integral or enumeration type" +#~ msgstr "paramètre « %D » du canevas du type « %T » ne sont pas permises dans une expression intégrale de constante parce qu'elle n'est pas intégral ou un type énumération" + +#~ msgid "`%D' cannot appear in a constant-expression" +#~ msgstr "« %D » ne peut apparaître dans une expression de constante" + +#~ msgid "use of namespace `%D' as expression" +#~ msgstr "utilisation d'un espace de dnomes « %D » comme expression" + +#~ msgid "use of class template `%T' as expression" +#~ msgstr "utilisation du canevas de classe « %T » comme expression" + +#~ msgid "request for member `%D' is ambiguous in multiple inheritance lattice" +#~ msgstr "requête du membre « %D » est ambiquë dans de mutliples héritage de treillis" + +#~ msgid "use of %s from containing function" +#~ msgstr "utilisation de %s d'un fonction contenante" + +#~ msgid " `%#D' declared here" +#~ msgstr " « %#D » déclaré ici" + +#~ msgid "type of `%E' is unknown" +#~ msgstr "type « %E » est inconnu" + +#~ msgid "non-lvalue in %s" +#~ msgstr "n'est pas un membre gauche dans %s" + +#~ msgid "`%V' qualifiers cannot be applied to `%T'" +#~ msgstr "qualificateur « %V » ne peut pas être appliqué à « %T »" + +#~ msgid "`%s' attribute can only be applied to Java class definitions" +#~ msgstr "attribut « %s » peut seulement être appliqué aux définitions de classes Java" + +#~ msgid "`%s' attribute can only be applied to class definitions" +#~ msgstr "attribut « %s » peut seulement être appliqué aux définitions de classes" + +#~ msgid "`%s' is obsolete; g++ vtables are now COM-compatible by default" +#~ msgstr "« %s » est obsolète; vtables g++ sont maintenant COM-compatibles par défaut" + +#~ msgid "requested init_priority is not an integer constant" +#~ msgstr "init_priority demandé n'est pas une constante entière" + +#~ msgid "can only use `%s' attribute on file-scope definitions of objects of class type" +#~ msgstr "peut seulement utiliser l'attribut « %s » sur la portée de fichier de définitions des objets de type de classe" + +#~ msgid "requested init_priority is out of range" +#~ msgstr "init_priority demandé est hors limite" + +#~ msgid "requested init_priority is reserved for internal use" +#~ msgstr "init_priority demandé est réservé pour un usage interne" + +#~ msgid "`%s' attribute is not supported on this platform" +#~ msgstr "attribut « %s » n'est pas supporté sur cette plate-forme" + +#~ msgid "lang_* check: failed in %s, at %s:%d" +#~ msgstr "vérification lang_* : éched dans %s, à %s:%d" + +#~ msgid "%s between distinct pointer types `%T' and `%T' lacks a cast" +#~ msgstr "%s entre des types distincs de pointeurs « %T » et « %T » manque de transtypage" + +#~ msgid "ISO C++ forbids %s between pointer of type `void *' and pointer-to-function" +#~ msgstr "ISO C++ interdit %s entre les pointeurs de type « void * » et les pointeurs de fonctions" + +#~ msgid "%s between distinct pointer-to-member types `%T' and `%T' lacks a cast" +#~ msgstr "%s entre des types distincs de pointeurs vers les membres « %T » et « %T » manque de transtypage" + +#~ msgid "invalid application of `%s' to a member function" +#~ msgstr "application invalide de « %s » à une fonction membre" + +#~ msgid "invalid application of `%s' to a bit-field" +#~ msgstr "application invalide de « %s » sur un champ de bits" + +#~ msgid "ISO C++ forbids applying `%s' to an expression of function type" +#~ msgstr "ISO C++ interdit l'application de « %s » à une expression d'un type de fonction" + +#~ msgid "invalid use of non-static member function" +#~ msgstr "utilisation invalide d'un membre non statique de fonction" + +#~ msgid "deprecated conversion from string constant to `%T'" +#~ msgstr "conversion obsolète de la chaîne de constante vers « %T »" + +#~ msgid "request for member `%D' in `%E', which is of non-class type `%T'" +#~ msgstr "requête du membre « %D » dans « %E », lequel n'est pas de type classe « %T »" + +#~ msgid "invalid use of nonstatic data member '%E'" +#~ msgstr "utilisation invalide d'un membre de données non statique « %E »" + +#~ msgid "invalid access to non-static data member `%D' of NULL object" +#~ msgstr "accès invalide à un membre de données non statique « %D » d'un objet null" + +#~ msgid "(perhaps the `offsetof' macro was used incorrectly)" +#~ msgstr "(peut-être que le macro « offsetof » a été utilisé incorrectement)" + +#~ msgid "the type being destroyed is `%T', but the destructor refers to `%T'" +#~ msgstr "le type devant être détruit est « %T », mais le destructeur réfère à « %T »" + +#~ msgid "`%D::%D' is not a member of `%T'" +#~ msgstr "« %D::%D » n'est pas un membre de « %T »" + +#~ msgid "`%T' is not a base of `%T'" +#~ msgstr "« %D » n'est pas une base de « %T »" + +#~ msgid "'%D' has no member named '%E'" +#~ msgstr "« %D » n'a pas de membre nommé « %E »" + +#~ msgid "`%D' is not a member template function" +#~ msgstr "« %D » n'est pas une membre du canevas de fonction" + +#~ msgid "`%T' is not a pointer-to-object type" +#~ msgstr "« %T » n'est pas un type pointeur-vers-objet" + +#~ msgid "invalid use of `%s' on pointer to member" +#~ msgstr "utilisation invalide de « %s » sur un pointeur vers un membre" + +#~ msgid "invalid type argument" +#~ msgstr "type d'argument invalide" + +#~ msgid "ISO C++ forbids subscripting non-lvalue array" +#~ msgstr "ISO C++ interdit le souscriptage de non lvalue de tableau" + +#~ msgid "subscripting array declared `register'" +#~ msgstr "souscriptage de tableau déclaré « register »" + +#~ msgid "object missing in use of `%E'" +#~ msgstr "objet manquant dans l'usage de « %E »" + +#~ msgid "ISO C++ forbids calling `::main' from within program" +#~ msgstr "ISO C++ interdit l'appel de «::main» depuis l'intérieur du programme" + +#~ msgid "must use .* or ->* to call pointer-to-member function in `%E (...)'" +#~ msgstr "doit utiliser .* ou ->* pour l'appel de la fonction pointer-to-member dans « %E (...) »" + +#~ msgid "`%E' cannot be used as a function" +#~ msgstr "« %E » ne peut être utilisé comme une fonction" + +#~ msgid "too many arguments to %s `%+#D'" +#~ msgstr "trop d'arguments pour %s « %+#D »" + +#~ msgid "at this point in file" +#~ msgstr "à ce point dans le fichier" + +#~ msgid "parameter %P of `%D' has incomplete type `%T'" +#~ msgstr "paramètre %P de « %D » a un type incomplet « %T »" + +#~ msgid "parameter %P has incomplete type `%T'" +#~ msgstr "paramètre %P a un type incomplet « %T »" + +#~ msgid "too few arguments to %s `%+#D'" +#~ msgstr "pas assez d'argument pour %s « %+#D »" + +#~ msgid "assuming cast to type `%T' from overloaded function" +#~ msgstr "transtypage vers le type « %T » est assumé à partir de la fonction surchargée" + +#~ msgid "division by zero in `%E / 0'" +#~ msgstr "division par zéro dans « %E / 0 »" + +#~ msgid "division by zero in `%E / 0.'" +#~ msgstr "division par zéro dans « %E / 0. »" + +#~ msgid "division by zero in `%E %% 0'" +#~ msgstr "division par zéro dans « %E %% 0 »" + +#~ msgid "division by zero in `%E %% 0.'" +#~ msgstr "division par zéro dans « %E %% 0. »" + +#~ msgid "%s rotate count is negative" +#~ msgstr "compteur de rotation %s est négatif" + +#~ msgid "%s rotate count >= width of type" +#~ msgstr "compteur de rotation %s >= largeur du type" + +#~ msgid "ISO C++ forbids comparison between pointer and integer" +#~ msgstr "ISO C++ interdit la comparaison entre un pointeur et un entier" + +#~ msgid "comparison between types `%#T' and `%#T'" +#~ msgstr "comparaison entre les types « %#T » et « %#T »" + +#~ msgid "comparison between signed and unsigned integer expressions" +#~ msgstr "comparaison entre des expressions entières signée et non signée" + +#~ msgid "invalid operands of types `%T' and `%T' to binary `%O'" +#~ msgstr "opérandes invalides pour les types « %T » et « %T » en binaire « %O »" + +#~ msgid "NULL used in arithmetic" +#~ msgstr "NULL utilisé en arithmétique" + +#~ msgid "ISO C++ forbids using pointer of type `void *' in subtraction" +#~ msgstr "ISO C++ interdit l'utilisation d'un pointeur de type « void * » dans une soustraction" + +#~ msgid "ISO C++ forbids using pointer to a function in subtraction" +#~ msgstr "ISO C++ interdit l'utilisation d'un pointeur survers une fonction dans une soustraction" + +#~ msgid "ISO C++ forbids using pointer to a method in subtraction" +#~ msgstr "ISO C++ interdit l'utilisation d'un pointeur survers une méthode dans une soustraction" + +#~ msgid "invalid use of a pointer to an incomplete type in pointer arithmetic" +#~ msgstr "utilisation invalide d'un pointeur vers un type incomplet dans un pointeur arithmétique" + +#~ msgid "invalid use of '%E' to form a pointer-to-member-function. Use a qualified-id." +#~ msgstr "utilisation invalide de « %E » pour former pointer-to-member-function. Utiliser un identifateur qualifié" + +#~ msgid "parenthesis around '%E' cannot be used to form a pointer-to-member-function" +#~ msgstr "parenthèses autour de « %E » ne peuvent être utilisées pour former pointer-to-member-function" + +#~ msgid "taking address of temporary" +#~ msgstr "prise de l'adresse du temporaire" + +# FIXME: I18N +#~ msgid "ISO C++ forbids %sing an enum" +#~ msgstr "ISO C++ interdit de %ser un enum" + +#~ msgid "cannot %s a pointer to incomplete type `%T'" +#~ msgstr "ne peut utiliser %s comme pointeur sur un type incomplet « %T »" + +#~ msgid "ISO C++ forbids %sing a pointer of type `%T'" +#~ msgstr "ISO C++ interdit %s utilisation d'un pointeur de type « %T »" + +#~ msgid "cast to non-reference type used as lvalue" +#~ msgstr "transtypage d'un type non référencé utilisé comme membre gauche" + +#~ msgid "invalid use of `--' on bool variable `%D'" +#~ msgstr "utilisation invalide de «--» sur une variable booléenne « %D »" + +#~ msgid "ISO C++ forbids taking address of function `::main'" +#~ msgstr "ISO C++ interdit de prendre l'adresse d'une fonction «::main»" + +#~ msgid "ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function. Say `&%T::%D'" +#~ msgstr "ISO C++ interdit de prendre l'adress d'un membre de fonction non statique non qualifié ou entre parenthèses pour former un pointeur d'un membre de fonction. Utilisers «&%T::%D»" + +#~ msgid "ISO C++ forbids taking the address of a bound member function to form a pointer to member function. Say `&%T::%D'" +#~ msgstr "ISO C++ interdit de prendre l'adresse d'une borne d'un membre de fontion pour former un membre à la fonction. Disons «&%T::%D»" + +#~ msgid "ISO C++ forbids taking the address of a cast to a non-lvalue expression" +#~ msgstr "ISO C++ interdit de prendre l'adresse du transtypage vers une expression n'etant pas membre gauche" + +#~ msgid "unary `&'" +#~ msgstr "unaire « & »" + +#~ msgid "attempt to take address of bit-field structure member `%D'" +#~ msgstr "tentative de prise d'adresse du membre « %D » d'une structure de champ de bits" + +#~ msgid "taking address of destructor" +#~ msgstr "prise de l'adresse du destructeur" + +#~ msgid "taking address of bound pointer-to-member expression" +#~ msgstr "prise de l'adresse de la borne de l'expression d'un pointeur-vers-un membre" + +#~ msgid "cannot create pointer to reference member `%D'" +#~ msgstr "ne peut déclarer un pointeur vers le membre de référence « %D »" + +#~ msgid "cannot take the address of `this', which is an rvalue expression" +#~ msgstr "ne peut prendre l'adresse de « ceci », laquelle est une expression rvalue" + +#~ msgid "address requested for `%D', which is declared `register'" +#~ msgstr "adresse requise pour « %D», lequel est déclaré «register »" + +#~ msgid "%s expression list treated as compound expression" +#~ msgstr "%s liste d'expressions traitée comme une expression composée" + +#~ msgid "%s from type `%T' to type `%T' casts away constness" +#~ msgstr "%S à partir du « %T » vers le type « %T » provoque un transtypage sans constante" + +#~ msgid "invalid static_cast from type `%T' to type `%T'" +#~ msgstr "static_cast invalide du type « %T » au type « %T »" + +#~ msgid "invalid reinterpret_cast of an rvalue expression of type `%T' to type `%T'" +#~ msgstr "reinterpret_cast invalide d'une expression rvalue de type « %T » vers le type « %T »" + +#~ msgid "reinterpret_cast from `%T' to `%T' loses precision" +#~ msgstr "reinterpret_cast de « %T » vers « %T » génère une perte de précision" + +#~ msgid "ISO C++ forbids casting between pointer-to-function and pointer-to-object" +#~ msgstr "ISO C++ interdit le transtypage entre un pointeur de fonction et un pointeur d'objet" + +#~ msgid "invalid reinterpret_cast from type `%T' to type `%T'" +#~ msgstr "reinterpret_cast invalide à partir du type « %T » vers le type « %T »" + +#~ msgid "invalid use of const_cast with type `%T', which is not a pointer, reference, nor a pointer-to-data-member type" +#~ msgstr "utilisation invalide de const_cast avec le type « %T », lequel n'est pas un pointeur, une référence, ni un type pointeur-vers-données-membre" + +#~ msgid "invalid use of const_cast with type `%T', which is a pointer or reference to a function type" +#~ msgstr "utilisation invalide de const_cast avec le type « %T », lequel est un pointeur ou un référence à un type de fonction" + +#~ msgid "invalid const_cast of an rvalue of type `%T' to type `%T'" +#~ msgstr "const_cast invalide de la rvalue du type « %T » vers le type « %T »" + +#~ msgid "invalid const_cast from type `%T' to type `%T'" +#~ msgstr "const_cast invalide à partir du type « %T » vers le type « %T »" + +#~ msgid "ISO C++ forbids casting to an array type `%T'" +#~ msgstr "ISO C++ interdit le transtypage vers un type tableau « %T »" + +#~ msgid "invalid cast to function type `%T'" +#~ msgstr "transtypage invalide pour un type de fonction « %T »" + +#~ msgid "cast from `%T' to `%T' discards qualifiers from pointer target type" +#~ msgstr "transtypage de « %T » vers « %T » écarte les qualificateurs du type cible du pointeur" + +#~ msgid "cast from `%T' to `%T' increases required alignment of target type" +#~ msgstr "transtypage de « %T » vers « %T » augmente l'alignement requis pour le type ciblé" + +#~ msgid " in evaluation of `%Q(%#T, %#T)'" +#~ msgstr " lors de l'évaluation de « %Q(%#T, %#T) »" + +#~ msgid "ISO C++ forbids cast to non-reference type used as lvalue" +#~ msgstr "ISO C++ interdit le transtypage d'un type non référencé utilisé comme membre gauche" + +#~ msgid "incompatible types in assignment of `%T' to `%T'" +#~ msgstr "type incompatible dans l'affectation de « %T » vers « %T »" + +#~ msgid "ISO C++ forbids assignment of arrays" +#~ msgstr "ISO C++ interdit l'affectation de tableaux" + +#~ msgid " in pointer to member function conversion" +#~ msgstr " dans la conversion d'un pointeur vers un membre de fonction" + +#~ msgid " in pointer to member conversion" +#~ msgstr " dans la conversion d'un pointeur vers un membre" + +#~ msgid "pointer to member cast via virtual base `%T'" +#~ msgstr "pointeur vers un membre transtypé via la base virtuelle « %T »" + +#~ msgid "pointer to member conversion via virtual base `%T'" +#~ msgstr "conversion de pointeur à membre à l'aide de la base virtuelle « %T »" + +#~ msgid "invalid conversion to type `%T' from type `%T'" +#~ msgstr "conversion invalide vers un type « %T » à partir du type « %T »" + +#~ msgid "passing NULL used for non-pointer %s %P of `%D'" +#~ msgstr "passage d'un NULL utilisé pour un non pointeur %s %P de « %D »" + +#~ msgid "%s to non-pointer type `%T' from NULL" +#~ msgstr "%s vers un type non pointeur « %T » à partir d'un NULL" + +#~ msgid "passing `%T' for %s %P of `%D'" +#~ msgstr "passage « %T » pour %s %P de « %D »" + +#~ msgid "%s to `%T' from `%T'" +#~ msgstr "%s vers « %T » à partir de « %T »" + +#~ msgid "passing negative value `%E' for %s %P of `%D'" +#~ msgstr "passage de valeur négative « %E » pour %s %P de « %D »" + +#~ msgid "%s of negative value `%E' to `%T'" +#~ msgstr "%s de valeur négative « %E » vers « %T »" + +#~ msgid "cannot convert `%T' to `%T' for argument `%P' to `%D'" +#~ msgstr "ne peut convertir « %T » à « %T » pour l'argument « %P » vers « %D »" + +#~ msgid "cannot convert `%T' to `%T' in %s" +#~ msgstr "ne peut convertir « %T » vers « %T » dans %s" + +#~ msgid "in passing argument %P of `%+D'" +#~ msgstr "dans le passage de l'argument %P de « %+D »" + +#~ msgid "returning reference to temporary" +#~ msgstr "retourné la référence vers le temporaire" + +#~ msgid "reference to non-lvalue returned" +#~ msgstr "une référence vers quelque chose n'étant pas un membre gauche a été retourné" + +#~ msgid "reference to local variable `%D' returned" +#~ msgstr "référence vers une variable locale « %D » retourné" + +#~ msgid "address of local variable `%D' returned" +#~ msgstr "adresse d'une variable locale « %D » retournée" + +#~ msgid "returning a value from a destructor" +#~ msgstr "retourné une valeur du destructeur" + +#~ msgid "cannot return from a handler of a function-try-block of a constructor" +#~ msgstr "ne peut retourner d'un handler d'une fonction try-block d'un constructeur" + +#~ msgid "returning a value from a constructor" +#~ msgstr "retourné une valeur d'un constructeur" + +#~ msgid "return-statement with no value, in function returning '%T'" +#~ msgstr "déclaration à retourner sans valeur dans une fonction retournant « %T »" + +#~ msgid "return-statement with a value, in function returning 'void'" +#~ msgstr "déclaration éa retourner avec une valeur dans une fonction retournant un « void »" + +#~ msgid "`operator new' must not return NULL unless it is declared `throw()' (or -fcheck-new is in effect)" +#~ msgstr "« operator new» ne doit pas retourner NULL à moins qu'il ne soit déclaré «throw() » (ou -fcheck-new est utilisée)" + +#~ msgid "type `%T' is not a base type for type `%T'" +#~ msgstr "type « %T » n'est pas un type de base pour le type « %T »" + +#~ msgid "cannot declare variable `%D' to be of type `%T'" +#~ msgstr "ne peut déclarer la variable « %D » comme étant de type « %T »" + +#~ msgid "cannot declare parameter `%D' to be of type `%T'" +#~ msgstr "ne peut déclarer la paramètre « %D » comme étant de type « %T »" + +#~ msgid "cannot declare field `%D' to be of type `%T'" +#~ msgstr "ne peut déclarer la champ « %D » comme étant de type « %T »" + +#~ msgid "invalid return type for member function `%#D'" +#~ msgstr "type retourné invalide pour le membre de la fonction « %#D »" + +#~ msgid "invalid return type for function `%#D'" +#~ msgstr "type retourné invalide pour la fonction « %#D »" + +#~ msgid "cannot allocate an object of type `%T'" +#~ msgstr "ne peut allouer un objet de type « %T »" + +#~ msgid " because the following virtual functions are abstract:" +#~ msgstr " parce que les fonctions viruelles suivantes sont abstraites:" + +#~ msgid "\t%#D" +#~ msgstr "\t%#D" + +#~ msgid " since type `%T' has abstract virtual functions" +#~ msgstr " depuis que le type « %T » a des fonctions virtuelles abstraites" + +#~ msgid "constructor syntax used, but no constructor declared for type `%T'" +#~ msgstr "syntaxe de constructeur utilisé mais aucun constructeur déclaré pour le type « %T »" + +#~ msgid "cannot initialize arrays using this syntax" +#~ msgstr "ne peut initialiser les tableaux en utilisant la syntaxe" + +#~ msgid "initializing array with parameter list" +#~ msgstr "initialise le tableau avec la liste des paramètres" + +#~ msgid "initializer for scalar variable requires one element" +#~ msgstr "l'initialisation de variable scalaire requiert un élément" + +#~ msgid "braces around scalar initializer for `%T'" +#~ msgstr "accolades autour de l'initialiseur scalaire pour « %T »" + +#~ msgid "ignoring extra initializers for `%T'" +#~ msgstr "initialiseurs superflus pour « %T » ignorés" + +#~ msgid "variable-sized object of type `%T' may not be initialized" +#~ msgstr "un objet de taille variable de type « %T » peut ne pas être initialisé" + +#~ msgid "subobject of type `%T' must be initialized by constructor, not by `%E'" +#~ msgstr "sous-objet de type « %T » doit être initialisé par un constructeur, non pas par « %E »" + +#~ msgid "aggregate has a partly bracketed initializer" +#~ msgstr "aggrégat a un initialiseur partiellement entouré d'accolades" + +#~ msgid "non-trivial labeled initializers" +#~ msgstr "initialiseur étiqueté de manière non trivial" + +#~ msgid "non-empty initializer for array of empty elements" +#~ msgstr "initialiseurs non vides pour un tableau d'éléments vides" + +#~ msgid "initializer list for object of class with virtual base classes" +#~ msgstr "liste d'initialiseurs pour les objets de classe avec classes de base virtuelles" + +#~ msgid "initializer list for object of class with base classes" +#~ msgstr "liste d'initialiseurs pour les objets de classe avec classes de base" + +#~ msgid "initializer list for object using virtual functions" +#~ msgstr "liste d'initialiseurs pour objet utilisant des fonctions virtuelles" + +#~ msgid "missing initializer for member `%D'" +#~ msgstr "initialiseur manquant pour le membre « %D »" + +#~ msgid "uninitialized const member `%D'" +#~ msgstr "membre de constante non initialisé pour « %D »" + +#~ msgid "member `%D' with uninitialized const fields" +#~ msgstr "membre « %D » avec des champs de constantes non initialisée" + +#~ msgid "member `%D' is uninitialized reference" +#~ msgstr "membre « %D » est une référence non initialisée" + +#~ msgid "index value instead of field name in union initializer" +#~ msgstr "valeur index au lieu du nom de champ dans l'initialiseur d'union" + +#~ msgid "no field `%D' in union being initialized" +#~ msgstr "pas de champ « %D » dans l'aggrégat n'a été initialisé" + +#~ msgid "union `%T' with no named members cannot be initialized" +#~ msgstr "aggrégat « %T » sans mambre nommé ne peut être initialisé" + +#~ msgid "excess elements in aggregate initializer" +#~ msgstr "éléments en excès dans l'initialiseur d'aggrégat" + +#~ msgid "circular pointer delegation detected" +#~ msgstr "délégation de pointeur circulaire détecté" + +#~ msgid "base operand of `->' has non-pointer type `%T'" +#~ msgstr "l'opérande de base de «->» a un type non pointeur « %T »" + +#~ msgid "result of `operator->()' yields non-pointer result" +#~ msgstr "résultat de « operator->() » laisse comme résultat un non pointeur" + +#~ msgid "base operand of `->' is not a pointer" +#~ msgstr "l'opérande de base de «->» n'est pas un pointeur" + +#~ msgid "`%E' cannot be used as a member pointer, since it is of type `%T'" +#~ msgstr "« %E » ne peut être utilisé comme pointeur de membre, alors qu'il est de type « %T »" + +#~ msgid "cannot apply member pointer `%E' to `%E', which is of non-aggregate type `%T'" +#~ msgstr "ne peut appliquer un pointeur de membre « %E » à « %E », lequel n'est pas un type d'aggrégat « %T »" + +#~ msgid "member type `%T::' incompatible with object type `%T'" +#~ msgstr "type du membre « %T:: » incompatible avec le type d'objet « %T »" + +#~ msgid "call to function `%D' which throws incomplete type `%#T'" +#~ msgstr "l'appel à la fonction « %D » laquelle écarte le type incomplet « %T »" + +#~ msgid "call to function which throws incomplete type `%#T'" +#~ msgstr "l'appel à la fonction laquelle écarte le type incomplet « %T »" + +#~ msgid "%s is deprecated, please see the documentation for details" +#~ msgstr "%s est obsolète, SVP voir la documentation pour les détails" + +#~ msgid "note:" +#~ msgstr "note :" + +#~ msgid "warning:" +#~ msgstr "avertissement :" + +#~ msgid "fatal:" +#~ msgstr "fatal :" + +#~ msgid "(continued):" +#~ msgstr "(suite) :" + +#~ msgid "[REPORT BUG!!] %" +#~ msgstr "[RAPPORTER L'ANOMALIE!!] %" + +#~ msgid "[REPORT BUG!!]" +#~ msgstr "[RAPPORTER L'ANOMALIE!!]" + +#~ msgid "ASSIGN'ed label cannot fit into `%A' at %0 -- using wider sibling" +#~ msgstr "l'étiquette affectée ne peut s'insérer dans « %A » à %0 - utilisation d'un voisinage plus grand" + +#~ msgid "no INTEGER type can hold a pointer on this configuration" +#~ msgstr "AUCUN type ENTIER ne peut tenir un pointeur sur cette configuration" + +#~ msgid "configuration: REAL, INTEGER, and LOGICAL are %d bits wide," +#~ msgstr "configuration : REAL, INTEGER, et LOGICAL ont %d bits," + +#~ msgid "and pointers are %d bits wide, but g77 doesn't yet work" +#~ msgstr "et les pointeurs ont %d bits, mais g77 ne fonctionne pas encore" + +#~ msgid "properly unless they all are 32 bits wide" +#~ msgstr "correctement à moins qu'ils aient tous 32 bits de largeur" + +#~ msgid "Please keep this in mind before you report bugs." +#~ msgstr "SVP garder cela en tête avant de rapporter les anomalies." + +#~ msgid "configuration: char * holds %d bits, but ftnlen only %d" +#~ msgstr "configuration: char * contient %d bits, mais ftnlen seulement %d" + +#~ msgid "" +#~ "configuration: char * holds %d bits, but INTEGER only %d --\n" +#~ " ASSIGN statement might fail" +#~ msgstr "" +#~ "configuration: char * contient %d bits, mais INTEGER seulement %d --\n" +#~ " déclaration ASSIGN pourrait échouer" + +#~ msgid "In statement function" +#~ msgstr "Dans la déclaration de fonction" + +#~ msgid "Outside of any program unit:\n" +#~ msgstr "En dehors de toute unité de programme:\n" + +#~ msgid "%A from %B at %0%C" +#~ msgstr "%A à partir de %B à %0%C" + +#~ msgid "At %0, INCLUDE file %A exists, but is not readable" +#~ msgstr "À %0, fichier INCLUDE %A existe mais n'est pas lisible" + +#~ msgid "At %0, INCLUDE nesting too deep" +#~ msgstr "À %0, imbrication du INCLUDE est trop profonde" + +#~ msgid "Two arithmetic operators in a row at %0 and %1 -- use parentheses" +#~ msgstr "Deux opérateurs arithmétiques dans la rangée à %0 et %1 -- utiliser des parenthèses" + +#~ msgid "Operator at %0 has lower precedence than that at %1 -- use parentheses" +#~ msgstr "L'opérateur à %0 a une précédence plus basse que celui à %1 -- utiliser des parenthèses" + +#~ msgid "Use .EQV./.NEQV. instead of .EQ./.NE. at %0 for LOGICAL operands at %1 and %2" +#~ msgstr "Utiliser .EQV./.NEQV. au lieu de .EQ./.NE. à %0 pour les opérandes LOGICAL à %1 et %2" + +#~ msgid "Unsupported operand for ** at %1 -- converting to default INTEGER" +#~ msgstr "Opérande non supportée pour ** à %1 -- conversion à INTEGER par défaut" + +#~ msgid "overflowed output arg list for `%s'" +#~ msgstr "débordement de la liste d'arguments de sortie pour « %s »" + +#~ msgid "" +#~ "GNU Fortran comes with NO WARRANTY, to the extent permitted by law.\n" +#~ "You may redistribute copies of GNU Fortran\n" +#~ "under the terms of the GNU General Public License.\n" +#~ "For more information about these matters, see the file named COPYING\n" +#~ "or type the command `info -f g77 Copying'.\n" +#~ msgstr "" +#~ "GNU Fortran est fourni sans aucune garantie, selon les limites permises par la loi.\n" +#~ "Vous pouvez redistribuer des copies de GNU Fortran\n" +#~ "selon les termes de la GNU General Public License.\n" +#~ "Pour plus d'informations à ce sujet, consulter le fichier portant le nom COPYING\n" +#~ "ou taper la commande `info -f g77 Copying'.\n" + +#~ msgid "--driver no longer supported" +#~ msgstr "--driver n'est plus supporté" + +#~ msgid "argument to `%s' missing" +#~ msgstr "argument pour « %s » est manquant" + +#~ msgid "no input files; unwilling to write output files" +#~ msgstr "aucun fichier d'entrée; pas d'accord pour écrire dans les fichiers de sortie" + +#~ msgid "Implicit declaration of `%A' at %0" +#~ msgstr "déclaration implicite de « %A » à %0" + +#~ msgid "Non-ISO-C-standard escape sequence `\\%A' at %0" +#~ msgstr "séquence d'échappement non conforme au standard ISO C «\\%A» à %0" + +#~ msgid "Unknown escape sequence `\\%A' at %0" +#~ msgstr "séquence d'échappement inconnue «\\%A» à %0" + +#~ msgid "Unterminated escape sequence `\\' at %0" +#~ msgstr "séquence d'échappement non terminée «\\» at %0" + +#~ msgid "Unknown escape sequence `\\' followed by char code 0x%A at %0" +#~ msgstr "séquence d'échappement inconnue «\\» suivi par le code de caractères 0x%A at %0" + +#~ msgid "\\x used at %0 with no following hex digits" +#~ msgstr "\\x utilisé à %0 sans être suivi des chiffres hexdécimaux" + +#~ msgid "Hex escape at %0 out of range" +#~ msgstr "échappement hexadécimal à %0 hors limite" + +#~ msgid "Escape sequence at %0 out of range for character" +#~ msgstr "séquence d'échappement à %0 hors limite pour le type caractère" + +#~ msgid "hex escape out of range" +#~ msgstr "échappement hexadécimal hors limite" + +#~ msgid "non-ANSI-standard escape sequence, `\\%c'" +#~ msgstr "séquence d'échappement n'est pas ANSI standard: «\\%c'" + +#~ msgid "non-ISO escape sequence `\\%c'" +#~ msgstr "séquence d'échappement non ISO «\\%c'" + +#~ msgid "unknown escape sequence `\\%c'" +#~ msgstr "séquence d'échappement inconnue: «\\%c'" + +#~ msgid "unknown escape sequence: `\\' followed by char code 0x%x" +#~ msgstr "séquence d'échappement inconnue: «\\» suivi par le code de caractères 0x%x" + +#~ msgid "badly formed directive -- no closing quote" +#~ msgstr "directive mal composée -- pas de guillement ou d'apostrophe de fermeture" + +#~ msgid "#-lines for entering and leaving files don't match" +#~ msgstr "#-lines pour entrer et quitter les fichiers ne concordent pas" + +#~ msgid "bad directive -- missing close-quote" +#~ msgstr "directive erronée -- manque un apostrophe ou un guillemet de fermeture" + +#~ msgid "invalid #ident" +#~ msgstr "#ident invalide" + +#~ msgid "undefined or invalid # directive" +#~ msgstr "directive # non définie ou invalide" + +#~ msgid "invalid #line" +#~ msgstr "#line invalide" + +#~ msgid "use `#line ...' instead of `# ...' in first line" +#~ msgstr "utiliser « #line ... » au lieu de « # ... » dans la première ligne" + +#~ msgid "invalid #-line" +#~ msgstr "#-line invalide" + +#~ msgid "Null character at %0 -- line ignored" +#~ msgstr "caractère null à %0 -- ligne ignorée" + +#~ msgid "INCLUDE at %0 not the only statement on the source line" +#~ msgstr "INCLUDE à %0 n'est pas la seule déclaration sur la ligne source" + +#~ msgid "ASSIGNed FORMAT specifier is too small" +#~ msgstr "spécificateur dans ASSIGN FORMAT est trop petit" + +#~ msgid "SELECT CASE on CHARACTER type (at %0) not supported -- sorry" +#~ msgstr "SÉLECTION du CASE sur un type CHARACTER (à %0) n'est pas supporté -- désolé" + +#~ msgid "SELECT (at %0) has duplicate cases -- check integer overflow of CASE(s)" +#~ msgstr "SELECT (à %0) possède des cases doubles -- vérifier le débordement d'entier des CASES" + +#~ msgid "ASSIGN to variable that is too small" +#~ msgstr "ASSIGN à la variable est trop petit" + +#~ msgid "ASSIGNed GOTO target variable is too small" +#~ msgstr "variable cible par ASSIGN GOTO est trop petite" + +#~ msgid "Local adjustable symbol `%A' at %0" +#~ msgstr "Symbole local ajustable « %A » à %0" + +#~ msgid "data initializer on host with different endianness" +#~ msgstr "initialiseur de données sur l'hôte a un alignement des octets différent (endian)" + +#~ msgid "-fvxt-not-f90 no longer supported -- try -fvxt" +#~ msgstr "-fvxt-not-f90 n'est plus supporté -- essayer -fvxt" + +#~ msgid "-ff90-not-vxt no longer supported -- try -fno-vxt -ff90" +#~ msgstr "-ff90-not-vxt n'est plus supporté -- essayer -fno-vxt -ff90" + +#~ msgid "-fdebug-kludge is disabled, use normal debugging flags" +#~ msgstr "-fdebug-kludge est désactivé, utiliser le fanion normal de mise au point" + +#~ msgid "Missing first operand for binary operator at %0" +#~ msgstr "première opérande manquante pour l'opérateur biunaire à %0" + +#~ msgid "Zero-length character constant at %0" +#~ msgstr "constante caractère de longueur zéro à %0" + +#~ msgid "Invalid token at %0 in expression or subexpression at %1" +#~ msgstr "élément lexical invalide à %0 dans l'expression ou la sous-expression à %1" + +#~ msgid "Missing operand for operator at %1 at end of expression at %0" +#~ msgstr "Opérande manquante pour l'opérateur %1 à la fin de l'expresssion à %0" + +#~ msgid "Label %A already defined at %1 when redefined at %0" +#~ msgstr "Étiquette %A déjà définie à %1 et redéfinie à %0" + +#~ msgid "Unrecognized character at %0 [info -f g77 M LEX]" +#~ msgstr "Caractère non reconnue à %0 [info -f g77 M LEX]" + +#~ msgid "Label definition %A at %0 on empty statement (as of %1)" +#~ msgstr "Définition d'étiquette %A à %0 dans une déclaration vide (comme %1)" + +#~ msgid "Invalid first character at %0 [info -f g77 M LEX]" +#~ msgstr "Premier caractère invalide à %0 [info -f g77 M LEX]" + +#~ msgid "Line too long as of %0 [info -f g77 M LEX]" +#~ msgstr "Ligne trop longue tel que %0 [info -f g77 M LEX]" + +#~ msgid "Non-numeric character at %0 in label field [info -f g77 M LEX]" +#~ msgstr "Caractère non-numérique à %0 dans le champ d'étiquette [info -f g77 M LEX]" + +#~ msgid "Label number at %0 not in range 1-99999" +#~ msgstr "Numéro d'étiquette à %0 n'est pas entre les bornes 1-99999" + +#~ msgid "At %0, '!' and '/*' are not valid comment delimiters" +#~ msgstr "À %0, « ! » et « /* » ne sont pas des délimiteurs de commentaire valides" + +#~ msgid "Continuation indicator at %0 must appear in column 6 [info -f g77 M LEX]" +#~ msgstr "Indicateur de continuation à %0 doit apparaître en colonne 6 [info -f g77 M LEX]" + +#~ msgid "Label at %0 invalid with continuation line indicator at %1 [info -f g77 M LEX]" +#~ msgstr "Étiquette invalide à %0 avec l'indicateur de continuation de ligne à %1 [info -f g77 M LEX]" + +#~ msgid "Character constant at %0 has no closing apostrophe at %1" +#~ msgstr "constante caractère à %0 n'a pas d'apostrophe de fermeture à %1" + +#~ msgid "Hollerith constant at %0 specified %A more characters than are present as of %1" +#~ msgstr "Constante Hollerith à %0 spécifiée %A a plus de caractères que ceux présents dans %1" + +#~ msgid "Missing close parenthese at %0 needed to match open parenthese at %1" +#~ msgstr "Paranethèse fermante amnquante à %0 nécessaire pour pairer la parenthèse ouverte à %1" + +#~ msgid "Integer at %0 too large" +#~ msgstr "entier à %0 est trop grand" + +#~ msgid "Period at %0 not followed by digits for floating-point number or by `NOT.', `TRUE.', or `FALSE.'" +#~ msgstr "Période à %0 n'est pas suivie de chiffres en nombre flottant ou de « NOT.», «TRUE.», ou «FALSE. »" + +#~ msgid "Missing close-period between `.%A' at %0 and %1" +#~ msgstr "Fermeture de période manquante entre «.%A» à %0 et %1" + +#~ msgid "Invalid exponent at %0 for real constant at %1; nondigit `%A' in exponent field" +#~ msgstr "Exposant invalide à %0 pour la constante réelle à %1; « %A » n'est pas un chiffre dans le champ de l'exposant" + +#~ msgid "Missing value at %1 for real-number exponent at %0" +#~ msgstr "Valeur manquante à %1 pour l'exposant d'un nombre réeal à %0" + +#~ msgid "Expected binary operator between expressions at %0 and at %1" +#~ msgstr "Opérateur binaire attendu entre les expressions à %0 et à %1" + +#~ msgid "Semicolon at %0 is an invalid token" +#~ msgstr "Point-virgule (« ; ») en %0 est un élément lexical invalide" + +#~ msgid "Extraneous comma in FORMAT statement at %0" +#~ msgstr "Virgule superflue dans la déclaration de FORMAT à %0" + +#~ msgid "Missing comma in FORMAT statement at %0" +#~ msgstr "Virgule manquante dans la déclaration de FORMAT à %0" + +#~ msgid "Spurious sign in FORMAT statement at %0" +#~ msgstr "faux signe dans la déclaration de FORMAT à %0" + +#~ msgid "Spurious number in FORMAT statement at %0" +#~ msgstr "faux nombre dans la déclaration de FORMAT à %0" + +#~ msgid "Spurious text trailing number in FORMAT statement at %0" +#~ msgstr "faux texte terminant le nombre dans la déclaration de FORMAT à %0" + +#~ msgid "Unrecognized FORMAT specifier at %0" +#~ msgstr "spécificateur de FORMAT non reconnu à %0" + +#~ msgid "Missing close-parenthese(s) in FORMAT statement at %0" +#~ msgstr "Parenthèse(s) fermante(s) manquante(s) dans la déclaration de FORMAT à %0" + +#~ msgid "Missing number following period in FORMAT statement at %0" +#~ msgstr "Nombre manquant suivant la période dans la déclaration de FORMAT à %0" + +#~ msgid "Missing number following `E' in FORMAT statement at %0" +#~ msgstr "Nombre manquant suivant « E » dans la déclaration de FORMAT à %0" + +#~ msgid "Spurious trailing comma preceding terminator at %0" +#~ msgstr "fausse virgule qui traîne dans la précédente terminaison à %0" + +#~ msgid "At %0, specify OPERATOR instead of ASSIGNMENT for INTERFACE statement not specifying the assignment operator (=)" +#~ msgstr "À %0, spécifier l'OPÉRATEUR au lieu de l'AFFECTATION pour le déclaration d'INTERFACE ne spécifiant pas d'opérateur d'affectation (=)" + +#~ msgid "At %0, specify ASSIGNMENT instead of OPERATOR for INTERFACE statement specifying the assignment operator (=)" +#~ msgstr "À %0, spécifier une AFFECTATION au lieu d'un OPÉRATEUR dans la déclaration d'INTERFACE spécifiant un opérateur d'affectation (=)" + +#~ msgid "Cannot specify =initialization-expr at %0 unless `::' appears before list of objects" +#~ msgstr "Ne peut spécifier une expression d'initialisation = à %0 à moins que «::» n'apparaissae avant la liste d'objets" + +#~ msgid "Reference to label at %1 inconsistent with its definition at %0" +#~ msgstr "La référence à l'étiquette à %1 est inconsistente avec sa définition à %0" + +#~ msgid "Reference to label at %1 inconsistent with earlier reference at %0" +#~ msgstr "La référence à l'étiquette à %1 est inconsistente avec sa précédente référence à %0" + +#~ msgid "DO-statement reference to label at %1 follows its definition at %0" +#~ msgstr "Déclaration DO utilisant une référence à l'étiquette à %1 suis sa définition à %0" + +#~ msgid "Reference to label at %1 is outside block containing definition at %0" +#~ msgstr "Référence à l'étiquette à %1 est en dehors du bloc contenant la définition à %0" + +#~ msgid "DO-statement references to label at %0 and %2 separated by unterminated block starting at %1" +#~ msgstr "Déclaration DO utilisant des références à l'étiquette à %0 et %2 séparés par un bloc non complet débutant à %1" + +#~ msgid "DO-statement reference to label at %0 and label definition at %2 separated by unterminated block starting at %1" +#~ msgstr "Déclaration DO utilisant une référence à l'étiquette à %0 et la définition d'étiquette à %2 séparés par un bloc non complet débutant à %1" + +#~ msgid "Label definition at %0 invalid on this kind of statement" +#~ msgstr "définition d'étiquette à %0 invalide pour ce genre de déclaration" + +#~ msgid "Statement at %0 invalid in this context" +#~ msgstr "déclaration à %0 invalide dans ce contexte" + +#~ msgid "Statement at %0 invalid in context established by statement at %1" +#~ msgstr "déclaration à %0 invalide dans le contexte établi par la déclaration à %1" + +#~ msgid "Statement at %0 must specify construct name specified at %1" +#~ msgstr "Déclaration à %0 doit spécifier un nom de construit spécifié à %1" + +#~ msgid "Construct name at %0 superfluous, no construct name specified at %1" +#~ msgstr "Nom de construit à %0 superflue, aucun nom de construit spécifié à %1" + +#~ msgid "Construct name at %0 not the same as construct name at %1" +#~ msgstr "Nom de construit à %0 n'est pas le même que celui à %1" + +#~ msgid "Construct name at %0 does not match construct name for any containing DO constructs" +#~ msgstr "Nom de construit à %0 ne concorde pas avec un nom de construit contenant des construits DO" + +#~ msgid "Label definition missing at %0 for DO construct specifying label at %1" +#~ msgstr "Définition d'étiquette manquante à %0 pour le construit DO spécifiant l'étiquette à %1" + +#~ msgid "Statement at %0 follows ELSE block for IF construct at %1" +#~ msgstr "Déclaration à %0 suivant un bloc ELSE pour le construit IF à %1" + +#~ msgid "No label definition for FORMAT statement at %0" +#~ msgstr "pas de définition d'étiquette pour la déclaration de FORMAT à %0" + +#~ msgid "Second occurrence of ELSE WHERE at %0 within WHERE at %1" +#~ msgstr "Seconde occurente de ELSE WHERE à %0 à l'intérieur du WHERE à %1" + +#~ msgid "END statement at %0 missing `%A' keyword required for internal or module procedure(s) bounded by %1" +#~ msgstr "déclaration END à %0 manquante mot clé « %A » requis pour une procédure interne ou un module lié à %1" + +#~ msgid "MODULE PROCEDURE statement at %0 disallowed because INTERFACE at %1 specifies no generic name, operator, or assignment" +#~ msgstr "déclaration de MODULE PROCEDURE à %0 non permise parce que l'INTERFACE à %1 ne spécifie pas de nom générique, d'opérateur ou d'affectation" + +#~ msgid "BLOCK DATA name at %0 superfluous, no name specified at %1" +#~ msgstr "nom du BLOCK DATA à %0 superflue, aucun nom spécifié à %1" + +#~ msgid "Program name at %0 superfluous, no PROGRAM statement specified at %1" +#~ msgstr "nom de programme à %0 superflue, aucune déclaration PROGRAM spécifié à %1" + +#~ msgid "Program unit name at %0 not the same as name at %1" +#~ msgstr "nom de l'unité programme à %0 n'est pas le même que le nom à %1" + +#~ msgid "Type name at %0 not the same as name at %1" +#~ msgstr "Nom de type à %0 n'est pas le même que le nom à %1" + +#~ msgid "End of source file before end of block started at %0" +#~ msgstr "Fin du fichier source avant la fin du bloc débutant à %0" + +#~ msgid "Undefined label, first referenced at %0" +#~ msgstr "Étiquette non définie, première référence à %0" + +#~ msgid "SAVE statement or attribute at %1 cannot be specified along with SAVE statement or attribute at %0" +#~ msgstr "déclaration SAVE ou attribut à %1 ne peut être spécifiée en même temps avec la déclaration SAVE ou l'attribut à %0" + +#~ msgid "PUBLIC or PRIVATE statement at %1 cannot be specified along with PUBLIC or PRIVATE statement at %0" +#~ msgstr "déclaration PUBLIC ou PRIVATE à %1 ne peut être spécifié en même temps avec la déclaration PUBLIC ou PRIVATE à %0" + +#~ msgid "RETURN statement at %0 invalid within a main program unit" +#~ msgstr "déclaration RETURN à %0 invalide à l'intérieur de l'unité du programme principal" + +#~ msgid "Alternate return specifier at %0 invalid within a main program unit" +#~ msgstr "spécificateur alternatif de retour à %0 invalide à l'intérieur de l'unité du programme principal" + +#~ msgid "Alternate return specifier at %0 invalid within a function" +#~ msgstr "spécificateur alternatif de retour à %0 invalide à l'intérieur de la fonction" + +#~ msgid "Access specifier or PRIVATE statement at %0 invalid for derived-type definition within other than the specification part of a module" +#~ msgstr "spécificateur d'accès ou déclaration PRIVATE à %0 invalide pour une définition de type dérivé à l'intérieur d'autre chose que la portion de spécification d'un module" + +#~ msgid "Access specifier at %0 must immediately follow derived-type statement at %1 with no intervening statements" +#~ msgstr "Spécificateur d'accès à %0 doit suivre immédaitement la déclaration de type dérivé à %1 sans intervention de déclarations" + +#~ msgid "No components specified as of %0 for derived-type definition beginning at %1" +#~ msgstr "Aucun composant spécifié tel que %0 pour une définition de type dérivé débutant à %1" + +#~ msgid "No components specified as of %0 for structure definition beginning at %1" +#~ msgstr "Aucun composant spécifié tel que %0 pour la définition de structure débutant à %1" + +#~ msgid "Missing structure name for outer structure definition at %0" +#~ msgstr "Nom de structure manquant pour la définition de structure externe à %0" + +#~ msgid "Field names at %0 for outer structure definition -- specify them in a subsequent RECORD statement instead" +#~ msgstr "Noms de champs à %0 pour la définition externe de structure -- les spécifier dans une déclaration subséquente de déclaration RECORD à la place" + +#~ msgid "Missing field name(s) for structure definition at %0 within structure definition at %1" +#~ msgstr "noms de champs manquant pour la définition de strcutreu à %0 à l'intérieur de la définition de structure à %1" + +#~ msgid "No components specified as of %0 for map beginning at %1" +#~ msgstr "Aucun composant spécifié tel que %0 pour la map débutant à %1" + +#~ msgid "Zero or one maps specified as of %0 for union beginning at %1 -- at least two are required" +#~ msgstr "Aucune ou une map spécifié tel que %0 pour l'union débutant à %1 -- au moins deux sont requises" + +#~ msgid "Missing %A specifier in statement at %0" +#~ msgstr "spécificateur %A manquant dans la déclaration à %0" + +#~ msgid "Items in I/O list starting at %0 invalid for namelist-directed I/O" +#~ msgstr "Items dans la liste E/S débutant à %0 invalide pour un liste nommé d'E/S dirigées" + +#~ msgid "Conflicting I/O control specifications at %0 and %1" +#~ msgstr "spécifications conflictuelles de contrôle d'E/S à %0 et %1" + +#~ msgid "No UNIT= specifier in I/O control list at %0" +#~ msgstr "aucun spécificateur UNIT=1 dans la liste de contrôle d'E/S à %0" + +#~ msgid "Specification at %0 requires ADVANCE=`NO' specification in same I/O control list" +#~ msgstr "spécification à %0 requiert la spécification ADVANCE=« NO » dans la même liste de contrôel d'E/S" + +#~ msgid "Specification at %0 requires explicit FMT= specification in same I/O control list" +#~ msgstr "spécification à %0 requiert la spécification explicite FMT= dans la même liste de contrôel d'E/S" + +#~ msgid "Second occurrence of CASE DEFAULT at %0 within SELECT CASE at %1" +#~ msgstr "Seconde occurence du CASE DEFAULT à %0 à l'intéreur de SELECT CASE à %1" + +#~ msgid "Duplicate or overlapping case values/ranges at %0 and %1" +#~ msgstr "duplication ou chevauchement des valeurs/plages de case à %0 et %1" + +#~ msgid "Type and/or kind-type parameter disagreement between CASE value or value within range at %0 and SELECT CASE at %1" +#~ msgstr "Désaccord du paramètre du Type et/ou type de sorte entre la valeur du CASE ou la valeur à l'intérieur de l'étendue à %0 et le SELECT CASE à %1" + +#~ msgid "Range specification at %0 invalid for CASE statement within logical-type SELECT CASE statement" +#~ msgstr "spécification d'étendue à %0 invalide pour la déclaration du CASE à l'intérieur de la déclaration du type logique du SELECT CASE" + +#~ msgid "Fortran 90 feature at %0 unsupported" +#~ msgstr "option FORTRAN 90 à %0 non supportée" + +#~ msgid "Invalid declaration of or reference to symbol `%A' at %0 [initially seen at %1]" +#~ msgstr "déclaration invalide ou référence au symboe « %A » à %0 [initialement vu à %1]" + +#~ msgid "Null element at %0 for array reference at %1" +#~ msgstr "élément nul à %0 pour la référence au tableau à %1" + +#~ msgid "Too few elements (%A missing) as of %0 for array reference at %1" +#~ msgstr "Trop peu d'éléments (%A manquant) tel que %0 pour la référence au tableau à %1" + +#~ msgid "Too many elements as of %0 for array reference at %1" +#~ msgstr "Trop peu d'éléments tel que %0 pour la référence au tableau à %1" + +#~ msgid "Missing colon as of %0 in substring reference for %1" +#~ msgstr "«:» manquant dans %0 dans la sous-chaîne de référence pour %1" + +#~ msgid "Invalid use at %0 of substring operator on %1" +#~ msgstr "utilisation invalide à %0 de l'opérateur de sous-chaîne sur %1" + +#~ msgid "Substring begin/end point at %0 out of defined range" +#~ msgstr "point begin/end de la sous-chaîne à %0 en dehors de la plage définie" + +#~ msgid "Array element value at %0 out of defined range" +#~ msgstr "Valeur de l'élément du tableau à %0 en dehors de la plage définie" + +#~ msgid "Expression at %0 has incorrect data type or rank for its context" +#~ msgstr "expression à %0 a un type de données ou un rang incorrect pour son contexte" + +#~ msgid "Division by 0 (zero) at %0 (IEEE not yet supported)" +#~ msgstr "division par 0 (zéro) à %0 (IEEE pas encore supporté)" + +#~ msgid "%A step count known to be 0 (zero) at %0" +#~ msgstr "valeur du pas %A connu pour être à 0 (zéro) à %0" + +#~ msgid "%A end value plus step count known to overflow at %0" +#~ msgstr "valeur finale %A plus la valeur du pas connus pour déborder à %0" + +#~ msgid "%A begin, end, and step-count values known to result in implementation-dependent behavior due to overflow(s) in intermediate calculations at %0" +#~ msgstr "valeur de départ, fin et du pas %A connu pour résulter dans un comportement dépendant de l'implantation en raison d'un débordement dans les calculs intermédiaires à %0" + +#~ msgid "%A begin, end, and step-count values known to result in no iterations at %0" +#~ msgstr "valeur de départ, fin et du pas %A connus pour ne faire aucune itération à %0" + +#~ msgid "Type disagreement between expressions at %0 and %1" +#~ msgstr "désaccord de type entre les expressions à %0 et %1" + +#~ msgid "No specification for implied-DO iterator `%A' at %0" +#~ msgstr "aucune spécification pour l'itération DO-implicite « %A » à %0" + +#~ msgid "Gratuitous parentheses surround implied-DO construct at %0" +#~ msgstr "parenthèses gratuites entourant le construit DO implicite à %0" + +#~ msgid "Zero-size specification invalid at %0" +#~ msgstr "spécification de taille zéro invalide à %0" + +#~ msgid "Zero-size array at %0" +#~ msgstr "tableau de taille zéro à %0" + +#~ msgid "Target machine does not support complex entity of kind specified at %0" +#~ msgstr "machine cible ne supporte par l'entité complexe de la sorte spécifié à %0" + +#~ msgid "Target machine does not support DOUBLE COMPLEX, specified at %0" +#~ msgstr "machine cible ne supporte pas DOUBLE COMPLEX spécifié à %0" + +#~ msgid "Attempt to raise constant zero to a power at %0" +#~ msgstr "Tentative d'augmentation d'une constante de valeur zéro à la puissance %0" + +#~ msgid "Reference to generic intrinsic `%A' at %0 could be to form %B or %C" +#~ msgstr "référence à un intrinsèque générique « %A » à %0 pourrait être de la forme %B ou %C" + +#~ msgid "Ambiguous use of intrinsic `%A' at %0 [info -f g77 M CMPAMBIG]" +#~ msgstr "utilisation ambiquë de l'intrinsèque « %A » à %0 [info -f g77 M CMPAMBIG]" + +#~ msgid "Intrinsic `%A' referenced %Bly at %0, %Cly at %1 [info -f g77 M EXPIMP]" +#~ msgstr "intrinsèque « %A » référencé %Bly à %0, %Cly à %1 [info -f g77 M EXPIMP]" + +#~ msgid "Same name `%A' used for %B at %0 and %C at %1 [info -f g77 M INTGLOB]" +#~ msgstr "Même nom « %A » utilisé pour %B à %0 et %C à %1 [info -f g77 M INTGLOB]" + +#~ msgid "Explicit type declaration for intrinsic `%A' disagrees with invocation at %0" +#~ msgstr "déclaration de type explicite pour l'intrinsèque « %A » en désaccord avec l'invocation à %0" + +#~ msgid "Unable to open INCLUDE file `%A' at %0" +#~ msgstr "incapable d'ouvrir le fichier INCLUDE « %A » à %0" + +#~ msgid "Null argument at %0 for statement function reference at %1" +#~ msgstr "argument nul à %0 pour la déclaration de la référence de fonction à %1" + +#~ msgid "Null argument at %0 for procedure invocation at %1" +#~ msgstr "arguement nul à %0 pour l'invocation de la procédure à %1" + +#~ msgid "%A too few arguments (starting with dummy argument `%B') as of %0 for statement function reference at %1" +#~ msgstr "trop peu d'arguments %A (débutant avec l'argument factice « %B ») tel que %0 pour la déclaration de la référence de fonction à %1" + +#~ msgid "%A too many arguments as of %0 for statement function reference at %1" +#~ msgstr "trop peu d'arguments %A tel que %0 pour la déclaration de la référence de fonction à %1" + +#~ msgid "Array supplied at %1 for dummy argument `%A' in statement function reference at %0" +#~ msgstr "tableau fourni à %1 pour l'argument factice « %A » dans la déclaration de référence de fonction à %0" + +#~ msgid "Unsupported FORMAT specifier at %0" +#~ msgstr "spécificateur de FORMAT non supporté à %0" + +#~ msgid "Variable-expression FORMAT specifier at %0 -- unsupported" +#~ msgstr "expression variable dans le spécificateur de FORMAT à %0 -- non supportée" + +#~ msgid "Unsupported VXT statement at %0" +#~ msgstr "déclaration VXT non supporté à %0" + +#~ msgid "Attempt to specify second initial value for `%A' at %0" +#~ msgstr "Tentative de spécifier une seconde valeur initial pour « %A » à %0" + +#~ msgid "Too few initial values in list of initializers for `%A' at %0" +#~ msgstr "Trop peu de valeurs initiales dans la liste des initialisations pour « %A » à %0" + +#~ msgid "Too many initial values in list of initializers starting at %0" +#~ msgstr "Trop de valeurs initiales dans la liste des initialisations débutant à %0" + +#~ msgid "Array or substring specification for `%A' out of range in statement at %0" +#~ msgstr "Tableau ou sous-chaîne de spécification pour « %A » hors limite dans la déclaration à %0" + +#~ msgid "Array subscript #%B out of range for initialization of `%A' in statement at %0" +#~ msgstr "souscript de tableau #%B hors limite pour l'initialisation de « %A » dans la déclaration à %0" + +#~ msgid "Implied do-loop step count of 0 (zero) for iteration variable `%A' in statement at %0" +#~ msgstr "le pas implicite de la boucle DO a un compte de 0 (zéro) pour la variable itérative « %A » dans la déclaration à %0 " + +#~ msgid "Implied do-loop iteration count of 0 (zero) for iteration variable `%A' in statement at %0" +#~ msgstr "le compte implicite de la boucle DO est à 0 (zéro) pour la variable itérative « %A » dans la déclaration à %0 " + +#~ msgid "Not an integer constant expression in implied do-loop in statement at %0" +#~ msgstr "N'est pas un entier dans l'expression de la constante dans la déclaration implicite de la boucle DO à %0" + +#~ msgid "Attempt to specify second initial value for element of `%A' at %0" +#~ msgstr "Tentative de spécifier une seconde valeur initiale pour l'élément « %A » à %0" + +#~ msgid "Attempt to EQUIVALENCE common areas `%A' and `%B' at %0" +#~ msgstr "Tentative de définit une zone commmue par EQUIVALENCE « %A » et « %B » à %0" + +#~ msgid "Can't place `%A' as directed by EQUIVALENCE due to alignment restrictions" +#~ msgstr "ne peut insérer « %A » tel que demandé par EQUIVALENCE en raison des restrictions d'alignement" + +#~ msgid "Mismatched EQUIVALENCE requirements for placement of `%A' at both %C and %D bytes offset from `%B'" +#~ msgstr "Désaccord des conditions requises par EQUIVALENCE pour l'emplacement de « %A » aux deux décalages d'octets %C et %D à partir de %B" + +#~ msgid "Array or substring specification for `%A' out of range in EQUIVALENCE statement" +#~ msgstr "spécification de tableau ou de sous-chaîne pour « %A » est hors limite dans la déclaration EQUIVALENCE" + +#~ msgid "Substring of non-CHARACTER entity `%A' in EQUIVALENCE statement" +#~ msgstr "Sous-chaîne de non caractères « %A » dans la déclaration EQUIVALENCE" + +#~ msgid "Array reference to scalar variable `%A' in EQUIVALENCE statement" +#~ msgstr "référence de tableau vers une variable scalaire « %A » dans une déclaraion EQUIVALENCE" + +#~ msgid "Array subscript #%B out of range for EQUIVALENCE of `%A'" +#~ msgstr "souscript de tableau #%B hors limite pour la déclaration EQUIVALENCE de « %A »" + +#~ msgid "Attempt to extend COMMON area beyond its starting point via EQUIVALENCE of `%A'" +#~ msgstr "Tentative d'étendre la zone COMMON au delà de son point de départ via EQUIVALENCE de « %A »" + +#~ msgid "Too few elements in reference to array `%A' in EQUIVALENCE statement" +#~ msgstr "Trop peu d'élémens dans la référence au tableau « %A » dans la déclaration d'EQUIVALENCE" + +#~ msgid "Too many elements in reference to array `%A' in EQUIVALENCE statement" +#~ msgstr "Trop d'élémens dans la référence au tableau « %A » dans la déclaration d'EQUIVALENCE" + +#~ msgid "Mixed CHARACTER and non-CHARACTER types via COMMON/EQUIVALENCE -- for example, `%A' and `%B'" +#~ msgstr "Mélange de type caractère et de non caractère via le COMMON/EQUIVALENCE -- par exemple « %A » et « %B »" + +#~ msgid "Return value `%A' for FUNCTION at %0 not referenced in subprogram" +#~ msgstr "valeur retournée « %A » pour FUNCTION à %0 n'est pas référencé dans le sous-programme" + +#~ msgid "Common block `%A' is SAVEd, explicitly or implicitly, at %0 but not SAVEd at %1" +#~ msgstr "bloc commun « %A » est sauvegardé, explicitement ou implicitement, à %0 mais non pas %1" + +#~ msgid "Common block `%A' is %B %D in length at %0 but %C %E at %1" +#~ msgstr "bloc commun « %A » est %B %D en longueur à %0 mais %C %E à %1" + +#~ msgid "Blank common initialized at %0" +#~ msgstr "commun vide initialisé à %0" + +#~ msgid "Intrinsic `%A' is passed as actual argument at %0 but not explicitly declared INTRINSIC" +#~ msgstr "intrinsèque « %A » est passé comme argument actuel à %0 mais non pas explicitment déclaré INTRINSIC" + +#~ msgid "External procedure `%A' is passed as actual argument at %0 but not explicitly declared EXTERNAL" +#~ msgstr "procédure externe « %A » est pass comme argument actuel à %0 mais non pas déclaré explicitement déclaré EXTERNAL" + +#~ msgid "Character `%A' (for example) is upper-case in symbol name at %0" +#~ msgstr "caractère « %A » (par exemple) est en majuscule dans le nom de symbole à %0" + +#~ msgid "Character `%A' (for example) is lower-case in symbol name at %0" +#~ msgstr "caractère « %A » (par exemple) est en minuscule dans le nom de symbole à %0" + +#~ msgid "Character `%A' not followed at some point by lower-case character in symbol name at %0" +#~ msgstr "caractère « %A » n'est pas suivi par un caractère en minuscule dans le nom de symbole à %0" + +#~ msgid "Initial character `%A' is lower-case in symbol name at %0" +#~ msgstr "caractère initial « %A » est en minuscule dans le nom de symbole à %0" + +#~ msgid "NAMELIST not adequately supported by run-time library for source files with case preserved" +#~ msgstr "nom de liste n'est pas adéquatement supporté par la bibliothèque d'exécution pour les fichiers source avec une casse préservée" + +#~ msgid "Nested %% construct (%%VAL, %%REF, or %%DESCR) at %0" +#~ msgstr "construit %% imbriqué (%%VAL, %%REF ou %%DESCR) à %0" + +#~ msgid "Statement at %0 invalid in BLOCK DATA program unit at %1" +#~ msgstr "Déclaration à %0 invalide dans le bloc de donnée de l'unité programme à %1" + +#~ msgid "Truncating characters on right side of character constant at %0" +#~ msgstr "troncation de caractères du côté droit de la constante caractères à %0" + +#~ msgid "Truncating characters on right side of hollerith constant at %0" +#~ msgstr "troncation de caractères du côté droit de la constante Hollerith à %0" + +#~ msgid "Truncating non-zero data on left side of numeric constant at %0" +#~ msgstr "troncation de données non à zéro du côté gauche de la constante numérique à %0" + +#~ msgid "Truncating non-zero data on left side of typeless constant at %0" +#~ msgstr "troncation de données non à zéro du côté gauche de la constante sans type à %0" + +#~ msgid "Typeless constant at %0 too large" +#~ msgstr "constante sans type à %0 trop grande" + +#~ msgid "First-column ampersand continuation at %0" +#~ msgstr "«&» en première colonne de continuation à %0" + +#~ msgid "Global name `%A' defined at %0 already defined at %1 [info -f g77 M GLOBALS]" +#~ msgstr "nom global « %A » défini à %0 est déjà défini à %1 [info -f g77 M GLOBALS]" + +#~ msgid "Global name `%A' is %B at %0 but is %C at %1 [info -f g77 M GLOBALS]" +#~ msgstr "nom global « %A » est %B à %0 mais est %C à %1 [info -f g77 M GLOBALS]" + +#~ msgid "Global name `%A' at %0 has different type at %1 [info -f g77 M GLOBALS]" +#~ msgstr "nom global « %A » à %0 a un type différent à %1 [info -f g77 M GLOBALS]" + +#~ msgid "Too %B arguments passed to `%A' at %0 versus definition at %1 [info -f g77 M GLOBALS]" +#~ msgstr "trop %B d'arguments passé à « %A » à %0 par rapport à la définition à %1 [info -f g77 M GLOBALS]" + +#~ msgid "Too %B arguments for `%A' at %0 versus invocation at %1 [info -f g77 M GLOBALS]" +#~ msgstr "trop %B d'arguments pour « %A » à %0 par rapport à l'invocation à %1 [info -f g77 M GLOBALS]" + +#~ msgid "Argument #%B of `%A' is %C at %0 but is %D at %1 [info -f g77 M GLOBALS]" +#~ msgstr "Argument #%B de « %A » est %C à %0 mais est %D à %1 [info -f g77 M GLOBALS]" + +#~ msgid "Array `%A' at %0 is too large to handle" +#~ msgstr "tableau « %A » à %0 est trop grand pour être traité" + +#~ msgid "Statement function `%A' defined at %0 is not used" +#~ msgstr "déclaration de fonction « %A » définie à %0 n'est pas utilisée" + +#~ msgid "Intrinsic `%A', invoked at %0, known to be non-Y2K-compliant [info -f g77 M Y2KBAD]" +#~ msgstr "Intrinsèque « %A » invoqué à %0 est connu pour ne pas être conforme à l'An 2000 [info -f g77 M Y2KBAD]" + +#~ msgid "Internal compiler error -- cannot perform operation" +#~ msgstr "erreur interne du compilateur -- ne peut exécuter l'opération" + +#~ msgid "In unknown kind" +#~ msgstr "dans une sorte inconnue" + +#~ msgid "In entity" +#~ msgstr "Dans l'entité" + +#~ msgid "In function" +#~ msgstr "Dans la fonction" + +#~ msgid "In subroutine" +#~ msgstr "Dans la sous-routine" + +#~ msgid "In program" +#~ msgstr "Dans le programme" + +#~ msgid "In block-data unit" +#~ msgstr "Dans l'unité du bloc de données" + +#~ msgid "In common block" +#~ msgstr "Dans le bloc commun" + +#~ msgid "In construct" +#~ msgstr "Dans le construit" + +#~ msgid "In namelist" +#~ msgstr "Dans la liste de noms" + +#~ msgid "In anything" +#~ msgstr "Dans n'importe quoi" + +#~ msgid "internal error in check-init: tree code not implemented: %s" +#~ msgstr "erreur interne dans check-init: arbre de code n'est pas implanté: %s" + +#~ msgid "%Jfinal field '%D' may not have been initialized" +#~ msgstr "%Jchamp final « %D » peut ne pas avoir été initialisé" + +#~ msgid "internal error - too many interface type" +#~ msgstr "erreur interne - trop de type d'interface" + +#~ msgid "bad method signature" +#~ msgstr "méthode de signature erronée" + +#~ msgid "misplaced ConstantValue attribute (not in any field)" +#~ msgstr "attribut ConstantValue mal positionné (n'est dans aucun champ)" + +#~ msgid "duplicate ConstantValue attribute for field '%s'" +#~ msgstr "duplication de l'attribut ConstanValue pour le champ « %s »" + +#~ msgid "ConstantValue attribute of field '%s' has wrong type" +#~ msgstr "attribut ConstanValue du champ « %s » a un type erroné" + +#~ msgid "field '%s' not found in class" +#~ msgstr "champ « %s » n'a pas été repéré dans la classe" + +#~ msgid "%Jabstract method in non-abstract class" +#~ msgstr "%Jméthode abstraite dans une classe non abstraite" + +#~ msgid "%Jnon-static method '%D' overrides static method" +#~ msgstr "%Jméthode non statique « %D » écrase la méthode statique" + +#~ msgid "%J'%D' used prior to declaration" +#~ msgstr "%J« %D » utilisé précédemment avant sa déclaration" + +#~ msgid "declaration of `%s' shadows a parameter" +#~ msgstr "la déclaration de « %s » masque un paramètre" + +#~ msgid "declaration of `%s' shadows a symbol from the parameter list" +#~ msgstr "la déclaration de « %s » masque un symbole de la liste des paramètres" + +#~ msgid "%Jlabel '%D' used but not defined" +#~ msgstr "%Jétiquette « %D » utilisée mais non définie" + +#~ msgid "%Jlabel '%D' defined but not used" +#~ msgstr "%Jétiquette « %D » définie mais non utilisée" + +#~ msgid "%JIn %D: overlapped variable and exception ranges at %d" +#~ msgstr "%JDans %D: chevauchement de variable et plage d'exception à %d" + +#~ msgid "bad type in parameter debug info" +#~ msgstr "type erroné dans les paramètres d'informations de mise au point" + +#~ msgid "%Jbad PC range for debug info for local '%D'" +#~ msgstr "%Jplage PC erroné pour les infos de débug pour la var. locale « %D »" + +#~ msgid "stack underflow - dup* operation" +#~ msgstr "sous débordement de la pile - opération dup*" + +#~ msgid "reference `%s' is ambiguous: appears in interface `%s' and interface `%s'" +#~ msgstr "référence « %s » est ambigue: apparaît dans l'interface « %s » et l'interface « %s »" + +#~ msgid "field `%s' not found" +#~ msgstr "champ « %s » n'a pas été trouvé" + +#~ msgid "ret instruction not implemented" +#~ msgstr "instruction ret n'est pas implantée" + +#~ msgid "method '%s' not found in class" +#~ msgstr "méthode « %s » n'a pas été repéré dans la classe" + +#~ msgid "failed to find class '%s'" +#~ msgstr "échec de repérage de la classe « %s »" + +#~ msgid "class '%s' has no method named '%s' matching signature '%s'" +#~ msgstr "classe « %s » n'a pas de méthode nommée « %s » concordant avec la signature « %s »" + +#~ msgid "invokestatic on non static method" +#~ msgstr "invocation statique sur un méthode non statique" + +#~ msgid "invokestatic on abstract method" +#~ msgstr "invocation statique sur un méthode abstraite" + +#~ msgid "invoke[non-static] on static method" +#~ msgstr "invocation non statique sur un méthode statique" + +#~ msgid "missing field '%s' in '%s'" +#~ msgstr "champ « %s » manquant dans « %s »" + +#~ msgid "mismatching signature for field '%s' in '%s'" +#~ msgstr "aignature ne concorde pas pour le champ « %s » dans « %s »" + +#~ msgid "%Jassignment to final field '%D' not in field's class" +#~ msgstr "%Jaffectation au champ final « %D » n'est pas le champ de la classe" + +#~ msgid "%Jassignment to final static field `%D' not in class initializer" +#~ msgstr "%Jaffectation au champ statique final « %D » n'est pas dans l'initialiseur de la classe" + +#~ msgid "%Jassignment to final field '%D' not in constructor" +#~ msgstr "%Jaffectation au champ final « %D » n'est pas dans le constructeur" + +#~ msgid "can't expand %s" +#~ msgstr "ne peut faire l'expansion de %s" + +#~ msgid "invalid PC in line number table" +#~ msgstr "PC invalide dans la numéro de ligne de la table" + +#~ msgid "unreachable bytecode from %d to before %d" +#~ msgstr "bytcode n'est pas atteignable à partir de %d jusqu'à %d" + +#~ msgid "unreachable bytecode from %d to the end of the method" +#~ msgstr "bytcode n'est pas atteignable à partir de %d jusqu'à la fin de la méthode." + +#~ msgid "unrecogized wide sub-instruction" +#~ msgstr "sous-instruction très large non reconnue" + +#~ msgid "source file for class `%s' is newer than its matching class file. Source file `%s' used instead" +#~ msgstr "fichier source de la classe « %s » est plus récent que son fichier de classe concordant. Fichier source « %s » utilisé à la place." + +#~ msgid "bad string constant" +#~ msgstr "constante chaîne erronée" + +#~ msgid "bad value constant type %d, index %d" +#~ msgstr "valeur %d de type de constante erronée, index %d" + +#~ msgid "can't reopen %s: %m" +#~ msgstr "ne peut ré-ouvrir %s: %m" + +#~ msgid "can't close %s: %m" +#~ msgstr "ne peut fermer %s: %m" + +#~ msgid "cannot find file for class %s" +#~ msgstr "ne peut repérer le fichier pour la classe %s." + +#~ msgid "not a valid Java .class file" +#~ msgstr "n'est pas un fichier Java .class valide" + +#~ msgid "error while parsing constant pool" +#~ msgstr "error lors de l'analyse syntaxique du lots de constantes" + +#~ msgid "error in constant pool entry #%d\n" +#~ msgstr "erreur dans l'entrée #%d du lot de constantes\n" + +#~ msgid "reading class %s for the second time from %s" +#~ msgstr "lecture de la classe %s pour la seconde fois depuis %s" + +#~ msgid "error while parsing fields" +#~ msgstr "erreur lors de l'analyse syntaxique des champs" + +#~ msgid "error while parsing methods" +#~ msgstr "erreur lors de l'analyse syntaxique des méthodes" + +#~ msgid "error while parsing final attributes" +#~ msgstr "erreur lors de l'analyse syntaxique des attributs" + +#~ msgid "the `java.lang.Object' that was found in `%s' didn't have the special zero-length `gnu.gcj.gcj-compiled' attribute. This generally means that your classpath is incorrectly set. Use `info gcj \"Input Options\"' to see the info page describing how to set the classpath" +#~ msgstr "« java.lang.Object» qui a été repéré dans « %s » n'avait pas l'attribut spécial de longueur zéro «gnu.gcj.gcj-compiled». Cela généralement signifie que le chemin d'accès aux classes est incorrectement initialisé. Utiliser «info gcj \"Input Options\" » pour accéder aux informations décrivant comment initialiser le chemin d'accès des classes." + +#~ msgid "missing Code attribute" +#~ msgstr "attribut Code manquant" + +#~ msgid "%Hsource file seen twice on command line and will be compiled only once" +#~ msgstr "%Hfichier source vu deux fois sur la ligne de commande et ne sera compilé une seule fois" + +#~ msgid "no input file specified" +#~ msgstr "aucun fichier n'a été spécifié à l'entrée" + +#~ msgid "can't close input file %s: %m" +#~ msgstr "ne peut fermer le fichier d'entrée %s: %m" + +#~ msgid "bad zip/jar file %s" +#~ msgstr "fichier zip/jar erroné %s" + +#~ msgid "error while reading %s from zip file" +#~ msgstr "erreur lors de la lecture de %s à partir du fichier zip" + +#~ msgid "internal error in generate_bytecode_insn - tree code not implemented: %s" +#~ msgstr "erreur interne dans generate_bytecode_insn - arbre de code n'est pas implanté: %s" + +#~ msgid "field initializer type mismatch" +#~ msgstr "type de initialiseur du champ ne concorde pas" + +#~ msgid "can't create directory %s: %m" +#~ msgstr "ne peut créer le répertoire %s: %m" + +#~ msgid "can't create %s: %m" +#~ msgstr "ne peut créer %s: %m" + +#~ msgid "only one of `--print-main', `--list-class', and `--complexity' allowed" +#~ msgstr "seule une des options «--print-main», «--list-class» et «--complexity» est permise" + +#~ msgid "can't open output file `%s'" +#~ msgstr "ne peut ouvrir le fichier de sortie « %s »" + +#~ msgid "file not found `%s'" +#~ msgstr "fichier non repéré « %s »" + +#~ msgid "can't specify `-D' without `--main'\n" +#~ msgstr "ne peut spécifier «-D» sans «--main»\n" + +#~ msgid "`%s' is not a valid class name" +#~ msgstr "« %s » n'est pas un nom de classe valide" + +#~ msgid "--resource requires -o" +#~ msgstr "--resource requiert -o" + +#~ msgid "warning: already-compiled .class files ignored with -C" +#~ msgstr "AVERTISSEMENT: fichiers .class déjà compilés ignorés avec -C" + +#~ msgid "cannot specify both -C and -o" +#~ msgstr "ne peut spécéfier à la fois -C et -o" + +#~ msgid "cannot create temporary file" +#~ msgstr "ne peut créer un fichier temporaire" + +#~ msgid "using both @FILE with multiple files not implemented" +#~ msgstr "utilisé ensemble @FICHIER avec de multiples fichiers bMest pas implanté" + +#~ msgid "cannot specify `main' class when not linking" +#~ msgstr "ne peut spécifier la classe « main » lorsqu'il n'y a pas d'édition de liens" + +#~ msgid "can't do dependency tracking with input from stdin" +#~ msgstr "ne peut faire le tracking de dépendance avec l'entrée à partir de stdin" + +#~ msgid "couldn't determine target name for dependency tracking" +#~ msgstr "ne peut déterminer le nom de la cible pour le tracking de dépendance" + +#~ msgid "" +#~ "unknown encoding: `%s'\n" +#~ "This might mean that your locale's encoding is not supported\n" +#~ "by your system's iconv(3) implementation. If you aren't trying\n" +#~ "to use a particular encoding for your input file, try the\n" +#~ "`--encoding=UTF-8' option" +#~ msgstr "" +#~ "encodage inconnu: « %s »\n" +#~ "Cela signifie que votre encodage local n'est pas supporté\n" +#~ "par l'implantation iconv(3) sur votre système. Si vous n'essayez pas\n" +#~ "d'utiliser un encodage particulier pour votre fichier d'entrée, essayer\n" +#~ "l'option «--encoding=UTF-8»." + +#~ msgid "can't mangle %s" +#~ msgstr "ne peut mutiler %s" + +#~ msgid "internal error - invalid Utf8 name" +#~ msgstr "erreur interne - nom Utf8 invalide" + +#~ msgid "Missing term" +#~ msgstr "Terme manquant" + +#~ msgid "';' expected" +#~ msgstr "«;» attendu" + +#~ msgid "Missing name" +#~ msgstr "Nom manquant" + +#~ msgid "'*' expected" +#~ msgstr "« * » attendu" + +#~ msgid "Class or interface declaration expected" +#~ msgstr "Déclaration de classe ou d'interface attendue" + +#~ msgid "Missing class name" +#~ msgstr "Nom de classe manquant" + +#~ msgid "'{' expected" +#~ msgstr "«{» attendu" + +#~ msgid "Missing super class name" +#~ msgstr "Nom de super classe manquant" + +#~ msgid "Missing interface name" +#~ msgstr "Nom d'interface manquant" + +#~ msgid "Missing variable initializer" +#~ msgstr "Initialiseur de variable manquant" + +#~ msgid "Invalid declaration" +#~ msgstr "Déclaration invalide" + +#~ msgid "']' expected" +#~ msgstr "«]» attendu" + +#~ msgid "Unbalanced ']'" +#~ msgstr "«]» non pairé" + +#~ msgid "Invalid method declaration, method name required" +#~ msgstr "Déclaration de méthode invalide, nom de méthode requis" + +#~ msgid "Identifier expected" +#~ msgstr "Identificateur attendu" + +#~ msgid "Invalid method declaration, return type required" +#~ msgstr "Déclaration de méthode invalide, type retourné requis" + +#~ msgid "')' expected" +#~ msgstr "«)» attendu" + +#~ msgid "Missing formal parameter term" +#~ msgstr "Paramètre term formel manquant" + +#~ msgid "Missing identifier" +#~ msgstr "Identificateur manquant" + +#~ msgid "Missing class type term" +#~ msgstr "Type term de classe manquant" + +#~ msgid "Invalid interface type" +#~ msgstr "Type d'interface invalide" + +#~ msgid "':' expected" +#~ msgstr "«:» attendu" + +#~ msgid "Invalid expression statement" +#~ msgstr "Déclaration d'expression invalide" + +#~ msgid "'(' expected" +#~ msgstr "«(» attendu" + +#~ msgid "Missing term or ')'" +#~ msgstr "Terme manquant ou «)»" + +#~ msgid "Missing or invalid constant expression" +#~ msgstr "Expresion de constante manquante ou invalide" + +#~ msgid "Missing term and ')' expected" +#~ msgstr "Terme manquant et «)» attendus" + +#~ msgid "Invalid control expression" +#~ msgstr "Expression de contrôle invalide" + +#~ msgid "Invalid update expression" +#~ msgstr "Expression de mise à jour invalide" + +#~ msgid "Invalid init statement" +#~ msgstr "Déclaration init invalide" + +#~ msgid "Missing term or ')' expected" +#~ msgstr "Terme manquant ou «)» attendu" + +#~ msgid "'class' or 'this' expected" +#~ msgstr "« class» ou «ceci » attendu" + +#~ msgid "'class' expected" +#~ msgstr "« class » attendu" + +#~ msgid "')' or term expected" +#~ msgstr "«)» or terme attendu" + +#~ msgid "'[' expected" +#~ msgstr "«[» attendu" + +#~ msgid "Field expected" +#~ msgstr "Champ attendu" + +#~ msgid "Missing term and ']' expected" +#~ msgstr "Terme manquant et «]» attendu" + +#~ msgid "']' expected, invalid type expression" +#~ msgstr "«]» attendu, type d'expression invalide" + +#~ msgid "Invalid type expression" +#~ msgstr "Type d'expression invalide" + +#~ msgid "Invalid reference type" +#~ msgstr "Type de référence invalide" + +#~ msgid "Constructor invocation must be first thing in a constructor" +#~ msgstr "L'invaocation d'un constructeur doit être la première chose dans un constructeur" + +#~ msgid "Only constructors can invoke constructors" +#~ msgstr "Seuls les constructeurs peuvent invoquer des constructeurs" + +#~ msgid ": `%s' JDK1.1(TM) feature" +#~ msgstr ": « %s » option JDK1.1(TM)" + +#~ msgid "" +#~ "%s.\n" +#~ "%s" +#~ msgstr "" +#~ "%s.\n" +#~ "%s" + +#~ msgid "malformed .zip archive in CLASSPATH: %s" +#~ msgstr "archive .zip mal composée dans CLASSPATH: %s" + +#~ msgid "Can't find default package `%s'. Check the CLASSPATH environment variable and the access to the archives" +#~ msgstr "ne peut repérer le package par défaut « %s ». Vérifier la variable d'environnement CLASSPATH et l'accès aux archives." + +#~ msgid "missing static field `%s'" +#~ msgstr "champ statique manquant « %s »" + +#~ msgid "not a static field `%s'" +#~ msgstr "n'est pas un champ statique « %s »" + +#~ msgid "No case for %s" +#~ msgstr "Oas de case pour %s" + +#~ msgid "unregistered operator %s" +#~ msgstr "opérator %s non enregistré" + +#~ msgid "junk at end of signature string" +#~ msgstr "rebut à la fin de la chaîne de signature" + +#~ msgid "bad pc in exception_table" +#~ msgstr "PC erroné dans exception_table" + +#~ msgid "unknown opcode %d@pc=%d during verification" +#~ msgstr "code-op inconnu %d@pc=%d durant la vérification" + +#~ msgid "verification error at PC=%d" +#~ msgstr "erreur de vérification au PC=%d" + +#~ msgid "object does not conform to the `%s' protocol" +#~ msgstr "objet n'est pas conforme au protocole « %s »" + +#~ msgid "class `%s' does not implement the `%s' protocol" +#~ msgstr "classe « %s » n'implante pas le protocole « %s »" + +#~ msgid "statically allocated instance of Objective-C class `%s'" +#~ msgstr "instance allouée de manière statique de la classe Objective-C « %s »" + +#~ msgid "unexpected type for `id' (%s)" +#~ msgstr "type inattendu pour « id » (%s)" + +#~ msgid "undefined type `id', please import " +#~ msgstr "type « id » indéfini, SVP importer " + +#~ msgid "protocol `%s' has circular dependency" +#~ msgstr "le protocole « %s » a une dépendance circulaire" + +#~ msgid "cannot find protocol declaration for `%s'" +#~ msgstr "ne peut repérer la déclaration de protocole pour « %s »" + +#~ msgid "cannot find interface declaration for `%s'" +#~ msgstr "ne peut repérer la déclaration d'interface pour « %s »" + +#~ msgid "interface `%s' does not have valid constant string layout" +#~ msgstr "interface « %s » n'a pas une organisation valide de chaînes de constantes" + +#~ msgid "cannot find reference tag for class `%s'" +#~ msgstr "ne peut repérer la référence pour l'étiquette de classe %s." + +#~ msgid "creating selector for non existant method %s" +#~ msgstr "création du sélection pour une méthode inexistente %s" + +#~ msgid "`%s' is not an Objective-C class name or alias" +#~ msgstr "« %s » n'est pas une classe Objective-C ou un alias" + +#~ msgid "Objective-C declarations may only appear in global scope" +#~ msgstr "déclarations Objective-C peut seulement apparaître dans l'étendue globale" + +#~ msgid "cannot find class `%s'" +#~ msgstr "ne peut repérer la classe « %s »" + +#~ msgid "class `%s' already exists" +#~ msgstr "classe « %s » existe déjà" + +#~ msgid "`%s' redeclared as different kind of symbol" +#~ msgstr "« %s » redéclaré comme une autre sorte de symbole" + +#~ msgid "cannot find interface declaration for `%s', superclass of `%s'" +#~ msgstr "ne peut repérer une déclaration d'interface pour « %s », super classe de « %s »" + +#~ msgid "circular inheritance in interface declaration for `%s'" +#~ msgstr "héritage circulaire dans la déclaration de l'interface pour « %s »" + +#~ msgid "Use `-fobjc-exceptions' to enable Objective-C exception syntax" +#~ msgstr "Utiliser « -fobjc-exceptions » pour autoriser la syntaxe d'exception d'Objective-C" + +#~ msgid "`@throw;' (rethrow) used outside of a `@catch' block" +#~ msgstr "« @throw; » (rethrow) utilisé en dehors d'un bloc « @catch »" + +#~ msgid "`@catch' parameter is not a known Objective-C class type" +#~ msgstr "paramètre « @catch » n'est pas connu comme un type de classe Objective-C" + +#~ msgid "Exception already handled by preceding `@catch(id)'" +#~ msgstr "Exception est déjà traité par le précédent « @catch(id) »" + +#~ msgid "Exception of type `%s *' already handled by `@catch (%s *)'" +#~ msgstr "exception du type « %s * » est déjà traitée par « @catch (%s *) »" + +#~ msgid "`@try' without `@catch' or `@finally'" +#~ msgstr "« @try » sans « @catch » ou « @finally »" + +#~ msgid "%Jtype '%D' does not have a known size" +#~ msgstr "%Jtype « %D » n'a pas de taille connue" + +#~ msgid "%J%s `%s'" +#~ msgstr "%J%s « %s »" + +#~ msgid "inconsistent instance variable specification" +#~ msgstr "spécification inconsistente avec l'instance de la vairable" + +#~ msgid "can not use an object as parameter to a method\n" +#~ msgstr "ne peut utiliser un objet comme paramètre à une méthode\n" + +#~ msgid "multiple %s named `%c%s' found" +#~ msgstr "multiples %s nommés « %c%s » repérés" + +#~ msgid "no super class declared in @interface for `%s'" +#~ msgstr "pas de super classe déclarée dans @nterface pour « %s »" + +#~ msgid "invalid receiver type `%s'" +#~ msgstr "type du receveur invalide « %s »" + +#~ msgid "`%s' may not respond to `%c%s'" +#~ msgstr "« %s » peut ne pas répondre à « %c%s »" + +#~ msgid "`%c%s' not implemented by protocol(s)" +#~ msgstr "« %c%s » n'est pas implantée dans le protocole" + +#~ msgid "(Messages without a matching method signature" +#~ msgstr "(Messages sans une méthode concordante de signature" + +#~ msgid "will be assumed to return `id' and accept" +#~ msgstr "sera assumé pour retourner « id » et accepter" + +#~ msgid "`...' as arguments.)" +#~ msgstr " « ... » comme argument.)" + +#~ msgid "undeclared selector `%s'" +#~ msgstr "sélecteur « %s » non déclaré" + +#~ msgid "instance variable `%s' accessed in class method" +#~ msgstr "instance « %s » de la variable accédé par la méthode de classe" + +#~ msgid "duplicate declaration of method `%c%s'" +#~ msgstr "duplication de déclaration de la méthode « %c%s »" + +#~ msgid "duplicate interface declaration for category `%s(%s)'" +#~ msgstr "duplication de déclaration d'interface pour la catégorie « %s(%s) »" + +#~ msgid "illegal reference type specified for instance variable `%s'" +#~ msgstr "type deréférence spécifié illégal pour l'instance de variable « %s »" + +#~ msgid "instance variable `%s' has unknown size" +#~ msgstr "instance de la variable « %s » a une taille inconnue" + +#~ msgid "type `%s' has virtual member functions" +#~ msgstr "type « %s » a des membres de fonction virtuelle" + +#~ msgid "illegal aggregate type `%s' specified for instance variable `%s'" +#~ msgstr "type d'aggrégat illégal « %s » spécifié pour l'instance de la variable « %s »" + +#~ msgid "type `%s' has a user-defined constructor" +#~ msgstr "type « %s » a un constructeur défini par l'usager" + +#~ msgid "type `%s' has a user-defined destructor" +#~ msgstr "type « %s » a un destructeur défini par l'usager" + +#~ msgid "C++ constructors and destructors will not be invoked for Objective-C fields" +#~ msgstr "constructeurs et destructeurs C++ ne seront pas invoqués pour les champs en Objective-C" + +#~ msgid "instance variable `%s' is declared private" +#~ msgstr "instance de la variable « %s » est déclaré privée" + +#~ msgid "instance variable `%s' is %s; this will be a hard error in the future" +#~ msgstr "instance de la variable « %s » est %s; cela déclenchera une erreur dure dans le futur" + +#~ msgid "instance variable `%s' is declared %s" +#~ msgstr "instance de la variable « %s » est déclaré %s" + +#~ msgid "static access to object of type `id'" +#~ msgstr "accès statique à un objket de type « id »" + +#~ msgid "incomplete implementation of class `%s'" +#~ msgstr "implantation incomplète de la classe « %s »" + +#~ msgid "incomplete implementation of category `%s'" +#~ msgstr "implantation incomplète de la catégorie « %s »" + +#~ msgid "method definition for `%c%s' not found" +#~ msgstr "définition de la méthode pour « %c%s » n'a pas été repérée" + +#~ msgid "%s `%s' does not fully implement the `%s' protocol" +#~ msgstr "%s « %s » n'implante pas complètement le protocole « %s »" + +#~ msgid "`@end' missing in implementation context" +#~ msgstr "«@end» manquant dans l'implantation du contexte" + +#~ msgid "reimplementation of class `%s'" +#~ msgstr "ré-implantation de la classe « %s »" + +#~ msgid "conflicting super class name `%s'" +#~ msgstr "nom de super classe « %s » est conflictuel" + +#~ msgid "previous declaration of `%s'" +#~ msgstr "déclaration précédente de « %s »" + +#~ msgid "duplicate interface declaration for class `%s'" +#~ msgstr "double déclaration d'interface pour la classe « %s »" + +#~ msgid "duplicate declaration for protocol `%s'" +#~ msgstr "double déclaration pour le protocole « %s »" + +#~ msgid "%J%s `%c%s'" +#~ msgstr "%J%s « %c%s »" + +#~ msgid "no super class declared in interface for `%s'" +#~ msgstr "pas de super classe déclarée dans l'interface pour « %s »" + +#~ msgid "[super ...] must appear in a method context" +#~ msgstr "[super ...] doit apparaître dans une méthode du contexte" + +#~ msgid "`@end' must appear in an implementation context" +#~ msgstr "«@end» doit appraître dans un contaxte d'implantation" + +#~ msgid "method definition not in class context" +#~ msgstr "méthode de définition n'est pas dans un contexte de classe" + +#~ msgid "Display this information" +#~ msgstr "afficher l'aide-mémoire" + +#~ msgid "--param =\tSet paramter to value. See below for a complete list of parameters" +#~ msgstr "--param =\tinitialiser le avec la valeur. Voir ci-bas pour la liste complète des paramètres" + +#~ msgid "-A=\tAssert the to . Putting '-' before disables the to " +#~ msgstr "-A=\tassocier la à la . Placer « - » devant la désactive la à la " + +#~ msgid "Do not discard comments" +#~ msgstr "Ne pas éliminer les commentaires" + +#~ msgid "Do not discard comments in macro expansions" +#~ msgstr "Ne pas éliminer les commentaires dans les expansions macro" + +#~ msgid "-D[=]\tDefine a with as its value. If just is given, is taken to be 1" +#~ msgstr "-D[=]\tdéfinir le avec la . Si seul le est fourni, vaut 1 par défaut" + +#~ msgid "-G\tPut global and static data smaller than bytes into a special section (on some targets)" +#~ msgstr "" +#~ " -G placer les données globales et statiques plus\n" +#~ " petites que d'octets dans une section\n" +#~ " spéciale (sur certaines cibles)" + +#~ msgid "Print the name of header files as they are used" +#~ msgstr "Afficher les noms des en-têtes de fichiers tel qu'ils sont utilisés" + +#~ msgid "-I \tAdd to the end of the main include path. -I- gives more include path control; see info documentation" +#~ msgstr "-I \tajouter à la fin du chemin principal d'inclusion. -I- donne plus de contrôle sur le chemin d'inclusion; voir la documentation info" + +#~ msgid "Generate make dependencies" +#~ msgstr "Générer les dépendances pour make" + +#~ msgid "Generate make dependencies and compile" +#~ msgstr "Générer les dépendances pour make et compiler" + +#~ msgid "-MF \tWrite dependency output to the given file" +#~ msgstr "-MF \técrire les dépendances en sortie dans le fichier fourni" + +#~ msgid "Treat missing header files as generated files" +#~ msgstr "Traiter les en-têtes manquantes de fichiers comme des fichiers générés" + +#~ msgid "Like -M but ignore system header files" +#~ msgstr "Identique à -M mais ignore les en-têtes de fichiers système" + +#~ msgid "Like -MD but ignore system header files" +#~ msgstr "Identique à -MD mais ignore les en-têtes de fichiers système" + +#~ msgid "Generate phony targets for all headers" +#~ msgstr "Générer les cibles bidons pour toutes les en-têtes" + +#~ msgid "-MQ \tAdd a MAKE-quoted target" +#~ msgstr "-MQ \tajouter MAKE-quoted cible" + +#~ msgid "-MT \tAdd an unquoted target" +#~ msgstr "-MT \tajouter une cible sans quote" + +#~ msgid "-O\tSet optimization level to " +#~ msgstr "-O\tutiliser le niveau d'optimisation " + +#~ msgid "Optimize for space rather than speed" +#~ msgstr "Optimiser l'utilisation de l'espace plutôt que la vitesse" + +#~ msgid "Do not generate #line directives" +#~ msgstr "Ne pas générer de directives #line" + +#~ msgid "-U\tUndefine " +#~ msgstr "-U\tabandonner la définition " + +#~ msgid "This switch is deprecated; use -Wextra instead" +#~ msgstr "Cette option est obsolète; utiliser -Wextra à la place" + +#~ msgid "Warn about returning structures, unions or arrays" +#~ msgstr "Avertir à propos de structures retournés, unions ou tableaux" + +#~ msgid "Enable most warning messages" +#~ msgstr "Autoriser la plupart des messages d'avertissement" + +#~ msgid "Warn about casting functions to incompatible types" +#~ msgstr "Avertir à propos des fonctions de transtypage avec des types incompatibles" + +#~ msgid "Warn about pointer casts which increase alignment" +#~ msgstr "Avertir à propos des pointeurs convertis lesquels augment l'alignement" + +#~ msgid "Warn about casts which discard qualifiers" +#~ msgstr "Avertir à propos des transtypage qui écartent les qualificateurs" + +#~ msgid "Warn about subscripts whose type is \"char\"" +#~ msgstr "Avertir à propos des souscripts dont le type est \"char\"" + +#~ msgid "Warn about possibly nested block comments, and C++ comments spanning more than one physical line" +#~ msgstr "Avertir à propos des blocs de commentaires imbriqués et les commentaires C++ qui s'étendent sur plus d'une ligne physique" + +#~ msgid "Synonym for -Wcomment" +#~ msgstr "Synonyme pour -Wcommentaire" + +#~ msgid "Warn about possibly confusing type conversions" +#~ msgstr "Avertir à propos des conversion confuses de types" + +#~ msgid "Warn when all constructors and destructors are private" +#~ msgstr "Avertir lorsque tous les constructeurs et destructeurs sont privés" + +#~ msgid "Warn when a declaration is found after a statement" +#~ msgstr "Avertir lorsqu'une déclaration est spécifiée après une déclaration" + +#~ msgid "Warn about deprecated compiler features" +#~ msgstr "Avertir à propose de la dépréciation des options du compilateur" + +#~ msgid "Warn about uses of __attribute__((deprecated)) declarations" +#~ msgstr "Avertir à propos de l'utilisation des déclarations « __attribute__ ((deprecated)) »" + +#~ msgid "Warn when an optimization pass is disabled" +#~ msgstr "Avertir lorsque la passe d'optimisation est désactivée" + +#~ msgid "Warn about compile-time integer division by zero" +#~ msgstr "Avertir au sujet de la division entière par zéro au moment de la compilation" + +#~ msgid "Warn about violations of Effective C++ style rules" +#~ msgstr "Avertir à propos des violations des règles de style de Effective C++" + +#~ msgid "Warn about stray tokens after #elif and #endif" +#~ msgstr "Avertir à propos des jetons perdus après #elif et #endif" + +#~ msgid "Treat all warnings as errors" +#~ msgstr "Traiter tous les avertissements commes des erreurs" + +#~ msgid "Make implicit function declarations an error" +#~ msgstr "Faire une erreur lors de déclaration de fonctions implicites" + +#~ msgid "Print extra (possibly unwanted) warnings" +#~ msgstr "Afficher des avertissements superflus (possiblement non désirés)" + +#~ msgid "Warn if testing floating point numbers for equality" +#~ msgstr "Avertir à propos des tests d'égalité sur des nombres flottants" + +#~ msgid "Warn about printf/scanf/strftime/strfmon format string anomalies" +#~ msgstr "Avertir à propos des anomalies de format de chaînes pour printf/scanf/strftime/strfmon" + +#~ msgid "Warn if passing too many arguments to a function for its format string" +#~ msgstr "Avertir lorsqu'il y a trop de passage d'arguments à une fonction pour le format de ses chaînes" + +#~ msgid "Warn about format strings that are not literals" +#~ msgstr "Avertir à propos des chaînes de format qui n'ont pas de litérals" + +#~ msgid "Warn about possible security problems with format functions" +#~ msgstr "Avertir à propos des problèmes possibles de sécurité avec les formats de fonction" + +#~ msgid "Warn about strftime formats yielding 2-digit years" +#~ msgstr "Avertir à propos des formats strftime ne laissant que 2 chiffres pour l'année" + +#~ msgid "Warn about implicit function declarations" +#~ msgstr "Avertir à propos des déclarations de fonctions implicites" + +#~ msgid "Warn when a declaration does not specify a type" +#~ msgstr "Avertir lorsqu'une déclaration ne spécifie pas le type" + +#~ msgid "Deprecated. This switch has no effect." +#~ msgstr "Obsolète. Cette option n'a aucun effet." + +#~ msgid "Warn about variables which are initialized to themselves." +#~ msgstr "Avertir au sujet des variables qui sont initialisés par elles-même" + +#~ msgid "Warn when an inlined function cannot be inlined" +#~ msgstr "Avertir lorsque des fonctions en ligne ne peuvent être enligne" + +#~ msgid "Warn about invalid uses of the \"offsetof\" macro" +#~ msgstr "Avertir à propos de l'utilisation invalide de macro \"offsetof\"" + +#~ msgid "Warn about PCH files that are found but not used" +#~ msgstr "Avertir à propos des fichier PCH qui sont repérés mais non utilisés" + +#~ msgid "-Wlarger-than-\tWarn if an object is larger than bytes" +#~ msgstr "-Wlarger-than-\tavertir si un objet est plus grand que d'octets" + +#~ msgid "Do not warn about using \"long long\" when -pedantic" +#~ msgstr "Ne pas avertir à propos de l'utilisation de \"long long\" avec -pedantic" + +#~ msgid "Warn about suspicious declarations of \"main\"" +#~ msgstr "Avertir à propos des déclarations douteuses de \"main\"" + +#~ msgid "Warn about possibly missing braces around initializers" +#~ msgstr "Avertir à propos des possibles accolades manquantes autour des initialisations" + +#~ msgid "Warn about global functions without previous declarations" +#~ msgstr "Avertir à propos des fonctions globales sans déclaration précédente" + +#~ msgid "Warn about functions which might be candidates for format attributes" +#~ msgstr "Avertir à propos des fonctions qui pourraient être candidates pour les attributs de format" + +#~ msgid "Warn about functions which might be candidates for __attribute__((noreturn))" +#~ msgstr "Avertir à propos des fonctions qui seraient candidates pour __attribute__((noreturn))" + +#~ msgid "Warn about global functions without prototypes" +#~ msgstr "Avertir à propos des fonctions globales sans prototype" + +#~ msgid "Warn about use of multi-character character constants" +#~ msgstr "Avertir à propos de l'utilisation des chaînes de multi-caractères" + +#~ msgid "Warn about \"extern\" declarations not at file scope" +#~ msgstr "Avertir à propos des déclarations \"extern\" qui n'est pas dans l'étendue du fichier" + +#~ msgid "Warn when non-templatized friend functions are declared within a template" +#~ msgstr "Avertir lorsque des fonctions amis sans canevas sont déclarés à l'intérieur d'un canevas" + +#~ msgid "Warn about non-virtual destructors" +#~ msgstr "Avertir à propos des destructeurs non virtuels" + +#~ msgid "Warn if a C-style cast is used in a program" +#~ msgstr "Avertir si le style de transtypage C est utilisé dans un programme" + +#~ msgid "Warn if an old-style parameter definition is used" +#~ msgstr "Avertir lorsqu'un paramètre de style ancien de définition est utilisé" + +#~ msgid "Warn about overloaded virtual function names" +#~ msgstr "Avertir à propos de la surcharge des noms de fonctions virtuelles" + +#~ msgid "Warn when the packed attribute has no effect on struct layout" +#~ msgstr "Avertir lorsque les attributs paquetés n'ont pas d'effet sur l'organisation d'un struct" + +#~ msgid "Warn when padding is required to align structure members" +#~ msgstr "Avertir lorsque le remplissage est requis pour aligner les membres de structure" + +#~ msgid "Warn about possibly missing parentheses" +#~ msgstr "Avertir à propos du manque possible de parenthèses" + +#~ msgid "Warn when converting the type of pointers to member functions" +#~ msgstr "Avertir lors de la conversion des types de pointeurs en membres de fonctions" + +#~ msgid "Warn about function pointer arithmetic" +#~ msgstr "Avertir à propos d'arithmétique portant sur un pointeur de fonction" + +#~ msgid "Warn if inherited methods are unimplemented" +#~ msgstr "Avertir si les méthodes héritées ne sont pas implantées" + +#~ msgid "Warn about multiple declarations of the same object" +#~ msgstr "Avertir à propos des déclarations multiples portant sur le même objet" + +#~ msgid "Warn when the compiler reorders code" +#~ msgstr "Avertir lorsque le compilateur réordonne le code" + +#~ msgid "Warn whenever a function's return type defaults to \"int\" (C), or about inconsistent return types (C++)" +#~ msgstr "Avertir lorsque le type de fonction à retourner par défaut est \"int\" (C) ou à propos d'un type inconsisten à retourner (C++)" + +#~ msgid "Warn if a selector has multiple methods" +#~ msgstr "Avertir si le sélecteur a de multiples méthodes" + +#~ msgid "Warn about possible violations of sequence point rules" +#~ msgstr "Avertir à propos des violations possibles des règles de séquence de points" + +#~ msgid "Warn when one local variable shadows another" +#~ msgstr "Avertir lorsqu'une variable locale masque une autre" + +#~ msgid "Warn about signed-unsigned comparisons" +#~ msgstr "Avertir à propos des comparaisons signés ou non signés" + +#~ msgid "Warn when overload promotes from unsigned to signed" +#~ msgstr "Avertir lorsque la surcharge fait la promotion d'un non signé en signé" + +#~ msgid "Warn about code which might break strict aliasing rules" +#~ msgstr "Avertir à propos du code qui pourrait briser les règles strictes d'alias" + +#~ msgid "Warn about unprototyped function declarations" +#~ msgstr "Avertir à propos des déclarations de fonctions sans prototype" + +#~ msgid "Warn about enumerated switches, with no default, missing a case" +#~ msgstr "Avertir à propos d'un switch énuméré, sans défaut ou un case est manquant" + +#~ msgid "Warn about enumerated switches missing a \"default:\" statement" +#~ msgstr "Avertir à propos d'un switch énuméré n'ayant pas de déclaration \"default:\"" + +#~ msgid "Warn about all enumerated switches missing a specific case" +#~ msgstr "Avertir à propos de tous les switch énumérés où un case spécific manque" + +#~ msgid "Warn when synthesis behavior differs from Cfront" +#~ msgstr "Avertir lorsque le comportement de synthère diffère de Cfront" + +#~ msgid "Do not suppress warnings from system headers" +#~ msgstr "Ne pas supprimer les avertissements pour les en-têtes système" + +#~ msgid "Warn about features not present in traditional C" +#~ msgstr "Avertir à propos d'une option absente en C traditionnel" + +#~ msgid "Warn if trigraphs are encountered that might affect the meaning of the program" +#~ msgstr "Avertir si des trigraphes sont rencontrés et qui pourraient affecter le sens du programme" + +#~ msgid "Warn if an undefined macro is used in an #if directive" +#~ msgstr "Avertir si un macro indéfini est utilisé dans un directive #if" + +#~ msgid "Warn about uninitialized automatic variables" +#~ msgstr "Avertir à propos des variables automatiques non initialisées" + +#~ msgid "Warn about unrecognized pragmas" +#~ msgstr "Avertir à propos des pragmas non reconnus" + +#~ msgid "Warn about code that will never be executed" +#~ msgstr "Avertir à propos du code qui ne sera jamais exécuté" + +#~ msgid "Enable all -Wunused- warnings" +#~ msgstr "Autoriser tous les -Wunused- warnings" + +#~ msgid "Warn when a function is unused" +#~ msgstr "Avertir lorsqu'une fonction est inutilisée" + +#~ msgid "Warn when a label is unused" +#~ msgstr "Avertir lorsqu'une étiquette est inutilisée" + +#~ msgid "Warn about macros defined in the main file that are not used" +#~ msgstr "Avertir à propos de macros définis dans le fichier principal qui ne sont pas utilisés" + +#~ msgid "Warn when a function parameter is unused" +#~ msgstr "Avertir lorsqu'un paramètre de fonction est inutilisé" + +#~ msgid "Warn when an expression value is unused" +#~ msgstr "Avertir lorsque la valeur d'une expression n'est pas utilisée" + +#~ msgid "Warn when a variable is unused" +#~ msgstr "Avertir lorsque 'une variable est inutilisée" + +#~ msgid "Give strings the type \"array of char\"" +#~ msgstr "Fournir des chaînes de type \"array of char\"" + +#~ msgid "A synonym for -std=c89. In a future version of GCC it will become synonymous with -std=c99 instead" +#~ msgstr "Un synonyme pour -std=c89. Dans une version future de GCC cela deviendra synonyme de -std=c99 à la place" + +#~ msgid "-aux-info \tEmit declaration information into " +#~ msgstr "-aux-info \tproduire une déclaration d'information dans le " + +#~ msgid "-d\tEnable dumps from specific passes of the compiler" +#~ msgstr "-d\tautoriser les vidanges pour des passes spécifiques du compilateur" + +#~ msgid "-dumpbase \tSet the file basename to be used for dumps" +#~ msgstr "-dumpbase \tfixer le nom de base du fichier à utiliser pour les vidanges" + +#~ msgid "Enforce class member access control semantics" +#~ msgstr "Forcer à la sémantique du contrôle d'accès à un membre de classe" + +#~ msgid "Align the start of functions" +#~ msgstr "Aligner le début des fonctions" + +#~ msgid "Align labels which are only reached by jumping" +#~ msgstr "Aligner les étiquettes qui sont seulement atteintes par sauts" + +#~ msgid "Align all labels" +#~ msgstr "Aligner toutes les étiquettes" + +#~ msgid "Align the start of loops" +#~ msgstr "Aligner le début des boucles" + +#~ msgid "Change when template instances are emitted" +#~ msgstr "Changer lorsque les instances du canevas sont produites" + +#~ msgid "Specify that arguments may alias each other and globals" +#~ msgstr "Spécifier que les arguments peuvent avoir des alias l'un vers l'autre et globaux" + +#~ msgid "Assume arguments may alias globals but not each other" +#~ msgstr "Présumer que les arguments peuvent avoir des alias globaux mais pas l'un vers l'autre" + +#~ msgid "Assume arguments alias neither each other nor globals" +#~ msgstr "Assumer que les alias d'arguments n'en ont pas l'un vers l'autre ou globaux" + +#~ msgid "Recognize the \"asm\" keyword" +#~ msgstr "Reconnaître le mot clé « asm »" + +#~ msgid "Generate unwind tables that are exact at each instruction boundary" +#~ msgstr "Générer des tables étendues qui soient exactes pour chaque borne d'instruction" + +#~ msgid "Generate code to check bounds before indexing arrays" +#~ msgstr "Générer du code pour vérifier les bornes avant d'indexer les tableaux" + +#~ msgid "Replace add, compare, branch with branch on count register" +#~ msgstr "Remplacer add,compare,branch avec des branchements utilisant un compteur registre" + +#~ msgid "Use profiling information for branch probabilities" +#~ msgstr "Utiliser les informations de profilage pour les probabilités de branchements" + +#~ msgid "Perform branch target load optimization before prologue / epilogue threading" +#~ msgstr "Effectuer l'optimisation du chargement du branchement cible avant le thread prologue / epilogue" + +#~ msgid "Perform branch target load optimization after prologue / epilogue threading" +#~ msgstr "Effectuer l'optimisation du chargement du branchement cible après le thread prologue / epilogue" + +#~ msgid "Recognize built-in functions" +#~ msgstr "Reconnaître aucun construit dans les fonctions" + +#~ msgid "-fcall-saved-\tMark as being preserved across functions" +#~ msgstr "-fcall-saved-\tmarquer le comme étant préservé à travers les fonctions" + +#~ msgid "-fcall-used-\tMark as being corrupted by function calls" +#~ msgstr "-fcall-used-\tmarquer le comme étant corrompu par les appels de fonctions" + +#~ msgid "Save registers around function calls" +#~ msgstr "Sauvegarder les registres autour des appels de fonction" + +#~ msgid "Check the return value of new" +#~ msgstr "Vérifier la valeur retournée de new" + +#~ msgid "Do not put uninitialized globals in the common section" +#~ msgstr "Ne pas placer de globaux non initialisés dans la section commune" + +#~ msgid "Allow the arguments of the '?' operator to have different types" +#~ msgstr "Permettre les arguments de l'opérateur « ? » d'avoir différents types" + +#~ msgid "Reduce the size of object files" +#~ msgstr "Réduire la taille des fichiers objets" + +#~ msgid "Make string literals \"const char[]\" not \"char[]\"" +#~ msgstr "Rendre les chaînes de mots \"const char[]\" et non pas \"char[]\"" + +#~ msgid "-fconst-string-class=\tUse class for constant strings" +#~ msgstr "-fconst-string-class=\tutiliser la classe pour la chaînes de constantes" + +#~ msgid "Perform a register copy-propagation optimization pass" +#~ msgstr "Effectuer la passe d'optimisation de la propagation-de-copie par registre" + +#~ msgid "Perform cross-jumping optimization" +#~ msgstr "Exécuter des optimisations de sauts croisés" + +#~ msgid "When running CSE, follow jumps to their targets" +#~ msgstr "Lorsque CSE s'exécute, suivre les sauts vers leurs cibles" + +#~ msgid "When running CSE, follow conditional jumps" +#~ msgstr "Lorsque CSE s'exécute, suivre les sauts considitionnels vers leurs cibles" + +#~ msgid "Place data items into their own section" +#~ msgstr "placer les items des données dans leur propre section" + +#~ msgid "Inline member functions by default" +#~ msgstr "Rendre enligne un membre de fonction par défaut" + +#~ msgid "Defer popping functions args from stack until later" +#~ msgstr "Déférer le dépilage des arguments de fonction de la pile plus tard" + +#~ msgid "Attempt to fill delay slots of branch instructions" +#~ msgstr "Tented de remplir de délais les fentes des instructions de branchement" + +#~ msgid "Delete useless null pointer checks" +#~ msgstr "Détruire les vérifications de pointeurs nul inutiles" + +#~ msgid "-fdiagnostics-show-location=[once|every-line]\tHow often to emit source location at the beginning of line-wrapped diagnostics" +#~ msgstr "-fdiagnostics-show-location=[once|every-line]\tindiquer combien de fois les informations de localisation des sources doivent être produites au début d'un diagnostique lorsque les lignes doivent s'enrouler" + +#~ msgid "Permit '$' as an identifier character" +#~ msgstr "Autoriser '$' comme identificateur de caractère" + +#~ msgid "-fdump-\tDump various compiler internals to a file" +#~ msgstr "-fdump-\tvidander les divers internes du compilateur dans un fichier" + +#~ msgid "Suppress output of instruction numbers and line number notes in debugging dumps" +#~ msgstr "Supprimer dans la sortie les numéros d'instructions et de notes de lignes dans les vidanges de mises au point" + +#~ msgid "Perform DWARF2 duplicate elimination" +#~ msgstr "Exécuter une élimination DAWRF2 des doublons" + +#~ msgid "Perform unused type elimination in debug info" +#~ msgstr "Effectuer l'élimination des types non utilisés dans l'information de mise au point" + +#~ msgid "Generate code to check exception specifications" +#~ msgstr "Générer le code pour vérifier les exceptions de spécifications" + +#~ msgid "Enable exception handling" +#~ msgstr "Autoriser le traitement des exceptions" + +#~ msgid "-fexec-charset=\tConvert all strings and character constants to character set " +#~ msgstr "-fexec-charset=\tconvertir toutes les chaînes et les constantes de caractères en jeu de caractères " + +#~ msgid "Perform a number of minor, expensive optimizations" +#~ msgstr "Effectuer un nombre mineur d'optimisations coûteuses" + +#~ msgid "Assume no NaNs or infinities are generated" +#~ msgstr "Assumer qu'aucun NaNs ou infinités ne soit généré" + +#~ msgid "-ffixed-\tMark as being unavailable to the compiler" +#~ msgstr "-ffixed-\tmarquer le comme n'étant plus disponible pour le compilateur" + +#~ msgid "Do not store floats in registers" +#~ msgstr "Ne pas stocker les flottants dans les registres" + +#~ msgid "Scope of for-init-statement variables is local to the loop" +#~ msgstr "Étendue des variables for-init-statement est local à la boucle" + +#~ msgid "Copy memory address constants into registers before use" +#~ msgstr "Copier les constantes d'adresses mémoire dans les registres avant de les utiliser" + +#~ msgid "Copy memory operands into registers before use" +#~ msgstr "Copier les opérandes mémoire dans les registres avant de les utiliser" + +#~ msgid "Do not assume that standard C libraries and \"main\" exist" +#~ msgstr "Ne pas assumer que les bibliothèques standards C et \"main\" existent" + +#~ msgid "Allow function addresses to be held in registers" +#~ msgstr "Autoriser le maintien des adresses de fonction dans les registres" + +#~ msgid "Place each function into its own section" +#~ msgstr "placer chaque fonction dans sa propre section" + +#~ msgid "Perform global common subexpression elimination" +#~ msgstr "Exécuter l'élimination de sous-expression commune globale" + +#~ msgid "Perform redundant load after store elimination in global common subexpression elimination" +#~ msgstr "Exécuter un stockage redondant après l'élimination de sous-expression commune globale" + +#~ msgid "Perform enhanced load motion during global common subexpression elimination" +#~ msgstr "Exécuter un chargement amélioré lors de l'élimination de sous-expression commune globale" + +#~ msgid "Perform store motion after global common subexpression elimination" +#~ msgstr "Exécuter un stockage après l'élimination de sous-expression commune globale" + +#~ msgid "Recognize GNU-defined keywords" +#~ msgstr "Reconnaître les mots clés définis GNU" + +#~ msgid "Generate code for GNU runtime environment" +#~ msgstr "Générer du code pour l'environnement GNU d'exécution" + +#~ msgid "Enable guessing of branch probabilities" +#~ msgstr "Autoriser l'estimation des probabilités de branchement" + +#~ msgid "Assume normal C execution environment" +#~ msgstr "Présumer que l'environnement d'exécution C est normal" + +#~ msgid "Enable support for huge objects" +#~ msgstr "Autoriser le support des grands objets" + +#~ msgid "Process #ident directives" +#~ msgstr "Traiter les directive #ident" + +#~ msgid "Perform conversion of conditional jumps to branchless equivalents" +#~ msgstr "Exécuter la conversion des sauts conditionels à des équivalents sans branchements" + +#~ msgid "Perform conversion of conditional jumps to conditional execution" +#~ msgstr "Exécuter la conversion des sauts conditionnels à une exécution conditionnel" + +#~ msgid "Export functions even if they can be inlined" +#~ msgstr "Exporter les fonctions même si elles peuvent être enligne" + +#~ msgid "Emit implicit instantiations of inline templates" +#~ msgstr "Produire les instanciations explicites de canevas enligne" + +#~ msgid "Emit implicit instantiations of templates" +#~ msgstr "Produire les instanciations explicites de canevas" + +#~ msgid "Do not generate .size directives" +#~ msgstr "Ne pas générer de directives .size" + +#~ msgid "Pay attention to the \"inline\" keyword" +#~ msgstr "Porter attention au mot clé \"inline\"" + +#~ msgid "Integrate simple functions into their callers" +#~ msgstr "Intégrer les fonctions simples à l'intérieur des appelants" + +#~ msgid "-finline-limit=\tLimit the size of inlined functions to " +#~ msgstr "-finline-limit=\tlimiter la taille des fonction enligne à " + +#~ msgid "-finput-charset= Specify the default character set for source files." +#~ msgstr "-finput-charset= spécifier le jeu de caractères par défaut pour les fichiers source" + +#~ msgid "Instrument function entry and exit with profiling calls" +#~ msgstr "Traiter les entrées et les sorties des fonctions avec appels de profilage" + +#~ msgid "Generate code for functions even if they are fully inlined" +#~ msgstr "Générer le code pour les fonctions même si elles sont complètement enligne" + +#~ msgid "Emit static const variables even if they are not used" +#~ msgstr "Produire des variables constantes statiques même si elles ne sont pas utilisées" + +#~ msgid "Give external symbols a leading underscore" +#~ msgstr "Afficher les symboles externes préfixés d'un caractère de soulignement" + +#~ msgid "Perform loop optimizations" +#~ msgstr "Exécuter l'optimisation des boucles" + +#~ msgid "Set errno after built-in math functions" +#~ msgstr "Initialiser errno après les fonctions internes mathématiques" + +#~ msgid "Report on permanent memory allocation" +#~ msgstr "Rapporter l'allocation de mémoire permanente" + +#~ msgid "Attempt to merge identical constants and constant variables" +#~ msgstr "Tentative de fusion de constantes identique et des variables constantes" + +#~ msgid "Attempt to merge identical constants across compilation units" +#~ msgstr "Tentative de fusion de constantes identiques à travers des unités de compilation" + +#~ msgid "-fmessage-length=\tLimit diagnostics to characters per line. 0 suppresses line-wrapping" +#~ msgstr "-fmessage-length=\tlimiter la longueur des diagnotiques à de caractères par ligne. 0 supprime l'enroulement de ligne" + +#~ msgid "Force all loop invariant computations out of loops" +#~ msgstr "Forcer pour toutes les boucles des calculs invariants en dehors des boucles" + +#~ msgid "Don't warn about uses of Microsoft extensions" +#~ msgstr "Ne donner d'avertissement au sujet de l'utilisation des extensions de Microsoft" + +#~ msgid "Use graph-coloring register allocation" +#~ msgstr "Utiliser l'allocation des registres par coloriage de graphe" + +#~ msgid "Generate code for NeXT (Apple Mac OS X) runtime environment" +#~ msgstr "Générer le code pour l'environnement d'exécution du NeXT (Apple Mac OS X)" + +#~ msgid "Assume that receivers of Objective-C messages may be nil" +#~ msgstr "Assumer que les receveur de messages Objective-C peut être NIL" + +#~ msgid "Support synchronous non-call exceptions" +#~ msgstr "Supporter les exceptions synchrones des non appels" + +#~ msgid "Enable Objective-C exception and synchronization syntax" +#~ msgstr "Autoriser l'exception Objective-C et la synchronisation de syntaxe" + +#~ msgid "Perform loop unrolling for all loops" +#~ msgstr "Exécuter la boucle par désenroulement de toutes les boucles" + +#~ msgid "Perform loop unrolling when iteration count is known" +#~ msgstr "Exécuter un dé-roulement des boucles lorsque le compteur d'itération est connu" + +#~ msgid "When possible do not generate stack frames" +#~ msgstr "Lorsque c'est possible ne pas générer des trames de pile" + +#~ msgid "Recognize C++ kewords like \"compl\" and \"xor\"" +#~ msgstr "Reconnaître les mots clés C++ comme \"compl\" et \"xor\"" + +#~ msgid "Do the full register move optimization pass" +#~ msgstr "Effectuer la passe d'optimisation complète des déplacements par les registres" + +#~ msgid "Optimize sibling and tail recursive calls" +#~ msgstr "Optimiser sur mesure les appels enfants et récursif" + +#~ msgid "Enable optional diagnostics" +#~ msgstr "Autoriser les diagnostiques optionnels" + +#~ msgid "Pack structure members together without holes" +#~ msgstr "Empaqueter les membres des structures ensembles sans trous" + +#~ msgid "Return small aggregates in memory, not registers" +#~ msgstr "Retourner les petits aggrégats en mémoire, pas dans les registres" + +#~ msgid "Perform loop peeling" +#~ msgstr "Exécuter des réductions de boucles" + +#~ msgid "Enable machine specific peephole optimizations" +#~ msgstr "Autoriser les optimisations des trous spécifiques à une machine" + +#~ msgid "Enable an RTL peephole pass before sched2" +#~ msgstr "Autoriser l'exécution de la passe RTL avant sched2" + +#~ msgid "Downgrade conformance errors to warnings" +#~ msgstr "Dégrader les erreurs de conformité en des avertissements" + +#~ msgid "Generate position-independent code if possible" +#~ msgstr "Générer du code indépendant de la position si possible" + +#~ msgid "Generate position-independent code for executables if possible" +#~ msgstr "Générer du code indépendant de la position pour les exécutables si possible" + +#~ msgid "Generate prefetch instructions, if available, for arrays in loops" +#~ msgstr "Générer des instructions prérecherchées, si disponible, pour les tableaux dans les boucles" + +#~ msgid "Treat the input file as already preprocessed" +#~ msgstr "Traiter le fichier d'entrée comme ayant déjà été pré-traité" + +#~ msgid "Enable basic program profiling code" +#~ msgstr "Autoriser le code de profilage de base du programme" + +#~ msgid "Insert arc-based program profiling code" +#~ msgstr "Insérer le code de profilage du programme de arc-based" + +#~ msgid "Enable common options for generating profile info for profile feedback directed optimizations" +#~ msgstr "Autoriser les options communes pour la génération d'information de profile pour le feedback d'optimisation direct de profile" + +#~ msgid "Enable common options for performing profile feedback directed optimizations" +#~ msgstr "Autoriser les options communes pour effectuer le feedback d'optimisation direct de profile" + +#~ msgid "Insert code to profile values of expressions" +#~ msgstr "Insérer le code pour profile les expressions de valeurs" + +#~ msgid "-frandom-seed=\tMake compile reproducible using " +#~ msgstr "-frandom-seed=\tfaire une compilation reproduisible en utilisant " + +#~ msgid "Strength reduce all loop general induction variables" +#~ msgstr "Renforcer la réduction de toutes les boucles par induction des variables" + +#~ msgid "Return small aggregates in registers" +#~ msgstr "Retourner les petits aggrégats dans les registres" + +#~ msgid "Enables a register move optimization" +#~ msgstr "Autoriser l'optimisation des déplacements par registre" + +#~ msgid "Perform a register renaming optimization pass" +#~ msgstr "Effectuer une changement de nom de registres après une passe d'optimisation" + +#~ msgid "Reorder basic blocks to improve code placement" +#~ msgstr "Ré-ordonner les blocs de base pour améliorer l'emplacement de code" + +#~ msgid "Reorder functions to improve code placement" +#~ msgstr "Ré-ordonner les fonctions pour améliorer l'emplacement de code" + +#~ msgid "Used in Fix-and-Continue mode to indicate that object files may be swapped in at runtime" +#~ msgstr "Utiliser le mode Fix-and-=Continue pour indique que des fichiers objets peuvent interchangés lors de l'éexécution" + +#~ msgid "Enable automatic template instantiation" +#~ msgstr "Autoriser l'instanciation automatique de canevas" + +#~ msgid "Add a common subexpression elimination pass after loop optimizations" +#~ msgstr "Ajouter une passe d'élimination d'une sous-expression commune après les optimisations de boucle" + +#~ msgid "Run the loop optimizer twice" +#~ msgstr "Exécuter l'optimiseur de boucle deux fois" + +#~ msgid "Disable optimizations that assume default FP rounding behavior" +#~ msgstr "Interdire les optimisation qui assument un comportement d'arrondissement FP par défaut" + +#~ msgid "Generate run time type descriptor information" +#~ msgstr "Générer l'information pour un type de descripteur lors de l'exécution" + +#~ msgid "Enable scheduling across basic blocks" +#~ msgstr "Autoriser l'ordonnancement à travers les blocs de base" + +#~ msgid "Allow speculative motion of non-loads" +#~ msgstr "Autoriser le mouvement spéculatif de non chargements" + +#~ msgid "Allow speculative motion of some loads" +#~ msgstr "Autoriser le mouvement spéculatif de quelques chargements" + +#~ msgid "Allow speculative motion of more loads" +#~ msgstr "Autoriser le mouvement spéculatif de plusieurs chargements" + +#~ msgid "Allow premature scheduling of queued insns" +#~ msgstr "Autoriser l'ordonnancement prématuré de queues insns" + +#~ msgid "Set dependence distance checking in premature scheduling of queued insns" +#~ msgstr "Fixer la distance de vérification de dépendance dans l'ordonnancement prématuré d'insns en queue" + +#~ msgid "-fsched-stalled-insns-dep= Set dependence distance checking in premature scheduling of queued insns" +#~ msgstr "-fsched-stalled-insns-dep= fixer la distance de vérification de dépendance dans l'ordonnancement d'insnsn en queue" + +#~ msgid "-fsched-stalled-insns= Set number of queued insns that can be prematurely scheduled" +#~ msgstr "-fsched-stalled-insns= fixer le nombre d'insns en queu qui peuvent être prématurément ordonnancés" + +#~ msgid "-fsched-verbose=\tSet the verbosity level of the scheduler" +#~ msgstr "-fsched-verbose=\tnitialiser le niveau de verbosité de l'ordonnanceur" + +#~ msgid "If scheduling post reload, do superblock scheduling" +#~ msgstr "Si l'ordonnancement fait une post recharge, faire un ordonnancement de super bloc" + +#~ msgid "If scheduling post reload, do trace scheduling" +#~ msgstr "Si l'ordonnancement fait une post recharge, laisse une trace de l'ordonnancement" + +#~ msgid "Reschedule instructions before register allocation" +#~ msgstr "Réordonnancer les instructions avant l'allocation de registres" + +#~ msgid "Reschedule instructions after register allocation" +#~ msgstr "Réordonnancer les instructions après l'allocation de registres" + +#~ msgid "Mark data as shared rather than private" +#~ msgstr "Marquer les données comme partagées au lieu de privées" + +#~ msgid "Use the same size for double as for float" +#~ msgstr "Utiliser la même taille pour un double que pour un flottant" + +#~ msgid "Use the narrowest integer type possible for enumeration types" +#~ msgstr "Utiliser le type d'entier le moins large possible pour les types d'énumération" + +#~ msgid "Force the underlying type for \"wchar_t\" to be \"unsigned short\"" +#~ msgstr "Écraser le type sous-jacent de \"wchar_t\" vers \"unsigned short\"" + +#~ msgid "Disable optimizations observable by IEEE signaling NaNs" +#~ msgstr "Désactiver les optimisations observable par le signalement NaNs IEEE" + +#~ msgid "When \"signed\" or \"unsigned\" is not given make the bitfield signed" +#~ msgstr "Lorsque \"signed\" ou \"unsigned\" n,est pas fourni rendre le champ de bits signé" + +#~ msgid "Make \"char\" signed by default" +#~ msgstr "Rendre les « char » signés par défaut" + +#~ msgid "Convert floating point constants to single precision constants" +#~ msgstr "Convertir les constantes en virgules flottantes en constantes de simple précision" + +#~ msgid "Insert stack checking code into the program" +#~ msgstr "Insérer du code de vérificaion de la pile dans le programme" + +#~ msgid "-fstack-limit-register=\tTrap if the stack goes past " +#~ msgstr "-fstack-limit-register=\tfaire un déroutement si la pile va au delà du " + +#~ msgid "-fstack-limit-symbol=\tTrap if the stack goes past symbol " +#~ msgstr "-fstack-limit-symbol=\tfaire un déroutement si la pile va au delà du symbole " + +#~ msgid "Display statistics accumulated during compilation" +#~ msgstr "Afficher les statistiques accumulés durant la compilation" + +#~ msgid "Perform strength reduction optimizations" +#~ msgstr "Exécuter un réduction en force des optimisations" + +#~ msgid "Assume strict aliasing rules apply" +#~ msgstr "Présumer que des règles stricts d'alias s'appliquent" + +#~ msgid "Check for syntax errors, then stop" +#~ msgstr "Vérifier les erreurs de syntaxes et puis stopper" + +#~ msgid "-ftabstop=\tDistance between tab stops for column reporting" +#~ msgstr "-ftabstop=\tfixer la distance de la tabulation des colonnes dans les rapports" + +#~ msgid "-ftemplate-depth-\tSpecify maximum template instantiation depth" +#~ msgstr "-ftemplate-depth-\tspécifier la profondeur maximale d'instanciation de canevas" + +#~ msgid "Create data files needed by \"gcov\"" +#~ msgstr "Créer les fichiers de données nécessaires à \"gcov\"" + +#~ msgid "Perform jump threading optimizations" +#~ msgstr "Exécuter des optimisations de sauts de thread" + +#~ msgid "Report the time taken by each compiler pass" +#~ msgstr "Rapporter le temps pris par chaque passe de compilation" + +#~ msgid "-ftls-model=[global-dynamic|local-dynamic|initial-exec|local-exec]\tSet the default thread-local storage code generation model" +#~ msgstr "-ftls-model=[global-dynamic|local-dynamic|initial-exec|local-exec]\tinitialiser le modèle de génération de code par défaut de thread local" + +#~ msgid "Perform superblock formation via tail duplication" +#~ msgstr "Exécuter la formation du super bloc via la duplication de la queue" + +#~ msgid "Assume floating-point operations can trap" +#~ msgstr "On assume que les opérations en virgule flottante peuvent être attrappées" + +#~ msgid "Trap for signed overflow in addition, subtraction and multiplication" +#~ msgstr "Attrapper les débordements de signe dans l'addition, la soustraction et la multiplication" + +#~ msgid "Compile whole compilation unit at a time" +#~ msgstr "Compiler complètement à la fois une unité de compilation" + +#~ msgid "Allow math optimizations that may violate IEEE or ISO standards" +#~ msgstr "Permettre les optimisations mathématiques qui peuvent violer les standards IEEE ou ISO" + +#~ msgid "When \"signed\" or \"unsigned\" is not given make the bitfield unsigned" +#~ msgstr "Lorsque \"signed\" ou \"unsigned\" n'est pas fourni rendre le champ de bits non signé" + +#~ msgid "Make \"char\" unsigned by default" +#~ msgstr "Rendre les \"char\" non signés par défaut" + +#~ msgid "Perform loop unswitching" +#~ msgstr "Exécuter des boucles sans branchement" + +#~ msgid "Just generate unwind tables for exception handling" +#~ msgstr "Générer simplement des tables étendues pour le traitement des exceptions" + +#~ msgid "Use __cxa_atexit to register destructors" +#~ msgstr "Utiliser « __cxa_atexit » pour enregistrer les destructeurs." + +#~ msgid "Add extra commentary to assembler output" +#~ msgstr "Ajouter des commentaires additionnels à la sortie de l'assembleur" + +#~ msgid "Use expression value profiles in optimizations" +#~ msgstr "Utiliser le profile de la valeur d'expression dans l'optimisation" + +#~ msgid "Discard unused virtual functions" +#~ msgstr "Écarter les fonctions virtuelles non utilisées" + +#~ msgid "Implement vtables using thunks" +#~ msgstr "Implanter les vtables en utilisant des thunks" + +#~ msgid "Emit common-like symbols as weak symbols" +#~ msgstr "Produire les symboles communs comme des symboles faibles" + +#~ msgid "Construct webs and split unrelated uses of single variable" +#~ msgstr "Construire une toile et séparer les utilisations de variables simples" + +#~ msgid "-fwide-exec-charset=\tConvert all wide strings and character constants to character set " +#~ msgstr "-fwide-exec-charset=\tconvertir toutes les chaînes et les constantes larges de caractères en jeux de caractères " + +#~ msgid "Generate a #line directive pointing at the current working directory" +#~ msgstr "Générer une directive #line pointant sur le répertoire courant de travail" + +#~ msgid "Assume signed arithmetic overflow wraps around" +#~ msgstr "Assumer un débordement arithmétique signé enroulé" + +#~ msgid "Store strings in writable data section" +#~ msgstr "Stocker les chaînes dans les sections d'écriture des données" + +#~ msgid "Emit cross referencing information" +#~ msgstr "Produire l'information des références croisées" + +#~ msgid "Put zero initialized data in the bss section" +#~ msgstr "Placer des données initialisées de zéros dans la section bss" + +#~ msgid "Generate lazy class lookup (via objc_getClass()) for use in Zero-Link mode" +#~ msgstr "Générer un recherche molle de class (via objc_getClass()) pour l'utilisation en mode Zero-Link" + +#~ msgid "Generate debug information in default format" +#~ msgstr "Générer les informations de mise au point dans le format par défaut" + +#~ msgid "Generate debug information in COFF format" +#~ msgstr "Générer les informations de mise au point dans le format COFF" + +#~ msgid "Generate debug information in DWARF v2 format" +#~ msgstr "Générer les informations de mise au point dans le format DWARF v2" + +#~ msgid "Dump declarations to a .decl file" +#~ msgstr "Vidanger les déclarations dans un fichier .decl" + +#~ msgid "Generate debug information in default extended format" +#~ msgstr "Générer les informations de mise au point dans le format étendu par défaut" + +#~ msgid "Generate debug information in STABS format" +#~ msgstr "Générer les informations de mise au point dans le format STABS" + +#~ msgid "Generate debug information in extended STABS format" +#~ msgstr "Générer les informations de mise au point dans le format étendu STABS" + +#~ msgid "Generate debug information in VMS format" +#~ msgstr "Générer les informations de mise au point dans le format VMS" + +#~ msgid "Generate debug information in XCOFF format" +#~ msgstr "Générer les information de mise au point dans le format XCOFF" + +#~ msgid "Generate debug information in extended XCOFF format" +#~ msgstr "Générer les informations de mise au point dans le format étendu XCOFF" + +#~ msgid "-idirafter \tAdd to the end of the system include path" +#~ msgstr "-idirafter \tajouter à la fin du chemin système d'inclusion" + +#~ msgid "-imacros \tAccept definition of macros in " +#~ msgstr "-imacros \taccepter la définition de macros dans le " + +#~ msgid "-include \tInclude the contents of before other files" +#~ msgstr "-include \tinclure le contenu du avant les autres fichiers" + +#~ msgid "-iprefix \tSpecify as a prefix for next two options" +#~ msgstr "-iprefix \tsélectionner le comme préfixer aux deux prochaines options" + +#~ msgid "-isysroot \tSet to be the system root directory" +#~ msgstr "-isysroot \tsélectionner le comme répertoire racine du système" + +#~ msgid "-isystem \tAdd to the start of the system include path" +#~ msgstr "-isystem \tajouter le au début du chemin d'inclusion principal" + +#~ msgid "-iwithprefix \tAdd to the end of the system include path" +#~ msgstr "-iwithprefix \tajouter le à la fin du chemin d'inclusion principal" + +#~ msgid "-iwithprefixbefore \tAdd to the end of the main include path" +#~ msgstr "-iwithprefixbefore \tajouter le à la fin du chemin d'inclusion principal" + +#~ msgid "Do not search standard system include directories (those specified with -isystem will still be used)" +#~ msgstr "Ne pas rechercher les répertoires standard système d'inclusion (ceux spécifiés avec -isystem seront encore utilisés)" + +#~ msgid "Do not search standard system include directories for C++" +#~ msgstr "Ne pas rechercher les répertoires standard système d'inclusion pour C++" + +#~ msgid "-o \tPlace output into " +#~ msgstr "-o \tproduire la sortie dans le " + +#~ msgid "Enable function profiling" +#~ msgstr "Autoriser le profilage de fonction" + +#~ msgid "Issue warnings needed for strict compliance to the standard" +#~ msgstr "Émettre les avertissements nécessaires pour être conforme au standard" + +#~ msgid "Like -pedantic but issue them as errors" +#~ msgstr "Identique à -pedantic mais les marque comme des erreurs" + +#~ msgid "Generate C header of platform-specific features" +#~ msgstr "Générer les en-têtes C pour les options spécifiques à la plate-forme" + +#~ msgid "Do not display functions compiled or elapsed time" +#~ msgstr "Ne pas afficher les fonctions compilées ou le temps écoulé" + +#~ msgid "Remap file names when including files" +#~ msgstr "Rampper les noms lors de l'inclusion des fichiers" + +#~ msgid "Conform to the ISO 1998 C++ standard" +#~ msgstr "Conforme au standard ISO C++ de 1998" + +#~ msgid "Conform to the ISO 1990 C standard" +#~ msgstr "Conforme au standard ISO C de 1990" + +#~ msgid "Conform to the ISO 1999 C standard" +#~ msgstr "Conforme au standard ISO C de 1999" + +#~ msgid "Deprecated in favor of -std=c99" +#~ msgstr "Obsolète à la faveur de l'option -std=c99" + +#~ msgid "Conform to the ISO 1998 C++ standard with GNU extensions" +#~ msgstr "Conforme au standard ISO C++ de 1998 avec les extensions de GNU" + +#~ msgid "Conform to the ISO 1990 C standard with GNU extensions" +#~ msgstr "Conforme au standard ISO C de 1990 avec les extensions de GNU" + +#~ msgid "Conform to the ISO 1999 C standard with GNU extensions" +#~ msgstr "Conforme au standard ISO C de 1999 avec les extensions de GNU" + +#~ msgid "Deprecated in favor of -std=gnu99" +#~ msgstr "Obsolète à la faveur de l'option -std=gnu99" + +#~ msgid "Deprecated in favor of -std=c89" +#~ msgstr "Obsolète à la faveur de l'option -std=c89" + +#~ msgid "Conform to the ISO 1990 C standard as amended in 1994" +#~ msgstr "Conforme au standard ISO C de 1990 tel amendé en 1994" + +#~ msgid "Enable traditional preprocessing" +#~ msgstr "Autoriser le traitement traditionnel" + +#~ msgid "-trigraphs\tSupport ISO C trigraphs" +#~ msgstr "-trigraphs\tSupporter les tri-graphes ISO C" + +#~ msgid "Do not predefine system-specific and GCC-specific macros" +#~ msgstr "Ne pas prédéfinir les macros spécifiques au système ou à GCC" + +#~ msgid "Enable verbose output" +#~ msgstr "Autoriser le mode bavard sur la sortie" + +#~ msgid "Display the compiler's version" +#~ msgstr "Afficher la version du compilateur" + +#~ msgid "Suppress warnings" +#~ msgstr "Supprimer les avertissements" + +#~ msgid "`-p' not supported; use `-pg' and gprof(1)" +#~ msgstr "« -p » n'est pas supporté; utiliser « -pg » et gprof(1)" + +#~ msgid "GCC does not support -C without using -E" +#~ msgstr "GCC ne supporte pas -C sans utiliser -E" + +#~ msgid "GCC does not support -CC without using -E" +#~ msgstr "GCC ne supporte pas -CC sans utiliser -E" + +#~ msgid "may not use both -m32 and -m64" +#~ msgstr "ne peut utiliser ensemble -m32 et -m64" + +#~ msgid "shared and mdll are not compatible" +#~ msgstr "shared et mdll ne sont pas compatibles" + +#~ msgid "-current_version only allowed with -dynamiclib" +#~ msgstr "-current_version permis seulement avec -dynamiclib" + +#~ msgid "-install_name only allowed with -dynamiclib" +#~ msgstr "-install_name permis seulement avec with -dynamiclib" + +#~ msgid "-bundle not allowed with -dynamiclib" +#~ msgstr "-bundle n'est pas permis avec -dynamiclib" + +#~ msgid "-bundle_loader not allowed with -dynamiclib" +#~ msgstr "-bundle_loader n'est pas permis avec -dynamiclib" + +#~ msgid "-client_name not allowed with -dynamiclib" +#~ msgstr "-client_name n'est pas permis avec -dynamiclib" + +#~ msgid "-force_cpusubtype_ALL not allowed with -dynamiclib" +#~ msgstr "-force_cpusubtype_ALL n'est pas permis avec -dynamiclib" + +#~ msgid "-force_flat_namespace not allowed with -dynamiclib" +#~ msgstr "-force_flat_namespace n'est pas permis avec -dynamiclib" + +#~ msgid "-keep_private_externs not allowed with -dynamiclib" +#~ msgstr "-keep_private_externs n'est pas permis avec -dynamiclib" + +#~ msgid "-private_bundle not allowed with -dynamiclib" +#~ msgstr "-private_bundle n'est pas permis avec -dynamiclib" + +#~ msgid "The -shared option is not currently supported for VAX ELF." +#~ msgstr "L'option -shared n'est pas couramment supportée pour VAS ELF." + +#~ msgid "profiling not supported with -mg\n" +#~ msgstr "profilage n'est pas supporté avec -mg\n" + +#~ msgid "may not use both -EB and -EL" +#~ msgstr "ne peut utiliser ensemble -EB et -EL" + +#~ msgid "-pipe is not supported" +#~ msgstr "-pipe n'est pas supporté" + +#~ msgid "-pg and -fomit-frame-pointer are incompatible" +#~ msgstr "-pg et -fomit-frame-pointer sont incompatibles" + +#~ msgid "-fjni and -femit-class-files are incompatible" +#~ msgstr "-fjni et -femit-class-files sont incompatibles" + +#~ msgid "-fjni and -femit-class-file are incompatible" +#~ msgstr "-fjni et -femit-class-file sont incompatibles" + +#~ msgid "-femit-class-file should used along with -fsyntax-only" +#~ msgstr "-femit-class-file dervait être utilisé avec -fsyntax-only" + +#~ msgid "-pg or -p and -fomit-frame-pointer are incompatible" +#~ msgstr "-pg et -p et -fomit-frame-pointer sont incompatibles" + +#~ msgid "does not support multilib" +#~ msgstr "ne supporte pas multilib" + +#~ msgid "-pg not supported on this platform" +#~ msgstr "-pg n'est pas supporté sur cette plate-forme" + +#~ msgid "-p and -pp specified - pick one" +#~ msgstr "-p et -pp spécifié - n'en prendre qu'un seul" + +#~ msgid "-G and -static are mutually exclusive" +#~ msgstr "-G et -static sont mutuellement exclusives" + +#~ msgid "-mapcs-26 and -mapcs-32 may not be used together" +#~ msgstr "-mapcs-26 et -mapcs-32 ne peuvent être utilisés ensembles" + +#~ msgid "-msoft-float and -mhard_float may not be used together" +#~ msgstr "-msoft-float et -mhard_float ne peuvent être utilisées ensembles" + +#~ msgid "-mbig-endian and -mlittle-endian may not be used together" +#~ msgstr "-mbig-endian et -mlittle-endian ne peuvent être utilisés ensemble" + +#~ msgid "the m210 does not have little endian support" +#~ msgstr "Le m210 ne supporte pas le code pour système à octets de poids faible" + +#~ msgid "one of -c, -S, -gnatc, -gnatz, or -gnats is required for Ada" +#~ msgstr "une parmi -c, -S, -gnatc, -gnatz ou -gnats est requise pour Ada" + +#~ msgid "-mhard-float not supported" +#~ msgstr "-mhard-float n'est pas supporté" + +#~ msgid "-msingle-float and -msoft-float can not both be specified" +#~ msgstr "-msingle-float et -msoft-float ne peuvent être spécifiés ensembles" + +#~ msgid " conflicting code gen style switches are used" +#~ msgstr " code de génération de style de switches utilisées est en conflit" + +#~ msgid "GCC does not support -C or -CC without -E" +#~ msgstr "GCC ne supporte pas -C ou -CC sans utiliser -E" + +#~ msgid "-E required when input is from standard input" +#~ msgstr "-E est requis lorsque l'entrée est faite à partir de l'entrée standard" + +#~ msgid "mno-cygwin and mno-win32 are not compatible" +#~ msgstr "mno-cygwin et mno-win32 ne sont pas compatibles" + +#~ msgid "pointer to a member used in arithmetic" +#~ msgstr "usage en arithmétique d'un pointeur vers un membre" + +#~ msgid "declaration of \"%s\" shadows a parameter" +#~ msgstr "la déclaration de « %s » masque un paramètre" + +#~ msgid "Copyright (C) 2003 Free Software Foundation, Inc.\n" +#~ msgstr "Copyright © 2003 Free Software Foundation, Inc.\n" + +#~ msgid "Use the 26-bit version of the APCS" +#~ msgstr "Utiliser la version 26 bits de APCS" + +#~ msgid "duplicate enum value `%D'" +#~ msgstr "valeur d'énumérateur « %D » en double" + +#~ msgid "duplicate field `%D' (as enum and non-enum)" +#~ msgstr "champ « %D » en double (comme enum et non enum)" + +#~ msgid "duplicate nested type `%D'" +#~ msgstr "type « %D » imbriqué en double" + +#~ msgid "duplicate field `%D' (as type and non-type)" +#~ msgstr "duplicattion du champ « %D » (comme type et non type)" + +#~ msgid "duplicate member `%D'" +#~ msgstr "membre « %D » est double" + +#~ msgid "ISO C++ forbids member `%D' with same name as enclosing class" +#~ msgstr "ISO C++ interdit le membre « %D » avec le même non de la classe de fermeture" + +#~ msgid "field `%D' declared static in union" +#~ msgstr "champ « %D » déclaré statique dans l'union" + +#~ msgid "ISO C++ forbids static data member `%D' with same name as enclosing class" +#~ msgstr "ISO C++ interdit les données de membres statiques « %D » avec le même nom comme classe de fermeture" + +#~ msgid "anachronistic use of array size in vector delete" +#~ msgstr "utilisation anachronique de la taille d'un tableau dans un vecteur delete" + +#~ msgid "ISO C++ forbids aggregate initializer to new" +#~ msgstr "ISO C++ interdit l'aggrégation d'initialiseur à new" + +#~ msgid "neither the destructor nor the class-specific operator delete will be called, even if they are declared when the class is defined." +#~ msgstr "ni le destructeur ni l'opérateur « delete » spécifique à la classe ne sera appellé, même s'ils sont déclarés lorsque la classe est définie" + +#~ msgid "Warn if deprecated class, method, or field is used" +#~ msgstr "Avertir si une classe, une méthode ou un champ obsolète est utilisé" + +#~ msgid "Warn if deprecated empty statements are found" +#~ msgstr "Avertir si des déclarations vides obsolètes sont trouvées" + +#~ msgid "Enable warnings about inter-procedural problems" +#~ msgstr "Autoriser les avertissements à propos des problèmes inter-procédural" + +#~ msgid "Warn if .class files are out of date" +#~ msgstr "Avertir si des fichier .class sont périmées" + +#~ msgid "Warn if modifiers are specified when not necessary" +#~ msgstr "Avertir si des modificateurs sont spécifiés sans que cela ne soit nécessaires" + +#~ msgid "Warn about constructs with surprising meanings" +#~ msgstr "Avertir à propos des construits ayant des sens surprenants" + +#~ msgid "--CLASSPATH\tDeprecated; use --classpath instead" +#~ msgstr "--CLASSPATH\tobsolète; utiliser --classpath à la place" + +#~ msgid "Do not treat local variables and COMMON blocks as if they were named in SAVE statements" +#~ msgstr "Traiter les variables locales et les blocs COMMON comme s'ils étaient nommés dans une déclaration SAVE" + +#~ msgid "Backslashes in character and hollerith constants are special (not C-style)" +#~ msgstr "Barres obliques inverses dans les constantes de caractères ou d'hollerith ne sont pas particulières (pas de style C)" + +#~ msgid "Delete libU77 intrinsics with bad interfaces" +#~ msgstr "Détruire les intrinsèques libU77 ayant des interfaces erronées" + +#~ msgid "Disable libU77 intrinsics with bad interfaces" +#~ msgstr "Désactiver les intrinsèques libU77 ayant des interfaces erronées" + +#~ msgid "Enable libU77 intrinsics with bad interfaces" +#~ msgstr "Autoriser les intrinsèques libU77 ayant des interfaces erronées" + +#~ msgid "Hide libU77 intrinsics with bad interfaces" +#~ msgstr "Cacher les intrinsèques libU77 ayant des interfaces erronées" + +#~ msgid "--bootclasspath=\tReplace system path" +#~ msgstr "--bootclasspath=\tremplacer le système" + +#~ msgid "Program written in strict mixed-case" +#~ msgstr "Programme écrit dans une stricte casse mélangée" + +#~ msgid "Compile as if program written in lowercase" +#~ msgstr "Compiler comme si le programme était écrit en minuscules" + +#~ msgid "Preserve case used in program" +#~ msgstr "Préserver la casse utilisée dans un programme" + +#~ msgid "Program written in lowercase" +#~ msgstr "Programmes écrit en minuscules" + +#~ msgid "Program written in uppercase" +#~ msgstr "Programme écrit en majuscules" + +#~ msgid "Compile as if program written in uppercase" +#~ msgstr "Compiler comme si le programme était écrit en majuscules" + +#~ msgid "--classpath=\tSet class path" +#~ msgstr "--classpath=\tfixer le chemin des classes" + +#~ msgid "Emit special debugging information for COMMON and EQUIVALENCE (disabled)" +#~ msgstr "Produire des information spéciales de mise au point pour COMMON et EQUIVALENCE (désactivé)" + +#~ msgid "Allow '$' in symbol names" +#~ msgstr "Permettre '$' dans les noms de symboles" + +#~ msgid "Have front end emulate COMPLEX arithmetic to avoid bugs" +#~ msgstr "Avoir un frontal d'émulation pour l'arithmétique COMPLEXE pour éviter les bugs" + +#~ msgid "--encoding=\tChoose input encoding (defaults from your locale)" +#~ msgstr "--encoding=\tchoisir l'encodade d'entrée (par défaut provient de la locale)" + +#~ msgid "f2c-compatible code can be generated" +#~ msgstr "code f2c compatible peut être généré" + +#~ msgid "Delete non-FORTRAN-77 intrinsics f2c supports" +#~ msgstr "Détruire les supports f2c intrinsèques non Fortran 77" + +#~ msgid "Disable non-FORTRAN-77 intrinsics f2c supports" +#~ msgstr "Désactiver les supports f2c intrinsèques non Fortran 77" + +#~ msgid "Enable non-FORTRAN-77 intrinsics f2c supports" +#~ msgstr "Autoriser les supports f2c intrinsèques non Fortran 77" + +#~ msgid "Hide non-FORTRAN-77 intrinsics f2c supports" +#~ msgstr "Cacher les supports f2c intrinsèques non Fortran 77" + +#~ msgid "Unsupported; generate libf2c-calling code" +#~ msgstr "Non supporté; générer le code d'appel libf2c" + +#~ msgid "Program is written in typical FORTRAN 66 dialect" +#~ msgstr "Programme est écrit dans un dialecte typique FORTRAN 66" + +#~ msgid "Program is written in typical Unix-f77 dialect" +#~ msgstr "Programme est écrit dans un dialecte typique Unix f77" + +#~ msgid "Program is written in Fortran-90-ish dialect" +#~ msgstr "Programme est écrit dans un dialecte Fortran 90" + +#~ msgid "Delete non-FORTRAN-77 intrinsics F90 supports" +#~ msgstr "Détruire les supports F90 intrinsèques non Fortran 77" + +#~ msgid "Disable non-FORTRAN-77 intrinsics F90 supports" +#~ msgstr "Désactiver les supports F90 intrinsèques non Fortran 77" + +#~ msgid "Enable non-FORTRAN-77 intrinsics F90 supports" +#~ msgstr "Autoriser les supports F90 intrinsèques non Fortran 77" + +#~ msgid "Hide non-FORTRAN-77 intrinsics F90 supports" +#~ msgstr "Cacher les supports F90 intrinsèques non Fortran 77" + +#~ msgid "ffixed-line-length-\tSet the maximum line length to " +#~ msgstr "ffixed-line-limit-\tfixer la longueur maximale de la ligne à " + +#~ msgid "Unsupported; affects code generation of arrays" +#~ msgstr "Non supporté; affecte la génération de code des tableaux" + +#~ msgid "Always check for non gcj generated classes archives" +#~ msgstr "Toujours vérifier dans les archives de classes non générées gcj" + +#~ msgid "Generate code to check subscript and substring bounds" +#~ msgstr "Générer du code pour vérifier les bornes des souscripts et des sous-chaînes" + +#~ msgid "Program is written in Fortran-90-ish free form" +#~ msgstr "Programme est écrit dans un style libre Fortran 90" + +#~ msgid "Enable fatal diagnostics about inter-procedural problems" +#~ msgstr "Autoriser les diagnostiques fatals à propos des problèmes entre procédures" + +#~ msgid "Delete non-FORTRAN-77 intrinsics g77 supports" +#~ msgstr "Détruire les supports g77 intrinsèques non Fortran 77" + +#~ msgid "Disable non-FORTRAN 77 intrinsics F90 supports" +#~ msgstr "Désactiver les supports g77 intrinsèques non Fortran 77" + +#~ msgid "Enable non-FORTRAN 77 intrinsics F90 supports" +#~ msgstr "Autoriser les supports F90 intrinsèques non Fortran 77" + +#~ msgid "Hide non-FORTRAN 77 intrinsics F90 supports" +#~ msgstr "Cacher les supports g77 intrinsèques non Fortran 77" + +#~ msgid "Use offset tables for virtual method calls" +#~ msgstr "Utiliser des tables de décalage pour les appels de méthodes virtuelles" + +#~ msgid "Initialize local vars and arrays to zero" +#~ msgstr "Initialiser les vars locales et les tableaux à zéro" + +#~ msgid "Intrinsics letters in arbitrary cases" +#~ msgstr "Lettres d'instrinsèques en casse arbitraire" + +#~ msgid "Intrinsics spelled as e.g. SqRt" +#~ msgstr "Intrinsèques épellées tel que SqRt" + +#~ msgid "Intrinsics in lowercase" +#~ msgstr "Intrinsèques en minuscules" + +#~ msgid "Intrinsics in uppercase" +#~ msgstr "Intrinsèques en majuscules" + +#~ msgid "Assume native functions are implemented using JNI" +#~ msgstr "Présumer que les fonctions natives sont implantées et qu'elles utilisent JNI" + +#~ msgid "Language keyword letters in arbitrary cases" +#~ msgstr "Lettres des mots clés du langage dans des casses arbitraires" + +#~ msgid "Language keywords spelled as e.g. IOStat" +#~ msgstr "Mots clés du langage épellés tel que IOStat" + +#~ msgid "Language keywords in lowercase" +#~ msgstr "Mots clés du langage en minuscules" + +#~ msgid "Language keywords in uppercase" +#~ msgstr "Mots clés du langage en majuscules" + +#~ msgid "Delete MIL-STD 1753 intrinsics" +#~ msgstr "Détruire les intrinsèques MIL-STD 1753" + +#~ msgid "Disable MIL-STD 1753 intrinsics" +#~ msgstr "Désactiver les intrinsèques MIL-STD 1753" + +#~ msgid "Enable MIL-STD 1753 intrinsics" +#~ msgstr "Autoriser intrinsèques MIL-STD 1753" + +#~ msgid "Hide MIL-STD 1753 intrinsics" +#~ msgstr "Cacher les intrinsèques MIL-STD 1753" + +#~ msgid "Take at least one trip through each iterative DO loop" +#~ msgstr "Exécuter une dernière fois la visite à traves chaque boucle itérative DO" + +#~ msgid "Enable optimization of static class initialization code" +#~ msgstr "Autorisser l'optimisation du code d'initialisation de classe statique" + +#~ msgid "Warn about use of (only a few for now) Fortran extensions" +#~ msgstr "Avertir à propos de l'utilisation (très peu pour l'instant) des extensions Fortran" + +#~ msgid "Allow appending a second underscore to externals" +#~ msgstr "Permettre l'ajout d'un second caractère de soulignement aux externes" + +#~ msgid "Do not print names of program units as they are compiled" +#~ msgstr "Afficher les noms des unités de programme tels que compilées" + +#~ msgid "Internally convert most source to lowercase" +#~ msgstr "Convertir de manière interne la majorité des sources en majuscules" + +#~ msgid "Internally preserve source case" +#~ msgstr "Préserver à l'interne la casse des sources" + +#~ msgid "Internally convert most source to uppercase" +#~ msgstr "Convertir à l'interne la majorité des sources en majuscules" + +#~ msgid "Enable assignability checks for stores into object arrays" +#~ msgstr "Autoriser la vérificaitions des affectations dans le stockage des tableaux d'objets" + +#~ msgid "Symbol names spelled in mixed case" +#~ msgstr "Noms des symboles épellés dans des casses mélangées" + +#~ msgid "Symbol names in lowercase" +#~ msgstr "Noms de symboles en minuscules" + +#~ msgid "Symbol names in uppercase" +#~ msgstr "Noms des symboles en majuscules" + +#~ msgid "Make prefix-radix non-decimal constants be typeless" +#~ msgstr "Rendre les préfixes des bases des constantes non décimales sans type" + +#~ msgid "Allow all ugly features" +#~ msgstr "Permettre toutes les options laides" + +#~ msgid "Hollerith and typeless can be passed as arguments" +#~ msgstr "Les Hollerith et sans type peuvent être passés comme arguments" + +#~ msgid "Allow ordinary copying of ASSIGN'ed vars" +#~ msgstr "Permettre le copie ordinaire des variable affectées" + +#~ msgid "Dummy array dimensioned to (1) is assumed-size" +#~ msgstr "Tableau factice dont la taille des dimensions (1) est assumée" + +#~ msgid "Trailing comma in procedure call denotes null argument" +#~ msgstr "Virgule de fin dans l'appel de la procédure dénote un argument nul" + +#~ msgid "Allow REAL(Z) and AIMAG(Z) given DOUBLE COMPLEX Z" +#~ msgstr "Permettre REAL(Z) et AIMAG(Z) pour les DOUBLE COMPLEX Z" + +#~ msgid "Initialization via DATA and PARAMETER is not type-compatible" +#~ msgstr "Initialisation via DATA et PARAMETER n'est pas un type compatible" + +#~ msgid "Allow INTEGER and LOGICAL interchangeability" +#~ msgstr "Permettre l'interchangeabilité de INTEGER et LOGICAL" + +#~ msgid "Append underscores to externals" +#~ msgstr "Ajouter des caractères de soulignement aux externes" + +#~ msgid "Delete libU77 intrinsics" +#~ msgstr "Détruire les intrinsèques libU77" + +#~ msgid "Disable libU77 intrinsics" +#~ msgstr "Désactiver les intrinsèques libU77" + +#~ msgid "Enable libU77 intrinsics" +#~ msgstr "Autoriser les intrinsèques libU77" + +#~ msgid "Hide libU77 intrinsics" +#~ msgstr "Cacher les intrinsèques libU77" + +#~ msgid "Print g77-specific version information and run internal tests" +#~ msgstr "Afficher les informations de version spécifiques du compilateur g77, exécuter les tests internes" + +#~ msgid "Program is written in VXT (Digital-like) FORTRAN" +#~ msgstr "Programme est écrit en Fortran VXT (forme de Digital)" + +#~ msgid "Delete non-FORTRAN-77 intrinsics VXT FORTRAN supports" +#~ msgstr "Détruire les supports VXT Fortran intrinsèques non Fortran-77" + +#~ msgid "Disable non-FORTRAN-77 intrinsics VXT FORTRAN supports" +#~ msgstr "Désactiver les supports VXT Fortran intrinsèques non Fortran-77" + +#~ msgid "Enable non-FORTRAN-77 intrinsics VXT FORTRAN supports" +#~ msgstr "Désactiver les supports VXT Fortran intrinsèques non Fortran-77" + +#~ msgid "Hide non-FORTRAN-77 intrinsics VXT FORTRAN supports" +#~ msgstr "Cacher les supports VXT Fortran des intrinsèques non Fortran-77" + +#~ msgid "Print internal debugging-related information" +#~ msgstr "Afficher les informations internes reliées à la mise au point" + +#~ msgid "Treat initial values of 0 like non-zero values" +#~ msgstr "Traiter les valeurs initiales de 0 comme des valeurs non zéros" + +#~ msgid "-gnat\tSpecify options to GNAT" +#~ msgstr "-gnat\tSpécifier les options pour GNAT" + +#~ msgid "concatenation of string literals with __FUNCTION__ is deprecated" +#~ msgstr "la concaténation de chaînes de litéraux avec « __FUNCTION__ » est obsolète" + +#~ msgid "ISO C++ forbids range expressions in switch statements" +#~ msgstr "ISO C++ interdit les intervalles dans les déclarations de « switch »" + +#~ msgid "ISO C++ forbids taking the address of a label" +#~ msgstr "ISO C++ interdit de prendre l'adresse d'une étiquette" + +#~ msgid "ISO C forbids taking the address of a label" +#~ msgstr "ISO C interdit de prendre l'adresse d'une étiquette" + +#~ msgid "declaration of `%s' shadows %s" +#~ msgstr "la déclaration de « %s » masque %s" + +#~ msgid "`struct %s' incomplete in scope ending here" +#~ msgstr "« struct %s » incomplète dans le champ terminant ici" + +#~ msgid "`union %s' incomplete in scope ending here" +#~ msgstr "« union %s » incomplète dans le champ terminant ici" + +#~ msgid "`enum %s' incomplete in scope ending here" +#~ msgstr "« enum %s » incomplète dans le champ terminant ici" + +#~ msgid "label `%s' defined but not used" +#~ msgstr "étiquette « %s » définie mais pas utilisée" + +#~ msgid "shadowing library function `%s'" +#~ msgstr "masquage de la fonction « %s » de la bibliothèque" + +#~ msgid "library function `%s' declared as non-function" +#~ msgstr "fonction « %s » de la bibliothèque déclarée comme n'étant pas une fonction" + +#~ msgid "conflicting types for `%s'" +#~ msgstr "types conflictuels pour « %s »" + +#~ msgid "redeclaration of `%s'" +#~ msgstr "redéclaration de « %s »" + +#~ msgid "prototype for `%s' follows" +#~ msgstr "le prototype de « %s » suit" + +#~ msgid "non-prototype definition here" +#~ msgstr "définition d'un non prototype ici" + +#~ msgid "prototype for `%s' follows and number of arguments doesn't match" +#~ msgstr "le prototype de « %s » suit mais le nombre d'arguments ne concorde pas" + +#~ msgid "prototype for `%s' follows and argument %d doesn't match" +#~ msgstr "le prototype de « %s » suit mais le nombre d'arguments %d ne concorde pas" + +#~ msgid "type qualifiers for `%s' conflict with previous decl" +#~ msgstr "le qualificateur du type de « %s » est en conflit avec une déclaration précédente" + +#~ msgid "redundant redeclaration of `%s' in same scope" +#~ msgstr "redéclaration redondante de « %s » dans le même champ" + +#~ msgid "a parameter" +#~ msgstr "un paramètre" + +#~ msgid "a previous local" +#~ msgstr "une locale précédente" + +#~ msgid "a global declaration" +#~ msgstr "une déclaration globale" + +#~ msgid "`%s' used prior to declaration" +#~ msgstr "« %s » utilisé avant sa déclaration" + +#~ msgid "`%s' was declared implicitly `extern' and later `static'" +#~ msgstr "« %s » a été déclaré implicitement « extern » et plus loin « static »" + +#~ msgid "previous external decl of `%s'" +#~ msgstr "déclaration externe précédente de « %s »" + +#~ msgid "type mismatch with previous implicit declaration" +#~ msgstr "non concordance de type avec la déclaration implicite précédente" + +#~ msgid "`%s' was previously implicitly declared to return `int'" +#~ msgstr "« %s » a été précédemment déclaré implicitement comme retournant un « int »" + +#~ msgid "`%s' was declared `extern' and later `static'" +#~ msgstr "« %s » a été déclaré « extern » et plus loin « static »" + +#~ msgid "`%s' locally external but globally static" +#~ msgstr "« %s » localement externe mais globalement statique" + +#~ msgid "function `%s' was previously declared within a block" +#~ msgstr "la fonction « %s » a été précédemment déclarée à l'intérieur d'un bloc" + +#~ msgid "declaration of `%s' has `extern' and is initialized" +#~ msgstr "« %s » initialisé et déclaré « extern »" + +#~ msgid "initializer fails to determine size of `%s'" +#~ msgstr "l'initialisation n'a pas pu déterminer la taille de « %s »" + +#~ msgid "array size missing in `%s'" +#~ msgstr "taille du tableau manquante dans « %s »" + +#~ msgid "storage size of `%s' isn't known" +#~ msgstr "taille de stockage de « %s » inconnue" + +#~ msgid "storage size of `%s' isn't constant" +#~ msgstr "la taille de stockage de « %s » n'est pas une constante" + +#~ msgid "ISO C forbids parameter `%s' shadowing typedef" +#~ msgstr "ISO C interdit que le paramètre « %s » masque un typedef" + +#~ msgid "parameter `%s' points to incomplete type" +#~ msgstr "le paramètre « %s » pointe vers un type incomplet" + +#~ msgid "parameter points to incomplete type" +#~ msgstr "le paramètre pointe vers un type incomplet" + +#~ msgid "`void' in parameter list must be the entire list" +#~ msgstr "si « void » est dans une liste de paramètres, toute la liste doit l'être" + +#~ msgid "`union %s' declared inside parameter list" +#~ msgstr "« union %s » déclarée à l'intérieur de la liste de paramètres" + +#~ msgid "`enum %s' declared inside parameter list" +#~ msgstr "« enum %s » déclarée à l'intérieur de la liste de paramètres" + +#~ msgid "anonymous union declared inside parameter list" +#~ msgstr "union anonyme déclarée à l'intérieur de la liste des paramètres" + +#~ msgid "anonymous enum declared inside parameter list" +#~ msgstr "énumération anonyme déclarée à l'intérieur de la liste des paramètres" + +#~ msgid "bit-field `%s' type invalid in ISO C" +#~ msgstr "le champ de bits « %s » a un type invalide en C ISO" + +#~ msgid "duplicate member `%s'" +#~ msgstr "membre « %s » apparaît en double" + +#~ msgid "parm types given both in parmlist and separately" +#~ msgstr "types des paramètres à la fois donnés dans la liste et séparément" + +#~ msgid "parameter `%s' declared void" +#~ msgstr "paramètre « %s » déclaré « void »" + +#~ msgid "universal-character-name '\\u%04x' not valid in identifier" +#~ msgstr "nom-de-caractère-universel « \\U%04x » invalide dans l'identificcateur" + +#~ msgid "ignoring invalid multibyte character" +#~ msgstr "caractère multioctet invalide ignoré" + +#~ msgid "options array incorrectly sorted: %s is before %s" +#~ msgstr "tableau des options mal trié : %s est avant %s" + +#~ msgid "-Wno-strict-prototypes is not supported in C++" +#~ msgstr "-Wno-strict-prototypes n'est pas permis en C++" + +#~ msgid "" +#~ "Switches:\n" +#~ " -include Include the contents of before other files\n" +#~ " -imacros Accept definition of macros in \n" +#~ " -iprefix Specify as a prefix for next two options\n" +#~ " -iwithprefix Add to the end of the system include path\n" +#~ " -iwithprefixbefore Add to the end of the main include path\n" +#~ " -isystem Add to the start of the system include path\n" +#~ msgstr "" +#~ "Options:\n" +#~ " -include Inclure le contenu du avant d'autres fichiers\n" +#~ " -imacros Accepter la définition de macros dans le \n" +#~ " -iprefix Spécifier le comme un préfixe aux prochaines deux options\n" +#~ " -iwithprefix Ajouter le ertoire à la fin du chemin d'inclusion système\n" +#~ " -iwithprefixbefore Ajouter le ertoire à la fin du chemin d'inclusion principal\n" +#~ " -isystem Ajouter le ertoire au début du chemin d'inclusion système\n" + +#~ msgid "" +#~ " -idirafter Add to the end of the system include path\n" +#~ " -I Add to the end of the main include path\n" +#~ " -I- Fine-grained include path control; see info docs\n" +#~ " -nostdinc Do not search system include directories\n" +#~ " (dirs specified with -isystem will still be used)\n" +#~ " -nostdinc++ Do not search system include directories for C++\n" +#~ " -o Put output into \n" +#~ msgstr "" +#~ " -idirafter Ajouter le ertoire à la fin du chemin d'inclusion système\n" +#~ " -I Ajouter le ertoire à la fin du chemin d'inclusion principal\n" +#~ " -I- Raffiner le contrôle du chemin d'inclusion; consulter la doc\n" +#~ " -nostdinc Ne pas rechercher dans les répertoires d'inclusion système\n" +#~ " (les rép spécifiés avec -isystem seront encore utilisés)\n" +#~ " -nostdinc++ Ne pas rechercher dans les répertoires d'inclusion système pour C++\n" +#~ " -o Produire la sortie dans le \n" + +#~ msgid "" +#~ " -trigraphs Support ISO C trigraphs\n" +#~ " -std= Specify the conformance standard; one of:\n" +#~ " gnu89, gnu99, c89, c99, iso9899:1990,\n" +#~ " iso9899:199409, iso9899:1999, c++98\n" +#~ " -w Inhibit warning messages\n" +#~ " -W[no-]trigraphs Warn if trigraphs are encountered\n" +#~ " -W[no-]comment{s} Warn if one comment starts inside another\n" +#~ msgstr "" +#~ " -trigraphs Permettre les trigraphes C ISO\n" +#~ " -std= Spécifier le de conformité à utiliser; soit:\n" +#~ " gnu89, gnu99, c89, c99, iso9899:1990,\n" +#~ " iso9899:199409, iso9899:1999, c++98\n" +#~ " -w Inhiber les messages d'avertissement\n" +#~ " -W[no-]trigraphs Avertir [ou non] si des trigraphes sont rencontrés\n" +#~ " -W[no-]comment{s} Avertir [ou non] si un commentaire débute à l'intérieur \n" +#~ " d'un autre\n" + +#~ msgid "" +#~ " -W[no-]traditional Warn about features not present in traditional C\n" +#~ " -W[no-]undef Warn if an undefined macro is used by #if\n" +#~ " -W[no-]import Warn about the use of the #import directive\n" +#~ msgstr "" +#~ " -W[no-]traditional Avertir [ou non] à propos des fonctionnalités absentes\n" +#~ " en C traditionnel\n" +#~ " -W[no-]undef Avertir [ou non] à propos des macros utilisées dans des\n" +#~ " #if sans être définies\n" +#~ " -W[no-]import Avertir [ou non] de l'utilisation de la directive #import\n" + +#~ msgid "" +#~ " -W[no-]error Treat all warnings as errors\n" +#~ " -W[no-]system-headers Do not suppress warnings from system headers\n" +#~ " -W[no-]all Enable most preprocessor warnings\n" +#~ msgstr "" +#~ " -W[no-]error Changer [ou non] les avertissements en erreurs\n" +#~ " -W[no-]system-headers Supprimer [ou non] les avertissements à propos des \n" +#~ " en-têtes système\n" +#~ " -W[no-]all Générer [ou non] la plupart des avertissements du\n" +#~ " préprocesseur\n" + +#~ msgid "" +#~ " -M Generate make dependencies\n" +#~ " -MM As -M, but ignore system header files\n" +#~ " -MD Generate make dependencies and compile\n" +#~ " -MMD As -MD, but ignore system header files\n" +#~ " -MF Write dependency output to the given file\n" +#~ " -MG Treat missing header file as generated files\n" +#~ msgstr "" +#~ " -M Générer les dépendances pour make\n" +#~ " -MM Comme -M, en ignorant les fichiers d'en-têtes système\n" +#~ " -MD Générer les dépendances pour make et compiler\n" +#~ " -MMD Comme -MD, en ignorant les fichiers d'en-têtes système\n" +#~ " -MF Écrire les dépendances dans le \n" +#~ " -MG Traiter les en-têtes manquants comme des fichiers générés\n" + +#~ msgid "" +#~ " -MP\t\t\t Generate phony targets for all headers\n" +#~ " -MQ Add a MAKE-quoted target\n" +#~ " -MT Add an unquoted target\n" +#~ msgstr "" +#~ " -MP\t\t\t Générer des cibles factices pour tous les en-têtes\n" +#~ " -MQ Ajouter une cible protégée pour MAKE\n" +#~ " -MT Ajouter une cible non protégée\n" + +#~ msgid "" +#~ " -D Define a with string '1' as its value\n" +#~ " -D= Define a with as its value\n" +#~ " -A= Assert the to \n" +#~ " -A-= Disable the to \n" +#~ " -U Undefine \n" +#~ " -v Display the version number\n" +#~ msgstr "" +#~ " -D Définir une avec la chaîne « 1 » pour valeur\n" +#~ " -D= Définir une de \n" +#~ " -A=() Créer une assertion =\n" +#~ " -A-=() Dissocier la à la \n" +#~ " -U Oublier la définition de la \n" +#~ " -v Afficher le numéro de version\n" + +#~ msgid "" +#~ " -H Print the name of header files as they are used\n" +#~ " -C Do not discard comments\n" +#~ " -dM Display a list of macro definitions active at end\n" +#~ " -dD Preserve macro definitions in output\n" +#~ " -dN As -dD except that only the names are preserved\n" +#~ " -dI Include #include directives in the output\n" +#~ msgstr "" +#~ " -H Afficher le nom des fichiers en-tête tel qu'utilisés\n" +#~ " -C Ne pas mettre de côté les commantaires\n" +#~ " -dM Afficher la liste des définitions de macro actives à la fin\n" +#~ " -dD Préserver les définitions de macros dans la sortie\n" +#~ " -dN Comme -dD, mais seuls les noms sont préservés\n" +#~ " -dI Inclure la directive #include dans la sortie\n" + +#~ msgid "" +#~ " -f[no-]preprocessed Treat the input file as already preprocessed\n" +#~ " -ftabstop= Distance between tab stops for column reporting\n" +#~ " -P Do not generate #line directives\n" +#~ " -remap Remap file names when including files\n" +#~ " --help Display this information\n" +#~ msgstr "" +#~ " -f[no-]preprocessed Considérer [ou non] que le fichier d'entrée est \n" +#~ " déjà pré-traité\n" +#~ " -ftabstop= Largeur des tabulations pour indiquer la colonne\n" +#~ " -P Ne pas générer des directives #line\n" +#~ " -remap Refaire la table des noms de fichiers lors de\n" +#~ " l'inclusion de fichiers\n" +#~ " --help Afficher cet l'aide-mémoire\n" + +# FIXME +#~ msgid "ISO C forbids the address of a cast expression" +#~ msgstr "ISO C interdit l'adresse d'une expression transtypée" + +#~ msgid "initializer for static variable is not constant" +#~ msgstr "l'initialisation d'une variable statique n'est pas une constante" + +#~ msgid "initializer for static variable uses complicated arithmetic" +#~ msgstr "l'initialisation d'une variable statique utilise une artihmétique compliquée" + +# FIXME +#~ msgid "aggregate initializer is not constant" +#~ msgstr "l'initialisation d'aggrégat n'est pas une constante" + +# FIXME +#~ msgid "aggregate initializer uses complicated arithmetic" +#~ msgstr "l'initialisation d'un aggrégat utilise une arithmétique compliquée" + +# FIXME +#~ msgid "variable offset is passed partially in stack and in reg" +#~ msgstr "le décalage de variable est passé partiellement dans la pile et dans le registre" + +#~ msgid "variable size is passed partially in stack and in reg" +#~ msgstr "la taille de la variable est passée partiellement dans la pile et le registre" + +# I18N +#~ msgid "open %s" +#~ msgstr "open %s" + +#~ msgid "incompatibilities between object file & expected values" +#~ msgstr "incompatibilités entre le fichier objet et les valeurs attendues" + +#~ msgid "" +#~ "\n" +#~ "Processing symbol table #%d, offset = 0x%.8lx, kind = %s\n" +#~ msgstr "" +#~ "\n" +#~ "Traitement de la table des symboles #%d, décalage = 0x%.8lx, sorte = %s\n" + +# FIXME +#~ msgid "string section missing" +#~ msgstr "chaîne de section manquante" + +#~ msgid "section pointer missing" +#~ msgstr "pointeur de section manquant" + +#~ msgid "no symbol table found" +#~ msgstr "aucune table des symboles trouvée" + +#~ msgid "" +#~ "\n" +#~ "Updating header and load commands.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Mise à jour des en-têtes et des commandes de chargement.\n" +#~ "\n" + +# FIXME +#~ msgid "load command map, %d cmds, new size %ld.\n" +#~ msgstr "Chargement de la carte des commandes, %d commandes, nouvelle taille %ld.\n" + +#~ msgid "" +#~ "writing load commands.\n" +#~ "\n" +#~ msgstr "" +#~ "écriture des commandes de chargement.\n" +#~ "\n" + +# I18N +#~ msgid "close %s" +#~ msgstr "close %s" + +#~ msgid "could not convert 0x%l.8x into a region" +#~ msgstr "ne peut convertir 0x%l.8x en région" + +#~ msgid "%s function, region %d, offset = %ld (0x%.8lx)\n" +#~ msgstr "fonction %s, région %d, décalage = %ld (0x%.8lx)\n" + +#~ msgid "bad magic number" +#~ msgstr "nombre magique erroné" + +#~ msgid "bad header version" +#~ msgstr "version d'en-tête erronée" + +# FIXME: ou version d'en-tête brut erronée +#~ msgid "bad raw header version" +#~ msgstr "version brute d'en-tête erronée" + +# FIXME: ou tampon d'en-tête brut trop petit +#~ msgid "raw header buffer too small" +#~ msgstr "tampon brut d'en-tête trop petit" + +#~ msgid "old raw header file" +#~ msgstr "ancien fichier d'en-tête brute" + +#~ msgid "unsupported version" +#~ msgstr "version non reconnue" + +#~ msgid "unknown {de,en}code_mach_o_hdr return value %d" +#~ msgstr "mauvaise valeur de retour (%d) de {de,en}code_mach_o_hdr" + +# I18N +#~ msgid "fstat %s" +#~ msgstr "fstat %s" + +# I18N +#~ msgid "lseek %s 0" +#~ msgstr "lseek %s 0" + +# I18N +#~ msgid "read %s" +#~ msgstr "read %s" + +#~ msgid "read %ld bytes, expected %ld, from %s" +#~ msgstr "lu %ld octets, attendu %ld, de %s" + +# I18N +#~ msgid "msync %s" +#~ msgstr "msync %s" + +# I18N +#~ msgid "munmap %s" +#~ msgstr "munmap %s" + +# I18N +#~ msgid "write %s" +#~ msgstr "write %s" + +#~ msgid "wrote %ld bytes, expected %ld, to %s" +#~ msgstr "écrit %ld octets, attendu %ld, vers %s" + +#~ msgid "ISO C++ does not permit \"%s\" in #if" +#~ msgstr "ISO C++ n'autorise pas « %s » dans #if" + +#~ msgid "invalid character '%c' in #if" +#~ msgstr "caractère « %c » invalide dans #if" + +#~ msgid "invalid character '\\%03o' in #if" +#~ msgstr "caractère « \\%03o » invalide dans #if" + +#~ msgid "absolute file name in remap_filename" +#~ msgstr "nom de fichier absolu dans remap_filename" + +#~ msgid "%s: Not a directory" +#~ msgstr "%s : ce n'est pas un répertoire" + +#~ msgid "directory name missing after %s" +#~ msgstr "nom de répertoire manquant après %s" + +#~ msgid "file name missing after %s" +#~ msgstr "nom de fichier manquant après %s" + +#~ msgid "path name missing after %s" +#~ msgstr "nom de chemin manquant après %s" + +#~ msgid "unknown string token %s\n" +#~ msgstr "élément lexical %s inconnu\n" + +#~ msgid "non-hex digit '%c' in universal-character-name" +#~ msgstr "chiffre « %c » non hexadécimal dans le nom-de-caractère-universel" + +#~ msgid "universal-character-name on EBCDIC target" +#~ msgstr "nom-de-caractère-universel pour une cible EBCDIC" + +#~ msgid "universal-character-name out of range" +#~ msgstr "nom-de-caractère-universel est hors limite" + +#~ msgid "escape sequence out of range for its type" +#~ msgstr "séquence d'échappement hors limite pour son type" + +#~ msgid "#import is obsolete, use an #ifndef wrapper in the header file" +#~ msgstr "#import est obsolète, enveloppez le avec #ifndef dans le fichier d'en-tête" + +# FIXME +#~ msgid "#pragma once is obsolete" +#~ msgstr "utiliser #pragma once est obsolète" + +#~ msgid "((anonymous))" +#~ msgstr "((anonyme))" + +#~ msgid "%s: warnings being treated as errors\n" +#~ msgstr "%s : les avertissements sont traités commes des erreurs\n" + +#~ msgid "At top level:" +#~ msgstr "Hors de toute fonction :" + +#~ msgid "In member function `%s':" +#~ msgstr "Dans la fonction membre « %s » :" + +#~ msgid "In function `%s':" +#~ msgstr "Dans la fonction « %s »:" + +#~ msgid "" +#~ "Please submit a full bug report,\n" +#~ "with preprocessed source if appropriate.\n" +#~ "See %s for instructions.\n" +#~ msgstr "" +#~ "Veuillez soumettre un rapport complet d'anomalies,\n" +#~ "avec le source pré-traité si nécessaire.\n" +#~ "Consultez %s pour plus de détail.\n" + +# FRONT +#~ msgid "In file included from %s:%d" +#~ msgstr "Dans le fichier inclus depuis %s:%d" + +# I18N: This line should be indented with the previous entry +#~ msgid "" +#~ ",\n" +#~ " from %s:%d" +#~ msgstr "" +#~ ",\n" +#~ " depuis %s:%d" + +#~ msgid "internal regno botch: `%s' has regno = %d\n" +#~ msgstr "regno interne mal fait : « %s » a regno = %d\n" + +#~ msgid "support for the DWARF1 debugging format is deprecated" +#~ msgstr "le support du format de débogage DWARF1 est obsolète" + +#~ msgid "can't get current directory" +#~ msgstr "ne peut repérer le répertoire courant" + +# FRONT +#~ msgid "unsupported wide integer operation" +#~ msgstr "opération sur de large entier non supportée" + +#~ msgid "Copyright (C) 2002 Free Software Foundation, Inc.\n" +#~ msgstr "Copyright © 2002 Free Software Foundation, Inc.\n" + +#~ msgid "mismatched braces in specs" +#~ msgstr "accolades non concordantes dans les specs" + +#~ msgid "Could not open basic block file %s.\n" +#~ msgstr "Ne pourrait pas ouvrir le fichier de blocs de base %s.\n" + +#~ msgid "Could not open program flow graph file %s.\n" +#~ msgstr "Ne pourrait pas ouvrir le fichier de flux du programm %s.\n" + +#~ msgid "Could not open data file %s.\n" +#~ msgstr "Ne pourrait pas ouvrir le fichier de données %s.\n" + +#~ msgid "Assuming that all execution counts are zero.\n" +#~ msgstr "Suppose que tous les compteurs d'exécution sont à zéro.\n" + +#~ msgid "No executable code associated with file %s.\n" +#~ msgstr "Aucun code exécutable associé avec le fichier %s.\n" + +#~ msgid "didn't use all bb entries of graph, function %s\n" +#~ msgstr "N'a pas utiliser toutes les entrées bb du graphe, fonction %s\n" + +#~ msgid "block_num = %ld, num_blocks = %d\n" +#~ msgstr "block_num = %ld, num_blocks = %d\n" + +#~ msgid "ERROR: unexpected line number %ld\n" +#~ msgstr "ERREUR : ligne numéro %ld inattendue\n" + +#~ msgid "ERROR: too many basic blocks in function %s\n" +#~ msgstr "ERREUR : trop de blocs de base dans la fonction %s\n" + +#~ msgid "ERROR: out of range line number in function %s\n" +#~ msgstr "ERROR: numéro de ligne hors limite dans la fonction %s\n" + +#~ msgid "Could not open source file %s.\n" +#~ msgstr "N'a pu ouvrir le fichier source %s.\n" + +#~ msgid "Unexpected EOF while reading source file %s.\n" +#~ msgstr "EOF inattendue lors de la lecture du fichier source %s.\n" + +#~ msgid "Creating %s.\n" +#~ msgstr "Création de %s.\n" + +#~ msgid "invalid string `%s' in define_cpu_unit" +#~ msgstr "chaîne invalide « %s » dans define_cpu_unit" + +#~ msgid "invalid string `%s' in define_bypass" +#~ msgstr "chaîne invalide « %s » dans define_bypass" + +#~ msgid "invalid first string `%s' in exclusion_set" +#~ msgstr "première chaîne invalide « %s » dans exclusion_set" + +#~ msgid "invalid second string `%s' in exclusion_set" +#~ msgstr "seconde chaîne invalide « %s » dans exclusion_set" + +#~ msgid "invalid second string `%s' in presence_set" +#~ msgstr "seconde chaîne invalide « %s » dans presence_set" + +#~ msgid "invalid option `%s' in automata_option" +#~ msgstr "option invalide « %s » dans automata_option" + +#~ msgid "invalid `%s' in reservation `%s'" +#~ msgstr "« %s » invalide dans la réservation « %s »" + +#~ msgid "unit `%s' in exclusion is not declared" +#~ msgstr "unité « %s » dans l'exclusion n'est pas déclaré" + +#~ msgid "unit `%s' excludes itself" +#~ msgstr "unité « %s » s'exclue elle-même" + +#~ msgid "repeated declaration of automaton `%s'" +#~ msgstr "déclaration répété de l'automate « %s »" + +#~ msgid "`%s' is already used as insn reservation name" +#~ msgstr "« %s » est déjà utilisé dans le nom de réservation insn" + +#~ msgid "automaton `%s' is not declared" +#~ msgstr "automate « %s » n'est pas déclaré" + +#~ msgid "`%s' is declared as cpu unit" +#~ msgstr "« %s » déclaré comme unité cpu" + +#~ msgid "`%s' is declared as cpu reservation" +#~ msgstr "« %s » est déclaré comme réservation cpu" + +#~ msgid "repeated declaration of unit `%s'" +#~ msgstr "déclaration répété d'unité « %s »" + +#~ msgid "repeated declaration of reservation `%s'" +#~ msgstr "déclaration répété de réservation « %s »" + +#~ msgid "there is no insn reservation `%s'" +#~ msgstr "il n'y a pas de réservation insn « %s »" + +#~ msgid "the same bypass `%s - %s' is already defined" +#~ msgstr "le même bypass « %s - %s » est déjà défini" + +#~ msgid "bypass `%s - %s' is already defined" +#~ msgstr "bypass « %s - %s » est déjà défini" + +#~ msgid "undeclared unit or reservation `%s'" +#~ msgstr "unité ou réservation « %s » non déclaré" + +#~ msgid "unit `%s' is not used" +#~ msgstr "unité « %s » n'est utilisé" + +#~ msgid "reservation `%s' is not used" +#~ msgstr "réservation « %s » n'est utilisé" + +#~ msgid "cycle in definition of reservation `%s'" +#~ msgstr "cycle de définition de réservation « %s »" + +#~ msgid "-split has no argument." +#~ msgstr "-split n'a pas d'argument." + +#~ msgid "option `-split' has not been implemented yet\n" +#~ msgstr "l'option « -split » n'a pas été implanté encore\n" + +#~ msgid "Errors in DFA description" +#~ msgstr "ERREURS dans la description DFA" + +#~ msgid "Error in writing DFA description file %s" +#~ msgstr "Erreur dans l'écriture du fichier de description DFA %s" + +#~ msgid "No input file name." +#~ msgstr "Pas de nom de fichier." + +#~ msgid ".da file corrupted" +#~ msgstr "fichier .da corrompu" + +#~ msgid "Generate STABS format debug info" +#~ msgstr "Générer des infos de mise au point de format STABS" + +#~ msgid "Generate extended STABS format debug info" +#~ msgstr "Générer des infos de mise au point de format STABS étendu" + +#~ msgid "Generate DWARF-1 format debug info" +#~ msgstr "Générer les informations de mise au point du format DWARF-1" + +#~ msgid "Generate extended DWARF-1 format debug info" +#~ msgstr "Générer les extensions des informations de mise au point du format DWARF-1" + +#~ msgid "Generate DWARF-2 debug info" +#~ msgstr "Générer les informations de mise au point DWARF-2" + +#~ msgid "Generate XCOFF format debug info" +#~ msgstr "Générer les informations de mise au point du format XCOFF" + +#~ msgid "Generate extended XCOFF format debug info" +#~ msgstr "Générer les extensions de mise au point du format XCOFF" + +#~ msgid "Generate COFF format debug info" +#~ msgstr "Générer les informations de mise au point du format COFF" + +#~ msgid "Generate VMS format debug info" +#~ msgstr "Générer des infos de mise au point de format VMS" + +#~ msgid "Consider all mem refs through pointers as volatile" +#~ msgstr "Considérer toutes les référence en mémoire comme faite par des pointeurs volatiles" + +#~ msgid "Consider all mem refs to global data to be volatile" +#~ msgstr "Considérer toutes les références mémoire à des données globales comme volatiles" + +#~ msgid "Consider all mem refs to static data to be volatile" +#~ msgstr "Considérer toutes les références mémoire à des données statiques comme volatiles" + +#~ msgid "Output GNU ld formatted global initializers" +#~ msgstr "Produire des initialisations de globlales au format GNU ld" + +#~ msgid "Enable SSA optimizations" +#~ msgstr "Autoriser les optimisations SSA" + +#~ msgid "Enable SSA conditional constant propagation" +#~ msgstr "Autoriser la propagation SSA de constante conditionnelle" + +#~ msgid "Enable aggressive SSA dead code elimination" +#~ msgstr "Autoriser l'élimination agressive SSA du code mort" + +#~ msgid "Compile just for ISO C90" +#~ msgstr "Compiler seulement pour ISO C90" + +#~ msgid "Determine language standard" +#~ msgstr "Déterminer le standard du langage" + +#~ msgid "Make bit-fields by unsigned by default" +#~ msgstr "Rendre les champs de bits non signés par défaut" + +#~ msgid "Allow different types as args of ? operator" +#~ msgstr "Permettre des types différents pour les arguments de l'opérateur ?" + +#~ msgid "Allow the use of $ inside identifiers" +#~ msgstr "Permettre l'utilisation de $ à l'intérieur d'identificateurs" + +#~ msgid "Use the smallest fitting integer to hold enums" +#~ msgstr "Utiliser le plus petit entier pour contenir l'énumération (enums)" + +#~ msgid "Warn if nested comments are detected" +#~ msgstr "Avertir si des commentaires imbriqués sont détectés" + +#~ msgid "Don't warn about too many arguments to format functions" +#~ msgstr "Ne pas avertir à propos d'un surplus d'arguments pour des fonctions de format" + +#~ msgid "Warn about non-string-literal format strings" +#~ msgstr "Avertir à propos des chaînes de format qui ne sont pas des chaînes" + +#~ msgid "Warn about constructs whose meanings change in ISO C" +#~ msgstr "Avertir à propos de construits dont le sens change en C ISO" + +#~ msgid "Warn when trigraphs are encountered" +#~ msgstr "Avertir lorsque des trigraphes sont rencontrés" + +#~ msgid "Mark strings as 'const char *'" +#~ msgstr "Marque les chaînes comme étant 'const char *'" + +#~ msgid " -pedantic-errors Like -pedantic except that errors are produced\n" +#~ msgstr " -pedantic-errors identique à -pedantic sauf que les erreurs sont produites\n" + +#~ msgid " -w Suppress warnings\n" +#~ msgstr " -w supprimer les avertissements\n" + +#~ msgid " -W Enable extra warnings\n" +#~ msgstr " -W autoriser les avertissements additionnels\n" + +#~ msgid " -Wunused Enable unused warnings\n" +#~ msgstr " -Wunused autoriser les avertissements pour signaler les non utilisés\n" + +#~ msgid " -p Enable function profiling\n" +#~ msgstr " -p autoriser le profilage des fonctions\n" + +#~ msgid "" +#~ "\n" +#~ "Language specific options:\n" +#~ msgstr "" +#~ "\n" +#~ "Options spécifiques au langage:\n" + +#~ msgid " %-23.23s [undocumented]\n" +#~ msgstr " %-23.23s [non documenté]\n" + +#~ msgid "" +#~ "\n" +#~ "There are undocumented %s specific options as well.\n" +#~ msgstr "" +#~ "\n" +#~ "Il y a des options spécifiques %s qui ne sont pas documentés aussi.\n" + +#~ msgid "" +#~ "\n" +#~ " Options for %s:\n" +#~ msgstr "" +#~ "\n" +#~ " Options pour %s:\n" + +#~ msgid "unrecognized option `%s'" +#~ msgstr "option « %s » non reconnue" + +#~ msgid "-Wid-clash-LEN is no longer supported" +#~ msgstr "-Wid-clash-LEN n'est plus supportée" + +#~ msgid "use -gdwarf -g%d for DWARF v1, level %d" +#~ msgstr "utiliser -gdwarf -g%d pour DWARF v1, niveau %d" + +#~ msgid "use -gdwarf-2 for DWARF v2" +#~ msgstr "utiliser -gdwarf-2 pour DWARF v2" + +#~ msgid "ignoring option `%s' due to invalid debug level specification" +#~ msgstr "option « %s » ignorée en raison de la spécification du niveau de mise au poitn invalide" + +#~ msgid "`%s': unknown or unsupported -g option" +#~ msgstr "« %s »: inconnu ou non supporté option -g" + +#~ msgid "`%s' ignored, conflicts with `-g%s'" +#~ msgstr "« %s » ignoré, en conflit avec «-g%s»" + +#~ msgid "-param option missing argument" +#~ msgstr "argument manquant pour l'option -param" + +#~ msgid "invalid --param option: %s" +#~ msgstr "option invalide --param: %s" + +#~ msgid "(it is valid for %s but not the selected language)" +#~ msgstr "(c'est valide pour %s mais pas pour le langage séclectionné)" + +#~ msgid "#`%s' not supported by %s#" +#~ msgstr "« %s » n'est pas supporté par %s#" + +#~ msgid "The maximuem number of instructions by repeated inlining before gcc starts to throttle inlining" +#~ msgstr "Le nombre maximum d'instructions par type inline répété avant l'exécution de gcc au « throttle » enligne" + +#~ msgid "The number of instructions in a single functions still eligible to inlining after a lot recursive inlining" +#~ msgstr "Le nombre d'instructions dans une fonction simple encore éligible au type enligne après plusieurs inline récursifs" + +#~ msgid "Use Mingw32 interface" +#~ msgstr "Utiliser l'interface Mingw32" + +#~ msgid "Use Cygwin interface" +#~ msgstr "Utiliser l'interface Cygwin" + +#~ msgid "Use bare Windows interface" +#~ msgstr "Utiliser l'interface brute Windows" + +#~ msgid "Only initialized variables can be placed into program memory area." +#~ msgstr "seules les variables initialisées peuvent être placées dans la zone mémoire du programme" + +#~ msgid "const objects cannot go in .sdata/.sbss" +#~ msgstr "constantes objets ne peuvent aller dans .sdata/.sbss" + +#~ msgid "Generate code for a Sun FPA" +#~ msgstr "Générer le code pour un Sun FPA" + +#~ msgid "Do not generate code for a Sun FPA" +#~ msgstr "Ne pas générer le code pour un Sun FPA" + +#~ msgid "Generate code for a Sun Sky board" +#~ msgstr "Générer le code pour un Sun Sky board" + +#~ msgid "Do not use Sky linkage convention" +#~ msgstr "Ne pas utiliser la convention d'édition de lien Sky" + +#~ msgid "Generate code for a 68881" +#~ msgstr "Générer du code pour un 68881" + +#~ msgid "internal gcc monitor: short-branch(%x)" +#~ msgstr "moniteur interne gcc: branchement court(%x)" + +#~ msgid "internal gcc error: Can't express symbolic location" +#~ msgstr "erreur interne gcc: ne peut exprimer la localisation symbolique" + +#~ msgid "argument #%d is a structure" +#~ msgstr "argument #%d est une structure" + +#~ msgid "%%R not followed by %%B/C/D/E" +#~ msgstr "%%R n'est pas suivi de %%B/C/D/E" + +#~ msgid "invalid %%Q value" +#~ msgstr "valeur %%Q invalide" + +#~ msgid "invalid %%o value" +#~ msgstr "valeur %%o invalide" + +#~ msgid "invalid %%s/S value" +#~ msgstr "valeur %%s/S invalide" + +#~ msgid "invalid %%B value" +#~ msgstr "valeur %%B invalide" + +#~ msgid "`%%d' operand isn't a register" +#~ msgstr "l'opérande «%%d» n'est pas un registre" + +#~ msgid "operand is r0" +#~ msgstr "opérande est R0" + +#~ msgid "operand is const_double" +#~ msgstr "opérande est de type const_double" + +#~ msgid "-mtrap-large-shift and -mhandle-large-shift are incompatible" +#~ msgstr "-mtrap-large-shift et -mhandle-large-shift sont incompatibles" + +#~ msgid "invalid option `-mshort-data-%s'" +#~ msgstr "option invalide «-mshort-data-%s'" + +#~ msgid "-mshort-data-%s is too large " +#~ msgstr "-mshort-data-%s est trop grande " + +#~ msgid "-mshort-data-%s and PIC are incompatible" +#~ msgstr "-mshort-data-%s et PIC sont incompatibles" + +#~ msgid "bad value (%s) for -mips switch" +#~ msgstr "valeur erronée (%s) pour l'option -mips" + +#~ msgid "invalid option `entry%s'" +#~ msgstr "option invalide «entry%s'" + +#~ msgid "-mentry is only meaningful with -mips-16" +#~ msgstr "-mentry n'a de sens qu'avec -mips-16" + +#~ msgid "MIPS ECOFF format does not allow changing filenames within functions with #line" +#~ msgstr "format MIPS ECOFF ne permet pas de changer le nom des fichiers à l'intérieur des fonction avec #line" + +#~ msgid "fp_offset (%ld) or end_offset (%ld) is less than zero" +#~ msgstr "fp_offset (%ld) ou end_offset (%ld) est plus petit que zéro" + +#~ msgid "Trap on integer divide overflow" +#~ msgstr "Intercepter les débordements lors de divisions avec des entiers" + +#~ msgid "Don't trap on integer divide overflow" +#~ msgstr "Ne pas intercepter les débordement lors de divisions avec des entiers" + +#~ msgid "Use mips16 entry/exit psuedo ops" +#~ msgstr "Utiliser les pseudo-op mips16 d'entrée/sortie" + +#~ msgid "Don't use MIPS16 instructions" +#~ msgstr "Ne pas utiliser les instructions MIPS16" + +#~ msgid "invalid %%z value" +#~ msgstr "valeur %%z invalide" + +#~ msgid "invalid %%Z value" +#~ msgstr "valeur %%Z invalide" + +#~ msgid "invalid %%j value" +#~ msgstr "valeur %%j invalide" + +#~ msgid "can't have varargs with -mfp-arg-in-fp-regs" +#~ msgstr "ne peut avoir varargs avec -mfp-arg-in-fp-regs" + +#~ msgid "unknown -mvrsave= option specified: '%s'" +#~ msgstr "option -mvrsave inconnue spécifiés: « %s »" + +#~ msgid "64 bit mode" +#~ msgstr "mode 64 bits" + +#~ msgid "31 bit mode" +#~ msgstr "mode 31 bits" + +#~ msgid "Use the Xtensa code density option" +#~ msgstr "Utiliser l'option de densité du code Xtensa" + +#~ msgid "Do not use the Xtensa code density option" +#~ msgstr "Ne pas utiliser l'option de densité du code Xtensa" + +#~ msgid "Use the Xtensa MAC16 option" +#~ msgstr "Utiliser l'option Xtensa MAC16" + +#~ msgid "Do not use the Xtensa MAC16 option" +#~ msgstr "Ne pas utiliser l'option Xtensa MAC16" + +#~ msgid "Use the Xtensa MUL16 option" +#~ msgstr "Utiliser l'option Xtensa MUL16" + +#~ msgid "Do not use the Xtensa MUL16 option" +#~ msgstr "Ne pas utiliser l'option Xtensa MUL16" + +#~ msgid "Use the Xtensa MUL32 option" +#~ msgstr "Utiliser l'option Xtensa MUL16" + +#~ msgid "Do not use the Xtensa MUL32 option" +#~ msgstr "Ne pas utiliser l'option Xtensa MUL32" + +#~ msgid "Use the Xtensa NSA option" +#~ msgstr "Utiliser l'option Xtensa NSA" + +#~ msgid "Do not use the Xtensa NSA option" +#~ msgstr "Ne pas utiliser l'option Xtensa NSA" + +#~ msgid "Use the Xtensa MIN/MAX option" +#~ msgstr "Utiliser l'option Xtensa MIN/MAX" + +#~ msgid "Do not use the Xtensa MIN/MAX option" +#~ msgstr "Ne pas utiliser l'option Xtensa MIN/MAX" + +#~ msgid "Use the Xtensa SEXT option" +#~ msgstr "Utiliser l'option Xtensa SEXT" + +#~ msgid "Do not use the Xtensa SEXT option" +#~ msgstr "Ne pas utiliser l'option Xtensa SEXT" + +#~ msgid "Use the Xtensa boolean register option" +#~ msgstr "Utiliser l'option des registres booléens Xtensa" + +#~ msgid "Do not use the Xtensa boolean register option" +#~ msgstr "Ne pas utiliser l'option des registres booléens Xtensa" + +#~ msgid "Use the Xtensa floating-point unit" +#~ msgstr "Utiliser l'unité matérielle pour virgule flottante Xtensa" + +#~ msgid "Do not use the Xtensa floating-point unit" +#~ msgstr "Ne pas utiliser l'unité matérielle pour virgule flottante Xtensa" + +#~ msgid "Serialize volatile memory references with MEMW instructions" +#~ msgstr "Sérialiser les références à la mémoire volatile avec des instructions MEMW" + +#~ msgid "Do not serialize volatile memory references with MEMW instructions" +#~ msgstr "Ne pas sérialiser les références à la mémoire volatile avec des instructions MEMW" + +#~ msgid "type of `%E' does not match destructor type `%T' (type was `%T')" +#~ msgstr "type de « %E » ne concorde pas avec le type du destructeur « %T » (type était « %T »)" + +#~ msgid "`%D' is a namespace" +#~ msgstr "« %D » est un nom d'espace" + +#~ msgid "base object `%E' of scoped method call is of non-aggregate type `%T'" +#~ msgstr "objet de base « %E » de la portée d'appel de la méthode n'est pas de type aggrégat « %T »" + +#~ msgid "destructors take no parameters" +#~ msgstr "destructeurs ne prend aucun paramètre" + +#~ msgid "destructor name `~%T' does not match type `%T' of expression" +#~ msgstr "nom du destructeur «~%T» ne concorde pas avec le type « %T » de l'expression" + +#~ msgid "%s %+#D%s" +#~ msgstr "%s %+#D%s" + +#~ msgid "%s for `%T ? %T : %T' operator" +#~ msgstr "%s pour «%T ? %T : %T» comme opérateur" + +#~ msgid "%s for `%T [%T]' operator" +#~ msgstr "%s pour l'opérateur «%T [%T]»" + +#~ msgid "%s for `%T %s %T' operator" +#~ msgstr "%s pour l'opérateur «%T %s [%T]»" + +#~ msgid "%s for `%s %T' operator" +#~ msgstr "%s pour l'opérateur «%s [%T]»" + +#~ msgid "`%D' must be declared before use" +#~ msgstr "« %D » doit être déclaré avant son usage" + +#~ msgid " initializing argument %P of `%D' from result of `%D'" +#~ msgstr " initialisation de l'argument %P de « %D » à partir du résultat « %D »" + +#~ msgid " initializing temporary from result of `%D'" +#~ msgstr " initialisation temporaire à partir du résultat « %D »" + +#~ msgid "cannot receive objects of non-POD type `%#T' through `...'" +#~ msgstr "ne peut recevoir d'objets de type non POD « %#T » through « ... »" + +#~ msgid "field `%D' invalidly declared offset type" +#~ msgstr "champ « %D » incorrectement validé comme type de décalage" + +#~ msgid "lookup of `%D' finds `%#D'" +#~ msgstr "recherche de « %D » a repéré « %#D »" + +#~ msgid " instead of `%D' from dependent base class" +#~ msgstr " au lieu de « %D » à partir d'un classe de base dépendante" + +#~ msgid "lookup of `%D' in the scope of `%#T' (`%#D') does not match lookup in the current scope (`%#D')" +#~ msgstr "recherche de « %D » dans la portée de « %#T » (« %#D ») ne concorde pas avec la recherche dans la portée courante (« %#D »)" + +#~ msgid "invalid declarator" +#~ msgstr "déclarateur invalide" + +#~ msgid "`%T' is implicitly a typename" +#~ msgstr "« %T » est implicitement un typename" + +#~ msgid "parameter `%D' invalidly declared offset type" +#~ msgstr "paramètre « %D » incorrectement validé comme type de décalage" + +#~ msgid "`%s %T' declares a new type at namespace scope" +#~ msgstr "« %s %T » déclare un nouveau type dans l'étendue de l'espace de noms" + +#~ msgid " names from dependent base classes are not visible to unqualified name lookup - to refer to the inherited type, say `%s %T::%T'" +#~ msgstr " noms des classes de base dépendantes ne sont pas visibles à la recherche de nom non qualifié - pour référer à type par héritage, disons «%s %T::%T»" + +#~ msgid "base class `%T' has incomplete type" +#~ msgstr "classe de base « %T » a un type incomplet" + +#~ msgid "semicolon missing after declaration of `%#T'" +#~ msgstr "point-virgule manquant après la déclaration %#T" + +#~ msgid "template `%#D' instantiated in file without #pragma interface" +#~ msgstr "canevas « %#D » instancié dans le fichier sans interface #pragma" + +#~ msgid "template `%#D' defined in file without #pragma interface" +#~ msgstr "canevas « %#D » défini dans le fichier sans interface #pragma" + +#~ msgid "parser may be lost: is there a '{' missing somewhere?" +#~ msgstr "analyseur syntaxique est perdu: y-a-t-il un «{» manquant quelque part?" + +#~ msgid "invalid data member initialization" +#~ msgstr "initialisation de données membres invalide" + +#~ msgid "(use `=' to initialize static data members)" +#~ msgstr "(utiliser «=» pour initialiser les données de membres)" + +#~ msgid "too many initialization functions required" +#~ msgstr "trop d'initialisations de fonctions requises" + +#~ msgid "`%D' is not a namespace" +#~ msgstr "« %D » n'est pas un espace de noms" + +#~ msgid "a using-declaration cannot specify a template-id. Try `using %T::%D'" +#~ msgstr "l'utilisation de déclaration ne peut spécifier template-id. Essayer «using %T::%D'" + +#~ msgid "`%T' does not have a class or union named `%D'" +#~ msgstr "« %T » n'a pas de classe ou d'union nommé « %D »" + +#~ msgid "`%T' is not a class or union type" +#~ msgstr "« %T » n'est pas une classe ou un type d'union" + +#~ msgid "`%s' not supported by %s" +#~ msgstr "« %s » n'est pas supporté par %s" + +#~ msgid "(static %s for %s)" +#~ msgstr "(static %s pour %s)" + +#~ msgid "%s: In instantiation of `%s':\n" +#~ msgstr "%s: dans l'instanciation de « %s »:\n" + +#~ msgid "%s:%d: instantiated from `%s'\n" +#~ msgstr "%s:%d: instancié à partir de « %s »\n" + +#~ msgid "%s:%d: instantiated from here\n" +#~ msgstr "%s:%d: instancié à partir d'ici\n" + +#~ msgid "previous friend declaration of `%D'" +#~ msgstr "déclaration amie précédente de « %D »" + +#~ msgid "cannot call destructor `%T::~%T' without object" +#~ msgstr "ne peut appeler le destructeur «%T::~%T» sans objet" + +#~ msgid "invalid use of member `%D'" +#~ msgstr "utilisation invalide du membre « %D »" + +#~ msgid "no method `%T::%D'" +#~ msgstr "pas de méthode «%T::%D»" + +#~ msgid "object missing in use of pointer-to-member construct" +#~ msgstr "objet manquant dans l'utilisation du construit pointeur-à-membre" + +#~ msgid "member `%D' is non-static but referenced as a static member" +#~ msgstr "membre « %D » est non statique mais référencé comme membre statique" + +#~ msgid "object missing in `%E'" +#~ msgstr "objet manquant dans « %E »" + +#~ msgid "initializer list being treated as compound expression" +#~ msgstr "liste d'initaliseurs a été traité comme une expression composée" + +#~ msgid "cannot declare references to references" +#~ msgstr "ne peut décalrer des références vers des références" + +#~ msgid "cannot declare pointers to references" +#~ msgstr "ne peut déclarer des pointeurs vers des références" + +#~ msgid "type name expected before `&'" +#~ msgstr "nom de type attendu avant «&»" + +#~ msgid "semicolon missing after %s declaration" +#~ msgstr "«;» manquant après la déclaration de %s" + +#~ msgid "semicolon missing after declaration of `%T'" +#~ msgstr "«;» manquant après la déclaration « %T »" + +#~ msgid "`::%D' undeclared (first use here)" +#~ msgstr "«::%D» non déclaré (première utilisation ici)" + +#~ msgid "real-valued template parameters when cross-compiling" +#~ msgstr "canevas de paramètre en valeur réelle lors de la compilation croisée" + +#~ msgid "use of linkage spec `%D' is different from previous spec `%D'" +#~ msgstr "utilisation de spéc de liaisons « %D » est différente de la spec précédente « %D »" + +#~ msgid "no base or member initializers given following ':'" +#~ msgstr "pas d'initialiseur de base ou membre donné après «:»" + +#~ msgid "use of template qualifier outside template" +#~ msgstr "utilisation d'un qualificateur de canevas en dehors d'un canevas" + +#~ msgid "ISO C++ forbids an empty condition for `%s'" +#~ msgstr "ISO C++ interdit une condition vide pour « %s »" + +#~ msgid "definition of class `%T' in condition" +#~ msgstr "définition de la classe « %T » dans la condition" + +#~ msgid "definition of enum `%T' in condition" +#~ msgstr "définition de l'aggrégat « %T » dans la condition" + +#~ msgid "definition of array `%#D' in condition" +#~ msgstr "définition du tableau « %#D » dans la condition" + +#~ msgid "old style placement syntax, use () instead" +#~ msgstr "ancien style de syntaxe de positionnement, utiliser () à la place" + +#~ msgid "`%T' is not a valid expression" +#~ msgstr "« %T » n'est pas une expression valide" + +#~ msgid "initialization of new expression with `='" +#~ msgstr "initialisation de la nouvelle expression avec « = »" + +#~ msgid "sigof type specifier" +#~ msgstr "spécificateur du type sigof" + +#~ msgid "`sigof' applied to non-aggregate expression" +#~ msgstr "« sigof » appliqué à une expression de non aggrégats" + +#~ msgid "`sigof' applied to non-aggregate type" +#~ msgstr "« sigof » appliqué à un type non aggrégat" + +#~ msgid "storage class specifier `%s' not allowed after struct or class" +#~ msgstr "spécificateur de classe de stockages « %s » n'est pas permis après struct ou class" + +#~ msgid "type specifier `%s' not allowed after struct or class" +#~ msgstr "spécificateur de type « %s » n'est pas permis après struct ou class" + +#~ msgid "type qualifier `%s' not allowed after struct or class" +#~ msgstr "qualificateur de type « %s » n'est pas permis après struct ou class" + +#~ msgid "no body nor ';' separates two class, struct or union declarations" +#~ msgstr "pas de corps ni de «;» séparant les deux déclarations de classes, struct ou union" + +#~ msgid "no bases given following `:'" +#~ msgstr "pas de base donnée après «:»" + +#~ msgid "multiple access specifiers" +#~ msgstr "spécificateurs d'accès multiples" + +#~ msgid "multiple `virtual' specifiers" +#~ msgstr "spécificateurs « virtual » multiples" + +#~ msgid "missing ';' before right brace" +#~ msgstr "«;» manquant avant l'accolade de droite" + +#~ msgid "ISO C++ forbids array dimensions with parenthesized type in new" +#~ msgstr "ISO C++ interdit l'utilisation de parenthèses autour du type pour les dimensions de tableaux avec new" + +#~ msgid "`%T' is not a class or namespace" +#~ msgstr "« %T » n'est pas une classe ou un espace de noms" + +#~ msgid "ISO C++ forbids label declarations" +#~ msgstr "ISO C++ interdit la déclaration d'étiquette" + +#~ msgid "label must be followed by statement" +#~ msgstr "l'étiquette doit être suivie d'une déclaration" + +#~ msgid "must have at least one catch per try block" +#~ msgstr "doit avoir au moins un intercepteur par bloc d'essais" + +#~ msgid "ISO C++ forbids compound statements inside for initializations" +#~ msgstr "ISO C++ interdit les déclarations composées à l'intérieur des initialisations" + +#~ msgid "possibly missing ')'" +#~ msgstr "«)» possiblement manquante" + +#~ msgid "type specifier omitted for parameter" +#~ msgstr "spécificateur de type omis pour le paramètre" + +#~ msgid "`%E' is not a type, use `typename %E' to make it one" +#~ msgstr "« %E» n'est pas un type, utiliser «typename %E » pour en faire un" + +#~ msgid "no type `%D' in `%T'" +#~ msgstr "pas de type « %D » dans « %T »" + +#~ msgid "type specifier omitted for parameter `%E'" +#~ msgstr "spécificateur de type omis pour le paramètre « %E »" + +#~ msgid "type `%T' composed from a local class is not a valid template-argument" +#~ msgstr "type « %T » composé à partir d'une classe locale n'est pas un canevas d'argument valide" + +#~ msgid "adjusting pointers for covariant returns" +#~ msgstr "ajuster les pointeurs pour des retours co-variants" + +#~ msgid " overriding `%#D' (must be pointer or reference to class)" +#~ msgstr " écrasant « %#D » (doit être un pointeur ou une référence vers un classe)" + +#~ msgid " overriding `%#D' (must use pointer or reference)" +#~ msgstr " écrasant « %#D » (doit utiliser un pointeur ou un référence)" + +#~ msgid "return identifier `%D' already in place" +#~ msgstr "identificateur retourné « %D » est déjà en place" + +#~ msgid "can't redefine default return value for constructors" +#~ msgstr "ne peut redéfinir la valeur retournée par défaut pour les constructeurs" + +#~ msgid "calling type `%T' like a method" +#~ msgstr "appel du type « %T » comme une méthode" + +#~ msgid "destructor specifier `%T::~%T()' must have matching names" +#~ msgstr "spécificateur du destructeur «%T::~%T()» doit avoir des noms concordants" + +#~ msgid "identifier name `%s' conflicts with GNU C++ internal naming strategy" +#~ msgstr "nom d'identificateur « %s » entre en conflit avec la stratégie interne de dénomination de GNU C++" + +#~ msgid "parse error at end of saved function text" +#~ msgstr "erreur d'analyse syntaxique à la fin de la sauvegarde de la fonction texte" + +#~ msgid "%Hend of file read inside definition" +#~ msgstr "%H fin de fichier lors de la lecture à l'intérieur d'une définition" + +#~ msgid "parse error in method specification" +#~ msgstr "erreur d'analyse syntaxique dans la spécification de fonction" + +#~ msgid "function body for constructor missing" +#~ msgstr "corps de fonction pour le constructeur est manquante" + +#~ msgid "circular dependency in default args of `%#D'" +#~ msgstr "dépendance circulaire dans les arguments par défaut de « %#D »" + +#~ msgid "invalid type `%T' for default argument to `%T'" +#~ msgstr "type invalide « %T » pour l'argument par défaut « %T »" + +#~ msgid "%s before `%c'" +#~ msgstr "%s avant « %c »" + +#~ msgid "%s before `\\%o'" +#~ msgstr "%s avant «\\%o»" + +#~ msgid "%s before `%s' token" +#~ msgstr "%s avant l'élément lexical « %s »" + +#~ msgid "ISO C++ prohibits conversion from `%#T' to `(...)'" +#~ msgstr "ISO C++ interdit la conversion de « %#T » en « (...) »" + +#~ msgid "invalid application of `%s' to non-static member" +#~ msgstr "utilisation invalide de « %s » sur un membre non statique" + +#~ msgid "sizeof applied to a bit-field" +#~ msgstr "sizeof appliqué sur un champ de bits" + +#~ msgid "destructor specifier `%T::~%T' must have matching names" +#~ msgstr "spécificateur du destructeur «%T::~%T» doit des noms concordants" + +#~ msgid "parameter type of called function is incomplete" +#~ msgstr "type de paramètre de la fonction appelée est incomplet" + +#~ msgid "ISO C++ forbids using pointer to a member in subtraction" +#~ msgstr "ISO C++ interdit l'utilisation d'un pointeur vers un membre dans une soustraction" + +#~ msgid "reinterpret_cast from `%T' to `%T' casts away const (or volatile)" +#~ msgstr "reinterpret_cast de « %T » vers « %T » fait un transtypage écartant la constante (ou volatile)" + +#~ msgid "return-statement with no value, in function declared with a non-void return type" +#~ msgstr "déclaration d'un retour sans valeur, dans la fonction déclarée avec un type retourné non void" + +#~ msgid "return-statement with a value, in function declared with a void return type" +#~ msgstr "déclaration d'un retour sans valeur, dans la fonction déclarée avec un type retourné void" + +#~ msgid "comma expression used to initialize return value" +#~ msgstr "expression virgule utilsée pour initialiser la valeur de retour" + +#~ msgid "ISO C++ forbids non-constant aggregate initializer expressions" +#~ msgstr "ISO C++ interdit les expressions d'initialiseur d'aggrégat de non constante" + +#~ msgid "`%T' fails to be a typedef or built-in type" +#~ msgstr "« %T » a échoué à devenir un typedef ou un type construit interne" + +#~ msgid "ISO C++ forbids defining types within %s" +#~ msgstr "ISO C++ interdit la définition de types à l'intérieur de %s" + +#~ msgid "Only emit explicit template instatiations" +#~ msgstr "Produire seulement des instanciations explicites du canevas" + +#~ msgid "Recognize and/bitand/bitor/compl/not/or/xor" +#~ msgstr "Reconnaître and/bitand/bitor/compl/not/or/xor" + +#~ msgid "Warn about inconsistent return types" +#~ msgstr "Avertir à propos des types retournés inconsistants" + +#~ msgid "Warn when a function is declared extern, then inline" +#~ msgstr "Avertir lorsqu'un fonction est déclarée extern, puis inline" + +#~ msgid "directory name must immediately follow -I" +#~ msgstr "nom du répertoire doit suivre immédiatement -I" + +#~ msgid "ignoring pragma: %s" +#~ msgstr "pragma: %s ignoré" + +#~ msgid "Program does not use Unix-f77 dialectal features" +#~ msgstr "Programme n'utilise pas les options du dialecte Unix f77" + +#~ msgid "Disable the appending of underscores to externals" +#~ msgstr "Désactiver l'ajout de caractères de soulignement aux externes" + +#~ msgid "Fortran-specific form of -fbounds-check" +#~ msgstr "Forme spécifique Fortran de -fbounds-check" + +#~ msgid "Add a directory for INCLUDE searching" +#~ msgstr "Ajouter un répertoire pour la recherche par INCLUDE" + +#~ msgid "Set the maximum line length" +#~ msgstr "Initialiser la longueur maximale des lignes" + +#~ msgid "Disable automatic array bounds checking" +#~ msgstr "Vérification automatique désactivée des bornes de tableaux" + +#~ msgid "Set class path" +#~ msgstr "Initialiser le chemin des classes" + +#~ msgid "Choose class whose main method should be used" +#~ msgstr "Choisir la classe dont la méthode principale devrait être utilisée" + +#~ msgid "Add directory to class path" +#~ msgstr "Ajouter un répertoire au chemin des classes" + +#~ msgid "Directory where class files should be written" +#~ msgstr "Répertoire où les fichiers de classe devraient être écrits" + +#~ msgid "`%s' cannot be statically allocated" +#~ msgstr "« %s » ne peut être statiquement alloué" + +#~ msgid "multiple declarations for method `%s'" +#~ msgstr "multiples déclarations pour la méthode « %s »" + +#~ msgid "cannot find class (factory) method" +#~ msgstr "ne peut repérer de méthode de classe (manufacturé)" + +#~ msgid "return type for `%s' defaults to id" +#~ msgstr "type retourné pour « %s » par défaut est id" + +#~ msgid "return type defaults to id" +#~ msgstr "type retourné par défaut est id" + +#~ msgid "cannot find method" +#~ msgstr "ne peut repérer la méthode" + +#~ msgid "duplicate definition of class method `%s'" +#~ msgstr "duplication de définition de la méthode de la classe « %s »" + +#~ msgid "duplicate definition of instance method `%s'" +#~ msgstr "duplication de définition de la méthode d'instanciation « %s »" + +#~ msgid "duplicate declaration of instance method `%s'" +#~ msgstr "duplication de déclaration de la méthode d'instanciation « %s »" + +#~ msgid "potential selector conflict for method `%s'" +#~ msgstr "conflit potentiel sur le sélecteur pour la méthode « %s »" + +#~ msgid "Specify the name of the class for constant strings" +#~ msgstr "Spécifier le nom de la classe pour les constantes chaînes" + +#~ msgid "compilation of header file requested" +#~ msgstr "fichier d'en-tête requis pour la compilation" + +#~ msgid "choose either big or little endian, not both" +#~ msgstr "choisir un système à octets de poids fort ou faible mais pas les deux" + +#~ msgid "choose either m340 or m210 not both" +#~ msgstr "choisir m340 ou m210 mais pas les deux" + +#~ msgid "-c or -S required for Ada" +#~ msgstr "-c ou -S requis pour Ada" + +#~ msgid "-static not valid with -mcoff" +#~ msgstr "-static n'est pas valide avec -mcoff" + +#~ msgid "-shared not valid with -mcoff" +#~ msgstr "-shared n'est pas valide avec -mcoff" + +#~ msgid "-symbolic not valid with -mcoff" +#~ msgstr "-symbolic n'est pas valide avec -mcoff" + +#~ msgid "-fpic is not valid with -mcoff" +#~ msgstr "-fpic n'est pas valide avec -mcoff" + +#~ msgid "-fPIC is not valid with -mcoff" +#~ msgstr "-fPic n'est pas valide avec -mcoff" + +#~ msgid "-fpic not valid with -mcoff" +#~ msgstr "-fpic n'est pas valide avec -mcoff" + +#~ msgid "-fPIC not valid with -mcoff" +#~ msgstr "-fPIC n'est pas valide avec -mcoff" + +#~ msgid "unnamed fields of type other than struct or union are not allowed" +#~ msgstr "champs sans nom de type autre que struct ou union ne sont pas permis" + +#~ msgid "numeric constant with no digits" +#~ msgstr "constante numérique sans chiffre" + +#~ msgid "numeric constant contains digits beyond the radix" +#~ msgstr "constante numérique contient des chiffres en dehors la base numérique" + +#~ msgid "floating constant may not be in radix 16" +#~ msgstr "constante flottante peut ne pas être en base 16" + +#~ msgid "more than one 'f' suffix on floating constant" +#~ msgstr "plus d'un « f » en suffixe sur une constante flottante" + +#~ msgid "more than one 'l' suffix on floating constant" +#~ msgstr "plus d'un « l » en suffixe sur une constante flottante" + +#~ msgid "traditional C rejects the 'l' suffix" +#~ msgstr "C traditionnel rejette le suffixe « l »" + +#~ msgid "more than one 'i' or 'j' suffix on floating constant" +#~ msgstr "plus d'un « i » ou « j » en suffixe sur une constante flottante" + +#~ msgid "floating constant out of range" +#~ msgstr "constante flottante est hors gamme" + +#~ msgid "floating point number exceeds range of 'double'" +#~ msgstr "nombre en virgule flottante excède les limites de « double »" + +#~ msgid "two 'u' suffixes on integer constant" +#~ msgstr "deux « u » en suffixe sur une constante entière" + +#~ msgid "traditional C rejects the 'u' suffix" +#~ msgstr "C traditionnel rejette le suffixe « u »" + +#~ msgid "three 'l' suffixes on integer constant" +#~ msgstr "trois « l » en suffixe sur une constante entière" + +#~ msgid "'lul' is not a valid integer suffix" +#~ msgstr "'lul» n'est pas un suffixe valide pour un entier" + +#~ msgid "'Ll' and 'lL' are not valid integer suffixes" +#~ msgstr "« Ll» et «1L » ne sont pas des suffixes valides pour un entier" + +#~ msgid "more than one 'i' or 'j' suffix on integer constant" +#~ msgstr "plus d'un « i » ou « j » en suffixe sur une constante entière" + +#~ msgid "invalid suffix on integer constant" +#~ msgstr "suffixe invalide pour une constante entière" + +#~ msgid "integer constant is too large for this configuration of the compiler - truncated to %d bits" +#~ msgstr "constante entière trop grande pour la configuration du compilateur - tronqué à %d bits" + +#~ msgid "width of integer constant changes with -traditional" +#~ msgstr "largeur de la constante entière change avec -traditional" + +#~ msgid "width of integer constant may change on other systems with -traditional" +#~ msgstr "largeur de la constante entière peut changer sur d'autres système avec -traditional" + +#~ msgid "integer constant larger than the maximum value of %s" +#~ msgstr "constante entière plus grande que la valeur maximale de %s" + +#~ msgid "an unsigned long long int" +#~ msgstr "un entier long long non signé" + +#~ msgid "a long long int" +#~ msgstr "un entier long long" + +#~ msgid "an unsigned long int" +#~ msgstr "un entier long non signé" + +#~ msgid "decimal constant is so large that it is unsigned" +#~ msgstr "constante décimale est tellement grande qu'elle est non signée" + +#~ msgid "complex integer constant is too wide for 'complex int'" +#~ msgstr "constante complexe entière est trop grande pour le type 'complex int'" + +#~ msgid "integer constant is larger than the maximum value for its type" +#~ msgstr "constante entière est plus grande que la valeur maximale pour ce type" + +#~ msgid "missing white space after number '%.*s'" +#~ msgstr "espace blanc manquant après le nombre '%.*s'" + +#~ msgid "storage class specifier in array declarator" +#~ msgstr "spécificateur de classe de stockage dans le déclarateur de tableau" + +#~ msgid "sizeof applied to a function type" +#~ msgstr "sizeof appliqué sur un type de fonction" + +#~ msgid "sizeof applied to a void type" +#~ msgstr "sizeof appliqué sur un type void" + +#~ msgid "execvp %s" +#~ msgstr "execvp %s" + +#~ msgid "floating point numbers are not valid in #if" +#~ msgstr "nombres flottants ne sont pas valides dans un #if" + +#~ msgid "traditional C rejects the `U' suffix" +#~ msgstr "C traditionel rejette le suffixe « U »" + +#~ msgid "too many 'l' suffixes in integer constant" +#~ msgstr "trop de « l » en suffixe dans les constantes entières" + +#~ msgid "integer constant contains digits beyond the radix" +#~ msgstr "constante entière contient des chiffres en dehors la base numérique" + +#~ msgid "integer constant out of range" +#~ msgstr "constante entière est hors gamme" + +#~ msgid "string constants are not valid in #if" +#~ msgstr "constantes de chaîne ne sont pas valides dasn un #if" + +#~ msgid "missing binary operator" +#~ msgstr "opérateur binaire manquant" + +#~ msgid "changing search order for system directory \"%s\"" +#~ msgstr "modification de l'ordonnancement de recherche du répertoire système « %s »" + +#~ msgid " as it is the same as non-system directory \"%s\"" +#~ msgstr " comme c'est le même qu'un répertoire non système « %s »" + +#~ msgid "I/O error on output" +#~ msgstr "Erreur E/S sur la sortie" + +#~ msgid "argument missing after %s" +#~ msgstr "argument manquant après %s" + +#~ msgid "number missing after %s" +#~ msgstr "nombre manquant après %s" + +#~ msgid "target missing after %s" +#~ msgstr "cible manquante après %s" + +#~ msgid "GNU CPP version %s (cpplib)" +#~ msgstr "GNU CPP version %s (cpplib)" + +#~ msgid "" +#~ " -lang-c++ Assume that the input sources are in C++\n" +#~ " -lang-objc Assume that the input sources are in ObjectiveC\n" +#~ " -lang-objc++ Assume that the input sources are in ObjectiveC++\n" +#~ " -lang-asm Assume that the input sources are in assembler\n" +#~ msgstr "" +#~ " -lang-c++ Présumer que les sources sont en C++\n" +#~ " -lang-objc Présumer que les sources sont en ObjectiveC\n" +#~ " -lang-objc++ Présumer que les sources sont en ObjectiveC++\n" +#~ " -lang-asm Présumer que les sources sont en assembleur\n" + +#~ msgid "possible start of unterminated string literal" +#~ msgstr "début possible d'une chaîne de mot non terminée" + +#~ msgid "multi-line string literals are deprecated" +#~ msgstr "chaîne de mots multi-lignes sont obsolètes" + +#~ msgid "directives may not be used inside a macro argument" +#~ msgstr "directives ne peuvent être utilisées à l'intérieur d'un argument macro" + +#~ msgid "invalid option %s" +#~ msgstr "option invalide %s" + +#~ msgid "%s:%d: warning: " +#~ msgstr "%s:%d: AVERTISSEMENT: " + +#~ msgid "argument to `-b' is missing" +#~ msgstr "argument de «-b» est manquant" + +#~ msgid "argument to `-V' is missing" +#~ msgstr "argument de «-V» est manquant" + +#~ msgid "invalid version number format" +#~ msgstr "format de numéro de verson invalide" + +#~ msgid ".da file contents exhausted too early\n" +#~ msgstr "Le contenu du fichier .da a été épuisé trop rapidement\n" + +#~ msgid ".da file contents not exhausted\n" +#~ msgstr "Le contenu du fichier .da n'a pas été épuisé\n" + +#~ msgid "%6.2f%% of %d source lines executed in function %s\n" +#~ msgstr "%6.2f%% des lignes sources %d exécutées dans la fonction %s\n" + +#~ msgid "%6.2f%% of %d branches executed in function %s\n" +#~ msgstr "%6.2f%% de branchements %d exécutés dans la fonction %s\n" + +#~ msgid "%6.2f%% of %d branches taken at least once in function %s\n" +#~ msgstr "%6.2f%% de branchements %d pris au mons une fois dans la fonction %s\n" + +#~ msgid "No branches in function %s\n" +#~ msgstr "Pas de branchement dans la fonction %s\n" + +#~ msgid "%6.2f%% of %d calls executed in function %s\n" +#~ msgstr "%6.2f%% d'appels %d exécutés dans la fonction %s\n" + +#~ msgid "No calls in function %s\n" +#~ msgstr "Pas d'appel dans la fonction %s\n" + +#~ msgid "call %d returns = %s%%\n" +#~ msgstr "appel %d a retourné = %s%%\n" + +#~ msgid "branch %d taken = %s%%\n" +#~ msgstr "branchement %d a pris = %s%%\n" + +#~ msgid ".da file contents exhausted too early" +#~ msgstr "Le contenu du fichier .da a été épuisé trop rapidement" + +#~ msgid "conversion from NaN to int" +#~ msgstr "conversion de NaN en int" + +#~ msgid "floating point overflow" +#~ msgstr "débordement de virgule flottante" + +#~ msgid "overflow on truncation to integer" +#~ msgstr "débordement de troncation d'un entier" + +#~ msgid "overflow on truncation to unsigned integer" +#~ msgstr "débordement lors de la troncation d'un entier non signé" + +#~ msgid "%s: argument domain error" +#~ msgstr "%s: erreur d'argument de domaine" + +#~ msgid "%s: function singularity" +#~ msgstr "%s: singularité de fonction" + +#~ msgid "%s: underflow range error" +#~ msgstr "%s: erreur de sous débordement de bornes" + +#~ msgid "%s: total loss of precision" +#~ msgstr "%s: perte totale de précision" + +#~ msgid "%s: partial loss of precision" +#~ msgstr "%s: perte partielle de précision" + +#~ msgid "%s: NaN - producing operation" +#~ msgstr "%s: NaN - opération produite" + +#~ msgid "Pretend that host and target use the same FP format" +#~ msgstr "Prétendre que l'hôte et la cible utilise le format FP" + +#~ msgid "Compile pointers as triples: value, base & end" +#~ msgstr "Compiler les pointeurs comme des triplets: valeur, base et fin" + +#~ msgid "Do not promote floats to double if using -traditional" +#~ msgstr "Ne pas promouvoir les flottants à des doubles avec -traditional" + +#~ msgid "Attempt to support traditional K&R style C" +#~ msgstr "Tenter de supporter le style de langage C traditionnel K&R" + +#~ msgid "internal error: %s" +#~ msgstr "erreur interne: %s" + +#~ msgid "crossjump disabled: %d > 1000 basic blocks and %d >= 20 edges/basic block" +#~ msgstr "saut croisé désactivé: %d > 1000 blocs de base et %d >= 20 blocs edges/basic" + +#~ msgid " -a Enable block profiling \n" +#~ msgstr " -a autoriser le profilage des blocs \n" + +#~ msgid " -ax Enable jump profiling \n" +#~ msgstr " -ax autoriser le profilage des sauts \n" + +#~ msgid "profiling does not work without a frame pointer" +#~ msgstr "profilage ne fonctionne pas sans un pointeur de trames" + +#~ msgid "floating point numbers not allowed in #if expressions" +#~ msgstr "nombres flottants ne sont pas permis dans les expressions #if" + +#~ msgid "invalid number in #if expression" +#~ msgstr "nombre invalide dans l'expression #if" + +#~ msgid "invalid character constant in #if" +#~ msgstr "constante de caractères invalide dans le #if" + +#~ msgid "double quoted strings not allowed in #if expressions" +#~ msgstr "chaînes entre quillemets ne sont pas allouées dans les expression #if" + +#~ msgid "octal character constant does not fit in a byte" +#~ msgstr "constante de caractères en octal ne peut être insérée dans un octet" + +#~ msgid "empty #if expression" +#~ msgstr "expression #if vide" + +#~ msgid "Junk after end of expression." +#~ msgstr "Rebut à la fin de l'expression." + +#~ msgid "macro or #include recursion too deep" +#~ msgstr "macro ou récursion de #include trop profonde" + +#~ msgid "usage: %s [switches] input output" +#~ msgstr "usage: %s [options] entrée sortie" + +#~ msgid "-traditional is not supported in C++" +#~ msgstr "-traditional n'est pas supporté en C++" + +#~ msgid "-traditional and -ansi are mutually exclusive" +#~ msgstr "-traditional et -ansi sont mutuellement exclusives" + +#~ msgid "filename missing after -i option" +#~ msgstr "nom de fichier manquant après l'option -i" + +#~ msgid "filename missing after -o option" +#~ msgstr "nom de fichier manquant après l'option -o" + +#~ msgid "target missing after %s option" +#~ msgstr "cible manquante après l'option %s" + +#~ msgid "filename missing after %s option" +#~ msgstr "nom de fichier manquant après l'option %s" + +#~ msgid "macro name missing after -%c option" +#~ msgstr "nom de macro manquant après l'option -%c" + +#~ msgid "-trigraphs and -traditional are mutually exclusive" +#~ msgstr "-trigraphs et -traditional sont mutuellement exclusives" + +#~ msgid "directory name missing after -I option" +#~ msgstr "nom de répertoire manquant après l'option -I" + +#~ msgid "`/*' within comment" +#~ msgstr "« /* » à l'intérieur d'un commentaire" + +#~ msgid "unterminated #%s conditional" +#~ msgstr "#%s conditionel non terminé" + +#~ msgid "not in any file?!" +#~ msgstr "n'est pas dans aucun fichier?!" + +#~ msgid "`defined' must be followed by ident or (ident)" +#~ msgstr "« defined » doit être suivi par ident ou (ident)" + +#~ msgid "cccp error: invalid special hash type" +#~ msgstr "erreur cccp: type de hachage spécial invalide" + +#~ msgid "#include expects \"fname\" or " +#~ msgstr "#include espère « fname » ou " + +#~ msgid "no include path in which to find %.*s" +#~ msgstr "pas de chemin d'inclusion dans lequel trouver %.*s" + +#~ msgid "invalid macro name" +#~ msgstr "nom de macro invalide" + +#~ msgid "invalid macro name `%s'" +#~ msgstr "nom de macro invalide « %s »" + +#~ msgid "parameter name starts with a digit in #define" +#~ msgstr "nom de paramètre débute avec un chiffre dans #define" + +#~ msgid "badly punctuated parameter list in #define" +#~ msgstr "liste de paramètres incorrectement ponctués dans #define" + +#~ msgid "unterminated parameter list in #define" +#~ msgstr "liste de paramètres non terminée dans #define" + +#~ msgid "\"%.*s\" redefined" +#~ msgstr "\"%.*s\" redéfini" + +#~ msgid "# operator should be followed by a macro argument name" +#~ msgstr "# opérator derait être suivi par le nom d'un argument macro" + +#~ msgid "invalid format #line command" +#~ msgstr "format invalide dans la commande #line" + +#~ msgid "undefining `defined'" +#~ msgstr "indéfinition « defined »" + +#~ msgid "undefining `%s'" +#~ msgstr "indéfinition « %s »" + +#~ msgid "extra text at end of directive" +#~ msgstr "texte superflu à la fin de la directive" + +#~ msgid "#error%.*s" +#~ msgstr "#error%.*s" + +#~ msgid "#warning%.*s" +#~ msgstr "#warning%.*s" + +#~ msgid "#elif not within a conditional" +#~ msgstr "#elif n'est pas à l'intérieur d'un conditionel" + +#~ msgid "#%s not within a conditional" +#~ msgstr "#%s n'est pas à l'intérieur d'un conditionel" + +#~ msgid "#else or #elif after #else" +#~ msgstr "#else ou #elif après #else" + +#~ msgid "#else not within a conditional" +#~ msgstr "#else n'est pas à l'intérieur d'un conditionel" + +#~ msgid "unbalanced #endif" +#~ msgstr "#endif non pairé" + +#~ msgid "unterminated string or character constant" +#~ msgstr "chaîne non terminée ou constante caractère" + +#~ msgid "arguments given to macro `%s'" +#~ msgstr "argument donnée à la macro « %s »" + +#~ msgid "no args to macro `%s'" +#~ msgstr "aucun argument pour la macro « %s »" + +#~ msgid "only 1 arg to macro `%s'" +#~ msgstr "seulement 1 argument pour la macro « %s »" + +#~ msgid "only %d args to macro `%s'" +#~ msgstr "seulement %d arguments pour la macro « %s »" + +#~ msgid "too many (%d) args to macro `%s'" +#~ msgstr "trop d'arguments (%d) pour la macro « %s »" + +#~ msgid "" +#~ "internal error in %s, at tradcpp.c:%d\n" +#~ "Please submit a full bug report.\n" +#~ "See %s for instructions." +#~ msgstr "" +#~ "Erreur interne dans %s, à tradcpp.c:%d\n" +#~ "SVP soumettre un rapport complet des anomalies rencontrées.\n" +#~ "Consulter %s pour les instructions." + +#~ msgid "optimization turned on" +#~ msgstr "optimisation activée" + +#~ msgid "optimization turned off" +#~ msgstr "optimisation désactivée" + +#~ msgid "optimization level restored" +#~ msgstr "niveau d'optimisation restauré" + +#~ msgid "Use VAX-C alignment" +#~ msgstr "Utiliser l'alignement VAX-C" + +#~ msgid "Generate code assuming DW bit is set" +#~ msgstr "Générer le code en assumant que le bit DW est initialisé" + +#~ msgid "Generate code assuming DW bit is not set" +#~ msgstr "Générer le code en assumant que le bit DW n'est pas initialisé" + +#~ msgid "Generate code using byte writes" +#~ msgstr "Générer le code en utilisant des écritures par octets" + +#~ msgid "Do not generate byte writes" +#~ msgstr "Ne pas générer des écritures par octets" + +#~ msgid "Use small memory model" +#~ msgstr "Utiliser le modèle de petite mémoire" + +#~ msgid "Use normal memory model" +#~ msgstr "Utiliser le modèle normal de mémoire" + +#~ msgid "Use large memory model" +#~ msgstr "Utiliser le modèle de grande mémoire" + +#~ msgid "Generate 29050 code" +#~ msgstr "Générer le code 29050" + +#~ msgid "Generate 29000 code" +#~ msgstr "Générer le code 29000" + +#~ msgid "Use kernel global registers" +#~ msgstr "Utiliser les registres globaux du kernel" + +#~ msgid "Use user global registers" +#~ msgstr "Utiliser les registres globaux" + +#~ msgid "Emit stack checking code" +#~ msgstr "Produire le code de vérification de la pile" + +#~ msgid "Do not emit stack checking code" +#~ msgstr "Ne pas produire le code de vérification de la pile" + +#~ msgid "Work around storem hardware bug" +#~ msgstr "Contourner le bug matériel de stockage" + +#~ msgid "Do not work around storem hardware bug" +#~ msgstr "Ne pas contourner le bug matériel de stockage" + +#~ msgid "Store locals in argument registers" +#~ msgstr "Stocker les var. locales dans redistres d'arguments" + +#~ msgid "Do not store locals in arg registers" +#~ msgstr "Ne pas stocker les var. locales dans redistres d'arguments" + +#~ msgid "Do symbol renaming for BSD" +#~ msgstr "Ne pas renommer les symboles pour BSD" + +#~ msgid "Do symbol renaming for X/OPEN" +#~ msgstr "Ne pas renommer les symboles pour X/OPEN" + +#~ msgid "Don't do symbol renaming" +#~ msgstr "Ne pas renommer les symboles" + +#~ msgid "Generate code for the C400" +#~ msgstr "Générer le code pour le C400" + +#~ msgid "Generate code for the C300" +#~ msgstr "Générer le code pour le C300" + +#~ msgid "Generate code for c1" +#~ msgstr "Générer le code pour le c1" + +#~ msgid "Generate code for c2" +#~ msgstr "Générer le code pour le c2" + +#~ msgid "Generate code for c32" +#~ msgstr "Générer le code pour le c3" + +#~ msgid "Generate code for c34" +#~ msgstr "Générer le code pour le c34" + +#~ msgid "Use standard calling sequence, with arg count word" +#~ msgstr "Utiliser la séquence standard d'appel, avec arg et mot compteur" + +#~ msgid "Place arg count in a nop instruction (faster than push)" +#~ msgstr "Placer le compteur d'arg dans une instruction NOP (plus rapide que push)" + +#~ msgid "Don't push arg count, depend on symbol table" +#~ msgstr "Ne pas empiler le compteur d'arg, dépend de la table de symboles" + +#~ msgid "Use data cache for volatile mem refs (default)" +#~ msgstr "Utiliser la cache de données pour les réf. mémoire volatiles (par défaut)" + +#~ msgid "Don't use data cache for volatile mem refs" +#~ msgstr "Ne pas utiliser la cache de données pour les réf. mémoire volatiles" + +#~ msgid "Bypass data cache for volatile mem refs" +#~ msgstr "Éviter la cache de données pour les réf. mémoire volatiles" + +#~ msgid "Use 64-bit longs" +#~ msgstr "Utiliser des longs de 64 bits" + +#~ msgid "Use cc- and libc-compatible 32-bit longs" +#~ msgstr "Utiliser cc- et libc-compatible longs de 32 bits" + +#~ msgid "inline float constants not supported on this host" +#~ msgstr "enlignage des constantes flottantes n'est pas supporté sur cet hôte" + +#~ msgid "Generate code the unix assembler can handle" +#~ msgstr "Générer du code que l'assembleur UNIX peut traiter" + +#~ msgid "Retain standard MXDB information" +#~ msgstr "Retenir l'information standard MXDB" + +#~ msgid "Retain legend information" +#~ msgstr "Retenir les informations de légende" + +#~ msgid "Generate external legend information" +#~ msgstr "Générer les informations externes de légende" + +#~ msgid "Emit identifying info in .s file" +#~ msgstr "Produire les infos d'identification dans le fichier .s" + +#~ msgid "Warn when a function arg is a structure" +#~ msgstr "Avertir lorsque l'arg d'une fonction est une structure" + +#~ msgid "argument is a structure" +#~ msgstr "argument est une structure" + +#~ msgid "half-pic init called on systems that don't support it" +#~ msgstr "init à demi PIC appelé sur un système qui ne le supporte pas" + +#~ msgid "Profiling uses mcount" +#~ msgstr "Profilage utilise mcount" + +#~ msgid "Emit half-PIC code" +#~ msgstr "Produire du code à moitié PIC" + +#~ msgid "Emit ELF object code" +#~ msgstr "Produire du code objet ELF" + +#~ msgid "Emit ROSE object code" +#~ msgstr "Produire du code objet ROSE" + +#~ msgid "Symbols have a leading underscore" +#~ msgstr "Les symboles sont précédées d'un caractère de soulignement " + +#~ msgid "Align to >word boundaries" +#~ msgstr "Aligner sur >frontières de mots" + +#~ msgid "Use mcount for profiling" +#~ msgstr "Utiliser mcount pour le profilage" + +#~ msgid "Use mcount_ptr for profiling" +#~ msgstr "Utiliser mcount_ptr pour le profilage" + +#~ msgid "the -mlong-double-64 option does not work yet" +#~ msgstr "l'option -mlong-double-64 n'est pas fonctionnelle encore" + +#~ msgid "The -march option is incompatible to -mipsN and therefore ignored." +#~ msgstr "L'option -march est incompatible avec -mipsN et est alors ignorée." + +#~ msgid "-mips%d not supported" +#~ msgstr "-mips%d n'est pas supporté" + +#~ msgid "-mabi=%s does not support -mips%d" +#~ msgstr "-mabi=%s ne supporte pas -mips%d" + +#~ msgid "this target does not support the -mabi switch" +#~ msgstr "cette cible ne supporte pas l'option -mabi" + +#~ msgid "-mips%d does not support 64 bit fp registers" +#~ msgstr "-mips%d ne supporte pas les registres FP de 64 bits" + +#~ msgid "-mips%d does not support 64 bit gp registers" +#~ msgstr "-mips%d ne supporte pas les registres GP de 64 bits" + +#~ msgid "Use OSF PIC" +#~ msgstr "Utiliser le code PIC OSF" + +#~ msgid "Don't use OSF PIC" +#~ msgstr "Ne pas utiliser le code PIC OSF" + +#~ msgid "Optimize for 3900" +#~ msgstr "Optimiser pour le 3900" + +#~ msgid "Optimize for 4650" +#~ msgstr "Optimiser pour le 4650" + +#~ msgid "stack frame too big" +#~ msgstr "trame de pile trop grande" + +#~ msgid "neither varargs or stdarg in mmix_setup_incoming_varargs" +#~ msgstr "ni varargs ou stdarg dans mmix_setup_incoming_varargs" + +#~ msgid "oops, not debugged; fixing up value:" +#~ msgstr "oops, pas mis au point; correction de la valeur:" + +#~ msgid "Generate little endian data" +#~ msgstr "Générer des données pour systèmes à octets de poids faible" + +#~ msgid "Generate big endian data" +#~ msgstr "Générer des données pour systèmes à octets de poids fort" + +#~ msgid "Turn on maintainer testing code" +#~ msgstr "Mettre en marche le code d'entretien de mise au point" + +#~ msgid "Enable Transmeta picoJava extensions" +#~ msgstr "Autoriser les extensions Transmeta picoJava" + +#~ msgid "Disable Transmeta picoJava extensions" +#~ msgstr "Interdire les extensions Transmeta picoJava" + +#~ msgid "Disable reorganization pass" +#~ msgstr "Désactiver la passe de réorganisation" + +#~ msgid "-f%s ignored (all code is position independent)" +#~ msgstr "-f%s ignoré (tout le code est indépendant de la position)" + +#~ msgid "-ffunction-sections disabled on AIX when debugging" +#~ msgstr "-ffunction-sections désactivé sur AIX lors de la mise au point" + +#~ msgid "-fdata-sections not supported on AIX" +#~ msgstr "-fdata-sections n'est pas supporté sur AIX" + +#~ msgid "%%S computed all 1's mask" +#~ msgstr "%%S calculé avec un masque que uns" + +#~ msgid "%%S computed all 0's mask" +#~ msgstr "%%S calculé avec un masque de zéros" + +#~ msgid "no viable candidates" +#~ msgstr "pas de candidats viables" + +#~ msgid "`%D' has already been declared in `%T'" +#~ msgstr "« %D » a déjà été déclaré dans « %T »" + +#~ msgid "`%D' as declarator" +#~ msgstr "« %D » comme déclarateur" + +#~ msgid "cannot declare %s to references" +#~ msgstr "ne peut déclarer %s comme références" + +#~ msgid "invalid type: `void &'" +#~ msgstr "type invalide: « void & »" + +#~ msgid "typedef declaration includes an initializer" +#~ msgstr "déclaration typedef inclut un initialiseur" + +#~ msgid "-fname-mangling-version is no longer supported" +#~ msgstr "-fname-mangling-version n'est plus supportée" + +#~ msgid " %#D" +#~ msgstr " %#D" + +#~ msgid "member initializers for `%#D'" +#~ msgstr "initialiseur du membre pour « %#D »" + +#~ msgid " will be re-ordered to match declaration order" +#~ msgstr " sera ré-odonné pour concorder avec l'ordre déclaré" + +#~ msgid "multiple initializations given for member `%D'" +#~ msgstr "initialisations multiples données pour le membre « %D »" + +#~ msgid " will be re-ordered to match inheritance order" +#~ msgstr " sera ré-ordonné pour concorder avec l'ordre d'héritage" + +#~ msgid "implementation-reserved name `%D' used" +#~ msgstr "nom d'implantation réservé « %D » est utilisé" + +#~ msgid "explicit instantiation of `%#D' after" +#~ msgstr "instanciation explicite de « %#D » après" + +#~ msgid "explicit specialization here" +#~ msgstr "spécialisation explicite ici" + +#~ msgid "explicit instantiation of `%#T' after" +#~ msgstr "instanciation explicite de « %#T » après" + +#~ msgid "base initializer for `%T'" +#~ msgstr "initialiseur de base « %T »" + +#~ msgid " will be re-ordered to precede member initializations" +#~ msgstr " sera ré-ordonné pour précéder les initialisations de membre" + +#~ msgid "ignoring `%V' qualifiers on `%T'" +#~ msgstr "qualificateurs « %V » ignorés pour « %T »" + +#~ msgid "`sizeof' applied to non-static member" +#~ msgstr "« sizeof » appliqué à un membre non statique" + +#~ msgid "`sizeof' applied to incomplete type `%T'" +#~ msgstr "« sizeof» appliqué sur un type incomplet «%T »" + +#~ msgid "request for member `%T::%D' in expression of non-aggregate type `%T'" +#~ msgstr "requête du membre «%T::%D» dans l'expression du type non aggrégat « %T »" + +#~ msgid "invalid use of type decl `%#D' as expression" +#~ msgstr "utilisation invalide du type decl « %#D » comme expression" + +#~ msgid "invalid use of template `%#D' as expression" +#~ msgstr "utilisation invalide du canevas « %#D » comme expression" + +#~ msgid "invalid offsetof from non-POD type `%#T'; use pointer to member instead" +#~ msgstr "offsetof invalide du type non POD « %#T »; utiliser un pointeur vers un membre à la place" + +#~ msgid "pointer to member function called, but not in class scope" +#~ msgstr "appel d'un pointeur vers un membre de fonction, mais n'est pas dans le champ de la classe" + +#~ msgid "object missing in call to method `%D'" +#~ msgstr "objet manquant dans l'appel de la méthode « %D »" + +#~ msgid "function `%D' declared overloaded, but no definitions appear with which to resolve it?!?" +#~ msgstr "fontion « %D » déclarée surchargée, mais aucune définition n'apparaît pour la résoudre?!?" + +#~ msgid "invalid call to member function needing `this' in static member function scope" +#~ msgstr "appel invalide vers un membre de fonction ayant besoin de « ceci » dans le champ du membre statique de la fonction" + +#~ msgid "invalid use of undefined type `%#T'" +#~ msgstr "utilisation invalide d'un type indéfini « %#T »" + +#~ msgid "invalid use of `%T'" +#~ msgstr "utilisation invalide de « %T »" + +#~ msgid "invalid use of member (did you forget the `&' ?)" +#~ msgstr "utilisation invalide de membre (avez-vous oublié le «&» ?)" + +#~ msgid "address of overloaded function with no contextual type information" +#~ msgstr "adresse de la fonction surchargée sans information contextuelle de type" + +#~ msgid "overloaded function with no contextual type information" +#~ msgstr "fonction surchargée sans information contextuelle de type" + +#~ msgid "insufficient contextual information to determine type" +#~ msgstr "information contextuelle insuffisante pour déterminer le type" + +#~ msgid "initializer list construction invalid for derived class object `%D'" +#~ msgstr "initialiseur de construction de liste invalide pour l'objet de classe dérivée « %D »" + +#~ msgid "initializer list construction invalid for polymorphic class object `%D'" +#~ msgstr "initialiseur de construction de liste invalide pour l'objet de classe polymorphique « %D »" + +#~ msgid "initializer list construction invalid for `%D'" +#~ msgstr "construction de la liste d'initialiseurs invalide pour « %D »" + +#~ msgid "due to the presence of a constructor" +#~ msgstr "en raison de la présence d'un constructeur" + +#~ msgid "due to non-public access of member `%D'" +#~ msgstr "en raison d'un accès non public du membre « %D »" + +#~ msgid "The meaning of `\\x' (at %0) varies with -traditional" +#~ msgstr "La signification de «\\x» (à %0) varie avec l'option -traditional" + +#~ msgid "The meaning of `\\a' (at %0) varies with -traditional" +#~ msgstr "La signification de «\\a»(à %0) varie avec -traditional" + +#~ msgid "the meaning of `\\x' varies with -traditional" +#~ msgstr "la signification de «\\x» varie avec l'option -traditional" + +#~ msgid "the meaning of `\\a' varies with -traditional" +#~ msgstr "le sens de «\\a» varie avec -traditional" + +#~ msgid "parse error; also virtual memory exceeded" +#~ msgstr "erreur d,analyse syntaxique; aussi la mémoire virtuelle est épuisée" + +#~ msgid "Can't specify array dimension in a declaration" +#~ msgstr "Ne peut spécifier la dimension du tableau dans la déclaration" + +#~ msgid "internal error - use of undefined type" +#~ msgstr "erreur interne - utilisation d'un type non défini" + +#~ msgid "no class name specified as argument to -fconstant-string-class" +#~ msgstr "pas de nom de classe spécifier dans l'argument à -fconstant-string-class" + +#~ msgid "-p profiling is no longer supported. Use -pg instead" +#~ msgstr "-p profilage n'est plus supporté. Utiliser -pg à la place." + +#~ msgid "incompatible interworking options" +#~ msgstr "options d'inter-réseautage incompatibles" + +#~ msgid "options -mabi=mmixware and -mabi=gnu are mutually exclusive" +#~ msgstr "options -mabi=mmixware et -mabi=gnu sont mutuellement exclusives" + +#~ msgid "-p option not supported: use -pg instead" +#~ msgstr "l'option -p n'est pas supportée: utitilse -pg à la place" + +#~ msgid "-mbsd and -pedantic incompatible" +#~ msgstr "-mbsd et -pedantic incompatibles" + +#~ msgid "-mbsd and -mxopen incompatible" +#~ msgstr "-mbsd et -mxopen incompatibles" + +#~ msgid "-mxopen and -pedantic incompatible" +#~ msgstr "-mxopen et -pedantic incompatibles" + +#~ msgid "may not use both -mfp64 and -msingle-float" +#~ msgstr "ne peut utiliser ensemble -mfp64 et -msingle-float" + +#~ msgid "may not use both -mfp64 and -m4650" +#~ msgstr "ne peut utiliser ensemble -mfp64 et -m4650" + +#~ msgid "may not use both -mgp32 and -mfp64" +#~ msgstr "ne peut utiliser ensemble -mfp32 et -mfp64" + +#~ msgid "declaration of `%#T'" +#~ msgstr "déclaration de « %#T »" + +#~ msgid "a -ifile option requires a -map option" +#~ msgstr "l'option -ifile requiert l'option -map" + +#~ msgid "__builtin_trap not supported by this target" +#~ msgstr "__builtin_trap n'est pas supporté par la cible" + +#~ msgid "`%s' previously defined here" +#~ msgstr "« %s » précédemment défini ici" + +#~ msgid "`%s' previously declared here" +#~ msgstr "« %s » précédemment déclaré ici" + +#~ msgid "increment" +#~ msgstr "incrément" + +#~ msgid "decrement" +#~ msgstr "décrément" + +#~ msgid "Usage: %s [switches] input output\n" +#~ msgstr "Usage: %s [options] entrée sortie\n" + +#~ msgid "output_operand: %s" +#~ msgstr "output_operand: %s" + +#~ msgid "invalid %H value" +#~ msgstr "valeur %H invalide" + +#~ msgid "invalid %h value" +#~ msgstr "valeur %h invalide" + +#~ msgid "invalid %Q value" +#~ msgstr "valeur %Q invalide" + +#~ msgid "invalid %q value" +#~ msgstr "valeur %q invalide" + +#~ msgid "invalid %p value" +#~ msgstr "valeur %p invalide" + +#~ msgid "invalid %B value" +#~ msgstr "valeur %B invalide" + +#~ msgid "invalid %C value" +#~ msgstr "valeur %C invalide" + +#~ msgid "invalid %E value" +#~ msgstr "valeur %E invalide" + +#~ msgid "invalid %r value" +#~ msgstr "valeur %r invalide" + +#~ msgid "-march=%s does not support -mips%d" +#~ msgstr "-march=%s ne supporte pas -mips%d" + +#~ msgid "no code label found" +#~ msgstr "pas d'étiquette de code trouvée" + +#~ msgid "profiling does not support code models other than medlow" +#~ msgstr "profilage ne supporte pas le code pour les modèles autre que medlow" + +#~ msgid "%s and profiling conflict: disabling %s" +#~ msgstr "%s avec des conflit de profilage: désactivation de %s" + +#~ msgid "Use function_epilogue()" +#~ msgstr "Utiliser fonction_epilogue()" + +#~ msgid "Do not use function_epilogue()" +#~ msgstr "Ne pas utiliser fonction_epilogue()" + +#~ msgid "%d errors, %d sorries, do granting" +#~ msgstr "%d erreurs, %d plaintes, donner la permission" + +#~ msgid "GNU compiler does not support statically allocated objects" +#~ msgstr "compilateur GNU ne supporte pas les objets alloués de manière statique" + +#~ msgid "causing unhandled exception `%s' (this is flaged only once)" +#~ msgstr "causant l'exception non traité « %s » (ceci est relevé seulement une fois)" + +#~ msgid "range failure (not inside function)" +#~ msgstr "échec sur l'étendue (n'est pas à l'intérieur de la fonction)" + +#~ msgid "possible range failure (not inside function)" +#~ msgstr "échec possible de l'étendue (pas à l'intérique de la fonction)" + +#~ msgid "expression will always cause RANGEFAIL" +#~ msgstr "l'expression causera toujours RENGEFAIL" + +#~ msgid "right hand side of assignment is a mode" +#~ msgstr "côté droit de l'affectation est un mode" + +#~ msgid "bad string length in %s" +#~ msgstr "chaîne de longueur erronée dans %s" + +#~ msgid "mode mismatch in %s expression" +#~ msgstr "non concordance de mode dans l'expression %s" + +#~ msgid "%s expression must be referable" +#~ msgstr "expression %s doit être référable" + +#~ msgid "%s not allowed outside a PROC" +#~ msgstr "%s n'est pas permis en dehors d'une procédure" + +#~ msgid "%s action in PROC with no declared RESULTS" +#~ msgstr "action %s dans la procédure sans RÉSULTATS déclarés" + +#~ msgid "RETURN not allowed outside PROC" +#~ msgstr "RETURN n'est pas permis en dehors d'une procédure" + +#~ msgid "RETURN with a value, in PROC returning void" +#~ msgstr "RETURN avec valeur dans une procédure retournant void" + +#~ msgid "RETURN with no value and no RESULT action in procedure" +#~ msgstr "RETURN sans valeur et sans RÉSULTAT d'action dans la procédure" + +#~ msgid "no label named `%s'" +#~ msgstr "pas d'étiquette nommée « %s »" + +#~ msgid "cannot GOTO label `%s' outside current function" +#~ msgstr "ne peut aller à L'étiquette « %s » en dehors de la fonction courante" + +#~ msgid "no EXITable label named `%s'" +#~ msgstr "pas d'étiquette de sortie portant le nom « %s »" + +#~ msgid "cannot EXIT label `%s' outside current function" +#~ msgstr "ne sortir à l'aide de l'étiquette « %s » en dehors de la fonction courante" + +#~ msgid "ELSE label not within a CASE statement" +#~ msgstr "étiquette du ELSE n'est pas n'est pas à l'intérieur de la déclaration du CASE" + +#~ msgid "multiple default labels found in a CASE statement" +#~ msgstr "étiquettes multiples de défaut dans la déclaration d'un «case»" + +#~ msgid "this is the first ELSE label" +#~ msgstr "ceci est la première étiquette ELSE" + +#~ msgid "label found outside of CASE statement" +#~ msgstr "étiquette trouvée en dehors de la déclaration du CASE" + +#~ msgid "duplicate CASE value" +#~ msgstr "valeur de CASE double" + +#~ msgid "this is the first entry for that value" +#~ msgstr "c'est la première entrée pour cette valeur" + +#~ msgid "CASE value out of range" +#~ msgstr "valeur du CASE hors gamme" + +#~ msgid "empty range" +#~ msgstr "bornes vides" + +#~ msgid "label within scope of cleanup or variable array" +#~ msgstr "étiquette à l'intérieur de la portée du nettoyage ou du tableau de variables" + +#~ msgid "mode in label is not discrete" +#~ msgstr "mode dans l'étiquette n'est pas discret" + +#~ msgid "label not within a CASE statement" +#~ msgstr "étiquette n'est pas à l'intérieur de la déclaration du CASE" + +#~ msgid "lower bound of range must be a discrete literal expression" +#~ msgstr "borne inférieure de l'étendue doit être une expression litérale discrète" + +#~ msgid "upper bound of range must be a discrete literal expression" +#~ msgstr "borne supérieure de l'étendue doit être une expression litérale discrète" + +#~ msgid "CASE label is not valid" +#~ msgstr "étiquette du CASE n'est pas valide" + +#~ msgid "number of CASE selectors does not match the number of CASE label lists" +#~ msgstr "nombre de sélecteurs de CASE ne concorde pas avec la liste des étiquettes du CASE" + +#~ msgid "incomplete CASE - %s not handled" +#~ msgstr "CASE incomplet - %s n'est pas traité" + +#~ msgid "CASE selector with variable range" +#~ msgstr "sélecteur du CASE avec un étendue variable" + +#~ msgid "too many cases to do CASE completeness testing" +#~ msgstr "trop de cas pour la complétion de tests du CASE" + +#~ msgid "type of tuple cannot be implicit in multiple assignent" +#~ msgstr "type de tuple ne peut être implicite dans de multiples affectations" + +#~ msgid "conditional expression cannot be used in multiple assignent" +#~ msgstr "expression conditionnelle ne peut être utilisé dans de multiples affectations" + +#~ msgid "internal error - unknown type in multiple assignment" +#~ msgstr "erreur interne - type inconnu dans une affectation multiple" + +#~ msgid "no operator allowed in multiple assignment," +#~ msgstr "pas d'opérateur permis dans de multiples affectations" + +#~ msgid "location modes in multiple assignment are not equivalent" +#~ msgstr "modes de localisation dans de multiples affectations ne sont pas équivalents" + +#~ msgid "you may not assign a value to a BUFFER or EVENT location" +#~ msgstr "vous pouvez affecter une valeur à la localisation d'un TAMPON ou d'un ÉVÉNEMENT " + +#~ msgid "can't assign value to READonly location" +#~ msgstr "ne peut affecter une valeur à une localisation en mode LECTURE seulement" + +#~ msgid "cannot assign to location with non-value property" +#~ msgstr "ne peut affecter une localisation avec une propriété sans valeur" + +#~ msgid "lefthand side of assignment is not a location" +#~ msgstr "côté gauche de l'affectation n'est pas un localisation" + +#~ msgid "bitstring slice" +#~ msgstr "tranche d'une chaîne de bits" + +#~ msgid "LENGTH on left-hand-side is non-portable" +#~ msgstr "LONGUEUR sur le côté droit n'est pas portable" + +#~ msgid "can only set LENGTH of array location" +#~ msgstr "peut seulement fixer la LONGUEUR de la localisation d'un tableau" + +#~ msgid "internal error: trying to make loc-identity with non-location" +#~ msgstr "erreur interne: tentative de créer une identité de localisation avec une non localisation" + +#~ msgid "cannot convert to a boolean mode" +#~ msgstr "ne peut convertir en un mode booléen" + +#~ msgid "cannot convert to a char mode" +#~ msgstr "ne peut convertir en mode caractère" + +#~ msgid "powerset tuple element out of range" +#~ msgstr "élément du tuple du powerset est hors gamme" + +#~ msgid "incompatible member of powerset tuple (at position #%d)" +#~ msgstr "membre incompatible du tuple du powerset ( à la position #%d)" + +#~ msgid "non-constant value for tag field `%s'" +#~ msgstr "valeur non constante pour l'étiquette de champ « %s »" + +#~ msgid "field `%s' in wrong variant" +#~ msgstr "champ « %s » dans un variant erroné" + +#~ msgid "missing variant fields (at least `%s')" +#~ msgstr "champs variants manquants (au moins « %s »)" + +#~ msgid "bad initializer for field `%s'" +#~ msgstr "initialiseur erroné pour le champ « %s »" + +#~ msgid "no initializer value for variant field `%s'" +#~ msgstr "pas de valeur d'initialiseur pour le champ « %s »" + +#~ msgid "no selected variant" +#~ msgstr "pas de variant sélectionné" + +#~ msgid "mixture of labelled and unlabelled tuple elements" +#~ msgstr "mélange de tuple d'éléments étiquettés et non étiquettés" + +#~ msgid "probably not a structure tuple" +#~ msgstr "probablement pas une structure de tuple" + +#~ msgid "excess initializer for field `%s'" +#~ msgstr "débordement de l'initialiseur pour le champ « %s »" + +#~ msgid "excess unnamed initializers" +#~ msgstr "débordement d'initialiseurs sans nom" + +#~ msgid "non-constant start index for tuple" +#~ msgstr "index de départ du tuple n'est pas une constante" + +#~ msgid "invalid array tuple label" +#~ msgstr "étiquette invalide d'un tuple de tableau" + +#~ msgid "non-constant array tuple index range" +#~ msgstr "étendue de l'index du tableau de tuples n'est pas une constante" + +#~ msgid "incompatible array tuple element %s" +#~ msgstr "élément incompatible du tableau de tuples %s" + +#~ msgid "multiple (*) or (ELSE) array tuple labels" +#~ msgstr "multiples étiquettes de tuples de tableaux (*) ou (ELSE)" + +#~ msgid "empty range in array tuple" +#~ msgstr "étendue vide dans le tableau de tuples" + +#~ msgid "array tuple has duplicate index %s" +#~ msgstr "tableau de tuples a un double index %s" + +#~ msgid "array tuple index out of range" +#~ msgstr "index du tableau de tuples est hors gamme" + +#~ msgid "too many array tuple values" +#~ msgstr "trop de valeurs de tuples de tableaux" + +#~ msgid "dynamic array tuple without (*) or (ELSE)" +#~ msgstr "tuple de tableau dynamique sans (*) ou (ELSE)" + +#~ msgid "missing array tuple element %s" +#~ msgstr "élément de tuple de tableau manquant %s" + +#~ msgid "missing array tuple elements %s : %s" +#~ msgstr "éléments de tuple de tableau manquant %s : %s" + +#~ msgid "initializer is not an array or string mode" +#~ msgstr "initialiseur n'est pas en mode tableau ou chaîne" + +#~ msgid "destination is too small" +#~ msgstr "destination trop petite" + +#~ msgid "internal error: unknown type of expression" +#~ msgstr "erreur interne: type d'expression inconnue" + +#~ msgid "`%s' must not be declared readonly" +#~ msgstr "« %s » ne doit pas être déclaré en lecture seulement" + +#~ msgid "declaration of readonly variable without initialization" +#~ msgstr "déclaration d'une variable en lecture seuelement sans initialisation" + +#~ msgid "no initialization allowed for `%s'" +#~ msgstr "pas d'initialisation permise pour « %s »" + +#~ msgid "value for loc-identity `%s' is not a location" +#~ msgstr "valeur pour l'identité de localisation « %s » n'est pas une localisation" + +#~ msgid "location for `%s' not read-compatible" +#~ msgstr "localisation pour « %s » n'est pas compatible en lecture" + +#~ msgid "nonconstant initializer for `%s'" +#~ msgstr "initialiseur n,est pas un constante pour « %s »" + +#~ msgid "do_decl: internal error: don't know what to initialize" +#~ msgstr "do_decl: erreur interne: ne sait pas quoi initialiser" + +#~ msgid "RECURSIVE PROCs" +#~ msgstr "PROCÉDURES RÉCURSIVES" + +#~ msgid "`%s' must not be READonly" +#~ msgstr "« %s » ne doit pas être en lecture seulement" + +#~ msgid "POS may not be specified for a list of field declarations" +#~ msgstr "POS ne peut pas être spécifiés pour une liste de déclarations de champs" + +#~ msgid "(ELSE) case label as well as ELSE variant" +#~ msgstr "étiquette du cas (ELSE) aussi bien que le ELSE variant" + +#~ msgid "inconsistent modes between labels and tag field" +#~ msgstr "modes inconsistents entre les étiquettes et le champ étiquette" + +#~ msgid "too few tag labels" +#~ msgstr "pas assez d'étiquettes" + +#~ msgid "too many tag labels" +#~ msgstr "trop d'étiquettes" + +#~ msgid "case label lower limit is not a discrete constant expression" +#~ msgstr "limite inférieure de l'étiquette du CASE n'est pas une expression d'une constante discrète" + +#~ msgid "case label upper limit is not a discrete constant expression" +#~ msgstr "limite supérieure de l'étiquette du CASE n'est pas une expression d'une constante discrète" + +#~ msgid "case label must be a discrete constant expression" +#~ msgstr "l'étiquette du CASE doit être une expression de constante discrète" + +#~ msgid "variant label declared here..." +#~ msgstr "étiquette variante déclarée ici..." + +#~ msgid "...is duplicated here" +#~ msgstr "...est dupliqué ici" + +#~ msgid "no field (yet) for tag %s" +#~ msgstr "pas de champ (encore) pour l'étiquette %s" + +#~ msgid "non-value mode may only returned by LOC" +#~ msgstr "mode non-valeur peut seulement être retourné par LOC" + +#~ msgid "`%s' may only be passed by LOC" +#~ msgstr "« %s » peut seulement être passé par LOC" + +#~ msgid "nothing named `%s' to grant" +#~ msgstr "rien de nommé « %s » à autoriser" + +#~ msgid "duplicate grant for `%s'" +#~ msgstr "duplication autorisée pour « %s »" + +#~ msgid "duplicate definition `%s'" +#~ msgstr "double définition de « %s »" + +#~ msgid "previous definition of `%s'" +#~ msgstr "définition précédente de « %s »" + +#~ msgid "ambiguous choice for seize `%s' -" +#~ msgstr "¨choix ambigu pour évaluer « %s » -" + +#~ msgid " - can seize this `%s' -" +#~ msgstr " - peut évaluer ceci « %s » -" + +#~ msgid " - or this granted decl `%s'" +#~ msgstr " - ou cette decl « %s » autorisé" + +#~ msgid "enumerator value for `%s' is less than 0" +#~ msgstr "valeur de l'énumérateur pour « %s » est plus petit que 0" + +#~ msgid "enumerators `%s' and `%s' have equal values" +#~ msgstr "énumérateurs « %s » et « %s » ont les mêmes valeurs" + +#~ msgid "undefined value in SET mode is obsolete and deprecated" +#~ msgstr "valeur non définie dans le mode SET est obsolète" + +#~ msgid "BASE variable never declared" +#~ msgstr "variable de BASE jamais déclarée" + +#~ msgid "cannot BASE a variable on a PROC/PROCESS name" +#~ msgstr "ne peut établir une variable sur le nom du PROC/PROCESSUS" + +#~ msgid "INTERNAL ERROR: handle_one_level is broken" +#~ msgstr "ERREUR INTERNE: handle_one_level est brisé" + +#~ msgid "tuple without specified mode not allowed in %s" +#~ msgstr "tuple sans mode spécifié n'est pas permis dans %s" + +#~ msgid "conditional expression not allowed in %s" +#~ msgstr "expression conditionnelle n'est pas permise dans « %s »" + +#~ msgid "internal error: unknown expression mode in %s" +#~ msgstr "erreur interne: mode d'expression inconnnu dans %s" + +#~ msgid "CASE selector is not a discrete expression" +#~ msgstr "sélecteur du CASE n'est pas une expression discrète" + +#~ msgid "The number of CASE selectors does not match the number of CASE label lists" +#~ msgstr "Le nombre de sélecteurs de CASE ne concordent pas avec le nombre de listes d'étiquettes du CASE" + +#~ msgid "powerset is not addressable" +#~ msgstr "powerset n'est pas adressable" + +#~ msgid "array is not addressable" +#~ msgstr "tableau n'est pas adressable" + +#~ msgid "too few arguments in call to `%s'" +#~ msgstr "pas assez d'argument pour l'appel de « %s »" + +#~ msgid "too many arguments in call to `%s'" +#~ msgstr "trop d'arguments pour l'appel de « %s »" + +#~ msgid "cannot dereference, not a pointer" +#~ msgstr "ne peut déréférencer, n'est pas un pointeur" + +#~ msgid "missing '.' operator or undefined mode name `%s'" +#~ msgstr "opérateur «.» manquant ou nom de mode « %s » indéfini" + +#~ msgid "you have forgotten the '.' operator which must" +#~ msgstr "vous avez oublié l'opérateur «.» lequel doit être" + +#~ msgid " precede a STRUCT field reference, or `%s' is an undefined mode" +#~ msgstr " précède une référence sur champ STRUCT ou « %s » est un mode indéfini" + +#~ msgid "invalid type argument of `->'" +#~ msgstr "type d'argument invalide de «->»" + +#~ msgid "operand of '.' is not a STRUCT" +#~ msgstr "l'opérande de '.« n»est pas un STRUCT" + +#~ msgid "no field named `%s'" +#~ msgstr "pas de champ nommé « %s »" + +#~ msgid "ABS argument must be discrete or real mode" +#~ msgstr "argument ABS doit être en mode discret ou réel" + +#~ msgid "argument %d to ABSTIME must be of integer type" +#~ msgstr "argument %d à ABSTIME doit être un type entier" + +#~ msgid "parameter 1 must be referable" +#~ msgstr "paramètre 1 doit pouvoir être référencé" + +#~ msgid "parameter 2 must be a positive integer" +#~ msgstr "paramètre 2 doit être un entier positif" + +#~ msgid "CARD argument must be powerset mode" +#~ msgstr "argument CARD doit être un mode powerset" + +#~ msgid "expression for DESCR-built-in must be referable" +#~ msgstr "expression pour DESCR-built-in doit pouvoir être référencé" + +#~ msgid "argument to `%s' must be of integer type" +#~ msgstr "argument de « %s » doit être de type entier" + +#~ msgid "argument 1 to `%s' must be of floating point mode" +#~ msgstr "argument 1 de « %s » doit être en mode virgule flottante" + +#~ msgid "first argument to `%s' must be a mode" +#~ msgstr "premier argument de « %s » doit être un mode" + +#~ msgid "READonly modes for %s must have a value" +#~ msgstr "mode LECTRURE seulement pour %s doit avoir une valeur" + +#~ msgid "argument to TERMINATE must be a reference primitive value" +#~ msgstr "argument à TERMINATE doit être une référence à une valeur primitive" + +#~ msgid "argument 1 to INTTIME must be of mode TIME" +#~ msgstr "argument 1 de INTTIME doit être de mode TIME" + +#~ msgid "LENGTH argument must be string, buffer, event mode, text location or mode" +#~ msgstr "LONGUEUR de l'argument doit être une chaîne, un tampon, un mode d'événement, la localisation d'un texte ou un mode" + +#~ msgid "UPPER argument must have a mode, or be a mode" +#~ msgstr "argument du HAUT doit avoir un mode ou être un mode" + +#~ msgid "LOWER argument must have a mode, or be a mode" +#~ msgstr "argument du BAS doit avoir un mode ou être un mode" + +#~ msgid "UPPER argument must be string, array, mode or integer" +#~ msgstr "argument du HAUT doit être une chaîne, un tableau, un mode ou un entier" + +#~ msgid "LOWER argument must be string, array, mode or integer" +#~ msgstr "argument du BAS doit être une chaîne, un tableau, un mode ou un entier" + +#~ msgid "%s argument must be POWERSET mode" +#~ msgstr "argument %s doit être un mode POWERSET" + +#~ msgid "%s called for empty POWERSET" +#~ msgstr "%s appelé pour un POWERSET vide" + +#~ msgid "argument to NUM is not discrete" +#~ msgstr "argument à NUM n'est pas discret" + +#~ msgid "no integer mode which matches expression's mode" +#~ msgstr "pas de mode entier concordant au mode de l'expresion" + +#~ msgid "NUM's parameter is below its mode range" +#~ msgstr "paramètre NUMÉRIQUE est en dessous de l'étendue de son mode" + +#~ msgid "NUM's parameter is above its mode range" +#~ msgstr "paramètre NUMÉRIQUE est au dessus de l'étendue de son mode" + +#~ msgid "cannot take SUCC or PRED of a numbered SET" +#~ msgstr "ne peut prendre le SUIVANT ou le PRÉCÉDENT d'un ensemble énuméré" + +#~ msgid "SUCC or PRED must not be done on a PTR" +#~ msgstr "SUIVANT ou PRÉCÉDENT ne peuvent être pris sur un PTR" + +#~ msgid "SUCC or PRED for a reference type is not standard" +#~ msgstr "SUIVANT ou PRÉCÉDENT pour un type référencé n'est pas standard" + +#~ msgid "SUCC or PRED argument must be a discrete mode" +#~ msgstr "SUIVANT ou PRÉCÉDENT comme argument doit être en mode discret" + +#~ msgid "taking the %s of a value already at its %s value" +#~ msgstr "prendre le %s d'une valeur déjà à sa %s valeur" + +#~ msgid "size applied to a function mode" +#~ msgstr "taille appliquée au mode de la fonction" + +#~ msgid "sizeof applied to a void mode" +#~ msgstr "sizeof appliqué sur un mode void" + +#~ msgid "sizeof applied to an incomplete mode" +#~ msgstr "sizeof appliqué sur un mode incomplet" + +#~ msgid "cannot call a PROCESS, you START a PROCESS" +#~ msgstr "ne peut lancer un PROCESSUS, vous devez lancer le PROCESSUS" + +#~ msgid "%s parameter %d must be a location" +#~ msgstr "%s paramètre %d doit être une localisation" + +#~ msgid "%s parameter %d is READ-only" +#~ msgstr "%s paramètre %d est en mode LECTURE seulement" + +#~ msgid "LOC actual parameter %d is a non-referable location" +#~ msgstr "LOCALISATION du paramètre actuel %d est dans une localisation non référençable" + +#~ msgid "mode mismatch in parameter %d" +#~ msgstr "non concordance du mode dans le paramètre %d" + +#~ msgid "too many arguments to procedure `%s'" +#~ msgstr "trop d'arguments pour la procédure « %s »" + +#~ msgid "too many arguments to procedure" +#~ msgstr "trop d'arguments pour la procédure" + +#~ msgid "too few arguments to procedure `%s'" +#~ msgstr "pas assez d'argument pour la procédure « %s »" + +#~ msgid "too few arguments to procedure" +#~ msgstr "trop peu d'arguments pour la procédure" + +#~ msgid "syntax error (integer used as function)" +#~ msgstr "erreur de syntaxe (entier utilisé comme un fonction)" + +#~ msgid "syntax error - missing operator, comma, or '('?" +#~ msgstr "erreur de syntaxe - opérateur manquant virgule ou «(»?" + +#~ msgid "unimplemented built-in function `%s'" +#~ msgstr "fonction interne non implantée « %s »" + +#~ msgid "internal error - bad built-in function `%s'" +#~ msgstr "erreur interne - mauvaise fonction interne « %s »" + +#~ msgid "empty expression in string index" +#~ msgstr "expression vide dans la chaîne d'index" + +#~ msgid "only one expression allowed in string index" +#~ msgstr "seul un expression est permise dans une chaîne d'index" + +#~ msgid "invalid: primval ( untyped_exprlist )" +#~ msgstr "invalide: primval ( untyped_exprlist )" + +#~ msgid "operand is variable-size bitstring/power-set" +#~ msgstr "opérande est de taille variable bitstring/power-set" + +#~ msgid "tree code `%s' unhandled in build_compare_set_expr" +#~ msgstr "code de l'arbre « %s » n'est pas traitée dans build_compare_set_expr" + +#~ msgid "incompatible modes in concat expression" +#~ msgstr "modes incompatibles dans l'expression de concaténation" + +#~ msgid "invalid operation on array of chars" +#~ msgstr "opération invalide pour des tableaux de caractères" + +#~ msgid "comparison of variant structures is unsafe" +#~ msgstr "comparaison de structures variantes n'est pas sûre" + +#~ msgid "compare with variant records" +#~ msgstr "comparaison avec des enregistrements vairants" + +#~ msgid "incompatible operands to %s" +#~ msgstr "type d'opérandes incompatibles pour %s" + +#~ msgid "relational operator not allowed for this mode" +#~ msgstr "opérateur relationnel n'est pas permis pour ce mode" + +#~ msgid "cannot use %s operator on PROC mode variable" +#~ msgstr "ne peut utiliser l'opérateur %s pour une variable en mode PROCÉDURE" + +#~ msgid "invalid left operand of %s" +#~ msgstr "opérande de gauche invalide pour %s" + +#~ msgid "invalid right operand of %s" +#~ msgstr "opérande de droite invalide pour %s" + +#~ msgid "repetition expression must be constant" +#~ msgstr "répétitions d'expressions doit être une constante" + +#~ msgid "left argument to MOD/REM operator must be integral" +#~ msgstr "argument de gauche de l'opérateur MOD/REM doit être entier" + +#~ msgid "right argument to MOD/REM operator must be integral" +#~ msgstr "argument de droite de l'opérateur MOD/REM doit être entier" + +#~ msgid "right operand of IN is not a powerset" +#~ msgstr "l'opérande de droite de IN n'est pas un POWERSET" + +#~ msgid "left operand of IN incompatible with right operand" +#~ msgstr "opérande de gauche de IN incompatible avec l'opérande de droite" + +#~ msgid "-> operator not allow in constant expression" +#~ msgstr "opérateur -> n'est pas permis dans l'expression d'une constante" + +#~ msgid "taking the address of a function is non-standard" +#~ msgstr "prendre l'adresse d'une fonction n'est pas standard" + +#~ msgid "ADDR requires a LOCATION argument" +#~ msgstr "ADDR requiert un argument de LOCALISATION" + +#~ msgid "-> expression is not addressable" +#~ msgstr "expression -> n'est pas adressable" + +#~ msgid "ADDR parameter must be a LOCATION" +#~ msgstr "paramètre ADDR doit être une LOCALISATION" + +#~ msgid "possible internal error in build_chill_arrow_expr" +#~ msgstr "erreur interne possible dans build_chill_arrow_expr" + +#~ msgid "%s is not addressable" +#~ msgstr "%s n'est pas adressable" + +#~ msgid "repetition count is not an integer constant" +#~ msgstr "compteur de répétition n'est pas une constante entière" + +#~ msgid "repetition count < 0" +#~ msgstr "compteur de répétition > que 0" + +#~ msgid "repetition value not constant" +#~ msgstr "valeur de répétition n'est pas une constante" + +#~ msgid "bitstring repetition of non-constant boolean" +#~ msgstr "répétition de chaîne de bits d'un booléen non constant" + +#~ msgid "string repetition operand is non-constant bitstring" +#~ msgstr "opérande de répétition de chaînes n'est pas une contante de chaîne de bits" + +#~ msgid "non-char, non-bit string repetition" +#~ msgstr "répétition de chaîne n'est pas de caractères ni de bits" + +#~ msgid "right operand of %s is not array of boolean" +#~ msgstr "opérande de droite de %s n'est pas un tableau de booléens" + +#~ msgid "%s operator applied to boolean variable" +#~ msgstr "opérateur %s appliqué à une variable booléenne" + +#~ msgid "non-boolean mode in conditional expression" +#~ msgstr "mode non booléen dans l'expression conditionnelle" + +#~ msgid "decode_constant: invalid component_ref" +#~ msgstr "decode_constant: component_ref invalide" + +#~ msgid "decode_constant: mode and value mismatch" +#~ msgstr "decode_constant: mode et valeur ne concordent pas" + +#~ msgid "decode_constant: cannot decode this mode" +#~ msgstr "decode_constant: ne peut décoder ce mode" + +#~ msgid "decode_constant_selective: mode and value mismatch" +#~ msgstr "decode_constant_selective: mode et value ne concorde pas" + +#~ msgid "decode_constant_selective: cannot decode this mode" +#~ msgstr "decode_constant_selective: ne peut décoder ce mode" + +#~ msgid "FORBID is not yet implemented" +#~ msgstr "FORBID n'est pas encore implantée" + +#~ msgid "function \"really_grant_this\" called for `%s'" +#~ msgstr "fonction «really_grant_this» appelée pour « %s »" + +#~ msgid "non-integral text length" +#~ msgstr "longueur de texte non entier" + +#~ msgid "non-constant text length" +#~ msgstr "longueur de texte non constante" + +#~ msgid "text length must be greater than 0" +#~ msgstr "la longueur de texte doit être plus grande que 0" + +#~ msgid "argument %d of %s must be of mode ASSOCIATION" +#~ msgstr "argument %d de %s doit être de mode ASSOCIATION" + +#~ msgid "argument %d of %s must be a location" +#~ msgstr "argument %d de %s doit être une localisation" + +#~ msgid "argument 2 of ASSOCIATE must not be an empty string" +#~ msgstr "argument 2 de ASSOCIATE ne doit pas être une chaîne vide" + +#~ msgid "argument 2 to ASSOCIATE must be a string" +#~ msgstr "argument 2 de ASSOCIATE doit être une chaîne" + +#~ msgid "argument 3 to ASSOCIATE must be a string" +#~ msgstr "argument 3 de ASSOCIATE doit être une chaîne" + +#~ msgid "too many arguments in call to MODIFY" +#~ msgstr "trop d'arguments dans l'appel de MODIFY" + +#~ msgid "argument 2 of MODIFY must not be an empty string" +#~ msgstr "argument 2 de MODIFY ne doit pas être une chaîne vide" + +#~ msgid "argument 2 to MODIFY must be a string" +#~ msgstr "argument 2 de MODIFY doit être une chaîne" + +#~ msgid "argument 3 to MODIFY must be a string" +#~ msgstr "argument 3 de MODIFY doit être une chaîne" + +#~ msgid "argument %d of %s must be an ACCESS or TEXT mode" +#~ msgstr "argument %d de %s doit être de mode ACCESS ou TEXT" + +#~ msgid "argument 4 of CONNECT must be of mode WHERE" +#~ msgstr "argument 4 de CONNECT doit être de mode WHERE" + +#~ msgid "index expression for ACCESS without index" +#~ msgstr "expression d'index pour ACCESS sans index" + +#~ msgid "incompatible index mode" +#~ msgstr "mode incompatible d'index" + +#~ msgid "argument 3 to CONNECT must be of mode USAGE" +#~ msgstr "argument 3 de CONNECT doit être de mode USAGE" + +#~ msgid "argument %d of %s must be of mode ACCESS" +#~ msgstr "argument %d de %s doit être de mode ACCESS" + +#~ msgid "too few arguments in call to `readrecord'" +#~ msgstr "pas assez d'arguments dans l'appel de readrecord()" + +#~ msgid "store location must not be READonly" +#~ msgstr "localisation de stockage ne doit pas être en LECTURE seulement" + +#~ msgid "too few arguments in call to `writerecord'" +#~ msgstr "pas assez d'arguments pour l'appel de writerecord()" + +#~ msgid "transfer to ACCESS without record mode" +#~ msgstr "transfer vers ACCESS sans mode d'enregistrement" + +#~ msgid "argument %d of %s must be of mode TEXT" +#~ msgstr "argument %d de %s doit être de mode TEXT" + +#~ msgid "TEXT doesn't have a location" +#~ msgstr "TEXT n'a pas de localisation" + +#~ msgid "incompatible index mode for SETETEXTACCESS" +#~ msgstr "mode d'index incompatible pour SETETEXTACCESS" + +#~ msgid "incompatible record mode for SETTEXTACCESS" +#~ msgstr "mode d'enregistrement incompatible pour SETTEXTACCESS" + +#~ msgid "parameter 2 must be a location" +#~ msgstr "paramètre 2 doit être une localisation" + +#~ msgid "incompatible modes in parameter 2" +#~ msgstr "modes incompatible dans le paramètre 2" + +#~ msgid "conditional expression not allowed in this context" +#~ msgstr "expression conditionnelle n'est pas permise dans ce contexte" + +#~ msgid "untyped expression as argument %d" +#~ msgstr "expression sans type comme argument %d" + +#~ msgid "cannot process %d bits integer for READTEXT argument %d" +#~ msgstr "ne peut traiter %d bits entiers pour l'argument de READTEXT %d" + +#~ msgid "cannot process %d bits integer WRITETEXT argument %d" +#~ msgstr "ne peut traiter %d bits entiers pour l'argument de WRITETEXT %d" + +#~ msgid "argument %d is READonly" +#~ msgstr "argument %d est en LECTURE seulement" + +#~ msgid "argument %d must be referable" +#~ msgstr "argument %d doit pouvoir être référencé" + +#~ msgid "cannot process argument %d of WRITETEXT, unknown size" +#~ msgstr "ne peut traiter l'argument %d de WRITETEXT, taille inconnue" + +#~ msgid "cannot process mode of argument %d for %sTEXT" +#~ msgstr "ne peut traiter le mode de l'argument %d pour %s de type TEXTE" + +#~ msgid "too few arguments for this format string" +#~ msgstr "trop peu d'arguments pour ce format de chaîne" + +#~ msgid "type of argument %d invalid for conversion code at offset %d" +#~ msgstr "type d'argument %d invalide pour la conversion du code au décalage %d" + +#~ msgid "unmatched open paren" +#~ msgstr "parenthèse ouverte non pairée" + +#~ msgid "bad format specification character (offset %d)" +#~ msgstr "caractère de format de spécification erroné (décalage %d)" + +#~ msgid "repetition factor overflow (offset %d)" +#~ msgstr "débordement du facteur de répétition (décalage %d)" + +#~ msgid "duplicate qualifier (offset %d)" +#~ msgstr "duplication du qualificateur (décalage %d)" + +#~ msgid "clause width overflow (offset %d)" +#~ msgstr "débordement de la largeur de la clause (décalage %d)" + +#~ msgid "no fraction (offset %d)" +#~ msgstr "pas de fraction (décalage %d)" + +#~ msgid "no fraction width (offset %d)" +#~ msgstr "pas de largeur de fraction (décalage %d)" + +#~ msgid "fraction width overflow (offset %d)" +#~ msgstr "débordement de largeur de fraction (décalage %d)" + +#~ msgid "no exponent (offset %d)" +#~ msgstr "pas d'exposant (décalage %d)" + +#~ msgid "no exponent width (offset %d)" +#~ msgstr "pas de largeur d'exposant (décalage %d)" + +#~ msgid "exponent width overflow (offset %d)" +#~ msgstr "débordement de largeur d'exposant (décalage %d)" + +#~ msgid "internal error in check_format_string" +#~ msgstr "erreur interne dans check_format_string" + +#~ msgid "no padding character (offset %d)" +#~ msgstr "pas de caractère de remplissage (décalage %d)" + +#~ msgid "missing index expression" +#~ msgstr "expresion d'index manquante" + +#~ msgid "too few arguments in call to `writetext'" +#~ msgstr "pas assez d'arguments pour l'appel de writext()" + +#~ msgid "argument 1 for WRITETEXT must be a TEXT or CHARS(n) VARYING location" +#~ msgstr "argument 1 de WRITETEXT doit être TEXT ou CHARS(n) VARYING location" + +#~ msgid "`format string' for WRITETEXT must be a CHARACTER string" +#~ msgstr "«format string» pour WRITETEXT doit être une chaîne de caractères" + +#~ msgid "too few arguments in call to `readtext'" +#~ msgstr "trop peu d'arguments dans l'appel de readtext()" + +#~ msgid "argument 1 for READTEXT must be a TEXT location or CHARS(n) [ VARYING ] expression" +#~ msgstr "argument 1 de READTEXT doit être de localisation TEXT ou CHARS(n) [ VARYING ] expression" + +#~ msgid "`format string' for READTEXT must be a CHARACTER string" +#~ msgstr "«format string» de READTEXT doit être une chaîne de caractères" + +#~ msgid "non-constant expression" +#~ msgstr "expression n'est pas une constante" + +#~ msgid "ignoring case upon input and" +#~ msgstr "ignorer la casse durant l'entrée et" + +#~ msgid "making special words uppercase wouldn't work" +#~ msgstr "rendre les mots spéciaux en majuscule ne fonctionnerait pas" + +#~ msgid "making special words uppercase and" +#~ msgstr "rendant les mots spéciaux en majuscule et" + +#~ msgid " ignoring case upon input wouldn't work" +#~ msgstr " ignorer la casse durant ne fonctionnerait pas" + +#~ msgid "invalid C'xx' " +#~ msgstr "C«xx» invalide" + +#~ msgid "malformed exponent part of floating-point literal" +#~ msgstr "partie de l'exposant mal composée du litéral en virgule flottante" + +#~ msgid "real number exceeds range of REAL" +#~ msgstr "nombre réel excède les limites de REAL" + +#~ msgid "end-of-file in '<>' directive" +#~ msgstr "fin de fichier dans la directive «<>»" + +#~ msgid "unrecognized compiler directive" +#~ msgstr "directive du compilateur non reconnue" + +#~ msgid "unrecognized compiler directive `%s'" +#~ msgstr "directive du compilateur « %s » non reconnue" + +#~ msgid "unterminated control sequence" +#~ msgstr "séquence de contrôle non terminée" + +#~ msgid "invalid integer literal in control sequence" +#~ msgstr "chaîne d'entiers invalide dans la séquence de contrôle" + +#~ msgid "control sequence overflow" +#~ msgstr "débordement de la chaîne de contrôle" + +#~ msgid "invalid base in read control sequence" +#~ msgstr "base invalide dans la séquence de contrôle de lecture" + +#~ msgid "unterminated string literal" +#~ msgstr "chaîne litérale non terminée" + +#~ msgid "invalid number format `%s'" +#~ msgstr "format de numéro « %s » invalide" + +#~ msgid "integer literal too big" +#~ msgstr "litéral d'entier trop grand" + +#~ msgid "can't find %s" +#~ msgstr "ne peut repérer %s" + +#~ msgid "USE_SEIZE_FILE directive must be followed by string" +#~ msgstr "directive USE_SEIZE_FILE doit être suivie d'une chaîne" + +#~ msgid "missing `=' in compiler directive" +#~ msgstr "«=» manquant dans la directtive au compilateur" + +#~ msgid "invalid value follows `=' in compiler directive" +#~ msgstr "valeur invalide suivant «=» dans la directive au compilateur" + +#~ msgid "invalid `%c' character in name" +#~ msgstr "caractère «%c» invalide dans le nom" + +#~ msgid "`%s' not integer constant synonym " +#~ msgstr "« %s » n'est pas un synonyme de constante entière" + +#~ msgid "value out of range in compiler directive" +#~ msgstr "valeur hors gamme dans la directive au compilateur" + +#~ msgid "no modules seen" +#~ msgstr "aucun module vu" + +#~ msgid "modeless tuple not allowed in this context" +#~ msgstr "tuple sans modèle n'est pas permis dans ce contexte" + +#~ msgid "IN expression does not have a mode" +#~ msgstr "expression IN n'a pas de mode" + +#~ msgid "location enumeration for BOOLS" +#~ msgstr "localisation d'énumération pour BOOLÉENS" + +#~ msgid "location enumeration for bit-packed arrays" +#~ msgstr "localisation d'énumération tableaux de bits paquetés" + +#~ msgid "loop's IN expression is not a composite object" +#~ msgstr "boucle dans l'expression IN n'est pas un objet composite" + +#~ msgid "start expr must have discrete mode" +#~ msgstr "début de l'expression doit avoir un mode discret" + +#~ msgid "DO FOR start expression is a numbered SET" +#~ msgstr "expression de départ de DO FOR est un SET énuméré" + +#~ msgid "TO expression is a numbered SET" +#~ msgstr "expression TO est un SET énuméré" + +#~ msgid "TO expr must have discrete mode" +#~ msgstr "expression TO doit avoir un mode discret" + +#~ msgid "start expr and TO expr must be compatible" +#~ msgstr "début de l'expression et l'expression TO doivent être compatibles" + +#~ msgid "BY expr must have discrete mode" +#~ msgstr "expression BY doit avoir un mode discret" + +#~ msgid "start expr and BY expr must be compatible" +#~ msgstr "début de l'expression et l'expression BY doivent être compatibles" + +#~ msgid "loop identifier undeclared" +#~ msgstr "identificateur de boucle non déclaré" + +#~ msgid "loop variable incompatible with start expression" +#~ msgstr "variable de boucle incompatible avec le début de l'expression" + +#~ msgid "body of DO FOR will never execute" +#~ msgstr "corps de DO FOR ne sera jamais exécuté" + +#~ msgid "BY expression is negative or zero" +#~ msgstr "expression BY est négative ou zéro" + +#~ msgid "can't iterate through array of BOOL" +#~ msgstr "ne peut faire d'itération à travers le tableau de BOOLÉENS" + +#~ msgid "Can't iterate through array of BOOL" +#~ msgstr "ne peut faire d'itération à travers le tableau de BOOLÉENS" + +#~ msgid "there was no start label to match the end label '%s'" +#~ msgstr "il n'y a pas d'étiquette de départ concordant avec l'étiquette de fin « %s »" + +#~ msgid "start label '%s' does not match end label '%s'" +#~ msgstr "étiquette de départ « %s » ne concorde pas avec l'étiquette de fin « %s »" + +#~ msgid "no RETURN or RESULT in procedure" +#~ msgstr "pas de RETURN ou RESULT dans la procédure" + +#~ msgid "PREFIXED clause with no prelix in unlabeled module" +#~ msgstr "cluase PREFIXÉ sans no prelix dans un module sans étiquette" + +#~ msgid "'%s!' is not followed by an identifier" +#~ msgstr "« %s » n'est pas suivi d'un identificateur" + +#~ msgid "expected a name string here" +#~ msgstr "un nom de chaîne est attendu ici" + +#~ msgid "`%s' undeclared" +#~ msgstr "« %s » non déclaré" + +#~ msgid "action not allowed in SPEC MODULE" +#~ msgstr "action n,est pas permise dans le MODULE SPEC" + +#~ msgid "missing defining occurrence" +#~ msgstr "définition d'occurence manquante" + +#~ msgid "bad defining occurrence following ','" +#~ msgstr "définition d'occurence erronée suivant «,»" + +#~ msgid "missing '(' in exception list" +#~ msgstr "«)» manquante dans la liste d'exceptions" + +#~ msgid "ON exception names must be unique" +#~ msgstr "noms d'exception ON doivent être uniques" + +#~ msgid "syntax error in exception list" +#~ msgstr "erreur de syntaxe dans la liste d'exception" + +#~ msgid "empty ON-condition" +#~ msgstr "condition ON vide" + +#~ msgid "INIT not allowed at loc-identity declaration" +#~ msgstr "INIT n'est pas permis dans la déclaration d'identité de localisation" + +#~ msgid "'=' used where ':=' is required" +#~ msgstr "«=» utilisé où «:=» est requis" + +#~ msgid "loc-identity declaration without initialization" +#~ msgstr "déclaration de loc n'a pas d'initialisation" + +#~ msgid "bad syntax following FORBID" +#~ msgstr "syntaxe erronée suivant FORBID" + +#~ msgid "expected a postfix name here" +#~ msgstr "nom postfixe attendu ici" + +#~ msgid "expected another rename clause" +#~ msgstr "attendait une autre clause de changement de nom" + +#~ msgid "NONREF specific without LOC in result attribute" +#~ msgstr "NONREF spécifique sans LOCALISATION dans l'attribut résultant" + +#~ msgid "DYNAMIC specific without LOC in result attribute" +#~ msgstr "DYNAMIC spécifique sans LOCALISATION dans l'attribut résultant" + +#~ msgid "exception names must be unique" +#~ msgstr "noms d'exceptions doivent être uniques" + +#~ msgid "must specify a PROCESS name" +#~ msgstr "doit spécifier un nom de processus" + +#~ msgid "SIGNAL must be in global reach" +#~ msgstr "SIGNAL doit être dans l'étendue globale" + +#~ msgid "syntax error while parsing signal definition statement" +#~ msgstr "erreur de syntaxe lors de l'analyse syntaxique de la déclaration de la définition" + +#~ msgid "case range list" +#~ msgstr "liste d'étendue du CASE" + +#~ msgid "misplaced colon in case label" +#~ msgstr "«:» mal placés dans l'étiquette du CASE" + +#~ msgid "unrecognized case label list after ','" +#~ msgstr "étiquette non reconnue du CASE après «,»" + +#~ msgid "readonly location modified by 'asm'" +#~ msgstr "localisation en lecture seulement modifiée par «asm»" + +#~ msgid "expected 'TO' in step enumeration" +#~ msgstr "attendait «TO» dans l'énumération du PAS" + +#~ msgid "expected 'IN' in FOR control here" +#~ msgstr "attendait «IN» dans le contrôle du FOR ici" + +#~ msgid "missing DELAY CASE alternative" +#~ msgstr "alternative de délais du CASE manquante" + +#~ msgid "non-referable location in DO WITH" +#~ msgstr "localisation non référençable dans le DO WITH" + +#~ msgid "WITH element must be of STRUCT mode" +#~ msgstr "élément WITH doit être de mode STRUCT" + +#~ msgid "missing ')' in signal/buffer receive alternative" +#~ msgstr "«)» manquant dans la réception alternative de signal/tampon" + +#~ msgid "misplaced 'IN' in signal/buffer receive alternative" +#~ msgstr "«IN» mal placé dans la réception alternative de signal/tampon" + +#~ msgid "missing RECEIVE alternative" +#~ msgstr "RECEIVE alternative manquant" + +#~ msgid "PROCESS copy number must be integer" +#~ msgstr "processus de copie de nombres doit être entier" + +#~ msgid "missing parenthesis for procedure call" +#~ msgstr "parenthèse manquante dans l'appel de procédure" + +#~ msgid "syntax error in action" +#~ msgstr "erreur de syntaxe dans l,action" + +#~ msgid "no handler is permitted on this action" +#~ msgstr "pas de handler permis pour cette action" + +#~ msgid "definition follows action" +#~ msgstr "définition suit l'action" + +#~ msgid "bad tuple field name list" +#~ msgstr "nom erroné de liste de champ de tuple" + +#~ msgid "invalid syntax for label in tuple" +#~ msgstr "syntaxe invalide pour l'étiquette dans le tuple" + +#~ msgid "bad syntax in tuple" +#~ msgstr "syntaxe erronée dans le tuple" + +#~ msgid "non-mode name before tuple" +#~ msgstr "nom sans mode avant le tuple" + +#~ msgid "invalid expression/location syntax" +#~ msgstr "expression/localisation syntaxe invalide" + +#~ msgid "RECEIVE expression" +#~ msgstr "expression RECEIVE" + +#~ msgid "there should not be a ';' here" +#~ msgstr "il ne devrait pas y avoir un «;» ici" + +#~ msgid "missing ELSE/ELSIF in IF expression" +#~ msgstr "ELSE/ELSIF manquant dans l'expresion IF" + +#~ msgid "conditional expression not allowed inside parentheses" +#~ msgstr "expression conditionnelle non permise à l'intérieur des parenthèses" + +#~ msgid "mode-less tuple not allowed inside parentheses" +#~ msgstr "tuple sans modèle n'est pas permis à l'intérieur des parenthèses" + +#~ msgid "mixed numbered and unnumbered set elements is not standard" +#~ msgstr "éléments de l'ensemble numérotés et non numérotés mélangés n'est pas standard" + +#~ msgid "SET mode must define at least one named value" +#~ msgstr "mode SET doit définir au moins une valeur nommée" + +#~ msgid "POS not allowed for ARRAY" +#~ msgstr "POSITION n'est pas permise pour un TABLEAU" + +#~ msgid "bad field name following ','" +#~ msgstr "nom de champ erroné après «,»" + +#~ msgid "expected ':' in structure variant alternative" +#~ msgstr "«:» attendu dans la structure variante alternative" + +#~ msgid "missing field" +#~ msgstr "champ manquant" + +#~ msgid "VARYING bit-strings not implemented" +#~ msgstr "chaîne variante de bits n'est pas implantée" + +#~ msgid "BUFFER modes may not be readonly" +#~ msgstr "modes des TAMPOONS ne peuvent pas être en LECTURE seulement" + +#~ msgid "EVENT modes may not be readonly" +#~ msgstr "modes d'ÉVÉVEMENTS ne peuvent pas être en LECTURE seulement" + +#~ msgid "SIGNAL is not a valid mode" +#~ msgstr "SIGNAL n'est pas un mode valide" + +#~ msgid "syntax error - missing mode" +#~ msgstr "erreur de syntaxe - mode manquant" + +#~ msgid "syntax error - expected a module or end of file" +#~ msgstr "erreur de syntaxe - module attendu ou fin de fichier" + +#~ msgid " `%s', which depends on ..." +#~ msgstr " « %s », laquel dépend de ..." + +#~ msgid "cycle: `%s' depends on ..." +#~ msgstr "cycle: « %s » dépend de ..." + +#~ msgid " `%s'" +#~ msgstr " « %s »" + +#~ msgid "SYN of this mode not allowed" +#~ msgstr "SYN de de mode n'est pas permis" + +#~ msgid "mode of SYN incompatible with value" +#~ msgstr "mode de SYN incompatible avec la valeur" + +#~ msgid "SYN value outside range of its mode" +#~ msgstr "valeur de SYN en dehors de l'étendue de son mode" + +#~ msgid "INIT string too large for mode" +#~ msgstr "chaîne d'INIT trop grande pour ce mode" + +#~ msgid "mode with non-value property in signal definition" +#~ msgstr "mode sans propriété de non valeur dans la définition de signal" + +#~ msgid "RETURNS spec with invalid mode" +#~ msgstr "spécification de RETOUR avec un mode invalide" + +#~ msgid "operand to REF is not a mode" +#~ msgstr "l'opérande de REF n'est pas un mode" + +#~ msgid "field with non-value mode in variant structure not allowed" +#~ msgstr "champ avec un mode non valeur dans une structure variante n'est pas permis" + +#~ msgid "buffer element mode must not have non-value property" +#~ msgstr "mode élément du tampon ne doit pas avoir une propriété de non valeur" + +#~ msgid "recordmode must not have the non-value property" +#~ msgstr "mode d'enregistrement ne doit pas avoir une propriété de non valeur" + +#~ msgid "invalid attribute for argument `%s' (only IN or LOC allowed)" +#~ msgstr "attribue invalide pour l'argument « %s » (seul IN ou LOC est permis)" + +#~ msgid "PROCESS may only be declared at module level" +#~ msgstr "PROCESSUS peut seulement être déclaré au niveau module" + +#~ msgid "process name %s never declared" +#~ msgstr "nom de processus %s n'a jamais été déclaré" + +#~ msgid "you may only START a process, not a proc" +#~ msgstr "vous pouvez seulement LANCER un processus, pas une procédure" + +#~ msgid "SET expression not a location" +#~ msgstr "expression de l'ENSEMBLE n'est pas une localisation" + +#~ msgid "SET location must be INSTANCE mode" +#~ msgstr "localisation de l'ENSEMBLE doit être un mode d'INSTANCE" + +#~ msgid "too many arguments to process `%s'" +#~ msgstr "trop d'arguments à traiter pour « %s »" + +#~ msgid "too many arguments to process" +#~ msgstr "trop d'arguments à traiter" + +#~ msgid "too few arguments to process `%s'" +#~ msgstr "pas assez d'arguments pour traiter « %s »" + +#~ msgid "too few arguments to process" +#~ msgstr "trop peu d'arguments pour le traitement" + +#~ msgid "COPY_NUMBER argument must be INSTANCE expression" +#~ msgstr "argument de COPY_NUMBER doit être une expression d'INSTANCE" + +#~ msgid "GEN_CODE argument must be a process or signal name" +#~ msgstr "argument GEN_CODE doit être une processus ou un nom de signal" + +#~ msgid "GEN_INST parameter 2 must be an integer mode" +#~ msgstr "paramètre 2 de GEN_INST doit être un mode entier" + +#~ msgid "GEN_INST parameter 1 must be a PROCESS or an integer expression" +#~ msgstr "paramètre 1 de GEN_INST doit être une PROCESSUS ou une expression entière" + +#~ msgid "%s is not a declared process" +#~ msgstr "%s n'est pas processus déclaré" + +#~ msgid "PROC_TYPE argument must be INSTANCE expression" +#~ msgstr "argument de PROC_TYPE doit être une expression d'INSTANCE" + +#~ msgid "QUEUE_LENGTH argument must be a BUFFER/EVENT location" +#~ msgstr "argument de QUEUE_LENGTH doit avoir une localisation de TAMPON/ÉVÉNEMENT" + +#~ msgid "SEND requires a SIGNAL; %s is not a SIGNAL name" +#~ msgstr "TRANSMISSION requiert un SIGNAL; %s n'est pas un nom de SIGNAL" + +#~ msgid "too many values for SIGNAL `%s'" +#~ msgstr "trop de valeurs pour le SIGNAL « %s »" + +#~ msgid "too few values for SIGNAL `%s'" +#~ msgstr "pas assez de valeurs pour le SIGNAL « %s »" + +#~ msgid "signal sent without priority" +#~ msgstr "signal transmis sans priorité" + +#~ msgid " and no default priority was set." +#~ msgstr " et aucune priorité par défaut n'a été définie." + +#~ msgid " PRIORITY defaulted to 0" +#~ msgstr " PRIORITÉ par défaut est 0" + +#~ msgid "SEND without a destination instance" +#~ msgstr "TRANSMISSION sans instance de destination" + +#~ msgid " and no destination process specified" +#~ msgstr " et aucune destination de processus spécifiée" + +#~ msgid " for the signal" +#~ msgstr " pour le signal" + +#~ msgid "SEND to ANY copy of process `%s'" +#~ msgstr "TRANSMISSION vers N'IMPORTE QUELLE copie de processus « %s »" + +#~ msgid "SEND TO must be an INSTANCE mode" +#~ msgstr "TRANSMISSION TO doit avoir un mode d'INSTANCE" + +#~ msgid "SEND WITH must have a mode" +#~ msgstr "TRANSMISSION WITH doit avoir un mode" + +#~ msgid "internal error: RECEIVE CASE stack invalid" +#~ msgstr "erreur interne: pile du RECEIVE CASE invalide" + +#~ msgid "SET requires INSTANCE location" +#~ msgstr "ENSEMBLE requiert une INSTANCE de localisation" + +#~ msgid "SIGNAL in RECEIVE CASE alternative follows" +#~ msgstr "SIGNAL dans un CASE de RÉCEPTION alternative suit" + +#~ msgid " a BUFFER name on line %d" +#~ msgstr " un nom de TAMPON sur la ligne %d" + +#~ msgid "SIGNAL `%s' has no data fields" +#~ msgstr "SIGNAL « %s » n'a pas de champs de données" + +#~ msgid "SIGNAL `%s' requires data fields" +#~ msgstr "SIGNAL « %s » requiert des champs de données" + +#~ msgid "too few data fields provided for `%s'" +#~ msgstr "trop peu de champs de données fournies pour « %s »" + +#~ msgid "too many data fields provided for `%s'" +#~ msgstr "trop de champs de données fournis pour « %s »" + +#~ msgid "BUFFER in RECEIVE CASE alternative follows" +#~ msgstr "TAMPON du CASE de RÉCEPTION alternative suit" + +#~ msgid " a SIGNAL name on line %d" +#~ msgstr " un nom de SIGNAL sur la ligne %d" + +#~ msgid "BUFFER in RECEIVE CASE alternative must be a location" +#~ msgstr "TAMPON dans un CASE de RÉCEPTION alternative doit être une localisation " + +#~ msgid "buffer receive alternative requires only 1 defining occurrence" +#~ msgstr "tampon de réception alternatif requiert une seule définition d'occurence" + +#~ msgid "incompatible modes in receive buffer alternative" +#~ msgstr "modes incompatibles dans le tampon alternatif de réception" + +#~ msgid "defining occurrence in receive buffer alternative must be a location" +#~ msgstr "définition d'occurence dans un tampon de réception alternatif doit être une localisation" + +#~ msgid "buffer receive alternative without `IN location'" +#~ msgstr "tampon de réception alternative sans «IN location»" + +#~ msgid "RECEIVE CASE alternative must specify a SIGNAL name or BUFFER location" +#~ msgstr "alternative de RÉCEPTION DE CASE doit spécifier un nom de SIGNAL ou la localisation d'un TAMPON" + +#~ msgid "RECEIVE CASE without alternatives" +#~ msgstr "RÉCEPTION DE CASE sans alternative" + +#~ msgid "CONTINUE requires an event location" +#~ msgstr "CONTINUE requiert une localisation d'événement" + +#~ msgid "PRIORITY must be of integer type" +#~ msgstr "PRIORITÉ doit avoir un type entier" + +#~ msgid "delay alternative must be an EVENT location" +#~ msgstr "délai alternatif doit avoir une localisation d'ÉVÉNEMENT" + +#~ msgid "DELAY CASE without alternatives" +#~ msgstr "DÉLAI du CASE sans alternative" + +#~ msgid "DELAY action requires an event location" +#~ msgstr "DÉLAI d'action requiert une localisation d'événement" + +#~ msgid "PRIORITY in DELAY action must be of integer type" +#~ msgstr "PRIORITÉ dans le DÉLAI d'action doit avoir un type entier" + +#~ msgid "DELAY action without priority." +#~ msgstr "DÉLAI d'action sans priorité" + +#~ msgid "send buffer action requires a BUFFER location" +#~ msgstr "le tampon d'expédition de l'action requiert une localisation de TAMPON" + +#~ msgid "there must be only 1 value for send buffer action" +#~ msgstr "il ne doit y avoir qu'une valeur pour le tampon de transmission d'action" + +#~ msgid "convert failed for send buffer action" +#~ msgstr "échec de voncversion pour le tampon de transmission d'action" + +#~ msgid "incompatible modes in send buffer action" +#~ msgstr "modes incompatibles dans le tampon de transmission d'action" + +#~ msgid "buffer sent without priority" +#~ msgstr "tampon de transmission sans priorité" + +#~ msgid "WITH not allowed for send buffer action" +#~ msgstr "WITH n'est pas permis pour le tampon de transmission d'action" + +#~ msgid "TO not allowed for send buffer action" +#~ msgstr "TO n'est pas permis pour le tampon de transmission d'action" + +#~ msgid "SEND requires a BUFFER; `%s' is not a BUFFER name" +#~ msgstr "SEND requiert un TAMPON; « %s » n'est pas un nom de TAMPON" + +#~ msgid "non-integral max queue size for EVENT/BUFFER mode" +#~ msgstr "taille maximale de queue n'est pas un entier pour un mode ÉVÉNEMENT/TAMPON" + +#~ msgid "non-constant max queue size for EVENT/BUFFER mode" +#~ msgstr "taille maximale de queue n'est pas une constante pour un mode ÉVÉNEMENT/TAMPON" + +#~ msgid "max queue_size for EVENT/BUFFER is not positive" +#~ msgstr "taille maximale de queue pour un ÉVÉNEMENT/TAMPON n'est pas positive" + +#~ msgid "absolute time value must be of mode TIME" +#~ msgstr "valeur absolue de temps doit être du mode TEMPS" + +#~ msgid "duration primitive value must be of mode DURATION" +#~ msgstr "valeur de la durée de la primitive doit être un mode de DURÉE" + +#~ msgid "string length > UPPER (UINT)" +#~ msgstr "longueur de la chaîne > UPPER (UINT)" + +#~ msgid "can only build a powerset from a discrete mode" +#~ msgstr "peut seulement construire un powerset à partir d'un mode discret" + +#~ msgid "non-constant bitstring size invalid" +#~ msgstr "taille du champ de bits n'est pas une constante valide" + +#~ msgid "non-constant powerset size invalid" +#~ msgstr "taille de la non constante du powerset est invalide" + +#~ msgid "array or string index is a mode (instead of a value)" +#~ msgstr "tableau ou chaîne d'index est une mode (au lieu d'une valeur)" + +#~ msgid "index is not an integer expression" +#~ msgstr "index n'est pas une expression entière" + +#~ msgid "index is not discrete" +#~ msgstr "index n'est pas discret" + +#~ msgid "possible internal error - slice argument is neither referable nor constant" +#~ msgstr "erreur interne possible - l'argument de découpage n'est ni référençable ni une constante" + +#~ msgid "bit array slice with non-constant length" +#~ msgstr "découpage de tableau de bits avec une longueur non constante" + +#~ msgid "bitstring slice with non-constant length" +#~ msgstr "découpage de chaîne de bits avec une longueur non constante" + +#~ msgid "slice operation on non-array, non-bitstring value not supported" +#~ msgstr "opération de découpage sur un non tableau ou sur une valeur non chaîne de bits n'est pas supportée" + +#~ msgid "can only take slice of array or string" +#~ msgstr "peut seulement faire le découpage d'un tableau ou d'une chaîne" + +#~ msgid "slice length out-of-range" +#~ msgstr "tranche de la longueur est hors gamme" + +#~ msgid "too many index expressions" +#~ msgstr "trop d'expressions d'index" + +#~ msgid "array index is not discrete" +#~ msgstr "index de tableau n'est pas discret" + +#~ msgid "invalid compound index for bitstring mode" +#~ msgstr "index composé invalide pour un mode chaîne de bits" + +#~ msgid "conversions from variable_size value" +#~ msgstr "conversions à partir de la valeur variable_size" + +#~ msgid "conversions to variable_size mode" +#~ msgstr "conversion vers un mode variable_size" + +#~ msgid "cannot convert to float" +#~ msgstr "ne peut convertir en un type flottant" + +#~ msgid "cannot convert float to this mode" +#~ msgstr "ne peut convertir un flottant vers ce mode" + +#~ msgid "OVERFLOW in expression conversion" +#~ msgstr "DÉBORDEMENT dans la conversion d'expression" + +#~ msgid "overflow (not inside function)" +#~ msgstr "débordement (pas à l'intérieur de la fonction)" + +#~ msgid "possible overflow (not inside function)" +#~ msgstr "débordement possible (pas à l'intérieur de la fonction)" + +#~ msgid "expression will always cause OVERFLOW" +#~ msgstr "expression causera toujours un DÉBORDEMENT" + +#~ msgid "not implemented: constant conversion from that kind of expression" +#~ msgstr "pas implanté: conversion de constante depuis quel sorte d'expression" + +#~ msgid "not implemented: constant conversion to that kind of mode" +#~ msgstr "pas implanté: conversion de constante vers quell sorte de mode" + +#~ msgid "non-standard, non-portable value conversion" +#~ msgstr "non standard, conversion de valeur non portable" + +#~ msgid "location conversion between differently-sized modes" +#~ msgstr "conversion de localisation entre des mode de taille différentes" + +#~ msgid "size %d of BIN too big - no such integer mode" +#~ msgstr "taille %d de BIN trop grand - pas de tel mode entier" + +#~ msgid "BIN in pass 2" +#~ msgstr "BIN dans la passe 2" + +#~ msgid "mode of tuple is neither ARRAY, STRUCT, nor POWERSET" +#~ msgstr "mode du tuple n'est pas ARRAY, STRUCT, ni POWERSET" + +#~ msgid "internal error in chill_root_resulting_mode" +#~ msgstr "erreur interne dans chill_root_resulting_mode" + +#~ msgid "string lengths not equal" +#~ msgstr "longueurs de chaînes inégales" + +#~ msgid "can't do ARRAY assignment - too large" +#~ msgstr "ne peut effectuer une affectation de tableau - trop grand" + +#~ msgid "rhs of array assignment is not addressable" +#~ msgstr "rhs de l'affectation de tableau n'est pas adressable" + +#~ msgid "non-constant expression for BIN" +#~ msgstr "expression n'est pas un constante pour BIN" + +#~ msgid "expression for BIN must not be negative" +#~ msgstr "expression pour BIN ne doit pas être négatif" + +#~ msgid "cannot process BIN (>32)" +#~ msgstr "ne peut traiter BIN (>32)" + +#~ msgid "bounds of range are not compatible" +#~ msgstr "bornes de l'étendue ne sont pas compatibles" + +#~ msgid "negative string length" +#~ msgstr "longueur négative de chaîne" + +#~ msgid "range's lower bound and parent mode don't match" +#~ msgstr "borne inférieure de l'étendue et le mode parent ne concordent pas" + +#~ msgid "range's upper bound and parent mode don't match" +#~ msgstr "borne supérieure de l'étendue et le mode parent ne concordent pas" + +#~ msgid "making range from non-mode" +#~ msgstr "faisant une étendue à partir de non mode" + +#~ msgid "floating point ranges" +#~ msgstr "étendues en virgules flottantes" + +#~ msgid "range mode has non-constant limits" +#~ msgstr "mode d'étendue a des limites non contantes" + +#~ msgid "range's high bound < mode's low bound" +#~ msgstr "borne supérieure de l'étendue < mode de la borne inférieure" + +#~ msgid "range's high bound > mode's high bound" +#~ msgstr "borne supérieure de l'étendue > mode de la borne supérieure" + +#~ msgid "range mode high bound < range mode low bound" +#~ msgstr "borne supérieure de l'étendue < mode de l'étendue la borne inférieure" + +#~ msgid "range's low bound < mode's low bound" +#~ msgstr "borne inférieure de l'étendue < mode de la borne inférieure" + +#~ msgid "range's low bound > mode's high bound" +#~ msgstr "borne inférieure de l'étendue > mode de la borne supérieure" + +#~ msgid "stepsize in STEP must be an integer constant" +#~ msgstr "taille du PAS doit être une contante entière" + +#~ msgid "stepsize in STEP must be > 0" +#~ msgstr "taille du PAS doit être > 0" + +#~ msgid "stepsize in STEP must be the natural width of the array element mode" +#~ msgstr "taille du PAS doit être de largeur naturelle au mode d'éléments du tableau" + +#~ msgid "starting word in POS must be an integer constant" +#~ msgstr "début du mot dans la POSITION doit être une constante entière" + +#~ msgid "starting word in POS must be >= 0" +#~ msgstr "début du mot dans la POSITION doit être >= 0" + +#~ msgid "starting word in POS within STEP must be 0" +#~ msgstr "début du mot dans la POSITION à l'intérieur du PAS doit être 0" + +#~ msgid "starting bit in POS must be an integer constant" +#~ msgstr "bit de départ dans la POSITION doit être une constante entière" + +#~ msgid "starting bit in POS within STEP must be 0" +#~ msgstr "bit de départ dans la POSITION à l'intérieur du PAS doit être 0" + +#~ msgid "starting bit in POS must be >= 0" +#~ msgstr "bit de départ dans la POSITION doit être >= 0" + +#~ msgid "starting bit in POS must be < the width of a word" +#~ msgstr "bit de départ dans la POSITION doit être < que la largeur d'un mot" + +#~ msgid "length in POS must be > 0" +#~ msgstr "longueur dans la POSITION doit être > 0" + +#~ msgid "end bit in POS must be an integer constant" +#~ msgstr "bit final dans la POSITION doit être une constante entière" + +#~ msgid "end bit in POS must be >= the start bit" +#~ msgstr "bit final dans la POSITION doit être >= bit de départ" + +#~ msgid "end bit in POS must be < the width of a word" +#~ msgstr "bit final dans la POSITION doit être < la largeur de mot" + +#~ msgid "the length specified on POS within STEP must be the natural length of the array element type" +#~ msgstr "la longueur spécifié de positionnement à l'intérieur du pas doit être naturelle à la longueur des types des éléments du tableau" + +#~ msgid "step size in STEP must be >= the length in POS" +#~ msgstr "la taille du PAS doit être >= la longueur dans la POSITION" + +#~ msgid "array index must be a range, not a single integer" +#~ msgstr "l'index d'un tableau doit être une étendue, pas un simple entier" + +#~ msgid "array index is not a discrete mode" +#~ msgstr "index du tableau n'a pas un mode discret" + +#~ msgid "the length specified on POS must be the natural length of the field type" +#~ msgstr "la longueur spécifiée de positionnement doit être de longueur naturel au type du champ" + +#~ msgid "STRUCT fields must be layed out in monotonically increasing order" +#~ msgstr "champs STRUCT doit avoir été disposés en ordre monotonique croissant" + +#~ msgid "if one field has a POS layout, then all fields must have a POS layout" +#~ msgstr "si un champ a une disposition de positionnement, alors tous les champs doivent avoir une disposition de positionnement" + +#~ msgid "parameterized structures not implemented" +#~ msgstr "structure paramétrisées ne sont pas implantées" + +#~ msgid "invalid parameterized type" +#~ msgstr "type paramétrisé invalide" + +#~ msgid "abstract virtual `%#D' called from constructor" +#~ msgstr "abstrait virtuel « %#D » appelé à partir d'un constructeur" + +#~ msgid "abstract virtual `%#D' called from destructor" +#~ msgstr "abstrait virtuel « %#D » appelé à partir d'un destructeur" + +#~ msgid "discarding `const' applied to a reference" +#~ msgstr "mis de côté «const» appliqué à une référence" + +#~ msgid "discarding `volatile' applied to a reference" +#~ msgstr "mis de côté «volatile» appliqué à une référence" + +#~ msgid "parser lost in parsing declaration of `%D'" +#~ msgstr "analyseur syntaxique perdu dans l'analyse de la déclaration de «%D»" + +#~ msgid "methods cannot be converted to function pointers" +#~ msgstr "méthode ne peuvent être converties en des pointeurs de fonction" + +#~ msgid "ambiguous request for method pointer `%s'" +#~ msgstr "requête ambigue pour la méthode sur pointeur « %s »" + +#~ msgid "`%T' cannot be `restrict'-qualified" +#~ msgstr "«%T» ne peut être «restrict»-qualified" + +#~ msgid "`%T' cannot be `const'-, `volatile'-, or `restrict'-qualified" +#~ msgstr "«%T» ne peut être «const»-, «volatile»- ou «restrict»-qualified" + +#~ msgid "invalid reference to NULL ptr, use ptr-to-member instead" +#~ msgstr "référence invalide à un pointeur NUL, utiliser pointeur de membre à la place" + +#~ msgid "internal error #%d" +#~ msgstr "erreur interne #%d" + +#~ msgid "can't create cross-reference file `%s'" +#~ msgstr "ne peut produire un fichier de références croisées « %s »" + +#~ msgid "support non-32-bit machines better as of version 0.6" +#~ msgstr "le support des machines n'ayant pas 32 bits est meilleur avec la version 0.6" + +#~ msgid "Extra label definition %A at %0 -- perhaps previous label definition %B at %1 should have CONTINUE statement?" +#~ msgstr "Définition superflue d'étiquette %A à %0 -- peut-être que la définition précédente d'étiquette %B à %1 aurait besoin d'une déclaration CONTINUE?" + +#~ msgid "Extra label definition %A at %0 following label definition %B at %1" +#~ msgstr "Définition superflue d'étiquette %A à %0 après la définition de l'étiquette %B à %1" + +#~ msgid "Continuation indicator at %0 invalid on first non-comment line of file or following END or INCLUDE [info -f g77 M LEX]" +#~ msgstr "Indicateur de continuation à %0 invalide sur la première ligne de non commentaire du fichier ou suivant END ou INCLUDE [info -f g77 M LEX]" + +#~ msgid "Continuation indicator at %0 invalid here [info -f g77 M LEX]" +#~ msgstr "Indicateur de continuation à %0 invalide ici [info -f g77 M LEX]" + +#~ msgid "Non-negative integer at %0 too large" +#~ msgstr "Entier non négatif à %0 trop grand" + +#~ msgid "Integer at %0 too large (%2 has precedence over %1)" +#~ msgstr "Entier à %0 trop grand (%2 a précédence sur %1)" + +#~ msgid "Period at %0 not followed by valid keyword forming a valid binary operator; `.%A.' is not a valid binary operator" +#~ msgstr "Période à %0 n'est pas suivie d'un mot clé valide formant un opérateut binaire valide; «.%A,» n'est pas un opérateur binaire valide" + +#~ msgid "`.%A.' at %0 not a binary operator" +#~ msgstr "«.%A.» n'est pas un opérateur binaire valide" + +#~ msgid "Double-quote at %0 not followed by a string of valid octal digits at %1" +#~ msgstr "Double apostrophe à %0 pas suivi par une chaîne valide de chiffres en octal à %1" + +#~ msgid "Invalid octal constant at %0" +#~ msgstr "constante octale invalide à %0" + +#~ msgid "Invalid binary digit(s) found in string of digits at %0" +#~ msgstr "Chiffre binaire invalide trouvé dans la chaîne de chiffres à %0" + +#~ msgid "Invalid binary constant at %0" +#~ msgstr "constante binaire invalide à %0" + +#~ msgid "Invalid hexadecimal digit(s) found in string of digits at %0" +#~ msgstr "Chiffre hexadécimal invalide trouvé dans la chaîne de chiffres à %0" + +#~ msgid "Invalid hexadecimal constant at %0" +#~ msgstr "constante hexadécimale invalide %0" + +#~ msgid "Invalid octal digit(s) found in string of digits at %0" +#~ msgstr "Chiffre octal invalide trouvé dans la chaîne de chiffres à %0" + +#~ msgid "Invalid radix specifier `%A' at %0 for typeless constant at %1" +#~ msgstr "Spécificateur de base invalide «%A» à %0 pour un constante sans type à %1" + +#~ msgid "Invalid typeless constant at %1" +#~ msgstr "constante sans type invalide à %1" + +#~ msgid "%A part of complex constant at %0 must be a real or integer constant -- otherwise use CMPLX() or COMPLEX() in place of ()" +#~ msgstr "la partie %A de la constante complexe à %0 doit être une constante réelle ou entière -- autrement utiliser CMPLX() ou COMPLEX() à la place de ()" + +#~ msgid "%A part of complex constant at %0 not a real or integer constant" +#~ msgstr "la partie %A de la constante complexe à %0 n'est pas une constante réelle ou entière" + +#~ msgid "Invalid keyword `%%%A' at %0 in this context" +#~ msgstr "mot clé invalide «%%%A» à %0 dans ce contexte" + +#~ msgid "Invalid keyword `%%%A' at %0" +#~ msgstr "mot clé invalide «%%%A» à %0" + +#~ msgid "Null expression between %0 and %1 invalid in this context" +#~ msgstr "expression nulle entre %0 et %1 invalide dans ce contexte" + +#~ msgid "Invalid null expression between %0 and %1" +#~ msgstr "expression null invalide entre %0 et %1" + +#~ msgid "Concatenation operator at %0 must operate on two subexpressions of character type, but neither subexpression at %1 or %2 is of character type" +#~ msgstr "opérateur de concaténation à %0 doit opérer sur deux sous-expressions de type caractère, mais aucune des sous-expressions à %1 ou %2 n'est de type caractère" + +#~ msgid "Invalid operands at %1 and %2 for concatenation operator at %0" +#~ msgstr "Opérandes invalides à %1 et %2 pour l'opérateur de concaténation à %0" + +#~ msgid "Concatenation operator at %0 must operate on two subexpressions of character type, but the subexpression at %1 is not of character type" +#~ msgstr "Opérateur de concaténation à %0 doit opérer sur deux sous-expressions de type caractère, mais la sous-expression à %1 n'est pas de type caractère" + +#~ msgid "Invalid operand at %1 for concatenation operator at %0" +#~ msgstr "Opérande invalide à %1 pour l'opérateur de concaténation à %0" + +#~ msgid "Concatenation operator at %0 must operate on two scalar (not array) subexpressions, two function invocations returning character scalars, or a combination of both -- but the subexpression at %1 is %A" +#~ msgstr "Opérateur de concaténation à %0 doit opérer sur deux sous-expressions scalaires (non pas de tableau), deux invocations de fonctions retournant des caractères scalaires ou une combinaison des deux -- mais la sous-expression à %1 est %A" + +#~ msgid "Invalid operand (is %A) at %1 for concatenation operator at %0" +#~ msgstr "Opérande invalide (est %A) à %1 pour l'opérateur de concaténation à %0" + +#~ msgid "Arithmetic operator at %0 must operate on two subexpressions of arithmetic type, but neither subexpression at %1 or %2 is of arithmetic type" +#~ msgstr "Opérateur arithmétique à %0 doit opérer sur deux sous-expressions de type artihmétique, mais aucune des sous-expressions à %1 ou %2 n'est pas de type arithmétique" + +#~ msgid "Invalid operands at %1 and %2 for arithmetic operator at %0" +#~ msgstr "Opérande invalide à %1 et %2 pour l'opérateur arithmétique à %0" + +#~ msgid "Arithmetic operator at %0 must operate on two subexpressions of arithmetic type, but the subexpression at %1 is not of arithmetic type" +#~ msgstr "Opérateur arithmétique à %0 doit opérer sur deux sous-expressions de type artihmétique, mais la sous-expression à %1 n'est pas de type arithmétique" + +#~ msgid "Invalid operand at %1 for arithmetic operator at %0" +#~ msgstr "Opérande invalide à %1 pour l'opérateur arithmétique à %0" + +#~ msgid "Arithmetic operator at %0 must operate on two scalar (not array) subexpressions, two function invocations returning arithmetic scalars, or a combination of both -- but the subexpression at %1 is %A" +#~ msgstr "Opérateur arithmétique à %0 doit opérer sur deux sous-expressions scalaires (pas de tableau), l'invocation des deux fonctions retournant un scalaire arithmétique ou une combinaison des deux -- mais la sous-expressions à %1 est %A" + +#~ msgid "Invalid operand (is %A) at %1 for arithmetic operator at %0" +#~ msgstr "Opérande invalide (est %A) à %1 pour l'opérateur arithmétique à %0" + +#~ msgid "Character constant at %0 has no closing quote at %1 [info -f g77 M LEX]" +#~ msgstr "Constante caractère à %0 n'a pas de guillemets de fermeture à %1 [info -f g77 M LEX]" + +#~ msgid "Unterminated character constant at %0 [info -f g77 M LEX]" +#~ msgstr "constante de caractères non terminée à %0 [info -f g77 M LEX]" + +#~ msgid "Missing initial `&' on continuation line at %0 [info -f g77 M LEX]" +#~ msgstr "«&» initial manquant sur la ligne de continuation à %0 [info -f g77 M LEX]" + +#~ msgid "Continuation line at %0 invalid because it consists only of a single `&' as the only nonblank character" +#~ msgstr "Ligne de continuation à %0 invalide parce qu'elle contient seulement un simple «&» comme seul caractère non blanc" + +#~ msgid "Invalid continuation line at %0" +#~ msgstr "ligne de continuation invalide à %0" + +#~ msgid "Invalid statement at %0 [info -f g77 M LEX]" +#~ msgstr "Déclaration invalide à %0 [info -f g77 M LEX]" + +#~ msgid "Unrecognized statement name at %0 and invalid form for assignment or statement-function definition at %1" +#~ msgstr "Déclaration de nom non reconnue à %0 et forme invalide pour l'affectation ou la définition de déclaration de fonction à %1" + +#~ msgid "Invalid statement at %0" +#~ msgstr "Déclaration invalide à %0" + +#~ msgid "Invalid form for %A statement at %0" +#~ msgstr "Forme invalide pour la déclaration %A à %0" + +#~ msgid "Invalid %A statement at %0" +#~ msgstr "Déclaration %A invalide à %0" + +#~ msgid "Invalid use of hollerith constant in statement at %0 -- enclose the constant in parentheses (for example, change BACKSPACE 2HAB to BACKSPACE (2HAB))" +#~ msgstr "Utilisation invalide d'une constante Hollerith à la déclaration à %0 -- encapsuler la constante entre parenthèses (par exemple, changer BACKSPACE 2HAB en BACKSPACE (2HAB) )" + +#~ msgid "Invalid I specifier in FORMAT statement at %0" +#~ msgstr "spécificateur I invalide dans la déclaration de FORMAT à %0" + +#~ msgid "Invalid B specifier in FORMAT statement at %0" +#~ msgstr "spécificateur B invalide dans la déclaration de FORMAT à %0" + +#~ msgid "Invalid O specifier in FORMAT statement at %0" +#~ msgstr "spécificateur O invalide dans la déclaration de FORMAT à %0" + +#~ msgid "Invalid Z specifier in FORMAT statement at %0" +#~ msgstr "spécificateur Z invalide dans la déclaration de FORMAT à %0" + +#~ msgid "Invalid F specifier in FORMAT statement at %0" +#~ msgstr "spécificateur F invalide dans la déclaration de FORMAT à %0" + +#~ msgid "Invalid E specifier in FORMAT statement at %0" +#~ msgstr "spécificateur E invalide dans la déclaration de FORMAT à %0" + +#~ msgid "Invalid EN specifier in FORMAT statement at %0" +#~ msgstr "spécificateur EN invalide dans la déclaration de FORMAT à %0" + +#~ msgid "Invalid G specifier in FORMAT statement at %0" +#~ msgstr "spécificateur G invalide dans la déclaration de FORMAT à %0" + +#~ msgid "Invalid L specifier in FORMAT statement at %0" +#~ msgstr "spécificateur L invalide dans la déclaration de FORMAT à %0" + +#~ msgid "Invalid A specifier in FORMAT statement at %0" +#~ msgstr "spécificateur A invalide dans la déclaration de FORMAT à %0" + +#~ msgid "Invalid D specifier in FORMAT statement at %0" +#~ msgstr "spécificateur D invalide dans la déclaration de FORMAT à %0" + +#~ msgid "Invalid Q specifier in FORMAT statement at %0" +#~ msgstr "spécificateur Q invalide dans la déclaration de FORMAT à %0" + +#~ msgid "Invalid $ specifier in FORMAT statement at %0" +#~ msgstr "spécificateur $ invalide dans la déclaration de FORMAT à %0" + +#~ msgid "Invalid P specifier in FORMAT statement at %0" +#~ msgstr "spécificateur P invalide dans la déclaration de FORMAT à %0" + +#~ msgid "Invalid T specifier in FORMAT statement at %0" +#~ msgstr "spécificateur T invalide dans la déclaration de FORMAT à %0" + +#~ msgid "Invalid TL specifier in FORMAT statement at %0" +#~ msgstr "spécificateur TL invalide dans la déclaration de FORMAT à %0" + +#~ msgid "Invalid TR specifier in FORMAT statement at %0" +#~ msgstr "spécificateur TR invalide dans la déclaration de FORMAT à %0" + +#~ msgid "Invalid X specifier in FORMAT statement at %0" +#~ msgstr "spécificateur X invalide dans la déclaration de FORMAT à %0" + +#~ msgid "Invalid S specifier in FORMAT statement at %0" +#~ msgstr "spécificateur S invalide dans la déclaration de FORMAT à %0" + +#~ msgid "Invalid SP specifier in FORMAT statement at %0" +#~ msgstr "spécificateur SP invalide dans la déclaration de FORMAT à %0" + +#~ msgid "Invalid SS specifier in FORMAT statement at %0" +#~ msgstr "spécificateur SS invalide dans la déclaration de FORMAT à %0" + +#~ msgid "Invalid BN specifier in FORMAT statement at %0" +#~ msgstr "spécificateur BN invalide dans la déclaration de FORMAT à %0" + +#~ msgid "Invalid BZ specifier in FORMAT statement at %0" +#~ msgstr "spécificateur BZ invalide dans la déclaration de FORMAT à %0" + +#~ msgid "Invalid : specifier in FORMAT statement at %0" +#~ msgstr "Invalide: spécificateur de déclaration de FORMAT à %0" + +#~ msgid "Invalid H specifier in FORMAT statement at %0" +#~ msgstr "spécificateur H invalide dans la déclaration de FORMAT à %0" + +#~ msgid "Nonletter in defined operator at %0" +#~ msgstr "ne contient pas une non lettre dans l'opérateur défini à %0" + +#~ msgid "Invalid type-declaration attribute at %0" +#~ msgstr "type d'attribut de déclaration invalide à %0" + +#~ msgid "Unrecognized value for character constant at %0 -- expecting %A" +#~ msgstr "valeur non reconnue pour la constante caractère à %0 -- %A attendu" + +#~ msgid "Unrecognized value for character constant at %0" +#~ msgstr "valeur non reconnnue pour la constante caractère à %0" + +#~ msgid "Range specification at %0 invalid -- at least one expression must be specified, or use CASE DEFAULT" +#~ msgstr "spécification d'étendue à %0 invalide -- au moins une expression doit être spécifié ou utiliser CASE DEFAULT" + +#~ msgid "Range specification at %0 invalid" +#~ msgstr "spécification d'étendue à %0 invalide" + +#~ msgid "Useless range at %0" +#~ msgstr "étendue inutile à %0" + +#~ msgid "Invalid kind at %0 for type at %1 -- unsupported or not permitted" +#~ msgstr "sorte invalide à %0 pour le type à %1 -- non supporté ou non permis" + +#~ msgid "Invalid kind at %0 for type at %1" +#~ msgstr "sorte invalide à %0 pour le type à %1" + +#~ msgid "Cannot establish implicit type for initial letter `%A' at %0 -- already explicitly established or used to set implicit type of some name, or backwards order of letters in letter range" +#~ msgstr "ne peut établir un type implicite pour la lettre initiale «%A» à %0 -- déjà explicitement établie ou utilisé pour initialiser un type implicite pour un nom quelconque ou un ordre arrière de lettres dans une étendue de lettres" + +#~ msgid "Cannot establish implicit type for initial letter `%A' at %0" +#~ msgstr "ne peut établir un type implicite pour la lettre initiale «%A» à %0" + +#~ msgid "Label definition %A (at %0) invalid -- must be in columns 1-5" +#~ msgstr "définition d'étiquette %A (à %0) invalide -- doit être en colonnes 1-5" + +#~ msgid "Invalid label definition %A (at %0)" +#~ msgstr "définition d'étiquette invalide %A (à %0)" + +#~ msgid "Run-time expression at %0 in FORMAT statement that does not follow the first executable statement in the program unit -- move the statement" +#~ msgstr "expression lors de l'exécution à %0 dans la déclaration de FORMAT qui ne suit pas la première déclaration exécutable dans l'unité programme -- déplacer la déclaration" + +#~ msgid "FORMAT at %0 with run-time expression must follow first executable statement" +#~ msgstr "FORMAT à %0 dans l'expression lors de l'exécution doit suivre la première déclaration exécutable" + +#~ msgid "Boolean/logical operator at %0 must operate on two subexpressions of logical type, but neither subexpression at %1 or %2 is of logical type" +#~ msgstr "opérateur booléen/logique à %0 doit opérer sur deux sous-expressions de type logique mais aucune des sous-expressions à %1 ou %2 n'est de type logique" + +#~ msgid "Invalid operands at %1 and %2 for boolean operator at %0" +#~ msgstr "opérandes invalides à %1 et %2 pour l'opérateur booléen à %0" + +#~ msgid "Boolean/logical operator at %0 must operate on two subexpressions of logical type, but the subexpression at %1 is not of logical type" +#~ msgstr "opérateur booléen/logique à %0 doit opérer sur deux sous-expressions de type logique mais la sous-expression à %1 n'est pas de type logique" + +#~ msgid "Invalid operand at %1 for boolean operator at %0" +#~ msgstr "opérande invalide à %1 pour l'opérateur booléen à %0" + +#~ msgid "Boolean/logical operator at %0 must operate on two scalar (not array) subexpressions, two function invocations returning logical scalars, or a combination of both -- but the subexpression at %1 is %A" +#~ msgstr "opérateur booléen/logique à %0 doit opérer sur deux sous-expressions de type scalaire (pas tableau), deux invocations de fonction retournant des scalaires logique ou une combinaison des deux -- mais la sous-expression à %1 est %A" + +#~ msgid "Invalid operand (is %A) at %1 for boolean operator at %0" +#~ msgstr "opérande invalide (est %A) à %1 pour l'opérateur booléen à %0" + +#~ msgid ".NOT. operator at %0 must operate on subexpression of logical type, but the subexpression at %1 is not of logical type" +#~ msgstr "opérateur .NOT. à %0 doit opérer sur une sous-expression de type logique mais la sous-expression à %1 n'est pas de type logique" + +#~ msgid "Invalid operand at %1 for .NOT. operator at %0" +#~ msgstr "opérande invalide à %1 pour l'opérateur .NOT. à %0" + +#~ msgid ".NOT. operator at %0 must operate on scalar subexpressions -- but the subexpression at %1 is %A" +#~ msgstr "opérateur .NOT. à %0 doit opérer sur une sous-expression scalaire mais la sous-expression à %1 est %A" + +#~ msgid "Invalid operand (is %A) at %1 for .NOT. operator at %0" +#~ msgstr "opérande invalide (est %A) à %1 pour l'opérateur .NOT. à %0" + +#~ msgid "Equality operator at %0 must operate on two subexpressions of arithmetic or character type, but neither subexpression at %1 or %2 is of arithmetic or character type" +#~ msgstr "opérateur d'égalité à %0 doit opérer sur deux sous-expressions de type artihmétique ou caractère mais aucune des sous-expressions à %1 ou %2 n'est de type arithmétique ou caractère" + +#~ msgid "Invalid operands at %1 and %2 for equality operator at %0" +#~ msgstr "opérandes invalides à %1 et %2 pour l'opérateur d'égalité à %0" + +#~ msgid "Equality operator at %0 must operate on two subexpressions of arithmetic or character type, but the subexpression at %1 is not of arithmetic or character type" +#~ msgstr "opérateur d'égalité à %0 doit opérer sur deux sous-expressions de type artihmétique ou caractère mais la sous-expression à %1 n'est pas de type arithmétique ou caractère" + +#~ msgid "Invalid operand at %1 for equality operator at %0" +#~ msgstr "opérande invalide à %1 pour l'opérateur d'égalité à %0" + +#~ msgid "Equality operator at %0 must operate on two scalar (not array) subexpressions, two function invocations returning arithmetic or character scalars, or a combination of both -- but the subexpression at %1 is %A" +#~ msgstr "opérateur d'égalité à %0 doit opérer sur deux sous-expressions de type scalaire (non pas de tableau), deux invocations de fonction retournant un type arithmétique ou scalaires caractère ou une combinaison des deux mais la sous-expression à %1 est %A" + +#~ msgid "Invalid operand (is %A) at %1 for equality operator at %0" +#~ msgstr "opérande invalide (est %A) à %1 pour l'opérateur d'égalité à %0" + +#~ msgid "Relational operator at %0 must operate on two subexpressions of integer, real, or character type, but neither subexpression at %1 or %2 is of integer, real, or character type" +#~ msgstr "opérateur relationnal à %0 doit opérer sur deux sous-expressions de type entier, réel ou caractère, mais aucune des sous-expression à %1 ou %2 n'est de type entier, réel ou caractère" + +#~ msgid "Invalid operands at %1 and %2 for relational operator at %0" +#~ msgstr "opérandes invalides à %1 et %2 pour l'opérateur relationnel à %0" + +#~ msgid "Relational operator at %0 must operate on two subexpressions of integer, real, or character type, but the subexpression at %1 is not of integer, real, or character type" +#~ msgstr "opérateur relationnal à %0 doit opérer sur deux sous-expressions de type entier, réel ou caractère, mais la sous-expression à %1 n'est pas de type entier, réel ou caractère" + +#~ msgid "Invalid operand at %1 for relational operator at %0" +#~ msgstr "opérande invalide à %1 pour l'opérateur relationnel à %0" + +#~ msgid "Relational operator at %0 must operate on two scalar (not array) subexpressions, two function invocations returning integer, real, or character scalars, or a combination of both -- but the subexpression at %1 is %A" +#~ msgstr "opérateur relationnal à %0 doit opérer sur deux sous-expressions de type scalaire (non pas de tableau), deux invocations de fonction retournant un type entier, réel ou caractère ou une combinaison des deux mais la sous-expression à %1 est %A" + +#~ msgid "Invalid operand (is %A) at %1 for relational operator at %0" +#~ msgstr "opérande invalide (est %A) à %1 pour l'opérateur relationnel à %0" + +#~ msgid "Reference to intrinsic `%A' at %0 invalid -- one or more arguments have incorrect type" +#~ msgstr "référence à l'intrinsèque «%A» à %0 invalide -- un ou plusieurs d'arguments ont un type incorrect" + +#~ msgid "Invalid reference to intrinsic `%A' at %0" +#~ msgstr "référence invalide vers l'intrinsèque «%A» à %0" + +#~ msgid "Too few arguments passed to intrinsic `%A' at %0" +#~ msgstr "trop peu d'arguments passés à l'intrinsèque «%A» à %0" + +#~ msgid "Too few arguments for intrinsic `%A' at %0" +#~ msgstr "trop peu d'arguments passés à l'intrinsèque «%A» à %0" + +#~ msgid "Too many arguments passed to intrinsic `%A' at %0" +#~ msgstr "trop d'arguments passés à l'intrinsèque «%A» à %0" + +#~ msgid "Too many arguments for intrinsic `%A' at %0" +#~ msgstr "trop d'arguments passés à l'intrinsèque «%A» à %0" + +#~ msgid "Reference to disabled intrinsic `%A' at %0" +#~ msgstr "référence à l'intrinsèque désactivé «%A» à %0" + +#~ msgid "Disabled intrinsic `%A' at %0" +#~ msgstr "Désactiver les intrinsèques «%A» à %0" + +#~ msgid "Reference to intrinsic subroutine `%A' as if it were a function at %0" +#~ msgstr "référence à la sous-routine intrinsèque «%A» comme s'il est une fonction à %0" + +#~ msgid "Function reference to intrinsic subroutine `%A' at %0" +#~ msgstr "référence de fonction à la sous-routine intrinsèque «%A» à %0" + +#~ msgid "Reference to intrinsic function `%A' as if it were a subroutine at %0" +#~ msgstr "référence à une fonction intrinsèque «%A» comme s'il est une sous-routine à %0" + +#~ msgid "Subroutine reference to intrinsic function `%A' at %0" +#~ msgstr "référence de sous-routine à la fonction «%A» à %0" + +#~ msgid "Reference to unimplemented intrinsic `%A' at %0 -- use EXTERNAL to reference user-written procedure with this name" +#~ msgstr "référence à un intrinsèque non implanté «%A» à %0 -- utiliser EXTERNAL pour référence la procédure ayant ce nom et écrite par l'usager" + +#~ msgid "Unimplemented intrinsic `%A' at %0" +#~ msgstr "intrinsèque «%A» non implanté à %0" + +#~ msgid "Reference to unimplemented intrinsic `%A' at %0 (assumed EXTERNAL)" +#~ msgstr "référence à un intrinsèque non implanté «%A» à (EXTERNAL assumé)" + +#~ msgid "Unimplemented intrinsic `%A' at %0 (assumed EXTERNAL)" +#~ msgstr "intrinsèque non implantée «%A» à (EXTERNAL assumé)" + +#~ msgid "Attempt to modify variable `%A' at %0 while it serves as DO-loop iterator at %1" +#~ msgstr "Tentative de modification de la variable «%A» à %0 alors qu'il sert à l'itération de la boucle DO à %1" + +#~ msgid "Modification of DO-loop iterator `%A' at %0" +#~ msgstr "Modification de l'itération de la boucle DO «%A» à %0" + +#~ msgid "Attempt to modify variable `%A' via item #%B in list at %0 while it serves as implied-DO iterator at %1" +#~ msgstr "Tentative de modification de la variable «%A» par le biais de l'item #%b dans la liste à %0 alors qu'il sert à l'itération implicite de la boucle DO à %1" + +#~ msgid "Array has too many dimensions, as of dimension specifier at %0" +#~ msgstr "Tableau à trop de dimensions comme spécificateur de dimension à %0" + +#~ msgid "Too many dimensions at %0" +#~ msgstr "trop de dimensions à %0" + +#~ msgid "Unsupported OPEN control item at %0 -- ACTION=, ASSOCIATEVARIABLE=, BLOCKSIZE=, BUFFERCOUNT=, CARRIAGECONTROL=, DEFAULTFILE=, DELIM=, DISPOSE=, EXTENDSIZE=, INITIALSIZE=, KEY=, MAXREC=, NOSPANBLOCKS, ORGANIZATION=, PAD=, POSITION=, READONLY=, RECORDTYPE=, SHARED=, and USEROPEN= are not supported" +#~ msgstr "Item de contrôle OPEN non supporté à %0 -- ACTION=, ASSOCIATEVARIABLE=, BLOCKSIZE=, BUFFERCOUNT=, CARRIAGECONTROL=, DEFAULTFILE=, DELIM=, DISPOSE=, EXTENDSIZE=, INITIALSIZE=, KEY=, MAXREC=, NOSPANBLOCKS, ORGANIZATION=, PAD=, POSITION=, READONLY=, RECORDTYPE=, SHARED= et USEROPEN= ne sont pas supportés" + +#~ msgid "Unsupported OPEN control item at %0" +#~ msgstr "item de contrôle OPEN non supporté à %0" + +#~ msgid "Unsupported INQUIRE control item at %0 -- ACTION=, CARRIAGECONTROL=, DEFAULTFILE=, DELIM=, KEYED=, ORGANIZATION=, PAD=, POSITION=, READ=, READWRITE=, RECORDTYPE=, and WRITE= are not supported" +#~ msgstr "item de contrôle INQUIRE non supporté à %0 -- ACTION=, CARRIAGECONTROL=, DEFAULTFILE=, DELIM=, KEYED=, ORGANIZATION=, PAD=, POSITION=, READ=, READWRITE=, RECORDTYPE= et WRITE= ne sont pas supportés" + +#~ msgid "Unsupported INQUIRE control item at %0" +#~ msgstr "item de contrôle INQUIRE non supporté à %0" + +#~ msgid "Unsupported READ control item at %0 -- ADVANCE=, EOR=, KEYEQ=, KEYGE=, KEYGT=, KEYID=, NULLS=, and SIZE= are not supported" +#~ msgstr "item de contrôle READ non supporté à %0 -- ADVANCE=, EOR=, KEYEQ=, KEYGE=, KEYGT=, KEYID=, NULLS= et SIZE= ne sont pas supportés" + +#~ msgid "Unsupported READ control item at %0" +#~ msgstr "item de contrôle READ non supporté à %0" + +#~ msgid "Unsupported WRITE control item at %0 -- ADVANCE= and EOR= are not supported" +#~ msgstr "item de contrôle WRITE non supporté à %0 -- ADVANCE= et EOR= ne sont pas supportés" + +#~ msgid "Unsupported WRITE control item at %0" +#~ msgstr "item de contrôle WRITE non supporté à %0" + +#~ msgid "Padding of %A %D required before `%B' in common block `%C' at %0 -- consider reordering members, largest-type-size first" +#~ msgstr "Remplissage de %A %D requis avant «%B» dans le bloc commun «%C» à %0 -- considérer reordonner les membres, celui de plus grande taille en premier" + +#~ msgid "Padding of %A %D required before `%B' in common block `%C' at %0" +#~ msgstr "Remplissage de %A %D requis avant «%B» dans le bloc commun «%C» à %0" + +#~ msgid "Type of ENTRY point at %0 to function conflicts with type(s) of previous entrypoint(s) -- must all be identical-length CHARACTER or none be CHARACTER type" +#~ msgstr "Type du point d'entrée à %0 de la fonction est en conflit avec le type de point d'entrée précédent de la fonction -- doit être de longueur indentique ou zéro pour un type caractère" + +#~ msgid "Type of ENTRY point at %0 to function conflicts with type(s) of previous entrypoint(s)" +#~ msgstr "type de point d'entré à %0 à la fonction est en conflit avec le type de point d'entrée précédent de la fonction" + +#~ msgid "Common block `%A' initialized at %0 already initialized at %1 -- only one program unit may specify initial values for a particular common block" +#~ msgstr "bloc commun «%A» initialisé à %0 est déjà initialisé à %1 -- une seule unité de programme peut spécifier les valeurs initiales pour un bloc commun particulier" + +#~ msgid "Common block `%A' initialized at %0 already initialized at %1" +#~ msgstr "bloc commun «%A» initialisé à %0 est déjà initialisé à %1" + +#~ msgid "Initial padding for common block `%A' is %B %C at %0 -- consider reordering members, largest-type-size first" +#~ msgstr "remplissage initial pour le bloc commun «%A» est %B %C à %0 -- considérer réordonner les membres, celui de plus grande taille en premier" + +#~ msgid "Initial padding for common block `%A' is %B %C at %0" +#~ msgstr "remplissage initial pour le bloc commun «%A» est %B %C à %0" + +#~ msgid "Initial padding for common block `%A' is %B %D at %0 but %C %E at %1 -- consider reordering members, largest-type-size first" +#~ msgstr "remplissage initial pour le bloc commun «%A» est %B %D à %0 mais %C %E à %1 -- considérer réordonner les membres, ceux de plus grande taille en premier" + +#~ msgid "Initial padding for common block `%A' is %B %D at %0 but %C %E at %1" +#~ msgstr "remplissage initial pour le bloc commun «%A» est %B %D à %0 mais %C %E à %1" + +#~ msgid "Common block `%A' is initialized to %B %D long at %0 but enlarged to %C %E at %1 -- use consistent definitions or reorder program units in source file" +#~ msgstr "bloc commun «%A» initialisé à un longueur %B %D à %0 mais augmenté à %C %E à %1 -- utiliser des définitions consistantes ou réordonner les unités de programmes dans le fichier source" + +#~ msgid "Common block `%A' is initialized to %B %D long at %0 but enlarged to %C %E at %1" +#~ msgstr "bloc commun «%A» initialisé à un longueur %B %D à %0 mais augmenté à %C %E à %1" + +#~ msgid "DO-variable `%A' is type REAL or DOUBLE PRECISION at %0 -- unexpected behavior likely" +#~ msgstr "variable DO «%A» est de type REEL ou DOUBLE PRECISION à %0 -- comportement inattendue est à prévoir" + +#~ msgid "DO-variable `%A' is type REAL or DOUBLE PRECISION at %0" +#~ msgstr "variable DO «%A» est de type REEL ou DOUBLE PRECISION à %0" + +#~ msgid "Invalid actual argument at %0 -- replace hollerith constants with %%REF('string') and typeless constants with INTEGER constant equivalents, or use -fugly-args or -fugly" +#~ msgstr "argument actuel invalide à %0 -- remplacer les constantes Hollerith avec %%REF('chaÎne') et des constantes sans type avec des équivalents entiers ou utiliser -fugly-args ou -fugly" + +#~ msgid "Invalid actual argument at %0" +#~ msgstr "argument actuel invalide à %0" + +#~ msgid "Quadruple-precision floating-point unsupported -- treating constant at %0 as double-precision" +#~ msgstr "virgule flottante en quadruple précision non supporté -- tratement de la constante à %0 en double précision" + +#~ msgid "Quadruple-precision floating-point unsupported" +#~ msgstr "virgule flottante en quadruple précision non supporté" + +#~ msgid "Initialization of large (%B-unit) aggregate area `%A' at %0 currently very slow and takes lots of memory during g77 compile -- to be improved in 0.6" +#~ msgstr "initialisation d'une large zone aggrégat (unit %B) «%A» à %0 couramment lente et prenant beaucoup de mémoire durant la compilation g77 -- à être amélioré dans 0.6" + +#~ msgid "This could take a while (initializing `%A' at %0)..." +#~ msgstr "Cela pourrait prendre du temps (initialisation «%A» à %0)..." + +#~ msgid "can't to open %s" +#~ msgstr "ne peut ouvrir %s" + +#~ msgid "Set class path and suppress system path" +#~ msgstr "Initialiser le chemin des classes et supprimer le chemin systèmes" + +#~ msgid "" +#~ msgstr "" + +#~ msgid "hard register `%s' listed as input operand to `asm'" +#~ msgstr "registre matériel `%s' est listé comme une opérande d'entrée à `asm'" + +#~ msgid "floating point trap outputting a constant" +#~ msgstr "la trappe en virgule flottante produit une constante" + +#~ msgid "no file-scope type named `%D'" +#~ msgstr "pas de type de portée de fichier nommé `%D'" + +#~ msgid "%T is not a class type" +#~ msgstr "« %T » n'est pas un type de classe" + +#~ msgid "base clause without member specification for `%#T'" +#~ msgstr "clause de base sans spécification de membre pour `%#T'" + +#~ msgid "non-`union' tag used in declaring `%#T'" +#~ msgstr "étiquette non-`union' utilisé dans la déclaration de `%#T'" + +#~ msgid "invalid use of %D" +#~ msgstr "utilisation invalide de %D" + +#~ msgid "return value from function receives multiple initializations" +#~ msgstr "valeur retournée de la fonction reçoit de multiples initialisations" + +#~ msgid "Can't use '$' as a separator for inner classes" +#~ msgstr "Ne peut utiliser '$' comme séparateur pour des classes internes" + +#~ msgid "-mlong32 and -mlong64 can not both be specified" +#~ msgstr "-mlong32 et -mlong64 ne peuvent être spécifiés ensembles." + +#~ msgid "type with more precision than %s" +#~ msgstr "type avec plus de precision que %s" + +#~ msgid "ANSI C forbids const or volatile function types" +#~ msgstr "C ANSI interdit les types `const' ou de fonctions volatiles" + +#~ msgid "leaving more files than we entered" +#~ msgstr "laissant plus de fichiers que nous en avons entrée" + +#~ msgid "universal-character-name used for '%c'" +#~ msgstr "nom-de-caractère-universel utilisé pour `%c'" + +#~ msgid "unknown escape sequence: '\\' followed by char 0x%x" +#~ msgstr "séquence d'échappement inconnue: '\\' suivi du caractère 0x%x" + +#~ msgid "wrong type argument to %s" +#~ msgstr "type d'argument erroné pour %s" + +#~ msgid "deprecated initialization of zero-length array" +#~ msgstr "initialisation obsolète d'un tableau de taille zéro" + +#~ msgid "initialization of zero-length array before end of structure" +#~ msgstr "initialisation d'un tableau de taille zéro avant la fin de la structure" + +#~ msgid "initialization of zero-length array inside a nested context" +#~ msgstr "initialisation d'un tableau de taille zéro à l'intérieur d'un contexte imbriqué" + +#~ msgid "Unable to find a temporary location for static chain register" +#~ msgstr "Incapable de trouver une location temporaire pour un registre chaîné statique" + +#~ msgid "Internal gcc abort from %s:%d" +#~ msgstr "Abandon interne gcc à partir de %s:%d" + +#~ msgid "The local variable `insn' has the value:" +#~ msgstr "La variable locale `insn' a la valeur:" + +#~ msgid "Register '%c' already specified in allocation order" +#~ msgstr "Registre '%c' est déjà spécifié dans l'ordre d'allocation" + +#~ msgid "Same as -mcpu=i386" +#~ msgstr "Identique à -mcpu=i386" + +#~ msgid "Same as -mcpu=i486" +#~ msgstr "Identique à -mcpu=i486" + +#~ msgid "Same as -mcpu=pentium" +#~ msgstr "Identique à -mcpu=pentium" + +#~ msgid "Same as -mcpu=pentiumpro" +#~ msgstr "Identique à -mcpu=pentiumpro" + +#~ msgid "Emit Intel syntax assembler opcodes" +#~ msgstr "Produire les code-op pour la syntaxe d'assembleur Intel" + +#~ msgid "Control allocation order of integer registers" +#~ msgstr "Contrôle l'ordre d'allocation des registres entier" + +#~ msgid "The -mabi=32 support does not work yet." +#~ msgstr "L'option -mabi=32 n'est pas fonctionnelle encore." + +#~ msgid "-mcpu=%s does not support -mips%d" +#~ msgstr "-mcpu=%s ne supporte par -mips%d" + +#~ msgid "Use FUNCTION_EPILOGUE" +#~ msgstr "Utiliser FUNCTION_EPILOGUE" + +#~ msgid "Do not use FUNCTION_EPILOGUE" +#~ msgstr "Ne pas utiliser FUNCTION_EPILOGUE" + +#~ msgid "object size exceeds built-in limit for virtual function table implementation" +#~ msgstr "taille des objets excède les limites internes pour la table implantée de fonctions virtuelles" + +#~ msgid "object size exceeds normal limit for virtual function table implementation, recompile all source and use -fhuge-objects" +#~ msgstr "taille des objets excède la limite normale pour la table implantée de foncions virtuelles, recompiler tous les sources et utiliser -fhuge-objects" + +#~ msgid "the ABI requires vtable thunks" +#~ msgstr "l'ABI requiert vtable thunks" + +#~ msgid "`__alignof__' applied to a bit-field" +#~ msgstr "`__alignof__' appliqué à un champ de bits" + +#~ msgid "Do not treat the namespace `std' as a normal namespace" +#~ msgstr "Ne pas traiter l'espace nom `std' comme un espace nom normal" + +#~ msgid "taking dynamic typeid of object with -fno-rtti" +#~ msgstr "prendre le typeid dynamique d'objet avec -fno-rtti" + +#~ msgid "recoverable compiler error, fixups for virtual function" +#~ msgstr "erreur de recouvrement du compilateur, correctifs pour les fonctions virtuelles" + +#~ msgid "`com_interface' only supported with -fvtable-thunks" +#~ msgstr "`com_interface' supporté seulement avec -fvtable-thunks" + +#~ msgid "\"defined\" operator appears during macro expansion" +#~ msgstr "opérateur \"defined\" apparaît durant l'expansion de macro" + +#~ msgid "-include and -imacros cannot be used with -fpreprocessed" +#~ msgstr "-include et -imacros ne peuvent être utilisés avec -fpreprocessed" + +#~ msgid "buffers still stacked in cpp_finish" +#~ msgstr "tampons toujours empilés dans cpp_finish" + +#~ msgid "# followed by integer" +#~ msgstr "# suivi d'un entier" + +#~ msgid "attempt to push file buffer with contexts stacked" +#~ msgstr "tentative d'empilage du tampon fichier dans un contexte de pile" + +#~ msgid "file \"%s\" left but not entered" +#~ msgstr "fichier \"%s\" a été laissé mais n'a pas été entré" + +#~ msgid "expected to return to file \"%s\"" +#~ msgstr "attendait retourner au fichier \"%s\"" + +#~ msgid "header flags for \"%s\" have changed" +#~ msgstr "fanion d'en-tête de \"%s\" a changé" + +#~ msgid "file \"%s\" entered but not left" +#~ msgstr "fichier \"%s\" entrée mais non laissé" + +#~ msgid "NOTE_INSN_BASIC_BLOCK is missing for block %d\n" +#~ msgstr "NOTE_INSN_BASIC_BLOCK est manquant por le bloc %d\n" + +#~ msgid "gcov [-b] [-v] [-n] [-l] [-f] [-o OBJDIR] file\n" +#~ msgstr "gcov [-b] [-v] [-n] [-l] [-f] [-o RÉP_OBJ] fichier\n" + +#~ msgid "Premature end of input file %s" +#~ msgstr "Fin prématuré du fichier d'entrée %s" + +#~ msgid "Make is_compiled_class return 1" +#~ msgstr "Faire que is_compiled_class retourne 1" + +#~ msgid "Dump class files to .class" +#~ msgstr "Vidanger les fichiers de classs dans .class" + +#~ msgid "input file is list of file names to compile" +#~ msgstr "fichier d'entrée est listé dans les noms de fichiers à compiler" + +#~ msgid "Generate code for Boehm GC" +#~ msgstr "Générer le code pour Boehm GC" + +#~ msgid "Don't put synchronization structure in each object" +#~ msgstr "Ne pas insérer de structure de synchronisation dans cahque objet" + +#~ msgid "Arc profiling: some edge counts were bad." +#~ msgstr "profilage Arc: quelques compteurs de bordures étaient erronées." + +#~ msgid "`asm' cannot be used in function where memory usage is checked" +#~ msgstr "`asm' ne peut être utilisé dans une fonction où l'usage de la mémoire est vérifié" + +#~ msgid "`asm' cannot be used with `-fcheck-memory-usage'" +#~ msgstr "`asm' ne peut être utilisé `-fcheck-memory-usage'" + +#~ msgid "output operand constraint %d contains `+'" +#~ msgstr "contrainte de sortie de l'opérande %d contient `+'" + +#~ msgid "\"%s\" and \"%s\" identical in first %d characters" +#~ msgstr "\"%s\" et \"%s\" identique pour les premiers %d caractères" + +#~ msgid "Improve FP speed by violating ANSI & IEEE rules" +#~ msgstr "Améliorer la vitesse FP en violant les règles ANSI & IEEE" + +#~ msgid "Generate code to check every memory access" +#~ msgstr "Générer du code pour vérifier chaque accès mémoire" + +#~ msgid "Add a prefix to all function names" +#~ msgstr "Ajouter un préfixe à tous les noms de fonctions" + +#~ msgid "Errors detected in input file (your bison.simple is out of date)\n" +#~ msgstr "Erreurs détectées dans le fichier d'entrée (votre bison.simple est périmé)\n" + +#~ msgid " -Wid-clash- Warn if 2 identifiers have the same first chars\n" +#~ msgstr " -Wid-clash- avertir si 2 identificateurs one les mêmes premiers de caractères\n" + +#~ msgid "Unrecognized option `%s'" +#~ msgstr "Option non reconnue `%s'" + +#~ msgid "`-a' option (basic block profile) not supported" +#~ msgstr "`-a' option (profile de blocs de base) non supporté" + +#~ msgid "`-ax' option (jump profiling) not supported" +#~ msgstr "`-ax' option (profilage des sauts) non supporté" + +#~ msgid "`-ax' and `-a' are conflicting options. `-a' ignored." +#~ msgstr "`-ax' et `-a' sont des options conflictuelles. `-a' ignoré." + +#~ msgid "Data size %ld.\n" +#~ msgstr "Taille des données %ld.\n" + +#~ msgid "Copyright (C) 2001 Free Software Foundation, Inc.\n" +#~ msgstr "Copyright © 2001 Free Software Foundation, Inc.\n" + +#~ msgid "Name `%s' contains quotes" +#~ msgstr "Nom « %s » contient des guillemets" + +#~ msgid "invalid string `%s' in define_query_cpu_unit" +#~ msgstr "chaîne invalide « %s » dans define_query_cpu_unit" + +#~ msgid "invalid first string `%s' in presence_set" +#~ msgstr "première chaîne invalide « %s » dans presence_set" + +#~ msgid "invalid first string `%s' in absence_set" +#~ msgstr "première chaîne invalide « %s » dans absence_set" + +#~ msgid "invalid second string `%s' in absence_set" +#~ msgstr "seconde chaîne invalide « %s » dans absence_set" + +#~ msgid "invalid string `%s' in define_automaton" +#~ msgstr "chaîne invalide « %s » dans define_automaton" + +#~ msgid "garbage after ) in reservation `%s'" +#~ msgstr "rebut après « ) » dans la réservation « %s »" + +#~ msgid "repetition `%s' <= 1 in reservation `%s'" +#~ msgstr "répétition « %s » <= 1 dans la réservation « %s »" + +#~ msgid "`%s' in exclusion is not unit" +#~ msgstr "« %s » dans l'exclusion n'est pas une unité" + +#~ msgid "units `%s' and `%s' in exclusion set belong to different automata" +#~ msgstr "unités « %s » et « %s » dans l'ensemble d'exclusions appartient à un automate différent" + +#~ msgid "unit `%s' excludes and requires presence of `%s'" +#~ msgstr "unité « %s » exclue et requiert la présence de « %s »" + +#~ msgid "unit `%s' requires absence and presence of `%s'" +#~ msgstr "unité « %s » exclue et requiert l'absence ou la présence de « %s »" + +#~ msgid "define_insn_reservation `%s' has negative latency time" +#~ msgstr "define_insn_reservation « %s » a un temps de latence négatif" + +#~ msgid "define_bypass `%s - %s' has negative latency time" +#~ msgstr "define_bypass « %s - %s » a un temps de latence négatif" + +#~ msgid "define_unit `%s' without automaton when one defined" +#~ msgstr "define_unit « %s » sans automate alors qu'il y en a un défini" + +#~ msgid "Units `%s' and `%s' should be in the same automaton" +#~ msgstr "Unités « %s » et « %s » devraient être dans le même automate" + +#~ msgid "Automaton `%s': Insn `%s' will never be issued" +#~ msgstr "Automate « %s »: Insn « %s » ne sera jamais émis" + +#~ msgid "Insn `%s' will never be issued" +#~ msgstr "Insn « %s » ne sera jamais émis" + +#~ msgid "Profile does not match flowgraph of function %s (out of date?)" +#~ msgstr "Profil ne concorde pas le graphe de flux de la fonction %s (périmé?)" + +#~ msgid "The slope of the linear function throttling inlining after the recursive inlining limit has been reached is given by the negative reciprocal value of this parameter" +#~ msgstr "La pente de la fonction linéaire d'étrnaglement d'enlignage après avoir atteint récursivement la limite d'enlignage récursif est obtenue par la valeur négative réciproque de ce paramètre" + +#~ msgid "push %s level %p line %d\n" +#~ msgstr "empiler %s niveau %p ligne %d\n" + +#~ msgid "pop %s level %p line %d\n" +#~ msgstr "dépiler %s niveau %p ligne %d\n" + +#~ msgid "suspend %s level %p line %d\n" +#~ msgstr "suspendre %s niveau %p ligne %d\n" + +#~ msgid "resume %s level %p line %d\n" +#~ msgstr "compléter %s niveau %p ligne %d\n" + +#~ msgid "\\x%x" +#~ msgstr "\\x%x" + +#~ msgid "invalid use of template `%D'" +#~ msgstr "utilisation invalide du canevas « %D »" + +#~ msgid "qualified name does not name a class" +#~ msgstr "nom qualifié ne nomme pas une classe" + +#~ msgid "assignment to non-static member `%D' of enclosing class `%T'" +#~ msgstr "affectation à un membre non statique « %D » de la classe « %T » entourée" + +#~ msgid "ISO C++ does not permit named return values" +#~ msgstr "ISO C++ ne permet pas les valeurs retournées nommées" + +#~ msgid "exception handler inside code that is being protected" +#~ msgstr "traitement d'exception à l'intérieur du code qui est protégé" + +#~ msgid "(debug) trace parsing process" +#~ msgstr "(débug) tracer le traitement de l'analyse" + +#~ msgid "(debug) trace lexical analysis" +#~ msgstr "(débug) trace l'analyse lexicale" diff --git a/libcpp/po/ja.po b/libcpp/po/ja.po new file mode 100644 index 0000000..27f5b69 --- /dev/null +++ b/libcpp/po/ja.po @@ -0,0 +1,10550 @@ +# Japanese messages for gcc 3.0 +# Copyright (C) 2001 Free Software Foundation, Inc. +# Daisuke Yamashita , 1999-2001 +# Masahito Yamaga , 1999. +# IIDA Yosiaki , 1999. +# +msgid "" +msgstr "" +"Project-Id-Version: gcc 3.0\n" +"Report-Msgid-Bugs-To: http://gcc.gnu.org/bugs.html\n" +"POT-Creation-Date: 2007-11-08 21:08+0000\n" +"PO-Revision-Date: 2001-12-05 22:47+0900\n" +"Last-Translator: Daisuke Yamashita \n" +"Language-Team: Japanese \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=EUC-JP\n" +"Content-Transfer-Encoding: 8bit\n" + +#: charset.c:654 +#, fuzzy, c-format +msgid "conversion from %s to %s not supported by iconv" +msgstr "NaN ¤«¤éÉä¹ç̵¤·À°¿ô¤Ø¤ÎÊÑ´¹¤Ç¤¹" + +#: charset.c:657 +msgid "iconv_open" +msgstr "" + +#: charset.c:665 +#, c-format +msgid "no iconv implementation, cannot convert from %s to %s" +msgstr "" + +#: charset.c:742 +#, fuzzy, c-format +msgid "character 0x%lx is not in the basic source character set\n" +msgstr "universal-character-name ¤Ï `%c' ¤ò»Ø¼¨¤·¤Þ¤·¤¿¤¬¡¢´ðËÜŪ¤Êʸ»ú½¸¹ç¤Î°ìÉô¤Ç¤¹" + +#: charset.c:759 charset.c:1352 +msgid "converting to execution character set" +msgstr "" + +#: charset.c:765 +#, c-format +msgid "character 0x%lx is not unibyte in execution character set" +msgstr "" + +#: charset.c:889 +#, c-format +msgid "Character %x might not be NFKC" +msgstr "" + +#: charset.c:949 +#, fuzzy +msgid "universal character names are only valid in C++ and C99" +msgstr "¥æ¥Ë¥Ð¡¼¥µ¥ëʸ»ú̾ `\\U%08x' ¤Ï¼±Ê̻ҤÎÃæ¤Ç¤ÏÍ­¸ú¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#: charset.c:952 +#, fuzzy, c-format +msgid "the meaning of '\\%c' is different in traditional C" +msgstr "'\\%c' ¤Î°ÕÌ£¤Ï -traditional ¤ò¤Ä¤±¤¿¾ì¹ç¤È°Û¤Ê¤ê¤Þ¤¹" + +#: charset.c:961 +msgid "In _cpp_valid_ucn but not a UCN" +msgstr "" + +#: charset.c:986 +#, fuzzy, c-format +msgid "incomplete universal character name %.*s" +msgstr "̵¸ú¤Ê ¥æ¥Ë¥Ð¡¼¥µ¥ëʸ»ú̾" + +#: charset.c:998 +#, fuzzy, c-format +msgid "%.*s is not a valid universal character" +msgstr "ÉÔŬÀڤʥæ¥Ë¥Ð¡¼¥µ¥ë¥­¥ã¥é¥¯¥¿Ì¾" + +#: charset.c:1008 lex.c:484 +msgid "'$' in identifier or number" +msgstr "" + +#: charset.c:1018 +#, fuzzy, c-format +msgid "universal character %.*s is not valid in an identifier" +msgstr "¥æ¥Ë¥Ð¡¼¥µ¥ëʸ»ú̾ `\\U%08x' ¤Ï¼±Ê̻ҤÎÃæ¤Ç¤ÏÍ­¸ú¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#: charset.c:1022 +#, fuzzy, c-format +msgid "universal character %.*s is not valid at the start of an identifier" +msgstr "¥æ¥Ë¥Ð¡¼¥µ¥ëʸ»ú̾ `\\U%08x' ¤Ï¼±Ê̻ҤÎÃæ¤Ç¤ÏÍ­¸ú¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#: charset.c:1056 charset.c:1571 +msgid "converting UCN to source character set" +msgstr "" + +#: charset.c:1060 +msgid "converting UCN to execution character set" +msgstr "" + +#: charset.c:1132 +#, fuzzy +msgid "the meaning of '\\x' is different in traditional C" +msgstr "`\\x' ¤Î°ÕÌ£¤Ï -traditional ¤ò¤Ä¤±¤¿¾ì¹ç¤È°Û¤Ê¤ê¤Þ¤¹" + +#: charset.c:1149 +msgid "\\x used with no following hex digits" +msgstr "\\x ¤Ë¡¢¤½¤ì¤Ë³¤¯¤Ï¤º¤Î 16 ¿Ê¿ô¤¬¤¢¤ê¤Þ¤»¤ó" + +#: charset.c:1156 +msgid "hex escape sequence out of range" +msgstr "16 ¿Ê¥¨¥¹¥±¡¼¥×¥·¡¼¥±¥ó¥¹¤¬Èϰϳ°¤Ç¤¹" + +#: charset.c:1195 +msgid "octal escape sequence out of range" +msgstr "8 ¿Ê¥¨¥¹¥±¡¼¥×¥·¡¼¥±¥ó¥¹¤¬Èϰϳ°¤Ç¤¹" + +#: charset.c:1263 +#, fuzzy +msgid "the meaning of '\\a' is different in traditional C" +msgstr "'\\a' ¤Î°ÕÌ£¤Ï -traditional ¤ò¤Ä¤±¤¿¾ì¹ç¤È°Û¤Ê¤ê¤Þ¤¹" + +#: charset.c:1270 +#, c-format +msgid "non-ISO-standard escape sequence, '\\%c'" +msgstr "Èó ISO ɸ½à¤Î¥¨¥¹¥±¡¼¥×¥·¡¼¥±¥ó¥¹, '\\%c'" + +#: charset.c:1278 +#, c-format +msgid "unknown escape sequence '\\%c'" +msgstr "ÉÔÌÀ¤Ê¥¨¥¹¥±¡¼¥×¥·¡¼¥±¥ó¥¹ '\\%c'" + +#: charset.c:1286 +#, fuzzy, c-format +msgid "unknown escape sequence: '\\%s'" +msgstr "ÉÔÌÀ¤Ê¥¨¥¹¥±¡¼¥×¥·¡¼¥±¥ó¥¹ '\\%c'" + +#: charset.c:1293 +#, fuzzy +msgid "converting escape sequence to execution character set" +msgstr "ʸ»ú¤ËÂФ¹¤ë¥¨¥¹¥±¡¼¥×¥·¡¼¥±¥ó¥¹¤¬ÈϰϤò³°¤ì¤Æ¤¤¤Þ¤¹" + +#: charset.c:1415 charset.c:1478 +#, fuzzy +msgid "character constant too long for its type" +msgstr "ʸ»úÄê¿ô¤¬Ä¹¤¹¤®¤Þ¤¹" + +#: charset.c:1418 +msgid "multi-character character constant" +msgstr "Ê£¿ôʸ»ú¤«¤é¤Ê¤ëʸ»úÄê¿ô" + +#: charset.c:1510 +msgid "empty character constant" +msgstr "¶õ¤Îʸ»úÄê¿ô" + +#: charset.c:1612 +#, c-format +msgid "failure to convert %s to %s" +msgstr "" + +#: directives.c:215 directives.c:241 +#, c-format +msgid "extra tokens at end of #%s directive" +msgstr ";ʬ¤Ê¥È¡¼¥¯¥ó¤¬ #%s ¥Ç¥£¥ì¥¯¥Æ¥£¥Ö¤Î½ª¤ê¤Ë¤¢¤ê¤Þ¤¹" + +#: directives.c:344 +#, c-format +msgid "#%s is a GCC extension" +msgstr "#%s ¤Ï GCC ¤Î³ÈÄ¥¤Ç¤¹" + +#: directives.c:356 +msgid "suggest not using #elif in traditional C" +msgstr "¸Å¤¤ C ¤Ç¤Ï #elif ¤ò»È¤ï¤Ê¤¤Êý¤¬¤¤¤¤¤Ç¤¹" + +#: directives.c:359 +#, c-format +msgid "traditional C ignores #%s with the # indented" +msgstr "¸Å¤¤ C ¤Ç¤Ï¡¢¥¤¥ó¥Ç¥ó¥È¤µ¤ì¤¿ # ¤Î #%s ¤ò̵»ë¤·¤Þ¤¹" + +#: directives.c:363 +#, c-format +msgid "suggest hiding #%s from traditional C with an indented #" +msgstr "¥¤¥ó¥Ç¥ó¥È¤µ¤ì¤¿ # ¤¬¤¢¤ë¸Å¤¤ C ¤«¤é¤Ï #%s ¤ò±£¤¹¤³¤È¤ò¤ª´«¤á¤·¤Þ¤¹" + +#: directives.c:389 +msgid "embedding a directive within macro arguments is not portable" +msgstr "" + +#: directives.c:409 +#, fuzzy +msgid "style of line directive is a GCC extension" +msgstr "#%s ¤Ï GCC ¤Î³ÈÄ¥¤Ç¤¹" + +#: directives.c:464 +#, c-format +msgid "invalid preprocessing directive #%s" +msgstr "̵¸ú¤Ê¥×¥ê¥×¥í¥»¥¹¥Ç¥£¥ì¥¯¥Æ¥£¥ô #%s" + +#: directives.c:532 +msgid "\"defined\" cannot be used as a macro name" +msgstr "\"defined\" ¤ò¥Þ¥¯¥í̾¤È¤·¤Æ¤Ï»È¤¨¤Þ¤»¤ó" + +#: directives.c:538 +#, c-format +msgid "\"%s\" cannot be used as a macro name as it is an operator in C++" +msgstr "\"%s\" ¤Ï C++ ¤Î±é»»»Ò¤Ç¤¢¤ê¡¢¥Þ¥¯¥í̾¤È¤·¤Æ»ÈÍѤ¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó" + +#: directives.c:541 +#, c-format +msgid "no macro name given in #%s directive" +msgstr "¥Þ¥¯¥í̾¤¬ #%s ¥Ç¥£¥ì¥¯¥Æ¥£¥ÖÃæ¤ËÍ¿¤¨¤é¤ì¤Æ¤¤¤Þ¤»¤ó" + +#: directives.c:544 +msgid "macro names must be identifiers" +msgstr "¥Þ¥¯¥í̾¤Ï¼±Ê̻ҤǤʤ¯¤Æ¤Ï¤Ê¤ê¤Þ¤»¤ó" + +#: directives.c:585 +#, c-format +msgid "undefining \"%s\"" +msgstr "\"%s\" ¤ò undef ¤·¤Þ¤¹" + +#: directives.c:640 +msgid "missing terminating > character" +msgstr "½ªÃ¼Ê¸»ú > ¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#: directives.c:695 +#, c-format +msgid "#%s expects \"FILENAME\" or " +msgstr "#%s ¤Ï \"¥Õ¥¡¥¤¥ë̾\" ¤¢¤ë¤¤¤Ï <¥Õ¥¡¥¤¥ë̾> ¤òɬÍפȤ·¤Þ¤¹" + +#: directives.c:739 +#, fuzzy, c-format +msgid "empty filename in #%s" +msgstr "#%s ¤Ç¤Î¥Õ¥¡¥¤¥ë̾¤¬¶õ¤Ç¤¹" + +#: directives.c:749 +msgid "#include nested too deeply" +msgstr "#include ¤Î¥Í¥¹¥È¤¬¿¼¤¹¤®¤Þ¤¹" + +#: directives.c:790 +msgid "#include_next in primary source file" +msgstr "#include_next ¤¬¼ç¤¿¤ë¥½¡¼¥¹¥Õ¥¡¥¤¥ë¤Ë¤¢¤ê¤Þ¤¹" + +#: directives.c:816 +#, c-format +msgid "invalid flag \"%s\" in line directive" +msgstr "\"%s\" ¤Ï line ¥Ç¥£¥ì¥¯¥Æ¥£¥Ö¤Ç¤Ï̵¸ú¤Ê¥Õ¥é¥°¤Ç¤¹" + +#: directives.c:868 +#, c-format +msgid "\"%s\" after #line is not a positive integer" +msgstr "#line ¤Î¸å¤í¤Î \"%s\" ¤¬Àµ¤ÎÀ°¿ô¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#: directives.c:874 +msgid "line number out of range" +msgstr "¹ÔÈֹ椬Èϰϳ°¤Ç¤¹" + +#: directives.c:887 directives.c:964 +#, c-format +msgid "\"%s\" is not a valid filename" +msgstr "\"%s\" ¤ÏÀµ¾ï¤Ê¥Õ¥¡¥¤¥ë̾¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#: directives.c:924 +#, fuzzy, c-format +msgid "\"%s\" after # is not a positive integer" +msgstr "#line ¤Î¸å¤í¤Î \"%s\" ¤¬Àµ¤ÎÀ°¿ô¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#: directives.c:1026 +#, fuzzy, c-format +msgid "invalid #%s directive" +msgstr "̤ÄêµÁËô¤ÏÉÔÀµ¤Ê # ¥Ç¥£¥ì¥¯¥Æ¥£¥Ö¤Ç¤¹" + +#: directives.c:1089 +#, c-format +msgid "registering pragmas in namespace \"%s\" with mismatched name expansion" +msgstr "" + +#: directives.c:1098 +#, c-format +msgid "registering pragma \"%s\" with name expansion and no namespace" +msgstr "" + +#: directives.c:1116 +#, c-format +msgid "registering \"%s\" as both a pragma and a pragma namespace" +msgstr "" + +#: directives.c:1119 +#, fuzzy, c-format +msgid "#pragma %s %s is already registered" +msgstr "¥¯¥é¥¹ `%s' ¤Ï´û¤Ë¸ºß¤·¤Þ¤¹" + +#: directives.c:1122 +#, c-format +msgid "#pragma %s is already registered" +msgstr "" + +#: directives.c:1152 +msgid "registering pragma with NULL handler" +msgstr "" + +#: directives.c:1362 +msgid "#pragma once in main file" +msgstr "#pragma once ¤¬¥á¥¤¥ó¥Õ¥¡¥¤¥ë¤Ë¤¢¤ê¤Þ¤¹" + +#: directives.c:1385 +msgid "invalid #pragma GCC poison directive" +msgstr "#pragma GCC ±øÀ÷¥Ç¥£¥ì¥¯¥Æ¥£¥ô¤¬Ìµ¸ú¤Ç¤¹" + +#: directives.c:1394 +#, c-format +msgid "poisoning existing macro \"%s\"" +msgstr "´û¸¤Î¥Þ¥¯¥í \"%s' ¤ò±øÀ÷¤·¤Þ¤¹" + +#: directives.c:1413 +msgid "#pragma system_header ignored outside include file" +msgstr "include ¥Õ¥¡¥¤¥ë³°¤Î #pragma system_header ¤Ï̵»ë¤µ¤ì¤Þ¤·¤¿" + +#: directives.c:1437 +#, fuzzy, c-format +msgid "cannot find source file %s" +msgstr "¥½¡¼¥¹ %s ¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó" + +#: directives.c:1441 +#, c-format +msgid "current file is older than %s" +msgstr "¸½ºß¤Î¥Õ¥¡¥¤¥ë¤Ï %s ¤è¤ê¸Å¤¤¤Ç¤¹" + +#: directives.c:1620 +msgid "_Pragma takes a parenthesized string literal" +msgstr "_Pramga ¤¬³ç¸Ì¤Ç°Ï¤Þ¤ì¤¿Ê¸»úÎó¥ê¥Æ¥é¥ë¤ò¼õ¤±¼è¤ê¤Þ¤·¤¿" + +#: directives.c:1693 +msgid "#else without #if" +msgstr "#else ¤Ë #if ¤¬¤¢¤ê¤Þ¤»¤ó" + +#: directives.c:1698 +msgid "#else after #else" +msgstr "#else ¤¬ #else ¤Î¸å¤í¤Ë¤¢¤ê¤Þ¤¹" + +#: directives.c:1700 directives.c:1733 +msgid "the conditional began here" +msgstr "¤½¤Î¾ò·ï¤Ï¤³¤³¤«¤é»Ï¤Þ¤ê¤Þ¤¹" + +#: directives.c:1726 +msgid "#elif without #if" +msgstr "#elif ¤Ë #if ¤¬¤¢¤ê¤Þ¤»¤ó" + +#: directives.c:1731 +msgid "#elif after #else" +msgstr "#elif ¤¬ #else ¤Î¸å¤í¤Ë¤¢¤ê¤Þ¤¹" + +#: directives.c:1761 +msgid "#endif without #if" +msgstr "#endif ¤Ë #if ¤¬¤¢¤ê¤Þ¤»¤ó" + +#: directives.c:1838 +msgid "missing '(' after predicate" +msgstr "½Ò¸ì¤Î¸å¤í¤Î '(' ¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#: directives.c:1853 +msgid "missing ')' to complete answer" +msgstr "²ò¤òÊä´°¤¹¤ë ')' ¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#: directives.c:1873 +msgid "predicate's answer is empty" +msgstr "½Ò¸ì¤Î²ò¤¬¶õ¤Ç¤¹" + +#: directives.c:1900 +msgid "assertion without predicate" +msgstr "½Ò¸ì¤Î¤Ê¤¤¥¢¥µ¡¼¥·¥ç¥ó¤Ç¤¹" + +#: directives.c:1902 +msgid "predicate must be an identifier" +msgstr "½Ò¸ì¤Ï¼±Ê̻ҤǤʤ±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó" + +#: directives.c:1988 +#, c-format +msgid "\"%s\" re-asserted" +msgstr "\"%s\" ¤¬ºÆ¥¢¥µ¡¼¥È¤µ¤ì¤Þ¤·¤¿" + +#: directives.c:2271 +#, c-format +msgid "unterminated #%s" +msgstr "½ªÃ¼¤Î¤Ê¤¤ #%s" + +#: directives-only.c:221 lex.c:1016 traditional.c:162 +msgid "unterminated comment" +msgstr "½ªÃ¼¤µ¤ì¤Æ¤¤¤Ê¤¤¥³¥á¥ó¥È" + +#: errors.c:118 +msgid "warning: " +msgstr "·Ù¹ð: " + +#: errors.c:120 +msgid "internal error: " +msgstr "ÆâÉô¥¨¥é¡¼: " + +#: errors.c:122 +#, fuzzy +msgid "error: " +msgstr "ÆâÉô¥¨¥é¡¼: " + +#: errors.c:186 +#, fuzzy +msgid "stdout" +msgstr "¹½Â¤ÂÎ" + +#: errors.c:188 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: expr.c:261 +#, fuzzy +msgid "too many decimal points in number" +msgstr "`asm' Ãæ¤ÎÂåÂØ¥­¡¼¥ï¡¼¥É¤¬Â¿¤¹¤®¤Þ¤¹" + +#: expr.c:290 expr.c:365 +msgid "fixed-point constants are a GCC extension" +msgstr "" + +#: expr.c:303 +#, fuzzy, c-format +msgid "invalid digit \"%c\" in binary constant" +msgstr "ÀÜÈø¼­ '%.*s' ¤ÏÀ°¿ôÄê¿ô¤Ë¤Ï̵¸ú¤Ç¤¹" + +#: expr.c:305 +#, fuzzy, c-format +msgid "invalid digit \"%c\" in octal constant" +msgstr "̵¸ú¤Ê¶çÆÉÅÀ `%c' ¤¬À©ÌóÆâ¤Ë¤¢¤ê¤Þ¤¹" + +#: expr.c:313 +#, fuzzy +msgid "invalid prefix \"0b\" for floating constant" +msgstr "ÀÜÈø¼­ '%.*s' ¤ÏÀ°¿ôÄê¿ô¤Ë¤Ï̵¸ú¤Ç¤¹" + +#: expr.c:319 +#, fuzzy +msgid "use of C99 hexadecimal floating constant" +msgstr "16 ¿ÊÉâÆ°¾®¿ôÄê¿ô¤¬¤Ù¤­¾è¤ò»ý¤Á¤Þ¤»¤ó" + +#: expr.c:328 +#, fuzzy +msgid "exponent has no digits" +msgstr "ÉâÆ°¾®¿ôÄê¿ô¤Î¤Ù¤­¿ô¤¬¡¢¥¢¥é¥Ó¥¢¿ô»ú¤ò»ý¤Ã¤Æ¤¤¤Þ¤»¤ó" + +#: expr.c:335 +#, fuzzy +msgid "hexadecimal floating constants require an exponent" +msgstr "16 ¿ÊÉâÆ°¾®¿ôÄê¿ô¤¬¤Ù¤­¾è¤ò»ý¤Á¤Þ¤»¤ó" + +#: expr.c:341 +#, fuzzy, c-format +msgid "invalid suffix \"%.*s\" on floating constant" +msgstr "ÀÜÈø¼­ '%.*s' ¤ÏÀ°¿ôÄê¿ô¤Ë¤Ï̵¸ú¤Ç¤¹" + +#: expr.c:351 expr.c:393 +#, fuzzy, c-format +msgid "traditional C rejects the \"%.*s\" suffix" +msgstr "¸Å¤¤ C ¤Ç¤Ï 'f' ÀÜÈø¼­¤¬µñÈݤµ¤ì¤Þ¤¹" + +#: expr.c:358 +#, fuzzy, c-format +msgid "invalid suffix \"%.*s\" with hexadecimal floating constant" +msgstr "ÀÜÈø¼­ '%.*s' ¤ÏÀ°¿ôÄê¿ô¤Ë¤Ï̵¸ú¤Ç¤¹" + +#: expr.c:369 +#, fuzzy +msgid "decimal float constants are a GCC extension" +msgstr "16 ¿ÊÉâÆ°¾®¿ôÄê¿ô¤¬¤Ù¤­¾è¤ò»ý¤Á¤Þ¤»¤ó" + +#: expr.c:379 +#, fuzzy, c-format +msgid "invalid suffix \"%.*s\" on integer constant" +msgstr "ÀÜÈø¼­ '%.*s' ¤ÏÀ°¿ôÄê¿ô¤Ë¤Ï̵¸ú¤Ç¤¹" + +#: expr.c:401 +#, fuzzy +msgid "use of C99 long long integer constant" +msgstr "ISO C89 ¤Ç¤Ï long long À°¿ôÄê¿ô¤ò¶Ø¤¸¤Þ¤¹" + +#: expr.c:409 +#, fuzzy +msgid "imaginary constants are a GCC extension" +msgstr "#if ¼°¤ÎÃæ¤Ç¤Ïʸ»úÎóÄê¿ô¤¬»È¤¨¤Þ¤»¤ó" + +#: expr.c:412 +#, fuzzy +msgid "binary constants are a GCC extension" +msgstr "#%s ¤Ï GCC ¤Î³ÈÄ¥¤Ç¤¹" + +#: expr.c:505 +#, fuzzy +msgid "integer constant is too large for its type" +msgstr "À°¿ôÄê¿ô¤¬Â礭¤¹¤®¤ë¤Î¤Ç unsigned ¤Ë¤Ê¤ê¤Þ¤·¤¿" + +#: expr.c:517 +msgid "integer constant is so large that it is unsigned" +msgstr "À°¿ôÄê¿ô¤¬Â礭¤¹¤®¤ë¤Î¤Ç unsigned ¤Ë¤Ê¤ê¤Þ¤·¤¿" + +#: expr.c:612 +msgid "missing ')' after \"defined\"" +msgstr "\"defined\" ¤Î¸å¤í¤Î ')' ¤¬·ç¤±¤Æ¤¤¤Þ¤¹" + +#: expr.c:619 +msgid "operator \"defined\" requires an identifier" +msgstr "\"defined\" ±é»»»Ò¤Ï¼±Ê̻ҤòÍ׵ᤷ¤Þ¤¹" + +#: expr.c:627 +#, c-format +msgid "(\"%s\" is an alternative token for \"%s\" in C++)" +msgstr "¡ÊC++ ¤Ç¤Ï \"%s\" ¤¬ \"%s\" ¤ÎÂåÂإȡ¼¥¯¥ó¤Ç¤¹¡Ë" + +#: expr.c:637 +msgid "this use of \"defined\" may not be portable" +msgstr "" + +#: expr.c:676 +#, fuzzy +msgid "floating constant in preprocessor expression" +msgstr "À°¿ô¤¬¥×¥ê¥×¥í¥»¥Ã¥µ¼°Æâ¤Ç¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤·¤Þ¤·¤¿" + +#: expr.c:682 +#, fuzzy +msgid "imaginary number in preprocessor expression" +msgstr "À°¿ô¤¬¥×¥ê¥×¥í¥»¥Ã¥µ¼°Æâ¤Ç¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤·¤Þ¤·¤¿" + +#: expr.c:727 +#, c-format +msgid "\"%s\" is not defined" +msgstr "\"%s\" ¤ÏÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó" + +#: expr.c:855 expr.c:884 +#, c-format +msgid "missing binary operator before token \"%s\"" +msgstr "" + +#: expr.c:875 +#, fuzzy, c-format +msgid "token \"%s\" is not valid in preprocessor expressions" +msgstr "À°¿ô¤¬¥×¥ê¥×¥í¥»¥Ã¥µ¼°Æâ¤Ç¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤·¤Þ¤·¤¿" + +#: expr.c:892 +msgid "missing expression between '(' and ')'" +msgstr "" + +#: expr.c:895 +#, fuzzy +msgid "#if with no expression" +msgstr " throw ¤µ¤ì¤¿¼°¤ÎÃæ" + +#: expr.c:898 +#, fuzzy, c-format +msgid "operator '%s' has no right operand" +msgstr "È¿Éü»Ò `%s' ¤ÏÈóÀ°¿ô·¿¤Ç¤¹" + +#: expr.c:903 +#, fuzzy, c-format +msgid "operator '%s' has no left operand" +msgstr "²¾°ú¿ô `%s' ¤ÏÉÔ´°Á´·¿¤Ç¤¹" + +#: expr.c:929 +msgid " ':' without preceding '?'" +msgstr "" + +#: expr.c:956 +#, fuzzy +msgid "unbalanced stack in #if" +msgstr "Âбþ¤·¤Æ¤¤¤Ê¤¤ #endif" + +#: expr.c:975 +#, fuzzy, c-format +msgid "impossible operator '%u'" +msgstr "¤¢¤ê¤¨¤Ê¤¤±é»»»Ò '%s'" + +#: expr.c:1065 +#, fuzzy +msgid "missing ')' in expression" +msgstr "Äê¿ô¼°¤¬·ç¤±¤Æ¤¤¤ë¤«Ìµ¸ú¤Ç¤¹" + +#: expr.c:1086 +msgid "'?' without following ':'" +msgstr "" + +#: expr.c:1096 +msgid "integer overflow in preprocessor expression" +msgstr "À°¿ô¤¬¥×¥ê¥×¥í¥»¥Ã¥µ¼°Æâ¤Ç¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤·¤Þ¤·¤¿" + +#: expr.c:1101 +#, fuzzy +msgid "missing '(' in expression" +msgstr "Äê¿ô¼°¤¬·ç¤±¤Æ¤¤¤ë¤«Ìµ¸ú¤Ç¤¹" + +#: expr.c:1133 +#, c-format +msgid "the left operand of \"%s\" changes sign when promoted" +msgstr "" + +#: expr.c:1138 +#, c-format +msgid "the right operand of \"%s\" changes sign when promoted" +msgstr "" + +#: expr.c:1397 +msgid "traditional C rejects the unary plus operator" +msgstr "¸Å¤¤ C ¤Ç¤Ïñ¹à¥×¥é¥¹±é»»»Ò¤òµñÈݤ·¤Þ¤¹" + +#: expr.c:1480 +msgid "comma operator in operand of #if" +msgstr "¥«¥ó¥Þ±é»»»Ò¤¬ #if ±é»»»Ò¤ÎÃæ¤Ë¤¢¤ê¤Þ¤¹" + +#: expr.c:1612 +msgid "division by zero in #if" +msgstr "#if ¤Ç¥¼¥í½ü»»¤¬È¯À¸¤·¤Þ¤·¤¿" + +#: files.c:442 +msgid "NULL directory in find_file" +msgstr "" + +#: files.c:480 +msgid "one or more PCH files were found, but they were invalid" +msgstr "" + +#: files.c:483 +msgid "use -Winvalid-pch for more information" +msgstr "" + +#: files.c:570 +#, c-format +msgid "%s is a block device" +msgstr "%s ¤Ï¥Ö¥í¥Ã¥¯¥Ç¥Ð¥¤¥¹¤Ç¤¹" + +#: files.c:587 +#, c-format +msgid "%s is too large" +msgstr "%s ¤ÏÂ礭¤¹¤®¤Þ¤¹" + +#: files.c:622 +#, c-format +msgid "%s is shorter than expected" +msgstr "%s ¤¬ËÜÍè¤è¤ê¤âû¤¤¤Ç¤¹" + +#: files.c:852 +#, fuzzy, c-format +msgid "no include path in which to search for %s" +msgstr "%s ¤ò¸«¤Ä¤±¤ë¤¿¤á¤Î¥¤¥ó¥¯¥ë¡¼¥É¥Ñ¥¹¤¬¤¢¤ê¤Þ¤»¤ó" + +#: files.c:1157 +msgid "Multiple include guards may be useful for:\n" +msgstr "¿½Å include ¤«¤é¤ÎÊݸͭ±×¤È¤Ê¤ë¤Ç¤·¤ç¤¦:\n" + +#: init.c:426 +#, fuzzy +msgid "cppchar_t must be an unsigned type" +msgstr "½Ò¸ì¤Ï¼±Ê̻ҤǤʤ±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó" + +#: init.c:430 +#, c-format +msgid "preprocessor arithmetic has maximum precision of %lu bits; target requires %lu bits" +msgstr "" + +#: init.c:437 +msgid "CPP arithmetic must be at least as precise as a target int" +msgstr "" + +#: init.c:440 +msgid "target char is less than 8 bits wide" +msgstr "" + +#: init.c:444 +msgid "target wchar_t is narrower than target char" +msgstr "" + +#: init.c:448 +msgid "target int is narrower than target char" +msgstr "" + +#: init.c:453 +msgid "CPP half-integer narrower than CPP character" +msgstr "" + +#: init.c:457 +#, c-format +msgid "CPP on this host cannot handle wide character constants over %lu bits, but the target requires %lu bits" +msgstr "" + +#: lex.c:283 +msgid "backslash and newline separated by space" +msgstr "¥Ð¥Ã¥¯¥¹¥é¥Ã¥·¥å¤È²þ¹Ô¤¬¶õÇò¤Çʬ³ä¤µ¤ì¤Þ¤·¤¿" + +#: lex.c:288 +msgid "backslash-newline at end of file" +msgstr "¥Õ¥¡¥¤¥ë¤Î½ª¤ê¤Ë¥Ð¥Ã¥¯¥¹¥é¥Ã¥·¥å-²þ¹Ô¤¬¤¢¤ê¤Þ¤¹" + +#: lex.c:303 +#, c-format +msgid "trigraph ??%c converted to %c" +msgstr "¥È¥é¥¤¥°¥é¥Õ ??%c ¤Ï %c ¤ËÊÑ´¹¤µ¤ì¤Þ¤·¤¿" + +#: lex.c:310 +#, fuzzy, c-format +msgid "trigraph ??%c ignored, use -trigraphs to enable" +msgstr "¥È¥é¥¤¥°¥é¥Õ ??%c ¤Ï̵»ë¤µ¤ì¤Þ¤·¤¿" + +#: lex.c:356 +msgid "\"/*\" within comment" +msgstr "¥³¥á¥ó¥ÈÆâ¤Ë \"/*\" ¤¬¤¢¤ê¤Þ¤¹" + +#: lex.c:414 +#, c-format +msgid "%s in preprocessing directive" +msgstr "¥×¥ê¥×¥í¥»¥¹Ì¿ÎáÃæ¤Ë %s ¤¬¤¢¤ê¤Þ¤¹" + +#: lex.c:423 +msgid "null character(s) ignored" +msgstr "null ʸ»ú¤Ï̵»ë¤µ¤ì¤Þ¤·¤¿" + +#: lex.c:460 +#, fuzzy, c-format +msgid "`%.*s' is not in NFKC" +msgstr "\"%s\" ¤ÏÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó" + +#: lex.c:463 +#, fuzzy, c-format +msgid "`%.*s' is not in NFC" +msgstr "\"%s\" ¤ÏÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó" + +#: lex.c:551 +#, c-format +msgid "attempt to use poisoned \"%s\"" +msgstr "±øÀ÷¤µ¤ì¤¿ '%s' »È¤ª¤¦¤È¤·¤Æ¤¤¤Þ¤¹" + +#: lex.c:559 +msgid "__VA_ARGS__ can only appear in the expansion of a C99 variadic macro" +msgstr "__VA_ARGS__ ¤Ï C99 ²ÄÊÑ°ú¿ô¥Þ¥¯¥í³ÈÄ¥¤Ç¤Î¤ß½Ð¸½¤Ç¤­¤Þ¤¹" + +#: lex.c:659 +msgid "null character(s) preserved in literal" +msgstr "¥ê¥Æ¥é¥ëÃæ¤Ç null ʸ»ú¤¬³ÎÊݤµ¤ì¤Þ¤·¤¿" + +#: lex.c:662 +#, c-format +msgid "missing terminating %c character" +msgstr "%c ʸ»ú¤Ç¤Î½ªÃ¼¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#: lex.c:1027 +#, fuzzy +msgid "C++ style comments are not allowed in ISO C90" +msgstr "C++ ¥¹¥¿¥¤¥ë¤Î¥³¥á¥ó¥È¤Ï ISO C89 ¤Ç¤Ïµö¤µ¤ì¤Þ¤»¤ó" + +#: lex.c:1029 +msgid "(this will be reported only once per input file)" +msgstr "(¤³¤ì¤ÏÆþÎÏ¥Õ¥¡¥¤¥ë¤Ë¤Ä¤­°ì²ó¤À¤±Êó¹ð¤µ¤ì¤Þ¤¹)" + +#: lex.c:1034 +msgid "multi-line comment" +msgstr "Ê£¿ô¹Ô¤Î¥³¥á¥ó¥È" + +#: lex.c:1347 +#, fuzzy, c-format +msgid "unspellable token %s" +msgstr "ÄÖ¤ì¤Ê¤¤¥È¡¼¥¯¥ó %s ¤Ç¤¹" + +#: line-map.c:320 +#, c-format +msgid "In file included from %s:%u" +msgstr "%s:%u ¤«¤é include ¤µ¤ì¤¿¥Õ¥¡¥¤¥ëÃæ" + +#: line-map.c:338 +#, c-format +msgid "" +",\n" +" from %s:%u" +msgstr "" +",\n" +" %s:%u ¤«¤é" + +#: macro.c:84 +#, fuzzy, c-format +msgid "macro \"%s\" is not used" +msgstr "\"%s\" ¤ÏÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó" + +#: macro.c:123 macro.c:319 +#, fuzzy, c-format +msgid "invalid built-in macro \"%s\"" +msgstr "ÁȤ߹þ¤ß¥Þ¥¯¥í \"%s\" ¤Ï̵¸ú¤Ç¤¹" + +#: macro.c:157 +#, fuzzy +msgid "could not determine file timestamp" +msgstr "¥À¥ó¥×¥Õ¥¡¥¤¥ë %s ¤ò³«¤±¤Þ¤»¤ó¤Ç¤·¤¿" + +#: macro.c:254 +#, fuzzy +msgid "could not determine date and time" +msgstr "°Í¸´Ø·¸¤ÎÄÉÀפΤ¿¤á¤Î¥¿¡¼¥²¥Ã¥È̾¤¬ÆÃÄê¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿" + +#: macro.c:270 +msgid "__COUNTER__ expanded inside directive with -fdirectives-only" +msgstr "" + +#: macro.c:423 +msgid "invalid string literal, ignoring final '\\'" +msgstr "ʸ»úÎó¥ê¥Æ¥é¥ë¤¬Ìµ¸ú¤Ç¤¹¡¢ºÇ¸å¤Î '\\' ¤ò̵»ë¤·¤Þ¤¹" + +#: macro.c:483 +#, c-format +msgid "pasting \"%s\" and \"%s\" does not give a valid preprocessing token" +msgstr "\"%s\" ¤È \"%s\" ¤òŽÉÕ¤±¤Þ¤·¤¿¤¬Àµ¾ï¤Ê¥×¥ê¥×¥í¥»¥Ã¥µ¥È¡¼¥¯¥ó¤È¤Ê¤ê¤Þ¤»¤ó" + +#: macro.c:558 +msgid "ISO C99 requires rest arguments to be used" +msgstr "ISO C99 ¤Ï»ÈÍѤµ¤ì¤ë¤Ù¤­»Ä¤ê¤Î¤Î°ú¿ô¤òÍ׵ᤷ¤Þ¤¹" + +#: macro.c:563 +#, c-format +msgid "macro \"%s\" requires %u arguments, but only %u given" +msgstr "¥Þ¥¯¥í \"%s\" ¤Ï°ú¿ô¤ò %u Í׵ᤷ¤Þ¤¹¤¬¡¢%u ¸Ä¤·¤«Í¿¤¨¤é¤ì¤Æ¤¤¤Þ¤»¤ó" + +#: macro.c:568 +#, c-format +msgid "macro \"%s\" passed %u arguments, but takes just %u" +msgstr "¥Þ¥¯¥í \"%s\" ¤Ë°ú¿ô¤¬ %u ÅϤµ¤ì¤Þ¤·¤¿¤¬¡¢%u ¤·¤«¼õ¤±¼è¤ê¤Þ¤»¤ó" + +#: macro.c:679 traditional.c:680 +#, c-format +msgid "unterminated argument list invoking macro \"%s\"" +msgstr "½ªÃ¼¤µ¤ì¤Æ¤¤¤Ê¤¤°ú¿ô¥ê¥¹¥È¤¬¥Þ¥¯¥í \"%s\" ¤òµ¯Æ°¤·¤è¤¦¤È¤·¤Þ¤·¤¿" + +#: macro.c:782 +#, c-format +msgid "function-like macro \"%s\" must be used with arguments in traditional C" +msgstr "¸Å¤¤ C ¤Ç¤Ï¡¢´Ø¿ôŪ¥Þ¥¯¥í \"%s\" ¤Ë°ú¿ô¤¬Í¿¤¨¤é¤ì¤Í¤Ð¤Ê¤ê¤Þ¤»¤ó" + +#: macro.c:1325 +#, c-format +msgid "duplicate macro parameter \"%s\"" +msgstr "¥Þ¥¯¥í²¾°ú¿ô \"%s\" ¤¬½ÅÊ£¤·¤Æ¤¤¤Þ¤¹" + +#: macro.c:1371 +#, c-format +msgid "\"%s\" may not appear in macro parameter list" +msgstr "\"%s\" ¤Ï¥Þ¥¯¥í²¾°ú¿ô¥ê¥¹¥È¤Ë¸½¤ì¤Æ¤Ï¤Ê¤ê¤Þ¤»¤ó" + +#: macro.c:1379 +msgid "macro parameters must be comma-separated" +msgstr "¥Þ¥¯¥í²¾°ú¿ô¤Ï¥«¥ó¥Þ¶èÀڤꤵ¤ì¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó" + +#: macro.c:1396 +msgid "parameter name missing" +msgstr "²¾°ú¿ô̾¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#: macro.c:1413 +msgid "anonymous variadic macros were introduced in C99" +msgstr "̵̾²ÄÊÑ°ú¿ô¥Þ¥¯¥í¤Ï C99 ¤ÇºÎ¤êÆþ¤ì¤é¤ì¤Þ¤·¤¿" + +#: macro.c:1418 +msgid "ISO C does not permit named variadic macros" +msgstr "ISO C ¤Ç¤Ï̾Á°¤Ä¤­²ÄÊÑ°ú¿ô¥Þ¥¯¥í¤òµö¤·¤Þ¤»¤ó" + +#: macro.c:1427 +msgid "missing ')' in macro parameter list" +msgstr "¥Þ¥¯¥í²¾°ú¿ô¥ê¥¹¥È¤Ç¡¢')' ¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#: macro.c:1476 +msgid "'##' cannot appear at either end of a macro expansion" +msgstr "'##' ¤Ï¥Þ¥¯¥íŸ³«¤Îξü¤Ë¤Ï½Ð¸½¤Ç¤­¤Þ¤»¤ó" + +#: macro.c:1510 +#, fuzzy +msgid "ISO C99 requires whitespace after the macro name" +msgstr "ISO C ¤Ç¤Ï¥Þ¥¯¥í̾¤Î¸å¤í¤Ë¶õÇò¤òÍ׵ᤷ¤Þ¤¹" + +#: macro.c:1534 +#, fuzzy +msgid "missing whitespace after the macro name" +msgstr "ISO C ¤Ç¤Ï¥Þ¥¯¥í̾¤Î¸å¤í¤Ë¶õÇò¤òÍ׵ᤷ¤Þ¤¹" + +#: macro.c:1564 +msgid "'#' is not followed by a macro parameter" +msgstr "'#' ¤Ë¥Þ¥¯¥í²¾°ú¿ô̾¤¬Â³¤¤¤Æ¤¤¤Þ¤»¤ó" + +#: macro.c:1683 +#, c-format +msgid "\"%s\" redefined" +msgstr "\"%s\" ¤¬ºÆÄêµÁ¤µ¤ì¤Þ¤·¤¿" + +#: macro.c:1688 +msgid "this is the location of the previous definition" +msgstr "¤³¤³¤¬°ÊÁ°¤ÎÀë¸À¤¬¤¢¤ë°ÌÃ֤Ǥ¹" + +#: macro.c:1738 +#, fuzzy, c-format +msgid "macro argument \"%s\" would be stringified in traditional C" +msgstr "¥Þ¥¯¥í°ú¿ô \"%s\" ¤Ï -traditional ¤ò¤Ä¤±¤ë¤Èʸ»úÎ󲽤µ¤ì¤¿»ö¤Ç¤·¤ç¤¦" + +#: macro.c:1761 +#, fuzzy, c-format +msgid "invalid hash type %d in cpp_macro_definition" +msgstr "dump_definition ¤Ë ̵¸ú¤Ê¥Ï¥Ã¥·¥å¥¿¥¤¥× %d" + +#: pch.c:84 pch.c:332 pch.c:344 pch.c:362 pch.c:368 pch.c:377 +msgid "while writing precompiled header" +msgstr "" + +#: pch.c:485 +#, fuzzy, c-format +msgid "%s: not used because `%.*s' not defined" +msgstr "¥é¥Ù¥ë `%s' ¤¬»È¤ï¤ì¤Þ¤·¤¿¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó" + +#: pch.c:497 +#, c-format +msgid "%s: not used because `%.*s' defined as `%s' not `%.*s'" +msgstr "" + +#: pch.c:538 +#, fuzzy, c-format +msgid "%s: not used because `%s' is defined" +msgstr "`%s' ¤¬»È¤ï¤ì¤Þ¤·¤¿¤¬Ì¤ÄêµÁ¤Ç¤¹" + +#: pch.c:558 +#, c-format +msgid "%s: not used because `__COUNTER__' is invalid" +msgstr "" + +#: pch.c:567 pch.c:737 +msgid "while reading precompiled header" +msgstr "" + +#: traditional.c:750 +#, fuzzy, c-format +msgid "detected recursion whilst expanding macro \"%s\"" +msgstr "½ªÃ¼¤µ¤ì¤Æ¤¤¤Ê¤¤°ú¿ô¥ê¥¹¥È¤¬¥Þ¥¯¥í \"%s\" ¤òµ¯Æ°¤·¤è¤¦¤È¤·¤Þ¤·¤¿" + +#: traditional.c:917 +#, fuzzy +msgid "syntax error in macro parameter list" +msgstr "\"%s\" ¤Ï¥Þ¥¯¥í²¾°ú¿ô¥ê¥¹¥È¤Ë¸½¤ì¤Æ¤Ï¤Ê¤ê¤Þ¤»¤ó" + +#~ msgid "offset outside bounds of constant string" +#~ msgstr "¥ª¥Õ¥»¥Ã¥È¤¬Äê¿ôʸ»úÎó¤Î¶­³¦¤Î³°¤Ë¤¢¤ê¤Þ¤¹" + +#~ msgid "__builtin_saveregs not supported by this target" +#~ msgstr "__builtin_saveregs ¤Ï¤³¤Î¥¿¡¼¥²¥Ã¥È¤Ç¤Ï¼ÂÁõ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "argument of `__builtin_args_info' must be constant" +#~ msgstr "`__builtin_args_info' ¤Î°ú¿ô¤ÏÄê¿ô¤Ç¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó" + +#~ msgid "argument of `__builtin_args_info' out of range" +#~ msgstr "`__builtin_args_info' ¤Î°ú¿ô¤¬Èϰϳ°¤Ç¤¹" + +#~ msgid "missing argument in `__builtin_args_info'" +#~ msgstr "`__builtin_args_info' ¤Ë°ú¿ô¤¬¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "`va_start' used in function with fixed args" +#~ msgstr "`va_start' ¤¬¸ÇÄê¸Ä°ú¿ô¤Î´Ø¿ôÆâ¤Ç»È¤ï¤ì¤Þ¤·¤¿" + +#~ msgid "second parameter of `va_start' not last named argument" +#~ msgstr "`va_start' ¤ÎÆóÈÖÌܤÎÃͤ¬°ú¿ô¤ÎºÇ¸å¤Î̾Á°¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "`__builtin_next_arg' called without an argument" +#~ msgstr "`__builtin_next_arg' ¤¬°ú¿ô̵¤·¤Ç¤Ç¸Æ¤Ó½Ð¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "too many arguments to function `va_start'" +#~ msgstr "`va_start' ¤ËÂФ¹¤ë°ú¿ô¤¬Â¿¤¹¤®¤Þ¤¹" + +#~ msgid "first argument to `va_arg' not of type `va_list'" +#~ msgstr "`va_arg' ¤ËÂФ¹¤ëÂè°ì°ú¿ô¤¬ `va_list' ·¿¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "`%s' is promoted to `%s' when passed through `...'" +#~ msgstr "`%s' ¤Ï `...' ¤Î½èÍý¤Î²áÄø¤Ç `%s' ¤Ë³Ê¾å¤²¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "(so you should pass `%s' not `%s' to `va_arg')" +#~ msgstr "(½¾¤Ã¤Æ¡¢`va_arg' ¤Ë¤Ï `%s' ¤ò(`%s' ¤Ç¤Ê¤¯)ÅϤµ¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó)" + +#~ msgid "invalid arg to `__builtin_frame_address'" +#~ msgstr "`__builtin_frame_address' ¤Ø¤Î°ú¿ô¤¬ÉÔŬÀڤǤ¹" + +#~ msgid "invalid arg to `__builtin_return_address'" +#~ msgstr "`__builtin_return_address' ¤Ø¤Î°ú¿ô¤¬ÉÔŬÀڤǤ¹" + +#~ msgid "unsupported arg to `__builtin_frame_address'" +#~ msgstr "¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Ê¤¤ `__builtin_frame_address' ¤Ø¤Î°ú¿ô¤Ç¤¹" + +#~ msgid "unsupported arg to `__builtin_return_address'" +#~ msgstr "¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Ê¤¤ `__builtin_return_address' ¤Ø°ú¿ô¤Ç¤¹" + +#~ msgid "second arg to `__builtin_expect' must be a constant" +#~ msgstr "`__builtin_expect' ¤Ø¤ÎÂèÆó°ú¿ô¤ÏÄê¿ô¤Ç¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó" + +#~ msgid "__builtin_longjmp second argument must be 1" +#~ msgstr "__builtin_longjmp ÂèÆó°ú¿ô¤Ï 1 ¤Ç¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó" + +#~ msgid "__builtin_trap not supported by this target" +#~ msgstr "__builtin_trap ¤³¤Î¥¿¡¼¥²¥Ã¥È¤Ç¤Ï¼ÂÁõ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "built-in function `%s' not currently supported" +#~ msgstr "ÁȤ߹þ¤ß´Ø¿ô `%s' ¤Ï¸½ºß¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "string length `%d' is greater than the length `%d' ISO C%d compilers are required to support" +#~ msgstr "ʸ»úÎóĹ `%d' ¤Ï¡¢Ä¹¤µ `%d' (ISO C%d ¥³¥ó¥Ñ¥¤¥é¤Î¥µ¥Ý¡¼¥ÈÍ×·ï)¤è¤êÂ礭¤¯¤Ê¤Ã¤Æ¤¤¤Þ¤¹" + +#~ msgid "`%s' attribute directive ignored" +#~ msgstr "`%s' °À­¤Îµ¿»÷Ì¿Î᤬̵»ë¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "`%s' attribute does not apply to types" +#~ msgstr "`%s' °À­¤Ï·¿¤Ë¤ÏŬÍѤµ¤ì¤Þ¤»¤ó" + +#~ msgid "wrong number of arguments specified for `%s' attribute" +#~ msgstr "`%s' °À­¤Ë»ØÄꤵ¤ì¤¿°ú¿ô¤Î¸Ä¿ô¤¬´Ö°ã¤Ã¤Æ¤¤¤Þ¤¹" + +#~ msgid "`%s' attribute ignored" +#~ msgstr "`%s' °À­¤Ï̵»ë¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "unknown machine mode `%s'" +#~ msgstr "ÉÔÌÀ¤Ê¥Þ¥·¥ó¥â¡¼¥É `%s'" + +#~ msgid "no data type for mode `%s'" +#~ msgstr "¥â¡¼¥É `%s' ¤ËÂФ¹¤ë¥Ç¡¼¥¿·¿¤¬¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "type with more precision than %s" +#~ msgstr "%s ¤è¤ê¤âÀºÌ©¤Ê·¿" + +#~ msgid "section attribute cannot be specified for local variables" +#~ msgstr "section °À­¤Ï¥í¡¼¥«¥ëÊÑ¿ô¤ËÂФ·¤Æ¤Ï»ØÄê¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "section of `%s' conflicts with previous declaration" +#~ msgstr "`%s' ¤Î¥»¥¯¥·¥ç¥ó¤ÏÁ°Êý¤Ç¤ËÀë¸À¤µ¤ì¤¿¤â¤Î¤È¾×Æͤ·¤Þ¤¹" + +#~ msgid "section attribute not allowed for `%s'" +#~ msgstr "¥»¥¯¥·¥ç¥ó°À­¤Ï `%s' ¤Ë¤Ï»È¤¨¤Þ¤»¤ó" + +#~ msgid "section attributes are not supported for this target" +#~ msgstr "¥»¥¯¥·¥ç¥ó°À­¤Ï¤³¤Î¥¿¡¼¥²¥Ã¥È¤Ç¤Ï¼ÂÁõ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "requested alignment is not a constant" +#~ msgstr "Í׵ᤵ¤ì¤¿¥¢¥é¥¤¥ó¥á¥ó¥È¤¬Äê¿ô¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "requested alignment is not a power of 2" +#~ msgstr "Í׵ᤵ¤ì¤¿¥¢¥é¥¤¥ó¥á¥ó¥È¤¬ 2 ¤Î¤Ù¤­¾è¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "requested alignment is too large" +#~ msgstr "Í׵ᤵ¤ì¤¿¥¢¥é¥¤¥ó¥á¥ó¥È¤¬Â礭¤¹¤®¤Þ¤¹" + +#~ msgid "alignment may not be specified for `%s'" +#~ msgstr "`%s' ¤ËÂФ·¤Æ¤Î¥¢¥é¥¤¥ó¥á¥ó¥È¤Ï»ØÄê¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "`%s' defined both normally and as an alias" +#~ msgstr "`%s' ¤¬Ä̾ï¤Î¤â¤Î¤È¥¨¥¤¥ê¥¢¥¹¤È¤ÎξÊý¤ÇÄêµÁ¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "alias arg not a string" +#~ msgstr "alias °ú¿ô¤¬Ê¸»úÎó¤Ç¤Ï¤Ê¤¤" + +#~ msgid "`%s' attribute applies only to functions" +#~ msgstr "`%s' °À­¤Ï´Ø¿ô¤ËÂФ·¤Æ¤Î¤ßŬÍѤµ¤ì¤Þ¤¹" + +#~ msgid "can't set `%s' attribute after definition" +#~ msgstr "ÄêµÁ¤Î¸å¤Ç `%s' °À­¤ò¥»¥Ã¥È¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "overflow in constant expression" +#~ msgstr "Äê¿ô¼°¤¬¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤·¤Þ¤·¤¿" + +#~ msgid "integer overflow in expression" +#~ msgstr "¼°¤ÎÀ°¿ô¤¬¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤·¤Þ¤·¤¿" + +#~ msgid "floating point overflow in expression" +#~ msgstr "¼°¤ÎÉâÆ°¾®¿ôÅÀ¿ô¤¬¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤·¤Þ¤·¤¿" + +#~ msgid "large integer implicitly truncated to unsigned type" +#~ msgstr "Â礭¤ÊÀ°¿ô¤¬°ÅÌÛ¤ËÉä¹ç̵¤··¿¤ËÀÚ¤êµÍ¤á¤é¤ì¤Þ¤·¤¿" + +#~ msgid "negative integer implicitly converted to unsigned type" +#~ msgstr "Éé¤ÎÀ°¿ô¤¬°ÅÌÛ¤ËÉä¹ç̵¤··¿¤ËÊÑ´¹¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "overflow in implicit constant conversion" +#~ msgstr "°ÅÌÛ¤ÎÄê¿ôÊÑ´¹¤Ç¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤·¤Þ¤·¤¿" + +#~ msgid "operation on `%s' may be undefined" +#~ msgstr "`%s' ¤Ç¤Î±é»»¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤Ê¤¤¤È»×¤ï¤ì¤Þ¤¹" + +#~ msgid "expression statement has incomplete type" +#~ msgstr "¼°¤ÎÃæ¤Îʸ¤ËÉÔ´°Á´·¿¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "case label does not reduce to an integer constant" +#~ msgstr "case ¥é¥Ù¥ë¤òÀ°¿ôÄê¿ô¤Ë´Ô¸µ¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "invalid truth-value expression" +#~ msgstr "¿¿µ¶Ãͼ°¤¬ÉÔŬÀڤǤ¹" + +#~ msgid "invalid operands to binary %s" +#~ msgstr "Æó¹à±é»»»Ò %s ¤¬ÉÔŬÀڤǤ¹" + +#~ msgid "comparison is always false due to limited range of data type" +#~ msgstr "¥Ç¡¼¥¿·¿¤ÎÈÏ°ÏÀ©¸Â¤Ë¤è¤Ã¤Æ¡¢Èæ³Ó¤¬¾ï¤Ë false ¤È¤Ê¤ê¤Þ¤¹" + +#~ msgid "comparison is always true due to limited range of data type" +#~ msgstr "¥Ç¡¼¥¿·¿¤ÎÈÏ°ÏÀ©¸Â¤Ë¤è¤Ã¤Æ¡¢Èæ³Ó¤¬¾ï¤Ë true ¤È¤Ê¤ê¤Þ¤¹" + +#~ msgid "comparison of unsigned expression >= 0 is always true" +#~ msgstr "Éä¹ç̵¤·¤Î¼° >= 0 ¤È¤¤¤¦Èæ³Ó¤Ï¾ï¤Ë true ¤Ç¤¹" + +#~ msgid "comparison of unsigned expression < 0 is always false" +#~ msgstr "Éä¹ç̵¤·¤Î¼° < 0 ¤È¤¤¤¦Èæ³Ó¤Ï¾ï¤Ë false ¤Ç¤¹" + +#~ msgid "struct type value used where scalar is required" +#~ msgstr "¥¹¥«¥é¡¼¤¬É¬Íפʾì½ê¤Ë¹½Â¤Âη¿¤ÎÃͤ¬»È¤ï¤ì¤Þ¤·¤¿" + +#~ msgid "union type value used where scalar is required" +#~ msgstr "¥¹¥«¥é¡¼¤¬É¬Íפʾì½ê¤Ë¶¦ÍÑÂη¿¤ÎÃͤ¬»È¤ï¤ì¤Þ¤·¤¿" + +#~ msgid "array type value used where scalar is required" +#~ msgstr "¥¹¥«¥é¡¼¤¬É¬Íפʾì½ê¤ËÇÛÎ󷿤ÎÃͤ¬»È¤ï¤ì¤Þ¤·¤¿" + +#~ msgid "suggest parentheses around assignment used as truth value" +#~ msgstr "¿¿µ¶ÃͤȤ·¤Æ»È¤ï¤ì¤ëÂåÆþ¤Î¤Þ¤ï¤ê¤Ç¤Ï¡¢´Ý³ç¸Ì¤Î»ÈÍѤò¤ª´«¤á¤·¤Þ¤¹" + +#~ msgid "invalid use of `restrict'" +#~ msgstr "`restrict' ¤ÎÍÑË¡¤¬ÉÔŬÀڤǤ¹" + +#~ msgid "too few arguments to function `%s'" +#~ msgstr "´Ø¿ô `%s' ¤Ø¤Î°ú¿ô¤¬¾¯¤Ê¤¹¤®¤Þ¤¹" + +#~ msgid "too many arguments to function `%s'" +#~ msgstr "´Ø¿ô `%s' ¤ËÂФ¹¤ë°ú¿ô¤¬Â¿¤¹¤®¤Þ¤¹" + +#~ msgid "pointers are not permitted as case values" +#~ msgstr "case ¤ÎÃͤȤ·¤Æ¤Î¥Ý¥¤¥ó¥¿¤Ïµö¤µ¤ì¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "ISO C++ forbids range expressions in switch statements" +#~ msgstr "ISO C++ ¤Ç¤Ï switch ʸ¤Ç¤ÎÈϰϼ°¤Ï¶Ø¤¸¤é¤ì¤Æ¤¤¤Þ¤¹" + +#~ msgid "ISO C forbids range expressions in switch statements" +#~ msgstr "ISO C ¤Ç¤Ï switch ʸ¤Ç¤ÎÈϰϼ°¤Ï¶Ø¤¸¤é¤ì¤Æ¤¤¤Þ¤¹" + +#~ msgid "empty range specified" +#~ msgstr "¶õ¤ÎÈϰϤ¬»ØÄꤵ¤ì¤Þ¤·¤¿" + +#~ msgid "duplicate (or overlapping) case value" +#~ msgstr "Æó½Å¤Î(¤¢¤ë¤¤¤Ï½ÅÊ£¤·¤Æ¤¤¤ë) case ¤ÎÃÍ" + +#~ msgid "this is the first entry overlapping that value" +#~ msgstr "¤³¤ì¤¬¤½¤ÎÃͤȽÅÊ£¤·¤¿ºÇ½é¤Î¹àÌܤǤ¹" + +#~ msgid "duplicate case value" +#~ msgstr "½ÅÊ£¤·¤¿ case ¤ÎÃÍ" + +#~ msgid "previously used here" +#~ msgstr "Á°¤Ë¤³¤³¤Ç»È¤ï¤ì¤Þ¤·¤¿" + +#~ msgid "multiple default labels in one switch" +#~ msgstr "°ì¤Ä¤Î switch ¤ËÊ£¿ô¤Î default ¥é¥Ù¥ë¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "this is the first default label" +#~ msgstr "¤³¤ì¤¬ºÇ½é¤Î default ¥é¥Ù¥ë¤Ç¤¹" + +#~ msgid "-Wformat-y2k ignored without -Wformat" +#~ msgstr "-Wformat-y2k ¤Ï̵»ë¤µ¤ì¤Þ¤·¤¿¡Ê-Wformat ¤¬¤¢¤ê¤Þ¤»¤ó¡Ë" + +#~ msgid "-Wformat-extra-args ignored without -Wformat" +#~ msgstr "-Wformat-extra-args ¤Ï̵»ë¤µ¤ì¤Þ¤·¤¿¡Ê-Wformat ¤¬¤¢¤ê¤Þ¤»¤ó¡Ë" + +#~ msgid "-Wformat-nonliteral ignored without -Wformat" +#~ msgstr "-Wformat-nonliteral ¤Ï̵»ë¤µ¤ì¤Þ¤·¤¿¡Ê-Wformat ¤¬¤¢¤ê¤Þ¤»¤ó¡Ë" + +#~ msgid "-Wformat-security ignored without -Wformat" +#~ msgstr "-Wformat-security ¤Ï̵»ë¤µ¤ì¤Þ¤·¤¿¡Ê-Wformat ¤¬¤¢¤ê¤Þ¤»¤ó¡Ë" + +#~ msgid "-Wmissing-format-attribute ignored without -Wformat" +#~ msgstr "-Wmissing-format-attribute ¤Ï̵»ë¤µ¤ì¤Þ¤·¤¿¡Ê-Wformat ¤¬¤¢¤ê¤Þ¤»¤ó¡Ë" + +#~ msgid "void value not ignored as it ought to be" +#~ msgstr "void ¤ÎÃͤ¬ËÜÍè¤Î°ÕÌ£Ä̤ê¤Ë̵»ë¤µ¤ì¤Þ¤»¤ó¤Ç¤·¤¿" + +#~ msgid "conversion to non-scalar type requested" +#~ msgstr "Èó¥¹¥«¥é¡¼·¿¤Ø¤ÎÊÑ´¹¤¬Í׵ᤵ¤ì¤Þ¤¹" + +#~ msgid "unknown C standard `%s'" +#~ msgstr "ÉÔÌÀ¤Ê C ɸ½à `%s'" + +#~ msgid "array `%s' assumed to have one element" +#~ msgstr "ÇÛÎó `%s' ¤Ï°ìÍ×ÁǤò»ý¤Ã¤Æ¤¤¤ë¤â¤Î¤È¸«¤Ê¤µ¤ì¤Þ¤¹" + +#~ msgid "`struct %s' incomplete in scope ending here" +#~ msgstr "¥¹¥³¡¼¥×¤¬½ª¤ï¤ë¤³¤Î°ÌÃ֤ǡ¢`struct %s' ¤¬ÉÔ´°Á´¤Ç¤¹" + +#~ msgid "`union %s' incomplete in scope ending here" +#~ msgstr "¥¹¥³¡¼¥×¤¬½ª¤ï¤ë¤³¤ÎÉôʬ¤Ç `union %s' ¤¬ÉÔ´°Á´¤Ç¤¹" + +#~ msgid "`enum %s' incomplete in scope ending here" +#~ msgstr "¥¹¥³¡¼¥×¤¬½ª¤ï¤ë¤³¤ÎÉôʬ¤Ç `enum %s' ¤¬ÉÔ´°Á´¤Ç¤¹" + +#~ msgid "label `%s' defined but not used" +#~ msgstr "¥é¥Ù¥ë `%s' ¤¬ÄêµÁ¤µ¤ì¤Þ¤·¤¿¤¬»È¤ï¤ì¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "shadowing built-in function `%s'" +#~ msgstr "ÁȤ߹þ¤ß´Ø¿ô `%s' ¤òʤ¤¤±£¤·¤Þ¤¹" + +#~ msgid "shadowing library function `%s'" +#~ msgstr "¥é¥¤¥Ö¥é¥ê´Ø¿ô `%s' ¤òʤ¤¤±£¤·¤Þ¤¹" + +#~ msgid "library function `%s' declared as non-function" +#~ msgstr "¥é¥¤¥Ö¥é¥ê´Ø¿ô `%s' ¤ÏÈó´Ø¿ô¤È¤·¤ÆÀë¸À¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "built-in function `%s' declared as non-function" +#~ msgstr "ÁȤ߹þ¤ß´Ø¿ô `%s' ¤ÏÈó´Ø¿ô¤È¤·¤ÆÀë¸À¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "`%s' redeclared as different kind of symbol" +#~ msgstr "`%s' ¤¬Ê̤Υ·¥ó¥Ü¥ë¼ï¤È¤·¤ÆºÆÀë¸À¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "previous declaration of `%s'" +#~ msgstr "Á°Êý¤Ç¤Î `%s' ¤ÎÀë¸À" + +#~ msgid "conflicting types for built-in function `%s'" +#~ msgstr "ÁȤ߹þ¤ß´Ø¿ô `%s' ¤È·¿¤¬Ì·½â¤·¤Þ¤¹" + +#~ msgid "conflicting types for `%s'" +#~ msgstr "`%s' ¤È·¿¤¬Ì·½â¤·¤Þ¤¹" + +#~ msgid "A parameter list with an ellipsis can't match an empty parameter name list declaration." +#~ msgstr "¾Êάµ­¹æÉÕ¤­¥Ñ¥é¥á¥¿¥ê¥¹¥È¤Ï¡¢¶õ¤Î²¾°ú¿ô̾¥ê¥¹¥ÈÀë¸À¤È°ìÃפǤ­¤Þ¤»¤ó¡£" + +#~ msgid "An argument type that has a default promotion can't match an empty parameter name list declaration." +#~ msgstr "¥Ç¥Õ¥©¥ë¥È¤Ç³Ê¾å¤²¤µ¤ì¤ë·¿¤Î°ú¿ô¤¬¡¢¶õ¤Î²¾°ú¿ô̾¥ê¥¹¥ÈÀë¸À¤ÈŬ¹ç¤·¤Þ¤»¤ó¡£" + +#~ msgid "redefinition of `%s'" +#~ msgstr "`%s' ¤¬ºÆÄêµÁ¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "redeclaration of `%s'" +#~ msgstr "`%s' ¤¬ºÆÀë¸À¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "conflicting declarations of `%s'" +#~ msgstr "`%s' ¤ÎÀë¸À¤¬Ì·½â¤·¤Æ¤¤¤Þ¤¹" + +#~ msgid "`%s' previously defined here" +#~ msgstr "`%s' ¤ÏÁ°¤Ë¤³¤³¤ÇÄêµÁ¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "`%s' previously declared here" +#~ msgstr "`%s' ¤ÏÁ°¤Ë¤³¤³¤ÇÀë¸À¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "prototype for `%s' follows" +#~ msgstr "`%s' ¤Î¥×¥í¥È¥¿¥¤¥×¤¬¸å¤í¤Ë¤¢¤ê¤Þ¤¹" + +#~ msgid "non-prototype definition here" +#~ msgstr "Èó¥×¥í¥È¥¿¥¤¥×ÄêµÁ¤¬¤³¤³¤Ë¤¢¤ê¤Þ¤¹" + +#~ msgid "prototype for `%s' follows and number of arguments doesn't match" +#~ msgstr "`%s' ¤Î¥×¥í¥È¥¿¥¤¥×¤¬¸å¤í¤Ë¤¢¤ê¡¢°ú¿ô¤Î¸Ä¿ô¤¬°ìÃפ·¤Þ¤»¤ó" + +#~ msgid "prototype for `%s' follows and argument %d doesn't match" +#~ msgstr "`%s' ¤Î¥×¥í¥È¥¿¥¤¥×¤¬¸å¤í¤Ë¤¢¤ê¡¢°ú¿ô %d ¤¬°ìÃפ·¤Þ¤»¤ó" + +#~ msgid "`%s' declared inline after being called" +#~ msgstr "`%s' ¤Ï¸Æ¤Ó½Ð¤µ¤ì¤ë¤è¤ê¤â¸å¤í¤Ç inline Àë¸À¤µ¤ì¤Æ¤¤¤Þ¤¹" + +#~ msgid "`%s' declared inline after its definition" +#~ msgstr "`%s' ¤Ï¤½¤ÎÄêµÁ¤è¤ê¤â¸å¤Ç inline Àë¸À¤µ¤ì¤Æ¤¤¤Þ¤¹" + +#~ msgid "static declaration for `%s' follows non-static" +#~ msgstr "`%s' ¤ÏÈó static ¤Î¸å¤Ç static Àë¸À¤µ¤ì¤Æ¤¤¤Þ¤¹" + +#~ msgid "non-static declaration for `%s' follows static" +#~ msgstr "`%s' ¤Ï static ¤Î¸å¤ÇÈó static Àë¸À¤µ¤ì¤Æ¤¤¤Þ¤¹" + +#~ msgid "const declaration for `%s' follows non-const" +#~ msgstr "`%s' ¤ÏÈó const ¤Î¸å¤Ç const Àë¸À¤µ¤ì¤Æ¤¤¤Þ¤¹" + +#~ msgid "type qualifiers for `%s' conflict with previous decl" +#~ msgstr "`%s' ¤Î·¿½¤¾þ»Ò¤¬Á°Êý¤ÎÀë¸À¤ÈÌ·½â¤·¤Þ¤¹" + +#~ msgid "redundant redeclaration of `%s' in same scope" +#~ msgstr "`%s' ¤Î¾éĹ¤ÊºÆÀë¸À¤¬Æ±°ì¥¹¥³¡¼¥×Æâ¤Ë¤¢¤ê¤Þ¤¹" + +#~ msgid "nested extern declaration of `%s'" +#~ msgstr "`%s' ¤Î extern Àë¸À¤¬¥Í¥¹¥È¤·¤Æ¤¤¤Þ¤¹" + +#~ msgid "`%s' used prior to declaration" +#~ msgstr "`%s' ¤ÏÀë¸À¤è¤ê¤âÀè¤Ë»ÈÍѤµ¤ì¤Þ¤·¤¿" + +#~ msgid "`%s' was declared implicitly `extern' and later `static'" +#~ msgstr "`%s' ¤Ï°ÅÌÛ¤Ë `extern' Àë¸À¤µ¤ì¡¢¸å¤Ë `static' Àë¸À¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "type mismatch with previous external decl" +#~ msgstr "·¿¤¬Á°Êý¤Î³°ÉôÀë¸À¤È°ìÃפ·¤Þ¤»¤ó" + +#~ msgid "previous external decl of `%s'" +#~ msgstr "Á°Êý¤Î `%s' ¤Î³°ÉôÀë¸À" + +#~ msgid "type mismatch with previous implicit declaration" +#~ msgstr "·¿¤¬Á°Êý¤Î°ÅÌÛ¤ÎÀë¸À¤È°ìÃפ·¤Þ¤»¤ó" + +#~ msgid "previous implicit declaration of `%s'" +#~ msgstr "Á°Êý¤Ç¤Î `%s' ¤Î°ÅÌÛŪ¤ÊÀë¸À" + +#~ msgid "type of external `%s' is not global" +#~ msgstr "³°Éô `%s' ¤Î·¿¤Ï¥°¥í¡¼¥Ð¥ë¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "`%s' was previously implicitly declared to return `int'" +#~ msgstr "`%s' ¤ÏÁ°Êý¤Ç°ÅÌÛŪ¤Ë `int' ¤òÊÖ¤¹¤ÈÀë¸À¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "`%s' was declared `extern' and later `static'" +#~ msgstr "`%s' ¤Ï `extern' ¤ÈÀë¸À¤µ¤ì¡¢¸å¤Ç `static' ¤ÈÀë¸À¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "extern declaration of `%s' doesn't match global one" +#~ msgstr "`%s' ¤Îextern Àë¸À¤Ï¥°¥í¡¼¥Ð¥ë¤Î¤½¤ì¤È°ìÃפ·¤Þ¤»¤ó" + +#~ msgid "`%s' locally external but globally static" +#~ msgstr "`%s' ¤Ï¥í¡¼¥«¥ëŪ¤Ë¤Ï extern ¤Ç¤¹¤¬¡¢¥°¥í¡¼¥Ð¥ëŪ¤Ë static ¤Ç¤¹" + +#~ msgid "declaration of `%s' shadows a parameter" +#~ msgstr "`%s' ¤ÎÀë¸À¤Ï²¾°ú¿ô¤òʤ¤¤±£¤·¤Þ¤¹" + +#~ msgid "declaration of `%s' shadows a symbol from the parameter list" +#~ msgstr "`%s' ¤ÎÀë¸À¤Ï²¾°ú¿ô¥ê¥¹¥È¤Î¥·¥ó¥Ü¥ë¤òʤ¤¤±£¤·¤Þ¤¹" + +#~ msgid "declaration of `%s' shadows previous local" +#~ msgstr "`%s' ¤ÎÀë¸À¤ÏÁ°Êý¤Î¥í¡¼¥«¥ë¥·¥ó¥Ü¥ë¤òʤ¤¤±£¤·¤Þ¤¹" + +#~ msgid "declaration of `%s' shadows global declaration" +#~ msgstr "`%s' ¤ÎÀë¸À¤Ï¥°¥í¡¼¥Ð¥ëÀë¸À¤òʤ¤¤±£¤·¤Þ¤¹" + +#~ msgid "function `%s' was previously declared within a block" +#~ msgstr "´Ø¿ô `%s' ¤Ï¥Ö¥í¥Ã¥¯Æâ¤ÎÁ°Êý¤ÇÀë¸À¤µ¤ì¤Æ¤¤¤Þ¤¹" + +#~ msgid "implicit declaration of function `%s'" +#~ msgstr "´Ø¿ô `%s' ¤Î°ÅÌÛ¤ÎÀë¸À" + +#~ msgid "label %s referenced outside of any function" +#~ msgstr "¥é¥Ù¥ë %s ¤¬¤¢¤é¤æ¤ë´Ø¿ô¤Î³°Â¦¤Ç»²¾È¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "duplicate label declaration `%s'" +#~ msgstr "¥é¥Ù¥ë¤ÎÀë¸À `%s' ¤¬½ÅÊ£¤·¤Æ¤¤¤Þ¤¹" + +#~ msgid "this is a previous declaration" +#~ msgstr "Á°Êý¤Ç¤Î `%s' ¤ÎÀë¸À" + +#~ msgid "unnamed struct/union that defines no instances" +#~ msgstr "̵̾¹½Â¤ÂÎ/¶¦ÍÑÂΤ¬¡¢¤½¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤òÄêµÁ¤·¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "useless keyword or type name in empty declaration" +#~ msgstr "¶õ¤ÎÀë¸À¤ÎÃæ¤Ë¡¢Ìµ°ÕÌ£¤Ê¥­¡¼¥ï¡¼¥ÉËô¤Ï·¿Ì¾¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "two types specified in one empty declaration" +#~ msgstr "°ì¤Ä¤Î¶õ¤ÎÀë¸ÀÃæ¤Ë¡¢Æó¤Ä¤Î·¿¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤¹" + +#~ msgid "empty declaration" +#~ msgstr "¶õ¤ÎÀë¸À¤Ç¤¹" + +#~ msgid "`%s' is usually a function" +#~ msgstr "`%s' ¤ÏÄ̾ï¤Ï´Ø¿ô¤Ç¤¹" + +#~ msgid "typedef `%s' is initialized" +#~ msgstr "typedef `%s' ¤¬½é´ü²½¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "function `%s' is initialized like a variable" +#~ msgstr "´Ø¿ô `%s' ¤¬ÊÑ¿ô¤Ç¤¢¤ë¤«¤Î¤è¤¦¤Ë½é´ü²½¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "parameter `%s' is initialized" +#~ msgstr "²¾°ú¿ô `%s' ¤¬½é´ü²½¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "variable-sized object may not be initialized" +#~ msgstr "²ÄÊÑĹ¥ª¥Ö¥¸¥§¥¯¥È¤Ï½é´ü²½¤µ¤ì¤Ê¤¤¤³¤È¤Ë¤Ê¤ë¤Ç¤·¤ç¤¦" + +#~ msgid "variable `%s' has initializer but incomplete type" +#~ msgstr "ÊÑ¿ô `%s' ¤Ë¤Ï½é´ü²½»Ò¤¬¤¢¤ê¤Þ¤¹¤¬¡¢ÉÔ´°Á´·¿¤Ç¤¹" + +#~ msgid "elements of array `%s' have incomplete type" +#~ msgstr "ÇÛÎó `%s' ¤ÎÍ×ÁǤËÉÔ´°Á´·¿¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "declaration of `%s' has `extern' and is initialized" +#~ msgstr "`%s' ¤ÎÀë¸À¤Ë `extern' ¤¬¤Ä¤¤¤Æ¤ª¤ê¡¢½é´ü²½¤â¤µ¤ì¤Æ¤¤¤Þ¤¹" + +#~ msgid "initializer fails to determine size of `%s'" +#~ msgstr "½é´ü²½»Ò¤Ï `%s' ¤Î¥µ¥¤¥º¤ÎÆÃÄê¤Ë¼ºÇÔ¤·¤Þ¤·¤¿" + +#~ msgid "array size missing in `%s'" +#~ msgstr "`%s' ¤Ç¤ÎÇÛÎó¥µ¥¤¥º¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "zero or negative size array `%s'" +#~ msgstr "`%s' ¤ÎÇÛÎó¥µ¥¤¥º¤¬¥¼¥íËô¤ÏÉé¤Ç¤¹" + +#~ msgid "storage size of `%s' isn't known" +#~ msgstr "`%s' ¤ÎÎΰ襵¥¤¥º¤¬¤ï¤«¤ê¤Þ¤»¤ó" + +#~ msgid "storage size of `%s' isn't constant" +#~ msgstr "`%s' ¤ÎÎΰ襵¥¤¥º¤¬°ìÄê¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "ignoring asm-specifier for non-static local variable `%s'" +#~ msgstr "Èó static ¥í¡¼¥«¥ëÊÑ¿ô `%s' ¤Ø¤Î asm »ØÄê»Ò¤Ï̵»ë¤µ¤ì¤Þ¤¹" + +#~ msgid "ANSI C forbids parameter `%s' shadowing typedef" +#~ msgstr "ANSI C ¤Ï typedef ¤òʤ¤¤±£¤¹²¾°ú¿ô `%s' ¤ò¶Ø¤¸¤Æ¤¤¤Þ¤¹" + +#~ msgid "`long long long' is too long for GCC" +#~ msgstr "`long long long' ¤Ï GCC ¤Ë¤È¤Ã¤ÆŤ¹¤®¤Þ¤¹" + +#~ msgid "ISO C89 does not support `long long'" +#~ msgstr "ISO C89 ¤Ï `long long' ¤ò¼õ¤±ÉÕ¤±¤Þ¤»¤ó" + +#~ msgid "duplicate `%s'" +#~ msgstr "`%s' ¤¬½ÅÊ£¤·¤Æ¤¤¤Þ¤¹" + +#~ msgid "two or more data types in declaration of `%s'" +#~ msgstr "`%s' ¤ÎÀë¸À¤ËÆó¤Ä°Ê¾å¤Î¥Ç¡¼¥¿·¿¤¬»ØÄꤵ¤ì¤Þ¤·¤¿" + +#~ msgid "`%s' fails to be a typedef or built in type" +#~ msgstr "`%s' ¤ò typedef ¤Þ¤¿¤ÏÁȤ߹þ¤ß·¿¤Ë¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "type defaults to `int' in declaration of `%s'" +#~ msgstr "`%s' ¤ÎÀë¸À¤Ç·¿¤¬¥Ç¥Õ¥©¥ë¥È¤Î `int' ¤È¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "both long and short specified for `%s'" +#~ msgstr "`%s' ¤ËÂФ·¤Æ long ¤È short ¤ÎξÊý¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤¹" + +#~ msgid "long or short specified with char for `%s'" +#~ msgstr "`%s' ¤ËÂФ·¤Æ char ¤È¤È¤â¤Ë long ¤Þ¤¿¤Ï short ¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤¹" + +#~ msgid "long or short specified with floating type for `%s'" +#~ msgstr "`%s' ¤ËÂФ·¤ÆÉâÆ°¾®¿ô·¿¤È¤È¤â¤Ë long ¤Þ¤¿¤Ï short ¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤¹" + +#~ msgid "the only valid combination is `long double'" +#~ msgstr "Í£°ì¤ÎÍ­¸ú¤ÊÁȹç¤ï¤»¤Ï `long double' ¤Ç¤¹" + +#~ msgid "both signed and unsigned specified for `%s'" +#~ msgstr "`%s' ¤ËÂФ·¤ÆÉä¹æ¤¢¤ê¤ÈÉä¹æ¤Ê¤·¤ÎξÊý¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤¹" + +#~ msgid "long, short, signed or unsigned invalid for `%s'" +#~ msgstr "`%s' ¤ËÂФ·¤Æ long, short, signed ¤Þ¤¿¤Ï unsigned ¤ÏÉÔŬÀڤǤ¹" + +#~ msgid "long, short, signed or unsigned used invalidly for `%s'" +#~ msgstr "`%s' ¤ËÂФ¹¤ë long, short, singed ¤ä unsigned ¤Î»ÈÍѤÏÉÔŬÀڤǤ¹" + +#~ msgid "complex invalid for `%s'" +#~ msgstr "`%s' ¤ËÂФ·¤Æ complex ¤ÏÉÔŬÀڤǤ¹" + +#~ msgid "ISO C89 does not support complex types" +#~ msgstr "ISO C89 ¤Ï complex ·¿¤ò¼õ¤±ÉÕ¤±¤Þ¤»¤ó" + +#~ msgid "ISO C does not support plain `complex' meaning `double complex'" +#~ msgstr "ISO C ¤Ï `double complex' ¤ò°ÕÌ£¤¹¤ë̵½¤¾þ¤Î `complex' ¤ò¼õ¤±ÉÕ¤±¤Þ¤»¤ó" + +#~ msgid "ISO C does not support complex integer types" +#~ msgstr "ISO C ¤ÏÀ°¿ô·¿¤Î complex ¤ò¼õ¤±ÉÕ¤±¤Þ¤»¤ó" + +#~ msgid "duplicate `const'" +#~ msgstr "½ÅÊ£¤·¤¿ `const'" + +#~ msgid "duplicate `restrict'" +#~ msgstr "½ÅÊ£¤·¤¿¥é¥Ù¥ë `restrict'" + +#~ msgid "duplicate `volatile'" +#~ msgstr "½ÅÊ£¤·¤¿ `volatile'" + +#~ msgid "multiple storage classes in declaration of `%s'" +#~ msgstr "`%s' ¤ÎÀë¸À¤Ë¤ª¤¤¤ÆÊ£¿ô¤ÎÊݸ¥¯¥é¥¹" + +#~ msgid "function definition declared `auto'" +#~ msgstr "´Ø¿ô¤ÎÄêµÁ¤¬ `auto' ¤ÈÀë¸À¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "function definition declared `register'" +#~ msgstr "´Ø¿ô¤ÎÄêµÁ¤¬ `register' ¤ÈÀë¸À¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "function definition declared `typedef'" +#~ msgstr "´Ø¿ô¤ÎÄêµÁ¤¬ `typedef' ¤ÈÀë¸À¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "storage class specified for structure field `%s'" +#~ msgstr "¹½Â¤ÂÎ¥Õ¥£¡¼¥ë¥É `%s' ¤Ë»ØÄꤵ¤ì¤¿µ­²±¥¯¥é¥¹" + +#~ msgid "storage class specified for parameter `%s'" +#~ msgstr "²¾°ú¿ô `%s' ¤Ç»ØÄꤵ¤ì¤¿µ­²±¥¯¥é¥¹" + +#~ msgid "storage class specified for typename" +#~ msgstr "·¿Ì¾¤ËÂФ·¤Æ»ØÄꤵ¤ì¤¿µ­²±¥¯¥é¥¹" + +#~ msgid "`%s' initialized and declared `extern'" +#~ msgstr "`%s' ¤¬½é´ü²½¤µ¤ì¤ë¤È¤³¤í¤Ç¡¢`extern' Àë¸À¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "`%s' has both `extern' and initializer" +#~ msgstr "`%s' ¤Ë `extern' ¤È½é´ü²½»Ò¤ÎξÊý¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "nested function `%s' declared `extern'" +#~ msgstr "¥Í¥¹¥È¤·¤¿´Ø¿ô `%s' ¤Ï `extern' ¤ËÀë¸À¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "top-level declaration of `%s' specifies `auto'" +#~ msgstr "`%s' ¤Î¥È¥Ã¥×¥ì¥Ù¥ë¤ÎÀë¸À¤¬ `auto' ¤ò»ØÄꤷ¤Þ¤¹" + +#~ msgid "declaration of `%s' as array of voids" +#~ msgstr "`%s' ¤ÎÀë¸À¤Ï void ¤ÎÇÛÎó" + +#~ msgid "declaration of `%s' as array of functions" +#~ msgstr "`%s' ¤ÎÀë¸À¤Ï´Ø¿ô¤ÎÇÛÎó" + +#~ msgid "size of array `%s' has non-integer type" +#~ msgstr "ÇÛÎó `%s' ¤ÎÂ礭¤µ¤ÏÈóÀ°¿ô·¿" + +#~ msgid "ISO C forbids zero-size array `%s'" +#~ msgstr "ISO C ¤Ï ¥µ¥¤¥º 0 ¤ÎÇÛÎó `%s' ¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "size of array `%s' is negative" +#~ msgstr "ÇÛÎó `%s' ¤ÎÂ礭¤µ¤¬Éé¤Ç¤¹" + +#~ msgid "ISO C89 forbids array `%s' whose size can't be evaluated" +#~ msgstr "ISO C89 ¤Ï¥µ¥¤¥º¤¬É¾²Á¤Ç¤­¤Ê¤¤ÇÛÎó `%s' ¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "ISO C89 forbids variable-size array `%s'" +#~ msgstr "ISO C89 ¤Ï²ÄÊÑĹ¥µ¥¤¥º¤ÎÇÛÎó `%s' ¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "size of array `%s' is too large" +#~ msgstr "ÇÛÎó `%s' ¤ÎÂ礭¤µ¤¬Â礭¤¹¤®¤Þ¤¹" + +#~ msgid "ISO C89 does not support flexible array members" +#~ msgstr "ISO C89 ¤Ï²ÄÊÑÇÛÎó¥á¥ó¥Ð¤ò¼õ¤±ÉÕ¤±¤Þ¤»¤ó" + +#~ msgid "array type has incomplete element type" +#~ msgstr "ÇÛÎó¤Î·¿¤¬ÉÔ´°Á´Í×ÁÇ·¿¤ò»ý¤Ã¤Æ¤¤¤Þ¤¹" + +#~ msgid "ANSI C forbids const or volatile function types" +#~ msgstr "ANSI C ¤Ï const ¤ä volatile ´Ø¿ô·¿¤ò¼õ¤±ÉÕ¤±¤Þ¤»¤ó" + +#~ msgid "`%s' declared as function returning a function" +#~ msgstr "`%s' ¤Ï´Ø¿ô¤òÊÖ¤¹´Ø¿ô¤È¤·¤ÆÀë¸À¤µ¤ì¤Æ¤¤¤Þ¤¹" + +#~ msgid "`%s' declared as function returning an array" +#~ msgstr "`%s' ¤ÏÇÛÎó¤òÊÖ¤¹´Ø¿ô¤È¤·¤ÆÀë¸À¤µ¤ì¤Æ¤¤¤Þ¤¹" + +#~ msgid "ISO C forbids qualified void function return type" +#~ msgstr "ISO C ¤Ï½¤¾þÉÕ¤­ void ·¿¤ÎÌá¤êÃͤò»ý¤Ä´Ø¿ô¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "type qualifiers ignored on function return type" +#~ msgstr "´Ø¿ôÌá¤êÃͤη¿½¤¾þ»Ò¤Ï̵»ë¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "ISO C forbids qualified function types" +#~ msgstr "ISO C ¤Ï´Ø¿ô¤Î·¿½¤¾þ»Ò¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "invalid type modifier within pointer declarator" +#~ msgstr "¥Ý¥¤¥ó¥¿Àë¸À»Ò¤ËÉÔŬÀڤʷ¿½¤¾þ»Ò" + +#~ msgid "ISO C forbids const or volatile function types" +#~ msgstr "ISO C ¤Ï const ¤ä volatile ¤Î´Ø¿ô·¿¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "variable or field `%s' declared void" +#~ msgstr "ÊÑ¿ô¤Þ¤¿¤ÏÎΰè `%s' ¤Ï void ¤ÈÀë¸À¤µ¤ì¤Æ¤¤¤Þ¤¹" + +#~ msgid "field `%s' declared as a function" +#~ msgstr "Îΰè `%s' ¤Ï´Ø¿ô¤È¤·¤ÆÀë¸À¤µ¤ì¤Æ¤¤¤Þ¤¹" + +#~ msgid "field `%s' has incomplete type" +#~ msgstr "Îΰè `%s' ¤ÏÉÔ´°Á´¤Ê·¿¤Ç¤¹" + +#~ msgid "invalid storage class for function `%s'" +#~ msgstr "´Ø¿ô `%s' ¤ËÂФ·¤ÆÉÔŬÀÚ¤ÊÊݸ¥¯¥é¥¹" + +#~ msgid "`noreturn' function returns non-void value" +#~ msgstr "`noreturn' ´Ø¿ô¤¬Èó void ÃͤòÊÖ¤·¤Æ¤¤¤Þ¤¹" + +#~ msgid "cannot inline function `main'" +#~ msgstr "`main' ¤ò inline ´Ø¿ô¤Ë¤Ï¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "variable `%s' declared `inline'" +#~ msgstr "ÊÑ¿ô `%s' ¤¬ `inline' ¤ÈÀë¸À¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "function declaration isn't a prototype" +#~ msgstr "´Ø¿ôÀë¸À¤Ï¥×¥í¥È¥¿¥¤¥×¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "parameter names (without types) in function declaration" +#~ msgstr "´Ø¿ôÀë¸ÀÃæ¤Ë¡Ê·¿¤Î̵¤¤¡Ë²¾°ú¿ô̾¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "parameter has incomplete type" +#~ msgstr "²¾°ú¿ô¤¬ÉÔ´°Á´·¿¤Ç¤¹" + +#~ msgid "parameter `%s' points to incomplete type" +#~ msgstr "²¾°ú¿ô `%s' ¤ÏÉÔ´°Á´·¿¤ò»Ø¤·¤Æ¤¤¤Þ¤¹" + +#~ msgid "parameter points to incomplete type" +#~ msgstr "²¾°ú¿ô¤¬ÉÔ´°Á´·¿¤ò»Ø¤·¤Æ¤¤¤Þ¤¹" + +#~ msgid "parameter `%s' has just a forward declaration" +#~ msgstr "²¾°ú¿ô `%s' ¾¯¤·Á°Êý¤ÇÀë¸À¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "`void' in parameter list must be the entire list" +#~ msgstr "²¾°ú¿ô¥ê¥¹¥ÈÃæ¤Î `void' ¤Ï¥ê¥¹¥ÈÁ´ÂΤòÀê¤á¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó" + +#~ msgid "`%s %s' declared inside parameter list" +#~ msgstr "`%s %s' ¤Ï²¾°ú¿ô¥ê¥¹¥ÈÆâ¤ÇÀë¸À¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "anonymous struct declared inside parameter list" +#~ msgstr "̵̾¹½Â¤ÂΤ¬²¾°ú¿ô¥ê¥¹¥ÈÆâ¤ÇÀë¸À¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "anonymous union declared inside parameter list" +#~ msgstr "̵̾¶¦ÍÑÂΤ¬²¾°ú¿ô¥ê¥¹¥ÈÆâ¤ÇÀë¸À¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "anonymous enum declared inside parameter list" +#~ msgstr "̵̾Îóµó»Ò¤¬²¾°ú¿ô¥ê¥¹¥ÈÆâ¤ÇÀë¸À¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "its scope is only this definition or declaration, which is probably not what you want." +#~ msgstr "¤½¤Î¥¹¥³¡¼¥×¤ÏÄêµÁ¤«Àë¸À¤À¤±¤Ç¤¹¡¢¶²¤é¤¯Ë¾¤ó¤À¤³¤È¤È°Û¤Ê¤ë¤Ç¤·¤ç¤¦¡£" + +#~ msgid "redefinition of `%s %s'" +#~ msgstr "`%s %s' ¤ÎºÆÄêµÁ" + +#~ msgid "%s defined inside parms" +#~ msgstr "%s¤¬²¾°ú¿ôÆâ¤ÇÄêµÁ¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "union" +#~ msgstr "¶¦ÍÑÂÎ" + +#~ msgid "structure" +#~ msgstr "¹½Â¤ÂÎ" + +#~ msgid "%s has no %s" +#~ msgstr "%s¤¬%s¤ò»ý¤Ã¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "named members" +#~ msgstr "̾Á°ÉÕ¤­¥á¥ó¥Ð" + +#~ msgid "members" +#~ msgstr "¥á¥ó¥Ð" + +#~ msgid "nested redefinition of `%s'" +#~ msgstr "`%s' ¤Î¥Í¥¹¥È¤·¤¿ºÆÄêµÁ" + +#~ msgid "bit-field `%s' width not an integer constant" +#~ msgstr "¥Ó¥Ã¥È¥Õ¥£¡¼¥ë¥É `%s' ¤ÎÉý¤¬À°¿ôÄê¿ô¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "bit-field `%s' has invalid type" +#~ msgstr "¥Ó¥Ã¥È¥Õ¥£¡¼¥ë¥É `%s' ¤ÏÉÔŬÀڤʷ¿¤ò»ý¤Ã¤Æ¤¤¤Þ¤¹" + +#~ msgid "bit-field `%s' type invalid in ISO C" +#~ msgstr "¥Ó¥Ã¥È¥Õ¥£¡¼¥ë¥É `%s' ·¿¤Ï ISO C ¤Ç¤ÏÉÔŬÀڤǤ¹" + +#~ msgid "negative width in bit-field `%s'" +#~ msgstr "¥Ó¥Ã¥È¥Õ¥£¡¼¥ë¥É `%s' ¤ÎÉý¤¬Éé¤Î¿ô¤Ç¤¹" + +#~ msgid "width of `%s' exceeds its type" +#~ msgstr "`%s' ¤ÎÉý¤Ï¤½¤Î·¿¤Î¥µ¥¤¥º¤òĶ¤¨¤Æ¤¤¤Þ¤¹" + +#~ msgid "zero width for bit-field `%s'" +#~ msgstr "¥Ó¥Ã¥È¥Õ¥£¡¼¥ë¥É `%s' ¤ÎÉý¤¬ 0 ¤Ç¤¹" + +#~ msgid "`%s' is narrower than values of its type" +#~ msgstr "`%s' ¤Ï¤½¤Î·¿¤ÎÃͤè¤ê¤â¶¹¤¤¤Ç¤¹" + +#~ msgid "flexible array member in union" +#~ msgstr "¶¦ÍÑÂΤ˲ÄÊÑÇÛÎó¥á¥ó¥Ð¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "flexible array member not at end of struct" +#~ msgstr "¹½Â¤ÂΤκǸå¤Ç¤Ï¤Ê¤¤½ê¤Ë²ÄÊÑÇÛÎó¥á¥ó¥Ð¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "flexible array member in otherwise empty struct" +#~ msgstr "¹½Â¤ÂΤ˲ÄÊÑÇÛÎó¥á¥ó¥Ð°Ê³°¤Î¥á¥ó¥Ð¤¬¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "duplicate member `%s'" +#~ msgstr "½ÅÊ£¤·¤¿¥á¥ó¥Ð `%s'" + +#~ msgid "union cannot be made transparent" +#~ msgstr "¶¦ÍÑÂΤòÆ©²áŪ¤Ë¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "redeclaration of `enum %s'" +#~ msgstr "`enum %s' ¤ÎºÆÀë¸À" + +#~ msgid "enum defined inside parms" +#~ msgstr "²¾°ú¿ôÆâ¤Ç enum ¤¬ÄêµÁ¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "enumeration values exceed range of largest integer" +#~ msgstr "Îóµó»Ò¤ÎÃͤ¬À°¿ô¤ÎÈϰϤκÇÂçÃͤòĶ¤¨¤Þ¤·¤¿" + +#~ msgid "enumerator value for `%s' not integer constant" +#~ msgstr "`%s' ¤ÎÎóµóÃͤ¬À°¿ôÄê¿ô¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "overflow in enumeration values" +#~ msgstr "ÎóµóÃͤ¬¥ª¡¼¥Ð¡¼¥Õ¥í¡¼" + +#~ msgid "ISO C restricts enumerator values to range of `int'" +#~ msgstr "ISO C ¤ÏÎóµó»Ò¤ÎÃͤò `int' ¤ÎÈϰϤ˸ÂÄꤷ¤Æ¤¤¤Þ¤¹" + +#~ msgid "return type is an incomplete type" +#~ msgstr "Ìá¤êÃͤη¿¤¬ÉÔ´°Á´·¿¤Ç¤¹" + +#~ msgid "return type defaults to `int'" +#~ msgstr "Ìá¤êÃͤη¿¤ò¥Ç¥Õ¥©¥ë¥È¤Î `int' ¤È¤·¤Þ¤¹" + +#~ msgid "no previous prototype for `%s'" +#~ msgstr "`%s' ¤ÎÁ°Êý¥×¥í¥È¥¿¥¤¥×¤¬¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "`%s' was used with no prototype before its definition" +#~ msgstr "`%s' ¤Ï¤½¤ÎÄêµÁ¤ÎÁ°¤Ë¥×¥í¥È¥¿¥¤¥×¤Ê¤·¤Ç»È¤ï¤ì¤Þ¤·¤¿" + +#~ msgid "no previous declaration for `%s'" +#~ msgstr "`%s' ¤ÎÁ°ÊýÀë¸À¤¬¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "`%s' was used with no declaration before its definition" +#~ msgstr "`%s' ¤Ï¤½¤ÎÄêµÁ¤ÎÁ°¤ÇÀë¸À¤Ê¤·¤Ç»ÈÍѤµ¤ì¤Þ¤·¤¿" + +#~ msgid "return type of `%s' is not `int'" +#~ msgstr "`%s' ¤ÎÌá¤êÃͤη¿¤¬ `int' ¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "first argument of `%s' should be `int'" +#~ msgstr "`%s' ¤ÎÂè°ì°ú¿ô¤Ï `int' ¤È¤¹¤Ù¤­¤Ç¤¹" + +#~ msgid "second argument of `%s' should be `char **'" +#~ msgstr "`%s' ¤ÎÂèÆó°ú¿ô¤Ï `char **' ¤È¤¹¤Ù¤­¤Ç¤¹" + +#~ msgid "third argument of `%s' should probably be `char **'" +#~ msgstr "`%s' ¤ÎÂè»°°ú¿ô¤Ï¤ª¤½¤é¤¯ `char **' ¤È¤¹¤Ù¤­¤Ç¤·¤ç¤¦" + +#~ msgid "`%s' takes only zero or two arguments" +#~ msgstr "`%s' ¤Ï 0 ¤« 2 ¸Ä¤Î°ú¿ô¤·¤«¤È¤ê¤Þ¤»¤ó" + +#~ msgid "`%s' is normally a non-static function" +#~ msgstr "`%s' ¤ÏÄ̾Èó static ¤Ê´Ø¿ô¤Ç¤¹" + +#~ msgid "parm types given both in parmlist and separately" +#~ msgstr "²¾°ú¿ô¤Î·¿¤¬¡¢²¾°ú¿ô¥ê¥¹¥È¤È¤ÏÊ̤ΤȤ³¤í¤«¤é¤âÍ¿¤¨¤é¤ì¤Æ¤¤¤Þ¤¹" + +#~ msgid "parameter name omitted" +#~ msgstr "²¾°ú¿ô¤¬¾Êά¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "parameter `%s' declared void" +#~ msgstr "²¾°ú¿ô `%s' ¤¬ void ¤ÈÀë¸À¤µ¤ì¤Æ¤¤¤Þ¤¹" + +#~ msgid "parameter name missing from parameter list" +#~ msgstr "²¾°ú¿ô¥ê¥¹¥È¤«¤é¤Î²¾°ú¿ô̾¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "multiple parameters named `%s'" +#~ msgstr "½ÅÊ£¤·¤¿²¾°ú¿ô̾ `%s'" + +#~ msgid "type of `%s' defaults to `int'" +#~ msgstr "`%s' ¤Î·¿¤ò¥Ç¥Õ¥©¥ë¥È¤Î `int' ¤È¤·¤Þ¤¹" + +#~ msgid "declaration for parameter `%s' but no such parameter" +#~ msgstr "²¾°ú¿ô `%s' ¤ÎÀë¸À¤¬¤¢¤ê¤Þ¤¹¤¬¡¢¤½¤ó¤Ê²¾°ú¿ô¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "number of arguments doesn't match prototype" +#~ msgstr "²¾°ú¿ô¤Î¿ô¤¬¥×¥í¥È¥¿¥¤¥×¤È°ìÃפ·¤Þ¤»¤ó" + +#~ msgid "promoted argument `%s' doesn't match prototype" +#~ msgstr "³Ê¾å¤²¤µ¤ì¤¿²¾°ú¿ô `%s' ¤Ï¥×¥í¥È¥¿¥¤¥×¤È°ìÃפ·¤Þ¤»¤ó" + +#~ msgid "argument `%s' doesn't match prototype" +#~ msgstr "²¾°ú¿ô `%s' ¤Ï¥×¥í¥È¥¿¥¤¥×¤Ë°ìÃפ·¤Þ¤»¤ó" + +#~ msgid "type of parameter `%s' is not declared" +#~ msgstr "²¾°ú¿ô `%s' ¤Î·¿¤¬Àë¸À¤µ¤ì¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "this function may return with or without a value" +#~ msgstr "¤³¤Î´Ø¿ô¤ÏÃͤòÊÖ¤·¤¿¤êÊÖ¤µ¤Ê¤«¤Ã¤¿¤ê¤¹¤ë¤Ç¤·¤ç¤¦" + +#~ msgid "size of return value of `%s' is %u bytes" +#~ msgstr "`%s' ¤ÎÌá¤êÃͤΥµ¥¤¥º¤¬ %u ¥Ð¥¤¥È¤Ç¤¹" + +#~ msgid "size of return value of `%s' is larger than %d bytes" +#~ msgstr "`%s' ¤ÎÌá¤êÃͤΥµ¥¤¥º¤¬ %d ¥Ð¥¤¥È¤è¤ê¤âÂ礭¤¯¤Ê¤ê¤Þ¤¹" + +#~ msgid "`for' loop initial declaration used outside C99 mode" +#~ msgstr "`for' ¥ë¡¼¥×¤Î½é´ü²½Àë¸À¤¬ C99 ¥â¡¼¥É°Ê³°¤Ç»È¤ï¤ì¤Þ¤·¤¿" + +#~ msgid "`%s %s' declared in `for' loop initial declaration" +#~ msgstr "`%s %s' ¤¬ `for' ¥ë¡¼¥×½é´ü²½Àë¸ÀÆâ¤ÇÀë¸À¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "declaration of non-variable `%s' in `for' loop initial declaration" +#~ msgstr "ÈóÊÑ¿ô `%s' ¤ÎÀë¸À¤¬ `for' ¥ë¡¼¥×½é´ü²½Àë¸À¤ÎÃæ¤Ë¤¢¤ê¤Þ¤¹" + +#~ msgid "declaration of static variable `%s' in `for' loop initial declaration" +#~ msgstr "¥¹¥¿¥Æ¥£¥Ã¥¯ÊÑ¿ô `%s' ¤ÎÀë¸À¤¬ `for' ¥ë¡¼¥×½é´ü²½Àë¸ÀÆâ¤Ë¤¢¤ê¤Þ¤¹" + +#~ msgid "declaration of `extern' variable `%s' in `for' loop initial declaration" +#~ msgstr "`extern' ÊÑ¿ô `%s' ¤ÎÀë¸À¤¬ `for' ¥ë¡¼¥×½é´ü²½Àë¸ÀÆâ¤Ë¤¢¤ê¤Þ¤¹" + +#~ msgid "ignoring `%s' at end of `-f%s'" +#~ msgstr "`%s'(`-f%s' ¤Î½ª¤ê¤Ë¤¢¤ë) ¤ò̵»ë¤·¤Þ¤¹" + +#~ msgid "argument format specified for non-function `%s'" +#~ msgstr "Èó´Ø¿ô `%s' ¤Î°ú¿ô¤Ë format °À­¤¬»ØÄꤵ¤ì¤Þ¤·¤¿" + +#~ msgid "unrecognized format specifier" +#~ msgstr "ǧ¼±¤Ç¤­¤Ê¤¤¥Õ¥©¡¼¥Þ¥Ã¥È»ØÄê»Ò" + +#~ msgid "`%s' is an unrecognized format function type" +#~ msgstr "`%s' ¤Ïǧ¼±¤Ç¤­¤Ê¤¤¥Õ¥©¡¼¥Þ¥Ã¥È´Ø¿ô·¿¤Ç¤¹" + +#~ msgid "format string has invalid operand number" +#~ msgstr "¥Õ¥©¡¼¥Þ¥Ã¥Èʸ»úÎó¤ËÉÔŬÀڤʥª¥Ú¥é¥ó¥É¿ô¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "format string arg follows the args to be formatted" +#~ msgstr "¥Õ¥©¡¼¥Þ¥Ã¥Èʸ»úÎó°ú¿ô¤¬¥Õ¥©¡¼¥Þ¥Ã¥È¤µ¤ì¤ë°ú¿ô¤Î¸å¤Ë³¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "format string arg not a string type" +#~ msgstr "¥Õ¥©¡¼¥Þ¥Ã¥Èʸ»úÎó°ú¿ô¤¬Ê¸»úÎ󷿤ǤϤ¢¤ê¤Þ¤»¤ó" + +#~ msgid "args to be formatted is not '...'" +#~ msgstr "¥Õ¥©¡¼¥Þ¥Ã¥È¤µ¤ì¤ë°ú¿ô¤¬¡¢'...' ¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "strftime formats cannot format arguments" +#~ msgstr "strftime ¥Õ¥©¡¼¥Þ¥Ã¥È¤Ï°ú¿ô¤ò¥Õ¥©¡¼¥Þ¥Ã¥È¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "function does not return string type" +#~ msgstr "´Ø¿ô¤¬Ê¸»úÎ󷿤òÊÖ¤·¤Þ¤»¤ó" + +#~ msgid "` ' flag" +#~ msgstr "` ' ¥Õ¥é¥°" + +#~ msgid "the ` ' printf flag" +#~ msgstr "printf ¤Î ` ' ¥Õ¥é¥°" + +#~ msgid "`+' flag" +#~ msgstr "`+' ¥Õ¥é¥°" + +#~ msgid "the `+' printf flag" +#~ msgstr "printf ¤Î `+' ¥Õ¥é¥°" + +#~ msgid "`#' flag" +#~ msgstr "`#' ¥Õ¥é¥°" + +#~ msgid "the `#' printf flag" +#~ msgstr "printf ¤Î `#' ¥Õ¥é¥°" + +#~ msgid "`0' flag" +#~ msgstr "`0' ¥Õ¥é¥°" + +#~ msgid "the `0' printf flag" +#~ msgstr "printf ¤Î `0' ¥Õ¥é¥°" + +#~ msgid "`-' flag" +#~ msgstr "`-' ¥Õ¥é¥°" + +#~ msgid "the `-' printf flag" +#~ msgstr "printf ¤Î `-' ¥Õ¥é¥°" + +#~ msgid "`'' flag" +#~ msgstr "`'' ¥Õ¥é¥°" + +#~ msgid "the `'' printf flag" +#~ msgstr "printf ¤Î `'' ¥Õ¥é¥°" + +#~ msgid "`I' flag" +#~ msgstr "`I' ¥Õ¥é¥°" + +#~ msgid "the `I' printf flag" +#~ msgstr "printf ¤Î `I' ¥Õ¥é¥°" + +#~ msgid "field width" +#~ msgstr "¥Õ¥£¡¼¥ë¥ÉÉý" + +#~ msgid "field width in printf format" +#~ msgstr "printf ¥Õ¥©¡¼¥Þ¥Ã¥È¤Ç¤Î¥Õ¥£¡¼¥ë¥ÉÉý" + +#~ msgid "precision" +#~ msgstr "ÀºÅÙ" + +#~ msgid "precision in printf format" +#~ msgstr "printf ¥Õ¥©¡¼¥Þ¥Ã¥È¤Ç¤ÎÀºÅÙ" + +#~ msgid "length modifier" +#~ msgstr "Ťµ½¤¾þ»Ò" + +#~ msgid "length modifier in printf format" +#~ msgstr "printf ¥Õ¥©¡¼¥Þ¥Ã¥È¤ÎŤµ½¤¾þ»Ò" + +#~ msgid "assignment suppression" +#~ msgstr "ÂåÆþ¤ÎÍÞÀ©" + +#~ msgid "`a' flag" +#~ msgstr "`a' ¥Õ¥é¥°" + +#~ msgid "the `a' scanf flag" +#~ msgstr "scanf ¤Î `a' ¥Õ¥é¥°" + +#~ msgid "field width in scanf format" +#~ msgstr "scanf ¥Õ¥©¡¼¥Þ¥Ã¥È¤Î¥Õ¥£¡¼¥ë¥ÉÉý" + +#~ msgid "length modifier in scanf format" +#~ msgstr "scanf ¥Õ¥©¡¼¥Þ¥Ã¥È¤ÎŤµ½¤¾þ»Ò" + +#~ msgid "the `'' scanf flag" +#~ msgstr "scanf ¤Î `'' ¥Õ¥é¥°" + +#~ msgid "the `I' scanf flag" +#~ msgstr "scanf ¤Î `I' ¥Õ¥é¥°" + +#~ msgid "`_' flag" +#~ msgstr "`_' ¥Õ¥é¥°" + +#~ msgid "the `_' strftime flag" +#~ msgstr "strftime ¤Î `_' ¥Õ¥é¥°" + +#~ msgid "the `-' strftime flag" +#~ msgstr "strftime ¤Î `-' ¥Õ¥é¥°" + +#~ msgid "the `0' strftime flag" +#~ msgstr "strftime ¤Î `^' ¥Õ¥é¥°" + +#~ msgid "`^' flag" +#~ msgstr "`^' ¥Õ¥é¥°" + +#~ msgid "the `^' strftime flag" +#~ msgstr "strftime ¤Î `^' ¥Õ¥é¥°" + +#~ msgid "the `#' strftime flag" +#~ msgstr "strftime ¤Î `#' ¥Õ¥é¥°" + +#~ msgid "field width in strftime format" +#~ msgstr "strftime ¥Õ¥©¡¼¥Þ¥Ã¥È¤Î¥Õ¥£¡¼¥ë¥ÉÉý" + +#~ msgid "`E' modifier" +#~ msgstr "`E' ½¤¾þ»Ò" + +#~ msgid "the `E' strftime modifier" +#~ msgstr "strftime ¤Î `E' ½¤¾þ»Ò" + +#~ msgid "`O' modifier" +#~ msgstr "`O' ½¤¾þ»Ò" + +#~ msgid "the `O' strftime modifier" +#~ msgstr "strftime ¤Î `O' ½¤¾þ»Ò" + +#~ msgid "the `O' modifier" +#~ msgstr "the `O' ½¤¾þ»Ò" + +#~ msgid "fill character" +#~ msgstr "µÍ¤áʸ»ú" + +#~ msgid "fill character in strfmon format" +#~ msgstr "strfmon ¥Õ¥©¡¼¥Þ¥Ã¥È¤ÎµÍ¤áʸ»ú" + +#~ msgid "the `^' strfmon flag" +#~ msgstr "strfmon ¤Î `^' ¥Õ¥é¥°" + +#~ msgid "the `+' strfmon flag" +#~ msgstr "strfmon ¤Î `+' ¥Õ¥é¥°" + +#~ msgid "`(' flag" +#~ msgstr "`(' ¥Õ¥é¥°" + +#~ msgid "the `(' strfmon flag" +#~ msgstr "strfmon ¤Î `(' ¥Õ¥é¥°" + +#~ msgid "`!' flag" +#~ msgstr "`!' ¥Õ¥é¥°" + +#~ msgid "the `!' strfmon flag" +#~ msgstr "strfmon ¤Î `!' ¥Õ¥é¥°" + +#~ msgid "the `-' strfmon flag" +#~ msgstr "strfmon ¤Î `-' ¥Õ¥é¥°" + +#~ msgid "field width in strfmon format" +#~ msgstr "strfmon ¥Õ¥©¡¼¥Þ¥Ã¥È¤Î¥Õ¥£¡¼¥ë¥ÉÉý" + +#~ msgid "left precision" +#~ msgstr "º¸ÀºÅÙ" + +#~ msgid "left precision in strfmon format" +#~ msgstr "strfmon ¥Õ¥©¡¼¥Þ¥Ã¥È¤Îº¸ÀºÅÙ" + +#~ msgid "right precision" +#~ msgstr "±¦ÀºÅÙ" + +#~ msgid "right precision in strfmon format" +#~ msgstr "strfmon ¥Õ¥©¡¼¥Þ¥Ã¥È¤Î±¦ÀºÅÙ" + +#~ msgid "length modifier in strfmon format" +#~ msgstr "strfmon ¥Õ¥©¡¼¥Þ¥Ã¥È¤ÎŤµ½¤¾þ»Ò" + +#~ msgid "function might be possible candidate for `%s' format attribute" +#~ msgstr "´Ø¿ô¤Ï¶²¤é¤¯ `%s' format °À­¤Î¸õÊä¤È»×¤ï¤ì¤Þ¤¹" + +#~ msgid "missing $ operand number in format" +#~ msgstr "¥Õ¥©¡¼¥Þ¥Ã¥ÈÆâ¤Ç $ ±é»»»ÒÈÖ¹æ¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "%s does not support %%n$ operand number formats" +#~ msgstr "%s ¤Ï %%n$ ±é»»»ÒÈÖ¹æ¥Õ¥©¡¼¥Þ¥Ã¥È¤ò¼õ¤±ÉÕ¤±¤Þ¤»¤ó" + +#~ msgid "operand number out of range in format" +#~ msgstr "±é»»»ÒÈֹ椬¥Õ¥©¡¼¥Þ¥Ã¥È¤ÎÈϰϳ°¤Ç¤¹" + +#~ msgid "format argument %d used more than once in %s format" +#~ msgstr "¥Õ¥©¡¼¥Þ¥Ã¥È°ú¿ô %d ¤¬ %s ¥Õ¥©¡¼¥Þ¥Ã¥ÈÃæ¤ÇÆó²ó°Ê¾å»È¤ï¤ì¤Þ¤·¤¿" + +#~ msgid "format argument %d unused before used argument %d in $-style format" +#~ msgstr "$-¼°¥Õ¥©¡¼¥Þ¥Ã¥ÈÆâ¤Î¥Õ¥©¡¼¥Þ¥Ã¥È°ú¿ô %d ¤¬°ú¿ô %d ¤¬»È¤ï¤ì¤ëÁ°¤Ç̤»ÈÍѤǤ¹" + +#~ msgid "format not a string literal, format string not checked" +#~ msgstr "¥Õ¥©¡¼¥Þ¥Ã¥È¤¬Ê¸»úÎó¥ê¥Æ¥é¥ë¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¤Î¤Ç¡¢¥Õ¥©¡¼¥Þ¥Ã¥È¤Ï¸¡ºº¤µ¤ì¤Þ¤»¤ó" + +#~ msgid "format not a string literal and no format arguments" +#~ msgstr "¥Õ¥©¡¼¥Þ¥Ã¥È¤ÏÈóʸ»úÎó¥ê¥Æ¥é¥ë¤Ç¡¢³î¤Ä¥Õ¥©¡¼¥Þ¥Ã¥È°ú¿ô¤ò»ý¤Á¤Þ¤»¤ó" + +#~ msgid "format not a string literal, argument types not checked" +#~ msgstr "¥Õ¥©¡¼¥Þ¥Ã¥È¤Ïʸ»úÎó¥ê¥Æ¥é¥ë¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¤Î¤Ç¡¢°ú¿ô¤Î·¿¤Ï¸¡ºº¤µ¤ì¤Þ¤»¤ó" + +#~ msgid "too many arguments for format" +#~ msgstr "¥Õ¥©¡¼¥Þ¥Ã¥È¤Ø¤Î°ú¿ô¤¬Â¿¤¹¤®¤Þ¤¹" + +#~ msgid "unused arguments in $-style format" +#~ msgstr "$-¼°¤Î¥Õ¥©¡¼¥Þ¥Ã¥È¤Ç̤»ÈÍѤΰú¿ô¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "zero-length format string" +#~ msgstr "Ťµ 0 ¤Î¥Õ¥©¡¼¥Þ¥Ã¥Èʸ»úÎó" + +#~ msgid "format is a wide character string" +#~ msgstr "¥Õ¥©¡¼¥Þ¥Ã¥È¤¬¥ï¥¤¥Éʸ»úÎó¤Ç¤¹" + +#~ msgid "unterminated format string" +#~ msgstr "½ªÃ¼¤µ¤ì¤Æ¤¤¤Ê¤¤¥Õ¥©¡¼¥Þ¥Ã¥Èʸ»úÎó" + +#~ msgid "null format string" +#~ msgstr "¥Õ¥©¡¼¥Þ¥Ã¥Èʸ»úÎó¤¬ null ¤Ç¤¹" + +#~ msgid "embedded `\\0' in format" +#~ msgstr "¥Õ¥©¡¼¥Þ¥Ã¥È¤Ë `\\0' ¤¬Ëä¤á¹þ¤Þ¤ì¤Æ¤¤¤Þ¤¹" + +#~ msgid "spurious trailing `%%' in format" +#~ msgstr "¥Õ¥©¡¼¥Þ¥Ã¥È¤Ë `%%' ¤Îº¯Àפ餷¤­¤â¤Î¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "repeated %s in format" +#~ msgstr "¥Õ¥©¡¼¥Þ¥Ã¥ÈÃæ¤Ç %s ¤ò·«¤êÊÖ¤·¤Æ¤¤¤Þ¤¹" + +#~ msgid "missing fill character at end of strfmon format" +#~ msgstr "strfmon ¥Õ¥©¡¼¥Þ¥Ã¥È¤Î½ª¤ê¤ÇµÍ¤áʸ»ú¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "too few arguments for format" +#~ msgstr "¥Õ¥©¡¼¥Þ¥Ã¥È¤Ø¤Î°ú¿ô¤¬¾¯¤Ê¤¹¤®¤Þ¤¹" + +#~ msgid "zero width in %s format" +#~ msgstr "%s ¤ÇÉý 0 ¤Î¥Õ¥©¡¼¥Þ¥Ã¥È¤Ç¤¹" + +#~ msgid "empty left precision in %s format" +#~ msgstr "%s ¤Ç¶õ¤Îº¸ÀºÅÙ¥Õ¥©¡¼¥Þ¥Ã¥È¤Ç¤¹" + +#~ msgid "field precision" +#~ msgstr "¥Õ¥£¡¼¥ë¥ÉÀºÅÙ" + +#~ msgid "empty precision in %s format" +#~ msgstr "%s ¤Ç¶õ¤ÎÀºÅÙ¥Õ¥©¡¼¥Þ¥Ã¥È¤Ç¤¹" + +#~ msgid "%s does not support the `%s' %s length modifier" +#~ msgstr "%s ¤Ï `%s' %s Ťµ½¤¾þ»Ò¤ò¼õ¤±ÉÕ¤±¤Þ¤»¤ó" + +#~ msgid "conversion lacks type at end of format" +#~ msgstr "¥Õ¥©¡¼¥Þ¥Ã¥È¤Î½ª¤ê¤Ç·¿ÊÑ´¹Ê¸»ú¤¬·ç¤±¤Æ¤¤¤Þ¤¹" + +#~ msgid "unknown conversion type character `%c' in format" +#~ msgstr "¥Õ¥©¡¼¥Þ¥Ã¥ÈÆâ¤ËÉÔÌÀ¤Ê·¿ÊÑ´¹Ê¸»ú `%c' ¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "unknown conversion type character 0x%x in format" +#~ msgstr "¥Õ¥©¡¼¥Þ¥Ã¥ÈÆâ¤ËÉÔÌÀ¤Ê·¿ÊÑ´¹Ê¸»ú 0x%x ¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "%s does not support the `%%%c' %s format" +#~ msgstr "%s ¤Ï `%%%c' %s ¥Õ¥©¡¼¥Þ¥Ã¥È¤ò¼õ¤±ÉÕ¤±¤Þ¤»¤ó" + +#~ msgid "%s used with `%%%c' %s format" +#~ msgstr "%s ¤¬ `%%%c' %s ¥Õ¥©¡¼¥Þ¥Ã¥È¤È°ì½ï¤Ë»È¤ï¤ì¤Þ¤·¤¿" + +#~ msgid "%s does not support %s" +#~ msgstr "%s ¤Ï %s ¤ò¼õ¤±ÉÕ¤±¤Þ¤»¤ó" + +#~ msgid "%s does not support %s with the `%%%c' %s format" +#~ msgstr "%s ¤Ï %s ¤ò `%%%c' %s ¥Õ¥©¡¼¥Þ¥Ã¥È¤È°ì½ï¤Ë»È¤¦»ö¤ò¼õ¤±ÉÕ¤±¤Þ¤»¤ó" + +#~ msgid "%s ignored with %s and `%%%c' %s format" +#~ msgstr "%s ¤Ï %s µÚ¤Ó `%%%c' %s ¥Õ¥©¡¼¥Þ¥Ã¥È¤È°ì½ï¤Ë»È¤¦¤È̵»ë¤µ¤ì¤Þ¤¹" + +#~ msgid "%s ignored with %s in %s format" +#~ msgstr "%s ¤Ï %s ¤ò %s ¥Õ¥©¡¼¥Þ¥Ã¥È¤Ç°ì½ï¤Ë»È¤¦¤È̵»ë¤µ¤ì¤Þ¤¹" + +#~ msgid "use of %s and %s together with `%%%c' %s format" +#~ msgstr "%s ¤È %s ¤È¤ò `%%%c' %s ¥Õ¥©¡¼¥Þ¥Ã¥È¤È°ì½ï¤Ë»È¤Ã¤Æ¤¤¤Þ¤¹" + +#~ msgid "use of %s and %s together in %s format" +#~ msgstr "%s ¤È %s ¤È¤ò %s ¥Õ¥©¡¼¥Þ¥Ã¥È¤ÎÃæ¤Ç»È¤Ã¤Æ¤¤¤Þ¤¹" + +#~ msgid "`%%%c' yields only last 2 digits of year in some locales" +#~ msgstr "`%%%c' ¤Ï¥í¥±¡¼¥ë¤Ë¤è¤Ã¤Æ¤Ï¡¢Ç¯¤Î²¼Æó·å¤À¤±¤ò¤â¤¿¤é¤·¤Þ¤¹" + +#~ msgid "`%%%c' yields only last 2 digits of year" +#~ msgstr "`%%%c' ¤Ïǯ¤Î²¼Æó·å¤À¤±¤ò¤â¤¿¤é¤·¤Þ¤¹" + +#~ msgid "no closing `]' for `%%[' format" +#~ msgstr "`%%[' ¥Õ¥©¡¼¥Þ¥Ã¥È¤òÊĤ¸¤ë `]' ¤¬¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "use of `%s' length modifier with `%c' type character" +#~ msgstr "`%s' Ťµ½¤¾þ»Ò¤ò `%c' ·¿ÊÑ´¹Ê¸»ú¤È°ì½ï¤Ë»È¤Ã¤Æ¤¤¤Þ¤¹" + +#~ msgid "%s does not support the `%%%s%c' %s format" +#~ msgstr "%s ¤Ï `%%%s%c' %s ¥Õ¥©¡¼¥Þ¥Ã¥È¤ò¼õ¤±ÉÕ¤±¤Þ¤»¤ó" + +#~ msgid "operand number specified with suppressed assignment" +#~ msgstr "±é»»»ÒÈֹ椬ÂåÆþ¤ÎÍÞÀ©¤È¶¦¤Ë»È¤ï¤ì¤Æ¤¤¤Þ¤¹" + +#~ msgid "operand number specified for format taking no argument" +#~ msgstr "±é»»»ÒÈֹ椬°ú¿ô¤ò¼è¤é¤Ê¤¤¥Õ¥©¡¼¥Þ¥Ã¥È¤Ç»ØÄꤵ¤ì¤Þ¤·¤¿" + +#~ msgid "writing through null pointer (arg %d)" +#~ msgstr "null ¥Ý¥¤¥ó¥¿¤ò½ñ¤­¹þ¤ó¤Ç¤¤¤Þ¤¹ (°ú¿ô %d)" + +#~ msgid "reading through null pointer (arg %d)" +#~ msgstr "null ¥Ý¥¤¥ó¥¿¤òÆɹþ¤ó¤Ç¤¤¤Þ¤¹ (°ú¿ô %d)" + +#~ msgid "writing into constant object (arg %d)" +#~ msgstr "Äê¿ô¥ª¥Ö¥¸¥§¥¯¥È¤Ë½ñ¤­¹þ¤ó¤Ç¤¤¤Þ¤¹ (°ú¿ô %d)" + +#~ msgid "extra type qualifiers in format argument (arg %d)" +#~ msgstr "¥Õ¥©¡¼¥Þ¥Ã¥È°ú¿ô¤Ë;ʬ¤Ê·¿½¤¾þ»Ò¤¬¤¢¤ê¤Þ¤¹ (°ú¿ô %d)" + +#~ msgid "format argument is not a pointer (arg %d)" +#~ msgstr "¥Õ¥©¡¼¥Þ¥Ã¥È°ú¿ô¤¬¥Ý¥¤¥ó¥¿¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó (°ú¿ô %d)" + +#~ msgid "format argument is not a pointer to a pointer (arg %d)" +#~ msgstr "¥Õ¥©¡¼¥Þ¥Ã¥È°ú¿ô¤¬¥Ý¥¤¥ó¥¿¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó (°ú¿ô %d)" + +#~ msgid "%s is not type %s (arg %d)" +#~ msgstr "%s ¤Ï·¿ %s ¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó (°ú¿ô %d)" + +#~ msgid "%s format, %s arg (arg %d)" +#~ msgstr "¥Õ¥©¡¼¥Þ¥Ã¥È¤Ï %s ¤Ç¤¹¤¬¡¢°ú¿ô¤Ï %s ¤Ç¤¹ (°ú¿ô %d)" + +#~ msgid "badly nested C headers from preprocessor" +#~ msgstr "¥×¥ê¥×¥í¥»¥Ã¥µ¤«¤é°Û¾ï¤Ë¥Í¥¹¥È¤µ¤ì¤¿ C ¥Ø¥Ã¥À¤Ç¤¹" + +#~ msgid "leaving more files than we entered" +#~ msgstr "Æþ¤Ã¤¿¥Õ¥¡¥¤¥ë¤è¤ê¤â½Ð¤¿¥Õ¥¡¥¤¥ë¤ÎÊý¤¬Â¿¤¯¤Ê¤ê¤Þ¤·¤¿" + +#~ msgid "ignoring #pragma %s %s" +#~ msgstr "#pragma %s %s ¤ò̵»ë¤·¤Þ¤¹" + +#~ msgid "ignoring #pragma %s" +#~ msgstr "#pragma %s ¤ò̵»ë¤·¤Þ¤¹" + +#~ msgid "non hex digit '%c' in universal-character-name" +#~ msgstr "Èó 16 ¿Ê¿ô '%c' ¤¬ universal-character-name Æâ¤Ë¤¢¤ê¤Þ¤¹" + +#~ msgid "universal-character-name on EBCDIC target" +#~ msgstr "EBCDIC ¤Î¥¿¡¼¥²¥Ã¥È¤Ç `%c' ¤Ë¥æ¥Ë¥Ð¡¼¥µ¥ë¥­¥ã¥é¥¯¥¿Ì¾¤¬»È¤ï¤ì¤Þ¤·¤¿" + +#~ msgid "universal-character-name used for '%c'" +#~ msgstr "`%c' ¤Ë¥æ¥Ë¥Ð¡¼¥µ¥ë¥­¥ã¥é¥¯¥¿Ì¾¤¬»È¤ï¤ì¤Þ¤·¤¿" + +#~ msgid "hex escape out of range" +#~ msgstr "16 ¿Ê¥¨¥¹¥±¡¼¥×¥·¡¼¥±¥ó¥¹¤¬Èϰϳ°¤Ç¤¹" + +#~ msgid "unknown escape sequence: '\\' followed by char 0x%x" +#~ msgstr "ÉÔÌÀ¤Ê¥¨¥¹¥±¡¼¥×¥·¡¼¥±¥ó¥¹: ʸ»ú 0x%x ¤¬¸å¤Ë³¤¯ '\\'" + +#~ msgid "universal-character-name '\\u%04x' not valid in identifier" +#~ msgstr "¥æ¥Ë¥Ð¡¼¥µ¥ëʸ»ú̾ `\\u%04x' ¤Ï¼±Ê̻ҤÎÃæ¤Ç¤ÏÍ­¸ú¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "both 'f' and 'l' suffixes on floating constant" +#~ msgstr "ÉâÆ°¾®¿ôÄê¿ô¤Ë 'f' ¤È 'l' ÀÜÈø¼­¤ÎξÊý¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "floating point number exceeds range of '%s'" +#~ msgstr "ÉâÆ°¾®¿ôÅÀ¿ô¤¬ '%s' ¤ÎÈϰϤòĶ¤¨¤Þ¤·¤¿" + +#~ msgid "stray '%c' in program" +#~ msgstr "¥×¥í¥°¥é¥à¤È¤·¤Æ°ï椷¤¿Ê¸»ú '%c'" + +#~ msgid "stray '\\%o' in program" +#~ msgstr "¥×¥í¥°¥é¥à¤È¤·¤Æ°ï椷¤¿Ê¸»ú '\\%o'" + +#~ msgid "floating constant may not be in radix 16" +#~ msgstr "´ð¿ô 16 ¤ÎÉâÆ°¾¯¿ôÄê¿ô¤Ïµö¤µ¤ì¤Þ¤»¤ó" + +#~ msgid "traditional C rejects the 'l' suffix" +#~ msgstr "¸Å¤¤ C ¤Ç¤Ï 'l' ÀÜÈø¼­¤¬µñÈݤµ¤ì¤Þ¤¹" + +#~ msgid "ISO C forbids imaginary numeric constants" +#~ msgstr "ISO C ¤Ç¤Ïµõ¿ôÄê¿ô¤ò¶Ø¤¸¤Æ¤¤¤Þ¤¹" + +#~ msgid "floating point number exceeds range of 'double'" +#~ msgstr "ÉâÆ°¾®¿ôÅÀ¿ô¤¬ 'double' ¤ÎÈϰϤòĶ¤¨¤Æ¤¤¤Þ¤¹" + +#~ msgid "two 'u' suffixes on integer constant" +#~ msgstr "2 ¤Ä¤Î 'u' ÀÜÈø¼­¤¬À°¿ôÄê¿ô¤Ë¤Ä¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "traditional C rejects the 'u' suffix" +#~ msgstr "ÅÁÅýŪ¤Ê C ¤Ç¤Ï 'u' ÀÜÈø¼­¤¬µñÈݤµ¤ì¤Þ¤¹" + +#~ msgid "three 'l' suffixes on integer constant" +#~ msgstr "3 ¤Ä¤Î 'l' ÀÜÈø¼­¤¬À°¿ôÄê¿ô¤Ë¤Ä¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "'lul' is not a valid integer suffix" +#~ msgstr "'lul' ¤ÏÀµ¾ï¤ÊÀ°¿ôÀÜÈø¼­¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "'Ll' and 'lL' are not valid integer suffixes" +#~ msgstr "'Ll' ¤È 'lL' ¤ÏÀµ¾ï¤ÊÀ°¿ôÀÜÈø¼­¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "more than one 'i' or 'j' suffix on integer constant" +#~ msgstr "Ê£¿ô¤Î 'i' ¤ä 'j' ÀÜÈø¼­¤¬À°¿ôÄê¿ô¤Ë¤Ä¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "integer constant is too large for this configuration of the compiler - truncated to %d bits" +#~ msgstr "À°¿ôÄê¿ô¤¬¥³¥ó¥Ñ¥¤¥é¤Î¸½ºß¤ÎÀßÄê¤è¤êÂ礭¤¹¤®¤ë¤¿¤á¡¢%d ¥Ó¥Ã¥È¤ËÀÚ¤êµÍ¤á¤Þ¤·¤¿" + +#~ msgid "width of integer constant changes with -traditional" +#~ msgstr "-traditional ¤ò¤Ä¤±¤ë¤ÈÀ°¿ôÄê¿ô¤ÎÉý¤¬ÊѤï¤ê¤Þ¤¹" + +#~ msgid "integer constant is unsigned in ISO C, signed with -traditional" +#~ msgstr "À°¿ôÄê¿ô¤Ï ISO C ¤Ç¤ÏÉä¹ç̵¤·¤Ç¡¢-traditional ¤ò¤Ä¤±¤ë¤ÈÉä¹çÉÕ¤­¤Ç¤¹" + +#~ msgid "width of integer constant may change on other systems with -traditional" +#~ msgstr "À°¿ôÄê¿ô¤ÎÉý¤Ï¾¤Î¥·¥¹¥Æ¥à¤Ç -traditional ¤ò¤Ä¤±¤ë¤ÈÊѤï¤ë¤Ç¤·¤ç¤¦" + +#~ msgid "integer constant larger than the maximum value of %s" +#~ msgstr "%s ¤ÎºÇÂçÃͤè¤ê¤âÂ礭¤ÊÃͤÎÀ°¿ôÄê¿ô¤Ç¤¹" + +#~ msgid "decimal constant is so large that it is unsigned" +#~ msgstr "½½¿ÊÄê¿ô¤¬¤È¤Æ¤âÂ礭¤¤¤Î¤ÇÉä¹ç̵¤·¤È¤·¤Þ¤·¤¿" + +#~ msgid "integer constant is larger than the maximum value for its type" +#~ msgstr "¤½¤Î·¿¤ÎºÇÂçÃͤè¤ê¤âÂ礭¤ÊÃͤÎÀ°¿ôÄê¿ô¤Ç¤¹" + +#~ msgid "missing white space after number '%.*s'" +#~ msgstr "¿ô»ú '%.*s' ¤Î¸å¤Ë¶õÇò¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "Ignoring invalid multibyte character" +#~ msgstr "̵¸ú¤Ê¥Þ¥ë¥Á¥Ð¥¤¥Èʸ»ú¤ò̵»ë¤·¤Þ¤¹" + +#~ msgid "syntax error" +#~ msgstr "ʸˡ¥¨¥é¡¼" + +#~ msgid "ISO C forbids an empty source file" +#~ msgstr "ISO C ¤Ï¶õ¤Î¥½¡¼¥¹¥Õ¥¡¥¤¥ë¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "argument of `asm' is not a constant string" +#~ msgstr "`asm' ¤Î°ú¿ô¤¬Äê¿ôʸ»úÎó¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó " + +#~ msgid "ISO C forbids data definition with no type or storage class" +#~ msgstr "ISO C ¤Ï·¿¤äµ­²±¥¯¥é¥¹¤Î¤Ê¤¤¥Ç¡¼¥¿ÄêµÁ¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "data definition has no type or storage class" +#~ msgstr "¥Ç¡¼¥¿ÄêµÁ¤¬·¿¤äµ­²±¥¯¥é¥¹¤ò»ý¤Ã¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "ISO C does not allow extra `;' outside of a function" +#~ msgstr "ISO C ¤Ç¤Ï´Ø¿ô³°¤Ç¤Î;ʬ¤Ê `;' ¤òµö¤·¤Þ¤»¤ó" + +#~ msgid "ISO C forbids `&&'" +#~ msgstr "ISO C ¤Ï `&&' ¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "`sizeof' applied to a bit-field" +#~ msgstr "¥Ó¥Ã¥È¥Õ¥£¡¼¥ë¥É¤ËŬÍѤµ¤ì¤¿ `sizeof'" + +#~ msgid "ISO C forbids omitting the middle term of a ?: expression" +#~ msgstr "ISO C ¤ÏÃæ´Ö¹à¤¬¾Êά¤µ¤ì¤¿ ?: ¼°¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "ISO C89 forbids compound literals" +#~ msgstr "ISO C89 ¤ÏÊ£¹ç¥ê¥Æ¥é¥ë¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "ISO C forbids braced-groups within expressions" +#~ msgstr "ISO C ¤Ï¥Ö¥ì¡¼¥¹¤Ç¤Þ¤È¤á¤é¤ì¤¿¼°¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "traditional C rejects string concatenation" +#~ msgstr "¸Å¤¤ C ¤Ç¤Ïʸ»úÎó·ë¹ç¤òµñÈݤ·¤Þ¤¹" + +#~ msgid "ISO C does not permit use of `varargs.h'" +#~ msgstr "ISO C ¤Ç¤Ï `varargs.h' ¤ÎÍøÍѤòµö¤·¤Þ¤»¤ó" + +#~ msgid "`%s' is not at beginning of declaration" +#~ msgstr "`%s' ¤ÏÀë¸À¤Î»Ï¤Þ¤ê¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "ISO C forbids empty initializer braces" +#~ msgstr "ISO C ¤Ç¤Ï¶õ¤Î½é´ü²½Íѥ֥졼¥¹¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "ISO C89 forbids specifying subobject to initialize" +#~ msgstr "ISO C89 ¤Ï½é´ü²½ÍѤÎÉû¥ª¥Ö¥¸¥§¥¯¥È»ØÄê¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "obsolete use of designated initializer without `='" +#~ msgstr "`=' ¤Î¤Ê¤¤¥á¥ó¥Ð»Ø̾½é´ü²½»Ò¤ÏÇѤì¤Þ¤·¤¿" + +#~ msgid "obsolete use of designated initializer with `:'" +#~ msgstr "`:' ¤ò¤Ä¤±¤ë¥á¥ó¥Ð»Ø̾½é´ü²½»Ò¤ÏÇѤì¤Þ¤·¤¿" + +#~ msgid "ISO C forbids specifying range of elements to initialize" +#~ msgstr "ISO C ¤Ï½é´ü²½ÍѤÎÍ×ÁÇÈÏ°Ï»ØÄê¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "ISO C forbids nested functions" +#~ msgstr "ISO C ¤Ï ¥Í¥¹¥È¤µ¤ì¤¿´Ø¿ô¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "`[*]' in parameter declaration only allowed in ISO C 99" +#~ msgstr "²¾°ú¿ôÀë¸ÀÃæ¤Î `[*]' ¤Ï ISO C 99 ¤Ç¤Î¤ßµö¤µ¤ì¤Æ¤¤¤Þ¤¹" + +#~ msgid "ISO C forbids forward references to `enum' types" +#~ msgstr "ISO C ¤Ï `enum' ·¿¤ÎÁ°Êý»²¾È¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "comma at end of enumerator list" +#~ msgstr "Îóµó»Ò¥ê¥¹¥È¤ÎºÇ¸å¤Ë¥«¥ó¥Þ¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "no semicolon at end of struct or union" +#~ msgstr "struct ¤ä union ¤ÎºÇ¸å¤Ë¥»¥ß¥³¥í¥ó¤¬¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "extra semicolon in struct or union specified" +#~ msgstr "struct ¤ä union ¤ÎÃæ¤Ç;ʬ¤Ê¥»¥ß¥³¥í¥ó¤¬»ØÄꤵ¤ì¤Þ¤·¤¿" + +#~ msgid "ISO C doesn't support unnamed structs/unions" +#~ msgstr "ISO C ¤Ç¤Ï̵̾¹½Â¤ÂΤ䶦ÍÑÂΤò¼õ¤±ÉÕ¤±¤Þ¤»¤ó" + +#~ msgid "ISO C forbids member declarations with no members" +#~ msgstr "ISO C ¤Ï¥á¥ó¥Ð¤Î¤Ê¤¤¥á¥ó¥ÐÀë¸À¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "deprecated use of label at end of compound statement" +#~ msgstr "Ê£¹çʸ¤Î½ª¤ê¤Ç¥é¥Ù¥ë¤ò»È¤¦¤³¤È¤Ï¿ä¾©¤µ¤ì¤Þ¤»¤ó" + +#~ msgid "ISO C89 forbids mixed declarations and code" +#~ msgstr "ISO C89 ¤ÏÀë¸À¤È¥³¡¼¥É¤È¤Îº®¹ç¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "ISO C forbids label declarations" +#~ msgstr "ISO C ¤Ï¥é¥Ù¥ëÀë¸À¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "braced-group within expression allowed only inside a function" +#~ msgstr "¥Ö¥ì¡¼¥¹¤Ç¤Þ¤È¤á¤é¤ì¤¿¼°¤Ï´Ø¿ô¤ÎÆ⦤ǤΤߵö¤µ¤ì¤Þ¤¹" + +#~ msgid "empty body in an else-statement" +#~ msgstr "else ʸ¤ÎÃæ¿È¤¬¶õ¤Ç¤¹" + +#~ msgid "ISO C forbids `goto *expr;'" +#~ msgstr "ISO C `goto *¼°;' ¤Î½ñ¤­Êý¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "ISO C forbids forward parameter declarations" +#~ msgstr "ISO C ¤ÏÁ°Êý²¾°ú¿ôÀë¸À¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "ISO C requires a named argument before `...'" +#~ msgstr "ISO C ¤Ï `...' ¤ÎÁ°¤Ë̾Á°¤ò¤Ä¤±¤é¤ì¤¿°ú¿ô¤òÍ׵ᤷ¤Þ¤¹" + +#~ msgid "`...' in old-style identifier list" +#~ msgstr "¸Å¤¤¥¹¥¿¥¤¥ë¤Î¼±Ê̻ҥꥹ¥È¤Ç¤Î `...'" + +#~ msgid "%s at end of input" +#~ msgstr "ÆþÎϤκǸå¤Ë %s" + +#~ msgid "%s before %s'%c'" +#~ msgstr "%s ¤¬ %s'%c' ¤ÎÁ°¤Ë¤¢¤ê¤Þ¤¹" + +#~ msgid "%s before %s'\\x%x'" +#~ msgstr "%s ¤¬ %s'\\x%x' ¤ÎÁ°¤Ë¤¢¤ê¤Þ¤¹" + +#~ msgid "%s before string constant" +#~ msgstr "ʸ»úÎóÄê¿ô¤ÎÁ°¤Ë %s" + +#~ msgid "%s before numeric constant" +#~ msgstr "¿ôÃÍÄê¿ô¤ÎÁ°¤Ë %s" + +#~ msgid "%s before \"%s\"" +#~ msgstr "%s ¤¬ \"%s\" ¤ÎÁ°¤Ë¤¢¤ê¤Þ¤¹" + +#~ msgid "%s before '%s' token" +#~ msgstr "%s ¤¬ '%s' ¥È¡¼¥¯¥ó¤ÎÁ°¤Ë¤¢¤ê¤Þ¤¹" + +#~ msgid "syntax error at '%s' token" +#~ msgstr "'%s' ¥È¡¼¥¯¥ó¤Î½ê¤Çʸˡ¥¨¥é¡¼" + +#~ msgid "YYDEBUG not defined." +#~ msgstr "YYDEBUG ¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "#pragma pack (pop) encountered without matching #pragma pack (push, )" +#~ msgstr "#pragma pack (pop) ¤¬¡¢Âбþ¤¹¤ë #pragma pack (push, ) ¤Ê¤·¤Ë½Ð¸½¤·¤Þ¤·¤¿" + +#~ msgid "#pragma pack(pop, %s) encountered without matching #pragma pack(push, %s, )" +#~ msgstr "#pragma pack(pop, %s) ¤¬¡¢Âбþ¤¹¤ë #pragma pack(push, %s) ¤Ê¤·¤Ë½Ð¸½¤·¤Þ¤·¤¿" + +#~ msgid "junk at end of '#pragma pack'" +#~ msgstr "'#pragma pack' ¤ÎËöÈø¤Ë¥´¥ß¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "junk at end of #pragma weak" +#~ msgstr "#pragma weak ¤ÎËöÈø¤Ë¥´¥ß¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "break statement not within loop or switch" +#~ msgstr "break ʸ¤¬ loop ¤Þ¤¿¤Ï switch ¤ÎÃæ¤Ë¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "continue statement not within a loop" +#~ msgstr "continue ʸ¤¬ loop ¤ÎÃæ¤Ë¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "destructor needed for `%#D'" +#~ msgstr "`%#D' ¤Î¤¿¤á¤Î¥Ç¥¹¥È¥é¥¯¥¿¤¬É¬ÍפǤ¹" + +#~ msgid "where case label appears here" +#~ msgstr "case ¥é¥Ù¥ë¤¬¸½¤ì¤¿¤Î¤Ï¤³¤³¤Ç¤¹" + +#~ msgid "(enclose actions of previous case statements requiring destructors in their own scope.)" +#~ msgstr "(Á°¤Î case ʸ¤Î°Ï¤¤¹þ¤Þ¤ì¤¿Æ°ºî¤Ï¤½¤ì¼«¿È¤Î¥¹¥³¡¼¥×¤Ç¥Ç¥¹¥È¥é¥¯¥¿¤òÍ׵ᤷ¤Þ¤¹)" + +#~ msgid "%s qualifier ignored on asm" +#~ msgstr "asm ¤Ç¤Ï %s ½¤¾þ»Ò¤¬Ìµ»ë¤µ¤ì¤Þ¤¹" + +#~ msgid "`%s' has an incomplete type" +#~ msgstr "`%s' ¤ÏÉÔ´°Á´·¿¤Ç¤¹" + +#~ msgid "invalid use of void expression" +#~ msgstr "void ¼°¤ÎÉÔŬÀڤʻÈÍÑ" + +#~ msgid "invalid use of array with unspecified bounds" +#~ msgstr "¶­³¦¤¬»ØÄꤵ¤ì¤Ê¤¤ÇÛÎó¤ÎÉÔŬÀÚ¤ÊÍøÍÑ" + +#~ msgid "invalid use of undefined type `%s %s'" +#~ msgstr "̤ÄêµÁ¤Î·¿ `%s %s' ¤Î»ÈÍѤÏÉÔŬÀڤǤ¹" + +#~ msgid "invalid use of incomplete typedef `%s'" +#~ msgstr "ÉÔ´°Á´¤Ê typedef `%s' ¤Î»ÈÍѤÏÉÔŬÀڤǤ¹" + +#~ msgid "function types not truly compatible in ISO C" +#~ msgstr "´Ø¿ô·¿¤¬ ISO C ¤È´°Á´¸ß´¹¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "types are not quite compatible" +#~ msgstr "·¿¤ÏÁ´¤¯¸ß´¹¤¬¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "sizeof applied to a function type" +#~ msgstr "sizeof ¤¬´Ø¿ô·¿¤ËŬÍѤµ¤ì¤Þ¤·¤¿" + +#~ msgid "sizeof applied to a void type" +#~ msgstr "sizeof ¤¬ void ·¿¤ËŬÍѤµ¤ì¤Þ¤·¤¿" + +#~ msgid "sizeof applied to an incomplete type" +#~ msgstr "sizeof ¤¬ÉÔ´°Á´¤Ê·¿¤ËŬÍѤµ¤ì¤Þ¤·¤¿" + +#~ msgid "arithmetic on pointer to an incomplete type" +#~ msgstr "ÉÔ´°Á´·¿¤Ø¤Î¥Ý¥¤¥ó¥¿¤ËÂФ¹¤ë±é»»" + +#~ msgid "__alignof__ applied to an incomplete type" +#~ msgstr "__alignof__ ¤¬ÉÔ´°Á´¤Ê·¿¤ËŬÍѤµ¤ì¤Þ¤·¤¿" + +#~ msgid "`__alignof' applied to a bit-field" +#~ msgstr "¥Ó¥Ã¥È¥Õ¥£¡¼¥ë¥É¤Ë `__alignof' ¤¬Å¬ÍѤµ¤ì¤Þ¤·¤¿" + +#~ msgid "invalid use of non-lvalue array" +#~ msgstr "Èóº¸ÊÕÃÍÇÛÎó¤Î̵¸ú¤ÊÍøÍÑ" + +#~ msgid "%s has no member named `%s'" +#~ msgstr "%s ¤Ë `%s' ¤È¤¤¤¦Ì¾Á°¤Î¥á¥ó¥Ð¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "request for member `%s' in something not a structure or union" +#~ msgstr "¹½Â¤ÂΤǤⶦÍÑÂΤǤâ¤Ê¤¤²¿¤«¤Ç¡¢¥á¥ó¥Ð `%s' ¤òÍ׵ᤵ¤ì¤Þ¤·¤¿" + +#~ msgid "dereferencing pointer to incomplete type" +#~ msgstr "ÉÔ´°Á´·¿¤Î¥Ý¥¤¥ó¥¿¤Ø¤Î´ÖÀÜ»²¾È" + +#~ msgid "dereferencing `void *' pointer" +#~ msgstr "`void *' ¥Ý¥¤¥ó¥¿¤Ø¤Î´ÖÀÜ»²¾È¤Ç¤¹" + +#~ msgid "invalid type argument of `%s'" +#~ msgstr "`%s' ¤Î°ú¿ô¤È¤·¤Æ̵¸ú¤Ê·¿" + +#~ msgid "subscript missing in array reference" +#~ msgstr "ÇÛÎ󻲾ȤǤÎź»ú¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "array subscript has type `char'" +#~ msgstr "ÇÛÎó¤Îź»ú¤¬ `char' ·¿¤Ç¤¹" + +#~ msgid "array subscript is not an integer" +#~ msgstr "ÇÛÎó¤Îź»ú¤¬À°¿ô·¿¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "ISO C forbids subscripting `register' array" +#~ msgstr "ISO C ¤Ï `register' ÇÛÎó¤Ø¤Îź»ú¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "ISO C89 forbids subscripting non-lvalue array" +#~ msgstr "ISO C89 Èóº¸ÊÕÃÍÇÛÎó¤Ø¤Îź»ú¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "subscript has type `char'" +#~ msgstr "ź»ú¤¬ `char' ·¿¤ò¤â¤Á¤Þ¤¹" + +#~ msgid "subscripted value is neither array nor pointer" +#~ msgstr "ź»ú¤ò¤Ä¤±¤é¤ì¤¿Ãͤ¬ÇÛÎó¤Ç¤â¥Ý¥¤¥ó¥¿¤Ç¤â¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "`%s' undeclared here (not in a function)" +#~ msgstr "`%s' ¤¬¤³¤³¤Ç¤ÏÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó (´Ø¿ô¤ÎÃæ¤Ç¤Ï¤Ê¤¤)" + +#~ msgid "`%s' undeclared (first use in this function)" +#~ msgstr "`%s' ¤¬Àë¸À¤µ¤ì¤Æ¤¤¤Þ¤»¤ó (¤³¤Î´Ø¿ôÆâ¤ÇºÇ½é¤ËÍøÍÑ)" + +#~ msgid "(Each undeclared identifier is reported only once" +#~ msgstr "(̤Àë¸À¤Î³ÆÊÑ¿ô¤Ë¤Ä¤¤¤Æ¤Ï¡¢¤½¤ì¤¬ºÇ½é¤Ë¸½¤ï¤ì¤¿¤½¤ì¤¾¤ì¤Î´Ø¿ô" + +#~ msgid "for each function it appears in.)" +#~ msgstr " ¤ËÂФ·¤Æ°ìÅÙ¤À¤±Êó¹ð¤µ¤ì¤Þ¤¹¡£)" + +#~ msgid "local declaration of `%s' hides instance variable" +#~ msgstr "`%s' ¤Î¥í¡¼¥«¥ëÀë¸À¤Ç¡¢¥¤¥ó¥¹¥¿¥ó¥¹ÊÑ¿ô¤¬±£¤µ¤ì¤Þ¤¹" + +#~ msgid "called object is not a function" +#~ msgstr "¸Æ¤Ó½Ð¤µ¤ì¤¿¥ª¥Ö¥¸¥§¥¯¥È¤Ï´Ø¿ô¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "too many arguments to function" +#~ msgstr "´Ø¿ô¤ËÂФ¹¤ë°ú¿ô¤¬Â¿¤¹¤®¤Þ¤¹" + +#~ msgid "type of formal parameter %d is incomplete" +#~ msgstr "Àµ¼°¤Ê²¾°ú¿ô %d ¤Î·¿¤¬ÉÔ´°Á´¤Ç¤¹" + +#~ msgid "%s as integer rather than floating due to prototype" +#~ msgstr "¥×¥í¥È¥¿¥¤¥×¤Ë¤è¤ë¤È %s ¤ÏÉâÆ°¾®¿ô·¿¤Ç¤Ï¤Ê¤¯À°¿ô·¿¤È¤µ¤ì¤Æ¤¤¤Þ¤¹" + +#~ msgid "%s as integer rather than complex due to prototype" +#~ msgstr "¥×¥í¥È¥¿¥¤¥×¤Ë¤è¤ë¤È %s ¤ÏÊ£ÁÇ¿ô¤Ç¤Ï¤Ê¤¯À°¿ô·¿¤È¤µ¤ì¤Æ¤¤¤Þ¤¹" + +#~ msgid "%s as complex rather than floating due to prototype" +#~ msgstr "¥×¥í¥È¥¿¥¤¥×¤Ë¤è¤ë¤È %s ¤ÏÉâÆ°¾®¿ô·¿¤Ç¤Ï¤Ê¤¯Ê£ÁÇ¿ô·¿¤È¤µ¤ì¤Æ¤¤¤Þ¤¹" + +#~ msgid "%s as floating rather than integer due to prototype" +#~ msgstr "¥×¥í¥È¥¿¥¤¥×¤Ë¤è¤ë¤È %s ¤ÏÀ°¿ô·¿¤Ç¤Ï¤Ê¤¯ÉâÆ°¾®¿ô·¿¤È¤µ¤ì¤Æ¤¤¤Þ¤¹" + +#~ msgid "%s as complex rather than integer due to prototype" +#~ msgstr "¥×¥í¥È¥¿¥¤¥×¤Ë¤è¤ë¤È %s ¤ÏÀ°¿ô·¿¤Ç¤Ï¤Ê¤¯Ê£ÁÇ¿ô·¿¤È¤µ¤ì¤Æ¤¤¤Þ¤¹" + +#~ msgid "%s as floating rather than complex due to prototype" +#~ msgstr "¥×¥í¥È¥¿¥¤¥×¤Ë¤è¤ë¤È %s ¤ÏÊ£ÁÇ¿ô¤Ç¤Ï¤Ê¤¯ÉâÆ°¾®¿ô·¿¤È¤µ¤ì¤Æ¤¤¤Þ¤¹" + +#~ msgid "%s as `float' rather than `double' due to prototype" +#~ msgstr "¥×¥í¥È¥¿¥¤¥×¤Ë¤è¤ë¤È %s ¤Ï `double' ¤Ç¤Ê¤¯ `float' ¤È¤µ¤ì¤Æ¤¤¤Þ¤¹" + +#~ msgid "%s with different width due to prototype" +#~ msgstr "%s ¤Ï¥×¥í¥È¥¿¥¤¥×¤Ç¤Î·¿¤ÎÉý¤È¤Ï°Û¤Ê¤Ã¤Æ¤¤¤Þ¤¹" + +#~ msgid "%s as unsigned due to prototype" +#~ msgstr "¥×¥í¥È¥¿¥¤¥×¤Ë¤è¤ê %s ¤ÏÉä¹ç¤Ê¤·¤È¤µ¤ì¤Æ¤¤¤Þ¤¹" + +#~ msgid "%s as signed due to prototype" +#~ msgstr "¥×¥í¥È¥¿¥¤¥×¤Ë¤è¤ê %s ¤ÏÉä¹çÉÕ¤­¤È¤µ¤ì¤Æ¤¤¤Þ¤¹" + +#~ msgid "too few arguments to function" +#~ msgstr "´Ø¿ô¤Ø¤Î°ú¿ô¤¬¾¯¤Ê¤¹¤®¤Þ¤¹" + +#~ msgid "suggest parentheses around + or - inside shift" +#~ msgstr "¥·¥Õ¥ÈÃæ¤Î + ¤ä - ¤Î¼þ¤ê¤Ç¤Ï³ç¸Ì¤ò¤Ä¤±¤ë¤³¤È¤ò¤ª´«¤á¤·¤Þ¤¹" + +#~ msgid "suggest parentheses around && within ||" +#~ msgstr "|| ¤È¶¦¤Ë»È¤ï¤ì¤ë && ¤Î¼þ¤ê¤Ç¤Ï³ç¸Ì¤ò¤Ä¤±¤ë¤³¤È¤ò¤ª´«¤á¤·¤Þ¤¹" + +#~ msgid "suggest parentheses around arithmetic in operand of |" +#~ msgstr "·×»»¤¬ | ±é»»»Ò¤Î¹à¤È¤Ê¤ë¾ì¹ç¤Ë¤Ï³ç¸Ì¤ò¤Ä¤±¤ë¤³¤È¤ò¤ª´«¤á¤·¤Þ¤¹" + +#~ msgid "suggest parentheses around comparison in operand of |" +#~ msgstr "Èæ³Ó¤¬ | ±é»»»Ò¤Î¹à¤È¤Ê¤ë¾ì¹ç¤Ë¤Ï³ç¸Ì¤ò¤Ä¤±¤ë¤³¤È¤ò¤ª´«¤á¤·¤Þ¤¹" + +#~ msgid "suggest parentheses around arithmetic in operand of ^" +#~ msgstr "·×»»¤¬ ^ ±é»»»Ò¤Î¹à¤È¤Ê¤ë¾ì¹ç¤Ë¤Ï³ç¸Ì¤ò¤Ä¤±¤ë¤³¤È¤ò¤ª´«¤á¤·¤Þ¤¹" + +#~ msgid "suggest parentheses around comparison in operand of ^" +#~ msgstr "·×»»¤¬ ^ ±é»»»Ò¤Î¹à¤È¤Ê¤ë¾ì¹ç¤Ë¤Ï³ç¸Ì¤ò¤Ä¤±¤ë¤³¤È¤ò¤ª´«¤á¤·¤Þ¤¹" + +#~ msgid "suggest parentheses around + or - in operand of &" +#~ msgstr "& ±é»»»Ò¤Î¼þ¤ê¤Î + ¤ä - ¤Î¼þ¤ê¤Ë¤Ï³ç¸Ì¤ò¤Ä¤±¤ë¤³¤È¤ò¤ª´«¤á¤·¤Þ¤¹" + +#~ msgid "suggest parentheses around comparison in operand of &" +#~ msgstr "Èæ³Ó¤¬ & ±é»»»Ò¤Î¹à¤È¤Ê¤ë¾ì¹ç¤Ë¤Ï³ç¸Ì¤ò¤Ä¤±¤ë¤³¤È¤ò¤ª´«¤á¤·¤Þ¤¹" + +#~ msgid "comparisons like X<=Y<=Z do not have their mathematical meaning" +#~ msgstr "X<=Y<=Z ¤ÎÍͤÊÈæ³Ó¤Ï¿ô³ØŪ¤Ê°ÕÌ£¤Ç¤Î·ë²Ì¤ò¤â¤¿¤é¤·¤Þ¤»¤ó" + +#~ msgid "right shift count is negative" +#~ msgstr "±¦¥·¥Õ¥È²ó¿ô¤¬Éé¤Î¿ô¤Ç¤¹" + +#~ msgid "right shift count >= width of type" +#~ msgstr "±¦¥·¥Õ¥È²ó¿ô >= ·¿¤ÎÉý¤È¤Ê¤Ã¤Æ¤¤¤Þ¤¹" + +#~ msgid "left shift count is negative" +#~ msgstr "º¸¥·¥Õ¥È²ó¿ô¤¬Éé¤Î¿ô¤Ç¤¹" + +#~ msgid "left shift count >= width of type" +#~ msgstr "º¸¥·¥Õ¥È²ó¿ô >= ·¿¤ÎÉý¤È¤Ê¤Ã¤Æ¤¤¤Þ¤¹" + +#~ msgid "shift count is negative" +#~ msgstr "¥·¥Õ¥È²ó¿ô¤¬Éé¤ÎÃͤǤ¹" + +#~ msgid "shift count >= width of type" +#~ msgstr "¥·¥Õ¥È²ó¿ô >= ·¿¤ÎÉý¤È¤Ê¤Ã¤Æ¤¤¤Þ¤¹" + +#~ msgid "comparing floating point with == or != is unsafe" +#~ msgstr "ÉâÆ°¾®¿ôÅÀ¤ÎÈæ³Ó¤Ç == ¤ä != ¤ò»È¤¦¤Î¤Ï°ÂÁ´¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "ISO C forbids comparison of `void *' with function pointer" +#~ msgstr "ISO C ¤Ï `void *' ¤È´Ø¿ô¥Ý¥¤¥ó¥¿¤È¤ÎÈæ³Ó¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "comparison of distinct pointer types lacks a cast" +#~ msgstr "·¿¤¬Á´¤¯°Û¤Ê¤ë¥Ý¥¤¥ó¥¿¤ÎÈæ³Ó¤Ç¥­¥ã¥¹¥È¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "comparison between pointer and integer" +#~ msgstr "¥Ý¥¤¥ó¥¿¤ÈÀ°¿ô¤È¤ÎÈæ³Ó¤ò¹Ô¤Ê¤Ã¤Æ¤¤¤Þ¤¹" + +#~ msgid "ISO C forbids ordered comparisons of pointers to functions" +#~ msgstr "ISO C ´Ø¿ô¥Ý¥¤¥ó¥¿¤Î½ç½øÈæ³Ó¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "comparison of complete and incomplete pointers" +#~ msgstr "´°Á´¤Ê¥Ý¥¤¥ó¥¿¤ÈÉÔ´°Á´¤Ê¥Ý¥¤¥ó¥¿¤È¤ÎÈæ³Ó¤Ç¤¹" + +#~ msgid "ordered comparison of pointer with integer zero" +#~ msgstr "À°¿ô 0 ¤È¥Ý¥¤¥ó¥¿¤È¤Î½ç½øÈæ³Ó¤Ç¤¹" + +#~ msgid "unordered comparison on non-floating point argument" +#~ msgstr "ÈóÉâÆ°¾®¿ôÅÀ°ú¿ô¤Ç¤Î½ç½øÉÕ¤±¤é¤ì¤Ê¤¤Èæ³Ó¤Ç¤¹" + +#~ msgid "comparison between signed and unsigned" +#~ msgstr "Éä¹çÉÕ¤­¤ÈÉä¹ç̵¤·¤È¤ÎÈæ³Ó¤Ç¤¹" + +#~ msgid "comparison of promoted ~unsigned with constant" +#~ msgstr "~¤Çȿž¤µ¤ì¤¿³Ê¾å¤²Éä¹ç̵¤··¿¤ÈÄê¿ô¤È¤ÎÈæ³Ó¤Ç¤¹" + +#~ msgid "comparison of promoted ~unsigned with unsigned" +#~ msgstr "~¤Çȿž¤µ¤ì¤¿Éä¹ç̵¤··¿¤ÈÉä¹ç̵¤··¿¤È¤ÎÈæ³Ó¤Ç¤¹" + +#~ msgid "pointer of type `void *' used in arithmetic" +#~ msgstr "`void *' ·¿¤Î¥Ý¥¤¥ó¥¿¤¬·×»»¤Ç»È¤ï¤ì¤Þ¤·¤¿" + +#~ msgid "pointer to a function used in arithmetic" +#~ msgstr "´Ø¿ô¥Ý¥¤¥ó¥¿¤¬·×»»¤Ç»È¤ï¤ì¤Þ¤·¤¿" + +#~ msgid "pointer of type `void *' used in subtraction" +#~ msgstr "`void *' ·¿¤Î¥Ý¥¤¥ó¥¿¤Îº¹¤òµá¤á¤è¤¦¤È¤·¤Æ¤¤¤Þ¤¹" + +#~ msgid "pointer to a function used in subtraction" +#~ msgstr "´Ø¿ô¥Ý¥¤¥ó¥¿¤Îº¹¤òµá¤á¤è¤¦¤È¤·¤Æ¤¤¤Þ¤¹" + +#~ msgid "wrong type argument to unary plus" +#~ msgstr "ñ¹à¥×¥é¥¹¤Ø¤Î°ú¿ô¤Î·¿¤¬´Ö°ã¤Ã¤Æ¤¤¤Þ¤¹" + +#~ msgid "wrong type argument to unary minus" +#~ msgstr "ñ¹à¥Þ¥¤¥Ê¥¹¤Ø¤Î°ú¿ô¤Î·¿¤¬´Ö°ã¤Ã¤Æ¤¤¤Þ¤¹" + +#~ msgid "ISO C does not support `~' for complex conjugation" +#~ msgstr "ISO C ¤ÏÊ£ÁǶ¦ÌòÍѤΠ`~' ¤ò¼õ¤±ÉÕ¤±¤Þ¤»¤ó" + +#~ msgid "wrong type argument to bit-complement" +#~ msgstr "¥Ó¥Ã¥Èȿž¤Ø¤Î°ú¿ô¤Î·¿¤¬´Ö°ã¤Ã¤Æ¤¤¤Þ¤¹" + +#~ msgid "wrong type argument to abs" +#~ msgstr "abs ¤Ø¤Î°ú¿ô¤Î·¿¤¬´Ö°ã¤Ã¤Æ¤¤¤Þ¤¹" + +#~ msgid "wrong type argument to conjugation" +#~ msgstr "Ê£ÁǶ¦Ìò(~)¤Ø¤Î°ú¿ô¤Î·¿¤¬´Ö°ã¤Ã¤Æ¤¤¤Þ¤¹" + +#~ msgid "wrong type argument to unary exclamation mark" +#~ msgstr "ñ¹à´¶Ã²Éä(!)¤Ø¤Î°ú¿ô¤Î·¿¤¬´Ö°ã¤Ã¤Æ¤¤¤Þ¤¹" + +#~ msgid "ISO C does not support `++' and `--' on complex types" +#~ msgstr "ISO C ¤Ï complex ·¿¤Ç¤Î `++' ¤È `--' ¤ò¼õ¤±ÉÕ¤±¤Þ¤»¤ó" + +#~ msgid "wrong type argument to %s" +#~ msgstr "%s ¤Ø¤Î°ú¿ô¤Î·¿¤¬´Ö°ã¤Ã¤Æ¤¤¤Þ¤¹" + +#~ msgid "%s of pointer to unknown structure" +#~ msgstr "ÉÔÌÀ¤Ê¹½Â¤ÂΤËÂФ¹¤ë¥Ý¥¤¥ó¥¿¤Î%s" + +#~ msgid "invalid lvalue in increment" +#~ msgstr "¥¤¥ó¥¯¥ê¥á¥ó¥È¤ÎÃæ¤Ç¤Îº¸ÊÕÃͤ¬Ìµ¸ú¤Ç¤¹" + +#~ msgid "invalid lvalue in decrement" +#~ msgstr "¥Ç¥¯¥ê¥á¥ó¥È¤ÎÃæ¤Ç¤Îº¸ÊÕÃͤ¬Ìµ¸ú¤Ç¤¹" + +#~ msgid "increment" +#~ msgstr "¥¤¥ó¥¯¥ê¥á¥ó¥È" + +#~ msgid "decrement" +#~ msgstr "¥Ç¥¯¥ê¥á¥ó¥È" + +#~ msgid "ISO C forbids the address of a cast expression" +#~ msgstr "ISO C ¤Ï¥­¥ã¥¹¥È¼°¤Î¥¢¥É¥ì¥¹É¾²Á¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "invalid lvalue in unary `&'" +#~ msgstr "ñ¹à¤Î `&' ¤Ç¤Îº¸ÊÕÃͤ¬Ìµ¸ú¤Ç¤¹" + +#~ msgid "attempt to take address of bit-field structure member `%s'" +#~ msgstr "¹½Â¤ÂÎ¥á¥ó¥Ð `%s' ¤Î¥Ó¥Ã¥È¥Õ¥£¡¼¥ë¥É¤Î¥¢¥É¥ì¥¹¤ò¼èÆÀ¤·¤è¤¦¤È¤·¤Æ¤¤¤Þ¤¹" + +#~ msgid "%s" +#~ msgstr "%s" + +#~ msgid "ISO C forbids use of conditional expressions as lvalues" +#~ msgstr "ISO C ¤Ïº¸ÊÕÃͤȤ·¤Æ¤Î¾ò·ï¼°¤ÎÍøÍѤò¶Ø¤¸¤Þ¤¹" + +#~ msgid "ISO C forbids use of compound expressions as lvalues" +#~ msgstr "ISO C ¤Ïº¸ÊÕÃͤȤ·¤Æ¤ÎÊ£¹ç¼°¤ÎÍøÍѤò¶Ø¤¸¤Þ¤¹" + +#~ msgid "ISO C forbids use of cast expressions as lvalues" +#~ msgstr "ISO C ¤Ïº¸ÊÕÃͤȤ·¤Æ¤Î¥­¥ã¥¹¥È¼°¤ÎÍøÍѤò¶Ø¤¸¤Þ¤¹" + +#~ msgid "%s of read-only member `%s'" +#~ msgstr "%s¤¬Æɤ߹þ¤ßÀìÍÑ¥á¥ó¥Ð `%s' ¤Ë¹Ô¤ï¤ì¤Þ¤·¤¿" + +#~ msgid "%s of read-only variable `%s'" +#~ msgstr "%s¤¬Æɤ߹þ¤ßÀìÍÑÊÑ¿ô `%s' ¤Ë¹Ô¤ï¤ì¤Þ¤·¤¿" + +#~ msgid "%s of read-only location" +#~ msgstr "%s¤¬Æɤ߹þ¤ßÀìÍÑÎΰè¤Ç¹Ô¤ï¤ì¤Þ¤·¤¿" + +#~ msgid "cannot take address of bitfield `%s'" +#~ msgstr "¥Ó¥Ã¥È¥Õ¥£¡¼¥ë¥É `%s' ¤Î¥¢¥É¥ì¥¹¤ò¼èÆÀ¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "global register variable `%s' used in nested function" +#~ msgstr "Âç°è¥ì¥¸¥¹¥¿ÊÑ¿ô `%s' ¤¬Æþ¤ì»Ò´Ø¿ô¤ÎÃæ¤Ç»È¤ï¤ì¤Þ¤·¤¿" + +#~ msgid "register variable `%s' used in nested function" +#~ msgstr "¥ì¥¸¥¹¥¿ÊÑ¿ô `%s' ¤¬Æþ¤ì»Ò´Ø¿ô¤ÎÃæ¤Ç»È¤ï¤ì¤Þ¤·¤¿" + +#~ msgid "address of global register variable `%s' requested" +#~ msgstr "Í׵ᤵ¤ì¤¿Âç°è¥ì¥¸¥¹¥¿ÊÑ¿ô `%s' ¤Î¥¢¥É¥ì¥¹" + +#~ msgid "cannot put object with volatile field into register" +#~ msgstr "volatile ¥Õ¥£¡¼¥ë¥É¤ò¥ì¥¸¥¹¥¿¤Ë»ý¤Ã¤Æ¤¤¤ë¤è¤¦¤Ê¥ª¥Ö¥¸¥§¥¯¥È¤òÃÖ¤±¤Þ¤»¤ó" + +#~ msgid "address of register variable `%s' requested" +#~ msgstr "register ÊÑ¿ô `%s' ¤Î¥¢¥É¥ì¥¹¤¬Í׵ᤵ¤ì¤Þ¤·¤¿" + +#~ msgid "signed and unsigned type in conditional expression" +#~ msgstr "¾ò·ï¼°¤ËÉä¹çÉÕ¤­·¿¤ÈÉä¹ç̵¤··¿¤È¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "ISO C forbids conditional expr with only one void side" +#~ msgstr "ISO C ¤ÏÊÒ¦¤À¤±¤¬ void ¤È¤Ê¤ë¾ò·ï¼°¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "ISO C forbids conditional expr between `void *' and function pointer" +#~ msgstr "ISO C ¤Ï `void *' ¤È´Ø¿ô¥Ý¥¤¥ó¥¿¤È¤ò¾ò·ï¼°¤È¤¹¤ë¤³¤È¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "pointer type mismatch in conditional expression" +#~ msgstr "¾ò·ï¼°¤Ç¤Î¥Ý¥¤¥ó¥¿¤Î·¿¤¬Å¬¹ç¤·¤Þ¤»¤ó" + +#~ msgid "pointer/integer type mismatch in conditional expression" +#~ msgstr "¾ò·ï¼°¤Ç¥Ý¥¤¥ó¥¿·¿¤ÈÀ°¿ô·¿¤¬Å¬¹ç¤·¤Þ¤»¤ó" + +#~ msgid "type mismatch in conditional expression" +#~ msgstr "¾ò·ï¼°¤Ç¤Î·¿¤ÎÁȹç¤ï¤»¤¬Å¬¹ç¤·¤Þ¤»¤ó" + +#~ msgid "left-hand operand of comma expression has no effect" +#~ msgstr "¥«¥ó¥Þ±é»»»Ò¤Îº¸Â¦¤Î¼°¤Ë¸úÎϤ¬¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "cast specifies array type" +#~ msgstr "¥­¥ã¥¹¥È¤¬ÇÛÎ󷿤ò»ØÄꤷ¤Æ¤¤¤Þ¤¹" + +#~ msgid "cast specifies function type" +#~ msgstr "¥­¥ã¥¹¥È¤Ï´Ø¿ô·¿¤ò»ØÄꤷ¤Æ¤¤¤Þ¤¹" + +#~ msgid "ISO C forbids casting nonscalar to the same type" +#~ msgstr "ISO C ¤ÏÈó¥¹¥«¥é¡¼¤«¤éƱ¤¸·¿¤Ø¤Î¥­¥ã¥¹¥È¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "ISO C forbids casts to union type" +#~ msgstr "ISO C ¤Ï¶¦ÍÑÂη¿¤Ø¤Î¥­¥ã¥¹¥È¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "cast to union type from type not present in union" +#~ msgstr "¶¦ÍÑÂΤÎÃæ¤Ë¤Ê¤¤·¿¤«¤é¶¦ÍÑÂη¿¤Ø¥­¥ã¥¹¥È¤·¤Æ¤¤¤Þ¤¹" + +#~ msgid "cast discards qualifiers from pointer target type" +#~ msgstr "¥­¥ã¥¹¥È¤Ë¤è¤Ã¤Æ¥Ý¥¤¥ó¥¿¤¬¼¨¤¹·¿¤«¤é½¤¾þ»Ò¤¬ÀÚ¤ê¼Î¤Æ¤é¤ì¤Þ¤¹" + +#~ msgid "cast increases required alignment of target type" +#~ msgstr "¥­¥ã¥¹¥È¤Ë¤è¤Ã¤Æ¥Ý¥¤¥ó¥¿¤¬¼¨¤¹·¿¤ÎÍ׵ᥢ¥é¥¤¥ó¥á¥ó¥È¤¬Áý²Ã¤·¤Þ¤¹" + +#~ msgid "cast from pointer to integer of different size" +#~ msgstr "¥­¥ã¥¹¥È¤Ë¤è¤Ã¤Æ¥Ý¥¤¥ó¥¿¤«¤é°Û¤Ê¤ë¥µ¥¤¥º¤ÎÀ°¿ô¤È¤Ê¤ê¤Þ¤¹" + +#~ msgid "cast does not match function type" +#~ msgstr "¥­¥ã¥¹¥È¤Ë¤è¤ë´Ø¿ô¤Î·¿¤¬Å¬¹ç¤·¤Þ¤»¤ó" + +#~ msgid "cast to pointer from integer of different size" +#~ msgstr "°Û¤Ê¤ë¥µ¥¤¥º¤ÎÀ°¿ô¤«¤é¥Ý¥¤¥ó¥¿¤Ë¥­¥ã¥¹¥È¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "invalid lvalue in assignment" +#~ msgstr "ÂåÆþ¤È¤·¤Æ̵¸ú¤Êº¸ÊÕÃͤǤ¹" + +#~ msgid "assignment" +#~ msgstr "ÂåÆþ" + +#~ msgid "%s makes qualified function pointer from unqualified" +#~ msgstr "%s¤Ë¤è¤ê¡¢½¤¾þ¤µ¤ì¤Ê¤¤´Ø¿ô¥Ý¥¤¥ó¥¿¤«¤é¡¢½¤¾þ¤µ¤ì¤¿´Ø¿ô¥Ý¥¤¥ó¥¿¤òºî¤ê¤Þ¤¹" + +#~ msgid "%s discards qualifiers from pointer target type" +#~ msgstr "%s¤Ë¤è¤ê¡¢¥Ý¥¤¥ó¥¿¤Î¼¨¤¹·¿¤«¤é¤Î½¤¾þ»Ò¤¬ÀÚ¤ê¼Î¤Æ¤é¤ì¤Þ¤¹" + +#~ msgid "ISO C prohibits argument conversion to union type" +#~ msgstr "ISO C ¤Ç¤Ï°ú¿ô¤«¤é¶¦ÍÑÂΤؤÎÊÑ´¹¤ò¶Ø»ß¤·¤Æ¤¤¤Þ¤¹" + +#~ msgid "ISO C forbids %s between function pointer and `void *'" +#~ msgstr "ISO C ¤Ï´Ø¿ô¥Ý¥¤¥ó¥¿¤È `void *' ¤È¤Î%s¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "pointer targets in %s differ in signedness" +#~ msgstr "%s ¤Ç¥Ý¥¤¥ó¥¿¤Î¼¨¤¹ÂоݤÎÉä¹æ¤Î̵ͭ¤¬°Û¤Ê¤ê¤Þ¤¹" + +#~ msgid "%s from incompatible pointer type" +#~ msgstr "¸ß´¹À­¤Î¤Ê¤¤¥Ý¥¤¥ó¥¿·¿¤«¤é¤Î%s¤Ç¤¹" + +#~ msgid "%s makes pointer from integer without a cast" +#~ msgstr "%s¤Ë¤è¤ê¡¢¥­¥ã¥¹¥È¤Ê¤·¤ÇÀ°¿ô¤«¤é¥Ý¥¤¥ó¥¿¤òºî¤ê¤Þ¤·¤¿" + +#~ msgid "%s makes integer from pointer without a cast" +#~ msgstr "%s¤Ë¤è¤ê¡¢¥­¥ã¥¹¥È¤Ê¤·¤Ç¥Ý¥¤¥ó¥¿¤«¤éÀ°¿ô¤òºî¤ê¤Þ¤·¤¿" + +#~ msgid "incompatible type for argument %d of `%s'" +#~ msgstr "%d ÈÖÌܤΰú¿ô¤¬ `%s' ¤Î·¿¤È¸ß´¹À­¤¬¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "incompatible type for argument %d of indirect function call" +#~ msgstr "´ÖÀÜŪ¤Ê´Ø¿ô¸Æ¤Ó½Ð¤·¤ÎÂè %d °ú¿ô¤ËÂФ·¤Æ¸ß´¹À­¤Î¤Ê¤¤·¿¤Ç¤¹" + +#~ msgid "incompatible types in %s" +#~ msgstr "%s ¤Ë¸ß´¹À­¤Î¤Ê¤¤·¿" + +#~ msgid "passing arg %d of `%s'" +#~ msgstr "°ú¿ô %d ¸Ä¤Î `%s' ¤òÅϤ·¤Þ¤¹" + +#~ msgid "passing arg %d of pointer to function" +#~ msgstr "°ú¿ô %d ¸Ä¤Î´Ø¿ô¥Ý¥¤¥ó¥¿¤òÅϤ·¤Þ¤¹" + +#~ msgid "initializer for static variable is not constant" +#~ msgstr "static ÊÑ¿ô¤Î½é´ü²½»Ò¤¬Äê¿ô¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "initializer for static variable uses complicated arithmetic" +#~ msgstr "static ÊÑ¿ô¤Î½é´ü²½»Ò¤¬Ê£»¨¤Ê·×»»¤ò»È¤Ã¤Æ¤¤¤Þ¤¹" + +#~ msgid "aggregate initializer is not constant" +#~ msgstr "½¸¹çÂΤνé´ü²½»Ò¤¬Äê¿ô¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "aggregate initializer uses complicated arithmetic" +#~ msgstr "½¸¹çÂΤνé´ü²½»Ò¤ÇÊ£»¨¤Ê·×»»¤ò¹Ô¤Ã¤Æ¤¤¤Þ¤¹" + +#~ msgid "traditional C rejects automatic aggregate initialization" +#~ msgstr "¸Å¤¤ C ¤Ç¤Ï¼«Æ°Åª¤Ê½¸¹çÂΤνé´ü²½¤òµñÀ䤷¤Þ¤¹" + +#~ msgid "(near initialization for `%s')" +#~ msgstr "(`%s' ¤Î½é´ü²½¤ÏÉÔ´°Á´¤Ç¤¹)" + +#~ msgid "char-array initialized from wide string" +#~ msgstr "¥ï¥¤¥Éʸ»úÎ󤫤é char ¤ÎÇÛÎ󤬽é´ü²½¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "int-array initialized from non-wide string" +#~ msgstr "Èó¥ï¥¤¥Éʸ»úÎ󤫤é int ¤ÎÇÛÎ󤬽é´ü²½¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "initializer-string for array of chars is too long" +#~ msgstr "char ¤ÎÇÛÎó¤Ë¤È¤Ã¤Æ½é´ü²½»Òʸ»úÎó¤¬Ä¹¤¹¤®¤Þ¤¹" + +#~ msgid "array initialized from non-constant array expression" +#~ msgstr "ÈóÄê¿ôÇÛÎó¼°¤«¤éÇÛÎ󤬽é´ü²½¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "initializer element is not constant" +#~ msgstr "½é´ü²½»Ò¤ÎÍ×ÁǤ¬Äê¿ô¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "initialization" +#~ msgstr "½é´ü²½" + +#~ msgid "initializer element is not computable at load time" +#~ msgstr "½é´ü²½»Ò¤ÎÍ×ÁÇ¤Ï¥í¡¼¥É»þ¤Ë·×»»¤µ¤ìÆÀ¤Þ¤»¤ó" + +#~ msgid "invalid initializer" +#~ msgstr "̵¸ú¤Ê½é´ü²½»Ò" + +#~ msgid "extra brace group at end of initializer" +#~ msgstr "½é´ü²½»Ò¤Î½ª¤ï¤ê¤Ë;ʬ¤Ê¥Ö¥ì¡¼¥¹¤Î¥°¥ë¡¼¥×" + +#~ msgid "missing braces around initializer" +#~ msgstr "½é´ü²½»Ò¤Î¤Þ¤ï¤ê¤Î¥Ö¥ì¡¼¥¹¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "braces around scalar initializer" +#~ msgstr "¥¹¥«¥é¡¼½é´ü²½»Ò¤¬¥Ö¥ì¡¼¥¹¤Ç°Ï¤Þ¤ì¤Æ¤¤¤Þ¤¹" + +#~ msgid "initialization of flexible array member in a nested context" +#~ msgstr "¥Í¥¹¥È¤·¤¿Ê¸Ì®¤Ç²ÄÊÑÇÛÎó¥á¥ó¥Ð¤ò½é´ü²½¤·¤Æ¤¤¤Þ¤¹" + +#~ msgid "initialization of a flexible array member" +#~ msgstr "²ÄÊÑÇÛÎó¥á¥ó¥Ð¤ò½é´ü²½¤·¤Æ¤¤¤Þ¤¹" + +#~ msgid "deprecated initialization of zero-length array" +#~ msgstr "Ťµ 0 ¤Î½é´ü²½¤Ï¿ä¾©¤µ¤ì¤Þ¤»¤ó" + +#~ msgid "initialization of zero-length array before end of structure" +#~ msgstr "¹½Â¤ÂΤκǸå¤è¤êÁ°¤ÇŤµ 0 ¤ÎÇÛÎó¤ò½é´ü²½¤·¤Æ¤¤¤Þ¤¹" + +#~ msgid "initialization of zero-length array inside a nested context" +#~ msgstr "¥Í¥¹¥È¤·¤¿Ê¸Ì®¤ÎÆ⦤ÇŤµ 0 ¤ÎÇÛÎó¤ò½é´ü²½¤·¤Æ¤¤¤Þ¤¹" + +#~ msgid "missing initializer" +#~ msgstr "½é´ü²½»Ò¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "empty scalar initializer" +#~ msgstr "¶õ¤Î¥¹¥«¥é¡¼½é´ü²½»Ò" + +#~ msgid "extra elements in scalar initializer" +#~ msgstr "¥¹¥«¥é¡¼½é´ü²½»Ò¤Ë;ʬ¤ÊÍ×ÁÇ" + +#~ msgid "initialization designators may not nest" +#~ msgstr "½é´ü²½»Ø̾»Ò¤Ç¤Ï¥Í¥¹¥È¤µ¤»¤ë¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "array index in non-array initializer" +#~ msgstr "ÈóÇÛÎó¤Î½é´ü²½»Ò¤ËÇÛÎ󥤥ó¥Ç¥Ã¥¯¥¹¤¬»È¤ï¤ì¤Þ¤·¤¿" + +#~ msgid "field name not in record or union initializer" +#~ msgstr "¥ì¥³¡¼¥É¤ä¶¦ÍÑÂΤ˥ե£¡¼¥ë¥É̾¤¬¤Ê¤¤½é´ü²½»Ò¤Ç¤¹" + +#~ msgid "nonconstant array index in initializer" +#~ msgstr "½é´ü²½»ÒÆâ¤ËÈóÄê¿ô¤ÎÇÛÎ󥤥ó¥Ç¥Ã¥¯¥¹¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "array index in initializer exceeds array bounds" +#~ msgstr "½é´ü²½»ÒÆâ¤ÎÇÛÎ󥤥ó¥Ç¥Ã¥¯¥¹¤¬ÇÛÎó¤Î¶­³¦¤òĶ¤¨¤Þ¤·¤¿" + +#~ msgid "empty index range in initializer" +#~ msgstr "½é´ü²½»ÒÆâ¤Ë¶õ¤ÎÈÏ°Ï¥¤¥ó¥Ç¥Ã¥¯¥¹¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "array index range in initializer exceeds array bounds" +#~ msgstr "½é´ü²½»Ò¤ÎÈÏ°Ï¥¤¥ó¥Ç¥Ã¥¯¥¹¤¬ÇÛÎó¤Î¶­³¦¤òĶ¤¨¤Þ¤·¤¿" + +#~ msgid "unknown field `%s' specified in initializer" +#~ msgstr "ÉÔÌÀ¤Ê¥Õ¥£¡¼¥ë¥É `%s' ¤¬½é´ü²½»Ò¤Ç»ØÄꤵ¤ì¤Þ¤·¤¿" + +#~ msgid "initialized field with side-effects overwritten" +#~ msgstr "½é´ü²½¤µ¤ì¤¿¥Õ¥£¡¼¥ë¥É¤¬ÉûºîÍѤǾå½ñ¤­¤µ¤ì¤Þ¤¹" + +#~ msgid "excess elements in char array initializer" +#~ msgstr "char ÇÛÎó½é´ü²½»ÒÆâ¤ÎÍ×ÁǤ¬Â¿¤¹¤®¤Þ¤¹" + +#~ msgid "excess elements in struct initializer" +#~ msgstr "¹½Â¤Âνé´ü²½»ÒÆâ¤ÎÍ×ÁǤ¬Â¿¤¹¤®¤Þ¤¹" + +#~ msgid "excess elements in union initializer" +#~ msgstr "¶¦ÍÑÂνé´ü²½»ÒÆâ¤ÎÍ×ÁǤ¬Â¿¤¹¤®¤Þ¤¹" + +#~ msgid "traditional C rejects initialization of unions" +#~ msgstr "¸Å¤¤ C ¤Ï¶¦ÍÑÂΤνé´ü¤òµñÀ䤷¤Þ¤¹" + +#~ msgid "excess elements in array initializer" +#~ msgstr "ÇÛÎó½é´ü²½»ÒÆâ¤ÎÍ×ÁǤ¬Â¿¤¹¤®¤Þ¤¹" + +#~ msgid "excess elements in scalar initializer" +#~ msgstr "¥¹¥«¥é¡¼½é´ü²½»ÒÆâ¤ÎÍ×ÁǤ¬Â¿¤¹¤®¤Þ¤¹" + +#~ msgid "asm template is not a string constant" +#~ msgstr "asm ¥Æ¥ó¥×¥ì¡¼¥È¤¬Ê¸»úÎóÄê¿ô¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "invalid lvalue in asm statement" +#~ msgstr "asm ʸ¤ÎÃæ¤Ë̵¸ú¤Êº¸ÊÕÃÍ" + +#~ msgid "modification by `asm'" +#~ msgstr "`asm' ¤Ë¤è¤ë½¤Àµ" + +#~ msgid "function declared `noreturn' has a `return' statement" +#~ msgstr "`noreturn' ¤ÎÀë¸À¤µ¤ì¤¿´Ø¿ô¤Ë `return' ʸ¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "`return' with no value, in function returning non-void" +#~ msgstr "Ìá¤ê·¿¤¬´Ø¿ô¤Ç¡¢`return' ¤ËÃͤ¬¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "`return' with a value, in function returning void" +#~ msgstr "Ìá¤ê·¿¤¬ void ¤Î´Ø¿ô¤Ç¡¢`return' ¤ËÃͤ¬¤¢¤ê¤Þ¤¹" + +#~ msgid "return" +#~ msgstr "return" + +#~ msgid "function returns address of local variable" +#~ msgstr "´Ø¿ô¤¬¥í¡¼¥«¥ëÊÑ¿ô¤Î¥¢¥É¥ì¥¹¤òÊÖ¤·¤Æ¤¤¤Þ¤¹" + +#~ msgid "switch quantity not an integer" +#~ msgstr "switch ¤ÎÆâÍƤ¬À°¿ô¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "`long' switch expression not converted to `int' in ISO C" +#~ msgstr "ISO C ¤Ç¤Ï `long' ¤Î switch ¼°¤Ï `int' ¤ËÊÑ´¹¤µ¤ì¤Þ¤»¤ó" + +#~ msgid "case label not within a switch statement" +#~ msgstr "case ¥é¥Ù¥ë¤¬ switch ʸ¤ÎÃæ¤Ë¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "`default' label not within a switch statement" +#~ msgstr "`default' ¥é¥Ù¥ë¤¬ switch ʸ¤ÎÃæ¤Ë¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "inlining failed in call to `%s'" +#~ msgstr "`%s' ¤Ø¤Î¸Æ¤Ó½Ð¤·¤Î¥¤¥ó¥é¥¤¥ó²½¤Ë¼ºÇÔ¤·¤Þ¤·¤¿" + +#~ msgid "called from here" +#~ msgstr "¤³¤³¤«¤é¸Æ¤Ð¤ì¤Þ¤·¤¿" + +#~ msgid "can't inline call to `%s'" +#~ msgstr "`%s' ¤Ø¤Î¸Æ¤Ó½Ð¤·¤Ï¥¤¥ó¥é¥¤¥ó²½¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "function call has aggregate value" +#~ msgstr "´Ø¿ô¸Æ¤Ó½Ð¤·¤¬½¸¹çÂΤÎÃͤò»ý¤Ã¤Æ¤¤¤Þ¤¹" + +#~ msgid "variable offset is passed paritially in stack and in reg" +#~ msgstr "ÊÑ¿ô¥ª¥Õ¥»¥Ã¥È¤¬¥¹¥¿¥Ã¥¯¤È¥ì¥¸¥¹¥¿¤ÇÅù²Á¤ËÅϤµ¤ì¤Þ¤·¤¿" + +#~ msgid "variable size is passed partially in stack and in reg" +#~ msgstr "ÊÑ¿ô¥µ¥¤¥º¤¬¥¹¥¿¥Ã¥¯¤È¥ì¥¸¥¹¥¿¤ÇÅù²Á¤ËÅϤµ¤ì¤Þ¤·¤¿" + +#~ msgid "internal error" +#~ msgstr "ÆâÉô¥¨¥é¡¼" + +#~ msgid "no arguments" +#~ msgstr "°ú¿ô¤¬¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "fopen %s" +#~ msgstr "fopen %s" + +#~ msgid "fclose %s" +#~ msgstr "fclose %s" + +#~ msgid "collect2 version %s" +#~ msgstr "collect2 version %s" + +#~ msgid "%d constructor(s) found\n" +#~ msgstr "%d ¸Ä¤Î¥³¥ó¥¹¥È¥é¥¯¥¿¤¬¸«¤Ä¤«¤ê¤Þ¤·¤¿\n" + +#~ msgid "%d destructor(s) found\n" +#~ msgstr "%d ¸Ä¤Î¥Ç¥¹¥È¥é¥¯¥¿¤¬¸«¤Ä¤«¤ê¤Þ¤·¤¿\n" + +#~ msgid "%d frame table(s) found\n" +#~ msgstr "%d ¸Ä¤Î¥Õ¥ì¡¼¥à¥Æ¡¼¥Ö¥ë¤¬¸«¤Ä¤«¤ê¤Þ¤·¤¿\n" + +#~ msgid "%s terminated with signal %d [%s]%s" +#~ msgstr "%s ¥·¥°¥Ê¥ë %d [%s]%s ¤Ç½ªÎ»¤µ¤»¤é¤ì¤Þ¤·¤¿" + +#~ msgid "%s returned %d exit status" +#~ msgstr "%s ¤Ï exit ¾õÂÖ %d ¤òÊÖ¤·¤Þ¤·¤¿" + +#~ msgid "[cannot find %s]" +#~ msgstr "[%s ¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó]" + +#~ msgid "cannot find `%s'" +#~ msgstr "`%s' ¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó" + +#~ msgid "redirecting stdout: %s" +#~ msgstr "stdout ¤Ø¤Î¥ê¥À¥¤¥ì¥¯¥È: %s" + +#~ msgid "[Leaving %s]\n" +#~ msgstr "[%s ¤òÎ¥¤ì¤Þ¤¹]\n" + +#~ msgid "" +#~ "\n" +#~ "write_c_file - output name is %s, prefix is %s\n" +#~ msgstr "" +#~ "\n" +#~ "write_c_file - ½ÐÎÏ̾¤Ï %s¡¢¥×¥ì¥Õ¥£¥¯¥¹¤Ï %s\n" + +#~ msgid "cannot find `nm'" +#~ msgstr "`nm' ¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó" + +#~ msgid "pipe" +#~ msgstr "pipe" + +#~ msgid "fdopen" +#~ msgstr "fdopen" + +#~ msgid "dup2 %d 1" +#~ msgstr "dup2 %d 1" + +#~ msgid "close %d" +#~ msgstr "close %d" + +#~ msgid "execvp %s" +#~ msgstr "execvp %s" + +#~ msgid "init function found in object %s" +#~ msgstr "init ´Ø¿ô¤ò¥ª¥Ö¥¸¥§¥¯¥È %s ¤Ç¸«¤Ä¤±¤Þ¤·¤¿" + +#~ msgid "fini function found in object %s" +#~ msgstr "fini ´Ø¿ô¤ò¥ª¥Ö¥¸¥§¥¯¥È %s ¤Ç¸«¤Ä¤±¤Þ¤·¤¿" + +#~ msgid "fclose" +#~ msgstr "fclose" + +#~ msgid "unable to open file '%s'" +#~ msgstr "¥Õ¥¡¥¤¥ë '%s' ¤ò open ¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "unable to stat file '%s'" +#~ msgstr "¥Õ¥¡¥¤¥ë '%s' ¤ò stat ¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "unable to mmap file '%s'" +#~ msgstr "¥Õ¥¡¥¤¥ë '%s' ¤ò mmap ¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "not found\n" +#~ msgstr "¸«¤Ä¤«¤ê¤Þ¤»¤ó\n" + +#~ msgid "dynamic dependency %s not found" +#~ msgstr "ưŪ°Í¸´Ø·¸ %s ¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó" + +#~ msgid "bad magic number in file '%s'" +#~ msgstr "¥Õ¥¡¥¤¥ë '%s' ¤ËÉÔÀµ¤Ê¥Þ¥¸¥Ã¥¯¥Ê¥ó¥Ð" + +#~ msgid "dynamic dependencies.\n" +#~ msgstr "ưŪ°Í¸´Ø·¸¡£\n" + +#~ msgid "cannot find `ldd'" +#~ msgstr "`ldd' ¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó" + +#~ msgid "execv %s" +#~ msgstr "execv %s" + +#~ msgid "" +#~ "\n" +#~ "ldd output with constructors/destructors.\n" +#~ msgstr "" +#~ "\n" +#~ "ldd ½ÐÎϤ¬¥³¥ó¥¹¥È¥é¥¯¥¿/¥Ç¥¹¥È¥é¥¯¥¿¤òȼ¤¤¤Þ¤¹¡£\n" + +#~ msgid "unable to open dynamic dependency '%s'" +#~ msgstr "ưŪ°Í¸´Ø·¸ '%s' ¤ò³«¤±¤Þ¤»¤ó" + +#~ msgid "%s: not a COFF file" +#~ msgstr "%s: COFF ¥Õ¥¡¥¤¥ë¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "%s: cannot open as COFF file" +#~ msgstr "%s: COFF ¥Õ¥¡¥¤¥ë¤È¤·¤Æ³«¤±¤Þ¤»¤ó" + +#~ msgid "Library lib%s not found" +#~ msgstr "¥é¥¤¥Ö¥é¥ê lib%s ¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó" + +#~ msgid "open %s" +#~ msgstr "open %s" + +#~ msgid "incompatibilities between object file & expected values" +#~ msgstr "ξΩ¤·¤Ê¤¤¥ª¥Ö¥¸¥§¥¯¥È¥Õ¥¡¥¤¥ë¤È´üÂÔÃÍ" + +#~ msgid "" +#~ "\n" +#~ "Processing symbol table #%d, offset = 0x%.8lx, kind = %s\n" +#~ msgstr "" +#~ "\n" +#~ "¥·¥ó¥Ü¥ë¥Æ¡¼¥Ö¥ë #%d ¤ò½èÍý¤·¤Þ¤¹¡¢¥ª¥Õ¥»¥Ã¥È = 0x%.8lx, ¼ïÎà = %s\n" + +#~ msgid "string section missing" +#~ msgstr "ʸ»úÎ󥻥¯¥·¥ç¥ó¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "section pointer missing" +#~ msgstr "¥»¥¯¥·¥ç¥ó¥Ý¥¤¥ó¥¿¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "no symbol table found" +#~ msgstr "¥·¥ó¥Ü¥ë¥Æ¡¼¥Ö¥ë¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó" + +#~ msgid "no cmd_strings found" +#~ msgstr "cmd_strings ¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó" + +#~ msgid "" +#~ "\n" +#~ "Updating header and load commands.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "¥Ø¥Ã¥À¤È load ¥³¥Þ¥ó¥É¤ò¹¹¿·¤·¤Þ¤¹¡£\n" + +#~ msgid "load command map, %d cmds, new size %ld.\n" +#~ msgstr "load ¥³¥Þ¥ó¥É¥Þ¥Ã¥×¡¢%d ¸Ä¤Î¥³¥Þ¥ó¥É¡¢¿·¤¿¤Ê¥µ¥¤¥º %ld¡£\n" + +#~ msgid "" +#~ "writing load commands.\n" +#~ "\n" +#~ msgstr "" +#~ "load ¥³¥Þ¥ó¥É¤ò½ñ¤­¹þ¤ß¤Þ¤¹¡£\n" +#~ "\n" + +#~ msgid "close %s" +#~ msgstr "close %s" + +#~ msgid "could not convert 0x%l.8x into a region" +#~ msgstr "0x%l.8x ¤òÎΰè¤ËÊÑ´¹¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "%s function, region %d, offset = %ld (0x%.8lx)\n" +#~ msgstr "%s ´Ø¿ô, Îΰè %d, ¥ª¥Õ¥»¥Ã¥È = %ld (0x%.8lx)\n" + +#~ msgid "bad magic number" +#~ msgstr "ÉÔÀµ¤Ê¥Þ¥¸¥Ã¥¯¥Ê¥ó¥Ð" + +#~ msgid "bad header version" +#~ msgstr "ÉÔÀµ¤Ê¥Ø¥Ã¥À¥Ð¡¼¥¸¥ç¥ó" + +#~ msgid "bad raw header version" +#~ msgstr "ÉÔÀµ¤ÊÀ¸¤Î¥Ø¥Ã¥À¥Ð¡¼¥¸¥ç¥ó" + +#~ msgid "raw header buffer too small" +#~ msgstr "¾®¤µ¤¹¤®¤ëÀ¸¤Î¥Ø¥Ã¥À¥Ð¥Ã¥Õ¥¡" + +#~ msgid "old raw header file" +#~ msgstr "¸Å¤¤À¸¤Î¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë" + +#~ msgid "unsupported version" +#~ msgstr "¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Ê¤¤¥Ð¡¼¥¸¥ç¥ó¤Ç¤¹" + +#~ msgid "unknown {de,en}code_mach_o_hdr return value %d" +#~ msgstr "ÉÔÌÀ¤Ê {de,en}code_mach_o_hdr Ìá¤êÃÍ %d" + +#~ msgid "fstat %s" +#~ msgstr "fstat %s" + +#~ msgid "lseek %s 0" +#~ msgstr "lseek %s 0" + +#~ msgid "read %s" +#~ msgstr "read %s" + +#~ msgid "read %ld bytes, expected %ld, from %s" +#~ msgstr "%ld ¥Ð¥¤¥ÈÆɹþ¤ß¡£%ld (%s ¤«¤é)Æɹþ¤à¤Ï¤º¤Ç¤¹" + +#~ msgid "msync %s" +#~ msgstr "msync %s" + +#~ msgid "munmap %s" +#~ msgstr "munmap %s" + +#~ msgid "write %s" +#~ msgstr "write %s" + +#~ msgid "wrote %ld bytes, expected %ld, to %s" +#~ msgstr "%ld ¥Ð¥¤¥È½ñ¹þ¤ß¡£%ld (%s ¤Ø)½ñ¹þ¤à¤Ï¤º¤Ç¤¹" + +#~ msgid "" +#~ ";; Combiner statistics: %d attempts, %d substitutions (%d requiring new space),\n" +#~ ";; %d successes.\n" +#~ "\n" +#~ msgstr "" +#~ ";; ·ë¹çÅý·×: %d »î¹Ô, %d ÂåÂØ (%d ¿·¤¿¤Ê¶õ´Ö¤òÍ×µá),\n" +#~ ";; %d À®¸ù¡£\n" + +#~ msgid "" +#~ "\n" +#~ ";; Combiner totals: %d attempts, %d substitutions (%d requiring new space),\n" +#~ ";; %d successes.\n" +#~ msgstr "" +#~ "\n" +#~ ";; ·ë¹ç¹ç·×: %d »î¹Ô, %d ÂåÂØ (%d ¿·¤¿¤Ê¶õ´Ö¤òÍ×µá),\n" +#~ ";; %d À®¸ù¡£\n" + +#~ msgid "Use VAX-C alignment" +#~ msgstr "VAX-C ¥¢¥é¥¤¥ó¥á¥ó¥È¤ò»ÈÍÑ" + +#~ msgid "invalid %%Q value" +#~ msgstr "̵¸ú¤Ê %%Q ÃÍ" + +#~ msgid "invalid %%C value" +#~ msgstr "̵¸ú¤Ê %%C ÃÍ" + +#~ msgid "invalid %%N value" +#~ msgstr "̵¸ú¤Ê %%N ÃÍ" + +#~ msgid "invalid %%M value" +#~ msgstr "̵¸ú¤Ê %%M ÃÍ" + +#~ msgid "invalid %%m value" +#~ msgstr "̵¸ú¤Ê %%m ÃÍ" + +#~ msgid "invalid %%L value" +#~ msgstr "̵¸ú¤Ê %%L ÃÍ" + +#~ msgid "invalid %%O value" +#~ msgstr "̵¸ú¤Ê %%O ÃÍ" + +#~ msgid "invalid %%P value" +#~ msgstr "̵¸ú¤Ê %%P ÃÍ" + +#~ msgid "invalid %%V value" +#~ msgstr "̵¸ú¤Ê %%V ÃÍ" + +#~ msgid "Generate code assuming DW bit is set" +#~ msgstr "DW ¥Ó¥Ã¥È¤¬¥»¥Ã¥È¤µ¤ì¤¿¤È¸«¤Ê¤·¤Æ¥³¡¼¥ÉÀ¸À®" + +#~ msgid "Generate code assuming DW bit is not set" +#~ msgstr "DW ¥Ó¥Ã¥È¤¬¥»¥Ã¥È¤µ¤ì¤Æ¤¤¤Ê¤¤¤È¸«¤Ê¤·¤Æ¥³¡¼¥ÉÀ¸À®" + +#~ msgid "Generate code using byte writes" +#~ msgstr "¥Ð¥¤¥È½ñ¤­¹þ¤ß¤ò»È¤Ã¤Æ¥³¡¼¥ÉÀ¸À®" + +#~ msgid "Do not generate byte writes" +#~ msgstr "¥Ð¥¤¥È½ñ¤­¹þ¤ß¤ò»È¤ï¤º¤Ë¥³¡¼¥ÉÀ¸À®" + +#~ msgid "Use small memory model" +#~ msgstr "¥¹¥â¡¼¥ë¥á¥â¥ê¥â¥Ç¥ë¤òÍøÍÑ" + +#~ msgid "Use normal memory model" +#~ msgstr "¥Î¡¼¥Þ¥ë¥á¥â¥ê¥â¥Ç¥ë¤òÍøÍÑ" + +#~ msgid "Use large memory model" +#~ msgstr "¥é¡¼¥¸¥á¥â¥ê¥â¥Ç¥ë¤òÍøÍÑ" + +#~ msgid "Generate 29050 code" +#~ msgstr "29050 ¥³¡¼¥É¤òÀ¸À®" + +#~ msgid "Generate 29000 code" +#~ msgstr "29000 ¥³¡¼¥É¤òÀ¸À®" + +#~ msgid "Use kernel global registers" +#~ msgstr "¥«¡¼¥Í¥ë¥°¥í¡¼¥Ð¥ë¥ì¥¸¥¹¥¿¤òÍøÍÑ" + +#~ msgid "Use user global registers" +#~ msgstr "¥æ¡¼¥¶¥°¥í¡¼¥Ð¥ë¥ì¥¸¥¹¥¿¤òÍøÍÑ" + +#~ msgid "Emit stack checking code" +#~ msgstr "¥¹¥¿¥Ã¥¯¥Á¥§¥Ã¥¯ÍÑ¥³¡¼¥É¤òÅǤ¯" + +#~ msgid "Do not emit stack checking code" +#~ msgstr "¥¹¥¿¥Ã¥¯¥Á¥§¥Ã¥¯ÍÑ¥³¡¼¥É¤òÅǤ«¤Ê¤¤" + +#~ msgid "Work around storem hardware bug" +#~ msgstr "storem ¥Ï¡¼¥É¥¦¥§¥¢¥Ð¥°¤ÎÂнè¤ò¹Ô¤Ê¤¦" + +#~ msgid "Do not work around storem hardware bug" +#~ msgstr "storem ¥Ï¡¼¥É¥¦¥§¥¢¥Ð¥°¤ÎÂнè¤ò¹Ô¤Ê¤ï¤Ê¤¤" + +#~ msgid "Store locals in argument registers" +#~ msgstr "°ú¿ô¥ì¥¸¥¹¥¿¤Ë¥í¡¼¥«¥ë¤Î¤â¤Î¤ò³ÊǼ¤¹¤ë" + +#~ msgid "Do not store locals in arg registers" +#~ msgstr "°ú¿ô¥ì¥¸¥¹¥¿¤Ë¥í¡¼¥«¥ë¤Î¤â¤Î¤ò³ÊǼ¤·¤Ê¤¤" + +#~ msgid "Use software floating point" +#~ msgstr "¥½¥Õ¥ÈÉâÆ°¾®¿ôÅÀ¤òÍøÍѤ¹¤ë" + +#~ msgid "Do not generate multm instructions" +#~ msgstr "multm Ì¿Îá¤òÀ¸À®¤·¤Ê¤¤" + +#~ msgid "bad value `%s' for -mtrap-precision switch" +#~ msgstr "-mtrap-precision ¥¹¥¤¥Ã¥Á¤Ë¤È¤Ã¤Æ¤ÎÉÔÀµ¤ÊÃÍ `%s'" + +#~ msgid "bad value `%s' for -mfp-rounding-mode switch" +#~ msgstr "-mfp-rounding-mode ¥¹¥¤¥Ã¥Á¤Ë¤È¤Ã¤Æ¤ÎÉÔÀµ¤ÊÃÍ `%s'" + +#~ msgid "bad value `%s' for -mfp-trap-mode switch" +#~ msgstr "-mfp-trap-mode ¥¹¥¤¥Ã¥Á¤Ë¤È¤Ã¤Æ¤ÎÉÔÀµ¤ÊÃÍ `%s'" + +#~ msgid "bad value `%s' for -mcpu switch" +#~ msgstr "-mcpu ¥¹¥¤¥Ã¥Á¤Ë¤È¤Ã¤Æ¤ÎÉÔÀµ¤ÊÃÍ `%s'" + +#~ msgid "fp software completion requires -mtrap-precision=i" +#~ msgstr "ÉâÆ°¾®¿ôÅÀÊä´°¤Ï -mtrap-precision=i ¤òɬÍפȤ·¤Þ¤¹" + +#~ msgid "rounding mode not supported for VAX floats" +#~ msgstr "VAX ÉâÆ°¾®¿ô¤Ç¤Ï´Ý¤á¥â¡¼¥É¤òÍøÍѤǤ­¤Þ¤»¤ó" + +#~ msgid "trap mode not supported for VAX floats" +#~ msgstr "VAX ÉâÆ°¾®¿ô¤Ç¤Ï¥È¥é¥Ã¥×¥â¡¼¥É¤òÍøÍѤǤ­¤Þ¤»¤ó" + +#~ msgid "L%d cache latency unknown for %s" +#~ msgstr "L%d ¥­¥ã¥Ã¥·¥å¥ì¥¤¥Æ¥ó¥·¤Ï %s ¤Ë¤È¤Ã¤ÆÉÔÌÀ¤Ç¤¹" + +#~ msgid "bad value `%s' for -mmemory-latency" +#~ msgstr "`%s' ¤Ï -mmemory-latency ¤Ë¤È¤Ã¤ÆÉÔÀµ¤ÊÃͤǤ¹" + +#~ msgid "invalid %%r value" +#~ msgstr "̵¸ú¤Ê %%r ÃÍ" + +#~ msgid "invalid %%R value" +#~ msgstr "̵¸ú¤Ê %%R ÃÍ" + +#~ msgid "invalid %%h value" +#~ msgstr "̵¸ú¤Ê %%h ÃÍ" + +#~ msgid "invalid %%U value" +#~ msgstr "̵¸ú¤Ê %%U ÃÍ" + +#~ msgid "invalid %%s value" +#~ msgstr "̵¸ú¤Ê %%s ÃÍ" + +#~ msgid "invalid %%E value" +#~ msgstr "̵¸ú¤Ê %%E ÃÍ" + +#~ msgid "invalid %%xn code" +#~ msgstr "̵¸ú¤Ê %%xn ¥³¡¼¥É" + +#~ msgid "Use hardware fp" +#~ msgstr "¥Ï¡¼¥É¥¦¥§¥¢ÉâÆ°¾®¿ôÅÀ¤òÍøÍÑ" + +#~ msgid "Do not use hardware fp" +#~ msgstr "¥Ï¡¼¥É¥¦¥§¥¢ÉâÆ°¾®¿ôÅÀ¤òÍøÍѤ·¤Ê¤¤" + +#~ msgid "Use fp registers" +#~ msgstr "ÉâÆ°¾®¿ôÅÀ¥ì¥¸¥¹¥¿¤òÍøÍѤ¹¤ë" + +#~ msgid "Do not use fp registers" +#~ msgstr "ÉâÆ°¾®¿ôÅÀ¥ì¥¸¥¹¥¿¤òÍøÍѤ·¤Ê¤¤" + +#~ msgid "Do not assume GAS" +#~ msgstr "GAS ¤ÎÍøÍѤòÁ°Äó¤È¤·¤Ê¤¤" + +#~ msgid "Assume GAS" +#~ msgstr "GAS ¤ÎÍøÍѤòÁ°Äó¤È¤¹¤ë" + +#~ msgid "Request IEEE-conformant math library routines (OSF/1)" +#~ msgstr "IEEE ½àµò¤Î¿ô³Ø¥é¥¤¥Ö¥é¥ê¥ë¡¼¥Á¥ó (OSF/1) ¤òÍ׵᤹¤ë" + +#~ msgid "Emit IEEE-conformant code, without inexact exceptions" +#~ msgstr "ÉÔŬÀÚ¤ÊÎã³°¤ò½ü¤¤¤Æ IEEE ½àµò¤Î¥³¡¼¥É¤òȯ¹Ô¤¹¤ë" + +#~ msgid "Emit IEEE-conformant code, with inexact exceptions" +#~ msgstr "ÉÔŬÀÚ¤ÊÎã³°¤ò´Þ¤á¤Æ IEEE ½àµò¤Î¥³¡¼¥É¤òȯ¹Ô¤¹¤ë" + +#~ msgid "Do not emit complex integer constants to read-only memory" +#~ msgstr "Ê£ÁÇ¿ô¤ÎÀ°¿ôÄê¿ô¤òÆɤ߹þ¤ßÀìÍÑ¥á¥â¥ê¤ËŸ³«¤µ¤»¤Ê¤¤" + +#~ msgid "Use VAX fp" +#~ msgstr "VAX ÉâÆ°¾®¿ôÅÀ¤òÍøÍѤ¹¤ë" + +#~ msgid "Do not use VAX fp" +#~ msgstr "VAX ÉâÆ°¾®¿ôÅÀ¤òÍøÍѤ·¤Ê¤¤" + +#~ msgid "Emit code for the byte/word ISA extension" +#~ msgstr "¥Ð¥¤¥È/¥ï¡¼¥É ISA ³ÈÄ¥ÍѤΥ³¡¼¥É¤òȯ¹Ô¤¹¤ë" + +#~ msgid "Emit code for the motion video ISA extension" +#~ msgstr "¥â¡¼¥·¥ç¥ó¥Ó¥Ç¥ª ISA ³ÈÄ¥ÍѤΥ³¡¼¥É¤òȯ¹Ô¤¹¤ë" + +#~ msgid "Emit code for the fp move and sqrt ISA extension" +#~ msgstr "ÉâÆ°¾®¿ôÅÀ move ¤È sqrt ISA ³ÈÄ¥ÍѤΥ³¡¼¥É¤òȯ¹Ô¤¹¤ë" + +#~ msgid "Emit code for the counting ISA extension" +#~ msgstr "¥«¥¦¥ó¥È ISA ³ÈÄ¥ÍѤΥ³¡¼¥É¤òȯ¹Ô¤¹¤ë" + +#~ msgid "Use features of and schedule given CPU" +#~ msgstr "CPU ¤ËÍ¿¤¨¤é¤ì¤¿ÆÃħ¤ä¥¹¥±¥¸¥å¡¼¥ë¤òÍøÍѤ¹¤ë" + +#~ msgid "Schedule given CPU" +#~ msgstr "CPU ¤ËÍ¿¤¨¤é¤ì¤¿¥¹¥±¥¸¥å¡¼¥ë¤òÍøÍѤ¹¤ë" + +#~ msgid "Control the generated fp rounding mode" +#~ msgstr "À¸À®¤µ¤ì¤¿ÉâÆ°¾®¿ôÅÀ´Ý¤á¥â¡¼¥É¤òÀ©¸æ¤¹¤ë" + +#~ msgid "Control the IEEE trap mode" +#~ msgstr "IEEE ¥È¥é¥Ã¥×¥â¡¼¥É¤òÀ©¸æ¤¹¤ë" + +#~ msgid "Control the precision given to fp exceptions" +#~ msgstr "ÉâÆ°¾®¿ôÅÀÎã³°¤ËÍ¿¤¨¤é¤ì¤¿ÀºÅÙ¤òÀ©¸æ¤¹¤ë" + +#~ msgid "Tune expected memory latency" +#~ msgstr "ͽ´ü¤µ¤ì¤ë¥á¥â¥ê¥ì¥¤¥Æ¥ó¥·¤òÄ´À°¤¹¤ë" + +#~ msgid "%s causes a section type conflict" +#~ msgstr "%s ¤Ï¥»¥¯¥·¥ç¥ó¥¿¥¤¥×¤Î¶¥¹ç¤ò°ú¤­µ¯¤³¤·¤Þ¤¹" + +#~ msgid "bad value (%s) for -mcpu switch" +#~ msgstr "-mcpu ¥¹¥¤¥Ã¥Á¤ËÂФ¹¤ëÉÔÀµ¤ÊÃÍ (%s)" + +#~ msgid "invalid operand to %R code" +#~ msgstr "%R ¥³¡¼¥É¤ËÂФ¹¤ë̵¸ú¤Ê¥ª¥Ú¥é¥ó¥É" + +#~ msgid "invalid operand to %H/%L code" +#~ msgstr "%H/%L ¥³¡¼¥É¤ËÂФ¹¤ë̵¸ú¤Ê¥ª¥Ú¥é¥ó¥É" + +#~ msgid "invalid operand to %U code" +#~ msgstr "%U ¥³¡¼¥É¤ËÂФ¹¤ë̵¸ú¤Ê¥ª¥Ú¥é¥ó¥É" + +#~ msgid "invalid operand to %V code" +#~ msgstr "%V ¥³¡¼¥É¤ËÂФ¹¤ë̵¸ú¤Ê¥ª¥Ú¥é¥ó¥É" + +#~ msgid "invalid operand output code" +#~ msgstr "̵¸ú¤Ê¥ª¥Ú¥é¥ó¥É½ÐÎÏ¥³¡¼¥É" + +#~ msgid "switch -mcpu=%s conflicts with -march= switch" +#~ msgstr "-mcpu=%s ¥¹¥¤¥Ã¥Á¤Ï -march= ¥¹¥¤¥Ã¥Á¤È¶¥¹ç¤·¤Þ¤¹" + +#~ msgid "bad value (%s) for %s switch" +#~ msgstr "ÃÍ (%s) ¤Ï %s switch ¤Ë¤È¤Ã¤ÆÀµ¤·¤¯¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "target CPU does not support APCS-32" +#~ msgstr "¥¿¡¼¥²¥Ã¥È CPU ¤Ï APCS-32 ¤ò¥µ¥Ý¡¼¥È¤·¤Þ¤»¤ó" + +#~ msgid "target CPU does not support APCS-26" +#~ msgstr "¥¿¡¼¥²¥Ã¥È CPU ¤Ï APCS-26 ¤ò¥µ¥Ý¡¼¥È¤·¤Þ¤»¤ó" + +#~ msgid "target CPU does not support interworking" +#~ msgstr "¥¿¡¼¥²¥Ã¥È CPU ¤Ï interworking ¤ò¥µ¥Ý¡¼¥È¤·¤Þ¤»¤ó" + +#~ msgid "target CPU does not support THUMB instructions." +#~ msgstr "¥¿¡¼¥²¥Ã¥È CPU ¤Ï THUMB Ì¿Îá¤ò¥µ¥Ý¡¼¥È¤·¤Þ¤»¤ó" + +#~ msgid "enabling backtrace support is only meaningful when compiling for the Thumb." +#~ msgstr "Thumb ÍѤ˥³¥ó¥Ñ¥¤¥ë¤·¤¿¤È¤­¤Î¤ß¡¢°ÕÌ£¤Î¤¢¤ë¥Ð¥Ã¥¯¥È¥ì¡¼¥¹¤òÍ­¸ú¤Ë¤·¤Þ¤¹" + +#~ msgid "enabling callee interworking support is only meaningful when compiling for the Thumb." +#~ msgstr "Thumb ÍѤ˥³¥ó¥Ñ¥¤¥ë¤·¤¿¤È¤­¤Î¤ß¡¢Èï¸Æ¤Ó½Ð¤·Â¦ interworking ¤òÍ­¸ú¤Ë¤·¤Þ¤¹" + +#~ msgid "enabling caller interworking support is only meaningful when compiling for the Thumb." +#~ msgstr "Thumb ÍѤ˥³¥ó¥Ñ¥¤¥ë¤·¤¿¤È¤­¤Î¤ß¡¢¸Æ¤Ó½Ð¤·Â¦ interworking ¤òÍ­¸ú¤Ë¤·¤Þ¤¹" + +#~ msgid "interworking forces APCS-32 to be used" +#~ msgstr "interworking ¤Ï APCS-32 ¤Î»ÈÍѤò¶¯Íפ·¤Þ¤¹" + +#~ msgid "-mapcs-stack-check incompatible with -mno-apcs-frame" +#~ msgstr "-mapcs-stack-check ¤Ï -mno-apcs-frame ¤È¶¦Â¸¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "-fpic and -mapcs-reent are incompatible" +#~ msgstr "-fpic ¤È -mapcs-reent ¤Ï¶¦Â¸¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "APCS reentrant code not supported. Ignored" +#~ msgstr "APCS ºÆÆþ²Äǽ¥³¡¼¥É¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤»¤ó¡£Ìµ»ë¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "-g with -mno-apcs-frame may not give sensible debugging" +#~ msgstr "-g ¤Ë -mno-apcs-frame ¤ò¤Ä¤±¤ë¤È¡¢¤­¤áºÙ¤«¤Ê¥Ç¥Ð¥Ã¥°¤Ï¤Ç¤­¤Ê¤¤¤Ç¤·¤ç¤¦" + +#~ msgid "Passing floating point arguments in fp regs not yet supported" +#~ msgstr "ÉâÆ°¾®¿ôÅÀ°ú¿ô¤òÉâÆ°¾®¿ôÅÀ¥ì¥¸¥¹¥¿¤ÇÅϤ¹¤³¤È¤Ï¡¢¤Þ¤À¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤»¤ó" + +#~ msgid "Invalid floating point emulation option: -mfpe-%s" +#~ msgstr "̵¸ú¤ÊÉâÆ°¾®¿ôÅÀ¥¨¥ß¥å¥ì¡¼¥È¥ª¥×¥·¥ç¥ó: -mfpe-%s" + +#~ msgid "Structure size boundary can only be set to 8 or 32" +#~ msgstr "¹½Â¤ÂΤΥµ¥¤¥º¶­³¦¤Ï 8 Ëô¤Ï 32 ¤Ë¤·¤«ÀßÄê¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "-mpic-register= is useless without -fpic" +#~ msgstr "-mpic-register= ¤Ï -fpic ¤ò¤Ä¤±¤Ê¤¤¤ÈÌò¤ËΩ¤Á¤Þ¤»¤ó" + +#~ msgid "Unable to use '%s' for PIC register" +#~ msgstr "'%s' ¤ò PIC ¤Î¥ì¥¸¥¹¥¿¤È¤·¤Æ»È¤¦¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "Unable to find a temporary location for static chain register" +#~ msgstr "ÀÅŪ¥Á¥§¥¤¥ó¥ì¥¸¥¹¥¿ÍѤΰì»þÎΰè¤ò¸«¤Ä¤±¤é¤ì¤Þ¤»¤ó" + +#~ msgid "Unable to compute real location of stacked parameter" +#~ msgstr "¥¹¥¿¥Ã¥¯¤ËÀѤޤ줿²¾°ú¿ô¤Î¼ÂºÝ¤ÎÎΰè¤ò·×»»¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "no low registers available for popping high registers" +#~ msgstr "¹â°Ì¥ì¥¸¥¹¥¿¤ò pop ¤¹¤ë°Ù¤Ë»ÈÍѤǤ­¤ëÄã°Ì¥ì¥¸¥¹¥¿¤¬¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "Interrupt Service Routines cannot be coded in Thumb mode." +#~ msgstr "Thumb ¥â¡¼¥É¤Ç¤Ï³ä¤ê¹þ¤ß¥µ¡¼¥Ó¥¹¥ë¡¼¥Á¥ó¤ò¥³¡¼¥É²½¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "Generate APCS conformant stack frames" +#~ msgstr "APCS Ŭ¹ç¤·¤¿¥¹¥¿¥Ã¥¯¥Õ¥ì¡¼¥à¤òÀ¸À®¤¹¤ë" + +#~ msgid "Store function names in object code" +#~ msgstr "¥ª¥Ö¥¸¥§¥¯¥È¥³¡¼¥É¤Ë´Ø¿ô̾¤ò³ÊǼ¤¹¤ë" + +#~ msgid "Use the 32-bit version of the APCS" +#~ msgstr "APCS ¤Î 32 ¥Ó¥Ã¥ÈÈǤò»ÈÍѤ¹¤ë" + +#~ msgid "Use the 26-bit version of the APCS" +#~ msgstr "APCS ¤Î 26 ¥Ó¥Ã¥ÈÈǤò»ÈÍѤ¹¤ë" + +#~ msgid "Pass FP arguments in FP registers" +#~ msgstr "FP ¥ì¥¸¥¹¥¿¤Ç FP °ú¿ô¤òÅϤ¹" + +#~ msgid "Generate re-entrant, PIC code" +#~ msgstr "ºÆÆþ²Äǽ¤Ê PIC ¥³¡¼¥É¤òÀ¸À®¤·¤Þ¤¹" + +#~ msgid "The MMU will trap on unaligned accesses" +#~ msgstr "MMU ¤Ï¥¢¥é¥¤¥ó¥á¥ó¥È¤µ¤ì¤Ê¤¤¥¢¥¯¥»¥¹¤Ç¥È¥é¥Ã¥×¤òȯ¤¹¤ë¤Ç¤·¤ç¤¦" + +#~ msgid "Use library calls to perform FP operations" +#~ msgstr "ÉâÆ°¾®¿ôÅÀ±é»»¤ò¹Ô¤¦¥é¥¤¥Ö¥é¥ê¸Æ¤Ó½Ð¤·¤òÍøÍѤ¹¤ë" + +#~ msgid "Use hardware floating point instructions" +#~ msgstr "¥Ï¡¼¥É¥¦¥§¥¢ÉâÆ°¾®¿ôÅÀÌ¿Îá¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Assume target CPU is configured as big endian" +#~ msgstr "¥¿¡¼¥²¥Ã¥È CPU ¤¬¥Ó¥Ã¥¯¥¨¥ó¥Ç¥£¥¢¥ó¤È¤·¤ÆÀßÄꤵ¤ì¤Æ¤¤¤ë¤È¤ß¤Ê¤¹" + +#~ msgid "Assume target CPU is configured as little endian" +#~ msgstr "¥¿¡¼¥²¥Ã¥È CPU ¤¬¥ê¥È¥ë¥¨¥ó¥Ç¥£¥¢¥ó¤È¤·¤ÆÀßÄꤵ¤ì¤Æ¤¤¤ë¤È¤ß¤Ê¤¹" + +#~ msgid "Assume big endian bytes, little endian words" +#~ msgstr "byte ¤¬¥Ó¥Ã¥°¥¨¥ó¥Ç¥£¥¢¥ó¤Ç word ¤¬¥ê¥È¥ë¥¨¥ó¥Ç¥£¥¢¥ó¤È¤ß¤Ê¤¹" + +#~ msgid "Support calls between Thumb and ARM instruction sets" +#~ msgstr "Thumb ¤È ARM Ì¿Î᥻¥Ã¥È´Ö¤Î¸Æ¤Ó½Ð¤·¤ò¥µ¥Ý¡¼¥È¤¹¤ë" + +#~ msgid "Generate a call to abort if a noreturn function returns" +#~ msgstr "noreturn ´Ø¿ô¤¬ return ¤¹¤ë¤È¤­ abort ¤Î¸Æ¤Ó½Ð¤·¤òÀ¸À®¤¹¤ë" + +#~ msgid "Do not move instructions into a function's prologue" +#~ msgstr "´Ø¿ô¤Î³«»ÏÉôʬ¤ËÌ¿Îá¤ò°ÜÆ°¤·¤Ê¤¤" + +#~ msgid "Do not load the PIC register in function prologues" +#~ msgstr "´Ø¿ô¤ÎÁ°ÃÖ¤­Éôʬ¤Ë PIC ¥ì¥¸¥¹¥¿¤ò¥í¡¼¥É¤·¤Ê¤¤" + +#~ msgid "Generate call insns as indirect calls, if necessary" +#~ msgstr "ɬÍפ¬¤¢¤ì¤Ð¡¢Ì¿Îá¸Æ¤Ó½Ð¤·¤ò´ÖÀܸƤӽФ·¤È¤·¤ÆÀ¸À®¤¹¤ë" + +#~ msgid "Compile for the Thumb not the ARM" +#~ msgstr "ARM ¤Ç¤Ï¤Ê¤¯ Thumb ÍѤ˥³¥ó¥Ñ¥¤¥ë¤¹¤ë" + +#~ msgid "Thumb: Generate (non-leaf) stack frames even if not needed" +#~ msgstr "Thumb: ÉÔÍפʾì¹ç¤Ç¤â(ÈóËöü)¥¹¥¿¥Ã¥¯¥Õ¥ì¡¼¥à¤òÀ¸À®¤¹¤ë" + +#~ msgid "Thumb: Generate (leaf) stack frames even if not needed" +#~ msgstr "Thumb: ÉÔÍפʾì¹ç¤Ç¤â(Ëöü)¥¹¥¿¥Ã¥¯¥Õ¥ì¡¼¥à¤òÀ¸À®¤¹¤ë" + +#~ msgid "Thumb: Assume non-static functions may be called from ARM code" +#~ msgstr "Thumb: ÈóÀÅŪ´Ø¿ô¤¬ ARM ¥³¡¼¥É¤«¤é¸Æ¤Ó½Ð¤µ¤ì¤ë²ÄǽÀ­¤¬¤¢¤ë¤È¤ß¤Ê¤¹" + +#~ msgid "Thumb: Assume function pointers may go to non-Thumb aware code" +#~ msgstr "Thumb: ´Ø¿ô¥Ý¥¤¥ó¥¿¤¬Èó Thumb ¤Èǧ¼±¤¹¤ë¥³¡¼¥É¤ËÆÍÆþ¤¹¤ë²ÄǽÀ­¤¬¤¢¤ë¤È¤ß¤Ê¤¹" + +#~ msgid "Specify the name of the target CPU" +#~ msgstr "¥¿¡¼¥²¥Ã¥È CPU ¤Î̾Á°¤ò»ØÄꤹ¤ë" + +#~ msgid "Specify the name of the target architecture" +#~ msgstr "¥¿¡¼¥²¥Ã¥È¥¢¡¼¥­¥Æ¥¯¥Á¥ã¤Î̾Á°¤ò»ØÄꤹ¤ë" + +#~ msgid "Specify the version of the floating point emulator" +#~ msgstr "ÉâÆ°¾®¿ôÅÀ¥¨¥ß¥å¥ì¡¼¥¿¤Î¥Ð¡¼¥¸¥ç¥ó¤ò»ØÄꤹ¤ë" + +#~ msgid "Specify the minimum bit alignment of structures" +#~ msgstr "¹½Â¤ÂÎ¥¢¥é¥¤¥ó¥á¥ó¥È¤ÎºÇ¾®¥Ó¥Ã¥È¿ô¤ò»ØÄꤹ¤ë" + +#~ msgid "Specify the register to be used for PIC addressing" +#~ msgstr "PIC ¥¢¥É¥ì¥·¥ó¥°¤ËÍøÍѤµ¤ì¤ë¥ì¥¸¥¹¥¿¤ò»ØÄꤹ¤ë" + +#~ msgid "initialized variable `%s' is marked dllimport" +#~ msgstr "½é´ü²½¤µ¤ì¤¿ÊÑ¿ô `%s' ¤Ï dllimport ¥Þ¡¼¥¯¤µ¤ì¤Æ¤¤¤Þ¤¹" + +#~ msgid "static variable `%s' is marked dllimport" +#~ msgstr "ÀÅŪÊÑ¿ô `%s' ¤Ï dllimport ¤È¥Þ¡¼¥¯¤µ¤ì¤Æ¤¤¤Þ¤¹" + +#~ msgid "Ignore dllimport attribute for functions" +#~ msgstr "´Ø¿ô¤Î dllimport °À­¤ò̵»ë¤¹¤ë" + +#~ msgid "Do symbol renaming for BSD" +#~ msgstr "BSD ÍѤ˥·¥ó¥Ü¥ë̾¤òÊѹ¹¤¹¤ë" + +#~ msgid "Do symbol renaming for X/OPEN" +#~ msgstr "X/OPEN ÍѤ˥·¥ó¥Ü¥ë̾¤òÊѹ¹¤¹¤ë" + +#~ msgid "Don't do symbol renaming" +#~ msgstr "¥·¥ó¥Ü¥ë̾¤ÎÊѹ¹¤ò¹Ô¤ï¤Ê¤¤" + +#~ msgid "MCU `%s' not supported" +#~ msgstr "MCU `%s' ¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤»¤ó" + +#~ msgid "large frame pointer change (%d) with -mtiny-stack" +#~ msgstr "-mtiny-stack ¤Ë¤è¤ê¥é¡¼¥¸¥Õ¥ì¡¼¥à¥Ý¥¤¥ó¥¿¤¬Êѹ¹¤µ¤ì¤Þ¤¹(%d)" + +#~ msgid "Only initialized variables can be placed into program memory area." +#~ msgstr "¥×¥í¥°¥é¥à¥á¥â¥êÎΰèÆâ¤ËÇÛÃ֤Ǥ­¤ëÊÑ¿ô¤À¤±¤ò½é´ü²½¤·¤Þ¤·¤¿" + +#~ msgid "Assume int to be 8 bit integer" +#~ msgstr "int ¤ò 8 ¥Ó¥Ã¥ÈÀ°¿ô¤È¤ß¤Ê¤¹" + +#~ msgid "Change the stack pointer without disabling interrupts" +#~ msgstr "³ä¤ê¹þ¤ß¤Î̵¸ú²½¤Ê¤·¤Ç¥¹¥¿¥Ã¥¯¥Ý¥¤¥ó¥¿¤òÊѹ¹¤¹¤ë" + +#~ msgid "Use subroutines for function prologue/epilogue" +#~ msgstr "´Ø¿ô¤ÎÁ°ÃÖ¤­/·ë¤Ó¤Î¤¿¤á¤Î¥µ¥Ö¥ë¡¼¥Á¥ó¤òÍøÍѤ¹¤ë" + +#~ msgid "Change only the low 8 bits of the stack pointer" +#~ msgstr "¥¹¥¿¥Ã¥¯¥Ý¥¤¥ó¥¿¤Î²¼°Ì 8 ¥Ó¥Ã¥È¤À¤±¤òÊѹ¹¤¹¤ë" + +#~ msgid "Do not generate tablejump insns" +#~ msgstr "¥Æ¡¼¥Ö¥ë¥¸¥ã¥ó¥×Ì¿Îá¤òÀ¸À®¤·¤Ê¤¤" + +#~ msgid "Output instruction sizes to the asm file" +#~ msgstr "asm ¥Õ¥¡¥¤¥ë¤ËÌ¿Î᥵¥¤¥º¤ò½ÐÎϤ¹¤ë" + +#~ msgid "Specify the initial stack address" +#~ msgstr "½é´ü¥¹¥¿¥Ã¥¯¥¢¥É¥ì¥¹¤ò»ØÄꤹ¤ë" + +#~ msgid "Specify the MCU name" +#~ msgstr "MCU ̾¤ò»ØÄꤹ¤ë" + +#~ msgid "Trampolines not supported\n" +#~ msgstr "¥È¥é¥ó¥Ý¥ê¥ó¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤»¤ó\n" + +#~ msgid "Unknown CPU version %d, using 40.\n" +#~ msgstr "ÉÔÌÀ¤Ê CPU ¥Ð¡¼¥¸¥ç¥ó %d¡¢40 ¤ò»ÈÍѤ·¤Þ¤¹¡£\n" + +#~ msgid "ISR %s requires %d words of local vars, max is 32767." +#~ msgstr "ISR %s ¤Ï %d ¥ï¡¼¥É¤Î¥í¡¼¥«¥ëÊÑ¿ô¤òÍ׵ᤷ¡¢ºÇÂç¤Ï 32767 ¤Ç¤¹¡£" + +#~ msgid "junk at end of '#pragma %s'" +#~ msgstr "'#pragma %s' ¤ÎºÇ¸å¤Ë¥´¥ß¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "Small memory model" +#~ msgstr "¥¹¥â¡¼¥ë¥á¥â¥ê¥â¥Ç¥ë" + +#~ msgid "Big memory model" +#~ msgstr "¥Ó¥Ã¥°¥á¥â¥ê¥â¥Ç¥ë" + +#~ msgid "Use MPYI instruction for C3x" +#~ msgstr "MPYI Ì¿Îá¤ò C3x ÍѤ˻ÈÍѤ¹¤ë" + +#~ msgid "Do not use MPYI instruction for C3x" +#~ msgstr "MPYI Ì¿Îá¤ò C3x ÍѤ˻ÈÍѤ·¤Ê¤¤" + +#~ msgid "Use fast but approximate float to integer conversion" +#~ msgstr "¹â®¤À¤¬¶á»÷ÃͤȤʤëÉâÆ°¾®¿ô¤«¤éÀ°¿ô¤Ø¤ÎÊÑ´¹¤òÍøÍѤ¹¤ë" + +#~ msgid "Use slow but accurate float to integer conversion" +#~ msgstr "Ä㮤À¤¬Àµ³Î¤ÊÉâÆ°¾®¿ô¤«¤éÀ°¿ô¤Ø¤ÎÊÑ´¹¤òÍøÍѤ¹¤ë" + +#~ msgid "Enable use of RTPS instruction" +#~ msgstr "RTPS Ì¿Îá¤ÎÍøÍѤòÍ­¸ú¤Ë¤¹¤ë" + +#~ msgid "Disable use of RTPS instruction" +#~ msgstr "RTPS Ì¿Îá¤ÎÍøÍѤò̵¸ú¤Ë¤¹¤ë" + +#~ msgid "Enable use of RTPB instruction" +#~ msgstr "RTPB Ì¿Îá¤ÎÍøÍѤòÍ­¸ú¤Ë¤¹¤ë" + +#~ msgid "Disable use of RTPB instruction" +#~ msgstr "RTPB Ì¿Îá¤ÎÍøÍѤò̵¸ú¤Ë¤¹¤ë" + +#~ msgid "Generate code for C30 CPU" +#~ msgstr "C30 CPU ÍѤΥ³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Generate code for C31 CPU" +#~ msgstr "C31 CPU ÍѤΥ³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Generate code for C32 CPU" +#~ msgstr "C32 CPU ÍѤΥ³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Generate code for C33 CPU" +#~ msgstr "C33 CPU ÍѤΥ³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Generate code for C40 CPU" +#~ msgstr "C40 CPU ÍѤΥ³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Generate code for C44 CPU" +#~ msgstr "C44 CPU ÍѤΥ³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Emit code compatible with TI tools" +#~ msgstr "TI ¥Ä¡¼¥ë¸ß´¹¤Î¥³¡¼¥É¤òȯ¹Ô¤¹¤ë" + +#~ msgid "Emit code to use GAS extensions" +#~ msgstr "GAS ³ÈÄ¥¤òÍøÍѤ¹¤ë¥³¡¼¥É¤òȯ¹Ô¤¹¤ë" + +#~ msgid "Save DP across ISR in small memory model" +#~ msgstr "¥¹¥â¡¼¥ë¥á¥â¥ê¥â¥Ç¥ë¤Ç ISR ¤ò¸Ù¤ë DP ¤ò¥»¡¼¥Ö¤¹¤ë" + +#~ msgid "Don't save DP across ISR in small memory model" +#~ msgstr "¥¹¥â¡¼¥ë¥â¥Ç¥ë¤Ç ISR ¤ò¸Ù¤ë DP ¤ò¥»¡¼¥Ö¤·¤Ê¤¤" + +#~ msgid "Pass arguments on the stack" +#~ msgstr "°ú¿ô¤ò¥¹¥¿¥Ã¥¯ÅϤ·¤Ë¤¹¤ë" + +#~ msgid "Pass arguments in registers" +#~ msgstr "°ú¿ô¤ò¥ì¥¸¥¹¥¿ÅϤ·¤Ë¤¹¤ë" + +#~ msgid "Enable new features under development" +#~ msgstr "³«È¯Ãæ¤Î¿·µ¡Ç½¤òÍ­¸ú¤Ë¤¹¤ë" + +#~ msgid "Disable new features under development" +#~ msgstr "³«È¯Ãæ¤Î¿·µ¡Ç½¤ò̵¸ú¤Ë¤¹¤ë" + +#~ msgid "Use the BK register as a general purpose register" +#~ msgstr "BK ¥ì¥¸¥¹¥¿¤òÈÆÍѥ쥸¥¹¥¿¤È¤·¤Æ»ÈÍѤ¹¤ë" + +#~ msgid "Do not allocate BK register" +#~ msgstr "BK ¥ì¥¸¥¹¥¿¤ò³ÎÊݤ·¤Ê¤¤" + +#~ msgid "Enable use of DB instruction" +#~ msgstr "DB Ì¿Îá¤Î»ÈÍѤòÍ­¸ú¤Ë¤¹¤ë" + +#~ msgid "Disable use of DB instruction" +#~ msgstr "DB Ì¿Îá¤Î»ÈÍѤò̵¸ú¤Ë¤¹¤ë" + +#~ msgid "Enable debugging" +#~ msgstr "¥Ç¥Ð¥Ã¥°¤òÍ­¸ú¤Ë¤¹¤ë" + +#~ msgid "Disable debugging" +#~ msgstr "¥Ç¥Ð¥Ã¥°¤ò̵¸ú¤Ë¤¹¤ë" + +#~ msgid "Force constants into registers to improve hoisting" +#~ msgstr "´¬¤­¾å¤²(hoist)¤ò²þÁ±¤¹¤ë¤¿¤áÄê¿ô¤ò¥ì¥¸¥¹¥¿¤Ë³ä¤êÅö¤Æ¤ë¤³¤È¤ò¶¯Íפ¹¤ë" + +#~ msgid "Don't force constants into registers" +#~ msgstr "Äê¿ô¤Î¥ì¥¸¥¹¥¿³ä¤êÅö¤Æ¤ò¶¯Íפ·¤Ê¤¤" + +#~ msgid "Force RTL generation to emit valid 3 operand insns" +#~ msgstr "RTL À¸À®¤Ë¤Ä¤¤¤Æ¡¢Àµ¾ï¤Ê 3 ¥ª¥Ú¥é¥ó¥ÉÌ¿Îá¤ò¶¯Íפ¹¤ë" + +#~ msgid "Allow RTL generation to emit invalid 3 operand insns" +#~ msgstr "RTL À¸À®¤Ë¤Ä¤¤¤Æ¡¢Ìµ¸ú¤Ê 3 ¥ª¥Ú¥é¥ó¥ÉÌ¿Îá¤òµöÍƤ¹¤ë" + +#~ msgid "Allow unsigned interation counts for RPTB/DB" +#~ msgstr "Éä¹ç̵¤·¤Î RPTB/DB ÍѤÎÈ¿Éü¥«¥¦¥ó¥È¤òµöÍƤ¹¤ë" + +#~ msgid "Disallow unsigned iteration counts for RPTB/DB" +#~ msgstr "Éä¹ç̵¤·¤Î RPTB/DB ÍѤÎÈ¿Éü¥«¥¦¥ó¥È¤òµöÍƤ·¤Ê¤¤" + +#~ msgid "Preserve all 40 bits of FP reg across call" +#~ msgstr "¸Æ¤Ó½Ð¤·¤Î´Ö FP ¥ì¥¸¥¹¥¿¤Î 40 ¥Ó¥Ã¥ÈÁ´¤Æ¤òÊݸ¤¹¤ë" + +#~ msgid "Only preserve 32 bits of FP reg across call" +#~ msgstr "¸Æ¤Ó½Ð¤·¤Î´Ö FP ¥ì¥¸¥¹¥¿¤Î 32 ¥Ó¥Ã¥È¤À¤±¤òÊݸ¤¹¤ë" + +#~ msgid "Enable parallel instructions" +#~ msgstr "ÊÂÎóÌ¿Îá¤òÍ­¸ú¤Ë¤¹¤ë" + +#~ msgid "Disable parallel instructions" +#~ msgstr "ÊÂÎóÌ¿Îá¤ò̵¸ú¤Ë¤¹¤ë" + +#~ msgid "Enable MPY||ADD and MPY||SUB instructions" +#~ msgstr "MPY||ADD ¤ª¤è¤Ó MPY||SUB Ì¿Îá¤òÍ­¸ú¤Ë¤¹¤ë" + +#~ msgid "Disable MPY||ADD and MPY||SUB instructions" +#~ msgstr "MPY||ADD ¤ª¤è¤Ó MPY||SUB Ì¿Îá¤ò̵¸ú¤Ë¤¹¤ë" + +#~ msgid "Assume that pointers may be aliased" +#~ msgstr "¥Ý¥¤¥ó¥¿¤¬ÊÌ̾¤È¤Ê¤ê¤¦¤ë¤³¤È¤òÁ°Äó¤È¤¹¤ë" + +#~ msgid "Assume that pointers not aliased" +#~ msgstr "¥Ý¥¤¥ó¥¿¤ÏÊÌ̾¤Ë¤Ê¤é¤Ê¤¤¤È¤ß¤Ê¤¹" + +#~ msgid "Specify maximum number of iterations for RPTS" +#~ msgstr "RPTS ÍѤκÇÂçÈ¿Éü¿ô¤ò»ØÄꤹ¤ë" + +#~ msgid "Select CPU to generate code for" +#~ msgstr "¥³¡¼¥É¤¬À¸À®¤µ¤ì¤ë CPU ¤òÁªÂò¤¹¤ë" + +#~ msgid "Generate code for the C400" +#~ msgstr "C400 ÍѤΥ³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Generate code for the C300" +#~ msgstr "C300 ÍѤΥ³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Generate code for c1" +#~ msgstr "c1 ÍѤΥ³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Generate code for c2" +#~ msgstr "c2 ÍѤΥ³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Generate code for c32" +#~ msgstr "c32 ÍѤΥ³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Generate code for c34" +#~ msgstr "c34 ÍѤΥ³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Use standard calling sequence, with arg count word" +#~ msgstr "ɸ½àŪ¸Æ¤Ó½Ð¤·¼ê½ç¤ò»È¤¤¡¢°ú¿ô¥«¥¦¥ó¥È word ¤ò¤Ä¤±¤ë" + +#~ msgid "Place arg count in a nop instruction (faster than push)" +#~ msgstr "nop Ì¿ÎáÆâ¤Ë°ú¿ô¥«¥¦¥ó¥È¤òÃÖ¤¯ (push ¤è¤ê¹â®)" + +#~ msgid "Don't push arg count, depend on symbol table" +#~ msgstr "°ú¿ô¥«¥¦¥ó¥È¤ò push ¤»¤º¡¢¥·¥ó¥Ü¥ë¥Æ¡¼¥Ö¥ë¤ò¤¢¤Æ¤Ë¤¹¤ë" + +#~ msgid "Use data cache for volatile mem refs (default)" +#~ msgstr "volatile ¥á¥â¥ê»²¾ÈÍѥǡ¼¥¿¥­¥ã¥Ã¥·¥å¤òÍøÍѤ¹¤ë(¥Ç¥Õ¥©¥ë¥È)" + +#~ msgid "Don't use data cache for volatile mem refs" +#~ msgstr "volatile ¥á¥â¥ê»²¾ÈÍѤˤϥǡ¼¥¿¥­¥ã¥Ã¥·¥å¤ò¹Ô¤ï¤Ê¤¤" + +#~ msgid "Bypass data cache for volatile mem refs" +#~ msgstr "volatile ¥á¥â¥ê»²¾ÈÍÑ¤Ë¤Ï cache ¤µ¤ì¤¿¥Ç¡¼¥¿¤ò²óÈò¤¹¤ë" + +#~ msgid "Use 64-bit longs" +#~ msgstr "64 ¥Ó¥Ã¥È long ¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Use cc- and libc-compatible 32-bit longs" +#~ msgstr "cc- ¤È libc ¸ß´¹¤Î 32 ¥Ó¥Ã¥È long ¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Bad modes_tieable_p for register %s, mode1 %s, mode2 %s" +#~ msgstr "¥ì¥¸¥¹¥¿ %s ¤Ë¤È¤Ã¤ÆÉÔÀµ¤Ê modes_tieable_p, mode1 %s, mode2 %s" + +#~ msgid "Enable use of conditional move instructions" +#~ msgstr "¾ò·ïŪ move Ì¿Îá¤ÎÍøÍѤòÍ­¸ú¤Ë¤¹¤ë" + +#~ msgid "Disable use of conditional move instructions" +#~ msgstr "¾ò·ïŪ move Ì¿Îá¤ÎÍøÍѤò̵¸ú¤Ë¤¹¤ë" + +#~ msgid "Debug argument support in compiler" +#~ msgstr "¥³¥ó¥Ñ¥¤¥éÆâ¤Î¥Ç¥Ð¥Ã¥°°ú¿ô¤ò¥µ¥Ý¡¼¥È¤¹¤ë" + +#~ msgid "Debug stack support in compiler" +#~ msgstr "¥³¥ó¥Ñ¥¤¥éÆâ¤Î¥Ç¥Ð¥Ã¥°¥¹¥¿¥Ã¥¯¤ò¥µ¥Ý¡¼¥È¤¹¤ë" + +#~ msgid "Debug memory address support in compiler" +#~ msgstr "¥³¥ó¥Ñ¥¤¥éÆâ¤Î¥Ç¥Ð¥Ã¥°¥á¥â¥ê¥¢¥É¥ì¥¹¤ò¥µ¥Ý¡¼¥È¤¹¤ë" + +#~ msgid "Make adjacent short instructions parallel if possible." +#~ msgstr "²Äǽ¤Ê¤é¤ÐÎÙÀܤ¹¤ëû¤¤Ì¿Îá¤òÊÂÎ󲽤¹¤ë" + +#~ msgid "Do not make adjacent short instructions parallel." +#~ msgstr "ÎÙÀܤ¹¤ëû¤¤Ì¿Îá¤òÊÂÎ󲽤·¤Ê¤¤" + +#~ msgid "Link programs/data to be in external memory by default" +#~ msgstr "¥×¥í¥°¥é¥à/¥Ç¡¼¥¿¤ò¥Ç¥Õ¥©¥ë¥È¤Ç³°Éô¥á¥â¥êÆâ¤Ë¥ê¥ó¥¯¤¹¤ë" + +#~ msgid "Link programs/data to be in onchip memory by default" +#~ msgstr "¥×¥í¥°¥é¥à/¥Ç¡¼¥¿¤ò¥Ç¥Õ¥©¥ë¥È¤Ç¥Á¥Ã¥×¾å¤Î¥á¥â¥êÆâ¤Ë¥ê¥ó¥¯¤¹¤ë" + +#~ msgid "Change the branch costs within the compiler" +#~ msgstr "¥³¥ó¥Ñ¥¤¥éÆâÉô¤Ç¤Îʬ´ô¥³¥¹¥È¤òÊѹ¹¤¹¤ë" + +#~ msgid "Change the threshold for conversion to conditional execution" +#~ msgstr "¾ò·ïŪ¤Ê¼Â¹Ô¤Ø¤ÎÊѹ¹¤Î¤¿¤á¤ÎïçÃͤòÊѹ¹¤¹¤ë" + +#~ msgid "Stack size > 32k" +#~ msgstr "¥¹¥¿¥Ã¥¯¥µ¥¤¥º > 32k" + +#~ msgid "inline float constants not supported on this host" +#~ msgstr "¤³¤Î¥Û¥¹¥È¤Ç¤Ï¥¤¥ó¥é¥¤¥óÉâÆ°¾®¿ôÄê¿ô¤ò¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "Profiling not implemented yet." +#~ msgstr "¥×¥í¥Õ¥¡¥¤¥ê¥ó¥°¤Ï¡¢¤Þ¤À¼ÂÁõ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£" + +#~ msgid "Trampolines not yet implemented" +#~ msgstr "Trampoline ¤Ï¡¢¤Þ¤À¼ÂÁõ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "Generate code the unix assembler can handle" +#~ msgstr "unix ¥¢¥»¥ó¥Ö¥é¤¬½èÍý¤Ç¤­¤ë¥³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Generate code an embedded assembler can handle" +#~ msgstr "Ëä¤á¹þ¤ß¥¢¥»¥ó¥Ö¥é¤¬½èÍý¤Ç¤­¤ë¥³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "fr30_print_operand_address: unhandled address" +#~ msgstr "fr30_print_operand_address: ½èÍý¤µ¤ì¤Ê¤¤¥¢¥É¥ì¥¹¤Ç¤¹" + +#~ msgid "fr30_print_operand: unrecognised %p code" +#~ msgstr "fr30_print_operand: ǧ¼±¤Ç¤­¤Ê¤¤ %p ¥³¡¼¥É¤Ç¤¹" + +#~ msgid "fr30_print_operand: unrecognised %b code" +#~ msgstr "fr30_print_operand: ǧ¼±¤Ç¤­¤Ê¤¤ %b ¥³¡¼¥É¤Ç¤¹" + +#~ msgid "fr30_print_operand: unrecognised %B code" +#~ msgstr "fr30_print_operand: ǧ¼±¤Ç¤­¤Ê¤¤ %B ¥³¡¼¥É¤Ç¤¹" + +#~ msgid "fr30_print_operand: invalid operand to %A code" +#~ msgstr "fr30_print_operand: %A ¥³¡¼¥É¤ËÂФ¹¤ë̵¸ú¤Ê±é»»»Ò¤Ç¤¹" + +#~ msgid "fr30_print_operand: invalid %x code" +#~ msgstr "fr30_print_operand: ̵¸ú¤Ê %x ¥³¡¼¥É¤Ç¤¹" + +#~ msgid "fr30_print_operand: invalid %F code" +#~ msgstr "fr30_print_operand: ̵¸ú¤Ê %F ¥³¡¼¥É¤Ç¤¹" + +#~ msgid "fr30_print_operand: unknown code" +#~ msgstr "fr30_print_operand: ÉÔÌÀ¤Ê¥³¡¼¥É¤Ç¤¹" + +#~ msgid "fr30_print_operand: unhandled MEM" +#~ msgstr "fr30_print_operand: ½èÍý¤µ¤ì¤Ê¤¤ MEM ¤Ç¤¹" + +#~ msgid "Assume small address space" +#~ msgstr "¥¹¥â¡¼¥ë¥¢¥É¥ì¥¹¶õ´Ö¤È¤ß¤Ê¤¹" + +#~ msgid "-ms2600 is used without -ms." +#~ msgstr "-ms2600 ¤¬ -ms ¤Ê¤·¤Ç»È¤ï¤ì¤Þ¤·¤¿" + +#~ msgid "Only initialized variables can be placed into the 8-bit area." +#~ msgstr "8 ¥Ó¥Ã¥ÈÎΰèÆâ¤ËÇÛÃ֤Ǥ­¤ëÊÑ¿ô¤À¤±¤¬½é´ü²½¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "Generate H8/S code" +#~ msgstr "H8/S ¥³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Do not generate H8/S code" +#~ msgstr "H8/S ¥³¡¼¥É¤òÀ¸À®¤·¤Ê¤¤" + +#~ msgid "Generate H8/S2600 code" +#~ msgstr "H8/S2600 ¥³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Do not generate H8/S2600 code" +#~ msgstr "H8/S2600 ¥³¡¼¥É¤òÀ¸À®¤·¤Ê¤¤" + +#~ msgid "Make integers 32 bits wide" +#~ msgstr "À°¿ô¤ò 32 ¥Ó¥Ã¥ÈÉý¤È¤¹¤ë" + +#~ msgid "Use registers for argument passing" +#~ msgstr "°ú¿ô¤ò¥ì¥¸¥¹¥¿ÅϤ·¤Ë¤¹¤ë" + +#~ msgid "Do not use registers for argument passing" +#~ msgstr "°ú¿ô¤ò¥ì¥¸¥¹¥¿ÅϤ·¤Ë¤·¤Ê¤¤" + +#~ msgid "Consider access to byte sized memory slow" +#~ msgstr "¥Ð¥¤¥È¥µ¥¤¥ºÃ±°Ì¤Î¥á¥â¥ê¥¢¥¯¥»¥¹¤¬ÃÙ¤¤¤³¤È¤ò¹Íθ¤¹¤ë" + +#~ msgid "Enable linker relaxing" +#~ msgstr "¥ê¥ó¥«¤Î -relax ¥ª¥×¥·¥ç¥ó¤òÍ­¸ú¤Ë¤¹¤ë" + +#~ msgid "Generate H8/300H code" +#~ msgstr "H8/300H ¥³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Do not generate H8/300H code" +#~ msgstr "H8/300H ¥³¡¼¥É¤òÀ¸À®¤·¤Ê¤¤" + +#~ msgid "Use H8/300 alignment rules" +#~ msgstr "H8/300 ¥¢¥é¥¤¥ó¥á¥ó¥Èµ¬Â§¤ò»ÈÍѤ¹¤ë" + +#~ msgid "real name is too long - alias ignored" +#~ msgstr "ËÜÍè¤Î̾Á°¤¬Ä¹¤¹¤®¤Þ¤¹ - ÊÌ̾¤Ï̵»ë¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "alias name is too long - alias ignored" +#~ msgstr "ÊÌ̾¤¬Ä¹¤¹¤®¤Þ¤¹ - ÊÌ̾¤Ï̵»ë¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "junk at end of #pragma map" +#~ msgstr "#pragma map ¤Î½ª¤ê¤Ë¥´¥ß¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "malformed #pragma map, ignored" +#~ msgstr "¤ª¤«¤·¤Ê #pragma map¡¢Ìµ»ë¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "Generate char instructions" +#~ msgstr "ʸ»úÌ¿Îá¤òÀ¸À®¤¹¤ë" + +#~ msgid "Do not generate char instructions" +#~ msgstr "ʸ»úÌ¿Îá¤òÀ¸À®¤·¤Ê¤¤" + +#~ msgid "Use the Cygwin interface" +#~ msgstr "Cygwin ¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Use the Mingw32 interface" +#~ msgstr "Mingw32 ¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Create GUI application" +#~ msgstr "GUI ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤òºî¤ë" + +#~ msgid "Don't set Windows defines" +#~ msgstr "Windows ¤Î define ¤òÀßÄꤷ¤Ê¤¤" + +#~ msgid "Set Windows defines" +#~ msgstr "Windows ¤Î define ¤òÀßÄꤹ¤ë" + +#~ msgid "Create console application" +#~ msgstr "¥³¥ó¥½¡¼¥ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤òºî¤ë" + +#~ msgid "Generate code for a DLL" +#~ msgstr "DLL ÍѤΥ³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Ignore dllimport for functions" +#~ msgstr "´Ø¿ô¤Ø¤Î dllimport ¤ò̵»ë¤¹¤ë" + +#~ msgid "Use Mingw-specific thread support" +#~ msgstr "Mingw ¸ÇÍ­¤Î¥¹¥ì¥Ã¥É¥µ¥Ý¡¼¥È¤ò»ÈÍѤ¹¤ë" + +#~ msgid "-f%s ignored for target (all code is position independent)" +#~ msgstr "-f%s ¤Ï¥¿¡¼¥²¥Ã¥È¤Ç̵»ë¤µ¤ì¤Þ¤¹ (Á´¤Æ¤Î¥³¡¼¥É¤Ï°ÌÃÖÈó°Í¸¤Ç¤¹)" + +#~ msgid "Internal gcc abort from %s:%d" +#~ msgstr "gcc ÆâÉô¤ÇÃæÃÇ %s:%d" + +#~ msgid "The local variable `insn' has the value:" +#~ msgstr "¤½¤Î¥í¡¼¥«¥ëÊÑ¿ô `insn' ¤¬Ãͤò»ý¤Ã¤Æ¤¤¤Þ¤¹:" + +#~ msgid "Retain standard MXDB information" +#~ msgstr "ɸ½à MXDB ¾ðÊó¤òÊÝ»ý¤¹¤ë" + +#~ msgid "Retain legend information" +#~ msgstr "legend ¾ðÊó¤ò°Ý»ý¤¹¤ë" + +#~ msgid "Generate external legend information" +#~ msgstr "³°Éô legend ¾ðÊó¤òÀ¸À®¤¹¤ë" + +#~ msgid "Emit identifying info in .s file" +#~ msgstr ".s ¥Õ¥¡¥¤¥ëÆâ¤Ë¼±Ê̻ҾðÊó¤òÁ÷½Ð¤¹¤ë" + +#~ msgid "Warn when a function arg is a structure" +#~ msgstr "´Ø¿ô¤Î°ú¿ô¤¬¹½Â¤ÂΤÀ¤Ã¤¿¤é·Ù¹ð¤¹¤ë" + +#~ msgid "argument is a structure" +#~ msgstr "°ú¿ô¤¬¹½Â¤ÂΤǤ¹" + +#~ msgid "-mbnu210 is ignored (option is obsolete)." +#~ msgstr "-mbnu210 ¤Ï̵»ë¤µ¤ì¤Þ¤·¤¿(ÇѤ줿¥ª¥×¥·¥ç¥ó¤Ç¤¹)" + +#~ msgid "bad value (%s) for -march= switch" +#~ msgstr "-march= ¥¹¥¤¥Ã¥Á¤ËÂФ¹¤ëÉÔÀµ¤ÊÃÍ (%s)" + +#~ msgid "bad value (%s) for -mcpu= switch" +#~ msgstr "-mcpu= ¥¹¥¤¥Ã¥Á¤ËÂФ¹¤ëÉÔÀµ¤ÊÃÍ (%s)" + +#~ msgid "Register '%c' is unknown" +#~ msgstr "¥ì¥¸¥¹¥¿ '%c' ¤¬ÉÔÌÀ¤Ç¤¹" + +#~ msgid "Register '%c' already specified in allocation order" +#~ msgstr "¥ì¥¸¥¹¥¿ '%c' ¤Ï´û¤Ë³ÎÊݽç¤Ç»ØÄꤵ¤ì¤Æ¤¤¤Þ¤¹" + +#~ msgid "-mregparm=%d is not between 0 and %d" +#~ msgstr "-mregparm=%d ¤¬ 0 ¤«¤é %d ¤Î´Ö¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "-malign-loops=%d is not between 0 and %d" +#~ msgstr "-malign-loops=%d ¤¬ 0 ¤«¤é %d ¤Î´Ö¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "-malign-jumps=%d is not between 0 and %d" +#~ msgstr "-malign-jumps=%d ¤¬ 0 ¤«¤é %d ¤Î´Ö¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "-malign-functions=%d is not between 0 and %d" +#~ msgstr "-malign-functions=%d ¤¬ 0 ¤«¤é %d ¤Î´Ö¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "-mpreferred-stack-boundary=%d is not between 2 and 31" +#~ msgstr "-mpreferred-stack-boundary=%d ¤¬ 2 ¤«¤é 31 ¤Î´Ö¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "-mbranch-cost=%d is not between 0 and 5" +#~ msgstr "-mbranch-cost=%d ¤¬ 0 ¤«¤é 5 ¤Î´Ö¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "floating constant misused" +#~ msgstr "ÉâÆ°¾®¿ôÄê¿ô¤ò»È¤¤Â»¤Í¤Þ¤·¤¿" + +#~ msgid "invalid UNSPEC as operand" +#~ msgstr "¥ª¥Ú¥é¥ó¥É¤È¤·¤Æ̵¸ú¤Ê UNSPEC" + +#~ msgid "invalid expression as operand" +#~ msgstr "¥ª¥Ú¥é¥ó¥É¤È¤·¤Æ̵¸ú¤Ê¼°" + +#~ msgid "selector must be an immediate" +#~ msgstr "¥»¥ì¥¯¥¿¤Ï¨ÃͤǤʤ±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó" + +#~ msgid "mask must be an immediate" +#~ msgstr "¥Þ¥¹¥¯¤Ï¨ÃͤǤʤ±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó" + +#~ msgid "half-pic init called on systems that don't support it." +#~ msgstr "half-pic ½é´ü²½¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Ê¤¤¥·¥¹¥Æ¥à¤Ç¸Æ¤Ó½Ð¤µ¤ì¤Þ¤·¤¿¡£" + +#~ msgid "Same as -mcpu=i386" +#~ msgstr "-mcpu=i386 ¤ÈƱ¤¸" + +#~ msgid "Same as -mcpu=i486" +#~ msgstr "-mcpu=i486 ¤ÈƱ¤¸" + +#~ msgid "Same as -mcpu=pentium" +#~ msgstr "-mcpu=pentium ¤ÈƱ¤¸" + +#~ msgid "Same as -mcpu=pentiumpro" +#~ msgstr "-mcpu=pentiumpro ¤ÈƱ¤¸" + +#~ msgid "Alternate calling convention" +#~ msgstr "¸Æ¤Ó½Ð¤·µ¬Ìó¤òÆþ¤ìÂؤ¨¤ë" + +#~ msgid "Use normal calling convention" +#~ msgstr "ÉáÄ̤θƤӽФ·µ¬Ìó¤ò»È¤¦" + +#~ msgid "Align some doubles on dword boundary" +#~ msgstr "double ¤ò dword ¶­³¦¤Ë¥¢¥é¥¤¥ó¥á¥ó¥È¤¹¤ë" + +#~ msgid "Align doubles on word boundary" +#~ msgstr "double ¤ò word ¶­³¦¤Ë¥¢¥é¥¤¥ó¥á¥ó¥È¤¹¤ë" + +#~ msgid "Uninitialized locals in .bss" +#~ msgstr ".bss ¤Ë¤¢¤ë¥í¡¼¥«¥ë¤Ê¤â¤Î¤Ï½é´ü²½¤µ¤ì¤Ê¤¤" + +#~ msgid "Uninitialized locals in .data" +#~ msgstr ".data ¤Ë¤¢¤ë¥í¡¼¥«¥ë¤Ê¤â¤Î¤Ï½é´ü²½¤µ¤ì¤Ê¤¤" + +#~ msgid "Use IEEE math for fp comparisons" +#~ msgstr "ÉâÆ°¾®¿ôÅÀÈæ³Ó¤Ë IEEE µ¬³Ê¤ò»È¤¦" + +#~ msgid "Do not use IEEE math for fp comparisons" +#~ msgstr "ÉâÆ°¾®¿ôÅÀÈæ³Ó¤Ë IEEE µ¬³Ê¤ò»È¤ï¤Ê¤¤" + +#~ msgid "Return values of functions in FPU registers" +#~ msgstr "FPU ¥ì¥¸¥¹¥¿Æâ¤Îµ¡Ç½¤ÎÃͤòÊÖ¤¹" + +#~ msgid "Do not return values of functions in FPU registers" +#~ msgstr "FPU ¥ì¥¸¥¹¥¿Æâ¤Îµ¡Ç½¤ÎÃͤòÊÖ¤µ¤Ê¤¤" + +#~ msgid "Do not generate sin, cos, sqrt for FPU" +#~ msgstr "FPU ÍѤΠsin, cos, sqrt ¤òÀ¸À®¤·¤Ê¤¤" + +#~ msgid "Generate sin, cos, sqrt for FPU" +#~ msgstr "FPU ÍѤΠsin, cos, sqrt ¤òÀ¸À®¤¹¤ë" + +#~ msgid "Omit the frame pointer in leaf functions" +#~ msgstr "Ëöü¤Î´Ø¿ô¤Ç¤Ï¥Õ¥ì¡¼¥à¥Ý¥¤¥ó¥¿¤ò¾Êά¤¹¤ë" + +#~ msgid "Enable stack probing" +#~ msgstr "¥¹¥¿¥Ã¥¯Ãµº÷¤òÍ­¸ú¤Ë¤¹¤ë" + +#~ msgid "Emit Intel syntax assembler opcodes" +#~ msgstr "Intel ¥·¥ó¥¿¥Ã¥¯¥¹¤Î¥¢¥»¥ó¥Ö¥éÌ¿Îá¤òÅǤ­½Ð¤¹" + +#~ msgid "Align destination of the string operations" +#~ msgstr "ʸ»úÎóÁàºî¤Î½ñ¹þ¤ßÀè¤ò¥¢¥é¥¤¥ó¥á¥ó¥È¤¹¤ë" + +#~ msgid "Do not align destination of the string operations" +#~ msgstr "ʸ»úÎóÁàºî¤Î½ñ¹þ¤ßÀè¤ò¥¢¥é¥¤¥ó¥á¥ó¥È¤·¤Ê¤¤" + +#~ msgid "Inline all known string operations" +#~ msgstr "´ûÃΤÎÁ´¤Æ¤Îʸ»úÎóÁàºî¤ò inline ¤Ë¤¹¤ë" + +#~ msgid "Do not inline all known string operations" +#~ msgstr "´ûÃΤÎÁ´¤Æ¤Îʸ»úÎóÁàºî¤ò inline ¤Ë¤·¤Ê¤¤" + +#~ msgid "Use push instructions to save outgoing arguments" +#~ msgstr "½ÐÎϤ¹¤ë°ú¿ô¤ò¥»¡¼¥Ö¤¹¤ë¤¿¤á push Ì¿Îá¤ò»È¤¦" + +#~ msgid "Do not use push instructions to save outgoing arguments" +#~ msgstr "½ÐÎϤ¹¤ë°ú¿ô¤ò¥»¡¼¥Ö¤¹¤ë¤¿¤á¤Ë¤Ï push Ì¿Îá¤ò»È¤ï¤Ê¤¤" + +#~ msgid "sizeof(long double) is 16." +#~ msgstr "sizeof(long double) ¤Ï 16 ¤È¤¹¤ë¡£" + +#~ msgid "sizeof(long double) is 12." +#~ msgstr "sizeof(long double) ¤Ï 12 ¤È¤¹¤ë¡£" + +#~ msgid "Schedule code for given CPU" +#~ msgstr "½êÍ¿¤Î CPU ÍѤΥ³¡¼¥É¤ò¥¹¥±¥¸¥å¡¼¥ë¤¹¤ë" + +#~ msgid "Generate code for given CPU" +#~ msgstr "½êÍ¿¤Î CPU ÍѤΥ³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Control allocation order of integer registers" +#~ msgstr "À°¿ô¥ì¥¸¥¹¥¿¤Î³ÎÊݽç¤òÀ©¸æ¤¹¤ë" + +#~ msgid "Number of registers used to pass integer arguments" +#~ msgstr "¥ì¥¸¥¹¥¿¤Î¿ô¤¬À°¿ô¤ò°ú¿ô¤òÅϤ¹¤¿¤á¤Ë»È¤ï¤ì¤ë" + +#~ msgid "Loop code aligned to this power of 2" +#~ msgstr "¥ë¡¼¥×¥³¡¼¥É¤ò¤³¤ÎÃͤÎÆó¾è¤Ë¥¢¥é¥¤¥ó¥á¥ó¥È¤¹¤ë" + +#~ msgid "Jump targets are aligned to this power of 2" +#~ msgstr "¥¸¥ã¥ó¥×Àè¤ò¤³¤ÎÃͤÎÆó¾è¤Ë¥¢¥é¥¤¥ó¥á¥ó¥È¤¹¤ë" + +#~ msgid "Function starts are aligned to this power of 2" +#~ msgstr "´Ø¿ô¤Î³«»Ï°ÌÃÖ¤ò¤³¤ÎÃͤÎÆó¾è¤Ë¥¢¥é¥¤¥ó¥á¥ó¥È¤¹¤ë" + +#~ msgid "Attempt to keep stack aligned to this power of 2" +#~ msgstr "¤Ç¤­¤ë¤À¤±¥¹¥¿¥Ã¥¯¤ò¤³¤ÎÃͤÎÆó¾è¤Ë¥¢¥é¥¤¥ó¥á¥ó¥È¤¹¤ë" + +#~ msgid "Branches are this expensive (1-5, arbitrary units)" +#~ msgstr "¥Ö¥é¥ó¥Á¤Î¥³¥¹¥È¤ò»Ø¼¨¤¹¤ë (1-5, Ǥ°Õ¤Î¸Ä¿ô)" + +#~ msgid "Profiling uses mcount" +#~ msgstr "¥×¥í¥Õ¥¡¥¤¥ë¤Ç mcount ¤òÍøÍѤ¹¤ë" + +#~ msgid "Emit half-PIC code" +#~ msgstr "Ⱦ PIC ¥³¡¼¥É¤òÁ÷½Ð¤¹¤ë" + +#~ msgid "Emit ELF object code" +#~ msgstr "ELF ¥ª¥Ö¥¸¥§¥¯¥È¥³¡¼¥É¤òÁ÷½Ð¤¹¤ë" + +#~ msgid "Emit ROSE object code" +#~ msgstr "ROSE ¥ª¥Ö¥¸¥§¥¯¥È¥³¡¼¥É¤òÁ÷½Ð¤¹¤ë" + +#~ msgid "Symbols have a leading underscore" +#~ msgstr "¥·¥ó¥Ü¥ë¤ÎƬ¤Ë¥¢¥ó¥À¡¼¥¹¥³¥¢¤ò¤Ä¤±¤ë" + +#~ msgid "Align to >word boundaries" +#~ msgstr "¥ï¡¼¥É¶­³¦¤è¤êÂ礭¤á¤Ë¥¢¥é¥¤¥ó¤¹¤ë" + +#~ msgid "Use mcount for profiling" +#~ msgstr "¥×¥í¥Õ¥¡¥¤¥ëÍÑ¤Ë mcount ¤òÍøÍѤ¹¤ë" + +#~ msgid "Use mcount_ptr for profiling" +#~ msgstr "¥×¥í¥Õ¥¡¥¤¥ë¤Î¤¿¤á¤Ë mcount_ptr ¤òÍøÍѤ¹¤ë" + +#~ msgid "Generate ELF output" +#~ msgstr "ELF ½ÐÎϤòÀ¸À®¤¹¤ë" + +#~ msgid "Use Mingw32 interface" +#~ msgstr "Mingw32 ¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Use Cygwin interface" +#~ msgstr "Cygwin ¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Use bare Windows interface" +#~ msgstr "ÁǤΠWindows ¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹¤ò»ÈÍѤ¹¤ë" + +#~ msgid "`%s' declared as both exported to and imported from a DLL." +#~ msgstr "`%s' ¤¬ DLL ¤«¤é import¡¢DLL ¤Ë export ¤ÎξÊý¤È¤·¤ÆÀë¸À¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "Environment variable DJGPP not defined." +#~ msgstr "´Ä¶­ÊÑ¿ô DJGPP ¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "Environment variable DJGPP points to missing file '%s'." +#~ msgstr "´Ä¶­ÊÑ¿ô DJGPP ¤¬¡¢¸«¤Ä¤«¤é¤Ê¤¤¥Õ¥¡¥¤¥ë '%s' ¤ò¼¨¤·¤Æ¤¤¤Þ¤¹¡£" + +#~ msgid "Environment variable DJGPP points to corrupt file '%s'." +#~ msgstr "´Ä¶­ÊÑ¿ô DJGPP ¤¬¡¢²õ¤ì¤¿¥Õ¥¡¥¤¥ë '%s' ¤ò¼¨¤·¤Æ¤¤¤Þ¤¹¡£" + +#~ msgid "Generate code which uses the FPU" +#~ msgstr "ÉâÆ°¾®¿ôÅÀ¥æ¥Ë¥Ã¥È¤òÍøÍѤ¹¤ë¥³¡¼¥É¤òÀ¸À®¤·¤Ê¤¤" + +#~ msgid "Do not generate code which uses the FPU" +#~ msgstr "ÉâÆ°¾®¿ôÅÀ¥æ¥Ë¥Ã¥È¤òÍøÍѤ¹¤ë¥³¡¼¥É¤òÀ¸À®¤·¤Ê¤¤" + +#~ msgid "sorry, not implemented: #pragma align NAME=SIZE" +#~ msgstr "»ÄÇ°¡¢¼ÂÁõ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó: #pragma align NAME=SIZE" + +#~ msgid "malformed #pragma align - ignored" +#~ msgstr "¤ª¤«¤·¤Ê #pragma align - ̵»ë¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "sorry, not implemented: #pragma noalign NAME" +#~ msgstr "»ÄÇ°¡¢¼ÂÁõ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó: #pragma noalign NAME" + +#~ msgid "stack limit expression is not supported" +#~ msgstr "¥¹¥¿¥Ã¥¯À©¸Â¼°¤ò¼õ¤±ÉÕ¤±¤Þ¤»¤ó" + +#~ msgid "Generate SA code" +#~ msgstr "SA ¥³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Generate SB code" +#~ msgstr "SB ¥³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Generate KA code" +#~ msgstr "KA ¥³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Generate KB code" +#~ msgstr "KB ¥³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Generate JA code" +#~ msgstr "JA ¥³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Generate JD code" +#~ msgstr "JD ¥³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Generate JF code" +#~ msgstr "JF ¥³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "generate RP code" +#~ msgstr "RP ¥³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Generate MC code" +#~ msgstr "MC ¥³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Generate CA code" +#~ msgstr "CA ¥³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Generate CF code" +#~ msgstr "CF ¥³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Use alternate leaf function entries" +#~ msgstr "´Ø¿ô¹àÌܤÎÂå¤ï¤ê¤òÍøÍѤ¹¤ë" + +#~ msgid "Do not use alternate leaf function entries" +#~ msgstr "´Ø¿ô¹àÌÜËöÈø¤ÎÂå¤ï¤ê¤ÏÍøÍѤ·¤Ê¤¤" + +#~ msgid "Perform tail call optimization" +#~ msgstr "ËöÈø¸Æ¤Ó½Ð¤·ºÇŬ²½¤ò¹Ô¤¦" + +#~ msgid "Do not perform tail call optimization" +#~ msgstr "ËöÈø¸Æ¤Ó½Ð¤·ºÇŬ²½¤ò¹Ô¤ï¤Ê¤¤" + +#~ msgid "Use complex addressing modes" +#~ msgstr "Ê£»¨¤Ê¥¢¥É¥ì¥·¥ó¥°¥â¡¼¥É¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Do not use complex addressing modes" +#~ msgstr "Ê£»¨¤Ê¥¢¥É¥ì¥·¥ó¥°¥â¡¼¥É¤òÍøÍѤ·¤Ê¤¤" + +#~ msgid "Align code to 8 byte boundary" +#~ msgstr "¥³¡¼¥É¤ò 8 ¥Ð¥¤¥È¶­³¦¤Ë¥¢¥é¥¤¥ó¤¹¤ë" + +#~ msgid "Do not align code to 8 byte boundary" +#~ msgstr "¥³¡¼¥É¤ò 8 bit ¥³¡¼¥É¤Ë¥¢¥é¥¤¥ó¤·¤Ê¤¤" + +#~ msgid "Enable compatibility with iC960 v2.0" +#~ msgstr "iC960 v2.0 ¤È¤Î¸ß´¹À­¤òÍ­¸ú¤Ë¤¹¤ë" + +#~ msgid "Enable compatibility with iC960 v3.0" +#~ msgstr "iC960 v3.0 ¤È¤Î¸ß´¹À­¤òÍ­¸ú¤Ë¤¹¤ë" + +#~ msgid "Enable compatibility with ic960 assembler" +#~ msgstr "ic960 ¥¢¥»¥ó¥Ö¥é¤È¤Î¸ß´¹À­¤òÍ­¸ú¤Ë¤¹¤ë" + +#~ msgid "Do not permit unaligned accesses" +#~ msgstr "¥¢¥é¥¤¥ó¤µ¤ì¤Ê¤¤¥¢¥¯¥»¥¹¤òµö²Ä¤·¤Ê¤¤" + +#~ msgid "Permit unaligned accesses" +#~ msgstr "¥¢¥é¥¤¥ó¤µ¤ì¤Ê¤¤¥¢¥¯¥»¥¹¤òµö²Ä¤¹¤ë" + +#~ msgid "Layout types like Intel's v1.3 gcc" +#~ msgstr "Intel ¤Î v1.3 gcc ¤ÎÍͤʥ¿¥¤¥×¤ËÇÛÃÖ¤¹¤ë" + +#~ msgid "Do not layout types like Intel's v1.3 gcc" +#~ msgstr "Intel v1.3 gcc ¤ÎÍͤʥ¿¥¤¥×¤ÎÇÛÃÖ¤ò¹Ô¤Ê¤ï¤Ê¤¤" + +#~ msgid "Use 64 bit long doubles" +#~ msgstr "64 ¥Ó¥Ã¥È long double ¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Enable linker relaxation" +#~ msgstr "¥ê¥ó¥«¤Î´ËϤòÍ­¸ú¤Ë¤¹¤ë" + +#~ msgid "Do not enable linker relaxation" +#~ msgstr "¥ê¥ó¥«¤Î´ËϤòÍ­¸ú¤Ë¤·¤Ê¤¤" + +#~ msgid "conflicting architectures defined - using C series" +#~ msgstr "¶¥¹ç¤¹¤ë architecture ¤¬ÄêµÁ¤µ¤ì¤Þ¤·¤¿ - C ¥·¥ê¡¼¥º»ÈÍÑ" + +#~ msgid "conflicting architectures defined - using K series" +#~ msgstr "¶¥¹ç¤¹¤ë architecture ¤¬ÄêµÁ¤µ¤ì¤Þ¤·¤¿ - K ¥·¥ê¡¼¥º»ÈÍÑ<" + +#~ msgid "iC2.0 and iC3.0 are incompatible - using iC3.0" +#~ msgstr "iC2.0 ¤È iC3.0 ¤È¤Ï¸ß´¹À­¤¬¤¢¤ê¤Þ¤»¤ó - iC3.0 ¤ò»ÈÍѤ·¤Þ¤¹" + +#~ msgid "The -mlong-double-64 option does not work yet." +#~ msgstr "-mlong-double-64 ¥ª¥×¥·¥ç¥ó¤Ï¤Þ¤ÀÆ°ºî¤·¤Þ¤»¤ó" + +#~ msgid "ia64_print_operand: unknown code" +#~ msgstr "ia64_print_operand: ÉÔÌÀ¤Ê¥³¡¼¥É¤Ç¤¹" + +#~ msgid "value of -mfixed-range must have form REG1-REG2" +#~ msgstr "-mfixed-range ¤ÎÃÍ¤Ï REG1-REG2 ·Á¼°¤ò»ý¤¿¤Í¤Ð¤Ê¤ê¤Þ¤»¤ó" + +#~ msgid "unknown register name: %s" +#~ msgstr "ÉÔÌÀ¤Ê¥ì¥¸¥¹¥¿Ì¾¤Ç¤¹: %s" + +#~ msgid "%s-%s is an empty range" +#~ msgstr "%s-%s ¤¬¶õ¤ÎÈϰϤǤ¹" + +#~ msgid "cannot optimize division for both latency and throughput" +#~ msgstr "¥ì¥¤¥Æ¥ó¥·¤È¥¹¥ë¡¼¥×¥Ã¥ÈξÊý¤Îʬ³äºÇŬ²½¤Ï¹Ô¤Ê¤¨¤Þ¤»¤ó" + +#~ msgid "Generate big endian code" +#~ msgstr "¥Ó¥Ã¥°¥¨¥ó¥Ç¥£¥¢¥ó¤Î¥³¡¼¥É¤òÀ¸À®" + +#~ msgid "Generate little endian code" +#~ msgstr "¥ê¥È¥ë¥¨¥ó¥Ç¥£¥¢¥ó¤Î¥³¡¼¥É¤òÀ¸À®" + +#~ msgid "Generate code for GNU as" +#~ msgstr "GNU as ÍѤΥ³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Generate code for Intel as" +#~ msgstr "Intel as ÍѤΥ³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Generate code for GNU ld" +#~ msgstr "GNU ld ÍѤΥ³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Generate code for Intel ld" +#~ msgstr "Intel ld ÍѤΥ³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Generate code without GP reg" +#~ msgstr "GP ¥ì¥¸¥¹¥¿ÉÔ»ÈÍѤΥ³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Emit stop bits before and after volatile extended asms" +#~ msgstr "³ÈÄ¥¥¢¥»¥ó¥Ö¥ê volatile ¤ÎÁ°¸å¤Ë stop ¥Ó¥Ã¥È¤òÁ÷½Ð¤¹¤ë" + +#~ msgid "Don't emit stop bits before and after volatile extended asms" +#~ msgstr "³ÈÄ¥¥¢¥»¥ó¥Ö¥ê volatile ¤ÎÁ°¸å¤Ë stop ¥Ó¥Ã¥È¤òÁ÷½Ð¤¹¤ë" + +#~ msgid "Emit code for Itanium (TM) processor B step" +#~ msgstr "Itanium (TM) ¥×¥í¥»¥Ã¥µ B step ÍÑ¥³¡¼¥É¤òÁ÷½Ð¤¹¤ë" + +#~ msgid "Use in/loc/out register names" +#~ msgstr "in/loc/out ¥ì¥¸¥¹¥¿Ì¾¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Disable use of sdata/scommon/sbss" +#~ msgstr "sdata/scommon/sbss ¤Î»ÈÍѤò̵¸ú¤Ë¤¹¤ë" + +#~ msgid "Enable use of sdata/scommon/sbss" +#~ msgstr "sdata/scommon/sbss ¤Î»ÈÍѤòÍ­¸ú¤Ë¤¹¤ë" + +#~ msgid "gp is constant (but save/restore gp on indirect calls)" +#~ msgstr "gp ¤òÄê¿ô¤È¤¹¤ë¡Êâ¡¢´ÖÀܸƤӽФ·¤Ç¤Ï gp ¤ò save/restore ¤¹¤ë¡Ë" + +#~ msgid "Generate self-relocatable code" +#~ msgstr "¼«¸ÊºÆÇÛÃÖ²Äǽ¥³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Generate inline division, optimize for latency" +#~ msgstr "¥ì¥¤¥Æ¥ó¥·¤òºÇŬ²½¤¹¤ë¥¤¥ó¥é¥¤¥ó¶èʬ¤òÀ¸À®¤¹¤ë" + +#~ msgid "Generate inline division, optimize for throughput" +#~ msgstr "¥¹¥ë¡¼¥×¥Ã¥È¤òºÇŬ²½¤¹¤ë¥¤¥ó¥é¥¤¥ó¶èʬ¤òÀ¸À®¤¹¤ë" + +#~ msgid "Enable Dwarf 2 line debug info via GNU as" +#~ msgstr "GNU as ¤òÄ̤¸¤¿ Dwarf2 ¤Î¹Ô¥Ç¥Ð¥Ã¥°¤òÍ­¸ú¤Ë¤¹¤ë" + +#~ msgid "Disable Dwarf 2 line debug info via GNU as" +#~ msgstr "GNU as ¤òÄ̤¸¤¿ Dwarf2 ¤Î¹Ô¥Ç¥Ð¥Ã¥°¤ò̵¸ú¤Ë¤¹¤ë" + +#~ msgid "Specify range of registers to make fixed." +#~ msgstr "¸ÇÄꤹ¤ë¤¿¤á¤Î¥ì¥¸¥¹¥¿¤ÎÈϰϤò»ØÄꤹ¤ë" + +#~ msgid "-msystem-v and -p are incompatible" +#~ msgstr "-msystem-v ¤È -p ¤Ï¸ß´¹À­¤¬¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "-msystem-v and -mthreads are incompatible" +#~ msgstr "-msystem-v ¤È -mthreads ¤Ï¸ß´¹À­¤¬¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "bad value (%s) for -mmodel switch" +#~ msgstr "-mmodel ¥¹¥¤¥Ã¥Á¤ËÂФ¹¤ëÉÔÀµ¤ÊÃÍ (%s)" + +#~ msgid "bad value (%s) for -msdata switch" +#~ msgstr "-msdata ¥¹¥¤¥Ã¥Á¤ËÂФ¹¤ëÉÔÀµ¤ÊÃÍ (%s)" + +#~ msgid "const objects cannot go in .sdata/.sbss" +#~ msgstr "const ¥ª¥Ö¥¸¥§¥¯¥È¤Ï .sdata/.sbss ¤ËÃÖ¤±¤Þ¤»¤ó" + +#~ msgid "invalid operand to %s code" +#~ msgstr "%s ¥³¡¼¥É¤ËÂФ¹¤ë̵¸ú¤Ê¥ª¥Ú¥é¥ó¥É" + +#~ msgid "invalid operand to %p code" +#~ msgstr "%p ¥³¡¼¥É¤ËÂФ¹¤ë̵¸ú¤Ê¥ª¥Ú¥é¥ó¥É" + +#~ msgid "invalid operand to %T/%B code" +#~ msgstr "%T/%B ¥³¡¼¥É¤ËÂФ¹¤ë̵¸ú¤Ê¥ª¥Ú¥é¥ó¥É" + +#~ msgid "invalid operand to %N code" +#~ msgstr "%N ¥³¡¼¥É¤ËÂФ¹¤ë̵¸ú¤Ê¥ª¥Ú¥é¥ó¥É" + +#~ msgid "Display compile time statistics" +#~ msgstr "¥³¥ó¥Ñ¥¤¥ë»þ´ÖÅý·×Ãͤòɽ¼¨¤¹¤ë" + +#~ msgid "Align all loops to 32 byte boundary" +#~ msgstr "Á´¤Æ¤Î¥ë¡¼¥×¤ò 32 ¥Ð¥¤¥È¶­³¦¤Ë¥¢¥é¥¤¥ó¤¹¤ë" + +#~ msgid "Only issue one instruction per cycle" +#~ msgstr "¥µ¥¤¥¯¥ëËè¤Ë°ì¤Ä¤ÎÌ¿Îá¤À¤±¤òȯ¹Ô¤¹¤ë" + +#~ msgid "Prefer branches over conditional execution" +#~ msgstr "¾ò·ï¤Î¼Â¹Ô¤è¤ê¤Ïʬ´ô¤ÎÀ¸À®¤òÍ¥À褹¤ë" + +#~ msgid "Code size: small, medium or large" +#~ msgstr "¥³¡¼¥É¥µ¥¤¥º: small, medium Ëô¤Ï large" + +#~ msgid "Small data area: none, sdata, use" +#~ msgstr "¥¹¥â¡¼¥ë¥Ç¡¼¥¿Îΰè: none, sdata, use" + +#~ msgid "-f%s ignored for 68HC11/68HC12 (not supported)" +#~ msgstr "-f%s ¤Ï 68HC11/68HC12 ÍѤȤ·¤Æ¤Ï̵»ë¤µ¤ì¤Þ¤·¤¿ (¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤»¤ó)" + +#~ msgid "Compile with 16-bit integer mode" +#~ msgstr "16 ¥Ó¥Ã¥ÈÀ°¿ô¥â¡¼¥É¤Ç¥³¥ó¥Ñ¥¤¥ë¤¹¤ë" + +#~ msgid "Compile with 32-bit integer mode" +#~ msgstr "32 ¥Ó¥Ã¥ÈÀ°¿ô¥â¡¼¥É¤Ç¥³¥ó¥Ñ¥¤¥ë¤¹¤ë" + +#~ msgid "Auto pre/post decrement increment allowed" +#~ msgstr "¼«Æ° pre/post ¥Ç¥¯¥ê¥á¥ó¥È ¥¤¥ó¥¯¥ê¥á¥ó¥È¤òµöÍƤ¹¤ë" + +#~ msgid "Auto pre/post decrement increment not allowed" +#~ msgstr "¼«Æ° pre/post ¥Ç¥¯¥ê¥á¥ó¥È ¥¤¥ó¥¯¥ê¥á¥ó¥È¤òµöÍƤ·¤Ê¤¤" + +#~ msgid "Compile for a 68HC11" +#~ msgstr "68HC11 ÍѤ˥³¥ó¥Ñ¥¤¥ë¤¹¤ë" + +#~ msgid "Compile for a 68HC12" +#~ msgstr "68HC12 ÍѤ˥³¥ó¥Ñ¥¤¥ë¤¹¤ë" + +#~ msgid "Specify the register allocation order" +#~ msgstr "¥ì¥¸¥¹¥¿³ÎÊݽç¤ò»ØÄꤹ¤ë" + +#~ msgid "Indicate the number of soft registers available" +#~ msgstr "ÍøÍѲÄǽ¥½¥Õ¥È¥ì¥¸¥¹¥¿¤Î¿ô¤ò¼¨¤¹" + +#~ msgid "-malign-loops=%d is not between 1 and %d" +#~ msgstr "-malign-loops=%d ¤¬ 1 ¤«¤é %d ¤Î´Ö¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "-malign-jumps=%d is not between 1 and %d" +#~ msgstr "-malign-jumps=%d ¤¬ 1 ¤«¤é %d ¤Î´Ö¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "-malign-functions=%d is not between 1 and %d" +#~ msgstr "-malign-functions=%d ¤¬ 1 ¤«¤é %d ¤Î´Ö¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "-fPIC is not currently supported on the 68000 or 68010\n" +#~ msgstr "º£¤Î¤È¤³¤í 68000 ¤ä 68010 ¤Ç¤Ï -fPIC ¤¬¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó\n" + +#~ msgid "Internal gcc monitor: short-branch(%x)" +#~ msgstr "ÆâÉô gcc ¥â¥Ë¥¿: ¥·¥ç¡¼¥È¥Ö¥é¥ó¥Á(%x)" + +#~ msgid "Internal gcc error: Can't express symbolic location" +#~ msgstr "ÆâÉô gcc ¥¨¥é¡¼: °ÌÃÖ¤ò¥·¥ó¥Ü¥ëɽ¸½¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "argument #%d is a structure" +#~ msgstr "°ú¿ô #%d ¤Ï¹½Â¤ÂΤǤ¹" + +#~ msgid "%R not followed by %B/C/D/E" +#~ msgstr "%R ¤Î¸å¤Ë %B/C/D/E ¤ÏÃÖ¤±¤Þ¤»¤ó" + +#~ msgid "invalid %x/X value" +#~ msgstr "̵¸ú¤Ê %x/X ÃͤǤ¹" + +#~ msgid "invalid %H value" +#~ msgstr "̵¸ú¤Ê %H ÃͤǤ¹" + +#~ msgid "invalid %h value" +#~ msgstr "̵¸ú¤Ê %h ÃͤǤ¹" + +#~ msgid "invalid %Q value" +#~ msgstr "̵¸ú¤Ê %Q ÃͤǤ¹" + +#~ msgid "invalid %q value" +#~ msgstr "̵¸ú¤Ê %q ÃͤǤ¹" + +#~ msgid "invalid %o value" +#~ msgstr "̵¸ú¤Ê %o ÃͤǤ¹" + +#~ msgid "invalid %p value" +#~ msgstr "̵¸ú¤Ê %p ÃͤǤ¹" + +#~ msgid "invalid %s/S value" +#~ msgstr "̵¸ú¤Ê %s/S ÃͤǤ¹" + +#~ msgid "invalid %P operand" +#~ msgstr "̵¸ú¤Ê %P ¥ª¥Ú¥é¥ó¥É¤Ç¤¹" + +#~ msgid "invalid %B value" +#~ msgstr "̵¸ú¤Ê %B ÃͤǤ¹" + +#~ msgid "invalid %C value" +#~ msgstr "̵¸ú¤Ê %C ÃͤǤ¹" + +#~ msgid "invalid %D value" +#~ msgstr "̵¸ú¤Ê %D ÃͤǤ¹" + +#~ msgid "invalid %E value" +#~ msgstr "̵¸ú¤Ê %E ÃͤǤ¹" + +#~ msgid "`%d' operand isn't a register" +#~ msgstr "`%d' ¥ª¥Ú¥é¥ó¥É¤¬¥ì¥¸¥¹¥¿¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "invalid %r value" +#~ msgstr "̵¸ú¤Ê %r ÃͤǤ¹" + +#~ msgid "operand is r0" +#~ msgstr "¥ª¥Ú¥é¥ó¥É¤Ï r0 ¤Ç¤¹" + +#~ msgid "operand is const_double" +#~ msgstr "¥ª¥Ú¥é¥ó¥É¤Ï const_double ¤Ç¤¹" + +#~ msgid "invalid code" +#~ msgstr "̵¸ú¤Ê¥³¡¼¥É¤Ç¤¹" + +#~ msgid "-mtrap-large-shift and -mhandle-large-shift are incompatible" +#~ msgstr "-mtrap-large-shift ¤È -mhandle-large-shift ¤Ï¶¦Â¸¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "Invalid option `-mshort-data-%s'" +#~ msgstr "̵¸ú¤Ê¥ª¥×¥·¥ç¥ó `-mshort-data-%s'" + +#~ msgid "-mshort-data-%s is too large " +#~ msgstr "-mshort-data-%s ¤¬Â礭¤¹¤®¤Þ¤¹¡£" + +#~ msgid "-mshort-data-%s and PIC are incompatible" +#~ msgstr "-mshort-data-%s ¤È PIC ¤Ï¶¦Â¸¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "Invalid option `-mstack-increment=%s'" +#~ msgstr "`-mstack-increment=%s' ¤Ï̵¸ú¤Ê¥ª¥×¥·¥ç¥ó¤Ç¤¹" + +#~ msgid "Inline constants if it can be done in 2 insns or less" +#~ msgstr "2 Ì¿Îá°Ê²¼¤Ç¹Ô¤Ê¤¨¤ëÉÔÊѽèÍý¤ò¥¤¥ó¥é¥¤¥ó¤Ë¤¹¤ë" + +#~ msgid "inline constants if it only takes 1 instruction" +#~ msgstr "1 Ì¿Îá¤À¤±¤ò¤È¤ëÉÔÊѽèÍý¤ò¥¤¥ó¥é¥¤¥ó¤Ë¤¹¤ë" + +#~ msgid "Set maximum alignment to 4" +#~ msgstr "ºÇÂ祢¥é¥¤¥ó¥á¥ó¥È¤ò 4 ¤ËÀßÄꤹ¤ë" + +#~ msgid "Set maximum alignment to 8" +#~ msgstr "ºÇÂ祢¥é¥¤¥ó¥á¥ó¥È¤ò 8 ¤ËÀßÄꤹ¤ë" + +#~ msgid "Do not use the divide instruction" +#~ msgstr "ʬ³äÌ¿Îá¤ò»ÈÍѤ·¤Ê¤¤" + +#~ msgid "Do not arbitary sized immediates in bit operations" +#~ msgstr "¥Ó¥Ã¥È±é»»¤Ç¤Î¨ÃÍ¥µ¥¤¥º¤òÄ´Ä䤷¤Ê¤¤" + +#~ msgid "Always treat bitfield as int-sized" +#~ msgstr "¥Ó¥Ã¥È¥Õ¥£¡¼¥ë¥É¤ò¾ï¤Ë int ¤Î¥µ¥¤¥º¤È¤·¤Æ°·¤¦" + +#~ msgid "Force functions to be aligned to a 4 byte boundary" +#~ msgstr "´Ø¿ô¤ò¶¯À©Åª¤Ë 4 ¥Ð¥¤¥È¶­³¦¤Ë¥¢¥é¥¤¥ó¤¹¤ë" + +#~ msgid "Force functions to be aligned to a 2 byte boundary" +#~ msgstr "´Ø¿ô¤ò¶¯À©Åª¤Ë 2 ¥Ð¥¤¥È¶­³¦¤Ë¥¢¥é¥¤¥ó¤¹¤ë" + +#~ msgid "Emit call graph information" +#~ msgstr "¸Æ¤Ó½Ð¤·¥°¥é¥Õ¾ðÊó¤òÁ÷½Ð¤¹¤ë" + +#~ msgid "Prefer word accesses over byte accesses" +#~ msgstr "¥Ð¥¤¥È¥¢¥¯¥»¥¹¤è¤ê¥ï¡¼¥É¥¢¥¯¥»¥¹¤òÁª¤Ö" + +#~ msgid "Generate code for the M*Core M340" +#~ msgstr "M*Core M340 ÍѤΥ³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Maximum amount for a single stack increment operation" +#~ msgstr "ñ°ì¥¹¥¿¥Ã¥¯¥¤¥ó¥¯¥ê¥á¥ó¥ÈÁàºî¤ÎºÇÂçÃÍ" + +#~ msgid "-mips%d not supported" +#~ msgstr "-mips%d ¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤»¤ó" + +#~ msgid "bad value (%s) for -mips switch" +#~ msgstr "-mips ¥¹¥¤¥Ã¥Á¤ËÂФ¹¤ëÉÔÀµ¤ÊÃÍ (%s)" + +#~ msgid "bad value (%s) for -mabi= switch" +#~ msgstr "-mabi= ¥¹¥¤¥Ã¥Á¤ËÂФ¹¤ëÉÔÀµ¤ÊÃÍ (%s)" + +#~ msgid "-mabi=%s does not support -mips%d" +#~ msgstr "-mabi=%s ¤Ï -mips%d ¤ò¥µ¥Ý¡¼¥È¤·¤Þ¤»¤ó" + +#~ msgid "The -mabi=32 support does not work yet." +#~ msgstr "-mabi=32 ¥µ¥Ý¡¼¥È¤Ï¤Þ¤ÀÆ°ºî¤·¤Þ¤»¤ó" + +#~ msgid "This target does not support the -mabi switch." +#~ msgstr "¤³¤Î¥¿¡¼¥²¥Ã¥È¤Ï -mabi ¥¹¥¤¥Ã¥Á¤ò¥µ¥Ý¡¼¥È¤·¤Þ¤»¤ó" + +#~ msgid "-mcpu=%s does not support -mips%d" +#~ msgstr "-mcpu=%s ¤Ï -mips%d ¤ò¥µ¥Ý¡¼¥È¤·¤Þ¤»¤ó" + +#~ msgid "-mips%d does not support 64 bit fp registers" +#~ msgstr "-mips%d ¤Ï 64 bit fp ¥ì¥¸¥¹¥¿¤ò¥µ¥Ý¡¼¥È¤·¤Þ¤»¤ó" + +#~ msgid "-mips%d does not support 64 bit gp registers" +#~ msgstr "-mips%d ¤Ï 64 bit gp ¥ì¥¸¥¹¥¿¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "-G is incompatible with PIC code which is the default" +#~ msgstr "-G ¤Ï¥Ç¥Õ¥©¥ë¥È¤Î PIC ¥³¡¼¥É¤È¶¦Â¸¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "-membedded-pic and -mabicalls are incompatible" +#~ msgstr "-membedded-pic ¤È -mabicalls ¤Ï¶¦Â¸¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "-G and -membedded-pic are incompatible" +#~ msgstr "-G ¤È -membedded-pic ¤Ï¶¦Â¸¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "Invalid option `entry%s'" +#~ msgstr "̵¸ú¤Ê¥ª¥×¥·¥ç¥ó `entry%s'" + +#~ msgid "-mentry is only meaningful with -mips-16" +#~ msgstr "-mentry ¤Ï -mips-16 ¤ò»ØÄꤷ¤¿¤È¤­¤À¤±°ÕÌ£¤ò»ý¤Á¤Þ¤¹" + +#~ msgid "internal error: %%) found without a %%( in assembler pattern" +#~ msgstr "ÆâÉô¥¨¥é¡¼: ¥¢¥»¥ó¥Ö¥é¥Ñ¥¿¡¼¥ó¤Ç %%( ¤Ê¤·¤Î %%) ¤¬¸«¤Ä¤«¤ê¤Þ¤·¤¿" + +#~ msgid "internal error: %%] found without a %%[ in assembler pattern" +#~ msgstr "ÆâÉô¥¨¥é¡¼: ¥¢¥»¥ó¥Ö¥é¥Ñ¥¿¡¼¥ó¤Ç %%[ ¤Ê¤·¤Î %%] ¤¬¸«¤Ä¤«¤ê¤Þ¤·¤¿" + +#~ msgid "internal error: %%> found without a %%< in assembler pattern" +#~ msgstr "ÆâÉô¥¨¥é¡¼: ¥¢¥»¥ó¥Ö¥é¥Ñ¥¿¡¼¥ó¤Ç %%< ¤Ê¤·¤Î %%> ¤¬¸«¤Ä¤«¤ê¤Þ¤·¤¿" + +#~ msgid "internal error: %%} found without a %%{ in assembler pattern" +#~ msgstr "ÆâÉô¥¨¥é¡¼: ¥¢¥»¥ó¥Ö¥é¥Ñ¥¿¡¼¥ó¤Ç %%{ ¤Ê¤·¤Î %%} ¤¬¸«¤Ä¤«¤ê¤Þ¤·¤¿" + +#~ msgid "PRINT_OPERAND: Unknown punctuation '%c'" +#~ msgstr "PRINT_OPERAND: ÉÔÌÀ¤Ê¶çÆÉÅÀ '%c'" + +#~ msgid "PRINT_OPERAND null pointer" +#~ msgstr "PRINT_OPERAND NULL ¥Ý¥¤¥ó¥¿" + +#~ msgid "invalid use of %%d, %%x, or %%X" +#~ msgstr "̵¸ú¤ÊÍÑË¡¤Î of %%d, %%x, Ëô¤Ï %%X" + +#~ msgid "PRINT_OPERAND_ADDRESS, null pointer" +#~ msgstr "PRINT_OPERAND_ADDRESS, null ¥Ý¥¤¥ó¥¿" + +#~ msgid "can't open %s" +#~ msgstr "%s ¤ò³«¤±¤Þ¤»¤ó" + +#~ msgid "MIPS ECOFF format does not allow changing filenames within functions with #line" +#~ msgstr "MIPS ECOFF ·Á¼°¤Ç¤Ï #line ¤ò»ý¤Ä´Ø¿ô¤Ç¤Î¥Õ¥¡¥¤¥ë̾Êѹ¹¤Ïµö²Ä¤µ¤ì¤Þ¤»¤ó" + +#~ msgid "can't rewind %s" +#~ msgstr "%s ¤ò rewind ¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "can't write to %s" +#~ msgstr "%s ¤Ø½ñ¤­¹þ¤á¤Þ¤»¤ó" + +#~ msgid "can't read from %s" +#~ msgstr "%s ¤«¤éÆɹþ¤á¤Þ¤»¤ó" + +#~ msgid "can't close %s" +#~ msgstr "%s ¤ò close ¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "gp_offset (%ld) or end_offset (%ld) is less than zero." +#~ msgstr "gp_offset (%ld) Ëô¤Ï end_offset (%ld) ¤¬¥¼¥í¤è¤ê¤â¾®¤µ¤¯¤Ê¤Ã¤Æ¤¤¤Þ¤¹" + +#~ msgid "fp_offset (%ld) or end_offset (%ld) is less than zero." +#~ msgstr "fp_offset (%ld) Ëô¤Ï end_offset (%ld) ¤¬¥¼¥í¤è¤ê¤â¾®¤µ¤¯¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£" + +#~ msgid "can not handle inconsistent calls to `%s'" +#~ msgstr "`%s' ¤Ø¤ÎÌ·½â¤·¤¿¸Æ¤Ó½Ð¤·¤òÊ᪤Ǥ­¤Þ¤»¤ó" + +#~ msgid "No default crt0.o" +#~ msgstr "crt0.o ¤ò¥Ç¥Õ¥©¥ë¥È¤È¤·¤Ê¤¤" + +#~ msgid "Use 64-bit int type" +#~ msgstr "64 ¥Ó¥Ã¥È int ·¿¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Use 64-bit long type" +#~ msgstr "64 ¥Ó¥Ã¥È long ·¿¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Use 32-bit long type" +#~ msgstr "32 ¥Ó¥Ã¥È long ·¿¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Optimize lui/addiu address loads" +#~ msgstr "lui/addiu ¥¢¥É¥ì¥¹¥í¡¼¥É¤òºÇŬ²½¤¹¤ë" + +#~ msgid "Don't optimize lui/addiu address loads" +#~ msgstr "lui/addiu ¥¢¥É¥ì¥¹¥í¡¼¥É¤òºÇŬ²½¤·¤Ê¤¤" + +#~ msgid "Use MIPS as" +#~ msgstr "MIPS as ¤òÍøÍѤ¹¤ë" + +#~ msgid "Use GNU as" +#~ msgstr "GNU as ¤òÍøÍѤ¹¤ë" + +#~ msgid "Use symbolic register names" +#~ msgstr "¥·¥ó¥Ü¥ê¥Ã¥¯¥ì¥¸¥¹¥¿Ì¾¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Don't use symbolic register names" +#~ msgstr "¥·¥ó¥Ü¥ê¥Ã¥¯¥ì¥¸¥¹¥¿Ì¾¤ò»ÈÍѤ·¤Ê¤¤" + +#~ msgid "Use GP relative sdata/sbss sections" +#~ msgstr "GP ´ØÏ¢ sdata/sbss ¥»¥¯¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Don't use GP relative sdata/sbss sections" +#~ msgstr "GP ´ØÏ¢ sdata/sbss ¥»¥¯¥·¥ç¥ó¤ò»ÈÍѤ·¤Ê¤¤" + +#~ msgid "Output compiler statistics" +#~ msgstr "¥³¥ó¥Ñ¥¤¥éÅý·×¤ò½ÐÎϤ¹¤ë" + +#~ msgid "Don't output compiler statistics" +#~ msgstr "¥³¥ó¥Ñ¥¤¥éÅý·×¤ò½ÐÎϤ·¤Ê¤¤" + +#~ msgid "Don't optimize block moves" +#~ msgstr "¥Ö¥í¥Ã¥¯°ÜÆ°¤òºÇŬ²½¤·¤Ê¤¤" + +#~ msgid "Optimize block moves" +#~ msgstr "¥Ö¥í¥Ã¥¯°ÜÆ°¤òºÇŬ²½¤¹¤ë" + +#~ msgid "Use mips-tfile asm postpass" +#~ msgstr "asm ¸å²áÄø¤Ç mips-tfile ¤òÍøÍѤ¹¤ë" + +#~ msgid "Don't use mips-tfile asm postpass" +#~ msgstr "asm ¸å²áÄø¤Ç mips-tfile ¤òÍøÍѤ·¤Ê¤¤" + +#~ msgid "Use hardware floating point" +#~ msgstr "¥Ï¡¼¥É¥¦¥§¥¢ÉâÆ°¾®¿ôÅÀ¤òÍøÍѤ¹¤ë" + +#~ msgid "Use 64-bit FP registers" +#~ msgstr "64 ¥Ó¥Ã¥È FP ¥ì¥¸¥¹¥¿¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Use 32-bit FP registers" +#~ msgstr "32 ¥Ó¥Ã¥È FP ¥ì¥¸¥¹¥¿¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Use 64-bit general registers" +#~ msgstr "64 ¥Ó¥Ã¥È°ìÈ̥쥸¥¹¥¿¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Use 32-bit general registers" +#~ msgstr "32 ¥Ó¥Ã¥È°ìÈ̥쥸¥¹¥¿¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Use Irix PIC" +#~ msgstr "Irix PIC ¤òÍøÍѤ¹¤ë" + +#~ msgid "Don't use Irix PIC" +#~ msgstr "Irix PIC ¤òÍøÍѤ·¤Ê¤¤" + +#~ msgid "Use OSF PIC" +#~ msgstr "OSF PIC ¤òÍøÍѤ¹¤ë" + +#~ msgid "Don't use OSF PIC" +#~ msgstr "OSF PIC ¤òÍøÍѤ·¤Ê¤¤" + +#~ msgid "Use indirect calls" +#~ msgstr "´ÖÀܸƤӽФ·¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Don't use indirect calls" +#~ msgstr "´ÖÀܸƤӽФ·¤ò»ÈÍѤ·¤Ê¤¤" + +#~ msgid "Use embedded PIC" +#~ msgstr "Ëä¤á¹þ¤ß PIC ¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Don't use embedded PIC" +#~ msgstr "Ëä¤á¹þ¤ß PIC ¤ò»ÈÍѤ·¤Ê¤¤" + +#~ msgid "Use ROM instead of RAM" +#~ msgstr "RAM ¤ÎÂå¤ï¤ê¤Ë ROM ¤òÍøÍѤ¹¤ë" + +#~ msgid "Don't use ROM instead of RAM" +#~ msgstr "RAM ¤ÎÂå¤ï¤ê¤Ë ROM ¤òÍøÍѤ·¤Ê¤¤" + +#~ msgid "Put uninitialized constants in ROM (needs -membedded-data)" +#~ msgstr "̤½é´ü²½Äê¿ô¤ò ROM ¤ËÃÖ¤¯(Í× -membedded-data)" + +#~ msgid "Don't put uninitialized constants in ROM" +#~ msgstr "̤½é´ü²½Äê¿ô¤ò ROM ¤ËÃÖ¤«¤Ê¤¤" + +#~ msgid "Use big-endian byte order" +#~ msgstr "¥Ó¥Ã¥°¥¨¥ó¥Ç¥£¥¢¥ó¤Î¥Ð¥¤¥È½ç¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Use little-endian byte order" +#~ msgstr "¥ê¥È¥ë¥¨¥ó¥Ç¥£¥¢¥ó¤Î¥Ð¥¤¥È½ç¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Use single (32-bit) FP only" +#~ msgstr "ñÀºÅÙ(32bit) FP ¤Î¤ß¤òÍøÍѤ¹¤ë" + +#~ msgid "Don't use single (32-bit) FP only" +#~ msgstr "ñÀºÅÙ(32bit) FP °Ê³°¤âÍøÍѤ¹¤ë" + +#~ msgid "Use multiply accumulate" +#~ msgstr "¾è»»Ì¿Îá¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Don't use multiply accumulate" +#~ msgstr "¾è»»¡¦²Ã»»Ì¿Îá¤ò»ÈÍѤ·¤Ê¤¤" + +#~ msgid "Work around early 4300 hardware bug" +#~ msgstr "½é´ü¤Î 4300 ¥Ï¡¼¥É¥¦¥§¥¢¥Ð¥°¤ÎÂнè¤ò¹Ô¤¦" + +#~ msgid "Don't work around early 4300 hardware bug" +#~ msgstr "½é´ü¤Î 4300 ¥Ï¡¼¥É¥¦¥§¥¢¥Ð¥°¤ÎÂнè¤ò¹Ô¤ï¤Ê¤¤" + +#~ msgid "Optimize for 4650" +#~ msgstr "4650 ÍѤ˺ÇŬ²½¤¹¤ë" + +#~ msgid "Optimize for 3900" +#~ msgstr "3900 ÍѤ˺ÇŬ²½¤¹¤ë" + +#~ msgid "Trap on integer divide by zero" +#~ msgstr "À°¿ô¤Î¥¼¥í½ü»»¤ò¥È¥é¥Ã¥×¤¹¤ë" + +#~ msgid "Don't trap on integer divide by zero" +#~ msgstr "À°¿ô¤Î¥¼¥í½ü»»¤ò¥È¥é¥Ã¥×¤·¤Ê¤¤" + +#~ msgid "Trap on integer divide overflow" +#~ msgstr "À°¿ô½ü»»¤Î¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤ò¥È¥é¥Ã¥×¤¹¤ë" + +#~ msgid "Don't trap on integer divide overflow" +#~ msgstr "À°¿ô½ü»»¤Î¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤ò¥È¥é¥Ã¥×¤·¤Ê¤¤" + +#~ msgid "Specify CPU for scheduling purposes" +#~ msgstr "Ì¿Î᥹¥±¥¸¥å¡¼¥ê¥ó¥°¤Î¤¿¤á¤Ë CPU ¤ò»ØÄꤹ¤ë" + +#~ msgid "Specify MIPS ISA" +#~ msgstr "MIPS ISA ¤ò»ØÄꤹ¤ë" + +#~ msgid "Use mips16 entry/exit psuedo ops" +#~ msgstr "mips16 ¤Î entry/exit µ¿»÷¥ª¥Ú¥é¥ó¥É¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Don't use MIPS16 instructions" +#~ msgstr "MIPS16 Ì¿Îá¤ò»ÈÍѤ·¤Ê¤¤" + +#~ msgid "mips16 function profiling" +#~ msgstr "mips16 ´Ø¿ô¥×¥í¥Õ¥¡¥¤¥ë" + +#~ msgid "Work around hardware multiply bug" +#~ msgstr "¥Ï¡¼¥É¥¦¥§¥¢¾è»»¥Ð¥°¤ËÂн褹¤ë" + +#~ msgid "Do not work around hardware multiply bug" +#~ msgstr "¥Ï¡¼¥É¥¦¥§¥¢¾è»»¥Ð¥°¤ËÂн褷¤Ê¤¤" + +#~ msgid "Target the AM33 processor" +#~ msgstr "AM33 ¥×¥í¥»¥Ã¥µ¤ò¥¿¡¼¥²¥Ã¥È¤È¤¹¤ë" + +#~ msgid "optimization turned on" +#~ msgstr "ºÇŬ²½¤òÍ­¸ú¤Ë¤¹¤ë" + +#~ msgid "optimization turned off" +#~ msgstr "ºÇŬ²½¤ò̵¸ú¤Ë¤¹¤ë" + +#~ msgid "optimization level restored" +#~ msgstr "ºÇŬ²½¥ì¥Ù¥ë¤ò¸µ¤ËÌᤷ¤Þ¤·¤¿" + +#~ msgid "Don't use hardware fp" +#~ msgstr "¥Ï¡¼¥É¥¦¥§¥¢ÉâÆ°¾®¿ôÅÀ¤ò»ÈÍѤ·¤Ê¤¤" + +#~ msgid "Alternative calling convention" +#~ msgstr "Ê̤θƤӽФ·µ¬Ìó¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Pass some arguments in registers" +#~ msgstr "¤¤¤¯¤Ä¤«¤Î°ú¿ô¤Ï¥ì¥¸¥¹¥¿ÅϤ·¤Ë¤¹¤ë" + +#~ msgid "Pass all arguments on stack" +#~ msgstr "Á´¤Æ¤Î°ú¿ô¤ò¥¹¥¿¥Ã¥¯ÅϤ·¤Ë¤¹¤ë" + +#~ msgid "Optimize for 32532 cpu" +#~ msgstr "32532 cpu ÍѤ˺ÇŬ²½¤¹¤ë" + +#~ msgid "Optimize for 32332 cpu" +#~ msgstr "32332 cpu ÍѤ˺ÇŬ²½¤¹¤ë" + +#~ msgid "Optimize for 32032" +#~ msgstr "32032 ÍѤ˺ÇŬ²½¤¹¤ë" + +#~ msgid "Register sb is zero. Use for absolute addressing" +#~ msgstr "sb ¥ì¥¸¥¹¥¿¤ò¥¼¥í¤È¤¹¤ë¡£ÀäÂÐ¥¢¥É¥ì¥¹¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Do not use register sb" +#~ msgstr "sb ¥ì¥¸¥¹¥¿¤ò»ÈÍѤ·¤Ê¤¤" + +#~ msgid "Do not use bitfield instructions" +#~ msgstr "¥Ó¥Ã¥È¥Õ¥£¡¼¥ë¥ÉÌ¿Îá¤ò»ÈÍѤ·¤Ê¤¤" + +#~ msgid "Use bitfield instructions" +#~ msgstr "¥Ó¥Ã¥È¥Õ¥£¡¼¥ë¥ÉÌ¿Îá¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Generate code for high memory" +#~ msgstr "¹â°Ì¥¢¥É¥ì¥¹¥á¥â¥êÍѤΥ³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Generate code for low memory" +#~ msgstr "Äã°Ì¥¢¥É¥ì¥¹¥á¥â¥êÍѤΥ³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "32381 fpu" +#~ msgstr "32381 ÉâÆ°¾®¿ôÅÀ¥æ¥Ë¥Ã¥È" + +#~ msgid "Use multiply-accumulate fp instructions" +#~ msgstr "¾è»»-²Ã»»ÉâÆ°¾®¿ôÅÀÌ¿Îá¤ò¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Do not use multiply-accumulate fp instructions" +#~ msgstr "¾è»»-²Ã»»ÉâÆ°¾®¿ôÅÀÌ¿Îá¤ò»ÈÍѤ·¤Ê¤¤" + +#~ msgid "\"Small register classes\" kludge" +#~ msgstr "\"¥¹¥â¡¼¥ë¥ì¥¸¥¹¥¿¥¯¥é¥¹\" ¤Î¥Ä¥®¥Ï¥®(kludge)¤ò¹Ô¤Ê¤¦" + +#~ msgid "No \"Small register classes\" kludge" +#~ msgstr "\"¥¹¥â¡¼¥ë¥ì¥¸¥¹¥¿¥¯¥é¥¹\" ¤Î¥Ä¥®¥Ï¥®(kludge)¤ò¹Ô¤Ê¤ï¤Ê¤¤" + +#~ msgid "" +#~ "Unknown -mschedule= option (%s).\n" +#~ "Valid options are 700, 7100, 7100LC, 7200, and 8000\n" +#~ msgstr "" +#~ "ÉÔÌÀ¤Ê -mschedule= ¥ª¥×¥·¥ç¥ó (%s).\n" +#~ "Àµ¾ï¤Ê¥ª¥×¥·¥ç¥ó¤Ï 700, 7100, 7100LC, 7200, µÚ¤Ó 8000 ¤Ç¤¹\n" + +#~ msgid "" +#~ "Unknown -march= option (%s).\n" +#~ "Valid options are 1.0, 1.1, and 2.0\n" +#~ msgstr "" +#~ "ÉÔÌÀ¤Ê -march= ¥ª¥×¥·¥ç¥ó (%s).\n" +#~ "Àµ¾ï¤Ê¥ª¥×¥·¥ç¥ó¤Ï 1.0, 1.1, µÚ¤Ó 2.0\n" + +#~ msgid "PIC code generation is not supported in the portable runtime model\n" +#~ msgstr "PIC ¥³¡¼¥ÉÀ¸À®¤Ï²Äȼ¹Իþ¥â¥Ç¥ë¤Ç¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤»¤ó\n" + +#~ msgid "PIC code generation is not compatible with fast indirect calls\n" +#~ msgstr "PIC ¥³¡¼¥ÉÀ¸À®¤Ï¹â®´ÖÀܸƤӽФ·¤ÈÁêÍƤì¤Þ¤»¤ó\n" + +#~ msgid "PIC code generation is not compatible with profiling\n" +#~ msgstr "PIC ¥³¡¼¥ÉÀ¸À®¤Ï¥×¥í¥Õ¥¡¥¤¥ê¥ó¥°¤È¤ÏÁêÍƤì¤Þ¤»¤ó\n" + +#~ msgid "-g is only supported when using GAS on this processor," +#~ msgstr "-g ¤Ï¤³¤Î¥×¥í¥»¥Ã¥µ¤Ç¤Ï GAS ¤ò»ÈÍѤ¹¤ë»þ¤À¤±¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤¹" + +#~ msgid "-g option disabled." +#~ msgstr "-g ¥ª¥×¥·¥ç¥ó¤ò̵¸ú²½¤·¤Þ¤·¤¿¡£" + +#~ msgid "Do not use hardware floating point" +#~ msgstr "¥Ï¡¼¥É¥¦¥§¥¢ÉâÆ°¾®¿ôÅÀ¤òÍøÍѤ·¤Ê¤¤" + +#~ msgid "Return floating point results in ac0" +#~ msgstr "ÉâÆ°¾®¿ôÅÀ¤Î·ë²Ì¤ò ac0 ¤ÇÊÖ¤¹" + +#~ msgid "Return floating point results in memory" +#~ msgstr "ÉâÆ°¾®¿ôÅÀ¤Î·ë²Ì¤ò¥á¥â¥ê¤ÇÊÖ¤¹" + +#~ msgid "Generate code for an 11/40" +#~ msgstr "11/40 ÍѤΥ³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Generate code for an 11/45" +#~ msgstr "11/45 ÍѤΥ³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Generate code for an 11/10" +#~ msgstr "11/10 ÍѤΥ³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Use 32 bit int" +#~ msgstr "32 ¥Ó¥Ã¥ÈÀ°¿ô¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Use 16 bit int" +#~ msgstr "16 ¥Ó¥Ã¥ÈÀ°¿ô¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Use 32 bit float" +#~ msgstr "32 ¥Ó¥Ã¥ÈÉâÆ°¾®¿ô¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Use 64 bit float" +#~ msgstr "64 ¥Ó¥Ã¥ÈÉâÆ°¾®¿ô¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Target has split I&D" +#~ msgstr "¥¿¡¼¥²¥Ã¥È¤Ï split Ì¿Îá¤È¥Ç¡¼¥¿¥á¥â¥ê¤ò»ý¤Ä" + +#~ msgid "Target does not have split I&D" +#~ msgstr "¥¿¡¼¥²¥Ã¥È¤Ï split Ì¿Îá¤È¥Ç¡¼¥¿¥á¥â¥ê¤ò»ý¤¿¤Ê¤¤" + +#~ msgid "Use UNIX assembler syntax" +#~ msgstr "UNIX ¥¢¥»¥ó¥Ö¥éʸˡ¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Use DEC assembler syntax" +#~ msgstr "DEC ¥¢¥»¥ó¥Ö¥éʸˡ¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Generate little endian data" +#~ msgstr "¥ê¥È¥ë¥¨¥ó¥Ç¥£¥¢¥ó¥Ç¡¼¥¿¤òÀ¸À®¤¹¤ë" + +#~ msgid "Generate big endian data" +#~ msgstr "¥Ó¥Ã¥°¥¨¥ó¥Ç¥£¥¢¥ó¥Ç¡¼¥¿¤òÀ¸À®¤¹¤ë" + +#~ msgid "Turn on maintainer testing code" +#~ msgstr "¥á¥ó¥Æ¥Ê¥Æ¥¹¥È¥³¡¼¥É¤òÍ­¸ú¤Ë¤¹¤ë" + +#~ msgid "Enable Transmeta picoJava extensions" +#~ msgstr "Transmeta picoJava ³ÈÄ¥¤òÍ­¸ú¤Ë¤¹¤ë" + +#~ msgid "Disable Transmeta picoJava extensions" +#~ msgstr "Transmeta picoJava ³ÈÄ¥¤ò̵¸ú¤Ë¤¹¤ë" + +#~ msgid "Disable reorganization pass" +#~ msgstr "ºÆÊÔÀ®¹©Äø¤ò̵¸ú¤Ë¤¹¤ë" + +#~ msgid "invalid %%B value" +#~ msgstr "̵¸ú¤Ê %%B ÃÍ" + +#~ msgid "invalid %%S value" +#~ msgstr "̵¸ú¤Ê %%S ÃÍ" + +#~ msgid "invalid %%b value" +#~ msgstr "̵¸ú¤Ê %%b ÃÍ" + +#~ msgid "invalid %%H value" +#~ msgstr "̵¸ú¤Ê %%H ÃÍ" + +#~ msgid "invalid %%z value" +#~ msgstr "̵¸ú¤Ê %%z ÃÍ" + +#~ msgid "invalid %%Z value" +#~ msgstr "̵¸ú¤Ê %%Z ÃÍ" + +#~ msgid "invalid %%k value" +#~ msgstr "̵¸ú¤Ê %%k ÃÍ" + +#~ msgid "invalid %%j value" +#~ msgstr "̵¸ú¤Ê %%j ÃÍ" + +#~ msgid "can't have varargs with -mfp-arg-in-fp-regs" +#~ msgstr "-mfp-arg-in-fp-regs ¤ò»È¤¦¤È²ÄÊѸİú¿ô¤ò»ý¤Æ¤Þ¤»¤ó" + +#~ msgid "Always pass floating-point arguments in memory" +#~ msgstr "ÉâÆ°¾®¿ôÅÀ°ú¿ô¤Ï¾ï¤Ë¥á¥â¥êÅϤ·¤È¤¹¤ë" + +#~ msgid "Don't always pass floating-point arguments in memory" +#~ msgstr "ÉâÆ°¾®¿ôÅÀ°ú¿ô¤Ï¾ï¤Ë¥á¥â¥êÅϤ·¤È¤·¤Ê¤¤" + +#~ msgid "Support message passing with the Parallel Environment" +#~ msgstr "ÊÂÎó´Ä¶­¤Ç¤Î¥á¥Ã¥»¡¼¥¸¥Ñ¥Ã¥·¥ó¥°¤ò¥µ¥Ý¡¼¥È¤¹¤ë" + +#~ msgid "Compile for 64-bit pointers" +#~ msgstr "64 ¥Ó¥Ã¥È¥Ý¥¤¥ó¥¿ÍѤ˥³¥ó¥Ñ¥¤¥ë¤¹¤ë" + +#~ msgid "Compile for 32-bit pointers" +#~ msgstr "32 ¥Ó¥Ã¥È¥Ý¥¤¥ó¥¿ÍѤ˥³¥ó¥Ñ¥¤¥ë¤¹¤ë" + +#~ msgid "-maix64 and POWER architecture are incompatible." +#~ msgstr "-maix64 ¤È POWER ¥¢¡¼¥­¥Æ¥¯¥Á¥ã¤È¤Ç¤Ï¸ß´¹À­¤¬¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "-maix64 requires PowerPC64 architecture remain enabled." +#~ msgstr "PowerPC64 ¥¢¡¼¥­¥Æ¥¯¥Á¥ã¤Ç¤Ê¤¤¤È -maix64 ¤òÍ­¸ú¤Ë¤Ï¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "-maix64 required: 64-bit computation with 32-bit addressing not yet supported." +#~ msgstr "-maix64 Í×µá: 32 bit ¥¢¥É¥ì¥·¥ó¥°²¼¤Î 64 bit ·×»»¤Ï¤Þ¤ÀÍøÍѤǤ­¤Þ¤»¤ó" + +#~ msgid "-mmultiple is not supported on little endian systems" +#~ msgstr "-mmultiple ¤Ï¥ê¥È¥ë¥¨¥ó¥Ç¥£¥¢¥ó¥·¥¹¥Æ¥à¾å¤Ç¤Ï¼õ¤±Æþ¤ì¤é¤ì¤Þ¤»¤ó" + +#~ msgid "-mstring is not supported on little endian systems" +#~ msgstr "-mstring ¤Ï¥ê¥È¥ë¥¨¥ó¥Ç¥£¥¢¥ó¥·¥¹¥Æ¥à¾å¤Ç¤Ï¼õ¤±Æþ¤ì¤é¤ì¤Þ¤»¤ó" + +#~ msgid "-f%s ignored for AIX (all code is position independent)" +#~ msgstr "AIX ÍÑ¤Ë -f%s ¤Ï̵»ë¤µ¤ì¤Þ¤·¤¿¡ÊÁ´¤Æ¤Î¥³¡¼¥É¤Ï°ÌÃÖÈó°Í¸¤Ç¤¹¡Ë" + +#~ msgid "-ffunction-sections disabled on AIX when debugging" +#~ msgstr "AIX ¤Ç¤Ï¥Ç¥Ð¥Ã¥°»þ¤Î -ffunction-sections ¤Ï̵¸ú¤È¤µ¤ì¤Þ¤¹" + +#~ msgid "-fdata-sections not supported on AIX" +#~ msgstr "AIX ¤Ç¤Ï -fdata-sections ¤Ï¼õ¤±Æþ¤ì¤é¤ì¤Þ¤»¤ó" + +#~ msgid "Unknown -mdebug-%s switch" +#~ msgstr "ÉÔÌÀ¤Ê -mdebug-%s ¥¹¥¤¥Ã¥Á¤Ç¤¹" + +#~ msgid "invalid %%f value" +#~ msgstr "̵¸ú¤Ê %%f ÃͤǤ¹" + +#~ msgid "invalid %%F value" +#~ msgstr "̵¸ú¤Ê %%F ÃͤǤ¹" + +#~ msgid "invalid %%G value" +#~ msgstr "̵¸ú¤Ê %%G ÃͤǤ¹" + +#~ msgid "invalid %%j code" +#~ msgstr "̵¸ú¤Ê %%j ¥³¡¼¥É¤Ç¤¹" + +#~ msgid "invalid %%J code" +#~ msgstr "̵¸ú¤Ê %%J ¥³¡¼¥É¤Ç¤¹" + +#~ msgid "invalid %%K value" +#~ msgstr "̵¸ú¤Ê %%K ÃͤǤ¹" + +#~ msgid "invalid %%p value" +#~ msgstr "̵¸ú¤Ê %%p ÃͤǤ¹" + +#~ msgid "invalid %%q value" +#~ msgstr "̵¸ú¤Ê %%q ÃͤǤ¹" + +#~ msgid "%%S computed all 1's mask" +#~ msgstr "%%S ¤ÏÁ´¤Æ¤¬ 1 ¤Î¥Þ¥¹¥¯¤ò·×»»¤·¤Þ¤·¤¿" + +#~ msgid "%%S computed all 0's mask" +#~ msgstr "%%S ¤ÏÁ´¤Æ¤¬ 0 ¤Î¥Þ¥¹¥¯¤ò·×»»¤·¤Þ¤·¤¿" + +#~ msgid "invalid %%T value" +#~ msgstr "̵¸ú¤Ê %%T ÃͤǤ¹" + +#~ msgid "invalid %%u value" +#~ msgstr "̵¸ú¤Ê %%u ÃͤǤ¹" + +#~ msgid "invalid %%v value" +#~ msgstr "̵¸ú¤Ê %%v ÃͤǤ¹" + +#~ msgid "invalid %%W value" +#~ msgstr "̵¸ú¤Ê %%W ÃͤǤ¹" + +#~ msgid "Use POWER instruction set" +#~ msgstr "POWER Ì¿Î᥻¥Ã¥È¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Use POWER2 instruction set" +#~ msgstr "POWER2 Ì¿Î᥻¥Ã¥È¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Do not use POWER2 instruction set" +#~ msgstr "POWER2 Ì¿Î᥻¥Ã¥È¤ò»ÈÍѤ·¤Ê¤¤" + +#~ msgid "Do not use POWER instruction set" +#~ msgstr "POWER Ì¿Î᥻¥Ã¥È¤ò»ÈÍѤ·¤Ê¤¤" + +#~ msgid "Use PowerPC instruction set" +#~ msgstr "PowerPC Ì¿Î᥻¥Ã¥È¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Do not use PowerPC instruction set" +#~ msgstr "PowerPC Ì¿Î᥻¥Ã¥È¤ò»ÈÍѤ·¤Ê¤¤" + +#~ msgid "Use PowerPC General Purpose group optional instructions" +#~ msgstr "PowerPC °ìÈÌÍÑÅÓ¥°¥ë¡¼¥×¥ª¥×¥·¥ç¥óÌ¿Îá¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Don't use PowerPC General Purpose group optional instructions" +#~ msgstr "PowerPC °ìÈÌÍÑÅÓ¥°¥ë¡¼¥×¥ª¥×¥·¥ç¥óÌ¿Îá¤ò»ÈÍѤ·¤Ê¤¤" + +#~ msgid "Use PowerPC Graphics group optional instructions" +#~ msgstr "PowerPC ¥°¥é¥Õ¥£¥¯¥¹¥°¥ë¡¼¥×¥ª¥×¥·¥ç¥óÌ¿Îá¤ò»ÈÍѤ·¤Ê¤¤" + +#~ msgid "Don't use PowerPC Graphics group optional instructions" +#~ msgstr "PowerPC ¥°¥é¥Õ¥£¥¯¥¹¥°¥ë¡¼¥×¥ª¥×¥·¥ç¥óÌ¿Îá¤ò»ÈÍѤ·¤Ê¤¤" + +#~ msgid "Use PowerPC-64 instruction set" +#~ msgstr "PowerPC-64 Ì¿Î᥻¥Ã¥È¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Don't use PowerPC-64 instruction set" +#~ msgstr "PowerPC-64 Ì¿Î᥻¥Ã¥È¤ò»ÈÍѤ·¤Ê¤¤" + +#~ msgid "Use new mnemonics for PowerPC architecture" +#~ msgstr "PowerPC ¥¢¡¼¥­¥Æ¥¯¥Á¥ãÍѤο·¤·¤¤¥Ë¡¼¥â¥Ë¥Ã¥¯¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Use old mnemonics for PowerPC architecture" +#~ msgstr "PowerPC ¥¢¡¼¥­¥Æ¥¯¥Á¥ãÍѤθŤ¤¥Ë¡¼¥â¥Ë¥Ã¥¯¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Put everything in the regular TOC" +#~ msgstr "Á´¤Æ¤òÄ̾ï TOC Æâ¤ËÇÛÃÖ¤¹¤ë" + +#~ msgid "Place floating point constants in TOC" +#~ msgstr "ÉâÆ°¾®¿ôÅÀÄê¿ô¤ò TOC Æâ¤ËÇÛÃÖ¤¹¤ë" + +#~ msgid "Don't place floating point constants in TOC" +#~ msgstr "ÉâÆ°¾®¿ôÅÀÄê¿ô¤ò TOC Æâ¤ËÇÛÃÖ¤·¤Ê¤¤" + +#~ msgid "Place symbol+offset constants in TOC" +#~ msgstr "¥·¥ó¥Ü¥ë+¥ª¥Õ¥»¥Ã¥ÈÄê¿ô¤ò TOC Æâ¤ËÇÛÃÖ¤¹¤ë" + +#~ msgid "Don't place symbol+offset constants in TOC" +#~ msgstr "¥·¥ó¥Ü¥ë+¥ª¥Õ¥»¥Ã¥ÈÄê¿ô¤ò TOC Æâ¤ËÇÛÃÖ¤·¤Ê¤¤" + +#~ msgid "Place variable addresses in the regular TOC" +#~ msgstr "ÊÑ¿ô¥¢¥É¥ì¥¹¤òÄ̾ï TOC Æâ¤ËÇÛÃÖ¤¹¤ë" + +#~ msgid "Generate load/store multiple instructions" +#~ msgstr "Ê£¿ôÌ¿Îá¤Î¥í¡¼¥É/¥¹¥È¥¢¤òÀ¸À®¤¹¤ë" + +#~ msgid "Do not generate load/store multiple instructions" +#~ msgstr "Ê£¿ôÌ¿Îá¤Î¥í¡¼¥É/¥¹¥È¥¢¤òÀ¸À®¤·¤Ê¤¤" + +#~ msgid "Generate string instructions for block moves" +#~ msgstr "¥Ö¥í¥Ã¥¯°ÜÆ°ÍѤΠstring Ì¿Îá¤òÀ¸À®¤¹¤ë" + +#~ msgid "Do not generate string instructions for block moves" +#~ msgstr "¥Ö¥í¥Ã¥¯°ÜÆ°ÍѤΠstring Ì¿Îá¤òÀ¸À®¤·¤Ê¤¤" + +#~ msgid "Generate load/store with update instructions" +#~ msgstr "update Ì¿Îá¤È°ì½ï¤Ë¥í¡¼¥É/¥¹¥È¥¢Ì¿Îá¤òÀ¸À®¤¹¤ë" + +#~ msgid "Do not generate load/store with update instructions" +#~ msgstr "update Ì¿Îá¤È°ì½ï¤Ë¥í¡¼¥É/¥¹¥È¥¢Ì¿Îá¤òÀ¸À®¤·¤Ê¤¤" + +#~ msgid "Generate fused multiply/add instructions" +#~ msgstr "ÉâÆ°¾®¿ô¤Î¾è»»/²Ã»»Ì¿Îá¤òÀ¸À®¤¹¤ë" + +#~ msgid "Don't generate fused multiply/add instructions" +#~ msgstr "ÉâÆ°¾®¿ô¤Î¾è»»/²Ã»»Ì¿Îá¤òÀ¸À®¤·¤Ê¤¤" + +#~ msgid "Don't schedule the start and end of the procedure" +#~ msgstr "¥×¥í¥·¡¼¥¸¥ã³«»Ï¤È½ªÎ»¤Î¥¹¥±¥¸¥å¡¼¥ë¤ò¹Ô¤Ê¤ï¤Ê¤¤" + +#~ msgid "Use features of and schedule code for given CPU" +#~ msgstr "Í¿¤¨¤é¤ì¤¿ CPU ÍѤε¡Ç½¤È¥¹¥±¥¸¥å¡¼¥ë¥³¡¼¥É¤òÍøÍѤ¹¤ë" + +#~ msgid "Enable debug output" +#~ msgstr "¥Ç¥Ð¥Ã¥°½ÐÎϤòÍ­¸ú¤Ë¤¹¤ë" + +#~ msgid "RETURN_ADDRESS_OFFSET not supported" +#~ msgstr "RETURN_ADDRESS_OFFSET ¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "Select ABI calling convention." +#~ msgstr "ABI ¸Æ¤Ó½Ð¤·µ¬Ìó¤òÁªÂò¤¹¤ë" + +#~ msgid "Select method for sdata handling." +#~ msgstr "sdata ¼è¤ê°·¤¤¤Î¤¿¤á¤Î¥á¥½¥Ã¥É¤òÁªÂò¤¹¤ë" + +#~ msgid "Align to the base type of the bitfield." +#~ msgstr "¥Ó¥Ã¥È¥Õ¥£¡¼¥ë¥É¤Î¥Ù¡¼¥¹¥¿¥¤¥×¤Ë¥¢¥é¥¤¥ó¤¹¤ë" + +#~ msgid "Don't align to the base type of the bitfield." +#~ msgstr "¥Ó¥Ã¥È¥Õ¥£¡¼¥ë¥É¤Î¥Ù¡¼¥¹¥¿¥¤¥×¤Ë¥¢¥é¥¤¥ó¤·¤Ê¤¤" + +#~ msgid "Don't assume that unaligned accesses are handled by the system" +#~ msgstr "¥¢¥é¥¤¥ó¤µ¤ì¤Ê¤¤¥¢¥¯¥»¥¹¤¬¥·¥¹¥Æ¥à¤Ë¤è¤Ã¤Æ¥Ï¥ó¥É¥ë¤µ¤ì¤ë¤È¤Ï¤ß¤Ê¤µ¤Ê¤¤" + +#~ msgid "Assume that unaligned accesses are handled by the system" +#~ msgstr "¥¢¥é¥¤¥ó¤µ¤ì¤Ê¤¤¥¢¥¯¥»¥¹¤¬¥·¥¹¥Æ¥à¤Ë¤è¤Ã¤Æ¥Ï¥ó¥É¥ë¤µ¤ì¤ë¤È¤ß¤Ê¤¹" + +#~ msgid "Produce code relocatable at runtime." +#~ msgstr "¼Â¹Ô»þ¤ËºÆÇÛÃÖ²Äǽ¤Ê¥³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Don't produce code relocatable at runtime." +#~ msgstr "¼Â¹Ô»þ¤ËºÆÇÛÃÖ²Äǽ¤Ê¥³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Produce little endian code." +#~ msgstr "¥ê¥È¥ë¥¨¥ó¥Ç¥£¥¢¥ó¥³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Produce big endian code." +#~ msgstr "¥Ó¥Ã¥°¥¨¥ó¥Ç¥£¥¢¥ó¥³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Use 128 bit long doubles" +#~ msgstr "128 ¥Ó¥Ã¥È¤Î long double ¤ò»ÈÍѤ¹¤ë" + +#~ msgid "no description yet" +#~ msgstr "ÀâÌÀ¤Ï¤Þ¤À¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "Use EABI." +#~ msgstr "EABI ¤òÍøÍѤ¹¤ë¡£" + +#~ msgid "Don't use EABI." +#~ msgstr "EABI ¤òÍøÍѤ·¤Ê¤¤¡£" + +#~ msgid "Use alternate register names." +#~ msgstr "ÂåÂإ쥸¥¹¥¿Ì¾¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Don't use alternate register names." +#~ msgstr "ÂåÂإ쥸¥¹¥¿Ì¾¤ò»ÈÍѤ·¤Ê¤¤" + +#~ msgid "Link with libsim.a, libc.a and sim-crt0.o." +#~ msgstr "libsim.a, libc.a µÚ¤Ó sim-crt0.o ¤È¥ê¥ó¥¯¤¹¤ë¡£" + +#~ msgid "Link with libads.a, libc.a and crt0.o." +#~ msgstr "libads.a, libc.a µÚ¤Ó crt0.o ¤È¥ê¥ó¥¯¤¹¤ë¡£" + +#~ msgid "Link with libyk.a, libc.a and crt0.o." +#~ msgstr "libyk.a, libc.a µÚ¤Ó crt0.o ¤È¥ê¥ó¥¯¤¹¤ë¡£" + +#~ msgid "Link with libmvme.a, libc.a and crt0.o." +#~ msgstr "libmvme.a, libc.a µÚ¤Ó crt0.o ¤È¥ê¥ó¥¯¤¹¤ë¡£" + +#~ msgid "Set the PPC_EMB bit in the ELF flags header" +#~ msgstr "PPC_EMB ¥Ó¥Ã¥È¤ò ELF ¥Õ¥é¥°¥Ø¥Ã¥ÀÆâ¤Ë¥»¥Ã¥È¤¹¤ë" + +#~ msgid "Bad value for -mcall-%s" +#~ msgstr "-mcall-%s ¥¹¥¤¥Ã¥Á¤Ë¤È¤Ã¤Æ¤ÎÉÔÀµ¤ÊÃÍ" + +#~ msgid "Bad value for -msdata=%s" +#~ msgstr "-msdata=%s ¥¹¥¤¥Ã¥Á¤ËÂФ¹¤ëÉÔÀµ¤ÊÃÍ" + +#~ msgid "-mrelocatable and -msdata=%s are incompatible." +#~ msgstr "-mrelocatable ¤È -msdata=%s ¤È¤Ï¶¦Â¸¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "-f%s and -msdata=%s are incompatible." +#~ msgstr "-f%s ¤È -msdata=%s ¤Ï¶¦Â¸¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "-msdata=%s and -mcall-%s are incompatible." +#~ msgstr "-msdata=%s ¤È -mcall-%s ¤È¤Ï¶¦Â¸¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "-mrelocatable and -mno-minimal-toc are incompatible." +#~ msgstr "-mrelocatable ¤È -mno-minimal-toc ¤È¤Ï¶¦Â¸¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "-mrelocatable and -mcall-%s are incompatible." +#~ msgstr "-mrelocatable ¤È -mcall-%s ¤È¤Ï¶¦Â¸¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "-fPIC and -mcall-%s are incompatible." +#~ msgstr "-fPIC ¤È -mcall-%s ¤Ï¶¦Â¸¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "-mcall-aixdesc must be big endian" +#~ msgstr "-mcall-aixdesc ¤Ï¥Ó¥Ã¥°¥¨¥ó¥Ç¥£¥¢¥ó¤Ç¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó" + +#~ msgid "Generate code for big endian" +#~ msgstr "¥Ó¥Ã¥°¥¨¥ó¥Ç¥£¥¢¥óÍѤΥ³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Generate code for little endian" +#~ msgstr "¥ê¥È¥ë¥¨¥ó¥Ç¥£¥¢¥óÍѤΥ³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Use little-endian byte order for data" +#~ msgstr "¥Ç¡¼¥¿¤Î¥Ð¥¤¥È½ç¤Ë¥ê¥È¥ë¥¨¥ó¥Ç¥£¥¢¥ó¤ò»ÈÍѤ¹¤ë" + +#~ msgid "%s is not supported by this configuration" +#~ msgstr "%s ¤Ï¤³¤Î¥³¥ó¥Õ¥£¥®¥å¥ì¡¼¥·¥ç¥ó¤Ç¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤»¤ó" + +#~ msgid "-mlong-double-64 not allowed with -m64" +#~ msgstr "-m64 »ØÄê¥â¡¼¥É¤Ç¤Ï -mlong-double-64 ¤Ïµö²Ä¤µ¤ì¤Þ¤»¤ó" + +#~ msgid "bad value (%s) for -mcmodel= switch" +#~ msgstr "-mcmodel= ¥¹¥¤¥Ã¥Á¤Ë¤È¤Ã¤ÆÉÔÀµ¤ÊÃÍ (%s)" + +#~ msgid "-mcmodel= is not supported on 32 bit systems" +#~ msgstr "-mcmodel= ¤Ï 32 bit ¥·¥¹¥Æ¥à¾å¤Ç¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤»¤ó" + +#~ msgid "profiling does not support code models other than medlow" +#~ msgstr "¥×¥í¥Õ¥¡¥¤¥ê¥ó¥°¤Ï medlow °Ê³°¤Î¥³¡¼¥É¥â¥Ç¥ë¤Ç¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤»¤ó" + +#~ msgid "Invalid %%Y operand" +#~ msgstr "̵¸ú¤Ê %%Y ¥ª¥Ú¥é¥ó¥É" + +#~ msgid "Invalid %%A operand" +#~ msgstr "̵¸ú¤Ê %%A ¥ª¥Ú¥é¥ó¥É" + +#~ msgid "Invalid %%B operand" +#~ msgstr "̵¸ú¤Ê %%B ¥ª¥Ú¥é¥ó¥É" + +#~ msgid "Invalid %%c operand" +#~ msgstr "̵¸ú¤Ê %%c ¥ª¥Ú¥é¥ó¥É" + +#~ msgid "Invalid %%C operand" +#~ msgstr "̵¸ú¤Ê %%C ¥ª¥Ú¥é¥ó¥É" + +#~ msgid "Invalid %%d operand" +#~ msgstr "̵¸ú¤Ê %%d ¥ª¥Ú¥é¥ó¥É" + +#~ msgid "Invalid %%D operand" +#~ msgstr "̵¸ú¤Ê %%D ¥ª¥Ú¥é¥ó¥É" + +#~ msgid "Invalid %%f operand" +#~ msgstr "̵¸ú¤Ê %%f ¥ª¥Ú¥é¥ó¥É" + +#~ msgid "long long constant not a valid immediate operand" +#~ msgstr "long long Äê¿ô¤ÏÀµ¾ï¤Ê¨ÃÍ¥ª¥Ú¥é¥ó¥É¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "floating point constant not a valid immediate operand" +#~ msgstr "ÉâÆ°¾®¿ôÄê¿ô¤ÏÀµ¾ï¤Ê¨ÃÍ¥ª¥Ú¥é¥ó¥É¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "%s and profiling conflict: disabling %s" +#~ msgstr "%s ¤È¥×¥í¥Õ¥¡¥¤¥ê¥ó¥°¤Ï¶¥¹ç¤·¤Þ¤¹: %s ¤ò̵¸ú²½¤·¤Þ¤¹" + +#~ msgid "Use FUNCTION_EPILOGUE" +#~ msgstr "FUNCTION_EPILOGUE ¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Do not use FUNCTION_EPILOGUE" +#~ msgstr "FUNCTION_EPILOGUE ¤ò»ÈÍѤ·¤Ê¤¤" + +#~ msgid "Assume possible double misalignment" +#~ msgstr "double ¤¬¸í¤Ã¤¿¥¢¥é¥¤¥ó¥á¥ó¥È¤È¤Ê¤ë²ÄǽÀ­¤¬¤¢¤ë¤È¤ß¤Ê¤¹" + +#~ msgid "Assume all doubles are aligned" +#~ msgstr "Á´¤Æ¤Î double ¤ò¥¢¥é¥¤¥ó¤µ¤ì¤¿¤â¤Î¤È¤ß¤Ê¤¹" + +#~ msgid "Pass -assert pure-text to linker" +#~ msgstr "¥ê¥ó¥«¤Ë -assert pure-text ¤òÅϤ¹" + +#~ msgid "Do not pass -assert pure-text to linker" +#~ msgstr "¥ê¥ó¥«¤Ë -assert pure-text ¤òÅϤµ¤Ê¤¤" + +#~ msgid "Use flat register window model" +#~ msgstr "¥Õ¥é¥Ã¥È¥ì¥¸¥¹¥¿¥¦¥£¥ó¥É¥¦¥â¥Ç¥ë¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Do not use flat register window model" +#~ msgstr "¥Õ¥é¥Ã¥È¥ì¥¸¥¹¥¿¥¦¥£¥ó¥É¥¦¥â¥Ç¥ë¤ò»ÈÍѤ·¤Ê¤¤" + +#~ msgid "Use ABI reserved registers" +#~ msgstr "ABI ͽÌó¥ì¥¸¥¹¥¿¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Do not use ABI reserved registers" +#~ msgstr "ABI ͽÌó¥ì¥¸¥¹¥¿¤ò»ÈÍѤ·¤Ê¤¤" + +#~ msgid "Use hardware quad fp instructions" +#~ msgstr "»ÍÇÜÀºÅÙÉâÆ°¾®¿ôÅÀÌ¿Îá¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Do not use hardware quad fp instructions" +#~ msgstr "»ÍÇÜÀºÅÙÉâÆ°¾®¿ôÅÀÌ¿Îá¤ò»ÈÍѤ·¤Ê¤¤" + +#~ msgid "Compile for v8plus ABI" +#~ msgstr "v8plus ABI ÍѤ˥³¥ó¥Ñ¥¤¥ë¤¹¤ë" + +#~ msgid "Do not compile for v8plus ABI" +#~ msgstr "v8plus ABI ÍѤ˥³¥ó¥Ñ¥¤¥ë¤·¤Ê¤¤" + +#~ msgid "Utilize Visual Instruction Set" +#~ msgstr "Visual Ì¿Î᥻¥Ã¥È¤òÍøÍѤ¹¤ë" + +#~ msgid "Do not utilize Visual Instruction Set" +#~ msgstr "Visual Ì¿Î᥻¥Ã¥È¤òÍøÍѤ·¤Ê¤¤" + +#~ msgid "Optimize for Cypress processors" +#~ msgstr "Cypress ¥×¥í¥»¥Ã¥µÍѤ˺ÇŬ²½¤¹¤ë" + +#~ msgid "Optimize for SparcLite processors" +#~ msgstr "SparcLite ¥×¥í¥»¥Ã¥µÍѤ˺ÇŬ²½¤¹¤ë" + +#~ msgid "Optimize for F930 processors" +#~ msgstr "F930 ¥×¥í¥»¥Ã¥µÍѤ˺ÇŬ²½¤¹¤ë" + +#~ msgid "Optimize for F934 processors" +#~ msgstr "F934 ¥×¥í¥»¥Ã¥µÍѤ˺ÇŬ²½¤¹¤ë" + +#~ msgid "Use V8 Sparc ISA" +#~ msgstr "V8 Sparc ISA ¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Optimize for SuperSparc processors" +#~ msgstr "SuperSparc ¥×¥í¥»¥Ã¥µÍѤ˺ÇŬ²½¤¹¤ë" + +#~ msgid "Pointers are 64-bit" +#~ msgstr "¥Ý¥¤¥ó¥¿¤ò 64 ¥Ó¥Ã¥È¤È¤¹¤ë" + +#~ msgid "Pointers are 32-bit" +#~ msgstr "¥Ý¥¤¥ó¥¿¤ò 32 ¥Ó¥Ã¥È¤È¤¹¤ë" + +#~ msgid "Use 32-bit ABI" +#~ msgstr "32 ¥Ó¥Ã¥È ABI ¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Use 64-bit ABI" +#~ msgstr "64 ¥Ó¥Ã¥È ABI ¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Use stack bias" +#~ msgstr "¥¹¥¿¥Ã¥¯¥Ð¥¤¥¢¥¹¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Do not use stack bias" +#~ msgstr "¥¹¥¿¥Ã¥¯¥Ð¥¤¥¢¥¹¤ò»ÈÍѤ·¤Ê¤¤" + +#~ msgid "Use structs on stronger alignment for double-word copies" +#~ msgstr "¥À¥Ö¥ë¥ï¡¼¥É¥³¥Ô¡¼ÍѤζ¯¤¯¥¢¥é¥¤¥ó¤µ¤ì¤¿¹½Â¤ÂΤò»ÈÍѤ¹¤ë" + +#~ msgid "Do not use structs on stronger alignment for double-word copies" +#~ msgstr "¥À¥Ö¥ë¥ï¡¼¥É¥³¥Ô¡¼ÍѤζ¯¤¯¥¢¥é¥¤¥ó¤µ¤ì¤¿¹½Â¤ÂΤò»ÈÍѤ·¤Ê¤¤" + +#~ msgid "Optimize tail call instructions in assembler and linker" +#~ msgstr "¥¢¥»¥ó¥Ö¥é¤È¥ê¥ó¥«¤ÇËöÈø¸Æ¤Ó½Ð¤·Ì¿Îá¤òºÇŬ²½¤¹¤ë" + +#~ msgid "Do not optimize tail call instructions in assembler or linker" +#~ msgstr "¥¢¥»¥ó¥Ö¥é¤È¥ê¥ó¥«¤ÇËöÈø¸Æ¤Ó½Ð¤·Ì¿Îá¤òºÇŬ²½¤·¤Ê¤¤" + +#~ msgid "Use given Sparc code model" +#~ msgstr "Í¿¤¨¤é¤ì¤¿ Sparc ¥³¡¼¥É¥â¥Ç¥ë¤ò»ÈÍѤ¹¤ë" + +#~ msgid "#pragma GHS endXXXX found without previous startXXX" +#~ msgstr "#pragma GHS endXXXX ¤¬Á°¤Î startXXX ̵¤·¤Ç¸«¤Ä¤«¤ê¤Þ¤·¤¿" + +#~ msgid "#pragma GHS endXXX does not match previous startXXX" +#~ msgstr "#pragma GHS endXXX ¤¬Á°¤Î startXXX ¤ÈŬ¹ç¤·¤Þ¤»¤ó" + +#~ msgid "Cannot set interrupt attribute: no current function" +#~ msgstr "interrupt °À­¤òÀßÄê¤Ç¤­¤Þ¤»¤ó: ¸½ºß¤Î´Ø¿ô¤¬¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "Cannot set interrupt attribute: no such identifier" +#~ msgstr "interrupt °À­¤òÀßÄê¤Ç¤­¤Þ¤»¤ó: ¤½¤ÎÍͤʼ±Ê̻Ҥ¬¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "junk at end of #pragma ghs section" +#~ msgstr "#pragma ghs section ¤Î½ª¤ê¤Ë¥´¥ß¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "unrecognised section name \"%s\"" +#~ msgstr "ǧ¼±¤Ç¤­¤Ê¤¤¥»¥¯¥·¥ç¥ó̾ \"%s\"" + +#~ msgid "malformed #pragma ghs section" +#~ msgstr "¤ª¤«¤·¤Ê #pragma ghs section" + +#~ msgid "junk at end of #pragma ghs interrupt" +#~ msgstr "#pragma ghs interrupt ¤Î½ª¤ê¤Ë¥´¥ß¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "junk at end of #pragma ghs starttda" +#~ msgstr "#pragma ghs starttda ¤Î½ª¤ê¤Ë¥´¥ß¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "junk at end of #pragma ghs startsda" +#~ msgstr "#pragma ghs startsda ¤Î½ª¤ê¤Ë¥´¥ß¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "junk at end of #pragma ghs startzda" +#~ msgstr "#pragma ghs startzda ¤Î½ª¤ê¤Ë¥´¥ß¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "junk at end of #pragma ghs endtda" +#~ msgstr "#pragma ghs endtda ¤Î½ª¤ê¤Ë¥´¥ß¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "junk at end of #pragma ghs endsda" +#~ msgstr "#pragma ghs endsda ¤Î½ª¤ê¤Ë¥´¥ß¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "junk at end of #pragma ghs endzda" +#~ msgstr "#pragma ghs ¤Î½ª¤ê¤Ë¥´¥ß¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "%s=%s is not numeric." +#~ msgstr "%s=%s ¤Ï¿ôÃͤǤϤ¢¤ê¤Þ¤»¤ó" + +#~ msgid "%s=%s is too large." +#~ msgstr "%s=%s ¤ÏÂ礭¤¹¤®¤Þ¤¹¡£" + +#~ msgid "a data area attribute cannot be specified for local variables" +#~ msgstr "¥Ç¡¼¥¿Îΰè°À­¤ò¥í¡¼¥«¥ëÊÑ¿ô¤Ë¤Ï»ØÄê¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "data area of '%s' conflicts with previous declaration" +#~ msgstr "¥Ç¡¼¥¿Îΰè '%s' ¤ÏÁ°¤ÎÀë¸À¤ÈÌ·½â¤·¤Þ¤¹" + +#~ msgid "Bogus JR construction: %d\n" +#~ msgstr "¸íËâ²½¤µ¤ì¤¿ JR ¹½Â¤: %d\n" + +#~ msgid "Bad amount of stack space removal: %d" +#~ msgstr "¥¹¥¿¥Ã¥¯¶õ´Öºï½üÎ̤¬ÉÔÀµ¤Ç¤¹: %d" + +#~ msgid "Bogus JARL construction: %d\n" +#~ msgstr "¸íËâ²½¤µ¤ì¤¿ JARL ¹½Â¤: %d\n" + +#~ msgid "Support Green Hills ABI" +#~ msgstr "Green Hill ¤Î ABI ¤ò¥µ¥Ý¡¼¥È¤¹¤ë" + +#~ msgid "Prohibit PC relative function calls" +#~ msgstr "PC ´ØÏ¢¤Î´Ø¿ô¸Æ¤Ó½Ð¤·¤ò¶Ø¤¸¤ë" + +#~ msgid "Reuse r30 on a per function basis" +#~ msgstr "´Ø¿ô¤Î¼çÍ×ÉôʬËè¤Ë r30 ¤òºÆÍøÍѤ¹¤ë" + +#~ msgid "Use stubs for function prologues" +#~ msgstr "´Ø¿ô³«»ÏÉôʬÍѤΥ¹¥¿¥Ö¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Same as: -mep -mprolog-function" +#~ msgstr "-mep -mprolog-function ¤ÈƱÍÍ" + +#~ msgid "Enable backend debugging" +#~ msgstr "¥Ð¥Ã¥¯¥¨¥ó¥É¥Ç¥Ð¥Ã¥°¤òÍ­¸ú¤Ë¤¹¤ë" + +#~ msgid "Compile for the v850 processor" +#~ msgstr "v850 ¥×¥í¥»¥Ã¥µÍѤ˥³¥ó¥Ñ¥¤¥ë¤¹¤ë" + +#~ msgid "Use 4 byte entries in switch tables" +#~ msgstr "switch ¥Æ¡¼¥Ö¥ë¤Ç 4 ¥Ð¥¤¥È¥¨¥ó¥È¥ê¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Set the max size of data eligible for the TDA area" +#~ msgstr "TDA Îΰè¤Ë¤È¤Ã¤Æ˾¤Þ¤·¤¤ºÇÂç¥Ç¡¼¥¿¥µ¥¤¥º¤òÀßÄꤹ¤ë" + +#~ msgid "Set the max size of data eligible for the SDA area" +#~ msgstr "SDA Îΰè¤Ë¤È¤Ã¤Æ˾¤Þ¤·¤¤ºÇÂç¥Ç¡¼¥¿¥µ¥¤¥º¤òÀßÄꤹ¤ë" + +#~ msgid "Set the max size of data eligible for the ZDA area" +#~ msgstr "ZDA Îΰè¤Ë¤È¤Ã¤Æ˾¤Þ¤·¤¤ºÇÂç¥Ç¡¼¥¿¥µ¥¤¥º¤òÀßÄꤹ¤ë" + +#~ msgid "cannot convert to a pointer type" +#~ msgstr "¥Ý¥¤¥ó¥¿·¿¤ËÊÑ´¹¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "pointer value used where a floating point value was expected" +#~ msgstr "ÉâÆ°¾®¿ôÅÀ¿ô¤¬¤¢¤ë¤Ù¤­²Õ½ê¤Ç¡¢¥Ý¥¤¥ó¥¿Ãͤ¬»È¤ï¤ì¤Þ¤·¤¿" + +#~ msgid "aggregate value used where a float was expected" +#~ msgstr "ÉâÆ°¾®¿ôÅÀ·¿¤¬¤¢¤ë¤Ù¤­²Õ½ê¤Ç¡¢½¸¹çÂΤÎÃͤ¬»È¤ï¤ì¤Þ¤·¤¿" + +#~ msgid "conversion to incomplete type" +#~ msgstr "ÉÔ´°Á´·¿¤Ø¤ÎÊÑ´¹¤Ç¤¹" + +#~ msgid "can't convert between vector values of different size" +#~ msgstr "Â礭¤µ¤Î°Û¤Ê¤ë¥Ù¥¯¥È¥ëÃÍƱ»Î¤ÎÊÑ´¹¤Ï¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "aggregate value used where an integer was expected" +#~ msgstr "À°¿ô·¿¤¬¤¢¤ë¤Ù¤­²Õ½ê¤Ç¡¢½¸¹çÂΤÎÃͤ¬»È¤ï¤ì¤Þ¤·¤¿" + +#~ msgid "pointer value used where a complex was expected" +#~ msgstr "Ê£ÁÇ¿ô·¿¤¬¤¢¤ë¤Ù¤­²Õ½ê¤Ç¡¢¥Ý¥¤¥ó¥¿Ãͤ¬»È¤ï¤ì¤Þ¤·¤¿" + +#~ msgid "aggregate value used where a complex was expected" +#~ msgstr "Ê£ÁÇ¿ô·¿¤¬¤¢¤ë¤Ù¤­²Õ½ê¤Ç¡¢½¸¹çÂΤÎÃͤ¬»È¤ï¤ì¤Þ¤·¤¿" + +#~ msgid "can't convert value to a vector" +#~ msgstr "Ãͤò¥Ù¥¯¥È¥ë¤Ë¤ÏÊÑ´¹¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "unable to call pointer to member function here" +#~ msgstr "¤³¤³¤Ç¤Ï¥á¥ó¥Ð´Ø¿ô¥Ý¥¤¥ó¥¿¸Æ¤Ó½Ð¤·¤¬¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "destructors take no parameters" +#~ msgstr "¥Ç¥¹¥È¥é¥¯¥¿¤Ï²¾°ú¿ô¤ò¼è¤ê¤Þ¤»¤ó" + +#~ msgid "ISO C++ forbids omitting the middle term of a ?: expression" +#~ msgstr "ISO C++ ¤ÏÃæ´Ö¹à¤¬¾Êά¤µ¤ì¤¿ ?: ¼°¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "conflicting access specifications for field `%s', ignored" +#~ msgstr "¥Õ¥£¡¼¥ë¥É `%s' ¤ËÂФ¹¤ë¥¢¥¯¥»¥¹»ØÄê»Ò¤¬¶¥¹ç¤·¤¿¤¿¤á¡¢Ìµ»ë¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "trying to finish struct, but kicked out due to previous parse errors." +#~ msgstr "¹½Ê¸²òÀϤ¬¹½Â¤ÂΤνª¤ê¤Ëº¹¤·³Ý¤«¤ê¤Þ¤·¤¿¤¬¡¢Á°¤Î¥¨¥é¡¼¤Î¤»¤¤¤Çʸ̮¤ò¸«¼º¤¤¤Þ¤·¤¿" + +#~ msgid "language string `\"%s\"' not recognized" +#~ msgstr "¸À¸ìʸ»úÎó `\"%s\"' ¤Ïǧ¼±¤µ¤ì¤Þ¤»¤ó" + +#~ msgid "not enough type information" +#~ msgstr "ÉÔ½½Ê¬¤Ê·¿¾ðÊó" + +#~ msgid "invalid operation on uninstantiated type" +#~ msgstr "¥¤¥ó¥¹¥¿¥ó¥¹²½¤µ¤ì¤Ê¤¤·¿¤ËÂФ¹¤ë̵¸ú¤ÊÁàºî¤Ç¤¹" + +#~ msgid "object size exceeds built-in limit for virtual function table implementation" +#~ msgstr "¥ª¥Ö¥¸¥§¥¯¥È¥µ¥¤¥º¤¬¡¢²¾ÁÛ´Ø¿ô¥Æ¡¼¥Ö¥ë¼ÂÁõ¤ËÁȤ߹þ¤³¤Þ¤ì¤¿¥µ¥¤¥º¤òĶ²á¤·¤Þ¤·¤¿" + +#~ msgid "object size exceeds normal limit for virtual function table implementation, recompile all source and use -fhuge-objects" +#~ msgstr "¥ª¥Ö¥¸¥§¥¯¥È¥µ¥¤¥º¤¬¡¢²¾ÁÛ´Ø¿ô¥Æ¡¼¥Ö¥ë¼ÂÁõ¤ÎÄ̾ï¤ÎÀ©¸Â¤òĶ²á¤·¤¿¤¿¤á¡¢Á´¤Æ¤Î¥½¡¼¥¹¤ò -fhuge-objects ¤ò»È¤Ã¤ÆºÆ¥³¥ó¥Ñ¥¤¥ë¤·¤Æ¤¯¤À¤µ¤¤" + +#~ msgid "declaration of `%s' shadows a member of `this'" +#~ msgstr "`%s' ¤ÎÀë¸À¤Ë¤è¤ê `this' ¤Î¥á¥ó¥Ð¤¬Ê¤¤¤±£¤µ¤ì¤Þ¤¹" + +#~ msgid "label `%s' referenced outside of any function" +#~ msgstr "¥é¥Ù¥ë `%s' ¤¬´Ø¿ô¤Î³°Â¦¤Î²¿¤«¤ò»²¾È¤·¤Þ¤·¤¿" + +#~ msgid "jump to case label" +#~ msgstr "case ¥é¥Ù¥ë¤Ë¥¸¥ã¥ó¥×¤·¤Æ¤¤¤Þ¤¹" + +#~ msgid " enters try block" +#~ msgstr " try ¥Ö¥í¥Ã¥¯¤ËÆþ¤ê¤Þ¤¹" + +#~ msgid " enters catch block" +#~ msgstr " catch ¥Ö¥í¥Ã¥¯¤ËÆþ¤ê¤Þ¤¹" + +#~ msgid " from here" +#~ msgstr " ¤³¤³¤«¤é" + +#~ msgid "the ABI requires vtable thunks" +#~ msgstr "ABI ¤Ï²¾ÁÛ´Ø¿ô¥Æ¡¼¥Ö¥ë¥µ¥ó¥¯¤òÍ׵ᤷ¤Þ¤¹" + +#~ msgid "multiple types in one declaration" +#~ msgstr "°ì¤Ä¤ÎÀë¸À¤ËÊ£¿ô¤Î·¿¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "declaration does not declare anything" +#~ msgstr "Àë¸À¤¬²¿¤âÀë¸À¤·¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "Missing type-name in typedef-declaration." +#~ msgstr "typdef Àë¸À¤Ç·¿Ì¾¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "ISO C++ prohibits anonymous structs" +#~ msgstr "ISO C++ ¤Ï̵̾¹½Â¤ÂΤò¶Ø»ß¤·¤Æ¤¤¤Þ¤¹" + +#~ msgid "assignment (not initialization) in declaration" +#~ msgstr "Àë¸À¤ÎÃæ¤ËÂåÆþ(½é´ü²½¤Ç¤Ï¤Ê¤¯)¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "invalid catch parameter" +#~ msgstr "̵¸ú¤Ê catch ¤Î°ú¿ô" + +#~ msgid "cannot declare `::main' to be a template" +#~ msgstr "`::main' ¤ò template ¤È¤·¤Æ¤ÏÀë¸À¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "cannot declare `::main' to be inline" +#~ msgstr "`::main' ¤ò inline ¤È¤·¤Æ¤ÏÀë¸À¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "cannot declare `::main' to be static" +#~ msgstr "`::main' ¤ò static ¤È¤·¤Æ¤ÏÀë¸À¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "`main' must return `int'" +#~ msgstr "`main' ¤Ï `int' ¤òÊÖ¤µ¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó" + +#~ msgid "overflow in array dimension" +#~ msgstr "ÇÛÎó¤Î¼¡¸µ¤¬¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤·¤Þ¤·¤¿" + +#~ msgid "destructors must be member functions" +#~ msgstr "¥Ç¥¹¥È¥é¥¯¥¿¤Ï¥á¥ó¥Ð´Ø¿ô¤Ç¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó" + +#~ msgid "`bool' is now a keyword" +#~ msgstr "`bool' ¤Ïº£¤ä¥­¡¼¥ï¡¼¥É¤Ç¤¹" + +#~ msgid "ISO C++ does not support `long long'" +#~ msgstr "ISO C++ ¤Ï `long long' ¤ò¼õ¤±Æþ¤ì¤Þ¤»¤ó" + +#~ msgid "short, signed or unsigned invalid for `%s'" +#~ msgstr "short, Éä¹ç¤Ä¤­¤Þ¤¿¤ÏÉä¹ç¤Ê¤·¤Ï `%s' ¤Ë¤È¤Ã¤Æ̵¸ú¤Ç¤¹" + +#~ msgid "long and short specified together for `%s'" +#~ msgstr "long ¤È short ¤¬ `%s' ¤ËÂФ·¤Æ°ì½ï¤Ë»ØÄꤵ¤ì¤Æ¤¤¤Þ¤¹" + +#~ msgid "signed and unsigned given together for `%s'" +#~ msgstr "Éä¹çÉÕ¤­¤ÈÉä¹ç̵¤·¤¬ `%s' ¤ËÂФ·¤Æ°ì½ï¤ËÍ¿¤¨¤é¤ì¤Æ¤¤¤Þ¤¹" + +#~ msgid "storage class specifiers invalid in parameter declarations" +#~ msgstr "²¾°ú¿ôÀë¸À¤ÎÃæ¤Îµ­²±¥¯¥é¥¹»ØÄê»Ò¤Ï̵¸ú¤Ç¤¹" + +#~ msgid "typedef declaration invalid in parameter declaration" +#~ msgstr "²¾°ú¿ôÀë¸À¤ÎÃæ¤Î typedef Àë¸À¤Ï̵¸ú¤Ç¤¹" + +#~ msgid "virtual outside class declaration" +#~ msgstr "¥¯¥é¥¹Àë¸À¤Î³°Â¦¤Ç virtual »ØÄꤷ¤Æ¤¤¤Þ¤¹" + +#~ msgid "storage class specified for %s `%s'" +#~ msgstr "%s ¤ËÂФ¹¤ëµ­²±¥¯¥é¥¹»ØÄê»Ò `%s'" + +#~ msgid "storage class specifiers invalid in friend function declarations" +#~ msgstr "friend ´Ø¿ôÀë¸ÀÆâ¤Îµ­²±¥¯¥é¥¹»ØÄê»Ò¤Ï̵¸ú¤Ç¤¹" + +#~ msgid "destructor cannot be static member function" +#~ msgstr "¥Ç¥¹¥È¥é¥¯¥¿¤òÀÅŪ¥á¥ó¥Ð´Ø¿ô¤È¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "constructor cannot be static member function" +#~ msgstr "¥³¥ó¥¹¥È¥é¥¯¥¿¤òÀÅŪ¥á¥ó¥Ð´Ø¿ô¤È¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "constructors cannot be declared virtual" +#~ msgstr "¥³¥ó¥¹¥È¥é¥¯¥¿¤Ï virtual Àë¸À¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "return value type specifier for constructor ignored" +#~ msgstr "¥³¥ó¥¹¥È¥é¥¯¥¿¤ËÂФ¹¤ëÌá¤êÃͤη¿»ØÄê¤Ï̵»ë¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "can't initialize friend function `%s'" +#~ msgstr "friend ´Ø¿ô `%s' ¤ò½é´ü²½¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "virtual functions cannot be friends" +#~ msgstr "²¾ÁÛ´Ø¿ô¤Ï friend ¤Ë¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "friend declaration not in class definition" +#~ msgstr "friend Àë¸À¤¬¥¯¥é¥¹ÄêµÁ¤ÎÃæ¤Ë¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "cannot declare %s to references" +#~ msgstr "%s ¤ò»²¾È¤È¤·¤ÆÀë¸À¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "invalid type: `void &'" +#~ msgstr "̵¸ú¤Ê·¿: `void &'" + +#~ msgid "discarding `const' applied to a reference" +#~ msgstr "»²¾È¤ËÍѤ¤¤é¤ì¤¿ `const' ¤Ï¼Î¤Æ¤é¤ì¤Þ¤¹" + +#~ msgid "discarding `volatile' applied to a reference" +#~ msgstr "»²¾È¤ËÍѤ¤¤é¤ì¤¿ `volatile' ¤Ï¼Î¤Æ¤é¤ì¤Þ¤¹" + +#~ msgid "only declarations of constructors can be `explicit'" +#~ msgstr "`explicit' ¤Ë¤Ç¤­¤ë¤Î¤Ï¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¤À¤±¤Ç¤¹" + +#~ msgid "non-member `%s' cannot be declared `mutable'" +#~ msgstr "Èó¥á¥ó¥Ð `%s' ¤ò `mutable' ¤È¤ÏÀë¸À¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "non-object member `%s' cannot be declared `mutable'" +#~ msgstr "È󥪥֥¸¥§¥¯¥È¥á¥ó¥Ð `%s' ¤ò `mutable' ¤È¤ÏÀë¸À¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "function `%s' cannot be declared `mutable'" +#~ msgstr "´Ø¿ô `%s' ¤ò `mutable' ¤È¤·¤Æ¤ÏÀë¸À¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "static `%s' cannot be declared `mutable'" +#~ msgstr "static `%s' ¤ò mutable ¤È¤·¤ÆÀë¸À¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "const `%s' cannot be declared `mutable'" +#~ msgstr "const `%s' ¤ò `mutable' ¤È¤·¤ÆÀë¸À¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "typedef declaration includes an initializer" +#~ msgstr "typedef Àë¸À¤¬½é´üÀßÄê»Ò¤ò´Þ¤ó¤Ç¤¤¤Þ¤¹" + +#~ msgid "unnamed variable or field declared void" +#~ msgstr "̵̾ÊÑ¿ô¤ä¥Õ¥£¡¼¥ë¥É¤¬ void ¤ÈÀë¸À¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "variable or field declared void" +#~ msgstr "ÊÑ¿ô¤Þ¤¿¤Ï¥Õ¥£¡¼¥ë¥É¤¬ void ¤ÈÀë¸À¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "cannot use `::' in parameter declaration" +#~ msgstr "²¾°ú¿ôÀë¸À¤ÎÃæ¤Ç `::' ¤ò»È¤¨¤Þ¤»¤ó" + +#~ msgid "`%s' is neither function nor member function; cannot be declared friend" +#~ msgstr "`%s' ¤Ï´Ø¿ô¤Ç¤â¥á¥ó¥Ð´Ø¿ô¤Ç¤â¤¢¤ê¤Þ¤»¤ó -- friend ¤È¤ÏÀë¸À¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "member functions are implicitly friends of their class" +#~ msgstr "¥á¥ó¥Ð´Ø¿ô¤Ï°ÅÌÛŪ¤Ë¤½¤Î¥¯¥é¥¹¤Î friend ¤Ç¤¹" + +#~ msgid "storage class `auto' invalid for function `%s'" +#~ msgstr "´Ø¿ô `%s' ¤ËÂФ¹¤ëµ­²±¥¯¥é¥¹ `auto' ¤Ï̵¸ú¤Ç¤¹" + +#~ msgid "storage class `register' invalid for function `%s'" +#~ msgstr "´Ø¿ô `%s' ¤ËÂФ¹¤ëµ­²±¥¯¥é¥¹ `register' ¤Ï̵¸ú¤Ç¤¹" + +#~ msgid "storage class `static' invalid for function `%s' declared out of global scope" +#~ msgstr "Âç°è¥¹¥³¡¼¥×³°¤Î´Ø¿ô `%s' ¤ËÂФ¹¤ëµ­²±¥¯¥é¥¹ `static' ¤Ï̵¸ú¤Ç¤¹" + +#~ msgid "storage class `inline' invalid for function `%s' declared out of global scope" +#~ msgstr "Âç°è¥¹¥³¡¼¥×³°¤Î´Ø¿ô `%s' ¤ËÂФ¹¤ëµ­²±¥¯¥é¥¹ `inline' ¤Ï̵¸ú¤Ç¤¹" + +#~ msgid "virtual non-class function `%s'" +#~ msgstr "virtual ¤ÊÈ󥯥饹´Ø¿ô `%s'" + +#~ msgid "cannot declare static function inside another function" +#~ msgstr "¾¤Î´Ø¿ôÆâ¤Ç static ´Ø¿ô¤òÀë¸À¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "invalid integer constant in parameter list, did you forget to give parameter name?" +#~ msgstr "²¾°ú¿ô¥ê¥¹¥È¤Ë̵¸ú¤ÊÀ°¿ôÄê¿ô¤¬¤¢¤ê¤Þ¤¹¡£²¾°ú¿ô̾¤òÍ¿¤¨Ëº¤ì¤¿¤Î¤Ç¤Ï¡©" + +#~ msgid "conversion to %s%s will never use a type conversion operator" +#~ msgstr "%s%s ¤Ø¤ÎÊÑ´¹¤Ç·¿ÊÑ´¹±é»»»Ò¤¬ÍøÍѤµ¤ì¤ë¤³¤È¤Ï·è¤·¤Æ¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "return type for `main' changed to `int'" +#~ msgstr "`main' ¤Î return ·¿¤Ï `int' ¤ËÊѤ¨¤Þ¤·¤¿" + +#~ msgid "-f%s is no longer supported" +#~ msgstr "-f%s ¤Ï¤â¤Ï¤ä¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤»¤ó" + +#~ msgid "-fhandle-exceptions has been renamed to -fexceptions (and is now on by default)" +#~ msgstr "-fhandle-exceptions ¤Ï -fexception ¤ËÊѹ¹¤µ¤ì¤Þ¤·¤¿(¤µ¤é¤Ë¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ç¤¹)" + +#~ msgid "-fname-mangling-version is no longer supported" +#~ msgstr "-fname-mangling-version ¤Ï¤â¤Ï¤ä¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤»¤ó" + +#~ msgid "-Wno-strict-prototypes is not supported in C++" +#~ msgstr "-Wno-strict-prototypes ¤Ï C++ ¤Ç¤Ï¼õ¤±ÉÕ¤±¤é¤ì¤Þ¤»¤ó" + +#~ msgid "name missing for member function" +#~ msgstr "¥á¥ó¥Ð´Ø¿ô¤Î̾Á°¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "`__alignof__' applied to a bit-field" +#~ msgstr "¥Ó¥Ã¥È¥Õ¥£¡¼¥ë¥É¤ËÂФ·¤ÆŬÍѤµ¤ì¤¿ `__alignof__'" + +#~ msgid "parser may be lost: is there a '{' missing somewhere?" +#~ msgstr "¹½Ê¸²òÀϴ郎Ì»Ҥˤʤ俤褦¤Ç¤¹: ¤É¤³¤«¤Ç '{' ¤ò˺¤ì¤Æ¤¤¤ë¤Î¤Ç¤Ï¡©" + +#~ msgid "ambiguous conversion for array subscript" +#~ msgstr "ÇÛÎó¤Îź»ú¤ËÂФ¹¤ëÛ£Ëæ¤ÊÊÑ´¹" + +#~ msgid "anachronistic use of array size in vector delete" +#~ msgstr "¥Ù¥¯¥È¥ë¤Î delete ¤ÇÇÛÎó¥µ¥¤¥º¤ò»È¤¦¤Î¤ÏÁ°»þÂåŪ¤Ç¤¹" + +#~ msgid "cannot delete a function. Only pointer-to-objects are valid arguments to `delete'" +#~ msgstr "´Ø¿ô¤Ï delete ¤Ç¤­¤Þ¤»¤ó¡£ ¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤À¤±¤¬ `delete' °ú¿ô¤È¤·¤ÆÍ­¸ú¤Ç¤¹" + +#~ msgid "initializer invalid for static member with constructor" +#~ msgstr "¥³¥ó¥¹¥È¥é¥¯¥¿¤ÎÀÅŪ¥á¥ó¥Ð½é´ü²½»Ò¤Ï̵¸ú¤Ç¤¹" + +#~ msgid "(an out of class initialization is required)" +#~ msgstr "(¥¯¥é¥¹³°¤Ç¤Î½é´ü²½¤òɬÍפȤ·¤Þ¤¹)" + +#~ msgid "field initializer is not constant" +#~ msgstr "¥Õ¥£¡¼¥ë¥É½é´üÀßÄê»Ò¤¬Äê¿ô¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "anonymous struct not inside named type" +#~ msgstr "̵̾¹½Â¤ÂΤ¬Ì¾Á°¤Ä¤­·¿¤ÎÃæ¤Ë¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "namespace-scope anonymous aggregates must be static" +#~ msgstr "anonumous ̾Á°¶õ´Ö¤Î½¸¹çÂÎ¤Ï static ¤Ç¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó" + +#~ msgid "anonymous aggregate with no members" +#~ msgstr "̵̾¶¦ÍÑÂΤ˥á¥ó¥Ð¤¬¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "too many initialization functions required" +#~ msgstr "ɬÍפȤµ¤ì¤ë½é´ü²½´Ø¿ô¤Î¿ô¤¬Â¿¤¹¤®¤Þ¤¹" + +#~ msgid "use of old-style cast" +#~ msgstr "¸Å¤¤¥¹¥¿¥¤¥ë¤Î¥­¥ã¥¹¥È¤ò»ÈÍѤ·¤Æ¤¤¤Þ¤¹" + +#~ msgid "`%s' not supported by %s" +#~ msgstr "`%s' ¤Ï %s ¤Ç¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤»¤ó" + +#~ msgid "" +#~ msgstr "<̵̾ %s>" + +#~ msgid "(static %s for %s)" +#~ msgstr "(ÀÅŪ%s: %s ÍÑ)" + +#~ msgid "In %s `%s':" +#~ msgstr "%s Æâ¤Î `%s':" + +#~ msgid "%s: In instantiation of `%s':\n" +#~ msgstr "%s: `%s' ¤Î½é´ü²½:\n" + +#~ msgid "%s:%d: instantiated from `%s'\n" +#~ msgstr "%s:%d: `%s' ¤«¤é¼ÂÂ⽤µ¤ì¤Þ¤·¤¿\n" + +#~ msgid "%s:%d: instantiated from here\n" +#~ msgstr "%s:%d: ¤³¤³¤Ç¼ÂÂ⽤µ¤ì¤Þ¤·¤¿\n" + +#~ msgid "call to Java `catch' or `throw' with `jthrowable' undefined" +#~ msgstr "Java `catch' ¤ä `throw' ¤¬¸Æ¤Ð¤ì¤Þ¤·¤¿¤¬¡¢`jthrowable' ¤Ï̤ÄêµÁ¤Ç¤¹" + +#~ msgid "mixing C++ and Java catches in a single translation unit" +#~ msgstr "C++ ¤È Java ¤Î `catch' ¤ò°ì¤Ä¤ÎËÝÌõ¥æ¥Ë¥Ã¥È¤Ë¤Þ¤È¤á¤Þ¤¹" + +#~ msgid "(if this is not what you intended, make sure the function template has already been declared and add <> after the function name here) -Wno-non-template-friend disables this warning." +#~ msgstr "¡Ê¤â¤·¤³¤ì¤¬¤¢¤Ê¤¿¤Î°Õ¿Þ¤·¤¿¤â¤Î¤Ç¤Ê¤±¤ì¤Ð¡¢´Ø¿ô¥Æ¥ó¥×¥ì¡¼¥È¤Ï´û¤ËÀë¸ÀºÑ¤Ç¤¢¤ë»ö¤ò³Îǧ¤·¡¢¤³¤³¤Î´Ø¿ô̾¤Î¸å¤í¤Ë <> ¤òÉÕ¤±Â­¤·¤Æ¤¯¤À¤µ¤¤¡Ë -Wno-non-template-friend ¤Ç¤³¤Î·Ù¹ðɽ¼¨¤ò̵¸ú¤Ë¤·¤Þ¤¹" + +#~ msgid "argument to `%s' missing\n" +#~ msgstr "`%s' ¤Ø¤Î°ú¿ô¤ò·ç¤¤¤Æ¤¤¤Þ¤¹\n" + +#~ msgid "initializer list treated as compound expression" +#~ msgstr "½é´ü²½»Ò¥ê¥¹¥È¤ÏÊ£¹ç¼°¤È¤·¤Æ¼è¤ê°·¤ï¤ì¤Þ¤·¤¿" + +#~ msgid " will be re-ordered to match declaration order" +#~ msgstr " Àë¸À½ç¤È°ìÃפ¹¤ë¤è¤¦¤ËʤÓÂؤ¨¤é¤ì¤Þ¤¹" + +#~ msgid " will be re-ordered to match inheritance order" +#~ msgstr " ÇÉÀ¸½ç¤È°ìÃפ¹¤ë¤è¤¦¤ËʤÙÂؤ¨¤é¤ì¤Þ¤¹" + +#~ msgid "base class initializer specified, but no base class to initialize" +#~ msgstr "´ðÄ쥯¥é¥¹½é´üÀßÄê»Ò¤¬»ØÄꤵ¤ì¤Þ¤·¤¿¤¬¡¢½é´ü²½¤¹¤Ù¤­´ðÄ쥯¥é¥¹¤¬¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "initializer for unnamed base class ambiguous" +#~ msgstr "̵̾´ðÄ쥯¥é¥¹¤Î½é´üÀßÄê»Ò¤¬Û£Ëæ¤Ç¤¹" + +#~ msgid "no base class to initialize" +#~ msgstr "½é´ü²½¤¹¤Ù¤­´ðÄ쥯¥é¥¹¤¬¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "object missing in use of pointer-to-member construct" +#~ msgstr "¥á¥ó¥Ð¤Ø¤Î¥Ý¥¤¥ó¥¿¹½ÃۤλÈÍѤǥª¥Ö¥¸¥§¥¯¥È¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "at this point in file" +#~ msgstr "¥Õ¥¡¥¤¥ë¤Î¤³¤Î°ÌÃÖ" + +#~ msgid "new of array type fails to specify size" +#~ msgstr "ÇÛÎ󷿤Πnew ¤Ï¥µ¥¤¥º¤Î»ØÄê¤Ë¼ºÇÔ¤·¤Þ¤¹" + +#~ msgid "size in array new must have integral type" +#~ msgstr "ÇÛÎó new ¤Ç¤Î¥µ¥¤¥º¤Ï´°Á´¤Ê·¿¤ò»ý¤¿¤Í¤Ð¤Ê¤ê¤Þ¤»¤ó" + +#~ msgid "zero size array reserves no space" +#~ msgstr "¥µ¥¤¥º¥¼¥í¤ÎÇÛÎó¤Ï¶õ´Ö¤ò³ÎÊݤ·¤Þ¤»¤ó" + +#~ msgid "new cannot be applied to a reference type" +#~ msgstr "»²¾È·¿¤ËÂФ·¤Æ new ¤òŬÍѤǤ­¤Þ¤»¤ó" + +#~ msgid "new cannot be applied to a function type" +#~ msgstr "´Ø¿ô·¿¤ËÂФ·¤Æ new ¤òŬÍѤǤ­¤Þ¤»¤ó" + +#~ msgid "call to Java constructor, while `jclass' undefined" +#~ msgstr "Java ¥³¥ó¥¹¥È¥é¥¯¥¿¤¬¸Æ¤Ð¤ì¤Þ¤·¤¿¤¬¡¢`jclass' ¤Ï̤ÄêµÁ¤Ç¤¹" + +#~ msgid "Can't find class$" +#~ msgstr "class$ ¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó" + +#~ msgid "invalid type `void' for new" +#~ msgstr "new ¤ËÂФ·¤Æ̵¸ú¤Ê·¿¤Ç¤¢¤ë `void'" + +#~ msgid "call to Java constructor with `%s' undefined" +#~ msgstr "Java ¥³¥ó¥¹¥È¥é¥¯¥¿¤¬¸Æ¤Ð¤ì¤Þ¤·¤¿¤¬¡¢`%s' ¤Ï̤ÄêµÁ¤Ç¤¹" + +#~ msgid "initializer list being treated as compound expression" +#~ msgstr "½é´ü²½»Ò¥ê¥¹¥È¤¬Ê£¹ç¼°¤È¤·¤Æ¼è¤ê°·¤ï¤ì¤è¤¦¤È¤·¤Æ¤¤¤Þ¤¹" + +#~ msgid "ISO C++ forbids aggregate initializer to new" +#~ msgstr "ISO C++ ¤Ï new ¤Ø¤Î½¸¹çÂνé´ü²½»Ò¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "initializer ends prematurely" +#~ msgstr "½é´üÀßÄê»Ò¤ÎËöÈø¤¬ËÜÍè¤è¤êÁ᤯½Ð¸½¤·¤Þ¤·¤¿" + +#~ msgid "cannot initialize multi-dimensional array with initializer" +#~ msgstr "¿¼¡¸µÇÛÎó¤Ï½é´ü²½»Ò¤Ç½é´ü²½¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "unknown array size in delete" +#~ msgstr "delete ¤Ç¤ÎÇÛÎó¥µ¥¤¥º¤¬ÉÔÌÀ¤Ç¤¹" + +#~ msgid "type to vector delete is neither pointer or array type" +#~ msgstr "¥Ù¥¯¥È¥ë·¿¤Î delete ¤Ç¤¹¤¬¡¢¥Ý¥¤¥ó¥¿¤Ç¤âÇÛÎ󷿤Ǥ⤢¤ê¤Þ¤»¤ó" + +#~ msgid "Do not obey access control semantics" +#~ msgstr "¥¢¥¯¥»¥¹À©¸æ¤Î°ÕÌ£¤Ë½¾¤ï¤Ê¤¤" + +#~ msgid "Change when template instances are emitted" +#~ msgstr "¥Æ¥ó¥×¥ì¡¼¥È¥¤¥ó¥¹¥¿¥ó¥¹¤¬Á÷½Ð¤µ¤ì¤¿»þ¤ËÊѹ¹¤¹¤ë" + +#~ msgid "Check the return value of new" +#~ msgstr "new ¤ÎÌá¤êÃͤò¸¡ºº¤¹¤ë" + +#~ msgid "Reduce size of object files" +#~ msgstr "¥ª¥Ö¥¸¥§¥¯¥È¥Õ¥¡¥¤¥ë¤Î¥µ¥¤¥º¤ò¾®¤µ¤¯¤¹¤ë" + +#~ msgid "Make string literals `char[]' instead of `const char[]'" +#~ msgstr "ʸ»úÎó¥ê¥Æ¥é¥ë¤ò `const char[]' ¤ÎÂå¤ï¤ê¤Ë `char[]' ¤È¤¹¤ë" + +#~ msgid "Dump the entire translation unit to a file" +#~ msgstr "ËÝÌõñ°ÌÁ´ÂΤò¥Õ¥¡¥¤¥ë¤Ë¥À¥ó¥×¤¹¤ë" + +#~ msgid "Do not inline member functions by default" +#~ msgstr "¥á¥ó¥Ð´Ø¿ô¤ò¥Ç¥Õ¥©¥ë¥È¤Ç¥¤¥ó¥é¥¤¥ó¤È¤·¤Ê¤¤" + +#~ msgid "Do not generate run time type descriptor information" +#~ msgstr "¼Â¹Ô»þ·¿µ­½Ò¾ðÊó¤òÀ¸À®¤·¤Ê¤¤" + +#~ msgid "Do not generate code to check exception specifications" +#~ msgstr "Îã³°»ÅÍͤθ¡ºº¤ò¤¹¤ë¥³¡¼¥É¤òÀ¸À®¤·¤Ê¤¤" + +#~ msgid "Scope of for-init-statement vars extends outside" +#~ msgstr "for ½é´ü²½Ê¸¤ÎÊÑ¿ô¤ò¥¹¥³¡¼¥×³°¤Ë³ÈÂ礹¤ë" + +#~ msgid "Do not recognise GNU defined keywords" +#~ msgstr "GNU ÄêµÁ¤ÎͽÌó¸ì¤òǧ¼±¤µ¤»¤Ê¤¤" + +#~ msgid "Do not treat the namespace `std' as a normal namespace" +#~ msgstr "̾Á°¶õ´Ö `std' ¤òÄ̾ï¤Î̾Á°¶õ´Ö¤È¤·¤Æ¼è¤ê°·¤ï¤Ê¤¤" + +#~ msgid "Enable support for huge objects" +#~ msgstr "Â礭¤Ê¥ª¥Ö¥¸¥§¥¯¥È¤Î¥µ¥Ý¡¼¥È" + +#~ msgid "Export functions even if they can be inlined" +#~ msgstr "¥¤¥ó¥é¥¤¥ó¤Ë¤Ç¤­¤ë´Ø¿ô¤Ç¤â export ¤¹¤ë" + +#~ msgid "Only emit explicit template instatiations" +#~ msgstr "ÌÀ¼¨Åª¤Ê¥Æ¥ó¥×¥ì¡¼¥È¼ÂÂβ½¤Î¤ß¤òÀ¸À®¤¹¤ë" + +#~ msgid "Only emit explicit instatiations of inline templates" +#~ msgstr "¥¤¥ó¥é¥¤¥ó¥Æ¥ó¥×¥ì¡¼¥È¤ÎÌÀ¼¨Åª¤Ê¼ÂÂβ½¤Î¤ß¤òÀ¸À®¤¹¤ë" + +#~ msgid "Don't pedwarn about uses of Microsoft extensions" +#~ msgstr "Microsoft ³ÈÄ¥¤ÎÍøÍѤ˴ؤ·¤Æ pedantic ·Ù¹ð¤ò¹Ô¤ï¤Ê¤¤" + +#~ msgid "Recognise and/bitand/bitor/compl/not/or/xor" +#~ msgstr "and/bitand/bitor/compl/not/or/xor ¤òǧ¼±¤¹¤ë" + +#~ msgid "Disable optional diagnostics" +#~ msgstr "¥ª¥×¥·¥ç¥ó¤Î¿ÇÃÇ¥á¥Ã¥»¡¼¥¸¤òɽ¼¨¤·¤Ê¤¤" + +#~ msgid "Downgrade conformance errors to warnings" +#~ msgstr "µ¬³ÊŬ¹çÀ­¥¨¥é¡¼¤ò·Ù¹ð¤Ë³Ê²¼¤²¤¹¤ë" + +#~ msgid "Enable automatic template instantiation" +#~ msgstr "¼«Æ°¥Æ¥ó¥×¥ì¡¼¥È¼ÂÂ⽤òÍ­¸ú¤Ë¤¹¤ë" + +#~ msgid "Display statistics accumulated during compilation" +#~ msgstr "¥³¥ó¥Ñ¥¤¥ëÃæ¤ËÃßÀѤµ¤ì¤¿Åý·×¾ðÊó¤òɽ¼¨¤¹¤ë" + +#~ msgid "Specify maximum template instantiation depth" +#~ msgstr "¥Æ¥ó¥×¥ì¡¼¥È¼ÂÂβ½¤Î¿¼¤µ¤ÎºÇÂçÃͤò»ØÄꤹ¤ë" + +#~ msgid "Use __cxa_atexit to register destructors." +#~ msgstr "¥Ç¥¹¥È¥é¥¯¥¿¤ÎÅÐÏ¿¤Ë __cxa_atexit ¤òÍøÍѤ¹¤ë" + +#~ msgid "Discard unused virtual functions" +#~ msgstr "»È¤ï¤ì¤Ê¤¤²¾ÁÛ´Ø¿ô¤òÀÚ¤ê¼Î¤Æ¤ë" + +#~ msgid "Implement vtables using thunks" +#~ msgstr "thunk ¤ò»È¤Ã¤Æ vtable ¤ò¼ÂÁõ¤¹¤ë" + +#~ msgid "Emit common-like symbols as weak symbols" +#~ msgstr "¥³¥â¥ó¥·¥ó¥Ü¥ë¤ò¥¦¥£¡¼¥¯¥·¥ó¥Ü¥ë¤ÎÍͤËÀ¸À®¤¹¤ë" + +#~ msgid "Emit cross referencing information" +#~ msgstr "Áê¸ß»²¾È¾ðÊó¤òÀ¸À®¤¹¤ë" + +#~ msgid "Warn about inconsistent return types" +#~ msgstr "Ìá¤êÃͤη¿¤È°ìÃפ·¤Ê¤¤¤â¤Î¤Ë¤Ä¤¤¤Æ·Ù¹ð¤¹¤ë" + +#~ msgid "Warn about overloaded virtual function names" +#~ msgstr "¥ª¡¼¥Ð¡¼¥í¡¼¥É¤µ¤ì¤¿²¾ÁÛ´Ø¿ô̾¤Ë¤Ä¤¤¤Æ·Ù¹ð¤¹¤ë" + +#~ msgid "Don't warn when all ctors/dtors are private" +#~ msgstr "Á´¤Æ¤Î¥³¥ó¥¹¥È¥é¥¯¥¿/¥Ç¥¹¥È¥é¥¯¥¿¤¬ private ¤Ç¤â·Ù¹ð¤·¤Ê¤¤" + +#~ msgid "Warn about non virtual destructors" +#~ msgstr "Èó²¾Áۥǥ¹¥È¥é¥¯¥¿¤Ë¤Ä¤¤¤Æ·Ù¹ð¤¹¤ë" + +#~ msgid "Warn when a function is declared extern, then inline" +#~ msgstr "´Ø¿ô¤¬ extern Àë¸À¤µ¤ì¤¿¸å¡¢inline ¤È¤µ¤ì¤¿¾ì¹ç¤Ë·Ù¹ð¤¹¤ë" + +#~ msgid "Warn when the compiler reorders code" +#~ msgstr "¥³¥ó¥Ñ¥¤¥é¤¬¥³¡¼¥É¤òʤÙÂؤ¨¤ë¤È¤­¤Ë·Ù¹ð¤¹¤ë" + +#~ msgid "Warn when synthesis behaviour differs from Cfront" +#~ msgstr "¹çÀ®¤Î¿¶¤ëÉñ¤¤¤¬ Cfront ¤È°Û¤Ê¤ë¾ì¹ç¤Ë·Ù¹ð¤¹¤ë" + +#~ msgid "Don't warn when type converting pointers to member functions" +#~ msgstr "¥Ý¥¤¥ó¥¿¤«¤é¥á¥ó¥Ð´Ø¿ô¤Ø¤Î·¿ÊÑ´¹¤Î¾ì¹ç¤Ç¤â·Ù¹ð¤·¤Ê¤¤" + +#~ msgid "Warn about violations of Effective C++ style rules" +#~ msgstr "Effective C++ ¼°¤Î»Ø¿Ë¤«¤é¤Ï¤º¤ì¤ë¤â¤Î¤Ë¤Ä¤¤¤Æ·Ù¹ð¤¹¤ë" + +#~ msgid "Warn when overload promotes from unsigned to signed" +#~ msgstr "¥ª¡¼¥Ð¡¼¥í¡¼¥É¤¬Éä¹ç̵¤·¤«¤éÉä¹çÉÕ¤­¤Ë³Ê¾å¤²¤È¤Ê¤ë¾ì¹ç¤Ë·Ù¹ð¤¹¤ë" + +#~ msgid "Warn if a C style cast is used in a program" +#~ msgstr "C ¼°¤Î¥­¥ã¥¹¥È¤¬¥×¥í¥°¥é¥à¤Ç»È¤ï¤ì¤¿¤é·Ù¹ð¤¹¤ë" + +#~ msgid "Don't warn when non-templatized friend functions are declared within a template" +#~ msgstr "template Æâ¤ÇÈó template ¤Î friend ´Ø¿ô¤¬Àë¸À¤µ¤ì¤¿¾ì¹ç¤Ç¤â·Ù¹ð¤·¤Ê¤¤" + +#~ msgid "Don't announce deprecation of compiler features" +#~ msgstr "¿ä¾©¤µ¤ì¤Ê¤¤¥³¥ó¥Ñ¥¤¥é¤Îµ¡Ç½¤ò¹ðÃΤ·¤Ê¤¤" + +#~ msgid "type name expected before `*'" +#~ msgstr "`*' ¤ÎÁ°¤Ë·¿¤Î̾Á°¤¬¤¢¤ë¤Ù¤­¤Ç¤¹" + +#~ msgid "cannot declare references to references" +#~ msgstr "»²¾È¤ò»²¾È¤È¤·¤ÆÀë¸À¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "cannot declare pointers to references" +#~ msgstr "¥Ý¥¤¥ó¥¿¤ò»²¾È¤È¤·¤ÆÀë¸À¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "type name expected before `&'" +#~ msgstr "`&' ¤ÎÁ°¤Ë·¿¤Î̾Á°¤¬¤¢¤ë¤Ù¤­¤Ç¤¹" + +#~ msgid "semicolon missing after %s declaration" +#~ msgstr "%s Àë¸À¤Î¸å¤í¤Î¥»¥ß¥³¥í¥ó¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "junk at end of #pragma %s" +#~ msgstr "#pragma %s ¤ÎËöÈø¤Ë¥´¥ß" + +#~ msgid "invalid #pragma %s" +#~ msgstr "̵¸ú¤Ê #pragma %s ¤Ç¤¹" + +#~ msgid "#pragma implementation for %s appears after file is included" +#~ msgstr "%s ¤Ø¤Î #pragma implementation ¤Ï¥Õ¥¡¥¤¥ë¤¬ include ¤µ¤ì¤¿¸å¤Ç½Ð¸½¤·¤Þ¤·¤¿" + +#~ msgid "junk at end of #pragma GCC java_exceptions" +#~ msgstr "#pragma GCC java_exceptions ¤ÎËöÈø¤Ë¥´¥ß" + +#~ msgid "(Each undeclared identifier is reported only once for each function it appears in.)" +#~ msgstr "(̤Àë¸ÀÊÑ¿ô¤Ë¤Ä¤¤¤Æ¤Ï¡¢¤½¤ì¤¬´Ø¿ôÆâ¤ÇºÇ½é¤Ë¸½¤ï¤ì¤¿»þ¤À¤±Êó¹ð¤µ¤ì¤Þ¤¹¡£)" + +#~ msgid "name lookup of `%s' changed" +#~ msgstr "`%s' ¤Î̾Á°°ú¤­¤ÏÊѹ¹¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "name lookup of `%s' changed for new ISO `for' scoping" +#~ msgstr "`%s' ¤Î̾Á°°ú¤­¤Ï¿·¤¿¤Ê ISO `for' ¥¹¥³¡¼¥×¤ËÊѤï¤ê¤Þ¤·¤¿" + +#~ msgid "real-valued template parameters when cross-compiling" +#~ msgstr "¥¯¥í¥¹¥³¥ó¥Ñ¥¤¥ë»þ¤Î¼Â¿ôÃͥƥó¥×¥ì¡¼¥È²¾°ú¿ô" + +#~ msgid "methods cannot be converted to function pointers" +#~ msgstr "¥á¥½¥Ã¥É¤Ï´Ø¿ô¥Ý¥¤¥ó¥¿¤ËÊÑ´¹¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "ambiguous request for method pointer `%s'" +#~ msgstr "¥á¥½¥Ã¥É¥Ý¥¤¥ó¥¿ `%s' ¤Ø¤ÎÍ׵᤬ۣËæ¤Ç¤¹" + +#~ msgid "invalid default template argument" +#~ msgstr "̵¸ú¤Ê¥Ç¥Õ¥©¥ë¥È¥Æ¥ó¥×¥ì¡¼¥È°ú¿ô" + +#~ msgid "no base or member initializers given following ':'" +#~ msgstr "´ðÄì¤ä¥á¥ó¥Ð½é´ü²½»Ò¥ê¥¹¥È¤¬ ':' ¤Î¸å¤Ë³¤¤¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "base initializers not allowed for non-member functions" +#~ msgstr "½é´ü²½»Ò¥ê¥¹¥È¤ÏÈó¥á¥ó¥Ð´Ø¿ô¤Ç¤Ï»È¤¨¤Þ¤»¤ó" + +#~ msgid "only constructors take base initializers" +#~ msgstr "¥³¥ó¥¹¥È¥é¥¯¥¿¤·¤«´ðÄì½é´ü²½»Ò¥ê¥¹¥È¤ò¤È¤ê¤Þ¤»¤ó" + +#~ msgid "anachronistic old style base class initializer" +#~ msgstr "Á°»þÂåŪ¤Ê¸Å¤¤¥¹¥¿¥¤¥ë¤Î´ðÄ쥯¥é¥¹½é´ü²½»Ò¤Ç¤¹" + +#~ msgid "`>>' should be `> >' in template class name" +#~ msgstr "`>>' ¤Ï¥Æ¥ó¥×¥ì¡¼¥È¥¯¥é¥¹Ì¾¤Ï `> >' ¤È¤¹¤Ù¤­¤Ç¤¹" + +#~ msgid "ISO C++ forbids an empty condition for `%s'" +#~ msgstr "ISO C++ ¤Ï `%s' ¤ËÂФ¹¤ë¶õ¤Î¾ò·ï¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "ISO C++ forbids `&&'" +#~ msgstr "ISO C++ ¤Ï `&&' ¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "ISO C++ forbids initialization of new expression with `='" +#~ msgstr "ISO C++ ¤Ï new ¼°¤Î½é´ü²½¤Ç¤Î `=' ¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "ISO C++ forbids compound literals" +#~ msgstr "ISO C++ ¤ÏÊ£¹ç¥ê¥Æ¥é¥ë¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "ISO C++ forbids braced-groups within expressions" +#~ msgstr "ISO C++ ¤Ï¥Ö¥ì¡¼¥¹¤Ç¤Þ¤È¤á¤é¤ì¤¿¼°¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "sigof type specifier" +#~ msgstr "·¿»ØÄê»Ò¤Î sigof ¤Ç¤¹" + +#~ msgid "`sigof' applied to non-aggregate expression" +#~ msgstr "È󽸹çÂμ°¤ËÂФ·¤ÆŬÍѤµ¤ì¤¿ `sigof'" + +#~ msgid "`sigof' applied to non-aggregate type" +#~ msgstr "È󽸹çÂη¿¤ËÂФ·¤ÆŬÍѤµ¤ì¤¿ `sigof'" + +#~ msgid "storage class specifier `%s' not allowed after struct or class" +#~ msgstr "µ­²±¥¯¥é¥¹»ØÄê»Ò `%s' ¤Ï struct ¤ä class ¤Î¸å¤Ë¤Ï»È¤¨¤Þ¤»¤ó" + +#~ msgid "type specifier `%s' not allowed after struct or class" +#~ msgstr "·¿»ØÄê»Ò `%s' ¤Ï struct ¤ä class ¤Î¸å¤Ë¤Ï»È¤¨¤Þ¤»¤ó" + +#~ msgid "type qualifier `%s' not allowed after struct or class" +#~ msgstr "·¿½¤¾þ»Ò `%s' ¤Ï struct ¤ä class ¤Î¸å¤Ë¤Ï»È¤¨¤Þ¤»¤ó" + +#~ msgid "no body nor ';' separates two class, struct or union declarations" +#~ msgstr "ËÜÂΤ¬¤Ê¤¯¡¢class, struct °¿¤¤¤Ï union Àë¸À¤ò¶èÀÚ¤ë ';' ¤â¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "multiple access specifiers" +#~ msgstr "½ÅÊ£¤¹¤ë¥¢¥¯¥»¥¹»ØÄê»Ò" + +#~ msgid "multiple `virtual' specifiers" +#~ msgstr "½ÅÊ£¤¹¤ë `virtual' »ØÄê»Ò" + +#~ msgid "missing ';' before right brace" +#~ msgstr "±¦Â¦¥Ö¥ì¡¼¥¹¤ÎÁ°¤Î ';' ¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "ISO C++ forbids array dimensions with parenthesized type in new" +#~ msgstr "ISO C++ ¤Ï new Ãæ¤Ç¤Ï¡¢³ç¸Ì¤Î¤Ä¤¤¤¿ÇÛÎ󼡸µ¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "ISO C++ forbids label declarations" +#~ msgstr "ISO C++ ¤Ï¥é¥Ù¥ëÀë¸À¤ò¶Ø¤¸¤Æ¤¤¤Þ¤¹" + +#~ msgid "ISO C++ forbids computed gotos" +#~ msgstr "ISO C++ ¤Ï·×»»·¿ goto ¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "label must be followed by statement" +#~ msgstr "¥é¥Ù¥ë¤Î¸å¤í¤Ë¤Ïʸ¤¬É¬ÍפǤ¹" + +#~ msgid "ISO C++ forbids compound statements inside for initializations" +#~ msgstr "ISO C++ ½é´ü²½»Ò¤ÎÆâÉô¤Ç¤Ïʣʸ¤¬¶Ø¤¸¤é¤ì¤Æ¤¤¤Þ¤¹" + +#~ msgid "possibly missing ')'" +#~ msgstr "¤ª¤½¤é¤¯ ')' ¤ò˺¤ì¤Æ¤¤¤Þ¤¹" + +#~ msgid "type specifier omitted for parameter" +#~ msgstr "·¿»ØÄê»Ò¤Ï²¾°ú¿ôÍѤ˾Êά¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "creating array with size zero" +#~ msgstr "Â礭¤µ¥¼¥í¤ÎÇÛÎó¤òºî¤í¤¦¤È¤·¤Æ¤¤¤Þ¤¹" + +#~ msgid "use of `%s' in template" +#~ msgstr "¥Æ¥ó¥×¥ì¡¼¥ÈÆâ¤Ç `%s' ¤ò»ÈÍѤ·¤Æ¤¤¤Þ¤¹" + +#~ msgid "incomplete type unification" +#~ msgstr "ÉÔ´°Á´¤Ê·¿¤Îñ°ì²½" + +#~ msgid "use of `%s' in template type unification" +#~ msgstr "¥Æ¥ó¥×¥ì¡¼¥È·¿Åý°ìÃæ `%s' ¤¬»ÈÍѤµ¤ì¤Þ¤·¤¿" + +#~ msgid "-frepo must be used with -c" +#~ msgstr "-frepo ¤Ï -c ÉÕ¤­¤Ç¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó" + +#~ msgid "mysterious repository information in %s" +#~ msgstr "%s ¤ËÉԲIJò¤Ê¥ê¥Ý¥¸¥È¥ê¾ðÊ󤬤¢¤ê¤Þ¤¹" + +#~ msgid "can't create repository information file `%s'" +#~ msgstr "¥Õ¥¡¥¤¥ë `%s' ¤Ë¥ê¥Ý¥¸¥È¥ê¾ðÊó¤òºîÀ®¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "taking dynamic typeid of object with -fno-rtti" +#~ msgstr "-fno-rtti ¤Î»ØÄê¤È°ì½ï¤Ë¥ª¥Ö¥¸¥§¥¯¥È¤ÎưŪ typeid ¤ò¼è¤í¤¦¤È¤·¤Æ¤¤¤Þ¤¹" + +#~ msgid "cannot use typeid with -fno-rtti" +#~ msgstr "-fno-rtti ¤¬»ØÄꤵ¤ì¤ë¤È typeid ¤ò»È¤¨¤Þ¤»¤ó" + +#~ msgid "must #include before using typeid" +#~ msgstr "typeid ¤ò»È¤¦Á°¤Ë #include ¤È¤·¤Ê¤¤¤È¤¤¤±¤Þ¤»¤ó" + +#~ msgid "adjusting pointers for covariant returns" +#~ msgstr "¶¦ÊÑ(covariant)Ìá¤êÃͤؤΥݥ¤¥ó¥¿¤òÄ´À°¤·¤Þ¤¹" + +#~ msgid "recoverable compiler error, fixups for virtual function" +#~ msgstr "²óÉü²Äǽ¤Ê¥³¥ó¥Ñ¥¤¥é¤Î¥¨¥é¡¼¡¢²¾ÁÛ´Ø¿ô¤Î½¤Àµ" + +#~ msgid "ISO C++ does not permit named return values" +#~ msgstr "ISO C++ ¤Ï̾Á°¤Ä¤­Ìá¤êÃͤòµö²Ä¤·¤Þ¤»¤ó" + +#~ msgid "can't redefine default return value for constructors" +#~ msgstr "¥³¥ó¥¹¥È¥é¥¯¥¿ÍѤΥǥե©¥ë¥ÈÌá¤êÃͤòºÆÄêµÁ¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó" + +#~ msgid " will be re-ordered to precede member initializations" +#~ msgstr " Àè¤Ë¤¢¤ë¥á¥ó¥Ð½é´ü²½»Ò¤ÈʤÓÂؤ¨¤é¤ì¤Þ¤¹" + +#~ msgid "`this' is unavailable for static member functions" +#~ msgstr "`this' ¤ÏÀÅŪ¥á¥ó¥Ð´Ø¿ô¤«¤é»ÈÍѤǤ­¤Þ¤»¤ó" + +#~ msgid "invalid use of `this' in non-member function" +#~ msgstr "Èó¥á¥ó¥Ð´Ø¿ô¤Ç¤Î `this' ¤Î»ÈÍѤÏ̵¸ú¤Ç¤¹" + +#~ msgid "invalid use of `this' at top level" +#~ msgstr "¥È¥Ã¥×¥ì¥Ù¥ë¤Ç¤Î `this' ¤Î»ÈÍѤÏ̵¸ú¤Ç¤¹" + +#~ msgid "template type parameters must use the keyword `class' or `typename'" +#~ msgstr "¥Æ¥ó¥×¥ì¡¼¥È·¿²¾°ú¿ô¤Ë¤Ï `class' ¤ä `typename' ͽÌó¸ì¤ò»È¤ï¤Í¤Ð¤Ê¤ê¤Þ¤»¤ó" + +#~ msgid "identifier name `%s' conflicts with GNU C++ internal naming strategy" +#~ msgstr "¼±ÊÌ»Ò̾ `%s' ¤Ï GNU C++ ÆâÉô¤Î¥Í¡¼¥ß¥ó¥°Àïά¤È¶¥¹ç¤·¤Þ¤¹" + +#~ msgid "parse error" +#~ msgstr "¹½Ê¸²òÀÏ¥¨¥é¡¼" + +#~ msgid "parse error at end of saved function text" +#~ msgstr "ÊݸºÑ¤ß´Ø¿ô¥Æ¥­¥¹¥È¤ÎËöÈø¤Ç¹½Ê¸²òÀÏ¥¨¥é¡¼" + +#~ msgid "parse error in method specification" +#~ msgstr "¥á¥½¥Ã¥É»ÅÍÍÆâ¤Ç¤Î¹½Ê¸²òÀÏ¥¨¥é¡¼" + +#~ msgid "function body for constructor missing" +#~ msgstr "¥³¥ó¥¹¥È¥é¥¯¥¿¤Î´Ø¿ôËÜÂΤò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "%s before `%s'" +#~ msgstr "%s ¤¬ `%s' ¤ÎÁ°¤Ë¤¢¤ê¤Þ¤¹" + +#~ msgid "%s before `%c'" +#~ msgstr "%s ¤¬ `%c' ¤ÎÁ°¤Ë¤¢¤ê¤Þ¤¹" + +#~ msgid "%s before `\\%o'" +#~ msgstr "%s ¤¬ `\\%o' ¤ÎÁ°¤Ë¤¢¤ê¤Þ¤¹" + +#~ msgid "%s before `%s' token" +#~ msgstr "%s ¤¬ `%s' ¥È¡¼¥¯¥ó¤ÎÁ°¤Ë¤¢¤ê¤Þ¤¹" + +#~ msgid "non-lvalue in %s" +#~ msgstr "%s ¤Ëº¸ÊÕÃͤǤϤʤ¤ÃÍ" + +#~ msgid "`java_interface' attribute can only be applied to Java class definitions" +#~ msgstr "`java_interface' °À­¤Ï Java ¥¯¥é¥¹ÄêµÁ¤ËÂФ·¤Æ¤Î¤ßÍѤ¤¤ë»ö¤¬¤Ç¤­¤Þ¤¹" + +#~ msgid "`com_interface' only supported with -fvtable-thunks" +#~ msgstr "`com_interface' ¤Ï -fvtable-thunks ¤ò»ØÄꤷ¤¿¤È¤­¤À¤±¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤¹" + +#~ msgid "`com_interface' attribute can only be applied to class definitions" +#~ msgstr "`com_interface' °À­¤Ï¥¯¥é¥¹ÄêµÁ¤Ë¤Î¤ßÍѤ¤¤ë»ö¤¬¤Ç¤­¤Þ¤¹" + +#~ msgid "requested init_priority is not an integer constant" +#~ msgstr "Í׵ᤵ¤ì¤¿ init_priority ¤ÏÀ°¿ô·¿¤ÎÄê¿ô¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "can only use init_priority attribute on file-scope definitions of objects of class type" +#~ msgstr "init_priority °À­¤Ï¥¯¥é¥¹·¿¥ª¥Ö¥¸¥§¥¯¥È¤Î¥Õ¥¡¥¤¥ë¥¹¥³¡¼¥×ÄêµÁ¤Ç¤Î¤ß»È¤¨¤Þ¤¹" + +#~ msgid "requested init_priority is out of range" +#~ msgstr "Í׵ᤵ¤ì¤¿ init_priority ¤¬Èϰϳ°¤Ç¤¹" + +#~ msgid "requested init_priority is reserved for internal use" +#~ msgstr "Í׵ᤵ¤ì¤¿ init_priority ¤ÏÆâÉô¤Ç»ÈÍѤ¹¤ë¤¿¤á¤ËͽÌ󤵤ì¤Æ¤¤¤Þ¤¹" + +#~ msgid "init_priority attribute is not supported on this platform" +#~ msgstr "init_priority °À­¤Ï¤³¤Î¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ç¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "ISO C++ forbids %s between pointer of type `void *' and pointer-to-function" +#~ msgstr "ISO C++ ¤Ï `void *' ·¿¥Ý¥¤¥ó¥¿¤È´Ø¿ô¥Ý¥¤¥ó¥¿¤È¤Î %s ¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "ISO C++ forbids applying `sizeof' to a function type" +#~ msgstr "ISO C++ ¤Ï´Ø¿ô·¿¤Ø¤Î `sizeof' ¤ÎŬÍѤò¶Ø¤¸¤Þ¤¹" + +#~ msgid "ISO C++ forbids applying `sizeof' to a member function" +#~ msgstr "ISO C++ ¤Ï¥á¥ó¥Ð´Ø¿ô¤Ø¤Î `sizeof' ¤ÎŬÍѤò¶Ø¤¸¤Þ¤¹" + +#~ msgid "ISO C++ forbids applying `sizeof' to type `void' which is an incomplete type" +#~ msgstr "ISO C++ ¤ÏÉÔ´°Á´·¿¤Ç¤¢¤ë `void' ·¿¤Ø¤Î `sizeof' ¤ÎŬÍѤò¶Ø¤¸¤Þ¤¹" + +#~ msgid "sizeof applied to a bit-field" +#~ msgstr "sizeof ¤¬¥Ó¥Ã¥È¥Õ¥£¡¼¥ë¥É¤ËŬÍѤµ¤ì¤Þ¤·¤¿" + +#~ msgid "ISO C++ forbids applying `sizeof' to an expression of function type" +#~ msgstr "ISO C++ ¤Ï´Ø¿ô·¿¤Î¼°¤Ø¤Î `sizeof' ¤ÎŬÍѤò¶Ø¤¸¤Þ¤¹" + +#~ msgid "invalid reference to NULL ptr, use ptr-to-member instead" +#~ msgstr "NULL ¥Ý¥¤¥ó¥¿¤Ø¤Î̵¸ú¤Ê»²¾È¡¢Âå¤ï¤ê¤Ë¥á¥ó¥Ð¤Ø¤Î¥Ý¥¤¥ó¥¿¤ò»È¤¤¤Þ¤·¤ç¤¦" + +#~ msgid "invalid use of `%s' on pointer to member" +#~ msgstr "¥á¥ó¥Ð¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤Î̵¸ú¤Ê `%s' ¤Î»ÈÍÑ" + +#~ msgid "invalid type argument" +#~ msgstr "̵¸ú¤Ê·¿°ú¿ô¤Ç¤¹" + +#~ msgid "ISO C++ forbids subscripting non-lvalue array" +#~ msgstr "ISO C++ ¤Ïº¸ÊÕÃͤǤϤʤ¤ÇÛÎó¤Îź»ú¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "subscripting array declared `register'" +#~ msgstr "`register' ¤ÈÀë¸À¤µ¤ì¤¿ÇÛÎó¤Ëź»ú¤ò¤Ä¤±¤è¤¦¤È¤·¤Æ¤¤¤Þ¤¹" + +#~ msgid "pointer to member function called, but not in class scope" +#~ msgstr "¥á¥ó¥Ð´Ø¿ô¤Ø¤Î¥Ý¥¤¥ó¥¿¤¬¸Æ¤Ð¤ì¤Þ¤·¤¿¤¬¡¢¥¯¥é¥¹¥¹¥³¡¼¥×Æâ¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "invalid call to member function needing `this' in static member function scope" +#~ msgstr "ÀÅŪ¥á¥ó¥Ð´Ø¿ô¥¹¥³¡¼¥×Æâ¤Ç¤Ï `this' ¤òÍפ¹¤ë¥á¥ó¥Ð´Ø¿ô¤Î¸Æ¤Ó½Ð¤·¤Ï̵¸ú¤Ç¤¹" + +#~ msgid "ISO C++ forbids calling `::main' from within program" +#~ msgstr "ISO C++ ¤Ï¥×¥í¥°¥é¥à¤ÎÃ椫¤é `::main' ¤ò¸Æ¤Ó½Ð¤¹¤³¤È¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "parameter type of called function is incomplete" +#~ msgstr "¸Æ¤Ð¤ì¤¿´Ø¿ô¤Î²¾°ú¿ô¤Î·¿¤¬ÉÔ´°Á´¤Ç¤¹" + +#~ msgid "%s rotate count is negative" +#~ msgstr "%s ¥í¡¼¥Æ¡¼¥È²ó¿ô¤¬Éé¤ÎÃͤǤ¹" + +#~ msgid "%s rotate count >= width of type" +#~ msgstr "%s ¥í¡¼¥Æ¡¼¥È²ó¿ô >= ·¿¤ÎÉý¤Ç¤¹" + +#~ msgid "ISO C++ forbids comparison between pointer and integer" +#~ msgstr "ISO C++ ¤Ï¥Ý¥¤¥ó¥¿¤ÈÀ°¿ô¤È¤ÎÈæ³Ó¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "comparison between signed and unsigned integer expressions" +#~ msgstr "Éä¹çÉÕ¤­¤ÈÉä¹ç̵¤·¤ÎÀ°¿ô¼°Æ±»Î¤ÎÈæ³Ó¤Ç¤¹" + +#~ msgid "ISO C++ forbids using pointer of type `void *' in pointer arithmetic" +#~ msgstr "ISO C++ ¤Ï¥Ý¥¤¥ó¥¿·×»»¤Ë `void *' ·¿¤Î¥Ý¥¤¥ó¥¿¤ò»È¤¦¤³¤È¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "ISO C++ forbids using a pointer-to-function in pointer arithmetic" +#~ msgstr "ISO C++ ¤Ï¥Ý¥¤¥ó¥¿·×»»¤Ë´Ø¿ô¤Ø¤Î¥Ý¥¤¥ó¥¿¤ò»È¤¦¤³¤È¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "ISO C++ forbids using a pointer to member function in pointer arithmetic" +#~ msgstr "ISO C++ ¤Ï¥Ý¥¤¥ó¥¿·×»»¤Ë¥á¥ó¥Ð´Ø¿ô¤Ø¤Î¥Ý¥¤¥ó¥¿¤ò»È¤¦¤³¤È¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "ISO C++ forbids using pointer to a member in pointer arithmetic" +#~ msgstr "ISO C++ ¤Ï¥Ý¥¤¥ó¥¿·×»»¤Ë¥á¥ó¥Ð¤Ø¤Î¥Ý¥¤¥ó¥¿¤ò»È¤¦¤³¤È¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "ISO C++ forbids using pointer of type `void *' in subtraction" +#~ msgstr "ISO C++ ¤Ï¸º»»¤Ë `void *' ·¿¤Î¥Ý¥¤¥ó¥¿¤ò»È¤¦¤³¤È¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "ISO C++ forbids using pointer to a function in subtraction" +#~ msgstr "ISO C++ ¤Ï¸º»»¤Ë´Ø¿ô¤Ø¤Î¥Ý¥¤¥ó¥¿¤ò»È¤¦¤³¤È¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "ISO C++ forbids using pointer to a method in subtraction" +#~ msgstr "ISO C++ ¤Ï¸º»»¤Ë¥á¥½¥Ã¥É¤Ø¤Î¥Ý¥¤¥ó¥¿¤ò»È¤¦¤³¤È¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "ISO C++ forbids using pointer to a member in subtraction" +#~ msgstr "ISO C++ ¤Ï¸º»»¤Ë¥á¥ó¥Ð¤Ø¤Î¥Ý¥¤¥ó¥¿¤ò»È¤¦¤³¤È¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "invalid use of a pointer to an incomplete type in pointer arithmetic" +#~ msgstr "¥Ý¥¤¥ó¥¿±é»»¤ÇÉÔ´°Á´·¿¤Ø¤Î¥Ý¥¤¥ó¥¿¤ò»È¤¦¤³¤È¤Ï̵¸ú¤Ç¤¹" + +#~ msgid "taking address of temporary" +#~ msgstr "°ì»þ¥ª¥Ö¥¸¥§¥¯¥È¤Î¥¢¥É¥ì¥¹¤ò¼è¤í¤¦¤È¤·¤Æ¤¤¤Þ¤¹" + +#~ msgid "ISO C++ forbids %sing an enum" +#~ msgstr "ISO C++ ¤Ï enum ¤Î %s ¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "cast to non-reference type used as lvalue" +#~ msgstr "º¸ÊÕÃͤȤ·¤Æ»È¤ï¤ì¤ëÈ󻲾ȷ¿¤Ø¤Î¥­¥ã¥¹¥È¤Ç¤¹" + +#~ msgid "ISO C++ forbids taking address of function `::main'" +#~ msgstr "ISO C++ ¤Ï `::main' ´Ø¿ô¤Î¥¢¥É¥ì¥¹¤ò¼è¤ë¤³¤È¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "ISO C++ forbids taking the address of a cast to a non-lvalue expression" +#~ msgstr "ISO C++ ¤ÏÈóº¸ÊÕÃͼ°¤Ø¤Î¥­¥ã¥¹¥È¤Î¥¢¥É¥ì¥¹¤ò¼è¤ë¤³¤È¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "unary `&'" +#~ msgstr "ñ¹à¤Î `&'" + +#~ msgid "cannot take the address of `this', which is an rvalue expression" +#~ msgstr "`this' ¤Ï±¦ÊÕÃͼ°¤Ç¤¢¤ê¡¢¤½¤Î¥¢¥É¥ì¥¹¤ò¼è¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "ISO C++ forbids casting between pointer-to-function and pointer-to-object" +#~ msgstr "ISO C++ ¤Ï´Ø¿ô¥Ý¥¤¥ó¥¿¤È¥ª¥Ö¥¸¥§¥¯¥È¥Ý¥¤¥ó¥¿¤Î´Ö¤Ç¤Î¥­¥ã¥¹¥È¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "ISO C++ forbids cast to non-reference type used as lvalue" +#~ msgstr "ISO C++ ¤Ïº¸ÊÕÃͤȤ·¤Æ»È¤ï¤ì¤ëÈ󻲾ȷ¿¤Ø¤Î¥­¥ã¥¹¥È¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "ISO C++ forbids assignment of arrays" +#~ msgstr "ISO C++ ¤ÏÇÛÎó¤ÎÂåÆþ¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "return value from function receives multiple initializations" +#~ msgstr "´Ø¿ô¤«¤é¤ÎÌá¤êÃͤ¬Ê£¿ô¤Î½é´ü²½¤ò¼õ¤±¼è¤ê¤Þ¤·¤¿" + +#~ msgid " in pointer to member function conversion" +#~ msgstr " ¥Ý¥¤¥ó¥¿¤«¤é¥á¥ó¥Ð´Ø¿ô¤Ø¤ÎÊÑ´¹¤Ç" + +#~ msgid " in pointer to member conversion" +#~ msgstr " ¥Ý¥¤¥ó¥¿¤«¤é¥á¥ó¥Ð¤Ø¤ÎÊÑ´¹¤Ç" + +#~ msgid "returning reference to temporary" +#~ msgstr "°ì»þ¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î»²¾È¤òÊÖ¤½¤¦¤È¤·¤Æ¤¤¤Þ¤¹" + +#~ msgid "reference to non-lvalue returned" +#~ msgstr "Èóº¸ÊÕÃͤؤλ²¾È¤¬ÊÖ¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "returning a value from a destructor" +#~ msgstr "¥Ç¥¹¥È¥é¥¯¥¿¤«¤éÃͤòÊÖ¤½¤¦¤È¤·¤Æ¤¤¤Þ¤¹" + +#~ msgid "cannot return from a handler of a function-try-block of a constructor" +#~ msgstr "¥³¥ó¥¹¥È¥é¥¯¥¿¤Î´Ø¿ô try ¥Ö¥í¥Ã¥¯¤Î¥Ï¥ó¥É¥é¤«¤é¤Ï return ¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "returning a value from a constructor" +#~ msgstr "¥³¥ó¥¹¥È¥é¥¯¥¿¤«¤éÃͤòÊÖ¤½¤¦¤È¤·¤Æ¤¤¤Þ¤¹" + +#~ msgid "return-statement with no value, in function declared with a non-void return type" +#~ msgstr "return ʸ¤¬Ãͤò»ý¤Á¤Þ¤»¤ó¡£´Ø¿ôÀë¸À¤Ç¤ÏÈó void ¤ÎÌá¤êÃͤò»ý¤Á¤Þ¤¹" + +#~ msgid "return-statement with a value, in function declared with a void return type" +#~ msgstr "return ʸ¤¬Ãͤò»ý¤Á¤Þ¤¹¡£´Ø¿ôÀë¸À¤Ç¤ÏÌá¤ê·¿¤¬ void ¤È¤Ê¤Ã¤Æ¤¤¤Þ¤¹" + +#~ msgid " because the following virtual functions are abstract:" +#~ msgstr " °Ê²¼¤Î²¾ÁÛ´Ø¿ô¤¬Ãê¾Ý¤Ç¤¢¤ë¤¿¤á¤Ç¤¹:" + +#~ msgid "Internal error #%d." +#~ msgstr "ÆâÉô¥¨¥é¡¼: #%d¡£" + +#~ msgid "due to the presence of a constructor" +#~ msgstr "¥³¥ó¥¹¥È¥é¥¯¥¿¤¬¤¢¤ë¤³¤È¤Ë¤è¤ë" + +#~ msgid "comma expression used to initialize return value" +#~ msgstr "¥«¥ó¥Þ±é»»»Ò¤¬Ìá¤êÃͤò½é´ü²½¤¹¤ë¤¿¤á¤Ë»È¤ï¤ì¤Þ¤·¤¿" + +#~ msgid "cannot initialize arrays using this syntax" +#~ msgstr "¤³¤Îʸˡ¤ò»È¤Ã¤ÆÇÛÎó¤ò½é´ü²½¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "ANSI C++ forbids non-constant aggregate initializer expressions" +#~ msgstr "ANSI C++ ¤ÏÄê¿ô¤Ç¤Ê¤¤½¸¹çÂΤνé´ü²½»Ò¼°¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "initializing array with parameter list" +#~ msgstr "ÇÛÎó¤ò²¾°ú¿ô¥ê¥¹¥È¤Ë¤è¤Ã¤Æ½é´ü²½¤·¤è¤¦¤È¤·¤Æ¤¤¤Þ¤¹" + +#~ msgid "initializer for scalar variable requires one element" +#~ msgstr "¥¹¥«¥é¡¼ÊÑ¿ô¤Î½é´ü²½»Ò¤Ï°ì¤Ä¤ÎÍ×ÁǤòÍ׵ᤷ¤Þ¤¹" + +#~ msgid "aggregate has a partly bracketed initializer" +#~ msgstr "½¸¹çÂΤ¬ÉôʬŪ¤Ë¥Ö¥é¥±¥Ã¥È¤Î½é´ü²½»Ò¤ò»ý¤Á¤Þ¤¹" + +#~ msgid "non-trivial labeled initializers" +#~ msgstr "¼«ÌÀ¤Ç¤Ê¤¤¥é¥Ù¥ë¤Î¤Ä¤¤¤¿½é´ü²½»Ò¤Ç¤¹" + +#~ msgid "non-empty initializer for array of empty elements" +#~ msgstr "Í×ÁǤΤʤ¤ÇÛÎó¤ËÂФ¹¤ë¡¢¶õ¤Ç¤Ï¤Ê¤¤½é´ü²½»Ò¤Ç¤¹" + +#~ msgid "initializer list for object of class with virtual base classes" +#~ msgstr "²¾ÁÛ´ðÄ쥯¥é¥¹¤ò»ý¤Ä¥¯¥é¥¹¤Î¥ª¥Ö¥¸¥§¥¯¥ÈÍѤνé´ü²½»Ò¥ê¥¹¥È¤Ç¤¹" + +#~ msgid "initializer list for object of class with base classes" +#~ msgstr "´ðÄ쥯¥é¥¹¤ò»ý¤Ä¥¯¥é¥¹¤Î¥ª¥Ö¥¸¥§¥¯¥ÈÍѤνé´ü²½»Ò¥ê¥¹¥È¤Ç¤¹" + +#~ msgid "initializer list for object using virtual functions" +#~ msgstr "²¾ÁÛ´Ø¿ô¤ò»ÈÍѤ¹¤ë¥ª¥Ö¥¸¥§¥¯¥ÈÍѤνé´ü²½»Ò¥ê¥¹¥È¤Ç¤¹" + +#~ msgid "index value instead of field name in union initializer" +#~ msgstr "union ½é´ü²½»Ò¤¬¥Õ¥£¡¼¥ë¥É̾¤Ç¤Ï¤Ê¤¯¥¤¥ó¥Ç¥Ã¥¯¥¹ÃͤˤʤäƤ¤¤Þ¤¹" + +#~ msgid "excess elements in aggregate initializer" +#~ msgstr "½¸¹çÂνé´ü²½»ÒÆâ¤Ç¤½¤ÎÍ×ÁǤ¬°î¤ì¤Þ¤·¤¿" + +#~ msgid "circular pointer delegation detected" +#~ msgstr "½Û´Ä¥Ý¥¤¥ó¥¿¤ÎÂåɽ¤ò¸¡½Ð¤·¤Þ¤·¤¿" + +#~ msgid "result of `operator->()' yields non-pointer result" +#~ msgstr "`operator->()'¤Î·ë²Ì¤¬Èó¥Ý¥¤¥ó¥¿¤Î·ë²Ì¤ò¤â¤¿¤é¤·¤Þ¤¹" + +#~ msgid "base operand of `->' is not a pointer" +#~ msgstr "`->' ¤Î¥Ù¡¼¥¹¥ª¥Ú¥é¥ó¥É¤¬¥Ý¥¤¥ó¥¿¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "ISO C++ forbids defining types within %s" +#~ msgstr "ISO C++ ¤Ï %s Ãæ¤Î·¿ÄêµÁ¤ò¶Ø¤¸¤Þ¤¹" + +#~ msgid "Can't create cross-reference file `%s'" +#~ msgstr "Áê¸ß»²¾È¥Õ¥¡¥¤¥ë `%s' ¤òºî¤ë¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "traditional C rejects the `U' suffix" +#~ msgstr "¸Å¤¤ C ¤Ç¤Ï `U' ÀÜÈø¼­¤¬µñÀ䤵¤ì¤Þ¤¹" + +#~ msgid "too many 'l' suffixes in integer constant" +#~ msgstr "À°¿ôÄê¿ô¤Î¥µ¥Õ¥£¥Ã¥¯¥¹ 'l' ¤¬Â¿¤¹¤®¤Þ¤¹" + +#~ msgid "integer constant contains digits beyond the radix" +#~ msgstr "À°¿ôÄê¿ô¤¬´ð¿ô¤òĶ¤¨¤¿¿ôÃͤò´Þ¤ó¤Ç¤¤¤Þ¤¹" + +#~ msgid "integer constant out of range" +#~ msgstr "À°¿ôÄê¿ô¤¬ÈϰϤò³°¤ì¤Æ¤¤¤Þ¤¹" + +#~ msgid "\"defined\" operator appears during macro expansion" +#~ msgstr "\"defined\" ±é»»»Ò¤¬¥Þ¥¯¥íŸ³«Ãæ¤Ë¸½¤ì¤Þ¤·¤¿" + +#~ msgid "ISO C++ does not permit \"%s\" in #if" +#~ msgstr "ISO C++ ¤Ï #if Æâ¤Î \"%s\" ¤òµö¤·¤Þ¤»¤ó" + +#~ msgid "absolute file name in remap_filename" +#~ msgstr "ÀäÂХѥ¹¥Õ¥¡¥¤¥ë̾¤¬ remap_filename ¤Ë¤¢¤ê¤Þ¤¹" + +#~ msgid "ignoring nonexistent directory \"%s\"\n" +#~ msgstr "¸ºß¤·¤Ê¤¤¥Ç¥£¥ì¥¯¥È¥ê \"%s\" ¤ò̵»ë¤·¤Þ¤¹\n" + +#~ msgid "%s: Not a directory" +#~ msgstr "%s: ¥Ç¥£¥ì¥¯¥È¥ê¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "ignoring duplicate directory \"%s\"\n" +#~ msgstr "½ÅÊ£¤·¤¿¥Ç¥£¥ì¥¯¥È¥ê \"%s\" ¤ò̵»ë¤·¤Þ¤¹\n" + +#~ msgid "-include and -imacros cannot be used with -fpreprocessed" +#~ msgstr "-include ¤ä -imacros ¤Ï -fpreprocessed ¤È°ì½ï¤Ë»È¤¦¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "#include \"...\" search starts here:\n" +#~ msgstr "#include \"...\" ¤Îõº÷¤Ï¤³¤³¤«¤é»Ï¤Þ¤ê¤Þ¤¹:\n" + +#~ msgid "#include <...> search starts here:\n" +#~ msgstr "#include <...> ¤Îõº÷¤Ï¤³¤³¤«¤é»Ï¤Þ¤ê¤Þ¤¹:\n" + +#~ msgid "End of search list.\n" +#~ msgstr "õº÷¥ê¥¹¥È¤Î½ª¤ï¤ê\n" + +#~ msgid "I/O error on output" +#~ msgstr "½ÐÎÏÃæ¤Ë I/O ¥¨¥é¡¼¤¬È¯À¸" + +#~ msgid "buffers still stacked in cpp_finish" +#~ msgstr "cpp_finish ¤Ç¥Ð¥Ã¥Õ¥¡¤¬¤Þ¤À¥¹¥¿¥Ã¥¯¤µ¤ì¤Æ¤¤¤Þ¤¹" + +#~ msgid "Argument missing after %s" +#~ msgstr "%s ¤Î¸å¤í¤Î°ú¿ô¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "Assertion missing after %s" +#~ msgstr "%s ¤Î¸å¤í¤Î¥¢¥µ¡¼¥·¥ç¥ó¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "Directory name missing after %s" +#~ msgstr "%s ¤Î¸å¤í¤Î¥Ç¥£¥ì¥¯¥È¥ê̾¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "File name missing after %s" +#~ msgstr "%s ¤Î¸å¤í¤Î¥Õ¥¡¥¤¥ë̾¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "Macro name missing after %s" +#~ msgstr "%s ¤Î¸å¤í¤Î¥Þ¥¯¥í̾¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "Path name missing after %s" +#~ msgstr "%s ¤Î¸å¤í¤Î¥Ñ¥¹Ì¾¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "Number missing after %s" +#~ msgstr "%s ¤Î¸å¤í¤Î¿ô»ú¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "Target missing after %s" +#~ msgstr "%s ¤Î¸å¤í¤Î¥¿¡¼¥²¥Ã¥È¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "Too many filenames. Type %s --help for usage info" +#~ msgstr "¥Õ¥¡¥¤¥ë̾¤¬Â¿¤¹¤®¤Þ¤¹¡£%s --help ¤È¥¿¥¤¥×¤·¤Æ»È¤¤Êý¤ò¸«¤Þ¤·¤ç¤¦" + +#~ msgid "Output filename specified twice" +#~ msgstr "½ÐÎÏ¥Õ¥¡¥¤¥ë̾¤¬Æó²ó»ØÄꤵ¤ì¤Þ¤·¤¿" + +#~ msgid "-I- specified twice" +#~ msgstr "-I- ¤¬Æó²ó»ØÄꤵ¤ì¤Þ¤·¤¿" + +#~ msgid "GNU CPP version %s (cpplib)" +#~ msgstr "GNU CPP version %s (cpplib)" + +#~ msgid "you must additionally specify either -M or -MM" +#~ msgstr "-M ¤« -MM ¤Î¤¤¤º¤ì¤«¤òÄɲÃŪ¤Ë»ØÄꤷ¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó" + +#~ msgid "Usage: %s [switches] input output\n" +#~ msgstr "»È¤¤Êý: %s [¥¹¥¤¥Ã¥Á] ÆþÎÏ ½ÐÎÏ\n" + +#~ msgid "" +#~ "Switches:\n" +#~ " -include Include the contents of before other files\n" +#~ " -imacros Accept definition of macros in \n" +#~ " -iprefix Specify as a prefix for next two options\n" +#~ " -iwithprefix Add to the end of the system include path\n" +#~ " -iwithprefixbefore Add to the end of the main include path\n" +#~ " -isystem Add to the start of the system include path\n" +#~ msgstr "" +#~ "¥¹¥¤¥Ã¥Á:\n" +#~ " -include ¾¤Î¥Õ¥¡¥¤¥ë¤ÎÁ°¤Ë ¤ÎÆâÍƤò´Þ¤á¤ë\n" +#~ " -imacros ¤Î¥Þ¥¯¥íÄêµÁ¤ò¼õ¤±Æþ¤ì¤ë\n" +#~ " -iprefix ¼¡¤ÎÆó¤Ä¤Î¥ª¥×¥·¥ç¥óÍÑ¥×¥ì¥Õ¥£¥¯¥¹¤Ë ¤ò»ØÄê\n" +#~ " -iwithprefix ¤ò¥·¥¹¥Æ¥à include ¥Ñ¥¹¤Î½ª¤ê¤ËÄɲ乤ë\n" +#~ " -iwithprefixbefore ¤ò¥á¥¤¥ó include ¥Ñ¥¹¤Î½ª¤ê¤ËÄɲ乤ë\n" +#~ " -isystem ¤ò¥·¥¹¥Æ¥à include ¥Ñ¥¹¤ÎºÇ½é¤ËÄɲ乤ë\n" + +#~ msgid "" +#~ " -idirafter Add to the end of the system include path\n" +#~ " -I Add to the end of the main include path\n" +#~ " -I- Fine-grained include path control; see info docs\n" +#~ " -nostdinc Do not search system include directories\n" +#~ " (dirs specified with -isystem will still be used)\n" +#~ " -nostdinc++ Do not search system include directories for C++\n" +#~ " -o Put output into \n" +#~ msgstr "" +#~ " -idirafter ¤ò¥·¥¹¥Æ¥à include ¥Ñ¥¹¤Î½ª¤ê¤ËÄɲ乤ë\n" +#~ " -I ¤ò¥á¥¤¥ó include ¥Ñ¥¹¤Î½ª¤ê¤ËÄɲ乤ë\n" +#~ " -I- ¤­¤áºÙ¤«¤Ê include ¥Ñ¥¹À©¸æ -- info ʸ½ñ¤ò»²¾È\n" +#~ " -nostdinc ¥·¥¹¥Æ¥à include ¥Ç¥£¥ì¥¯¥È¥ê¤òõº÷¤·¤Ê¤¤\n" +#~ " (-system ¤Ç»ØÄꤵ¤ì¤¿¥Ç¥£¥ì¥¯¥È¥ê¤Ïõº÷¤µ¤ì¤ë)\n" +#~ " -nostdinc++ C++ ÍÑ¥·¥¹¥Æ¥à include ¥Ç¥£¥ì¥¯¥È¥ê¤òõº÷¤·¤Ê¤¤\n" +#~ " -o ¤Ø½ÐÎϤ¹¤ë\n" + +#~ msgid "" +#~ " -pedantic Issue all warnings demanded by strict ISO C\n" +#~ " -pedantic-errors Issue -pedantic warnings as errors instead\n" +#~ " -trigraphs Support ISO C trigraphs\n" +#~ " -lang-c Assume that the input sources are in C\n" +#~ " -lang-c89 Assume that the input sources are in C89\n" +#~ msgstr "" +#~ " -pedantic ¸·Ì©¤Ê ISO C ¤ÇÍ׵ᤵ¤ì¤ëÁ´¤Æ¤Î·Ù¹ð¤òȯ¹Ô¤¹¤ë\n" +#~ " -pedantic-errors -pedantic ·Ù¹ð¤ÎÂå¤ê¤Ë¥¨¥é¡¼¤òȯ¹Ô¤¹¤ë\n" +#~ " -trigraphs ISO C ¥È¥é¥¤¥°¥é¥Õ¤ò¼õ¤±Æþ¤ì¤ë\n" +#~ " -lang-c ÆþÎÏ¥½¡¼¥¹¤ò C ¤È¤ß¤Ê¤¹\n" +#~ " -lang-c89 ÆþÎÏ¥½¡¼¥¹¤ò C89 ¤È¤ß¤Ê¤¹\n" + +#~ msgid "" +#~ " -lang-c++ Assume that the input sources are in C++\n" +#~ " -lang-objc Assume that the input sources are in ObjectiveC\n" +#~ " -lang-objc++ Assume that the input sources are in ObjectiveC++\n" +#~ " -lang-asm Assume that the input sources are in assembler\n" +#~ msgstr "" +#~ " -lang-c++ ÆþÎÏ¥½¡¼¥¹¤ò C ¤È¤ß¤Ê¤¹\n" +#~ " -lang-objc ÆþÎÏ¥½¡¼¥¹¤ò ObjectiveC ¤È¤ß¤Ê¤¹\n" +#~ " -lang-objc++ ÆþÎÏ¥½¡¼¥¹¤ò ObjectiveC++ ¤È¤ß¤Ê¤¹\n" +#~ " -lang-asm ÆþÎÏ¥½¡¼¥¹¤ò¥¢¥»¥ó¥Ö¥ê¸À¸ì¤È¤ß¤Ê¤¹\n" + +#~ msgid "" +#~ " -std= Specify the conformance standard; one of:\n" +#~ " gnu89, gnu99, c89, c99, iso9899:1990,\n" +#~ " iso9899:199409, iso9899:1999\n" +#~ " -+ Allow parsing of C++ style features\n" +#~ " -w Inhibit warning messages\n" +#~ " -Wtrigraphs Warn if trigraphs are encountered\n" +#~ " -Wno-trigraphs Do not warn about trigraphs\n" +#~ " -Wcomment{s} Warn if one comment starts inside another\n" +#~ msgstr "" +#~ " -std= Ŭ¹ç¤µ¤»¤ëɸ½à¤ò»ØÄê -- °Ê²¼¤è¤ê°ì¤Ä\n" +#~ " gnu89, gnu99, c89, c99, iso9899:1990,\n" +#~ " iso9899:199409, iso9899:1999\n" +#~ " -+ C++ ¼°¤Î¹½Ê¸²òÀϤòµö²Ä¤¹¤ë\n" +#~ " -w ·Ù¹ð¥á¥Ã¥»¡¼¥¸¤òÍÞÀ©¤¹¤ë\n" +#~ " -Wtrigraphs ¥È¥é¥¤¥°¥é¥Õ¤Ë½Ð¤¯¤ï¤·¤¿¤é·Ù¹ð¤¹¤ë\n" +#~ " -Wno-trigraphs ¥È¥é¥¤¥°¥é¥Õ¤Ë¤Ä¤¤¤Æ¤Î·Ù¹ð¤ò¹Ô¤Ê¤ï¤Ê¤¤\n" +#~ " -Wcomment{s} ¥³¥á¥ó¥È¤¬Â¾¤Î¥³¥á¥ó¥ÈÆâ¤Ç»Ï¤Þ¤Ã¤Æ¤¤¤¿¤é·Ù¹ð¤¹¤ë\n" + +#~ msgid "" +#~ " -Wno-comment{s} Do not warn about comments\n" +#~ " -Wtraditional Warn about features not present in traditional C\n" +#~ " -Wno-traditional Do not warn about traditional C\n" +#~ " -Wundef Warn if an undefined macro is used by #if\n" +#~ " -Wno-undef Do not warn about testing undefined macros\n" +#~ " -Wimport Warn about the use of the #import directive\n" +#~ msgstr "" +#~ " -Wno-comment{s} ¥³¥á¥ó¥È¤Ë´Ø¤¹¤ë·Ù¹ð¤ò¹Ô¤Ê¤ï¤Ê¤¤\n" +#~ " -Wtraditional ¸½ºß¤È¤Ï°Û¤Ê¤ë¸Å¤¤ C ¤Ç¤Îµ¡Ç½¤Ë¤Ä¤¤¤Æ·Ù¹ð¤¹¤ë\n" +#~ " -Wno-traditional ¸Å¤¤ C ¤Ë´Ø¤¹¤ë·Ù¹ð¤ò¹Ô¤Ê¤ï¤Ê¤¤\n" +#~ " -Wundef ̤ÄêµÁ¤Î¥Þ¥¯¥í¤¬ #if ¤Ç»È¤ï¤ì¤Æ¤¤¤ì¤Ð·Ù¹ð¤¹¤ë\n" +#~ " -Wno-undef ̤ÄêµÁ¥Þ¥¯¥í¤Îɾ²Á¤Ë´Ø¤¹¤ë·Ù¹ð¤ò¹Ô¤Ê¤ï¤Ê¤¤\n" +#~ " -Wimport #import ¥Ç¥£¥ì¥¯¥Æ¥£¥Ö¤ÎÍøÍѤ˴ؤ·¤Æ·Ù¹ð¤¹¤ë\n" + +#~ msgid "" +#~ " -Wno-import Do not warn about the use of #import\n" +#~ " -Werror Treat all warnings as errors\n" +#~ " -Wno-error Do not treat warnings as errors\n" +#~ " -Wsystem-headers Do not suppress warnings from system headers\n" +#~ " -Wno-system-headers Suppress warnings from system headers\n" +#~ " -Wall Enable all preprocessor warnings\n" +#~ msgstr "" +#~ " -Wno-import #import ¤ÎÍøÍѤ˴ؤ¹¤ë·Ù¹ð¤ò¹Ô¤Ê¤ï¤Ê¤¤\n" +#~ " -Werror Á´¤Æ¤Î·Ù¹ð¤ò¥¨¥é¡¼¤È¤·¤Æ¼è¤ê°·¤¦\n" +#~ " -Wno-error ·Ù¹ð¤ò¥¨¥é¡¼¤È¤·¤Æ¼è¤ê°·¤ï¤Ê¤¤\n" +#~ " -Wsystem-headers ¥·¥¹¥Æ¥à¥Ø¥Ã¥À¤«¤é¤Î·Ù¹ð¤òÍÞÀ©¤·¤Ê¤¤\n" +#~ " -Wno-system-headers ¥·¥¹¥Æ¥à¥Ø¥Ã¥À¤«¤é¤Î·Ù¹ð¤òÍÞÀ©¤¹¤ë\n" +#~ " -Wall Á´¤Æ¤Î¥×¥ê¥×¥í¥»¥Ã¥µ·Ù¹ð¤òÍ­¸ú¤Ë¤¹¤ë\n" + +#~ msgid "" +#~ " -M Generate make dependencies\n" +#~ " -MM As -M, but ignore system header files\n" +#~ " -MF Write dependency output to the given file\n" +#~ " -MG Treat missing header file as generated files\n" +#~ msgstr "" +#~ " -M make °Í¸´Ø·¸¤òÀ¸À®¤¹¤ë\n" +#~ " -MM -M ƱÍÍ¡¢Ã¢¤·¥·¥¹¥Æ¥à¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë¤ò̵»ë¤¹¤ë\n" +#~ " -MF °Í¸´Ø·¸¤Î½ÐÎϤòÍ¿¤¨¤é¤ì¤¿¥Õ¥¡¥¤¥ë¤Ë½ñ¤­¹þ¤à\n" +#~ " -MG ¸«¤Ä¤«¤é¤Ê¤¤¥Ø¥Ã¥À¤òÀ¸À®¤µ¤ì¤ë¥Õ¥¡¥¤¥ë¤È¤·¤Æ°·¤¦\n" + +#~ msgid "" +#~ " -MP\t\t\t Generate phony targets for all headers\n" +#~ " -MQ Add a MAKE-quoted target\n" +#~ " -MT Add an unquoted target\n" +#~ msgstr "" +#~ " -MP\t\t\t Á´¤Æ¤Î¥Ø¥Ã¥À¤Ë¤Ä¤¤¤Æ phony ¥¿¡¼¥²¥Ã¥È¤òÀ¸À®¤¹¤ë\n" +#~ " -MQ MAKE ¤Ç¤Î¥¯¥ª¡¼¥È¤µ¤ì¤¿¥¿¡¼¥²¥Ã¥È¤òÄɲ乤ë\n" +#~ " -MT ¥¯¥ª¡¼¥È¤µ¤ì¤Ê¤¤¥¿¡¼¥²¥Ã¥È¤òÄɲ乤ë\n" + +#~ msgid "" +#~ " -D Define a with string '1' as its value\n" +#~ " -D= Define a with as its value\n" +#~ " -A () Assert the to \n" +#~ " -A- () Disable the to \n" +#~ " -U Undefine \n" +#~ " -v Display the version number\n" +#~ msgstr "" +#~ " -D ¤òÄêµÁ¤·¡¢¤½¤ÎÃͤòʸ»úÎó¤Î '1' ¤È¤¹¤ë\n" +#~ " -D= ¤òÄêµÁ¤·¡¢¤½¤ÎÃͤò ¤È¤¹¤ë\n" +#~ " -A () ¤Ë ¤ÈÀ¼ÌÀ¤¹¤ë\n" +#~ " -A- () ¤ò ¤È¤·¤Ê¤¤\n" +#~ " -U ÄêµÁ¤ò²ò½ü¤¹¤ë\n" +#~ " -v ¥Ð¡¼¥¸¥ç¥óÈÖ¹æ¤òɽ¼¨¤¹¤ë\n" + +#~ msgid "" +#~ " -H Print the name of header files as they are used\n" +#~ " -C Do not discard comments\n" +#~ " -dM Display a list of macro definitions active at end\n" +#~ " -dD Preserve macro definitions in output\n" +#~ " -dN As -dD except that only the names are preserved\n" +#~ " -dI Include #include directives in the output\n" +#~ msgstr "" +#~ " -H »È¤ï¤ì¤¿¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë¤òɽ¼¨¤¹¤ë\n" +#~ " -C ¥³¥á¥ó¥È¤òÇË´þ¤·¤Ê¤¤\n" +#~ " -dM ºÇ¸å¤ËÍ­¸ú¤Ê¥Þ¥¯¥íÄêµÁ¥ê¥¹¥È¤òɽ¼¨¤¹¤ë\n" +#~ " -dD ½ÐÎϤ˥ޥ¯¥íÄêµÁ¤òÊݸ¤¹¤ë\n" +#~ " -dN -dD ¤ÈƱÍͤÀ¤¬¡¢Ì¾Á°¤À¤±¤òÊݸ¤¹¤ë\n" +#~ " -dI #include ¥Ç¥£¥ì¥¯¥Æ¥£¥Ö¤ò½ÐÎϤ˴ޤá¤ë\n" + +#~ msgid "" +#~ " -fpreprocessed Treat the input file as already preprocessed\n" +#~ " -ftabstop= Distance between tab stops for column reporting\n" +#~ " -P Do not generate #line directives\n" +#~ " -$ Do not allow '$' in identifiers\n" +#~ " -remap Remap file names when including files.\n" +#~ " --version Display version information\n" +#~ " -h or --help Display this information\n" +#~ msgstr "" +#~ " -fpreprocessed ÆþÎÏ¥Õ¥¡¥¤¥ë¤ò´û¤Ë¥×¥ê¥×¥í¥»¥¹ºÑ¤È¤·¤Æ°·¤¦\n" +#~ " -ftabstop= ¥«¥é¥à¤Î¥¿¥Ö´Ö³Ö¤òÊó¹ð¤¹¤ë\n" +#~ " -P #line ¥Ç¥£¥ì¥¯¥Æ¥£¥Ö¤òÀ¸À®¤·¤Ê¤¤\n" +#~ " -$ ¼±Ê̻ҤǤΠ'$' ¤òµö²Ä¤·¤Ê¤¤\n" +#~ " -remap ¥Õ¥¡¥¤¥ë¥¤¥ó¥¯¥ë¡¼¥É»þ¤Ë¥Õ¥¡¥¤¥ë̾¤òºÆ¥Þ¥Ã¥×¤¹¤ë\n" +#~ " --version ¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤òɽ¼¨¤¹¤ë\n" +#~ " -h or --help ¤³¤Î¾ðÊó¤òɽ¼¨¤¹¤ë\n" + +#~ msgid "'$' character(s) in identifier" +#~ msgstr "'$' ʸ»ú¤¬¼±Ê̻ҤËÆþ¤Ã¤Æ¤¤¤Þ¤¹" + +#~ msgid "possible start of unterminated string literal" +#~ msgstr "½ªÃ¼¤Î¤Ê¤¤Ê¸»úÎó¥ê¥Æ¥é¥ë¤Î¿äÄ곫»Ï°ÌÃÖ" + +#~ msgid "multi-line string literals are deprecated" +#~ msgstr "Ê£¿ô¹Ôʸ»úÎó¥ê¥Æ¥é¥ë¤Ï¿ä¾©¤µ¤ì¤Þ¤»¤ó" + +#~ msgid "no newline at end of file" +#~ msgstr "¥Õ¥¡¥¤¥ëËöÈø¤Ë²þ¹Ô¤¬¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "directives may not be used inside a macro argument" +#~ msgstr "¥Þ¥¯¥í°ú¿ôÆâ¤Ç¥Ç¥£¥ì¥¯¥È¥ê¤ò»È¤¦¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "# followed by integer" +#~ msgstr "À°¿ô¤¬ # ¤Ë³¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "\"%s\" cannot be used as a macro name" +#~ msgstr "\"%s\" ¤Ï¥Þ¥¯¥í̾¤È¤·¤Æ¤Ï»È¤¨¤Þ¤»¤ó" + +#~ msgid "attempt to push file buffer with contexts stacked" +#~ msgstr "¥¹¥¿¥Ã¥¯¤µ¤ì¤¿¥³¥ó¥Æ¥¯¥¹¥È¤È°ì½ï¤Ë¥Õ¥¡¥¤¥ë¥Ð¥Ã¥Õ¥¡¤ò push ¤·¤è¤¦¤È¤·¤Æ¤¤¤Þ¤¹" + +#~ msgid "#import is obsolete, use an #ifndef wrapper in the header file" +#~ msgstr "#import ¤Ï¸Å¤¤É½¸½¤Ç¤¹. ¥Ø¥Ã¥À¥Õ¥¡¥¤¥ëÃæ¤Ç #ifndef ¤Î¥é¥Ã¥Ñ¡¼¤ò»È¤Ã¤Æ¤¯¤À¤µ¤¤" + +#~ msgid "file \"%s\" left but not entered" +#~ msgstr "¥Õ¥¡¥¤¥ë \"%s\" ¤«¤é½Ð¤Þ¤·¤¿¤¬Æþ¤Ã¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "expected to return to file \"%s\"" +#~ msgstr "¥Õ¥¡¥¤¥ë \"%s\" ¤ËÌá¤ë¤Ï¤º¤Ç¤·¤¿" + +#~ msgid "expected to return to line number %u" +#~ msgstr "¹ÔÈÖ¹æ %u ¤ËÌá¤ë¤Ï¤º¤Ç¤·¤¿" + +#~ msgid "header flags for \"%s\" have changed" +#~ msgstr "\"%s\" ¤Î¥Ø¥Ã¥À¥Õ¥é¥°¤¬Êѹ¹¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "invalid #ident" +#~ msgstr "̵¸ú¤Ê #ident" + +#~ msgid "unknown #pragma namespace %s" +#~ msgstr "ÉÔÌÀ¤Ê #pragma namespace %s ¤Ç¤¹" + +#~ msgid "#pragma once is obsolete" +#~ msgstr "#pragma once ¤Ï¤â¤¦»È¤ï¤ì¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "" +#~ msgstr "<ÁȤ߹þ¤ß>" + +#~ msgid "" +#~ msgstr "<¥³¥Þ¥ó¥É¥é¥¤¥ó>" + +#~ msgid "" +#~ msgstr "<ɸ½àÆþÎÏ>" + +#~ msgid "file \"%s\" entered but not left" +#~ msgstr "¥Õ¥¡¥¤¥ë \"%s\" ¤ËÆþ¤ê¤Þ¤·¤¿¤¬½Ð¤Þ¤»¤ó¤Ç¤·¤¿" + +#~ msgid "Invalid option %s" +#~ msgstr "̵¸ú¤Ê¥ª¥×¥·¥ç¥ó %s" + +#~ msgid "\"%s\" is not a valid option to the preprocessor" +#~ msgstr "\"%s\" ¤Ï¥×¥ê¥×¥í¥»¥Ã¥µ¤ËÂФ¹¤ëÀµ¾ï¤Ê¥ª¥×¥·¥ç¥ó¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "too many input files" +#~ msgstr "ÆþÎÏ¥Õ¥¡¥¤¥ë¤¬Â¿¤¹¤®¤Þ¤¹" + +#~ msgid ";; Processing block from %d to %d, %d sets.\n" +#~ msgstr ";; %d ¤«¤é %d ¤Þ¤Ç¤Î½èÍý¥Ö¥í¥Ã¥¯¡¢%d ¥»¥Ã¥È¡£\n" + +#~ msgid "%s:%d: warning: " +#~ msgstr "%s:%d: ·Ù¹ð: " + +#~ msgid "%s: warning: " +#~ msgstr "%s: ·Ù¹ð: " + +#~ msgid "((anonymous))" +#~ msgstr "((̵̾))" + +#~ msgid "%s: warnings being treated as errors\n" +#~ msgstr "%s: ·Ù¹ð¤Ï¥¨¥é¡¼¤È¤·¤Æ¼è¤ê°·¤ï¤ì¤Þ¤¹\n" + +#~ msgid "%s: %s: " +#~ msgstr "%s: %s: " + +#~ msgid "sorry, not implemented: " +#~ msgstr "»ÄÇ°¤Ê¤¬¤é¸«¼ÂÁõ¤Ç¤¹: " + +#~ msgid "%s " +#~ msgstr "%s " + +#~ msgid " %s" +#~ msgstr " %s" + +#~ msgid "At top level:" +#~ msgstr "¥È¥Ã¥×¥ì¥Ù¥ë:" + +#~ msgid "In method `%s':" +#~ msgstr "¥á¥½¥Ã¥É `%s' Æâ:" + +#~ msgid "In function `%s':" +#~ msgstr "´Ø¿ô `%s' Æâ:" + +#~ msgid "compilation terminated.\n" +#~ msgstr "¥³¥ó¥Ñ¥¤¥ë¤¬ÃæÃǤµ¤ì¤Þ¤·¤¿¡£\n" + +#~ msgid "%s:%d: confused by earlier errors, bailing out\n" +#~ msgstr "%s:%d: Á°¤Î¥¨¥é¡¼¤Ë¤è¤êº®Í𤷤Ƥ¤¤Þ¤¹¤Î¤Ç¡¢Ã¦½Ð¤·¤Þ¤¹\n" + +#~ msgid "" +#~ "Please submit a full bug report,\n" +#~ "with preprocessed source if appropriate.\n" +#~ "See %s for instructions.\n" +#~ msgstr "" +#~ "´°Á´¤Ê¥Ð¥°Êó¹ð¤òÁ÷¤Ã¤Æ²¼¤µ¤¤¡£\n" +#~ "ŬÀڤʤé¤Ð¥×¥ê¥×¥í¥»¥¹¸å¤Î¥½¡¼¥¹¤ò¤Ä¤±¤Æ¤¯¤À¤µ¤¤¡£\n" +#~ "%s ¤ò¸«¤ì¤ÐÊýË¡¤¬½ñ¤¤¤Æ¤¢¤ê¤Þ¤¹¡£\n" + +#~ msgid "Unrecognizable insn:" +#~ msgstr "ǧ¼±ÉÔǽ¤ÊÌ¿Îá:" + +#~ msgid "Insn does not satisfy its constraints:" +#~ msgstr "Ì¿Î᤬¤½¤ÎÀ©Ìó¤òËþ¤¿¤·¤Þ¤»¤ó" + +#~ msgid "Internal compiler error: Error reporting routines re-entered.\n" +#~ msgstr "ÆâÉô¥³¥ó¥Ñ¥¤¥ë¥¨¥é¡¼: ¥¨¥é¡¼Êó¹ð¥ë¡¼¥Á¥ó¤ËºÆÆþ¤·¤Þ¤·¤¿¡£\n" + +#~ msgid "Internal compiler error in %s, at %s:%d" +#~ msgstr "%s ¤ÇÆâÉô¥³¥ó¥Ñ¥¤¥é¥¨¥é¡¼ (%s:%d)" + +#~ msgid "In file included from %s:%d" +#~ msgstr "%s:%d ¤«¤é include ¤µ¤ì¤¿¥Õ¥¡¥¤¥ëÆâ" + +#~ msgid "" +#~ ",\n" +#~ " from %s:%d" +#~ msgstr "" +#~ ",\n" +#~ " %s:%d ¤«¤é" + +#~ msgid ":\n" +#~ msgstr ":\n" + +#~ msgid "DW_LOC_OP %s not implememnted\n" +#~ msgstr "DW_LOC_OP %s ¤Ï¼ÂÁõ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó\n" + +#~ msgid "internal regno botch: regno = %d\n" +#~ msgstr "ÆâÉôŪ¤Ë regno ¤Î½èÍý¤¬ÊÑ: regno = %d\n" + +#~ msgid "can't get current directory" +#~ msgstr "¥«¥ì¥ó¥È¥Ç¥£¥ì¥¯¥È¥ê¤ò¼èÆÀ¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "Can't access real part of complex value in hard register" +#~ msgstr "¥Ï¡¼¥É¥ì¥¸¥¹¥¿Æâ¤ÇÊ£ÁÇ¿ô¤Î¼Â¿ôÉôʬ¤Ë¥¢¥¯¥»¥¹¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "can't access imaginary part of complex value in hard register" +#~ msgstr "¥Ï¡¼¥É¥ì¥¸¥¹¥¿Æâ¤ÇÊ£ÁÇ¿ô¤Îµõ¿ôÉôʬ¤Ë¥¢¥¯¥»¥¹¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "ICE: emit_insn used where emit_jump_insn needed:\n" +#~ msgstr "ICE: emit_insn ¤¬ emit_jump_insn ¤òÍפ¹¤ë½ê¤Ç»È¤ï¤ì¤Þ¤·¤¿:\n" + +#~ msgid "abort in %s, at %s:%d" +#~ msgstr "%s ¤ÇÃæÃÇ, °ÌÃÖ %s:%d" + +#~ msgid "exception handling disabled, use -fexceptions to enable" +#~ msgstr "Îã³°½èÍý¤ò̵¸ú¤Ë¤·¤Þ¤·¤¿. Í­¸ú¤Ë¤¹¤ë¤Ë¤Ï -fexceptions ¤ò»È¤Ã¤Æ¤¯¤À¤µ¤¤" + +#~ msgid "argument of `__builtin_eh_return_regno' must be constant" +#~ msgstr "`__builtin_eh_return_regno' ¤Î°ú¿ô¤ÏÄê¿ô¤Ç¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó" + +#~ msgid "__builtin_eh_return not supported on this target" +#~ msgstr "__builtin_eh_return ¤Ï¤³¤Î¥¿¡¼¥²¥Ã¥È¤Ç¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "stack limits not supported on this target" +#~ msgstr "¥¹¥¿¥Ã¥¯À©¸Â¤Ï¤³¤Î¥¿¡¼¥²¥Ã¥È¤Ç¤Ï¼ÂÁõ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "function using short complex types cannot be inline" +#~ msgstr "short complex ·¿¤ò»È¤¦´Ø¿ô¤Ï inline ¤Ë¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "unsupported wide integer operation" +#~ msgstr "¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Ê¤¤¥ï¥¤¥ÉÀ°¿ô±é»»" + +#~ msgid "prior parameter's size depends on `%s'" +#~ msgstr "Í¥À褹¤ë²¾°ú¿ô¤Î¥µ¥¤¥º¤Ï `%s' ¼¡Âè¤Ç¤¹" + +#~ msgid "returned value in block_exit_expr" +#~ msgstr "block_exit_expr ¤ÇÃͤò return ¤·¤Þ¤·¤¿" + +#~ msgid "no INTEGER type can hold a pointer on this configuration" +#~ msgstr "¸½ºß¤ÎÀßÄê¤Ç¤ÏÈó INTEGER ·¿¤¬¥Ý¥¤¥ó¥¿¤òÊÝ»ý¤Ç¤­¤Þ¤¹" + +#~ msgid "configuration: REAL, INTEGER, and LOGICAL are %d bits wide," +#~ msgstr "ÀßÄê: REAL, INTEGER µÚ¤Ó LOGICAL ¤Ï %d ¥Ó¥Ã¥ÈÉý¤Ç¡¢" + +#~ msgid "and pointers are %d bits wide, but g77 doesn't yet work" +#~ msgstr "¥Ý¥¤¥ó¥¿¤Ï %d ¥Ó¥Ã¥ÈÉý¤Ç¤¹¤¬¡¢¤½¤ì¤éÁ´¤Æ¤¬ 32 ¥Ó¥Ã¥ÈÉý" + +#~ msgid "properly unless they all are 32 bits wide." +#~ msgstr "¤Ç¤Ê¤¤¤È g77 ¤ÏÀµ¾ï¤ËÆ°ºî¤·¤Þ¤»¤ó¡£" + +#~ msgid "Please keep this in mind before you report bugs. g77 should" +#~ msgstr "¥Ð¥°¥ì¥Ý¡¼¥È¤òÁ÷¤ëÁ°¤Ë¤³¤Î»ö¤ò¿´¤Ëα¤á¤ÆÃÖ¤¤¤Æ¤¯¤À¤µ¤¤¡£" + +#~ msgid "support non-32-bit machines better as of version 0.6." +#~ msgstr "g77 ¤Ï¤¤¤º¤ì version 0.6 ƱÍͤËÈó 32 ¥Ó¥Ã¥Èµ¡¤Ç¤â¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤¹" + +#~ msgid "configuration: char * holds %d bits, but ftnlen only %d" +#~ msgstr "ÀßÄê: char * ¤Ï %d ¥Ó¥Ã¥È³ÎÊݤ·¤Þ¤¹¤¬¡¢ftnlen ¤¬¤¿¤Ã¤¿ %d ¥Ó¥Ã¥È¤Ç¤¹" + +#~ msgid "" +#~ "configuration: char * holds %d bits, but INTEGER only %d --\n" +#~ " ASSIGN statement might fail" +#~ msgstr "" +#~ "ÀßÄê: char * ¤Ï %d ¥Ó¥Ã¥È³ÎÊݤ·¤Þ¤¹¤¬¡¢INTEGER ¤¬¤¿¤Ã¤¿ %d ¥Ó¥Ã¥È¤Ç¤¹ --\n" +#~ " ¶²¤é¤¯ ASSIGN ʸ¤¬¼ºÇÔ¤·¤Þ¤¹" + +#~ msgid "Directory name must immediately follow -I" +#~ msgstr "¥Ç¥¤¥ì¥¯¥È¥ê̾¤Ï -I ¤Î¤¹¤°¸å¤í¤Ë¤Ä¤±¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó" + +#~ msgid "overflowed output arg list for `%s'" +#~ msgstr "`%s' ÍѤνÐÎÏ°ú¿ô¥ê¥¹¥È¤¬¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤·¤Þ¤·¤¿" + +#~ msgid "--driver no longer supported" +#~ msgstr "--driver ¤ÏºÇÁ᥵¥Ý¡¼¥È¤µ¤ì¤Þ¤»¤ó" + +#~ msgid "argument to `%s' missing" +#~ msgstr "`%s' ¤Ø¤Î°ú¿ô¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "No input files; unwilling to write output files" +#~ msgstr "ÆþÎÏ¥Õ¥¡¥¤¥ë¤¬¤¢¤ê¤Þ¤»¤ó -- ÉÔËܰդʽÐÎÏ¥Õ¥¡¥¤¥ë¤Ø¤Î½ñ¤­¹þ¤ß" + +#~ msgid "Print g77-specific compiler version info, run internal tests" +#~ msgstr "g77 ¸ÇÍ­¤Î¥³¥ó¥Ñ¥¤¥é¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤òɽ¼¨¡¢ÆâÉô¥Æ¥¹¥È¤Î¼Â¹Ô" + +#~ msgid "Program is written in typical FORTRAN 66 dialect" +#~ msgstr "¥×¥í¥°¥é¥à¤¬Åµ·¿Åª¤Ê FORTRAN 66 Êý¸À¤Ç½ñ¤«¤ì¤Æ¤¤¤ë" + +#~ msgid "Program is written in typical Unix f77 dialect" +#~ msgstr "¥×¥í¥°¥é¥à¤¬Åµ·¿Åª¤Ê Unix f77 Êý¸À¤Ç½ñ¤«¤ì¤Æ¤¤¤ë" + +#~ msgid "Program does not use Unix-f77 dialectal features" +#~ msgstr "¥×¥í¥°¥é¥à¤¬ Unix-f77 Êý¸À¤Îµ¡Ç½¤ò»È¤Ã¤Æ¤¤¤Ê¤¤" + +#~ msgid "Program is written in Fortran-90-ish dialect" +#~ msgstr "¥×¥í¥°¥é¥à¤¬ Fortran-90 ŪÊý¸À¤Ç½ñ¤«¤ì¤Æ¤¤¤ë" + +#~ msgid "Treat local vars and COMMON blocks as if they were named in SAVE statements" +#~ msgstr "¥í¡¼¥«¥ëÊÑ¿ô¤È COMMON ¥Ö¥í¥Ã¥¯¤ò SAVE ʸ¤Ç̾Á°ÉÕ¤±¤é¤ì¤¿¤è¤¦¤Ë¼è¤ê°·¤¦" + +#~ msgid "Allow $ in symbol names" +#~ msgstr "$ ¤ò¥·¥ó¥Ü¥ë̾¤È¤·¤Æ»È¤¨¤ë¤è¤¦¤Ë¤¹¤ë" + +#~ msgid "f2c-compatible code need not be generated" +#~ msgstr "f2c ¸ß´¹¥³¡¼¥É¤òÀ¸À®¤¹¤ëɬÍפ¬¤Ê¤¤" + +#~ msgid "Unsupported; do not generate libf2c-calling code" +#~ msgstr "¥µ¥Ý¡¼¥È¤µ¤ì¤Ê¤¤ -- libf2c-calling ¥³¡¼¥É¤òÀ¸À®¤·¤Ê¤¤" + +#~ msgid "Unsupported; affects code-generation of arrays" +#~ msgstr "¥µ¥Ý¡¼¥È¤µ¤ì¤Ê¤¤ -- ÇÛÎó¤Î¥³¡¼¥ÉÀ¸À®¤Ë±Æ¶Á¤¹¤ë" + +#~ msgid "Program is written in Fortran-90-ish free form" +#~ msgstr "¥×¥í¥°¥é¥à¤Ï Fortran-90 Ū¥Õ¥ê¡¼¥Õ¥©¡¼¥à¤Ç½ñ¤«¤ì¤Æ¤¤¤ë" + +#~ msgid "Warn about use of (only a few for now) Fortran extensions" +#~ msgstr "Fortran ³ÈÄ¥(º£¤Ï¾¯¤Ê¤¤¤¬)¤Î»ÈÍѤˤĤ¤¤Æ·Ù¹ð¤¹¤ë" + +#~ msgid "Program is written in VXT (Digital-like) FORTRAN" +#~ msgstr "¥×¥í¥°¥é¥à¤Ï VXT (Digital) FORTRAN ¤Ç½ñ¤«¤ì¤Æ¤¤¤ë" + +#~ msgid "Disallow all ugly features" +#~ msgstr "Á´¤Æ¤Î½¹¤¤µ¡Ç½¤òµö²Ä¤·¤Ê¤¤" + +#~ msgid "Hollerith and typeless constants not passed as arguments" +#~ msgstr "Hollerith ¤ä·¿¤Ê¤·Äê¿ô¤ò°ú¿ô¤È¤·¤ÆÅϤµ¤Ê¤¤" + +#~ msgid "Allow ordinary copying of ASSIGN'ed vars" +#~ msgstr "ASSIGN ¤µ¤ì¤¿ÊÑ¿ô¤ÎÄ̾ï¤Î¥³¥Ô¡¼¤òµö²Ä¤¹¤ë" + +#~ msgid "Dummy array dimensioned to (1) is assumed-size" +#~ msgstr "¥À¥ß¡¼ÇÛÎó¤Î¼¡¸µ¤ò (1) ¤È¤ß¤Ê¤¹" + +#~ msgid "Trailing comma in procedure call denotes null argument" +#~ msgstr "¥×¥í¥·¡¼¥¸¥ã¸Æ¤Ó½Ð¤·Ãæ¤ÎϢ³¥«¥ó¥Þ¤Ç null °ú¿ô¤òɽ¸½¤¹¤ë" + +#~ msgid "Allow REAL(Z) and AIMAG(Z) given DOUBLE COMPLEX Z" +#~ msgstr "DOUBLE COMPLEX Z ¤Ç¤Î REAL(Z) ¤È AIMAG(Z) ¤òµö²Ä¤¹¤ë" + +#~ msgid "Initialization via DATA and PARAMETER is type-compatible" +#~ msgstr "DATA ¤ä PARAMETER ·Ðͳ¤Î½é´ü²½¤Ï·¿¸ß´¹¤Ç¤¢¤ë" + +#~ msgid "Allow INTEGER and LOGICAL interchangeability" +#~ msgstr "INTEGER ¤È LOGICAL ¤ÏÁê¸ß¤ËÊѹ¹²Äǽ¤Ç¤¢¤ë¤È¤¹¤ë" + +#~ msgid "Print internal debugging-related info" +#~ msgstr "ÆâÉô¥Ç¥Ð¥Ã¥°´ØÏ¢¾ðÊó¤òɽ¼¨¤¹¤ë" + +#~ msgid "Initialize local vars and arrays to zero" +#~ msgstr "¥í¡¼¥«¥ëÊÑ¿ô¤äÇÛÎó¤ò¥¼¥í¤Ë½é´ü²½¤¹¤ë" + +#~ msgid "Backslashes in character/hollerith constants not special (C-style)" +#~ msgstr "ʸ»ú/hollerith Äê¿ô¤Ç¤Î¥Ð¥Ã¥¯¥¹¥é¥Ã¥·¥å¤òÆüì¤Ê¤â¤Î¤È¤·¤Ê¤¤ (C ¼°)" + +#~ msgid "Have front end emulate COMPLEX arithmetic to avoid bugs" +#~ msgstr "COMPLEX ·×»»¤Î¥Ð¥°¤ò²óÈò¤ò¥¨¥ß¥å¥ì¡¼¥È¤¹¤ë¥Õ¥í¥ó¥È¥¨¥ó¥É¤ò»ý¤Ä" + +#~ msgid "Disable the appending of underscores to externals" +#~ msgstr "³°ÉôÊÑ¿ô¤Ë¥¢¥ó¥À¡¼¥¹¥³¥¢¤òÉÕ¤±Â­¤µ¤Ê¤¤" + +#~ msgid "Never append a second underscore to externals" +#~ msgstr "³°ÉôÊÑ¿ô¤ËÆó¤ÄÌܤΥ¢¥ó¥À¡¼¥¹¥³¥¢¤òÉÕ¤±Â­¤µ¤Ê¤¤" + +#~ msgid "Intrinsics spelled as e.g. SqRt" +#~ msgstr "intrinsic ¤¬Î㤨¤Ð SqRt ¤ÎÍѤËÄÖ¤é¤ì¤ë" + +#~ msgid "Intrinsics in uppercase" +#~ msgstr "intrinsic ¤ò±ÑÂçʸ»ú¤È¤¹¤ë" + +#~ msgid "Intrinsics letters in arbitrary cases" +#~ msgstr "intrinsic ʸ»ú¤ÏǤ°Õ¤Î¥±¡¼¥¹¤È¤¹¤ë" + +#~ msgid "Language keywords spelled as e.g. IOStat" +#~ msgstr "¸À¸ìͽÌó¸ì¤¬Î㤨¤Ð IOStat ¤ÎÍѤËÄÖ¤é¤ì¤ë" + +#~ msgid "Language keywords in uppercase" +#~ msgstr "¸À¸ìͽÌó¸ì¤Ï±ÑÂçʸ»ú¤È¤¹¤ë" + +#~ msgid "Language keyword letters in arbitrary cases" +#~ msgstr "¸À¸ìͽÌó¸ìʸ»ú¤ÏǤ°Õ¤Î¥±¡¼¥¹¤È¤¹¤ë" + +#~ msgid "Internally convert most source to uppercase" +#~ msgstr "ÆâÉôŪ¤ÊÊÑ´¹¤Ç¤Ï¥½¡¼¥¹¤ÎËؤó¤É¤ò±ÑÂçʸ»ú¤È¤¹¤ë" + +#~ msgid "Internally preserve source case" +#~ msgstr "ÆâÉôŪ¤Ë¥½¡¼¥¹¤Î¥±¡¼¥¹¤òÊÝ»ý¤¹¤ë" + +#~ msgid "Symbol names spelled in mixed case" +#~ msgstr "¥·¥ó¥Ü¥ë̾¤Ï¥±¡¼¥¹º®ºß¤ÇÄÖ¤é¤ì¤ë" + +#~ msgid "Symbol names in uppercase" +#~ msgstr "¥·¥ó¥Ü¥ë̾¤òÂçʸ»ú¤È¤¹¤ë" + +#~ msgid "Symbol names in lowercase" +#~ msgstr "¥·¥ó¥Ü¥ë̾¤ò¾®Ê¸»ú¤È¤¹¤ë" + +#~ msgid "Program written in uppercase" +#~ msgstr "¥×¥í¥°¥é¥à¤¬±ÑÂçʸ»ú¤Ç½ñ¤«¤ì¤Æ¤¤¤ë" + +#~ msgid "Program written in lowercase" +#~ msgstr "¥×¥í¥°¥é¥à¤¬±Ñ¾®Ê¸»ú¤Ç½ñ¤«¤ì¤Æ¤¤¤ë" + +#~ msgid "Program written in strict mixed-case" +#~ msgstr "¥×¥í¥°¥é¥à¤¬¸·Ì©¤Ë¥±¡¼¥¹º®ºß¤Ç½ñ¤«¤ì¤Æ¤¤¤ë" + +#~ msgid "Compile as if program written in uppercase" +#~ msgstr "¥×¥í¥°¥é¥à¤¬±ÑÂçʸ»ú¤Ç½ñ¤«¤ì¤¿Íͤ˥³¥ó¥Ñ¥¤¥ë¤¹¤ë" + +#~ msgid "Compile as if program written in lowercase" +#~ msgstr "¥×¥í¥°¥é¥à¤¬±Ñ¾®Ê¸»ú¤Ç½ñ¤«¤ì¤¿Íͤ˥³¥ó¥Ñ¥¤¥ë¤¹¤ë" + +#~ msgid "Preserve all spelling (case) used in program" +#~ msgstr "¥×¥í¥°¥é¥à¤Ç»È¤ï¤ì¤¿ÄÖ¤ê(¤Î¥±¡¼¥¹)¤òÁ´¤ÆÊÝ»ý¤¹¤ë" + +#~ msgid "Delete libU77 intrinsics with bad interfaces" +#~ msgstr "libU77 intrinsic ¤òÉÔÀµ¤Ê interface ¤È¶¦¤Ëºï½ü¤¹¤ë" + +#~ msgid "Disable libU77 intrinsics with bad interfaces" +#~ msgstr "libU77 intrinsic ¤òÉÔÀµ¤Ê interface ¤È¶¦¤Ë̵¸ú²½¤¹¤ë" + +#~ msgid "Hide libU77 intrinsics with bad interfaces" +#~ msgstr "libU77 intrinsic ¤òÉÔÀµ¤Ê interface ¤È¶¦¤Ë±£¤¹" + +#~ msgid "Delete non-FORTRAN-77 intrinsics f2c supports" +#~ msgstr "f2c ¤¬¥µ¥Ý¡¼¥È¤¹¤ëÈó FORTRAN-77 intrinsics ¤òºï½ü¤¹¤ë" + +#~ msgid "Disable non-FORTRAN-77 intrinsics f2c supports" +#~ msgstr "f2c ¤¬¥µ¥Ý¡¼¥È¤¹¤ëÈó FORTRAN-77 intrinsics ¤ò̵¸ú²½¤¹¤ë" + +#~ msgid "Hide non-FORTRAN-77 intrinsics f2c supports" +#~ msgstr "f2c ¤¬¥µ¥Ý¡¼¥È¤¹¤ëÈó FORTRAN-77 intrinsics ¤ò±£¤¹" + +#~ msgid "Delete non-FORTRAN-77 intrinsics F90 supports" +#~ msgstr "F90 ¤¬¥µ¥Ý¡¼¥È¤¹¤ëÈó FORTRAN-77 intrinsics ¤òºï½ü¤¹¤ë" + +#~ msgid "Disable non-FORTRAN-77 intrinsics F90 supports" +#~ msgstr "F90 ¤¬¥µ¥Ý¡¼¥È¤¹¤ëÈó FORTRAN-77 intrinsics ¤ò̵¸ú²½¤¹¤ë" + +#~ msgid "Hide non-FORTRAN-77 intrinsics F90 supports" +#~ msgstr "F90 ¤¬¥µ¥Ý¡¼¥È¤¹¤ëÈó FORTRAN-77 intrinsics ¤ò±£¤¹" + +#~ msgid "Delete non-FORTRAN-77 intrinsics g77 supports" +#~ msgstr "g77 ¤¬¥µ¥Ý¡¼¥È¤¹¤ëÈó FORTRAN-77 intrinsics ¤òºï½ü¤¹¤ë" + +#~ msgid "Disable non-FORTRAN 77 intrinsics F90 supports" +#~ msgstr "g77 ¤¬¥µ¥Ý¡¼¥È¤¹¤ëÈó FORTRAN-77 intrinsics ¤ò̵¸ú²½¤¹¤ë" + +#~ msgid "Hide non-FORTRAN 77 intrinsics F90 supports" +#~ msgstr "g77 ¤¬¥µ¥Ý¡¼¥È¤¹¤ëÈó FORTRAN-77 intrinsics ¤ò±£¤¹" + +#~ msgid "Delete MIL-STD 1753 intrinsics" +#~ msgstr "MIL-STD 1753 intrinsic ¤òºï½ü¤¹¤ë" + +#~ msgid "Disable MIL-STD 1753 intrinsics" +#~ msgstr "MIL-STD 1753 intrinsic ¤ò̵¸ú²½¤¹¤ë" + +#~ msgid "Hide MIL-STD 1753 intrinsics" +#~ msgstr "MIL-STD 1753 intrinsic ¤ò±£¤¹" + +#~ msgid "Delete libU77 intrinsics" +#~ msgstr "libU77 intrinsic ¤òºï½ü¤¹¤ë" + +#~ msgid "Disable libU77 intrinsics" +#~ msgstr "libU77 intrinsic ¤ò̵¸ú²½¤¹¤ë" + +#~ msgid "Hide libU77 intrinsics" +#~ msgstr "libU77 intrinsic ¤ò±£¤¹" + +#~ msgid "Delete non-FORTRAN-77 intrinsics VXT FORTRAN supports" +#~ msgstr "VXT FORTRAN ¤¬¥µ¥Ý¡¼¥È¤¹¤ëÈó FORTRAN-77 intrinsics ¤òºï½ü¤¹¤ë" + +#~ msgid "Disable non-FORTRAN-77 intrinsics VXT FORTRAN supports" +#~ msgstr "VXT FORTRAN ¤¬¥µ¥Ý¡¼¥È¤¹¤ëÈó FORTRAN-77 intrinsics ¤ò̵¸ú²½¤¹¤ë" + +#~ msgid "Hide non-FORTRAN-77 intrinsics VXT FORTRAN supports" +#~ msgstr "VXT FORTRAN ¤¬¥µ¥Ý¡¼¥È¤¹¤ëÈó FORTRAN-77 intrinsics ¤ò±£¤¹" + +#~ msgid "Treat initial values of 0 like non-zero values" +#~ msgstr "0 ¤Î½é´ü²½ÃͤòÈó¥¼¥íÃͤȤ·¤Æ¼è¤ê°·¤¦" + +#~ msgid "Emit special debugging information for COMMON and EQUIVALENCE (disabled)" +#~ msgstr "COMMON ¤ä EQUIVALENCE ÍѤÎÆÃÊ̤ʥǥХå°¾ðÊó¤òȯ¹Ô¤¹¤ë¡Ê̵¸ú²½¤µ¤ì¤Æ¤¤¤ë¡Ë" + +#~ msgid "Take at least one trip through each iterative DO loop" +#~ msgstr "ºÇÄã¤Ç¤â°ì²ó¤Ï³ÆÈ¿Éü DO ¥ë¡¼¥×¤¬½èÍý¤µ¤ì¤ë¤È¤¹¤ë" + +#~ msgid "Print names of program units as they are compiled" +#~ msgstr "¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¥×¥í¥°¥é¥àñ°Ì¤Î̾Á°¤òɽ¼¨¤¹¤ë" + +#~ msgid "Disable fatal diagnostics about inter-procedural problems" +#~ msgstr "inter-procedural ÌäÂê¤Ë¤Ä¤¤¤Æ¤ÎÃ×̿Ū¤Ê¿ÇÃÇɽ¼¨¤òɽ¼¨¤·¤Ê¤¤" + +#~ msgid "Make prefix-radix non-decimal constants be typeless" +#~ msgstr "ÈóÀ°¿ôÄê¿ô¤ÎÀÜÈø´ð¿ô¤¬·¿¤Ê¤·¤Ç¤¢¤ë¤È¤¹¤ë" + +#~ msgid "Generate code to check subscript and substring bounds" +#~ msgstr "ÇÛÎó¤Îź»ú¤Èź»ú¶­³¦¤ò¸¡ºº¤¹¤ë¥³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Fortran-specific form of -fbounds-check" +#~ msgstr "Fortran ¸ÇÍ­¤Î -fbounds-check ¤Î·Á¼°" + +#~ msgid "Disable warnings about inter-procedural problems" +#~ msgstr "inter-procedural ÌäÂê¤Ë¤Ä¤¤¤Æ¤Î·Ù¹ðɽ¼¨¤òɽ¼¨¤·¤Ê¤¤" + +#~ msgid "Warn about constructs with surprising meanings" +#~ msgstr "²ò¼á¤Ë¸í²ò¤ò¾·¤¯¤â¤Î¤Ë¤Ä¤¤¤Æ·Ù¹ð¤¹¤ë" + +#~ msgid "Add a directory for INCLUDE searching" +#~ msgstr "INCLUDE õº÷ÍѤΥǥ£¥ì¥¯¥È¥ê¤òÄɲ乤ë" + +#~ msgid "Set the maximum line length" +#~ msgstr "¹Ô¤ÎŤµ¤ÎºÇÂçÃͤòÀßÄꤹ¤ë" + +#~ msgid "the meaning of `\\a' varies with -traditional" +#~ msgstr "-traditional ¤Ç¤Ï `\\a' ¤Î°ÕÌ£¤¬°Û¤Ê¤ê¤Þ¤¹" + +#~ msgid "non-ANSI-standard escape sequence, `\\%c'" +#~ msgstr "Èó ANSI ɸ½à¤Î¥¨¥¹¥±¡¼¥×¥·¡¼¥±¥ó¥¹¡¢`\\%c'" + +#~ msgid "non-ANSI escape sequence `\\%c'" +#~ msgstr "Èó ANSI ¤Î¥¨¥¹¥±¡¼¥×¥·¡¼¥±¥ó¥¹¡¢`\\%c'" + +#~ msgid "unknown escape sequence `\\%c'" +#~ msgstr "ÉÔÌÀ¤Ê¥¨¥¹¥±¡¼¥×¥·¡¼¥±¥ó¥¹ `\\%c'" + +#~ msgid "unknown escape sequence: `\\' followed by char code 0x%x" +#~ msgstr "ÉÔÌÀ¤Ê¥¨¥¹¥±¡¼¥×¥·¡¼¥±¥ó¥¹: `\\' ¤Î¸å¤Ëʸ»ú¥³¡¼¥É 0x%x" + +#~ msgid "Badly formed directive -- no closing quote" +#~ msgstr "ÉÔÀµ¤Ê·Á¤Î¥Ç¥£¥ì¥¯¥Æ¥£¥Ö -- ÊĤ¸¥¯¥©¡¼¥È¤¬¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "#-lines for entering and leaving files don't match" +#~ msgstr "¥Õ¥¡¥¤¥ë¤Ø¤Î½ÐÆþ¤ê¸ý¤È¤Ê¤ë #-¹Ô ¤¬À°¹ç¤·¤Þ¤»¤ó" + +#~ msgid "Bad directive -- missing close-quote" +#~ msgstr "ÉÔÀµ¤Ê¥Ç¥£¥ì¥¯¥Æ¥£¥Ö -- ÊĤ¸¥¯¥©¡¼¥È¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "ignoring pragma: %s" +#~ msgstr "pragma ¤ò̵»ë¤·¤Þ¤¹: %s" + +#~ msgid "invalid #line" +#~ msgstr "̵¸ú¤Ê #line" + +#~ msgid "Use `#line ...' instead of `# ...' in first line" +#~ msgstr "ºÇ½é¤Î¹Ô¤Ç¤Ï `# ...' ¤ÎÂå¤ê¤Ë `#line ...' ¤ò»È¤¤¤Þ¤·¤ç¤¦" + +#~ msgid "invalid #-line" +#~ msgstr "̵¸ú¤Ê #-¹Ô" + +#~ msgid "ASSIGNed FORMAT specifier is too small" +#~ msgstr "ASSIGN ¤µ¤ì¤¿ FORMAT »ØÄê»Ò¤¬¾®¤µ¤¹¤®¤Þ¤¹" + +#~ msgid "ASSIGN to variable that is too small" +#~ msgstr "ASSIGN Àè¤ÎÊÑ¿ô¤¬¾®¤µ¤¹¤®¤Þ¤¹" + +#~ msgid "ASSIGNed GOTO target variable is too small" +#~ msgstr "ASSIGN ¤µ¤ì¤¿ GOTO ÀèÊÑ¿ô¤¬¾®¤µ¤¹¤®¤Þ¤¹" + +#~ msgid "%s no longer supported -- try -fvxt" +#~ msgstr "%s ¤ÏºÇÁ᥵¥Ý¡¼¥È¤µ¤ì¤Þ¤»¤ó -- -fvxt ¤È¤·¤Æ¤ß¤Æ¤¯¤À¤µ¤¤" + +#~ msgid "%s no longer supported -- try -fno-vxt -ff90" +#~ msgstr "%s ¤ÏºÇÁ᥵¥Ý¡¼¥È¤µ¤ì¤Þ¤»¤ó -- -fno-vxt -ff90 ¤È¤·¤Æ¤ß¤Æ¤¯¤À¤µ¤¤" + +#~ msgid "%s disabled, use normal debugging flags" +#~ msgstr "%s ¤¬Ìµ¸ú¤Ç¤¹¡£Ä̾ï¥Ç¥Ð¥Ã¥°¥Õ¥é¥°¤ò»È¤¤¤Þ¤·¤ç¤¦" + +#~ msgid "invalid `asm': %s" +#~ msgstr "̵¸ú¤Ê `asm': %s" + +#~ msgid "output_operand: %s" +#~ msgstr "output_operand: %s" + +#~ msgid "operand number missing after %-letter" +#~ msgstr "±é»»¿ô¤¬ %-letter ¤Î¸å¤Ë¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "operand number out of range" +#~ msgstr "±é»»¿ô¤¬Èϰϳ°¤Ç¤¹" + +#~ msgid "invalid %%-code" +#~ msgstr "̵¸ú¤Ê %%-code" + +#~ msgid "`%l' operand isn't a label" +#~ msgstr "`%l' ±é»»¤Ï¥é¥Ù¥ë¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "function might be possible candidate for attribute `noreturn'" +#~ msgstr "´Ø¿ô¤Ï¶²¤é¤¯ `noreturn' °À­¤Î¸õÊä¤È»×¤ï¤ì¤Þ¤¹" + +#~ msgid "`noreturn' function does return" +#~ msgstr "`noreturn' ´Ø¿ô¤¬ return ¤·¤Æ¤¤¤Þ¤¹" + +#~ msgid "control reaches end of non-void function" +#~ msgstr "À©¸æ¤¬Èó void ´Ø¿ô¤Î½ª¤ê¤ËÅþ㤷¤Þ¤·¤¿" + +#~ msgid "End insn %d for block %d not found in the insn stream." +#~ msgstr "½ªÎ»Ì¿Îá %d(¥Ö¥í¥Ã¥¯ %d) ¤¬°ìÏ¢¤ÎÌ¿ÎáÎó¤ÎÃæ¤Ë¸«¤Ä¤«¤ê¤Þ¤»¤ó¡£" + +#~ msgid "Insn %d is in multiple basic blocks (%d and %d)" +#~ msgstr "Ì¿Îá %d ¤¬Ê£¿ô¤Î´ðËÜ¥Ö¥í¥Ã¥¯(%d ¤È %d)¤ÎÃæ¤Ë¤¢¤ê¤Þ¤¹" + +#~ msgid "Head insn %d for block %d not found in the insn stream." +#~ msgstr "³«»ÏÌ¿Îá %d(¥Ö¥í¥Ã¥¯ %d) ¤¬°ìÏ¢¤ÎÌ¿ÎáÎó¤ÎÃæ¤Ë¸«¤Ä¤«¤ê¤Þ¤»¤ó¡£" + +#~ msgid "Basic block %i edge lists are corrupted" +#~ msgstr "´ðËÜ¥Ö¥í¥Ã¥¯ %i edge ¥ê¥¹¥È¤¬µ¡Ç½¤·¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "Basic block %d pred edge is corrupted" +#~ msgstr "´ðËÜ¥Ö¥í¥Ã¥¯ %d pred edge ¥ê¥¹¥È¤¬µ¡Ç½¤·¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "NOTE_INSN_BASIC_BLOCK is missing for block %d" +#~ msgstr "NOTE_INSN_BASIC_BLOCK ¤¬¥Ö¥í¥Ã¥¯ %d ¤Ë¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "NOTE_INSN_BASIC_BLOCK is missing for block %d\n" +#~ msgstr "NOTE_INSN_BASIC_BLOCK ¤¬¥Ö¥í¥Ã¥¯ %d ¤Ë¤¢¤ê¤Þ¤»¤ó\n" + +#~ msgid "NOTE_INSN_BASIC_BLOCK %d in the middle of basic block %d" +#~ msgstr "NOTE_INSN_BASIC_BLOCK %d ¤¬´ðËÜ¥Ö¥í¥Ã¥¯ %d ¤ÎÃæ¤Û¤É¤Ë¤¢¤ê¤Þ¤¹" + +#~ msgid "In basic block %d:" +#~ msgstr "´ðËÜ¥Ö¥í¥Ã¥¯ %d Æâ:" + +#~ msgid "number of bb notes in insn chain (%d) != n_basic_blocks (%d)" +#~ msgstr "Ì¿ÎáÏ¢º¿Ãæ¤Î bb ¤Î¿ô (%d) ¤¬ n_basic_blocks (%d) ¤È°ã¤¤¤Þ¤¹" + +#~ msgid "comparison is always %d due to width of bitfield" +#~ msgstr "¥Ó¥Ã¥È¥Õ¥£¡¼¥ë¥É¤ÎÉý¤Î¤»¤¤¤ÇÈæ³Ó¤¬¾ï¤Ë %d ¤È¤Ê¤ê¤Þ¤¹" + +#~ msgid "comparison is always %d" +#~ msgstr "Èæ³Ó¤¬¾ï¤Ë %d ¤È¤Ê¤ê¤Þ¤¹" + +#~ msgid "`or' of unmatched not-equal tests is always 1" +#~ msgstr "°ìÃפ·¤Ê¤¤ÃÍƱ»Î¤Ç¤ÎÈóÅù²Á¤Î `or' ¥Æ¥¹¥È¤Ï¾ï¤Ë 1 ¤Ç¤¹" + +#~ msgid "`and' of mutually exclusive equal-tests is always 0" +#~ msgstr "Áê¸ßÇÓ¾Ū¤ÊÃͤÎÅù²Á¤Î `and' ¥Æ¥¹¥È¤Ï¾ï¤Ë 0 ¤Ç¤¹" + +#~ msgid "`%s' might be used uninitialized in this function" +#~ msgstr "`%s' ¤Ï¤³¤Î´Ø¿ôÆâ¤Ç½é´ü²½¤µ¤ì¤º¤Ë»ÈÍѤµ¤ì¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "variable `%s' might be clobbered by `longjmp' or `vfork'" +#~ msgstr "ÊÑ¿ô `%s' ¤Ï `longjmp' ¤ä `vfork' ¤Ë¤è¤Ã¤Æ¹ó¤¤¤³¤È¤Ë¤Ê¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "argument `%s' might be clobbered by `longjmp' or `vfork'" +#~ msgstr "°ú¿ô `%s' ¤Ï `longjmp' ¤ä `vfork' ¤Ë¤è¤Ã¤Æ¹ó¤¤¤³¤È¤Ë¤Ê¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "function returns an aggregate" +#~ msgstr "´Ø¿ô¤¬½¸¹çÂΤòÊÖ¤·¤Æ¤¤¤Þ¤¹" + +#~ msgid "unused parameter `%s'" +#~ msgstr "°ú¿ô `%s' ¤¬Ì¤»ÈÍѤǤ¹" + +#~ msgid "Ambiguous abbreviation %s" +#~ msgstr "¤¢¤¤¤Þ¤¤¤Ê¾Êά %s ¤Ç¤¹" + +#~ msgid "Incomplete `%s' option" +#~ msgstr "ÉÔ´°Á´¤Ê `%s' ¥ª¥×¥·¥ç¥ó¤Ç¤¹" + +#~ msgid "Missing argument to `%s' option" +#~ msgstr "`%s' ¥ª¥×¥·¥ç¥ó¤ËÂФ¹¤ë°ú¿ô¤¬¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "Extraneous argument to `%s' option" +#~ msgstr "`%s' ¥ª¥×¥·¥ç¥ó¤ËÂФ·¤Æ̵´Ø·¸¤Ê°ú¿ô" + +#~ msgid "Using builtin specs.\n" +#~ msgstr "ÁȤ߹þ¤ß spec ¤ò»ÈÍÑ.\n" + +#~ msgid "" +#~ "Setting spec %s to '%s'\n" +#~ "\n" +#~ msgstr "" +#~ "spec %s ¤ò '%s' ¤ËÀßÄêÃæ\n" +#~ "\n" + +#~ msgid "Reading specs from %s\n" +#~ msgstr "%s ¤«¤é spec ¤òÆɤ߹þ¤ßÃæ\n" + +#~ msgid "specs %%include syntax malformed after %ld characters" +#~ msgstr "specs ¤Î %ld ʸ»úÌܰʹߤΠ%%include ¤Î½ñ¼°¤¬ÊѤǤ¹" + +#~ msgid "Could not find specs file %s\n" +#~ msgstr "spec ¥Õ¥¡¥¤¥ë %s ¤ò¸«¤Ä¤±¤ë¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿\n" + +#~ msgid "specs %%rename syntax malformed after %ld characters" +#~ msgstr "specs ¤Î %ld ʸ»úÌܰʹߤΠ%%rename ¤Î½ñ¼°¤¬ÊѤǤ¹" + +#~ msgid "specs %s spec was not found to be renamed" +#~ msgstr "spec ¥Õ¥¡¥¤¥ë %s ¤Ë̾Á°¤òÊѹ¹¤¹¤ë spec ¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó¤Ç¤·¤¿" + +#~ msgid "rename spec %s to %s\n" +#~ msgstr "spec %s ¤ò %s ¤Ë̾Á°¤òÊѹ¹\n" + +#~ msgid "" +#~ "spec is '%s'\n" +#~ "\n" +#~ msgstr "" +#~ "spec ¤Ï '%s' ¤Ç¤¹\n" +#~ "\n" + +#~ msgid "specs unknown %% command after %ld characters" +#~ msgstr "spec ¥Õ¥¡¥¤¥ëÃæ¤Î %ld ʸ»ú¤Î¸å¤ËÉÔÌÀ¤Ê %% ¥³¥Þ¥ó¥É" + +#~ msgid "specs file malformed after %ld characters" +#~ msgstr "%ld ʸ»ú¤Î¸å¤Ë¤ª¤«¤·¤Ê spec ¥Õ¥¡¥¤¥ë" + +#~ msgid "spec file has no spec for linking" +#~ msgstr "spec ¥Õ¥¡¥¤¥ë¤Ë¥ê¥ó¥¯¤Ë´Ø¤¹¤ë spec ¤¬¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "-pipe not supported" +#~ msgstr "-pipe ¤Ï¼ÂÁõ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "" +#~ "\n" +#~ "Go ahead? (y or n) " +#~ msgstr "" +#~ "\n" +#~ "³¤±¤Þ¤¹¤«? (y ¤Þ¤¿¤Ï n) " + +#~ msgid "" +#~ "Internal error: %s (program %s)\n" +#~ "Please submit a full bug report.\n" +#~ "See %s for instructions." +#~ msgstr "" +#~ "ÆâÉô¥¨¥é¡¼: %s (¥×¥í¥°¥é¥à %s)\n" +#~ "´°Á´¤Ê¥Ð¥°¥ì¥Ý¡¼¥È¤òÁ÷¤Ã¤Æ¤¯¤À¤µ¤¤¡£\n" +#~ "%s ¤Ë¼ê½ç¤¬½ñ¤¤¤Æ¤¢¤ê¤Þ¤¹¡£" + +#~ msgid "# %s %.2f %.2f\n" +#~ msgstr "# %s %.2f %.2f\n" + +#~ msgid "Usage: %s [options] file...\n" +#~ msgstr "»È¤¤Êý: %s [¥ª¥×¥·¥ç¥ó] ¥Õ¥¡¥¤¥ë...\n" + +#~ msgid "Options:\n" +#~ msgstr "¥ª¥×¥·¥ç¥ó:\n" + +#~ msgid " -pass-exit-codes Exit with highest error code from a phase\n" +#~ msgstr "" +#~ " -pass-exit-codes ¥Õ¥§¡¼¥º¤«¤é¤Î¥¨¥é¡¼¥³¡¼¥É¤ÎºÇÂçÃͤò exit\n" +#~ " ¥³¡¼¥É¤È¤·¤ÆÊÖ¤¹\n" + +#~ msgid " --help Display this information\n" +#~ msgstr " --help ¤³¤Î¥Ø¥ë¥×¾ðÊó¤òɽ¼¨\n" + +#~ msgid " --target-help Display target specific command line options\n" +#~ msgstr " --target-help ¥¿¡¼¥²¥Ã¥È¸ÇÍ­¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¥ª¥×¥·¥ç¥ó¤òɽ¼¨\n" + +#~ msgid " (Use '-v --help' to display command line options of sub-processes)\n" +#~ msgstr "(`-v --help' ¤ò»È¤¦¤È¡¢»Ò¥×¥í¥»¥¹¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¥ª¥×¥·¥ç¥ó¤òɽ¼¨)\n" + +#~ msgid " -dumpspecs Display all of the built in spec strings\n" +#~ msgstr " -dumpspecs ÁȤ߹þ¤Þ¤ì¤¿ spec ʸ»úÎó¤òÁ´¤Æɽ¼¨\n" + +#~ msgid " -dumpversion Display the version of the compiler\n" +#~ msgstr " -dumpversion ¥³¥ó¥Ñ¥¤¥é¤Î¥Ð¡¼¥¸¥ç¥ó¤òɽ¼¨\n" + +#~ msgid " -dumpmachine Display the compiler's target processor\n" +#~ msgstr " -dumpmachine ¥³¥ó¥Ñ¥¤¥é¤Î¥¿¡¼¥²¥Ã¥È¥×¥í¥»¥Ã¥µ¤òɽ¼¨\n" + +#~ msgid " -print-search-dirs Display the directories in the compiler's search path\n" +#~ msgstr " -print-search-dirs ¥³¥ó¥Ñ¥¤¥é¤Î¥µ¡¼¥Á¥Ñ¥¹¤Ë¤¢¤ë¥Ç¥£¥ì¥¯¥È¥ê¤òɽ¼¨\n" + +#~ msgid " -print-libgcc-file-name Display the name of the compiler's companion library\n" +#~ msgstr " -print-libgcc-file-name ¥³¥ó¥Ñ¥¤¥é¤Î¥³¥ó¥Ñ¥Ë¥ª¥ó¥é¥¤¥Ö¥é¥ê̾¤òɽ¼¨\n" + +#~ msgid " -print-file-name= Display the full path to library \n" +#~ msgstr " -print-file-name= ¥é¥¤¥Ö¥é¥ê ¤Ø¤Î¥Õ¥ë¥Ñ¥¹¤òɽ¼¨\n" + +#~ msgid " -print-prog-name= Display the full path to compiler component \n" +#~ msgstr " -print-prog-name= ¥³¥ó¥Ñ¥¤¥é¤ÎÉôÉÊ ¤Ø¤Î¥Õ¥ë¥Ñ¥¹¤òɽ¼¨\n" + +#~ msgid " -print-multi-directory Display the root directory for versions of libgcc\n" +#~ msgstr " -print-multi-directory libgcc ¤Î¥Ð¡¼¥¸¥ç¥ó¥Ç¥£¥ì¥¯¥È¥ê¥ë¡¼¥È¤òɽ¼¨\n" + +#~ msgid "" +#~ " -print-multi-lib Display the mapping between command line options and\n" +#~ " multiple library search directories\n" +#~ msgstr "" +#~ " -print-multi-lib ¥³¥Þ¥ó¥É¥é¥¤¥ó¥ª¥×¥·¥ç¥ó¤ÈÊ£¿ô¤Î¥é¥¤¥Ö¥é¥êõº÷\n" +#~ " ¥Ç¥£¥ì¥¯¥È¥ê¤È¤ÎÂбþ¤òɽ¼¨\n" + +#~ msgid " -Wa, Pass comma-separated on to the assembler\n" +#~ msgstr " -Wa, ¥«¥ó¥Þ¶èÀÚ¤ê¤Î ¤ò¥¢¥»¥ó¥Ö¥é¤ËÅϤ¹\n" + +#~ msgid " -Wp, Pass comma-separated on to the preprocessor\n" +#~ msgstr " -Wp, ¥«¥ó¥Þ¶èÀÚ¤ê¤Î ¤ò¥×¥ê¥×¥í¥»¥Ã¥µ¤ËÅϤ¹\n" + +#~ msgid " -Wl, Pass comma-separated on to the linker\n" +#~ msgstr " -Wl, ¥«¥ó¥Þ¶èÀÚ¤ê¤Î ¤ò¥ê¥ó¥«¤ËÅϤ¹\n" + +#~ msgid " -Xlinker Pass on to the linker\n" +#~ msgstr " -Xlinker ¤ò¥ê¥ó¥«¤ËÅϤ¹\n" + +#~ msgid " -save-temps Do not delete intermediate files\n" +#~ msgstr " -save-temps Ãæ´Ö¥Õ¥¡¥¤¥ë¤òºï½ü¤·¤Ê¤¤\n" + +#~ msgid " -pipe Use pipes rather than intermediate files\n" +#~ msgstr " -pipe Ãæ´Ö¥Õ¥¡¥¤¥ë¤Ç¤Ï¤Ê¤¯¥Ñ¥¤¥×¤ò»È¤¦\n" + +#~ msgid " -time Time the execution of each subprocess\n" +#~ msgstr " -time »Ò¥×¥í¥»¥¹¤´¤È¤Î¼Â¹Ô»þ´Ö¤ò·×¬¤¹¤ë\n" + +#~ msgid " -specs= Override builtin specs with the contents of \n" +#~ msgstr " -specs= ÁȤ߹þ¤ß specs ¤ò ¤ÎÆâÍƤÇÃÖ¤­´¹¤¨¤ë\n" + +#~ msgid " -std= Assume that the input sources are for \n" +#~ msgstr " -std= ÆþÎÏ¥½¡¼¥¹¤ò ¤È¸«¤Ê¤¹\n" + +#~ msgid " -B Add to the compiler's search paths\n" +#~ msgstr " -B ¤ò¥³¥ó¥Ñ¥¤¥é¤Îõº÷¥Ñ¥¹¤ËÄɲ乤ë\n" + +#~ msgid " -b Run gcc for target , if installed\n" +#~ msgstr "" +#~ " -b ¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤ì¤Ð¥¿¡¼¥²¥Ã¥È ¤È¤·¤Æ\n" +#~ " gcc ¤ò¼Â¹Ô¤¹¤ë\n" + +#~ msgid " -V Run gcc version number , if installed\n" +#~ msgstr "" +#~ " -V ¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤ì¤Ð ¥Ð¡¼¥¸¥ç¥óÈÖ¹æ¤Î\n" +#~ " gcc ¤È¤·¤Æ¼Â¹Ô¤¹¤ë\n" + +#~ msgid " -v Display the programs invoked by the compiler\n" +#~ msgstr " -v ¥³¥ó¥Ñ¥¤¥é¤Ë¤è¤Ã¤Æµ¯Æ°¤µ¤ì¤ë¥×¥í¥°¥é¥à¤òɽ¼¨\n" + +#~ msgid " -E Preprocess only; do not compile, assemble or link\n" +#~ msgstr "" +#~ " -E ¥×¥ê¥×¥í¥»¥¹¤Î¤ß -- ¥³¥ó¥Ñ¥¤¥ë¡¢¥¢¥»¥ó¥Ö¥ë¡¢¥ê¥ó¥¯\n" +#~ " ¤ò¹Ô¤Ê¤ï¤Ê¤¤\n" + +#~ msgid " -S Compile only; do not assemble or link\n" +#~ msgstr " -S ¥³¥ó¥Ñ¥¤¥ë¤Î¤ß -- ¥¢¥»¥ó¥Ö¥ë¡¢¥ê¥ó¥¯¤ò¹Ô¤Ê¤ï¤Ê¤¤\n" + +#~ msgid " -c Compile and assemble, but do not link\n" +#~ msgstr " -c ¥³¥ó¥Ñ¥¤¥ë¡¢¥¢¥»¥ó¥Ö¥ë¤¹¤ë¤¬¡¢¥ê¥ó¥¯¤ò¹Ô¤Ê¤ï¤Ê¤¤\n" + +#~ msgid " -o Place the output into \n" +#~ msgstr " -o ¤Ë½ÐÎϤò¹Ô¤Ê¤¦\n" + +#~ msgid "" +#~ " -x Specify the language of the following input files\n" +#~ " Permissable languages include: c c++ assembler none\n" +#~ " 'none' means revert to the default behaviour of\n" +#~ " guessing the language based on the file's extension\n" +#~ msgstr "" +#~ " -x °Ê²¼¤ÎÆþÎÏ¥Õ¥¡¥¤¥ë¤Î¸À¸ì¤ò»ØÄꤹ¤ë\n" +#~ " »ØÄê¤Ç¤­¤ë¸À¸ì: c c++ assembler none\n" +#~ " 'none' ¤ò»ØÄꤹ¤ë¤È¥Õ¥¡¥¤¥ë³ÈÄ¥»Ò¤Ë¤è¤Ã¤Æ¸À¸ì¤ò\n" +#~ " ¿äÄꤹ¤ë¡¢¥Ç¥Õ¥©¥ë¥È¤Î¿¶¤ëÉñ¤¤¤ËÌá¤ë\n" + +#~ msgid "" +#~ "\n" +#~ "Options starting with -g, -f, -m, -O, -W, or --param are automatically\n" +#~ " passed on to the various sub-processes invoked by %s. In order to pass\n" +#~ " other options on to these processes the -W options must be used.\n" +#~ msgstr "" +#~ "\n" +#~ "-g, -f, -m, -O, -W ¤Ç»Ï¤Þ¤ë¥ª¥×¥·¥ç¥ó¤ä¡¢--param ¤Ï %s ¤¬µ¯Æ°¤¹¤ë¤¢¤é¤æ¤ë\n" +#~ "»Ò¥×¥í¥»¥¹¤Ë¼«Æ°Åª¤ËÅϤµ¤ì¤Þ¤¹¡£¤³¤¦¤¤¤Ã¤¿¥×¥í¥»¥¹¤Ë¤½¤Î¾¤Î¥ª¥×¥·¥ç¥ó¤òÅϤ¹\n" +#~ "¤Ë¤Ï -W ¥ª¥×¥·¥ç¥ó¤ò»È¤ï¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£\n" + +#~ msgid "argument to `-Xlinker' is missing" +#~ msgstr "`-Xlinker' ¤Î°ú¿ô¤¬¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "argument to `-specs' is missing" +#~ msgstr "`-specs' ¤Î°ú¿ô¤¬¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "argument to `-specs=' is missing" +#~ msgstr "`-specs=' ¤Î°ú¿ô¤¬¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "argument to `-b' is missing" +#~ msgstr "`-b' ¤Î°ú¿ô¤¬¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "argument to `-B' is missing" +#~ msgstr "`-B' ¤Î°ú¿ô¤¬¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "argument to `-V' is missing" +#~ msgstr "`-V' ¤Î°ú¿ô¤¬¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "invalid version number format" +#~ msgstr "̵¸ú¤Ê¥Ð¡¼¥¸¥ç¥óÈÖ¹æ·Á¼°" + +#~ msgid "cannot specify -o with -c or -S and multiple compilations" +#~ msgstr "-c ¤ä -S ¤È°ì½ï¤Ë -o ¤ò»ØÄꤹ¤ë¤È¡¢Ê£¿ô¥³¥ó¥Ñ¥¤¥ë¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "Warning: -pipe ignored because -save-temps specified" +#~ msgstr "·Ù¹ð: -save-temps ¤¬»ØÄꤵ¤ì¤¿¤Î¤Ç -pipe ¤Ï̵»ë¤µ¤ì¤Þ¤¹" + +#~ msgid "Warning: -pipe ignored because -time specified" +#~ msgstr "·Ù¹ð: -time ¤¬»ØÄꤵ¤ì¤¿¤Î¤Ç -pipe ¤Ï̵»ë¤µ¤ì¤Þ¤¹" + +#~ msgid "argument to `-x' is missing" +#~ msgstr "`-x' ¤Î°ú¿ô¤¬¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "argument to `-%s' is missing" +#~ msgstr "`-%s' ¤Î°ú¿ô¤¬¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "Warning: `-x %s' after last input file has no effect" +#~ msgstr "·Ù¹ð: ºÇ¸å¤ÎÆþÎÏ¥Õ¥¡¥¤¥ë¤Î¸å¤Î `-x %s' ¤Ï²¿¤â¤·¤Þ¤»¤ó" + +#~ msgid "Invalid specification! Bug in cc." +#~ msgstr "̵¸ú¤Ê»ØÄê! cc ¤Î¥Ð¥°." + +#~ msgid "%s\n" +#~ msgstr "%s\n" + +#~ msgid "Spec failure: '%%*' has not been initialised by pattern match" +#~ msgstr "spec ¥¨¥é¡¼: '%%*' ¤Ï¥Ñ¥¿¡¼¥ó¥Þ¥Ã¥Á¤Ç½é´ü²½¤µ¤ì¤Ê¤¤¤Þ¤Þ¤Ç¤¹" + +#~ msgid "Warning: use of obsolete %%[ operator in specs" +#~ msgstr "·Ù¹ð: µì¼°¤Î %%[ ±é»»»Ò¤¬ spec ¤ÎÃæ¤Ë¤¢¤ê¤Þ¤¹" + +#~ msgid "Processing spec %c%s%c, which is '%s'\n" +#~ msgstr "spec %c%s%c ¤ò½èÍýÃæ, ¤³¤ì¤Ï '%s' ¤Ç¤¹\n" + +#~ msgid "Spec failure: Unrecognised spec option '%c'" +#~ msgstr "spec ¥¨¥é¡¼: ǧ¼±ÉÔǽ¤Ê spec ¥ª¥×¥·¥ç¥ó '%c'" + +#~ msgid "unrecognized option `-%s'" +#~ msgstr "ǧ¼±ÉÔǽ¤Ê¥ª¥×¥·¥ç¥ó `-%s'" + +#~ msgid "install: %s%s\n" +#~ msgstr "¥¤¥ó¥¹¥È¡¼¥ë: %s%s\n" + +#~ msgid "programs: %s\n" +#~ msgstr "¥×¥í¥°¥é¥à: %s\n" + +#~ msgid "libraries: %s\n" +#~ msgstr "¥é¥¤¥Ö¥é¥ê: %s\n" + +#~ msgid "" +#~ "\n" +#~ "For bug reporting instructions, please see:\n" +#~ msgstr "" +#~ "\n" +#~ "¥Ð¥°¥ì¥Ý¡¼¥È¤Î¼ê½ç¤Ï¡¢°Ê²¼¤ò»²¾È\n" + +#~ msgid "Configured with: %s\n" +#~ msgstr "¥³¥ó¥Õ¥£¥°¥ª¥×¥·¥ç¥ó: %s\n" + +#~ msgid "Thread model: %s\n" +#~ msgstr "¥¹¥ì¥Ã¥É¥â¥Ç¥ë: %s\n" + +#~ msgid "gcc version %s\n" +#~ msgstr "gcc ¥Ð¡¼¥¸¥ç¥ó %s\n" + +#~ msgid "gcc driver version %s executing gcc version %s\n" +#~ msgstr "gcc ¥É¥é¥¤¥Ð¥Ð¡¼¥¸¥ç¥ó %s ¼Â¹Ô gcc ¥Ð¡¼¥¸¥ç¥ó %s\n" + +#~ msgid "No input files" +#~ msgstr "ÆþÎÏ¥Õ¥¡¥¤¥ë¤¬¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "%s: %s compiler not installed on this system" +#~ msgstr "%s: %s ¥³¥ó¥Ñ¥¤¥é¤Ï¤³¤Î¥·¥¹¥Æ¥à¤Ë¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "%s: linker input file unused because linking not done" +#~ msgstr "%s: ¥ê¥ó¥¯¤¬´°Î»¤·¤Ê¤«¤Ã¤¿¤Î¤Ç¥ê¥ó¥«¤ÎÆþÎÏ¥Õ¥¡¥¤¥ë¤Ï»È¤ï¤ì¤Þ¤»¤ó¤Ç¤·¤¿" + +#~ msgid "language %s not recognized" +#~ msgstr "¸À¸ì %s ¤Ïǧ¼±¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "Internal gcc abort." +#~ msgstr "ÆâÉô gcc ÃæÃÇ" + +#~ msgid "Internal gcov abort.\n" +#~ msgstr "ÆâÉô gcc abort.\n" + +#~ msgid "gcov [-b] [-v] [-n] [-l] [-f] [-o OBJDIR] file\n" +#~ msgstr "gcov [-b] [-v] [-n] [-l] [-f] [-o OBJDIR] ¥Õ¥¡¥¤¥ë\n" + +#~ msgid "Could not open basic block file %s.\n" +#~ msgstr "´ðËÜ¥Ö¥í¥Ã¥¯¥Õ¥¡¥¤¥ë %s ¤ò³«¤±¤Þ¤»¤ó¤Ç¤·¤¿¡£\n" + +#~ msgid "Could not open data file %s.\n" +#~ msgstr "¥Ç¡¼¥¿¥Õ¥¡¥¤¥ë %s ¤ò³«¤¯¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£\n" + +#~ msgid "Assuming that all execution counts are zero.\n" +#~ msgstr "Á´¼Â¹Ô¿ô¤¬¥¼¥í¤Ç¤¢¤ë¤È²¾Äꤷ¤Þ¤¹¡£\n" + +#~ msgid "Could not open program flow graph file %s.\n" +#~ msgstr "¥×¥í¥°¥é¥à¥Õ¥í¡¼¥Õ¥¡¥¤¥ë %s ¤ò³«¤±¤Þ¤»¤ó¤Ç¤·¤¿¡£\n" + +#~ msgid "No executable code associated with file %s.\n" +#~ msgstr "¥Õ¥¡¥¤¥ë %s ¤Ë·ë¤ÓÉÕ¤¯¼Â¹Ô¥³¡¼¥É¤¬¤¢¤ê¤Þ¤»¤ó¡£\n" + +#~ msgid ".da file contents exhausted too early\n" +#~ msgstr ".da ¥Õ¥¡¥¤¥ë¤ÎÆâÍƤò¤¢¤Þ¤ê¤ËÁ᤯»È¤¤ÀڤäƤ·¤Þ¤¤¤Þ¤·¤¿\n" + +#~ msgid ".da file contents not exhausted\n" +#~ msgstr ".da ¥Õ¥¡¥¤¥ë¤ÎÆâÍƤò»È¤¤ÀڤäƤ¤¤Þ¤»¤ó\n" + +#~ msgid "%6.2f%% of %d source lines executed in function %s\n" +#~ msgstr "%6.2f%%(%d ¹ÔÃæ) ¤Î¥½¡¼¥¹¹Ô¤¬´Ø¿ô %s ¤Ç¼Â¹Ô¤µ¤ì¤Þ¤·¤¿\n" + +#~ msgid "No executable source lines in function %s\n" +#~ msgstr "´Ø¿ô %s ¤Ë¼Â¹Ô²Äǽ¤Ê¥½¡¼¥¹¹Ô¤¬¤¢¤ê¤Þ¤»¤ó\n" + +#~ msgid "%6.2f%% of %d branches executed in function %s\n" +#~ msgstr "%6.2f%%(%d ËÜÃæ) ¤Î¥Ö¥é¥ó¥Á¤¬´Ø¿ô %s Æâ¤Ç¼Â¹Ô¤µ¤ì¤Þ¤·¤¿\n" + +#~ msgid "%6.2f%% of %d branches taken at least once in function %s\n" +#~ msgstr "%6.2f%%(%d ËÜÃæ) ¤Î¥Ö¥é¥ó¥Á¤¬¾¯¤Ê¤¯¤È¤â°ìÅ٤ϴؿô %s ¤Ç¼õ¼è¤é¤ì¤Þ¤·¤¿\n" + +#~ msgid "No branches in function %s\n" +#~ msgstr "´Ø¿ô %s ¤Ë¤Ïʬ´ô¤¬¤¢¤ê¤Þ¤»¤ó\n" + +#~ msgid "%6.2f%% of %d calls executed in function %s\n" +#~ msgstr "%6.2f%%(%d ²ó) ¤Î¸Æ¤Ó½Ð¤·¤¬´Ø¿ô %s ¤Ç¼Â¹Ô¤µ¤ì¤Þ¤·¤¿\n" + +#~ msgid "No calls in function %s\n" +#~ msgstr "´Ø¿ô %s ¤Ë¸Æ¤Ó½Ð¤·¤¬¤¢¤ê¤Þ¤»¤ó\n" + +#~ msgid "didn't use all bb entries of graph, function %s\n" +#~ msgstr "¥°¥é¥Õ¤Î bb ¥¨¥ó¥È¥ê¤Î°ìÉô¤·¤«»È¤¤¤Þ¤»¤ó¤Ç¤·¤¿¡¢´Ø¿ô %s\n" + +#~ msgid "block_num = %ld, num_blocks = %d\n" +#~ msgstr "¥Ö¥í¥Ã¥¯¿ô = %ld¡¢ÈÖ¹æ¥Ö¥í¥Ã¥¯ = %d\n" + +#~ msgid "ERROR: too many basic blocks in .bb file %s\n" +#~ msgstr "¥¨¥é¡¼: .bb ¥Õ¥¡¥¤¥ë %s ¤Ë´ðËÜ¥Ö¥í¥Ã¥¯¤¬Â¿¤¹¤®¤Þ¤¹\n" + +#~ msgid "%6.2f%% of %d source lines executed in file %s\n" +#~ msgstr "%6.2f%%(%d ¹ÔÃæ) ¤Î¥½¡¼¥¹¹Ô¤¬¥Õ¥¡¥¤¥ë %s ¤Ç¼Â¹Ô¤µ¤ì¤Þ¤·¤¿\n" + +#~ msgid "No executable source lines in file %s\n" +#~ msgstr "¥Õ¥¡¥¤¥ë %s ¤Ë¼Â¹Ô²Äǽ¤Ê¥½¡¼¥¹¹Ô¤¬¤¢¤ê¤Þ¤»¤ó\n" + +#~ msgid "%6.2f%% of %d branches executed in file %s\n" +#~ msgstr "%6.2f%%(%d ËÜÃæ) ¤Î¥Ö¥é¥ó¥Á¤¬¥Õ¥¡¥¤¥ë %s ¤Ç¼Â¹Ô¤µ¤ì¤Þ¤·¤¿\n" + +#~ msgid "%6.2f%% of %d branches taken at least once in file %s\n" +#~ msgstr "%6.2f%%(%d ËÜÃæ) ¤Î¥Ö¥é¥ó¥Á¤¬¾¯¤Ê¤¯¤È¤â°ì²ó¤Ï¥Õ¥¡¥¤¥ë %s ¤Ç¼õ¼è¤é¤ì¤Þ¤·¤¿\n" + +#~ msgid "No branches in file %s\n" +#~ msgstr "¥Õ¥¡¥¤¥ë %s ¤Ë¤Ï¥Ö¥é¥ó¥Á¤¬¤¢¤ê¤Þ¤»¤ó\n" + +#~ msgid "%6.2f%% of %d calls executed in file %s\n" +#~ msgstr "%6.2f%%(%d ²óÃæ) ¤Î¸Æ¤Ó½Ð¤·¤¬¥Õ¥¡¥¤¥ë %s Æâ¤Ç¼Â¹Ô¤µ¤ì¤Þ¤·¤¿\n" + +#~ msgid "No calls in file %s\n" +#~ msgstr "¥Õ¥¡¥¤¥ë %s ¤Ë¸Æ¤Ó½Ð¤·¤¬¤¢¤ê¤Þ¤»¤ó\n" + +#~ msgid "Could not open source file %s.\n" +#~ msgstr "¥½¡¼¥¹¥Õ¥¡¥¤¥ë %s ¤ò³«¤±¤Þ¤»¤ó¤Ç¤·¤¿.\n" + +#~ msgid "Could not open output file %s.\n" +#~ msgstr "½ÐÎÏ¥Õ¥¡¥¤¥ë %s ¤ò³«¤±¤Þ¤»¤ó¤Ç¤·¤¿.\n" + +#~ msgid "Creating %s.\n" +#~ msgstr "%s ¤òºîÀ®Ãæ.\n" + +#~ msgid "call %d never executed\n" +#~ msgstr "¸Æ¤Ó½Ð¤· %d ¤Ï°ìÅÙ¤â¼Â¹Ô¤»¤º\n" + +#~ msgid "call %d returns = %d\n" +#~ msgstr "¸Æ¤Ó½Ð¤· %d ¤ÎÌá¤ê = %d\n" + +#~ msgid "call %d returns = %d%%\n" +#~ msgstr "¸Æ¤Ó½Ð¤· %d ¤ÎÌá¤ê = %d%%\n" + +#~ msgid "branch %d never executed\n" +#~ msgstr "¥Ö¥é¥ó¥Á %d ¤Ï°ìÅÙ¤â¼Â¹Ô¤µ¤ì¤º\n" + +#~ msgid "branch %d taken = %d\n" +#~ msgstr "¥Ö¥é¥ó¥Á %d ¼õÍý = %d\n" + +#~ msgid "branch %d taken = %d%%\n" +#~ msgstr "¥Ö¥é¥ó¥Á %d ¼õÍý = %d%%\n" + +#~ msgid "Unexpected EOF while reading source file %s.\n" +#~ msgstr "¥½¡¼¥¹¥Õ¥¡¥¤¥ë %s ¤òÆɤ߹þ¤ßÃæ¤Ëͽ´ü¤»¤Ì EOF.\n" + +#~ msgid "GCSE disabled: %d > 1000 basic blocks and %d >= 20 edges/basic block" +#~ msgstr "GCSE ¤ò̵¸ú²½: %d > 1000 ´ðËÜ¥Ö¥í¥Ã¥¯¡¢µÚ¤Ó %d >= 20 edge/´ðËÜ¥Ö¥í¥Ã¥¯" + +#~ msgid "GCSE disabled: %d basic blocks and %d registers" +#~ msgstr "GCSE ¤ò̵¸ú²½: %d ´ðËÜ¥Ö¥í¥Ã¥¯¡¢µÚ¤Ó %d ¸Ä¤Î¥ì¥¸¥¹¥¿" + +#~ msgid "fix_sched_param: unknown param: %s" +#~ msgstr "fix_sched_param: ÉÔÌÀ¤Ê¥Ñ¥é¥á¥¿: %s" + +#~ msgid "function cannot be inline" +#~ msgstr "´Ø¿ô¤ò inline ¤Ë¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "varargs function cannot be inline" +#~ msgstr "²ÄÊÑ°ú¿ô´Ø¿ô¤Ï inline ¤Ë¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "function using alloca cannot be inline" +#~ msgstr "alloca ¤ò»È¤Ã¤Æ¤¤¤ë´Ø¿ô¤Ï inline ¤Ë¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "function using setjmp cannot be inline" +#~ msgstr "setjmp ¤ò»È¤Ã¤Æ¤¤¤ë´Ø¿ô¤Ï inline ¤Ë¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "function uses __builtin_eh_return" +#~ msgstr "´Ø¿ô¤¬ __builtin_eh_return ¤ò»È¤¤¤Þ¤¹" + +#~ msgid "function with nested functions cannot be inline" +#~ msgstr "Æþ¤ì»Ò´Ø¿ô¤ò»ý¤Ä´Ø¿ô¤Ï inline ¤Ë¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "function with label addresses used in initializers cannot inline" +#~ msgstr "¥é¥Ù¥ë¥¢¥É¥ì¥¹¤ò»ý¤Á¡¢½é´ü²½»Ò¤Ç»È¤ï¤ì¤ë´Ø¿ô¤Ï inline ¤Ë¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "function too large to be inline" +#~ msgstr "´Ø¿ô¤¬Â礭¤¹¤®¤Æ inline ¤Ë¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "no prototype, and parameter address used; cannot be inline" +#~ msgstr "¥×¥í¥È¥¿¥¤¥×¤¬¤Ê¤¯¡¢²¾°ú¿ô¤Î¥¢¥É¥ì¥¹¤¬»È¤ï¤ì¤Æ¤¤¤ë -- inline ¤Ë¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "inline functions not supported for this return value type" +#~ msgstr "¤³¤ÎÌá¤êÃÍ·¿¤Î inline ´Ø¿ô¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤»¤ó" + +#~ msgid "function with varying-size return value cannot be inline" +#~ msgstr "²ÄÊÑŤÎÌá¤êÃͤòÊÖ¤¹´Ø¿ô¤Ï inline ¤Ë¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "function with varying-size parameter cannot be inline" +#~ msgstr "²ÄÊÑĹ°ú¿ô¤ò»ý¤Ä´Ø¿ô¤Ï inline ¤Ë¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "function with transparent unit parameter cannot be inline" +#~ msgstr "Æ©²á¶¦ÍÑÂΤΰú¿ô¤ò»ý¤Ä´Ø¿ô¤Ï inline ¤Ë¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "function with computed jump cannot inline" +#~ msgstr "»»½Ð¤µ¤ì¤¿¥¸¥ã¥ó¥×¤ò¹Ô¤Ê¤¦´Ø¿ô¤Ï inline ¤Ë¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "function with nonlocal goto cannot be inline" +#~ msgstr "Èó¥í¡¼¥«¥ë goto ¤ò»È¤Ã¤Æ¤¤¤ë´Ø¿ô¤Ï inline ¤Ë¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "function with target specific attribute(s) cannot be inlined" +#~ msgstr "¥¿¡¼¥²¥Ã¥È¸Çͭ°À­Éդδؿô¤Ï inline ¤Ë¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "internal error in check-init: tree code not implemented: %s" +#~ msgstr "check-init ¤ÇÆâÉô¥¨¥é¡¼: ¥Ä¥ê¡¼¥³¡¼¥É¤Ï¼ÂÁõ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó: %s" + +#~ msgid "internal error - too many interface type" +#~ msgstr "ÆâÉô¥¨¥é¡¼ - interface ·¿¤¬Â¿¤¹¤®¤Þ¤¹" + +#~ msgid "bad method signature" +#~ msgstr "ÉÔÀµ¤Ê¥á¥½¥Ã¥É¥·¥°¥Í¥¤¥Á¥ã¤Ç¤¹" + +#~ msgid "misplaced ConstantValue attribute (not in any field)" +#~ msgstr "ConstantValue °À­¤Î¾ì½ê¤ò´Ö°ã¤¨¤Æ¤¤¤Þ¤¹¡Ê¤É¤Î¥Õ¥£¡¼¥ë¥É¤Ç¤â¤¢¤ê¤Þ¤»¤ó¡Ë" + +#~ msgid "duplicate ConstanValue atribute for field '%s'" +#~ msgstr "¥Õ¥£¡¼¥ë¥É '%s' ¤Î ConstantValue °À­¤¬½ÅÊ£¤·¤Æ¤¤¤Þ¤¹" + +#~ msgid "field '%s' not found in class" +#~ msgstr "¥Õ¥£¡¼¥ë¥É '%s' ¤¬¥¯¥é¥¹Æâ¤Ë¸«¤Ä¤«¤ê¤Þ¤»¤ó" + +#~ msgid "abstract method in non-abstract class" +#~ msgstr "abstract ¥á¥½¥Ã¥É¤¬ÈóÃê¾Ý¥¯¥é¥¹¤Ë¤¢¤ê¤Þ¤¹" + +#~ msgid "non-static method '%s' overrides static method" +#~ msgstr "ÈóÀÅŪ¥á¥½¥Ã¥É '%s' ¤¬ÀÅŪ¥á¥½¥Ã¥É¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Æ¤¤¤Þ¤¹" + +#~ msgid "In %s: overlapped variable and exception ranges at %d" +#~ msgstr "%s Æâ: ÊÑ¿ô¤ÈÎã³°ÈϰϤ¬ %d ¤Ç½Å¤Ê¤Ã¤Æ¤¤¤Þ¤¹" + +#~ msgid "bad type in parameter debug info" +#~ msgstr "²¾°ú¿ô¥Ç¥Ð¥Ã¥°¾ðÊó¤ËÉÔÀµ¤Ê·¿¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "bad PC range for debug info for local `%s'" +#~ msgstr "¥í¡¼¥«¥ë¤Î `%s' ÍѥǥХå°¾ðÊó¤Î¤¿¤á¤Î PC ÈϰϤ¬ÉÔÀµ¤Ç¤¹" + +#~ msgid "stack underflow - dup* operation" +#~ msgstr "¥¹¥¿¥Ã¥¯¥¢¥ó¥À¡¼¥Õ¥í¡¼ - dup* Áàºî" + +#~ msgid "reference `%s' is ambiguous: appears in interface `%s' and interface `%s'" +#~ msgstr "»²¾È `%s' ¤ÏÛ£Ëæ¤Ç¤¹: interface `%s' ¤È interface `%s' ¤Ë¸½¤ì¤Þ¤·¤¿" + +#~ msgid "field `%s' not found" +#~ msgstr "¥Õ¥£¡¼¥ë¥É `%s' ¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó" + +#~ msgid "ret instruction not implemented" +#~ msgstr "ret Ì¿Îá¤Ï¼ÂÁõ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "method '%s' not found in class" +#~ msgstr "¥á¥½¥Ã¥É '%s' ¤Ï¥¯¥é¥¹Æâ¤Ë¸«¤Ä¤«¤ê¤Þ¤»¤ó" + +#~ msgid "failed to find class '%s'" +#~ msgstr "'%s' ¥¯¥é¥¹¤ò¸«¤Ä¤±¤ë¤Î¤Ë¼ºÇÔ¤·¤Þ¤·¤¿" + +#~ msgid "Class '%s' has no method named '%s' matching signature '%s'" +#~ msgstr "¥¯¥é¥¹ '%s' ¤Ï̾Á°¤¬ '%s' ¤Ç¥·¥°¥Í¥¤¥Á¥ã '%s' ¤È°ìÃפ¹¤ë¥á¥½¥Ã¥É¤ò»ý¤Ã¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "invokestatic on non static method" +#~ msgstr "ÈóÀÅŪ¥á¥½¥Ã¥É¤Ë invokestatic ¤·¤Þ¤·¤¿" + +#~ msgid "invokestatic on abstract method" +#~ msgstr "Ãê¾Ý¥á¥½¥Ã¥É¤Ë invokestatic ¤·¤Þ¤·¤¿" + +#~ msgid "invoke[non-static] on static method" +#~ msgstr "ÀÅŪ¥á¥½¥Ã¥É¤Ë invoke[Èó static] ¤·¤Þ¤·¤¿" + +#~ msgid "Missing field '%s' in '%s'" +#~ msgstr "¥Õ¥£¡¼¥ë¥É '%s'('%s' Æâ) ¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "Mismatching signature for field '%s' in '%s'" +#~ msgstr "¥Õ¥£¡¼¥ë¥É '%s'('%s' Æâ) ¤Î¥·¥°¥Í¥¤¥Á¥ã¤¬°ìÃפ·¤Þ¤»¤ó" + +#~ msgid "assignment to final field `%s' not in field's class" +#~ msgstr "final ¥Õ¥£¡¼¥ë¥É `%s' ¤Ø¤ÎÂåÆþ¤Ç¤¹¤¬¡¢¤½¤Î¥Õ¥£¡¼¥ë¥É¤Î¥¯¥é¥¹Æâ¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "assignment to final static field `%s' not in class initializer" +#~ msgstr "final static ¥Õ¥£¡¼¥ë¥É `%s' ¤Ø¤ÎÂåÆþ¤Ç¤¹¤¬¡¢¤½¤Î¥Õ¥£¡¼¥ë¥É¤Î¥¯¥é¥¹Æâ¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "assignment to final field `%s' not in constructor" +#~ msgstr "final ¥Õ¥£¡¼¥ë¥É `%s' ¤Ø¤ÎÂåÆþ¤Ç¤¹¤¬¡¢¥³¥ó¥¹¥È¥é¥¯¥¿Æâ¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "Can't expand %s" +#~ msgstr "%s ¤òŸ³«¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "invalid PC in line number table" +#~ msgstr "̵¸ú¤Ê PC ¤¬¹ÔÈÖ¹æ¥Æ¡¼¥Ö¥ë¤Ë¤¢¤ê¤Þ¤¹" + +#~ msgid "Unreachable bytecode from %d to before %d." +#~ msgstr "%d ¤«¤é %d ¤ÎÁ°¤Þ¤Ç¤Î¥Ð¥¤¥È¥³¡¼¥É¤Ë¤ÏÅþã¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "Unreachable bytecode from %d to the end of the method." +#~ msgstr "%d ¤«¤é¥á¥½¥Ã¥É¤Î½ª¤ê¤Þ¤Ç¤Î¥Ð¥¤¥È¥³¡¼¥É¤Ë¤ÏÅþã¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "unrecogized wide sub-instruction" +#~ msgstr "ǧ¼±¤Ç¤­¤Ê¤¤ wide sub Ì¿Îá¤Ç¤¹" + +#~ msgid "Source file for class `%s' is newer than its matching class file. Source file used instead" +#~ msgstr "¥¯¥é¥¹ `%s' ¤Î¥½¡¼¥¹¥Õ¥¡¥¤¥ë¤Ï¡¢°ìÃפ¹¤ë¥¯¥é¥¹¥Õ¥¡¥¤¥ë¤è¤ê¿·¤·¤¤¤Ç¤¹¡£¥½¡¼¥¹¥Õ¥¡¥¤¥ë¤òÂå¤ê¤Ë»È¤¤¤Þ¤¹" + +#~ msgid "bad string constant" +#~ msgstr "ÉÔÀµ¤Êʸ»úÎóÄê¿ô¤Ç¤¹" + +#~ msgid "bad value constant type %d, index %d" +#~ msgstr "ÉÔÀµ¤ÊÄê¿ôÃÍ·¿ %d, ¥¤¥ó¥Ç¥Ã¥¯¥¹ %d" + +#~ msgid "can't reopen %s" +#~ msgstr "%s ¤òºÆ open ¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "Cannot find file for class %s." +#~ msgstr "¥¯¥é¥¹ %s ÍѤΥե¡¥¤¥ë¤ò¸«¤Ä¤±¤é¤ì¤Þ¤»¤ó¡£" + +#~ msgid "not a valid Java .class file" +#~ msgstr "Àµ¾ï¤Ê Java .class ¥Õ¥¡¥¤¥ë¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "error while parsing constant pool" +#~ msgstr "constant ¥×¡¼¥ë¤Î¹½Ê¸²òÀÏÃæ¤Ë¥¨¥é¡¼¤¬È¯À¸¤·¤Þ¤·¤¿" + +#~ msgid "error in constant pool entry #%d\n" +#~ msgstr "constant ¥×¡¼¥ë¹àÌÜ #%d Æâ¤Ç¥¨¥é¡¼¤¬È¯À¸¤·¤Þ¤·¤¿\n" + +#~ msgid "reading class %s for the second time from %s" +#~ msgstr "class %s ¤òÆɹþ¤à¤Î¤Ï %s ¤«¤éÆó²óÌܤˤʤê¤Þ¤¹" + +#~ msgid "error while parsing fields" +#~ msgstr "¥Õ¥£¡¼¥ë¥É¤Î¹½Ê¸²òÀÏÃæ¤Ë¥¨¥é¡¼¤¬È¯À¸¤·¤Þ¤·¤¿" + +#~ msgid "error while parsing methods" +#~ msgstr "¥á¥½¥Ã¥É¤Î¹½Ê¸²òÀÏÃæ¤Ë¥¨¥é¡¼¤¬È¯À¸¤·¤Þ¤·¤¿" + +#~ msgid "error while parsing final attributes" +#~ msgstr "final °À­¤Î¹½Ê¸²òÀÏÃæ¤Ë¥¨¥é¡¼¤¬È¯À¸¤·¤Þ¤·¤¿" + +#~ msgid "The `java.lang.Object' that was found in `%s' didn't have the special zero-length `gnu.gcj.gcj-compiled' attribute. This generally means that your classpath is incorrect set. Use `info gcj \"Input Options\"' to see the info page describing how to set the classpath." +#~ msgstr "`%s' Æâ¤Ç¸«¤Ä¤«¤Ã¤¿ `java.lang.Object' ¤Ï¡¢Ä¹¤µ¥¼¥í¤ÎÆÃÊÌ¤Ê `gnu.gcj.gcj-compiled' °À­¤ò»ý¤Ã¤Æ¤¤¤Þ¤»¤ó¡£¤³¤ì¤ÏÉáÄ̤¢¤Ê¤¿¤Î¥¯¥é¥¹¥Ñ¥¹¤¬Àµ¤·¤¯ÀßÄꤵ¤ì¤Æ¤¤¤Ê¤¤»ö¤ò°ÕÌ£¤·¤Þ¤¹¡£`info gcj \"Input Options\"' ¤ò»È¤Ã¤Æ¡¢¥¯¥é¥¹¥Ñ¥¹¤ÎÀßÄêÊýË¡¤òÀâÌÀ¤·¤Æ¤¢¤ë info ¥Ú¡¼¥¸¤ò¸«¤Æ²¼¤µ¤¤" + +#~ msgid "missing Code attribute" +#~ msgstr "Code °À­¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "error closing %s" +#~ msgstr "¥¨¥é¡¼¤Ë¤è¤ê %s ¤òÊĤ¸¤Þ¤¹" + +#~ msgid "source file seen twice on command line and will be compiled only once." +#~ msgstr "¥½¡¼¥¹¥Õ¥¡¥¤¥ë¤¬¥³¥Þ¥ó¥É¥é¥¤¥ó¤ËºÆ¤Ó¸½¤ì¤Þ¤·¤¿¤¬¡¢¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤ë¤Î¤Ï°ìÅÙ¤À¤±¤Ç¤¹" + +#~ msgid "no input file specified" +#~ msgstr "ÆþÎÏ¥Õ¥¡¥¤¥ë¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "can't close input file %s" +#~ msgstr "ÆþÎÏ¥Õ¥¡¥¤¥ë %s ¤ò close ¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "Premature end of input file %s" +#~ msgstr "ÆþÎÏ¥Õ¥¡¥¤¥ë %s ¤Î½ª¤ê¤Ë㤹¤ë¤Î¤¬Á᤹¤®¤Þ¤¹" + +#~ msgid "bad zip/jar file %s" +#~ msgstr "zip/jar ¥Õ¥¡¥¤¥ë %s ¤ÏÉÔÀµ¤Ç¤¹" + +#~ msgid "internal error in generate_bytecode_insn - tree code not implemented: %s" +#~ msgstr "generate_bytecode_insn ¤ÇÆâÉô¥¨¥é¡¼ - ¥Ä¥ê¡¼¥³¡¼¥É¤Ï¼ÂÁõ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó: %s" + +#~ msgid "can't create directory %s" +#~ msgstr "¥Ç¥£¥ì¥¯¥È¥ê %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "can't to open %s" +#~ msgstr "%s ¤ò open ¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "Only one of `--print-main', `--list-class', and `--complexity' allowed" +#~ msgstr "`--print-main', `--list-class', `--complexity' ¤«¤é¤Ï°ì¤Ä¤·¤«Áª¤Ù¤Þ¤»¤ó" + +#~ msgid "Can't open output file `%s'" +#~ msgstr "½ÐÎÏ¥Õ¥¡¥¤¥ë `%s' ¤ò open ¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "File not found `%s'" +#~ msgstr "¥Õ¥¡¥¤¥ë `%s' ¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó" + +#~ msgid "can't specify `-D' without `--main'\n" +#~ msgstr "`--main' ̵¤·¤Ç¤Ï `-D' ¤ò»ØÄê¤Ç¤­¤Þ¤»¤ó\n" + +#~ msgid "Warning: already-compiled .class files ignored with -C" +#~ msgstr "·Ù¹ð: ¥³¥ó¥Ñ¥¤¥ëºÑ .class ¥Õ¥¡¥¤¥ë¤Ï -C ¤Ë¤è¤ê̵»ë¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "cannot specify both -C and -o" +#~ msgstr "-C ¤È -o ¤ÏξÊý¤ò°ì½ï¤Ë»ØÄê¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "cannot create temporary file" +#~ msgstr "°ì»þ¥Õ¥¡¥¤¥ë¤òºîÀ®¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "using both @FILE with multiple files not implemented" +#~ msgstr "@FILE ¤Ç¤ÎÊ£¿ô¥Õ¥¡¥¤¥ë¤Î»ÈÍѤϼÂÁõ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "cannot specify `main' class when not linking" +#~ msgstr "¥ê¥ó¥¯»þ°Ê³°¤Ë¤Ï `main' ¥¯¥é¥¹¤ò»ØÄê¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "Disable automatic array bounds checking" +#~ msgstr "¼«Æ°Åª¤ÊÇÛÎó¶­³¦¸¡ºº¤ò¹Ô¤ï¤Ê¤¤" + +#~ msgid "Make is_compiled_class return 1" +#~ msgstr "is_compiled_class ¤¬ 1 ¤òÊÖ¤¹¤è¤¦¤Ë¤¹¤ë" + +#~ msgid "Dump class files to .class" +#~ msgstr "¥¯¥é¥¹¤ò .class ¥Õ¥¡¥¤¥ë¤Ø¥À¥ó¥×¤¹¤ë" + +#~ msgid "input file is list of file names to compile" +#~ msgstr "ÆþÎÏ¥Õ¥¡¥¤¥ë¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¥Õ¥¡¥¤¥ë̾¤Î¥ê¥¹¥È¤È¤¹¤ë" + +#~ msgid "Generate code for Boehm GC" +#~ msgstr "Boehm GC ÍѤΥ³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Don't put synchronization structure in each object" +#~ msgstr "Ʊ´ü¹½Â¤ÂΤò³Æ¥ª¥Ö¥¸¥§¥¯¥È¤ËÁȤßÆþ¤ì¤Ê¤¤" + +#~ msgid "Assume native functions are implemented using JNI" +#~ msgstr "native ´Ø¿ô¤¬ JNI ¤òÍøÍѤ·¤Æ¼ÂÁõ¤·¤Æ¤¤¤ë¤â¤Î¤È¤ß¤Ê¤¹" + +#~ msgid "Set class path and suppress system path" +#~ msgstr "¥¯¥é¥¹¥Ñ¥¹¤òÀßÄꤷ¤Æ¥·¥¹¥Æ¥à¥Ñ¥¹¤ò±£¤¹" + +#~ msgid "Set class path" +#~ msgstr "¥¯¥é¥¹¥Ñ¥¹¤òÀßÄꤹ¤ë" + +#~ msgid "Choose class whose main method should be used" +#~ msgstr "main ¥á¥½¥Ã¥É¤¬»È¤ï¤ì¤ë¤Ù¤­¥¯¥é¥¹¤òÁªÂò¤¹¤ë" + +#~ msgid "Choose input encoding (default is UTF-8)" +#~ msgstr "ÆþÎÏ¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤òÁªÂò¤¹¤ë(¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï UTF-8)" + +#~ msgid "Add directory to class path" +#~ msgstr "¥¯¥é¥¹¥Ñ¥¹¤Ë¥Ç¥£¥ì¥¯¥È¥ê¤òÄɲ乤ë" + +#~ msgid "Directory where class files should be written" +#~ msgstr "¥¯¥é¥¹¥Õ¥¡¥¤¥ë¤¬½ñ¤­¹þ¤Þ¤ì¤ë¥Ç¥£¥ì¥¯¥È¥ê" + +#~ msgid "Use built-in instructions for division" +#~ msgstr "ÁȤ߹þ¤ß¤Î½ü»»Ì¿Îá¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Warn if modifiers are specified when not necessary" +#~ msgstr "»ØÄꤵ¤ì¤¿½¤¾þ»Ò¤¬ÉÔÍפʤâ¤Î¤Ç¤¢¤ì¤Ð·Ù¹ð¤¹¤ë" + +#~ msgid "Warn if deprecated empty statements are found" +#~ msgstr "¿ä¾©¤µ¤ì¤Ê¤¤¶õʸ¤¬¸«¤Ä¤«¤ì¤Ð·Ù¹ð¤¹¤ë" + +#~ msgid "Warn if .class files are out of date" +#~ msgstr ".class ¥Õ¥¡¥¤¥ë¤¬¥½¡¼¥¹¥Õ¥¡¥¤¥ë¤è¤ê¸Å¤±¤ì¤Ð·Ù¹ð¤¹¤ë" + +#~ msgid "Always check for non gcj generated classes archives" +#~ msgstr "gcj ¤¬À¸À®¤·¤Æ¤¤¤Ê¤¤¥¯¥é¥¹¥¢¡¼¥«¥¤¥Ö¤ò¾ï¤Ë¸¡ºº¤¹¤ë" + +#~ msgid "can't do dependency tracking with input from stdin" +#~ msgstr "ɸ½àÆþÎϤ«¤é¤ÎÆþÎϤǤϰ͸´Ø·¸¤ÎÄÉÀפ¬¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "" +#~ "unknown encoding: `%s'\n" +#~ "This might mean that your locale's encoding is not supported\n" +#~ "by your system's iconv(3) implementation. If you aren't trying\n" +#~ "to use a particular encoding for your input file, try the\n" +#~ "`--encoding=UTF-8' option." +#~ msgstr "" +#~ "ÉÔÌÀ¤Ê¥¨¥ó¥³¡¼¥É: `%s'\n" +#~ "¤³¤ì¤Ï¤¢¤Ê¤¿¤Î¥í¥±¡¼¥ë¤Î¥¨¥ó¥³¡¼¥É¤¬¥·¥¹¥Æ¥à¤Î iconv(3) ¼ÂÁõ¤¬\n" +#~ "¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Ê¤¤¤È±¾¤¦»ö¤ò°ÕÌ£¤·¤Þ¤¹¡£¤â¤·¤¢¤Ê¤¿¤¬ÆþÎÏ¥Õ¥¡¥¤¥ë\n" +#~ "¤ÎÆÃÄꥨ¥ó¥³¡¼¥É¤ò»È¤¦¤Î¤Ç¤Ê¤±¤ì¤Ð¡¢`--encoding=UTF-8' ¥ª¥×¥·¥ç¥ó\n" +#~ "¤ò»È¤Ã¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£" + +#~ msgid "Can't mangle %s" +#~ msgstr "%s ¤Î̾Á°ÊÑ´¹(mangle) ¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "internal error - invalid Utf8 name" +#~ msgstr "ÆâÉô¥¨¥é¡¼ - ̵¸ú¤Ê Utf8 ̾¤Ç¤¹" + +#~ msgid "Missing name" +#~ msgstr "̾Á°¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "';' expected" +#~ msgstr "';' ¤¬É¬ÍפǤ¹" + +#~ msgid "'*' expected" +#~ msgstr "'*' ¤¬É¬ÍפǤ¹" + +#~ msgid "Class or interface declaration expected" +#~ msgstr "¥¯¥é¥¹¤ä¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹Àë¸À¤¬É¬ÍפǤ¹" + +#~ msgid "Missing class name" +#~ msgstr "¥¯¥é¥¹Ì¾¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "'{' expected" +#~ msgstr "'{' ¤¬É¬ÍפǤ¹" + +#~ msgid "Missing super class name" +#~ msgstr "¥¹¡¼¥Ñ¡¼¥¯¥é¥¹Ì¾¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "Missing interface name" +#~ msgstr "¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹Ì¾¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "Missing term" +#~ msgstr "¹à¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "Missing variable initializer" +#~ msgstr "ÊÑ¿ô½é´ü²½»Ò¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "Invalid declaration" +#~ msgstr "̵¸ú¤ÊÀë¸À¤Ç¤¹" + +#~ msgid "Can't specify array dimension in a declaration" +#~ msgstr "ÇÛÎó¤Î¼¡¸µ¤òÀë¸À¤Ç»ØÄꤹ¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "']' expected" +#~ msgstr "']' ¤¬É¬ÍפǤ¹" + +#~ msgid "Unbalanced ']'" +#~ msgstr "Âбþ¤Î¤Ê¤¤ ']' ¤Ç¤¹" + +#~ msgid "Invalid method declaration, method name required" +#~ msgstr "̵¸ú¤Ê¥á¥½¥Ã¥ÉÀë¸À¤Ç¤¹¡£¥á¥½¥Ã¥É̾¤¬É¬ÍפǤ¹" + +#~ msgid "Identifier expected" +#~ msgstr "¼±Ê̻Ҥ¬É¬ÍפǤ¹" + +#~ msgid "Invalid method declaration, return type required" +#~ msgstr "̵¸ú¤Ê¥á¥½¥Ã¥ÉÀë¸À¤Ç¤¹¡£¥á¥½¥Ã¥É̾¤¬É¬ÍפǤ¹" + +#~ msgid "')' expected" +#~ msgstr "')' ¤¬É¬ÍפǤ¹" + +#~ msgid "Missing formal parameter term" +#~ msgstr "Àµ¼°¤Ê²¾°ú¿ô¹à¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "Missing identifier" +#~ msgstr "¼±Ê̻Ҥò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "Missing class type term" +#~ msgstr "¥¯¥é¥¹¥¿¥¤¥×¹à¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "Invalid interface type" +#~ msgstr "¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹·¿¤¬Ìµ¸ú¤Ç¤¹" + +#~ msgid "':' expected" +#~ msgstr "':' ¤¬É¬ÍפǤ¹" + +#~ msgid "Invalid expression statement" +#~ msgstr "¼°Ê¸¤¬Ìµ¸ú¤Ç¤¹" + +#~ msgid "'(' expected" +#~ msgstr "'(' ¤¬É¬ÍפǤ¹" + +#~ msgid "Missing term or ')'" +#~ msgstr "¹à¤Þ¤¿¤Ï ')' ¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "Missing term and ')' expected" +#~ msgstr "¹à¤Èɬ¿Ü¤Î ')' ¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "Invalid control expression" +#~ msgstr "̵¸ú¤ÊÀ©¸æ¼°¤Ç¤¹" + +#~ msgid "Invalid update expression" +#~ msgstr "̵¸ú¤Ê¹¹¿·¼°¤Ç¤¹" + +#~ msgid "Invalid init statement" +#~ msgstr "̵¸ú¤Ê½é´ü²½¼°¤Ç¤¹" + +#~ msgid "Missing term or ')' expected" +#~ msgstr "¹à¤Þ¤¿¤Ïɬ¿Ü¤Î ')' ¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "'class' or 'this' expected" +#~ msgstr "'class' ¤Þ¤¿¤Ï 'this' ¤¬É¬ÍפǤ¹" + +#~ msgid "'class' expected" +#~ msgstr "'class' ¤¬É¬ÍפǤ¹" + +#~ msgid "')' or term expected" +#~ msgstr "')' ¤Þ¤¿¤Ï¹à¤¬É¬ÍפǤ¹" + +#~ msgid "'[' expected" +#~ msgstr "'[' ¤¬É¬ÍפǤ¹" + +#~ msgid "Field expected" +#~ msgstr "¥Õ¥£¡¼¥ë¥É¤¬É¬ÍפǤ¹" + +#~ msgid "Missing term and ']' expected" +#~ msgstr "¹à¤Èɬ¿Ü¤Î ']' ¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "']' expected, invalid type expression" +#~ msgstr "']' ¤¬É¬Íפǡ¢Ìµ¸ú¤Ê·¿É½¸½¤Ç¤¹" + +#~ msgid "Invalid type expression" +#~ msgstr "̵¸ú¤Ê·¿É½¸½¤Ç¤¹" + +#~ msgid "Invalid reference type" +#~ msgstr "̵¸ú¤Ê»²¾È·¿¤Ç¤¹" + +#~ msgid "Constructor invocation must be first thing in a constructor" +#~ msgstr "¥³¥ó¥¹¥È¥é¥¯¥¿¤Îµ¯Æ°¤Ï¥³¥ó¥¹¥È¥é¥¯¥¿Æâ¤ÇºÇ½é¤Ë¹Ô¤Ê¤ï¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó" + +#~ msgid "Only constructors can invoke constructors" +#~ msgstr "¥³¥ó¥¹¥È¥é¥¯¥¿¤À¤±¤¬¥³¥ó¥¹¥È¥é¥¯¥¿¤òµ¯Æ°¤Ç¤­¤Þ¤¹" + +#~ msgid ": `%s' JDK1.1(TM) feature" +#~ msgstr ": `%s' ¤Ï JDK1.1(TM) ¤Îµ¡Ç½¤Ç¤¹" + +#~ msgid "" +#~ "%s.\n" +#~ "%s" +#~ msgstr "" +#~ "%s.\n" +#~ "%s" + +#~ msgid "Can't use '$' as a separator for inner classes" +#~ msgstr "'$' ¤ÏÆâÉô¥¯¥é¥¹¤Î¶èÀÚ¤ê»Ò¤È¤·¤Æ»ÈÍѤǤ­¤Þ¤»¤ó" + +#~ msgid "malformed .zip archive in CLASSPATH: %s" +#~ msgstr "CLASSPATH Æâ¤ËÊÑ¤Ê .zip ¥¢¡¼¥«¥¤¥Ö¤¬¤¢¤ê¤Þ¤¹: %s" + +#~ msgid "Can't find default package `%s'. Check the CLASSPATH environment variable and the access to the archives." +#~ msgstr "¥Ç¥Õ¥©¥ë¥È¥Ñ¥Ã¥±¡¼¥¸ `%s' ¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó¡£CLASSPATH ´Ä¶­ÊÑ¿ô¤È¥¢¡¼¥«¥¤¥Ö¤Ø¤Î¥¢¥¯¥»¥¹¤ò³Î¤«¤á¤Æ¤¯¤À¤µ¤¤¡£" + +#~ msgid "missing static field `%s'" +#~ msgstr "static ¥Õ¥£¡¼¥ë¥É `%s' ¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "not a static field `%s'" +#~ msgstr "static ¥Õ¥£¡¼¥ë¥É `%s' ¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "No case for %s" +#~ msgstr "%s ¤Î¤¿¤á¤Î case ¤¬¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "unregistered operator %s" +#~ msgstr "ÅÐÏ¿¤µ¤ì¤Æ¤¤¤Ê¤¤±é»»»Ò %s ¤Ç¤¹" + +#~ msgid "internal error - use of undefined type" +#~ msgstr "ÆâÉô¥¨¥é¡¼ - ̤ÄêµÁ·¿¤Î»ÈÍѤǤ¹" + +#~ msgid "junk at end of signature string" +#~ msgstr "¥·¥°¥Í¥¤¥Á¥ãʸ»úÎó¤Î½ª¤ê¤Ë¥´¥ß¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "bad pc in exception_table" +#~ msgstr "exception_table ¤ËÉÔÀµ¤Ê pc ¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "unknown opcode %d@pc=%d during verification" +#~ msgstr "ÉÔÌÀ¤Ê opcode %d@pc=%d ¤ò¸¡¾ÚÃæ¤Ëȯ¸«¤·¤Þ¤·¤¿" + +#~ msgid "verification error at PC=%d" +#~ msgstr "¸¡¾Ú¥¨¥é¡¼ (PC=%d)" + +#~ msgid "Dump decls to a .decl file" +#~ msgstr "Àë¸À¤ò .decl ¥Õ¥¡¥¤¥ë¤Ë¥À¥ó¥×¤¹¤ë" + +#~ msgid "Generate code for GNU runtime environment" +#~ msgstr "GNU ¼Â¹Ô´Ä¶­ÍѤΥ³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Generate code for NeXT runtime environment" +#~ msgstr "NeXT ¼Â¹Ô´Ä¶­ÍѤΥ³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Warn if a selector has multiple methods" +#~ msgstr "¥»¥ì¥¯¥¿¤¬Ê£¿ô¤Î¥á¥½¥Ã¥É¤ò»ý¤Ã¤Æ¤¤¤ì¤Ð·Ù¹ð¤¹¤ë" + +#~ msgid "Do not warn if inherited methods are unimplemented" +#~ msgstr "ÇÉÀ¸¥á¥½¥Ã¥É¤¬Ì¤¼ÂÁõ¤Î¾ì¹ç¤Ç¤â·Ù¹ð¤·¤Ê¤¤" + +#~ msgid "Generate C header of platform specific features" +#~ msgstr "¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¸ÇÍ­¤Îµ¡Ç½¤Î C ¥Ø¥Ã¥À¤òÀ¸À®¤¹¤ë" + +#~ msgid "Specify the name of the class for constant strings" +#~ msgstr "Äê¿ôʸ»úÎóÍѤΥ¯¥é¥¹Ì¾¤ò»ØÄꤹ¤ë" + +#~ msgid "no class name specified as argument to -fconstant-string-class" +#~ msgstr "-fconstant-string-class ¤Ë°ú¿ô¤È¤·¤Æ»ØÄꤵ¤ì¤¿¥¯¥é¥¹¤¬¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "object does not conform to the `%s' protocol" +#~ msgstr "¥ª¥Ö¥¸¥§¥¯¥È¤¬ `%s' ¥×¥í¥È¥³¥ë¤ËŬ¹ç¤·¤Þ¤»¤ó" + +#~ msgid "class `%s' does not implement the `%s' protocol" +#~ msgstr "¥¯¥é¥¹ `%s' ¤Ï `%s' ¥×¥í¥È¥³¥ë¤ò¼ÂÁõ¤·¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "`%s' cannot be statically allocated" +#~ msgstr "`%s' ¤òÀÅŪ¤Ë³ÎÊݤǤ­¤Þ¤»¤ó" + +#~ msgid "Unexpected type for `id' (%s)" +#~ msgstr "ͽ´ü¤·¤Ê¤¤·¿¤¬ `id' (%s) ¤Ë»ØÄꤵ¤ì¤Þ¤·¤¿" + +#~ msgid "Undefined type `id', please import " +#~ msgstr "`id' ·¿¤¬Ì¤ÄêµÁ¤Ç¤¹¡£ ¤ò import ¤·¤Æ²¼¤µ¤¤" + +#~ msgid "Cannot find protocol declaration for `%s'" +#~ msgstr "`%s' ¤ËÂФ¹¤ë¥×¥í¥È¥³¥ëÀë¸À¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó" + +#~ msgid "Cannot find interface declaration for `%s'" +#~ msgstr "`%s' ¤ËÂФ¹¤ë¥¤¥ó¥¿¥Õ¥§¡¼¥¹Àë¸À¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó" + +#~ msgid "Cannot find class `%s'" +#~ msgstr "¥¯¥é¥¹ `%s' ¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó" + +#~ msgid "Cannot find interface declaration for `%s', superclass of `%s'" +#~ msgstr "`%s' ¤Î¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹Àë¸À¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó¡Ê`%s' ¤Î´ðÄ쥯¥é¥¹¤Ç¤¹¡Ë" + +#~ msgid "Circular inheritance in interface declaration for `%s'" +#~ msgstr "`%s' ¤Ø¤Î¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹Àë¸À¤¬½Û´ÄŪ¤Ê·Ñ¾µ¤È¤Ê¤Ã¤Æ¤¤¤Þ¤¹" + +#~ msgid "inconsistent instance variable specification" +#~ msgstr "¥¤¥ó¥¹¥¿¥ó¥¹ÊÑ¿ô¤Î»ÅÍͤ¬°ì´Ó¤·¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "multiple declarations for method `%s'" +#~ msgstr "¥á¥½¥Ã¥É `%s' ¤ÎÀë¸À¤¬½ÅÊ£¤·¤Æ¤¤¤Þ¤¹¡£" + +#~ msgid "invalid receiver type `%s'" +#~ msgstr "¥ì¥·¡¼¥Ð·¿ `%s' ¤¬Ìµ¸ú¤Ç¤¹" + +#~ msgid "`%s' does not respond to `%s'" +#~ msgstr "`%s' ¤Ï `%s' ¤Ë±þÅú¤·¤Þ¤»¤ó" + +#~ msgid "no super class declared in interface for `%s'" +#~ msgstr "`%s' ¤Ø¤Î¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹¤Ë´ðÄ쥯¥é¥¹¤¬Àë¸À¤µ¤ì¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "cannot find class (factory) method." +#~ msgstr "¥¯¥é¥¹ (factory) ¥á¥½¥Ã¥É¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó" + +#~ msgid "return type for `%s' defaults to id" +#~ msgstr "`%s' ¤ÎÌá¤êÃͤη¿¤Ï¥Ç¥Õ¥©¥ë¥È¤Î id ¤È¤·¤Þ¤¹" + +#~ msgid "method `%s' not implemented by protocol." +#~ msgstr "¥á¥½¥Ã¥É `%s' ¤Ï¥×¥í¥È¥³¥ë¤Ë¤è¤Ã¤Æ¼ÂÁõ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "return type defaults to id" +#~ msgstr "Ìá¤êÃͤη¿¤ò¥Ç¥Õ¥©¥ë¥È¤Î id ¤È¤·¤Þ¤¹" + +#~ msgid "cannot find method." +#~ msgstr "¥á¥½¥Ã¥É¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó¡£" + +#~ msgid "instance variable `%s' accessed in class method" +#~ msgstr "¥¤¥ó¥¹¥¿¥ó¥¹ÊÑ¿ô `%s' ¤¬¥¯¥é¥¹¥á¥½¥Ã¥É¤«¤é¥¢¥¯¥»¥¹¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "duplicate definition of class method `%s'." +#~ msgstr "¥¯¥é¥¹¥á¥½¥Ã¥É `%s' ¤ÎÄêµÁ¤¬½ÅÊ£¤·¤Æ¤¤¤Þ¤¹¡£" + +#~ msgid "duplicate declaration of class method `%s'." +#~ msgstr "¥¯¥é¥¹¥á¥½¥Ã¥É `%s' ¤ÎÀë¸À¤¬½ÅÊ£¤·¤Æ¤¤¤Þ¤¹¡£" + +#~ msgid "duplicate definition of instance method `%s'." +#~ msgstr "¥¤¥ó¥¹¥¿¥ó¥¹¥á¥½¥Ã¥É `%s' ¤ÎÄêµÁ¤¬½ÅÊ£¤·¤Æ¤¤¤Þ¤¹¡£" + +#~ msgid "duplicate declaration of instance method `%s'." +#~ msgstr "¥¤¥ó¥¹¥¿¥ó¥¹¥á¥½¥Ã¥É `%s' ¤ÎÀë¸À¤¬½ÅÊ£¤·¤Æ¤¤¤Þ¤¹¡£" + +#~ msgid "duplicate interface declaration for category `%s(%s)'" +#~ msgstr "¥«¥Æ¥´¥ê `%s(%s)' ¤Ø¤Î¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹Àë¸À¤¬½ÅÊ£¤·¤Æ¤¤¤Þ¤¹" + +#~ msgid "instance variable `%s' is declared private" +#~ msgstr "¥¤¥ó¥¹¥¿¥ó¥¹ÊÑ¿ô `%s' ¤Ï private ¤ÈÀë¸À¤µ¤ì¤Æ¤¤¤Þ¤¹" + +#~ msgid "instance variable `%s' is declared %s" +#~ msgstr "¥¤¥ó¥¹¥¿¥ó¥¹ÊÑ¿ô `%s' ¤Ï %s ¤ÈÀë¸À¤µ¤ì¤Æ¤¤¤Þ¤¹" + +#~ msgid "static access to object of type `id'" +#~ msgstr "`id' ·¿¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ËÂΤ¹¤ëÀÅŪ¥¢¥¯¥»¥¹¤Ç¤¹" + +#~ msgid "incomplete implementation of class `%s'" +#~ msgstr "¥¯¥é¥¹ `%s' ¤Î¼ÂÁõ¤¬ÉÔ´°Á´¤Ç¤¹" + +#~ msgid "incomplete implementation of category `%s'" +#~ msgstr "¥«¥Æ¥´¥ê `%s' ¤Î¼ÂÁõ¤¬ÉÔ´°Á´¤Ç¤¹" + +#~ msgid "method definition for `%c%s' not found" +#~ msgstr "`%c%s' ¤Î¥á¥½¥Ã¥ÉÄêµÁ¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó" + +#~ msgid "%s `%s' does not fully implement the `%s' protocol" +#~ msgstr "%s `%s' ¤Ï `%s' ¥×¥í¥È¥³¥ë¤ò´°Á´¤Ë¤Ï¼ÂÁõ¤·¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "reimplementation of class `%s'" +#~ msgstr "¥¯¥é¥¹ `%s' ¤ÎºÆ¼ÂÁõ¤Ç¤¹" + +#~ msgid "conflicting super class name `%s'" +#~ msgstr "´ðÄ쥯¥é¥¹Ì¾ `%s' ¤¬¾×Æͤ·¤Æ¤¤¤Þ¤¹" + +#~ msgid "duplicate interface declaration for class `%s'" +#~ msgstr "¥¯¥é¥¹ `%s' ¤Î¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹Àë¸À¤¬½ÅÊ£¤·¤Æ¤¤¤Þ¤¹" + +#~ msgid "duplicate declaration for protocol `%s'" +#~ msgstr "¥×¥í¥È¥³¥ë '%s' ¤ÎÀë¸À¤¬½ÅÊ£¤·¤Æ¤¤¤Þ¤¹" + +#~ msgid "[super ...] must appear in a method context" +#~ msgstr "[super ...] ¤Ï¥á¥½¥Ã¥É¥³¥ó¥Æ¥­¥¹¥È¤Ë¸½¤ì¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó" + +#~ msgid "potential selector conflict for method `%s'" +#~ msgstr "²ÄǽÀ­¤Î¤¢¤ë¥»¥ì¥¯¥¿¤¬¥á¥½¥Ã¥É `%s' ¤È¶¥¹ç¤·¤Þ¤¹" + +#~ msgid "`@end' must appear in an implementation context" +#~ msgstr "`@end' ¤Ï¼ÂÁõ¥³¥ó¥Æ¥¯¥¹¥È¤Ë¸½¤ì¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó" + +#~ msgid "method definition not in class context" +#~ msgstr "¥á¥½¥Ã¥ÉÄêµÁ¤¬¥¯¥é¥¹¥³¥ó¥Æ¥­¥¹¥ÈÆâ¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "syntax error at '@' token" +#~ msgstr "'@' ¥È¡¼¥¯¥ó¤Çʸˡ¥¨¥é¡¼" + +#~ msgid "invalid parameter `%s'" +#~ msgstr "²¾°ú¿ô `%s' ¤Ï̵¸ú¤Ç¤¹" + +#~ msgid "Arc profiling: some edge counts were bad." +#~ msgstr "¸Ì(arc)¥×¥í¥Õ¥¡¥¤¥ê¥ó¥°: ´ö¤Ä¤«¤Î edge ¥«¥¦¥ó¥È¤ÏÉÔÀµ¤Ç¤¹¡£" + +#~ msgid "file %s not found, execution counts assumed to be zero." +#~ msgstr "¥Õ¥¡¥¤¥ë %s ¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó¤Î¤Ç¡¢¼Â¹Ô¥«¥¦¥ó¥È¤Ï¥¼¥í¤È¸«¤Ê¤·¤Þ¤¹" + +#~ msgid "%s: internal abort\n" +#~ msgstr "%s: ÆâÉôÃæÃÇ\n" + +#~ msgid "%s: error writing file `%s': %s\n" +#~ msgstr "%s: ¥Õ¥¡¥¤¥ë `%s' ¤Ë½ñ¤­¹þ¤ßÃæ¤Ë¥¨¥é¡¼: %s\n" + +#~ msgid "%s: usage '%s [ -VqfnkN ] [ -i ] [ filename ... ]'\n" +#~ msgstr "%s: »ÈÍÑË¡ '%s [ -VqfnkN ] [ -i ] [ ¥Õ¥¡¥¤¥ë̾ ... ]'\n" + +#~ msgid "%s: usage '%s [ -VqfnkNlgC ] [ -B ] [ filename ... ]'\n" +#~ msgstr "%s: »ÈÍÑË¡ '%s [ -VqfnkNlgC ] [ -B <¥Ç¥£¥ì¥¯¥È¥ê̾> ] [ ¥Õ¥¡¥¤¥ë̾ ... ]'\n" + +#~ msgid "%s: warning: no read access for file `%s'\n" +#~ msgstr "%s: ·Ù¹ð: ¥Õ¥¡¥¤¥ë `%s' ¤ËÂФ·¤ÆÆɤ߽Ф·µö²Ä¤¬¤¢¤ê¤Þ¤»¤ó\n" + +#~ msgid "%s: warning: no write access for file `%s'\n" +#~ msgstr "%s: ·Ù¹ð: ¥Õ¥¡¥¤¥ë `%s' ¤ËÂФ·¤Æ½ñ¤­¹þ¤ßµö²Ä¤¬¤¢¤ê¤Þ¤»¤ó\n" + +#~ msgid "%s: warning: no write access for dir containing `%s'\n" +#~ msgstr "%s: ·Ù¹ð: `%s' ¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤ËÂФ·¤Æ½ñ¤­¹þ¤ßµö²Ä¤¬¤¢¤ê¤Þ¤»¤ó\n" + +#~ msgid "%s: invalid file name: %s\n" +#~ msgstr "%s: ̵¸ú¤Ê¥Õ¥¡¥¤¥ë̾: %s\n" + +#~ msgid "%s: %s: can't get status: %s\n" +#~ msgstr "%s: %s: ¾õÂÖ¤ò¼èÆÀ¤Ç¤­¤Þ¤»¤ó: %s\n" + +#~ msgid "" +#~ "\n" +#~ "%s: fatal error: aux info file corrupted at line %d\n" +#~ msgstr "" +#~ "\n" +#~ "%s: Ã×̿Ū¥¨¥é¡¼: Éû info ¥Õ¥¡¥¤¥ë¤¬ %d ¹ÔÌܤDzõ¤ì¤Æ¤¤¤Þ¤¹\n" + +#~ msgid "%s:%d: declaration of function `%s' takes different forms\n" +#~ msgstr "%s:%d: ´Ø¿ô `%s' ¤ÎÀë¸À¤¬Ê̤ηÁ¤ò¼è¤Ã¤Æ¤¤¤Þ¤¹\n" + +#~ msgid "%s: compiling `%s'\n" +#~ msgstr "%s: `%s' ¤ò¥³¥ó¥Ñ¥¤¥ëÃæ\n" + +#~ msgid "%s: wait: %s\n" +#~ msgstr "%s: ÂÔ¤Á: %s\n" + +#~ msgid "%s: subprocess got fatal signal %d\n" +#~ msgstr "%s: ¥µ¥Ö¥×¥í¥»¥¹¤¬Ã×̿Ū¥·¥°¥Ê¥ë %d ¤ò¼õ¤±¼è¤ê¤Þ¤·¤¿\n" + +#~ msgid "%s: %s exited with status %d\n" +#~ msgstr "%s: %s ¤Ï¥¹¥Æ¡¼¥¿¥¹ %d ¤Ç½ªÎ»¤·¤Þ¤·¤¿\n" + +#~ msgid "%s: warning: missing SYSCALLS file `%s'\n" +#~ msgstr "%s: ·Ù¹ð: SYSCALLS ¥Õ¥¡¥¤¥ë `%s' ¤¬¤¢¤ê¤Þ¤»¤ó\n" + +#~ msgid "%s: can't read aux info file `%s': %s\n" +#~ msgstr "%s: Éû info ¥Õ¥¡¥¤¥ë `%s' ¤òÆɤळ¤È¤¬¤Ç¤­¤Þ¤»¤ó: %s\n" + +#~ msgid "%s: can't get status of aux info file `%s': %s\n" +#~ msgstr "%s: Éû info ¥Õ¥¡¥¤¥ë `%s' ¤Î¾õÂÖ¤ò¼èÆÀ¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó: %s\n" + +#~ msgid "%s: can't open aux info file `%s' for reading: %s\n" +#~ msgstr "%s: Éû info ¥Õ¥¡¥¤¥ë `%s' ¤òÆɤ߹þ¤ßÍѤ˳«¤¯¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó: %s\n" + +#~ msgid "%s: error reading aux info file `%s': %s\n" +#~ msgstr "%s: Éû info ¥Õ¥¡¥¤¥ë `%s' ¤òÆɤ߹þ¤ßÃæ¤Ë¥¨¥é¡¼: %s\n" + +#~ msgid "%s: error closing aux info file `%s': %s\n" +#~ msgstr "%s: Éû info ¥Õ¥¡¥¤¥ë `%s' ¤òÊĤ¸¤Æ¤¤¤ëºÇÃæ¤Ë¥¨¥é¡¼: %s\n" + +#~ msgid "%s: can't delete aux info file `%s': %s\n" +#~ msgstr "%s: Éû info ¥Õ¥¡¥¤¥ë `%s' ¤òºï½ü¤Ç¤­¤Þ¤»¤ó: %s\n" + +#~ msgid "%s: can't delete file `%s': %s\n" +#~ msgstr "%s: ¥Õ¥¡¥¤¥ë `%s' ¤òºï½ü¤Ç¤­¤Þ¤»¤ó: %s\n" + +#~ msgid "%s: warning: can't rename file `%s' to `%s': %s\n" +#~ msgstr "%s: ·Ù¹ð: ¥Õ¥¡¥¤¥ë `%s' ¤ò `%s' ̾Á°Êѹ¹¤Ç¤­¤Þ¤»¤ó: %s\n" + +#~ msgid "%s: conflicting extern definitions of '%s'\n" +#~ msgstr "%s: '%s' ¤Î³°ÉôÄêµÁ¤¬Ì·½â¤·¤Æ¤¤¤Þ¤¹\n" + +#~ msgid "%s: declarations of '%s' will not be converted\n" +#~ msgstr "%s: '%s' ¤ÎÀë¸À¤ÏÊÑ´¹¤µ¤ì¤Þ¤»¤ó\n" + +#~ msgid "%s: conflict list for '%s' follows:\n" +#~ msgstr "%s: `%s' ¤ËÂФ¹¤ëÌ·½â°ìÍ÷¤Ï°Ê²¼¤ÎÄ̤ê¤Ç¤¹:\n" + +#~ msgid "%s: warning: using formals list from %s(%d) for function `%s'\n" +#~ msgstr "%s: ·Ù¹ð: %s(%d) ¤«¤é¤Î·Á¼°¥ê¥¹¥È¤ò¡¢´Ø¿ô `%s' ¤Î°Ù¤Ë»È¤¤¤Þ¤¹\n" + +#~ msgid "%s: %d: `%s' used but missing from SYSCALLS\n" +#~ msgstr "%s: %d: `%s' ¤Ï»È¤ï¤ì¤Æ¤¤¤Þ¤¹¤¬ SYSCALLS ¤Ë¤¢¤ê¤Þ¤»¤ó\n" + +#~ msgid "%s: %d: warning: no extern definition for `%s'\n" +#~ msgstr "%s: %d: ·Ù¹ð: `%s' ¤ËÂФ¹¤ë³°ÉôÄêµÁ¤¬¤¢¤ê¤Þ¤»¤ó\n" + +#~ msgid "%s: warning: no static definition for `%s' in file `%s'\n" +#~ msgstr "%s: ·Ù¹ð: `%s' ¤ÎÀÅŪÄêµÁ¤¬¥Õ¥¡¥¤¥ë `%s' ¤ÎÃæ¤Ë¤¢¤ê¤Þ¤»¤ó\n" + +#~ msgid "%s: multiple static defs of `%s' in file `%s'\n" +#~ msgstr "%s: `%s' ¤ÎÀÅŪÄêµÁ¤¬¥Õ¥¡¥¤¥ë `%s' ¤ÎÃæ¤Ç½ÅÊ£¤·¤Æ¤¤¤Þ¤¹\n" + +#~ msgid "%s: %d: warning: source too confusing\n" +#~ msgstr "%s: %d: ·Ù¹ð: ¥½¡¼¥¹¤¬º®Í𤷤¹¤®¤Æ¤¤¤Þ¤¹\n" + +#~ msgid "%s: %d: warning: varargs function declaration not converted\n" +#~ msgstr "%s: %d: ·Ù¹ð: varargs ´Ø¿ôÀë¸À¤¬ÊÑ´¹¤µ¤ì¤Æ¤¤¤Þ¤»¤ó\n" + +#~ msgid "%s: declaration of function `%s' not converted\n" +#~ msgstr "%s: ´Ø¿ô `%s' ¤ÎÀë¸À¤¬ÊÑ´¹¤µ¤ì¤Æ¤¤¤Þ¤»¤ó\n" + +#~ msgid "%s: warning: too many parameter lists in declaration of `%s'\n" +#~ msgstr "%s: ·Ù¹ð: `%s' ¤ÎÀë¸À¤Ç¤Î²¾°ú¿ô¥ê¥¹¥È¤¬Â¿¤¹¤®¤Þ¤¹\n" + +#~ msgid "" +#~ "\n" +#~ "%s: warning: too few parameter lists in declaration of `%s'\n" +#~ msgstr "" +#~ "\n" +#~ "%s: ·Ù¹ð: `%s' ¤ÎÀë¸À¤Ç¤Î²¾°ú¿ô¥ê¥¹¥È¤¬¾¯¤Ê¤¹¤®¤Þ¤¹\n" + +#~ msgid "%s: %d: warning: found `%s' but expected `%s'\n" +#~ msgstr "%s: %d: ·Ù¹ð: `%s' ¤¬¸«¤Ä¤«¤ê¤Þ¤·¤¿¤¬ `%s' ¤¬´üÂÔ¤µ¤ì¤Æ¤¤¤Þ¤¹\n" + +#~ msgid "%s: local declaration for function `%s' not inserted\n" +#~ msgstr "%s: ´Ø¿ô `%s' ¤Î¥í¡¼¥«¥ëÀë¸À¤¬ÁÞÆþ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó\n" + +#~ msgid "" +#~ "\n" +#~ "%s: %d: warning: can't add declaration of `%s' into macro call\n" +#~ msgstr "" +#~ "\n" +#~ "%s: %d: ·Ù¹ð: `%s' ¤ÎÀë¸À¤ò¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤ËÄɲäǤ­¤Þ¤»¤ó\n" + +#~ msgid "%s: global declarations for file `%s' not inserted\n" +#~ msgstr "%s: ¥Õ¥¡¥¤¥ë `%s' ¤ÎÂç°èÀë¸À¤¬ÁÞÆþ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó\n" + +#~ msgid "%s: definition of function `%s' not converted\n" +#~ msgstr "%s: ´Ø¿ô `%s' ¤ÎÄêµÁ¤¬ÊÑ´¹¤µ¤ì¤Æ¤¤¤Þ¤»¤ó\n" + +#~ msgid "%s: %d: warning: definition of %s not converted\n" +#~ msgstr "%s: %d: ·Ù¹ð: %s ¤ÎÄêµÁ¤¬ÊÑ´¹¤µ¤ì¤Æ¤¤¤Þ¤»¤ó\n" + +#~ msgid "%s: found definition of `%s' at %s(%d)\n" +#~ msgstr "%s: `%s' ¤ÎÄêµÁ¤¬ %s(%d) ¤Ë¸«¤Ä¤«¤ê¤Þ¤·¤¿\n" + +#~ msgid "%s: %d: warning: `%s' excluded by preprocessing\n" +#~ msgstr "%s: %d: ·Ù¹ð: `%s' ¤Ï¥×¥ê¥×¥í¥»¥¹¤«¤é½ü³°¤µ¤ì¤Æ¤¤¤Þ¤¹\n" + +#~ msgid "%s: function definition not converted\n" +#~ msgstr "%s: ´Ø¿ô¤ÎÄêµÁ¤¬ÊÑ´¹¤µ¤ì¤Æ¤¤¤Þ¤»¤ó\n" + +#~ msgid "%s: `%s' not converted\n" +#~ msgstr "%s: `%s' ¤ÏÊÑ´¹¤µ¤ì¤Æ¤¤¤Þ¤»¤ó\n" + +#~ msgid "%s: would convert file `%s'\n" +#~ msgstr "%s: `%s' ¤òÊÑ´¹¤·¤Þ¤¹\n" + +#~ msgid "%s: converting file `%s'\n" +#~ msgstr "%s: ¥Õ¥¡¥¤¥ë `%s' ¤òÊÑ´¹Ãæ\n" + +#~ msgid "%s: can't get status for file `%s': %s\n" +#~ msgstr "%s: ¥Õ¥¡¥¤¥ë `%s' ¤Î¾õÂÖ¤ò¼èÆÀ¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó: %s\n" + +#~ msgid "%s: can't open file `%s' for reading: %s\n" +#~ msgstr "%s: Æɤ߹þ¤ßÍѤ˥ե¡¥¤¥ë `%s' ¤ò³«¤¯¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó: %s\n" + +#~ msgid "" +#~ "\n" +#~ "%s: error reading input file `%s': %s\n" +#~ msgstr "" +#~ "\n" +#~ "%s: ÆþÎÏ¥Õ¥¡¥¤¥ë `%s' ¤òÆɤ߹þ¤ßÃæ¤Ë¥¨¥é¡¼: %s\n" + +#~ msgid "%s: can't create/open clean file `%s': %s\n" +#~ msgstr "%s: ¤­¤ì¤¤¤Ê¥Õ¥¡¥¤¥ë `%s' ¤òºîÀ®/¥ª¡¼¥×¥ó¤Ç¤­¤Þ¤»¤ó: %s\n" + +#~ msgid "%s: warning: file `%s' already saved in `%s'\n" +#~ msgstr "%s: ·Ù¹ð: ¥Õ¥¡¥¤¥ë `%s' ¤Ï´û¤Ë `%s' ¤ËÊݸ¤µ¤ì¤Æ¤¤¤Þ¤¹\n" + +#~ msgid "%s: can't link file `%s' to `%s': %s\n" +#~ msgstr "%s: ¥Õ¥¡¥¤¥ë `%s' ¤ò `%s' ¤Ë¥ê¥ó¥¯¤Ç¤­¤Þ¤»¤ó: %s\n" + +#~ msgid "%s: can't create/open output file `%s': %s\n" +#~ msgstr "%s: ½ÐÎÏ¥Õ¥¡¥¤¥ë `%s' ¤òºîÀ®¤·¤¿¤ê³«¤¤¤¿¤ê¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó: %s\n" + +#~ msgid "%s: can't change mode of file `%s': %s\n" +#~ msgstr "%s: ¥Õ¥¡¥¤¥ë `%s' ¤Î¥â¡¼¥É¤òÊѹ¹¤Ç¤­¤Þ¤»¤ó: %s\n" + +#~ msgid "%s: cannot get working directory: %s\n" +#~ msgstr "%s: ºî¶È¥Ç¥£¥ì¥¯¥È¥ê¤¬Ê¬¤«¤ê¤Þ¤»¤ó: %s\n" + +#~ msgid "%s: input file names must have .c suffixes: %s\n" +#~ msgstr "%s: ÆþÎÏ¥Õ¥¡¥¤¥ë̾¤Ë¤Ï³ÈÄ¥»Ò .c ¤¬¤Ê¤±¤ì¤Ð¤¤¤±¤Þ¤»¤ó: %s\n" + +#~ msgid "conversion from NaN to int" +#~ msgstr "NaN ¤«¤éÀ°¿ô¤Ø¤ÎÊÑ´¹¤Ç¤¹" + +#~ msgid "floating point overflow" +#~ msgstr "ÉâÆ°¾®¿ôÅÀ¤¬¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤·¤Þ¤·¤¿" + +#~ msgid "overflow on truncation to integer" +#~ msgstr "À°¿ô¤Ø¤ÎÀÚ¤êµÍ¤á¤Ç¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤¬µ¯¤³¤ê¤Þ¤·¤¿" + +#~ msgid "overflow on truncation to unsigned integer" +#~ msgstr "Éä¹ç̵¤·À°¿ô¤Ø¤ÎÀÚ¤êµÍ¤á¤Ç¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤¬µ¯¤³¤ê¤Þ¤·¤¿" + +#~ msgid "%s: argument domain error" +#~ msgstr "%s: °ú¿ôÎΰ襨¥é¡¼¤Ç¤¹" + +#~ msgid "%s: function singularity" +#~ msgstr "%s: ´Ø¿ô¤Îñ°ìÀ­" + +#~ msgid "%s: overflow range error" +#~ msgstr "%s: ¥ª¡¼¥Ð¡¼¥Õ¥í¡¼ÈÏ°Ï¥¨¥é¡¼" + +#~ msgid "%s: underflow range error" +#~ msgstr "%s: ¥¢¥ó¥À¡¼¥Õ¥í¡¼ÈÏ°Ï¥¨¥é¡¼" + +#~ msgid "%s: total loss of precision" +#~ msgstr "%s: Á´ÂÎŪ¤ÊÀºÅÙ¤ÎÄã²¼" + +#~ msgid "%s: partial loss of precision" +#~ msgstr "%s: ÉôʬŪ¤ÊÀºÅÙ¤ÎÄã²¼" + +#~ msgid "%s: NaN - producing operation" +#~ msgstr "%s: NaN - Áàºî¤òÀ¸¤¸¤Þ¤¹" + +#~ msgid "Output constraint %d must specify a single register" +#~ msgstr "½ÐÎÏÀ©Ìó %d ¤Ï°ì¤Ä¤Î¥ì¥¸¥¹¥¿¤ò»ØÄꤷ¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó" + +#~ msgid "Output regs must be grouped at top of stack" +#~ msgstr "½ÐÎϥ쥸¥¹¥¿¤Ï¥¹¥¿¥Ã¥¯¤Î¥È¥Ã¥×¤Ë¥°¥ë¡¼¥×¤µ¤ì¤Æ¤¤¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó" + +#~ msgid "Implicitly popped regs must be grouped at top of stack" +#~ msgstr "°ÅÌÛ¤Ë pop ¤µ¤ì¤ë¥ì¥¸¥¹¥¿¤Ï¥¹¥¿¥Ã¥¯¤Î¥È¥Ã¥×¤Ë¥°¥ë¡¼¥×¤µ¤ì¤Æ¤¤¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó" + +#~ msgid "Output operand %d must use `&' constraint" +#~ msgstr "½ÐÎÏ¥ª¥Ú¥é¥ó¥É %d ¤Ï `&' À©Ìó¤ò»È¤ï¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó" + +#~ msgid "can't use '%s' as a %s register" +#~ msgstr "'%s' ¤ò %s ¤Î¥ì¥¸¥¹¥¿¤È¤·¤Æ»È¤¦¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "global register variable follows a function definition" +#~ msgstr "Âç°è register ÊÑ¿ô¤¬´Ø¿ôÄêµÁ¤Î¸å¤í¤Ë¤¢¤ê¤Þ¤¹" + +#~ msgid "register used for two global register variables" +#~ msgstr "¥ì¥¸¥¹¥¿¤¬Æó¤Ä¤Î¥°¥í¡¼¥Ð¥ë¥ì¥¸¥¹¥¿ÊÑ¿ô¤È¤·¤Æ»È¤ï¤ì¤Þ¤·¤¿" + +#~ msgid "call-clobbered register used for global register variable" +#~ msgstr "¸Æ¤Ó½Ð¤·¤ÇÇ˲õ¤µ¤ì¤ë¥ì¥¸¥¹¥¿¤¬¥°¥í¡¼¥Ð¥ë¥ì¥¸¥¹¥¿ÊÑ¿ô¤È¤·¤Æ»È¤ï¤ì¤Þ¤·¤¿" + +#~ msgid "cannot reload integer constant operand in `asm'" +#~ msgstr "À°¿ôÄê¿ô¥ª¥Ú¥é¥ó¥É¤ò `asm' Æâ¤ÇºÆ¥í¡¼¥É¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "impossible register constraint in `asm'" +#~ msgstr "`asm' Æâ¤Ç¤Ï¥ì¥¸¥¹¥¿À©Ìó¤ò¹Ô¤Ê¤¨¤Þ¤»¤ó" + +#~ msgid "`&' constraint used with no register class" +#~ msgstr "`&' À©Ì󤬥쥸¥¹¥¿¥¯¥é¥¹Ìµ¤·¤Ç»È¤ï¤ì¤Þ¤·¤¿" + +#~ msgid "inconsistent operand constraints in an `asm'" +#~ msgstr "`asm' Æâ¤Ç¤Î¥ª¥Ú¥é¥ó¥ÉÀ©Ìó¤¬Ì·½â¤·¤Æ¤¤¤Þ¤¹" + +#~ msgid "frame size too large for reliable stack checking" +#~ msgstr "¥Õ¥ì¡¼¥à¥µ¥¤¥º¤¬Â礭¤¹¤®¤Æ¡¢¥¹¥¿¥Ã¥¯¸¡ºº¤¬¿®Íê¤Ç¤­¤Ê¤¯¤Ê¤ê¤Þ¤¹" + +#~ msgid "try reducing the number of local variables" +#~ msgstr "¥í¡¼¥«¥ëÊÑ¿ô¤Î¿ô¤òºï¸º¤·¤Æ¤ß¤Æ¤¯¤À¤µ¤¤" + +#~ msgid "Can't find a register in class `%s' while reloading `asm'." +#~ msgstr "¥¯¥é¥¹ `%s' Æâ¤Î¥ì¥¸¥¹¥¿¤ò `asm' ºÆ¥í¡¼¥ÉÃæ¤Ë¸«¤Ä¤±¤é¤ì¤Þ¤»¤ó" + +#~ msgid "Unable to find a register to spill in class `%s'." +#~ msgstr "¥¯¥é¥¹ `%s' Æâ¤Ç¤Õ¤ë¤¤Íî¤È¤¹¥ì¥¸¥¹¥¿¤ò¸«¤Ä¤±¤é¤ì¤Þ¤»¤ó" + +#~ msgid "`asm' operand requires impossible reload" +#~ msgstr "`asm' ¥ª¥Ú¥é¥ó¥É¤ÏºÆ¥í¡¼¥É¤Ç¤­¤Ê¤¤»ö¤¬Í׵ᤵ¤ì¤Þ¤¹" + +#~ msgid "`asm' operand constraint incompatible with operand size" +#~ msgstr "`asm' ¥ª¥Ú¥é¥ó¥ÉÀ©Ì󤬥ª¥Ú¥é¥ó¥É¥µ¥¤¥º¤ÈÀ°¹ç¤·¤Þ¤»¤ó" + +#~ msgid "output operand is constant in `asm'" +#~ msgstr "½ÐÎÏ¥ª¥Ú¥é¥ó¥É¤¬ `asm' Æâ¤ÇÄê¿ô¤Ç¤¹" + +#~ msgid "RTL check: access of elt %d of `%s' with last elt %d in %s, at %s:%d" +#~ msgstr "RTL ¸¡ºº: elt %d(%s) ¤¬ºÇ¸å¤Î elt %d(%s Ãæ) ¤È°ì½ï¤Ë¥¢¥¯¥»¥¹¤·¤Þ¤¹ (%s:%d)" + +#~ msgid "RTL check: expected elt %d type '%c', have '%c' (rtx %s) in %s, at %s:%d" +#~ msgstr "RTL ¸¡ºº: elt %d ·¿¤Ï '%c' ¤Î¤Ï¤º¤Ê¤Î¤Ë '%c' (rtx %s, %s Ãæ)¤Ç¤¹ (%s:%d)" + +#~ msgid "RTL check: expected elt %d type '%c' or '%c', have '%c' (rtx %s) in %s, at %s:%d" +#~ msgstr "RTL ¸¡ºº: elt %d ·¿¤Ï '%c' ¤« '%c' ¤Î¤Ï¤º¤Ê¤Î¤Ë '%c' (rtx %s, %s Ãæ) ¤Ç¤¹ (%s:%d)" + +#~ msgid "RTL check: expected code `%s', have `%s' in %s, at %s:%d" +#~ msgstr "RTL ¸¡ºº: ¥³¡¼¥É `%s' ¤Î¤Ï¤º¤Ê¤Î¤Ë `%s' (%s Ãæ)¤Ç¤¹ (%s:%d)" + +#~ msgid "RTL check: expected code `%s' or `%s', have `%s' in %s, at %s:%d" +#~ msgstr "RTL ¸¡ºº: ¥³¡¼¥É `%s' ¤« `%s' ¤Î¤Ï¤º¤Ê¤Î¤Ë `%s' (%s Ãæ)¤Ç¤¹ (%s:%d)" + +#~ msgid "RTL check: access of elt %d of vector with last elt %d in %s, at %s:%d" +#~ msgstr "RTL check: ¥Ù¥¯¥È¥ë¤Î elt %d ¤òºÇ¸å¤Î elt %d (%s Ãæ)¤È°ì½ï¤Ë¥¢¥¯¥»¥¹¤·¤Þ¤¹ (%s:%d)" + +#~ msgid "jump to `%s' invalidly jumps into binding contour" +#~ msgstr "`%s' ¤Ø¤Î¥¸¥ã¥ó¥×¤ÏÅ»¤á¤é¤ì¤¿¥Ö¥í¥Ã¥¯Æâ¤Ø¡¢Ìµ¸ú¤Ë¥¸¥ã¥ó¥×¤·¤Æ¤¤¤Þ¤¹" + +#~ msgid "label `%s' used before containing binding contour" +#~ msgstr "¥é¥Ù¥ë `%s' ¤¬Å»¤á¤é¤ì¤¿¥Ö¥í¥Ã¥¯¤ò¹½À®¤¹¤ëÁ°¤Ë»È¤ï¤ì¤Þ¤·¤¿" + +#~ msgid "`asm' cannot be used in function where memory usage is checked" +#~ msgstr "`asm' ¤Ï´Ø¿ô¤Ç¥á¥â¥êÍøÍѤòÄ´¤Ù¤ë½ê¤Ç¤Ï»È¤¨¤Þ¤»¤ó" + +#~ msgid "`asm' cannot be used with `-fcheck-memory-usage'" +#~ msgstr "`asm' ¤Ï `-fcheck-memory-usage' ¤È°ì½ï¤Ë»È¤¨¤Þ¤»¤ó" + +#~ msgid "unknown register name `%s' in `asm'" +#~ msgstr "`asm' Ãæ¤ËÉÔÌÀ¤Ê¥ì¥¸¥¹¥¿Ì¾ `%s' ¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "operand constraints for `asm' differ in number of alternatives" +#~ msgstr "`asm' ¤Î¥ª¥Ú¥é¥ó¥ÉÀ©Ìó¤¬ÂåÂØÈÖ¹æ¤È¤Ï°Û¤Ê¤ê¤Þ¤¹" + +#~ msgid "output operand constraint lacks `='" +#~ msgstr "½ÐÎÏ¥ª¥Ú¥é¥ó¥ÉÀ©Ìó¤Ë `=' ¤¬·ç¤±¤Æ¤¤¤Þ¤¹" + +#~ msgid "output constraint `%c' for operand %d is not at the beginning" +#~ msgstr "½ÐÎÏÀ©Ìó `%c' (operand %d ÍÑ) ¤¬³«»ÏÉôʬ¤Ë¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "output operand constraint %d contains `+'" +#~ msgstr "½ÐÎÏ¥ª¥Ú¥é¥ó¥ÉÀ©Ìó %d ¤Ï `+' ¤ò´Þ¤ó¤Ç¤¤¤Þ¤¹" + +#~ msgid "operand constraint contains '+' or '=' at illegal position." +#~ msgstr "¥ª¥Ú¥é¥ó¥ÉÀ©ÌóÃæ¡¢ÉÔÀµ¤Ê°ÌÃÖ¤Ë '+' ¤ä '=' ¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹" + +#~ msgid "`%%' constraint used with last operand" +#~ msgstr "`%%' À©Ì󤬺Ǹå¤Î¥ª¥Ú¥é¥ó¥É¤È¤È¤â¤Ë»È¤ï¤ì¤Þ¤·¤¿" + +#~ msgid "matching constraint not valid in output operand" +#~ msgstr "½ÐÎÏ¥ª¥Ú¥é¥ó¥ÉÆâ¤ÎÀ©Ìó¤¬Àµ¤·¤¯¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "output number %d not directly addressable" +#~ msgstr "½ÐÎÏÈÖ¹æ %d ¤ÏľÀÜ¥¢¥É¥ì¥¹»ØÄê¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "more than %d operands in `asm'" +#~ msgstr "`asm' ¤ÎÃæ¤Ë %d ¤ò±Û¤¨¤ë¥ª¥Ú¥é¥ó¥É¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "hard register `%s' listed as input operand to `asm'" +#~ msgstr "¥Ï¡¼¥É¥ì¥¸¥¹¥¿ `%s' ¤¬ `asm' ¤ËÂФ·¡¢ÆþÎÏ¥ª¥Ú¥é¥ó¥É¤È¤·¤ÆÅÐÏ¿¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "input operand constraint contains `%c'" +#~ msgstr "ÆþÎÏ¥ª¥Ú¥é¥ó¥ÉÀ©Ìó¤¬ `%c' ¤ò´Þ¤ó¤Ç¤¤¤Þ¤¹" + +#~ msgid "matching constraint references invalid operand number" +#~ msgstr "À©Ìó¤ËŬ¹ç¤µ¤»¤ë»þ¤Ë¡¢Ìµ¸ú¤Ê¥ª¥Ú¥é¥ó¥ÉÈÖ¹æ¤ò»²¾È¤·¤Þ¤·¤¿" + +#~ msgid "asm operand %d probably doesn't match constraints" +#~ msgstr "asm ¥ª¥Ú¥é¥ó¥É %d ¤Ï¶²¤é¤¯À©Ìó¤ËŬ¹ç¤·¤Þ¤»¤ó" + +#~ msgid "unused variable `%s'" +#~ msgstr "ÊÑ¿ô `%s' ¤Ï»È¤ï¤ì¤Þ¤»¤ó¤Ç¤·¤¿" + +#~ msgid "enumeration value `%s' not handled in switch" +#~ msgstr "ÎóµóÃÍ `%s' ¤Ï switch Æâ¤Ç°·¤ï¤ì¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "case value `%ld' not in enumerated type" +#~ msgstr "case ÃÍ `%ld' ¤ÏÎóµó·¿¤Ë¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "case value `%ld' not in enumerated type `%s'" +#~ msgstr "case ÃÍ `%ld' ¤ÏÎóµó·¿ `%s' ¤Ë¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "type size can't be explicitly evaluated" +#~ msgstr "·¿¤ÎÂ礭¤µ¤ÏÌÀ¼¨Åª¤Ëɾ²Á¤µ¤ì¤ë¤â¤Î¤Ç¤Ï¤¢¤ê¤¨¤Þ¤»¤ó" + +#~ msgid "variable-size type declared outside of any function" +#~ msgstr "ÊÑ¿ô¥µ¥¤¥º·¿¤¬´Ø¿ô¤Î³°Â¦¤ÇÀë¸À¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "size of `%s' is %d bytes" +#~ msgstr "`%s' ¤Î¥µ¥¤¥º¤¬ %d ¥Ð¥¤¥È¤Ç¤¹" + +#~ msgid "size of `%s' is larger than %d bytes" +#~ msgstr "`%s' ¤Î¥µ¥¤¥º¤¬ %d ¥Ð¥¤¥È¤è¤êÂ礭¤¯¤Ê¤Ã¤Æ¤¤¤Þ¤¹" + +#~ msgid "packed attribute causes inefficient alignment for `%s'" +#~ msgstr "packed °À­¤Ï `%s' ¤ËÂФ·¤ÆÉÔ¸úΨ¤Ê¥¢¥é¥¤¥ó¥á¥ó¥È¤ò°ú¤­µ¯¤³¤·¤Þ¤¹" + +#~ msgid "packed attribute is unnecessary for `%s'" +#~ msgstr "packed °À­¤Ï `%s' ¤Ë¤ÏɬÍפ¢¤ê¤Þ¤»¤ó" + +#~ msgid "padding struct to align `%s'" +#~ msgstr "`%s' ¤ò¥¢¥é¥¤¥ó¤¹¤ë¤¿¤á¤Ë¹½Â¤ÂΤò¥Ñ¥Ç¥£¥ó¥°¤·¤Þ¤¹" + +#~ msgid "padding struct size to alignment boundary" +#~ msgstr "¥¢¥é¥¤¥ó¥á¥ó¥È¶­³¦¤Î¥µ¥¤¥º¤Ë¹½Â¤ÂΤò¥Ñ¥Ç¥£¥ó¥°¤·¤Þ¤¹" + +#~ msgid "packed attribute causes inefficient alignment" +#~ msgstr "packed °À­¤ÏÉÔ¸úΨ¤Ê¥¢¥é¥¤¥ó¥á¥ó¥È¤ò°ú¤­µ¯¤³¤·¤Þ¤¹" + +#~ msgid "packed attribute is unnecessary" +#~ msgstr "packed °À­¤ÏɬÍפ¢¤ê¤Þ¤»¤ó" + +#~ msgid "\"%s\" and \"%s\" identical in first %d characters" +#~ msgstr "\"%s\" ¤È \"%s\" ¤ÏºÇ½é¤Î %d ʸ»ú¤¬Á´¤¯Æ±¤¸¤Ç¤¹" + +#~ msgid "" +#~ "\n" +#~ "Execution times (seconds)\n" +#~ msgstr "" +#~ "\n" +#~ "¼Â¹Ô²ó¿ô (ÉÃ)\n" + +#~ msgid " TOTAL :" +#~ msgstr " ¹ç·× :" + +#~ msgid "time in %s: %ld.%06ld (%ld%%)\n" +#~ msgstr "%s ¤Ç¤Î»þ´Ö: %ld.%06ld (%ld%%)\n" + +#~ msgid "collect: reading %s\n" +#~ msgstr "collect: %s ¤òÆɤ߹þ¤ß¤Þ¤¹\n" + +#~ msgid "collect: recompiling %s\n" +#~ msgstr "collect: %s ¤òºÆ¥³¥ó¥Ñ¥¤¥ë¤·¤Þ¤¹\n" + +#~ msgid "collect: tweaking %s in %s\n" +#~ msgstr "collect: %s ¤ò°ú¤ÃÄ¥¤ê¤Þ¤¹(%s Æâ)\n" + +#~ msgid "collect: relinking\n" +#~ msgstr "collect: ºÆ¥ê¥ó¥¯¤·¤Þ¤¹\n" + +#~ msgid "ld returned %d exit status" +#~ msgstr "ld ¤Ï¥¹¥Æ¡¼¥¿¥¹ %d ¤Ç½ªÎ»¤·¤Þ¤·¤¿" + +#~ msgid "Generate debugging info in default format" +#~ msgstr "¥Ç¥Õ¥©¥ë¥È·Á¼°¤Î¥Ç¥Ð¥Ã¥°¾ðÊó¤òÀ¸À®¤¹¤ë" + +#~ msgid "Generate debugging info in default extended format" +#~ msgstr "¥Ç¥Õ¥©¥ë¥È³ÈÄ¥·Á¼°¤Î¥Ç¥Ð¥Ã¥°¾ðÊó¤òÀ¸À®¤¹¤ë" + +#~ msgid "Generate STABS format debug info" +#~ msgstr "STABS ·Á¼°¤Î¥Ç¥Ð¥Ã¥°¾ðÊó¤òÀ¸À®¤¹¤ë" + +#~ msgid "Generate extended STABS format debug info" +#~ msgstr "³ÈÄ¥ STABS ·Á¼°¤Î¥Ç¥Ð¥Ã¥°¾ðÊó¤òÀ¸À®¤¹¤ë" + +#~ msgid "Generate DWARF-1 format debug info" +#~ msgstr "DWARF-1 ·Á¼°¤Î¥Ç¥Ð¥Ã¥°¾ðÊó¤òÀ¸À®¤¹¤ë" + +#~ msgid "Generate extended DWARF-1 format debug info" +#~ msgstr "³ÈÄ¥ DWARF-1 ·Á¼°¤Î¥Ç¥Ð¥Ã¥°¾ðÊó¤òÀ¸À®¤¹¤ë" + +#~ msgid "Generate DWARF-2 debug info" +#~ msgstr "DWARF-2 ·Á¼°¤Î¥Ç¥Ð¥Ã¥°¾ðÊó¤òÀ¸À®¤¹¤ë" + +#~ msgid "Generate XCOFF format debug info" +#~ msgstr "XCOFF ·Á¼°¤Î¥Ç¥Ð¥Ã¥°¾ðÊó¤òÀ¸À®¤¹¤ë" + +#~ msgid "Generate extended XCOFF format debug info" +#~ msgstr "³ÈÄ¥ XCOFF ·Á¼°¤Î¥Ç¥Ð¥Ã¥°¾ðÊó¤òÀ¸À®¤¹¤ë" + +#~ msgid "Generate COFF format debug info" +#~ msgstr "COFF ·Á¼°¤Î¥Ç¥Ð¥Ã¥°¾ðÊó¤òÀ¸À®¤¹¤ë" + +#~ msgid "Do not store floats in registers" +#~ msgstr "¥ì¥¸¥¹¥¿¤ËÉâÆ°¾®¿ô¤ò³ÊǼ¤·¤Ê¤¤" + +#~ msgid "Consider all mem refs through pointers as volatile" +#~ msgstr "¥Ý¥¤¥ó¥¿·Ðͳ¤Î¥á¥â¥ê»²¾È¤òÁ´¤Æ volatile ¤È¤ß¤Ê¤¹" + +#~ msgid "Consider all mem refs to global data to be volatile" +#~ msgstr "Âç°è¥Ç¡¼¥¿¤Ø¤Î¥á¥â¥ê»²¾È¤òÁ´¤Æ volatile ¤È¤ß¤Ê¤¹" + +#~ msgid "Consider all mem refs to static data to be volatile" +#~ msgstr "ÀÅŪ¥Ç¡¼¥¿¤Ø¤Î¥á¥â¥ê»²¾È¤òÁ´¤Æ volatile ¤È¤ß¤Ê¤¹" + +#~ msgid "Defer popping functions args from stack until later" +#~ msgstr "´Ø¿ô°ú¿ô¤ò¥¹¥¿¥Ã¥¯¤«¤é pop ¤¹¤ë¤Î¤ò¸Æ¤Ó½Ð¤·¸å¤Þ¤ÇÃ٤餻¤ë" + +#~ msgid "When possible do not generate stack frames" +#~ msgstr "²Äǽ¤Ê¾ì¹ç¡¢¥¹¥¿¥Ã¥¯¥Õ¥ì¡¼¥à¤òÀ¸À®¤·¤Ê¤¤" + +#~ msgid "Optimize sibling and tail recursive calls" +#~ msgstr "sibling ¸Æ¤Ó½Ð¤·¤äËöÈøºÆµ¢¸Æ¤Ó½Ð¤·¤òºÇŬ²½¤¹¤ë" + +#~ msgid "When running CSE, follow jumps to their targets" +#~ msgstr "CSE ¤ÇÆ°ºî¤¹¤ë¤È¤­¡¢¤½¤ì¤é¤Î¥¿¡¼¥²¥Ã¥È¤Ø¤Î¥¸¥ã¥ó¥×¤ËÄɿ魯¤ë" + +#~ msgid "When running CSE, follow conditional jumps" +#~ msgstr "CSE ¤ÇÆ°ºî¤¹¤ë¤È¤­¡¢¾ò·ï¥¸¥ã¥ó¥×¤ËÄɿ魯¤ë" + +#~ msgid "Perform a number of minor, expensive optimisations" +#~ msgstr "ÌÜΩ¤¿¤Ê¤¤¡¢¥³¥¹¥È¤Î¤«¤«¤ëºÇŬ²½¤ò¹Ô¤Ê¤¦" + +#~ msgid "Perform jump threading optimisations" +#~ msgstr "¥¸¥ã¥ó¥×ʬ´ôºÇŬ²½¤ò¹Ô¤Ê¤¦" + +#~ msgid "Perform strength reduction optimisations" +#~ msgstr "¶¯Åٺ︺ºÇŬ²½¤ò¹Ô¤Ê¤¦" + +#~ msgid "Perform loop unrolling when iteration count is known" +#~ msgstr "È¿Éü²ó¿ô¤¬´ûÃΤΤȤ­¡¢¥ë¡¼¥×Ÿ³«¤ò¹Ô¤Ê¤¦" + +#~ msgid "Perform loop unrolling for all loops" +#~ msgstr "Á´¤Æ¤Î¥ë¡¼¥×¤Ç¥ë¡¼¥×Ÿ³«¤ò¹Ô¤Ê¤¦" + +#~ msgid "Force all loop invariant computations out of loops" +#~ msgstr "¥ë¡¼¥×Ãæ¤ËÉÔÊѤʷ׻»¤ò¥ë¡¼¥×¤Î³°¤Ë°ÜÆ°¤¹¤ë" + +#~ msgid "Strength reduce all loop general induction variables" +#~ msgstr "¥ë¡¼¥×¤ÎÃæ¤ÎÁ´¤Æ¤Î°ìÈÌͶƳÊÑ¿ô¤ò¶¯Åٺ︺¤¹¤ë" + +#~ msgid "Store strings in writable data section" +#~ msgstr "ʸ»úÎó¤ò½ñ¤­¹þ¤ß²Äǽ¥Ç¡¼¥¿¥»¥¯¥·¥ç¥ó¤Ë³ÊǼ¤¹¤ë" + +#~ msgid "Enable machine specific peephole optimisations" +#~ msgstr "µ¡¼ï¸ÇÍ­¤ÎÇÁ¤­·êºÇŬ²½¤òÍ­¸ú¤Ë¤¹¤ë" + +#~ msgid "Copy memory operands into registers before using" +#~ msgstr "¥á¥â¥ê¥ª¥Ú¥é¥ó¥É¤òÍøÍѤ¹¤ëÁ°¤Ë¥ì¥¸¥¹¥¿¤Ø¥³¥Ô¡¼¤¹¤ë" + +#~ msgid "Copy memory address constants into regs before using" +#~ msgstr "¥á¥â¥ê¥¢¥É¥ì¥¹Äê¿ô¤òÍøÍѤ¹¤ëÁ°¤Ë¥ì¥¸¥¹¥¿¤Ø¥³¥Ô¡¼¤¹¤ë" + +#~ msgid "Allow function addresses to be held in registers" +#~ msgstr "´Ø¿ô¥¢¥É¥ì¥¹¤ò¥ì¥¸¥¹¥¿¤Ë»ý¤¿¤»¤ë»ö¤òµö²Ä¤¹¤ë" + +#~ msgid "Integrate simple functions into their callers" +#~ msgstr "ñ½ã¤Ê´Ø¿ô¤ò¸Æ¤Ó½Ð¤·Â¦¤ËÅý¹ç¤¹¤ë" + +#~ msgid "Generate code for funcs even if they are fully inlined" +#~ msgstr "Á´¤Æ¥¤¥ó¥é¥¤¥ó¤È¤µ¤ì¤¿¤È¤·¤Æ¤â´Ø¿ô¤Î¥³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Pay attention to the 'inline' keyword" +#~ msgstr "'inline' ¥­¡¼¥ï¡¼¥É¤ËÃí°Õ¤òʧ¤¦" + +#~ msgid "Emit static const variables even if they are not used" +#~ msgstr "»ÈÍѤµ¤ì¤Ê¤¤ÀÅŪÄê¿ôÊÑ¿ô¤Ç¤¢¤Ã¤Æ¤â½ÐÎϤ¹¤ë" + +#~ msgid "Check for syntax errors, then stop" +#~ msgstr "ʸˡ¥¨¥é¡¼¤ò¸¡½Ð¤·¤Æ¡¢¤½¤³¤ÇÄä»ß¤¹¤ë" + +#~ msgid "Mark data as shared rather than private" +#~ msgstr "¥Ç¡¼¥¿¤ò¥×¥é¥¤¥Ù¡¼¥È¤Ç¤Ï¤Ê¤¯¶¦Í­¤µ¤ì¤ë¤è¤¦¥Þ¡¼¥¯¤¹¤ë" + +#~ msgid "Enable saving registers around function calls" +#~ msgstr "´Ø¿ô¸Æ¤Ó½Ð¤·¤ÎÁ°¸å¤Ç¥ì¥¸¥¹¥¿¤ÎÊݸ¤òÍ­¸ú¤Ë¤¹¤ë" + +#~ msgid "Return 'short' aggregates in memory, not registers" +#~ msgstr "'¾®¤µ¤Ê' ½¸¹çÂΤò¥ì¥¸¥¹¥¿¤Ç¤Ï¤Ê¤¯¥á¥â¥ê¤Ë³ÊǼ¤·¤ÆÊÖ¤¹" + +#~ msgid "Return 'short' aggregates in registers" +#~ msgstr "'¾®¤µ¤Ê' ½¸¹çÂΤò¥ì¥¸¥¹¥¿¤Ë³ÊǼ¤·¤ÆÊÖ¤¹" + +#~ msgid "Attempt to fill delay slots of branch instructions" +#~ msgstr "ʬ´ôÌ¿Îá¤ÎÃٱ䥹¥í¥Ã¥È¤ò»È¤¦¤³¤È¤ò»î¤ß¤ë" + +#~ msgid "Perform the global common subexpression elimination" +#~ msgstr "¥°¥í¡¼¥Ð¥ë¶¦ÄÌÉôʬ¼°¤ò½üµî¤¹¤ë" + +#~ msgid "Run CSE pass after loop optimisations" +#~ msgstr "¥ë¡¼¥×ºÇŬ²½¸å¤Ë¶¦ÄÌÉôʬ¼°½üµî²áÄø¤ò¼Â¹Ô" + +#~ msgid "Run the loop optimiser twice" +#~ msgstr "¥ë¡¼¥×ºÇŬ²½¤òÆó²ó¼Â¹Ô¤¹¤ë" + +#~ msgid "Delete useless null pointer checks" +#~ msgstr "̵°ÕÌ£¤Ê null ¥Ý¥¤¥ó¥¿¸¡ºº¤òºï½ü¤¹¤ë" + +#~ msgid "Pretend that host and target use the same FP format" +#~ msgstr "¥Û¥¹¥È¤È¥¿¡¼¥²¥Ã¥È¤¬Æ±¤¸ÉâÆ°¾®¿ô·Á¼°¤ò»È¤¦¿¶¤ëÉñ¤¤¤ò¤µ¤»¤ë" + +#~ msgid "Reschedule instructions before register allocation" +#~ msgstr "¥ì¥¸¥¹¥¿³ÎÊݤÎÁ°¤ËÌ¿Îá¤òÊ¤Ùľ¤¹" + +#~ msgid "Reschedule instructions after register allocation" +#~ msgstr "¥ì¥¸¥¹¥¿³ÎÊݤθå¤ÇÌ¿Îá¤òÊ¤Ùľ¤¹" + +#~ msgid "Enable scheduling across basic blocks" +#~ msgstr "´ðËÜ¥Ö¥í¥Ã¥¯¤ò¸Ù¤°Ì¿ÎáÇÛÃÖ¤òÍ­¸ú¤Ë¤¹¤ë" + +#~ msgid "Allow speculative motion of non-loads" +#~ msgstr "Èó¥í¡¼¥É¤Ç¤ÎÉԳμ¤ÊÆ°ºî¤òµö²Ä¤¹¤ë" + +#~ msgid "Allow speculative motion of some loads" +#~ msgstr "¤¤¤¯¤Ä¤«¤Î¥í¡¼¥É¤Ç¤ÎÉԳμ¤ÊÆ°ºî¤òµö²Ä¤¹¤ë" + +#~ msgid "Allow speculative motion of more loads" +#~ msgstr "¤è¤ê¿¤¯¤Î¥í¡¼¥É¤Ç¤ÎÉԳμ¤ÊÆ°ºî¤òµö²Ä¤¹¤ë" + +#~ msgid "Replace add,compare,branch with branch on count reg" +#~ msgstr "²Ã»»¡¢Èæ³Ó¥Ö¥é¥ó¥Á¤ÎÂå¤ï¤ê¤Ë¥«¥¦¥ó¥È¥ì¥¸¥¹¥¿¤Î¥Ö¥é¥ó¥Á¤ò»È¤¦" + +#~ msgid "Generate position independent code, if possible" +#~ msgstr "²Äǽ¤Ç¤¢¤ì¤Ð°ÌÃÖÆÈΩ¥³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Enable exception handling" +#~ msgstr "Îã³°Ê᪤òÍ­¸ú¤Ë¤¹¤ë" + +#~ msgid "Just generate unwind tables for exception handling" +#~ msgstr "´¬¤­Ìᤷ¤ò¹Ô¤Ê¤¦Îã³°Êä­Íѥơ¼¥Ö¥ë¤òÀ¸À®¤¹¤ë" + +#~ msgid "Support synchronous non-call exceptions" +#~ msgstr "Ʊ´üÈó¸Æ¤Ó½Ð¤·Îã³°¤ò¥µ¥Ý¡¼¥È¤¹¤ë" + +#~ msgid "Insert arc based program profiling code" +#~ msgstr "¥×¥í¥°¥é¥à¤¬¥³¡¼¥É¥×¥í¥Õ¥¡¥¤¥ë¤¹¤ë¸µ¤Ë¤Ê¤ë¸Ì¤òÁÞÆþ¤¹¤ë" + +#~ msgid "Create data files needed by gcov" +#~ msgstr "gcov ¤¬É¬ÍפȤ¹¤ë¥Ç¡¼¥¿¥Õ¥¡¥¤¥ë¤òºîÀ®¤¹¤ë" + +#~ msgid "Use profiling information for branch probabilities" +#~ msgstr "ʬ´ô·ÐÏ©¿ä¬ÍѤΥץí¥Õ¥¡¥¤¥ë¾ðÊó¤òÍøÍѤ¹¤ë" + +#~ msgid "Reorder basic blocks to improve code placement" +#~ msgstr "¥³¡¼¥ÉÇÛÃÖ¤ò²þÁ±¤¹¤ë¤¿¤á¤Ë´ðËÜ¥Ö¥í¥Ã¥¯¤òºÆÀ°Íý¤¹¤ë" + +#~ msgid "Do the register renaming optimization pass" +#~ msgstr "ºÇŬ²½²áÄø¤Î¥ì¥¸¥¹¥¿¤Ä¤±ÊѤ¨¤ò¹Ô¤Ê¤¦" + +#~ msgid "Improve FP speed by violating ANSI & IEEE rules" +#~ msgstr "ANSI & IEEE µ¬Â§¤òÇˤäÆÉâÆ°¾®¿ô¤Î®ÅÙ¤ò²þÁ±¤¹¤ë" + +#~ msgid "Do not put unitialised globals in the common section" +#~ msgstr "Âç°èÊÑ¿ôÅù¤ò½é´ü²½¤µ¤ì¤Ê¤¤¥³¥â¥ó¥»¥¯¥·¥ç¥ó¤ËÃÖ¤«¤Ê¤¤" + +#~ msgid "Do not generate .size directives" +#~ msgstr ".size µ¿»÷Ì¿Îá¤òÀ¸À®¤·¤Ê¤¤" + +#~ msgid "place each function into its own section" +#~ msgstr "³Æ¡¹¤Î´Ø¿ô¤ò¤½¤ì¼«¿È¤Î¥»¥¯¥·¥ç¥ó¤ËÇÛÃÖ¤¹¤ë" + +#~ msgid "place data items into their own section" +#~ msgstr "¥Ç¡¼¥¿¹àÌܤò¤½¤ì¤é¼«¿È¤Î¥»¥¯¥·¥ç¥ó¤ËÇÛÃÖ¤¹¤ë" + +#~ msgid "Add extra commentry to assembler output" +#~ msgstr ";ʬ¤Ê¥³¥á¥ó¥È¤ò¥¢¥»¥ó¥Ö¥é½ÐÎϤËÄɲ乤ë" + +#~ msgid "Output GNU ld formatted global initialisers" +#~ msgstr "GNU ld ·Á¼°¤ÎÂç°è½é´ü²½»Ò¤ò½ÐÎϤ¹¤ë" + +#~ msgid "Enables a register move optimisation" +#~ msgstr "°ÜÆ°Ì¿ÎáºÇŬ²½¥ì¥¸¥¹¥¿¤òÍ­¸ú¤Ë¤¹¤ë" + +#~ msgid "Do the full regmove optimization pass" +#~ msgstr "ºÇŬ²½²áÄø¤ÇºÇÂç¸Â¤Î regmove ¤ò¹Ô¤Ê¤¦" + +#~ msgid "Pack structure members together without holes" +#~ msgstr "¹½Â¤ÂÎ¥á¥ó¥Ð¤ò·ê¤¬³«¤«¤Ê¤¤¤è¤¦¤Ë¥Ñ¥Ã¥¯¤¹¤ë" + +#~ msgid "Insert stack checking code into the program" +#~ msgstr "¥×¥í¥°¥é¥à¤Ë¥¹¥¿¥Ã¥¯¶­³¦¸¡½Ð¥³¡¼¥É¤òÁÞÆþ¤¹¤ë" + +#~ msgid "Specify that arguments may alias each other & globals" +#~ msgstr "°ú¿ô¤ÈÂç°è¥Ç¡¼¥¿¤ä¾¤Î°ú¿ô¤ÈÊÌ̾¤Ë¤Ê¤ê¤¦¤ë»ö¤ò»ØÄꤹ¤ë" + +#~ msgid "Assume arguments may alias globals but not each other" +#~ msgstr "°ú¿ô¤ÈÂç°è¥Ç¡¼¥¿¤ÏÊÌ̾¤Ë¤Ê¤ê¤¦¤ë¤¬Â¾¤Î°ú¿ô¤È¤ÏÊÌ̾¤Ç¤Ï¤Ê¤¤¤È¤ß¤Ê¤¹" + +#~ msgid "Assume arguments do not alias each other or globals" +#~ msgstr "°ú¿ô¤¬Âç°è¥Ç¡¼¥¿¤ä¾¤Î°ú¿ô¤ÈÊÌ̾¤Ë¤Ï¤Ê¤é¤Ê¤¤¤È¤ß¤Ê¤¹" + +#~ msgid "Assume strict aliasing rules apply" +#~ msgstr "¸·Ì©¤ÊÊÌ̾µ¬Â§¤ËŬ¹ç¤¹¤ë¤È¤ß¤Ê¤¹" + +#~ msgid "Align the start of loops" +#~ msgstr "¥ë¡¼¥×¤Î³«»Ï¤ò¥¢¥é¥¤¥ó¤¹¤ë" + +#~ msgid "Align labels which are only reached by jumping" +#~ msgstr "¥é¥Ù¥ë¤Î¤¦¤Á¥¸¥ã¥ó¥×ÅþãÀè¤È¤Ê¤ë¤â¤Î¤À¤±¤ò¥¢¥é¥¤¥ó¤¹¤ë" + +#~ msgid "Align all labels" +#~ msgstr "Á´¤Æ¤Î¥é¥Ù¥ë¤ò¥¢¥é¥¤¥ó¤¹¤ë" + +#~ msgid "Align the start of functions" +#~ msgstr "´Ø¿ô¤Î³«»Ï¤ò¥¢¥é¥¤¥ó¤¹¤ë" + +#~ msgid "Generate code to check every memory access" +#~ msgstr "³Æ¥á¥â¥ê¥¢¥¯¥»¥¹¤ò¸¡½Ð¤¹¤ë¥³¡¼¥É¤òÀ¸À®¤¹¤ë" + +#~ msgid "Add a prefix to all function names" +#~ msgstr "Á´¤Æ¤Î´Ø¿ô̾¤ËÀÜƬ¼­¤òÄɲ乤ë" + +#~ msgid "Suppress output of instruction numbers and line number notes in debugging dumps" +#~ msgstr "¥Ç¥Ð¥Ã¥°¥À¥ó¥×¤ÇÌ¿ÎáÈÖ¹æ¤È¹ÔÈÖ¹æ¥Î¡¼¥È¤Î½ÐÎϤòÍÞÀ©¤¹¤ë" + +#~ msgid "Instrument function entry/exit with profiling calls" +#~ msgstr "´Ø¿ô¤ÎÆþ¤ê¸ý/½Ð¸ý¤Ç¥×¥í¥Õ¥¡¥¤¥ë¸Æ¤Ó½Ð¤·¤òÀ¸À®¤¹¤ë" + +#~ msgid "Enable SSA optimizations" +#~ msgstr "SSA ºÇŬ²½¤òÍ­¸ú¤Ë¤¹¤ë" + +#~ msgid "Enable dead code elimination" +#~ msgstr "¥Ç¥Ã¥É¥³¡¼¥É¤Î½üµî¤ò¹Ô¤Ê¤¦" + +#~ msgid "External symbols have a leading underscore" +#~ msgstr "³°Éô¥·¥ó¥Ü¥ë¤ËƬʸ»ú¥¢¥ó¥À¡¼¥¹¥³¥¢¤ò»ý¤¿¤»¤ë" + +#~ msgid "Process #ident directives" +#~ msgstr "#ident ¥Ç¥£¥ì¥¯¥Æ¥£¥Ö¤ò½èÍý¤¹¤ë" + +#~ msgid "Enables an rtl peephole pass run before sched2" +#~ msgstr "ÂèÆóÌ¿ÎáÇÛÃÖ¤ÎÁ°¤Ç rtl ÇÁ¤­·ê²áÄø¤òÍ­¸ú¤Ë¤¹¤ë" + +#~ msgid "Enables guessing of branch probabilities" +#~ msgstr "ʬ´ô·ÐÏ©¿ä¬¤òÍ­¸ú¤Ë¤¹¤ë" + +#~ msgid "Set errno after built-in math functions" +#~ msgstr "ÁȤ߹þ¤ß¿ô³Ø´Ø¿ô¤Î¸å¤Ë errno ¤ò¥»¥Ã¥È¤¹¤ë" + +#~ msgid "Convert floating point constant to single precision constant" +#~ msgstr "ÉâÆ°¾®¿ôÅÀÄê¿ô¤òñÀºÅÙÄê¿ô¤ËÊÑ´¹¤¹¤ë" + +#~ msgid "Report time taken by each compiler pass at end of run" +#~ msgstr "¼Â¹Ô½ªÎ»»þ¤Ë¥³¥ó¥Ñ¥¤¥é¤Î³Æ²áÄø¤ËÍפ·¤¿»þ´Ö¤òÊó¹ð¤¹¤ë" + +#~ msgid "Report on permanent memory allocation at end of run" +#~ msgstr "¼Â¹Ô½ªÎ»»þ¤Ë±Ê³Ū¤Ë³ÎÊݤµ¤ì¤¿¥á¥â¥ê¤òÊó¹ð¤¹¤ë" + +#~ msgid "Trap for signed overflow in addition / subtraction / multiplication." +#~ msgstr "Éä¹çÉÕ¤­¤Î²Ã»»/¸º»»/¾è»»¤Ç¤Î·å¤¢¤Õ¤ì¤ò¥È¥é¥Ã¥×¤¹¤ë" + +#~ msgid "Compile just for ISO C89" +#~ msgstr "ISO C89 ÍѤ˥³¥ó¥Ñ¥¤¥ë¤¹¤ë" + +#~ msgid "Do not promote floats to double if using -traditional" +#~ msgstr "-traditional »ÈÍÑ»þ¤Ë¤Ï¡¢ÉâÆ°¾®¿ô¤Ë´Ø¤· float ¤«¤é double ¤Ë³Ê¾å¤²¤·¤Ê¤¤" + +#~ msgid "Determine language standard" +#~ msgstr "¸À¸ì¤Îɸ½à¤ò·èÄꤹ¤ë" + +#~ msgid "Make bitfields by unsigned by default" +#~ msgstr "¥Ó¥Ã¥È¥Õ¥£¡¼¥ë¥É¤ò¥Ç¥Õ¥©¥ë¥È¤ÇÉä¹ç̵¤·¤È¤¹¤ë" + +#~ msgid "Make 'char' be signed by default" +#~ msgstr "'char' ¤ò¥Ç¥Õ¥©¥ë¥È¤ÇÉä¹çÉÕ¤­¤È¤¹¤ë" + +#~ msgid "Make 'char' be unsigned by default" +#~ msgstr "'char' ¤ò¥Ç¥Õ¥©¥ë¥È¤ÇÉä¹ç̵¤·¤È¤¹¤ë" + +#~ msgid "Attempt to support traditional K&R style C" +#~ msgstr "¸Å¤¤ K&R ¼°¤Î C ¤Î¥µ¥Ý¡¼¥È¤ò»î¤ß¤ë" + +#~ msgid "Do not recognise the 'asm' keyword" +#~ msgstr "'asm' ͽÌó¸ì¤òǧ¼±¤µ¤»¤Ê¤¤" + +#~ msgid "Do not recognise any built in functions" +#~ msgstr "¤¤¤¯¤Ä¤«¤ÎÁȤ߹þ¤ß´Ø¿ô¤òǧ¼±¤µ¤»¤Ê¤¤" + +#~ msgid "Assume normal C execution environment" +#~ msgstr "Ä̾ï¤Î C ¼Â¹Ô´Ä¶­¤òÁ°Äó¤È¤¹¤ë" + +#~ msgid "Assume that standard libraries & main might not exist" +#~ msgstr "ɸ½à¥é¥¤¥Ö¥é¥ê¤ä main ¤¬Â¸ºß¤·¤Ê¤¤²ÄǽÀ­¤¬¤¢¤ë¤â¤Î¤È¤¹¤ë" + +#~ msgid "Allow different types as args of ? operator" +#~ msgstr "? ±é»»»Ò¤Î°ú¿ô¤È¤·¤Æ°Û¤Ê¤Ã¤¿·¿¤òµöÍƤ¹¤ë" + +#~ msgid "Allow the use of $ inside identifiers" +#~ msgstr "¼±ÊÌ»ÒÃæ¤Ç¤Î $ ¤Î»ÈÍѤòµöÍƤ¹¤ë" + +#~ msgid "Use the same size for double as for float" +#~ msgstr "double ¤Î¥µ¥¤¥º¤ò float ¤ÈƱ¤¸¤È¤·¤Æ»ÈÍѤ¹¤ë" + +#~ msgid "Use the smallest fitting integer to hold enums" +#~ msgstr "Îóµó·¿¤¬ÊÝ»ý¤Ç¤­¤ëºÇ¾®¤ÎÀ°¿ô·¿¤ò»ÈÍѤ¹¤ë" + +#~ msgid "Override the underlying type for wchar_t to `unsigned short'" +#~ msgstr "wchar_t ¤Îº¬ËÜŪ¤Ê·¿¤ò `unsigned short' ¤Èʤ¤¹" + +#~ msgid "Enable most warning messages" +#~ msgstr "Ëؤó¤É¤Î·Ù¹ð¥á¥Ã¥»¡¼¥¸¤òÍ­¸ú¤Ë¤¹¤ë" + +#~ msgid "Warn about casting functions to incompatible types" +#~ msgstr "·¿¤Ë¸ß´¹À­¤Î¤Ê¤¤´Ø¿ô¤Î¥­¥ã¥¹¥È¤Ë´Ø¤·¤Æ·Ù¹ð¤¹¤ë" + +#~ msgid "Warn about functions which might be candidates for format attributes" +#~ msgstr "format °À­¤ò¤Î¸õÊä¤È¤Ê¤ê¤½¤¦¤Ê´Ø¿ô¤Ë¤Ä¤¤¤Æ·Ù¹ð¤¹¤ë" + +#~ msgid "Warn about casts which discard qualifiers" +#~ msgstr "½¤¾þ»Ò¤ò¼è¤êµî¤ë¥­¥ã¥¹¥È¤Ë¤Ä¤¤¤Æ·Ù¹ð¤¹¤ë" + +#~ msgid "Warn about subscripts whose type is 'char'" +#~ msgstr "ź»ú¤Î·¿¤¬ 'char' ¤Ç¤¢¤ì¤Ð·Ù¹ð¤¹¤ë" + +#~ msgid "Warn if nested comments are detected" +#~ msgstr "Æþ¤ì»Ò¤Ë¤Ê¤Ã¤¿¥³¥á¥ó¥È¤ò¸¡½Ð¤·¤¿¤È¤­¤Ë·Ù¹ð¤¹¤ë" + +#~ msgid "Warn about possibly confusing type conversions" +#~ msgstr "·¿ÊÑ´¹¤¬º®Í𤹤ë²ÄǽÀ­¤Ë´Ø¤·¤Æ·Ù¹ð¤¹¤ë" + +#~ msgid "Warn about printf/scanf/strftime/strfmon format anomalies" +#~ msgstr "printf/scanf/strftime/strfmon ·Á¼°¤ÎÊѧŪ¤Ê¤â¤Î¤Ë´Ø¤·¤Æ·Ù¹ð¤¹¤ë" + +#~ msgid "Don't warn about strftime formats yielding 2 digit years" +#~ msgstr "strftime ·Á¼°¤¬Æó·å¤Çǯ¤òɽ¤·¤Æ¤¤¤ë»þ¤Î·Ù¹ð¤·¤Ê¤¤" + +#~ msgid "Don't warn about too many arguments to format functions" +#~ msgstr "format ´Ø¿ô¤Ø¤Î¿¤¹¤®¤ë°ú¿ô¤Ë´Ø¤¹¤ë·Ù¹ð¤·¤Ê¤¤" + +#~ msgid "Warn about non-string-literal format strings" +#~ msgstr "Èóʸ»úÎó¥ê¥Æ¥é¥ë¤Î format ʸ»úÎó¤Ë¤Ä¤¤¤Æ·Ù¹ð¤¹¤ë" + +#~ msgid "Warn about possible security problems with format functions" +#~ msgstr "¥»¥­¥å¥ê¥Æ¥£Åª¤ÊÌäÂê¤È¤Ê¤ê¤¦¤ë format ´Ø¿ô¤Ë´Ø¤·¤Æ·Ù¹ð¤¹¤ë" + +#~ msgid "Warn about implicit function declarations" +#~ msgstr "°ÅÌۤδؿôÀë¸À¤Ë´Ø¤·¤Æ·Ù¹ð¤¹¤ë" + +#~ msgid "Warn when a declaration does not specify a type" +#~ msgstr "Àë¸À¤¬·¿¤ò»ØÄꤷ¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ë·Ù¹ð¤¹¤ë" + +#~ msgid "Warn about the use of the #import directive" +#~ msgstr "#import ¥Ç¥£¥ì¥¯¥Æ¥£¥Ö¤ÎÍøÍѤ˴ؤ·¤Æ·Ù¹ð¤¹¤ë" + +#~ msgid "Do not warn about using 'long long' when -pedantic" +#~ msgstr "-pedantic »ØÄê»þ¤Ç¤â 'long long' ¤Î»ÈÍѤˤĤ¤¤Æ¤Ï·Ù¹ð¤·¤Ê¤¤" + +#~ msgid "Warn about suspicious declarations of main" +#~ msgstr "µ¿¤ï¤·¤¤ main ¤ÎÀë¸À¤Ë´Ø¤·¤Æ·Ù¹ð¤¹¤ë" + +#~ msgid "Warn about possibly missing braces around initialisers" +#~ msgstr "½é´ü²½»Ò¤Î¼þ¤ê¤Ë¥Ö¥ì¡¼¥¹¤ò·ç¤¤¤Æ¤¤¤ëÍͤǤ¢¤ì¤Ð·Ù¹ð¤¹¤ë" + +#~ msgid "Warn about global funcs without previous declarations" +#~ msgstr "»öÁ°¤ÎÀë¸À¤Ê¤·¤ÎÂç°è´Ø¿ô¤Ë´Ø¤·¤Æ·Ù¹ð¤¹¤ë" + +#~ msgid "Warn about global funcs without prototypes" +#~ msgstr "¥×¥í¥È¥¿¥¤¥×¤Ê¤·¤ÎÂç°è´Ø¿ô¤Ë´Ø¤·¤Æ·Ù¹ð¤¹¤ë" + +#~ msgid "Warn about use of multicharacter literals" +#~ msgstr "Ê£¿ôʸ»ú¥ê¥Æ¥é¥ë¤Î»ÈÍѤ˴ؤ·¤Æ·Ù¹ð¤¹¤ë" + +#~ msgid "Warn about externs not at file scope level" +#~ msgstr "¥Õ¥¡¥¤¥ë¥¹¥³¡¼¥×¥ì¥Ù¥ë¤Ç¤Ê¤¤ extern ¤Ë´Ø¤·¤Æ·Ù¹ð¤¹¤ë" + +#~ msgid "Warn about possible missing parentheses" +#~ msgstr "³ç¸Ì¤ò·ç¤¤¤Æ¤¤¤ë²ÄǽÀ­¤¬¤¢¤ë¾ì¹ç¤Ë·Ù¹ð¤¹¤ë" + +#~ msgid "Warn about possible violations of sequence point rules" +#~ msgstr "ÉûºîÍÑ´°Î»ÅÀµ¬Â§¤òÇˤë²ÄǽÀ­¤¬¤¢¤ë¾ì¹ç¤Ë·Ù¹ð¤¹¤ë" + +#~ msgid "Warn about function pointer arithmetic" +#~ msgstr "´Ø¿ô¥Ý¥¤¥ó¥¿¤Î·×»»¤Ë´Ø¤·¤Æ·Ù¹ð¤¹¤ë" + +#~ msgid "Warn about multiple declarations of the same object" +#~ msgstr "Ʊ°ì¥ª¥Ö¥¸¥§¥¯¥È¤ÎÀë¸À¤¬Ê£¿ô¤¢¤ì¤Ð·Ù¹ð¤¹¤ë" + +#~ msgid "Warn about signed/unsigned comparisons" +#~ msgstr "Éä¹çÉÕ¤­/Éä¹ç̵¤·¤ÎÈæ³Ó¤Ë´Ø¤·¤Æ·Ù¹ð¤¹¤ë" + +#~ msgid "Warn about testing equality of floating point numbers" +#~ msgstr "ÉâÆ°¾®¿ôÅÀ¿ô¤ÎÅù²Á¥Æ¥¹¥È¤Ë´Ø¤·¤Æ·Ù¹ð¤¹¤ë" + +#~ msgid "Warn about unrecognized pragmas" +#~ msgstr "ǧ¼±¤Ç¤­¤Ê¤¤ pragma ¤Ë´Ø¤·¤Æ·Ù¹ð¤¹¤ë" + +#~ msgid "Warn about non-prototyped function decls" +#~ msgstr "¥×¥í¥È¥¿¥¤¥×¤µ¤ì¤Æ¤¤¤Ê¤¤´Ø¿ôÀë¸À¤Ë´Ø¤·¤Æ·Ù¹ð¤¹¤ë" + +#~ msgid "Warn about constructs whose meaning change in ISO C" +#~ msgstr "ISO C ¤Ç¤½¤Î°ÕÌ£¤¬Êѹ¹¤µ¤ì¤¿ÆâÍƤ˴ؤ·¤Æ·Ù¹ð¤¹¤ë" + +#~ msgid "Warn when trigraphs are encountered" +#~ msgstr "¥È¥é¥¤¥°¥é¥Õ¤òȯ¸«¤·¤¿¤È¤­¤Ë·Ù¹ð¤¹¤ë" + +#~ msgid "Mark strings as 'const char *'" +#~ msgstr "ʸ»úÎó¤ò 'const char *' ¤È¤·¤Æ¥Þ¡¼¥¯¤¹¤ë" + +#~ msgid "Warn when a function is unused" +#~ msgstr "´Ø¿ô¤¬»È¤ï¤ì¤Ê¤¤¤È¤­¤Ë·Ù¹ð¤¹¤ë" + +#~ msgid "Warn when a label is unused" +#~ msgstr "¥é¥Ù¥ë¤¬»È¤ï¤ì¤Ê¤¤¤È¤­¤Ë·Ù¹ð¤¹¤ë" + +#~ msgid "Warn when a function parameter is unused" +#~ msgstr "´Ø¿ô¤Î²¾°ú¿ô¤¬»È¤ï¤ì¤Ê¤¤¤È¤­¤Ë·Ù¹ð¤¹¤ë" + +#~ msgid "Warn when a variable is unused" +#~ msgstr "ÊÑ¿ô¤¬»È¤ï¤ì¤Ê¤¤¤È¤­¤Ë·Ù¹ð¤¹¤ë" + +#~ msgid "Warn when an expression value is unused" +#~ msgstr "¼°¤ÎÃͤ¬»È¤ï¤ì¤Ê¤¤¤È¤­¤Ë·Ù¹ð¤¹¤ë" + +#~ msgid "Do not suppress warnings from system headers" +#~ msgstr "¥·¥¹¥Æ¥à¥Ø¥Ã¥À¤«¤é¤Î·Ù¹ð¤òÍÞÀ©¤·¤Ê¤¤" + +#~ msgid "Treat all warnings as errors" +#~ msgstr "Á´¤Æ¤Î·Ù¹ð¤ò¥¨¥é¡¼¤È¤·¤Æ¼è¤ê°·¤¦" + +#~ msgid "Warn when one local variable shadows another" +#~ msgstr "¤¢¤ë¥í¡¼¥«¥ëÊÑ¿ô¤¬Â¾¤Î¤â¤Î¤òʤ¤¤±£¤¹¤È¤­¤Ë·Ù¹ð¤¹¤ë" + +#~ msgid "Warn about enumerated switches missing a specific case" +#~ msgstr "ÎóµóÄê¿ô¤Î switch ¤Ç case »ØÄ꤬·ç¤±¤Æ¤¤¤ë¤â¤Î¤Ë´Ø¤·¤Æ·Ù¹ð¤¹¤ë" + +#~ msgid "Warn about returning structures, unions or arrays" +#~ msgstr "¹½Â¤ÂΡ¢¶¦ÍÑÂÎËô¤ÏÇÛÎó¤òÊÖ¤¹¤â¤Î¤Ë´Ø¤·¤Æ·Ù¹ð¤¹¤ë" + +#~ msgid "Warn about pointer casts which increase alignment" +#~ msgstr "¥Ý¥¤¥ó¥¿¤Î¥­¥ã¥¹¥È¤Ç¥¢¥é¥¤¥ó¥á¥ó¥È¤¬Áý²Ã¤¹¤ë¤â¤Î¤Ë´Ø¤·¤Æ·Ù¹ð¤¹¤ë" + +#~ msgid "Warn about code that will never be executed" +#~ msgstr "¼Â¹Ô¤µ¤ì¤ë¤³¤È¤¬¤Ê¤¤¥³¡¼¥É¤Ë´Ø¤·¤Æ·Ù¹ð¤¹¤ë" + +#~ msgid "Warn about unitialized automatic variables" +#~ msgstr "½é´ü²½¤µ¤ì¤Ê¤¤¼«Æ°ÊÑ¿ô¤Ë´Ø¤·¤Æ·Ù¹ð¤¹¤ë" + +#~ msgid "Warn when an inlined function cannot be inlined" +#~ msgstr "¥¤¥ó¥é¥¤¥ó´Ø¿ô¤ò¥¤¥ó¥é¥¤¥ó²½¤Ç¤­¤Ê¤¤¾ì¹ç¤Ë·Ù¹ð¤¹¤ë" + +#~ msgid "Warn when the packed attribute has no effect on struct layout" +#~ msgstr "packed °À­¤¬¹½Â¤ÂÎÇÛÃ֤˱ƶÁ¤·¤Ê¤¤¾ì¹ç¤Ë·Ù¹ð¤¹¤ë" + +#~ msgid "Warn when padding is required to align struct members" +#~ msgstr "¹½Â¤ÂÎ¥á¥ó¥Ð¤Î¥¢¥é¥¤¥ó¤Ç¡¢¥Ñ¥Ç¥£¥ó¥°¤òÍפ¹¤ë¾ì¹ç¤Ë·Ù¹ð¤¹¤ë" + +#~ msgid "Warn when an optimization pass is disabled" +#~ msgstr "ºÇŬ²½²áÄø¤¬Ìµ¸ú²½¤µ¤ì¤¿¾ì¹ç¤Ë·Ù¹ð¤¹¤ë" + +#~ msgid "Warn about functions which might be candidates for attribute noreturn" +#~ msgstr "noreturn °À­¤Î¸õÊä¤È¤Ê¤ê¤½¤¦¤Ê´Ø¿ô¤Ë´Ø¤·¤Æ·Ù¹ð¤¹¤ë" + +#~ msgid "Invalid option `%s'" +#~ msgstr "̵¸ú¤Ê¥ª¥×¥·¥ç¥ó `%s'" + +#~ msgid "Internal error: %s" +#~ msgstr "ÆâÉô¥¨¥é¡¼: %s" + +#~ msgid "`%s' declared `static' but never defined" +#~ msgstr "`%s' ¤¬ `static' ¤ÈÀë¸À¤µ¤ì¤Þ¤·¤¿¤¬Ì¤ÄêµÁ¤Ç¤¹" + +#~ msgid "`%s' defined but not used" +#~ msgstr "`%s' ¤¬ÄêµÁ¤µ¤ì¤Þ¤·¤¿¤¬»È¤ï¤ì¤Þ¤»¤ó¤Ç¤·¤¿" + +#~ msgid "can't open %s for writing" +#~ msgstr "%s ¤ò½ñ¤­¹þ¤ßÍѤ˳«¤±¤Þ¤»¤ó¤Ç¤·¤¿" + +#~ msgid "-ffunction-sections not supported for this target." +#~ msgstr "-ffunction-sections ¤Ï¤³¤Î¥¿¡¼¥²¥Ã¥È¤Ç¼õ¤±Æþ¤ì¤é¤ì¤Þ¤»¤ó" + +#~ msgid "-fdata-sections not supported for this target." +#~ msgstr "-fdata-sections ¤Ï¤³¤Î¥¿¡¼¥²¥Ã¥È¤Ç¼õ¤±Æþ¤ì¤é¤ì¤Þ¤»¤ó" + +#~ msgid "-ffunction-sections disabled; it makes profiling impossible." +#~ msgstr "-ffunction-sections ¤¬Ìµ¸ú¤Ç¤¹ -- ¥×¥í¥Õ¥¡¥¤¥ë¤ÏÉÔ²Äǽ¤Ç¤¹" + +#~ msgid "-ffunction-sections may affect debugging on some targets." +#~ msgstr "-ffunction-sections ¤Ï¥¿¡¼¥²¥Ã¥È¤Ë¤è¤Ã¤Æ¤Ï¥Ç¥Ð¥Ã¥°¤Ë±Æ¶Á¤¹¤ë¤«¤â¤·¤ì¤Þ¤»¤ó" + +#~ msgid "Errors detected in input file (your bison.simple is out of date)\n" +#~ msgstr "ÆþÎÏ¥Õ¥¡¥¤¥ëÃæ¤Ë¥¨¥é¡¼ (¤¢¤Ê¤¿¤Î bison.simple ¤Ï¸Å¤¹¤®¤Þ¤¹)\n" + +#~ msgid "error writing to %s" +#~ msgstr "%s ¤Ø¤Î½ñ¤­¹þ¤ß¥¨¥é¡¼¤Ç¤¹" + +#~ msgid "invalid register name `%s' for register variable" +#~ msgstr "`%s' ¤Ï¥ì¥¸¥¹¥¿ÊÑ¿ô¤È¤·¤Æ¤Ï̵¸ú¤Ê¥ì¥¸¥¹¥¿Ì¾¤Ç¤¹" + +#~ msgid " -ffixed- Mark as being unavailable to the compiler\n" +#~ msgstr " -ffixed- ¥³¥ó¥Ñ¥¤¥é¤ËÂФ· ¤ò»ÈÍÑÉԲĤȥޡ¼¥¯¤¹¤ë\n" + +#~ msgid " -fcall-used- Mark as being corrupted by function calls\n" +#~ msgstr " -fcall-used- ´Ø¿ô¸Æ¤Ó½Ð¤·¤ÇÇ˲õ¤µ¤ì¤ë ¤È¤·¤Æ¥Þ¡¼¥¯¤¹¤ë\n" + +#~ msgid " -fcall-saved- Mark as being preserved across functions\n" +#~ msgstr " -fcall-saved- ¤¬´Ø¿ô¤òÄ̤¸¤ÆÊÝ»ý¤µ¤ì¤ë¤È¥Þ¡¼¥¯¤¹¤ë\n" + +#~ msgid " -finline-limit= Limits the size of inlined functions to \n" +#~ msgstr " -finline-limit= ¥¤¥ó¥é¥¤¥ó´Ø¿ô¤Î¥µ¥¤¥º¤ò ¤ËÀ©¸Â¤¹¤ë\n" + +#~ msgid " -fmessage-length= Limits diagnostics messages lengths to characters per line. 0 suppresses line-wrapping\n" +#~ msgstr " -fmessage-length= ¿ÇÃÇ¥á¥Ã¥»¡¼¥¸¤ÎŤµ¤ò°ì¹ÔÊÕ¤ê ʸ»ú¤ËÀ©¸Â¤¹¤ë¡£ 0 ¤À¤È²þ¹Ô¤òÍÞÀ©¤¹¤ë\n" + +#~ msgid " -fdiagnostics-show-location=[once | every-line] Indicates how often source location information should be emitted, as prefix, at the beginning of diagnostics when line-wrapping\n" +#~ msgstr "" +#~ " -fdiagnostics-show-location=[once | every-line] ¿ÇÃÇ¥á¥Ã¥»¡¼¥¸¤Î²þ¹Ô¤ÎºÝ¤Ë,\n" +#~ " ¥½¡¼¥¹°ÌÃÖ¾ðÊ󤬹Ԥκǽé¤Ëɽ¼¨¤µ¤ì¤ëÉÑÅÙ¤ò»ØÄꤹ¤ë\n" + +#~ msgid " -O[number] Set optimisation level to [number]\n" +#~ msgstr " -O[number] ºÇŬ²½¥ì¥Ù¥ë¤ò [number] ¤ËÀßÄꤹ¤ë\n" + +#~ msgid " -Os Optimise for space rather than speed\n" +#~ msgstr " -Os ®ÅÙ¤è¤ê¤â¥µ¥¤¥º¤ÎºÇŬ²½¤ò¹Ô¤Ê¤¦\n" + +#~ msgid " -pedantic Issue warnings needed by strict compliance to ISO C\n" +#~ msgstr " -pedantic ¸·Ì©¤Ê ISO C ¤Ø¤ÎŬ¹ç¤ËÍפ¹¤ë·Ù¹ð¤òȯ¤¹¤ë\n" + +#~ msgid " -pedantic-errors Like -pedantic except that errors are produced\n" +#~ msgstr " -pedantic-errors -pedantic ¤ÈƱÍͤÀ¤¬¡¢¥¨¥é¡¼¤òȯÀ¸¤µ¤»¤ë\n" + +#~ msgid " -w Suppress warnings\n" +#~ msgstr " -w ·Ù¹ð¤òÍÞÀ©¤¹¤ë\n" + +#~ msgid " -W Enable extra warnings\n" +#~ msgstr " -W ÆÃÊ̤ʷٹð¤òÍ­¸ú¤Ë¤¹¤ë\n" + +#~ msgid " -Wunused Enable unused warnings\n" +#~ msgstr " -Wunused ̤»ÈÍѤˤĤ¤¤Æ¤Î·Ù¹ð¤òÍ­¸ú¤Ë¤¹¤ë\n" + +#~ msgid " -Wid-clash- Warn if 2 identifiers have the same first chars\n" +#~ msgstr " -Wid-clash- Æó¤Ä¤Î¼±Ê̻Ҥ¬ ʸ»úʬ°ìÃפ·¤Æ¤¤¤ì¤Ð·Ù¹ð¤¹¤ë\n" + +#~ msgid " -Wlarger-than- Warn if an object is larger than bytes\n" +#~ msgstr " -Wlarger-than- ¥ª¥Ö¥¸¥§¥¯¥È¤¬ ¥Ð¥¤¥È¤è¤êÂ礭¤±¤ì¤Ð·Ù¹ð¤¹¤ë\n" + +#~ msgid " -p Enable function profiling\n" +#~ msgstr " -p ´Ø¿ô¥×¥í¥Õ¥¡¥¤¥ë¤òÍ­¸ú¤Ë¤¹¤ë\n" + +#~ msgid " -a Enable block profiling \n" +#~ msgstr " -a ¥Ö¥í¥Ã¥¯¥×¥í¥Õ¥¡¥¤¥ë¤òÍ­¸ú¤Ë¤¹¤ë\n" + +#~ msgid " -ax Enable jump profiling \n" +#~ msgstr " -ax ¥¸¥ã¥ó¥×¥×¥í¥Õ¥¡¥¤¥ë¤òÍ­¸ú¤Ë¤¹¤ë\n" + +#~ msgid " -o Place output into \n" +#~ msgstr " -o ½ÐÎϤò ¤Ë½ñ¤­¹þ¤à\n" + +#~ msgid "" +#~ " -G Put global and static data smaller than \n" +#~ " bytes into a special section (on some targets)\n" +#~ msgstr "" +#~ " -G ¥Ð¥¤¥È¤è¤ê¾®¤µ¤ÊÂç°è¤ª¤è¤ÓÀÅŪ¥Ç¡¼¥¿¤ò\n" +#~ " ÆÃÊ̤ʥ»¥¯¥·¥ç¥ó¤ËÃÖ¤¯ (¥¿¡¼¥²¥Ã¥È¼¡Âè)\n" + +#~ msgid " -aux-info Emit declaration info into \n" +#~ msgstr " -aux-info Àë¸À¾ðÊó¤ò ¤Øȯ¹Ô¤¹¤ë\n" + +#~ msgid " -quiet Do not display functions compiled or elapsed time\n" +#~ msgstr " -quiet ¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿´Ø¿ô¤ä·Ð²á»þ´Ö¤òɽ¼¨¤·¤Ê¤¤\n" + +#~ msgid " -version Display the compiler's version\n" +#~ msgstr " -version ¥³¥ó¥Ñ¥¤¥é¤Î¥Ð¡¼¥¸¥ç¥ó¤òɽ¼¨¤¹¤ë\n" + +#~ msgid " -d[letters] Enable dumps from specific passes of the compiler\n" +#~ msgstr " -d[letters] ¥³¥ó¥Ñ¥¤¥é¤Î²áÄø¤«¤é¤Î¥À¥ó¥×¤òÍ­¸ú¤Ë¤¹¤ë\n" + +#~ msgid " -dumpbase Base name to be used for dumps from specific passes\n" +#~ msgstr " -dumpbase ²áÄø¤«¤é¤Î¥À¥ó¥×¤Ë»È¤ï¤ì¤ë̾Á°¤Î¥Ù¡¼¥¹¤È¤¹¤ë\n" + +#~ msgid " -fsched-verbose= Set the verbosity level of the scheduler\n" +#~ msgstr " -fsched-verbose= ¥¹¥±¥¸¥å¡¼¥é¤ÎñÁÀå¥ì¥Ù¥ë¤òÀßÄꤹ¤ë\n" + +#~ msgid " --help Display this information\n" +#~ msgstr " --help ¤³¤Î¾ðÊó¤òɽ¼¨¤¹¤ë\n" + +#~ msgid "" +#~ "\n" +#~ "Language specific options:\n" +#~ msgstr "" +#~ "\n" +#~ "¸À¸ì»ÅÍÍ¥ª¥×¥·¥ç¥ó:\n" + +#~ msgid " %-23.23s [undocumented]\n" +#~ msgstr " %-23.23s [ʸ½ñ²½¤µ¤ì¤Æ¤¤¤Ê¤¤]\n" + +#~ msgid "" +#~ "\n" +#~ "There are undocumented %s specific options as well.\n" +#~ msgstr "" +#~ "\n" +#~ "ʸ½ñ²½¤µ¤ì¤Æ¤¤¤Ê¤¤ %s »ÅÍÍ¥ª¥×¥·¥ç¥ó¤â¤¢¤ê¤Þ¤¹¡£\n" + +#~ msgid "" +#~ "\n" +#~ " Options for %s:\n" +#~ msgstr "" +#~ "\n" +#~ " %s ÍÑ¥ª¥×¥·¥ç¥ó:\n" + +#~ msgid "" +#~ "\n" +#~ "Target specific options:\n" +#~ msgstr "" +#~ "\n" +#~ "¥¿¡¼¥²¥Ã¥È»ÅÍÍ¥ª¥×¥·¥ç¥ó:\n" + +#~ msgid " -m%-23.23s [undocumented]\n" +#~ msgstr " -m%-23.23s [ʸ½ñ²½¤µ¤ì¤Æ¤¤¤Ê¤¤]\n" + +#~ msgid "" +#~ "\n" +#~ "There are undocumented target specific options as well.\n" +#~ msgstr "" +#~ "\n" +#~ "ʸ½ñ²½¤µ¤ì¤Æ¤¤¤Ê¤¤¥¿¡¼¥²¥Ã¥È»ÅÍÍ¥ª¥×¥·¥ç¥ó¤â¤¢¤ê¤Þ¤¹¡£\n" + +#~ msgid " They exist, but they are not documented.\n" +#~ msgstr " ¤³¤ì¤é¤Ï¸ºß¤·¤Þ¤¹¤¬¡¢Ê¸½ñ²½¤µ¤ì¤Æ¤¤¤Þ¤»¤ó\n" + +#~ msgid "unrecognized gcc debugging option: %c" +#~ msgstr "ǧ¼±¤Ç¤­¤Ê¤¤ gcc ¥Ç¥Ð¥Ã¥°¥ª¥×¥·¥ç¥ó: %c" + +#~ msgid "unrecognized register name `%s'" +#~ msgstr "ǧ¼±¤Ç¤­¤Ê¤¤¥ì¥¸¥¹¥¿Ì¾ `%s'" + +#~ msgid "Unrecognized option `%s'" +#~ msgstr "ǧ¼±ÉÔǽ¤Ê¥ª¥×¥·¥ç¥ó `%s'" + +#~ msgid "use -gdwarf -g%d for DWARF v1, level %d" +#~ msgstr "-gdwarf -g%d ¤ò»ÈÍÑ (DWARF v1, ¥ì¥Ù¥ë %d)" + +#~ msgid "use -gdwarf-2 for DWARF v2" +#~ msgstr "-gdwarf-2 ¤ò»ÈÍÑ (DWARF v2)" + +#~ msgid "ignoring option `%s' due to invalid debug level specification" +#~ msgstr "̵¸ú¤Ê¥Ç¥Ð¥Ã¥°¥ì¥Ù¥ë»ØÄê¤Ë¤è¤ê¡¢¥ª¥×¥·¥ç¥ó `%s' ¤ò̵»ë¤·¤Þ¤¹" + +#~ msgid "`%s': unknown or unsupported -g option" +#~ msgstr "`%s': ÉÔÌÀ¤Þ¤¿¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Ê¤¤ -g ¥ª¥×¥·¥ç¥ó¤Ç¤¹" + +#~ msgid "`%s' ignored, conflicts with `-g%s'" +#~ msgstr "`%s' ¤Ï `-g%s' ¤È¶¥¹ç¤¹¤ë¤¿¤á̵»ë¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "-param option missing argument" +#~ msgstr "-param ¥ª¥×¥·¥ç¥ó¤Ë°ú¿ô¤¬¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "invalid --param option: %s" +#~ msgstr "̵¸ú¤Ê --param ¥ª¥×¥·¥ç¥ó: %s" + +#~ msgid "invalid parameter value `%s'" +#~ msgstr "̵¸ú¤Ê¥Ñ¥é¥á¥¿ÃÍ `%s'" + +#~ msgid "`-a' option (basic block profile) not supported" +#~ msgstr "`-a' ¥ª¥×¥·¥ç¥ó(´ðËÜ¥Ö¥í¥Ã¥¯¥×¥í¥Õ¥¡¥¤¥ë)¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "`-ax' option (jump profiling) not supported" +#~ msgstr "`-ax' ¥ª¥×¥·¥ç¥ó(¥¸¥ã¥ó¥×¥×¥í¥Õ¥¡¥¤¥ë)¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "Ignoring command line option '%s'" +#~ msgstr "¥³¥Þ¥ó¥É¥é¥¤¥ó¥ª¥×¥·¥ç¥ó '%s' ¤ò̵»ë¤·¤Þ¤¹" + +#~ msgid "(It is valid for %s but not the selected language)" +#~ msgstr "(%s ÍѤȤ·¤Æ¤ÏÀµ¾ï¤Ç¤¹¤¬¡¢ÁªÂò¤µ¤ì¤¿¸À¸ì¤È¤·¤Æ¤Ï̵¸ú¤Ç¤¹)" + +#~ msgid "-Wuninitialized is not supported without -O" +#~ msgstr "-Wuninitialized ¤Ï -O ̵¤·¤Ë¤Ï¼õ¤±Æþ¤ì¤é¤ì¤Þ¤»¤ó" + +#~ msgid "`-ax' and `-a' are conflicting options. `-a' ignored." +#~ msgstr "`-ax' ¤È `-a' ¤ÏÌ·½â¤¹¤ë¥ª¥×¥·¥ç¥ó¤Ç¤¹¡£`-a' ¤ò̵»ë¤·¤Þ¤·¤¿¡£" + +#~ msgid "instruction scheduling not supported on this target machine" +#~ msgstr "Ì¿Î᥹¥±¥¸¥å¡¼¥ê¥ó¥°¤Ï¤³¤Î¥¿¡¼¥²¥Ã¥È¥Þ¥·¥ó¤Ç¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤»¤ó" + +#~ msgid "this target machine does not have delayed branches" +#~ msgstr "¤³¤Î¥¿¡¼¥²¥Ã¥È¥Þ¥·¥ó¤ÏÃÙ±äʬ´ô¤ò»ý¤Ã¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "profiling does not work without a frame pointer" +#~ msgstr "¥×¥í¥Õ¥¡¥¤¥ë¤Ï¥Õ¥ì¡¼¥à¥Ý¥¤¥ó¥¿¤Ê¤·¤Ç¤ÏÆ°ºî¤·¤Þ¤»¤ó" + +#~ msgid "-f%sleading-underscore not supported on this target machine" +#~ msgstr "-f%sleading-underscore ¤Ï¤³¤Î¥¿¡¼¥²¥Ã¥È¥Þ¥·¥ó¤Ç¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤»¤ó" + +#~ msgid "Data size %ld.\n" +#~ msgstr "¥Ç¡¼¥¿¥µ¥¤¥º %ld.\n" + +#~ msgid "" +#~ "%s%s%s version %s (%s)\n" +#~ "%s\tcompiled by GNU C version %s.\n" +#~ "%s%s%s version %s (%s) compiled by CC.\n" +#~ msgstr "" +#~ "%s%s%s version %s (%s)\n" +#~ "%s\tcompiled by GNU C version %s.\n" +#~ "%s%s%s version %s (%s) compiled by CC.\n" + +#~ msgid "options passed: " +#~ msgstr "ÅϤµ¤ì¤¿¥ª¥×¥·¥ç¥ó: " + +#~ msgid "options enabled: " +#~ msgstr "Í­¸ú¥ª¥×¥·¥ç¥ó: " + +#~ msgid "floating point numbers not allowed in #if expressions" +#~ msgstr "#if ¼°¤ÎÃæ¤Ç¤ÎÉâÆ°¾®¿ôÅÀ¿ô¤Ïµö²Ä¤µ¤ì¤Þ¤»¤ó" + +#~ msgid "Invalid number in #if expression" +#~ msgstr "#if ¼°¤ÎÃæ¤Ë̵¸ú¤Ê¿ôÃÍ" + +#~ msgid "Invalid character constant in #if" +#~ msgstr "̵¸ú¤Êʸ»úÄê¿ô¤¬ #if ¤Ë¤¢¤ê¤Þ¤¹" + +#~ msgid "double quoted strings not allowed in #if expressions" +#~ msgstr "Æó½Å¤Ë¥¯¥©¡¼¥È¤µ¤ì¤¿Ê¸»úÎó¤Ï #if ¼°Æâ¤Ç¤Ï»È¤¨¤Þ¤»¤ó" + +#~ msgid "Invalid token in expression" +#~ msgstr "̵¸ú¤Ê¥È¡¼¥¯¥ó¤¬¼°¤Ë¤¢¤ê¤Þ¤¹" + +#~ msgid "octal character constant does not fit in a byte" +#~ msgstr "8 ¿Ê¿ôʸ»úÄê¿ô¤¬ 1 ¥Ð¥¤¥È¤Ë¼ý¤Þ¤ê¤Þ¤»¤ó" + +#~ msgid "hex character constant does not fit in a byte" +#~ msgstr "16 ¿Ê¿ôʸ»úÄê¿ô¤¬ 1 ¥Ð¥¤¥È¤Ë¼ý¤Þ¤ê¤Þ¤»¤ó" + +#~ msgid "empty #if expression" +#~ msgstr "¶õ¤Î #if ¼°¤Ç¤¹" + +#~ msgid "Junk after end of expression." +#~ msgstr "¼°¤Î½ª¤ê°Ê¹ß¤Ë¥´¥ß¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "macro or #include recursion too deep" +#~ msgstr "¥Þ¥¯¥í¤Þ¤¿¤Ï #include ¤ÎºÆµ¢¤¬¿¼¤¹¤®¤Þ¤¹" + +#~ msgid "Usage: %s [switches] input output" +#~ msgstr "»È¤¤Êý: %s [¥¹¥¤¥Ã¥Á] ÆþÎÏ ½ÐÎÏ" + +#~ msgid "-traditional is not supported in C++" +#~ msgstr "-traditional ¤Ï C++ ¤Ç¤Ï¼õ¤±ÉÕ¤±¤é¤ì¤Þ¤»¤ó" + +#~ msgid "-traditional and -ansi are mutually exclusive" +#~ msgstr "-traditional ¤È -ansi ¤È¤ÏÁê¸ßÇÓ¾Ū¤Ç¤¹" + +#~ msgid "Filename missing after -i option" +#~ msgstr "-i ¥ª¥×¥·¥ç¥ó¤Î¸å¤í¤Î¥Õ¥¡¥¤¥ë̾¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "Filename missing after -o option" +#~ msgstr "-o ¥ª¥×¥·¥ç¥ó¤Î¸å¤í¤Î¥Õ¥¡¥¤¥ë̾¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "Target missing after %s option" +#~ msgstr "%s ¥ª¥×¥·¥ç¥ó¤Î¸å¤í¤Î¥¿¡¼¥²¥Ã¥È¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "Filename missing after %s option" +#~ msgstr "%s ¥ª¥×¥·¥ç¥ó¤Î¸å¤í¤Î¥Õ¥¡¥¤¥ë̾¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "Macro name missing after -%c option" +#~ msgstr "-%c ¥ª¥×¥·¥ç¥ó¤Î¸å¤í¤Î¥Þ¥¯¥í̾¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "-pedantic and -traditional are mutually exclusive" +#~ msgstr "-pedantic ¤È -traditional ¤È¤ÏÁê¸ßÇÓ¾Ū¤Ç¤¹" + +#~ msgid "-trigraphs and -traditional are mutually exclusive" +#~ msgstr "-trigraphs ¤È -traditional ¤È¤ÏÁê¸ßÇÓ¾Ū¤Ç¤¹" + +#~ msgid "Directory name missing after -I option" +#~ msgstr "-I ¥ª¥×¥·¥ç¥ó¤Î¸å¤í¤Î¥Ç¥£¥ì¥¯¥È¥ê̾¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "`/*' within comment" +#~ msgstr "`/*' ¤¬¥³¥á¥ó¥ÈÆâ¤Ë¤¢¤ê¤Þ¤¹" + +#~ msgid "unterminated #%s conditional" +#~ msgstr "½ªÃ¼¤Î¤Ê¤¤ #%s ¾ò·ï" + +#~ msgid "not in any file?!" +#~ msgstr "Á´¤¯¥Õ¥¡¥¤¥ë¤¬¤Ê¤¤?!" + +#~ msgid "`defined' must be followed by ident or (ident)" +#~ msgstr "`defined' ¤Î¸å¤í¤Ë ident ¤ä (ident) ¤¬¤³¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó" + +#~ msgid "cccp error: invalid special hash type" +#~ msgstr "cccp ¥¨¥é¡¼: Æüì¥Ï¥Ã¥·¥å·¿¤¬Ìµ¸ú¤Ç¤¹" + +#~ msgid "#include expects \"fname\" or " +#~ msgstr "#include ¤Î¸å¤Ë¤Ï \"fname\" ¤ä ¤¬É¬ÍפǤ¹" + +#~ msgid "No include path in which to find %.*s" +#~ msgstr "%.*s ¤¬¸«¤Ä¤«¤ë¥¤¥ó¥¯¥ë¡¼¥É¥Ñ¥¹¤¬¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "invalid macro name" +#~ msgstr "̵¸ú¤Ê¥Þ¥¯¥í̾" + +#~ msgid "invalid macro name `%s'" +#~ msgstr "̵¸ú¤Ê¥Þ¥¯¥í̾ `%s'" + +#~ msgid "parameter name starts with a digit in #define" +#~ msgstr "#define Ãæ¤Î²¾°ú¿ô̾¤¬¿ô»ú¤Ç»Ï¤Þ¤Ã¤Æ¤¤¤Þ¤¹" + +#~ msgid "badly punctuated parameter list in #define" +#~ msgstr "#define Ãæ¤Î²¾°ú¿ô¥ê¥¹¥È¤¬ÊѤ˶èÀÚ¤é¤ì¤Þ¤·¤¿" + +#~ msgid "unterminated parameter list in #define" +#~ msgstr "#define Ãæ¤Î²¾°ú¿ô¥ê¥¹¥È¤¬½ªÃ¼¤µ¤ì¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "\"%.*s\" redefined" +#~ msgstr "\"%.*s\" ¤¬ºÆÄêµÁ¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "# operator should be followed by a macro argument name" +#~ msgstr "# ±é»»»Ò¤Î¸å¤í¤Ë¤Ï¥Þ¥¯¥í°ú¿ô̾¤¬Â³¤¤¤Æ¤¤¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó" + +#~ msgid "invalid format #line command" +#~ msgstr "#line ¥³¥Þ¥ó¥É¤Î½ñ¼°¤¬Ìµ¸ú¤Ç¤¹" + +#~ msgid "undefining `defined'" +#~ msgstr "`defined' ¤ò undef ¤·¤Þ¤¹" + +#~ msgid "undefining `%s'" +#~ msgstr "`%s' ¤ò undef ¤·¤Þ¤¹" + +#~ msgid "extra text at end of directive" +#~ msgstr "¥Ç¥£¥ì¥¯¥Æ¥£¥Ö¤Î½ª¤ê¤Ë;ʬ¤Ê¥Æ¥¯¥¹¥È¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "#error%.*s" +#~ msgstr "#error%.*s" + +#~ msgid "#warning%.*s" +#~ msgstr "#warning%.*s" + +#~ msgid "#elif not within a conditional" +#~ msgstr "#elif ¤¬¾ò·ïʸ¤ÎÃæ¤Ë¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "#%s not within a conditional" +#~ msgstr "#%s ¤¬¾ò·ïʸ¤ÎÃæ¤Ë¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "#else or #elif after #else" +#~ msgstr "#else ¤Î¸å¤í¤Ë #else ¤ä #elif ¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "#else not within a conditional" +#~ msgstr "#else ¤¬¾ò·ïʸ¤ÎÃæ¤Ë¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "unterminated string or character constant" +#~ msgstr "½ªÃ¼¤µ¤ì¤Æ¤¤¤Ê¤¤Ê¸»úÎóÄê¿ôËô¤Ïʸ»úÄê¿ô" + +#~ msgid "arguments given to macro `%s'" +#~ msgstr "¥Þ¥¯¥í `%s' ¤Ë°ú¿ô¤¬Í¿¤¨¤é¤ì¤Þ¤·¤¿" + +#~ msgid "no args to macro `%s'" +#~ msgstr "¥Þ¥¯¥í `%s' ¤Ø¤Î°ú¿ô¤¬¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "only 1 arg to macro `%s'" +#~ msgstr "¥Þ¥¯¥í `%s' ¤Ø¤Î°ú¿ô¤¬°ì¸Ä¤·¤«¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "only %d args to macro `%s'" +#~ msgstr "%d ¸Ä¤Î°ú¿ô¤·¤«¥Þ¥¯¥í `%s' ¤ËÅϤ·¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "too many (%d) args to macro `%s'" +#~ msgstr "°ú¿ô¤Î¿ô (%d) ¤¬¥Þ¥¯¥í `%s' ¤ËÂФ·¤Æ¿¤¹¤®¤Þ¤¹" + +#~ msgid "" +#~ "Internal error in %s, at tradcpp.c:%d\n" +#~ "Please submit a full bug report.\n" +#~ "See %s for instructions." +#~ msgstr "" +#~ "%s ¤ÇÆâÉô¥¨¥é¡¼¡¢(tradcpp.c:%d)\n" +#~ "´°Á´¤Ê¥Ð¥°¥ì¥Ý¡¼¥È¤òÁ÷¤Ã¤Æ¤¯¤À¤µ¤¤¡£\n" +#~ "%s ¤Ç¤½¤Î¼ê½ç¤ò¸«¤Æ¤¯¤À¤µ¤¤" + +#~ msgid "arrays of functions are not meaningful" +#~ msgstr "´Ø¿ô¤ÎÇÛÎó¤Ï°ÕÌ£¤¬¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "function return type cannot be function" +#~ msgstr "´Ø¿ô¤ÎÊÖ¤¹·¿¤¬´Ø¿ô¤Ç¤¢¤Ã¤Æ¤Ï¤Ê¤ê¤Þ¤»¤ó" + +#~ msgid "invalid initializer for bit string" +#~ msgstr "̵¸ú¤Ê¥Ó¥Ã¥ÈÎó½é´ü²½»Ò¤Ç¤¹" + +#~ msgid "Tree check: expected %s, have %s in %s, at %s:%d" +#~ msgstr "Tree ¸¡ºº: %s ¤¬¤¢¤ë¤Ù¤­½ê¤Ë %s ¤¬¤¢¤ê¤Þ¤¹(%s Æâ, %s:%d)" + +#~ msgid "Tree check: expected class '%c', have '%c' (%s) in %s, at %s:%d" +#~ msgstr "Tree ¸¡ºº: ¥¯¥é¥¹ '%c' ¤Î¤Ï¤º¤¬ '%c' (%s) ¤Ç¤¹(%s Æâ, %s:%d)" + +#~ msgid "register name not specified for `%s'" +#~ msgstr "¥ì¥¸¥¹¥¿Ì¾¤¬ `%s' ÍѤ˻ØÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "invalid register name for `%s'" +#~ msgstr "`%s' ¤ËÂФ¹¤ë¥ì¥¸¥¹¥¿Ì¾¤È¤·¤Æ̵¸ú¤Ç¤¹" + +#~ msgid "data type of `%s' isn't suitable for a register" +#~ msgstr "`%s' ¤Î¥Ç¡¼¥¿·¿¤Ï register ¤Ë¤Ï¤Õ¤µ¤ï¤·¤¯¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "register specified for `%s' isn't suitable for data type" +#~ msgstr "`%s' ¤Ë»ØÄꤵ¤ì¤¿ register ¤Ï¥Ç¡¼¥¿·¿¤Ë¤Õ¤µ¤ï¤·¤¯¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "global register variable has initial value" +#~ msgstr "Âç°è register ÊÑ¿ô¤¬½é´üÃͤò»ý¤Ã¤Æ¤¤¤Þ¤¹" + +#~ msgid "volatile register variables don't work as you might wish" +#~ msgstr "volatile register ÊÑ¿ô¤Ï°Õ¿Þ¤·¤¿¤è¤¦¤Ë¤ÏÆ°ºî¤·¤Þ¤»¤ó" + +#~ msgid "register name given for non-register variable `%s'" +#~ msgstr "¥ì¥¸¥¹¥¿Ì¾¤¬Èó register ÊÑ¿ô `%s' ¤ËÍ¿¤¨¤é¤ì¤Þ¤·¤¿" + +#~ msgid "size of variable `%s' is too large" +#~ msgstr "ÊÑ¿ô `%s' ¤Î¥µ¥¤¥º¤¬Â礭¤¹¤®¤Þ¤¹" + +#~ msgid "alignment of `%s' is greater than maximum object file alignment. Using %d." +#~ msgstr "`%s' ¤Î¥¢¥é¥¤¥ó¥á¥ó¥È¤Ï¥ª¥Ö¥¸¥§¥¯¥È¥Õ¥¡¥¤¥ë¤ÎºÇÂçÃͤè¤ê¤âÂ礭¤¤¤Ç¤¹¡£ %d ¤ò»È¤¤¤Þ¤¹¡£" + +#~ msgid "requested alignment for %s is greater than implemented alignment of %d." +#~ msgstr "%s ¤ËÍ׵ᤵ¤ì¤¿¥¢¥é¥¤¥ó¥á¥ó¥È¤Ï¼ÂÁõ¤µ¤ì¤¿¥¢¥é¥¤¥ó¥á¥ó¥È %d ¤è¤êÂ礭¤¤¤Ç¤¹" + +#~ msgid "floating point trap outputting a constant" +#~ msgstr "ÉâÆ°¾®¿ôÅÀ¤Î¨Ãͤò½ÐÎϤ¹¤ëºÝ¤Ë¥È¥é¥Ã¥×¤¬¤«¤«¤ê¤Þ¤·¤¿" + +#~ msgid "initializer for integer value is too complicated" +#~ msgstr "À°¿ô¤Î½é´üÀßÄê»Ò¤ÎÃͤ¬Ê£»¨¤¹¤®¤Þ¤¹" + +#~ msgid "initializer for floating value is not a floating constant" +#~ msgstr "ÉâÆ°¾®¿ôÅÀ¿ô¤Î½é´üÀßÄê»Ò¤ÎÃͤ¬¡¢ÉâÆ°¾®¿ôÅÀÄê¿ô¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "unknown set constructor type" +#~ msgstr "ÉÔÌÀ¤ÊÀßÄêºÑ¥³¥ó¥¹¥È¥é¥¯¥¿·¿¤Ç¤¹" + +#~ msgid "invalid initial value for member `%s'" +#~ msgstr "¥á¥ó¥Ð `%s' ¤ËÂФ¹¤ë̵¸ú¤Ê½é´üÃÍ" + +#~ msgid "weak declaration of `%s' must be public" +#~ msgstr "`%s' ¤Î weak Àë¸À¤Ï public ¤Ç¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó" + +#~ msgid "weak declaration of `%s' must precede definition" +#~ msgstr "`%s' ¤Î weak Àë¸À¤ÏÄêµÁ¤è¤ê¤âÀè¤Ë¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó" + +#~ msgid "only weak aliases are supported in this configuration" +#~ msgstr "¸½ºß¤ÎÀßÄê¤Ç¤Ï weak alias ¤·¤«¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤»¤ó" + +#~ msgid "alias definitions not supported in this configuration; ignored" +#~ msgstr "¸½ºß¤ÎÀßÄê¤Ç¤Ï alias ÄêµÁ¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤»¤ó -- ̵»ë¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "Virtual array %s[%lu]: element %lu out of bounds" +#~ msgstr "²¾Áۥơ¼¥Ö¥ë %s[%lu]: Í×ÁÇ %lu ¤¬Èϰϳ°¤Ç¤¹" + +#~ msgid "No sclass for %s stab (0x%x)\n" +#~ msgstr "%s ¥¹¥¿¥ÖÍѤΠsclass ¤¬¤¢¤ê¤Þ¤»¤ó (0x%x)\n" + +#~ msgid "`-p' not supported; use `-pg' and gprof(1)" +#~ msgstr "`-p' ¤Ï¼ÂÁõ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó. `-pg' ¤È gprof(1) ¤ò»È¤Ã¤Æ¤¯¤À¤µ¤¤" + +#~ msgid "may not use both -EB and -EL" +#~ msgstr "-EB ¤È -EL ¤ÎξÊý¤ò»È¤¦¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "-mapcs-26 and -mapcs-32 may not be used together" +#~ msgstr "-mapcs-26 ¤È -mapcs-32 ¤ÏƱ»þ¤Ë»È¤¨¤Þ¤»¤ó" + +#~ msgid "-msoft-float and -mhard_float may not be used together" +#~ msgstr "-msoft-float ¤È -mhard_float ¤ÏƱ»þ¤Ë»È¤¨¤Þ¤»¤ó" + +#~ msgid "-mbig-endian and -mlittle-endian may not be used together" +#~ msgstr "-mbig-endian ¤È -mlittle-endian ¤ÏƱ»þ¤Ë»È¤¨¤Þ¤»¤ó" + +#~ msgid "Incompatible interworking options" +#~ msgstr "¸ß´¹À­¤Î¤Ê¤¤ interworking ¥ª¥×¥·¥ç¥ó" + +#~ msgid "-mbsd and -pedantic incompatible" +#~ msgstr "-mbsd ¤È -pedantic ¤Ï¶¦Â¸¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "-mbsd and -mxopen incompatible" +#~ msgstr "-mbsd ¤È -mxopen ¤Ï¶¦Â¸¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "-mxopen and -pedantic incompatible" +#~ msgstr "-mxopen ¤È -pedantic ¤Ï¶¦Â¸¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "A -ifile option requires a -map option" +#~ msgstr "-ifile ¥ª¥×¥·¥ç¥ó¤Ë¤Ï -map ¥ª¥×¥·¥ç¥ó¤¬É¬ÍפǤ¹" + +#~ msgid "mno-cygwin and mno-win32 are not compatible" +#~ msgstr "mno-cygwin ¤È mno-win32 ¤Ï¶¦Â¸¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "shared and mdll are not compatible" +#~ msgstr "shared ¤È mdll ¤È¤Ï¶¦Â¸¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "-static not valid with -mcoff" +#~ msgstr "-static ¤¬ -mcoff ¤È¤È¤â¤Ë»È¤ï¤ì¤ë¤Î¤ÏÀµ¤·¤¯¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "-shared not valid with -mcoff" +#~ msgstr "-shared ¤¬ -mcoff ¤È¤È¤â¤Ë»È¤ï¤ì¤ë¤Î¤ÏÀµ¤·¤¯¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "-symbolic not valid with -mcoff" +#~ msgstr "-symbolic ¤¬ -mcoff ¤È¤È¤â¤Ë»È¤ï¤ì¤ë¤Î¤ÏÀµ¤·¤¯¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "-fpic is not valid with -mcoff" +#~ msgstr "-fpic ¤¬ -mcoff ¤È¤È¤â¤Ë»È¤ï¤ì¤ë¤Î¤ÏÀµ¤·¤¯¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "-fPIC is not valid with -mcoff" +#~ msgstr "-fPIC ¤¬ -mcoff ¤È¤È¤â¤Ë»È¤ï¤ì¤ë¤Î¤ÏÀµ¤·¤¯¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "-fpic not valid with -mcoff" +#~ msgstr "-fpic -mcoff ¤È¤È¤â¤Ë»È¤ï¤ì¤ë¤Î¤ÏÀµ¤·¤¯¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "-fPIC not valid with -mcoff" +#~ msgstr "-fPIC ¤¬ -mcoff ¤È¤È¤â¤Ë»È¤ï¤ì¤ë¤Î¤ÏÀµ¤·¤¯¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "bx]" +#~ msgstr "bx]" + +#~ msgid "bx" +#~ msgstr "bx" + +#~ msgid "cx" +#~ msgstr "cx" + +#~ msgid "-p option not supported: use -pg instead" +#~ msgstr "-p ¥ª¥×¥·¥ç¥ó¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó. Âå¤ï¤ê¤Ë -pg ¤ò»È¤Ã¤Æ¤¯¤À¤µ¤¤" + +#~ msgid "choose either big or little endian, not both" +#~ msgstr "¥Ó¥Ã¥°¤Þ¤¿¤Ï¥ê¥È¥ë¥¨¥ó¥Ç¥£¥¢¥óξÊý¤Ç¤Ï¤Ê¤¯¡¢¤É¤Á¤é¤«¤òÁª¤ó¤Ç¤¯¤À¤µ¤¤" + +#~ msgid "choose either m340 or m210 not both" +#~ msgstr "m340 ¤Þ¤¿¤Ï m210 ¤ÎξÊý¤Ç¤Ï¤Ê¤¯¡¢¤É¤Á¤é¤«¤òÁª¤ó¤Ç¤¯¤À¤µ¤¤" + +#~ msgid "the m210 does not have little endian support" +#~ msgstr "m210 ¤Ï¥ê¥È¥ë¥¨¥ó¥Ç¥£¥¢¥ó¥µ¥Ý¡¼¥È¤ò¹Ô¤Ê¤¨¤Þ¤»¤ó" + +#~ msgid "-pipe is not supported." +#~ msgstr "-pipe ¤Ï¼ÂÁõ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "may not use both -mfp64 and -msingle-float" +#~ msgstr "-mfp64 ¤È -msingle-float ¤ÎξÊý¤ò»È¤¦¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "may not use both -mfp64 and -m4650" +#~ msgstr "-mfp64 ¤È -m4650 ¤ÎξÊý¤ò»È¤¦¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "-mhard-float not supported." +#~ msgstr "-mhard-float ¤Ï¼ÂÁõ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó." + +#~ msgid "-msingle-float and -msoft-float can not both be specified." +#~ msgstr "-msingle-float ¤È -msoft-float ¤ò°ìÅ٤˻ØÄꤹ¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£" + +#~ msgid "-p profiling is no longer supported. Use -pg instead." +#~ msgstr "-p ¤Ç¤Î¥×¥í¥Õ¥¡¥¤¥ë¤Ï¤â¤¦Ä󶡤µ¤ì¤Þ¤»¤ó¡£Âå¤ï¤ê¤Ë -pg ¤ò»È¤¤¤Þ¤·¤ç¤¦¡£" + +#~ msgid "profiling not supported with -mg\n" +#~ msgstr "-mg ¤Ç¤Î¥×¥í¥Õ¥¡¥¤¥ë¤ÏÄ󶡤µ¤ì¤Þ¤»¤ó\n" + +#~ msgid "GNU C does not support -C without using -E" +#~ msgstr "GNU C ¤Ï -E ¤òȼ¤ï¤Ê¤¤ -C ¤ò¼ÂÁõ¤·¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "-pg and -fomit-frame-pointer are incompatible" +#~ msgstr "-pg ¤È -fomit-frame-pointer ¤Ï¶¦Â¸¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "-E required when input is from standard input" +#~ msgstr "ÆþÎϤ¬É¸½àÆþÎϤξì¹ç¤Ï -E ¤¬É¬ÍפǤ¹" + +#~ msgid "Compilation of header file requested" +#~ msgstr "¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë¤Î¥³¥ó¥Ñ¥¤¥ë¤¬Í׵ᤵ¤ì¤Þ¤·¤¿" + +#~ msgid "-fjni and -femit-class-files are incompatible" +#~ msgstr "-fjni ¤È -femit-class-files ¤Ï¶¦Â¸¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "-fjni and -femit-class-file are incompatible" +#~ msgstr "-fjini ¤È -femit-class-file ¤Ï¶¦Â¸¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "iterator `%s' has derived type" +#~ msgstr "È¿Éü»Ò `%s' ¤ÏÇÉÀ¸·¿¤Ç¤¹" + +#~ msgid "%s before character constant" +#~ msgstr "ʸ»úÄê¿ô¤ÎÁ°¤Ë %s" + +#~ msgid "%s before character 0%o" +#~ msgstr "ʸ»ú 0%2$o ¤ÎÁ°¤Ë %1$s" + +#~ msgid "more than one `f' in numeric constant" +#~ msgstr "¿ôÄê¿ô¤Ë 1¤Ä°Ê¾å¤Î `f'" + +#~ msgid "more than one `l' in numeric constant" +#~ msgstr "¿ôÄê¿ô¤Ë 1¤Ä°Ê¾å¤Î `l'" + +#~ msgid "invalid identifier `%s'" +#~ msgstr "̵¸ú¤Ê¼±ÊÌ»Ò `%s'" + +#~ msgid "parse error at `..'" +#~ msgstr "`..' ¤Ç¹½Ê¸²òÀÏ¥¨¥é¡¼" + +#~ msgid "nondigits in number and not hexadecimal" +#~ msgstr "¿ôÃͤ˥¢¥é¥Ó¥¢¿ô»ú¤Ç¤Ê¤¯¡¢16 ¿Ê¤Ç¤â¤Ê¤¤Ê¸»ú" + +#~ msgid "numeric constant contains digits beyond the radix" +#~ msgstr "¿ôÃÍÄê¿ô¤¬´ð¿ô¤òĶ¤¨¤¿¥¢¥é¥Ó¥¢¿ô»ú¤ò´Þ¤ó¤Ç¤¤¤Þ¤¹" + +#~ msgid "two `u's in integer constant" +#~ msgstr "À°¿ôÄê¿ôÃæ¤Ë 2¤Ä¤Î `u'" + +#~ msgid "Unterminated string constant" +#~ msgstr "ʸ»úÎóÄê¿ô¤¬½ªÎ»¤·¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "syntax error: cannot back up" +#~ msgstr "ʸˡ¥¨¥é¡¼: ÄÉ¿ï¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "parser stack overflow" +#~ msgstr "¹½Ê¸²òÀÏ´ï¤Î¥¹¥¿¥Ã¥¯¤¬°î¤ì¤Þ¤·¤¿" + +#~ msgid "invalid `for (ITERATOR)' syntax" +#~ msgstr "̵¸ú¤Ê `for (È¿Éü»Ò)' ¹½Ê¸¤Ç¤¹" + +#~ msgid "`for (%s)' inside expansion of same iterator" +#~ msgstr "Ʊ¤¸È¿Éü»Ò¤ÎÆ⦤ˤ¢¤ë `for (%s)'" + +#~ msgid "case label within scope of cleanup or variable array" +#~ msgstr "case ¥é¥Ù¥ë¤¬¡¢²òÂΤޤ¿¤Ï²ÄÊÑÇÛÎó¤Î¥¹¥³¡¼¥×Æâ¤Ë¤¢¤ê¤Þ¤¹" + +#~ msgid "parse error; also virtual memory exceeded" +#~ msgstr "¹½Ê¸²òÀÏ¥¨¥é¡¼ -- ¤µ¤é¤Ë²¾ÁÛ¥á¥â¥ê¤òĶ²á¤·¤Þ¤·¤¿" + +#~ msgid "duplicate array index in initializer" +#~ msgstr "½é´ü²½»ÒÆâ¤Ë½ÅÊ£¤·¤¿ÇÛÎ󥤥ó¥Ç¥Ã¥¯¥¹" + +#~ msgid "duplicate initializer" +#~ msgstr "½ÅÊ£¤·¤¿½é´ü²½»Ò" + +#~ msgid "thumb_load_double_from_address: destination is not a register" +#~ msgstr "thumb_load_double_from_address: Âоݤ¬¥ì¥¸¥¹¥¿¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "thumb_load_double_from_address: source is not a computed memory address" +#~ msgstr "thumb_load_double_from_address: ¸µ¤¬·×»»ºÑ¤ß¥á¥â¥ê¥¢¥É¥ì¥¹¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "thumb_load_double_from_address: base is not a register" +#~ msgstr "thumb_load_double_from_address: ¥Ù¡¼¥¹¤¬¥ì¥¸¥¹¥¿¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "thumb_load_double_from_address: Unhandled address calculation" +#~ msgstr "thumb_load_double_from_address: °·¤ï¤ì¤Ê¤¤¥¢¥É¥ì¥¹·×»»" + +#~ msgid "ACCUM_HIGH_REGS class in limit_reload_class" +#~ msgstr "limit_reload_class ¤Ë ACCUM_HIGH_REGS ¥¯¥é¥¹" + +#~ msgid "YH_OR_ACCUM_HIGH_REGS found in limit_reload_class" +#~ msgstr "limit_reload_class ¤Ç YH_OR_ACCUM_HIGH_REGS ¤¬¸«¤Ä¤«¤ê¤Þ¤·¤¿" + +#~ msgid "YL found in limit_reload_class" +#~ msgstr "limit_reload_class ¤Ç YL ¤¬¸«¤Ä¤«¤ê¤Þ¤·¤¿" + +#~ msgid "Bad register extension code" +#~ msgstr "ÉÔÀµ¤Ê¥ì¥¸¥¹¥¿³ÈÄ¥¥³¡¼¥É" + +#~ msgid "Invalid offset in ybase addressing" +#~ msgstr "ybase ¥¢¥É¥ì¥·¥ó¥°¤Ë̵¸ú¤Ê¥ª¥Õ¥»¥Ã¥È" + +#~ msgid "Invalid shift operator in emit_1600_core_shift" +#~ msgstr "emit_1600_core_shift ¤Ç¤Î̵¸ú¤Ê¥·¥Õ¥È±é»»»Ò" + +#~ msgid "Invalid mode for gen_tst_reg" +#~ msgstr "gen_tst_reg ¤Ë¤È¤Ã¤Æ¤Î̵¸ú¤Ê¥â¡¼¥É" + +#~ msgid "Invalid mode for integer comparison in gen_compare_reg" +#~ msgstr "gen_compare_reg ¤Ç¤ÎÀ°¿ôÈæ³Ó¤Ë¤È¤Ã¤Æ¤Î̵¸ú¤Ê¥â¡¼¥É" + +#~ msgid "Invalid register for compare" +#~ msgstr "̵¸ú¤ÊÈæ³ÓÍѥ쥸¥¹¥¿" + +#~ msgid "PRINT_OPERAND: letter %c was found & insn was not CONST_INT" +#~ msgstr "PRINT_OPERAND: ʸ»ú %c ¤¬¸«¤Ä¤«¤ê¡¢Ì¿Îá¤Ï CONST_INT ¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "-mptr%d not allowed on -m%d" +#~ msgstr "-mptr%d ¤Ï -m%d ¤Î¾å¤Ç¤Ï»È¤¨¤Þ¤»¤ó" + +#~ msgid "parse errors have confused me too much" +#~ msgstr "¹½Ê¸²òÀÏ¥¨¥é¡¼¤Ç¡¢¤«¤Ê¤êº®Í𤷤Ƥ·¤Þ¤¤¤Þ¤·¤¿" + +#~ msgid "virtual memory exhausted" +#~ msgstr "²¾ÁÛ¥á¥â¥ê¤ò»È¤¤²Ì¤¿¤·¤Þ¤·¤¿" + +#~ msgid "destructor for alien class `%s' cannot be a member" +#~ msgstr "¾¤Î¥¯¥é¥¹ `%s' ¤Î¥Ç¥¹¥È¥é¥¯¥¿¤ò¡¢¥á¥ó¥Ð¤Ë¤Ï¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "constructor for alien class `%s' cannot be a member" +#~ msgstr "¾¤Î¥¯¥é¥¹ `%s' ¤Î¥Ç¥¹¥È¥é¥¯¥¿¤ò¡¢¥á¥ó¥Ð¤Ë¤Ï¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "trying to make class `%s' a friend of global scope" +#~ msgstr "¥¯¥é¥¹ `%s' ¤òÂç°è¥¹¥³¡¼¥×¤Î friend ¤Ë¤·¤è¤¦¤È¤·¤Æ¤¤¤Þ¤¹" + +#~ msgid "parameter invalidly declared method type" +#~ msgstr "¥Ñ¥é¥á¥¿¤Ï¥á¥½¥Ã¥É¤Î·¿¤òÉÔÀµ¤ËÀë¸À¤·¤Þ¤·¤¿" + +#~ msgid "parameter invalidly declared offset type" +#~ msgstr "¥Ñ¥é¥á¥¿¤¬¥ª¥Õ¥»¥Ã¥È¤Î·¿¤òÉÔÀµ¤ËÀë¸À¤·¤Þ¤·¤¿" + +#~ msgid "`void' in parameter list must be entire list" +#~ msgstr "¥Ñ¥é¥á¥¿¥ê¥¹¥ÈÆâ¤Î `void' ¤Ï¥ê¥¹¥ÈÁ´ÂΤǤʤ±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó" + +#~ msgid "no file specified with -fdump-translation-unit" +#~ msgstr "-fdump-translation-unit ¤Ç»ØÄꤵ¤ì¤¿¥Õ¥¡¥¤¥ë¤¬¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "(you really want to initialize it separately)" +#~ msgstr "(ËÜÅö¤Ë¤½¤¦¤·¤¿¤¤¤Î¤Ç¤¢¤ì¤Ð¡¢Ê¬³ä¤·¤Æ½é´ü²½¤·¤Æ¤¯¤À¤µ¤¤)" + +#~ msgid "`operator new' takes type `size_t' parameter" +#~ msgstr "`operator new' ¤Ï `size_t' ¥Ñ¥é¥á¥¿¤ò¤È¤ê¤Þ¤¹" + +#~ msgid "`operator new' takes type `size_t' as first parameter" +#~ msgstr "`operator new' ¤ÏÂè°ì°ú¿ô¤È¤·¤Æ `size_t' ¤ò¤È¤ê¤Þ¤¹" + +#~ msgid "`operator delete' must return type `void'" +#~ msgstr "`operator delete' ¤ÎÌá¤ê·¿¤Ï `void' ¤Ç¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó" + +#~ msgid "`operator delete' takes type `void *' as first parameter" +#~ msgstr "`operator delete' ¤ÏÂè°ì°ú¿ô¤È¤·¤Æ `void *' ·¿¤ò¤È¤ê¤Þ¤¹" + +#~ msgid "too many arguments in declaration of `operator delete'" +#~ msgstr "`operator delete' ¤ÎÀë¸ÀÆâ¤Ë¿¤¹¤®¤ë°ú¿ô" + +#~ msgid "`...' invalid in specification of `operator delete'" +#~ msgstr "`...' `operator delete' ¤Î»ÅÍÍÆâ¤Ç̵¸ú¤Ç¤¹" + +#~ msgid "`default' label within scope of cleanup or variable array" +#~ msgstr "`default' ¥é¥Ù¥ë¤¬¡¢²òÂΤޤ¿¤Ï²ÄÊÑÇÛÎó¤Î¥¹¥³¡¼¥×Æâ¤Ë¤¢¤ê¤Þ¤¹" + +#~ msgid "bad array initializer" +#~ msgstr "ÇÛÎó¤ÎÉÔÀµ¤Ê½é´ü²½" + +#~ msgid "end of file encountered inside string constant" +#~ msgstr "ʸ»úÎóÄê¿ô¤ÎÃæ¤Ç¥Õ¥¡¥¤¥ë¤Î½ªÃ¼¤ò¸¡½Ð¤·¤Þ¤·¤¿" + +#~ msgid "end of file encountered inside character constant" +#~ msgstr "ʸ»úÄê¿ô¤ÎÃæ¤Ç¥Õ¥¡¥¤¥ë¤Î½ªÃ¼¤ò¸¡½Ð¤·¤Þ¤·¤¿" + +#~ msgid "invalid #pragma vtable" +#~ msgstr "̵¸ú¤Ê #pragma vtable" + +#~ msgid "invalid `#pragma implementation'" +#~ msgstr "̵¸ú¤Ê `#pragma implementation'" + +#~ msgid "%s at end of saved text" +#~ msgstr "ÊݸºÑ¤ß¥Æ¥­¥¹¥È¤ÎËöÈø¤Ç%s" + +#~ msgid "complex integer constant is too wide for `__complex int'" +#~ msgstr "Ê£ÁÇ¿ô·¿À°¿ôÄê¿ô¤Ï `__complex int' ¤Ë¤È¤Ã¤Æ¹­¤¹¤®¤Þ¤¹" + +#~ msgid "request for member `%s' is ambiguous in multiple inheritance lattice" +#~ msgstr "Í׵ᤵ¤ì¤¿¥á¥ó¥Ð `%s' ¤Ï¿½Å·Ñ¾µ¥°¥é¥Õ¤ÎÃæ¤ÇÛ£Ëæ¤Ç¤¹" + +#~ msgid "Internal compiler error." +#~ msgstr "ÆâÉô¥³¥ó¥Ñ¥¤¥é¥¨¥é¡¼." + +#~ msgid "Please submit a full bug report." +#~ msgstr "¾Ü¤·¤¤¾õ¶·¤ò¥Ð¥°¥ì¥Ý¡¼¥È¤È¤·¤ÆÁ÷¤Ã¤Æ¤¯¤À¤µ¤¤¡£" + +#~ msgid "duplicate label `%s' in switch statement" +#~ msgstr "switch ʸ¤ÎÃæ¤Ç¥é¥Ù¥ë `%s' ¤¬½ÅÊ£¤·¤Æ¤¤¤Þ¤¹" + +#~ msgid "duplicate label (%d) in switch statement" +#~ msgstr "switch ʸ¤ÎÃæ¤Ç¥é¥Ù¥ë (%d) ¤¬½ÅÊ£¤·¤Æ¤¤¤Þ¤¹" + +#~ msgid "range values `%s' and `%s' reversed" +#~ msgstr "ÈϰϤÎÃÍ `%s' ¤È `%s' ¤¬µÕ¤Ç¤¹" + +#~ msgid "range values reversed" +#~ msgstr "ÈϰϤÎÃͤ¬µÕ¤Ç¤¹" + +#~ msgid "bad is_error(%d) in v_message" +#~ msgstr "v_message Ãæ ÉÔÀµ¤Ê is_error(%d)" + +#~ msgid "'defined' without an identifier" +#~ msgstr "¼±Ê̻ҤΤʤ¤ 'defined'" + +#~ msgid "included file `%s' exists but is not readable" +#~ msgstr "include ¤µ¤ì¤¿¥Õ¥¡¥¤¥ë `%s' ¤Ï¡¢Â¸ºß¤·¤Þ¤¹¤¬Æɤá¤Þ¤»¤ó" + +#~ msgid "%s is a directory" +#~ msgstr "%s ¤Ï¥Ç¥£¥ì¥¯¥È¥ê¤Ç¤¹" + +#~ msgid "macro argument \"%s\" is stringified" +#~ msgstr "¥Þ¥¯¥í°ú¿ô \"%s\" ¤Ïʸ»úÎ󲽤µ¤ì¤Þ¤¹" + +#~ msgid "`##' at start of macro definition" +#~ msgstr "`##' ¤¬¥Þ¥¯¥íÄêµÁ¤Î»Ï¤á¤Ë¤¢¤ê¤Þ¤¹" + +#~ msgid "`##' at end of macro definition" +#~ msgstr "`##' ¤¬¥Þ¥¯¥íÄêµÁ¤Î½ª¤ê¤Ë¤¢¤ê¤Þ¤¹" + +#~ msgid "empty object-like macro went through full #define" +#~ msgstr "¶õ¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Î¤è¤¦¤Ê¥Þ¥¯¥í¤Ï #define Á´¤Æ¤òÄ̤êÈ´¤±¤Þ¤·¤¿" + +#~ msgid "first token = %d not %d in collect_formal_parameters" +#~ msgstr "collect_formal_parameters ÃæºÇ½é¤Î¥È¡¼¥¯¥ó = %d (%d ¤Ç¤Ï¤Ê¤¤)" + +#~ msgid "impossible token in macro argument list" +#~ msgstr "¥Þ¥¯¥í°ú¿ô¥ê¥¹¥È¤Ë¤¢¤êÆÀ¤Ê¤¤¥È¡¼¥¯¥ó" + +#~ msgid "illegal token in macro argument list" +#~ msgstr "¥Þ¥¯¥í°ú¿ô¥ê¥¹¥È¤ËÉÔÀµ¤Ê¥È¡¼¥¯¥ó" + +#~ msgid "another parameter follows \"...\"" +#~ msgstr "\"...\" ¤Î¸å¡¢¤µ¤é¤Ë¥Ñ¥é¥á¥¿¤¬Â³¤¤¤Æ¤¤¤Þ¤¹" + +#~ msgid "collect_params: argc=%d argslen=0" +#~ msgstr "collect_params: argc=%d argslen=0" + +#~ msgid "C99 does not permit use of __VA_ARGS__ as a macro argument name" +#~ msgstr "C99 ¤Ï¥Þ¥¯¥í°ú¿ô̾¤È¤·¤Æ __VA_ARGS__ ¤Î»ÈÍѤÏǧ¤á¤é¤ì¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "C89 does not permit varargs macros" +#~ msgstr "C89 ¤Ç¤Ï varargs ¥Þ¥¯¥í¤Ïǧ¤á¤é¤ì¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "collect_params: impossible token type %d" +#~ msgstr "collect_params: ¤¢¤êÆÀ¤Ê¤¤¥È¡¼¥¯¥ó·¿ %d" + +#~ msgid "attempt to use poisoned `%s'." +#~ msgstr "±øÀ÷¤µ¤ì¤¿ `%s' ¤ÎÍøÍѤò»î¤·¤Þ¤¹¡£" + +#~ msgid "macroexpand: unexpected token %d (wanted LPAREN)" +#~ msgstr "macroexpand: ͽ´ü¤·¤Ê¤¤¥È¡¼¥¯¥ó %d (LPAREN ¤Î¤Ï¤º)" + +#~ msgid "unterminated macro call" +#~ msgstr "½ªÃ¼¤·¤Æ¤¤¤Ê¤¤¥Þ¥¯¥í¸Æ¤Ó½Ð¤·" + +#~ msgid "macro `%s' used with just one arg" +#~ msgstr "¥Þ¥¯¥í `%s' ¤Î°ú¿ô¤¬°ì¤Ä¤·¤«¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "macro `%s' used with only %d args" +#~ msgstr "¥Þ¥¯¥í `%s' ¤Î°ú¿ô(%d ¸Ä)¤¬¾¯¤Ê¤¹¤®¤Þ¤¹" + +#~ msgid "macro `%s' used with too many (%d) args" +#~ msgstr "¥Þ¥¯¥í `%s' ¤Î°ú¿ô(%d ¸Ä)¤¬Â¿¤¹¤®¤Þ¤¹" + +#~ msgid "" +#~ "Switches:\n" +#~ " -include Include the contents of before other files\n" +#~ " -imacros Accept definition of macros in \n" +#~ " -iprefix Specify as a prefix for next two options\n" +#~ " -iwithprefix Add to the end of the system include path\n" +#~ " -iwithprefixbefore Add to the end of the main include path\n" +#~ " -isystem Add to the start of the system include path\n" +#~ " -idirafter Add to the end of the system include path\n" +#~ " -I Add to the end of the main include path\n" +#~ " -I- Fine-grained include path control; see info docs\n" +#~ " -nostdinc Do not search system include directories\n" +#~ " (dirs specified with -isystem will still be used)\n" +#~ " -nostdinc++ Do not search system include directories for C++\n" +#~ " -o Put output into \n" +#~ " -pedantic Issue all warnings demanded by strict ANSI C\n" +#~ " -pedantic-errors Issue -pedantic warnings as errors instead\n" +#~ " -traditional Follow K&R pre-processor behaviour\n" +#~ " -trigraphs Support ANSI C trigraphs\n" +#~ " -lang-c Assume that the input sources are in C\n" +#~ " -lang-c89 Assume that the input sources are in C89\n" +#~ " -lang-c++ Assume that the input sources are in C++\n" +#~ " -lang-objc Assume that the input sources are in ObjectiveC\n" +#~ " -lang-objc++ Assume that the input sources are in ObjectiveC++\n" +#~ " -lang-asm Assume that the input sources are in assembler\n" +#~ " -lang-fortran\t\t Assume that the input sources are in Fortran\n" +#~ " -lang-chill Assume that the input sources are in Chill\n" +#~ " -std= Specify the conformance standard; one of:\n" +#~ " gnu89, gnu99, c89, c99, iso9899:1990,\n" +#~ " iso9899:199409, iso9899:1999\n" +#~ " -+ Allow parsing of C++ style features\n" +#~ " -w Inhibit warning messages\n" +#~ " -Wtrigraphs Warn if trigraphs are encountered\n" +#~ " -Wno-trigraphs Do not warn about trigraphs\n" +#~ " -Wcomment{s} Warn if one comment starts inside another\n" +#~ " -Wno-comment{s} Do not warn about comments\n" +#~ " -Wtraditional Warn if a macro argument is/would be turned into\n" +#~ " a string if -traditional is specified\n" +#~ " -Wno-traditional Do not warn about stringification\n" +#~ " -Wundef Warn if an undefined macro is used by #if\n" +#~ " -Wno-undef Do not warn about testing undefined macros\n" +#~ " -Wimport Warn about the use of the #import directive\n" +#~ " -Wno-import Do not warn about the use of #import\n" +#~ " -Werror Treat all warnings as errors\n" +#~ " -Wno-error Do not treat warnings as errors\n" +#~ " -Wall Enable all preprocessor warnings\n" +#~ " -M Generate make dependencies\n" +#~ " -MM As -M, but ignore system header files\n" +#~ " -MD As -M, but put output in a .d file\n" +#~ " -MMD As -MD, but ignore system header files\n" +#~ " -MG Treat missing header file as generated files\n" +#~ " -g3 Include #define and #undef directives in the output\n" +#~ " -D Define a with string '1' as its value\n" +#~ " -D= Define a with as its value\n" +#~ " -A () Assert the to \n" +#~ " -A- () Disable the to \n" +#~ " -U Undefine \n" +#~ " -v Display the version number\n" +#~ " -H Print the name of header files as they are used\n" +#~ " -C Do not discard comments\n" +#~ " -dM Display a list of macro definitions active at end\n" +#~ " -dD Preserve macro definitions in output\n" +#~ " -dN As -dD except that only the names are preserved\n" +#~ " -dI Include #include directives in the output\n" +#~ " -ftabstop= Distance between tab stops for column reporting\n" +#~ " -P Do not generate #line directives\n" +#~ " -$ Do not allow '$' in identifiers\n" +#~ " -remap Remap file names when including files.\n" +#~ " --version Display version information\n" +#~ " -h or --help Display this information\n" +#~ msgstr "" +#~ "¥¹¥¤¥Ã¥Á:\n" +#~ " -include ¾¤Î¥Õ¥¡¥¤¥ë°ÊÁ°¤Ë ¤ÎÆâÍƤò include\n" +#~ " -imacros Ãæ¥Þ¥¯¥í¤ÎÄêµÁ¤ò¼õÍý¤¹¤ë\n" +#~ " -iprefix °Ê¹ß¤ÎÆó¤Ä¤Î¥ª¥×¥·¥ç¥ó¤Ë ÀÜƬ¼­¤ò¤Ä¤±¤ë\n" +#~ " -iwithprefix ¥·¥¹¥Æ¥à¥¤¥ó¥¯¥ë¡¼¥É¥Ñ¥¹¤ÎËöÈø¤Ë ¤òÄɲÃ\n" +#~ " -iwithprefixbefore ¼ç¥¤¥ó¥¯¥ë¡¼¥É¥Ñ¥¹¤ÎËöÈø¤Ë ¤òÄɲÃ\n" +#~ " -isystem ¥·¥¹¥Æ¥à¥¤¥ó¥¯¥ë¡¼¥É¥Ñ¥¹¤ÎºÇ½é¤Ë ¤òÄɲÃ\n" +#~ " -idirafter ¥·¥¹¥Æ¥à¥¤¥ó¥¯¥ë¡¼¥É¥Ñ¥¹¤ÎËöÈø¤Ë ¤òÄɲÃ\n" +#~ " -I ¼ç¥¤¥ó¥¯¥ë¡¼¥É¥Ñ¥¹¤ÎËöÈø¤Ë ¤òÄɲÃ\n" +#~ " -I- ¤­¤áºÙ¤«¤Ê¥¤¥ó¥¯¥ë¡¼¥É¥Ñ¥¹À©¸æ; info ¤ò¸«¤è\n" +#~ " -nostdinc ¥·¥¹¥Æ¥à¥¤¥ó¥¯¥ë¡¼¥É¥Ç¥£¥ì¥¯¥È¥ê¤òõ¤µ¤Ê¤¤\n" +#~ " (-isystem ¤Ç»ØÄꤵ¤ì¤¿¤é»ÈÍѤµ¤ì¤Þ¤¹)\n" +#~ " -nostdinc++ C++ ÍÑ¥·¥¹¥Æ¥à¥¤¥ó¥¯¥ë¡¼¥É¥Ç¥£¥ì¥¯¥È¥ê¤òõ¤µ¤Ê¤¤\n" +#~ " -o ¤ËÂФ·¤Æ½ÐÎϤ¹¤ë\n" +#~ " -pedantic ¸·Ì©¤Ê ANSI C ¤ÎÍ׵᤹¤ë·Ù¹ð¤òȯ¹Ô\n" +#~ " -pedantic-errors -pedantic ¤Î·Ù¹ð¤ò¥¨¥é¡¼¤È¤·¤Æȯ¹Ô\n" +#~ " -traditional K&R ¥×¥ê¥×¥í¥»¥Ã¥µ¤Î¿¶¤ëÉñ¤¤¤ËÄÉ¿ï\n" +#~ " -trigraphs ANSI C ¥È¥é¥¤¥°¥é¥Õ¤ò¥µ¥Ý¡¼¥È\n" +#~ " -lang-c ÆþÎϤò C ¤À¤È²¾Äꤹ¤ë\n" +#~ " -lang-c89 ÆþÎϤò C89 ¤À¤È²¾Äꤹ¤ë\n" +#~ " -lang-c++ ÆþÎϤò C++ ¤À¤È²¾Äꤹ¤ë\n" +#~ " -lang-objc ÆþÎϤò ObjectiveC ¤À¤È²¾Äꤹ¤ë\n" +#~ " -lang-objc++ ÆþÎϤò ObjectiveC++ ¤À¤È²¾Äꤹ¤ë\n" +#~ " -lang-asm ÆþÎϤò assembler ¤À¤È²¾Äꤹ¤ë\n" +#~ " -lang-fortran ÆþÎϤò Fortran ¤À¤È²¾Äꤹ¤ë\n" +#~ " -lang-chill ÆþÎϤò Chill ¤À¤È²¾Äꤹ¤ë\n" +#~ " -std= Ŭ¹ç¤¹¤ëɸ½à¤ò°Ê²¼¤«¤é°ì¤Ä»ØÄê;\n" +#~ " gnu89, gnu99, c89, c99, iso9899:1990,\n" +#~ " iso9899:199409, iso9899:1999\n" +#~ " -+ C++ ¥¹¥¿¥¤¥ë¤Î¥Ñ¡¼¥¸¥ó¥°¤òµö²Ä\n" +#~ " -w ·Ù¹ð¥á¥Ã¥»¡¼¥¸¤òÍÞÀ©¤¹¤ë\n" +#~ " -Wtrigraphs ¥È¥é¥¤¥°¥é¥Õ¤ò¸«¤Ä¤±¤¿¤é·Ù¹ð¤¹¤ë\n" +#~ " -Wno-trigraphs ¥È¥é¥¤¥°¥é¥Õ¤ò¸«¤Ä¤±¤Æ¤â·Ù¹ð¤·¤Ê¤¤\n" +#~ " -Wcomment{s} ¥³¥á¥ó¥È¤ÎÃæ¤Ë¥³¥á¥ó¥È¤¬¤¢¤ì¤Ð·Ù¹ð¤¹¤ë\n" +#~ " -Wno-comment{s} ¥³¥á¥ó¥È¤Ë´Ø¤¹¤ë·Ù¹ð¤ò¤·¤Ê¤¤\n" +#~ " -Wtraditional -traditional ¤¬»ØÄꤵ¤ì¤¿¾ì¹ç¡¢¥Þ¥¯¥í°ú¿ô¤¬\n" +#~ " ʸ»úÎó¤ËÊѹ¹¤µ¤ì¤ë¤è¤¦¤Ê¤é·Ù¹ð¤¹¤ë\n" +#~ " -Wno-traditional ʸ»úÎó»ØÄê¤Ë´Ø¤·¤Æ·Ù¹ð¤·¤Ê¤¤\n" +#~ " -Wundef #if ¤Ç̤ÄêµÁ¤Î¥Þ¥¯¥í¤¬»È¤ï¤ì¤Æ¤¤¤¿¤é·Ù¹ð¤¹¤ë\n" +#~ " -Wno-undef ̤ÄêµÁ¥Þ¥¯¥í¤Î¥Æ¥¹¥È¤Ë¤Ä¤¤¤Æ·Ù¹ð¤·¤Ê¤¤\n" +#~ " -Wimport #import ¤Î»ÈÍѤˤĤ¤¤Æ·Ù¹ð¤¹¤ë\n" +#~ " -Wno-import #import ¤Î»ÈÍѤˤĤ¤¤Æ·Ù¹ð¤·¤Ê¤¤\n" +#~ " -Werror Á´¤Æ¤Î·Ù¹ð¤ò¥¨¥é¡¼¤È¤·¤Æ°·¤¦\n" +#~ " -Wno-error ·Ù¹ð¤ò¥¨¥é¡¼¤È¤·¤Æ°·¤ï¤Ê¤¤\n" +#~ " -Wall Á´¤Æ¤Î¥×¥ê¥×¥í¥»¥Ã¥µ¤Î·Ù¹ð¤òÍ­¸ú¤Ë¤¹¤ë\n" +#~ " -M make ¤Î°Í¸´Ø·¸¤òÀ¸À®¤¹¤ë\n" +#~ " -MM -M ¤ÈƱ¤¸¤À¤¬¡¢¥·¥¹¥Æ¥à¥Ø¥Ã¥À¤Ï̵»ë¤¹¤ë\n" +#~ " -MD -M ¤ÈƱ¤¸¤À¤¬¡¢.d ¥Õ¥¡¥¤¥ë¤Ë½ÐÎϤ¹¤ë\n" +#~ " -MMD -MD ¤ÈƱ¤¸¤À¤¬¡¢¥·¥¹¥Æ¥à¥Ø¥Ã¥À¤Ï̵»ë¤¹¤ë\n" +#~ " -MG ¸«¤Ä¤«¤é¤Ê¤¤¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë¤ÏÀ¸À®¤µ¤ì¤ë¤â¤Î¤È¤¹¤ë\n" +#~ " -g3 #define ¤È #undef µ¿»÷Ì¿Îá¤ò½ÐÎϤ˴ޤá¤ë\n" +#~ " -D ¤òÄêµÁ¤·¡¢Ê¸»úÎó '1' ¤ò¤½¤ÎÃͤȤ¹¤ë\n" +#~ " -D= ¤òÄêµÁ¤·¡¢ ¤ò¤½¤ÎÃͤȤ¹¤ë\n" +#~ " -A () ¤Ï ¤À¤ÈÃǸÀ¤¹¤ë\n" +#~ " -A- () ¤Ï ¤À¤È¤·¤Ê¤¤\n" +#~ " -U ÄêµÁ¤ò¤ä¤á¤ë\n" +#~ " -v ¥Ð¡¼¥¸¥ç¥óÈÖ¹æ¤òɽ¼¨¤¹¤ë\n" +#~ " -H ÍøÍѤµ¤ì¤ë¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë¤Î̾Á°¤òɽ¼¨¤¹¤ë\n" +#~ " -C ¥³¥á¥ó¥È¤òÇË´þ¤·¤Ê¤¤\n" +#~ " -dM ËöÈø¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤ë¥Þ¥¯¥íÄêµÁ¥ê¥¹¥È¤òɽ¼¨¤¹¤ë\n" +#~ " -dD ½ÐÎϤ˥ޥ¯¥íÄêµÁ¤ò»Ä¤·¤Æ¤ª¤¯\n" +#~ " -dN -dD ¤ÈƱ¤¸¤À¤¬¡¢Ì¾Á°¤À¤±¤ò»Ä¤·¤Æ¤ª¤¯\n" +#~ " -dI #include µ¿»÷Ì¿Îá¤ò½ÐÎϤ˴ޤá¤ë\n" +#~ " -ftabstop= Êó¹ð¥«¥é¥à¤Î¥¿¥Ö´Ö³Ö¤ò»ØÄꤹ¤ë\n" +#~ " -P #line µ¿»÷Ì¿Îá¤òÀ¸À®¤·¤Ê¤¤\n" +#~ " -$ ¼±ÊÌ»Ò¤Ë '$' ¤òµö¤µ¤Ê¤¤\n" +#~ " -remap ¥Õ¥¡¥¤¥ë¤ò include ¤¹¤ë¤È¤­¥Õ¥¡¥¤¥ë̾¤òºÆ¥Þ¥Ã¥×\n" +#~ " --version ¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤òɽ¼¨¤¹¤ë\n" +#~ " -h or --help ¤³¤Î¾ðÊó¤òɽ¼¨¤¹¤ë\n" + +#~ msgid "mark active in cpp_pop_buffer" +#~ msgstr "cpp_pop_buffer ¤Ç¥Þ¡¼¥¯¤¬¥¢¥¯¥Æ¥£¥Ö" + +#~ msgid "length < 0 in cpp_expand_to_buffer" +#~ msgstr "cpp_expand_to_buffer Ãæ¤Ç length < 0" + +#~ msgid "backslash-newline within line comment" +#~ msgstr "¹Ô¥³¥á¥ó¥ÈÆâ¤Ë¥Ð¥Ã¥¯¥¹¥é¥Ã¥·¥å²þ¹Ô" + +#~ msgid "C++ style comments are not allowed in traditional C" +#~ msgstr "C++ ¥¹¥¿¥¤¥ë¤Î¥³¥á¥ó¥È¤ÏÅÁÅýŪ C ¤Ç¤Ïµö¤µ¤ì¤Þ¤»¤ó" + +#~ msgid "embedded null character ignored" +#~ msgstr "Ëä¤á¹þ¤Þ¤ì¤¿ null ʸ»ú¤Ï̵»ë¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "string constant runs past end of line" +#~ msgstr "ʸ»úÎóÄê¿ô¤¬¹Ô¤Î½ª¤ï¤ê¤Ç½ªÃ¼¤·¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "\\r escape inside string constant" +#~ msgstr "ʸ»úÎóÄê¿ôÃæ¤Î \\r ¥¨¥¹¥±¡¼¥×" + +#~ msgid "null characters in string or character constant" +#~ msgstr "ʸ»úÎóËô¤Ïʸ»úÄê¿ôÃæ¤Ë null ʸ»ú" + +#~ msgid "missing '>' in `#include '" +#~ msgstr "`#include <¥Õ¥¡¥¤¥ë̾>' ¤Ë '>' ¤¬¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "unrecognized escape \\r%c" +#~ msgstr "ǧ¼±ÉÔǽ¤Î¥¨¥¹¥±¡¼¥× \\r%c" + +#~ msgid "vertical tab in preprocessing directive" +#~ msgstr "¥×¥ê¥×¥í¥»¥¹¥Ç¥£¥ì¥¯¥Æ¥£¥ô¤Ë¿âľ¥¿¥Öʸ»ú" + +#~ msgid "form feed in preprocessing directive" +#~ msgstr "¥×¥ê¥×¥í¥»¥¹¥Ç¥£¥ì¥¯¥Æ¥£¥ô¤Ë¥Õ¥©¡¼¥à¥Õ¥£¡¼¥É" + +#~ msgid "null character preserved" +#~ msgstr "¥Ì¥ëʸ»ú¤¬Êݤ¿¤ì¤Þ¤·¤¿" + +#~ msgid "comment start split across lines" +#~ msgstr "¥³¥á¥ó¥È³«»Ï¤¬¹Ô¤ò¤Þ¤¿¤¤¤Ç¤¤¤Þ¤¹" + +#~ msgid "comment start '/*' split across lines" +#~ msgstr "¥³¥á¥ó¥È³«»Ï '/*' ¤¬¹Ô¤ò¤Þ¤¿¤¤¤Ç¤¤¤Þ¤¹" + +#~ msgid "comment end '*/' split across lines" +#~ msgstr "¥³¥á¥ó¥È½ªÃ¼ '*/' ¤¬¹Ô¤ò¤Þ¤¿¤¤¤Ç¤¤¤Þ¤¹" + +#~ msgid "handle_directive called on macro buffer" +#~ msgstr "¥Þ¥¯¥í¥Ð¥Ã¥Õ¥¡¤Ç handle_directive ¤¬¸Æ¤Ð¤ì¤Þ¤·¤¿" + +#~ msgid "ignoring #%s because of its indented #" +#~ msgstr "¥¤¥ó¥Ç¥ó¥È¤µ¤ì¤¿ # ¤Ê¤Î¤Ç¡¢#%s ¤Ï̵»ë¤·¤Þ¤¹" + +#~ msgid "ISO C does not allow #%s" +#~ msgstr "ISO C ¤Ï #%s ¤òµö²Ä¤·¤Þ¤»¤ó" + +#~ msgid "redefining poisoned `%.*s'" +#~ msgstr "±øÀ÷¤µ¤ì¤¿ `%.*s' ¤òºÆÄêµÁ" + +#~ msgid "garbage at end of #line" +#~ msgstr "#line ¥³¥Þ¥ó¥É¤ÎºÇ¸å¤Ë¥´¥ß" + +#~ msgid "second token after #line is not a string" +#~ msgstr "#line ¤Î¸å¤ÎÆó¤ÄÌܤΥȡ¼¥¯¥ó¤¬Ê¸»úÎó¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "junk on line after #undef" +#~ msgstr "#undef ¤Î¸å¤Î¹Ô¤Ë¥´¥ß" + +#~ msgid "cannot undefine poisoned \"%s\"" +#~ msgstr "±øÀ÷¤µ¤ì¤¿ \"%s\" ¤ò undefine ¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "malformed #pragma implementation" +#~ msgstr "¤ª¤«¤·¤Ê #pragma implementation" + +#~ msgid "#%s with no argument" +#~ msgstr "#%s ¤Ë°ú¿ô¤¬¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "#%s with invalid argument" +#~ msgstr "̵¸ú¤Ê°ú¿ô¤ò»ý¤Ã¤¿ #%s" + +#~ msgid "Cannot duplicate non-existant exception region." +#~ msgstr "¸ºß¤·¤Ê¤¤Îã³°Îΰè¤òÊ£À½¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£" + +#~ msgid "Never issued previous false_label" +#~ msgstr "Á°¤Î false_label ¤Ï·è¤·¤Æȯ¹Ô¤µ¤ì¤Þ¤»¤ó" + +#~ msgid "Basic blocks not numbered consecutively" +#~ msgstr "´ðËÜ¥Ö¥í¥Ã¥¯¤¬Ï¢Â³Åª¤ËÈÖ¹æÉÕ¤±¤é¤ì¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "file path prefix `%s%s' never used" +#~ msgstr "¥Õ¥¡¥¤¥ë¥Ñ¥¹¤Î¥×¥ì¥Õ¥£¥Ã¥¯¥¹ `%s%s' ¤ÏÁ´¤¯»È¤ï¤ì¤Þ¤»¤ó" + +#~ msgid "file path prefix `%s' never used" +#~ msgstr "¥Õ¥¡¥¤¥ë¥Ñ¥¹¤Î¥×¥ì¥Õ¥£¥Ã¥¯¥¹ `%s' ¤ÏÁ´¤¯»È¤ï¤ì¤Þ¤»¤ó" + +#~ msgid "%s: option `%s' is ambiguous\n" +#~ msgstr "%s: ¥ª¥×¥·¥ç¥ó `%s' ¤Ï¤¢¤¤¤Þ¤¤¤Ç¤¹\n" + +#~ msgid "%s: option `--%s' doesn't allow an argument\n" +#~ msgstr "%s: ¥ª¥×¥·¥ç¥ó `--%s' ¤Ë°ú¿ô¤Ï¤¢¤ê¤Þ¤»¤ó\n" + +#~ msgid "%s: option `%c%s' doesn't allow an argument\n" +#~ msgstr "%s: ¥ª¥×¥·¥ç¥ó `%c%s' ¤Ë°ú¿ô¤Ï¤¢¤ê¤Þ¤»¤ó\n" + +#~ msgid "%s: option `%s' requires an argument\n" +#~ msgstr "%s: ¥ª¥×¥·¥ç¥ó `%s' ¤Ë¤Ï°ú¿ô¤¬É¬ÍפǤ¹\n" + +#~ msgid "%s: unrecognized option `--%s'\n" +#~ msgstr "%s: ǧ¼±ÉÔǽ¤Ê¥ª¥×¥·¥ç¥ó `--%s'\n" + +#~ msgid "%s: unrecognized option `%c%s'\n" +#~ msgstr "%s: ǧ¼±ÉÔǽ¤Ê¥ª¥×¥·¥ç¥ó `%c%s'\n" + +#~ msgid "%s: illegal option -- %c\n" +#~ msgstr "%s: ÉÔÀµ¤Ê¥ª¥×¥·¥ç¥ó -- %c\n" + +#~ msgid "%s: invalid option -- %c\n" +#~ msgstr "%s: ̵¸ú¤Ê¥ª¥×¥·¥ç¥ó -- %c\n" + +#~ msgid "%s: option requires an argument -- %c\n" +#~ msgstr "%s: ¥ª¥×¥·¥ç¥ó¤Ë¤Ï°ú¿ô¤¬É¬ÍפǤ¹ -- %c\n" + +#~ msgid "%s: option `-W %s' is ambiguous\n" +#~ msgstr "%s: ¥ª¥×¥·¥ç¥ó `-W %s' ¤Ï¤¢¤¤¤Þ¤¤¤Ç¤¹\n" + +#~ msgid "%s: option `-W %s' doesn't allow an argument\n" +#~ msgstr "%s: ¥ª¥×¥·¥ç¥ó `-W %s' ¤Ë°ú¿ô¤Ï¤¢¤ê¤Þ¤»¤ó\n" + +#~ msgid "function with complex parameters cannot be inline" +#~ msgstr "Ê£»¨¤Ê¥Ñ¥é¥á¥¿¤ò¤â¤Ä´Ø¿ô¤Ï inline ¤Ë¤Ç¤­¤Þ¤»¤ó" + +#~ msgid "Objective-C text in C source file" +#~ msgstr "C ¤Î¥½¡¼¥¹¥Õ¥¡¥¤¥ëÃæ¤Ë Objective-C ¤Îʸ»úÎó" + +#~ msgid "statically allocated objects not supported" +#~ msgstr "¥ª¥Ö¥¸¥§¥¯¥È¤ÎÀÅŪ¤Ê³äÅö¤Æ¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "output pipe has been closed" +#~ msgstr "½ÐÎϤΥѥ¤¥×¤¬ÊĤ¸¤é¤ì¤Þ¤·¤¿" + +#~ msgid "Unknown stab %s: : 0x%x\n" +#~ msgstr "ÉÔÌÀ¤Ê¥¹¥¿¥Ö %s: : 0x%x\n" diff --git a/libcpp/po/nl.po b/libcpp/po/nl.po new file mode 100644 index 0000000..f873b3d --- /dev/null +++ b/libcpp/po/nl.po @@ -0,0 +1,926 @@ +# Dutch messages for cpplib. +# Copyright (C) 1999, 2000, 2002, 2003, 2005, 2007 Free Software Foundation, Inc. +# Tim Van Holder , 2007. +# +msgid "" +msgstr "" +"Project-Id-Version: cpplib 4.3-b20071109\n" +"Report-Msgid-Bugs-To: http://gcc.gnu.org/bugs.html\n" +"POT-Creation-Date: 2007-11-08 21:08+0000\n" +"PO-Revision-Date: 2007-11-10 17:28+0100\n" +"Last-Translator: Tim Van Holder \n" +"Language-Team: Dutch \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: charset.c:654 +#, c-format +msgid "conversion from %s to %s not supported by iconv" +msgstr "iconv ondersteunt geen omzetting van %s naar %s" + +#: charset.c:657 +msgid "iconv_open" +msgstr "iconv_open" + +#: charset.c:665 +#, c-format +msgid "no iconv implementation, cannot convert from %s to %s" +msgstr "geen implementatie van iconv beschikbaar; kan niet omzetten van %s naar %s" + +# of "tekenset" aangezien character door "teken" vertaald wordt? +#: charset.c:742 +#, c-format +msgid "character 0x%lx is not in the basic source character set\n" +msgstr "teken 0x%lx maakt geen deel uit van de basis bronkarakterset\n" + +#: charset.c:759 charset.c:1352 +msgid "converting to execution character set" +msgstr "omzetting naar uitvoeringskarakterset" + +#: charset.c:765 +#, c-format +msgid "character 0x%lx is not unibyte in execution character set" +msgstr "teken 0x%lx is niet unibyte in de uitvoeringskarakterset" + +#: charset.c:889 +#, c-format +msgid "Character %x might not be NFKC" +msgstr "Teken %x is misschien niet NFKC" + +#: charset.c:949 +msgid "universal character names are only valid in C++ and C99" +msgstr "universele tekennamen zijn enkel geldig in C++ en C99" + +#: charset.c:952 +#, c-format +msgid "the meaning of '\\%c' is different in traditional C" +msgstr "de betekenis van '\\%c' is anders in traditionele C" + +#: charset.c:961 +msgid "In _cpp_valid_ucn but not a UCN" +msgstr "In _cpp_valid_ucn maar het is geen UCN" + +#: charset.c:986 +#, c-format +msgid "incomplete universal character name %.*s" +msgstr "onvolledige universele tekennaam %.*s" + +#: charset.c:998 +#, c-format +msgid "%.*s is not a valid universal character" +msgstr "%.*s is geen geldige universele tekennaam" + +#: charset.c:1008 lex.c:484 +msgid "'$' in identifier or number" +msgstr "'$' in naam of getal" + +# "identifier" is een verdomd rottig woord om te vertalen... +#: charset.c:1018 +#, c-format +msgid "universal character %.*s is not valid in an identifier" +msgstr "universeel teken %.*s is niet geldig in een naam" + +#: charset.c:1022 +#, c-format +msgid "universal character %.*s is not valid at the start of an identifier" +msgstr "universeel teken %.*s is niet geldig aan het begin van een naam" + +#: charset.c:1056 charset.c:1571 +msgid "converting UCN to source character set" +msgstr "omzetting van UCN naar bronkarakterset" + +#: charset.c:1060 +msgid "converting UCN to execution character set" +msgstr "omzetting van UCN naar uitvoeringskarakterset" + +#: charset.c:1132 +msgid "the meaning of '\\x' is different in traditional C" +msgstr "de betekenis van '\\x' is anders in traditionele C" + +#: charset.c:1149 +msgid "\\x used with no following hex digits" +msgstr "\\x gebruikt zonder daaropvolgende hexadecimale cijfers" + +#: charset.c:1156 +msgid "hex escape sequence out of range" +msgstr "hexadecimale escape sequence buiten bereik" + +#: charset.c:1195 +msgid "octal escape sequence out of range" +msgstr "octale escape sequence buiten bereik" + +#: charset.c:1263 +msgid "the meaning of '\\a' is different in traditional C" +msgstr "de betekenis van '\\a' is anders in traditionele C" + +#: charset.c:1270 +#, c-format +msgid "non-ISO-standard escape sequence, '\\%c'" +msgstr "escape sequence '\\%c' is niet ISO-standaard" + +#: charset.c:1278 +#, c-format +msgid "unknown escape sequence '\\%c'" +msgstr "onbekende escape sequence '\\%c'" + +#: charset.c:1286 +#, c-format +msgid "unknown escape sequence: '\\%s'" +msgstr "onbekende escape sequence '\\%s'" + +#: charset.c:1293 +msgid "converting escape sequence to execution character set" +msgstr "omzetting van escape sequence naar uitvoeringskarakterset" + +#: charset.c:1415 charset.c:1478 +msgid "character constant too long for its type" +msgstr "karakterconstante te lang voor zijn type" + +#: charset.c:1418 +msgid "multi-character character constant" +msgstr "karakterconstante bevat meerdere karakters" + +#: charset.c:1510 +msgid "empty character constant" +msgstr "lege karakterconstante" + +#: charset.c:1612 +#, c-format +msgid "failure to convert %s to %s" +msgstr "fout bij omzetten van %s naar %s" + +#: directives.c:215 directives.c:241 +#, c-format +msgid "extra tokens at end of #%s directive" +msgstr "overbodige tokens aan einde van #%s commando" + +#: directives.c:344 +#, c-format +msgid "#%s is a GCC extension" +msgstr "#%s is een uitbreiding van GCC" + +#: directives.c:356 +msgid "suggest not using #elif in traditional C" +msgstr "gebruik liefst geen #elif in traditionele C" + +#: directives.c:359 +#, c-format +msgid "traditional C ignores #%s with the # indented" +msgstr "traditionele C negeert #%s wanneer de # geïndenteerd is" + +#: directives.c:363 +#, c-format +msgid "suggest hiding #%s from traditional C with an indented #" +msgstr "verberg #%s liefst van traditionele C via een geïndenteerde #" + +#: directives.c:389 +msgid "embedding a directive within macro arguments is not portable" +msgstr "het plaatsen van een commando binnen macro-argumenten is niet portabel" + +#: directives.c:409 +msgid "style of line directive is a GCC extension" +msgstr "dit soort line commando is een uitbreiding van GCC" + +#: directives.c:464 +#, c-format +msgid "invalid preprocessing directive #%s" +msgstr "ongeldig preprocessing-commando #%s" + +#: directives.c:532 +msgid "\"defined\" cannot be used as a macro name" +msgstr "\"defined\" kan niet als macronaam gebruikt worden" + +#: directives.c:538 +#, c-format +msgid "\"%s\" cannot be used as a macro name as it is an operator in C++" +msgstr "\"%s\" kan niet als macronaam gebruikt worden omdat het een operator is in C++" + +#: directives.c:541 +#, c-format +msgid "no macro name given in #%s directive" +msgstr "geen macronaam opgegeven in #%s commando" + +# lap! hier heb ik het zitten... wat is verdorie een betere vertaling voor identifier? +# Dit is wel langer maar zegt denk ik wel waar het om gaat. +#: directives.c:544 +msgid "macro names must be identifiers" +msgstr "macronamen moeten voldoen aan de regels voor namen in C/C++" + +# niet perfect, maar beter dan "wordt ongedefinieerd", "wordt geondefinieerd" of iets dergelijks... +#: directives.c:585 +#, c-format +msgid "undefining \"%s\"" +msgstr "definitie van \"%s\" wordt ongedaan gemaakt" + +#: directives.c:640 +msgid "missing terminating > character" +msgstr "sluitend > teken ontbreekt" + +#: directives.c:695 +#, c-format +msgid "#%s expects \"FILENAME\" or " +msgstr "#%s verwacht \"BESTAND\" of " + +#: directives.c:739 +#, c-format +msgid "empty filename in #%s" +msgstr "lege bestandsnaam in #%s" + +#: directives.c:749 +msgid "#include nested too deeply" +msgstr "#include te diep genest" + +#: directives.c:790 +msgid "#include_next in primary source file" +msgstr "#include_next in primair bronbestand" + +#: directives.c:816 +#, c-format +msgid "invalid flag \"%s\" in line directive" +msgstr "ongeldige vlag \"%s\" in #line commando" + +#: directives.c:868 +#, c-format +msgid "\"%s\" after #line is not a positive integer" +msgstr "\"%s\" (na #line) is geen positieve integer" + +#: directives.c:874 +msgid "line number out of range" +msgstr "regelnummer buiten bereik" + +#: directives.c:887 directives.c:964 +#, c-format +msgid "\"%s\" is not a valid filename" +msgstr "\"%s\" is geen geldige bestandsnaam" + +#: directives.c:924 +#, c-format +msgid "\"%s\" after # is not a positive integer" +msgstr "\"%s\" (na #) is geen positieve integer" + +#: directives.c:1026 +#, c-format +msgid "invalid #%s directive" +msgstr "ongeldig #%s commando" + +# goede vertaling voor 'mismatched'? +#: directives.c:1089 +#, c-format +msgid "registering pragmas in namespace \"%s\" with mismatched name expansion" +msgstr "registratie van pragmas in namespace \"%s\" met niet-overeenkomstige naamexpansie" + +# moet namespace hier ook vertaald worden? +#: directives.c:1098 +#, c-format +msgid "registering pragma \"%s\" with name expansion and no namespace" +msgstr "registratie van pragma \"%s\" met naamexpansie maar geen namespace" + +# moet namespace hier ook vertaald worden? +#: directives.c:1116 +#, c-format +msgid "registering \"%s\" as both a pragma and a pragma namespace" +msgstr "registratie van \"%s\" zowel als pragma en als pragma-namespace" + +#: directives.c:1119 +#, c-format +msgid "#pragma %s %s is already registered" +msgstr "#pragma %s %s is reeds geregistreerd" + +#: directives.c:1122 +#, c-format +msgid "#pragma %s is already registered" +msgstr "#pragma %s is reeds geregistreerd" + +# betere vertaling voor 'handler'? +#: directives.c:1152 +msgid "registering pragma with NULL handler" +msgstr "registratie van pragma met NULL als afhandelingsroutine" + +#: directives.c:1362 +msgid "#pragma once in main file" +msgstr "#pragma once in hoofdbestand" + +#: directives.c:1385 +msgid "invalid #pragma GCC poison directive" +msgstr "ongeldig #pragma GCC poison commando" + +#: directives.c:1394 +#, c-format +msgid "poisoning existing macro \"%s\"" +msgstr "bestaande macro \"%s\" wordt 'vergiftigd'" + +#: directives.c:1413 +msgid "#pragma system_header ignored outside include file" +msgstr "#pragma system_header wordt genegeerd buiten een invoegbestand" + +#: directives.c:1437 +#, c-format +msgid "cannot find source file %s" +msgstr "kan bronbestand %s niet vinden" + +#: directives.c:1441 +#, c-format +msgid "current file is older than %s" +msgstr "huidig bestand is ouder dan %s" + +#: directives.c:1620 +msgid "_Pragma takes a parenthesized string literal" +msgstr "_Pragma verwacht een stringconstante tussen haakjes als argument" + +#: directives.c:1693 +msgid "#else without #if" +msgstr "#else zonder #if" + +#: directives.c:1698 +msgid "#else after #else" +msgstr "#else na #else" + +# of gewoon "de conditie"? +#: directives.c:1700 directives.c:1733 +msgid "the conditional began here" +msgstr "het conditionele blok begon hier" + +#: directives.c:1726 +msgid "#elif without #if" +msgstr "#elif zonder #if" + +#: directives.c:1731 +msgid "#elif after #else" +msgstr "#elif na #else" + +#: directives.c:1761 +msgid "#endif without #if" +msgstr "#endif zonder #if" + +#: directives.c:1838 +msgid "missing '(' after predicate" +msgstr "'(' ontbreekt na predicaat" + +#: directives.c:1853 +msgid "missing ')' to complete answer" +msgstr "')' ontbreekt als afronding van het antwoord" + +#: directives.c:1873 +msgid "predicate's answer is empty" +msgstr "antwoord van het predicaat is leeg" + +# dit moet beter kunnen... +#: directives.c:1900 +msgid "assertion without predicate" +msgstr "assertie zonder predicaat" + +# ... dit klinkt echt niet - maar wat is hier een beter vertaling voor identifier? +#: directives.c:1902 +msgid "predicate must be an identifier" +msgstr "predicaat moet een naam zijn" + +# is "asserteren" wel een echt woord? +#: directives.c:1988 +#, c-format +msgid "\"%s\" re-asserted" +msgstr "\"%s\" opnieuw geasserteerd" + +#: directives.c:2271 +#, c-format +msgid "unterminated #%s" +msgstr "niet-beëindigde #%s" + +#: directives-only.c:221 lex.c:1016 traditional.c:162 +msgid "unterminated comment" +msgstr "niet-beëindigde commentaar" + +# Dit zou misschien beter 'warning' blijven +#: errors.c:118 +msgid "warning: " +msgstr "let op: " + +#: errors.c:120 +msgid "internal error: " +msgstr "interne fout: " + +#: errors.c:122 +msgid "error: " +msgstr "fout: " + +#: errors.c:186 +msgid "stdout" +msgstr "stdout" + +# hoort niet echt een vertaalbare string te zijn :-) +#: errors.c:188 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +# betere vertaling voor decimal point? +#: expr.c:261 +msgid "too many decimal points in number" +msgstr "teveel komma's in getal" + +#: expr.c:290 expr.c:365 +msgid "fixed-point constants are a GCC extension" +msgstr "fixed-point constantes zijn een uitbreiding van GCC" + +#: expr.c:303 +#, c-format +msgid "invalid digit \"%c\" in binary constant" +msgstr "ongeldig cijfer \"%c\" in binaire constante" + +#: expr.c:305 +#, c-format +msgid "invalid digit \"%c\" in octal constant" +msgstr "ongeldig cijfer \"%c\" in octale constante" + +#: expr.c:313 +msgid "invalid prefix \"0b\" for floating constant" +msgstr "ongeldige prefix \"0b\" voor floating-point constante" + +#: expr.c:319 +msgid "use of C99 hexadecimal floating constant" +msgstr "gebruik van C99 hexadecimale floating-point constante" + +#: expr.c:328 +msgid "exponent has no digits" +msgstr "exponent heeft geen cijfers" + +#: expr.c:335 +msgid "hexadecimal floating constants require an exponent" +msgstr "hexadecimale floating-point constante vereist een exponent" + +#: expr.c:341 +#, c-format +msgid "invalid suffix \"%.*s\" on floating constant" +msgstr "ongeldige suffix \"%.*s\" aan floating-point constante" + +#: expr.c:351 expr.c:393 +#, c-format +msgid "traditional C rejects the \"%.*s\" suffix" +msgstr "traditionele C aanvaardt de \"%.*s\" suffix niet" + +#: expr.c:358 +#, c-format +msgid "invalid suffix \"%.*s\" with hexadecimal floating constant" +msgstr "ongeldige suffix \"%.*s\" bij hexadecimale floating-point constante" + +#: expr.c:369 +msgid "decimal float constants are a GCC extension" +msgstr "decimale float-constantes zijn een uitbreiding van GCC" + +#: expr.c:379 +#, c-format +msgid "invalid suffix \"%.*s\" on integer constant" +msgstr "ongeldige suffix \"%.*s\" aan integerconstante" + +#: expr.c:401 +msgid "use of C99 long long integer constant" +msgstr "gebruik van C99 long long integerconstantes" + +#: expr.c:409 +msgid "imaginary constants are a GCC extension" +msgstr "imaginaire constantes zijn een uitbreiding van GCC" + +#: expr.c:412 +msgid "binary constants are a GCC extension" +msgstr "binaire constantes zijn een uitbreiding van GCC" + +#: expr.c:505 +msgid "integer constant is too large for its type" +msgstr "integerconstante is te groot voor zijn type" + +#: expr.c:517 +msgid "integer constant is so large that it is unsigned" +msgstr "integerconstante is zo groot dat hij tekenloos is" + +#: expr.c:612 +msgid "missing ')' after \"defined\"" +msgstr "')' ontbreekt na \"defined\"" + +#: expr.c:619 +msgid "operator \"defined\" requires an identifier" +msgstr "de \"defined\" operator verwacht een naam als argument" + +#: expr.c:627 +#, c-format +msgid "(\"%s\" is an alternative token for \"%s\" in C++)" +msgstr "(\"%s\" is een alternatieve schrijfwijze voor \"%s\" in C++)" + +# betere vertaling voor "portable"? +#: expr.c:637 +msgid "this use of \"defined\" may not be portable" +msgstr "dit gebruik van \"define\" is mogelijk niet portabel" + +#: expr.c:676 +msgid "floating constant in preprocessor expression" +msgstr "floating-point constante in preprocessor-expressie" + +#: expr.c:682 +msgid "imaginary number in preprocessor expression" +msgstr "imaginair getal in preprocessor-expressie" + +#: expr.c:727 +#, c-format +msgid "\"%s\" is not defined" +msgstr "\"%s\" is niet gedefinieerd" + +#: expr.c:855 expr.c:884 +#, c-format +msgid "missing binary operator before token \"%s\"" +msgstr "binaire operator ontbreekt voor het \"%s\" token" + +#: expr.c:875 +#, c-format +msgid "token \"%s\" is not valid in preprocessor expressions" +msgstr "token \"%s\" is niet geldig in preprocessor-expressies" + +#: expr.c:892 +msgid "missing expression between '(' and ')'" +msgstr "expressie ontbreekt tussen '(' en ')'" + +#: expr.c:895 +msgid "#if with no expression" +msgstr "#if zonder expressie" + +#: expr.c:898 +#, c-format +msgid "operator '%s' has no right operand" +msgstr "operator '%s' heeft geen rechtse operand" + +#: expr.c:903 +#, c-format +msgid "operator '%s' has no left operand" +msgstr "operator '%s' heeft geen linkse operand" + +#: expr.c:929 +msgid " ':' without preceding '?'" +msgstr " ':' zonder voorafgaande '?'" + +#: expr.c:956 +msgid "unbalanced stack in #if" +msgstr "niet-gebalanceerde stack in #if" + +#: expr.c:975 +#, c-format +msgid "impossible operator '%u'" +msgstr "operator '%u' is onmogelijk" + +#: expr.c:1065 +msgid "missing ')' in expression" +msgstr "')' ontbreekt in expressie" + +#: expr.c:1086 +msgid "'?' without following ':'" +msgstr "'?' zonder daaropvolgende ':'" + +#: expr.c:1096 +msgid "integer overflow in preprocessor expression" +msgstr "integer-overflow in preprocessor-expressie" + +#: expr.c:1101 +msgid "missing '(' in expression" +msgstr "'(' ontbreekt in expressie" + +#: expr.c:1133 +#, c-format +msgid "the left operand of \"%s\" changes sign when promoted" +msgstr "de linker operand van \"%s\" verandert van teken indien hij gepromoveerd wordt" + +#: expr.c:1138 +#, c-format +msgid "the right operand of \"%s\" changes sign when promoted" +msgstr "de rechter operand van \"%s\" verandert van teken indien hij gepromoveerd wordt" + +#: expr.c:1397 +msgid "traditional C rejects the unary plus operator" +msgstr "traditionele C verwerpt de unaire plus-operator" + +#: expr.c:1480 +msgid "comma operator in operand of #if" +msgstr "comma operator in operand van #if" + +#: expr.c:1612 +msgid "division by zero in #if" +msgstr "deling door nul in `#if'" + +#: files.c:442 +msgid "NULL directory in find_file" +msgstr "directory is NULL in find_file" + +#: files.c:480 +msgid "one or more PCH files were found, but they were invalid" +msgstr "een of meer PCH bestanden werden gevonden, maar ze waren ongeldig" + +#: files.c:483 +msgid "use -Winvalid-pch for more information" +msgstr "gebruik -Winvalid-pch voor meer informatie" + +#: files.c:570 +#, c-format +msgid "%s is a block device" +msgstr "%s is een blokapparaat" + +#: files.c:587 +#, c-format +msgid "%s is too large" +msgstr "%s is te groot" + +#: files.c:622 +#, c-format +msgid "%s is shorter than expected" +msgstr "%s is korter dan verwacht" + +#: files.c:852 +#, c-format +msgid "no include path in which to search for %s" +msgstr "geen invoegpad waarin naar %s gezocht kan worden" + +# goede vertaling voor "include guard"? +#: files.c:1157 +msgid "Multiple include guards may be useful for:\n" +msgstr "Meerdere invoegbeschermingen zouden nuttig kunnen zijn voor:\n" + +#: init.c:426 +msgid "cppchar_t must be an unsigned type" +msgstr "cppchar_t moet een tekenloos type zijn" + +#: init.c:430 +#, c-format +msgid "preprocessor arithmetic has maximum precision of %lu bits; target requires %lu bits" +msgstr "preprocessor-rekensommen hebben een maximale precisie van %lu bits; doelomgeving vereist %lu bits" + +#: init.c:437 +msgid "CPP arithmetic must be at least as precise as a target int" +msgstr "CPP rekensommen moet minstens even precies zijn als een int in de doelomgeving" + +#: init.c:440 +msgid "target char is less than 8 bits wide" +msgstr "char is minder dan 8 bits breed in de doelomgeving" + +#: init.c:444 +msgid "target wchar_t is narrower than target char" +msgstr "wchar_t is smaller dan char in de doelomgeving" + +#: init.c:448 +msgid "target int is narrower than target char" +msgstr "int is smaller dan char in de doelomgeving" + +#: init.c:453 +msgid "CPP half-integer narrower than CPP character" +msgstr "CPP half-integer is smaller dan een CPP character" + +#: init.c:457 +#, c-format +msgid "CPP on this host cannot handle wide character constants over %lu bits, but the target requires %lu bits" +msgstr "CPP kan op deze host geen brede karakterconstantes aan van meer dan %lu bits, maar de doelomgeving vereist %lu bits" + +#: lex.c:283 +msgid "backslash and newline separated by space" +msgstr "backslash en newline gescheiden door spatie(s)" + +#: lex.c:288 +msgid "backslash-newline at end of file" +msgstr "backslash-newline aan einde van bestand" + +#: lex.c:303 +#, c-format +msgid "trigraph ??%c converted to %c" +msgstr "trigraph ??%c omgezet naar %c" + +#: lex.c:310 +#, c-format +msgid "trigraph ??%c ignored, use -trigraphs to enable" +msgstr "trigraph ??%c genegeerd, gebruik -trigraphs om ondersteuning in te schakelen" + +#: lex.c:356 +msgid "\"/*\" within comment" +msgstr "\"/*\" binnen commentaar" + +#: lex.c:414 +#, c-format +msgid "%s in preprocessing directive" +msgstr "%s binnen preprocessor-commando" + +#: lex.c:423 +msgid "null character(s) ignored" +msgstr "nulkarakter(s) worden genegeerd" + +#: lex.c:460 +#, c-format +msgid "`%.*s' is not in NFKC" +msgstr "`%.*s' zit niet in NFKC" + +#: lex.c:463 +#, c-format +msgid "`%.*s' is not in NFC" +msgstr "`%.*s' zit niet in NFC" + +#: lex.c:551 +#, c-format +msgid "attempt to use poisoned \"%s\"" +msgstr "poging tot gebruik van 'vergiftigde' \"%s\"" + +#: lex.c:559 +msgid "__VA_ARGS__ can only appear in the expansion of a C99 variadic macro" +msgstr "__VA_ARGS__ mag enkel voorkomen in de expansie van een C99 variadische macro" + +#: lex.c:659 +msgid "null character(s) preserved in literal" +msgstr "nulkarakter(s) in een constante worden behouden" + +#: lex.c:662 +#, c-format +msgid "missing terminating %c character" +msgstr "sluitend %c teken ontbreekt" + +#: lex.c:1027 +msgid "C++ style comments are not allowed in ISO C90" +msgstr "commentaar in C++ stijl is niet toegestaan in ISO C90" + +#: lex.c:1029 +msgid "(this will be reported only once per input file)" +msgstr "(dit wordt maar een keer gemeld per invoerbestand)" + +#: lex.c:1034 +msgid "multi-line comment" +msgstr "commentaar gespreid over meerdere lijnen" + +# lijkt een vreemde boodschap... +#: lex.c:1347 +#, c-format +msgid "unspellable token %s" +msgstr "kan token %s niet spellen" + +#: line-map.c:320 +#, c-format +msgid "In file included from %s:%u" +msgstr "In bestand ingevoegd vanuit %s:%u" + +#: line-map.c:338 +#, c-format +msgid "" +",\n" +" from %s:%u" +msgstr "" +",\n" +" vanuit %s:%u" + +#: macro.c:84 +#, c-format +msgid "macro \"%s\" is not used" +msgstr "macro \"%s\" wordt nergens gebruikt" + +#: macro.c:123 macro.c:319 +#, c-format +msgid "invalid built-in macro \"%s\"" +msgstr "ongeldige ingebouwde macro \"%s\"" + +# betere vertaling voor 'timestamp'? +#: macro.c:157 +msgid "could not determine file timestamp" +msgstr "kan tijdsinformatie van bestand niet bepalen" + +#: macro.c:254 +msgid "could not determine date and time" +msgstr "kan datum en tijd niet bepalen" + +#: macro.c:270 +msgid "__COUNTER__ expanded inside directive with -fdirectives-only" +msgstr "expansie van __COUNTER__ binnenin commando terwijl -fdirectives-only opgegeven is" + +#: macro.c:423 +msgid "invalid string literal, ignoring final '\\'" +msgstr "ongeldige stringconstante, laatste '\\' wordt genegeerd" + +#: macro.c:483 +#, c-format +msgid "pasting \"%s\" and \"%s\" does not give a valid preprocessing token" +msgstr "\"%s\" en \"%s\" aan elkaar plakken levert geen geldig preprocessing token op" + +# "rest arguments"? +#: macro.c:558 +msgid "ISO C99 requires rest arguments to be used" +msgstr "ISO C99 verplicht het gebruik van restargumenten" + +#: macro.c:563 +#, c-format +msgid "macro \"%s\" requires %u arguments, but only %u given" +msgstr "macro \"%s\" vereist %u argumenten, maar er werden er slechts %u opgegeven" + +#: macro.c:568 +#, c-format +msgid "macro \"%s\" passed %u arguments, but takes just %u" +msgstr "macro \"%s\" kreeg %u argumenten, maar heeft er slechts %u nodig" + +#: macro.c:679 traditional.c:680 +#, c-format +msgid "unterminated argument list invoking macro \"%s\"" +msgstr "niet-beëindigde argumentenlijst bij oproep van macro \"%s\"" + +#: macro.c:782 +#, c-format +msgid "function-like macro \"%s\" must be used with arguments in traditional C" +msgstr "functie-achtige macro \"%s\" moet in traditionele C altijd met argumenten gebruikt worden" + +#: macro.c:1325 +#, c-format +msgid "duplicate macro parameter \"%s\"" +msgstr "herhaalde macro-parameter \"%s\"" + +#: macro.c:1371 +#, c-format +msgid "\"%s\" may not appear in macro parameter list" +msgstr "\"%s\" mag niet voorkomen in lijst van macro-parameters" + +#: macro.c:1379 +msgid "macro parameters must be comma-separated" +msgstr "macro-parameters moet door komma's gescheiden worden" + +#: macro.c:1396 +msgid "parameter name missing" +msgstr "parameternaam weggelaten" + +#: macro.c:1413 +msgid "anonymous variadic macros were introduced in C99" +msgstr "anonieme variadische macros werden door C99 ingevoerd" + +# variadic? " met variabele argumentenlijst" is nogal lang... +#: macro.c:1418 +msgid "ISO C does not permit named variadic macros" +msgstr "ISO C staat het gebruik benoemde variadische macro's niet toe" + +#: macro.c:1427 +msgid "missing ')' in macro parameter list" +msgstr "')' ontbreekt in lijst van macro-parameters" + +#: macro.c:1476 +msgid "'##' cannot appear at either end of a macro expansion" +msgstr "'##' mag niet voorkomen aan het begin of einde van een macro-expansie" + +#: macro.c:1510 +msgid "ISO C99 requires whitespace after the macro name" +msgstr "ISO C99 vereist witruimte na de macronaam" + +#: macro.c:1534 +msgid "missing whitespace after the macro name" +msgstr "witruimte ontbreekt na de macronaam" + +#: macro.c:1564 +msgid "'#' is not followed by a macro parameter" +msgstr "'#' wordt niet gevolgd door de naam van een macro-parameter" + +#: macro.c:1683 +#, c-format +msgid "\"%s\" redefined" +msgstr "\"%s\" opnieuw gedefinieerd" + +#: macro.c:1688 +msgid "this is the location of the previous definition" +msgstr "dit is de locatie van de eerdere definitie" + +#: macro.c:1738 +#, c-format +msgid "macro argument \"%s\" would be stringified in traditional C" +msgstr "macro-argument \"%s\" zou string gemaakt worden in traditionele C" + +#: macro.c:1761 +#, c-format +msgid "invalid hash type %d in cpp_macro_definition" +msgstr "ongeldig hashtype %d in cpp_macro_definition" + +#: pch.c:84 pch.c:332 pch.c:344 pch.c:362 pch.c:368 pch.c:377 +msgid "while writing precompiled header" +msgstr "bij het schrijven van een voorgecompileerde header" + +#: pch.c:485 +#, c-format +msgid "%s: not used because `%.*s' not defined" +msgstr "%s: niet gebruikt omdat \"%.*s\" niet gedefinieerd werd" + +#: pch.c:497 +#, c-format +msgid "%s: not used because `%.*s' defined as `%s' not `%.*s'" +msgstr "%s: niet gebruikt omdat \"%.*s\" als \"%s\" (en niet als \"%.*s\") gedefinieerd werd" + +#: pch.c:538 +#, c-format +msgid "%s: not used because `%s' is defined" +msgstr "%s: niet gebruikt omdat \"%s\" gedefinieerd is" + +#: pch.c:558 +#, c-format +msgid "%s: not used because `__COUNTER__' is invalid" +msgstr "%s: niet gebruikt omdat \"__COUNTER__\" ongeldig is" + +#: pch.c:567 pch.c:737 +msgid "while reading precompiled header" +msgstr "bij het lezen van een voorgecompileerde header" + +#: traditional.c:750 +#, c-format +msgid "detected recursion whilst expanding macro \"%s\"" +msgstr "recursie gedetecteerd bij uitbreiden van macro \"%s\"" + +#: traditional.c:917 +msgid "syntax error in macro parameter list" +msgstr "syntaxfout in lijst van macro-parameters" diff --git a/libcpp/po/rw.po b/libcpp/po/rw.po new file mode 100644 index 0000000..5bda060 --- /dev/null +++ b/libcpp/po/rw.po @@ -0,0 +1,18054 @@ +# Kinyarwanda translations for cpplib package. +# Copyright (C) 2005 Free Software Foundation, Inc. +# This file is distributed under the same license as the cpplib package. +# Steve Murphy , 2005. +# Steve performed initial rough translation from compendium built from translations provided by the following translators: +# Philibert Ndandali , 2005. +# Viateur MUGENZI , 2005. +# Noëlla Mupole , 2005. +# Carole Karema , 2005. +# JEAN BAPTISTE NGENDAHAYO , 2005. +# Augustin KIBERWA , 2005. +# Donatien NSENGIYUMVA , 2005. +# Antoine Bigirimana , 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: cpplib 3.3\n" +"Report-Msgid-Bugs-To: http://gcc.gnu.org/bugs.html\n" +"POT-Creation-Date: 2007-05-13 19:48-0700\n" +"PO-Revision-Date: 2005-04-04 10:55-0700\n" +"Last-Translator: Steven Michael Murphy \n" +"Language-Team: Kinyarwanda \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: charset.c:654 +#, fuzzy, c-format +msgid "conversion from %s to %s not supported by iconv" +msgstr "Ihindurangero Bivuye Kuri ni" + +#: charset.c:657 +msgid "iconv_open" +msgstr "" + +#: charset.c:665 +#, c-format +msgid "no iconv implementation, cannot convert from %s to %s" +msgstr "" + +#: charset.c:742 +#, c-format +msgid "character 0x%lx is not in the basic source character set\n" +msgstr "" + +#: charset.c:759 charset.c:1352 +msgid "converting to execution character set" +msgstr "" + +#: charset.c:765 +#, c-format +msgid "character 0x%lx is not unibyte in execution character set" +msgstr "" + +#: charset.c:889 +#, c-format +msgid "Character %x might not be NFKC" +msgstr "" + +#: charset.c:949 +#, fuzzy +msgid "universal character names are only valid in C++ and C99" +msgstr "Ky'isi yose Inyuguti Izina: OYA Byemewe in Ikiranga" + +#: charset.c:952 +#, fuzzy, c-format +msgid "the meaning of '\\%c' is different in traditional C" +msgstr "i Igisobanuro Bya ni in C" + +#: charset.c:961 +msgid "In _cpp_valid_ucn but not a UCN" +msgstr "" + +#: charset.c:986 +#, fuzzy, c-format +msgid "incomplete universal character name %.*s" +msgstr "Ky'isi yose Inyuguti Izina:" + +#: charset.c:998 +#, fuzzy, c-format +msgid "%.*s is not a valid universal character" +msgstr "`%T::%D'ni OYA a Byemewe" + +#: charset.c:1008 lex.c:472 +#, fuzzy +msgid "'$' in identifier or number" +msgstr "'$'Inyuguti S in Ikiranga Cyangwa Umubare" + +#: charset.c:1018 +#, fuzzy, c-format +msgid "universal character %.*s is not valid in an identifier" +msgstr "Ky'isi yose Inyuguti Izina: OYA Byemewe in Ikiranga" + +#: charset.c:1022 +#, fuzzy, c-format +msgid "universal character %.*s is not valid at the start of an identifier" +msgstr "Ky'isi yose Inyuguti Izina: OYA Byemewe in Ikiranga" + +#: charset.c:1056 charset.c:1571 +#, fuzzy +msgid "converting UCN to source character set" +msgstr "Guhindura.... Kuri Mweretsi Ubwoko" + +#: charset.c:1060 +#, fuzzy +msgid "converting UCN to execution character set" +msgstr "Guhindura.... Kuri Mweretsi Ubwoko" + +#: charset.c:1132 +#, fuzzy +msgid "the meaning of '\\x' is different in traditional C" +msgstr "i Igisobanuro Bya ni in C" + +#: charset.c:1149 +#, fuzzy +msgid "\\x used with no following hex digits" +msgstr "\\xNa: Oya" + +#: charset.c:1156 +#, fuzzy +msgid "hex escape sequence out of range" +msgstr "Inyuma Bya Urutonde" + +#: charset.c:1195 +#, fuzzy +msgid "octal escape sequence out of range" +msgstr "Inyuma Bya Urutonde" + +#: charset.c:1263 +#, fuzzy +msgid "the meaning of '\\a' is different in traditional C" +msgstr "i Igisobanuro Bya ni in C" + +#: charset.c:1270 +#, fuzzy, c-format +msgid "non-ISO-standard escape sequence, '\\%c'" +msgstr "Bisanzwe" + +#: charset.c:1278 +#, fuzzy, c-format +msgid "unknown escape sequence '\\%c'" +msgstr "Kitazwi" + +#: charset.c:1286 +#, fuzzy, c-format +msgid "unknown escape sequence: '\\%s'" +msgstr "Kitazwi" + +#: charset.c:1293 +#, fuzzy +msgid "converting escape sequence to execution character set" +msgstr "Inyuma Bya Urutonde" + +#: charset.c:1415 charset.c:1478 +#, fuzzy +msgid "character constant too long for its type" +msgstr "Inyuguti kugirango Ubwoko" + +#: charset.c:1418 +#, fuzzy +msgid "multi-character character constant" +msgstr "Inyuguti Inyuguti" + +#: charset.c:1510 +#, fuzzy +msgid "empty character constant" +msgstr "ubusa Inyuguti" + +#: charset.c:1612 +#, fuzzy, c-format +msgid "failure to convert %s to %s" +msgstr "OYA GUHINDURA Kuri" + +#: directives.c:214 directives.c:240 +#, fuzzy, c-format +msgid "extra tokens at end of #%s directive" +msgstr "Birenga ku Impera Bya" + +#: directives.c:343 +#, fuzzy, c-format +msgid "#%s is a GCC extension" +msgstr "#%sni a Umugereka" + +#: directives.c:355 +#, fuzzy +msgid "suggest not using #elif in traditional C" +msgstr "OYA ikoresha in C" + +#: directives.c:358 +#, fuzzy, c-format +msgid "traditional C ignores #%s with the # indented" +msgstr "C Na: i hariho marije" + +#: directives.c:362 +#, fuzzy, c-format +msgid "suggest hiding #%s from traditional C with an indented #" +msgstr "Bivuye C Na: hariho marije" + +#: directives.c:388 +#, fuzzy +msgid "embedding a directive within macro arguments is not portable" +msgstr "a muri Makoro ingingo ni OYA" + +#: directives.c:408 +#, fuzzy +msgid "style of line directive is a GCC extension" +msgstr "IMISUSIRE Bya Umurongo ni a Umugereka" + +#: directives.c:458 +#, fuzzy, c-format +msgid "invalid preprocessing directive #%s" +msgstr "Sibyo" + +#: directives.c:524 +#, fuzzy +msgid "\"defined\" cannot be used as a macro name" +msgstr "\"Nka a Makoro Izina:" + +#: directives.c:530 +#, fuzzy, c-format +msgid "\"%s\" cannot be used as a macro name as it is an operator in C++" +msgstr "\"%s\"Nka a Makoro Izina: Nka ni Mukoresha in C" + +#: directives.c:533 +#, fuzzy, c-format +msgid "no macro name given in #%s directive" +msgstr "Oya Makoro Izina: in" + +#: directives.c:536 +#, fuzzy +msgid "macro names must be identifiers" +msgstr "Makoro Amazina" + +#: directives.c:577 +#, c-format +msgid "undefining \"%s\"" +msgstr "" + +#: directives.c:632 +#, fuzzy +msgid "missing terminating > character" +msgstr "Ibuze Inyuguti" + +#: directives.c:687 +#, fuzzy, c-format +msgid "#%s expects \"FILENAME\" or " +msgstr "#%sCyangwa" + +#: directives.c:727 +#, fuzzy, c-format +msgid "empty filename in #%s" +msgstr "ubusa IDOSIYE Izina: in" + +#: directives.c:737 +#, fuzzy +msgid "#include nested too deeply" +msgstr "#Gushyiramo" + +#: directives.c:778 +#, fuzzy +msgid "#include_next in primary source file" +msgstr "#in Inkomoko IDOSIYE" + +#: directives.c:804 +#, fuzzy, c-format +msgid "invalid flag \"%s\" in line directive" +msgstr "Sibyo Ibendera in Umurongo" + +#: directives.c:856 +#, fuzzy, c-format +msgid "\"%s\" after #line is not a positive integer" +msgstr "\"%s\"Nyuma Umurongo ni OYA a Umubare wuzuye" + +#: directives.c:862 +#, fuzzy +msgid "line number out of range" +msgstr "Umurongo Umubare Inyuma Bya Urutonde" + +#: directives.c:875 directives.c:952 +#, fuzzy, c-format +msgid "\"%s\" is not a valid filename" +msgstr "\"%s\"ni OYA a Byemewe Izina ry'idosiye:" + +#: directives.c:912 +#, fuzzy, c-format +msgid "\"%s\" after # is not a positive integer" +msgstr "\"%s\"Nyuma ni OYA a Umubare wuzuye" + +#: directives.c:1014 +#, fuzzy, c-format +msgid "invalid #%s directive" +msgstr "Sibyo" + +#: directives.c:1077 +#, c-format +msgid "registering pragmas in namespace \"%s\" with mismatched name expansion" +msgstr "" + +#: directives.c:1086 +#, fuzzy, c-format +msgid "registering pragma \"%s\" with name expansion and no namespace" +msgstr "Nka Byombi a Na a" + +#: directives.c:1104 +#, fuzzy, c-format +msgid "registering \"%s\" as both a pragma and a pragma namespace" +msgstr "Nka Byombi a Na a" + +#: directives.c:1107 +#, fuzzy, c-format +msgid "#pragma %s %s is already registered" +msgstr "#ni" + +#: directives.c:1110 +#, fuzzy, c-format +msgid "#pragma %s is already registered" +msgstr "#ni" + +#: directives.c:1140 +msgid "registering pragma with NULL handler" +msgstr "" + +#: directives.c:1350 +#, fuzzy +msgid "#pragma once in main file" +msgstr "#Rimwe in IDOSIYE" + +#: directives.c:1373 +#, fuzzy +msgid "invalid #pragma GCC poison directive" +msgstr "Sibyo" + +#: directives.c:1382 +#, fuzzy, c-format +msgid "poisoning existing macro \"%s\"" +msgstr "Makoro" + +#: directives.c:1403 +#, fuzzy +msgid "#pragma system_header ignored outside include file" +msgstr "#Hanze Gushyiramo IDOSIYE" + +#: directives.c:1427 +#, fuzzy, c-format +msgid "cannot find source file %s" +msgstr "Gushaka Inkomoko" + +#: directives.c:1431 +#, fuzzy, c-format +msgid "current file is older than %s" +msgstr "KIGEZWEHO IDOSIYE ni" + +#: directives.c:1599 +#, fuzzy +msgid "_Pragma takes a parenthesized string literal" +msgstr "a Ikurikiranyanyuguti" + +#: directives.c:1671 +#, fuzzy +msgid "#else without #if" +msgstr "#Ikindi NIBA" + +#: directives.c:1676 +#, fuzzy +msgid "#else after #else" +msgstr "#Ikindi Nyuma Ikindi" + +#: directives.c:1678 directives.c:1711 +#, fuzzy +msgid "the conditional began here" +msgstr "i" + +#: directives.c:1704 +#, fuzzy +msgid "#elif without #if" +msgstr "#NIBA" + +#: directives.c:1709 +#, fuzzy +msgid "#elif after #else" +msgstr "#Nyuma Ikindi" + +#: directives.c:1739 +#, fuzzy +msgid "#endif without #if" +msgstr "#NIBA" + +#: directives.c:1816 +#, fuzzy +msgid "missing '(' after predicate" +msgstr "Ibuze Nyuma" + +#: directives.c:1831 +#, fuzzy +msgid "missing ')' to complete answer" +msgstr "Ibuze Kuri Byuzuye" + +#: directives.c:1851 +#, fuzzy +msgid "predicate's answer is empty" +msgstr "ni ubusa" + +#: directives.c:1878 +msgid "assertion without predicate" +msgstr "" + +#: directives.c:1880 +#, fuzzy +msgid "predicate must be an identifier" +msgstr "Ikiranga" + +#: directives.c:1966 +#, c-format +msgid "\"%s\" re-asserted" +msgstr "" + +#: directives.c:2190 +#, c-format +msgid "unterminated #%s" +msgstr "" + +#: errors.c:118 +#, fuzzy +msgid "warning: " +msgstr "Iburira!" + +#: errors.c:120 +#, fuzzy +msgid "internal error: " +msgstr "Ikosa ry'imbere" + +#: errors.c:122 +#, fuzzy +msgid "error: " +msgstr "Ikosa ry'imbere" + +#: errors.c:186 +msgid "stdout" +msgstr "" + +# desktop/source\app\ssodlg.src:DLG_SSOLOGIN.text +#: errors.c:188 +#, fuzzy, c-format +msgid "%s: %s" +msgstr "%s:%s" + +#: expr.c:203 +#, fuzzy +msgid "too many decimal points in number" +msgstr "NYACUMI Utudomo in Umubare" + +#: expr.c:223 +#, fuzzy, c-format +msgid "invalid digit \"%c\" in octal constant" +msgstr "Sibyo in" + +#: expr.c:229 +#, fuzzy +msgid "use of C99 hexadecimal floating constant" +msgstr "Gukoresha Bya Bihindagurika" + +#: expr.c:238 +#, fuzzy +msgid "exponent has no digits" +msgstr "Oya" + +#: expr.c:245 +#, fuzzy +msgid "hexadecimal floating constants require an exponent" +msgstr "Bihindagurika" + +#: expr.c:251 +#, fuzzy, c-format +msgid "invalid suffix \"%.*s\" on floating constant" +msgstr "Sibyo Ingereka S ku Bihindagurika" + +#: expr.c:261 expr.c:295 +#, fuzzy, c-format +msgid "traditional C rejects the \"%.*s\" suffix" +msgstr "C i S Ingereka" + +#: expr.c:268 +#, fuzzy, c-format +msgid "invalid suffix \"%.*s\" with hexadecimal floating constant" +msgstr "Sibyo Ingereka S ku Bihindagurika" + +#: expr.c:281 +#, fuzzy, c-format +msgid "invalid suffix \"%.*s\" on integer constant" +msgstr "Sibyo Ingereka S ku Umubare wuzuye" + +#: expr.c:303 +#, fuzzy +msgid "use of C99 long long integer constant" +msgstr "Gukoresha Bya Umubare wuzuye" + +#: expr.c:310 +#, fuzzy +msgid "imaginary constants are a GCC extension" +msgstr "NYURABWENGE a Umugereka" + +#: expr.c:396 +#, fuzzy +msgid "integer constant is too large for its type" +msgstr "Umubare wuzuye ni Binini kugirango Ubwoko" + +#: expr.c:408 +#, fuzzy +msgid "integer constant is so large that it is unsigned" +msgstr "Umubare wuzuye ni Binini ni Bitashizweho umukono" + +#: expr.c:490 +#, fuzzy +msgid "missing ')' after \"defined\"" +msgstr "Ibuze Nyuma" + +#: expr.c:497 +#, fuzzy +msgid "operator \"defined\" requires an identifier" +msgstr "Mukoresha Ikiranga" + +#: expr.c:505 +#, fuzzy, c-format +msgid "(\"%s\" is an alternative token for \"%s\" in C++)" +msgstr "(\"%s\"ni kugirango in C" + +#: expr.c:515 +#, fuzzy +msgid "this use of \"defined\" may not be portable" +msgstr "iyi Gukoresha Bya Gicurasi OYA" + +#: expr.c:554 +#, fuzzy +msgid "floating constant in preprocessor expression" +msgstr "Bihindagurika in imvugo" + +#: expr.c:560 +#, fuzzy +msgid "imaginary number in preprocessor expression" +msgstr "NYURABWENGE Umubare in imvugo" + +#: expr.c:605 +#, fuzzy, c-format +msgid "\"%s\" is not defined" +msgstr "\"%s\"ni OYA" + +#: expr.c:733 expr.c:762 +#, fuzzy, c-format +msgid "missing binary operator before token \"%s\"" +msgstr "Ibuze Nyabibiri Mukoresha Mbere" + +#: expr.c:753 +#, fuzzy, c-format +msgid "token \"%s\" is not valid in preprocessor expressions" +msgstr "ni OYA Byemewe in" + +#: expr.c:770 +#, fuzzy +msgid "missing expression between '(' and ')'" +msgstr "imvugo hagati Na" + +#: expr.c:773 +#, fuzzy +msgid "#if with no expression" +msgstr "#NIBA Na: Oya imvugo" + +#: expr.c:776 +#, fuzzy, c-format +msgid "operator '%s' has no right operand" +msgstr "Mukoresha Oya Iburyo:" + +#: expr.c:781 +#, fuzzy, c-format +msgid "operator '%s' has no left operand" +msgstr "Mukoresha Oya Iburyo:" + +#: expr.c:807 +msgid " ':' without preceding '?'" +msgstr "" + +#: expr.c:834 +#, fuzzy +msgid "unbalanced stack in #if" +msgstr "in NIBA" + +#: expr.c:853 +#, fuzzy, c-format +msgid "impossible operator '%u'" +msgstr "Mukoresha" + +#: expr.c:943 +#, fuzzy +msgid "missing ')' in expression" +msgstr "Ibuze in imvugo" + +#: expr.c:964 +#, fuzzy +msgid "'?' without following ':'" +msgstr "" +"''Project- Id- Version: basctl\n" +"POT- Creation- Date: 2003- 12- 07 17: 13+ 02\n" +"PO- Revision- Date: 2004- 11- 04 10: 13- 0700\n" +"Last- Translator: Language- Team:< en@ li. org> MIME- Version: 1. 0\n" +"Content- Type: text/ plain; charset= UTF- 8\n" +"Content- Transfer- Encoding: 8bit\n" +"X- Generator: KBabel 1. 0\n" +"." + +#: expr.c:974 +#, fuzzy +msgid "integer overflow in preprocessor expression" +msgstr "Umubare wuzuye Byarenze urugero in imvugo" + +#: expr.c:979 +#, fuzzy +msgid "missing '(' in expression" +msgstr "Ibuze in imvugo" + +#: expr.c:1011 +#, fuzzy, c-format +msgid "the left operand of \"%s\" changes sign when promoted" +msgstr "i Ibumoso: Bya Amahinduka IKIMENYETSO Ryari:" + +#: expr.c:1016 +#, fuzzy, c-format +msgid "the right operand of \"%s\" changes sign when promoted" +msgstr "i Iburyo: Bya Amahinduka IKIMENYETSO Ryari:" + +#: expr.c:1275 +#, fuzzy +msgid "traditional C rejects the unary plus operator" +msgstr "C i Guteranya Mukoresha" + +#: expr.c:1358 +#, fuzzy +msgid "comma operator in operand of #if" +msgstr "Akitso Mukoresha in Bya NIBA" + +#: expr.c:1490 +#, fuzzy +msgid "division by zero in #if" +msgstr "ku Zeru in NIBA" + +#: files.c:402 +msgid "NULL directory in find_file" +msgstr "" + +#: files.c:440 +msgid "one or more PCH files were found, but they were invalid" +msgstr "" + +#: files.c:443 +msgid "use -Winvalid-pch for more information" +msgstr "" + +#: files.c:501 +#, fuzzy, c-format +msgid "%s is a block device" +msgstr "%sni a Funga APAREYE" + +#: files.c:518 +#, fuzzy, c-format +msgid "%s is too large" +msgstr "%sni Binini" + +#: files.c:553 +#, fuzzy, c-format +msgid "%s is shorter than expected" +msgstr "%sni Ikitezwe:" + +#: files.c:782 +#, fuzzy, c-format +msgid "no include path in which to search for %s" +msgstr "Oya Gushyiramo Inzira in Kuri Gushaka" + +#: files.c:1071 +#, fuzzy +msgid "Multiple include guards may be useful for:\n" +msgstr "Gushyiramo Gicurasi kugirango" + +#: init.c:407 +#, fuzzy +msgid "cppchar_t must be an unsigned type" +msgstr "Bitashizweho umukono Ubwoko" + +#: init.c:411 +#, fuzzy, c-format +msgid "preprocessor arithmetic has maximum precision of %lu bits; target requires %lu bits" +msgstr "Kinini Bya Intego" + +#: init.c:418 +#, fuzzy +msgid "CPP arithmetic must be at least as precise as a target int" +msgstr "ku Nka Nka a Intego INT" + +#: init.c:421 +#, fuzzy +msgid "target char is less than 8 bits wide" +msgstr "Intego INYUGUTI ni Birutwa 8" + +#: init.c:425 +#, fuzzy +msgid "target wchar_t is narrower than target char" +msgstr "Intego ni Intego INYUGUTI" + +#: init.c:429 +#, fuzzy +msgid "target int is narrower than target char" +msgstr "Intego INT ni Intego INYUGUTI" + +#: init.c:434 +#, fuzzy +msgid "CPP half-integer narrower than CPP character" +msgstr "Umubare wuzuye Inyuguti" + +#: init.c:438 +#, fuzzy, c-format +msgid "CPP on this host cannot handle wide character constants over %lu bits, but the target requires %lu bits" +msgstr "ku iyi Ubuturo Inyuguti KURI i Intego" + +#: lex.c:271 +#, fuzzy +msgid "backslash and newline separated by space" +msgstr "Na ku Umwanya" + +#: lex.c:276 +#, fuzzy +msgid "backslash-newline at end of file" +msgstr "ku Impera Bya IDOSIYE" + +#: lex.c:291 +#, fuzzy, c-format +msgid "trigraph ??%c converted to %c" +msgstr "" +"Project- Id- Version: basctl\n" +"POT- Creation- Date: 2003- 12- 07 17: 13+ 02\n" +"PO- Revision- Date: 2004- 11- 04 10: 13- 0700\n" +"Last- Translator: Language- Team:< en@ li. org> MIME- Version: 1. 0\n" +"Content- Type: text/ plain; charset= UTF- 8\n" +"Content- Transfer- Encoding: 8bit\n" +"X- Generator: KBabel 1. 0\n" +"." + +#: lex.c:298 +#, fuzzy, c-format +msgid "trigraph ??%c ignored, use -trigraphs to enable" +msgstr "" +"Project- Id- Version: basctl\n" +"POT- Creation- Date: 2003- 12- 07 17: 13+ 02\n" +"PO- Revision- Date: 2004- 11- 04 10: 13- 0700\n" +"Last- Translator: Language- Team:< en@ li. org> MIME- Version: 1. 0\n" +"Content- Type: text/ plain; charset= UTF- 8\n" +"Content- Transfer- Encoding: 8bit\n" +"X- Generator: KBabel 1. 0\n" +"." + +#: lex.c:344 +#, fuzzy +msgid "\"/*\" within comment" +msgstr "\"/*\"muri Icyo wongeraho" + +#: lex.c:402 +#, fuzzy, c-format +msgid "%s in preprocessing directive" +msgstr "%sin" + +#: lex.c:411 +#, fuzzy +msgid "null character(s) ignored" +msgstr "NTAGIHARI Inyuguti S" + +#: lex.c:448 +#, fuzzy, c-format +msgid "`%.*s' is not in NFKC" +msgstr "\"%s\"ni OYA" + +#: lex.c:451 +#, fuzzy, c-format +msgid "`%.*s' is not in NFC" +msgstr "\"%s\"ni OYA" + +#: lex.c:539 +#, fuzzy, c-format +msgid "attempt to use poisoned \"%s\"" +msgstr "Kuri Gukoresha" + +#: lex.c:547 +#, fuzzy +msgid "__VA_ARGS__ can only appear in the expansion of a C99 variadic macro" +msgstr "_Kugaragara in i Bya a Makoro" + +#: lex.c:647 +#, fuzzy +msgid "null character(s) preserved in literal" +msgstr "NTAGIHARI Inyuguti S in" + +#: lex.c:650 +#, fuzzy, c-format +msgid "missing terminating %c character" +msgstr "Ibuze Inyuguti" + +#: lex.c:842 +#, fuzzy +msgid "no newline at end of file" +msgstr "Oya ku Impera Bya IDOSIYE" + +#: lex.c:1002 traditional.c:162 +#, fuzzy +msgid "unterminated comment" +msgstr "Icyo wongeraho" + +#: lex.c:1013 +#, fuzzy +msgid "C++ style comments are not allowed in ISO C90" +msgstr "C IMISUSIRE Ibisobanuro OYA in" + +#: lex.c:1015 +#, fuzzy +msgid "(this will be reported only once per input file)" +msgstr "(iyi Rimwe Iyinjiza IDOSIYE" + +#: lex.c:1020 +#, fuzzy +msgid "multi-line comment" +msgstr "Umurongo Icyo wongeraho" + +#: lex.c:1333 +#, c-format +msgid "unspellable token %s" +msgstr "" + +#: line-map.c:313 +#, fuzzy, c-format +msgid "In file included from %s:%u" +msgstr "IDOSIYE Bivuye" + +#: line-map.c:331 +#, fuzzy, c-format +msgid "" +",\n" +" from %s:%u" +msgstr ",Bivuye" + +#: macro.c:83 +#, fuzzy, c-format +msgid "macro \"%s\" is not used" +msgstr "Makoro ni OYA" + +#: macro.c:122 macro.c:312 +#, fuzzy, c-format +msgid "invalid built-in macro \"%s\"" +msgstr "Sibyo in Makoro" + +#: macro.c:156 +#, fuzzy +msgid "could not determine file timestamp" +msgstr "OYA Itariki Na Igihe" + +#: macro.c:253 +#, fuzzy +msgid "could not determine date and time" +msgstr "OYA Itariki Na Igihe" + +#: macro.c:416 +#, fuzzy +msgid "invalid string literal, ignoring final '\\'" +msgstr "Sibyo Ikurikiranyanyuguti" + +#: macro.c:466 +#, fuzzy, c-format +msgid "pasting \"%s\" and \"%s\" does not give a valid preprocessing token" +msgstr "Na OYA a Byemewe" + +#: macro.c:538 +#, fuzzy +msgid "ISO C99 requires rest arguments to be used" +msgstr "ingingo Kuri" + +#: macro.c:543 +#, fuzzy, c-format +msgid "macro \"%s\" requires %u arguments, but only %u given" +msgstr "Makoro ingingo" + +#: macro.c:548 +#, fuzzy, c-format +msgid "macro \"%s\" passed %u arguments, but takes just %u" +msgstr "Makoro ingingo" + +#: macro.c:659 traditional.c:675 +#, fuzzy, c-format +msgid "unterminated argument list invoking macro \"%s\"" +msgstr "Urutonde Makoro" + +#: macro.c:762 +#, fuzzy, c-format +msgid "function-like macro \"%s\" must be used with arguments in traditional C" +msgstr "Umumaro nka Makoro Na: ingingo in C" + +#: macro.c:1278 +#, fuzzy, c-format +msgid "duplicate macro parameter \"%s\"" +msgstr "Gusubiramo Makoro" + +#: macro.c:1324 +#, fuzzy, c-format +msgid "\"%s\" may not appear in macro parameter list" +msgstr "\"%s\"Gicurasi OYA Kugaragara in Makoro Urutonde" + +#: macro.c:1332 +#, fuzzy +msgid "macro parameters must be comma-separated" +msgstr "Makoro Ibigenga Akitso" + +#: macro.c:1349 +#, fuzzy +msgid "parameter name missing" +msgstr "Izina: Ibuze" + +#: macro.c:1366 +#, fuzzy +msgid "anonymous variadic macros were introduced in C99" +msgstr "Makoro in" + +#: macro.c:1371 +#, fuzzy +msgid "ISO C does not permit named variadic macros" +msgstr "C OYA Makoro" + +#: macro.c:1380 +#, fuzzy +msgid "missing ')' in macro parameter list" +msgstr "Ibuze in Makoro Urutonde" + +#: macro.c:1458 +#, fuzzy +msgid "ISO C99 requires whitespace after the macro name" +msgstr "C Nyuma i Makoro Izina:" + +#: macro.c:1482 +#, fuzzy +msgid "missing whitespace after the macro name" +msgstr "C Nyuma i Makoro Izina:" + +#: macro.c:1512 +#, fuzzy +msgid "'#' is not followed by a macro parameter" +msgstr "'#'ni OYA ku a Makoro" + +#: macro.c:1531 +#, fuzzy +msgid "'##' cannot appear at either end of a macro expansion" +msgstr "'##'Kugaragara ku Impera Bya a Makoro" + +#: macro.c:1629 +#, c-format +msgid "\"%s\" redefined" +msgstr "" + +#: macro.c:1634 +#, fuzzy +msgid "this is the location of the previous definition" +msgstr "iyi ni i Ahantu Bya i Ibanjirije Insobanuro" + +#: macro.c:1684 +#, fuzzy, c-format +msgid "macro argument \"%s\" would be stringified in traditional C" +msgstr "Makoro in C" + +#: macro.c:1707 +#, fuzzy, c-format +msgid "invalid hash type %d in cpp_macro_definition" +msgstr "Sibyo Ubwoko in" + +#: pch.c:84 pch.c:332 pch.c:354 pch.c:360 +msgid "while writing precompiled header" +msgstr "" + +#: pch.c:467 +#, fuzzy, c-format +msgid "%s: not used because `%.*s' not defined" +msgstr "Akarango OYA" + +#: pch.c:479 +#, c-format +msgid "%s: not used because `%.*s' defined as `%s' not `%.*s'" +msgstr "" + +#: pch.c:520 +#, fuzzy, c-format +msgid "%s: not used because `%s' is defined" +msgstr "`%s'Nta narimwe" + +#: pch.c:533 pch.c:696 +msgid "while reading precompiled header" +msgstr "" + +#: traditional.c:745 +#, fuzzy, c-format +msgid "detected recursion whilst expanding macro \"%s\"" +msgstr "Makoro" + +#: traditional.c:912 +#, fuzzy +msgid "syntax error in macro parameter list" +msgstr "\"%s\"Gicurasi OYA Kugaragara in Makoro Urutonde" + +#, fuzzy +#~ msgid "`%s' attribute directive ignored" +#~ msgstr "`%s'Ikiranga" + +#, fuzzy +#~ msgid "wrong number of arguments specified for `%s' attribute" +#~ msgstr "Umubare Bya ingingo kugirango Ikiranga" + +#, fuzzy +#~ msgid "`%s' attribute does not apply to types" +#~ msgstr "`%s'Ikiranga OYA Gukurikiza Kuri" + +#, fuzzy +#~ msgid "`%s' attribute only applies to function types" +#~ msgstr "`%s'Ikiranga Kuri Umumaro" + +#, fuzzy +#~ msgid "`%s' attribute ignored" +#~ msgstr "`%s'Ikiranga" + +#, fuzzy +#~ msgid "offset outside bounds of constant string" +#~ msgstr "Nta- boneza Hanze Bya Ikurikiranyanyuguti" + +#, fuzzy +#~ msgid "second arg to `__builtin_prefetch' must be a constant" +#~ msgstr "ISEGONDA Kuri a" + +#, fuzzy +#~ msgid "invalid second arg to __builtin_prefetch; using zero" +#~ msgstr "Sibyo ISEGONDA Kuri ikoresha Zeru" + +#, fuzzy +#~ msgid "third arg to `__builtin_prefetch' must be a constant" +#~ msgstr "Kuri a" + +#, fuzzy +#~ msgid "invalid third arg to __builtin_prefetch; using zero" +#~ msgstr "Sibyo Kuri ikoresha Zeru" + +#, fuzzy +#~ msgid "__builtin_saveregs not supported by this target" +#~ msgstr "_OYA ku iyi Intego" + +#, fuzzy +#~ msgid "argument of `__builtin_args_info' must be constant" +#~ msgstr "Bya" + +#, fuzzy +#~ msgid "argument of `__builtin_args_info' out of range" +#~ msgstr "Bya Inyuma Bya Urutonde" + +#, fuzzy +#~ msgid "missing argument in `__builtin_args_info'" +#~ msgstr "Ibuze in" + +#, fuzzy +#~ msgid "`va_start' used in function with fixed args" +#~ msgstr "`in Umumaro Na: BIHAMYE" + +#, fuzzy +#~ msgid "second parameter of `va_start' not last named argument" +#~ msgstr "ISEGONDA Bya OYA Iheruka" + +#, fuzzy +#~ msgid "too many arguments to function `va_start'" +#~ msgstr "ingingo Kuri Umumaro" + +#, fuzzy +#~ msgid "first argument to `va_arg' not of type `va_list'" +#~ msgstr "Itangira Kuri OYA Bya Ubwoko" + +#, fuzzy +#~ msgid "`%s' is promoted to `%s' when passed through `...'" +#~ msgstr "`%s'ni Kuri Ryari: Gihinguranya" + +#, fuzzy +#~ msgid "(so you should pass `%s' not `%s' to `va_arg')" +#~ msgstr "(OYA Kuri" + +#, fuzzy +#~ msgid "invalid arg to `__builtin_frame_address'" +#~ msgstr "Sibyo Kuri" + +#, fuzzy +#~ msgid "invalid arg to `__builtin_return_address'" +#~ msgstr "Sibyo Kuri" + +#, fuzzy +#~ msgid "unsupported arg to `__builtin_frame_address'" +#~ msgstr "Kuri" + +#, fuzzy +#~ msgid "unsupported arg to `__builtin_return_address'" +#~ msgstr "Kuri" + +#, fuzzy +#~ msgid "second arg to `__builtin_expect' must be a constant" +#~ msgstr "ISEGONDA Kuri a" + +#, fuzzy +#~ msgid "__builtin_longjmp second argument must be 1" +#~ msgstr "_ISEGONDA 1." + +#, fuzzy +#~ msgid "built-in function `%s' not currently supported" +#~ msgstr "in Umumaro OYA" + +#, fuzzy +#~ msgid "target format does not support infinity" +#~ msgstr "Intego Imiterere OYA Gushigikira Bidashira" + +#, fuzzy +#~ msgid "`%s' is not defined outside of function scope" +#~ msgstr "`%s'ni OYA Hanze Bya Umumaro Ingano:" + +#, fuzzy +#~ msgid "string length `%d' is greater than the length `%d' ISO C%d compilers are required to support" +#~ msgstr "Ikurikiranyanyuguti Uburebure ni Biruta i Uburebure C Bya ngombwa Kuri Gushigikira" + +#, fuzzy +#~ msgid "concatenation of string literals with __FUNCTION__ is deprecated" +#~ msgstr "Bya Ikurikiranyanyuguti Na: ni Bitemewe." + +#, fuzzy +#~ msgid "overflow in constant expression" +#~ msgstr "Byarenze urugero in imvugo" + +#, fuzzy +#~ msgid "integer overflow in expression" +#~ msgstr "Umubare wuzuye Byarenze urugero in imvugo" + +#, fuzzy +#~ msgid "floating point overflow in expression" +#~ msgstr "Bihindagurika Akadomo Byarenze urugero in imvugo" + +#, fuzzy +#~ msgid "vector overflow in expression" +#~ msgstr "Byarenze urugero in imvugo" + +#, fuzzy +#~ msgid "large integer implicitly truncated to unsigned type" +#~ msgstr "Binini Umubare wuzuye Kuri Bitashizweho umukono Ubwoko" + +#, fuzzy +#~ msgid "negative integer implicitly converted to unsigned type" +#~ msgstr "Umubare wuzuye Kuri Bitashizweho umukono Ubwoko" + +#, fuzzy +#~ msgid "overflow in implicit constant conversion" +#~ msgstr "Byarenze urugero in Ihindurangero" + +#, fuzzy +#~ msgid "operation on `%s' may be undefined" +#~ msgstr "ku Gicurasi kidasobanuye" + +#, fuzzy +#~ msgid "expression statement has incomplete type" +#~ msgstr "imvugo Inyandiko Ubwoko" + +#, fuzzy +#~ msgid "case label does not reduce to an integer constant" +#~ msgstr "Akarango OYA Kuri Umubare wuzuye" + +#, fuzzy +#~ msgid "invalid truth-value expression" +#~ msgstr "Sibyo Agaciro imvugo" + +#, fuzzy +#~ msgid "invalid operands to binary %s" +#~ msgstr "Sibyo Kuri Nyabibiri" + +#, fuzzy +#~ msgid "comparison is always false due to limited range of data type" +#~ msgstr "ni Buri gihe SIBYO Kuri Urutonde Bya Ibyatanzwe Ubwoko" + +#, fuzzy +#~ msgid "comparison is always true due to limited range of data type" +#~ msgstr "ni Buri gihe NIBYO Kuri Urutonde Bya Ibyatanzwe Ubwoko" + +#, fuzzy +#~ msgid "comparison of unsigned expression >= 0 is always true" +#~ msgstr "Bya Bitashizweho umukono imvugo 0 ni Buri gihe NIBYO" + +#, fuzzy +#~ msgid "comparison of unsigned expression < 0 is always false" +#~ msgstr "Bya Bitashizweho umukono imvugo 0 ni Buri gihe SIBYO" + +#, fuzzy +#~ msgid "pointer of type `void *' used in arithmetic" +#~ msgstr "Mweretsi Bya Ubwoko in" + +#, fuzzy +#~ msgid "pointer to a function used in arithmetic" +#~ msgstr "Mweretsi Kuri a Umumaro in" + +#, fuzzy +#~ msgid "pointer to member function used in arithmetic" +#~ msgstr "Mweretsi Kuri Umumaro in" + +#, fuzzy +#~ msgid "pointer to a member used in arithmetic" +#~ msgstr "Mweretsi Kuri a in" + +#, fuzzy +#~ msgid "struct type value used where scalar is required" +#~ msgstr "Ubwoko Agaciro ni Bya ngombwa" + +#, fuzzy +#~ msgid "union type value used where scalar is required" +#~ msgstr "Ihuza Ubwoko Agaciro ni Bya ngombwa" + +#, fuzzy +#~ msgid "array type value used where scalar is required" +#~ msgstr "Imbonerahamwe Ubwoko Agaciro ni Bya ngombwa" + +#, fuzzy +#~ msgid "suggest parentheses around assignment used as truth value" +#~ msgstr "Igenera Nka Agaciro" + +#, fuzzy +#~ msgid "invalid use of `restrict'" +#~ msgstr "Sibyo Gukoresha Bya" + +#, fuzzy +#~ msgid "invalid application of `sizeof' to a function type" +#~ msgstr "Sibyo Porogaramu Bya Kuri a Umumaro Ubwoko" + +#, fuzzy +#~ msgid "invalid application of `%s' to a void type" +#~ msgstr "Sibyo Porogaramu Bya Kuri a Ubwoko" + +#, fuzzy +#~ msgid "invalid application of `%s' to an incomplete type" +#~ msgstr "Sibyo Porogaramu Bya Kuri Ubwoko" + +#, fuzzy +#~ msgid "`__alignof' applied to a bit-field" +#~ msgstr "`_Byashyizweho Kuri a Umwanya" + +#, fuzzy +#~ msgid "cannot disable built-in function `%s'" +#~ msgstr "in Umumaro" + +#, fuzzy +#~ msgid "too few arguments to function `%s'" +#~ msgstr "ingingo Kuri Umumaro" + +#, fuzzy +#~ msgid "too many arguments to function `%s'" +#~ msgstr "ingingo Kuri Umumaro" + +#, fuzzy +#~ msgid "non-floating-point argument to function `%s'" +#~ msgstr "Bihindagurika Akadomo Kuri Umumaro" + +#, fuzzy +#~ msgid "pointers are not permitted as case values" +#~ msgstr "OYA Nka Uduciro" + +#, fuzzy +#~ msgid "ISO C++ forbids range expressions in switch statements" +#~ msgstr "C Urutonde in Hindura" + +#, fuzzy +#~ msgid "ISO C forbids range expressions in switch statements" +#~ msgstr "C Urutonde in Hindura" + +#, fuzzy +#~ msgid "empty range specified" +#~ msgstr "ubusa Urutonde" + +#, fuzzy +#~ msgid "duplicate (or overlapping) case value" +#~ msgstr "Gusubiramo Cyangwa iyorosa Agaciro" + +#, fuzzy +#~ msgid "this is the first entry overlapping that value" +#~ msgstr "iyi ni i Itangira Icyinjijwe iyorosa Agaciro" + +#, fuzzy +#~ msgid "duplicate case value" +#~ msgstr "Gusubiramo Agaciro" + +#, fuzzy +#~ msgid "multiple default labels in one switch" +#~ msgstr "Igikubo Mburabuzi Uturango... in Hindura" + +#, fuzzy +#~ msgid "this is the first default label" +#~ msgstr "iyi ni i Itangira Mburabuzi Akarango" + +#, fuzzy +#~ msgid "ISO C++ forbids taking the address of a label" +#~ msgstr "C i Aderesi Bya a Akarango" + +#, fuzzy +#~ msgid "ISO C forbids taking the address of a label" +#~ msgstr "C i Aderesi Bya a Akarango" + +#, fuzzy +#~ msgid "declaration of `%s' shadows %s" +#~ msgstr "Bya" + +#, fuzzy +#~ msgid "unknown machine mode `%s'" +#~ msgstr "Kitazwi Ubwoko" + +#, fuzzy +#~ msgid "no data type for mode `%s'" +#~ msgstr "Oya Ibyatanzwe Ubwoko kugirango Ubwoko" + +#, fuzzy +#~ msgid "unable to emulate '%s'" +#~ msgstr "Kuri" + +#, fuzzy +#~ msgid "section attribute cannot be specified for local variables" +#~ msgstr "Icyiciro Ikiranga kugirango Ibihinduka" + +#, fuzzy +#~ msgid "section of `%s' conflicts with previous declaration" +#~ msgstr "Icyiciro Bya Na: Ibanjirije" + +#, fuzzy +#~ msgid "section attribute not allowed for `%s'" +#~ msgstr "Icyiciro Ikiranga OYA kugirango" + +#, fuzzy +#~ msgid "section attributes are not supported for this target" +#~ msgstr "Icyiciro Ibiranga OYA kugirango iyi Intego" + +#, fuzzy +#~ msgid "requested alignment is not a constant" +#~ msgstr "Itunganya ni OYA a" + +#, fuzzy +#~ msgid "requested alignment is not a power of 2" +#~ msgstr "Itunganya ni OYA a UMWIKUBE Bya 2." + +#, fuzzy +#~ msgid "requested alignment is too large" +#~ msgstr "Itunganya ni Binini" + +#, fuzzy +#~ msgid "alignment may not be specified for `%s'" +#~ msgstr "Itunganya Gicurasi OYA kugirango" + +#, fuzzy +#~ msgid "`%s' defined both normally and as an alias" +#~ msgstr "`%s'Byombi Na Nka Irihimbano" + +#, fuzzy +#~ msgid "alias arg not a string" +#~ msgstr "Irihimbano OYA a Ikurikiranyanyuguti" + +#, fuzzy +#~ msgid "visibility arg not a string" +#~ msgstr "Ukugaragara OYA a Ikurikiranyanyuguti" + +#, fuzzy +#~ msgid "visibility arg must be one of \"default\", \"hidden\", \"protected\" or \"internal\"" +#~ msgstr "Ukugaragara Bya Mburabuzi gihishwe Birinzwe Cyangwa By'imbere" + +#, fuzzy +#~ msgid "tls_model arg not a string" +#~ msgstr "OYA a Ikurikiranyanyuguti" + +#, fuzzy +#~ msgid "tls_model arg must be one of \"local-exec\", \"initial-exec\", \"local-dynamic\" or \"global-dynamic\"" +#~ msgstr "Bya Cyangwa" + +#, fuzzy +#~ msgid "`%s' attribute applies only to functions" +#~ msgstr "`%s'Ikiranga Kuri Imimaro" + +#, fuzzy +#~ msgid "can't set `%s' attribute after definition" +#~ msgstr "Gushyiraho Ikiranga Nyuma Insobanuro" + +#, fuzzy +#~ msgid "`%s' attribute ignored for `%s'" +#~ msgstr "`%s'Ikiranga kugirango" + +#, fuzzy +#~ msgid "invalid vector type for attribute `%s'" +#~ msgstr "Sibyo Ubwoko kugirango Ikiranga" + +#, fuzzy +#~ msgid "no vector mode with the size and type specified could be found" +#~ msgstr "Oya Ubwoko Na: i Ingano Na Ubwoko Byabonetse" + +#, fuzzy +#~ msgid "nonnull attribute without arguments on a non-prototype" +#~ msgstr "Ikiranga ingingo ku a" + +#, fuzzy +#~ msgid "nonnull argument has invalid operand number (arg %lu)" +#~ msgstr "Sibyo Umubare" + +#, fuzzy +#~ msgid "nonnull argument with out-of-range operand number (arg %lu, operand %lu)" +#~ msgstr "Na: Inyuma Bya Urutonde Umubare" + +#, fuzzy +#~ msgid "nonnull argument references non-pointer operand (arg %lu, operand %lu)" +#~ msgstr "Indango Mweretsi" + +#, fuzzy +#~ msgid "null argument where non-null required (arg %lu)" +#~ msgstr "NTAGIHARI NTAGIHARI Bya ngombwa" + +#, fuzzy +#~ msgid "void value not ignored as it ought to be" +#~ msgstr "Agaciro OYA Nka Kuri" + +#, fuzzy +#~ msgid "conversion to non-scalar type requested" +#~ msgstr "Ihindurangero Kuri Ubwoko" + +#, fuzzy +#~ msgid "array `%s' assumed to have one element" +#~ msgstr "Imbonerahamwe Kuri Ikigize:" + +#, fuzzy +#~ msgid "`struct %s' incomplete in scope ending here" +#~ msgstr "`in Ingano:" + +#, fuzzy +#~ msgid "`union %s' incomplete in scope ending here" +#~ msgstr "`Ihuza in Ingano:" + +#, fuzzy +#~ msgid "`enum %s' incomplete in scope ending here" +#~ msgstr "`in Ingano:" + +#, fuzzy +#~ msgid "label `%s' defined but not used" +#~ msgstr "Akarango OYA" + +#, fuzzy +#~ msgid "function `%s' redeclared as inline" +#~ msgstr "Umumaro Nka Mumurongo" + +#, fuzzy +#~ msgid "previous declaration of function `%s' with attribute noinline" +#~ msgstr "Ibanjirije Bya Umumaro Na: Ikiranga" + +#, fuzzy +#~ msgid "function `%s' redeclared with attribute noinline" +#~ msgstr "Umumaro Na: Ikiranga" + +#, fuzzy +#~ msgid "previous declaration of function `%s' was inline" +#~ msgstr "Ibanjirije Bya Umumaro Mumurongo" + +#, fuzzy +#~ msgid "shadowing built-in function `%s'" +#~ msgstr "Ishyiraho ry'igicucu in Umumaro" + +#, fuzzy +#~ msgid "shadowing library function `%s'" +#~ msgstr "Ishyiraho ry'igicucu Isomero Umumaro" + +#, fuzzy +#~ msgid "library function `%s' declared as non-function" +#~ msgstr "Isomero Umumaro Nka Umumaro" + +#, fuzzy +#~ msgid "built-in function `%s' declared as non-function" +#~ msgstr "in Umumaro Nka Umumaro" + +#, fuzzy +#~ msgid "`%s' redeclared as different kind of symbol" +#~ msgstr "`%s'Nka Bya IKIMENYETSO" + +#, fuzzy +#~ msgid "previous declaration of `%s'" +#~ msgstr "Ibanjirije Bya" + +#, fuzzy +#~ msgid "conflicting types for built-in function `%s'" +#~ msgstr "kugirango in Umumaro" + +#, fuzzy +#~ msgid "conflicting types for `%s'" +#~ msgstr "kugirango" + +#, fuzzy +#~ msgid "a parameter list with an ellipsis can't match an empty parameter name list declaration" +#~ msgstr "a Urutonde Na: BIHUYE ubusa Izina: Urutonde" + +#, fuzzy +#~ msgid "an argument type that has a default promotion can't match an empty parameter name list declaration" +#~ msgstr "Ubwoko a Mburabuzi BIHUYE ubusa Izina: Urutonde" + +#, fuzzy +#~ msgid "thread-local declaration of `%s' follows non thread-local declaration" +#~ msgstr "Urudodo Bya Urudodo" + +#, fuzzy +#~ msgid "non thread-local declaration of `%s' follows thread-local declaration" +#~ msgstr "Urudodo Bya Urudodo" + +#, fuzzy +#~ msgid "redefinition of `%s'" +#~ msgstr "Bya" + +#, fuzzy +#~ msgid "redeclaration of `%s'" +#~ msgstr "Bya" + +#, fuzzy +#~ msgid "conflicting declarations of `%s'" +#~ msgstr "Bya" + +#, fuzzy +#~ msgid "prototype for `%s' follows" +#~ msgstr "kugirango" + +#, fuzzy +#~ msgid "non-prototype definition here" +#~ msgstr "Insobanuro" + +#, fuzzy +#~ msgid "prototype for `%s' follows and number of arguments doesn't match" +#~ msgstr "kugirango Na Umubare Bya ingingo BIHUYE" + +#, fuzzy +#~ msgid "prototype for `%s' follows and argument %d doesn't match" +#~ msgstr "kugirango Na BIHUYE" + +#, fuzzy +#~ msgid "`%s' declared inline after being called" +#~ msgstr "`%s'Mumurongo Nyuma" + +#, fuzzy +#~ msgid "`%s' declared inline after its definition" +#~ msgstr "`%s'Mumurongo Nyuma Insobanuro" + +#, fuzzy +#~ msgid "static declaration for `%s' follows non-static" +#~ msgstr "kugirango" + +#, fuzzy +#~ msgid "non-static declaration for `%s' follows static" +#~ msgstr "kugirango" + +#, fuzzy +#~ msgid "const declaration for `%s' follows non-const" +#~ msgstr "kugirango" + +#, fuzzy +#~ msgid "type qualifiers for `%s' conflict with previous decl" +#~ msgstr "Ubwoko kugirango Na: Ibanjirije" + +#, fuzzy +#~ msgid "redundant redeclaration of `%s' in same scope" +#~ msgstr "Bya in Ingano:" + +#, fuzzy +#~ msgid "declaration of `%s' shadows a parameter" +#~ msgstr "Bya a" + +#, fuzzy +#~ msgid "declaration of `%s' shadows a symbol from the parameter list" +#~ msgstr "Bya a IKIMENYETSO Bivuye i Urutonde" + +#, fuzzy +#~ msgid "a parameter" +#~ msgstr "a" + +#, fuzzy +#~ msgid "a previous local" +#~ msgstr "a Ibanjirije" + +#, fuzzy +#~ msgid "a global declaration" +#~ msgstr "a" + +#, fuzzy +#~ msgid "nested extern declaration of `%s'" +#~ msgstr "Bya" + +#, fuzzy +#~ msgid "`%s' used prior to declaration" +#~ msgstr "`%s'Kuri" + +#, fuzzy +#~ msgid "`%s' was declared implicitly `extern' and later `static'" +#~ msgstr "`%s'Na" + +#, fuzzy +#~ msgid "type mismatch with previous external decl" +#~ msgstr "Ubwoko Na: Ibanjirije external" + +#, fuzzy +#~ msgid "previous external decl of `%s'" +#~ msgstr "Ibanjirije external Bya" + +#, fuzzy +#~ msgid "type mismatch with previous implicit declaration" +#~ msgstr "Ubwoko Na: Ibanjirije" + +#, fuzzy +#~ msgid "previous implicit declaration of `%s'" +#~ msgstr "Ibanjirije Bya" + +#, fuzzy +#~ msgid "`%s' was previously implicitly declared to return `int'" +#~ msgstr "`%s'Kuri Garuka" + +#, fuzzy +#~ msgid "`%s' was declared `extern' and later `static'" +#~ msgstr "`%s'Na" + +#, fuzzy +#~ msgid "extern declaration of `%s' doesn't match global one" +#~ msgstr "Bya BIHUYE" + +#, fuzzy +#~ msgid "`%s' locally external but globally static" +#~ msgstr "`%s'external" + +#, fuzzy +#~ msgid "function `%s' was previously declared within a block" +#~ msgstr "Umumaro muri a Funga" + +#, fuzzy +#~ msgid "implicit declaration of function `%s'" +#~ msgstr "Bya Umumaro" + +#, fuzzy +#~ msgid "label %s referenced outside of any function" +#~ msgstr "Akarango Hanze Bya Umumaro" + +#, fuzzy +#~ msgid "duplicate label declaration `%s'" +#~ msgstr "Gusubiramo Akarango" + +#, fuzzy +#~ msgid "this is a previous declaration" +#~ msgstr "iyi ni a Ibanjirije" + +#, fuzzy +#~ msgid "unnamed struct/union that defines no instances" +#~ msgstr "Kitiswe Ihuza Oya Ingero" + +#, fuzzy +#~ msgid "useless keyword or type name in empty declaration" +#~ msgstr "Ijambo- banze Cyangwa Ubwoko Izina: in ubusa" + +#, fuzzy +#~ msgid "two types specified in one empty declaration" +#~ msgstr "in ubusa" + +#, fuzzy +#~ msgid "empty declaration" +#~ msgstr "ubusa" + +#, fuzzy +#~ msgid "ISO C90 does not support `static' or type qualifiers in parameter array declarators" +#~ msgstr "OYA Gushigikira Cyangwa Ubwoko in Imbonerahamwe" + +#, fuzzy +#~ msgid "ISO C90 does not support `[*]' array declarators" +#~ msgstr "OYA Gushigikira Imbonerahamwe" + +#, fuzzy +#~ msgid "GCC does not yet properly implement `[*]' array declarators" +#~ msgstr "OYA Imbonerahamwe" + +#, fuzzy +#~ msgid "static or type qualifiers in abstract declarator" +#~ msgstr "Cyangwa Ubwoko in Incamake" + +#, fuzzy +#~ msgid "`%s' is usually a function" +#~ msgstr "`%s'ni a Umumaro" + +#, fuzzy +#~ msgid "typedef `%s' is initialized (use __typeof__ instead)" +#~ msgstr "ni Gukoresha" + +#, fuzzy +#~ msgid "function `%s' is initialized like a variable" +#~ msgstr "Umumaro ni nka a IMPINDURAGACIRO" + +#, fuzzy +#~ msgid "parameter `%s' is initialized" +#~ msgstr "ni" + +#, fuzzy +#~ msgid "variable-sized object may not be initialized" +#~ msgstr "IMPINDURAGACIRO Igikoresho Gicurasi OYA" + +#, fuzzy +#~ msgid "variable `%s' has initializer but incomplete type" +#~ msgstr "IMPINDURAGACIRO Ubwoko" + +#, fuzzy +#~ msgid "elements of array `%s' have incomplete type" +#~ msgstr "Ibintu Bya Imbonerahamwe Ubwoko" + +#, fuzzy +#~ msgid "declaration of `%s' has `extern' and is initialized" +#~ msgstr "Bya Na ni" + +#, fuzzy +#~ msgid "inline function `%s' given attribute noinline" +#~ msgstr "Mumurongo Umumaro Ikiranga" + +#, fuzzy +#~ msgid "initializer fails to determine size of `%s'" +#~ msgstr "Kuri Ingano Bya" + +#, fuzzy +#~ msgid "array size missing in `%s'" +#~ msgstr "Imbonerahamwe Ingano Ibuze in" + +#, fuzzy +#~ msgid "zero or negative size array `%s'" +#~ msgstr "Zeru Cyangwa Ingano Imbonerahamwe" + +#, fuzzy +#~ msgid "storage size of `%s' isn't known" +#~ msgstr "Ingano Bya si" + +#, fuzzy +#~ msgid "storage size of `%s' isn't constant" +#~ msgstr "Ingano Bya si" + +#, fuzzy +#~ msgid "ignoring asm-specifier for non-static local variable `%s'" +#~ msgstr "kugirango IMPINDURAGACIRO" + +#, fuzzy +#~ msgid "ISO C forbids parameter `%s' shadowing typedef" +#~ msgstr "C Ishyiraho ry'igicucu" + +#, fuzzy +#~ msgid "`long long long' is too long for GCC" +#~ msgstr "`ni kugirango" + +#, fuzzy +#~ msgid "ISO C90 does not support `long long'" +#~ msgstr "OYA Gushigikira" + +#, fuzzy +#~ msgid "duplicate `%s'" +#~ msgstr "Gusubiramo" + +#, fuzzy +#~ msgid "`__thread' before `extern'" +#~ msgstr "`_Mbere" + +#, fuzzy +#~ msgid "`__thread' before `static'" +#~ msgstr "`_Mbere" + +#, fuzzy +#~ msgid "two or more data types in declaration of `%s'" +#~ msgstr "Cyangwa Birenzeho Ibyatanzwe in Bya" + +#, fuzzy +#~ msgid "`%s' fails to be a typedef or built in type" +#~ msgstr "`%s'Kuri a Cyangwa in Ubwoko" + +#, fuzzy +#~ msgid "type defaults to `int' in declaration of `%s'" +#~ msgstr "Ubwoko Kuri in Bya" + +#, fuzzy +#~ msgid "both long and short specified for `%s'" +#~ msgstr "Byombi Na kugirango" + +#, fuzzy +#~ msgid "long or short specified with char for `%s'" +#~ msgstr "Cyangwa Na: INYUGUTI kugirango" + +#, fuzzy +#~ msgid "long or short specified with floating type for `%s'" +#~ msgstr "Cyangwa Na: Bihindagurika Ubwoko kugirango" + +#, fuzzy +#~ msgid "the only valid combination is `long double'" +#~ msgstr "i Byemewe Ivanga ni" + +#, fuzzy +#~ msgid "both signed and unsigned specified for `%s'" +#~ msgstr "Byombi Na Bitashizweho umukono kugirango" + +#, fuzzy +#~ msgid "long, short, signed or unsigned invalid for `%s'" +#~ msgstr "Cyangwa Bitashizweho umukono Sibyo kugirango" + +#, fuzzy +#~ msgid "long, short, signed or unsigned used invalidly for `%s'" +#~ msgstr "Cyangwa Bitashizweho umukono kugirango" + +#, fuzzy +#~ msgid "complex invalid for `%s'" +#~ msgstr "ITSINDA RY'IMIBARE C Sibyo kugirango" + +#, fuzzy +#~ msgid "ISO C90 does not support complex types" +#~ msgstr "OYA Gushigikira ITSINDA RY'IMIBARE C" + +#, fuzzy +#~ msgid "ISO C does not support plain `complex' meaning `double complex'" +#~ msgstr "C OYA Gushigikira Byuzuye Igisobanuro MAHARAKUBIRI" + +#, fuzzy +#~ msgid "ISO C does not support complex integer types" +#~ msgstr "C OYA Gushigikira ITSINDA RY'IMIBARE C Umubare wuzuye" + +#, fuzzy +#~ msgid "duplicate `const'" +#~ msgstr "Gusubiramo" + +#, fuzzy +#~ msgid "duplicate `restrict'" +#~ msgstr "Gusubiramo" + +#, fuzzy +#~ msgid "duplicate `volatile'" +#~ msgstr "Gusubiramo" + +#, fuzzy +#~ msgid "multiple storage classes in declaration of `%s'" +#~ msgstr "Igikubo Inzego in Bya" + +#, fuzzy +#~ msgid "function definition declared `auto'" +#~ msgstr "Umumaro Insobanuro" + +#, fuzzy +#~ msgid "function definition declared `register'" +#~ msgstr "Umumaro Insobanuro" + +#, fuzzy +#~ msgid "function definition declared `typedef'" +#~ msgstr "Umumaro Insobanuro" + +#, fuzzy +#~ msgid "function definition declared `__thread'" +#~ msgstr "Umumaro Insobanuro" + +#, fuzzy +#~ msgid "storage class specified for structure field `%s'" +#~ msgstr "ishuri kugirango Imiterere Umwanya" + +#, fuzzy +#~ msgid "storage class specified for parameter `%s'" +#~ msgstr "ishuri kugirango" + +#, fuzzy +#~ msgid "storage class specified for typename" +#~ msgstr "ishuri kugirango" + +#, fuzzy +#~ msgid "`%s' initialized and declared `extern'" +#~ msgstr "`%s'Na" + +#, fuzzy +#~ msgid "`%s' has both `extern' and initializer" +#~ msgstr "`%s'Byombi Na" + +#, fuzzy +#~ msgid "top-level declaration of `%s' specifies `auto'" +#~ msgstr "Hejuru: urwego Bya" + +#, fuzzy +#~ msgid "nested function `%s' declared `extern'" +#~ msgstr "Umumaro" + +#, fuzzy +#~ msgid "function-scope `%s' implicitly auto and declared `__thread'" +#~ msgstr "Umumaro Ingano: Ikiyega Na" + +#, fuzzy +#~ msgid "static or type qualifiers in non-parameter array declarator" +#~ msgstr "Cyangwa Ubwoko in Imbonerahamwe" + +#, fuzzy +#~ msgid "declaration of `%s' as array of voids" +#~ msgstr "Bya Nka Imbonerahamwe Bya" + +#, fuzzy +#~ msgid "declaration of `%s' as array of functions" +#~ msgstr "Bya Nka Imbonerahamwe Bya Imimaro" + +#, fuzzy +#~ msgid "invalid use of structure with flexible array member" +#~ msgstr "Sibyo Gukoresha Bya Imiterere Na: Imbonerahamwe" + +#, fuzzy +#~ msgid "size of array `%s' has non-integer type" +#~ msgstr "Ingano Bya Imbonerahamwe Umubare wuzuye Ubwoko" + +#, fuzzy +#~ msgid "ISO C forbids zero-size array `%s'" +#~ msgstr "C Zeru Ingano Imbonerahamwe" + +#, fuzzy +#~ msgid "size of array `%s' is negative" +#~ msgstr "Ingano Bya Imbonerahamwe ni" + +#, fuzzy +#~ msgid "ISO C90 forbids array `%s' whose size can't be evaluated" +#~ msgstr "Imbonerahamwe bya Ingano" + +#, fuzzy +#~ msgid "ISO C90 forbids variable-size array `%s'" +#~ msgstr "IMPINDURAGACIRO Ingano Imbonerahamwe" + +#, fuzzy +#~ msgid "size of array `%s' is too large" +#~ msgstr "Ingano Bya Imbonerahamwe ni Binini" + +#, fuzzy +#~ msgid "ISO C90 does not support flexible array members" +#~ msgstr "OYA Gushigikira Imbonerahamwe" + +#, fuzzy +#~ msgid "array type has incomplete element type" +#~ msgstr "Imbonerahamwe Ubwoko Ikigize: Ubwoko" + +#, fuzzy +#~ msgid "ISO C forbids const or volatile function types" +#~ msgstr "C Cyangwa Umumaro" + +#, fuzzy +#~ msgid "`%s' declared as function returning a function" +#~ msgstr "`%s'Nka Umumaro a Umumaro" + +#, fuzzy +#~ msgid "`%s' declared as function returning an array" +#~ msgstr "`%s'Nka Umumaro Imbonerahamwe" + +#, fuzzy +#~ msgid "ISO C forbids qualified void function return type" +#~ msgstr "C Umumaro Garuka Ubwoko" + +#, fuzzy +#~ msgid "type qualifiers ignored on function return type" +#~ msgstr "Ubwoko ku Umumaro Garuka Ubwoko" + +#, fuzzy +#~ msgid "ISO C forbids qualified function types" +#~ msgstr "C Umumaro" + +#, fuzzy +#~ msgid "invalid type modifier within pointer declarator" +#~ msgstr "Sibyo Ubwoko muri Mweretsi" + +#, fuzzy +#~ msgid "variable or field `%s' declared void" +#~ msgstr "IMPINDURAGACIRO Cyangwa Umwanya" + +#, fuzzy +#~ msgid "attributes in parameter array declarator ignored" +#~ msgstr "Ibiranga in Imbonerahamwe" + +#, fuzzy +#~ msgid "invalid type modifier within array declarator" +#~ msgstr "Sibyo Ubwoko muri Imbonerahamwe" + +#, fuzzy +#~ msgid "field `%s' declared as a function" +#~ msgstr "Umwanya Nka a Umumaro" + +#, fuzzy +#~ msgid "field `%s' has incomplete type" +#~ msgstr "Umwanya Ubwoko" + +#, fuzzy +#~ msgid "invalid storage class for function `%s'" +#~ msgstr "Sibyo ishuri kugirango Umumaro" + +#, fuzzy +#~ msgid "`noreturn' function returns non-void value" +#~ msgstr "`Umumaro Agaciro" + +#, fuzzy +#~ msgid "cannot inline function `main'" +#~ msgstr "Mumurongo Umumaro" + +#, fuzzy +#~ msgid "variable `%s' declared `inline'" +#~ msgstr "IMPINDURAGACIRO" + +#, fuzzy +#~ msgid "thread-local storage not supported for this target" +#~ msgstr "Urudodo OYA kugirango iyi Intego" + +#, fuzzy +#~ msgid "function declaration isn't a prototype" +#~ msgstr "Umumaro si a" + +#, fuzzy +#~ msgid "parameter names (without types) in function declaration" +#~ msgstr "Amazina in Umumaro" + +#, fuzzy +#~ msgid "parameter `%s' has incomplete type" +#~ msgstr "Ubwoko" + +#, fuzzy +#~ msgid "parameter has incomplete type" +#~ msgstr "Ubwoko" + +#, fuzzy +#~ msgid "parameter `%s' points to incomplete type" +#~ msgstr "Utudomo Kuri Ubwoko" + +#, fuzzy +#~ msgid "parameter points to incomplete type" +#~ msgstr "Utudomo Kuri Ubwoko" + +#, fuzzy +#~ msgid "parameter `%s' has just a forward declaration" +#~ msgstr "a Imbere" + +#, fuzzy +#~ msgid "`void' in parameter list must be the entire list" +#~ msgstr "`in Urutonde i Urutonde" + +#, fuzzy +#~ msgid "`struct %s' declared inside parameter list" +#~ msgstr "`Mo Imbere Urutonde" + +#, fuzzy +#~ msgid "`union %s' declared inside parameter list" +#~ msgstr "`Ihuza Mo Imbere Urutonde" + +#, fuzzy +#~ msgid "`enum %s' declared inside parameter list" +#~ msgstr "`Mo Imbere Urutonde" + +#, fuzzy +#~ msgid "anonymous struct declared inside parameter list" +#~ msgstr "Mo Imbere Urutonde" + +#, fuzzy +#~ msgid "anonymous union declared inside parameter list" +#~ msgstr "Ihuza Mo Imbere Urutonde" + +#, fuzzy +#~ msgid "anonymous enum declared inside parameter list" +#~ msgstr "Mo Imbere Urutonde" + +#, fuzzy +#~ msgid "its scope is only this definition or declaration, which is probably not what you want" +#~ msgstr "Ingano: ni iyi Insobanuro Cyangwa ni OYA" + +#, fuzzy +#~ msgid "redefinition of `union %s'" +#~ msgstr "Bya Ihuza" + +#, fuzzy +#~ msgid "redefinition of `struct %s'" +#~ msgstr "Bya" + +#, fuzzy +#~ msgid "declaration does not declare anything" +#~ msgstr "OYA" + +#, fuzzy +#~ msgid "%s defined inside parms" +#~ msgstr "%sMo Imbere" + +# starmath/source\smres.src:RID_TOOLBOXWINDOW.3.RID_XUNIONY.text +#, fuzzy +#~ msgid "union" +#~ msgstr "Ihuza" + +# sc/source\ui\formdlg\formdlgs.src:RID_SCTAB_STRUCT.FT_STRUCT.text +#, fuzzy +#~ msgid "structure" +#~ msgstr "Imiterere" + +#, fuzzy +#~ msgid "%s has no %s" +#~ msgstr "%sOya" + +#, fuzzy +#~ msgid "nested redefinition of `%s'" +#~ msgstr "Bya" + +#, fuzzy +#~ msgid "bit-field `%s' width not an integer constant" +#~ msgstr "Umwanya Ubugari OYA Umubare wuzuye" + +#, fuzzy +#~ msgid "bit-field `%s' has invalid type" +#~ msgstr "Umwanya Sibyo Ubwoko" + +#, fuzzy +#~ msgid "bit-field `%s' type invalid in ISO C" +#~ msgstr "Umwanya Ubwoko Sibyo in C" + +#, fuzzy +#~ msgid "negative width in bit-field `%s'" +#~ msgstr "Ubugari in Umwanya" + +#, fuzzy +#~ msgid "width of `%s' exceeds its type" +#~ msgstr "Ubugari Bya Ubwoko" + +#, fuzzy +#~ msgid "zero width for bit-field `%s'" +#~ msgstr "Zeru Ubugari kugirango Umwanya" + +#, fuzzy +#~ msgid "`%s' is narrower than values of its type" +#~ msgstr "`%s'ni Uduciro Bya Ubwoko" + +#, fuzzy +#~ msgid "flexible array member in union" +#~ msgstr "Imbonerahamwe in Ihuza" + +#, fuzzy +#~ msgid "flexible array member not at end of struct" +#~ msgstr "Imbonerahamwe OYA ku Impera Bya" + +#, fuzzy +#~ msgid "flexible array member in otherwise empty struct" +#~ msgstr "Imbonerahamwe in ubusa" + +#, fuzzy +#~ msgid "duplicate member `%s'" +#~ msgstr "Gusubiramo" + +#, fuzzy +#~ msgid "union cannot be made transparent" +#~ msgstr "Ihuza Bibonerana" + +#, fuzzy +#~ msgid "redeclaration of `enum %s'" +#~ msgstr "Bya" + +#, fuzzy +#~ msgid "enum defined inside parms" +#~ msgstr "Mo Imbere" + +#, fuzzy +#~ msgid "enumeration values exceed range of largest integer" +#~ msgstr "Uduciro Urutonde Bya Kinini Umubare wuzuye" + +#, fuzzy +#~ msgid "enumerator value for `%s' not integer constant" +#~ msgstr "Agaciro kugirango OYA Umubare wuzuye" + +#, fuzzy +#~ msgid "overflow in enumeration values" +#~ msgstr "Byarenze urugero in Uduciro" + +#, fuzzy +#~ msgid "ISO C restricts enumerator values to range of `int'" +#~ msgstr "C Uduciro Kuri Urutonde Bya" + +#, fuzzy +#~ msgid "return type is an incomplete type" +#~ msgstr "Garuka Ubwoko ni Ubwoko" + +#, fuzzy +#~ msgid "return type defaults to `int'" +#~ msgstr "Garuka Ubwoko Kuri" + +#, fuzzy +#~ msgid "no previous prototype for `%s'" +#~ msgstr "Oya Ibanjirije kugirango" + +#, fuzzy +#~ msgid "`%s' was used with no prototype before its definition" +#~ msgstr "`%s'Na: Oya Mbere Insobanuro" + +#, fuzzy +#~ msgid "no previous declaration for `%s'" +#~ msgstr "Oya Ibanjirije kugirango" + +#, fuzzy +#~ msgid "`%s' was used with no declaration before its definition" +#~ msgstr "`%s'Na: Oya Mbere Insobanuro" + +#, fuzzy +#~ msgid "return type of `%s' is not `int'" +#~ msgstr "Garuka Ubwoko Bya ni OYA" + +#, fuzzy +#~ msgid "first argument of `%s' should be `int'" +#~ msgstr "Itangira Bya" + +#, fuzzy +#~ msgid "second argument of `%s' should be `char **'" +#~ msgstr "ISEGONDA Bya INYUGUTI" + +#, fuzzy +#~ msgid "third argument of `%s' should probably be `char **'" +#~ msgstr "Bya INYUGUTI" + +#, fuzzy +#~ msgid "`%s' takes only zero or two arguments" +#~ msgstr "`%s'Zeru Cyangwa ingingo" + +#, fuzzy +#~ msgid "`%s' is normally a non-static function" +#~ msgstr "`%s'ni a Umumaro" + +#, fuzzy +#~ msgid "parm types given both in parmlist and separately" +#~ msgstr "Byombi in Na" + +#, fuzzy +#~ msgid "parameter name omitted" +#~ msgstr "Izina:" + +#, fuzzy +#~ msgid "parameter name missing from parameter list" +#~ msgstr "Izina: Ibuze Bivuye Urutonde" + +#, fuzzy +#~ msgid "multiple parameters named `%s'" +#~ msgstr "Igikubo Ibigenga" + +#, fuzzy +#~ msgid "type of `%s' defaults to `int'" +#~ msgstr "Ubwoko Bya Kuri" + +#, fuzzy +#~ msgid "declaration for parameter `%s' but no such parameter" +#~ msgstr "kugirango Oya" + +#, fuzzy +#~ msgid "number of arguments doesn't match prototype" +#~ msgstr "Umubare Bya ingingo BIHUYE" + +#, fuzzy +#~ msgid "promoted argument `%s' doesn't match prototype" +#~ msgstr "BIHUYE" + +#, fuzzy +#~ msgid "argument `%s' doesn't match prototype" +#~ msgstr "BIHUYE" + +#, fuzzy +#~ msgid "no return statement in function returning non-void" +#~ msgstr "Oya Garuka Inyandiko in Umumaro" + +#, fuzzy +#~ msgid "this function may return with or without a value" +#~ msgstr "iyi Umumaro Gicurasi Garuka Na: Cyangwa a Agaciro" + +#, fuzzy +#~ msgid "size of return value of `%s' is %u bytes" +#~ msgstr "Ingano Bya Garuka Agaciro Bya ni Bayite" + +#, fuzzy +#~ msgid "size of return value of `%s' is larger than %d bytes" +#~ msgstr "Ingano Bya Garuka Agaciro Bya ni Kinini Bayite" + +#, fuzzy +#~ msgid "`for' loop initial declaration used outside C99 mode" +#~ msgstr "`Hanze Ubwoko" + +#, fuzzy +#~ msgid "`struct %s' declared in `for' loop initial declaration" +#~ msgstr "`in" + +#, fuzzy +#~ msgid "`union %s' declared in `for' loop initial declaration" +#~ msgstr "`Ihuza in" + +#, fuzzy +#~ msgid "`enum %s' declared in `for' loop initial declaration" +#~ msgstr "`in" + +#, fuzzy +#~ msgid "declaration of non-variable `%s' in `for' loop initial declaration" +#~ msgstr "Bya IMPINDURAGACIRO in" + +#, fuzzy +#~ msgid "declaration of static variable `%s' in `for' loop initial declaration" +#~ msgstr "Bya IMPINDURAGACIRO in" + +#, fuzzy +#~ msgid "declaration of `extern' variable `%s' in `for' loop initial declaration" +#~ msgstr "Bya IMPINDURAGACIRO in" + +#, fuzzy +#~ msgid "format string arg not a string type" +#~ msgstr "Imiterere Ikurikiranyanyuguti OYA a Ikurikiranyanyuguti Ubwoko" + +#, fuzzy +#~ msgid "args to be formatted is not '...'" +#~ msgstr "Kuri Byahanaguwe ni OYA" + +#, fuzzy +#~ msgid "strftime formats cannot format arguments" +#~ msgstr "Imiterere Imiterere ingingo" + +#, fuzzy +#~ msgid "format string has invalid operand number" +#~ msgstr "Imiterere Ikurikiranyanyuguti Sibyo Umubare" + +#, fuzzy +#~ msgid "function does not return string type" +#~ msgstr "Umumaro OYA Garuka Ikurikiranyanyuguti Ubwoko" + +#, fuzzy +#~ msgid "unrecognized format specifier" +#~ msgstr "Imiterere" + +#, fuzzy +#~ msgid "`%s' is an unrecognized format function type" +#~ msgstr "`%s'ni Imiterere Umumaro Ubwoko" + +#, fuzzy +#~ msgid "format string arg follows the args to be formatted" +#~ msgstr "Imiterere Ikurikiranyanyuguti i Kuri Byahanaguwe" + +#, fuzzy +#~ msgid "` ' flag" +#~ msgstr "`'Ibendera" + +#, fuzzy +#~ msgid "the ` ' printf flag" +#~ msgstr "i Ibendera" + +#, fuzzy +#~ msgid "`+' flag" +#~ msgstr "`+'Ibendera" + +#, fuzzy +#~ msgid "the `+' printf flag" +#~ msgstr "i Ibendera" + +#, fuzzy +#~ msgid "`#' flag" +#~ msgstr "`#'Ibendera" + +#, fuzzy +#~ msgid "the `#' printf flag" +#~ msgstr "i Ibendera" + +#, fuzzy +#~ msgid "`0' flag" +#~ msgstr "`Ibendera" + +#, fuzzy +#~ msgid "the `0' printf flag" +#~ msgstr "i Ibendera" + +#, fuzzy +#~ msgid "`-' flag" +#~ msgstr "`-'Ibendera" + +#, fuzzy +#~ msgid "the `-' printf flag" +#~ msgstr "i Ibendera" + +#, fuzzy +#~ msgid "`'' flag" +#~ msgstr "`''Ibendera" + +#, fuzzy +#~ msgid "the `'' printf flag" +#~ msgstr "i Ibendera" + +#, fuzzy +#~ msgid "`I' flag" +#~ msgstr "`Ibendera" + +#, fuzzy +#~ msgid "the `I' printf flag" +#~ msgstr "i Ibendera" + +#, fuzzy +#~ msgid "field width" +#~ msgstr "Umwanya Ubugari" + +#, fuzzy +#~ msgid "field width in printf format" +#~ msgstr "Umwanya Ubugari in Imiterere" + +#, fuzzy +#~ msgid "precision in printf format" +#~ msgstr "in Imiterere" + +#, fuzzy +#~ msgid "length modifier" +#~ msgstr "Uburebure" + +#, fuzzy +#~ msgid "length modifier in printf format" +#~ msgstr "Uburebure in Imiterere" + +#, fuzzy +#~ msgid "assignment suppression" +#~ msgstr "Igenera" + +#, fuzzy +#~ msgid "the assignment suppression scanf feature" +#~ msgstr "i Igenera" + +#, fuzzy +#~ msgid "`a' flag" +#~ msgstr "`Ibendera" + +#, fuzzy +#~ msgid "the `a' scanf flag" +#~ msgstr "i Ibendera" + +#, fuzzy +#~ msgid "field width in scanf format" +#~ msgstr "Umwanya Ubugari in Imiterere" + +#, fuzzy +#~ msgid "length modifier in scanf format" +#~ msgstr "Uburebure in Imiterere" + +#, fuzzy +#~ msgid "the `'' scanf flag" +#~ msgstr "i Ibendera" + +#, fuzzy +#~ msgid "the `I' scanf flag" +#~ msgstr "i Ibendera" + +#, fuzzy +#~ msgid "`_' flag" +#~ msgstr "`_'Ibendera" + +#, fuzzy +#~ msgid "the `_' strftime flag" +#~ msgstr "i Ibendera" + +#, fuzzy +#~ msgid "the `-' strftime flag" +#~ msgstr "i Ibendera" + +#, fuzzy +#~ msgid "the `0' strftime flag" +#~ msgstr "i Ibendera" + +#, fuzzy +#~ msgid "`^' flag" +#~ msgstr "`^'Ibendera" + +#, fuzzy +#~ msgid "the `^' strftime flag" +#~ msgstr "i Ibendera" + +#, fuzzy +#~ msgid "the `#' strftime flag" +#~ msgstr "i Ibendera" + +#, fuzzy +#~ msgid "field width in strftime format" +#~ msgstr "Umwanya Ubugari in Imiterere" + +#, fuzzy +#~ msgid "the `E' strftime modifier" +#~ msgstr "i" + +#, fuzzy +#~ msgid "the `O' strftime modifier" +#~ msgstr "i" + +#, fuzzy +#~ msgid "the `O' modifier" +#~ msgstr "i" + +# svx/source\dialog\tabstpge.src:RID_SVXPAGE_TABULATOR.FL_FILLCHAR.text +#, fuzzy +#~ msgid "fill character" +#~ msgstr "Kuzuza inyuguti" + +#, fuzzy +#~ msgid "fill character in strfmon format" +#~ msgstr "Kuzuza Inyuguti in Imiterere" + +#, fuzzy +#~ msgid "the `^' strfmon flag" +#~ msgstr "i Ibendera" + +#, fuzzy +#~ msgid "the `+' strfmon flag" +#~ msgstr "i Ibendera" + +#, fuzzy +#~ msgid "`(' flag" +#~ msgstr "`('Ibendera" + +#, fuzzy +#~ msgid "the `(' strfmon flag" +#~ msgstr "i Ibendera" + +#, fuzzy +#~ msgid "`!' flag" +#~ msgstr "`!'Ibendera" + +#, fuzzy +#~ msgid "the `!' strfmon flag" +#~ msgstr "i Ibendera" + +#, fuzzy +#~ msgid "the `-' strfmon flag" +#~ msgstr "i Ibendera" + +#, fuzzy +#~ msgid "field width in strfmon format" +#~ msgstr "Umwanya Ubugari in Imiterere" + +#, fuzzy +#~ msgid "left precision" +#~ msgstr "Ibumoso:" + +#, fuzzy +#~ msgid "left precision in strfmon format" +#~ msgstr "Ibumoso: in Imiterere" + +#, fuzzy +#~ msgid "right precision" +#~ msgstr "Iburyo:" + +#, fuzzy +#~ msgid "right precision in strfmon format" +#~ msgstr "Iburyo: in Imiterere" + +#, fuzzy +#~ msgid "length modifier in strfmon format" +#~ msgstr "Uburebure in Imiterere" + +#, fuzzy +#~ msgid "function might be possible candidate for `%s' format attribute" +#~ msgstr "Umumaro kugirango Imiterere Ikiranga" + +#, fuzzy +#~ msgid "missing $ operand number in format" +#~ msgstr "Ibuze Umubare in Imiterere" + +#, fuzzy +#~ msgid "%s does not support %%n$ operand number formats" +#~ msgstr "%sOYA Gushigikira Umubare Imiterere" + +#, fuzzy +#~ msgid "operand number out of range in format" +#~ msgstr "Umubare Inyuma Bya Urutonde in Imiterere" + +#, fuzzy +#~ msgid "format argument %d used more than once in %s format" +#~ msgstr "Imiterere Birenzeho Rimwe in Imiterere" + +#, fuzzy +#~ msgid "format argument %d unused before used argument %d in $-style format" +#~ msgstr "Imiterere Kidakoreshwa Mbere in IMISUSIRE Imiterere" + +#, fuzzy +#~ msgid "format not a string literal, format string not checked" +#~ msgstr "Imiterere OYA a Ikurikiranyanyuguti Imiterere Ikurikiranyanyuguti OYA Ivivuwe" + +#, fuzzy +#~ msgid "format not a string literal and no format arguments" +#~ msgstr "Imiterere OYA a Ikurikiranyanyuguti Na Oya Imiterere ingingo" + +#, fuzzy +#~ msgid "format not a string literal, argument types not checked" +#~ msgstr "Imiterere OYA a Ikurikiranyanyuguti OYA Ivivuwe" + +#, fuzzy +#~ msgid "too many arguments for format" +#~ msgstr "ingingo kugirango Imiterere" + +#, fuzzy +#~ msgid "unused arguments in $-style format" +#~ msgstr "Kidakoreshwa ingingo in IMISUSIRE Imiterere" + +#, fuzzy +#~ msgid "zero-length %s format string" +#~ msgstr "Zeru Uburebure Imiterere Ikurikiranyanyuguti" + +#, fuzzy +#~ msgid "format is a wide character string" +#~ msgstr "Imiterere ni a Inyuguti Ikurikiranyanyuguti" + +#, fuzzy +#~ msgid "unterminated format string" +#~ msgstr "Imiterere Ikurikiranyanyuguti" + +#, fuzzy +#~ msgid "embedded `\\0' in format" +#~ msgstr "Gitsindiye in Imiterere" + +#, fuzzy +#~ msgid "spurious trailing `%%' in format" +#~ msgstr "in Imiterere" + +#, fuzzy +#~ msgid "repeated %s in format" +#~ msgstr "byasubiyemo in Imiterere" + +#, fuzzy +#~ msgid "missing fill character at end of strfmon format" +#~ msgstr "Ibuze Kuzuza Inyuguti ku Impera Bya Imiterere" + +#, fuzzy +#~ msgid "too few arguments for format" +#~ msgstr "ingingo kugirango Imiterere" + +#, fuzzy +#~ msgid "zero width in %s format" +#~ msgstr "Zeru Ubugari in Imiterere" + +#, fuzzy +#~ msgid "empty left precision in %s format" +#~ msgstr "ubusa Ibumoso: in Imiterere" + +#, fuzzy +#~ msgid "field precision" +#~ msgstr "Umwanya" + +#, fuzzy +#~ msgid "empty precision in %s format" +#~ msgstr "ubusa in Imiterere" + +#, fuzzy +#~ msgid "%s does not support the `%s' %s length modifier" +#~ msgstr "%sOYA Gushigikira i Uburebure" + +#, fuzzy +#~ msgid "conversion lacks type at end of format" +#~ msgstr "Ihindurangero Ubwoko ku Impera Bya Imiterere" + +#, fuzzy +#~ msgid "unknown conversion type character `%c' in format" +#~ msgstr "Kitazwi Ihindurangero Ubwoko Inyuguti in Imiterere" + +#, fuzzy +#~ msgid "unknown conversion type character 0x%x in format" +#~ msgstr "Kitazwi Ihindurangero Ubwoko Inyuguti in Imiterere" + +#, fuzzy +#~ msgid "%s does not support the `%%%c' %s format" +#~ msgstr "%sOYA Gushigikira i Imiterere" + +#, fuzzy +#~ msgid "%s used with `%%%c' %s format" +#~ msgstr "%sNa: Imiterere" + +#, fuzzy +#~ msgid "%s does not support %s" +#~ msgstr "%sOYA Gushigikira" + +#, fuzzy +#~ msgid "%s does not support %s with the `%%%c' %s format" +#~ msgstr "%sOYA Gushigikira Na: i Imiterere" + +#, fuzzy +#~ msgid "%s ignored with %s and `%%%c' %s format" +#~ msgstr "%sNa: Na Imiterere" + +#, fuzzy +#~ msgid "%s ignored with %s in %s format" +#~ msgstr "%sNa: in Imiterere" + +#, fuzzy +#~ msgid "use of %s and %s together with `%%%c' %s format" +#~ msgstr "Gukoresha Bya Na Na: Imiterere" + +#, fuzzy +#~ msgid "use of %s and %s together in %s format" +#~ msgstr "Gukoresha Bya Na in Imiterere" + +#, fuzzy +#~ msgid "`%%%c' yields only last 2 digits of year in some locales" +#~ msgstr "`%%%c'Iheruka 2. Bya Umwaka in" + +#, fuzzy +#~ msgid "`%%%c' yields only last 2 digits of year" +#~ msgstr "`%%%c'Iheruka 2. Bya Umwaka" + +#, fuzzy +#~ msgid "no closing `]' for `%%[' format" +#~ msgstr "Oya kugirango Imiterere" + +#, fuzzy +#~ msgid "use of `%s' length modifier with `%c' type character" +#~ msgstr "Gukoresha Bya Uburebure Na: Ubwoko Inyuguti" + +#, fuzzy +#~ msgid "%s does not support the `%%%s%c' %s format" +#~ msgstr "%sOYA Gushigikira i Imiterere" + +#, fuzzy +#~ msgid "operand number specified with suppressed assignment" +#~ msgstr "Umubare Na: Igenera" + +#, fuzzy +#~ msgid "operand number specified for format taking no argument" +#~ msgstr "Umubare kugirango Imiterere Oya" + +#, fuzzy +#~ msgid "writing through null pointer (arg %d)" +#~ msgstr "Gihinguranya NTAGIHARI Mweretsi" + +#, fuzzy +#~ msgid "reading through null pointer (arg %d)" +#~ msgstr "Gihinguranya NTAGIHARI Mweretsi" + +#, fuzzy +#~ msgid "writing into constant object (arg %d)" +#~ msgstr "Igikoresho" + +#, fuzzy +#~ msgid "extra type qualifiers in format argument (arg %d)" +#~ msgstr "Birenga Ubwoko in Imiterere" + +#, fuzzy +#~ msgid "format argument is not a pointer (arg %d)" +#~ msgstr "Imiterere ni OYA a Mweretsi" + +#, fuzzy +#~ msgid "format argument is not a pointer to a pointer (arg %d)" +#~ msgstr "Imiterere ni OYA a Mweretsi Kuri a Mweretsi" + +#, fuzzy +#~ msgid "pointer" +#~ msgstr "Mweretsi" + +#, fuzzy +#~ msgid "different type" +#~ msgstr "Ubwoko" + +#, fuzzy +#~ msgid "%s is not type %s (arg %d)" +#~ msgstr "%sni OYA Ubwoko" + +#, fuzzy +#~ msgid "%s format, %s arg (arg %d)" +#~ msgstr "%sImiterere" + +#, fuzzy +#~ msgid "YYDEBUG not defined" +#~ msgstr "OYA" + +#, fuzzy +#~ msgid "badly nested C headers from preprocessor" +#~ msgstr "C Imitwe Bivuye" + +#, fuzzy +#~ msgid "universal-character-name '\\u%04x' not valid in identifier" +#~ msgstr "Ky'isi yose Inyuguti Izina: OYA Byemewe in Ikiranga" + +#, fuzzy +#~ msgid "stray '%c' in program" +#~ msgstr "in Porogaramu" + +#, fuzzy +#~ msgid "stray '\\%o' in program" +#~ msgstr "in Porogaramu" + +#, fuzzy +#~ msgid "this decimal constant is unsigned only in ISO C90" +#~ msgstr "iyi NYACUMI ni Bitashizweho umukono in" + +#, fuzzy +#~ msgid "this decimal constant would be unsigned in ISO C90" +#~ msgstr "iyi NYACUMI Bitashizweho umukono in" + +#, fuzzy +#~ msgid "integer constant is too large for \"%s\" type" +#~ msgstr "Umubare wuzuye ni Binini kugirango Ubwoko" + +#, fuzzy +#~ msgid "floating constant exceeds range of \"%s\"" +#~ msgstr "Bihindagurika Urutonde Bya" + +#, fuzzy +#~ msgid "ignoring invalid multibyte character" +#~ msgstr "Sibyo Inyuguti" + +#, fuzzy +#~ msgid "missing argument to \"-%s\"" +#~ msgstr "Ibuze Kuri" + +#, fuzzy +#~ msgid "no class name specified with \"-%s\"" +#~ msgstr "Oya ishuri Izina: Na:" + +#, fuzzy +#~ msgid "missing filename after \"-%s\"" +#~ msgstr "Ibuze Izina ry'idosiye: Nyuma" + +#, fuzzy +#~ msgid "missing target after \"-%s\"" +#~ msgstr "Ibuze Intego Nyuma" + +#, fuzzy +#~ msgid "options array incorrectly sorted: %s is before %s" +#~ msgstr "Amahitamo Imbonerahamwe bishunguwe ni Mbere" + +#, fuzzy +#~ msgid "too many filenames given. Type %s --help for usage" +#~ msgstr "Ifashayobora kugirango Ikoresha:" + +#, fuzzy +#~ msgid "-Wno-strict-prototypes is not supported in C++" +#~ msgstr "-ni OYA in C" + +#, fuzzy +#~ msgid "switch \"%s\" is no longer supported" +#~ msgstr "Hindura ni Oya" + +#, fuzzy +#~ msgid "switch \"%s\" is deprecated, please see documentation for details" +#~ msgstr "Hindura ni Bitemewe. kugirango Birambuye" + +#, fuzzy +#~ msgid "-fhandle-exceptions has been renamed to -fexceptions (and is now on by default)" +#~ msgstr "-Amarengayobora Kuri Na ni NONEAHA ku ku Mburabuzi" + +#, fuzzy +#~ msgid "output filename specified twice" +#~ msgstr "Ibisohoka Izina ry'idosiye:" + +#, fuzzy +#~ msgid "-Wformat-extra-args ignored without -Wformat" +#~ msgstr "-Birenga" + +#, fuzzy +#~ msgid "-Wformat-zero-length ignored without -Wformat" +#~ msgstr "-Zeru Uburebure" + +#, fuzzy +#~ msgid "-Wformat-security ignored without -Wformat" +#~ msgstr "-Umutekano" + +#, fuzzy +#~ msgid "-Wmissing-format-attribute ignored without -Wformat" +#~ msgstr "-Imiterere Ikiranga" + +#, fuzzy +#~ msgid "opening output file %s" +#~ msgstr "Gufungura %s%S Ibisohoka IDOSIYE" + +#, fuzzy +#~ msgid "opening dependency file %s" +#~ msgstr "Gufungura %s%S IDOSIYE" + +#, fuzzy +#~ msgid "closing dependency file %s" +#~ msgstr "IDOSIYE" + +#, fuzzy +#~ msgid "when writing output to %s" +#~ msgstr "Ryari: Ibisohoka Kuri" + +#, fuzzy +#~ msgid "to generate dependencies you must specify either -M or -MM" +#~ msgstr "Kuri Cyangwa" + +#, fuzzy +#~ msgid "\"-%s\" is valid for %s but not for %s" +#~ msgstr "\"-%s\"ni Byemewe kugirango OYA kugirango" + +#, fuzzy +#~ msgid "" +#~ "Switches:\n" +#~ " -include Include the contents of before other files\n" +#~ " -imacros Accept definition of macros in \n" +#~ " -iprefix Specify as a prefix for next two options\n" +#~ " -iwithprefix Add to the end of the system include path\n" +#~ " -iwithprefixbefore Add to the end of the main include path\n" +#~ " -isystem Add to the start of the system include path\n" +#~ msgstr "Gushyiramo IDOSIYE i Ibigize Bya IDOSIYE Mbere Ikindi IDOSIYE Insobanuro Bya Makoro in IDOSIYE Inzira Inzira Nka a Imbanziriza kugirango Komeza>> Kuri i Impera Bya i Sisitemu Gushyiramo Kuri i Impera Bya i Gushyiramo Kuri i Gutangira Bya i Sisitemu Gushyiramo" + +#, fuzzy +#~ msgid "" +#~ " -idirafter Add to the end of the system include path\n" +#~ " -I Add to the end of the main include path\n" +#~ " -I- Fine-grained include path control; see info docs\n" +#~ " -nostdinc Do not search system include directories\n" +#~ " (dirs specified with -isystem will still be used)\n" +#~ " -nostdinc++ Do not search system include directories for C++\n" +#~ " -o Put output into \n" +#~ msgstr "-Kuri i Impera Bya i Sisitemu Gushyiramo Kuri i Impera Bya i Gushyiramo Gushyiramo Inzira Igenzura Ibisobanuro OYA Gushaka Sisitemu Gushyiramo Na: OYA Gushaka Sisitemu Gushyiramo ububiko bw'amaderese kugirango C o IDOSIYE Ibisohoka IDOSIYE" + +#, fuzzy +#~ msgid "" +#~ " -trigraphs Support ISO C trigraphs\n" +#~ " -std= Specify the conformance standard; one of:\n" +#~ " gnu89, gnu99, c89, c99, iso9899:1990,\n" +#~ " iso9899:199409, iso9899:1999, c++98\n" +#~ " -w Inhibit warning messages\n" +#~ " -W[no-]trigraphs Warn if trigraphs are encountered\n" +#~ " -W[no-]comment{s} Warn if one comment starts inside another\n" +#~ msgstr "-C STD STD Izina: i Bisanzwe Bya C W Iburira Oya NIBA Oya Icyo wongeraho S NIBA Icyo wongeraho Mo Imbere" + +#, fuzzy +#~ msgid "" +#~ " -W[no-]traditional Warn about features not present in traditional C\n" +#~ " -W[no-]undef Warn if an undefined macro is used by #if\n" +#~ " -W[no-]import Warn about the use of the #import directive\n" +#~ msgstr "-Oya Ibyerekeye Ibiranga OYA in Oya NIBA kidasobanuye Makoro ni ku Oya Kuzana Ibyerekeye i Gukoresha Bya i Kuzana" + +#, fuzzy +#~ msgid "" +#~ " -W[no-]error Treat all warnings as errors\n" +#~ " -W[no-]system-headers Do not suppress warnings from system headers\n" +#~ " -W[no-]all Enable most preprocessor warnings\n" +#~ msgstr "-Oya Ikosa Byose Iburira Nka Oya Sisitemu Imitwe OYA Iburira Bivuye Sisitemu Oya Byose" + +#, fuzzy +#~ msgid "" +#~ " -M Generate make dependencies\n" +#~ " -MM As -M, but ignore system header files\n" +#~ " -MD Generate make dependencies and compile\n" +#~ " -MMD As -MD, but ignore system header files\n" +#~ " -MF Write dependency output to the given file\n" +#~ " -MG Treat missing header file as generated files\n" +#~ msgstr "-Ubwoko Kwirengagiza Sisitemu Umutwempangano Ubwoko Na Kwirengagiza Sisitemu Umutwempangano IDOSIYE Ibisohoka Kuri i Ibuze Umutwempangano IDOSIYE Nka" + +#, fuzzy +#~ msgid "" +#~ " -MP\t\t\t Generate phony targets for all headers\n" +#~ " -MQ Add a MAKE-quoted target\n" +#~ " -MT Add an unquoted target\n" +#~ msgstr "-kugirango Byose Intego a Intego" + +#, fuzzy +#~ msgid "" +#~ " -D Define a with string '1' as its value\n" +#~ " -D= Define a with as its value\n" +#~ " -A= Assert the to \n" +#~ " -A-= Disable the to \n" +#~ " -U Undefine \n" +#~ " -v Display the version number\n" +#~ msgstr "-Makoro a Makoro Na: Ikurikiranyanyuguti Nka Makoro a Makoro Na: Nka A i Kuri A i Kuri U Makoro Makoro v i Verisiyo" + +#, fuzzy +#~ msgid "" +#~ " -H Print the name of header files as they are used\n" +#~ " -C Do not discard comments\n" +#~ " -dM Display a list of macro definitions active at end\n" +#~ " -dD Preserve macro definitions in output\n" +#~ " -dN As -dD except that only the names are preserved\n" +#~ " -dI Include #include directives in the output\n" +#~ msgstr "-H i Izina: Bya Umutwempangano Idosiye Nka C OYA Kwanga a Urutonde Bya Makoro Gikora ku Makoro in i Amazina Gushyiramo in i" + +#, fuzzy +#~ msgid "" +#~ " -f[no-]preprocessed Treat the input file as already preprocessed\n" +#~ " -ftabstop= Distance between tab stops for column reporting\n" +#~ " -P Do not generate #line directives\n" +#~ " -remap Remap file names when including files\n" +#~ " --help Display this information\n" +#~ msgstr "-F Oya i Iyinjiza IDOSIYE Nka Umubare hagati Isunika kugirango Inkingi OYA Umurongo IDOSIYE Amazina Ryari: Ifashayobora iyi" + +#~ msgid "syntax error" +#~ msgstr "Ikosa mu myandikire" + +#, fuzzy +#~ msgid "syntax error: cannot back up" +#~ msgstr "Ikosa Inyuma Hejuru" + +#, fuzzy +#~ msgid "ISO C forbids an empty source file" +#~ msgstr "C ubusa Inkomoko IDOSIYE" + +#, fuzzy +#~ msgid "argument of `asm' is not a constant string" +#~ msgstr "Bya ni OYA a Ikurikiranyanyuguti" + +#, fuzzy +#~ msgid "ISO C forbids data definition with no type or storage class" +#~ msgstr "C Ibyatanzwe Insobanuro Na: Oya Ubwoko Cyangwa ishuri" + +#, fuzzy +#~ msgid "data definition has no type or storage class" +#~ msgstr "Ibyatanzwe Insobanuro Oya Ubwoko Cyangwa ishuri" + +#, fuzzy +#~ msgid "ISO C does not allow extra `;' outside of a function" +#~ msgstr "C OYA Kwemerera Birenga Hanze Bya a Umumaro" + +#, fuzzy +#~ msgid "`sizeof' applied to a bit-field" +#~ msgstr "`Byashyizweho Kuri a Umwanya" + +#, fuzzy +#~ msgid "ISO C forbids omitting the middle term of a ?: expression" +#~ msgstr "C i Hagati Ijambo Bya a imvugo" + +#, fuzzy +#~ msgid "ISO C forbids braced-groups within expressions" +#~ msgstr "C Amatsinda muri" + +#, fuzzy +#~ msgid "first argument to __builtin_choose_expr not a constant" +#~ msgstr "Itangira Kuri OYA a" + +#, fuzzy +#~ msgid "traditional C rejects ISO C style function definitions" +#~ msgstr "C C IMISUSIRE Umumaro" + +#, fuzzy +#~ msgid "`%s' is not at beginning of declaration" +#~ msgstr "`%s'ni OYA ku Itangiriro Bya" + +#, fuzzy +#~ msgid "ISO C forbids empty initializer braces" +#~ msgstr "C ubusa Ingirwadusodeko" + +#, fuzzy +#~ msgid "ISO C89 forbids specifying subobject to initialize" +#~ msgstr "Kuri gutangiza" + +#, fuzzy +#~ msgid "obsolete use of designated initializer without `='" +#~ msgstr "Gukoresha Bya" + +#, fuzzy +#~ msgid "obsolete use of designated initializer with `:'" +#~ msgstr "Gukoresha Bya Na:" + +#, fuzzy +#~ msgid "ISO C forbids specifying range of elements to initialize" +#~ msgstr "C Urutonde Bya Ibintu Kuri gutangiza" + +#, fuzzy +#~ msgid "ISO C forbids nested functions" +#~ msgstr "C Imimaro" + +#, fuzzy +#~ msgid "ISO C forbids forward references to `enum' types" +#~ msgstr "C Imbere Indango Kuri" + +#, fuzzy +#~ msgid "comma at end of enumerator list" +#~ msgstr "Akitso ku Impera Bya Urutonde" + +#, fuzzy +#~ msgid "no semicolon at end of struct or union" +#~ msgstr "Oya Akabago n'Akitso ku Impera Bya Cyangwa Ihuza" + +#, fuzzy +#~ msgid "extra semicolon in struct or union specified" +#~ msgstr "Birenga Akabago n'Akitso in Cyangwa Ihuza" + +#, fuzzy +#~ msgid "ISO C doesn't support unnamed structs/unions" +#~ msgstr "C Gushigikira Kitiswe" + +#, fuzzy +#~ msgid "ISO C forbids member declarations with no members" +#~ msgstr "C Na: Oya" + +#, fuzzy +#~ msgid "deprecated use of label at end of compound statement" +#~ msgstr "Bitemewe. Gukoresha Bya Akarango ku Impera Bya Inyandiko" + +#, fuzzy +#~ msgid "ISO C89 forbids mixed declarations and code" +#~ msgstr "Bivanze Na ITEGEKONGENGA" + +#, fuzzy +#~ msgid "ISO C forbids label declarations" +#~ msgstr "C Akarango" + +#, fuzzy +#~ msgid "braced-group within expression allowed only inside a function" +#~ msgstr "Itsinda muri imvugo Mo Imbere a Umumaro" + +#, fuzzy +#~ msgid "empty body in an else-statement" +#~ msgstr "ubusa Umubiri in Ikindi Inyandiko" + +#, fuzzy +#~ msgid "ISO C forbids `goto *expr;'" +#~ msgstr "C" + +#, fuzzy +#~ msgid "ISO C forbids forward parameter declarations" +#~ msgstr "C Imbere" + +#, fuzzy +#~ msgid "ISO C requires a named argument before `...'" +#~ msgstr "C a Mbere" + +#, fuzzy +#~ msgid "`...' in old-style identifier list" +#~ msgstr "`...'in ki/ bishaje IMISUSIRE Ikiranga Urutonde" + +#, fuzzy +#~ msgid "parse error; also virtual memory exhausted" +#~ msgstr "Ikosa Kitaboneka Ububiko" + +#, fuzzy +#~ msgid "parse error" +#~ msgstr "Ikosa" + +#, fuzzy +#~ msgid "parser stack overflow" +#~ msgstr "Byarenze urugero" + +#, fuzzy +#~ msgid "%s at end of input" +#~ msgstr "%sku Impera Bya Iyinjiza" + +#, fuzzy +#~ msgid "%s before %s'%c'" +#~ msgstr "%sMbere" + +#, fuzzy +#~ msgid "%s before %s'\\x%x'" +#~ msgstr "%sMbere" + +#, fuzzy +#~ msgid "%s before string constant" +#~ msgstr "%sMbere Ikurikiranyanyuguti" + +#, fuzzy +#~ msgid "%s before numeric constant" +#~ msgstr "%sMbere Bikurikije umubare" + +#, fuzzy +#~ msgid "%s before \"%s\"" +#~ msgstr "%sMbere" + +#, fuzzy +#~ msgid "%s before '%s' token" +#~ msgstr "%sMbere" + +#, fuzzy +#~ msgid "traditional C rejects string concatenation" +#~ msgstr "C Ikurikiranyanyuguti" + +#, fuzzy +#~ msgid "syntax error at '%s' token" +#~ msgstr "Ikosa ku" + +#, fuzzy +#~ msgid "#pragma pack (pop) encountered without matching #pragma pack (push, )" +#~ msgstr "#Ipaki Ipaki N" + +#, fuzzy +#~ msgid "#pragma pack(pop, %s) encountered without matching #pragma pack(push, %s, )" +#~ msgstr "#Ipaki Ipaki N" + +#, fuzzy +#~ msgid "#pragma pack(push[, id], ) is not supported on this target" +#~ msgstr "#Ipaki ID N ni OYA ku iyi Intego" + +#, fuzzy +#~ msgid "#pragma pack(pop[, id], ) is not supported on this target" +#~ msgstr "#Ipaki ID N ni OYA ku iyi Intego" + +#, fuzzy +#~ msgid "missing '(' after '#pragma pack' - ignored" +#~ msgstr "Ibuze Nyuma" + +#, fuzzy +#~ msgid "malformed '#pragma pack(push[, id], )' - ignored" +#~ msgstr "Ipaki ID N" + +#, fuzzy +#~ msgid "malformed '#pragma pack(pop[, id])' - ignored" +#~ msgstr "Ipaki ID" + +#, fuzzy +#~ msgid "unknown action '%s' for '#pragma pack' - ignored" +#~ msgstr "Kitazwi Igikorwa kugirango" + +#, fuzzy +#~ msgid "junk at end of '#pragma pack'" +#~ msgstr "Umwanda ku Impera Bya" + +#, fuzzy +#~ msgid "alignment must be a small power of two, not %d" +#~ msgstr "Itunganya a Gitoya UMWIKUBE Bya OYA" + +#, fuzzy +#~ msgid "applying #pragma weak `%s' after first use results in unspecified behavior" +#~ msgstr "Nyuma Itangira Gukoresha Ibisubizo ku in imyitwarire" + +#, fuzzy +#~ msgid "junk at end of #pragma weak" +#~ msgstr "Umwanda ku Impera Bya" + +#, fuzzy +#~ msgid "junk at end of #pragma redefine_extname" +#~ msgstr "Umwanda ku Impera Bya" + +#, fuzzy +#~ msgid "#pragma redefine_extname conflicts with declaration" +#~ msgstr "#Na:" + +#, fuzzy +#~ msgid "junk at end of #pragma extern_prefix" +#~ msgstr "Umwanda ku Impera Bya" + +#, fuzzy +#~ msgid "asm declaration conflicts with previous rename" +#~ msgstr "Na: Ibanjirije Guhindura izina" + +#, fuzzy +#~ msgid "break statement not within loop or switch" +#~ msgstr "itandukanya Inyandiko OYA muri Cyangwa Hindura" + +#, fuzzy +#~ msgid "continue statement not within a loop" +#~ msgstr "urifuzagukomeza Inyandiko OYA muri a" + +#, fuzzy +#~ msgid "destructor needed for `%#D'" +#~ msgstr "kugirango" + +#, fuzzy +#~ msgid "where case label appears here" +#~ msgstr "Akarango" + +#, fuzzy +#~ msgid "(enclose actions of previous case statements requiring destructors in their own scope.)" +#~ msgstr "(Bya Ibanjirije in Ingano:" + +#, fuzzy +#~ msgid "%s qualifier ignored on asm" +#~ msgstr "%sku" + +#, fuzzy +#~ msgid "`%s' has an incomplete type" +#~ msgstr "`%s'Ubwoko" + +#, fuzzy +#~ msgid "invalid use of void expression" +#~ msgstr "Sibyo Gukoresha Bya imvugo" + +#, fuzzy +#~ msgid "invalid use of flexible array member" +#~ msgstr "Sibyo Gukoresha Bya Imbonerahamwe" + +#, fuzzy +#~ msgid "invalid use of array with unspecified bounds" +#~ msgstr "Sibyo Gukoresha Bya Imbonerahamwe Na:" + +#, fuzzy +#~ msgid "invalid use of undefined type `%s %s'" +#~ msgstr "Sibyo Gukoresha Bya kidasobanuye Ubwoko" + +#, fuzzy +#~ msgid "invalid use of incomplete typedef `%s'" +#~ msgstr "Sibyo Gukoresha Bya" + +#, fuzzy +#~ msgid "function types not truly compatible in ISO C" +#~ msgstr "Umumaro OYA in C" + +#, fuzzy +#~ msgid "types are not quite compatible" +#~ msgstr "OYA" + +#, fuzzy +#~ msgid "arithmetic on pointer to an incomplete type" +#~ msgstr "ku Mweretsi Kuri Ubwoko" + +#, fuzzy +#~ msgid "%s has no member named `%s'" +#~ msgstr "%sOya" + +#, fuzzy +#~ msgid "request for member `%s' in something not a structure or union" +#~ msgstr "Kubaza... kugirango in OYA a Imiterere Cyangwa Ihuza" + +#, fuzzy +#~ msgid "dereferencing pointer to incomplete type" +#~ msgstr "Mweretsi Kuri Ubwoko" + +#, fuzzy +#~ msgid "dereferencing `void *' pointer" +#~ msgstr "Mweretsi" + +#, fuzzy +#~ msgid "invalid type argument of `%s'" +#~ msgstr "Sibyo Ubwoko Bya" + +#, fuzzy +#~ msgid "subscript missing in array reference" +#~ msgstr "Inyandiko nyesi Ibuze in Imbonerahamwe Indango" + +#, fuzzy +#~ msgid "array subscript has type `char'" +#~ msgstr "Imbonerahamwe Inyandiko nyesi Ubwoko" + +#, fuzzy +#~ msgid "array subscript is not an integer" +#~ msgstr "Imbonerahamwe Inyandiko nyesi ni OYA Umubare wuzuye" + +#, fuzzy +#~ msgid "ISO C forbids subscripting `register' array" +#~ msgstr "C Imbonerahamwe" + +#, fuzzy +#~ msgid "ISO C90 forbids subscripting non-lvalue array" +#~ msgstr "Imbonerahamwe" + +#, fuzzy +#~ msgid "subscript has type `char'" +#~ msgstr "Inyandiko nyesi Ubwoko" + +#, fuzzy +#~ msgid "subscripted value is neither array nor pointer" +#~ msgstr "Agaciro ni Imbonerahamwe Mweretsi" + +#, fuzzy +#~ msgid "`%s' undeclared here (not in a function)" +#~ msgstr "`%s'OYA in a Umumaro" + +#, fuzzy +#~ msgid "`%s' undeclared (first use in this function)" +#~ msgstr "`%s'Itangira Gukoresha in iyi Umumaro" + +#, fuzzy +#~ msgid "(Each undeclared identifier is reported only once" +#~ msgstr "(Ikiranga ni Rimwe" + +#, fuzzy +#~ msgid "for each function it appears in.)" +#~ msgstr "kugirango Umumaro in" + +#, fuzzy +#~ msgid "local declaration of `%s' hides instance variable" +#~ msgstr "Bya Urugero IMPINDURAGACIRO" + +#, fuzzy +#~ msgid "called object is not a function" +#~ msgstr "Igikoresho ni OYA a Umumaro" + +#, fuzzy +#~ msgid "too many arguments to function" +#~ msgstr "ingingo Kuri Umumaro" + +#, fuzzy +#~ msgid "type of formal parameter %d is incomplete" +#~ msgstr "Ubwoko Bya ni" + +#, fuzzy +#~ msgid "%s as integer rather than floating due to prototype" +#~ msgstr "%sNka Umubare wuzuye Bihindagurika Kuri" + +#, fuzzy +#~ msgid "%s as integer rather than complex due to prototype" +#~ msgstr "%sNka Umubare wuzuye ITSINDA RY'IMIBARE C Kuri" + +#, fuzzy +#~ msgid "%s as complex rather than floating due to prototype" +#~ msgstr "%sNka ITSINDA RY'IMIBARE C Bihindagurika Kuri" + +#, fuzzy +#~ msgid "%s as floating rather than integer due to prototype" +#~ msgstr "%sNka Bihindagurika Umubare wuzuye Kuri" + +#, fuzzy +#~ msgid "%s as complex rather than integer due to prototype" +#~ msgstr "%sNka ITSINDA RY'IMIBARE C Umubare wuzuye Kuri" + +#, fuzzy +#~ msgid "%s as floating rather than complex due to prototype" +#~ msgstr "%sNka Bihindagurika ITSINDA RY'IMIBARE C Kuri" + +#, fuzzy +#~ msgid "%s as `float' rather than `double' due to prototype" +#~ msgstr "%sNka Kuri" + +#, fuzzy +#~ msgid "%s with different width due to prototype" +#~ msgstr "%sNa: Ubugari Kuri" + +#, fuzzy +#~ msgid "%s as unsigned due to prototype" +#~ msgstr "%sNka Bitashizweho umukono Kuri" + +#, fuzzy +#~ msgid "%s as signed due to prototype" +#~ msgstr "%sNka Kuri" + +#, fuzzy +#~ msgid "too few arguments to function" +#~ msgstr "ingingo Kuri Umumaro" + +#, fuzzy +#~ msgid "suggest parentheses around + or - inside shift" +#~ msgstr "Cyangwa Mo Imbere Gusunika" + +#, fuzzy +#~ msgid "suggest parentheses around && within ||" +#~ msgstr "muri" + +#, fuzzy +#~ msgid "suggest parentheses around arithmetic in operand of |" +#~ msgstr "in Bya" + +#, fuzzy +#~ msgid "suggest parentheses around comparison in operand of |" +#~ msgstr "in Bya" + +#, fuzzy +#~ msgid "suggest parentheses around arithmetic in operand of ^" +#~ msgstr "in Bya" + +#, fuzzy +#~ msgid "suggest parentheses around comparison in operand of ^" +#~ msgstr "in Bya" + +#, fuzzy +#~ msgid "suggest parentheses around + or - in operand of &" +#~ msgstr "Cyangwa in Bya" + +#, fuzzy +#~ msgid "suggest parentheses around comparison in operand of &" +#~ msgstr "in Bya" + +#, fuzzy +#~ msgid "comparisons like X<=Y<=Z do not have their mathematical meaning" +#~ msgstr "nka OYA Bijyanye n'imibare Igisobanuro" + +#, fuzzy +#~ msgid "division by zero" +#~ msgstr "Kugabanya na zeru" + +#, fuzzy +#~ msgid "right shift count is negative" +#~ msgstr "Iburyo: Gusunika IBARA ni" + +#, fuzzy +#~ msgid "right shift count >= width of type" +#~ msgstr "Iburyo: Gusunika IBARA Ubugari Bya Ubwoko" + +#, fuzzy +#~ msgid "left shift count is negative" +#~ msgstr "Ibumoso: Gusunika IBARA ni" + +#, fuzzy +#~ msgid "left shift count >= width of type" +#~ msgstr "Ibumoso: Gusunika IBARA Ubugari Bya Ubwoko" + +#, fuzzy +#~ msgid "shift count is negative" +#~ msgstr "Gusunika IBARA ni" + +#, fuzzy +#~ msgid "shift count >= width of type" +#~ msgstr "Gusunika IBARA Ubugari Bya Ubwoko" + +#, fuzzy +#~ msgid "comparing floating point with == or != is unsafe" +#~ msgstr "Bihindagurika Akadomo Na: Cyangwa ni" + +#, fuzzy +#~ msgid "ISO C forbids comparison of `void *' with function pointer" +#~ msgstr "C Bya Na: Umumaro Mweretsi" + +#, fuzzy +#~ msgid "comparison of distinct pointer types lacks a cast" +#~ msgstr "Bya Mweretsi a" + +#, fuzzy +#~ msgid "comparison between pointer and integer" +#~ msgstr "hagati Mweretsi Na Umubare wuzuye" + +#, fuzzy +#~ msgid "ISO C forbids ordered comparisons of pointers to functions" +#~ msgstr "C Bya Kuri Imimaro" + +#, fuzzy +#~ msgid "comparison of complete and incomplete pointers" +#~ msgstr "Bya Byuzuye Na" + +#, fuzzy +#~ msgid "ordered comparison of pointer with integer zero" +#~ msgstr "Bya Mweretsi Na: Umubare wuzuye Zeru" + +#, fuzzy +#~ msgid "unordered comparison on non-floating point argument" +#~ msgstr "ku Bihindagurika Akadomo" + +#, fuzzy +#~ msgid "comparison between signed and unsigned" +#~ msgstr "hagati Na Bitashizweho umukono" + +#, fuzzy +#~ msgid "comparison of promoted ~unsigned with constant" +#~ msgstr "Bya Bitashizweho umukono Na:" + +#, fuzzy +#~ msgid "comparison of promoted ~unsigned with unsigned" +#~ msgstr "Bya Bitashizweho umukono Na: Bitashizweho umukono" + +#, fuzzy +#~ msgid "pointer of type `void *' used in subtraction" +#~ msgstr "Mweretsi Bya Ubwoko in Gukuramo" + +#, fuzzy +#~ msgid "pointer to a function used in subtraction" +#~ msgstr "Mweretsi Kuri a Umumaro in Gukuramo" + +#, fuzzy +#~ msgid "wrong type argument to unary plus" +#~ msgstr "Ubwoko Kuri Guteranya" + +#, fuzzy +#~ msgid "wrong type argument to unary minus" +#~ msgstr "Ubwoko Kuri" + +#, fuzzy +#~ msgid "ISO C does not support `~' for complex conjugation" +#~ msgstr "C OYA Gushigikira kugirango ITSINDA RY'IMIBARE C" + +#, fuzzy +#~ msgid "wrong type argument to bit-complement" +#~ msgstr "Ubwoko Kuri" + +#, fuzzy +#~ msgid "wrong type argument to abs" +#~ msgstr "Ubwoko Kuri ABS" + +#, fuzzy +#~ msgid "wrong type argument to conjugation" +#~ msgstr "Ubwoko Kuri" + +#, fuzzy +#~ msgid "wrong type argument to unary exclamation mark" +#~ msgstr "Ubwoko Kuri Ikimenyetso" + +#, fuzzy +#~ msgid "ISO C does not support `++' and `--' on complex types" +#~ msgstr "C OYA Gushigikira Na ku ITSINDA RY'IMIBARE C" + +#, fuzzy +#~ msgid "wrong type argument to increment" +#~ msgstr "Ubwoko Kuri Iyongeragaciro" + +#, fuzzy +#~ msgid "wrong type argument to decrement" +#~ msgstr "Ubwoko Kuri" + +#, fuzzy +#~ msgid "increment of pointer to unknown structure" +#~ msgstr "Iyongeragaciro Bya Mweretsi Kuri Kitazwi Imiterere" + +#, fuzzy +#~ msgid "decrement of pointer to unknown structure" +#~ msgstr "Bya Mweretsi Kuri Kitazwi Imiterere" + +#, fuzzy +#~ msgid "ISO C forbids the address of a cast expression" +#~ msgstr "C i Aderesi Bya a imvugo" + +#, fuzzy +#~ msgid "invalid lvalue in unary `&'" +#~ msgstr "Sibyo in" + +#, fuzzy +#~ msgid "attempt to take address of bit-field structure member `%s'" +#~ msgstr "Kuri Aderesi Bya Umwanya Imiterere" + +# basctl/source\basicide\basidesh.src:RID_IMGBTN_REMOVEWATCH.text +#, fuzzy +#~ msgid "%s" +#~ msgstr "%s" + +#, fuzzy +#~ msgid "ISO C forbids use of conditional expressions as lvalues" +#~ msgstr "C Gukoresha Bya Nka" + +#, fuzzy +#~ msgid "ISO C forbids use of compound expressions as lvalues" +#~ msgstr "C Gukoresha Bya Nka" + +#, fuzzy +#~ msgid "ISO C forbids use of cast expressions as lvalues" +#~ msgstr "C Gukoresha Bya Nka" + +#, fuzzy +#~ msgid "%s of read-only member `%s'" +#~ msgstr "%sBya Gusoma" + +#, fuzzy +#~ msgid "%s of read-only variable `%s'" +#~ msgstr "%sBya Gusoma IMPINDURAGACIRO" + +#, fuzzy +#~ msgid "%s of read-only location" +#~ msgstr "%sBya Gusoma Ahantu" + +#, fuzzy +#~ msgid "cannot take address of bit-field `%s'" +#~ msgstr "Aderesi Bya Umwanya" + +#, fuzzy +#~ msgid "global register variable `%s' used in nested function" +#~ msgstr "Kwiyandikisha IMPINDURAGACIRO in Umumaro" + +#, fuzzy +#~ msgid "register variable `%s' used in nested function" +#~ msgstr "Kwiyandikisha IMPINDURAGACIRO in Umumaro" + +#, fuzzy +#~ msgid "address of global register variable `%s' requested" +#~ msgstr "Aderesi Bya Kwiyandikisha IMPINDURAGACIRO" + +#, fuzzy +#~ msgid "cannot put object with volatile field into register" +#~ msgstr "Gushyira Igikoresho Na: Umwanya Kwiyandikisha" + +#, fuzzy +#~ msgid "address of register variable `%s' requested" +#~ msgstr "Aderesi Bya Kwiyandikisha IMPINDURAGACIRO" + +#, fuzzy +#~ msgid "signed and unsigned type in conditional expression" +#~ msgstr "Na Bitashizweho umukono Ubwoko in imvugo" + +#, fuzzy +#~ msgid "ISO C forbids conditional expr with only one void side" +#~ msgstr "C Na:" + +#, fuzzy +#~ msgid "ISO C forbids conditional expr between `void *' and function pointer" +#~ msgstr "C hagati Na Umumaro Mweretsi" + +#, fuzzy +#~ msgid "pointer type mismatch in conditional expression" +#~ msgstr "Mweretsi Ubwoko in imvugo" + +#, fuzzy +#~ msgid "pointer/integer type mismatch in conditional expression" +#~ msgstr "Mweretsi Umubare wuzuye Ubwoko in imvugo" + +#, fuzzy +#~ msgid "type mismatch in conditional expression" +#~ msgstr "Ubwoko in imvugo" + +#, fuzzy +#~ msgid "left-hand operand of comma expression has no effect" +#~ msgstr "Ibumoso: Bya Akitso imvugo Oya INGARUKA" + +#, fuzzy +#~ msgid "cast specifies array type" +#~ msgstr "Imbonerahamwe Ubwoko" + +#, fuzzy +#~ msgid "cast specifies function type" +#~ msgstr "Umumaro Ubwoko" + +#, fuzzy +#~ msgid "ISO C forbids casting nonscalar to the same type" +#~ msgstr "C Kuri i Ubwoko" + +#, fuzzy +#~ msgid "ISO C forbids casts to union type" +#~ msgstr "C Kuri Ihuza Ubwoko" + +#, fuzzy +#~ msgid "cast to union type from type not present in union" +#~ msgstr "Kuri Ihuza Ubwoko Bivuye Ubwoko OYA in Ihuza" + +#, fuzzy +#~ msgid "cast adds new qualifiers to function type" +#~ msgstr "Gishya Kuri Umumaro Ubwoko" + +#, fuzzy +#~ msgid "cast discards qualifiers from pointer target type" +#~ msgstr "Bivuye Mweretsi Intego Ubwoko" + +#, fuzzy +#~ msgid "cast increases required alignment of target type" +#~ msgstr "Bya ngombwa Itunganya Bya Intego Ubwoko" + +#, fuzzy +#~ msgid "cast from pointer to integer of different size" +#~ msgstr "Bivuye Mweretsi Kuri Umubare wuzuye Bya Ingano" + +#, fuzzy +#~ msgid "cast does not match function type" +#~ msgstr "OYA BIHUYE Umumaro Ubwoko" + +#, fuzzy +#~ msgid "cast to pointer from integer of different size" +#~ msgstr "Kuri Mweretsi Bivuye Umubare wuzuye Bya Ingano" + +#, fuzzy +#~ msgid "type-punning to incomplete type might break strict-aliasing rules" +#~ msgstr "Ubwoko Kuri Ubwoko itandukanya" + +#, fuzzy +#~ msgid "dereferencing type-punned pointer will break strict-aliasing rules" +#~ msgstr "Ubwoko Mweretsi itandukanya" + +#, fuzzy +#~ msgid "invalid lvalue in assignment" +#~ msgstr "Sibyo in Igenera" + +#, fuzzy +#~ msgid "assignment" +#~ msgstr "Igenera" + +#, fuzzy +#~ msgid "cannot pass rvalue to reference parameter" +#~ msgstr "Kuri Indango" + +#, fuzzy +#~ msgid "%s makes qualified function pointer from unqualified" +#~ msgstr "%sUmumaro Mweretsi Bivuye" + +#, fuzzy +#~ msgid "%s discards qualifiers from pointer target type" +#~ msgstr "%sBivuye Mweretsi Intego Ubwoko" + +#, fuzzy +#~ msgid "ISO C prohibits argument conversion to union type" +#~ msgstr "C Ihindurangero Kuri Ihuza Ubwoko" + +#, fuzzy +#~ msgid "ISO C forbids %s between function pointer and `void *'" +#~ msgstr "C hagati Umumaro Mweretsi Na" + +#, fuzzy +#~ msgid "pointer targets in %s differ in signedness" +#~ msgstr "Mweretsi in in" + +#, fuzzy +#~ msgid "%s from incompatible pointer type" +#~ msgstr "%sBivuye Mweretsi Ubwoko" + +#, fuzzy +#~ msgid "%s makes pointer from integer without a cast" +#~ msgstr "%sMweretsi Bivuye Umubare wuzuye a" + +#, fuzzy +#~ msgid "%s makes integer from pointer without a cast" +#~ msgstr "%sUmubare wuzuye Bivuye Mweretsi a" + +#, fuzzy +#~ msgid "incompatible type for argument %d of `%s'" +#~ msgstr "Ubwoko kugirango Bya" + +#, fuzzy +#~ msgid "incompatible type for argument %d of indirect function call" +#~ msgstr "Ubwoko kugirango Bya BUZIGUYE Umumaro" + +#, fuzzy +#~ msgid "incompatible types in %s" +#~ msgstr "in" + +#, fuzzy +#~ msgid "passing arg of `%s'" +#~ msgstr "Bya" + +#, fuzzy +#~ msgid "passing arg of pointer to function" +#~ msgstr "Bya Mweretsi Kuri Umumaro" + +#, fuzzy +#~ msgid "passing arg %d of `%s'" +#~ msgstr "Bya" + +#, fuzzy +#~ msgid "passing arg %d of pointer to function" +#~ msgstr "Bya Mweretsi Kuri Umumaro" + +#, fuzzy +#~ msgid "initializer for static variable is not constant" +#~ msgstr "kugirango IMPINDURAGACIRO ni OYA" + +#, fuzzy +#~ msgid "initializer for static variable uses complicated arithmetic" +#~ msgstr "kugirango IMPINDURAGACIRO" + +#, fuzzy +#~ msgid "aggregate initializer is not constant" +#~ msgstr "ni OYA" + +#, fuzzy +#~ msgid "traditional C rejects automatic aggregate initialization" +#~ msgstr "C Byikoresha" + +#, fuzzy +#~ msgid "(near initialization for `%s')" +#~ msgstr "(kugirango" + +#, fuzzy +#~ msgid "char-array initialized from wide string" +#~ msgstr "INYUGUTI Imbonerahamwe Bivuye Ikurikiranyanyuguti" + +#, fuzzy +#~ msgid "int-array initialized from non-wide string" +#~ msgstr "INT Imbonerahamwe Bivuye Ikurikiranyanyuguti" + +#, fuzzy +#~ msgid "initializer-string for array of chars is too long" +#~ msgstr "Ikurikiranyanyuguti kugirango Imbonerahamwe Bya ni" + +#, fuzzy +#~ msgid "array initialized from non-constant array expression" +#~ msgstr "Imbonerahamwe Bivuye Imbonerahamwe imvugo" + +#, fuzzy +#~ msgid "initializer element is not constant" +#~ msgstr "Ikigize: ni OYA" + +#, fuzzy +#~ msgid "initializer element is not computable at load time" +#~ msgstr "Ikigize: ni OYA ku Ibirimo Igihe" + +#, fuzzy +#~ msgid "invalid initializer" +#~ msgstr "Sibyo" + +#, fuzzy +#~ msgid "extra brace group at end of initializer" +#~ msgstr "Birenga Itsinda ku Impera Bya" + +#, fuzzy +#~ msgid "missing braces around initializer" +#~ msgstr "Ibuze Ingirwadusodeko" + +#, fuzzy +#~ msgid "braces around scalar initializer" +#~ msgstr "Ingirwadusodeko" + +#, fuzzy +#~ msgid "initialization of flexible array member in a nested context" +#~ msgstr "Bya Imbonerahamwe in a Imvugiro" + +#, fuzzy +#~ msgid "initialization of a flexible array member" +#~ msgstr "Bya a Imbonerahamwe" + +#, fuzzy +#~ msgid "missing initializer" +#~ msgstr "Ibuze" + +#, fuzzy +#~ msgid "empty scalar initializer" +#~ msgstr "ubusa" + +#, fuzzy +#~ msgid "extra elements in scalar initializer" +#~ msgstr "Birenga Ibintu in" + +#, fuzzy +#~ msgid "initialization designators may not nest" +#~ msgstr "Gicurasi OYA" + +#, fuzzy +#~ msgid "array index in non-array initializer" +#~ msgstr "Imbonerahamwe Umubarendanga in Imbonerahamwe" + +#, fuzzy +#~ msgid "field name not in record or union initializer" +#~ msgstr "Umwanya Izina: OYA in Icyabitswe Cyangwa Ihuza" + +#, fuzzy +#~ msgid "nonconstant array index in initializer" +#~ msgstr "Imbonerahamwe Umubarendanga in" + +#, fuzzy +#~ msgid "array index in initializer exceeds array bounds" +#~ msgstr "Imbonerahamwe Umubarendanga in Imbonerahamwe" + +#, fuzzy +#~ msgid "empty index range in initializer" +#~ msgstr "ubusa Umubarendanga Urutonde in" + +#, fuzzy +#~ msgid "array index range in initializer exceeds array bounds" +#~ msgstr "Imbonerahamwe Umubarendanga Urutonde in Imbonerahamwe" + +#, fuzzy +#~ msgid "unknown field `%s' specified in initializer" +#~ msgstr "Kitazwi Umwanya in" + +#, fuzzy +#~ msgid "initialized field with side-effects overwritten" +#~ msgstr "Umwanya Na: Ingaruka" + +#, fuzzy +#~ msgid "excess elements in char array initializer" +#~ msgstr "Ibintu in INYUGUTI Imbonerahamwe" + +#, fuzzy +#~ msgid "excess elements in struct initializer" +#~ msgstr "Ibintu in" + +#, fuzzy +#~ msgid "non-static initialization of a flexible array member" +#~ msgstr "Bya a Imbonerahamwe" + +#, fuzzy +#~ msgid "excess elements in union initializer" +#~ msgstr "Ibintu in Ihuza" + +#, fuzzy +#~ msgid "traditional C rejects initialization of unions" +#~ msgstr "C Bya" + +#, fuzzy +#~ msgid "excess elements in array initializer" +#~ msgstr "Ibintu in Imbonerahamwe" + +#, fuzzy +#~ msgid "excess elements in vector initializer" +#~ msgstr "Ibintu in" + +#, fuzzy +#~ msgid "excess elements in scalar initializer" +#~ msgstr "Ibintu in" + +#, fuzzy +#~ msgid "asm template is not a string constant" +#~ msgstr "Inyandikorugero ni OYA a Ikurikiranyanyuguti" + +#, fuzzy +#~ msgid "invalid lvalue in asm statement" +#~ msgstr "Sibyo in Inyandiko" + +#, fuzzy +#~ msgid "modification by `asm'" +#~ msgstr "ku" + +#, fuzzy +#~ msgid "function declared `noreturn' has a `return' statement" +#~ msgstr "Umumaro a Inyandiko" + +#, fuzzy +#~ msgid "`return' with no value, in function returning non-void" +#~ msgstr "`Na: Oya Agaciro in Umumaro" + +#, fuzzy +#~ msgid "`return' with a value, in function returning void" +#~ msgstr "`Na: a Agaciro in Umumaro" + +#, fuzzy +#~ msgid "return" +#~ msgstr "Garuka" + +#, fuzzy +#~ msgid "function returns address of local variable" +#~ msgstr "Umumaro Aderesi Bya IMPINDURAGACIRO" + +#, fuzzy +#~ msgid "switch quantity not an integer" +#~ msgstr "Hindura Ingano OYA Umubare wuzuye" + +#, fuzzy +#~ msgid "`long' switch expression not converted to `int' in ISO C" +#~ msgstr "`Hindura imvugo OYA Kuri in C" + +#, fuzzy +#~ msgid "case label not within a switch statement" +#~ msgstr "Akarango OYA muri a Hindura Inyandiko" + +#, fuzzy +#~ msgid "`default' label not within a switch statement" +#~ msgstr "`Akarango OYA muri a Hindura Inyandiko" + +#, fuzzy +#~ msgid "inlining failed in call to `%s'" +#~ msgstr "Byanze in Kuri" + +#, fuzzy +#~ msgid "called from here" +#~ msgstr "Bivuye" + +#, fuzzy +#~ msgid "can't inline call to `%s'" +#~ msgstr "Mumurongo Kuri" + +#, fuzzy +#~ msgid "function call has aggregate value" +#~ msgstr "Umumaro Agaciro" + +#, fuzzy +#~ msgid "Size of loop %d should be %d, not %d." +#~ msgstr "Bya OYA" + +#, fuzzy +#~ msgid "Bb %d do not belong to loop %d." +#~ msgstr "OYA Kuri" + +#, fuzzy +#~ msgid "Loop %d's header does not have exactly 2 entries." +#~ msgstr "S Umutwempangano OYA 2. Ibyinjijwe" + +#, fuzzy +#~ msgid "Loop %d's latch does not have exactly 1 successor." +#~ msgstr "S OYA 1." + +#, fuzzy +#~ msgid "Loop %d's latch does not have header as successor." +#~ msgstr "S OYA Umutwempangano Nka" + +#, fuzzy +#~ msgid "Loop %d's latch does not belong directly to it." +#~ msgstr "S OYA Kuri" + +#, fuzzy +#~ msgid "Loop %d's header does not belong directly to it." +#~ msgstr "S Umutwempangano OYA Kuri" + +#, fuzzy +#~ msgid "bb %d on wrong place" +#~ msgstr "ku" + +#, fuzzy +#~ msgid "prev_bb of %d should be %d, not %d" +#~ msgstr "Bya OYA" + +#, fuzzy +#~ msgid "end insn %d for block %d not found in the insn stream" +#~ msgstr "Impera kugirango Funga OYA Byabonetse in i" + +#, fuzzy +#~ msgid "insn %d is in multiple basic blocks (%d and %d)" +#~ msgstr "ni in Igikubo BASIC Na" + +#, fuzzy +#~ msgid "head insn %d for block %d not found in the insn stream" +#~ msgstr "kugirango Funga OYA Byabonetse in i" + +#, fuzzy +#~ msgid "verify_flow_info: REG_BR_PROB does not match cfg %i %i" +#~ msgstr "OYA BIHUYE" + +#, fuzzy +#~ msgid "verify_flow_info: Wrong count of block %i %i" +#~ msgstr "IBARA Bya Funga" + +#, fuzzy +#~ msgid "verify_flow_info: Wrong frequency of block %i %i" +#~ msgstr "Ubwisubire Bya Funga" + +#, fuzzy +#~ msgid "verify_flow_info: Wrong probability of edge %i->%i %i" +#~ msgstr "Imishobokere Bya" + +#, fuzzy +#~ msgid "verify_flow_info: Wrong count of edge %i->%i %i" +#~ msgstr "IBARA Bya" + +#, fuzzy +#~ msgid "verify_flow_info: Incorrect blocks for fallthru %i->%i" +#~ msgstr "kugirango" + +#, fuzzy +#~ msgid "wrong insn in the fallthru edge" +#~ msgstr "in i" + +#, fuzzy +#~ msgid "verify_flow_info: Basic block %d succ edge is corrupted" +#~ msgstr "Funga ni" + +#, fuzzy +#~ msgid "Missing REG_EH_REGION note in the end of bb %i" +#~ msgstr "Impugukirwa in i Impera Bya" + +#, fuzzy +#~ msgid "Too many outgoing branch edges from bb %i" +#~ msgstr "Bivuye" + +#, fuzzy +#~ msgid "Fallthru edge after unconditional jump %i" +#~ msgstr "Nyuma Simbuka" + +#, fuzzy +#~ msgid "Wrong amount of branch edges after unconditional jump %i" +#~ msgstr "Igiteranyo Bya Nyuma Simbuka" + +#, fuzzy +#~ msgid "Wrong amount of branch edges after conditional jump %i" +#~ msgstr "Igiteranyo Bya Nyuma Simbuka" + +#, fuzzy +#~ msgid "Call edges for non-call insn in bb %i" +#~ msgstr "kugirango in" + +#, fuzzy +#~ msgid "Abnormal edges for no purpose in bb %i" +#~ msgstr "kugirango Oya Intego in" + +#, fuzzy +#~ msgid "missing barrier after block %i" +#~ msgstr "Ibuze Nyuma Funga" + +#, fuzzy +#~ msgid "basic block %d pred edge is corrupted" +#~ msgstr "BASIC Funga ni" + +#, fuzzy +#~ msgid "insn %d inside basic block %d but block_for_insn is NULL" +#~ msgstr "Mo Imbere BASIC Funga ni" + +#, fuzzy +#~ msgid "insn %d inside basic block %d but block_for_insn is %i" +#~ msgstr "Mo Imbere BASIC Funga ni" + +#, fuzzy +#~ msgid "NOTE_INSN_BASIC_BLOCK is missing for block %d" +#~ msgstr "ni Ibuze kugirango Funga" + +#, fuzzy +#~ msgid "NOTE_INSN_BASIC_BLOCK %d in middle of basic block %d" +#~ msgstr "in Hagati Bya BASIC Funga" + +#, fuzzy +#~ msgid "in basic block %d:" +#~ msgstr "in BASIC Funga" + +#, fuzzy +#~ msgid "flow control insn inside a basic block" +#~ msgstr "Igenzura Mo Imbere a BASIC Funga" + +#, fuzzy +#~ msgid "basic block %i edge lists are corrupted" +#~ msgstr "BASIC Funga Intonde" + +#, fuzzy +#~ msgid "basic blocks not numbered consecutively" +#~ msgstr "BASIC OYA Iriho Imibare" + +#, fuzzy +#~ msgid "insn outside basic block" +#~ msgstr "Hanze BASIC Funga" + +#, fuzzy +#~ msgid "return not followed by barrier" +#~ msgstr "Garuka OYA ku" + +#, fuzzy +#~ msgid "number of bb notes in insn chain (%d) != n_basic_blocks (%d)" +#~ msgstr "Umubare Bya Ibisobanuro in" + +#, fuzzy +#~ msgid "verify_flow_info failed" +#~ msgstr "Byanze" + +#, fuzzy +#~ msgid "internal error" +#~ msgstr "Ikosa ry'imbere" + +#, fuzzy +#~ msgid "no arguments" +#~ msgstr "Oya ingingo" + +#, fuzzy +#~ msgid "collect2 version %s" +#~ msgstr "Verisiyo" + +#, fuzzy +#~ msgid "%d constructor(s) found\n" +#~ msgstr "%dS" + +#, fuzzy +#~ msgid "%d destructor(s) found\n" +#~ msgstr "%dS" + +#, fuzzy +#~ msgid "%d frame table(s) found\n" +#~ msgstr "%dIkadiri imbonerahamwe# S" + +#, fuzzy +#~ msgid "%s terminated with signal %d [%s]%s" +#~ msgstr "%sNa:" + +#, fuzzy +#~ msgid "%s returned %d exit status" +#~ msgstr "%sGusohoka Imimerere" + +#, fuzzy +#~ msgid "[cannot find %s]" +#~ msgstr "[Gushaka" + +#, fuzzy +#~ msgid "cannot find `%s'" +#~ msgstr "Gushaka" + +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "write_c_file - output name is %s, prefix is %s\n" +#~ msgstr "Ibisohoka Izina: ni Imbanziriza ni" + +#, fuzzy +#~ msgid "cannot find `nm'" +#~ msgstr "Gushaka" + +#, fuzzy +#~ msgid "dup2 %d 1" +#~ msgstr "1." + +# svx/source\svdraw\svdstr.src:STR_EditShut.text +#, fuzzy +#~ msgid "close %d" +#~ msgstr "Gufunga" + +#, fuzzy +#~ msgid "init function found in object %s" +#~ msgstr "Umumaro Byabonetse in Igikoresho" + +#, fuzzy +#~ msgid "fini function found in object %s" +#~ msgstr "Umumaro Byabonetse in Igikoresho" + +#, fuzzy +#~ msgid "unable to open file '%s'" +#~ msgstr "Kuri Gufungura IDOSIYE" + +#, fuzzy +#~ msgid "unable to stat file '%s'" +#~ msgstr "Kuri IDOSIYE" + +#, fuzzy +#~ msgid "unable to mmap file '%s'" +#~ msgstr "Kuri IDOSIYE" + +#, fuzzy +#~ msgid "not found\n" +#~ msgstr "OYA" + +#, fuzzy +#~ msgid "dynamic dependency %s not found" +#~ msgstr "OYA Byabonetse" + +#, fuzzy +#~ msgid "bad magic number in file '%s'" +#~ msgstr "Umubare in IDOSIYE" + +#, fuzzy +#~ msgid "cannot find `ldd'" +#~ msgstr "Gushaka" + +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "ldd output with constructors/destructors.\n" +#~ msgstr "Ibisohoka Na:" + +#, fuzzy +#~ msgid "unable to open dynamic dependency '%s'" +#~ msgstr "Kuri Gufungura" + +#, fuzzy +#~ msgid "%s: not a COFF file" +#~ msgstr "%s:OYA a IDOSIYE" + +#, fuzzy +#~ msgid "%s: cannot open as COFF file" +#~ msgstr "%s:Gufungura Nka IDOSIYE" + +#, fuzzy +#~ msgid "library lib%s not found" +#~ msgstr "Isomero OYA Byabonetse" + +# sfx2/source\appl\minbox.src:RID_MAIL_INBOX.BTN_MAILINBOX_OPEN.text +#, fuzzy +#~ msgid "open %s" +#~ msgstr "Gufungura..." + +#, fuzzy +#~ msgid "incompatibilities between object file & expected values" +#~ msgstr "hagati Igikoresho IDOSIYE Ikitezwe: Uduciro" + +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "Processing symbol table #%d, offset = 0x%.8lx, kind = %s\n" +#~ msgstr "IKIMENYETSO imbonerahamwe# Nta- boneza" + +#, fuzzy +#~ msgid "string section missing" +#~ msgstr "Ikurikiranyanyuguti Icyiciro Ibuze" + +#, fuzzy +#~ msgid "section pointer missing" +#~ msgstr "Icyiciro Mweretsi Ibuze" + +#, fuzzy +#~ msgid "no symbol table found" +#~ msgstr "Oya IKIMENYETSO imbonerahamwe# Byabonetse" + +#, fuzzy +#~ msgid "no cmd_strings found" +#~ msgstr "Oya Byabonetse" + +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "Updating header and load commands.\n" +#~ "\n" +#~ msgstr "Umutwempangano Na Ibirimo Amabwiriza" + +#, fuzzy +#~ msgid "load command map, %d cmds, new size %ld.\n" +#~ msgstr "Ibirimo Komandi: Gishya Ingano" + +#, fuzzy +#~ msgid "" +#~ "writing load commands.\n" +#~ "\n" +#~ msgstr "Ibirimo Amabwiriza" + +# svx/source\svdraw\svdstr.src:STR_EditShut.text +#, fuzzy +#~ msgid "close %s" +#~ msgstr "Gufunga" + +#, fuzzy +#~ msgid "could not convert 0x%l.8x into a region" +#~ msgstr "OYA GUHINDURA a" + +#, fuzzy +#~ msgid "%s function, region %d, offset = %ld (0x%.8lx)\n" +#~ msgstr "%sUmumaro Nta- boneza" + +#, fuzzy +#~ msgid "bad magic number" +#~ msgstr "Umubare" + +#, fuzzy +#~ msgid "bad header version" +#~ msgstr "Umutwempangano Verisiyo" + +#, fuzzy +#~ msgid "bad raw header version" +#~ msgstr "Umutwempangano Verisiyo" + +#, fuzzy +#~ msgid "raw header buffer too small" +#~ msgstr "Umutwempangano Gitoya" + +#, fuzzy +#~ msgid "old raw header file" +#~ msgstr "ki/ bishaje Umutwempangano IDOSIYE" + +#, fuzzy +#~ msgid "unsupported version" +#~ msgstr "Verisiyo" + +#, fuzzy +#~ msgid "unknown {de,en}code_mach_o_hdr return value %d" +#~ msgstr "Kitazwi Garuka Agaciro" + +#, fuzzy +#~ msgid "lseek %s 0" +#~ msgstr "0" + +# svx/inc\globlmn.hrc:ITEM_FILE_MAIL_INBOX.text +#, fuzzy +#~ msgid "read %s" +#~ msgstr "Gusoma" + +#, fuzzy +#~ msgid "read %ld bytes, expected %ld, from %s" +#~ msgstr "Gusoma Bayite Ikitezwe: Bivuye" + +# #-#-#-#-# officecfg.pot (PACKAGE VERSION) #-#-#-#-# +# officecfg/registry\schema\org\openoffice\Office\Common.xcs:....Filter.HTML.Export.Browser..3.text +# #-#-#-#-# officecfg.pot (PACKAGE VERSION) #-#-#-#-# +# officecfg/registry\schema\org\openoffice\Office\Writer.xcs:....FormLetter.MailingOutput.Format..8.text +#, fuzzy +#~ msgid "write %s" +#~ msgstr "Kwandika" + +#, fuzzy +#~ msgid "wrote %ld bytes, expected %ld, to %s" +#~ msgstr "Bayite Ikitezwe: Kuri" + +#, fuzzy +#~ msgid "" +#~ ";; Combiner statistics: %d attempts, %d substitutions (%d requiring new space),\n" +#~ ";; %d successes.\n" +#~ "\n" +#~ msgstr ";;Sitatisitiki Gishya Umwanya Ibyatunganye" + +#, fuzzy +#~ msgid "" +#~ "\n" +#~ ";; Combiner totals: %d attempts, %d substitutions (%d requiring new space),\n" +#~ ";; %d successes.\n" +#~ msgstr ";;Gishya Umwanya Ibyatunganye" + +#, fuzzy +#~ msgid "cannot convert to a pointer type" +#~ msgstr "GUHINDURA Kuri a Mweretsi Ubwoko" + +#, fuzzy +#~ msgid "pointer value used where a floating point value was expected" +#~ msgstr "Mweretsi Agaciro a Bihindagurika Akadomo Agaciro Ikitezwe:" + +#, fuzzy +#~ msgid "aggregate value used where a float was expected" +#~ msgstr "Agaciro a Kureremba Ikitezwe:" + +#, fuzzy +#~ msgid "conversion to incomplete type" +#~ msgstr "Ihindurangero Kuri Ubwoko" + +#, fuzzy +#~ msgid "can't convert between vector values of different size" +#~ msgstr "GUHINDURA hagati Uduciro Bya Ingano" + +#, fuzzy +#~ msgid "aggregate value used where an integer was expected" +#~ msgstr "Agaciro Umubare wuzuye Ikitezwe:" + +#, fuzzy +#~ msgid "pointer value used where a complex was expected" +#~ msgstr "Mweretsi Agaciro a ITSINDA RY'IMIBARE C Ikitezwe:" + +#, fuzzy +#~ msgid "aggregate value used where a complex was expected" +#~ msgstr "Agaciro a ITSINDA RY'IMIBARE C Ikitezwe:" + +#, fuzzy +#~ msgid "can't convert value to a vector" +#~ msgstr "GUHINDURA Agaciro Kuri a" + +#, fuzzy +#~ msgid "ISO C++ does not permit \"%s\" in #if" +#~ msgstr "C OYA in NIBA" + +#, fuzzy +#~ msgid "invalid character '%c' in #if" +#~ msgstr "Sibyo Inyuguti in NIBA" + +#, fuzzy +#~ msgid "invalid character '\\%03o' in #if" +#~ msgstr "Sibyo Inyuguti in NIBA" + +#, fuzzy +#~ msgid "absolute file name in remap_filename" +#~ msgstr "IDOSIYE Izina: in" + +#, fuzzy +#~ msgid "ignoring nonexistent directory \"%s\"\n" +#~ msgstr "bushyinguro" + +#, fuzzy +#~ msgid "%s: Not a directory" +#~ msgstr "%s:a bushyinguro" + +#, fuzzy +#~ msgid "ignoring duplicate directory \"%s\"\n" +#~ msgstr "Gusubiramo bushyinguro" + +#, fuzzy +#~ msgid " as it is a non-system directory that duplicates a system directory\n" +#~ msgstr "Nka ni a Sisitemu bushyinguro a Sisitemu" + +#, fuzzy +#~ msgid "#include \"...\" search starts here:\n" +#~ msgstr "#Gushyiramo Gushaka" + +#, fuzzy +#~ msgid "#include <...> search starts here:\n" +#~ msgstr "#Gushyiramo Gushaka" + +#, fuzzy +#~ msgid "End of search list.\n" +#~ msgstr "Impera Bya Gushaka Urutonde" + +#, fuzzy +#~ msgid "" +#~ msgstr "" +#~ msgstr " MIME- Version: 1. 0\n" +#~ "Content- Type: text/ plain; charset= UTF- 8\n" +#~ "Content- Transfer- Encoding: 8bit\n" +#~ "X- Generator: KBabel 1. 0\n" +#~ "." + +#, fuzzy +#~ msgid "Usage: %s [options] file...\n" +#~ msgstr "Amahitamo IDOSIYE" + +# crashrep/source\all\crashrep.lng:%OPTIONS_BUTTON%.text +#, fuzzy +#~ msgid "Options:\n" +#~ msgstr "Amahitamo..." + +#, fuzzy +#~ msgid " -pass-exit-codes Exit with highest error code from a phase\n" +#~ msgstr "-Gusohoka Na: kirekire kurusha ibindi Ikosa ITEGEKONGENGA Bivuye a" + +#, fuzzy +#~ msgid " --help Display this information\n" +#~ msgstr "--Ifashayobora iyi" + +#, fuzzy +#~ msgid " --target-help Display target specific command line options\n" +#~ msgstr "--Intego Ifashayobora Intego Komandi: Umurongo" + +#, fuzzy +#~ msgid " (Use '-v --help' to display command line options of sub-processes)\n" +#~ msgstr "(v Kuri Kugaragaza Komandi: Umurongo Amahitamo Bya" + +#, fuzzy +#~ msgid " -dumpspecs Display all of the built in spec strings\n" +#~ msgstr "-Byose Bya i in" + +#, fuzzy +#~ msgid " -dumpversion Display the version of the compiler\n" +#~ msgstr "-i Verisiyo Bya i" + +#, fuzzy +#~ msgid " -dumpmachine Display the compiler's target processor\n" +#~ msgstr "-i Intego" + +#, fuzzy +#~ msgid " -print-search-dirs Display the directories in the compiler's search path\n" +#~ msgstr "-Gucapa Gushaka i ububiko bw'amaderese in i Gushaka" + +#, fuzzy +#~ msgid " -print-libgcc-file-name Display the name of the compiler's companion library\n" +#~ msgstr "-Gucapa IDOSIYE Izina: i Izina: Bya i" + +#, fuzzy +#~ msgid " -print-file-name= Display the full path to library \n" +#~ msgstr "-Gucapa IDOSIYE Izina: i Inzira Kuri Isomero" + +#, fuzzy +#~ msgid " -print-prog-name= Display the full path to compiler component \n" +#~ msgstr "-Gucapa Izina: i Inzira Kuri" + +#, fuzzy +#~ msgid " -print-multi-directory Display the root directory for versions of libgcc\n" +#~ msgstr "-Gucapa bushyinguro i Imizi bushyinguro kugirango Uburyo Bya" + +#, fuzzy +#~ msgid "" +#~ " -print-multi-lib Display the mapping between command line options and\n" +#~ " multiple library search directories\n" +#~ msgstr "-Gucapa i Igereranya hagati Komandi: Umurongo Amahitamo Igikubo Isomero Gushaka" + +#, fuzzy +#~ msgid " -print-multi-os-directory Display the relative path to OS libraries\n" +#~ msgstr "-Gucapa bushyinguro i Bifitanye isano Inzira Kuri" + +#, fuzzy +#~ msgid " -Wa, Pass comma-separated on to the assembler\n" +#~ msgstr "-Amahitamo Akitso Amahitamo ku Kuri i" + +#, fuzzy +#~ msgid " -Wp, Pass comma-separated on to the preprocessor\n" +#~ msgstr "-Amahitamo Akitso Amahitamo ku Kuri i" + +#, fuzzy +#~ msgid " -Wl, Pass comma-separated on to the linker\n" +#~ msgstr "-Amahitamo Akitso Amahitamo ku Kuri i" + +#, fuzzy +#~ msgid " -Xlinker Pass on to the linker\n" +#~ msgstr "-ku Kuri i" + +#, fuzzy +#~ msgid " -save-temps Do not delete intermediate files\n" +#~ msgstr "-Kubika OYA Gusiba" + +#, fuzzy +#~ msgid " -time Time the execution of each subprocess\n" +#~ msgstr "-Igihe i Bya" + +#, fuzzy +#~ msgid " -specs= Override built-in specs with the contents of \n" +#~ msgstr "-IDOSIYE in Na: i Ibigize Bya IDOSIYE" + +#, fuzzy +#~ msgid " -std= Assume that the input sources are for \n" +#~ msgstr "-STD Bisanzwe i Iyinjiza kugirango Bisanzwe" + +#, fuzzy +#~ msgid " -B Add to the compiler's search paths\n" +#~ msgstr "-bushyinguro bushyinguro Kuri i Gushaka" + +#, fuzzy +#~ msgid " -b Run gcc for target , if installed\n" +#~ msgstr "-B kugirango Intego NIBA" + +#, fuzzy +#~ msgid " -V Run gcc version number , if installed\n" +#~ msgstr "-V Verisiyo Verisiyo Umubare Verisiyo NIBA" + +#, fuzzy +#~ msgid " -v Display the programs invoked by the compiler\n" +#~ msgstr "-v i Porogaramu ku i" + +#, fuzzy +#~ msgid " -### Like -v but options quoted and commands not executed\n" +#~ msgstr "-###v Amahitamo Na Amabwiriza OYA" + +#, fuzzy +#~ msgid " -E Preprocess only; do not compile, assemble or link\n" +#~ msgstr "-E OYA Gukusanya Cyangwa" + +#, fuzzy +#~ msgid " -S Compile only; do not assemble or link\n" +#~ msgstr "-OYA Cyangwa" + +#, fuzzy +#~ msgid " -c Compile and assemble, but do not link\n" +#~ msgstr "-C Na OYA" + +#, fuzzy +#~ msgid " -o Place the output into \n" +#~ msgstr "-o IDOSIYE i Ibisohoka IDOSIYE" + +#, fuzzy +#~ msgid "" +#~ " -x Specify the language of the following input files\n" +#~ " Permissible languages include: c c++ assembler none\n" +#~ " 'none' means revert to the default behavior of\n" +#~ " guessing the language based on the file's extension\n" +#~ msgstr "-X Ururimi i Ururimi Bya i Iyinjiza Indimi Gushyiramo C C Kugaruza Kuri i Mburabuzi imyitwarire i Ururimi ku i" + +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "Options starting with -g, -f, -m, -O, -W, or --param are automatically\n" +#~ " passed on to the various sub-processes invoked by %s. In order to pass\n" +#~ " other options on to these processes the -W options must be used.\n" +#~ msgstr "Na: g F M Cyangwa ku Kuri i ku Itondekanya Kuri Ikindi Amahitamo ku Kuri i Ibaruwa... Amahitamo" + +#, fuzzy +#~ msgid "`-%c' option must have argument" +#~ msgstr "`-%c'Ihitamo" + +#, fuzzy +#~ msgid "couldn't run `%s': %s" +#~ msgstr "Gukoresha" + +#, fuzzy +#~ msgid "Copyright (C) 2003 Free Software Foundation, Inc.\n" +#~ msgstr "C" + +#, fuzzy +#~ msgid "" +#~ "This is free software; see the source for copying conditions. There is NO\n" +#~ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" +#~ "\n" +#~ msgstr "ni Kigenga i Inkomoko kugirango ni OYA ATARIIGIHARWE kugirango Cyangwa A" + +#, fuzzy +#~ msgid "argument to `-Xlinker' is missing" +#~ msgstr "Kuri ni Ibuze" + +#, fuzzy +#~ msgid "argument to `-l' is missing" +#~ msgstr "Kuri ni Ibuze" + +#, fuzzy +#~ msgid "argument to `-specs' is missing" +#~ msgstr "Kuri ni Ibuze" + +#, fuzzy +#~ msgid "argument to `-specs=' is missing" +#~ msgstr "Kuri ni Ibuze" + +#, fuzzy +#~ msgid "`-%c' must come at the start of the command line" +#~ msgstr "`-%c'ku i Gutangira Bya i Komandi: Umurongo" + +#, fuzzy +#~ msgid "argument to `-B' is missing" +#~ msgstr "Kuri ni Ibuze" + +#, fuzzy +#~ msgid "cannot specify -o with -c or -S and multiple compilations" +#~ msgstr "o Na: C Cyangwa Na Igikubo" + +#, fuzzy +#~ msgid "warning: -pipe ignored because -save-temps specified" +#~ msgstr "Iburira Kubika" + +#, fuzzy +#~ msgid "warning: -pipe ignored because -time specified" +#~ msgstr "Iburira Igihe" + +#, fuzzy +#~ msgid "argument to `-x' is missing" +#~ msgstr "Kuri ni Ibuze" + +#, fuzzy +#~ msgid "argument to `-%s' is missing" +#~ msgstr "Kuri ni Ibuze" + +#, fuzzy +#~ msgid "warning: `-x %s' after last input file has no effect" +#~ msgstr "Iburira X Nyuma Iheruka Iyinjiza IDOSIYE Oya INGARUKA" + +#, fuzzy +#~ msgid "invalid specification! Bug in cc" +#~ msgstr "Sibyo in KopiKubandi" + +# basctl/source\basicide\basidesh.src:RID_IMGBTN_REMOVEWATCH.text +#, fuzzy +#~ msgid "%s\n" +#~ msgstr "%s" + +#, fuzzy +#~ msgid "spec failure: '%%*' has not been initialized by pattern match" +#~ msgstr "OYA ku Ishusho BIHUYE" + +#, fuzzy +#~ msgid "warning: use of obsolete %%[ operator in specs" +#~ msgstr "Iburira Gukoresha Bya Mukoresha in" + +#, fuzzy +#~ msgid "Processing spec %c%s%c, which is '%s'\n" +#~ msgstr "ni" + +#, fuzzy +#~ msgid "spec failure: unrecognized spec option '%c'" +#~ msgstr "Ihitamo" + +#, fuzzy +#~ msgid "unknown spec function `%s'" +#~ msgstr "Kitazwi Umumaro" + +#, fuzzy +#~ msgid "error in args to spec function `%s'" +#~ msgstr "Ikosa in Kuri Umumaro" + +#, fuzzy +#~ msgid "malformed spec function name" +#~ msgstr "Umumaro Izina:" + +#, fuzzy +#~ msgid "no arguments for spec function" +#~ msgstr "Oya ingingo kugirango Umumaro" + +#, fuzzy +#~ msgid "malformed spec function arguments" +#~ msgstr "Umumaro ingingo" + +#, fuzzy +#~ msgid "mismatched braces in specs" +#~ msgstr "Ingirwadusodeko in" + +#, fuzzy +#~ msgid "unrecognized option `-%s'" +#~ msgstr "Ihitamo" + +# #-#-#-#-# setup2.pot (PACKAGE VERSION) #-#-#-#-# +# setup2/source\ui\pages\plang.src:RESID_PAGE_PAGELANGUAGE.STR_PROG.text +# #-#-#-#-# setup2.pot (PACKAGE VERSION) #-#-#-#-# +# setup2/source\uibase\agentdlg.src:RC_AGENTDLG.RESID_DLG_AGENT_STR_INSTALL.text +#, fuzzy +#~ msgid "install: %s%s\n" +#~ msgstr "Kwinjiza porogaramu" + +#, fuzzy +#~ msgid "programs: %s\n" +#~ msgstr "Porogaramu" + +# basctl/source\basicide\moduldlg.src:RID_TD_ORGANIZE.RID_TC_ORGANIZE.RID_TP_LIB.text +#, fuzzy +#~ msgid "libraries: %s\n" +#~ msgstr "Amasomero" + +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "For bug reporting instructions, please see:\n" +#~ msgstr "Amabwiriza" + +#, fuzzy +#~ msgid "Configured with: %s\n" +#~ msgstr "Na:" + +#, fuzzy +#~ msgid "Thread model: %s\n" +#~ msgstr "Urugero" + +#, fuzzy +#~ msgid "gcc version %s\n" +#~ msgstr "Verisiyo" + +#, fuzzy +#~ msgid "gcc driver version %s executing gcc version %s\n" +#~ msgstr "Musomyi: Verisiyo Gukora: %s%s Verisiyo" + +#, fuzzy +#~ msgid "no input files" +#~ msgstr "Oya Iyinjiza Idosiye" + +#, fuzzy +#~ msgid "%s: %s compiler not installed on this system" +#~ msgstr "%s:%sOYA ku iyi Sisitemu" + +#, fuzzy +#~ msgid "%s: linker input file unused because linking not done" +#~ msgstr "%s:Iyinjiza IDOSIYE Kidakoreshwa Impuza OYA Byakozwe" + +#, fuzzy +#~ msgid "language %s not recognized" +#~ msgstr "Ururimi OYA" + +#, fuzzy +#~ msgid "internal gcc abort" +#~ msgstr "By'imbere Kureka" + +#, fuzzy +#~ msgid "Internal gcov abort.\n" +#~ msgstr "Kureka" + +#, fuzzy +#~ msgid "" +#~ "Print code coverage information.\n" +#~ "\n" +#~ msgstr "ITEGEKONGENGA Ibisobanuro" + +#, fuzzy +#~ msgid " -h, --help Print this help, then exit\n" +#~ msgstr "-h Ifashayobora iyi Ifashayobora Hanyuma" + +#, fuzzy +#~ msgid " -v, --version Print version number, then exit\n" +#~ msgstr "-v Verisiyo Verisiyo Umubare Hanyuma" + +#, fuzzy +#~ msgid " -b, --branch-probabilities Include branch probabilities in output\n" +#~ msgstr "-B in" + +#, fuzzy +#~ msgid "" +#~ " -c, --branch-counts Given counts of branches taken\n" +#~ " rather than percentages\n" +#~ msgstr "-C Bya" + +#, fuzzy +#~ msgid " -n, --no-output Do not create an output file\n" +#~ msgstr "-N Oya Ibisohoka OYA Kurema Ibisohoka" + +#, fuzzy +#~ msgid "" +#~ " -l, --long-file-names Use long output file names for included\n" +#~ " source files\n" +#~ msgstr "-L IDOSIYE Amazina Ibisohoka IDOSIYE Amazina kugirango Inkomoko" + +#, fuzzy +#~ msgid " -f, --function-summaries Output summaries for each function\n" +#~ msgstr "-F Umumaro kugirango" + +#, fuzzy +#~ msgid " -o, --object-directory DIR|FILE Search for object files in DIR or called FILE\n" +#~ msgstr "-o Igikoresho bushyinguro kugirango Igikoresho Idosiye in Cyangwa" + +#, fuzzy +#~ msgid " -p, --preserve-paths Preserve all pathname components\n" +#~ msgstr "-P Inzira Byose" + +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "For bug reporting instructions, please see:\n" +#~ "%s.\n" +#~ msgstr "Amabwiriza" + +#, fuzzy +#~ msgid "Copyright (C) 2001 Free Software Foundation, Inc.\n" +#~ msgstr "C" + +#, fuzzy +#~ msgid "Could not open basic block file %s.\n" +#~ msgstr "OYA Gufungura BASIC Funga IDOSIYE" + +#, fuzzy +#~ msgid "Could not open program flow graph file %s.\n" +#~ msgstr "OYA Gufungura Porogaramu IDOSIYE" + +#, fuzzy +#~ msgid "Could not open data file %s.\n" +#~ msgstr "OYA Gufungura Ibyatanzwe IDOSIYE" + +#, fuzzy +#~ msgid "Assuming that all execution counts are zero.\n" +#~ msgstr "Byose Zeru" + +#, fuzzy +#~ msgid "No executable code associated with file %s.\n" +#~ msgstr "ITEGEKONGENGA Na: IDOSIYE" + +#, fuzzy +#~ msgid "%s of %d lines executed in %s %s\n" +#~ msgstr "%sBya Imirongo in" + +#, fuzzy +#~ msgid "No executable lines in %s %s\n" +#~ msgstr "Imirongo in" + +#, fuzzy +#~ msgid "%s of %d branches executed in %s %s\n" +#~ msgstr "%sBya in" + +#, fuzzy +#~ msgid "%s of %d branches taken at least once in %s %s\n" +#~ msgstr "%sBya ku Rimwe in" + +#, fuzzy +#~ msgid "No branches in %s %s\n" +#~ msgstr "in" + +#, fuzzy +#~ msgid "%s of %d calls executed in %s %s\n" +#~ msgstr "%sBya Amahamagara: in" + +#, fuzzy +#~ msgid "No calls in %s %s\n" +#~ msgstr "Amahamagara: in" + +#, fuzzy +#~ msgid "didn't use all bb entries of graph, function %s\n" +#~ msgstr "Gukoresha Byose Ibyinjijwe Bya Umumaro" + +#, fuzzy +#~ msgid "ERROR: unexpected line number %ld\n" +#~ msgstr "Umurongo Umubare" + +#, fuzzy +#~ msgid "ERROR: too many basic blocks in function %s\n" +#~ msgstr "BASIC in Umumaro" + +#, fuzzy +#~ msgid "ERROR: out of range line number in function %s\n" +#~ msgstr "Inyuma Bya Urutonde Umurongo Umubare in Umumaro" + +#, fuzzy +#~ msgid "Could not open source file %s.\n" +#~ msgstr "OYA Gufungura Inkomoko IDOSIYE" + +#, fuzzy +#~ msgid "Warning: source file %s is newer than %s\n" +#~ msgstr "Inkomoko IDOSIYE ni" + +#, fuzzy +#~ msgid "Unexpected EOF while reading source file %s.\n" +#~ msgstr "Inkomoko IDOSIYE" + +#, fuzzy +#~ msgid "call %2d never executed\n" +#~ msgstr "Nta narimwe" + +#, fuzzy +#~ msgid "branch %2d never executed\n" +#~ msgstr "Nta narimwe" + +#, fuzzy +#~ msgid "Error writing output file %s.\n" +#~ msgstr "Ibisohoka IDOSIYE" + +#, fuzzy +#~ msgid "Could not open output file %s.\n" +#~ msgstr "OYA Gufungura Ibisohoka IDOSIYE" + +#, fuzzy +#~ msgid "GCSE disabled: %d > 1000 basic blocks and %d >= 20 edges/basic block" +#~ msgstr "Yahagaritswe 1000 BASIC Na 20 BASIC Funga" + +#, fuzzy +#~ msgid "GCSE disabled: %d basic blocks and %d registers" +#~ msgstr "Yahagaritswe BASIC Na" + +#, fuzzy +#~ msgid "Name `%s' contains quotes" +#~ msgstr "Kirimo" + +#, fuzzy +#~ msgid "invalid string `%s' in define_cpu_unit" +#~ msgstr "Sibyo Ikurikiranyanyuguti in" + +#, fuzzy +#~ msgid "invalid string `%s' in define_query_cpu_unit" +#~ msgstr "Sibyo Ikurikiranyanyuguti in" + +#, fuzzy +#~ msgid "invalid string `%s' in define_bypass" +#~ msgstr "Sibyo Ikurikiranyanyuguti in" + +#, fuzzy +#~ msgid "invalid first string `%s' in exclusion_set" +#~ msgstr "Sibyo Itangira Ikurikiranyanyuguti in" + +#, fuzzy +#~ msgid "invalid second string `%s' in exclusion_set" +#~ msgstr "Sibyo ISEGONDA Ikurikiranyanyuguti in" + +#, fuzzy +#~ msgid "invalid first string `%s' in presence_set" +#~ msgstr "Sibyo Itangira Ikurikiranyanyuguti in" + +#, fuzzy +#~ msgid "invalid second string `%s' in presence_set" +#~ msgstr "Sibyo ISEGONDA Ikurikiranyanyuguti in" + +#, fuzzy +#~ msgid "invalid first string `%s' in absence_set" +#~ msgstr "Sibyo Itangira Ikurikiranyanyuguti in" + +#, fuzzy +#~ msgid "invalid second string `%s' in absence_set" +#~ msgstr "Sibyo ISEGONDA Ikurikiranyanyuguti in" + +#, fuzzy +#~ msgid "invalid string `%s' in define_automaton" +#~ msgstr "Sibyo Ikurikiranyanyuguti in" + +#, fuzzy +#~ msgid "invalid option `%s' in automata_option" +#~ msgstr "Sibyo Ihitamo in" + +#, fuzzy +#~ msgid "garbage after ) in reservation `%s'" +#~ msgstr "Nyuma in" + +#, fuzzy +#~ msgid "invalid `%s' in reservation `%s'" +#~ msgstr "Sibyo in" + +#, fuzzy +#~ msgid "repetition `%s' <= 1 in reservation `%s'" +#~ msgstr "1. in" + +#, fuzzy +#~ msgid "unit `%s' in exclusion is not declared" +#~ msgstr "Igice: in ni OYA" + +#, fuzzy +#~ msgid "`%s' in exclusion is not unit" +#~ msgstr "`%s'in ni OYA Igice:" + +#, fuzzy +#~ msgid "unit `%s' excludes itself" +#~ msgstr "Igice:" + +#, fuzzy +#~ msgid "units `%s' and `%s' in exclusion set belong to different automata" +#~ msgstr "Na in Gushyiraho Kuri" + +#, fuzzy +#~ msgid "unit `%s' excludes and requires presence of `%s'" +#~ msgstr "Igice: Na Bya" + +#, fuzzy +#~ msgid "unit `%s' requires absence and presence of `%s'" +#~ msgstr "Igice: Na Bya" + +#, fuzzy +#~ msgid "repeated declaration of automaton `%s'" +#~ msgstr "byasubiyemo Bya" + +#, fuzzy +#~ msgid "define_insn_reservation `%s' has negative latency time" +#~ msgstr "Igihe" + +#, fuzzy +#~ msgid "`%s' is already used as insn reservation name" +#~ msgstr "`%s'ni Nka Izina:" + +#, fuzzy +#~ msgid "define_bypass `%s - %s' has negative latency time" +#~ msgstr "Igihe" + +#, fuzzy +#~ msgid "automaton `%s' is not declared" +#~ msgstr "ni OYA" + +#, fuzzy +#~ msgid "define_unit `%s' without automaton when one defined" +#~ msgstr "Ryari:" + +#, fuzzy +#~ msgid "`%s' is declared as cpu unit" +#~ msgstr "`%s'ni Nka CPU Igice:" + +#, fuzzy +#~ msgid "`%s' is declared as cpu reservation" +#~ msgstr "`%s'ni Nka CPU" + +#, fuzzy +#~ msgid "repeated declaration of unit `%s'" +#~ msgstr "byasubiyemo Bya Igice:" + +#, fuzzy +#~ msgid "repeated declaration of reservation `%s'" +#~ msgstr "byasubiyemo Bya" + +#, fuzzy +#~ msgid "there is no insn reservation `%s'" +#~ msgstr "ni Oya" + +#, fuzzy +#~ msgid "the same bypass `%s - %s' is already defined" +#~ msgstr "i ni" + +#, fuzzy +#~ msgid "bypass `%s - %s' is already defined" +#~ msgstr "ni" + +#, fuzzy +#~ msgid "automaton `%s' is not used" +#~ msgstr "ni OYA" + +#, fuzzy +#~ msgid "undeclared unit or reservation `%s'" +#~ msgstr "Igice: Cyangwa" + +#, fuzzy +#~ msgid "unit `%s' is not used" +#~ msgstr "Igice: ni OYA" + +#, fuzzy +#~ msgid "reservation `%s' is not used" +#~ msgstr "ni OYA" + +#, fuzzy +#~ msgid "cycle in definition of reservation `%s'" +#~ msgstr "Uruziga in Insobanuro Bya" + +#, fuzzy +#~ msgid "Units `%s' and `%s' should be in the same automaton" +#~ msgstr "Na in i" + +#, fuzzy +#~ msgid "-split has no argument." +#~ msgstr "-Gutandukanya Oya" + +#, fuzzy +#~ msgid "option `-split' has not been implemented yet\n" +#~ msgstr "Ihitamo OYA" + +#, fuzzy +#~ msgid "Automaton `%s': Insn `%s' will never be issued" +#~ msgstr "Nta narimwe Byasohowe" + +#, fuzzy +#~ msgid "Insn `%s' will never be issued" +#~ msgstr "Nta narimwe Byasohowe" + +#, fuzzy +#~ msgid "Errors in DFA description" +#~ msgstr "in Isobanuramiterere" + +#, fuzzy +#~ msgid "Error in writing DFA description file %s" +#~ msgstr "in Isobanuramiterere IDOSIYE" + +#, fuzzy +#~ msgid "No input file name." +#~ msgstr "Iyinjiza IDOSIYE Izina:" + +#, fuzzy +#~ msgid "can't open %s" +#~ msgstr "Gufungura" + +#, fuzzy +#~ msgid "fix_sched_param: unknown param: %s" +#~ msgstr "Kitazwi" + +#, fuzzy +#~ msgid "function cannot be inline" +#~ msgstr "Umumaro Mumurongo" + +#, fuzzy +#~ msgid "varargs function cannot be inline" +#~ msgstr "Umumaro Mumurongo" + +#, fuzzy +#~ msgid "function using alloca cannot be inline" +#~ msgstr "Umumaro ikoresha Mumurongo" + +#, fuzzy +#~ msgid "function using setjmp cannot be inline" +#~ msgstr "Umumaro ikoresha Mumurongo" + +#, fuzzy +#~ msgid "function uses __builtin_eh_return" +#~ msgstr "Umumaro" + +#, fuzzy +#~ msgid "function with nested functions cannot be inline" +#~ msgstr "Umumaro Na: Imimaro Mumurongo" + +#, fuzzy +#~ msgid "function with label addresses used in initializers cannot inline" +#~ msgstr "Umumaro Na: Akarango Amaderesi in Mumurongo" + +#, fuzzy +#~ msgid "function too large to be inline" +#~ msgstr "Umumaro Binini Kuri Mumurongo" + +#, fuzzy +#~ msgid "no prototype, and parameter address used; cannot be inline" +#~ msgstr "Oya Na Aderesi Mumurongo" + +#, fuzzy +#~ msgid "inline functions not supported for this return value type" +#~ msgstr "Mumurongo Imimaro OYA kugirango iyi Garuka Agaciro Ubwoko" + +#, fuzzy +#~ msgid "function with varying-size return value cannot be inline" +#~ msgstr "Umumaro Na: Ingano Garuka Agaciro Mumurongo" + +#, fuzzy +#~ msgid "function with varying-size parameter cannot be inline" +#~ msgstr "Umumaro Na: Ingano Mumurongo" + +#, fuzzy +#~ msgid "function with transparent unit parameter cannot be inline" +#~ msgstr "Umumaro Na: Bibonerana Igice: Mumurongo" + +#, fuzzy +#~ msgid "function with computed jump cannot inline" +#~ msgstr "Umumaro Na: Simbuka Mumurongo" + +#, fuzzy +#~ msgid "function with nonlocal goto cannot be inline" +#~ msgstr "Umumaro Na: Mumurongo" + +#, fuzzy +#~ msgid "function with target specific attribute(s) cannot be inlined" +#~ msgstr "Umumaro Na: Intego Ikiranga S" + +#, fuzzy +#~ msgid "invalid parameter `%s'" +#~ msgstr "Ikigenderwaho sicyo" + +#, fuzzy +#~ msgid "Profile does not match flowgraph of function %s (out of date?)" +#~ msgstr "OYA BIHUYE Bya Umumaro Inyuma Bya Itariki" + +#, fuzzy +#~ msgid ".da file corrupted" +#~ msgstr "" +#~ ".Project- Id- Version: basctl\n" +#~ "POT- Creation- Date: 2003- 12- 07 17: 13+ 02\n" +#~ "PO- Revision- Date: 2004- 11- 04 10: 13- 0700\n" +#~ "Last- Translator: Language- Team:< en@ li. org> MIME- Version: 1. 0\n" +#~ "Content- Type: text/ plain; charset= UTF- 8\n" +#~ "Content- Transfer- Encoding: 8bit\n" +#~ "X- Generator: KBabel 1. 0\n" +#~ "." + +#, fuzzy +#~ msgid "corrupted profile info: prob for %d-%d thought to be %d" +#~ msgstr "Ibijyana Ibisobanuro PROB kugirango Kuri" + +#, fuzzy +#~ msgid "file %s not found, execution counts assumed to be zero" +#~ msgstr "IDOSIYE OYA Byabonetse Kuri Zeru" + +#, fuzzy +#~ msgid "%s: internal abort\n" +#~ msgstr "%s:By'imbere" + +#, fuzzy +#~ msgid "%s: error writing file `%s': %s\n" +#~ msgstr "%s:Ikosa IDOSIYE" + +#, fuzzy +#~ msgid "%s: usage '%s [ -VqfnkN ] [ -i ] [ filename ... ]'\n" +#~ msgstr "%s:Ikoresha: i Izina ry'idosiye:" + +#, fuzzy +#~ msgid "%s: usage '%s [ -VqfnkNlgC ] [ -B ] [ filename ... ]'\n" +#~ msgstr "%s:Ikoresha: Izina ry'idosiye:" + +#, fuzzy +#~ msgid "%s: warning: no read access for file `%s'\n" +#~ msgstr "%s:Iburira Oya Gusoma kugirango IDOSIYE" + +#, fuzzy +#~ msgid "%s: warning: no write access for file `%s'\n" +#~ msgstr "%s:Iburira Oya Kwandika kugirango IDOSIYE" + +#, fuzzy +#~ msgid "%s: warning: no write access for dir containing `%s'\n" +#~ msgstr "%s:Iburira Oya Kwandika kugirango" + +#, fuzzy +#~ msgid "%s: invalid file name: %s\n" +#~ msgstr "%s:Sibyo IDOSIYE Izina:" + +#, fuzzy +#~ msgid "%s: %s: can't get status: %s\n" +#~ msgstr "%s:%s:Kubona Imimerere" + +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%s: fatal error: aux info file corrupted at line %d\n" +#~ msgstr "%s:Ikosa Ibisobanuro IDOSIYE ku Umurongo" + +#, fuzzy +#~ msgid "%s:%d: declaration of function `%s' takes different forms\n" +#~ msgstr "%s:%d:Bya Umumaro" + +#, fuzzy +#~ msgid "%s: wait: %s\n" +#~ msgstr "%s:Tegereza" + +#, fuzzy +#~ msgid "%s: %s exited with status %d\n" +#~ msgstr "%s:%sNa: Imimerere" + +#, fuzzy +#~ msgid "%s: warning: missing SYSCALLS file `%s'\n" +#~ msgstr "%s:Iburira Ibuze IDOSIYE" + +#, fuzzy +#~ msgid "%s: can't read aux info file `%s': %s\n" +#~ msgstr "%s:Gusoma Ibisobanuro IDOSIYE" + +#, fuzzy +#~ msgid "%s: can't get status of aux info file `%s': %s\n" +#~ msgstr "%s:Kubona Imimerere Bya Ibisobanuro IDOSIYE" + +#, fuzzy +#~ msgid "%s: can't open aux info file `%s' for reading: %s\n" +#~ msgstr "%s:Gufungura Ibisobanuro IDOSIYE kugirango" + +#, fuzzy +#~ msgid "%s: error reading aux info file `%s': %s\n" +#~ msgstr "%s:Ikosa Ibisobanuro IDOSIYE" + +#, fuzzy +#~ msgid "%s: error closing aux info file `%s': %s\n" +#~ msgstr "%s:Ikosa Ibisobanuro IDOSIYE" + +#, fuzzy +#~ msgid "%s: can't delete aux info file `%s': %s\n" +#~ msgstr "%s:Gusiba Ibisobanuro IDOSIYE" + +#, fuzzy +#~ msgid "%s: can't delete file `%s': %s\n" +#~ msgstr "%s:Gusiba IDOSIYE" + +#, fuzzy +#~ msgid "%s: warning: can't rename file `%s' to `%s': %s\n" +#~ msgstr "%s:Iburira Guhindura izina IDOSIYE Kuri" + +#, fuzzy +#~ msgid "%s: conflicting extern definitions of '%s'\n" +#~ msgstr "%s:Bya" + +#, fuzzy +#~ msgid "%s: declarations of '%s' will not be converted\n" +#~ msgstr "%s:Bya OYA" + +#, fuzzy +#~ msgid "%s: conflict list for '%s' follows:\n" +#~ msgstr "%s:Urutonde kugirango" + +#, fuzzy +#~ msgid "%s: warning: using formals list from %s(%d) for function `%s'\n" +#~ msgstr "%s:Iburira ikoresha Urutonde Bivuye kugirango Umumaro" + +#, fuzzy +#~ msgid "%s: %d: `%s' used but missing from SYSCALLS\n" +#~ msgstr "%s:%d:`%s'Ibuze Bivuye" + +#, fuzzy +#~ msgid "%s: %d: warning: no extern definition for `%s'\n" +#~ msgstr "%s:%d:Iburira Oya Insobanuro kugirango" + +#, fuzzy +#~ msgid "%s: warning: no static definition for `%s' in file `%s'\n" +#~ msgstr "%s:Iburira Oya Insobanuro kugirango in IDOSIYE" + +#, fuzzy +#~ msgid "%s: multiple static defs of `%s' in file `%s'\n" +#~ msgstr "%s:Igikubo Bya in IDOSIYE" + +#, fuzzy +#~ msgid "%s: %d: warning: source too confusing\n" +#~ msgstr "%s:%d:Iburira Inkomoko" + +#, fuzzy +#~ msgid "%s: %d: warning: varargs function declaration not converted\n" +#~ msgstr "%s:%d:Iburira Umumaro OYA" + +#, fuzzy +#~ msgid "%s: declaration of function `%s' not converted\n" +#~ msgstr "%s:Bya Umumaro OYA" + +#, fuzzy +#~ msgid "%s: warning: too many parameter lists in declaration of `%s'\n" +#~ msgstr "%s:Iburira Intonde in Bya" + +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%s: warning: too few parameter lists in declaration of `%s'\n" +#~ msgstr "%s:Iburira Intonde in Bya" + +#, fuzzy +#~ msgid "%s: %d: warning: found `%s' but expected `%s'\n" +#~ msgstr "%s:%d:Iburira Byabonetse Ikitezwe:" + +#, fuzzy +#~ msgid "%s: local declaration for function `%s' not inserted\n" +#~ msgstr "%s:kugirango Umumaro OYA" + +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%s: %d: warning: can't add declaration of `%s' into macro call\n" +#~ msgstr "%s:%d:Iburira Kongeramo Bya Makoro" + +#, fuzzy +#~ msgid "%s: global declarations for file `%s' not inserted\n" +#~ msgstr "%s:kugirango IDOSIYE OYA" + +#, fuzzy +#~ msgid "%s: definition of function `%s' not converted\n" +#~ msgstr "%s:Insobanuro Bya Umumaro OYA" + +#, fuzzy +#~ msgid "%s: %d: warning: definition of %s not converted\n" +#~ msgstr "%s:%d:Iburira Insobanuro Bya OYA" + +#, fuzzy +#~ msgid "%s: found definition of `%s' at %s(%d)\n" +#~ msgstr "%s:Byabonetse Insobanuro Bya ku" + +#, fuzzy +#~ msgid "%s: %d: warning: `%s' excluded by preprocessing\n" +#~ msgstr "%s:%d:Iburira ku" + +#, fuzzy +#~ msgid "%s: function definition not converted\n" +#~ msgstr "%s:Umumaro Insobanuro OYA" + +#, fuzzy +#~ msgid "%s: `%s' not converted\n" +#~ msgstr "%s:`%s'OYA" + +#, fuzzy +#~ msgid "%s: would convert file `%s'\n" +#~ msgstr "%s:GUHINDURA IDOSIYE" + +#, fuzzy +#~ msgid "%s: converting file `%s'\n" +#~ msgstr "%s:Guhindura.... IDOSIYE" + +#, fuzzy +#~ msgid "%s: can't get status for file `%s': %s\n" +#~ msgstr "%s:Kubona Imimerere kugirango IDOSIYE" + +#, fuzzy +#~ msgid "%s: can't open file `%s' for reading: %s\n" +#~ msgstr "%s:Gufungura IDOSIYE kugirango" + +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "%s: error reading input file `%s': %s\n" +#~ msgstr "%s:Ikosa Iyinjiza IDOSIYE" + +#, fuzzy +#~ msgid "%s: can't create/open clean file `%s': %s\n" +#~ msgstr "%s:Kurema Gufungura GUSUKURA IDOSIYE" + +#, fuzzy +#~ msgid "%s: warning: file `%s' already saved in `%s'\n" +#~ msgstr "%s:Iburira IDOSIYE in" + +#, fuzzy +#~ msgid "%s: can't link file `%s' to `%s': %s\n" +#~ msgstr "%s:Ihuza IDOSIYE Kuri" + +#, fuzzy +#~ msgid "%s: can't create/open output file `%s': %s\n" +#~ msgstr "%s:Kurema Gufungura Ibisohoka IDOSIYE" + +#, fuzzy +#~ msgid "%s: can't change mode of file `%s': %s\n" +#~ msgstr "%s:Guhindura>> Ubwoko Bya IDOSIYE" + +#, fuzzy +#~ msgid "%s: cannot get working directory: %s\n" +#~ msgstr "%s:Kubona bushyinguro" + +#, fuzzy +#~ msgid "%s: input file names must have .c suffixes: %s\n" +#~ msgstr "%s:Iyinjiza IDOSIYE Amazina C Imigereka" + +#, fuzzy +#~ msgid "Didn't find a coloring.\n" +#~ msgstr "Gushaka a" + +#, fuzzy +#~ msgid "output constraint %d must specify a single register" +#~ msgstr "Ibisohoka Imbogamizi a UMWE Kwiyandikisha" + +#, fuzzy +#~ msgid "output constraint %d cannot be specified together with \"%s\" clobber" +#~ msgstr "Ibisohoka Imbogamizi Na:" + +#, fuzzy +#~ msgid "output regs must be grouped at top of stack" +#~ msgstr "Ibisohoka ku Hejuru: Bya" + +#, fuzzy +#~ msgid "implicitly popped regs must be grouped at top of stack" +#~ msgstr "ku Hejuru: Bya" + +#, fuzzy +#~ msgid "output operand %d must use `&' constraint" +#~ msgstr "Ibisohoka Gukoresha Imbogamizi" + +#, fuzzy +#~ msgid "can't use '%s' as a %s register" +#~ msgstr "Gukoresha Nka a Kwiyandikisha" + +#, fuzzy +#~ msgid "unknown register name: %s" +#~ msgstr "Kitazwi Kwiyandikisha Izina:" + +#, fuzzy +#~ msgid "global register variable follows a function definition" +#~ msgstr "Kwiyandikisha IMPINDURAGACIRO a Umumaro Insobanuro" + +#, fuzzy +#~ msgid "register used for two global register variables" +#~ msgstr "Kwiyandikisha kugirango Kwiyandikisha Ibihinduka" + +#, fuzzy +#~ msgid "call-clobbered register used for global register variable" +#~ msgstr "Kwiyandikisha kugirango Kwiyandikisha IMPINDURAGACIRO" + +#, fuzzy +#~ msgid "validate_value_data: [%u] Bad next_regno for empty chain (%u)" +#~ msgstr "kugirango ubusa" + +#, fuzzy +#~ msgid "validate_value_data: Loop in regno chain (%u)" +#~ msgstr "in" + +#, fuzzy +#~ msgid "validate_value_data: [%u] Non-empty reg in chain (%s %u %i)" +#~ msgstr "ubusa in" + +#, fuzzy +#~ msgid "cannot reload integer constant operand in `asm'" +#~ msgstr "Kongera Gutangiza Umubare wuzuye in" + +#, fuzzy +#~ msgid "impossible register constraint in `asm'" +#~ msgstr "Kwiyandikisha Imbogamizi in" + +#, fuzzy +#~ msgid "`&' constraint used with no register class" +#~ msgstr "`&'Imbogamizi Na: Oya Kwiyandikisha ishuri" + +#, fuzzy +#~ msgid "unable to generate reloads for:" +#~ msgstr "Kuri kugirango" + +#, fuzzy +#~ msgid "inconsistent operand constraints in an `asm'" +#~ msgstr "in" + +#, fuzzy +#~ msgid "frame size too large for reliable stack checking" +#~ msgstr "Ikadiri Ingano Binini kugirango" + +#, fuzzy +#~ msgid "try reducing the number of local variables" +#~ msgstr "i Umubare Bya Ibihinduka" + +#, fuzzy +#~ msgid "can't find a register in class `%s' while reloading `asm'" +#~ msgstr "Gushaka a Kwiyandikisha in ishuri" + +#, fuzzy +#~ msgid "unable to find a register to spill in class `%s'" +#~ msgstr "Kuri Gushaka a Kwiyandikisha Kuri in ishuri" + +#, fuzzy +#~ msgid "this is the insn:" +#~ msgstr "iyi ni i" + +#, fuzzy +#~ msgid "`asm' operand requires impossible reload" +#~ msgstr "`Kongera Gutangiza" + +#, fuzzy +#~ msgid "could not find a spill register" +#~ msgstr "OYA Gushaka a Kwiyandikisha" + +#, fuzzy +#~ msgid "`asm' operand constraint incompatible with operand size" +#~ msgstr "`Imbogamizi Na: Ingano" + +#, fuzzy +#~ msgid "VOIDmode on an output" +#~ msgstr "ku Ibisohoka" + +#, fuzzy +#~ msgid "output operand is constant in `asm'" +#~ msgstr "Ibisohoka ni in" + +#, fuzzy +#~ msgid "insn does not satisfy its constraints:" +#~ msgstr "OYA" + +#, fuzzy +#~ msgid "RTL check: access of elt %d of `%s' with last elt %d in %s, at %s:%d" +#~ msgstr "Kugenzura... Bya Bya Na: Iheruka in ku" + +#, fuzzy +#~ msgid "RTL check: expected elt %d type '%c', have '%c' (rtx %s) in %s, at %s:%d" +#~ msgstr "Kugenzura... Ikitezwe: Ubwoko in ku" + +#, fuzzy +#~ msgid "RTL check: expected elt %d type '%c' or '%c', have '%c' (rtx %s) in %s, at %s:%d" +#~ msgstr "Kugenzura... Ikitezwe: Ubwoko Cyangwa in ku" + +#, fuzzy +#~ msgid "RTL check: expected code `%s', have `%s' in %s, at %s:%d" +#~ msgstr "Kugenzura... Ikitezwe: ITEGEKONGENGA in ku" + +#, fuzzy +#~ msgid "RTL check: expected code `%s' or `%s', have `%s' in %s, at %s:%d" +#~ msgstr "Kugenzura... Ikitezwe: ITEGEKONGENGA Cyangwa in ku" + +#, fuzzy +#~ msgid "RTL check: access of elt %d of vector with last elt %d in %s, at %s:%d" +#~ msgstr "Kugenzura... Bya Bya Na: Iheruka in ku" + +#, fuzzy +#~ msgid "RTL flag check: %s used with unexpected rtx code `%s' in %s, at %s:%d" +#~ msgstr "Ibendera Kugenzura... Na: ITEGEKONGENGA in ku" + +#, fuzzy +#~ msgid "jump to `%s' invalidly jumps into binding contour" +#~ msgstr "Simbuka Kuri Bifatanya Umuzenguruko" + +#, fuzzy +#~ msgid "label `%s' used before containing binding contour" +#~ msgstr "Akarango Mbere Bifatanya Umuzenguruko" + +#, fuzzy +#~ msgid "output operand constraint lacks `='" +#~ msgstr "Ibisohoka Imbogamizi" + +#, fuzzy +#~ msgid "output constraint `%c' for operand %d is not at the beginning" +#~ msgstr "Ibisohoka Imbogamizi kugirango ni OYA ku i Itangiriro" + +#, fuzzy +#~ msgid "operand constraint contains incorrectly positioned '+' or '='" +#~ msgstr "Imbogamizi Kirimo Cyangwa" + +#, fuzzy +#~ msgid "`%%' constraint used with last operand" +#~ msgstr "`%%'Imbogamizi Na: Iheruka" + +#, fuzzy +#~ msgid "matching constraint not valid in output operand" +#~ msgstr "Imbogamizi OYA Byemewe in Ibisohoka" + +#, fuzzy +#~ msgid "input operand constraint contains `%c'" +#~ msgstr "Iyinjiza Imbogamizi Kirimo" + +#, fuzzy +#~ msgid "matching constraint references invalid operand number" +#~ msgstr "Imbogamizi Indango Sibyo Umubare" + +#, fuzzy +#~ msgid "invalid punctuation `%c' in constraint" +#~ msgstr "Sibyo in Imbogamizi" + +#, fuzzy +#~ msgid "asm-specifier for variable `%s' conflicts with asm clobber list" +#~ msgstr "kugirango IMPINDURAGACIRO Na: Urutonde" + +#, fuzzy +#~ msgid "unknown register name `%s' in `asm'" +#~ msgstr "Kitazwi Kwiyandikisha Izina: in" + +#, fuzzy +#~ msgid "more than %d operands in `asm'" +#~ msgstr "Birenzeho in" + +#, fuzzy +#~ msgid "output number %d not directly addressable" +#~ msgstr "Ibisohoka Umubare OYA" + +#, fuzzy +#~ msgid "asm operand %d probably doesn't match constraints" +#~ msgstr "BIHUYE" + +#, fuzzy +#~ msgid "asm clobber conflict with output operand" +#~ msgstr "Na: Ibisohoka" + +#, fuzzy +#~ msgid "asm clobber conflict with input operand" +#~ msgstr "Na: Iyinjiza" + +#, fuzzy +#~ msgid "too many alternatives in `asm'" +#~ msgstr "in" + +#, fuzzy +#~ msgid "operand constraints for `asm' differ in number of alternatives" +#~ msgstr "kugirango in Umubare Bya" + +#, fuzzy +#~ msgid "duplicate asm operand name '%s'" +#~ msgstr "Gusubiramo Izina:" + +#, fuzzy +#~ msgid "missing close brace for named operand" +#~ msgstr "Ibuze Gufunga kugirango" + +#, fuzzy +#~ msgid "undefined named operand '%s'" +#~ msgstr "kidasobanuye" + +#, fuzzy +#~ msgid "unused variable `%s'" +#~ msgstr "Kidakoreshwa IMPINDURAGACIRO" + +#, fuzzy +#~ msgid "enumeration value `%s' not handled in switch" +#~ msgstr "Agaciro OYA in Hindura" + +#, fuzzy +#~ msgid "case value `%ld' not in enumerated type" +#~ msgstr "Agaciro OYA in Ubwoko" + +#, fuzzy +#~ msgid "case value `%ld' not in enumerated type `%s'" +#~ msgstr "Agaciro OYA in Ubwoko" + +#, fuzzy +#~ msgid "switch missing default case" +#~ msgstr "Hindura Ibuze Mburabuzi" + +#, fuzzy +#~ msgid "type size can't be explicitly evaluated" +#~ msgstr "Ubwoko Ingano" + +#, fuzzy +#~ msgid "variable-size type declared outside of any function" +#~ msgstr "IMPINDURAGACIRO Ingano Ubwoko Hanze Bya Umumaro" + +#, fuzzy +#~ msgid "size of `%s' is %d bytes" +#~ msgstr "Ingano Bya ni Bayite" + +#, fuzzy +#~ msgid "size of `%s' is larger than %d bytes" +#~ msgstr "Ingano Bya ni Kinini Bayite" + +#, fuzzy +#~ msgid "packed attribute causes inefficient alignment for `%s'" +#~ msgstr "Ikiranga Itunganya kugirango" + +#, fuzzy +#~ msgid "packed attribute is unnecessary for `%s'" +#~ msgstr "Ikiranga ni kugirango" + +#, fuzzy +#~ msgid "padding struct to align `%s'" +#~ msgstr "Wuzuza: Kuri Gutondeka" + +#, fuzzy +#~ msgid "padding struct size to alignment boundary" +#~ msgstr "Wuzuza: Ingano Kuri Itunganya" + +#, fuzzy +#~ msgid "packed attribute causes inefficient alignment" +#~ msgstr "Ikiranga Itunganya" + +#, fuzzy +#~ msgid "packed attribute is unnecessary" +#~ msgstr "Ikiranga ni" + +#, fuzzy +#~ msgid "cannot timevar_pop '%s' when top of timevars stack is '%s'" +#~ msgstr "Ryari: Hejuru: Bya ni" + +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "Execution times (seconds)\n" +#~ msgstr "Times amasogonda" + +# #-#-#-#-# sc.pot (PACKAGE VERSION) #-#-#-#-# +# sc/source\ui\src\autofmt.src:RID_SCDLG_AUTOFORMAT.STR_SUM.text +# #-#-#-#-# sc.pot (PACKAGE VERSION) #-#-#-#-# +# sc/source\ui\src\globstr.src:RID_GLOBSTR.STR_PIVOT_TOTAL.text +#, fuzzy +#~ msgid " TOTAL :" +#~ msgstr "Igiteranyo" + +#, fuzzy +#~ msgid "time in %s: %ld.%06ld (%ld%%)\n" +#~ msgstr "Igihe in" + +#, fuzzy +#~ msgid "collect: tweaking %s in %s\n" +#~ msgstr "in" + +#, fuzzy +#~ msgid "ld returned %d exit status" +#~ msgstr "Gusohoka Imimerere" + +#, fuzzy +#~ msgid "Generate debugging info in default format" +#~ msgstr "Ibisobanuro in Mburabuzi Imiterere" + +#, fuzzy +#~ msgid "Generate debugging info in default extended format" +#~ msgstr "Ibisobanuro in Mburabuzi Byongerewe... Imiterere" + +#, fuzzy +#~ msgid "Generate STABS format debug info" +#~ msgstr "Imiterere Kosora amakosa Ibisobanuro" + +#, fuzzy +#~ msgid "Generate extended STABS format debug info" +#~ msgstr "Byongerewe... Imiterere Kosora amakosa Ibisobanuro" + +#, fuzzy +#~ msgid "Generate DWARF-1 format debug info" +#~ msgstr "1. Imiterere Kosora amakosa Ibisobanuro" + +#, fuzzy +#~ msgid "Generate extended DWARF-1 format debug info" +#~ msgstr "Byongerewe... 1. Imiterere Kosora amakosa Ibisobanuro" + +#, fuzzy +#~ msgid "Generate DWARF-2 debug info" +#~ msgstr "2. Kosora amakosa Ibisobanuro" + +#, fuzzy +#~ msgid "Generate XCOFF format debug info" +#~ msgstr "Imiterere Kosora amakosa Ibisobanuro" + +#, fuzzy +#~ msgid "Generate extended XCOFF format debug info" +#~ msgstr "Byongerewe... Imiterere Kosora amakosa Ibisobanuro" + +#, fuzzy +#~ msgid "Generate COFF format debug info" +#~ msgstr "Imiterere Kosora amakosa Ibisobanuro" + +#, fuzzy +#~ msgid "Generate VMS format debug info" +#~ msgstr "Imiterere Kosora amakosa Ibisobanuro" + +#, fuzzy +#~ msgid "Perform DWARF2 duplicate elimination" +#~ msgstr "Gusubiramo" + +#, fuzzy +#~ msgid "Do not store floats in registers" +#~ msgstr "OYA in" + +#, fuzzy +#~ msgid "Consider all mem refs through pointers as volatile" +#~ msgstr "Byose mem Gihinguranya Nka" + +#, fuzzy +#~ msgid "Consider all mem refs to global data to be volatile" +#~ msgstr "Byose mem Kuri Ibyatanzwe Kuri" + +#, fuzzy +#~ msgid "Consider all mem refs to static data to be volatile" +#~ msgstr "Byose mem Kuri Ibyatanzwe Kuri" + +#, fuzzy +#~ msgid "Defer popping functions args from stack until later" +#~ msgstr "Imimaro Bivuye" + +#, fuzzy +#~ msgid "When possible do not generate stack frames" +#~ msgstr "OYA Amakadiri" + +#, fuzzy +#~ msgid "Optimize sibling and tail recursive calls" +#~ msgstr "Na Amahamagara:" + +#, fuzzy +#~ msgid "Perform superblock formation via tail duplication" +#~ msgstr "Biturutse" + +#, fuzzy +#~ msgid "When running CSE, follow jumps to their targets" +#~ msgstr "Kuri" + +#, fuzzy +#~ msgid "Perform a number of minor, expensive optimizations" +#~ msgstr "a Umubare Bya" + +#, fuzzy +#~ msgid "Perform jump threading optimizations" +#~ msgstr "Simbuka" + +#, fuzzy +#~ msgid "Perform loop unrolling when iteration count is known" +#~ msgstr "Ryari: IBARA ni" + +#, fuzzy +#~ msgid "Perform loop unrolling for all loops" +#~ msgstr "kugirango Byose" + +#, fuzzy +#~ msgid "Generate prefetch instructions, if available, for arrays in loops" +#~ msgstr "Amabwiriza NIBA Bihari kugirango in" + +#, fuzzy +#~ msgid "Force all loop invariant computations out of loops" +#~ msgstr "Byose Inyuma Bya" + +#, fuzzy +#~ msgid "Strength reduce all loop general induction variables" +#~ msgstr "Byose Rusange Ibihinduka" + +#, fuzzy +#~ msgid "Store strings in writable data section" +#~ msgstr "Ikurikiranyanyuguti in Ibyatanzwe Icyiciro" + +#, fuzzy +#~ msgid "Copy memory operands into registers before using" +#~ msgstr "Ububiko Mbere ikoresha" + +#, fuzzy +#~ msgid "Copy memory address constants into regs before using" +#~ msgstr "Ububiko Aderesi Mbere ikoresha" + +#, fuzzy +#~ msgid "Allow function addresses to be held in registers" +#~ msgstr "Umumaro Amaderesi Kuri in" + +#, fuzzy +#~ msgid "Integrate simple functions into their callers" +#~ msgstr "Byoroheje Imimaro" + +#, fuzzy +#~ msgid "Generate code for funcs even if they are fully inlined" +#~ msgstr "ITEGEKONGENGA kugirango ATARIIGIHARWE NIBA" + +#, fuzzy +#~ msgid "Pay attention to the 'inline' keyword" +#~ msgstr "Kuri i Ijambo- banze" + +#, fuzzy +#~ msgid "Emit static const variables even if they are not used" +#~ msgstr "Ibihinduka ATARIIGIHARWE NIBA OYA" + +#, fuzzy +#~ msgid "Check for syntax errors, then stop" +#~ msgstr "kugirango Amakosa Hanyuma Guhagarara" + +#, fuzzy +#~ msgid "Mark data as shared rather than private" +#~ msgstr "Ibyatanzwe Nka By'umwihariko" + +#, fuzzy +#~ msgid "Enable saving registers around function calls" +#~ msgstr "Mu kubika Umumaro Amahamagara:" + +#, fuzzy +#~ msgid "Return 'short' aggregates in memory, not registers" +#~ msgstr "in Ububiko OYA" + +#, fuzzy +#~ msgid "Return 'short' aggregates in registers" +#~ msgstr "in" + +#, fuzzy +#~ msgid "Attempt to fill delay slots of branch instructions" +#~ msgstr "Kuri Kuzuza Gutinda Siloti Bya Amabwiriza" + +#, fuzzy +#~ msgid "Perform the global common subexpression elimination" +#~ msgstr "i" + +#, fuzzy +#~ msgid "Perform enhanced load motion during global subexpression elimination" +#~ msgstr "Ibirimo" + +#, fuzzy +#~ msgid "Perform store motion after global subexpression elimination" +#~ msgstr "Nyuma" + +#, fuzzy +#~ msgid "Perform the loop optimizations" +#~ msgstr "i" + +#, fuzzy +#~ msgid "Perform cross-jumping optimization" +#~ msgstr "Kwambukiranya" + +#, fuzzy +#~ msgid "Perform conversion of conditional jumps to branchless equivalents" +#~ msgstr "Ihindurangero Bya Kuri" + +#, fuzzy +#~ msgid "Perform conversion of conditional jumps to conditional execution" +#~ msgstr "Ihindurangero Bya Kuri" + +#, fuzzy +#~ msgid "Run CSE pass after loop optimizations" +#~ msgstr "Nyuma" + +#, fuzzy +#~ msgid "Run the loop optimizer twice" +#~ msgstr "i" + +#, fuzzy +#~ msgid "Delete useless null pointer checks" +#~ msgstr "NTAGIHARI Mweretsi" + +#, fuzzy +#~ msgid "Reschedule instructions before register allocation" +#~ msgstr "Amabwiriza Mbere Kwiyandikisha" + +#, fuzzy +#~ msgid "Reschedule instructions after register allocation" +#~ msgstr "Amabwiriza Nyuma Kwiyandikisha" + +#, fuzzy +#~ msgid "Enable scheduling across basic blocks" +#~ msgstr "Kwambukiranya BASIC" + +#, fuzzy +#~ msgid "Allow speculative motion of non-loads" +#~ msgstr "Bya" + +#, fuzzy +#~ msgid "Allow speculative motion of some loads" +#~ msgstr "Bya" + +#, fuzzy +#~ msgid "Allow speculative motion of more loads" +#~ msgstr "Bya Birenzeho" + +#, fuzzy +#~ msgid "Replace add,compare,branch with branch on count reg" +#~ msgstr "Kongeramo Kugereranya# Na: ku IBARA" + +#, fuzzy +#~ msgid "Generate position independent code, if possible" +#~ msgstr "Ibirindiro ITEGEKONGENGA NIBA" + +#, fuzzy +#~ msgid "Enable exception handling" +#~ msgstr "Irengayobora(-)" + +#, fuzzy +#~ msgid "Just generate unwind tables for exception handling" +#~ msgstr "Imbonerahamwe kugirango Irengayobora(-)" + +#, fuzzy +#~ msgid "Generate unwind tables exact at each instruction boundary" +#~ msgstr "Imbonerahamwe NYACYO ku" + +#, fuzzy +#~ msgid "Support synchronous non-call exceptions" +#~ msgstr "Amarengayobora" + +#, fuzzy +#~ msgid "Insert arc based program profiling code" +#~ msgstr "Agaheto Porogaramu ITEGEKONGENGA" + +#, fuzzy +#~ msgid "Create data files needed by gcov" +#~ msgstr "Ibyatanzwe Idosiye ku" + +#, fuzzy +#~ msgid "Use profiling information for branch probabilities" +#~ msgstr "Ibisobanuro kugirango" + +#, fuzzy +#~ msgid "Enable basic program profiling code" +#~ msgstr "BASIC Porogaramu ITEGEKONGENGA" + +#, fuzzy +#~ msgid "Reorder basic blocks to improve code placement" +#~ msgstr "BASIC Kuri ITEGEKONGENGA Ishyira mu mwanya" + +#, fuzzy +#~ msgid "Reorder functions to improve code placement" +#~ msgstr "Imimaro Kuri ITEGEKONGENGA Ishyira mu mwanya" + +#, fuzzy +#~ msgid "Do the register renaming optimization pass" +#~ msgstr "i Kwiyandikisha" + +#, fuzzy +#~ msgid "Do the register copy-propagation optimization pass" +#~ msgstr "i Kwiyandikisha Gukoporora" + +#, fuzzy +#~ msgid "Do not put uninitialized globals in the common section" +#~ msgstr "OYA Gushyira Itatangijwe in i Icyiciro" + +#, fuzzy +#~ msgid "Do not generate .size directives" +#~ msgstr "OYA Ingano" + +#, fuzzy +#~ msgid "place each function into its own section" +#~ msgstr "Umumaro Icyiciro" + +#, fuzzy +#~ msgid "place data items into their own section" +#~ msgstr "Ibyatanzwe Icyiciro" + +#, fuzzy +#~ msgid "Add extra commentary to assembler output" +#~ msgstr "Birenga Kuri Ibisohoka" + +#, fuzzy +#~ msgid "Output GNU ld formatted global initializers" +#~ msgstr "Byahanaguwe" + +#, fuzzy +#~ msgid "Enables a register move optimization" +#~ msgstr "a Kwiyandikisha Kwimura" + +#, fuzzy +#~ msgid "Do the full regmove optimization pass" +#~ msgstr "i" + +#, fuzzy +#~ msgid "Pack structure members together without holes" +#~ msgstr "Imiterere" + +#, fuzzy +#~ msgid "Insert stack checking code into the program" +#~ msgstr "ITEGEKONGENGA i Porogaramu" + +#, fuzzy +#~ msgid "Specify that arguments may alias each other & globals" +#~ msgstr "ingingo Gicurasi Irihimbano Ikindi" + +#, fuzzy +#~ msgid "Assume arguments may alias globals but not each other" +#~ msgstr "ingingo Gicurasi Irihimbano OYA Ikindi" + +#, fuzzy +#~ msgid "Assume arguments do not alias each other or globals" +#~ msgstr "ingingo OYA Irihimbano Ikindi Cyangwa" + +#, fuzzy +#~ msgid "Assume strict aliasing rules apply" +#~ msgstr "Gukurikiza" + +#, fuzzy +#~ msgid "Align the start of loops" +#~ msgstr "i Gutangira Bya" + +#, fuzzy +#~ msgid "Align labels which are only reached by jumping" +#~ msgstr "Uturango... ku" + +#, fuzzy +#~ msgid "Align all labels" +#~ msgstr "Byose Uturango..." + +#, fuzzy +#~ msgid "Align the start of functions" +#~ msgstr "i Gutangira Bya Imimaro" + +#, fuzzy +#~ msgid "Attempt to merge identical constants across compilation units" +#~ msgstr "Kuri Gukomatanya birasa Kwambukiranya" + +#, fuzzy +#~ msgid "Attempt to merge identical constants and constant variables" +#~ msgstr "Kuri Gukomatanya birasa Na Ibihinduka" + +#, fuzzy +#~ msgid "Suppress output of instruction numbers and line number notes in debugging dumps" +#~ msgstr "Ibisohoka Bya Imibare Na Umurongo Umubare Ibisobanuro in" + +#, fuzzy +#~ msgid "Instrument function entry/exit with profiling calls" +#~ msgstr "Umumaro Icyinjijwe Gusohoka Na: Amahamagara:" + +#, fuzzy +#~ msgid "Put zero initialized data in the bss section" +#~ msgstr "Zeru Ibyatanzwe in i Icyiciro" + +#, fuzzy +#~ msgid "Enable aggressive SSA dead code elimination" +#~ msgstr "ITEGEKONGENGA" + +#, fuzzy +#~ msgid "External symbols have a leading underscore" +#~ msgstr "Ibimenyetso a Nyobora" + +#, fuzzy +#~ msgid "Enables an rtl peephole pass run before sched2" +#~ msgstr "Gukoresha Mbere" + +#, fuzzy +#~ msgid "Assume no NaNs or +-Infs are generated" +#~ msgstr "Oya Cyangwa" + +#, fuzzy +#~ msgid "Enables guessing of branch probabilities" +#~ msgstr "Bya" + +#, fuzzy +#~ msgid "Set errno after built-in math functions" +#~ msgstr "Nyuma in Imibare Imimaro" + +#, fuzzy +#~ msgid "Floating-point operations can trap" +#~ msgstr "Akadomo Ibikorwa:" + +#, fuzzy +#~ msgid "Allow math optimizations that may violate IEEE or ANSI standards" +#~ msgstr "Imibare Gicurasi Cyangwa" + +#, fuzzy +#~ msgid "Disable optimizations observable by IEEE signaling NaNs" +#~ msgstr "ku" + +#, fuzzy +#~ msgid "Generate code to check bounds before indexing arrays" +#~ msgstr "ITEGEKONGENGA Kuri Kugenzura... Mbere gushyiraho umugereka" + +#, fuzzy +#~ msgid "Convert floating point constant to single precision constant" +#~ msgstr "Bihindagurika Akadomo Kuri UMWE" + +#, fuzzy +#~ msgid "Report time taken by each compiler pass at end of run" +#~ msgstr "Igihe ku ku Impera Bya Gukoresha" + +#, fuzzy +#~ msgid "Report on permanent memory allocation at end of run" +#~ msgstr "ku Ububiko ku Impera Bya Gukoresha" + +#, fuzzy +#~ msgid "Trap for signed overflow in addition / subtraction / multiplication" +#~ msgstr "kugirango Byarenze urugero in Guteranya+ Gukuramo Gukuba(*)" + +#, fuzzy +#~ msgid "Use graph coloring register allocation." +#~ msgstr "Kwiyandikisha" + +#, fuzzy +#~ msgid "Compile just for ISO C90" +#~ msgstr "kugirango" + +#, fuzzy +#~ msgid "Determine language standard" +#~ msgstr "Ururimi Bisanzwe" + +#, fuzzy +#~ msgid "Make bit-fields by unsigned by default" +#~ msgstr "Imyanya ku Bitashizweho umukono ku Mburabuzi" + +#, fuzzy +#~ msgid "Make 'char' be signed by default" +#~ msgstr "ku Mburabuzi" + +#, fuzzy +#~ msgid "Make 'char' be unsigned by default" +#~ msgstr "Bitashizweho umukono ku Mburabuzi" + +#, fuzzy +#~ msgid "Do not recognize the 'asm' keyword" +#~ msgstr "OYA i Ijambo- banze" + +#, fuzzy +#~ msgid "Do not recognize any built in functions" +#~ msgstr "OYA in Imimaro" + +#, fuzzy +#~ msgid "Assume normal C execution environment" +#~ msgstr "Bisanzwe C" + +#, fuzzy +#~ msgid "Assume that standard libraries & main might not exist" +#~ msgstr "Bisanzwe Amasomero OYA" + +#, fuzzy +#~ msgid "Allow different types as args of ? operator" +#~ msgstr "Nka Bya Mukoresha" + +#, fuzzy +#~ msgid "Allow the use of $ inside identifiers" +#~ msgstr "i Gukoresha Bya Mo Imbere" + +#, fuzzy +#~ msgid "Use the same size for double as for float" +#~ msgstr "i Ingano kugirango MAHARAKUBIRI Nka kugirango Kureremba" + +#, fuzzy +#~ msgid "Use the smallest fitting integer to hold enums" +#~ msgstr "i Gitoya Umubare wuzuye Kuri" + +#, fuzzy +#~ msgid "Override the underlying type for wchar_t to `unsigned short'" +#~ msgstr "i Ubwoko kugirango Kuri Bitashizweho umukono" + +#, fuzzy +#~ msgid "Enable most warning messages" +#~ msgstr "Iburira Ubutumwa" + +#, fuzzy +#~ msgid "Warn about casting functions to incompatible types" +#~ msgstr "Ibyerekeye Imimaro Kuri" + +#, fuzzy +#~ msgid "Warn about functions which might be candidates for format attributes" +#~ msgstr "Ibyerekeye Imimaro kugirango Imiterere Ibiranga" + +#, fuzzy +#~ msgid "Warn about casts which discard qualifiers" +#~ msgstr "Ibyerekeye Kwanga" + +#, fuzzy +#~ msgid "Warn about subscripts whose type is 'char'" +#~ msgstr "Ibyerekeye bya Ubwoko ni" + +#, fuzzy +#~ msgid "Warn if nested comments are detected" +#~ msgstr "NIBA Ibisobanuro" + +#, fuzzy +#~ msgid "Warn about possibly confusing type conversions" +#~ msgstr "Ibyerekeye Ubwoko" + +#, fuzzy +#~ msgid "Do not warn about compile-time integer division by zero" +#~ msgstr "OYA Ibyerekeye Gukusanya Igihe Umubare wuzuye ku Zeru" + +#, fuzzy +#~ msgid "Warn about testing equality of floating point numbers" +#~ msgstr "Ibyerekeye Bya Bihindagurika Akadomo Imibare" + +#, fuzzy +#~ msgid "Warn about printf/scanf/strftime/strfmon format anomalies" +#~ msgstr "Ibyerekeye Imiterere" + +#, fuzzy +#~ msgid "Don't warn about too many arguments to format functions" +#~ msgstr "Ibyerekeye ingingo Kuri Imiterere Imimaro" + +#, fuzzy +#~ msgid "Warn about non-string-literal format strings" +#~ msgstr "Ibyerekeye Ikurikiranyanyuguti Imiterere Ikurikiranyanyuguti" + +#, fuzzy +#~ msgid "Warn about possible security problems with format functions" +#~ msgstr "Ibyerekeye Umutekano Na: Imiterere Imimaro" + +#, fuzzy +#~ msgid "Don't warn about strftime formats yielding 2 digit years" +#~ msgstr "Ibyerekeye Imiterere 2. IMYAKA" + +#, fuzzy +#~ msgid "Warn about implicit function declarations" +#~ msgstr "Ibyerekeye Umumaro" + +#, fuzzy +#~ msgid "Warn when a declaration does not specify a type" +#~ msgstr "Ryari: a OYA a Ubwoko" + +#, fuzzy +#~ msgid "Warn about the use of the #import directive" +#~ msgstr "Ibyerekeye i Gukoresha Bya i Kuzana" + +#, fuzzy +#~ msgid "Do not warn about using 'long long' when -pedantic" +#~ msgstr "OYA Ibyerekeye ikoresha Ryari:" + +#, fuzzy +#~ msgid "Warn about suspicious declarations of main" +#~ msgstr "Ibyerekeye Bya" + +#, fuzzy +#~ msgid "Warn about possibly missing braces around initializers" +#~ msgstr "Ibyerekeye Ibuze Ingirwadusodeko" + +#, fuzzy +#~ msgid "Warn about global funcs without previous declarations" +#~ msgstr "Ibyerekeye Ibanjirije" + +#, fuzzy +#~ msgid "Warn about global funcs without prototypes" +#~ msgstr "Ibyerekeye" + +#, fuzzy +#~ msgid "Warn about use of multicharacter literals" +#~ msgstr "Ibyerekeye Gukoresha Bya" + +#, fuzzy +#~ msgid "Warn about externs not at file scope level" +#~ msgstr "Ibyerekeye OYA ku IDOSIYE Ingano: urwego" + +#, fuzzy +#~ msgid "Warn about possible missing parentheses" +#~ msgstr "Ibyerekeye Ibuze" + +#, fuzzy +#~ msgid "Warn about function pointer arithmetic" +#~ msgstr "Ibyerekeye Umumaro Mweretsi" + +#, fuzzy +#~ msgid "Warn about multiple declarations of the same object" +#~ msgstr "Ibyerekeye Igikubo Bya i Igikoresho" + +#, fuzzy +#~ msgid "Warn whenever a function's return-type defaults to int" +#~ msgstr "a Garuka Ubwoko Kuri INT" + +#, fuzzy +#~ msgid "Warn about possible violations of sequence point rules" +#~ msgstr "Ibyerekeye Bya Akadomo" + +#, fuzzy +#~ msgid "Warn about signed/unsigned comparisons" +#~ msgstr "Ibyerekeye Bitashizweho umukono" + +#, fuzzy +#~ msgid "Warn about non-prototyped function decls" +#~ msgstr "Ibyerekeye Umumaro" + +#, fuzzy +#~ msgid "Warn about constructs whose meanings change in ISO C" +#~ msgstr "Ibyerekeye bya Guhindura>> in C" + +#, fuzzy +#~ msgid "Warn when trigraphs are encountered" +#~ msgstr "Ryari:" + +#, fuzzy +#~ msgid "Warn about unrecognized pragmas" +#~ msgstr "Ibyerekeye" + +#, fuzzy +#~ msgid "Mark strings as 'const char *'" +#~ msgstr "Ikurikiranyanyuguti Nka INYUGUTI" + +#, fuzzy +#~ msgid "Warn when a function is unused" +#~ msgstr "Ryari: a Umumaro ni Kidakoreshwa" + +#, fuzzy +#~ msgid "Warn when a label is unused" +#~ msgstr "Ryari: a Akarango ni Kidakoreshwa" + +#, fuzzy +#~ msgid "Warn when a function parameter is unused" +#~ msgstr "Ryari: a Umumaro ni Kidakoreshwa" + +#, fuzzy +#~ msgid "Warn when a variable is unused" +#~ msgstr "Ryari: a IMPINDURAGACIRO ni Kidakoreshwa" + +#, fuzzy +#~ msgid "Warn when an expression value is unused" +#~ msgstr "Ryari: imvugo Agaciro ni Kidakoreshwa" + +#, fuzzy +#~ msgid "Do not suppress warnings from system headers" +#~ msgstr "OYA Iburira Bivuye Sisitemu Imitwe" + +#, fuzzy +#~ msgid "Treat all warnings as errors" +#~ msgstr "Byose Iburira Nka Amakosa" + +#, fuzzy +#~ msgid "Warn when one local variable shadows another" +#~ msgstr "Ryari: IMPINDURAGACIRO" + +#, fuzzy +#~ msgid "Warn about enumerated switches, with no default, missing a case" +#~ msgstr "Ibyerekeye Na: Oya Mburabuzi Ibuze a" + +#, fuzzy +#~ msgid "Warn about enumerated switches missing a default case" +#~ msgstr "Ibyerekeye Ibuze a Mburabuzi" + +#, fuzzy +#~ msgid "Warn about all enumerated switches missing a specific case" +#~ msgstr "Ibyerekeye Byose Ibuze a" + +#, fuzzy +#~ msgid "Warn about returning structures, unions or arrays" +#~ msgstr "Ibyerekeye Cyangwa" + +#, fuzzy +#~ msgid "Warn about pointer casts which increase alignment" +#~ msgstr "Ibyerekeye Mweretsi Itunganya" + +#, fuzzy +#~ msgid "Warn about code that will never be executed" +#~ msgstr "Ibyerekeye ITEGEKONGENGA Nta narimwe" + +#, fuzzy +#~ msgid "Warn about uninitialized automatic variables" +#~ msgstr "Ibyerekeye Itatangijwe Byikoresha Ibihinduka" + +#, fuzzy +#~ msgid "Warn when an inlined function cannot be inlined" +#~ msgstr "Ryari: Umumaro" + +#, fuzzy +#~ msgid "Warn when the packed attribute has no effect on struct layout" +#~ msgstr "Ryari: i Ikiranga Oya INGARUKA ku Imigaragarire" + +#, fuzzy +#~ msgid "Warn when padding is required to align struct members" +#~ msgstr "Ryari: Wuzuza: ni Bya ngombwa Kuri Gutondeka" + +#, fuzzy +#~ msgid "Warn when an optimization pass is disabled" +#~ msgstr "Ryari: ni Yahagaritswe" + +#, fuzzy +#~ msgid "Warn about uses of __attribute__((deprecated)) declarations" +#~ msgstr "Ibyerekeye Bya Ikiranga Bitemewe." + +#, fuzzy +#~ msgid "Warn about functions which might be candidates for attribute noreturn" +#~ msgstr "Ibyerekeye Imimaro kugirango Ikiranga" + +#, fuzzy +#~ msgid "Warn about code which might break the strict aliasing rules" +#~ msgstr "Ibyerekeye ITEGEKONGENGA itandukanya i" + +#, fuzzy +#~ msgid "invalid option `%s'" +#~ msgstr "Sibyo Ihitamo" + +#, fuzzy +#~ msgid "`%s' declared `static' but never defined" +#~ msgstr "`%s'Nta narimwe" + +#, fuzzy +#~ msgid "`%s' defined but not used" +#~ msgstr "`%s'OYA" + +#, fuzzy +#~ msgid "invalid register name `%s' for register variable" +#~ msgstr "Sibyo Kwiyandikisha Izina: kugirango Kwiyandikisha IMPINDURAGACIRO" + +#, fuzzy +#~ msgid " -ffixed- Mark as being unavailable to the compiler\n" +#~ msgstr "-Kwiyandikisha Kwiyandikisha Nka Kuri i" + +#, fuzzy +#~ msgid " -fcall-used- Mark as being corrupted by function calls\n" +#~ msgstr "-Kwiyandikisha Kwiyandikisha Nka ku Umumaro" + +#, fuzzy +#~ msgid " -fcall-saved- Mark as being preserved across functions\n" +#~ msgstr "-Kwiyandikisha Kwiyandikisha Nka Kwambukiranya" + +#, fuzzy +#~ msgid " -finline-limit= Limits the size of inlined functions to \n" +#~ msgstr "-Umubare i Ingano Bya Imimaro Kuri Umubare" + +#, fuzzy +#~ msgid " -fmessage-length= Limits diagnostics messages lengths to characters per line. 0 suppresses line-wrapping\n" +#~ msgstr "-Uburebure Umubare Ubutumwa Kuri Umubare Inyuguti Umurongo 0 Umurongo" + +#, fuzzy +#~ msgid " -fdiagnostics-show-location=[once | every-line] Indicates how often source location information should be emitted, as prefix, at the beginning of diagnostics when line-wrapping\n" +#~ msgstr "-Garagaza Ahantu Rimwe buri Umurongo Inkomoko Ahantu Ibisobanuro Nka Imbanziriza ku i Itangiriro Bya Ryari: Umurongo" + +#, fuzzy +#~ msgid " -ftls-model=[global-dynamic | local-dynamic | initial-exec | local-exec] Indicates the default thread-local storage code generation model\n" +#~ msgstr "-Urugero i Mburabuzi Urudodo ITEGEKONGENGA" + +#, fuzzy +#~ msgid " -O[number] Set optimization level to [number]\n" +#~ msgstr "-Umubare urwego Kuri Umubare" + +#, fuzzy +#~ msgid " -Os Optimize for space rather than speed\n" +#~ msgstr "-kugirango Umwanya" + +#, fuzzy +#~ msgid " -pedantic Issue warnings needed by strict compliance to ISO C\n" +#~ msgstr "-Iburira ku Kuri" + +#, fuzzy +#~ msgid " -pedantic-errors Like -pedantic except that errors are produced\n" +#~ msgstr "-Amakosa Amakosa" + +#, fuzzy +#~ msgid " -w Suppress warnings\n" +#~ msgstr "-W" + +#, fuzzy +#~ msgid " -W Enable extra warnings\n" +#~ msgstr "-Birenga" + +#, fuzzy +#~ msgid " -Wunused Enable unused warnings\n" +#~ msgstr "-Kidakoreshwa" + +#, fuzzy +#~ msgid " -Wlarger-than- Warn if an object is larger than bytes\n" +#~ msgstr "-Umubare NIBA Igikoresho ni Kinini Umubare" + +#, fuzzy +#~ msgid " -p Enable function profiling\n" +#~ msgstr "-P Umumaro" + +#, fuzzy +#~ msgid " -o Place output into \n" +#~ msgstr "-o IDOSIYE Ibisohoka IDOSIYE" + +#, fuzzy +#~ msgid "" +#~ " -G Put global and static data smaller than \n" +#~ " bytes into a special section (on some targets)\n" +#~ msgstr "-Umubare Na Ibyatanzwe Gitoya Umubare Bayite a Bidasanzwe Icyiciro ku" + +#, fuzzy +#~ msgid " -aux-info Emit declaration info into \n" +#~ msgstr "-Ibisobanuro IDOSIYE Ibisobanuro IDOSIYE" + +#, fuzzy +#~ msgid " -quiet Do not display functions compiled or elapsed time\n" +#~ msgstr "-OYA Kugaragaza Imimaro Cyangwa" + +#, fuzzy +#~ msgid " -version Display the compiler's version\n" +#~ msgstr "-Verisiyo i" + +#, fuzzy +#~ msgid " -d[letters] Enable dumps from specific passes of the compiler\n" +#~ msgstr "-D Bivuye Bya i" + +#, fuzzy +#~ msgid " -dumpbase Base name to be used for dumps from specific passes\n" +#~ msgstr "-IDOSIYE Base Izina: Kuri kugirango Bivuye" + +#, fuzzy +#~ msgid " -fsched-verbose= Set the verbosity level of the scheduler\n" +#~ msgstr "-Umubare i urwego Bya i" + +#, fuzzy +#~ msgid " --help Display this information\n" +#~ msgstr "--Ifashayobora iyi" + +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "Language specific options:\n" +#~ msgstr "Amahitamo" + +#, fuzzy +#~ msgid " %-23.23s [undocumented]\n" +#~ msgstr "" +#~ "%-23.Project- Id- Version: basctl\n" +#~ "POT- Creation- Date: 2003- 12- 07 17: 13+ 02\n" +#~ "PO- Revision- Date: 2004- 11- 04 10: 13- 0700\n" +#~ "Last- Translator: Language- Team:< en@ li. org> MIME- Version: 1. 0\n" +#~ "Content- Type: text/ plain; charset= UTF- 8\n" +#~ "Content- Transfer- Encoding: 8bit\n" +#~ "X- Generator: KBabel 1. 0\n" +#~ "." + +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "There are undocumented %s specific options as well.\n" +#~ msgstr "Amahitamo Nka" + +#, fuzzy +#~ msgid "" +#~ "\n" +#~ " Options for %s:\n" +#~ msgstr "kugirango" + +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "Target specific options:\n" +#~ msgstr "Amahitamo" + +#, fuzzy +#~ msgid " -m%-23.23s [undocumented]\n" +#~ msgstr "-M." + +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "There are undocumented target specific options as well.\n" +#~ msgstr "Intego Amahitamo Nka" + +#, fuzzy +#~ msgid " They exist, but they are not documented.\n" +#~ msgstr "OYA" + +#, fuzzy +#~ msgid "unrecognized gcc debugging option: %c" +#~ msgstr "Ihitamo" + +#, fuzzy +#~ msgid "`%s': unknown tls-model option" +#~ msgstr "`%s':Kitazwi TLS Urugero Ihitamo" + +#, fuzzy +#~ msgid "unrecognized register name `%s'" +#~ msgstr "Kwiyandikisha Izina:" + +#, fuzzy +#~ msgid "unrecognized option `%s'" +#~ msgstr "Ihitamo" + +#, fuzzy +#~ msgid "-Wid-clash-LEN is no longer supported" +#~ msgstr "-ni Oya" + +#, fuzzy +#~ msgid "use -gdwarf -g%d for DWARF v1, level %d" +#~ msgstr "Gukoresha g kugirango urwego" + +#, fuzzy +#~ msgid "use -gdwarf-2 for DWARF v2" +#~ msgstr "Gukoresha 2. kugirango" + +#, fuzzy +#~ msgid "ignoring option `%s' due to invalid debug level specification" +#~ msgstr "Ihitamo Kuri Sibyo Kosora amakosa urwego" + +#, fuzzy +#~ msgid "`%s': unknown or unsupported -g option" +#~ msgstr "`%s':Kitazwi Cyangwa g Ihitamo" + +#, fuzzy +#~ msgid "`%s' ignored, conflicts with `-g%s'" +#~ msgstr "`%s'Na: g" + +#, fuzzy +#~ msgid "-param option missing argument" +#~ msgstr "-Ihitamo Ibuze" + +#, fuzzy +#~ msgid "invalid --param option: %s" +#~ msgstr "Sibyo Ihitamo" + +#, fuzzy +#~ msgid "invalid parameter value `%s'" +#~ msgstr "Sibyo Agaciro" + +#, fuzzy +#~ msgid "" +#~ "%s%s%s version %s (%s)\n" +#~ "%s\tcompiled by GNU C version %s.\n" +#~ "%s%s%s version %s (%s) compiled by CC.\n" +#~ msgstr "%s%s%sVerisiyo ku C Verisiyo Verisiyo ku" + +#, fuzzy +#~ msgid "%s%sGGC heuristics: --param ggc-min-expand=%d --param ggc-min-heapsize=%d\n" +#~ msgstr "%s%sGGCGITO Kwagura GITO" + +#, fuzzy +#~ msgid "options passed: " +#~ msgstr "Amahitamo" + +#, fuzzy +#~ msgid "options enabled: " +#~ msgstr "Amahitamo Bikora" + +#, fuzzy +#~ msgid "can't open %s for writing" +#~ msgstr "Gufungura kugirango" + +#, fuzzy +#~ msgid "ignoring command line option '%s'" +#~ msgstr "Komandi: Umurongo Ihitamo" + +#, fuzzy +#~ msgid "(it is valid for %s but not the selected language)" +#~ msgstr "(ni Byemewe kugirango OYA i Byahiswemo Ururimi" + +#, fuzzy +#~ msgid "-Wuninitialized is not supported without -O" +#~ msgstr "-ni OYA" + +#, fuzzy +#~ msgid "instruction scheduling not supported on this target machine" +#~ msgstr "OYA ku iyi Intego" + +#, fuzzy +#~ msgid "this target machine does not have delayed branches" +#~ msgstr "iyi Intego OYA" + +#, fuzzy +#~ msgid "-f%sleading-underscore not supported on this target machine" +#~ msgstr "-F OYA ku iyi Intego" + +#, fuzzy +#~ msgid "-ffunction-sections not supported for this target" +#~ msgstr "-Ibyatoranyijwe OYA kugirango iyi Intego" + +#, fuzzy +#~ msgid "-fdata-sections not supported for this target" +#~ msgstr "-Ibyatoranyijwe OYA kugirango iyi Intego" + +#, fuzzy +#~ msgid "-ffunction-sections disabled; it makes profiling impossible" +#~ msgstr "-Ibyatoranyijwe Yahagaritswe" + +#, fuzzy +#~ msgid "-fprefetch-loop-arrays not supported for this target" +#~ msgstr "-OYA kugirango iyi Intego" + +#, fuzzy +#~ msgid "-fprefetch-loop-arrays not supported for this target (try -march switches)" +#~ msgstr "-OYA kugirango iyi Intego Werurwe" + +#, fuzzy +#~ msgid "-fprefetch-loop-arrays is not supported with -Os" +#~ msgstr "-ni OYA Na:" + +#, fuzzy +#~ msgid "-ffunction-sections may affect debugging on some targets" +#~ msgstr "-Ibyatoranyijwe Gicurasi ku" + +#, fuzzy +#~ msgid "error writing to %s" +#~ msgstr "Ikosa Kuri" + +#, fuzzy +#~ msgid "error closing %s" +#~ msgstr "Ikosa" + +#, fuzzy +#~ msgid "could not open dump file `%s'" +#~ msgstr "OYA Gufungura IDOSIYE" + +#, fuzzy +#~ msgid "ignoring unknown option `%.*s' in `-f%s'" +#~ msgstr "Kitazwi Ihitamo in F" + +#, fuzzy +#~ msgid "arrays of functions are not meaningful" +#~ msgstr "Bya Imimaro OYA" + +#, fuzzy +#~ msgid "function return type cannot be function" +#~ msgstr "Umumaro Garuka Ubwoko Umumaro" + +#, fuzzy +#~ msgid "invalid initializer for bit string" +#~ msgstr "Sibyo kugirango Ikurikiranyanyuguti" + +#, fuzzy +#~ msgid "tree check: expected %s, have %s in %s, at %s:%d" +#~ msgstr "Kugenzura... Ikitezwe: in ku" + +#, fuzzy +#~ msgid "tree check: expected class '%c', have '%c' (%s) in %s, at %s:%d" +#~ msgstr "Kugenzura... Ikitezwe: ishuri in ku" + +#, fuzzy +#~ msgid "tree check: accessed elt %d of tree_vec with %d elts in %s, at %s:%d" +#~ msgstr "Kugenzura... birabonetse Bya Na: in ku" + +#, fuzzy +#~ msgid "%s causes a section type conflict" +#~ msgstr "%sa Icyiciro Ubwoko" + +#, fuzzy +#~ msgid "register name not specified for `%s'" +#~ msgstr "Kwiyandikisha Izina: OYA kugirango" + +#, fuzzy +#~ msgid "invalid register name for `%s'" +#~ msgstr "Sibyo Kwiyandikisha Izina: kugirango" + +#, fuzzy +#~ msgid "data type of `%s' isn't suitable for a register" +#~ msgstr "Ibyatanzwe Ubwoko Bya si kugirango a Kwiyandikisha" + +#, fuzzy +#~ msgid "register specified for `%s' isn't suitable for data type" +#~ msgstr "Kwiyandikisha kugirango si kugirango Ibyatanzwe Ubwoko" + +#, fuzzy +#~ msgid "global register variable has initial value" +#~ msgstr "Kwiyandikisha IMPINDURAGACIRO Agaciro" + +#, fuzzy +#~ msgid "volatile register variables don't work as you might wish" +#~ msgstr "Kwiyandikisha Ibihinduka Akazi Nka" + +#, fuzzy +#~ msgid "register name given for non-register variable `%s'" +#~ msgstr "Kwiyandikisha Izina: kugirango Kwiyandikisha IMPINDURAGACIRO" + +#, fuzzy +#~ msgid "alignment of `%s' is greater than maximum object file alignment. Using %d" +#~ msgstr "Itunganya Bya ni Biruta Kinini Igikoresho IDOSIYE Itunganya" + +#, fuzzy +#~ msgid "thread-local COMMON data not implemented" +#~ msgstr "Urudodo Ibyatanzwe OYA" + +#, fuzzy +#~ msgid "requested alignment for %s is greater than implemented alignment of %d" +#~ msgstr "Itunganya kugirango ni Biruta Itunganya Bya" + +#, fuzzy +#~ msgid "initializer for integer value is too complicated" +#~ msgstr "kugirango Umubare wuzuye Agaciro ni" + +#, fuzzy +#~ msgid "initializer for floating value is not a floating constant" +#~ msgstr "kugirango Bihindagurika Agaciro ni OYA a Bihindagurika" + +#, fuzzy +#~ msgid "unknown set constructor type" +#~ msgstr "Kitazwi Gushyiraho Ubwoko" + +#, fuzzy +#~ msgid "invalid initial value for member `%s'" +#~ msgstr "Sibyo Agaciro kugirango" + +#, fuzzy +#~ msgid "weak declaration of `%s' must precede definition" +#~ msgstr "Bya Insobanuro" + +#, fuzzy +#~ msgid "weak declaration of `%s' after first use results in unspecified behavior" +#~ msgstr "Bya Nyuma Itangira Gukoresha Ibisubizo ku in imyitwarire" + +#, fuzzy +#~ msgid "weak declaration of `%s' must be public" +#~ msgstr "Bya Rusange" + +#, fuzzy +#~ msgid "weak declaration of `%s' not supported" +#~ msgstr "Bya OYA" + +#, fuzzy +#~ msgid "only weak aliases are supported in this configuration" +#~ msgstr "Irihimbano in iyi Iboneza" + +#, fuzzy +#~ msgid "alias definitions not supported in this configuration; ignored" +#~ msgstr "Irihimbano OYA in iyi Iboneza" + +#, fuzzy +#~ msgid "visibility attribute not supported in this configuration; ignored" +#~ msgstr "Ukugaragara Ikiranga OYA in iyi Iboneza" + +#, fuzzy +#~ msgid "virtual array %s[%lu]: element %lu out of bounds in %s, at %s:%d" +#~ msgstr "Kitaboneka Imbonerahamwe Ikigize: Inyuma Bya in ku" + +#, fuzzy +#~ msgid "no sclass for %s stab (0x%x)\n" +#~ msgstr "Oya kugirango" + +#, fuzzy +#~ msgid "#`%s' not supported by %s#" +#~ msgstr "#`%s'OYA ku" + +#, fuzzy +#~ msgid "The maximum number of instructions in a single function eligible for inlining" +#~ msgstr "Kinini Umubare Bya Amabwiriza in a UMWE Umumaro kugirango" + +#, fuzzy +#~ msgid "The maximum number of instructions when automatically inlining" +#~ msgstr "Kinini Umubare Bya Amabwiriza Ryari: ku buryo bwikora" + +#, fuzzy +#~ msgid "The maximum number of instructions by repeated inlining before gcc starts to throttle inlining" +#~ msgstr "Kinini Umubare Bya Amabwiriza ku byasubiyemo Mbere Kuri" + +#, fuzzy +#~ msgid "The slope of the linear function throttling inlining after the recursive inlining limit has been reached is given by the negative reciprocal value of this parameter" +#~ msgstr "IMANURA Bya i By'umurongo Umumaro Nyuma i ni ku i Agaciro Bya iyi" + +#, fuzzy +#~ msgid "The number of instructions in a single functions still eligible to inlining after a lot recursive inlining" +#~ msgstr "Umubare Bya Amabwiriza in a UMWE Imimaro Kuri Nyuma a" + +#, fuzzy +#~ msgid "The maximum number of instructions for the RTL inliner" +#~ msgstr "Kinini Umubare Bya Amabwiriza kugirango i" + +#, fuzzy +#~ msgid "The maximum number of instructions to consider to fill a delay slot" +#~ msgstr "Kinini Umubare Bya Amabwiriza Kuri Kuri Kuzuza a Gutinda" + +#, fuzzy +#~ msgid "The maximum number of instructions to consider to find accurate live register information" +#~ msgstr "Kinini Umubare Bya Amabwiriza Kuri Kuri Gushaka Kwiyandikisha Ibisobanuro" + +#, fuzzy +#~ msgid "The maximum length of scheduling's pending operations list" +#~ msgstr "Kinini Uburebure Bya Ibikorwa: Urutonde" + +#, fuzzy +#~ msgid "The maximum amount of memory to be allocated by GCSE" +#~ msgstr "Kinini Igiteranyo Bya Ububiko Kuri ku" + +#, fuzzy +#~ msgid "The maximum number of passes to make when doing GCSE" +#~ msgstr "Kinini Umubare Bya Kuri Ubwoko Ryari:" + +#, fuzzy +#~ msgid "The maximum number of instructions to consider to unroll in a loop" +#~ msgstr "Kinini Umubare Bya Amabwiriza Kuri Kuri in a" + +#, fuzzy +#~ msgid "Select fraction of the maximal count of repetitions of basic block in program given basic block needs to have to be considered hot" +#~ msgstr "Imigabane Bya i IBARA Bya Bya BASIC Funga in Porogaramu BASIC Funga Kuri Kuri" + +#, fuzzy +#~ msgid "Select fraction of the maximal frequency of executions of basic block in function given basic block needs to have to be considered hot" +#~ msgstr "Imigabane Bya i Ubwisubire Bya Bya BASIC Funga in Umumaro BASIC Funga Kuri Kuri" + +#, fuzzy +#~ msgid "The percentage of function, weighted by execution frequency, that must be covered by trace formation. Used when profile feedback is available" +#~ msgstr "Ijanisha Bya Umumaro ku Ubwisubire ku Ryari: Ibijyana ni Bihari" + +#, fuzzy +#~ msgid "The percentage of function, weighted by execution frequency, that must be covered by trace formation. Used when profile feedback is not available" +#~ msgstr "Ijanisha Bya Umumaro ku Ubwisubire ku Ryari: Ibijyana ni OYA Bihari" + +#, fuzzy +#~ msgid "Maximal code growth caused by tail duplication (in percents)" +#~ msgstr "ITEGEKONGENGA IKURA ku in" + +#, fuzzy +#~ msgid "Stop reverse growth if the reverse probability of best edge is less than this threshold (in percents)" +#~ msgstr "Ihindurakerekezo IKURA NIBA i Ihindurakerekezo Imishobokere Bya ni Birutwa iyi in" + +#, fuzzy +#~ msgid "Stop forward growth if the probability of best edge is less than this threshold (in percents). Used when profile feedback is available" +#~ msgstr "Imbere IKURA NIBA i Imishobokere Bya ni Birutwa iyi in Ryari: Ibijyana ni Bihari" + +#, fuzzy +#~ msgid "Stop forward growth if the probability of best edge is less than this threshold (in percents). Used when profile feedback is not available" +#~ msgstr "Imbere IKURA NIBA i Imishobokere Bya ni Birutwa iyi in Ryari: Ibijyana ni OYA Bihari" + +#, fuzzy +#~ msgid "The maximum number of incoming edges to consider for crossjumping" +#~ msgstr "Kinini Umubare Bya Kuri kugirango" + +#, fuzzy +#~ msgid "Minimum heap expansion to trigger garbage collection, as a percentage of the total size of the heap." +#~ msgstr "Kuri Imbarutso Nka a Ijanisha Bya i Igiteranyo Ingano Bya i" + +#, fuzzy +#~ msgid "Minimum heap size before we start collecting garbage, in kilobytes." +#~ msgstr "Ingano Mbere Twebwe Gutangira in" + +#, fuzzy +#~ msgid "too many #pragma options align=reset" +#~ msgstr "Amahitamo Gutondeka Kugarura" + +#, fuzzy +#~ msgid "junk at end of '#pragma options'" +#~ msgstr "Umwanda ku Impera Bya" + +#, fuzzy +#~ msgid "malformed '#pragma options align={mac68k|power|reset}', ignoring" +#~ msgstr "Amahitamo Gutondeka UMWIKUBE Kugarura" + +#, fuzzy +#~ msgid "missing '(' after '#pragma unused', ignoring" +#~ msgstr "Ibuze Nyuma" + +#, fuzzy +#~ msgid "missing ')' after '#pragma unused', ignoring" +#~ msgstr "Ibuze Nyuma" + +#, fuzzy +#~ msgid "junk at end of '#pragma unused'" +#~ msgstr "Umwanda ku Impera Bya" + +#, fuzzy +#~ msgid "-msystem-v and -p are incompatible" +#~ msgstr "-v Na P" + +#, fuzzy +#~ msgid "-msystem-v and -mthreads are incompatible" +#~ msgstr "-v Na" + +#, fuzzy +#~ msgid "-f%s ignored for Unicos/Mk (not supported)" +#~ msgstr "-F kugirango OYA" + +#, fuzzy +#~ msgid "-mieee not supported on Unicos/Mk" +#~ msgstr "-OYA ku" + +#, fuzzy +#~ msgid "-mieee-with-inexact not supported on Unicos/Mk" +#~ msgstr "-Na: OYA ku" + +#, fuzzy +#~ msgid "bad value `%s' for -mtrap-precision switch" +#~ msgstr "Agaciro kugirango Hindura" + +#, fuzzy +#~ msgid "bad value `%s' for -mfp-rounding-mode switch" +#~ msgstr "Agaciro kugirango Ubwoko Hindura" + +#, fuzzy +#~ msgid "bad value `%s' for -mfp-trap-mode switch" +#~ msgstr "Agaciro kugirango Ubwoko Hindura" + +#, fuzzy +#~ msgid "bad value `%s' for -mtls-size switch" +#~ msgstr "Agaciro kugirango Ingano Hindura" + +#, fuzzy +#~ msgid "bad value `%s' for -mcpu switch" +#~ msgstr "Agaciro kugirango Hindura" + +#, fuzzy +#~ msgid "trap mode not supported on Unicos/Mk" +#~ msgstr "Ubwoko OYA ku" + +#, fuzzy +#~ msgid "fp software completion requires -mtrap-precision=i" +#~ msgstr "i" + +#, fuzzy +#~ msgid "rounding mode not supported for VAX floats" +#~ msgstr "Ubwoko OYA kugirango" + +#, fuzzy +#~ msgid "trap mode not supported for VAX floats" +#~ msgstr "Ubwoko OYA kugirango" + +#, fuzzy +#~ msgid "L%d cache latency unknown for %s" +#~ msgstr "Ubwihisho Kitazwi kugirango" + +#, fuzzy +#~ msgid "bad value `%s' for -mmemory-latency" +#~ msgstr "Agaciro kugirango" + +# sc/source\ui\src\globstr.src:RID_GLOBSTR.STR_VALID_DEFERROR.text +#, fuzzy +#~ msgid "invalid %%H value" +#~ msgstr "Agaciro siko" + +# sc/source\ui\src\globstr.src:RID_GLOBSTR.STR_VALID_DEFERROR.text +#, fuzzy +#~ msgid "invalid %%J value" +#~ msgstr "Agaciro siko" + +# sc/source\ui\src\globstr.src:RID_GLOBSTR.STR_VALID_DEFERROR.text +#, fuzzy +#~ msgid "invalid %%r value" +#~ msgstr "Agaciro siko" + +# sc/source\ui\src\globstr.src:RID_GLOBSTR.STR_VALID_DEFERROR.text +#, fuzzy +#~ msgid "invalid %%R value" +#~ msgstr "Agaciro siko" + +# sc/source\ui\src\globstr.src:RID_GLOBSTR.STR_VALID_DEFERROR.text +#, fuzzy +#~ msgid "invalid %%N value" +#~ msgstr "Agaciro siko" + +# sc/source\ui\src\globstr.src:RID_GLOBSTR.STR_VALID_DEFERROR.text +#, fuzzy +#~ msgid "invalid %%P value" +#~ msgstr "Agaciro siko" + +# sc/source\ui\src\globstr.src:RID_GLOBSTR.STR_VALID_DEFERROR.text +#, fuzzy +#~ msgid "invalid %%h value" +#~ msgstr "Agaciro siko" + +# sc/source\ui\src\globstr.src:RID_GLOBSTR.STR_VALID_DEFERROR.text +#, fuzzy +#~ msgid "invalid %%L value" +#~ msgstr "Agaciro siko" + +# sc/source\ui\src\globstr.src:RID_GLOBSTR.STR_VALID_DEFERROR.text +#, fuzzy +#~ msgid "invalid %%m value" +#~ msgstr "Agaciro siko" + +# sc/source\ui\src\globstr.src:RID_GLOBSTR.STR_VALID_DEFERROR.text +#, fuzzy +#~ msgid "invalid %%M value" +#~ msgstr "Agaciro siko" + +# sc/source\ui\src\globstr.src:RID_GLOBSTR.STR_VALID_DEFERROR.text +#, fuzzy +#~ msgid "invalid %%U value" +#~ msgstr "Agaciro siko" + +# sc/source\ui\src\globstr.src:RID_GLOBSTR.STR_VALID_DEFERROR.text +#, fuzzy +#~ msgid "invalid %%s value" +#~ msgstr "Agaciro siko" + +# sc/source\ui\src\globstr.src:RID_GLOBSTR.STR_VALID_DEFERROR.text +#, fuzzy +#~ msgid "invalid %%C value" +#~ msgstr "Agaciro siko" + +# sc/source\ui\src\globstr.src:RID_GLOBSTR.STR_VALID_DEFERROR.text +#, fuzzy +#~ msgid "invalid %%E value" +#~ msgstr "Agaciro siko" + +#, fuzzy +#~ msgid "unknown relocation unspec" +#~ msgstr "Kitazwi" + +#, fuzzy +#~ msgid "invalid %%xn code" +#~ msgstr "Sibyo ITEGEKONGENGA" + +#, fuzzy +#~ msgid "Do not use hardware fp" +#~ msgstr "OYA Gukoresha" + +#, fuzzy +#~ msgid "Do not use fp registers" +#~ msgstr "OYA Gukoresha" + +#, fuzzy +#~ msgid "Do not assume GAS" +#~ msgstr "OYA" + +#, fuzzy +#~ msgid "Request IEEE-conformant math library routines (OSF/1)" +#~ msgstr "Imibare Isomero 1." + +#, fuzzy +#~ msgid "Emit IEEE-conformant code, without inexact exceptions" +#~ msgstr "ITEGEKONGENGA Amarengayobora" + +#, fuzzy +#~ msgid "Emit IEEE-conformant code, with inexact exceptions" +#~ msgstr "ITEGEKONGENGA Na: Amarengayobora" + +#, fuzzy +#~ msgid "Do not emit complex integer constants to read-only memory" +#~ msgstr "OYA ITSINDA RY'IMIBARE C Umubare wuzuye Kuri Gusoma Ububiko" + +#, fuzzy +#~ msgid "Do not use VAX fp" +#~ msgstr "OYA Gukoresha" + +#, fuzzy +#~ msgid "Emit code for the byte/word ISA extension" +#~ msgstr "ITEGEKONGENGA kugirango i Bayite ijambo Umugereka" + +#, fuzzy +#~ msgid "Emit code for the motion video ISA extension" +#~ msgstr "ITEGEKONGENGA kugirango i Videwo... Umugereka" + +#, fuzzy +#~ msgid "Emit code for the fp move and sqrt ISA extension" +#~ msgstr "ITEGEKONGENGA kugirango i Kwimura Na SQRT Umugereka" + +#, fuzzy +#~ msgid "Emit code for the counting ISA extension" +#~ msgstr "ITEGEKONGENGA kugirango i Kubara Umugereka" + +#, fuzzy +#~ msgid "Emit code using explicit relocation directives" +#~ msgstr "ITEGEKONGENGA ikoresha" + +#, fuzzy +#~ msgid "Emit 16-bit relocations to the small data areas" +#~ msgstr "Kuri i Gitoya Ibyatanzwe Ubuso" + +#, fuzzy +#~ msgid "Emit 32-bit relocations to the small data areas" +#~ msgstr "Kuri i Gitoya Ibyatanzwe Ubuso" + +#, fuzzy +#~ msgid "Emit rdval instead of rduniq for thread pointer" +#~ msgstr "Bya kugirango Urudodo Mweretsi" + +#, fuzzy +#~ msgid "Use features of and schedule given CPU" +#~ msgstr "Ibiranga Bya Na Igenabihe" + +#, fuzzy +#~ msgid "Control the generated fp rounding mode" +#~ msgstr "i Ubwoko" + +#, fuzzy +#~ msgid "Control the IEEE trap mode" +#~ msgstr "i Ubwoko" + +#, fuzzy +#~ msgid "Control the precision given to fp exceptions" +#~ msgstr "i Kuri Amarengayobora" + +#, fuzzy +#~ msgid "Tune expected memory latency" +#~ msgstr "Ikitezwe: Ububiko" + +#, fuzzy +#~ msgid "Specify bit size of immediate TLS offsets" +#~ msgstr "Ingano Bya" + +#, fuzzy +#~ msgid "bad value (%s) for -mcpu switch" +#~ msgstr "Agaciro kugirango Hindura" + +#, fuzzy +#~ msgid "argument of `%s' attribute is not a string constant" +#~ msgstr "Bya Ikiranga ni OYA a Ikurikiranyanyuguti" + +#, fuzzy +#~ msgid "argument of `%s' attribute is not \"ilink1\" or \"ilink2\"" +#~ msgstr "Bya Ikiranga ni OYA Cyangwa" + +#, fuzzy +#~ msgid "invalid operand to %%R code" +#~ msgstr "Sibyo Kuri ITEGEKONGENGA" + +#, fuzzy +#~ msgid "invalid operand to %%H/%%L code" +#~ msgstr "Sibyo Kuri ITEGEKONGENGA" + +#, fuzzy +#~ msgid "invalid operand to %%U code" +#~ msgstr "Sibyo Kuri ITEGEKONGENGA" + +#, fuzzy +#~ msgid "invalid operand to %%V code" +#~ msgstr "Sibyo Kuri ITEGEKONGENGA" + +#, fuzzy +#~ msgid "invalid operand output code" +#~ msgstr "Sibyo Ibisohoka ITEGEKONGENGA" + +#, fuzzy +#~ msgid "switch -mcpu=%s conflicts with -march= switch" +#~ msgstr "Hindura Na: Werurwe Hindura" + +#, fuzzy +#~ msgid "bad value (%s) for %s switch" +#~ msgstr "Agaciro kugirango Hindura" + +#, fuzzy +#~ msgid "target CPU does not support APCS-32" +#~ msgstr "Intego OYA Gushigikira" + +#, fuzzy +#~ msgid "target CPU does not support APCS-26" +#~ msgstr "Intego OYA Gushigikira" + +#, fuzzy +#~ msgid "target CPU does not support interworking" +#~ msgstr "Intego OYA Gushigikira" + +#, fuzzy +#~ msgid "target CPU does not support THUMB instructions" +#~ msgstr "Intego OYA Gushigikira Amabwiriza" + +#, fuzzy +#~ msgid "enabling backtrace support is only meaningful when compiling for the Thumb" +#~ msgstr "Gushigikira ni Ryari: kugirango i" + +#, fuzzy +#~ msgid "enabling callee interworking support is only meaningful when compiling for the Thumb" +#~ msgstr "Gushigikira ni Ryari: kugirango i" + +#, fuzzy +#~ msgid "enabling caller interworking support is only meaningful when compiling for the Thumb" +#~ msgstr "Gushigikira ni Ryari: kugirango i" + +#, fuzzy +#~ msgid "interworking forces APCS-32 to be used" +#~ msgstr "Kuri" + +#, fuzzy +#~ msgid "-mapcs-stack-check incompatible with -mno-apcs-frame" +#~ msgstr "-Kugenzura... Na: Ikadiri" + +#, fuzzy +#~ msgid "-fpic and -mapcs-reent are incompatible" +#~ msgstr "-Na" + +#, fuzzy +#~ msgid "APCS reentrant code not supported. Ignored" +#~ msgstr "ITEGEKONGENGA OYA" + +#, fuzzy +#~ msgid "-g with -mno-apcs-frame may not give sensible debugging" +#~ msgstr "-g Na: Ikadiri Gicurasi OYA" + +#, fuzzy +#~ msgid "passing floating point arguments in fp regs not yet supported" +#~ msgstr "Bihindagurika Akadomo ingingo in OYA" + +#, fuzzy +#~ msgid "invalid floating point emulation option: -mfpe-%s" +#~ msgstr "Sibyo Bihindagurika Akadomo Ihitamo" + +#, fuzzy +#~ msgid "structure size boundary can only be set to 8 or 32" +#~ msgstr "Imiterere Ingano Gushyiraho Kuri 8 Cyangwa" + +#, fuzzy +#~ msgid "-mpic-register= is useless without -fpic" +#~ msgstr "-Kwiyandikisha ni" + +#, fuzzy +#~ msgid "unable to use '%s' for PIC register" +#~ msgstr "Kuri Gukoresha kugirango Kwiyandikisha" + +#, fuzzy +#~ msgid "`%s' attribute only applies to functions" +#~ msgstr "`%s'Ikiranga Kuri Imimaro" + +#, fuzzy +#~ msgid "unable to compute real location of stacked parameter" +#~ msgstr "Kuri Ahantu Bya Birunze" + +#, fuzzy +#~ msgid "no low registers available for popping high registers" +#~ msgstr "Oya Byo hasi Bihari kugirango kirekire" + +#, fuzzy +#~ msgid "interrupt Service Routines cannot be coded in Thumb mode" +#~ msgstr "Hagarikira aho in Ubwoko" + +#, fuzzy +#~ msgid "initialized variable `%s' is marked dllimport" +#~ msgstr "IMPINDURAGACIRO ni cy/ byagarajwe" + +#, fuzzy +#~ msgid "static variable `%s' is marked dllimport" +#~ msgstr "IMPINDURAGACIRO ni cy/ byagarajwe" + +#, fuzzy +#~ msgid "Generate APCS conformant stack frames" +#~ msgstr "Amakadiri" + +#, fuzzy +#~ msgid "Store function names in object code" +#~ msgstr "Umumaro Amazina in Igikoresho ITEGEKONGENGA" + +#, fuzzy +#~ msgid "Use the 32-bit version of the APCS" +#~ msgstr "i Verisiyo Bya i" + +#, fuzzy +#~ msgid "Use the 26-bit version of the APCS" +#~ msgstr "i Verisiyo Bya i" + +#, fuzzy +#~ msgid "Pass FP arguments in FP registers" +#~ msgstr "ingingo in" + +#, fuzzy +#~ msgid "Generate re-entrant, PIC code" +#~ msgstr "ITEGEKONGENGA" + +#, fuzzy +#~ msgid "The MMU will trap on unaligned accesses" +#~ msgstr "ku" + +#, fuzzy +#~ msgid "Use library calls to perform FP operations" +#~ msgstr "Isomero Amahamagara: Kuri Ibikorwa:" + +#, fuzzy +#~ msgid "Use hardware floating point instructions" +#~ msgstr "Bihindagurika Akadomo Amabwiriza" + +#, fuzzy +#~ msgid "Assume target CPU is configured as big endian" +#~ msgstr "Intego ni Nka" + +#, fuzzy +#~ msgid "Assume target CPU is configured as little endian" +#~ msgstr "Intego ni Nka" + +#, fuzzy +#~ msgid "Assume big endian bytes, little endian words" +#~ msgstr "Bayite Amagambo" + +#, fuzzy +#~ msgid "Support calls between Thumb and ARM instruction sets" +#~ msgstr "Amahamagara: hagati Na" + +#, fuzzy +#~ msgid "Generate a call to abort if a noreturn function returns" +#~ msgstr "a Kuri Kureka NIBA a Umumaro" + +#, fuzzy +#~ msgid "Do not move instructions into a function's prologue" +#~ msgstr "OYA Kwimura Amabwiriza a" + +#, fuzzy +#~ msgid "Do not load the PIC register in function prologues" +#~ msgstr "OYA Ibirimo i Kwiyandikisha in Umumaro" + +#, fuzzy +#~ msgid "Generate call insns as indirect calls, if necessary" +#~ msgstr "Nka BUZIGUYE Amahamagara: NIBA" + +#, fuzzy +#~ msgid "Compile for the Thumb not the ARM" +#~ msgstr "kugirango i OYA i" + +#, fuzzy +#~ msgid "Thumb: Generate (non-leaf) stack frames even if not needed" +#~ msgstr "Amakadiri ATARIIGIHARWE NIBA OYA" + +#, fuzzy +#~ msgid "Thumb: Generate (leaf) stack frames even if not needed" +#~ msgstr "Amakadiri ATARIIGIHARWE NIBA OYA" + +#, fuzzy +#~ msgid "Thumb: Assume non-static functions may be called from ARM code" +#~ msgstr "Imimaro Gicurasi Bivuye ITEGEKONGENGA" + +#, fuzzy +#~ msgid "Thumb: Assume function pointers may go to non-Thumb aware code" +#~ msgstr "Umumaro Gicurasi Gyayo Kuri ITEGEKONGENGA" + +#, fuzzy +#~ msgid "Specify the name of the target CPU" +#~ msgstr "i Izina: Bya i Intego" + +#, fuzzy +#~ msgid "Specify the name of the target architecture" +#~ msgstr "i Izina: Bya i Intego" + +#, fuzzy +#~ msgid "Specify the version of the floating point emulator" +#~ msgstr "i Verisiyo Bya i Bihindagurika Akadomo" + +#, fuzzy +#~ msgid "Specify the minimum bit alignment of structures" +#~ msgstr "i Gito Itunganya Bya" + +#, fuzzy +#~ msgid "Specify the register to be used for PIC addressing" +#~ msgstr "i Kwiyandikisha Kuri kugirango Kwohereza" + +#, fuzzy +#~ msgid "Ignore dllimport attribute for functions" +#~ msgstr "Ikiranga kugirango Imimaro" + +#, fuzzy +#~ msgid "large frame pointer change (%d) with -mtiny-stack" +#~ msgstr "Binini Ikadiri Mweretsi Guhindura>> Na:" + +#, fuzzy +#~ msgid "bad address, not (reg+disp):" +#~ msgstr "Aderesi OYA" + +#, fuzzy +#~ msgid "internal compiler error. Bad address:" +#~ msgstr "By'imbere Ikosa Aderesi" + +#, fuzzy +#~ msgid "internal compiler error. Unknown mode:" +#~ msgstr "By'imbere Ikosa Ubwoko" + +#, fuzzy +#~ msgid "invalid insn:" +#~ msgstr "Sibyo" + +#, fuzzy +#~ msgid "unknown move insn:" +#~ msgstr "Kitazwi Kwimura" + +#, fuzzy +#~ msgid "bad shift insn:" +#~ msgstr "Gusunika" + +#, fuzzy +#~ msgid "internal compiler error. Incorrect shift:" +#~ msgstr "By'imbere Ikosa Gusunika" + +#, fuzzy +#~ msgid "only initialized variables can be placed into program memory area" +#~ msgstr "Ibihinduka Porogaramu Ububiko Ubuso" + +#, fuzzy +#~ msgid "only uninitialized variables can be placed in the .noinit section" +#~ msgstr "Itatangijwe Ibihinduka in i Icyiciro" + +#, fuzzy +#~ msgid "MCU `%s' supported for assembler only" +#~ msgstr "kugirango" + +#, fuzzy +#~ msgid "Assume int to be 8 bit integer" +#~ msgstr "INT Kuri 8 Umubare wuzuye" + +#, fuzzy +#~ msgid "Change the stack pointer without disabling interrupts" +#~ msgstr "i Mweretsi" + +#, fuzzy +#~ msgid "Use subroutines for function prologue/epilogue" +#~ msgstr "kugirango Umumaro" + +#, fuzzy +#~ msgid "Change only the low 8 bits of the stack pointer" +#~ msgstr "i Byo hasi 8 Bya i Mweretsi" + +#, fuzzy +#~ msgid "Do not generate tablejump insns" +#~ msgstr "OYA" + +#, fuzzy +#~ msgid "Use rjmp/rcall (limited range) on >8K devices" +#~ msgstr "Urutonde ku" + +#, fuzzy +#~ msgid "Output instruction sizes to the asm file" +#~ msgstr "Kuri i IDOSIYE" + +#, fuzzy +#~ msgid "Specify the initial stack address" +#~ msgstr "i Aderesi" + +#, fuzzy +#~ msgid "Specify the MCU name" +#~ msgstr "i Izina:" + +#, fuzzy +#~ msgid "trampolines not supported" +#~ msgstr "OYA" + +#, fuzzy +#~ msgid "missing '(' after '#pragma %s' - ignored" +#~ msgstr "Ibuze Nyuma" + +#, fuzzy +#~ msgid "missing function name in '#pragma %s' - ignored" +#~ msgstr "Ibuze Umumaro Izina: in" + +#, fuzzy +#~ msgid "missing section name in '#pragma %s' - ignored" +#~ msgstr "Ibuze Icyiciro Izina: in" + +#, fuzzy +#~ msgid "missing ')' for '#pragma %s' - ignored" +#~ msgstr "Ibuze kugirango" + +#, fuzzy +#~ msgid "junk at end of '#pragma %s'" +#~ msgstr "Umwanda ku Impera Bya" + +#, fuzzy +#~ msgid "unknown CPU version %d, using 40.\n" +#~ msgstr "Kitazwi Verisiyo ikoresha" + +#, fuzzy +#~ msgid "ISR %s requires %d words of local vars, max is 32767" +#~ msgstr "Amagambo Bya KININI ni" + +#, fuzzy +#~ msgid "using CONST_DOUBLE for address" +#~ msgstr "ikoresha kugirango Aderesi" + +#, fuzzy +#~ msgid "c4x_address_cost: Invalid addressing mode" +#~ msgstr "Kwohereza Ubwoko" + +#, fuzzy +#~ msgid "c4x_rptb_insert: Cannot find start label" +#~ msgstr "Gushaka Gutangira Akarango" + +#, fuzzy +#~ msgid "mode not QImode" +#~ msgstr "Ubwoko OYA" + +#, fuzzy +#~ msgid "invalid indirect memory address" +#~ msgstr "Sibyo BUZIGUYE Ububiko Aderesi" + +#, fuzzy +#~ msgid "invalid indirect (S) memory address" +#~ msgstr "Sibyo BUZIGUYE Ububiko Aderesi" + +#, fuzzy +#~ msgid "c4x_valid_operands: Internal error" +#~ msgstr "Ikosa" + +#, fuzzy +#~ msgid "c4x_operand_subword: invalid mode" +#~ msgstr "Sibyo Ubwoko" + +#, fuzzy +#~ msgid "c4x_operand_subword: invalid operand" +#~ msgstr "Sibyo" + +#, fuzzy +#~ msgid "c4x_operand_subword: invalid autoincrement" +#~ msgstr "Sibyo nyamwiyongera" + +#, fuzzy +#~ msgid "c4x_operand_subword: invalid address" +#~ msgstr "Sibyo Aderesi" + +#, fuzzy +#~ msgid "c4x_operand_subword: address not offsettable" +#~ msgstr "Aderesi OYA" + +#, fuzzy +#~ msgid "c4x_rptb_rpts_p: Repeat block top label moved\n" +#~ msgstr "Funga Hejuru: Akarango" + +#, fuzzy +#~ msgid "Small memory model" +#~ msgstr "Ububiko Urugero" + +#, fuzzy +#~ msgid "Big memory model" +#~ msgstr "Ububiko Urugero" + +#, fuzzy +#~ msgid "Use MPYI instruction for C3x" +#~ msgstr "kugirango" + +#, fuzzy +#~ msgid "Do not use MPYI instruction for C3x" +#~ msgstr "OYA Gukoresha kugirango" + +#, fuzzy +#~ msgid "Use fast but approximate float to integer conversion" +#~ msgstr "Byihuta Kureremba Kuri Umubare wuzuye Ihindurangero" + +#, fuzzy +#~ msgid "Use slow but accurate float to integer conversion" +#~ msgstr "Buhoro Kureremba Kuri Umubare wuzuye Ihindurangero" + +#, fuzzy +#~ msgid "Enable use of RTPS instruction" +#~ msgstr "Gukoresha Bya" + +#, fuzzy +#~ msgid "Disable use of RTPS instruction" +#~ msgstr "Gukoresha Bya" + +#, fuzzy +#~ msgid "Enable use of RTPB instruction" +#~ msgstr "Gukoresha Bya" + +#, fuzzy +#~ msgid "Disable use of RTPB instruction" +#~ msgstr "Gukoresha Bya" + +#, fuzzy +#~ msgid "Generate code for C30 CPU" +#~ msgstr "ITEGEKONGENGA kugirango" + +#, fuzzy +#~ msgid "Generate code for C31 CPU" +#~ msgstr "ITEGEKONGENGA kugirango" + +#, fuzzy +#~ msgid "Generate code for C32 CPU" +#~ msgstr "ITEGEKONGENGA kugirango" + +#, fuzzy +#~ msgid "Generate code for C33 CPU" +#~ msgstr "ITEGEKONGENGA kugirango" + +#, fuzzy +#~ msgid "Generate code for C40 CPU" +#~ msgstr "ITEGEKONGENGA kugirango" + +#, fuzzy +#~ msgid "Generate code for C44 CPU" +#~ msgstr "ITEGEKONGENGA kugirango" + +#, fuzzy +#~ msgid "Emit code compatible with TI tools" +#~ msgstr "ITEGEKONGENGA Na: Ibikoresho" + +#, fuzzy +#~ msgid "Emit code to use GAS extensions" +#~ msgstr "ITEGEKONGENGA Kuri Gukoresha Umigereka" + +#, fuzzy +#~ msgid "Save DP across ISR in small memory model" +#~ msgstr "Kubika Kwambukiranya in Gitoya Ububiko Urugero" + +#, fuzzy +#~ msgid "Don't save DP across ISR in small memory model" +#~ msgstr "Kubika Kwambukiranya in Gitoya Ububiko Urugero" + +#, fuzzy +#~ msgid "Pass arguments on the stack" +#~ msgstr "ingingo ku i" + +#, fuzzy +#~ msgid "Pass arguments in registers" +#~ msgstr "ingingo in" + +#, fuzzy +#~ msgid "Enable new features under development" +#~ msgstr "Gishya Ibiranga" + +#, fuzzy +#~ msgid "Disable new features under development" +#~ msgstr "Gishya Ibiranga" + +#, fuzzy +#~ msgid "Use the BK register as a general purpose register" +#~ msgstr "i Kwiyandikisha Nka a Rusange Intego Kwiyandikisha" + +#, fuzzy +#~ msgid "Do not allocate BK register" +#~ msgstr "OYA Kwiyandikisha" + +#, fuzzy +#~ msgid "Enable use of DB instruction" +#~ msgstr "Gukoresha Bya" + +#, fuzzy +#~ msgid "Disable use of DB instruction" +#~ msgstr "Gukoresha Bya" + +#, fuzzy +#~ msgid "Force constants into registers to improve hoisting" +#~ msgstr "Kuri" + +#, fuzzy +#~ msgid "Force RTL generation to emit valid 3 operand insns" +#~ msgstr "Kuri Byemewe 3." + +#, fuzzy +#~ msgid "Allow RTL generation to emit invalid 3 operand insns" +#~ msgstr "Kuri Sibyo 3." + +#, fuzzy +#~ msgid "Allow unsigned iteration counts for RPTB/DB" +#~ msgstr "Bitashizweho umukono kugirango" + +#, fuzzy +#~ msgid "Disallow unsigned iteration counts for RPTB/DB" +#~ msgstr "Bitashizweho umukono kugirango" + +#, fuzzy +#~ msgid "Preserve all 40 bits of FP reg across call" +#~ msgstr "Byose Bya Kwambukiranya" + +#, fuzzy +#~ msgid "Only preserve 32 bits of FP reg across call" +#~ msgstr "Bya Kwambukiranya" + +#, fuzzy +#~ msgid "Enable parallel instructions" +#~ msgstr "Biteganye Amabwiriza" + +#, fuzzy +#~ msgid "Disable parallel instructions" +#~ msgstr "Biteganye Amabwiriza" + +#, fuzzy +#~ msgid "Enable MPY||ADD and MPY||SUB instructions" +#~ msgstr "Na Amabwiriza" + +#, fuzzy +#~ msgid "Disable MPY||ADD and MPY||SUB instructions" +#~ msgstr "Na Amabwiriza" + +#, fuzzy +#~ msgid "Assume that pointers may be aliased" +#~ msgstr "Gicurasi" + +#, fuzzy +#~ msgid "Assume that pointers not aliased" +#~ msgstr "OYA" + +#, fuzzy +#~ msgid "Specify maximum number of iterations for RPTS" +#~ msgstr "Kinini Umubare Bya Amasubiramo kugirango" + +#, fuzzy +#~ msgid "Select CPU to generate code for" +#~ msgstr "Kuri ITEGEKONGENGA kugirango" + +#, fuzzy +#~ msgid "unexpected index-type in cris_print_index" +#~ msgstr "Umubarendanga Ubwoko in" + +#, fuzzy +#~ msgid "unexpected base-type in cris_print_base" +#~ msgstr "SHINGIRO Ubwoko in" + +#, fuzzy +#~ msgid "stackframe too big: %d bytes" +#~ msgstr "Bayite" + +#, fuzzy +#~ msgid "allocated but unused delay list in epilogue" +#~ msgstr "Kidakoreshwa Gutinda Urutonde in" + +#, fuzzy +#~ msgid "unexpected function type needing stack adjustment for __builtin_eh_return" +#~ msgstr "Umumaro Ubwoko kugirango" + +#, fuzzy +#~ msgid "invalid operand for 'b' modifier" +#~ msgstr "Sibyo kugirango" + +#, fuzzy +#~ msgid "invalid operand for 'v' modifier" +#~ msgstr "Sibyo kugirango" + +#, fuzzy +#~ msgid "invalid operand for 'P' modifier" +#~ msgstr "Sibyo kugirango" + +#, fuzzy +#~ msgid "invalid operand for 'p' modifier" +#~ msgstr "Sibyo kugirango" + +#, fuzzy +#~ msgid "invalid operand for 'z' modifier" +#~ msgstr "Sibyo kugirango" + +#, fuzzy +#~ msgid "invalid operand for 'H' modifier" +#~ msgstr "Sibyo kugirango" + +#, fuzzy +#~ msgid "bad register" +#~ msgstr "Kwiyandikisha" + +#, fuzzy +#~ msgid "invalid operand for 'e' modifier" +#~ msgstr "Sibyo kugirango" + +#, fuzzy +#~ msgid "invalid operand for 'm' modifier" +#~ msgstr "Sibyo kugirango" + +#, fuzzy +#~ msgid "invalid operand for 'A' modifier" +#~ msgstr "Sibyo kugirango" + +#, fuzzy +#~ msgid "invalid operand for 'D' modifier" +#~ msgstr "Sibyo kugirango" + +#, fuzzy +#~ msgid "invalid operand for 'T' modifier" +#~ msgstr "Sibyo kugirango" + +#, fuzzy +#~ msgid "invalid operand modifier letter" +#~ msgstr "Sibyo Ibaruwa..." + +#, fuzzy +#~ msgid "internal error: bad register: %d" +#~ msgstr "By'imbere Ikosa Kwiyandikisha" + +#, fuzzy +#~ msgid "unrecognized address" +#~ msgstr "Aderesi" + +#, fuzzy +#~ msgid "internal error: sideeffect-insn affecting main effect" +#~ msgstr "By'imbere Ikosa INGARUKA" + +#, fuzzy +#~ msgid "internal error: cris_side_effect_mode_ok with bad operands" +#~ msgstr "By'imbere Ikosa Na:" + +#, fuzzy +#~ msgid "unrecognized supposed constant in cris_global_pic_symbol" +#~ msgstr "in" + +#, fuzzy +#~ msgid "-max-stackframe=%d is not usable, not between 0 and %d" +#~ msgstr "-KININI ni OYA OYA hagati 0 Na" + +#, fuzzy +#~ msgid "unknown CRIS version specification in -march= or -mcpu= : %s" +#~ msgstr "Kitazwi Verisiyo in Werurwe Cyangwa" + +#, fuzzy +#~ msgid "unknown CRIS cpu version specification in -mtune= : %s" +#~ msgstr "Kitazwi CPU Verisiyo in" + +#, fuzzy +#~ msgid "-fPIC and -fpic are not supported in this configuration" +#~ msgstr "-Na OYA in iyi Iboneza" + +#, fuzzy +#~ msgid "that particular -g option is invalid with -maout and -melinux" +#~ msgstr "g Ihitamo ni Sibyo Na: Na" + +#, fuzzy +#~ msgid "unexpected side-effects in address" +#~ msgstr "Ingaruka in Aderesi" + +#, fuzzy +#~ msgid "unexpected PIC symbol" +#~ msgstr "IKIMENYETSO" + +#, fuzzy +#~ msgid "PIC register isn't set up" +#~ msgstr "Kwiyandikisha si Gushyiraho Hejuru" + +#, fuzzy +#~ msgid "unexpected address expression" +#~ msgstr "Aderesi imvugo" + +#, fuzzy +#~ msgid "emitting PIC operand, but PIC register isn't set up" +#~ msgstr "Kwiyandikisha si Gushyiraho Hejuru" + +#, fuzzy +#~ msgid "unexpected NOTE as addr_const:" +#~ msgstr "Nka" + +#, fuzzy +#~ msgid "Compile for the MMU-less Etrax 100-based elinux system" +#~ msgstr "kugirango i Birutwa 100 Sisitemu" + +#, fuzzy +#~ msgid "For elinux, request a specified stack-size for this program" +#~ msgstr "Kubaza... a Ingano kugirango iyi Porogaramu" + +#, fuzzy +#~ msgid "Compile for ETRAX 4 (CRIS v3)" +#~ msgstr "kugirango 4." + +#, fuzzy +#~ msgid "Compile for ETRAX 100 (CRIS v8)" +#~ msgstr "kugirango 100" + +#, fuzzy +#~ msgid "Emit verbose debug information in assembly code" +#~ msgstr "Kosora amakosa Ibisobanuro in ITEGEKONGENGA" + +#, fuzzy +#~ msgid "Do not use condition codes from normal instructions" +#~ msgstr "OYA Gukoresha Ibisabwa Bivuye Bisanzwe Amabwiriza" + +#, fuzzy +#~ msgid "Do not emit addressing modes with side-effect assignment" +#~ msgstr "OYA Kwohereza Na: INGARUKA Igenera" + +#, fuzzy +#~ msgid "Do not tune stack alignment" +#~ msgstr "OYA Itunganya" + +#, fuzzy +#~ msgid "Do not tune writable data alignment" +#~ msgstr "OYA Ibyatanzwe Itunganya" + +#, fuzzy +#~ msgid "Do not tune code and read-only data alignment" +#~ msgstr "OYA ITEGEKONGENGA Na Gusoma Ibyatanzwe Itunganya" + +#, fuzzy +#~ msgid "Align code and data to 32 bits" +#~ msgstr "ITEGEKONGENGA Na Ibyatanzwe Kuri" + +#, fuzzy +#~ msgid "Don't align items in code or data" +#~ msgstr "Gutondeka in ITEGEKONGENGA Cyangwa Ibyatanzwe" + +#, fuzzy +#~ msgid "Do not emit function prologue or epilogue" +#~ msgstr "OYA Umumaro Cyangwa" + +#, fuzzy +#~ msgid "Use the most feature-enabling options allowed by other options" +#~ msgstr "i Amahitamo ku Ikindi Amahitamo" + +#, fuzzy +#~ msgid "Override -mbest-lib-options" +#~ msgstr "Amahitamo" + +#, fuzzy +#~ msgid "Generate code for the specified chip or CPU version" +#~ msgstr "ITEGEKONGENGA kugirango i Cyangwa Verisiyo" + +#, fuzzy +#~ msgid "Tune alignment for the specified chip or CPU version" +#~ msgstr "Itunganya kugirango i Cyangwa Verisiyo" + +#, fuzzy +#~ msgid "Warn when a stackframe is larger than the specified size" +#~ msgstr "Ryari: a ni Kinini i Ingano" + +#, fuzzy +#~ msgid "no FUNCTION_PROFILER for CRIS" +#~ msgstr "Oya kugirango" + +#, fuzzy +#~ msgid "Together with -fpic and -fPIC, do not use GOTPLT references" +#~ msgstr "Na: Na OYA Gukoresha Indango" + +#, fuzzy +#~ msgid "bad modes_tieable_p for register %s, mode1 %s, mode2 %s" +#~ msgstr "kugirango Kwiyandikisha" + +#, fuzzy +#~ msgid "bad insn to d30v_print_operand_address:" +#~ msgstr "Kuri" + +#, fuzzy +#~ msgid "bad insn to d30v_print_operand_memory_reference:" +#~ msgstr "Kuri" + +#, fuzzy +#~ msgid "bad insn to d30v_print_operand, 'f' modifier:" +#~ msgstr "Kuri" + +#, fuzzy +#~ msgid "bad insn to d30v_print_operand, 'A' modifier:" +#~ msgstr "Kuri" + +#, fuzzy +#~ msgid "bad insn to d30v_print_operand, 'M' modifier:" +#~ msgstr "Kuri" + +#, fuzzy +#~ msgid "bad insn to print_operand, 'F' or 'T' modifier:" +#~ msgstr "Kuri Cyangwa" + +#, fuzzy +#~ msgid "bad insn to print_operand, 'B' modifier:" +#~ msgstr "Kuri" + +#, fuzzy +#~ msgid "bad insn to print_operand, 'E' modifier:" +#~ msgstr "Kuri" + +#, fuzzy +#~ msgid "bad insn to print_operand, 'R' modifier:" +#~ msgstr "Kuri" + +#, fuzzy +#~ msgid "bad insn to print_operand, 's' modifier:" +#~ msgstr "Kuri" + +#, fuzzy +#~ msgid "bad insn in d30v_print_operand, 0 case" +#~ msgstr "in 0" + +#, fuzzy +#~ msgid "bad call to d30v_move_2words" +#~ msgstr "Kuri" + +#, fuzzy +#~ msgid "Enable use of conditional move instructions" +#~ msgstr "Gukoresha Bya Kwimura Amabwiriza" + +#, fuzzy +#~ msgid "Disable use of conditional move instructions" +#~ msgstr "Gukoresha Bya Kwimura Amabwiriza" + +#, fuzzy +#~ msgid "Debug argument support in compiler" +#~ msgstr "Gushigikira in" + +#, fuzzy +#~ msgid "Debug stack support in compiler" +#~ msgstr "Gushigikira in" + +#, fuzzy +#~ msgid "Debug memory address support in compiler" +#~ msgstr "Ububiko Aderesi Gushigikira in" + +#, fuzzy +#~ msgid "Make adjacent short instructions parallel if possible" +#~ msgstr "Amabwiriza Biteganye NIBA" + +#, fuzzy +#~ msgid "Do not make adjacent short instructions parallel" +#~ msgstr "OYA Ubwoko Amabwiriza Biteganye" + +#, fuzzy +#~ msgid "Link programs/data to be in external memory by default" +#~ msgstr "Porogaramu Ibyatanzwe Kuri in external Ububiko ku Mburabuzi" + +#, fuzzy +#~ msgid "Link programs/data to be in onchip memory by default" +#~ msgstr "Porogaramu Ibyatanzwe Kuri in Ububiko ku Mburabuzi" + +#, fuzzy +#~ msgid "Change the branch costs within the compiler" +#~ msgstr "i muri i" + +#, fuzzy +#~ msgid "Change the threshold for conversion to conditional execution" +#~ msgstr "i kugirango Ihindurangero Kuri" + +#, fuzzy +#~ msgid "stack size > 32k" +#~ msgstr "Ingano" + +#, fuzzy +#~ msgid "invalid addressing mode" +#~ msgstr "Sibyo Kwohereza Ubwoko" + +#, fuzzy +#~ msgid "bad register extension code" +#~ msgstr "Kwiyandikisha Umugereka ITEGEKONGENGA" + +#, fuzzy +#~ msgid "invalid offset in ybase addressing" +#~ msgstr "Sibyo Nta- boneza in Kwohereza" + +#, fuzzy +#~ msgid "invalid register in ybase addressing" +#~ msgstr "Sibyo Kwiyandikisha in Kwohereza" + +#, fuzzy +#~ msgid "invalid shift operator in emit_1600_core_shift" +#~ msgstr "Sibyo Gusunika Mukoresha in" + +#, fuzzy +#~ msgid "invalid mode for gen_tst_reg" +#~ msgstr "Sibyo Ubwoko kugirango" + +#, fuzzy +#~ msgid "invalid mode for integer comparison in gen_compare_reg" +#~ msgstr "Sibyo Ubwoko kugirango Umubare wuzuye in" + +#, fuzzy +#~ msgid "Pass parameters in registers (default)" +#~ msgstr "Ibigenga in Mburabuzi" + +#, fuzzy +#~ msgid "Don't pass parameters in registers" +#~ msgstr "Ibigenga in" + +#, fuzzy +#~ msgid "Generate code for near calls" +#~ msgstr "ITEGEKONGENGA kugirango Amahamagara:" + +#, fuzzy +#~ msgid "Don't generate code for near calls" +#~ msgstr "ITEGEKONGENGA kugirango Amahamagara:" + +#, fuzzy +#~ msgid "Generate code for near jumps" +#~ msgstr "ITEGEKONGENGA kugirango" + +#, fuzzy +#~ msgid "Don't generate code for near jumps" +#~ msgstr "ITEGEKONGENGA kugirango" + +#, fuzzy +#~ msgid "Generate code for a bit-manipulation unit" +#~ msgstr "ITEGEKONGENGA kugirango a Igice:" + +#, fuzzy +#~ msgid "Don't generate code for a bit-manipulation unit" +#~ msgstr "ITEGEKONGENGA kugirango a Igice:" + +#, fuzzy +#~ msgid "Generate code for memory map1" +#~ msgstr "ITEGEKONGENGA kugirango Ububiko" + +#, fuzzy +#~ msgid "Generate code for memory map2" +#~ msgstr "ITEGEKONGENGA kugirango Ububiko" + +#, fuzzy +#~ msgid "Generate code for memory map3" +#~ msgstr "ITEGEKONGENGA kugirango Ububiko" + +#, fuzzy +#~ msgid "Generate code for memory map4" +#~ msgstr "ITEGEKONGENGA kugirango Ububiko" + +#, fuzzy +#~ msgid "Ouput extra code for initialized data" +#~ msgstr "Birenga ITEGEKONGENGA kugirango Ibyatanzwe" + +#, fuzzy +#~ msgid "Don't let reg. allocator use ybase registers" +#~ msgstr "Gukoresha" + +#, fuzzy +#~ msgid "Output extra debug info in Luxworks environment" +#~ msgstr "Birenga Kosora amakosa Ibisobanuro in" + +#, fuzzy +#~ msgid "Save temp. files in Luxworks environment" +#~ msgstr "Kubika Idosiye in" + +#, fuzzy +#~ msgid "Specify alternate name for text section" +#~ msgstr "Izina: kugirango Umwandiko Icyiciro" + +#, fuzzy +#~ msgid "Specify alternate name for data section" +#~ msgstr "Izina: kugirango Ibyatanzwe Icyiciro" + +#, fuzzy +#~ msgid "Specify alternate name for bss section" +#~ msgstr "Izina: kugirango Icyiciro" + +#, fuzzy +#~ msgid "Specify alternate name for constant section" +#~ msgstr "Izina: kugirango Icyiciro" + +#, fuzzy +#~ msgid "Specify alternate name for dsp16xx chip" +#~ msgstr "Izina: kugirango" + +#, fuzzy +#~ msgid "profiling not implemented yet" +#~ msgstr "OYA" + +#, fuzzy +#~ msgid "trampolines not yet implemented" +#~ msgstr "OYA" + +#, fuzzy +#~ msgid "fr30_print_operand_address: unhandled address" +#~ msgstr "Aderesi" + +#, fuzzy +#~ msgid "fr30_print_operand: unrecognized %%p code" +#~ msgstr "ITEGEKONGENGA" + +#, fuzzy +#~ msgid "fr30_print_operand: unrecognized %%b code" +#~ msgstr "ITEGEKONGENGA" + +#, fuzzy +#~ msgid "fr30_print_operand: unrecognized %%B code" +#~ msgstr "ITEGEKONGENGA" + +#, fuzzy +#~ msgid "fr30_print_operand: invalid operand to %%A code" +#~ msgstr "Sibyo Kuri ITEGEKONGENGA" + +#, fuzzy +#~ msgid "fr30_print_operand: invalid %%x code" +#~ msgstr "Sibyo ITEGEKONGENGA" + +#, fuzzy +#~ msgid "fr30_print_operand: invalid %%F code" +#~ msgstr "Sibyo ITEGEKONGENGA" + +#, fuzzy +#~ msgid "fr30_print_operand: unknown code" +#~ msgstr "Kitazwi ITEGEKONGENGA" + +#, fuzzy +#~ msgid "Assume small address space" +#~ msgstr "Gitoya Aderesi Umwanya" + +#, fuzzy +#~ msgid "Unknown cpu: -mcpu=%s" +#~ msgstr "CPU" + +#, fuzzy +#~ msgid "-fpic and -gdwarf are incompatible (-fpic and -g/-gdwarf-2 are fine)" +#~ msgstr "-Na Na g 2." + +#, fuzzy +#~ msgid "Bad insn to frv_print_operand_address:" +#~ msgstr "Kuri" + +#, fuzzy +#~ msgid "Bad register to frv_print_operand_memory_reference_reg:" +#~ msgstr "Kwiyandikisha Kuri" + +#, fuzzy +#~ msgid "Bad insn to frv_print_operand_memory_reference:" +#~ msgstr "Kuri" + +#, fuzzy +#~ msgid "Bad insn in frv_print_operand, bad const_double" +#~ msgstr "in" + +#, fuzzy +#~ msgid "Bad insn to frv_print_operand, 'C' modifier:" +#~ msgstr "Kuri" + +#, fuzzy +#~ msgid "Bad insn to frv_print_operand, 'c' modifier:" +#~ msgstr "Kuri" + +#, fuzzy +#~ msgid "Bad insn to frv_print_operand, 'e' modifier:" +#~ msgstr "Kuri" + +#, fuzzy +#~ msgid "Bad insn to frv_print_operand, 'F' modifier:" +#~ msgstr "Kuri" + +#, fuzzy +#~ msgid "Bad insn to frv_print_operand, 'f' modifier:" +#~ msgstr "Kuri" + +#, fuzzy +#~ msgid "Bad insn to frv_print_operand, 'L' modifier:" +#~ msgstr "Kuri" + +#, fuzzy +#~ msgid "Bad insn to frv_print_operand, 'M/N' modifier:" +#~ msgstr "Kuri" + +#, fuzzy +#~ msgid "Bad insn to frv_print_operand, 'O' modifier:" +#~ msgstr "Kuri" + +#, fuzzy +#~ msgid "Bad insn to frv_print_operand, P modifier:" +#~ msgstr "Kuri" + +#, fuzzy +#~ msgid "Bad insn in frv_print_operand, z case" +#~ msgstr "in Z" + +#, fuzzy +#~ msgid "Bad insn in frv_print_operand, 0 case" +#~ msgstr "in 0" + +#, fuzzy +#~ msgid "frv_print_operand: unknown code" +#~ msgstr "Kitazwi ITEGEKONGENGA" + +#, fuzzy +#~ msgid "accumulator is not a constant integer" +#~ msgstr "ni OYA a Umubare wuzuye" + +#, fuzzy +#~ msgid "accumulator number is out of bounds" +#~ msgstr "Umubare ni Inyuma Bya" + +#, fuzzy +#~ msgid "inappropriate accumulator for `%s'" +#~ msgstr "kugirango" + +#, fuzzy +#~ msgid "`%s' expects a constant argument" +#~ msgstr "`%s'a" + +#, fuzzy +#~ msgid "constant argument out of range for `%s'" +#~ msgstr "Inyuma Bya Urutonde kugirango" + +#, fuzzy +#~ msgid "media functions are not available unless -mmedia is used" +#~ msgstr "Ibitangazamakuru Imimaro OYA Bihari ni" + +#, fuzzy +#~ msgid "this media function is only available on the fr500" +#~ msgstr "iyi Ibitangazamakuru Umumaro ni Bihari ku i" + +#, fuzzy +#~ msgid "this media function is only available on the fr400" +#~ msgstr "iyi Ibitangazamakuru Umumaro ni Bihari ku i" + +#, fuzzy +#~ msgid "-ms2600 is used without -ms" +#~ msgstr "-ni" + +#, fuzzy +#~ msgid "-mn is used without -mh or -ms" +#~ msgstr "-ni Cyangwa" + +#, fuzzy +#~ msgid "Generate H8S code" +#~ msgstr "ITEGEKONGENGA" + +#, fuzzy +#~ msgid "Do not generate H8S code" +#~ msgstr "OYA ITEGEKONGENGA" + +#, fuzzy +#~ msgid "Generate H8S/2600 code" +#~ msgstr "ITEGEKONGENGA" + +#, fuzzy +#~ msgid "Do not generate H8S/2600 code" +#~ msgstr "OYA ITEGEKONGENGA" + +#, fuzzy +#~ msgid "Use registers for argument passing" +#~ msgstr "kugirango" + +#, fuzzy +#~ msgid "Do not use registers for argument passing" +#~ msgstr "OYA Gukoresha kugirango" + +#, fuzzy +#~ msgid "Consider access to byte sized memory slow" +#~ msgstr "Kuri Bayite Ububiko Buhoro" + +#, fuzzy +#~ msgid "Generate H8/300H code" +#~ msgstr "ITEGEKONGENGA" + +#, fuzzy +#~ msgid "Enable the normal mode" +#~ msgstr "i Bisanzwe Ubwoko" + +#, fuzzy +#~ msgid "Do not generate H8/300H code" +#~ msgstr "OYA ITEGEKONGENGA" + +#, fuzzy +#~ msgid "Use H8/300 alignment rules" +#~ msgstr "300 Itunganya" + +#, fuzzy +#~ msgid "junk at end of #pragma map" +#~ msgstr "Umwanda ku Impera Bya" + +#, fuzzy +#~ msgid "real name is too long - alias ignored" +#~ msgstr "Izina: ni Irihimbano" + +#, fuzzy +#~ msgid "alias name is too long - alias ignored" +#~ msgstr "Irihimbano Izina: ni Irihimbano" + +#, fuzzy +#~ msgid "internal error--no jump follows compare:" +#~ msgstr "By'imbere Ikosa Oya Simbuka Kugereranya#" + +#, fuzzy +#~ msgid "Generate char instructions" +#~ msgstr "INYUGUTI Amabwiriza" + +#, fuzzy +#~ msgid "Do not generate char instructions" +#~ msgstr "OYA INYUGUTI Amabwiriza" + +#, fuzzy +#~ msgid "code model %s not supported in PIC mode" +#~ msgstr "ITEGEKONGENGA Urugero OYA in Ubwoko" + +#, fuzzy +#~ msgid "bad value (%s) for -mcmodel= switch" +#~ msgstr "Agaciro kugirango Hindura" + +#, fuzzy +#~ msgid "bad value (%s) for -masm= switch" +#~ msgstr "Agaciro kugirango Hindura" + +#, fuzzy +#~ msgid "code model `%s' not supported in the %s bit mode" +#~ msgstr "ITEGEKONGENGA Urugero OYA in i Ubwoko" + +#, fuzzy +#~ msgid "code model `large' not supported yet" +#~ msgstr "ITEGEKONGENGA Urugero OYA" + +#, fuzzy +#~ msgid "%i-bit mode not compiled in" +#~ msgstr "%i-bitUbwoko OYA in" + +#, fuzzy +#~ msgid "bad value (%s) for -march= switch" +#~ msgstr "Agaciro kugirango Werurwe Hindura" + +#, fuzzy +#~ msgid "bad value (%s) for -mcpu= switch" +#~ msgstr "Agaciro kugirango Hindura" + +#, fuzzy +#~ msgid "-mregparm=%d is not between 0 and %d" +#~ msgstr "-ni OYA hagati 0 Na" + +#, fuzzy +#~ msgid "-malign-loops is obsolete, use -falign-loops" +#~ msgstr "-ni Gukoresha" + +#, fuzzy +#~ msgid "-malign-loops=%d is not between 0 and %d" +#~ msgstr "-ni OYA hagati 0 Na" + +#, fuzzy +#~ msgid "-malign-jumps is obsolete, use -falign-jumps" +#~ msgstr "-ni Gukoresha" + +#, fuzzy +#~ msgid "-malign-functions is obsolete, use -falign-functions" +#~ msgstr "-Imimaro ni Gukoresha Imimaro" + +#, fuzzy +#~ msgid "-mpreferred-stack-boundary=%d is not between %d and 12" +#~ msgstr "-ni OYA hagati Na 12" + +#, fuzzy +#~ msgid "-mbranch-cost=%d is not between 0 and 5" +#~ msgstr "-Ikiguzi ni OYA hagati 0 Na 5" + +#, fuzzy +#~ msgid "bad value (%s) for -mtls-dialect= switch" +#~ msgstr "Agaciro kugirango Hindura" + +#, fuzzy +#~ msgid "-malign-double makes no sense in the 64bit mode" +#~ msgstr "-MAHARAKUBIRI Oya in i Ubwoko" + +#, fuzzy +#~ msgid "-mrtd calling convention not supported in the 64bit mode" +#~ msgstr "-OYA in i Ubwoko" + +#, fuzzy +#~ msgid "SSE instruction set disabled, using 387 arithmetics" +#~ msgstr "Gushyiraho Yahagaritswe ikoresha" + +#, fuzzy +#~ msgid "387 instruction set disabled, using SSE arithmetics" +#~ msgstr "Gushyiraho Yahagaritswe ikoresha" + +#, fuzzy +#~ msgid "bad value (%s) for -mfpmath= switch" +#~ msgstr "Agaciro kugirango Hindura" + +#, fuzzy +#~ msgid "`%s' attribute requires an integer constant argument" +#~ msgstr "`%s'Ikiranga Umubare wuzuye" + +#, fuzzy +#~ msgid "argument to `%s' attribute larger than %d" +#~ msgstr "Kuri Ikiranga Kinini" + +#, fuzzy +#~ msgid "invalid UNSPEC as operand" +#~ msgstr "Sibyo Nka" + +#, fuzzy +#~ msgid "extended registers have no high halves" +#~ msgstr "Byongerewe... Oya kirekire" + +#, fuzzy +#~ msgid "unsupported operand size for extended register" +#~ msgstr "Ingano kugirango Byongerewe... Kwiyandikisha" + +#, fuzzy +#~ msgid "operand is neither a constant nor a condition code, invalid operand code 'c'" +#~ msgstr "ni a a Ibisabwa ITEGEKONGENGA Sibyo ITEGEKONGENGA" + +#, fuzzy +#~ msgid "invalid operand code `%c'" +#~ msgstr "Sibyo ITEGEKONGENGA" + +#, fuzzy +#~ msgid "invalid constraints for operand" +#~ msgstr "Sibyo kugirango" + +#, fuzzy +#~ msgid "unknown insn mode" +#~ msgstr "Kitazwi Ubwoko" + +#, fuzzy +#~ msgid "shift must be an immediate" +#~ msgstr "Gusunika" + +#, fuzzy +#~ msgid "`%s' attribute only applies to variables" +#~ msgstr "`%s'Ikiranga Kuri Ibihinduka" + +#, fuzzy +#~ msgid "`%s' declared as both exported to and imported from a DLL" +#~ msgstr "`%s'Nka Byombi Kuri Na cyavuye ahandi/ cyatumijwe Bivuye a" + +#, fuzzy +#~ msgid "Use the Cygwin interface" +#~ msgstr "i" + +#, fuzzy +#~ msgid "Use the Mingw32 interface" +#~ msgstr "i" + +#, fuzzy +#~ msgid "Create GUI application" +#~ msgstr "Porogaramu" + +#, fuzzy +#~ msgid "Don't set Windows defines" +#~ msgstr "Gushyiraho" + +#, fuzzy +#~ msgid "Create console application" +#~ msgstr "Porogaramu" + +#, fuzzy +#~ msgid "Generate code for a DLL" +#~ msgstr "ITEGEKONGENGA kugirango a" + +#, fuzzy +#~ msgid "Ignore dllimport for functions" +#~ msgstr "kugirango Imimaro" + +#, fuzzy +#~ msgid "Use Mingw-specific thread support" +#~ msgstr "Urudodo Gushigikira" + +#, fuzzy +#~ msgid "-f%s ignored for target (all code is position independent)" +#~ msgstr "-F kugirango Intego Byose ITEGEKONGENGA ni Ibirindiro" + +#, fuzzy +#~ msgid "-mbnu210 is ignored (option is obsolete)" +#~ msgstr "-ni Ihitamo ni" + +#, fuzzy +#~ msgid "Use normal calling convention" +#~ msgstr "Bisanzwe" + +#, fuzzy +#~ msgid "Align some doubles on dword boundary" +#~ msgstr "ku" + +#, fuzzy +#~ msgid "Align doubles on word boundary" +#~ msgstr "ku ijambo" + +#, fuzzy +#~ msgid "Uninitialized locals in .bss" +#~ msgstr "in" + +#, fuzzy +#~ msgid "Uninitialized locals in .data" +#~ msgstr "in Ibyatanzwe" + +#, fuzzy +#~ msgid "Use IEEE math for fp comparisons" +#~ msgstr "Imibare kugirango" + +#, fuzzy +#~ msgid "Do not use IEEE math for fp comparisons" +#~ msgstr "OYA Gukoresha Imibare kugirango" + +#, fuzzy +#~ msgid "Return values of functions in FPU registers" +#~ msgstr "Uduciro Bya Imimaro in" + +#, fuzzy +#~ msgid "Do not return values of functions in FPU registers" +#~ msgstr "OYA Garuka Uduciro Bya Imimaro in" + +#, fuzzy +#~ msgid "Do not generate sin, cos, sqrt for FPU" +#~ msgstr "OYA SIN COS SQRT kugirango" + +#, fuzzy +#~ msgid "Generate sin, cos, sqrt for FPU" +#~ msgstr "SIN COS SQRT kugirango" + +#, fuzzy +#~ msgid "Omit the frame pointer in leaf functions" +#~ msgstr "i Ikadiri Mweretsi in Imimaro" + +#, fuzzy +#~ msgid "Align destination of the string operations" +#~ msgstr "Ishyika Bya i Ikurikiranyanyuguti Ibikorwa:" + +#, fuzzy +#~ msgid "Do not align destination of the string operations" +#~ msgstr "OYA Gutondeka Ishyika Bya i Ikurikiranyanyuguti Ibikorwa:" + +#, fuzzy +#~ msgid "Inline all known string operations" +#~ msgstr "Byose Ikurikiranyanyuguti Ibikorwa:" + +#, fuzzy +#~ msgid "Do not inline all known string operations" +#~ msgstr "OYA Mumurongo Byose Ikurikiranyanyuguti Ibikorwa:" + +#, fuzzy +#~ msgid "Use push instructions to save outgoing arguments" +#~ msgstr "Amabwiriza Kuri Kubika ingingo" + +#, fuzzy +#~ msgid "Do not use push instructions to save outgoing arguments" +#~ msgstr "OYA Gukoresha Amabwiriza Kuri Kubika ingingo" + +#, fuzzy +#~ msgid "Support MMX built-in functions" +#~ msgstr "in Imimaro" + +#, fuzzy +#~ msgid "Do not support MMX built-in functions" +#~ msgstr "OYA Gushigikira in Imimaro" + +#, fuzzy +#~ msgid "Support 3DNow! built-in functions" +#~ msgstr "in Imimaro" + +#, fuzzy +#~ msgid "Do not support 3DNow! built-in functions" +#~ msgstr "OYA Gushigikira in Imimaro" + +#, fuzzy +#~ msgid "Support MMX and SSE built-in functions and code generation" +#~ msgstr "Na in Imimaro Na ITEGEKONGENGA" + +#, fuzzy +#~ msgid "Do not support MMX and SSE built-in functions and code generation" +#~ msgstr "OYA Gushigikira Na in Imimaro Na ITEGEKONGENGA" + +#, fuzzy +#~ msgid "Support MMX, SSE and SSE2 built-in functions and code generation" +#~ msgstr "Na in Imimaro Na ITEGEKONGENGA" + +#, fuzzy +#~ msgid "Do not support MMX, SSE and SSE2 built-in functions and code generation" +#~ msgstr "OYA Gushigikira Na in Imimaro Na ITEGEKONGENGA" + +#, fuzzy +#~ msgid "sizeof(long double) is 16" +#~ msgstr "MAHARAKUBIRI ni" + +#, fuzzy +#~ msgid "sizeof(long double) is 12" +#~ msgstr "MAHARAKUBIRI ni 12" + +#, fuzzy +#~ msgid "Generate 64bit x86-64 code" +#~ msgstr "ITEGEKONGENGA" + +#, fuzzy +#~ msgid "Generate 32bit i386 code" +#~ msgstr "ITEGEKONGENGA" + +#, fuzzy +#~ msgid "Use red-zone in the x86-64 code" +#~ msgstr "Umutuku in i ITEGEKONGENGA" + +#, fuzzy +#~ msgid "Do not use red-zone in the x86-64 code" +#~ msgstr "OYA Gukoresha Umutuku in i ITEGEKONGENGA" + +#, fuzzy +#~ msgid "Schedule code for given CPU" +#~ msgstr "ITEGEKONGENGA kugirango" + +#, fuzzy +#~ msgid "Generate floating point mathematics using given instruction set" +#~ msgstr "Bihindagurika Akadomo ikoresha Gushyiraho" + +#, fuzzy +#~ msgid "Generate code for given CPU" +#~ msgstr "ITEGEKONGENGA kugirango" + +#, fuzzy +#~ msgid "Number of registers used to pass integer arguments" +#~ msgstr "Bya Kuri Umubare wuzuye ingingo" + +#, fuzzy +#~ msgid "Loop code aligned to this power of 2" +#~ msgstr "ITEGEKONGENGA Kuri iyi UMWIKUBE Bya 2." + +#, fuzzy +#~ msgid "Jump targets are aligned to this power of 2" +#~ msgstr "Kuri iyi UMWIKUBE Bya 2." + +#, fuzzy +#~ msgid "Function starts are aligned to this power of 2" +#~ msgstr "Kuri iyi UMWIKUBE Bya 2." + +#, fuzzy +#~ msgid "Attempt to keep stack aligned to this power of 2" +#~ msgstr "Kuri Gumana: Kuri iyi UMWIKUBE Bya 2." + +#, fuzzy +#~ msgid "Branches are this expensive (1-5, arbitrary units)" +#~ msgstr "iyi 1. 5" + +#, fuzzy +#~ msgid "Use given x86-64 code model" +#~ msgstr "ITEGEKONGENGA Urugero" + +#, fuzzy +#~ msgid "Use given thread-local storage dialect" +#~ msgstr "Urudodo" + +#, fuzzy +#~ msgid "Generate ELF output" +#~ msgstr "Ibisohoka" + +#, fuzzy +#~ msgid "environment variable DJGPP not defined" +#~ msgstr "IMPINDURAGACIRO OYA" + +#, fuzzy +#~ msgid "environment variable DJGPP points to missing file '%s'" +#~ msgstr "IMPINDURAGACIRO Utudomo Kuri Ibuze IDOSIYE" + +#, fuzzy +#~ msgid "environment variable DJGPP points to corrupt file '%s'" +#~ msgstr "IMPINDURAGACIRO Utudomo Kuri IDOSIYE" + +#, fuzzy +#~ msgid "sorry, not implemented: #pragma align NAME=SIZE" +#~ msgstr "OYA Gutondeka" + +#, fuzzy +#~ msgid "malformed #pragma align - ignored" +#~ msgstr "Gutondeka" + +#, fuzzy +#~ msgid "sorry, not implemented: #pragma noalign NAME" +#~ msgstr "OYA" + +#, fuzzy +#~ msgid "conflicting architectures defined - using C series" +#~ msgstr "ikoresha C Ibyiciro" + +#, fuzzy +#~ msgid "conflicting architectures defined - using K series" +#~ msgstr "ikoresha Ibyiciro" + +#, fuzzy +#~ msgid "iC2.0 and iC3.0 are incompatible - using iC3.0" +#~ msgstr "0 Na 0 ikoresha 0" + +#, fuzzy +#~ msgid "stack limit expression is not supported" +#~ msgstr "imvugo ni OYA" + +#, fuzzy +#~ msgid "Generate SA code" +#~ msgstr "ITEGEKONGENGA" + +#, fuzzy +#~ msgid "Generate SB code" +#~ msgstr "ITEGEKONGENGA" + +#, fuzzy +#~ msgid "Generate KA code" +#~ msgstr "ITEGEKONGENGA" + +#, fuzzy +#~ msgid "Generate KB code" +#~ msgstr "ITEGEKONGENGA" + +#, fuzzy +#~ msgid "Generate JA code" +#~ msgstr "ITEGEKONGENGA" + +#, fuzzy +#~ msgid "Generate JD code" +#~ msgstr "ITEGEKONGENGA" + +#, fuzzy +#~ msgid "Generate JF code" +#~ msgstr "ITEGEKONGENGA" + +#, fuzzy +#~ msgid "generate RP code" +#~ msgstr "ITEGEKONGENGA" + +#, fuzzy +#~ msgid "Generate MC code" +#~ msgstr "ITEGEKONGENGA" + +#, fuzzy +#~ msgid "Generate CA code" +#~ msgstr "ITEGEKONGENGA" + +#, fuzzy +#~ msgid "Generate CF code" +#~ msgstr "ITEGEKONGENGA" + +#, fuzzy +#~ msgid "Use software floating point" +#~ msgstr "Bihindagurika Akadomo" + +#, fuzzy +#~ msgid "Use alternate leaf function entries" +#~ msgstr "Umumaro Ibyinjijwe" + +#, fuzzy +#~ msgid "Do not use alternate leaf function entries" +#~ msgstr "OYA Gukoresha Umumaro Ibyinjijwe" + +#, fuzzy +#~ msgid "Do not perform tail call optimization" +#~ msgstr "OYA" + +#, fuzzy +#~ msgid "Use complex addressing modes" +#~ msgstr "ITSINDA RY'IMIBARE C Kwohereza" + +#, fuzzy +#~ msgid "Do not use complex addressing modes" +#~ msgstr "OYA Gukoresha ITSINDA RY'IMIBARE C Kwohereza" + +#, fuzzy +#~ msgid "Align code to 8 byte boundary" +#~ msgstr "ITEGEKONGENGA Kuri 8 Bayite" + +#, fuzzy +#~ msgid "Do not align code to 8 byte boundary" +#~ msgstr "OYA Gutondeka ITEGEKONGENGA Kuri 8 Bayite" + +#, fuzzy +#~ msgid "Enable compatibility with iC960 v2.0" +#~ msgstr "Bihuye neza Na: 0" + +#, fuzzy +#~ msgid "Enable compatibility with iC960 v3.0" +#~ msgstr "Bihuye neza Na: 0" + +#, fuzzy +#~ msgid "Enable compatibility with ic960 assembler" +#~ msgstr "Bihuye neza Na:" + +#, fuzzy +#~ msgid "Do not permit unaligned accesses" +#~ msgstr "OYA" + +#, fuzzy +#~ msgid "Layout types like Intel's v1.3 gcc" +#~ msgstr "nka 3." + +#, fuzzy +#~ msgid "Do not layout types like Intel's v1.3 gcc" +#~ msgstr "OYA Imigaragarire nka 3." + +#, fuzzy +#~ msgid "Do not enable linker relaxation" +#~ msgstr "OYA Gushoboza" + +#, fuzzy +#~ msgid "ia64_print_operand: unknown code" +#~ msgstr "Kitazwi ITEGEKONGENGA" + +#, fuzzy +#~ msgid "value of -mfixed-range must have form REG1-REG2" +#~ msgstr "Agaciro Bya Urutonde Ifishi" + +#, fuzzy +#~ msgid "%s-%s is an empty range" +#~ msgstr "%s-%sni ubusa Urutonde" + +#, fuzzy +#~ msgid "cannot optimize floating point division for both latency and throughput" +#~ msgstr "Kugeza ku ndunduro Bihindagurika Akadomo kugirango Byombi Na" + +#, fuzzy +#~ msgid "cannot optimize integer division for both latency and throughput" +#~ msgstr "Kugeza ku ndunduro Umubare wuzuye kugirango Byombi Na" + +#, fuzzy +#~ msgid "bad value (%s) for -mtls-size= switch" +#~ msgstr "Agaciro kugirango Ingano Hindura" + +#, fuzzy +#~ msgid "Generate big endian code" +#~ msgstr "ITEGEKONGENGA" + +#, fuzzy +#~ msgid "Generate little endian code" +#~ msgstr "ITEGEKONGENGA" + +#, fuzzy +#~ msgid "Generate code for GNU as" +#~ msgstr "ITEGEKONGENGA kugirango Nka" + +#, fuzzy +#~ msgid "Generate code for Intel as" +#~ msgstr "ITEGEKONGENGA kugirango Nka" + +#, fuzzy +#~ msgid "Generate code for GNU ld" +#~ msgstr "ITEGEKONGENGA kugirango" + +#, fuzzy +#~ msgid "Generate code for Intel ld" +#~ msgstr "ITEGEKONGENGA kugirango" + +#, fuzzy +#~ msgid "Generate code without GP reg" +#~ msgstr "ITEGEKONGENGA" + +#, fuzzy +#~ msgid "Emit stop bits before and after volatile extended asms" +#~ msgstr "Guhagarara Mbere Na Nyuma Byongerewe..." + +#, fuzzy +#~ msgid "Don't emit stop bits before and after volatile extended asms" +#~ msgstr "Guhagarara Mbere Na Nyuma Byongerewe..." + +#, fuzzy +#~ msgid "Emit code for Itanium (TM) processor B step" +#~ msgstr "ITEGEKONGENGA kugirango Intera" + +#, fuzzy +#~ msgid "Use in/loc/out register names" +#~ msgstr "in Inyuma Kwiyandikisha Amazina" + +#, fuzzy +#~ msgid "Disable use of sdata/scommon/sbss" +#~ msgstr "Gukoresha Bya" + +#, fuzzy +#~ msgid "Enable use of sdata/scommon/sbss" +#~ msgstr "Gukoresha Bya" + +#, fuzzy +#~ msgid "gp is constant (but save/restore gp on indirect calls)" +#~ msgstr "ni Kubika Kugarura ku BUZIGUYE Amahamagara:" + +#, fuzzy +#~ msgid "Generate self-relocatable code" +#~ msgstr "ITEGEKONGENGA" + +#, fuzzy +#~ msgid "Generate inline floating point division, optimize for latency" +#~ msgstr "Mumurongo Bihindagurika Akadomo Kugeza ku ndunduro kugirango" + +#, fuzzy +#~ msgid "Generate inline floating point division, optimize for throughput" +#~ msgstr "Mumurongo Bihindagurika Akadomo Kugeza ku ndunduro kugirango" + +#, fuzzy +#~ msgid "Generate inline integer division, optimize for latency" +#~ msgstr "Mumurongo Umubare wuzuye Kugeza ku ndunduro kugirango" + +#, fuzzy +#~ msgid "Generate inline integer division, optimize for throughput" +#~ msgstr "Mumurongo Umubare wuzuye Kugeza ku ndunduro kugirango" + +#, fuzzy +#~ msgid "Enable Dwarf 2 line debug info via GNU as" +#~ msgstr "2. Umurongo Kosora amakosa Ibisobanuro Biturutse Nka" + +#, fuzzy +#~ msgid "Disable Dwarf 2 line debug info via GNU as" +#~ msgstr "2. Umurongo Kosora amakosa Ibisobanuro Biturutse Nka" + +#, fuzzy +#~ msgid "Specify range of registers to make fixed" +#~ msgstr "Urutonde Bya Kuri Ubwoko BIHAMYE" + +#, fuzzy +#~ msgid "bad value (%s) for -mmodel switch" +#~ msgstr "Agaciro kugirango Hindura" + +#, fuzzy +#~ msgid "bad value (%s) for -msdata switch" +#~ msgstr "Agaciro kugirango Hindura" + +#, fuzzy +#~ msgid "invalid argument of `%s' attribute" +#~ msgstr "Sibyo Bya Ikiranga" + +#, fuzzy +#~ msgid "const objects cannot go in .sdata/.sbss" +#~ msgstr "Ibintu Gyayo in" + +#, fuzzy +#~ msgid "invalid operand to %%s code" +#~ msgstr "Sibyo Kuri ITEGEKONGENGA" + +#, fuzzy +#~ msgid "invalid operand to %%p code" +#~ msgstr "Sibyo Kuri ITEGEKONGENGA" + +#, fuzzy +#~ msgid "bad insn for 'A'" +#~ msgstr "kugirango" + +#, fuzzy +#~ msgid "invalid operand to %%T/%%B code" +#~ msgstr "Sibyo Kuri ITEGEKONGENGA" + +#, fuzzy +#~ msgid "invalid operand to %%N code" +#~ msgstr "Sibyo Kuri ITEGEKONGENGA" + +#, fuzzy +#~ msgid "pre-increment address is not a register" +#~ msgstr "Byahawe imiterere mbere Iyongeragaciro Aderesi ni OYA a Kwiyandikisha" + +#, fuzzy +#~ msgid "pre-decrement address is not a register" +#~ msgstr "Byahawe imiterere mbere Aderesi ni OYA a Kwiyandikisha" + +#, fuzzy +#~ msgid "post-increment address is not a register" +#~ msgstr "Iposita Iyongeragaciro Aderesi ni OYA a Kwiyandikisha" + +#, fuzzy +#~ msgid "bad address" +#~ msgstr "Aderesi" + +#, fuzzy +#~ msgid "lo_sum not of register" +#~ msgstr "OYA Bya Kwiyandikisha" + +#, fuzzy +#~ msgid "Display compile time statistics" +#~ msgstr "Gukusanya Igihe Sitatisitiki" + +#, fuzzy +#~ msgid "Align all loops to 32 byte boundary" +#~ msgstr "Byose Kuri Bayite" + +#, fuzzy +#~ msgid "Only issue one instruction per cycle" +#~ msgstr "Itangwa Uruziga" + +#, fuzzy +#~ msgid "Prefer branches over conditional execution" +#~ msgstr "KURI" + +#, fuzzy +#~ msgid "Code size: small, medium or large" +#~ msgstr "Ingano Gitoya biringaniye Cyangwa Binini" + +#, fuzzy +#~ msgid "Small data area: none, sdata, use" +#~ msgstr "Ibyatanzwe Ubuso Ntacyo Gukoresha" + +#, fuzzy +#~ msgid "-f%s ignored for 68HC11/68HC12 (not supported)" +#~ msgstr "-F kugirango OYA" + +#, fuzzy +#~ msgid "`trap' and `far' attributes are not compatible, ignoring `far'" +#~ msgstr "`Na Ibiranga OYA" + +#, fuzzy +#~ msgid "`trap' attribute is already used" +#~ msgstr "`Ikiranga ni" + +#, fuzzy +#~ msgid "move insn not handled" +#~ msgstr "Kwimura OYA" + +#, fuzzy +#~ msgid "invalid register in the move instruction" +#~ msgstr "Sibyo Kwiyandikisha in i Kwimura" + +#, fuzzy +#~ msgid "invalid operand in the instruction" +#~ msgstr "Sibyo in i" + +#, fuzzy +#~ msgid "invalid register in the instruction" +#~ msgstr "Sibyo Kwiyandikisha in i" + +#, fuzzy +#~ msgid "operand 1 must be a hard register" +#~ msgstr "1. a Ikomeye Kwiyandikisha" + +#, fuzzy +#~ msgid "invalid rotate insn" +#~ msgstr "Sibyo Kuzerutsa" + +#, fuzzy +#~ msgid "registers IX, IY and Z used in the same INSN" +#~ msgstr "Na in i" + +#, fuzzy +#~ msgid "cannot do z-register replacement" +#~ msgstr "Z Kwiyandikisha" + +#, fuzzy +#~ msgid "invalid Z register replacement for insn" +#~ msgstr "Sibyo Kwiyandikisha kugirango" + +#, fuzzy +#~ msgid "Compile with 16-bit integer mode" +#~ msgstr "Na: Umubare wuzuye Ubwoko" + +#, fuzzy +#~ msgid "Compile with 32-bit integer mode" +#~ msgstr "Na: Umubare wuzuye Ubwoko" + +#, fuzzy +#~ msgid "Auto pre/post decrement increment allowed" +#~ msgstr "Byahawe imiterere mbere Iposita Iyongeragaciro" + +#, fuzzy +#~ msgid "Auto pre/post decrement increment not allowed" +#~ msgstr "Byahawe imiterere mbere Iposita Iyongeragaciro OYA" + +#, fuzzy +#~ msgid "Min/max instructions allowed" +#~ msgstr "KININI Amabwiriza" + +#, fuzzy +#~ msgid "Min/max instructions not allowed" +#~ msgstr "KININI Amabwiriza OYA" + +#, fuzzy +#~ msgid "Use call and rtc for function calls and returns" +#~ msgstr "Na kugirango Umumaro Amahamagara: Na" + +#, fuzzy +#~ msgid "Use jsr and rts for function calls and returns" +#~ msgstr "Na kugirango Umumaro Amahamagara: Na" + +#, fuzzy +#~ msgid "Do not use direct addressing mode for soft registers" +#~ msgstr "OYA Gukoresha Kwohereza Ubwoko kugirango Yoroshe" + +#, fuzzy +#~ msgid "Use direct addressing mode for soft registers" +#~ msgstr "Kwohereza Ubwoko kugirango Yoroshe" + +#, fuzzy +#~ msgid "Compile for a 68HC11" +#~ msgstr "kugirango a" + +#, fuzzy +#~ msgid "Compile for a 68HC12" +#~ msgstr "kugirango a" + +#, fuzzy +#~ msgid "Compile for a 68HCS12" +#~ msgstr "kugirango a" + +#, fuzzy +#~ msgid "Specify the register allocation order" +#~ msgstr "i Kwiyandikisha Itondekanya" + +#, fuzzy +#~ msgid "Indicate the number of soft registers available" +#~ msgstr "i Umubare Bya Yoroshe Bihari" + +#, fuzzy +#~ msgid "-malign-loops=%d is not between 1 and %d" +#~ msgstr "-ni OYA hagati 1. Na" + +#, fuzzy +#~ msgid "-malign-jumps=%d is not between 1 and %d" +#~ msgstr "-ni OYA hagati 1. Na" + +#, fuzzy +#~ msgid "-malign-functions=%d is not between 1 and %d" +#~ msgstr "-Imimaro ni OYA hagati 1. Na" + +#, fuzzy +#~ msgid "-fPIC is not currently supported on the 68000 or 68010\n" +#~ msgstr "-ni OYA ku i Cyangwa" + +#, fuzzy +#~ msgid "Generate code for a 68020" +#~ msgstr "ITEGEKONGENGA kugirango a" + +#, fuzzy +#~ msgid "Generate code for a 68000" +#~ msgstr "ITEGEKONGENGA kugirango a" + +#, fuzzy +#~ msgid "Use the bit-field instructions" +#~ msgstr "i Umwanya Amabwiriza" + +#, fuzzy +#~ msgid "Do not use the bit-field instructions" +#~ msgstr "OYA Gukoresha i Umwanya Amabwiriza" + +#, fuzzy +#~ msgid "Use different calling convention using 'rtd'" +#~ msgstr "ikoresha" + +#, fuzzy +#~ msgid "Consider type `int' to be 16 bits wide" +#~ msgstr "Ubwoko Kuri" + +#, fuzzy +#~ msgid "Consider type `int' to be 32 bits wide" +#~ msgstr "Ubwoko Kuri" + +#, fuzzy +#~ msgid "Generate code for a Sun FPA" +#~ msgstr "ITEGEKONGENGA kugirango a" + +#, fuzzy +#~ msgid "Do not generate code for a Sun FPA" +#~ msgstr "OYA ITEGEKONGENGA kugirango a" + +#, fuzzy +#~ msgid "Generate code for a Sun Sky board" +#~ msgstr "ITEGEKONGENGA kugirango a" + +#, fuzzy +#~ msgid "Do not use Sky linkage convention" +#~ msgstr "OYA Gukoresha" + +#, fuzzy +#~ msgid "Generate code for a 68881" +#~ msgstr "ITEGEKONGENGA kugirango a" + +#, fuzzy +#~ msgid "Generate code with library calls for floating point" +#~ msgstr "ITEGEKONGENGA Na: Isomero Amahamagara: kugirango Bihindagurika Akadomo" + +#, fuzzy +#~ msgid "Generate code for a 68040, without any new instructions" +#~ msgstr "ITEGEKONGENGA kugirango a Gishya Amabwiriza" + +#, fuzzy +#~ msgid "Generate code for a 68060, without any new instructions" +#~ msgstr "ITEGEKONGENGA kugirango a Gishya Amabwiriza" + +#, fuzzy +#~ msgid "Generate code for a 68030" +#~ msgstr "ITEGEKONGENGA kugirango a" + +#, fuzzy +#~ msgid "Generate code for a 68040" +#~ msgstr "ITEGEKONGENGA kugirango a" + +#, fuzzy +#~ msgid "Generate code for a 68060" +#~ msgstr "ITEGEKONGENGA kugirango a" + +#, fuzzy +#~ msgid "Generate code for a 520X" +#~ msgstr "ITEGEKONGENGA kugirango a" + +#, fuzzy +#~ msgid "Generate code for a 68851" +#~ msgstr "ITEGEKONGENGA kugirango a" + +#, fuzzy +#~ msgid "Do no generate code for a 68851" +#~ msgstr "Oya ITEGEKONGENGA kugirango a" + +#, fuzzy +#~ msgid "Generate code for a 68302" +#~ msgstr "ITEGEKONGENGA kugirango a" + +#, fuzzy +#~ msgid "Generate code for a 68332" +#~ msgstr "ITEGEKONGENGA kugirango a" + +#, fuzzy +#~ msgid "Generate code for a cpu32" +#~ msgstr "ITEGEKONGENGA kugirango a" + +#, fuzzy +#~ msgid "Align variables on a 32-bit boundary" +#~ msgstr "Ibihinduka ku a" + +#, fuzzy +#~ msgid "Align variables on a 16-bit boundary" +#~ msgstr "Ibihinduka ku a" + +#, fuzzy +#~ msgid "Generate pc-relative code" +#~ msgstr "Bifitanye isano ITEGEKONGENGA" + +#, fuzzy +#~ msgid "Do not use unaligned memory references" +#~ msgstr "OYA Gukoresha Ububiko Indango" + +#, fuzzy +#~ msgid "Use unaligned memory references" +#~ msgstr "Ububiko Indango" + +#, fuzzy +#~ msgid "internal gcc monitor: short-branch(%x)" +#~ msgstr "By'imbere" + +#, fuzzy +#~ msgid "internal gcc error: Can't express symbolic location" +#~ msgstr "By'imbere Ikosa Ahantu" + +#, fuzzy +#~ msgid "argument #%d is a structure" +#~ msgstr "ni a Imiterere" + +#, fuzzy +#~ msgid "%%R not followed by %%B/C/D/E" +#~ msgstr "%%ROYA ku C E" + +#, fuzzy +#~ msgid "invalid %%x/X value" +#~ msgstr "Sibyo Agaciro" + +# sc/source\ui\src\globstr.src:RID_GLOBSTR.STR_VALID_DEFERROR.text +#, fuzzy +#~ msgid "invalid %%Q value" +#~ msgstr "Agaciro siko" + +# sc/source\ui\src\globstr.src:RID_GLOBSTR.STR_VALID_DEFERROR.text +#, fuzzy +#~ msgid "invalid %%q value" +#~ msgstr "Agaciro siko" + +# sc/source\ui\src\globstr.src:RID_GLOBSTR.STR_VALID_DEFERROR.text +#, fuzzy +#~ msgid "invalid %%o value" +#~ msgstr "Agaciro siko" + +# sc/source\ui\src\globstr.src:RID_GLOBSTR.STR_VALID_DEFERROR.text +#, fuzzy +#~ msgid "invalid %%p value" +#~ msgstr "Agaciro siko" + +#, fuzzy +#~ msgid "invalid %%s/S value" +#~ msgstr "Sibyo Agaciro" + +#, fuzzy +#~ msgid "invalid %%P operand" +#~ msgstr "Sibyo" + +# sc/source\ui\src\globstr.src:RID_GLOBSTR.STR_VALID_DEFERROR.text +#, fuzzy +#~ msgid "invalid %%B value" +#~ msgstr "Agaciro siko" + +# sc/source\ui\src\globstr.src:RID_GLOBSTR.STR_VALID_DEFERROR.text +#, fuzzy +#~ msgid "invalid %%D value" +#~ msgstr "Agaciro siko" + +#, fuzzy +#~ msgid "`%%d' operand isn't a register" +#~ msgstr "`%%d'si a Kwiyandikisha" + +#, fuzzy +#~ msgid "operand is r0" +#~ msgstr "ni" + +#, fuzzy +#~ msgid "operand is const_double" +#~ msgstr "ni" + +#, fuzzy +#~ msgid "invalid code" +#~ msgstr "Sibyo ITEGEKONGENGA" + +#, fuzzy +#~ msgid "-mtrap-large-shift and -mhandle-large-shift are incompatible" +#~ msgstr "-Binini Gusunika Na Binini Gusunika" + +#, fuzzy +#~ msgid "invalid option `-mshort-data-%s'" +#~ msgstr "Sibyo Ihitamo Ibyatanzwe" + +#, fuzzy +#~ msgid "-mshort-data-%s is too large " +#~ msgstr "-Ibyatanzwe ni Binini" + +#, fuzzy +#~ msgid "-mshort-data-%s and PIC are incompatible" +#~ msgstr "-Ibyatanzwe Na" + +#, fuzzy +#~ msgid "invalid option `-mstack-increment=%s'" +#~ msgstr "Sibyo Ihitamo Iyongeragaciro" + +#, fuzzy +#~ msgid "Inline constants if it can be done in 2 insns or less" +#~ msgstr "NIBA Byakozwe in 2. Cyangwa Birutwa" + +#, fuzzy +#~ msgid "Inline constants if it only takes 1 instruction" +#~ msgstr "NIBA 1." + +#, fuzzy +#~ msgid "Set maximum alignment to 4" +#~ msgstr "Kinini Itunganya Kuri 4." + +#, fuzzy +#~ msgid "Set maximum alignment to 8" +#~ msgstr "Kinini Itunganya Kuri 8" + +#, fuzzy +#~ msgid "Do not use the divide instruction" +#~ msgstr "OYA Gukoresha i Kugabanya" + +#, fuzzy +#~ msgid "Do not arbitrary sized immediates in bit operations" +#~ msgstr "OYA in Ibikorwa:" + +#, fuzzy +#~ msgid "Always treat bit-field as int-sized" +#~ msgstr "Umwanya Nka INT" + +#, fuzzy +#~ msgid "Force functions to be aligned to a 4 byte boundary" +#~ msgstr "Imimaro Kuri Kuri a 4. Bayite" + +#, fuzzy +#~ msgid "Force functions to be aligned to a 2 byte boundary" +#~ msgstr "Imimaro Kuri Kuri a 2. Bayite" + +#, fuzzy +#~ msgid "Emit call graph information" +#~ msgstr "Ibisobanuro" + +#, fuzzy +#~ msgid "Prefer word accesses over byte accesses" +#~ msgstr "ijambo KURI Bayite" + +#, fuzzy +#~ msgid "Generate code for the M*Core M340" +#~ msgstr "ITEGEKONGENGA kugirango i" + +#, fuzzy +#~ msgid "Maximum amount for a single stack increment operation" +#~ msgstr "Igiteranyo kugirango a UMWE Iyongeragaciro" + +#, fuzzy +#~ msgid "bad value (%s) for -mabi= switch" +#~ msgstr "Agaciro kugirango Hindura" + +#, fuzzy +#~ msgid "-mips%d conflicts with the other architecture options, which specify a MIPS%d processor" +#~ msgstr "-Na: i Ikindi Amahitamo a" + +#, fuzzy +#~ msgid "bad value (%s) for -mips switch" +#~ msgstr "Agaciro kugirango Hindura" + +#, fuzzy +#~ msgid "-march=%s is not compatible with the selected ABI" +#~ msgstr "-Werurwe ni OYA Na: i Byahiswemo" + +#, fuzzy +#~ msgid "-mgp64 used with a 32-bit processor" +#~ msgstr "-Na: a" + +#, fuzzy +#~ msgid "-mgp32 used with a 64-bit ABI" +#~ msgstr "-Na: a" + +#, fuzzy +#~ msgid "-mgp64 used with a 32-bit ABI" +#~ msgstr "-Na: a" + +#, fuzzy +#~ msgid "unsupported combination: %s" +#~ msgstr "Ivanga" + +#, fuzzy +#~ msgid "generation of Branch Likely instructions enabled, but not supported by architecture" +#~ msgstr "Bya Amabwiriza Bikora OYA ku" + +#, fuzzy +#~ msgid "-G is incompatible with PIC code which is the default" +#~ msgstr "-ni Na: ITEGEKONGENGA ni i Mburabuzi" + +#, fuzzy +#~ msgid "-membedded-pic and -mabicalls are incompatible" +#~ msgstr "-Na" + +#, fuzzy +#~ msgid "-G and -membedded-pic are incompatible" +#~ msgstr "-Na" + +#, fuzzy +#~ msgid "invalid option `entry%s'" +#~ msgstr "Sibyo Ihitamo Icyinjijwe" + +#, fuzzy +#~ msgid "-mentry is only meaningful with -mips-16" +#~ msgstr "-ni Na:" + +#, fuzzy +#~ msgid "internal error: %%) found without a %%( in assembler pattern" +#~ msgstr "By'imbere Ikosa Byabonetse a in Ishusho" + +#, fuzzy +#~ msgid "internal error: %%] found without a %%[ in assembler pattern" +#~ msgstr "By'imbere Ikosa Byabonetse a in Ishusho" + +#, fuzzy +#~ msgid "internal error: %%> found without a %%< in assembler pattern" +#~ msgstr "By'imbere Ikosa Byabonetse a in Ishusho" + +#, fuzzy +#~ msgid "internal error: %%} found without a %%{ in assembler pattern" +#~ msgstr "By'imbere Ikosa Byabonetse a in Ishusho" + +#, fuzzy +#~ msgid "PRINT_OPERAND: unknown punctuation '%c'" +#~ msgstr "Kitazwi" + +#, fuzzy +#~ msgid "PRINT_OPERAND null pointer" +#~ msgstr "NTAGIHARI Mweretsi" + +#, fuzzy +#~ msgid "invalid use of %%d, %%x, or %%X" +#~ msgstr "Sibyo Gukoresha Bya Cyangwa" + +#, fuzzy +#~ msgid "PRINT_OPERAND_ADDRESS, null pointer" +#~ msgstr "NTAGIHARI Mweretsi" + +#, fuzzy +#~ msgid "MIPS ECOFF format does not allow changing filenames within functions with #line" +#~ msgstr "Imiterere OYA Kwemerera muri Imimaro Na: Umurongo" + +#, fuzzy +#~ msgid "can't rewind temp file" +#~ msgstr "IDOSIYE" + +#, fuzzy +#~ msgid "can't write to output file" +#~ msgstr "Kwandika Kuri Ibisohoka IDOSIYE" + +#, fuzzy +#~ msgid "can't read from temp file" +#~ msgstr "Gusoma Bivuye IDOSIYE" + +#, fuzzy +#~ msgid "can't close temp file" +#~ msgstr "Gufunga IDOSIYE" + +#, fuzzy +#~ msgid "gp_offset (%ld) or end_offset (%ld) is less than zero" +#~ msgstr "Cyangwa ni Birutwa Zeru" + +#, fuzzy +#~ msgid "fp_offset (%ld) or end_offset (%ld) is less than zero" +#~ msgstr "Cyangwa ni Birutwa Zeru" + +#, fuzzy +#~ msgid "can not handle inconsistent calls to `%s'" +#~ msgstr "OYA Amahamagara: Kuri" + +#, fuzzy +#~ msgid "the cpu name must be lower case" +#~ msgstr "i CPU Izina: Ntoya" + +#, fuzzy +#~ msgid "bad value (%s) for %s" +#~ msgstr "Agaciro kugirango" + +#, fuzzy +#~ msgid "No default crt0.o" +#~ msgstr "Mburabuzi o" + +#, fuzzy +#~ msgid "Use 64-bit int type" +#~ msgstr "INT Ubwoko" + +#, fuzzy +#~ msgid "Use 64-bit long type" +#~ msgstr "Ubwoko" + +#, fuzzy +#~ msgid "Use 32-bit long type" +#~ msgstr "Ubwoko" + +#, fuzzy +#~ msgid "Optimize lui/addiu address loads" +#~ msgstr "Aderesi" + +#, fuzzy +#~ msgid "Don't optimize lui/addiu address loads" +#~ msgstr "Kugeza ku ndunduro Aderesi" + +#, fuzzy +#~ msgid "Use MIPS as" +#~ msgstr "Nka" + +#, fuzzy +#~ msgid "Use GNU as" +#~ msgstr "Nka" + +#, fuzzy +#~ msgid "Use symbolic register names" +#~ msgstr "Kwiyandikisha Amazina" + +#, fuzzy +#~ msgid "Don't use symbolic register names" +#~ msgstr "Gukoresha Kwiyandikisha Amazina" + +#, fuzzy +#~ msgid "Use GP relative sdata/sbss sections" +#~ msgstr "Bifitanye isano Ibyatoranyijwe" + +#, fuzzy +#~ msgid "Don't use GP relative sdata/sbss sections" +#~ msgstr "Gukoresha Bifitanye isano Ibyatoranyijwe" + +#, fuzzy +#~ msgid "Output compiler statistics" +#~ msgstr "Sitatisitiki" + +#, fuzzy +#~ msgid "Don't output compiler statistics" +#~ msgstr "Ibisohoka Sitatisitiki" + +#, fuzzy +#~ msgid "Don't optimize block moves" +#~ msgstr "Kugeza ku ndunduro Funga" + +#, fuzzy +#~ msgid "Optimize block moves" +#~ msgstr "Funga" + +#, fuzzy +#~ msgid "Don't use mips-tfile asm postpass" +#~ msgstr "Gukoresha" + +#, fuzzy +#~ msgid "Use hardware floating point" +#~ msgstr "Bihindagurika Akadomo" + +#, fuzzy +#~ msgid "Use 64-bit general registers" +#~ msgstr "Rusange" + +#, fuzzy +#~ msgid "Use 32-bit general registers" +#~ msgstr "Rusange" + +#, fuzzy +#~ msgid "Don't use Irix PIC" +#~ msgstr "Gukoresha" + +#, fuzzy +#~ msgid "Use indirect calls" +#~ msgstr "BUZIGUYE Amahamagara:" + +#, fuzzy +#~ msgid "Don't use indirect calls" +#~ msgstr "Gukoresha BUZIGUYE Amahamagara:" + +#, fuzzy +#~ msgid "Use embedded PIC" +#~ msgstr "Gitsindiye" + +#, fuzzy +#~ msgid "Don't use embedded PIC" +#~ msgstr "Gukoresha Gitsindiye" + +#, fuzzy +#~ msgid "Use ROM instead of RAM" +#~ msgstr "Bya" + +#, fuzzy +#~ msgid "Don't use ROM instead of RAM" +#~ msgstr "Gukoresha Bya" + +#, fuzzy +#~ msgid "Put uninitialized constants in ROM (needs -membedded-data)" +#~ msgstr "Itatangijwe in Ibyatanzwe" + +#, fuzzy +#~ msgid "Don't put uninitialized constants in ROM" +#~ msgstr "Gushyira Itatangijwe in" + +#, fuzzy +#~ msgid "Use big-endian byte order" +#~ msgstr "Bayite Itondekanya" + +#, fuzzy +#~ msgid "Use little-endian byte order" +#~ msgstr "Bayite Itondekanya" + +#, fuzzy +#~ msgid "Use single (32-bit) FP only" +#~ msgstr "UMWE" + +#, fuzzy +#~ msgid "Don't use single (32-bit) FP only" +#~ msgstr "Gukoresha UMWE" + +#, fuzzy +#~ msgid "Use multiply accumulate" +#~ msgstr "Gukuba" + +#, fuzzy +#~ msgid "Don't use multiply accumulate" +#~ msgstr "Gukoresha Gukuba" + +#, fuzzy +#~ msgid "Don't generate fused multiply/add instructions" +#~ msgstr "Gukuba Kongeramo Amabwiriza" + +#, fuzzy +#~ msgid "Generate fused multiply/add instructions" +#~ msgstr "Gukuba Kongeramo Amabwiriza" + +#, fuzzy +#~ msgid "Don't work around early 4300 hardware bug" +#~ msgstr "Akazi" + +#, fuzzy +#~ msgid "Trap on integer divide by zero" +#~ msgstr "ku Umubare wuzuye Kugabanya ku Zeru" + +#, fuzzy +#~ msgid "Don't trap on integer divide by zero" +#~ msgstr "ku Umubare wuzuye Kugabanya ku Zeru" + +#, fuzzy +#~ msgid "Trap on integer divide overflow" +#~ msgstr "ku Umubare wuzuye Kugabanya Byarenze urugero" + +#, fuzzy +#~ msgid "Don't trap on integer divide overflow" +#~ msgstr "ku Umubare wuzuye Kugabanya Byarenze urugero" + +#, fuzzy +#~ msgid "Use Branch Likely instructions, overriding default for arch" +#~ msgstr "Amabwiriza Mburabuzi kugirango" + +#, fuzzy +#~ msgid "Don't use Branch Likely instructions, overriding default for arch" +#~ msgstr "Gukoresha Amabwiriza Mburabuzi kugirango" + +#, fuzzy +#~ msgid "Specify CPU for scheduling purposes" +#~ msgstr "kugirango Impamvu" + +#, fuzzy +#~ msgid "Specify CPU for code generation purposes" +#~ msgstr "kugirango ITEGEKONGENGA Impamvu" + +#, fuzzy +#~ msgid "Specify a Standard MIPS ISA" +#~ msgstr "a" + +#, fuzzy +#~ msgid "Use mips16 entry/exit psuedo ops" +#~ msgstr "Icyinjijwe Gusohoka" + +#, fuzzy +#~ msgid "Don't use MIPS16 instructions" +#~ msgstr "Gukoresha Amabwiriza" + +#, fuzzy +#~ msgid "Don't call any cache flush functions" +#~ msgstr "Ubwihisho Imimaro" + +#, fuzzy +#~ msgid "Specify cache flush function" +#~ msgstr "Ubwihisho Umumaro" + +#, fuzzy +#~ msgid "mips16 function profiling" +#~ msgstr "Umumaro" + +#, fuzzy +#~ msgid "-f%s not supported: ignored" +#~ msgstr "-F OYA" + +#, fuzzy +#~ msgid "too large function value type, needs %d registers, have only %d registers for this" +#~ msgstr "Binini Umumaro Agaciro Ubwoko kugirango iyi" + +#, fuzzy +#~ msgid "function_profiler support for MMIX" +#~ msgstr "Gushigikira kugirango" + +#, fuzzy +#~ msgid "MMIX Internal: Last named vararg would not fit in a register" +#~ msgstr "OYA in a Kwiyandikisha" + +#, fuzzy +#~ msgid "MMIX Internal: Expected a CONST_INT, not this" +#~ msgstr "Itegerejwe a OYA iyi" + +#, fuzzy +#~ msgid "MMIX Internal: Bad register: %d" +#~ msgstr "Kwiyandikisha" + +#, fuzzy +#~ msgid "MMIX Internal: Bad value for 'm', not a CONST_INT" +#~ msgstr "Agaciro kugirango OYA a" + +#, fuzzy +#~ msgid "MMIX Internal: Expected a register, not this" +#~ msgstr "Itegerejwe a Kwiyandikisha OYA iyi" + +#, fuzzy +#~ msgid "MMIX Internal: Expected a constant, not this" +#~ msgstr "Itegerejwe a OYA iyi" + +#, fuzzy +#~ msgid "MMIX Internal: Missing `%c' case in mmix_print_operand" +#~ msgstr "in" + +#, fuzzy +#~ msgid "MMIX Internal: Cannot decode this operand" +#~ msgstr "iyi" + +#, fuzzy +#~ msgid "MMIX Internal: This is not a recognized address" +#~ msgstr "ni OYA a Aderesi" + +#, fuzzy +#~ msgid "stack frame not a multiple of 8 bytes: %d" +#~ msgstr "Ikadiri OYA a Igikubo Bya 8 Bayite" + +#, fuzzy +#~ msgid "stack frame not a multiple of octabyte: %d" +#~ msgstr "Ikadiri OYA a Igikubo Bya" + +#, fuzzy +#~ msgid "MMIX Internal: %s is not a shiftable int" +#~ msgstr "ni OYA a INT" + +#, fuzzy +#~ msgid "MMIX Internal: Trying to output invalidly reversed condition:" +#~ msgstr "Kuri Ibisohoka Bicuritswe Ibisabwa" + +#, fuzzy +#~ msgid "MMIX Internal: What's the CC of this?" +#~ msgstr "i Bya iyi" + +#, fuzzy +#~ msgid "MMIX Internal: What is the CC of this?" +#~ msgstr "ni i Bya iyi" + +#, fuzzy +#~ msgid "MMIX Internal: This is not a constant:" +#~ msgstr "ni OYA a" + +#, fuzzy +#~ msgid "Set start-address of the program" +#~ msgstr "Gutangira Aderesi Bya i Porogaramu" + +#, fuzzy +#~ msgid "Set start-address of data" +#~ msgstr "Gutangira Aderesi Bya Ibyatanzwe" + +#, fuzzy +#~ msgid "For intrinsics library: pass all parameters in registers" +#~ msgstr "Isomero Byose Ibigenga in" + +#, fuzzy +#~ msgid "Use register stack for parameters and return value" +#~ msgstr "Kwiyandikisha kugirango Ibigenga Na Garuka Agaciro" + +#, fuzzy +#~ msgid "Use call-clobbered registers for parameters and return value" +#~ msgstr "kugirango Ibigenga Na Garuka Agaciro" + +#, fuzzy +#~ msgid "Use epsilon-respecting floating point compare instructions" +#~ msgstr "ebusiloni Bihindagurika Akadomo Kugereranya# Amabwiriza" + +#, fuzzy +#~ msgid "Use zero-extending memory loads, not sign-extending ones" +#~ msgstr "Zeru Ububiko OYA IKIMENYETSO" + +#, fuzzy +#~ msgid "Generate divide results with reminder having the same sign as the divisor (not the dividend)" +#~ msgstr "Kugabanya Ibisubizo ku Na: Mwibutsa i IKIMENYETSO Nka i Ikigabanya OYA i Ikigabanywa" + +#, fuzzy +#~ msgid "Prepend global symbols with \":\" (for use with PREFIX)" +#~ msgstr "Ibimenyetso Na: kugirango Gukoresha Na:" + +#, fuzzy +#~ msgid "Do not provide a default start-address 0x100 of the program" +#~ msgstr "OYA a Mburabuzi Gutangira Aderesi Bya i Porogaramu" + +#, fuzzy +#~ msgid "Link to emit program in ELF format (rather than mmo)" +#~ msgstr "Kuri Porogaramu in Imiterere" + +#, fuzzy +#~ msgid "Use P-mnemonics for branches statically predicted as taken" +#~ msgstr "kugirango Nka" + +#, fuzzy +#~ msgid "Don't use P-mnemonics for branches" +#~ msgstr "Gukoresha kugirango" + +#, fuzzy +#~ msgid "Use addresses that allocate global registers" +#~ msgstr "Amaderesi" + +#, fuzzy +#~ msgid "Do not use addresses that allocate global registers" +#~ msgstr "OYA Gukoresha Amaderesi" + +#, fuzzy +#~ msgid "Generate a single exit point for each function" +#~ msgstr "a UMWE Gusohoka Akadomo kugirango Umumaro" + +#, fuzzy +#~ msgid "Do not generate a single exit point for each function" +#~ msgstr "OYA a UMWE Gusohoka Akadomo kugirango Umumaro" + +#, fuzzy +#~ msgid "Work around hardware multiply bug" +#~ msgstr "Gukuba" + +#, fuzzy +#~ msgid "Do not work around hardware multiply bug" +#~ msgstr "OYA Akazi Gukuba" + +#, fuzzy +#~ msgid "Target the AM33 processor" +#~ msgstr "i" + +#, fuzzy +#~ msgid "Don't use hardware fp" +#~ msgstr "Gukoresha" + +#, fuzzy +#~ msgid "Pass some arguments in registers" +#~ msgstr "ingingo in" + +#, fuzzy +#~ msgid "Pass all arguments on stack" +#~ msgstr "Byose ingingo ku" + +#, fuzzy +#~ msgid "Optimize for 32532 cpu" +#~ msgstr "kugirango CPU" + +#, fuzzy +#~ msgid "Optimize for 32332 cpu" +#~ msgstr "kugirango CPU" + +#, fuzzy +#~ msgid "Optimize for 32032" +#~ msgstr "kugirango" + +#, fuzzy +#~ msgid "Register sb is zero. Use for absolute addressing" +#~ msgstr "ni Zeru kugirango Kwohereza" + +#, fuzzy +#~ msgid "Do not use register sb" +#~ msgstr "OYA Gukoresha Kwiyandikisha" + +#, fuzzy +#~ msgid "Use bit-field instructions" +#~ msgstr "Umwanya Amabwiriza" + +#, fuzzy +#~ msgid "Do not use bit-field instructions" +#~ msgstr "OYA Gukoresha Umwanya Amabwiriza" + +#, fuzzy +#~ msgid "Generate code for high memory" +#~ msgstr "ITEGEKONGENGA kugirango kirekire Ububiko" + +#, fuzzy +#~ msgid "Generate code for low memory" +#~ msgstr "ITEGEKONGENGA kugirango Byo hasi Ububiko" + +#, fuzzy +#~ msgid "Use multiply-accumulate fp instructions" +#~ msgstr "Gukuba Amabwiriza" + +#, fuzzy +#~ msgid "Do not use multiply-accumulate fp instructions" +#~ msgstr "OYA Gukoresha Gukuba Amabwiriza" + +#, fuzzy +#~ msgid "\"Small register classes\" kludge" +#~ msgstr "\"Kwiyandikisha Inzego" + +#, fuzzy +#~ msgid "No \"Small register classes\" kludge" +#~ msgstr "Kwiyandikisha Inzego" + +#, fuzzy +#~ msgid "" +#~ "unknown -mschedule= option (%s).\n" +#~ "Valid options are 700, 7100, 7100LC, 7200, 7300, and 8000\n" +#~ msgstr "Kitazwi Ihitamo Amahitamo Na" + +#, fuzzy +#~ msgid "" +#~ "unknown -march= option (%s).\n" +#~ "Valid options are 1.0, 1.1, and 2.0\n" +#~ msgstr "01. 1na2." + +#, fuzzy +#~ msgid "PIC code generation is not supported in the portable runtime model\n" +#~ msgstr "ITEGEKONGENGA ni OYA in i" + +#, fuzzy +#~ msgid "PIC code generation is not compatible with fast indirect calls\n" +#~ msgstr "ITEGEKONGENGA ni OYA Na: Byihuta BUZIGUYE" + +#, fuzzy +#~ msgid "-g is only supported when using GAS on this processor," +#~ msgstr "-g ni Ryari: ikoresha ku iyi" + +#, fuzzy +#~ msgid "-g option disabled" +#~ msgstr "-g Ihitamo Yahagaritswe" + +#, fuzzy +#~ msgid "Generate cpp defines for server IO" +#~ msgstr "kugirango Seriveri" + +#, fuzzy +#~ msgid "Generate cpp defines for workstation IO" +#~ msgstr "kugirango" + +#, fuzzy +#~ msgid "Generate PA1.1 code" +#~ msgstr "1. ITEGEKONGENGA" + +#, fuzzy +#~ msgid "Generate PA1.0 code" +#~ msgstr "0 ITEGEKONGENGA" + +#, fuzzy +#~ msgid "Generate PA2.0 code (requires binutils 2.10 or later)" +#~ msgstr "0 ITEGEKONGENGA 2. 10 Cyangwa" + +#, fuzzy +#~ msgid "Do not disable FP regs" +#~ msgstr "OYA" + +#, fuzzy +#~ msgid "Disable space regs" +#~ msgstr "Umwanya" + +#, fuzzy +#~ msgid "Do not disable space regs" +#~ msgstr "OYA Umwanya" + +#, fuzzy +#~ msgid "Put jumps in call delay slots" +#~ msgstr "in Gutinda Siloti" + +#, fuzzy +#~ msgid "Do not put jumps in call delay slots" +#~ msgstr "OYA Gushyira in Gutinda Siloti" + +#, fuzzy +#~ msgid "Disable indexed addressing" +#~ msgstr "Kwohereza" + +#, fuzzy +#~ msgid "Do not disable indexed addressing" +#~ msgstr "OYA Kwohereza" + +#, fuzzy +#~ msgid "Do not use portable calling conventions" +#~ msgstr "OYA Gukoresha" + +#, fuzzy +#~ msgid "Assume code will be assembled by GAS" +#~ msgstr "ITEGEKONGENGA ku" + +#, fuzzy +#~ msgid "Do not assume code will be assembled by GAS" +#~ msgstr "OYA ITEGEKONGENGA ku" + +#, fuzzy +#~ msgid "Do not use software floating point" +#~ msgstr "OYA Gukoresha Bihindagurika Akadomo" + +#, fuzzy +#~ msgid "Emit long load/store sequences" +#~ msgstr "Ibirimo" + +#, fuzzy +#~ msgid "Do not emit long load/store sequences" +#~ msgstr "OYA Ibirimo" + +#, fuzzy +#~ msgid "Generate fast indirect calls" +#~ msgstr "Byihuta BUZIGUYE Amahamagara:" + +#, fuzzy +#~ msgid "Do not generate fast indirect calls" +#~ msgstr "OYA Byihuta BUZIGUYE Amahamagara:" + +#, fuzzy +#~ msgid "Generate code for huge switch statements" +#~ msgstr "ITEGEKONGENGA kugirango Hindura" + +#, fuzzy +#~ msgid "Do not generate code for huge switch statements" +#~ msgstr "OYA ITEGEKONGENGA kugirango Hindura" + +#, fuzzy +#~ msgid "Always generate long calls" +#~ msgstr "Amahamagara:" + +#, fuzzy +#~ msgid "Generate long calls only when needed" +#~ msgstr "Amahamagara: Ryari:" + +#, fuzzy +#~ msgid "Specify architecture for code generation. Values are 1.0, 1.1, and 2.0. 2.0 requires gas snapshot 19990413 or later." +#~ msgstr "01. 1na2. 0. 2.." + +#, fuzzy +#~ msgid "Assume code will be linked by GNU ld" +#~ msgstr "ITEGEKONGENGA ku" + +#, fuzzy +#~ msgid "Assume code will be linked by HP ld" +#~ msgstr "ITEGEKONGENGA ku" + +#, fuzzy +#~ msgid "Do not use hardware floating point" +#~ msgstr "OYA Gukoresha Bihindagurika Akadomo" + +#, fuzzy +#~ msgid "Return floating point results in ac0" +#~ msgstr "Bihindagurika Akadomo Ibisubizo ku in" + +#, fuzzy +#~ msgid "Return floating point results in memory" +#~ msgstr "Bihindagurika Akadomo Ibisubizo ku in Ububiko" + +#, fuzzy +#~ msgid "Generate code for an 11/40" +#~ msgstr "ITEGEKONGENGA kugirango" + +#, fuzzy +#~ msgid "Generate code for an 11/45" +#~ msgstr "ITEGEKONGENGA kugirango" + +#, fuzzy +#~ msgid "Generate code for an 11/10" +#~ msgstr "ITEGEKONGENGA kugirango 10" + +#, fuzzy +#~ msgid "Use 32 bit int" +#~ msgstr "INT" + +#, fuzzy +#~ msgid "Use 16 bit int" +#~ msgstr "INT" + +#, fuzzy +#~ msgid "Use 32 bit float" +#~ msgstr "Kureremba" + +#, fuzzy +#~ msgid "Use 64 bit float" +#~ msgstr "Kureremba" + +#, fuzzy +#~ msgid "Target has split I&D" +#~ msgstr "Gutandukanya" + +#, fuzzy +#~ msgid "Target does not have split I&D" +#~ msgstr "OYA Gutandukanya" + +# sc/source\ui\src\globstr.src:RID_GLOBSTR.STR_VALID_DEFERROR.text +#, fuzzy +#~ msgid "invalid %%S value" +#~ msgstr "Agaciro siko" + +# sc/source\ui\src\globstr.src:RID_GLOBSTR.STR_VALID_DEFERROR.text +#, fuzzy +#~ msgid "invalid %%b value" +#~ msgstr "Agaciro siko" + +# sc/source\ui\src\globstr.src:RID_GLOBSTR.STR_VALID_DEFERROR.text +#, fuzzy +#~ msgid "invalid %%z value" +#~ msgstr "Agaciro siko" + +# sc/source\ui\src\globstr.src:RID_GLOBSTR.STR_VALID_DEFERROR.text +#, fuzzy +#~ msgid "invalid %%Z value" +#~ msgstr "Agaciro siko" + +# sc/source\ui\src\globstr.src:RID_GLOBSTR.STR_VALID_DEFERROR.text +#, fuzzy +#~ msgid "invalid %%k value" +#~ msgstr "Agaciro siko" + +# sc/source\ui\src\globstr.src:RID_GLOBSTR.STR_VALID_DEFERROR.text +#, fuzzy +#~ msgid "invalid %%j value" +#~ msgstr "Agaciro siko" + +#, fuzzy +#~ msgid "can't have varargs with -mfp-arg-in-fp-regs" +#~ msgstr "Na: in" + +#, fuzzy +#~ msgid "missing open paren" +#~ msgstr "Ibuze Gufungura" + +#, fuzzy +#~ msgid "missing number" +#~ msgstr "Ibuze Umubare" + +#, fuzzy +#~ msgid "missing close paren" +#~ msgstr "Ibuze Gufunga" + +#, fuzzy +#~ msgid "number must be 0 or 1" +#~ msgstr "Umubare 0 Cyangwa 1." + +#, fuzzy +#~ msgid "junk at end of #pragma longcall" +#~ msgstr "Umwanda ku Impera Bya" + +#, fuzzy +#~ msgid "-mmultiple is not supported on little endian systems" +#~ msgstr "-ni OYA ku" + +#, fuzzy +#~ msgid "-mstring is not supported on little endian systems" +#~ msgstr "-ni OYA ku" + +#, fuzzy +#~ msgid "unknown -mdebug-%s switch" +#~ msgstr "Kitazwi Hindura" + +#, fuzzy +#~ msgid "unknown -mtraceback arg `%s'; expecting `full', `partial' or `none'" +#~ msgstr "Kitazwi Cyangwa" + +#, fuzzy +#~ msgid "Unknown switch -mlong-double-%s" +#~ msgstr "Hindura MAHARAKUBIRI" + +#, fuzzy +#~ msgid "unknown -misel= option specified: '%s'" +#~ msgstr "Kitazwi Ihitamo" + +#, fuzzy +#~ msgid "unknown -mvrsave= option specified: '%s'" +#~ msgstr "Kitazwi Ihitamo" + +#, fuzzy +#~ msgid "unknown ABI specified: '%s'" +#~ msgstr "Kitazwi" + +#, fuzzy +#~ msgid "argument 1 must be a 5-bit signed literal" +#~ msgstr "1. a 5" + +#, fuzzy +#~ msgid "argument 2 must be a 5-bit unsigned literal" +#~ msgstr "2. a 5 Bitashizweho umukono" + +#, fuzzy +#~ msgid "argument 1 of __builtin_altivec_predicate must be a constant" +#~ msgstr "1. Bya a" + +#, fuzzy +#~ msgid "argument 1 of __builtin_altivec_predicate is out of range" +#~ msgstr "1. Bya ni Inyuma Bya Urutonde" + +#, fuzzy +#~ msgid "argument 3 must be a 4-bit unsigned literal" +#~ msgstr "3. a 4. Bitashizweho umukono" + +#, fuzzy +#~ msgid "argument to `%s' must be a 2-bit unsigned literal" +#~ msgstr "Kuri a 2. Bitashizweho umukono" + +#, fuzzy +#~ msgid "argument to dss must be a 2-bit unsigned literal" +#~ msgstr "Kuri a 2. Bitashizweho umukono" + +#, fuzzy +#~ msgid "argument 1 of __builtin_spe_predicate must be a constant" +#~ msgstr "1. Bya a" + +#, fuzzy +#~ msgid "argument 1 of __builtin_spe_predicate is out of range" +#~ msgstr "1. Bya ni Inyuma Bya Urutonde" + +# sc/source\ui\src\globstr.src:RID_GLOBSTR.STR_VALID_DEFERROR.text +#, fuzzy +#~ msgid "invalid %%f value" +#~ msgstr "Agaciro siko" + +# sc/source\ui\src\globstr.src:RID_GLOBSTR.STR_VALID_DEFERROR.text +#, fuzzy +#~ msgid "invalid %%F value" +#~ msgstr "Agaciro siko" + +# sc/source\ui\src\globstr.src:RID_GLOBSTR.STR_VALID_DEFERROR.text +#, fuzzy +#~ msgid "invalid %%G value" +#~ msgstr "Agaciro siko" + +#, fuzzy +#~ msgid "invalid %%j code" +#~ msgstr "Sibyo ITEGEKONGENGA" + +#, fuzzy +#~ msgid "invalid %%J code" +#~ msgstr "Sibyo ITEGEKONGENGA" + +# sc/source\ui\src\globstr.src:RID_GLOBSTR.STR_VALID_DEFERROR.text +#, fuzzy +#~ msgid "invalid %%K value" +#~ msgstr "Agaciro siko" + +# sc/source\ui\src\globstr.src:RID_GLOBSTR.STR_VALID_DEFERROR.text +#, fuzzy +#~ msgid "invalid %%O value" +#~ msgstr "Agaciro siko" + +# sc/source\ui\src\globstr.src:RID_GLOBSTR.STR_VALID_DEFERROR.text +#, fuzzy +#~ msgid "invalid %%T value" +#~ msgstr "Agaciro siko" + +# sc/source\ui\src\globstr.src:RID_GLOBSTR.STR_VALID_DEFERROR.text +#, fuzzy +#~ msgid "invalid %%u value" +#~ msgstr "Agaciro siko" + +# sc/source\ui\src\globstr.src:RID_GLOBSTR.STR_VALID_DEFERROR.text +#, fuzzy +#~ msgid "invalid %%v value" +#~ msgstr "Agaciro siko" + +#, fuzzy +#~ msgid "no profiling of 64-bit code for this ABI" +#~ msgstr "Oya Bya ITEGEKONGENGA kugirango iyi" + +#, fuzzy +#~ msgid "Always pass floating-point arguments in memory" +#~ msgstr "Bihindagurika Akadomo ingingo in Ububiko" + +#, fuzzy +#~ msgid "Don't always pass floating-point arguments in memory" +#~ msgstr "Buri gihe Bihindagurika Akadomo ingingo in Ububiko" + +#, fuzzy +#~ msgid "Support message passing with the Parallel Environment" +#~ msgstr "Ubutumwa Na: i" + +#, fuzzy +#~ msgid "Compile for 64-bit pointers" +#~ msgstr "kugirango" + +#, fuzzy +#~ msgid "Compile for 32-bit pointers" +#~ msgstr "kugirango" + +#, fuzzy +#~ msgid "-maix64 and POWER architecture are incompatible" +#~ msgstr "-Na" + +#, fuzzy +#~ msgid "-maix64 requires PowerPC64 architecture remain enabled" +#~ msgstr "-Bikora" + +#, fuzzy +#~ msgid "-maix64 required: 64-bit computation with 32-bit addressing not yet supported" +#~ msgstr "-Bya ngombwa Na: Kwohereza OYA" + +#, fuzzy +#~ msgid "Use POWER instruction set" +#~ msgstr "Gushyiraho" + +#, fuzzy +#~ msgid "Use POWER2 instruction set" +#~ msgstr "Gushyiraho" + +#, fuzzy +#~ msgid "Do not use POWER2 instruction set" +#~ msgstr "OYA Gukoresha Gushyiraho" + +#, fuzzy +#~ msgid "Do not use POWER instruction set" +#~ msgstr "OYA Gukoresha Gushyiraho" + +#, fuzzy +#~ msgid "Use PowerPC instruction set" +#~ msgstr "Gushyiraho" + +#, fuzzy +#~ msgid "Do not use PowerPC instruction set" +#~ msgstr "OYA Gukoresha Gushyiraho" + +#, fuzzy +#~ msgid "Use PowerPC General Purpose group optional instructions" +#~ msgstr "Itsinda Bitari ngombwa Amabwiriza" + +#, fuzzy +#~ msgid "Don't use PowerPC General Purpose group optional instructions" +#~ msgstr "Gukoresha Itsinda Bitari ngombwa Amabwiriza" + +#, fuzzy +#~ msgid "Use PowerPC Graphics group optional instructions" +#~ msgstr "Itsinda Bitari ngombwa Amabwiriza" + +#, fuzzy +#~ msgid "Don't use PowerPC Graphics group optional instructions" +#~ msgstr "Gukoresha Itsinda Bitari ngombwa Amabwiriza" + +#, fuzzy +#~ msgid "Use PowerPC-64 instruction set" +#~ msgstr "Gushyiraho" + +#, fuzzy +#~ msgid "Don't use PowerPC-64 instruction set" +#~ msgstr "Gukoresha Gushyiraho" + +#, fuzzy +#~ msgid "Use AltiVec instructions" +#~ msgstr "Amabwiriza" + +#, fuzzy +#~ msgid "Don't use AltiVec instructions" +#~ msgstr "Gukoresha Amabwiriza" + +#, fuzzy +#~ msgid "Use new mnemonics for PowerPC architecture" +#~ msgstr "Gishya kugirango" + +#, fuzzy +#~ msgid "Use old mnemonics for PowerPC architecture" +#~ msgstr "ki/ bishaje kugirango" + +#, fuzzy +#~ msgid "Put everything in the regular TOC" +#~ msgstr "in i Ibisanzwe" + +#, fuzzy +#~ msgid "Place floating point constants in TOC" +#~ msgstr "Bihindagurika Akadomo in" + +#, fuzzy +#~ msgid "Don't place floating point constants in TOC" +#~ msgstr "Bihindagurika Akadomo in" + +#, fuzzy +#~ msgid "Place symbol+offset constants in TOC" +#~ msgstr "IKIMENYETSO Nta- boneza in" + +#, fuzzy +#~ msgid "Don't place symbol+offset constants in TOC" +#~ msgstr "IKIMENYETSO Nta- boneza in" + +#, fuzzy +#~ msgid "Place variable addresses in the regular TOC" +#~ msgstr "IMPINDURAGACIRO Amaderesi in i Ibisanzwe" + +#, fuzzy +#~ msgid "Generate load/store multiple instructions" +#~ msgstr "Ibirimo Igikubo Amabwiriza" + +#, fuzzy +#~ msgid "Do not generate load/store multiple instructions" +#~ msgstr "OYA Ibirimo Igikubo Amabwiriza" + +#, fuzzy +#~ msgid "Generate string instructions for block moves" +#~ msgstr "Ikurikiranyanyuguti Amabwiriza kugirango Funga" + +#, fuzzy +#~ msgid "Do not generate string instructions for block moves" +#~ msgstr "OYA Ikurikiranyanyuguti Amabwiriza kugirango Funga" + +#, fuzzy +#~ msgid "Generate load/store with update instructions" +#~ msgstr "Ibirimo Na: Kuvugurura Amabwiriza" + +#, fuzzy +#~ msgid "Do not generate load/store with update instructions" +#~ msgstr "OYA Ibirimo Na: Kuvugurura Amabwiriza" + +#, fuzzy +#~ msgid "Don't schedule the start and end of the procedure" +#~ msgstr "Igenabihe i Gutangira Na Impera Bya i" + +#, fuzzy +#~ msgid "Return all structures in memory (AIX default)" +#~ msgstr "Byose in Ububiko Mburabuzi" + +#, fuzzy +#~ msgid "Return small structures in registers (SVR4 default)" +#~ msgstr "Gitoya in Mburabuzi" + +#, fuzzy +#~ msgid "Use features of and schedule code for given CPU" +#~ msgstr "Ibiranga Bya Na Igenabihe ITEGEKONGENGA kugirango" + +#, fuzzy +#~ msgid "Enable debug output" +#~ msgstr "Kosora amakosa Ibisohoka" + +#, fuzzy +#~ msgid "Select full, part, or no traceback table" +#~ msgstr "Cyangwa Oya imbonerahamwe#" + +#, fuzzy +#~ msgid "Specify ABI to use" +#~ msgstr "Kuri Gukoresha" + +#, fuzzy +#~ msgid "Specify size of long double (64 or 128 bits)" +#~ msgstr "Ingano Bya MAHARAKUBIRI Cyangwa" + +#, fuzzy +#~ msgid "Specify yes/no if isel instructions should be generated" +#~ msgstr "Yego Oya NIBA Amabwiriza" + +#, fuzzy +#~ msgid "Specify yes/no if VRSAVE instructions should be generated for AltiVec" +#~ msgstr "Yego Oya NIBA Amabwiriza kugirango" + +#, fuzzy +#~ msgid "Avoid all range limits on call instructions" +#~ msgstr "Byose Urutonde Imbibi ku Amabwiriza" + +#, fuzzy +#~ msgid "RETURN_ADDRESS_OFFSET not supported" +#~ msgstr "OYA" + +#, fuzzy +#~ msgid "Select method for sdata handling" +#~ msgstr "Uburyo kugirango" + +#, fuzzy +#~ msgid "Align to the base type of the bit-field" +#~ msgstr "Kuri i SHINGIRO Ubwoko Bya i Umwanya" + +#, fuzzy +#~ msgid "Don't align to the base type of the bit-field" +#~ msgstr "Gutondeka Kuri i SHINGIRO Ubwoko Bya i Umwanya" + +#, fuzzy +#~ msgid "Don't assume that unaligned accesses are handled by the system" +#~ msgstr "ku i Sisitemu" + +#, fuzzy +#~ msgid "Assume that unaligned accesses are handled by the system" +#~ msgstr "ku i Sisitemu" + +#, fuzzy +#~ msgid "Produce code relocatable at runtime" +#~ msgstr "ITEGEKONGENGA ku" + +#, fuzzy +#~ msgid "Don't produce code relocatable at runtime" +#~ msgstr "ITEGEKONGENGA ku" + +#, fuzzy +#~ msgid "Produce little endian code" +#~ msgstr "ITEGEKONGENGA" + +#, fuzzy +#~ msgid "Produce big endian code" +#~ msgstr "ITEGEKONGENGA" + +#, fuzzy +#~ msgid "no description yet" +#~ msgstr "Oya Isobanuramiterere" + +#, fuzzy +#~ msgid "Don't use EABI" +#~ msgstr "Gukoresha" + +#, fuzzy +#~ msgid "Do not allow bit-fields to cross word boundaries" +#~ msgstr "OYA Kwemerera Imyanya Kuri Kwambukiranya ijambo" + +#, fuzzy +#~ msgid "Use alternate register names" +#~ msgstr "Kwiyandikisha Amazina" + +#, fuzzy +#~ msgid "Don't use alternate register names" +#~ msgstr "Gukoresha Kwiyandikisha Amazina" + +#, fuzzy +#~ msgid "Link with libsim.a, libc.a and sim-crt0.o" +#~ msgstr "Na: a a Na o" + +#, fuzzy +#~ msgid "Link with libads.a, libc.a and crt0.o" +#~ msgstr "Na: a a Na o" + +#, fuzzy +#~ msgid "Link with libyk.a, libc.a and crt0.o" +#~ msgstr "Na: a a Na o" + +#, fuzzy +#~ msgid "Link with libmvme.a, libc.a and crt0.o" +#~ msgstr "Na: a a Na o" + +#, fuzzy +#~ msgid "Set the PPC_EMB bit in the ELF flags header" +#~ msgstr "i in i Amabendera Umutwempangano" + +#, fuzzy +#~ msgid "Use the WindISS simulator" +#~ msgstr "i" + +#, fuzzy +#~ msgid "bad value for -mcall-%s" +#~ msgstr "Agaciro kugirango" + +#, fuzzy +#~ msgid "bad value for -msdata=%s" +#~ msgstr "Agaciro kugirango" + +#, fuzzy +#~ msgid "-mrelocatable and -msdata=%s are incompatible" +#~ msgstr "-Na" + +#, fuzzy +#~ msgid "-f%s and -msdata=%s are incompatible" +#~ msgstr "-F Na" + +#, fuzzy +#~ msgid "-msdata=%s and -mcall-%s are incompatible" +#~ msgstr "-Na" + +#, fuzzy +#~ msgid "-mrelocatable and -mno-minimal-toc are incompatible" +#~ msgstr "-Na" + +#, fuzzy +#~ msgid "-mrelocatable and -mcall-%s are incompatible" +#~ msgstr "-Na" + +#, fuzzy +#~ msgid "-fPIC and -mcall-%s are incompatible" +#~ msgstr "-Na" + +#, fuzzy +#~ msgid "invalid UNSPEC as operand (1)" +#~ msgstr "Sibyo Nka 1." + +#, fuzzy +#~ msgid "invalid UNSPEC as operand (2)" +#~ msgstr "Sibyo Nka 2." + +#, fuzzy +#~ msgid "UNKNOWN in s390_output_symbolic_const !?" +#~ msgstr "in" + +#, fuzzy +#~ msgid "Cannot decompose address." +#~ msgstr "Aderesi" + +#, fuzzy +#~ msgid "UNKNOWN in print_operand !?" +#~ msgstr "in" + +#, fuzzy +#~ msgid "Total size of local variables exceeds architecture limit." +#~ msgstr "Ingano Bya Ibihinduka" + +#, fuzzy +#~ msgid "Don't set backchain (faster, but debug harder" +#~ msgstr "Gushyiraho Kosora amakosa" + +#, fuzzy +#~ msgid "Use bras for executable < 64k" +#~ msgstr "kugirango" + +#, fuzzy +#~ msgid "Don't use bras" +#~ msgstr "Gukoresha" + +#, fuzzy +#~ msgid "Additional debug prints" +#~ msgstr "Kosora amakosa" + +#, fuzzy +#~ msgid "Don't print additional debug prints" +#~ msgstr "Gucapa Kosora amakosa" + +#, fuzzy +#~ msgid "64 bit mode" +#~ msgstr "Ubwoko" + +#, fuzzy +#~ msgid "31 bit mode" +#~ msgstr "Ubwoko" + +#, fuzzy +#~ msgid "mvcle use" +#~ msgstr "Gukoresha" + +#, fuzzy +#~ msgid "__builtin_saveregs not supported by this subtarget" +#~ msgstr "_OYA ku iyi" + +#, fuzzy +#~ msgid "attribute interrupt_handler is not compatible with -m5-compact" +#~ msgstr "Ikiranga ni OYA Na:" + +#, fuzzy +#~ msgid "`%s' attribute only applies to interrupt functions" +#~ msgstr "`%s'Ikiranga Kuri Hagarikira aho Imimaro" + +#, fuzzy +#~ msgid "`%s' attribute argument not a string constant" +#~ msgstr "`%s'Ikiranga OYA a Ikurikiranyanyuguti" + +#, fuzzy +#~ msgid "`%s' attribute argument not an integer constant" +#~ msgstr "`%s'Ikiranga OYA Umubare wuzuye" + +#, fuzzy +#~ msgid "Profiling is not supported on this target." +#~ msgstr "ni OYA ku iyi Intego" + +#, fuzzy +#~ msgid "%s is not supported by this configuration" +#~ msgstr "%sni OYA ku iyi Iboneza" + +#, fuzzy +#~ msgid "-mlong-double-64 not allowed with -m64" +#~ msgstr "-MAHARAKUBIRI OYA Na:" + +#, fuzzy +#~ msgid "-mcmodel= is not supported on 32 bit systems" +#~ msgstr "-ni OYA ku" + +#, fuzzy +#~ msgid "invalid %%Y operand" +#~ msgstr "Sibyo" + +#, fuzzy +#~ msgid "invalid %%A operand" +#~ msgstr "Sibyo" + +#, fuzzy +#~ msgid "invalid %%B operand" +#~ msgstr "Sibyo" + +#, fuzzy +#~ msgid "invalid %%c operand" +#~ msgstr "Sibyo" + +#, fuzzy +#~ msgid "invalid %%C operand" +#~ msgstr "Sibyo" + +#, fuzzy +#~ msgid "invalid %%d operand" +#~ msgstr "Sibyo" + +#, fuzzy +#~ msgid "invalid %%D operand" +#~ msgstr "Sibyo" + +#, fuzzy +#~ msgid "invalid %%f operand" +#~ msgstr "Sibyo" + +#, fuzzy +#~ msgid "invalid %%s operand" +#~ msgstr "Sibyo" + +#, fuzzy +#~ msgid "long long constant not a valid immediate operand" +#~ msgstr "OYA a Byemewe" + +#, fuzzy +#~ msgid "floating point constant not a valid immediate operand" +#~ msgstr "Bihindagurika Akadomo OYA a Byemewe" + +#, fuzzy +#~ msgid "Generate code for big endian" +#~ msgstr "ITEGEKONGENGA kugirango" + +#, fuzzy +#~ msgid "Generate code for little endian" +#~ msgstr "ITEGEKONGENGA kugirango" + +#, fuzzy +#~ msgid "Use little-endian byte order for data" +#~ msgstr "Bayite Itondekanya kugirango Ibyatanzwe" + +#, fuzzy +#~ msgid "Assume possible double misalignment" +#~ msgstr "MAHARAKUBIRI" + +#, fuzzy +#~ msgid "Assume all doubles are aligned" +#~ msgstr "Byose" + +#, fuzzy +#~ msgid "Pass -assert pure-text to linker" +#~ msgstr "Umwandiko Kuri" + +#, fuzzy +#~ msgid "Do not pass -assert pure-text to linker" +#~ msgstr "OYA Umwandiko Kuri" + +#, fuzzy +#~ msgid "Use flat register window model" +#~ msgstr "Kirambuye Kwiyandikisha Idirishya Urugero" + +#, fuzzy +#~ msgid "Do not use flat register window model" +#~ msgstr "OYA Gukoresha Kirambuye Kwiyandikisha Idirishya Urugero" + +#, fuzzy +#~ msgid "Do not use ABI reserved registers" +#~ msgstr "OYA Gukoresha" + +#, fuzzy +#~ msgid "Use hardware quad fp instructions" +#~ msgstr "Amabwiriza" + +#, fuzzy +#~ msgid "Do not use hardware quad fp instructions" +#~ msgstr "OYA Gukoresha Amabwiriza" + +#, fuzzy +#~ msgid "Compile for v8plus ABI" +#~ msgstr "kugirango" + +#, fuzzy +#~ msgid "Do not compile for v8plus ABI" +#~ msgstr "OYA Gukusanya kugirango" + +#, fuzzy +#~ msgid "Do not utilize Visual Instruction Set" +#~ msgstr "OYA" + +#, fuzzy +#~ msgid "Optimize for Cypress processors" +#~ msgstr "kugirango" + +#, fuzzy +#~ msgid "Optimize for SPARCLite processors" +#~ msgstr "kugirango" + +#, fuzzy +#~ msgid "Optimize for F930 processors" +#~ msgstr "kugirango" + +#, fuzzy +#~ msgid "Optimize for F934 processors" +#~ msgstr "kugirango" + +#, fuzzy +#~ msgid "Optimize for SuperSPARC processors" +#~ msgstr "kugirango" + +#, fuzzy +#~ msgid "Do not use stack bias" +#~ msgstr "OYA Gukoresha" + +#, fuzzy +#~ msgid "Use structs on stronger alignment for double-word copies" +#~ msgstr "ku Itunganya kugirango MAHARAKUBIRI ijambo Amakopi" + +#, fuzzy +#~ msgid "Do not use structs on stronger alignment for double-word copies" +#~ msgstr "OYA Gukoresha ku Itunganya kugirango MAHARAKUBIRI ijambo Amakopi" + +#, fuzzy +#~ msgid "Optimize tail call instructions in assembler and linker" +#~ msgstr "Amabwiriza in Na" + +#, fuzzy +#~ msgid "Do not optimize tail call instructions in assembler or linker" +#~ msgstr "OYA Kugeza ku ndunduro Amabwiriza in Cyangwa" + +#, fuzzy +#~ msgid "Use given SPARC code model" +#~ msgstr "ITEGEKONGENGA Urugero" + +#, fuzzy +#~ msgid "cannot use va_start in interrupt function" +#~ msgstr "Gukoresha in Hagarikira aho Umumaro" + +#, fuzzy +#~ msgid "`B' operand is not constant" +#~ msgstr "`ni OYA" + +#, fuzzy +#~ msgid "`B' operand has multiple bits set" +#~ msgstr "`Igikubo Gushyiraho" + +#, fuzzy +#~ msgid "`o' operand is not constant" +#~ msgstr "`ni OYA" + +#, fuzzy +#~ msgid "xstormy16_print_operand: unknown code" +#~ msgstr "Kitazwi ITEGEKONGENGA" + +#, fuzzy +#~ msgid "switch statement of size %lu entries too large" +#~ msgstr "Hindura Inyandiko Bya Ingano Ibyinjijwe Binini" + +#, fuzzy +#~ msgid "#pragma GHS endXXXX found without previous startXXX" +#~ msgstr "#Byabonetse Ibanjirije" + +#, fuzzy +#~ msgid "#pragma GHS endXXX does not match previous startXXX" +#~ msgstr "#OYA BIHUYE Ibanjirije" + +#, fuzzy +#~ msgid "cannot set interrupt attribute: no current function" +#~ msgstr "Gushyiraho Hagarikira aho Ikiranga Oya KIGEZWEHO Umumaro" + +#, fuzzy +#~ msgid "cannot set interrupt attribute: no such identifier" +#~ msgstr "Gushyiraho Hagarikira aho Ikiranga Oya Ikiranga" + +#, fuzzy +#~ msgid "junk at end of #pragma ghs section" +#~ msgstr "Umwanda ku Impera Bya Icyiciro" + +#, fuzzy +#~ msgid "unrecognized section name \"%s\"" +#~ msgstr "Icyiciro Izina:" + +#, fuzzy +#~ msgid "malformed #pragma ghs section" +#~ msgstr "Icyiciro" + +#, fuzzy +#~ msgid "junk at end of #pragma ghs interrupt" +#~ msgstr "Umwanda ku Impera Bya Hagarikira aho" + +#, fuzzy +#~ msgid "junk at end of #pragma ghs starttda" +#~ msgstr "Umwanda ku Impera Bya" + +#, fuzzy +#~ msgid "junk at end of #pragma ghs startsda" +#~ msgstr "Umwanda ku Impera Bya" + +#, fuzzy +#~ msgid "junk at end of #pragma ghs startzda" +#~ msgstr "Umwanda ku Impera Bya" + +#, fuzzy +#~ msgid "junk at end of #pragma ghs endtda" +#~ msgstr "Umwanda ku Impera Bya" + +#, fuzzy +#~ msgid "junk at end of #pragma ghs endsda" +#~ msgstr "Umwanda ku Impera Bya" + +#, fuzzy +#~ msgid "junk at end of #pragma ghs endzda" +#~ msgstr "Umwanda ku Impera Bya" + +#, fuzzy +#~ msgid "%s=%s is not numeric" +#~ msgstr "%s=%sni OYA Bikurikije umubare" + +#, fuzzy +#~ msgid "%s=%s is too large" +#~ msgstr "%s=%sni Binini" + +#, fuzzy +#~ msgid "const_double_split got a bad insn:" +#~ msgstr "a" + +#, fuzzy +#~ msgid "a data area attribute cannot be specified for local variables" +#~ msgstr "a Ibyatanzwe Ubuso Ikiranga kugirango Ibihinduka" + +#, fuzzy +#~ msgid "data area of '%s' conflicts with previous declaration" +#~ msgstr "Ibyatanzwe Ubuso Bya Na: Ibanjirije" + +#, fuzzy +#~ msgid "bad amount of stack space removal: %d" +#~ msgstr "Igiteranyo Bya Umwanya" + +#, fuzzy +#~ msgid "Too much stack space to dispose of: %d" +#~ msgstr "Umwanya Kuri Bya" + +#, fuzzy +#~ msgid "Too much stack space to prepare: %d" +#~ msgstr "Umwanya Kuri" + +#, fuzzy +#~ msgid "Prohibit PC relative function calls" +#~ msgstr "Bifitanye isano Umumaro Amahamagara:" + +#, fuzzy +#~ msgid "Reuse r30 on a per function basis" +#~ msgstr "ku a Umumaro Ishingiro" + +#, fuzzy +#~ msgid "Use stubs for function prologues" +#~ msgstr "kugirango Umumaro" + +#, fuzzy +#~ msgid "Same as: -mep -mprolog-function" +#~ msgstr "Nka Umumaro" + +#, fuzzy +#~ msgid "Compile for the v850 processor" +#~ msgstr "kugirango i" + +#, fuzzy +#~ msgid "Compile for v850e processor" +#~ msgstr "kugirango" + +#, fuzzy +#~ msgid "Enable the use of the short load instructions" +#~ msgstr "i Gukoresha Bya i Ibirimo Amabwiriza" + +#, fuzzy +#~ msgid "Do not use the callt instruction" +#~ msgstr "OYA Gukoresha i" + +#, fuzzy +#~ msgid "Do not use registers r2 and r5" +#~ msgstr "OYA Gukoresha Na" + +#, fuzzy +#~ msgid "Enforce strict alignment" +#~ msgstr "Itunganya" + +#, fuzzy +#~ msgid "Use 4 byte entries in switch tables" +#~ msgstr "4. Bayite Ibyinjijwe in Hindura Imbonerahamwe" + +#, fuzzy +#~ msgid "Set the max size of data eligible for the TDA area" +#~ msgstr "i KININI Ingano Bya Ibyatanzwe kugirango i Ubuso" + +#, fuzzy +#~ msgid "Set the max size of data eligible for the SDA area" +#~ msgstr "i KININI Ingano Bya Ibyatanzwe kugirango i Ubuso" + +#, fuzzy +#~ msgid "Set the max size of data eligible for the ZDA area" +#~ msgstr "i KININI Ingano Bya Ibyatanzwe kugirango i Ubuso" + +#, fuzzy +#~ msgid "bad test" +#~ msgstr "Igerageza" + +#, fuzzy +#~ msgid "boolean registers required for the floating-point option" +#~ msgstr "Icyungo Bya ngombwa kugirango i Bihindagurika Akadomo Ihitamo" + +#, fuzzy +#~ msgid "invalid mask" +#~ msgstr "Sibyo" + +#, fuzzy +#~ msgid "invalid address" +#~ msgstr "Sibyo Aderesi" + +#, fuzzy +#~ msgid "no register in address" +#~ msgstr "Oya Kwiyandikisha in Aderesi" + +#, fuzzy +#~ msgid "address offset not a constant" +#~ msgstr "Aderesi Nta- boneza OYA a" + +#, fuzzy +#~ msgid "only uninitialized variables can be placed in a .bss section" +#~ msgstr "Itatangijwe Ibihinduka in a Icyiciro" + +#, fuzzy +#~ msgid "Use the Xtensa code density option" +#~ msgstr "i ITEGEKONGENGA Ihitamo" + +#, fuzzy +#~ msgid "Do not use the Xtensa code density option" +#~ msgstr "OYA Gukoresha i ITEGEKONGENGA Ihitamo" + +#, fuzzy +#~ msgid "Use the Xtensa MAC16 option" +#~ msgstr "i Ihitamo" + +#, fuzzy +#~ msgid "Do not use the Xtensa MAC16 option" +#~ msgstr "OYA Gukoresha i Ihitamo" + +#, fuzzy +#~ msgid "Use the Xtensa MUL16 option" +#~ msgstr "i Ihitamo" + +#, fuzzy +#~ msgid "Do not use the Xtensa MUL16 option" +#~ msgstr "OYA Gukoresha i Ihitamo" + +#, fuzzy +#~ msgid "Use the Xtensa MUL32 option" +#~ msgstr "i Ihitamo" + +#, fuzzy +#~ msgid "Do not use the Xtensa MUL32 option" +#~ msgstr "OYA Gukoresha i Ihitamo" + +#, fuzzy +#~ msgid "Use the Xtensa NSA option" +#~ msgstr "i Ihitamo" + +#, fuzzy +#~ msgid "Do not use the Xtensa NSA option" +#~ msgstr "OYA Gukoresha i Ihitamo" + +#, fuzzy +#~ msgid "Use the Xtensa MIN/MAX option" +#~ msgstr "i Ihitamo" + +#, fuzzy +#~ msgid "Do not use the Xtensa MIN/MAX option" +#~ msgstr "OYA Gukoresha i Ihitamo" + +#, fuzzy +#~ msgid "Use the Xtensa SEXT option" +#~ msgstr "i Ihitamo" + +#, fuzzy +#~ msgid "Do not use the Xtensa SEXT option" +#~ msgstr "OYA Gukoresha i Ihitamo" + +#, fuzzy +#~ msgid "Use the Xtensa boolean register option" +#~ msgstr "i Icyungo Kwiyandikisha Ihitamo" + +#, fuzzy +#~ msgid "Do not use the Xtensa boolean register option" +#~ msgstr "OYA Gukoresha i Icyungo Kwiyandikisha Ihitamo" + +#, fuzzy +#~ msgid "Use the Xtensa floating-point unit" +#~ msgstr "i Bihindagurika Akadomo Igice:" + +#, fuzzy +#~ msgid "Do not use the Xtensa floating-point unit" +#~ msgstr "OYA Gukoresha i Bihindagurika Akadomo Igice:" + +#, fuzzy +#~ msgid "Disable fused multiply/add and multiply/subtract FP instructions" +#~ msgstr "Gukuba Kongeramo Na Gukuba Gukuramo Amabwiriza" + +#, fuzzy +#~ msgid "Enable fused multiply/add and multiply/subtract FP instructions" +#~ msgstr "Gukuba Kongeramo Na Gukuba Gukuramo Amabwiriza" + +#, fuzzy +#~ msgid "Serialize volatile memory references with MEMW instructions" +#~ msgstr "Ububiko Indango Na: Amabwiriza" + +#, fuzzy +#~ msgid "Do not serialize volatile memory references with MEMW instructions" +#~ msgstr "OYA Ububiko Indango Na: Amabwiriza" + +#, fuzzy +#~ msgid "Intersperse literal pools with code in the text section" +#~ msgstr "Na: ITEGEKONGENGA in i Umwandiko Icyiciro" + +#, fuzzy +#~ msgid "Put literal pools in a separate literal section" +#~ msgstr "in a Icyiciro" + +#, fuzzy +#~ msgid "Automatically align branch targets to reduce branch penalties" +#~ msgstr "Gutondeka Kuri" + +#, fuzzy +#~ msgid "Do not automatically align branch targets" +#~ msgstr "OYA ku buryo bwikora Gutondeka" + +#, fuzzy +#~ msgid "Use indirect CALLXn instructions for large programs" +#~ msgstr "BUZIGUYE Amabwiriza kugirango Binini Porogaramu" + +#, fuzzy +#~ msgid "Use direct CALLn instructions for fast calls" +#~ msgstr "Amabwiriza kugirango Byihuta Amahamagara:" + +#, fuzzy +#~ msgid "`-gnat' misspelled as `-gant'" +#~ msgstr "`-Nka" + +#, fuzzy +#~ msgid "qualified type `%T' does not match destructor name `~%T'" +#~ msgstr "Ubwoko OYA BIHUYE Izina:" + +#, fuzzy +#~ msgid "type of `%E' does not match destructor type `%T' (type was `%T')" +#~ msgstr "Ubwoko Bya OYA BIHUYE Ubwoko Ubwoko" + +#, fuzzy +#~ msgid "`%D' is a namespace" +#~ msgstr "`%D'ni a" + +#, fuzzy +#~ msgid "base object `%E' of scoped method call is of non-aggregate type `%T'" +#~ msgstr "SHINGIRO Igikoresho Bya Uburyo ni Bya Ubwoko" + +#, fuzzy +#~ msgid "unable to call pointer to member function here" +#~ msgstr "Kuri Mweretsi Kuri Umumaro" + +#, fuzzy +#~ msgid "destructors take no parameters" +#~ msgstr "Oya Ibigenga" + +#, fuzzy +#~ msgid "destructor name `~%T' does not match type `%T' of expression" +#~ msgstr "Izina: OYA BIHUYE Ubwoko Bya imvugo" + +#, fuzzy +#~ msgid "request for member `%D' in `%E', which is of non-aggregate type `%T'" +#~ msgstr "Kubaza... kugirango in ni Bya Ubwoko" + +#, fuzzy +#~ msgid "request for member `%D' is ambiguous" +#~ msgstr "Kubaza... kugirango ni" + +#, fuzzy +#~ msgid "%s %D(%T, %T, %T) " +#~ msgstr "%s%D(%T,%T,%T)" +#~ msgstr "%s%D(%T,%T)" +#~ msgstr "%s%D(%T)" +#~ msgstr "%s%T*" +#~ msgstr "Mweretsi Kuri Umumaro Igikoresho ikoresha Cyangwa" + +#, fuzzy +#~ msgid "no match for call to `(%T) (%A)'" +#~ msgstr "Oya BIHUYE kugirango Kuri" + +#, fuzzy +#~ msgid "call of `(%T) (%A)' is ambiguous" +#~ msgstr "Bya ni" + +#, fuzzy +#~ msgid "%s for `%T ? %T : %T' operator" +#~ msgstr "%skugirango." + +#, fuzzy +#~ msgid "%s for `%T %s' operator" +#~ msgstr "%skugirango Mukoresha" + +#, fuzzy +#~ msgid "%s for `%T [%T]' operator" +#~ msgstr "%skugirango Mukoresha" + +#, fuzzy +#~ msgid "%s for `%T %s %T' operator" +#~ msgstr "%skugirango Mukoresha" + +#, fuzzy +#~ msgid "%s for `%s %T' operator" +#~ msgstr "%skugirango Mukoresha" + +#, fuzzy +#~ msgid "ISO C++ forbids omitting the middle term of a ?: expression" +#~ msgstr "C i Hagati Ijambo Bya a imvugo" + +#, fuzzy +#~ msgid "`%E' has type `void' and is not a throw-expression" +#~ msgstr "`%E'Ubwoko Na ni OYA a imvugo" + +#, fuzzy +#~ msgid "operands to ?: have different types" +#~ msgstr "Kuri" + +#, fuzzy +#~ msgid "enumeral mismatch in conditional expression: `%T' vs `%T'" +#~ msgstr "in imvugo" + +#, fuzzy +#~ msgid "enumeral and non-enumeral type in conditional expression" +#~ msgstr "Na Ubwoko in imvugo" + +#, fuzzy +#~ msgid "`%D' must be declared before use" +#~ msgstr "`%D'Mbere Gukoresha" + +#, fuzzy +#~ msgid "no `%D(int)' declared for postfix `%s', trying prefix operator instead" +#~ msgstr "Oya INT kugirango Imbanziriza Mukoresha" + +#, fuzzy +#~ msgid "using synthesized `%#D' for copy assignment" +#~ msgstr "ikoresha kugirango Gukoporora Igenera" + +#, fuzzy +#~ msgid " where cfront would use `%#D'" +#~ msgstr "Gukoresha" + +#, fuzzy +#~ msgid "comparison between `%#T' and `%#T'" +#~ msgstr "hagati Na" + +#, fuzzy +#~ msgid "no suitable `operator delete' for `%T'" +#~ msgstr "Oya Mukoresha kugirango" + +#, fuzzy +#~ msgid "`%+#D' is private" +#~ msgstr "`%+#D'ni By'umwihariko" + +#, fuzzy +#~ msgid "`%+#D' is protected" +#~ msgstr "`%+#D'ni Birinzwe" + +#, fuzzy +#~ msgid "`%+#D' is inaccessible" +#~ msgstr "`%+#D'ni" + +#, fuzzy +#~ msgid "within this context" +#~ msgstr "muri iyi Imvugiro" + +#, fuzzy +#~ msgid "invalid conversion from `%T' to `%T'" +#~ msgstr "Sibyo Ihindurangero Bivuye Kuri" + +#, fuzzy +#~ msgid " initializing argument %P of `%D'" +#~ msgstr "Gutangiza Bya" + +#, fuzzy +#~ msgid " initializing argument %P of `%D' from result of `%D'" +#~ msgstr "Gutangiza Bya Bivuye Igisubizo Bya" + +#, fuzzy +#~ msgid " initializing temporary from result of `%D'" +#~ msgstr "Gutangiza By'igihe gito Bivuye Igisubizo Bya" + +#, fuzzy +#~ msgid "cannot pass objects of non-POD type `%#T' through `...'; call will abort at runtime" +#~ msgstr "Ibintu Bya Ubwoko Gihinguranya Kureka ku" + +#, fuzzy +#~ msgid "cannot receive objects of non-POD type `%#T' through `...'" +#~ msgstr "Akira Ibintu Bya Ubwoko Gihinguranya" + +#, fuzzy +#~ msgid "passing `%T' as `this' argument of `%#D' discards qualifiers" +#~ msgstr "Nka Bya" + +#, fuzzy +#~ msgid "could not find class$ field in java interface type `%T'" +#~ msgstr "OYA Gushaka ishuri Umwanya in java Ubwoko" + +#, fuzzy +#~ msgid "call to non-function `%D'" +#~ msgstr "Kuri Umumaro" + +#, fuzzy +#~ msgid "no matching function for call to `%T::%D(%A)%#V'" +#~ msgstr "Oya Umumaro kugirango Kuri" + +#, fuzzy +#~ msgid "cannot call member function `%D' without object" +#~ msgstr "Umumaro Igikoresho" + +#, fuzzy +#~ msgid "passing `%T' chooses `%T' over `%T'" +#~ msgstr "KURI" + +#, fuzzy +#~ msgid " in call to `%D'" +#~ msgstr "in Kuri" + +#, fuzzy +#~ msgid "choosing `%D' over `%D'" +#~ msgstr "KURI" + +#, fuzzy +#~ msgid " for conversion from `%T' to `%T'" +#~ msgstr "kugirango Ihindurangero Bivuye Kuri" + +#, fuzzy +#~ msgid " because conversion sequence for the argument is better" +#~ msgstr "Ihindurangero kugirango i ni" + +#, fuzzy +#~ msgid "ISO C++ says that `%D' and `%D' are ambiguous even though the worst conversion for the former is better than the worst conversion for the latter" +#~ msgstr "C Na ATARIIGIHARWE i Ihindurangero kugirango i ni i Ihindurangero kugirango i" + +#, fuzzy +#~ msgid "cannot convert from base `%T' to derived type `%T' via virtual base `%T'" +#~ msgstr "GUHINDURA Bivuye SHINGIRO Kuri Ubwoko Biturutse Kitaboneka SHINGIRO" + +#, fuzzy +#~ msgid "`%#D' and `%#D' cannot be overloaded" +#~ msgstr "`%#D'Na" + +#, fuzzy +#~ msgid "duplicate enum value `%D'" +#~ msgstr "Gusubiramo Agaciro" + +#, fuzzy +#~ msgid "duplicate field `%D' (as enum and non-enum)" +#~ msgstr "Gusubiramo Umwanya Nka Na" + +#, fuzzy +#~ msgid "duplicate nested type `%D'" +#~ msgstr "Gusubiramo Ubwoko" + +#, fuzzy +#~ msgid "duplicate field `%D' (as type and non-type)" +#~ msgstr "Gusubiramo Umwanya Nka Ubwoko Na Ubwoko" + +#, fuzzy +#~ msgid "duplicate member `%D'" +#~ msgstr "Gusubiramo" + +#, fuzzy +#~ msgid "conflicting access specifications for method `%D', ignored" +#~ msgstr "kugirango Uburyo" + +#, fuzzy +#~ msgid "conflicting access specifications for field `%s', ignored" +#~ msgstr "kugirango Umwanya" + +#, fuzzy +#~ msgid "`%D' names constructor" +#~ msgstr "`%D'Amazina" + +#, fuzzy +#~ msgid "`%D' invalid in `%T'" +#~ msgstr "`%D'Sibyo in" + +#, fuzzy +#~ msgid "no members matching `%D' in `%#T'" +#~ msgstr "Oya in" + +#, fuzzy +#~ msgid "`%D' invalid in `%#T'" +#~ msgstr "`%D'Sibyo in" + +#, fuzzy +#~ msgid " because of local method `%#D' with same name" +#~ msgstr "Bya Uburyo Na: Izina:" + +#, fuzzy +#~ msgid " because of local member `%#D' with same name" +#~ msgstr "Bya Na: Izina:" + +#, fuzzy +#~ msgid "base class `%#T' has a non-virtual destructor" +#~ msgstr "SHINGIRO ishuri a Kitaboneka" + +#, fuzzy +#~ msgid "base `%T' with only non-default constructor in class without a constructor" +#~ msgstr "SHINGIRO Na: Mburabuzi in ishuri a" + +#, fuzzy +#~ msgid "all member functions in class `%T' are private" +#~ msgstr "Byose Imimaro in ishuri By'umwihariko" + +#, fuzzy +#~ msgid "`%#T' only defines a private destructor and has no friends" +#~ msgstr "`%#T'a By'umwihariko Na Oya" + +#, fuzzy +#~ msgid "`%#T' only defines private constructors and has no friends" +#~ msgstr "`%#T'By'umwihariko Na Oya" + +#, fuzzy +#~ msgid "redefinition of `%#T'" +#~ msgstr "Bya" + +#, fuzzy +#~ msgid "previous definition of `%#T'" +#~ msgstr "Ibanjirije Insobanuro Bya" + +#, fuzzy +#~ msgid "no unique final overrider for `%D' in `%T'" +#~ msgstr "Oya Cyo nyine kugirango in" + +#, fuzzy +#~ msgid "`%D' was hidden" +#~ msgstr "`%D'gihishwe" + +# sc/source\ui\src\globstr.src:RID_GLOBSTR.STR_BY.text +#, fuzzy +#~ msgid " by `%D'" +#~ msgstr "ku" + +#, fuzzy +#~ msgid "ISO C++ forbids member `%D' with same name as enclosing class" +#~ msgstr "C Na: Izina: Nka ishuri" + +#, fuzzy +#~ msgid "`%#D' invalid; an anonymous union can only have non-static data members" +#~ msgstr "`%#D'Sibyo Ihuza Ibyatanzwe" + +#, fuzzy +#~ msgid "private member `%#D' in anonymous union" +#~ msgstr "By'umwihariko in Ihuza" + +#, fuzzy +#~ msgid "protected member `%#D' in anonymous union" +#~ msgstr "Birinzwe in Ihuza" + +#, fuzzy +#~ msgid "vtable layout for class `%T' may not be ABI-compliant and may change in a future version of GCC due to implicit virtual destructor" +#~ msgstr "Imigaragarire kugirango ishuri Gicurasi OYA Na Gicurasi Guhindura>> in a Verisiyo Bya Kuri Kitaboneka" + +#, fuzzy +#~ msgid "bit-field `%#D' with non-integral type" +#~ msgstr "Umwanya Na: Umubare Wuzuye Ubwoko" + +#, fuzzy +#~ msgid "bit-field `%D' width not an integer constant" +#~ msgstr "Umwanya Ubugari OYA Umubare wuzuye" + +#, fuzzy +#~ msgid "negative width in bit-field `%D'" +#~ msgstr "Ubugari in Umwanya" + +#, fuzzy +#~ msgid "zero width for bit-field `%D'" +#~ msgstr "Zeru Ubugari kugirango Umwanya" + +#, fuzzy +#~ msgid "width of `%D' exceeds its type" +#~ msgstr "Ubugari Bya Ubwoko" + +#, fuzzy +#~ msgid "`%D' is too small to hold all values of `%#T'" +#~ msgstr "`%D'ni Gitoya Kuri Byose Uduciro Bya" + +#, fuzzy +#~ msgid "member `%#D' with constructor not allowed in union" +#~ msgstr "Na: OYA in Ihuza" + +#, fuzzy +#~ msgid "member `%#D' with destructor not allowed in union" +#~ msgstr "Na: OYA in Ihuza" + +#, fuzzy +#~ msgid "member `%#D' with copy assignment operator not allowed in union" +#~ msgstr "Na: Gukoporora Igenera Mukoresha OYA in Ihuza" + +#, fuzzy +#~ msgid "multiple fields in union `%T' initialized" +#~ msgstr "Igikubo Imyanya in Ihuza" + +#, fuzzy +#~ msgid "field `%D' in local class cannot be static" +#~ msgstr "Umwanya in ishuri" + +#, fuzzy +#~ msgid "field `%D' invalidly declared function type" +#~ msgstr "Umwanya Umumaro Ubwoko" + +#, fuzzy +#~ msgid "field `%D' invalidly declared method type" +#~ msgstr "Umwanya Uburyo Ubwoko" + +#, fuzzy +#~ msgid "field `%D' invalidly declared offset type" +#~ msgstr "Umwanya Nta- boneza Ubwoko" + +#, fuzzy +#~ msgid "field `%D' declared static in union" +#~ msgstr "Umwanya in Ihuza" + +#, fuzzy +#~ msgid "non-static reference `%#D' in class without a constructor" +#~ msgstr "Indango in ishuri a" + +#, fuzzy +#~ msgid "non-static const member `%#D' in class without a constructor" +#~ msgstr "in ishuri a" + +#, fuzzy +#~ msgid "field `%#D' with same name as class" +#~ msgstr "Umwanya Na: Izina: Nka ishuri" + +#, fuzzy +#~ msgid "`%#T' has pointer data members" +#~ msgstr "`%#T'Mweretsi Ibyatanzwe" + +#, fuzzy +#~ msgid " but does not override `%T(const %T&)'" +#~ msgstr "OYA" + +#, fuzzy +#~ msgid " or `operator=(const %T&)'" +#~ msgstr "Cyangwa Mukoresha" + +#, fuzzy +#~ msgid " but does not override `operator=(const %T&)'" +#~ msgstr "OYA Mukoresha" + +#, fuzzy +#~ msgid "offset of empty base `%T' may not be ABI-compliant and maychange in a future version of GCC" +#~ msgstr "Nta- boneza Bya ubusa SHINGIRO Gicurasi OYA Na in a Verisiyo Bya" + +#, fuzzy +#~ msgid "class `%T' will be considered nearly empty in a future version of GCC" +#~ msgstr "ishuri ubusa in a Verisiyo Bya" + +#, fuzzy +#~ msgid "initializer specified for non-virtual method `%D'" +#~ msgstr "kugirango Kitaboneka Uburyo" + +#, fuzzy +#~ msgid "offset of virtual base `%T' is not ABI-compliant and may change in a future version of GCC" +#~ msgstr "Nta- boneza Bya Kitaboneka SHINGIRO ni OYA Na Gicurasi Guhindura>> in a Verisiyo Bya" + +#, fuzzy +#~ msgid "direct base `%T' inaccessible in `%T' due to ambiguity" +#~ msgstr "SHINGIRO in Kuri" + +#, fuzzy +#~ msgid "virtual base `%T' inaccessible in `%T' due to ambiguity" +#~ msgstr "Kitaboneka SHINGIRO in Kuri" + +#, fuzzy +#~ msgid "size assigned to `%T' may not be ABI-compliant and may change in a future version of GCC" +#~ msgstr "Ingano Kuri Gicurasi OYA Na Gicurasi Guhindura>> in a Verisiyo Bya" + +#, fuzzy +#~ msgid "offset of `%D' is not ABI-compliant and may change in a future version of GCC" +#~ msgstr "Nta- boneza Bya ni OYA Na Gicurasi Guhindura>> in a Verisiyo Bya" + +#, fuzzy +#~ msgid "`%D' contains empty classes which may cause base classes to be placed at different locations in a future version of GCC" +#~ msgstr "`%D'Kirimo ubusa Inzego Gicurasi SHINGIRO Inzego Kuri ku in a Verisiyo Bya" + +#, fuzzy +#~ msgid "layout of classes derived from empty class `%T' may change in a future version of GCC" +#~ msgstr "Imigaragarire Bya Inzego Bivuye ubusa ishuri Gicurasi Guhindura>> in a Verisiyo Bya" + +#, fuzzy +#~ msgid "`%#T' has virtual functions but non-virtual destructor" +#~ msgstr "`%#T'Kitaboneka Imimaro Kitaboneka" + +#, fuzzy +#~ msgid "trying to finish struct, but kicked out due to previous parse errors" +#~ msgstr "Kuri Kurangiza Inyuma Kuri Ibanjirije Amakosa" + +#, fuzzy +#~ msgid "language string `\"%s\"' not recognized" +#~ msgstr "Ururimi Ikurikiranyanyuguti OYA" + +#, fuzzy +#~ msgid "cannot resolve overloaded function `%D' based on conversion to type `%T'" +#~ msgstr "Umumaro ku Ihindurangero Kuri Ubwoko" + +#, fuzzy +#~ msgid "no matches converting function `%D' to type `%#T'" +#~ msgstr "Oya Guhindura.... Umumaro Kuri Ubwoko" + +#, fuzzy +#~ msgid "converting overloaded function `%D' to type `%#T' is ambiguous" +#~ msgstr "Guhindura.... Umumaro Kuri Ubwoko ni" + +#, fuzzy +#~ msgid "assuming pointer to member `%D'" +#~ msgstr "Mweretsi Kuri" + +#, fuzzy +#~ msgid "(a pointer to member can only be formed with `&%E')" +#~ msgstr "(a Mweretsi Kuri Na:" + +#, fuzzy +#~ msgid "not enough type information" +#~ msgstr "OYA Ubwoko Ibisobanuro" + +#, fuzzy +#~ msgid "argument of type `%T' does not match `%T'" +#~ msgstr "Bya Ubwoko OYA BIHUYE" + +#, fuzzy +#~ msgid "invalid operation on uninstantiated type" +#~ msgstr "Sibyo ku Ubwoko" + +#, fuzzy +#~ msgid "declaration of `%#D'" +#~ msgstr "Bya" + +#, fuzzy +#~ msgid "changes meaning of `%D' from `%+#D'" +#~ msgstr "Amahinduka Igisobanuro Bya Bivuye" + +#, fuzzy +#~ msgid "can't convert from incomplete type `%T' to `%T'" +#~ msgstr "GUHINDURA Bivuye Ubwoko Kuri" + +#, fuzzy +#~ msgid "conversion of `%E' from `%T' to `%T' is ambiguous" +#~ msgstr "Ihindurangero Bya Bivuye Kuri ni" + +#, fuzzy +#~ msgid "converting from `%T' to `%T'" +#~ msgstr "Guhindura.... Bivuye Kuri" + +#, fuzzy +#~ msgid "pointer to member cast from `%T' to `%T' is via virtual base" +#~ msgstr "Mweretsi Kuri Bivuye Kuri ni Biturutse Kitaboneka SHINGIRO" + +#, fuzzy +#~ msgid "cannot convert `%E' from type `%T' to type `%T'" +#~ msgstr "GUHINDURA Bivuye Ubwoko Kuri Ubwoko" + +#, fuzzy +#~ msgid "invalid conversion from '%T' to '%T'" +#~ msgstr "Sibyo Ihindurangero Bivuye Kuri" + +#, fuzzy +#~ msgid "conversion from `%T' to `%T' discards qualifiers" +#~ msgstr "Ihindurangero Bivuye Kuri" + +#, fuzzy +#~ msgid "casting `%T' to `%T' does not dereference pointer" +#~ msgstr "Kuri OYA Mweretsi" + +#, fuzzy +#~ msgid "cannot convert type `%T' to type `%T'" +#~ msgstr "GUHINDURA Ubwoko Kuri Ubwoko" + +#, fuzzy +#~ msgid "conversion from `%#T' to `%#T'" +#~ msgstr "Ihindurangero Bivuye Kuri" + +#, fuzzy +#~ msgid "`%#T' used where a `%T' was expected" +#~ msgstr "`%#T'a Ikitezwe:" + +#, fuzzy +#~ msgid "the address of `%D', will always be `true'" +#~ msgstr "i Aderesi Bya Buri gihe" + +#, fuzzy +#~ msgid "`%#T' used where a floating point value was expected" +#~ msgstr "`%#T'a Bihindagurika Akadomo Agaciro Ikitezwe:" + +#, fuzzy +#~ msgid "conversion from `%T' to non-scalar type `%T' requested" +#~ msgstr "Ihindurangero Bivuye Kuri Ubwoko" + +#, fuzzy +#~ msgid "object of incomplete type `%T' will not be accessed in %s" +#~ msgstr "Igikoresho Bya Ubwoko OYA birabonetse in" + +#, fuzzy +#~ msgid "object of type `%T' will not be accessed in %s" +#~ msgstr "Igikoresho Bya Ubwoko OYA birabonetse in" + +#, fuzzy +#~ msgid "object `%E' of incomplete type `%T' will not be accessed in %s" +#~ msgstr "Igikoresho Bya Ubwoko OYA birabonetse in" + +#, fuzzy +#~ msgid "%s cannot resolve address of overloaded function" +#~ msgstr "%sAderesi Bya Umumaro" + +#, fuzzy +#~ msgid "%s is a reference, not call, to function `%E'" +#~ msgstr "%sni a Indango OYA Kuri Umumaro" + +#, fuzzy +#~ msgid "ambiguous default type conversion from `%T'" +#~ msgstr "Mburabuzi Ubwoko Ihindurangero Bivuye" + +#, fuzzy +#~ msgid " candidate conversions include `%D' and `%D'" +#~ msgstr "Gushyiramo Na" + +#, fuzzy +#~ msgid "conflicts with previous declaration `%#D'" +#~ msgstr "Na: Ibanjirije" + +#, fuzzy +#~ msgid "label `%D' used but not defined" +#~ msgstr "Akarango OYA" + +#, fuzzy +#~ msgid "label `%D' defined but not used" +#~ msgstr "Akarango OYA" + +#, fuzzy +#~ msgid "namespace alias `%D' not allowed here, assuming `%D'" +#~ msgstr "Irihimbano OYA" + +#, fuzzy +#~ msgid "previous declaration of `%D'" +#~ msgstr "Ibanjirije Bya" + +#, fuzzy +#~ msgid "shadowing %s function `%#D'" +#~ msgstr "Ishyiraho ry'igicucu Umumaro" + +#, fuzzy +#~ msgid "library function `%#D' redeclared as non-function `%#D'" +#~ msgstr "Isomero Umumaro Nka Umumaro" + +#, fuzzy +#~ msgid "conflicts with built-in declaration `%#D'" +#~ msgstr "Na: in" + +#, fuzzy +#~ msgid "new declaration `%#D'" +#~ msgstr "Gishya" + +#, fuzzy +#~ msgid "ambiguates built-in declaration `%#D'" +#~ msgstr "in" + +#, fuzzy +#~ msgid "`%#D' redeclared as different kind of symbol" +#~ msgstr "`%#D'Nka Bya IKIMENYETSO" + +#, fuzzy +#~ msgid "previous declaration of `%#D'" +#~ msgstr "Ibanjirije Bya" + +#, fuzzy +#~ msgid "declaration of template `%#D'" +#~ msgstr "Bya Inyandikorugero" + +#, fuzzy +#~ msgid "ambiguates old declaration `%#D'" +#~ msgstr "ki/ bishaje" + +#, fuzzy +#~ msgid "declaration of C function `%#D' conflicts with" +#~ msgstr "Bya C Umumaro Na:" + +#, fuzzy +#~ msgid "previous declaration `%#D' here" +#~ msgstr "Ibanjirije" + +#, fuzzy +#~ msgid "conflicting types for `%#D'" +#~ msgstr "kugirango" + +#, fuzzy +#~ msgid "previous declaration as `%#D'" +#~ msgstr "Ibanjirije Nka" + +#, fuzzy +#~ msgid "prototype for `%#D'" +#~ msgstr "kugirango" + +#, fuzzy +#~ msgid "follows non-prototype definition here" +#~ msgstr "Insobanuro" + +#, fuzzy +#~ msgid "previous declaration of `%#D' with %L linkage" +#~ msgstr "Ibanjirije Bya Na:" + +#, fuzzy +#~ msgid "conflicts with new declaration with %L linkage" +#~ msgstr "Na: Gishya Na:" + +#, fuzzy +#~ msgid "default argument given for parameter %d of `%#D'" +#~ msgstr "Mburabuzi kugirango Bya" + +#, fuzzy +#~ msgid "after previous specification in `%#D'" +#~ msgstr "Nyuma Ibanjirije in" + +#, fuzzy +#~ msgid "`%#D' was used before it was declared inline" +#~ msgstr "`%#D'Mbere Mumurongo" + +#, fuzzy +#~ msgid "previous non-inline declaration here" +#~ msgstr "Ibanjirije Mumurongo" + +#, fuzzy +#~ msgid "redundant redeclaration of `%D' in same scope" +#~ msgstr "Bya in Ingano:" + +#, fuzzy +#~ msgid "declaration of `%F' throws different exceptions" +#~ msgstr "Bya Amarengayobora" + +#, fuzzy +#~ msgid "than previous declaration `%F'" +#~ msgstr "Ibanjirije" + +#, fuzzy +#~ msgid "explicit specialization of %D after first use" +#~ msgstr "Bya Nyuma Itangira Gukoresha" + +#, fuzzy +#~ msgid "`%#D' used prior to declaration" +#~ msgstr "`%#D'Kuri" + +#, fuzzy +#~ msgid "redeclaration of `wchar_t' as `%T'" +#~ msgstr "Bya Nka" + +#, fuzzy +#~ msgid "invalid redeclaration of `%D'" +#~ msgstr "Sibyo Bya" + +# svx/source\dialog\backgrnd.src:RID_SVXPAGE_BACKGROUND.FT_SELECTOR.text +#, fuzzy +#~ msgid "as `%D'" +#~ msgstr "Nka" + +#, fuzzy +#~ msgid "previous external decl of `%#D'" +#~ msgstr "Ibanjirije external Bya" + +#, fuzzy +#~ msgid "`%D' was previously implicitly declared to return `int'" +#~ msgstr "`%D'Kuri Garuka" + +#, fuzzy +#~ msgid "extern declaration of `%#D' doesn't match" +#~ msgstr "Bya BIHUYE" + +#, fuzzy +#~ msgid "declaration of `%#D' shadows a parameter" +#~ msgstr "Bya a" + +#, fuzzy +#~ msgid "declaration of `%s' shadows a member of `this'" +#~ msgstr "Bya a Bya" + +#, fuzzy +#~ msgid "`%#D' hides constructor for `%#T'" +#~ msgstr "`%#D'kugirango" + +#, fuzzy +#~ msgid "`%#D' conflicts with previous using declaration `%#D'" +#~ msgstr "`%#D'Na: Ibanjirije ikoresha" + +#, fuzzy +#~ msgid "previous non-function declaration `%#D'" +#~ msgstr "Ibanjirije Umumaro" + +#, fuzzy +#~ msgid "conflicts with function declaration `%#D'" +#~ msgstr "Na: Umumaro" + +#, fuzzy +#~ msgid "implicit declaration of function `%#D'" +#~ msgstr "Bya Umumaro" + +#, fuzzy +#~ msgid "label `%s' referenced outside of any function" +#~ msgstr "Akarango Hanze Bya Umumaro" + +#, fuzzy +#~ msgid "jump to label `%D'" +#~ msgstr "Simbuka Kuri Akarango" + +#, fuzzy +#~ msgid "jump to case label" +#~ msgstr "Simbuka Kuri Akarango" + +#, fuzzy +#~ msgid " crosses initialization of `%#D'" +#~ msgstr "Bya" + +#, fuzzy +#~ msgid " enters scope of non-POD `%#D'" +#~ msgstr "Ingano: Bya" + +#, fuzzy +#~ msgid " enters try block" +#~ msgstr "Funga" + +#, fuzzy +#~ msgid " enters catch block" +#~ msgstr "Funga" + +#, fuzzy +#~ msgid " from here" +#~ msgstr "Bivuye" + +#, fuzzy +#~ msgid " skips initialization of `%#D'" +#~ msgstr "Bya" + +#, fuzzy +#~ msgid "label named wchar_t" +#~ msgstr "Akarango" + +#, fuzzy +#~ msgid "duplicate label `%D'" +#~ msgstr "Gusubiramo Akarango" + +#, fuzzy +#~ msgid "case label `%E' not within a switch statement" +#~ msgstr "Akarango OYA muri a Hindura Inyandiko" + +#, fuzzy +#~ msgid "`%#D' redeclared as %C" +#~ msgstr "`%#D'Nka" + +#, fuzzy +#~ msgid "invalid use of `%D'" +#~ msgstr "Sibyo Gukoresha Bya" + +#, fuzzy +#~ msgid "`%D::%D' is not a template" +#~ msgstr "`%D::%D'ni OYA a Inyandikorugero" + +#, fuzzy +#~ msgid "`%D' undeclared in namespace `%D'" +#~ msgstr "`%D'in" + +#, fuzzy +#~ msgid "`%D' used without template parameters" +#~ msgstr "`%D'Inyandikorugero Ibigenga" + +#, fuzzy +#~ msgid "no class template named `%#T' in `%#T'" +#~ msgstr "Oya ishuri Inyandikorugero in" + +#, fuzzy +#~ msgid "no type named `%#T' in `%#T'" +#~ msgstr "Oya Ubwoko in" + +#, fuzzy +#~ msgid "lookup of `%D' finds `%#D'" +#~ msgstr "GUSHAKISHA Bya" + +#, fuzzy +#~ msgid " instead of `%D' from dependent base class" +#~ msgstr "Bya Bivuye SHINGIRO ishuri" + +#, fuzzy +#~ msgid " (use `typename %T::%D' if that's what you meant)" +#~ msgstr "(Gukoresha NIBA" + +#, fuzzy +#~ msgid "name lookup of `%D' changed" +#~ msgstr "Izina: GUSHAKISHA Bya Byahinduwe" + +#, fuzzy +#~ msgid " matches this `%D' under ISO standard rules" +#~ msgstr "iyi Bisanzwe" + +#, fuzzy +#~ msgid " matches this `%D' under old rules" +#~ msgstr "iyi ki/ bishaje" + +#, fuzzy +#~ msgid "name lookup of `%D' changed for new ISO `for' scoping" +#~ msgstr "Izina: GUSHAKISHA Bya Byahinduwe kugirango Gishya" + +#, fuzzy +#~ msgid " cannot use obsolete binding at `%D' because it has a destructor" +#~ msgstr "Gukoresha Bifatanya ku a" + +#, fuzzy +#~ msgid " using obsolete binding at `%D'" +#~ msgstr "ikoresha Bifatanya ku" + +#, fuzzy +#~ msgid "lookup of `%D' in the scope of `%#T' (`%#D') does not match lookup in the current scope (`%#D')" +#~ msgstr "GUSHAKISHA Bya in i Ingano: Bya OYA BIHUYE GUSHAKISHA in i KIGEZWEHO Ingano:" + +#, fuzzy +#~ msgid "an anonymous union cannot have function members" +#~ msgstr "Ihuza Umumaro" + +#, fuzzy +#~ msgid "member %#D' with constructor not allowed in anonymous aggregate" +#~ msgstr "Na: OYA in" + +#, fuzzy +#~ msgid "member %#D' with destructor not allowed in anonymous aggregate" +#~ msgstr "Na: OYA in" + +#, fuzzy +#~ msgid "member %#D' with copy assignment operator not allowed in anonymous aggregate" +#~ msgstr "Na: Gukoporora Igenera Mukoresha OYA in" + +#, fuzzy +#~ msgid "redeclaration of C++ built-in type `%T'" +#~ msgstr "Bya C in Ubwoko" + +#, fuzzy +#~ msgid "multiple types in one declaration" +#~ msgstr "Igikubo in" + +#, fuzzy +#~ msgid "missing type-name in typedef-declaration" +#~ msgstr "Ibuze Ubwoko Izina: in" + +#, fuzzy +#~ msgid "ISO C++ prohibits anonymous structs" +#~ msgstr "C" + +#, fuzzy +#~ msgid "`%D' can only be specified for functions" +#~ msgstr "`%D'kugirango Imimaro" + +#, fuzzy +#~ msgid "`%D' can only be specified inside a class" +#~ msgstr "`%D'Mo Imbere a ishuri" + +#, fuzzy +#~ msgid "`%D' can only be specified for constructors" +#~ msgstr "`%D'kugirango" + +#, fuzzy +#~ msgid "`%D' can only be specified for objects and functions" +#~ msgstr "`%D'kugirango Ibintu Na Imimaro" + +#, fuzzy +#~ msgid "typedef `%D' is initialized (use __typeof__ instead)" +#~ msgstr "ni Gukoresha" + +#, fuzzy +#~ msgid "function `%#D' is initialized like a variable" +#~ msgstr "Umumaro ni nka a IMPINDURAGACIRO" + +#, fuzzy +#~ msgid "declaration of `%#D' has `extern' and is initialized" +#~ msgstr "Bya Na ni" + +#, fuzzy +#~ msgid "`%#D' is not a static member of `%#T'" +#~ msgstr "`%#D'ni OYA a Bya" + +#, fuzzy +#~ msgid "ISO C++ does not permit `%T::%D' to be defined as `%T::%D'" +#~ msgstr "C OYA Kuri Nka" + +#, fuzzy +#~ msgid "duplicate initialization of %D" +#~ msgstr "Gusubiramo Bya" + +#, fuzzy +#~ msgid "declaration of `%#D' outside of class is not definition" +#~ msgstr "Bya Hanze Bya ishuri ni OYA Insobanuro" + +#, fuzzy +#~ msgid "variable `%#D' has initializer but incomplete type" +#~ msgstr "IMPINDURAGACIRO Ubwoko" + +#, fuzzy +#~ msgid "elements of array `%#D' have incomplete type" +#~ msgstr "Ibintu Bya Imbonerahamwe Ubwoko" + +#, fuzzy +#~ msgid "aggregate `%#D' has incomplete type and cannot be defined" +#~ msgstr "Ubwoko Na" + +#, fuzzy +#~ msgid "`%D' declared as reference but not initialized" +#~ msgstr "`%D'Nka Indango OYA" + +#, fuzzy +#~ msgid "ISO C++ forbids use of initializer list to initialize reference `%D'" +#~ msgstr "C Gukoresha Bya Urutonde Kuri gutangiza Indango" + +#, fuzzy +#~ msgid "cannot initialize `%T' from `%T'" +#~ msgstr "gutangiza Bivuye" + +#, fuzzy +#~ msgid "initializer fails to determine size of `%D'" +#~ msgstr "Kuri Ingano Bya" + +#, fuzzy +#~ msgid "array size missing in `%D'" +#~ msgstr "Imbonerahamwe Ingano Ibuze in" + +#, fuzzy +#~ msgid "zero-size array `%D'" +#~ msgstr "Zeru Ingano Imbonerahamwe" + +#, fuzzy +#~ msgid "storage size of `%D' isn't known" +#~ msgstr "Ingano Bya si" + +#, fuzzy +#~ msgid "storage size of `%D' isn't constant" +#~ msgstr "Ingano Bya si" + +#, fuzzy +#~ msgid "sorry: semantics of inline function static data `%#D' are wrong (you'll wind up with multiple copies)" +#~ msgstr "Bya Mumurongo Umumaro Ibyatanzwe Hejuru Na: Igikubo Amakopi" + +#, fuzzy +#~ msgid " you can work around this by removing the initializer" +#~ msgstr "Akazi iyi ku i" + +#, fuzzy +#~ msgid "uninitialized const `%D'" +#~ msgstr "Itatangijwe" + +#, fuzzy +#~ msgid "brace-enclosed initializer used to initialize `%T'" +#~ msgstr "Kuri gutangiza" + +#, fuzzy +#~ msgid "initializer for `%T' must be brace-enclosed" +#~ msgstr "kugirango" + +#, fuzzy +#~ msgid "ISO C++ does not allow designated initializers" +#~ msgstr "C OYA Kwemerera" + +#, fuzzy +#~ msgid "`%T' has no non-static data member named `%D'" +#~ msgstr "`%T'Oya Ibyatanzwe" + +#, fuzzy +#~ msgid "too many initializers for `%T'" +#~ msgstr "kugirango" + +#, fuzzy +#~ msgid "variable-sized object `%D' may not be initialized" +#~ msgstr "IMPINDURAGACIRO Igikoresho Gicurasi OYA" + +#, fuzzy +#~ msgid "`%D' has incomplete type" +#~ msgstr "`%D'Ubwoko" + +#, fuzzy +#~ msgid "`%D' must be initialized by constructor, not by `{...}'" +#~ msgstr "`%D'ku OYA ku" + +#, fuzzy +#~ msgid "structure `%D' with uninitialized const members" +#~ msgstr "Imiterere Na: Itatangijwe" + +#, fuzzy +#~ msgid "structure `%D' with uninitialized reference members" +#~ msgstr "Imiterere Na: Itatangijwe Indango" + +#, fuzzy +#~ msgid "assignment (not initialization) in declaration" +#~ msgstr "Igenera OYA in" + +#, fuzzy +#~ msgid "cannot initialize `%D' to namespace `%D'" +#~ msgstr "gutangiza Kuri" + +#, fuzzy +#~ msgid "shadowing previous type declaration of `%#D'" +#~ msgstr "Ishyiraho ry'igicucu Ibanjirije Ubwoko Bya" + +#, fuzzy +#~ msgid "`%D' cannot be thread-local because it has non-POD type `%T'" +#~ msgstr "`%D'Urudodo Ubwoko" + +#, fuzzy +#~ msgid "`%D' is thread-local and so cannot be dynamically initialized" +#~ msgstr "`%D'ni Urudodo Na" + +#, fuzzy +#~ msgid "multiple initializations given for `%D'" +#~ msgstr "Igikubo kugirango" + +#, fuzzy +#~ msgid "invalid catch parameter" +#~ msgstr "Sibyo" + +#, fuzzy +#~ msgid "destructor for alien class `%T' cannot be a member" +#~ msgstr "kugirango ishuri a" + +#, fuzzy +#~ msgid "constructor for alien class `%T' cannot be a member" +#~ msgstr "kugirango ishuri a" + +#, fuzzy +#~ msgid "`%D' declared as a `virtual' %s" +#~ msgstr "`%D'Nka a" + +#, fuzzy +#~ msgid "`%D' declared as an `inline' %s" +#~ msgstr "`%D'Nka" + +#, fuzzy +#~ msgid "`const' and `volatile' function specifiers on `%D' invalid in %s declaration" +#~ msgstr "`Na Umumaro ku Sibyo in" + +#, fuzzy +#~ msgid "`%D' declared as a friend" +#~ msgstr "`%D'Nka a" + +#, fuzzy +#~ msgid "`%D' declared with an exception specification" +#~ msgstr "`%D'Na: Irengayobora(-)" + +#, fuzzy +#~ msgid "cannot declare `::main' to be a template" +#~ msgstr "Kuri a Inyandikorugero" + +#, fuzzy +#~ msgid "cannot declare `::main' to be inline" +#~ msgstr "Kuri Mumurongo" + +#, fuzzy +#~ msgid "cannot declare `::main' to be static" +#~ msgstr "Kuri" + +#, fuzzy +#~ msgid "`main' must return `int'" +#~ msgstr "`Garuka" + +#, fuzzy +#~ msgid "non-local function `%#D' uses anonymous type" +#~ msgstr "Umumaro Ubwoko" + +#, fuzzy +#~ msgid "`%#D' does not refer to the unqualified type, so it is not used for linkage" +#~ msgstr "`%#D'OYA Kuri i Ubwoko ni OYA kugirango" + +#, fuzzy +#~ msgid "non-local function `%#D' uses local type `%T'" +#~ msgstr "Umumaro Ubwoko" + +#, fuzzy +#~ msgid "%smember function `%D' cannot have `%T' method qualifier" +#~ msgstr "%smemberUmumaro Uburyo" + +#, fuzzy +#~ msgid "defining explicit specialization `%D' in friend declaration" +#~ msgstr "in" + +#, fuzzy +#~ msgid "invalid use of template-id `%D' in declaration of primary template" +#~ msgstr "Sibyo Gukoresha Bya Inyandikorugero ID in Bya Inyandikorugero" + +#, fuzzy +#~ msgid "default arguments are not allowed in declaration of friend template specialization `%D'" +#~ msgstr "Mburabuzi ingingo OYA in Bya Inyandikorugero" + +#, fuzzy +#~ msgid "`inline' is not allowed in declaration of friend template specialization `%D'" +#~ msgstr "`ni OYA in Bya Inyandikorugero" + +#, fuzzy +#~ msgid "definition of implicitly-declared `%D'" +#~ msgstr "Insobanuro Bya" + +#, fuzzy +#~ msgid "no `%#D' member function declared in class `%T'" +#~ msgstr "Oya Umumaro in ishuri" + +#, fuzzy +#~ msgid "non-local variable `%#D' uses local type `%T'" +#~ msgstr "IMPINDURAGACIRO Ubwoko" + +#, fuzzy +#~ msgid "invalid in-class initialization of static data member of non-integral type `%T'" +#~ msgstr "Sibyo in ishuri Bya Ibyatanzwe Bya Umubare Wuzuye Ubwoko" + +#, fuzzy +#~ msgid "ISO C++ forbids in-class initialization of non-const static member `%D'" +#~ msgstr "C in ishuri Bya" + +#, fuzzy +#~ msgid "ISO C++ forbids initialization of member constant `%D' of non-integral type `%T'" +#~ msgstr "C Bya Bya Umubare Wuzuye Ubwoko" + +#, fuzzy +#~ msgid "size of array `%D' has non-integer type" +#~ msgstr "Ingano Bya Imbonerahamwe Umubare wuzuye Ubwoko" + +#, fuzzy +#~ msgid "size of array has non-integer type" +#~ msgstr "Ingano Bya Imbonerahamwe Umubare wuzuye Ubwoko" + +#, fuzzy +#~ msgid "size of array `%D' is negative" +#~ msgstr "Ingano Bya Imbonerahamwe ni" + +#, fuzzy +#~ msgid "size of array is negative" +#~ msgstr "Ingano Bya Imbonerahamwe ni" + +#, fuzzy +#~ msgid "ISO C++ forbids zero-size array `%D'" +#~ msgstr "C Zeru Ingano Imbonerahamwe" + +#, fuzzy +#~ msgid "ISO C++ forbids zero-size array" +#~ msgstr "C Zeru Ingano Imbonerahamwe" + +#, fuzzy +#~ msgid "size of array `%D' is not an integral constant-expression" +#~ msgstr "Ingano Bya Imbonerahamwe ni OYA Umubare Wuzuye imvugo" + +#, fuzzy +#~ msgid "size of array is not an integral constant-expression" +#~ msgstr "Ingano Bya Imbonerahamwe ni OYA Umubare Wuzuye imvugo" + +#, fuzzy +#~ msgid "ISO C++ forbids variable-size array `%D'" +#~ msgstr "C IMPINDURAGACIRO Ingano Imbonerahamwe" + +#, fuzzy +#~ msgid "ISO C++ forbids variable-size array" +#~ msgstr "C IMPINDURAGACIRO Ingano Imbonerahamwe" + +#, fuzzy +#~ msgid "overflow in array dimension" +#~ msgstr "Byarenze urugero in Imbonerahamwe" + +#, fuzzy +#~ msgid "declaration of `%D' as %s" +#~ msgstr "Bya Nka" + +#, fuzzy +#~ msgid "declaration of `%D' as multidimensional array must have bounds for all dimensions except the first" +#~ msgstr "Bya Nka Imbonerahamwe kugirango Byose Ingero i Itangira" + +#, fuzzy +#~ msgid "multidimensional array must have bounds for all dimensions except the first" +#~ msgstr "Imbonerahamwe kugirango Byose Ingero i Itangira" + +#, fuzzy +#~ msgid "return type specification for constructor invalid" +#~ msgstr "Garuka Ubwoko kugirango Sibyo" + +#, fuzzy +#~ msgid "return type specification for destructor invalid" +#~ msgstr "Garuka Ubwoko kugirango Sibyo" + +#, fuzzy +#~ msgid "operator `%T' declared to return `%T'" +#~ msgstr "Mukoresha Kuri Garuka" + +#, fuzzy +#~ msgid "return type specified for `operator %T'" +#~ msgstr "Garuka Ubwoko kugirango Mukoresha" + +#, fuzzy +#~ msgid "destructors must be member functions" +#~ msgstr "Imimaro" + +#, fuzzy +#~ msgid "destructor `%T' must match class name `%T'" +#~ msgstr "BIHUYE ishuri Izina:" + +#, fuzzy +#~ msgid "variable declaration is not allowed here" +#~ msgstr "IMPINDURAGACIRO ni OYA" + +#, fuzzy +#~ msgid "invalid declarator" +#~ msgstr "Sibyo" + +#, fuzzy +#~ msgid "declarator-id missing; using reserved word `%D'" +#~ msgstr "ID Ibuze ikoresha ijambo" + +#, fuzzy +#~ msgid "type `%T' is not derived from type `%T'" +#~ msgstr "Ubwoko ni OYA Bivuye Ubwoko" + +#, fuzzy +#~ msgid "`%T' specified as declarator-id" +#~ msgstr "`%T'Nka ID" + +#, fuzzy +#~ msgid " perhaps you want `%T' for a constructor" +#~ msgstr "kugirango a" + +#, fuzzy +#~ msgid "invalid use of template-name '%E' in a declarator" +#~ msgstr "Sibyo Gukoresha Bya Inyandikorugero Izina: in a" + +#, fuzzy +#~ msgid "declaration of `%D' as non-function" +#~ msgstr "Bya Nka Umumaro" + +#, fuzzy +#~ msgid "`bool' is now a keyword" +#~ msgstr "`ni NONEAHA a Ijambo- banze" + +#, fuzzy +#~ msgid "multiple declarations `%T' and `%T'" +#~ msgstr "Igikubo Na" + +#, fuzzy +#~ msgid "ISO C++ does not support `long long'" +#~ msgstr "C OYA Gushigikira" + +#, fuzzy +#~ msgid "ISO C++ forbids declaration of `%s' with no type" +#~ msgstr "C Bya Na: Oya Ubwoko" + +#, fuzzy +#~ msgid "`%T' is implicitly a typename" +#~ msgstr "`%T'ni a" + +#, fuzzy +#~ msgid "short, signed or unsigned invalid for `%s'" +#~ msgstr "Cyangwa Bitashizweho umukono Sibyo kugirango" + +#, fuzzy +#~ msgid "long and short specified together for `%s'" +#~ msgstr "Na kugirango" + +#, fuzzy +#~ msgid "signed and unsigned given together for `%s'" +#~ msgstr "Na Bitashizweho umukono kugirango" + +#, fuzzy +#~ msgid "qualifiers are not allowed on declaration of `operator %T'" +#~ msgstr "OYA ku Bya Mukoresha" + +#, fuzzy +#~ msgid "member `%D' cannot be declared both virtual and static" +#~ msgstr "Byombi Kitaboneka Na" + +#, fuzzy +#~ msgid "storage class specifiers invalid in parameter declarations" +#~ msgstr "ishuri Sibyo in" + +#, fuzzy +#~ msgid "typedef declaration invalid in parameter declaration" +#~ msgstr "Sibyo in" + +#, fuzzy +#~ msgid "virtual outside class declaration" +#~ msgstr "Kitaboneka Hanze ishuri" + +#, fuzzy +#~ msgid "storage class specified for %s `%s'" +#~ msgstr "ishuri kugirango" + +#, fuzzy +#~ msgid "storage class specifiers invalid in friend function declarations" +#~ msgstr "ishuri Sibyo in Umumaro" + +#, fuzzy +#~ msgid "destructor cannot be static member function" +#~ msgstr "Umumaro" + +#, fuzzy +#~ msgid "destructors may not be `%s'" +#~ msgstr "Gicurasi OYA" + +#, fuzzy +#~ msgid "constructor cannot be static member function" +#~ msgstr "Umumaro" + +#, fuzzy +#~ msgid "constructors cannot be declared virtual" +#~ msgstr "Kitaboneka" + +#, fuzzy +#~ msgid "constructors may not be `%s'" +#~ msgstr "Gicurasi OYA" + +#, fuzzy +#~ msgid "return value type specifier for constructor ignored" +#~ msgstr "Garuka Agaciro Ubwoko kugirango" + +#, fuzzy +#~ msgid "can't initialize friend function `%s'" +#~ msgstr "gutangiza Umumaro" + +#, fuzzy +#~ msgid "virtual functions cannot be friends" +#~ msgstr "Kitaboneka Imimaro" + +#, fuzzy +#~ msgid "friend declaration not in class definition" +#~ msgstr "OYA in ishuri Insobanuro" + +#, fuzzy +#~ msgid "can't define friend function `%s' in a local class definition" +#~ msgstr "Kugaragaza... Umumaro in a ishuri Insobanuro" + +#, fuzzy +#~ msgid "destructors may not have parameters" +#~ msgstr "Gicurasi OYA Ibigenga" + +#, fuzzy +#~ msgid "cannot declare reference to `%#T'" +#~ msgstr "Indango Kuri" + +#, fuzzy +#~ msgid "cannot declare pointer to `%#T'" +#~ msgstr "Mweretsi Kuri" + +#, fuzzy +#~ msgid "cannot declare pointer to `%#T' member" +#~ msgstr "Mweretsi Kuri" + +#, fuzzy +#~ msgid "extra qualification `%T::' on member `%s' ignored" +#~ msgstr "Birenga ku" + +#, fuzzy +#~ msgid "cannot declare member function `%T::%s' within `%T'" +#~ msgstr "Umumaro muri" + +#, fuzzy +#~ msgid "cannot declare member `%T::%s' within `%T'" +#~ msgstr "muri" + +#, fuzzy +#~ msgid "data member may not have variably modified type `%T'" +#~ msgstr "Ibyatanzwe Gicurasi OYA Byahinduwe Ubwoko" + +#, fuzzy +#~ msgid "parameter may not have variably modified type `%T'" +#~ msgstr "Gicurasi OYA Byahinduwe Ubwoko" + +#, fuzzy +#~ msgid "only declarations of constructors can be `explicit'" +#~ msgstr "Bya" + +#, fuzzy +#~ msgid "non-object member `%s' cannot be declared `mutable'" +#~ msgstr "Igikoresho" + +#, fuzzy +#~ msgid "function `%s' cannot be declared `mutable'" +#~ msgstr "Umumaro" + +#, fuzzy +#~ msgid "template-id `%D' used as a declarator" +#~ msgstr "Inyandikorugero ID Nka a" + +#, fuzzy +#~ msgid "ISO C++ forbids nested type `%D' with same name as enclosing class" +#~ msgstr "C Ubwoko Na: Izina: Nka ishuri" + +#, fuzzy +#~ msgid "typedef name may not be class-qualified" +#~ msgstr "Izina: Gicurasi OYA ishuri" + +#, fuzzy +#~ msgid "invalid type qualifier for non-member function type" +#~ msgstr "Sibyo Ubwoko kugirango Umumaro Ubwoko" + +#, fuzzy +#~ msgid "type qualifiers specified for friend class declaration" +#~ msgstr "Ubwoko kugirango ishuri" + +#, fuzzy +#~ msgid "`inline' specified for friend class declaration" +#~ msgstr "`kugirango ishuri" + +#, fuzzy +#~ msgid "template parameters cannot be friends" +#~ msgstr "Inyandikorugero Ibigenga" + +#, fuzzy +#~ msgid "friend declaration requires class-key, i.e. `friend class %T::%D'" +#~ msgstr "E." + +#, fuzzy +#~ msgid "friend declaration requires class-key, i.e. `friend %#T'" +#~ msgstr "E." + +#, fuzzy +#~ msgid "trying to make class `%T' a friend of global scope" +#~ msgstr "Kuri Ubwoko ishuri a Bya Ingano:" + +#, fuzzy +#~ msgid "invalid qualifiers on non-member function type" +#~ msgstr "Sibyo ku Umumaro Ubwoko" + +#, fuzzy +#~ msgid "abstract declarator `%T' used as declaration" +#~ msgstr "Incamake Nka" + +#, fuzzy +#~ msgid "unnamed variable or field declared void" +#~ msgstr "Kitiswe IMPINDURAGACIRO Cyangwa Umwanya" + +#, fuzzy +#~ msgid "variable or field declared void" +#~ msgstr "IMPINDURAGACIRO Cyangwa Umwanya" + +#, fuzzy +#~ msgid "cannot use `::' in parameter declaration" +#~ msgstr "Gukoresha in" + +#, fuzzy +#~ msgid "invalid use of `::'" +#~ msgstr "Sibyo Gukoresha Bya" + +#, fuzzy +#~ msgid "function `%D' cannot be declared friend" +#~ msgstr "Umumaro" + +#, fuzzy +#~ msgid "can't make `%D' into a method -- not in a class" +#~ msgstr "Ubwoko a Uburyo OYA in a ishuri" + +#, fuzzy +#~ msgid "function `%D' declared virtual inside a union" +#~ msgstr "Umumaro Kitaboneka Mo Imbere a Ihuza" + +#, fuzzy +#~ msgid "`%D' cannot be declared virtual, since it is always static" +#~ msgstr "`%D'Kitaboneka guhera ni Buri gihe" + +#, fuzzy +#~ msgid "field `%D' has incomplete type" +#~ msgstr "Umwanya Ubwoko" + +#, fuzzy +#~ msgid "name `%T' has incomplete type" +#~ msgstr "Izina: Ubwoko" + +#, fuzzy +#~ msgid " in instantiation of template `%T'" +#~ msgstr "in Bya Inyandikorugero" + +#, fuzzy +#~ msgid "`%s' is neither function nor member function; cannot be declared friend" +#~ msgstr "`%s'ni Umumaro Umumaro" + +#, fuzzy +#~ msgid "member functions are implicitly friends of their class" +#~ msgstr "Imimaro Bya ishuri" + +#, fuzzy +#~ msgid "ISO C++ forbids initialization of member `%D'" +#~ msgstr "C Bya" + +#, fuzzy +#~ msgid "ISO C++ forbids static data member `%D' with same name as enclosing class" +#~ msgstr "C Ibyatanzwe Na: Izina: Nka ishuri" + +#, fuzzy +#~ msgid "storage class `auto' invalid for function `%s'" +#~ msgstr "ishuri Sibyo kugirango Umumaro" + +#, fuzzy +#~ msgid "storage class `register' invalid for function `%s'" +#~ msgstr "ishuri Sibyo kugirango Umumaro" + +#, fuzzy +#~ msgid "storage class `__thread' invalid for function `%s'" +#~ msgstr "ishuri Sibyo kugirango Umumaro" + +#, fuzzy +#~ msgid "storage class `static' invalid for function `%s' declared out of global scope" +#~ msgstr "ishuri Sibyo kugirango Umumaro Inyuma Bya Ingano:" + +#, fuzzy +#~ msgid "storage class `inline' invalid for function `%s' declared out of global scope" +#~ msgstr "ishuri Sibyo kugirango Umumaro Inyuma Bya Ingano:" + +#, fuzzy +#~ msgid "virtual non-class function `%s'" +#~ msgstr "Kitaboneka ishuri Umumaro" + +#, fuzzy +#~ msgid "cannot declare member function `%D' to have static linkage" +#~ msgstr "Umumaro Kuri" + +#, fuzzy +#~ msgid "cannot declare static function inside another function" +#~ msgstr "Umumaro Mo Imbere Umumaro" + +#, fuzzy +#~ msgid "`static' may not be used when defining (as opposed to declaring) a static data member" +#~ msgstr "`Gicurasi OYA Ryari: Nka Kuri a Ibyatanzwe" + +#, fuzzy +#~ msgid "cannot explicitly declare member `%#D' to have extern linkage" +#~ msgstr "Kuri" + +#, fuzzy +#~ msgid "default argument for `%#D' has type `%T'" +#~ msgstr "Mburabuzi kugirango Ubwoko" + +#, fuzzy +#~ msgid "default argument for parameter of type `%T' has type `%T'" +#~ msgstr "Mburabuzi kugirango Bya Ubwoko Ubwoko" + +#, fuzzy +#~ msgid "default argument `%E' uses local variable `%D'" +#~ msgstr "Mburabuzi IMPINDURAGACIRO" + +#, fuzzy +#~ msgid "invalid string constant `%E'" +#~ msgstr "Sibyo Ikurikiranyanyuguti" + +#, fuzzy +#~ msgid "invalid integer constant in parameter list, did you forget to give parameter name?" +#~ msgstr "Sibyo Umubare wuzuye in Urutonde Kuri Izina:" + +#, fuzzy +#~ msgid "parameter `%D' invalidly declared method type" +#~ msgstr "Uburyo Ubwoko" + +#, fuzzy +#~ msgid "parameter `%D' invalidly declared offset type" +#~ msgstr "Nta- boneza Ubwoko" + +#, fuzzy +#~ msgid "parameter `%D' includes %s to array of unknown bound `%T'" +#~ msgstr "Kuri Imbonerahamwe Bya Kitazwi" + +#, fuzzy +#~ msgid "invalid constructor; you probably meant `%T (const %T&)'" +#~ msgstr "Sibyo" + +#, fuzzy +#~ msgid "`%D' must be a nonstatic member function" +#~ msgstr "`%D'a Umumaro" + +#, fuzzy +#~ msgid "`%D' must be either a non-static member function or a non-member function" +#~ msgstr "`%D'a Umumaro Cyangwa a Umumaro" + +#, fuzzy +#~ msgid "`%D' must have an argument of class or enumerated type" +#~ msgstr "`%D'Bya ishuri Cyangwa Ubwoko" + +#, fuzzy +#~ msgid "conversion to %s%s will never use a type conversion operator" +#~ msgstr "Ihindurangero Kuri Nta narimwe Gukoresha a Ubwoko Ihindurangero Mukoresha" + +#, fuzzy +#~ msgid "ISO C++ prohibits overloading operator ?:" +#~ msgstr "C Mukoresha" + +#, fuzzy +#~ msgid "postfix `%D' must take `int' as its argument" +#~ msgstr "Nka" + +#, fuzzy +#~ msgid "postfix `%D' must take `int' as its second argument" +#~ msgstr "Nka ISEGONDA" + +#, fuzzy +#~ msgid "`%D' must take either zero or one argument" +#~ msgstr "`%D'Zeru Cyangwa" + +#, fuzzy +#~ msgid "`%D' must take either one or two arguments" +#~ msgstr "`%D'Cyangwa ingingo" + +#, fuzzy +#~ msgid "prefix `%D' should return `%T'" +#~ msgstr "Imbanziriza Garuka" + +#, fuzzy +#~ msgid "postfix `%D' should return `%T'" +#~ msgstr "Garuka" + +#, fuzzy +#~ msgid "`%D' must take exactly two arguments" +#~ msgstr "`%D'ingingo" + +#, fuzzy +#~ msgid "user-defined `%D' always evaluates both arguments" +#~ msgstr "Ukoresha: Buri gihe Byombi ingingo" + +#, fuzzy +#~ msgid "`%D' should return by value" +#~ msgstr "`%D'Garuka ku Agaciro" + +#, fuzzy +#~ msgid "`%D' cannot have default arguments" +#~ msgstr "`%D'Mburabuzi ingingo" + +#, fuzzy +#~ msgid "using typedef-name `%D' after `%s'" +#~ msgstr "ikoresha Izina: Nyuma" + +#, fuzzy +#~ msgid "using template type parameter `%T' after `%s'" +#~ msgstr "ikoresha Inyandikorugero Ubwoko Nyuma" + +#, fuzzy +#~ msgid "`%s %T' declares a new type at namespace scope" +#~ msgstr "`%s%T'a Gishya Ubwoko ku Ingano:" + +#, fuzzy +#~ msgid " names from dependent base classes are not visible to unqualified name lookup - to refer to the inherited type, say `%s %T::%T'" +#~ msgstr "Amazina Bivuye SHINGIRO Inzego OYA Kigaragara Kuri Izina: GUSHAKISHA Kuri Kuri i Ubwoko" + +#, fuzzy +#~ msgid "use of enum `%#D' without previous declaration" +#~ msgstr "Gukoresha Bya Ibanjirije" + +#, fuzzy +#~ msgid "derived union `%T' invalid" +#~ msgstr "Ihuza Sibyo" + +#, fuzzy +#~ msgid "base type `%T' fails to be a struct or class type" +#~ msgstr "SHINGIRO Ubwoko Kuri a Cyangwa ishuri Ubwoko" + +#, fuzzy +#~ msgid "base class `%T' has incomplete type" +#~ msgstr "SHINGIRO ishuri Ubwoko" + +#, fuzzy +#~ msgid "recursive type `%T' undefined" +#~ msgstr "Ubwoko kidasobanuye" + +#, fuzzy +#~ msgid "duplicate base type `%T' invalid" +#~ msgstr "Gusubiramo SHINGIRO Ubwoko Sibyo" + +#, fuzzy +#~ msgid "multiple definition of `%#T'" +#~ msgstr "Igikubo Insobanuro Bya" + +#, fuzzy +#~ msgid "previous definition here" +#~ msgstr "Ibanjirije Insobanuro" + +#, fuzzy +#~ msgid "enumerator value for `%D' not integer constant" +#~ msgstr "Agaciro kugirango OYA Umubare wuzuye" + +#, fuzzy +#~ msgid "overflow in enumeration values at `%D'" +#~ msgstr "Byarenze urugero in Uduciro ku" + +#, fuzzy +#~ msgid "return type `%#T' is incomplete" +#~ msgstr "Garuka Ubwoko ni" + +#, fuzzy +#~ msgid "semicolon missing after declaration of `%#T'" +#~ msgstr "Akabago n'Akitso Ibuze Nyuma Bya" + +#, fuzzy +#~ msgid "return type for `main' changed to `int'" +#~ msgstr "Garuka Ubwoko kugirango Byahinduwe Kuri" + +#, fuzzy +#~ msgid "`%D' implicitly declared before its definition" +#~ msgstr "`%D'Mbere Insobanuro" + +#, fuzzy +#~ msgid "`operator=' should return a reference to `*this'" +#~ msgstr "`Mukoresha Garuka a Indango Kuri" + +#, fuzzy +#~ msgid "`%D' is already defined in class `%T'" +#~ msgstr "`%D'ni in ishuri" + +#, fuzzy +#~ msgid "static member function `%#D' declared with type qualifiers" +#~ msgstr "Umumaro Na: Ubwoko" + +#, fuzzy +#~ msgid "duplicate type qualifiers in %s declaration" +#~ msgstr "Gusubiramo Ubwoko in" + +#, fuzzy +#~ msgid "template `%#D' instantiated in file without #pragma interface" +#~ msgstr "Inyandikorugero in IDOSIYE" + +#, fuzzy +#~ msgid "template `%#D' defined in file without #pragma interface" +#~ msgstr "Inyandikorugero in IDOSIYE" + +#, fuzzy +#~ msgid "name missing for member function" +#~ msgstr "Izina: Ibuze kugirango Umumaro" + +#, fuzzy +#~ msgid "parser may be lost: is there a '{' missing somewhere?" +#~ msgstr "Gicurasi ni a Ibuze" + +#, fuzzy +#~ msgid "ambiguous conversion for array subscript" +#~ msgstr "Ihindurangero kugirango Imbonerahamwe Inyandiko nyesi" + +#, fuzzy +#~ msgid "invalid types `%T[%T]' for array subscript" +#~ msgstr "Sibyo kugirango Imbonerahamwe Inyandiko nyesi" + +#, fuzzy +#~ msgid "type `%#T' argument given to `delete', expected pointer" +#~ msgstr "Ubwoko Kuri Ikitezwe: Mweretsi" + +#, fuzzy +#~ msgid "anachronistic use of array size in vector delete" +#~ msgstr "Gukoresha Bya Imbonerahamwe Ingano in Gusiba" + +#, fuzzy +#~ msgid "cannot delete a function. Only pointer-to-objects are valid arguments to `delete'" +#~ msgstr "Gusiba a Umumaro Mweretsi Kuri Ibintu Byemewe ingingo Kuri" + +#, fuzzy +#~ msgid "deleting `%T' is undefined" +#~ msgstr "ni kidasobanuye" + +#, fuzzy +#~ msgid "deleting array `%#D'" +#~ msgstr "Imbonerahamwe" + +#, fuzzy +#~ msgid "invalid declaration of member template `%#D' in local class" +#~ msgstr "Sibyo Bya Inyandikorugero in ishuri" + +#, fuzzy +#~ msgid "invalid use of `virtual' in template declaration of `%#D'" +#~ msgstr "Sibyo Gukoresha Bya in Inyandikorugero Bya" + +#, fuzzy +#~ msgid "template declaration of `%#D'" +#~ msgstr "Inyandikorugero Bya" + +#, fuzzy +#~ msgid "Java method '%D' has non-Java return type `%T'" +#~ msgstr "Uburyo Garuka Ubwoko" + +#, fuzzy +#~ msgid "Java method '%D' has non-Java parameter type `%T'" +#~ msgstr "Uburyo Ubwoko" + +#, fuzzy +#~ msgid "prototype for `%#D' does not match any in class `%T'" +#~ msgstr "kugirango OYA BIHUYE in ishuri" + +#, fuzzy +#~ msgid "local class `%#T' shall not have static data member `%#D'" +#~ msgstr "ishuri OYA Ibyatanzwe" + +#, fuzzy +#~ msgid "initializer invalid for static member with constructor" +#~ msgstr "Sibyo kugirango Na:" + +#, fuzzy +#~ msgid "(an out of class initialization is required)" +#~ msgstr "(Inyuma Bya ishuri ni Bya ngombwa" + +#, fuzzy +#~ msgid "invalid data member initialization" +#~ msgstr "Sibyo Ibyatanzwe" + +#, fuzzy +#~ msgid "(use `=' to initialize static data members)" +#~ msgstr "(Gukoresha Kuri gutangiza Ibyatanzwe" + +#, fuzzy +#~ msgid "member `%D' conflicts with virtual function table field name" +#~ msgstr "Na: Kitaboneka Umumaro imbonerahamwe# Umwanya Izina:" + +#, fuzzy +#~ msgid "`%D' is already defined in `%T'" +#~ msgstr "`%D'ni in" + +#, fuzzy +#~ msgid "field initializer is not constant" +#~ msgstr "Umwanya ni OYA" + +#, fuzzy +#~ msgid "`asm' specifiers are not permitted on non-static data members" +#~ msgstr "`OYA ku Ibyatanzwe" + +#, fuzzy +#~ msgid "cannot declare `%D' to be a bit-field type" +#~ msgstr "Kuri a Umwanya Ubwoko" + +#, fuzzy +#~ msgid "cannot declare bit-field `%D' with function type" +#~ msgstr "Umwanya Na: Umumaro Ubwoko" + +#, fuzzy +#~ msgid "`%D' is already defined in the class %T" +#~ msgstr "`%D'ni in i ishuri" + +#, fuzzy +#~ msgid "static member `%D' cannot be a bit-field" +#~ msgstr "a Umwanya" + +#, fuzzy +#~ msgid "initializer specified for non-member function `%D'" +#~ msgstr "kugirango Umumaro" + +#, fuzzy +#~ msgid "invalid initializer for virtual method `%D'" +#~ msgstr "Sibyo kugirango Kitaboneka Uburyo" + +#, fuzzy +#~ msgid "anonymous struct not inside named type" +#~ msgstr "OYA Mo Imbere Ubwoko" + +#, fuzzy +#~ msgid "namespace-scope anonymous aggregates must be static" +#~ msgstr "Ingano:" + +#, fuzzy +#~ msgid "anonymous aggregate with no members" +#~ msgstr "Na: Oya" + +#, fuzzy +#~ msgid "`operator new' must return type `%T'" +#~ msgstr "`Mukoresha Garuka Ubwoko" + +#, fuzzy +#~ msgid "`operator new' takes type `size_t' (`%T') as first parameter" +#~ msgstr "`Mukoresha Ubwoko Nka Itangira" + +#, fuzzy +#~ msgid "`operator delete' must return type `%T'" +#~ msgstr "`Mukoresha Garuka Ubwoko" + +#, fuzzy +#~ msgid "`operator delete' takes type `%T' as first parameter" +#~ msgstr "`Mukoresha Ubwoko Nka Itangira" + +#, fuzzy +#~ msgid "too many initialization functions required" +#~ msgstr "Imimaro Bya ngombwa" + +#, fuzzy +#~ msgid "inline function `%D' used but never defined" +#~ msgstr "Mumurongo Umumaro Nta narimwe" + +#, fuzzy +#~ msgid "use of old-style cast" +#~ msgstr "Gukoresha Bya ki/ bishaje IMISUSIRE" + +#, fuzzy +#~ msgid "use of `%D' is ambiguous" +#~ msgstr "Gukoresha Bya ni" + +#, fuzzy +#~ msgid " first declared as `%#D' here" +#~ msgstr "Itangira Nka" + +#, fuzzy +#~ msgid " also declared as `%#D' here" +#~ msgstr "Nka" + +#, fuzzy +#~ msgid "`%D' denotes an ambiguous type" +#~ msgstr "`%D'Ubwoko" + +#, fuzzy +#~ msgid " first type here" +#~ msgstr "Itangira Ubwoko" + +#, fuzzy +#~ msgid " other type here" +#~ msgstr "Ikindi Ubwoko" + +#, fuzzy +#~ msgid "declaration of `%D' not in a namespace surrounding `%D'" +#~ msgstr "Bya OYA in a" + +#, fuzzy +#~ msgid "`%D' should have been declared inside `%D'" +#~ msgstr "`%D'Mo Imbere" + +#, fuzzy +#~ msgid "`%D' is not a function," +#~ msgstr "`%D'ni OYA a Umumaro" + +#, fuzzy +#~ msgid " conflict with `%D'" +#~ msgstr "Na:" + +#, fuzzy +#~ msgid "unknown namespace `%D'" +#~ msgstr "Kitazwi" + +#, fuzzy +#~ msgid "`%T' is not a namespace" +#~ msgstr "`%T'ni OYA a" + +#, fuzzy +#~ msgid "`%D' is not a namespace" +#~ msgstr "`%D'ni OYA a" + +#, fuzzy +#~ msgid "a using-declaration cannot specify a template-id. Try `using %D'" +#~ msgstr "a ikoresha a Inyandikorugero ID ikoresha" + +#, fuzzy +#~ msgid "namespace `%D' not allowed in using-declaration" +#~ msgstr "OYA in ikoresha" + +#, fuzzy +#~ msgid "`%D' not declared" +#~ msgstr "`%D'OYA" + +#, fuzzy +#~ msgid "`%D' is already declared in this scope" +#~ msgstr "`%D'ni in iyi Ingano:" + +#, fuzzy +#~ msgid "using declaration `%D' introduced ambiguous type `%T'" +#~ msgstr "ikoresha Ubwoko" + +#, fuzzy +#~ msgid "using-declaration for non-member at class scope" +#~ msgstr "ikoresha kugirango ku ishuri Ingano:" + +#, fuzzy +#~ msgid "using-declaration for destructor" +#~ msgstr "ikoresha kugirango" + +#, fuzzy +#~ msgid "a using-declaration cannot specify a template-id. Try `using %T::%D'" +#~ msgstr "a ikoresha a Inyandikorugero ID ikoresha" + +#, fuzzy +#~ msgid "default argument missing for parameter %P of `%+#D'" +#~ msgstr "Mburabuzi Ibuze kugirango Bya" + +#, fuzzy +#~ msgid "extra qualification `%T::' on member `%D' ignored" +#~ msgstr "Birenga ku" + +#, fuzzy +#~ msgid "`%T' does not have a class or union named `%D'" +#~ msgstr "`%T'OYA a ishuri Cyangwa Ihuza" + +#, fuzzy +#~ msgid "`%T' is not a class or union type" +#~ msgstr "`%T'ni OYA a ishuri Cyangwa Ihuza Ubwoko" + +#, fuzzy +#~ msgid "template argument is required for `%T'" +#~ msgstr "Inyandikorugero ni Bya ngombwa kugirango" + +#, fuzzy +#~ msgid "declaration of `%D' in `%D' which does not enclose `%D'" +#~ msgstr "Bya in OYA" + +#, fuzzy +#~ msgid "`%s' not supported by %s" +#~ msgstr "`%s'OYA ku" + +#, fuzzy +#~ msgid "(static %s for %s)" +#~ msgstr "(kugirango" + +# #-#-#-#-# dbaccess.pot (PACKAGE VERSION) #-#-#-#-# +# #-#-#-#-# dbaccess.pot (PACKAGE VERSION) #-#-#-#-# +# #-#-#-#-# dbaccess.pot (PACKAGE VERSION) #-#-#-#-# +#, fuzzy +#~ msgid "\\x%x" +#~ msgstr "\\x%x" + +# vcl/source\src\units.src:SV_FUNIT_STRINGS.10.text +#, fuzzy +#~ msgid "In %s `%s':" +#~ msgstr "in" + +#, fuzzy +#~ msgid "%s: In instantiation of `%s':\n" +#~ msgstr "%s:Bya" + +#, fuzzy +#~ msgid "%s:%d: instantiated from `%s'\n" +#~ msgstr "%s:%d:Bivuye" + +#, fuzzy +#~ msgid "%s:%d: instantiated from here\n" +#~ msgstr "%s:%d:Bivuye" + +#, fuzzy +#~ msgid "unexpected letter `%c' in locate_error\n" +#~ msgstr "Ibaruwa... in" + +#, fuzzy +#~ msgid "type `%T' is disallowed in Java `throw' or `catch'" +#~ msgstr "Ubwoko ni in Cyangwa" + +#, fuzzy +#~ msgid "call to Java `catch' or `throw' with `jthrowable' undefined" +#~ msgstr "Kuri Cyangwa Na: kidasobanuye" + +#, fuzzy +#~ msgid "type `%T' is not derived from `java::lang::Throwable'" +#~ msgstr "Ubwoko ni OYA Bivuye java" + +#, fuzzy +#~ msgid "mixing C++ and Java catches in a single translation unit" +#~ msgstr "C Na in a UMWE Umwandiko wahinduwe ururimi Igice:" + +#, fuzzy +#~ msgid "throwing NULL, which has integral, not pointer type" +#~ msgstr "Umubare Wuzuye OYA Mweretsi Ubwoko" + +#, fuzzy +#~ msgid " in thrown expression" +#~ msgstr "in imvugo" + +#, fuzzy +#~ msgid "expression '%E' of abstract class type '%T' cannot be used in throw-expression" +#~ msgstr "imvugo Bya Incamake ishuri Ubwoko in imvugo" + +#, fuzzy +#~ msgid "exception of type `%T' will be caught" +#~ msgstr "Irengayobora(-) Bya Ubwoko" + +#, fuzzy +#~ msgid " by earlier handler for `%T'" +#~ msgstr "ku kugirango" + +#, fuzzy +#~ msgid "`...' handler must be the last handler for its try block" +#~ msgstr "`...'i Iheruka kugirango Funga" + +#, fuzzy +#~ msgid "`%D' is already a friend of class `%T'" +#~ msgstr "`%D'ni a Bya ishuri" + +#, fuzzy +#~ msgid "previous friend declaration of `%D'" +#~ msgstr "Ibanjirije Bya" + +#, fuzzy +#~ msgid "invalid type `%T' declared `friend'" +#~ msgstr "Sibyo Ubwoko" + +#, fuzzy +#~ msgid "partial specialization `%T' declared `friend'" +#~ msgstr "Bituzuye" + +#, fuzzy +#~ msgid "class `%T' is implicitly friends with itself" +#~ msgstr "ishuri ni Na:" + +#, fuzzy +#~ msgid "typename type `%#T' declared `friend'" +#~ msgstr "Ubwoko" + +#, fuzzy +#~ msgid "template parameter type `%T' declared `friend'" +#~ msgstr "Inyandikorugero Ubwoko" + +#, fuzzy +#~ msgid "`%#T' is not a template" +#~ msgstr "`%#T'ni OYA a Inyandikorugero" + +#, fuzzy +#~ msgid "`%T' is already a friend of `%T'" +#~ msgstr "`%T'ni a Bya" + +#, fuzzy +#~ msgid "member `%D' declared as friend before type `%T' defined" +#~ msgstr "Nka Mbere Ubwoko" + +#, fuzzy +#~ msgid "friend declaration `%#D' declares a non-template function" +#~ msgstr "a Inyandikorugero Umumaro" + +#, fuzzy +#~ msgid "(if this is not what you intended, make sure the function template has already been declared and add <> after the function name here) -Wno-non-template-friend disables this warning" +#~ msgstr "(NIBA iyi ni OYA Ubwoko i Umumaro Inyandikorugero Na Kongeramo Nyuma i Umumaro Izina: Inyandikorugero iyi Iburira" + +#, fuzzy +#~ msgid "argument to `%s' missing\n" +#~ msgstr "Kuri" + +#, fuzzy +#~ msgid "`%D' should be initialized in the member initialization list" +#~ msgstr "`%D'in i Urutonde" + +#, fuzzy +#~ msgid "default-initialization of `%#D', which has reference type" +#~ msgstr "Mburabuzi Bya Indango Ubwoko" + +#, fuzzy +#~ msgid "uninitialized reference member `%D'" +#~ msgstr "Itatangijwe Indango" + +#, fuzzy +#~ msgid "initializer list treated as compound expression" +#~ msgstr "Urutonde Nka imvugo" + +#, fuzzy +#~ msgid "`%D' will be initialized after" +#~ msgstr "`%D'Nyuma" + +#, fuzzy +#~ msgid "base `%T' will be initialized after" +#~ msgstr "SHINGIRO Nyuma" + +# desktop/source\app\ssodlg.src:DLG_SSOLOGIN.text +#, fuzzy +#~ msgid " `%#D'" +#~ msgstr "`%#D'" + +# sc/source\core\src\compiler.src:RID_SC_FUNCTION_NAMES.SC_OPCODE_BASE.text +#, fuzzy +#~ msgid " base `%T'" +#~ msgstr "SHINGIRO" + +#, fuzzy +#~ msgid "multiple initializations given for base `%T'" +#~ msgstr "Igikubo kugirango SHINGIRO" + +#, fuzzy +#~ msgid "initializations for multiple members of `%T'" +#~ msgstr "kugirango Igikubo Bya" + +#, fuzzy +#~ msgid "base class `%#T' should be explicitly initialized in the copy constructor" +#~ msgstr "SHINGIRO ishuri in i Gukoporora" + +#, fuzzy +#~ msgid "class `%T' does not have any field named `%D'" +#~ msgstr "ishuri OYA Umwanya" + +#, fuzzy +#~ msgid "field `%#D' is static; the only point of initialization is its definition" +#~ msgstr "Umwanya ni i Akadomo Bya ni Insobanuro" + +#, fuzzy +#~ msgid "unnamed initializer for `%T', which has no base classes" +#~ msgstr "Kitiswe kugirango Oya SHINGIRO Inzego" + +#, fuzzy +#~ msgid "unnamed initializer for `%T', which uses multiple inheritance" +#~ msgstr "Kitiswe kugirango Igikubo" + +#, fuzzy +#~ msgid "type `%D' is not a direct or virtual base of `%T'" +#~ msgstr "Ubwoko ni OYA a Cyangwa Kitaboneka SHINGIRO Bya" + +#, fuzzy +#~ msgid "type `%D' is not a direct base of `%T'" +#~ msgstr "Ubwoko ni OYA a SHINGIRO Bya" + +#, fuzzy +#~ msgid "bad array initializer" +#~ msgstr "Imbonerahamwe" + +#, fuzzy +#~ msgid "`%T' is not an aggregate type" +#~ msgstr "`%T'ni OYA Ubwoko" + +#, fuzzy +#~ msgid "`%T' fails to be an aggregate typedef" +#~ msgstr "`%T'Kuri" + +#, fuzzy +#~ msgid "type `%T' is of non-aggregate type" +#~ msgstr "Ubwoko ni Bya Ubwoko" + +#, fuzzy +#~ msgid "cannot call destructor `%T::~%T' without object" +#~ msgstr "Igikoresho" + +#, fuzzy +#~ msgid "invalid use of non-static field `%D'" +#~ msgstr "Sibyo Gukoresha Bya Umwanya" + +#, fuzzy +#~ msgid "invalid use of member `%D'" +#~ msgstr "Sibyo Gukoresha Bya" + +#, fuzzy +#~ msgid "no method `%T::%D'" +#~ msgstr "Oya Uburyo" + +#, fuzzy +#~ msgid "incomplete type `%T' does not have member `%D'" +#~ msgstr "Ubwoko OYA" + +#, fuzzy +#~ msgid "`%D' is not a member of type `%T'" +#~ msgstr "`%D'ni OYA a Bya Ubwoko" + +#, fuzzy +#~ msgid "invalid pointer to bit-field `%D'" +#~ msgstr "Sibyo Mweretsi Kuri Umwanya" + +#, fuzzy +#~ msgid "object missing in use of pointer-to-member construct" +#~ msgstr "Igikoresho Ibuze in Gukoresha Bya Mweretsi Kuri" + +#, fuzzy +#~ msgid "member `%D' is non-static but referenced as a static member" +#~ msgstr "ni Nka a" + +#, fuzzy +#~ msgid "at this point in file" +#~ msgstr "ku iyi Akadomo in IDOSIYE" + +#, fuzzy +#~ msgid "object missing in `%E'" +#~ msgstr "Igikoresho Ibuze in" + +#, fuzzy +#~ msgid "new of array type fails to specify size" +#~ msgstr "Gishya Bya Imbonerahamwe Ubwoko Kuri Ingano" + +#, fuzzy +#~ msgid "size in array new must have integral type" +#~ msgstr "Ingano in Imbonerahamwe Gishya Umubare Wuzuye Ubwoko" + +#, fuzzy +#~ msgid "zero size array reserves no space" +#~ msgstr "Zeru Ingano Imbonerahamwe Oya Umwanya" + +#, fuzzy +#~ msgid "new cannot be applied to a reference type" +#~ msgstr "Gishya Byashyizweho Kuri a Indango Ubwoko" + +#, fuzzy +#~ msgid "new cannot be applied to a function type" +#~ msgstr "Gishya Byashyizweho Kuri a Umumaro Ubwoko" + +#, fuzzy +#~ msgid "call to Java constructor, while `jclass' undefined" +#~ msgstr "Kuri kidasobanuye" + +#, fuzzy +#~ msgid "can't find class$" +#~ msgstr "Gushaka ishuri" + +#, fuzzy +#~ msgid "invalid type `void' for new" +#~ msgstr "Sibyo Ubwoko kugirango Gishya" + +#, fuzzy +#~ msgid "call to Java constructor with `%s' undefined" +#~ msgstr "Kuri Na: kidasobanuye" + +#, fuzzy +#~ msgid "ISO C++ forbids initialization in array new" +#~ msgstr "C in Imbonerahamwe Gishya" + +#, fuzzy +#~ msgid "initializer list being treated as compound expression" +#~ msgstr "Urutonde Nka imvugo" + +#, fuzzy +#~ msgid "ISO C++ forbids aggregate initializer to new" +#~ msgstr "C Kuri Gishya" + +#, fuzzy +#~ msgid "uninitialized const in `new' of `%#T'" +#~ msgstr "Itatangijwe in Bya" + +#, fuzzy +#~ msgid "cannot initialize multi-dimensional array with initializer" +#~ msgstr "gutangiza Imbonerahamwe Na:" + +#, fuzzy +#~ msgid "unknown array size in delete" +#~ msgstr "Kitazwi Imbonerahamwe Ingano in Gusiba" + +#, fuzzy +#~ msgid "type to vector delete is neither pointer or array type" +#~ msgstr "Ubwoko Kuri Gusiba ni Mweretsi Cyangwa Imbonerahamwe Ubwoko" + +#, fuzzy +#~ msgid "type name expected before `*'" +#~ msgstr "Ubwoko Izina: Ikitezwe: Mbere" + +#, fuzzy +#~ msgid "cannot declare references to references" +#~ msgstr "Indango Kuri Indango" + +#, fuzzy +#~ msgid "cannot declare pointers to references" +#~ msgstr "Kuri Indango" + +#, fuzzy +#~ msgid "type name expected before `&'" +#~ msgstr "Ubwoko Izina: Ikitezwe: Mbere" + +#, fuzzy +#~ msgid "semicolon missing after %s declaration" +#~ msgstr "Akabago n'Akitso Ibuze Nyuma" + +#, fuzzy +#~ msgid "semicolon missing after declaration of `%T'" +#~ msgstr "Akabago n'Akitso Ibuze Nyuma Bya" + +#, fuzzy +#~ msgid "junk at end of #pragma %s" +#~ msgstr "Umwanda ku Impera Bya" + +#, fuzzy +#~ msgid "invalid #pragma %s" +#~ msgstr "Sibyo" + +#, fuzzy +#~ msgid "#pragma vtable no longer supported" +#~ msgstr "#Oya" + +#, fuzzy +#~ msgid "#pragma implementation for %s appears after file is included" +#~ msgstr "#kugirango Nyuma IDOSIYE ni" + +#, fuzzy +#~ msgid "junk at end of #pragma GCC java_exceptions" +#~ msgstr "Umwanda ku Impera Bya" + +#, fuzzy +#~ msgid "`%D' not defined" +#~ msgstr "`%D'Bitasobanutse>" + +#, fuzzy +#~ msgid "`%D' was not declared in this scope" +#~ msgstr "`%D'OYA in iyi Ingano:" + +#, fuzzy +#~ msgid "`%D' undeclared (first use this function)" +#~ msgstr "`%D'Itangira Gukoresha iyi Umumaro" + +#, fuzzy +#~ msgid "(Each undeclared identifier is reported only once for each function it appears in.)" +#~ msgstr "(Ikiranga ni Rimwe kugirango Umumaro in" + +#, fuzzy +#~ msgid "`::%D' undeclared (first use here)" +#~ msgstr "`::%D'Itangira Gukoresha" + +#, fuzzy +#~ msgid "real-valued template parameters when cross-compiling" +#~ msgstr "Inyandikorugero Ibigenga Ryari: Kwambukiranya" + +#, fuzzy +#~ msgid "the mangled name of `%D' will change in a future version of GCC" +#~ msgstr "i Izina: Bya Guhindura>> in a Verisiyo Bya" + +#, fuzzy +#~ msgid "due to a defect in the G++ 3.2 ABI, G++ has assigned the same mangled name to two different types" +#~ msgstr "Kuri a in i 3. 2. i Izina: Kuri" + +#, fuzzy +#~ msgid "invalid use of member `%D' in static member function" +#~ msgstr "Sibyo Gukoresha Bya in Umumaro" + +#, fuzzy +#~ msgid "use of namespace `%D' as expression" +#~ msgstr "Gukoresha Bya Nka imvugo" + +#, fuzzy +#~ msgid "use of class template `%T' as expression" +#~ msgstr "Gukoresha Bya ishuri Inyandikorugero Nka imvugo" + +#, fuzzy +#~ msgid "use of %s from containing function" +#~ msgstr "Gukoresha Bya Bivuye Umumaro" + +#, fuzzy +#~ msgid "request for member `%D' is ambiguous in multiple inheritance lattice" +#~ msgstr "Kubaza... kugirango ni in Igikubo" + +#, fuzzy +#~ msgid "generic thunk code fails for method `%#D' which uses `...'" +#~ msgstr "Gifitanye isano ITEGEKONGENGA kugirango Uburyo" + +#, fuzzy +#~ msgid "non-static const member `%#D', can't use default assignment operator" +#~ msgstr "Gukoresha Mburabuzi Igenera Mukoresha" + +#, fuzzy +#~ msgid "non-static reference member `%#D', can't use default assignment operator" +#~ msgstr "Indango Gukoresha Mburabuzi Igenera Mukoresha" + +#, fuzzy +#~ msgid "`%s' tag used in naming `%#T'" +#~ msgstr "`%s'Itagi: in" + +#, fuzzy +#~ msgid "keyword `export' not implemented, and will be ignored" +#~ msgstr "Ijambo- banze OYA Na" + +#, fuzzy +#~ msgid "use of linkage spec `%D' is different from previous spec `%D'" +#~ msgstr "Gukoresha Bya ni Bivuye Ibanjirije" + +#, fuzzy +#~ msgid "no base or member initializers given following ':'" +#~ msgstr "Oya SHINGIRO Cyangwa" + +#, fuzzy +#~ msgid "anachronistic old style base class initializer" +#~ msgstr "ki/ bishaje IMISUSIRE SHINGIRO ishuri" + +#, fuzzy +#~ msgid "`>>' should be `> >' in template class name" +#~ msgstr "`>>'in Inyandikorugero ishuri Izina:" + +#, fuzzy +#~ msgid "use of template qualifier outside template" +#~ msgstr "Gukoresha Bya Inyandikorugero Hanze Inyandikorugero" + +#, fuzzy +#~ msgid "ISO C++ forbids an empty condition for `%s'" +#~ msgstr "C ubusa Ibisabwa kugirango" + +#, fuzzy +#~ msgid "definition of class `%T' in condition" +#~ msgstr "Insobanuro Bya ishuri in Ibisabwa" + +#, fuzzy +#~ msgid "definition of enum `%T' in condition" +#~ msgstr "Insobanuro Bya in Ibisabwa" + +#, fuzzy +#~ msgid "definition of array `%#D' in condition" +#~ msgstr "Insobanuro Bya Imbonerahamwe in Ibisabwa" + +#, fuzzy +#~ msgid "old style placement syntax, use () instead" +#~ msgstr "ki/ bishaje IMISUSIRE Ishyira mu mwanya Gukoresha" + +#, fuzzy +#~ msgid "`%T' is not a valid expression" +#~ msgstr "`%T'ni OYA a Byemewe imvugo" + +#, fuzzy +#~ msgid "initialization of new expression with `='" +#~ msgstr "Bya Gishya imvugo Na:" + +#, fuzzy +#~ msgid "ISO C++ forbids compound literals" +#~ msgstr "C" + +#, fuzzy +#~ msgid "ISO C++ forbids braced-groups within expressions" +#~ msgstr "C Amatsinda muri" + +#, fuzzy +#~ msgid "sigof type specifier" +#~ msgstr "Ubwoko" + +#, fuzzy +#~ msgid "`sigof' applied to non-aggregate expression" +#~ msgstr "`Byashyizweho Kuri imvugo" + +#, fuzzy +#~ msgid "`sigof' applied to non-aggregate type" +#~ msgstr "`Byashyizweho Kuri Ubwoko" + +#, fuzzy +#~ msgid "using `typename' outside of template" +#~ msgstr "ikoresha Hanze Bya Inyandikorugero" + +#, fuzzy +#~ msgid "storage class specifier `%s' not allowed after struct or class" +#~ msgstr "ishuri OYA Nyuma Cyangwa ishuri" + +#, fuzzy +#~ msgid "type specifier `%s' not allowed after struct or class" +#~ msgstr "Ubwoko OYA Nyuma Cyangwa ishuri" + +#, fuzzy +#~ msgid "type qualifier `%s' not allowed after struct or class" +#~ msgstr "Ubwoko OYA Nyuma Cyangwa ishuri" + +#, fuzzy +#~ msgid "no body nor ';' separates two class, struct or union declarations" +#~ msgstr "Oya Umubiri ishuri Cyangwa Ihuza" + +#, fuzzy +#~ msgid "no bases given following `:'" +#~ msgstr "Oya" + +#, fuzzy +#~ msgid "multiple access specifiers" +#~ msgstr "Igikubo" + +#, fuzzy +#~ msgid "multiple `virtual' specifiers" +#~ msgstr "Igikubo" + +#, fuzzy +#~ msgid "missing ';' before right brace" +#~ msgstr "Ibuze Mbere Iburyo:" + +#, fuzzy +#~ msgid "ISO C++ forbids array dimensions with parenthesized type in new" +#~ msgstr "C Imbonerahamwe Ingero Na: Ubwoko in Gishya" + +#, fuzzy +#~ msgid "`%T' is not a class or namespace" +#~ msgstr "`%T'ni OYA a ishuri Cyangwa" + +#, fuzzy +#~ msgid "ISO C++ forbids label declarations" +#~ msgstr "C Akarango" + +#, fuzzy +#~ msgid "ISO C++ forbids computed gotos" +#~ msgstr "C" + +#, fuzzy +#~ msgid "label must be followed by statement" +#~ msgstr "Akarango ku Inyandiko" + +#, fuzzy +#~ msgid "must have at least one catch per try block" +#~ msgstr "ku Funga" + +#, fuzzy +#~ msgid "ISO C++ forbids compound statements inside for initializations" +#~ msgstr "C Mo Imbere kugirango" + +#, fuzzy +#~ msgid "possibly missing ')'" +#~ msgstr "Ibuze" + +#, fuzzy +#~ msgid "type specifier omitted for parameter" +#~ msgstr "Ubwoko kugirango" + +#, fuzzy +#~ msgid "`%E' is not a type, use `typename %E' to make it one" +#~ msgstr "`%E'ni OYA a Ubwoko Gukoresha Kuri Ubwoko" + +#, fuzzy +#~ msgid "no type `%D' in `%T'" +#~ msgstr "Oya Ubwoko in" + +#, fuzzy +#~ msgid "type specifier omitted for parameter `%E'" +#~ msgstr "Ubwoko kugirango" + +#, fuzzy +#~ msgid "'%D' is used as a type, but is not defined as a type." +#~ msgstr "'%D'ni Nka a Ubwoko ni OYA Nka a Ubwoko" + +#, fuzzy +#~ msgid "data member `%D' cannot be a member template" +#~ msgstr "Ibyatanzwe a Inyandikorugero" + +#, fuzzy +#~ msgid "invalid member template declaration `%D'" +#~ msgstr "Sibyo Inyandikorugero" + +#, fuzzy +#~ msgid "explicit specialization in non-namespace scope `%D'" +#~ msgstr "in Ingano:" + +#, fuzzy +#~ msgid "enclosing class templates are not explicitly specialized" +#~ msgstr "ishuri Inyandikorugero OYA cy'umwihariko/ mwihariko" + +#, fuzzy +#~ msgid "specializing `%#T' in different namespace" +#~ msgstr "in" + +#, fuzzy +#~ msgid " from definition of `%#D'" +#~ msgstr "Bivuye Insobanuro Bya" + +#, fuzzy +#~ msgid "specialization of `%T' after instantiation" +#~ msgstr "Bya Nyuma" + +#, fuzzy +#~ msgid "specialization `%T' after instantiation `%T'" +#~ msgstr "Nyuma" + +#, fuzzy +#~ msgid "explicit specialization of non-template `%T'" +#~ msgstr "Bya Inyandikorugero" + +#, fuzzy +#~ msgid "specialization of %D after instantiation" +#~ msgstr "Bya Nyuma" + +# #-#-#-#-# dbaccess.pot (PACKAGE VERSION) #-#-#-#-# +# #-#-#-#-# dbaccess.pot (PACKAGE VERSION) #-#-#-#-# +# #-#-#-#-# dbaccess.pot (PACKAGE VERSION) #-#-#-#-# +#, fuzzy +#~ msgid "%s %+#D" +#~ msgstr "%s%+#D" + +#, fuzzy +#~ msgid "`%D' is not a function template" +#~ msgstr "`%D'ni OYA a Umumaro Inyandikorugero" + +#, fuzzy +#~ msgid "template-id `%D' for `%+D' does not match any template declaration" +#~ msgstr "Inyandikorugero ID kugirango OYA BIHUYE Inyandikorugero" + +#, fuzzy +#~ msgid "ambiguous template specialization `%D' for `%+D'" +#~ msgstr "Inyandikorugero kugirango" + +#, fuzzy +#~ msgid "template-id `%D' in declaration of primary template" +#~ msgstr "Inyandikorugero ID in Bya Inyandikorugero" + +#, fuzzy +#~ msgid "template parameter list used in explicit instantiation" +#~ msgstr "Inyandikorugero Urutonde in" + +#, fuzzy +#~ msgid "definition provided for explicit instantiation" +#~ msgstr "Insobanuro kugirango" + +#, fuzzy +#~ msgid "too many template parameter lists in declaration of `%D'" +#~ msgstr "Inyandikorugero Intonde in Bya" + +#, fuzzy +#~ msgid "too few template parameter lists in declaration of `%D'" +#~ msgstr "Inyandikorugero Intonde in Bya" + +#, fuzzy +#~ msgid "explicit specialization not preceded by `template <>'" +#~ msgstr "OYA ku Inyandikorugero" + +#, fuzzy +#~ msgid "partial specialization `%D' of function template" +#~ msgstr "Bituzuye Bya Umumaro Inyandikorugero" + +#, fuzzy +#~ msgid "default argument specified in explicit specialization" +#~ msgstr "Mburabuzi in" + +#, fuzzy +#~ msgid "template specialization with C linkage" +#~ msgstr "Inyandikorugero Na: C" + +#, fuzzy +#~ msgid "specialization of implicitly-declared special member function" +#~ msgstr "Bya Bidasanzwe Umumaro" + +#, fuzzy +#~ msgid "no member function `%D' declared in `%T'" +#~ msgstr "Oya Umumaro in" + +#, fuzzy +#~ msgid "too many template parameter lists in declaration of `%T'" +#~ msgstr "Inyandikorugero Intonde in Bya" + +#, fuzzy +#~ msgid " shadows template parm `%#D'" +#~ msgstr "Inyandikorugero" + +#, fuzzy +#~ msgid "template parameters not used in partial specialization:" +#~ msgstr "Inyandikorugero Ibigenga OYA in Bituzuye" + +# desktop/source\app\ssodlg.src:DLG_SSOLOGIN.text +#, fuzzy +#~ msgid " `%D'" +#~ msgstr "`%D'" + +#, fuzzy +#~ msgid "partial specialization `%T' does not specialize any template arguments" +#~ msgstr "Bituzuye OYA Inyandikorugero ingingo" + +#, fuzzy +#~ msgid "template argument `%E' involves template parameter(s)" +#~ msgstr "Inyandikorugero Inyandikorugero S" + +#, fuzzy +#~ msgid "type `%T' of template argument `%E' depends on template parameter(s)" +#~ msgstr "Ubwoko Bya Inyandikorugero ku Inyandikorugero S" + +#, fuzzy +#~ msgid "no default argument for `%D'" +#~ msgstr "Oya Mburabuzi kugirango" + +#, fuzzy +#~ msgid "template with C linkage" +#~ msgstr "Inyandikorugero Na: C" + +#, fuzzy +#~ msgid "template class without a name" +#~ msgstr "Inyandikorugero ishuri a Izina:" + +#, fuzzy +#~ msgid "`%D' does not declare a template type" +#~ msgstr "`%D'OYA a Inyandikorugero Ubwoko" + +#, fuzzy +#~ msgid "template definition of non-template `%#D'" +#~ msgstr "Inyandikorugero Insobanuro Bya Inyandikorugero" + +#, fuzzy +#~ msgid "expected %d levels of template parms for `%#D', got %d" +#~ msgstr "Ikitezwe: Intera Bya Inyandikorugero kugirango" + +#, fuzzy +#~ msgid "got %d template parameters for `%#D'" +#~ msgstr "Inyandikorugero Ibigenga kugirango" + +#, fuzzy +#~ msgid "got %d template parameters for `%#T'" +#~ msgstr "Inyandikorugero Ibigenga kugirango" + +#, fuzzy +#~ msgid " but %d required" +#~ msgstr "Bya ngombwa" + +#, fuzzy +#~ msgid "`%T' is not a template type" +#~ msgstr "`%T'ni OYA a Inyandikorugero Ubwoko" + +#, fuzzy +#~ msgid "previous declaration `%D'" +#~ msgstr "Ibanjirije" + +#, fuzzy +#~ msgid "used %d template parameter%s instead of %d" +#~ msgstr "Inyandikorugero Bya" + +#, fuzzy +#~ msgid "template parameter `%#D'" +#~ msgstr "Inyandikorugero" + +#, fuzzy +#~ msgid "redeclared here as `%#D'" +#~ msgstr "Nka" + +#, fuzzy +#~ msgid "redefinition of default argument for `%#D'" +#~ msgstr "Bya Mburabuzi kugirango" + +#, fuzzy +#~ msgid " original definition appeared here" +#~ msgstr "Umwimerere Insobanuro" + +#, fuzzy +#~ msgid "`%E' is not a valid template argument" +#~ msgstr "`%E'ni OYA a Byemewe Inyandikorugero" + +#, fuzzy +#~ msgid "it must be the address of a function with external linkage" +#~ msgstr "i Aderesi Bya a Umumaro Na: external" + +#, fuzzy +#~ msgid "it must be the address of an object with external linkage" +#~ msgstr "i Aderesi Bya Igikoresho Na: external" + +#, fuzzy +#~ msgid "it must be a pointer-to-member of the form `&X::Y'" +#~ msgstr "a Mweretsi Kuri Bya i Ifishi" + +#, fuzzy +#~ msgid "string literal %E is not a valid template argument because it is the address of an object with static linkage" +#~ msgstr "Ikurikiranyanyuguti ni OYA a Byemewe Inyandikorugero ni i Aderesi Bya Igikoresho Na:" + +#, fuzzy +#~ msgid "address of non-extern `%E' cannot be used as template argument" +#~ msgstr "Aderesi Bya Nka Inyandikorugero" + +#, fuzzy +#~ msgid "non-constant `%E' cannot be used as template argument" +#~ msgstr "Nka Inyandikorugero" + +#, fuzzy +#~ msgid "object `%E' cannot be used as template argument" +#~ msgstr "Igikoresho Nka Inyandikorugero" + +#, fuzzy +#~ msgid "to refer to a type member of a template parameter, use `typename %E'" +#~ msgstr "Kuri Kuri a Ubwoko Bya a Inyandikorugero Gukoresha" + +#, fuzzy +#~ msgid "type/value mismatch at argument %d in template parameter list for `%D'" +#~ msgstr "Ubwoko Agaciro ku in Inyandikorugero Urutonde kugirango" + +#, fuzzy +#~ msgid " expected a constant of type `%T', got `%T'" +#~ msgstr "Ikitezwe: a Bya Ubwoko" + +#, fuzzy +#~ msgid " expected a type, got `%E'" +#~ msgstr "Ikitezwe: a Ubwoko" + +#, fuzzy +#~ msgid " expected a type, got `%T'" +#~ msgstr "Ikitezwe: a Ubwoko" + +#, fuzzy +#~ msgid " expected a class template, got `%T'" +#~ msgstr "Ikitezwe: a ishuri Inyandikorugero" + +#, fuzzy +#~ msgid " expected a template of type `%D', got `%D'" +#~ msgstr "Ikitezwe: a Inyandikorugero Bya Ubwoko" + +#, fuzzy +#~ msgid "template-argument `%T' uses anonymous type" +#~ msgstr "Inyandikorugero Ubwoko" + +#, fuzzy +#~ msgid "template-argument `%T' uses local type `%T'" +#~ msgstr "Inyandikorugero Ubwoko" + +#, fuzzy +#~ msgid "template-argument `%T' is a variably modified type" +#~ msgstr "Inyandikorugero ni a Byahinduwe Ubwoko" + +#, fuzzy +#~ msgid "could not convert template argument `%E' to `%T'" +#~ msgstr "OYA GUHINDURA Inyandikorugero Kuri" + +#, fuzzy +#~ msgid "wrong number of template arguments (%d, should be %d)" +#~ msgstr "Umubare Bya Inyandikorugero ingingo" + +#, fuzzy +#~ msgid "provided for `%D'" +#~ msgstr "kugirango" + +#, fuzzy +#~ msgid "template argument %d is invalid" +#~ msgstr "Inyandikorugero ni Sibyo" + +#, fuzzy +#~ msgid "non-template used as template" +#~ msgstr "Inyandikorugero Nka Inyandikorugero" + +#, fuzzy +#~ msgid "`%T' is not a template" +#~ msgstr "`%T'ni OYA a Inyandikorugero" + +#, fuzzy +#~ msgid "non-template type `%T' used as a template" +#~ msgstr "Inyandikorugero Ubwoko Nka a Inyandikorugero" + +#, fuzzy +#~ msgid "for template declaration `%D'" +#~ msgstr "kugirango Inyandikorugero" + +#, fuzzy +#~ msgid "template instantiation depth exceeds maximum of %d (use -ftemplate-depth-NN to increase the maximum) instantiating `%D'" +#~ msgstr "Inyandikorugero Ubujyakuzimu Kinini Bya Gukoresha Ubujyakuzimu Kuri i Kinini" + +#, fuzzy +#~ msgid "ambiguous class template instantiation for `%#T'" +#~ msgstr "ishuri Inyandikorugero kugirango" + +# #-#-#-#-# dbaccess.pot (PACKAGE VERSION) #-#-#-#-# +# #-#-#-#-# dbaccess.pot (PACKAGE VERSION) #-#-#-#-# +# #-#-#-#-# dbaccess.pot (PACKAGE VERSION) #-#-#-#-# +#, fuzzy +#~ msgid "%s %+#T" +#~ msgstr "%s%+#T" + +#, fuzzy +#~ msgid "instantiation of `%D' as type `%T'" +#~ msgstr "Bya Nka Ubwoko" + +#, fuzzy +#~ msgid "invalid parameter type `%T'" +#~ msgstr "Sibyo Ubwoko" + +#, fuzzy +#~ msgid "in declaration `%D'" +#~ msgstr "in" + +#, fuzzy +#~ msgid "creating pointer to member function of non-class type `%T'" +#~ msgstr "Mweretsi Kuri Umumaro Bya ishuri Ubwoko" + +#, fuzzy +#~ msgid "creating array with size zero" +#~ msgstr "Imbonerahamwe Na: Ingano Zeru" + +#, fuzzy +#~ msgid "creating array with size zero (`%E')" +#~ msgstr "Imbonerahamwe Na: Ingano Zeru" + +#, fuzzy +#~ msgid "forming reference to void" +#~ msgstr "Indango Kuri" + +#, fuzzy +#~ msgid "forming %s to reference type `%T'" +#~ msgstr "Kuri Indango Ubwoko" + +#, fuzzy +#~ msgid "creating pointer to member of non-class type `%T'" +#~ msgstr "Mweretsi Kuri Bya ishuri Ubwoko" + +#, fuzzy +#~ msgid "creating pointer to member reference type `%T'" +#~ msgstr "Mweretsi Kuri Indango Ubwoko" + +#, fuzzy +#~ msgid "creating array of `%T'" +#~ msgstr "Imbonerahamwe Bya" + +#, fuzzy +#~ msgid "`%T' is not a class, struct, or union type" +#~ msgstr "`%T'ni OYA a ishuri Cyangwa Ihuza Ubwoko" + +#, fuzzy +#~ msgid "use of `%s' in template" +#~ msgstr "Gukoresha Bya in Inyandikorugero" + +#, fuzzy +#~ msgid "type `%T' composed from a local class is not a valid template-argument" +#~ msgstr "Ubwoko Bivuye a ishuri ni OYA a Byemewe Inyandikorugero" + +#, fuzzy +#~ msgid " trying to instantiate `%D'" +#~ msgstr "Kuri" + +#, fuzzy +#~ msgid "incomplete type unification" +#~ msgstr "Ubwoko" + +#, fuzzy +#~ msgid "use of `%s' in template type unification" +#~ msgstr "Gukoresha Bya in Inyandikorugero Ubwoko" + +#, fuzzy +#~ msgid "explicit instantiation of non-template `%#D'" +#~ msgstr "Bya Inyandikorugero" + +#, fuzzy +#~ msgid "no matching template for `%D' found" +#~ msgstr "Oya Inyandikorugero kugirango Byabonetse" + +#, fuzzy +#~ msgid "explicit instantiation of `%#D'" +#~ msgstr "Bya" + +#, fuzzy +#~ msgid "duplicate explicit instantiation of `%#D'" +#~ msgstr "Gusubiramo Bya" + +#, fuzzy +#~ msgid "ISO C++ forbids the use of `extern' on explicit instantiations" +#~ msgstr "C i Gukoresha Bya ku" + +#, fuzzy +#~ msgid "storage class `%D' applied to template instantiation" +#~ msgstr "ishuri Byashyizweho Kuri Inyandikorugero" + +#, fuzzy +#~ msgid "explicit instantiation of non-template type `%T'" +#~ msgstr "Bya Inyandikorugero Ubwoko" + +#, fuzzy +#~ msgid "explicit instantiation of `%#T' before definition of template" +#~ msgstr "Bya Mbere Insobanuro Bya Inyandikorugero" + +#, fuzzy +#~ msgid "ISO C++ forbids the use of `%s' on explicit instantiations" +#~ msgstr "C i Gukoresha Bya ku" + +#, fuzzy +#~ msgid "duplicate explicit instantiation of `%#T'" +#~ msgstr "Gusubiramo Bya" + +#, fuzzy +#~ msgid "explicit instantiation of `%D' but no definition available" +#~ msgstr "Bya Oya Insobanuro Bihari" + +#, fuzzy +#~ msgid "`%#T' is not a valid type for a template constant parameter" +#~ msgstr "`%#T'ni OYA a Byemewe Ubwoko kugirango a Inyandikorugero" + +#, fuzzy +#~ msgid "-frepo must be used with -c" +#~ msgstr "-Na: C" + +#, fuzzy +#~ msgid "mysterious repository information in %s" +#~ msgstr "Ibisobanuro in" + +#, fuzzy +#~ msgid "can't create repository information file `%s'" +#~ msgstr "Kurema Ibisobanuro IDOSIYE" + +#, fuzzy +#~ msgid "cannot use typeid with -fno-rtti" +#~ msgstr "Gukoresha Na:" + +#, fuzzy +#~ msgid "must #include before using typeid" +#~ msgstr "Gushyiramo Mbere ikoresha" + +#, fuzzy +#~ msgid "cannot create type information for type `%T' because its size is variable" +#~ msgstr "Kurema Ubwoko Ibisobanuro kugirango Ubwoko Ingano ni IMPINDURAGACIRO" + +#, fuzzy +#~ msgid "dynamic_cast of `%#D' to `%#T' can never succeed" +#~ msgstr "Bya Kuri Nta narimwe" + +#, fuzzy +#~ msgid "cannot dynamic_cast `%E' (of type `%#T') to type `%#T' (%s)" +#~ msgstr "Bya Ubwoko Kuri Ubwoko" + +#, fuzzy +#~ msgid "`%T' is an inaccessible base of `%T'" +#~ msgstr "`%T'ni SHINGIRO Bya" + +#, fuzzy +#~ msgid "`%T' is an ambiguous base of `%T'" +#~ msgstr "`%T'ni SHINGIRO Bya" + +#, fuzzy +#~ msgid "assignment to non-static member `%D' of enclosing class `%T'" +#~ msgstr "Igenera Kuri Bya ishuri" + +#, fuzzy +#~ msgid "adjusting pointers for covariant returns" +#~ msgstr "kugirango" + +#, fuzzy +#~ msgid "invalid covariant return type for `%#D'" +#~ msgstr "Sibyo Garuka Ubwoko kugirango" + +#, fuzzy +#~ msgid " overriding `%#D' (must be pointer or reference to class)" +#~ msgstr "Mweretsi Cyangwa Indango Kuri ishuri" + +#, fuzzy +#~ msgid " overriding `%#D' (must use pointer or reference)" +#~ msgstr "Gukoresha Mweretsi Cyangwa Indango" + +#, fuzzy +#~ msgid "conflicting return type specified for `%#D'" +#~ msgstr "Garuka Ubwoko kugirango" + +#, fuzzy +#~ msgid "looser throw specifier for `%#F'" +#~ msgstr "kugirango" + +#, fuzzy +#~ msgid " since `%#D' declared in base class" +#~ msgstr "guhera in SHINGIRO ishuri" + +#, fuzzy +#~ msgid "`%#D' needs a final overrider" +#~ msgstr "`%#D'a" + +#, fuzzy +#~ msgid "type of asm operand `%E' could not be determined" +#~ msgstr "Ubwoko Bya OYA" + +#, fuzzy +#~ msgid "ISO C++ does not permit named return values" +#~ msgstr "C OYA Garuka Uduciro" + +#, fuzzy +#~ msgid "return identifier `%D' already in place" +#~ msgstr "Garuka Ikiranga in" + +#, fuzzy +#~ msgid "can't redefine default return value for constructors" +#~ msgstr "Mburabuzi Garuka Agaciro kugirango" + +#, fuzzy +#~ msgid "only constructors take base initializers" +#~ msgstr "SHINGIRO" + +#, fuzzy +#~ msgid "`this' is unavailable for static member functions" +#~ msgstr "`ni kugirango Imimaro" + +#, fuzzy +#~ msgid "invalid use of `this' in non-member function" +#~ msgstr "Sibyo Gukoresha Bya in Umumaro" + +#, fuzzy +#~ msgid "invalid use of `this' at top level" +#~ msgstr "Sibyo Gukoresha Bya ku Hejuru: urwego" + +#, fuzzy +#~ msgid "calling type `%T' like a method" +#~ msgstr "Ubwoko nka a Uburyo" + +#, fuzzy +#~ msgid "destructor specifier `%T::~%T()' must have matching names" +#~ msgstr "Amazina" + +#, fuzzy +#~ msgid "`%E' is not of type `%T'" +#~ msgstr "`%E'ni OYA Bya Ubwoko" + +#, fuzzy +#~ msgid "template type parameters must use the keyword `class' or `typename'" +#~ msgstr "Inyandikorugero Ubwoko Ibigenga Gukoresha i Ijambo- banze Cyangwa" + +#, fuzzy +#~ msgid "invalid default template argument" +#~ msgstr "Sibyo Mburabuzi Inyandikorugero" + +#, fuzzy +#~ msgid "definition of `%#T' inside template parameter list" +#~ msgstr "Insobanuro Bya Mo Imbere Inyandikorugero Urutonde" + +#, fuzzy +#~ msgid "invalid definition of qualified type `%T'" +#~ msgstr "Sibyo Insobanuro Bya Ubwoko" + +#, fuzzy +#~ msgid "invalid base-class specification" +#~ msgstr "Sibyo SHINGIRO ishuri" + +#, fuzzy +#~ msgid "base class `%T' has cv qualifiers" +#~ msgstr "SHINGIRO ishuri" + +#, fuzzy +#~ msgid "multiple declarators in template declaration" +#~ msgstr "Igikubo in Inyandikorugero" + +#, fuzzy +#~ msgid "type of `%E' is unknown" +#~ msgstr "Ubwoko Bya ni Kitazwi" + +#, fuzzy +#~ msgid "identifier name `%s' conflicts with GNU C++ internal naming strategy" +#~ msgstr "Ikiranga Izina: Na: C By'imbere" + +#, fuzzy +#~ msgid "parse error at end of saved function text" +#~ msgstr "Ikosa ku Impera Bya Umumaro Umwandiko" + +#, fuzzy +#~ msgid "%Hend of file read inside definition" +#~ msgstr "%HendBya IDOSIYE Gusoma Mo Imbere Insobanuro" + +#, fuzzy +#~ msgid "parse error in method specification" +#~ msgstr "Ikosa in Uburyo" + +#, fuzzy +#~ msgid "function body for constructor missing" +#~ msgstr "Umumaro Umubiri kugirango Ibuze" + +#, fuzzy +#~ msgid "%Hend of file read inside default argument" +#~ msgstr "%HendBya IDOSIYE Gusoma Mo Imbere Mburabuzi" + +#, fuzzy +#~ msgid "circular dependency in default args of `%#D'" +#~ msgstr "Cy'uruziga in Mburabuzi Bya" + +#, fuzzy +#~ msgid "invalid type `%T' for default argument to `%T'" +#~ msgstr "Sibyo Ubwoko kugirango Mburabuzi Kuri" + +#, fuzzy +#~ msgid "%s before `%s'" +#~ msgstr "%sMbere" + +#, fuzzy +#~ msgid "%s before `%c'" +#~ msgstr "%sMbere" + +#, fuzzy +#~ msgid "%s before `\\%o'" +#~ msgstr "%sMbere" + +#, fuzzy +#~ msgid "%s before `%s' token" +#~ msgstr "%sMbere" + +#, fuzzy +#~ msgid "non-lvalue in %s" +#~ msgstr "in" + +#, fuzzy +#~ msgid "`%V' qualifiers cannot be applied to `%T'" +#~ msgstr "`%V'Byashyizweho Kuri" + +#, fuzzy +#~ msgid "`%s' attribute can only be applied to Java class definitions" +#~ msgstr "`%s'Ikiranga Byashyizweho Kuri ishuri" + +#, fuzzy +#~ msgid "`%s' attribute can only be applied to class definitions" +#~ msgstr "`%s'Ikiranga Byashyizweho Kuri ishuri" + +#, fuzzy +#~ msgid "`%s' is obsolete; g++ vtables are now COM-compatible by default" +#~ msgstr "`%s'ni g NONEAHA ku Mburabuzi" + +#, fuzzy +#~ msgid "requested init_priority is not an integer constant" +#~ msgstr "ni OYA Umubare wuzuye" + +#, fuzzy +#~ msgid "can only use `%s' attribute on file-scope definitions of objects of class type" +#~ msgstr "Gukoresha Ikiranga ku IDOSIYE Ingano: Bya Ibintu Bya ishuri Ubwoko" + +#, fuzzy +#~ msgid "requested init_priority is out of range" +#~ msgstr "ni Inyuma Bya Urutonde" + +#, fuzzy +#~ msgid "requested init_priority is reserved for internal use" +#~ msgstr "ni kugirango By'imbere Gukoresha" + +#, fuzzy +#~ msgid "`%s' attribute is not supported on this platform" +#~ msgstr "`%s'Ikiranga ni OYA ku iyi" + +#, fuzzy +#~ msgid "lang_* check: failed in %s, at %s:%d" +#~ msgstr "Kugenzura... Byanze in ku" + +#, fuzzy +#~ msgid "ISO C++ forbids %s between pointer of type `void *' and pointer-to-function" +#~ msgstr "C hagati Mweretsi Bya Ubwoko Na Mweretsi Kuri Umumaro" + +#, fuzzy +#~ msgid "%s between distinct pointer types `%T' and `%T' lacks a cast" +#~ msgstr "%shagati Mweretsi Na a" + +#, fuzzy +#~ msgid "ISO C++ prohibits conversion from `%#T' to `(...)'" +#~ msgstr "C Ihindurangero Bivuye Kuri" + +#, fuzzy +#~ msgid "invalid application of `%s' to a member function" +#~ msgstr "Sibyo Porogaramu Bya Kuri a Umumaro" + +#, fuzzy +#~ msgid "invalid application of `%s' to non-static member" +#~ msgstr "Sibyo Porogaramu Bya Kuri" + +#, fuzzy +#~ msgid "sizeof applied to a bit-field" +#~ msgstr "Byashyizweho Kuri a Umwanya" + +#, fuzzy +#~ msgid "ISO C++ forbids applying `sizeof' to an expression of function type" +#~ msgstr "C Kuri imvugo Bya Umumaro Ubwoko" + +#, fuzzy +#~ msgid "invalid use of non-lvalue array" +#~ msgstr "Sibyo Gukoresha Bya Imbonerahamwe" + +#, fuzzy +#~ msgid "deprecated conversion from string constant to `%T'" +#~ msgstr "Bitemewe. Ihindurangero Bivuye Ikurikiranyanyuguti Kuri" + +#, fuzzy +#~ msgid "request for member `%D' in `%E', which is of non-class type `%T'" +#~ msgstr "Kubaza... kugirango in ni Bya ishuri Ubwoko" + +#, fuzzy +#~ msgid "`%D' is not a member of `%T'" +#~ msgstr "`%D'ni OYA a Bya" + +#, fuzzy +#~ msgid "invalid access to non-static data member `%D' of NULL object" +#~ msgstr "Sibyo Kuri Ibyatanzwe Bya Igikoresho" + +#, fuzzy +#~ msgid "(perhaps the `offsetof' macro was used incorrectly)" +#~ msgstr "(i Makoro" + +#, fuzzy +#~ msgid "`%D::%D' is not a member of `%T'" +#~ msgstr "`%D::%D'ni OYA a Bya" + +#, fuzzy +#~ msgid "destructor specifier `%T::~%T' must have matching names" +#~ msgstr "Amazina" + +#, fuzzy +#~ msgid "type `%T' has no destructor" +#~ msgstr "Ubwoko Oya" + +#, fuzzy +#~ msgid "`%D' is not a member template function" +#~ msgstr "`%D'ni OYA a Inyandikorugero Umumaro" + +#, fuzzy +#~ msgid "`%T' is not a pointer-to-object type" +#~ msgstr "`%T'ni OYA a Mweretsi Kuri Igikoresho Ubwoko" + +#, fuzzy +#~ msgid "invalid use of `%s' on pointer to member" +#~ msgstr "Sibyo Gukoresha Bya ku Mweretsi Kuri" + +#, fuzzy +#~ msgid "invalid type argument" +#~ msgstr "Sibyo Ubwoko" + +#, fuzzy +#~ msgid "ISO C++ forbids subscripting non-lvalue array" +#~ msgstr "C Imbonerahamwe" + +#, fuzzy +#~ msgid "subscripting array declared `register'" +#~ msgstr "Imbonerahamwe" + +#, fuzzy +#~ msgid "object missing in use of `%E'" +#~ msgstr "Igikoresho Ibuze in Gukoresha Bya" + +#, fuzzy +#~ msgid "ISO C++ forbids calling `::main' from within program" +#~ msgstr "C Bivuye muri Porogaramu" + +#, fuzzy +#~ msgid "must use .* or ->* to call pointer-to-member function in `%E (...)'" +#~ msgstr "Gukoresha Cyangwa Kuri Mweretsi Kuri Umumaro in" + +#, fuzzy +#~ msgid "`%E' cannot be used as a function" +#~ msgstr "`%E'Nka a Umumaro" + +#, fuzzy +#~ msgid "too many arguments to %s `%+#D'" +#~ msgstr "ingingo Kuri" + +#, fuzzy +#~ msgid "parameter type of called function is incomplete" +#~ msgstr "Ubwoko Bya Umumaro ni" + +#, fuzzy +#~ msgid "too few arguments to %s `%+#D'" +#~ msgstr "ingingo Kuri" + +#, fuzzy +#~ msgid "assuming cast to type `%T' from overloaded function" +#~ msgstr "Kuri Ubwoko Bivuye Umumaro" + +#, fuzzy +#~ msgid "division by zero in `%E / 0'" +#~ msgstr "ku Zeru in" + +#, fuzzy +#~ msgid "division by zero in `%E / 0.'" +#~ msgstr "ku Zeru in 0" + +#, fuzzy +#~ msgid "division by zero in `%E %% 0'" +#~ msgstr "ku Zeru in" + +#, fuzzy +#~ msgid "division by zero in `%E %% 0.'" +#~ msgstr "ku Zeru in 0" + +#, fuzzy +#~ msgid "%s rotate count is negative" +#~ msgstr "%sKuzerutsa IBARA ni" + +#, fuzzy +#~ msgid "%s rotate count >= width of type" +#~ msgstr "%sKuzerutsa IBARA Ubugari Bya Ubwoko" + +#, fuzzy +#~ msgid "ISO C++ forbids comparison between pointer and integer" +#~ msgstr "C hagati Mweretsi Na Umubare wuzuye" + +#, fuzzy +#~ msgid "comparison between types `%#T' and `%#T'" +#~ msgstr "hagati Na" + +#, fuzzy +#~ msgid "comparison between signed and unsigned integer expressions" +#~ msgstr "hagati Na Bitashizweho umukono Umubare wuzuye" + +#, fuzzy +#~ msgid "invalid operands of types `%T' and `%T' to binary `%O'" +#~ msgstr "Sibyo Bya Na Kuri Nyabibiri" + +#, fuzzy +#~ msgid "NULL used in arithmetic" +#~ msgstr "in" + +#, fuzzy +#~ msgid "ISO C++ forbids using pointer of type `void *' in subtraction" +#~ msgstr "C ikoresha Mweretsi Bya Ubwoko in Gukuramo" + +#, fuzzy +#~ msgid "ISO C++ forbids using pointer to a function in subtraction" +#~ msgstr "C ikoresha Mweretsi Kuri a Umumaro in Gukuramo" + +#, fuzzy +#~ msgid "ISO C++ forbids using pointer to a method in subtraction" +#~ msgstr "C ikoresha Mweretsi Kuri a Uburyo in Gukuramo" + +#, fuzzy +#~ msgid "ISO C++ forbids using pointer to a member in subtraction" +#~ msgstr "C ikoresha Mweretsi Kuri a in Gukuramo" + +#, fuzzy +#~ msgid "invalid use of a pointer to an incomplete type in pointer arithmetic" +#~ msgstr "Sibyo Gukoresha Bya a Mweretsi Kuri Ubwoko in Mweretsi" + +#, fuzzy +#~ msgid "invalid use of '%E' to form a pointer-to-member-function. Use a qualified-id." +#~ msgstr "Sibyo Gukoresha Bya Kuri Ifishi a Mweretsi Kuri Umumaro a ID" + +#, fuzzy +#~ msgid "parenthesis around '%E' cannot be used to form a pointer-to-member-function" +#~ msgstr "Kuri Ifishi a Mweretsi Kuri Umumaro" + +#, fuzzy +#~ msgid "taking address of temporary" +#~ msgstr "Aderesi Bya By'igihe gito" + +#, fuzzy +#~ msgid "ISO C++ forbids %sing an enum" +#~ msgstr "C" + +#, fuzzy +#~ msgid "cannot %s a pointer to incomplete type `%T'" +#~ msgstr "a Mweretsi Kuri Ubwoko" + +#, fuzzy +#~ msgid "ISO C++ forbids %sing a pointer of type `%T'" +#~ msgstr "C a Mweretsi Bya Ubwoko" + +#, fuzzy +#~ msgid "cast to non-reference type used as lvalue" +#~ msgstr "Kuri Indango Ubwoko Nka" + +#, fuzzy +#~ msgid "invalid use of `--' on bool variable `%D'" +#~ msgstr "Sibyo Gukoresha Bya ku IMPINDURAGACIRO" + +#, fuzzy +#~ msgid "ISO C++ forbids taking address of function `::main'" +#~ msgstr "C Aderesi Bya Umumaro" + +#, fuzzy +#~ msgid "ISO C++ forbids taking the address of an unqualified non-static member function to form a pointer to member function. Say `&%T::%D'" +#~ msgstr "C i Aderesi Bya Umumaro Kuri Ifishi a Mweretsi Kuri Umumaro" + +#, fuzzy +#~ msgid "ISO C++ forbids taking the address of a bound member function to form a pointer to member function. Say `&%T::%D'" +#~ msgstr "C i Aderesi Bya a Umumaro Kuri Ifishi a Mweretsi Kuri Umumaro" + +#, fuzzy +#~ msgid "ISO C++ forbids taking the address of a cast to a non-lvalue expression" +#~ msgstr "C i Aderesi Bya a Kuri a imvugo" + +#, fuzzy +#~ msgid "attempt to take address of bit-field structure member `%D'" +#~ msgstr "Kuri Aderesi Bya Umwanya Imiterere" + +#, fuzzy +#~ msgid "taking address of destructor" +#~ msgstr "Aderesi Bya" + +#, fuzzy +#~ msgid "taking address of bound pointer-to-member expression" +#~ msgstr "Aderesi Bya Mweretsi Kuri imvugo" + +#, fuzzy +#~ msgid "cannot create pointer to reference member `%D'" +#~ msgstr "Kurema Mweretsi Kuri Indango" + +#, fuzzy +#~ msgid "cannot take the address of `this', which is an rvalue expression" +#~ msgstr "i Aderesi Bya ni imvugo" + +#, fuzzy +#~ msgid "address requested for `%D', which is declared `register'" +#~ msgstr "Aderesi kugirango ni" + +#, fuzzy +#~ msgid "static_cast from type `%T' to type `%T' casts away constness" +#~ msgstr "Bivuye Ubwoko Kuri Ubwoko" + +#, fuzzy +#~ msgid "invalid static_cast from type `%T' to type `%T'" +#~ msgstr "Sibyo Bivuye Ubwoko Kuri Ubwoko" + +#, fuzzy +#~ msgid "invalid reinterpret_cast of an rvalue expression of type `%T' to type `%T'" +#~ msgstr "Sibyo Bya imvugo Bya Ubwoko Kuri Ubwoko" + +#, fuzzy +#~ msgid "reinterpret_cast from `%T' to `%T' loses precision" +#~ msgstr "Bivuye Kuri" + +#, fuzzy +#~ msgid "reinterpret_cast from `%T' to `%T' casts away const (or volatile)" +#~ msgstr "Bivuye Kuri Cyangwa" + +#, fuzzy +#~ msgid "ISO C++ forbids casting between pointer-to-function and pointer-to-object" +#~ msgstr "C hagati Mweretsi Kuri Umumaro Na Mweretsi Kuri Igikoresho" + +#, fuzzy +#~ msgid "invalid reinterpret_cast from type `%T' to type `%T'" +#~ msgstr "Sibyo Bivuye Ubwoko Kuri Ubwoko" + +#, fuzzy +#~ msgid "invalid use of const_cast with type `%T', which is not a pointer, reference, nor a pointer-to-data-member type" +#~ msgstr "Sibyo Gukoresha Bya Na: Ubwoko ni OYA a Mweretsi Indango a Mweretsi Kuri Ibyatanzwe Ubwoko" + +#, fuzzy +#~ msgid "invalid use of const_cast with type `%T', which is a pointer or reference to a function type" +#~ msgstr "Sibyo Gukoresha Bya Na: Ubwoko ni a Mweretsi Cyangwa Indango Kuri a Umumaro Ubwoko" + +#, fuzzy +#~ msgid "invalid const_cast of an rvalue of type `%T' to type `%T'" +#~ msgstr "Sibyo Bya Bya Ubwoko Kuri Ubwoko" + +#, fuzzy +#~ msgid "invalid const_cast from type `%T' to type `%T'" +#~ msgstr "Sibyo Bivuye Ubwoko Kuri Ubwoko" + +#, fuzzy +#~ msgid "ISO C++ forbids casting to an array type `%T'" +#~ msgstr "C Kuri Imbonerahamwe Ubwoko" + +#, fuzzy +#~ msgid "invalid cast to function type `%T'" +#~ msgstr "Sibyo Kuri Umumaro Ubwoko" + +#, fuzzy +#~ msgid "cast from `%T' to `%T' discards qualifiers from pointer target type" +#~ msgstr "Bivuye Kuri Bivuye Mweretsi Intego Ubwoko" + +#, fuzzy +#~ msgid "cast from `%T' to `%T' increases required alignment of target type" +#~ msgstr "Bivuye Kuri Bya ngombwa Itunganya Bya Intego Ubwoko" + +#, fuzzy +#~ msgid " in evaluation of `%Q(%#T, %#T)'" +#~ msgstr "in Bya" + +#, fuzzy +#~ msgid "ISO C++ forbids cast to non-reference type used as lvalue" +#~ msgstr "C Kuri Indango Ubwoko Nka" + +#, fuzzy +#~ msgid "incompatible types in assignment of `%T' to `%T'" +#~ msgstr "in Igenera Bya Kuri" + +#, fuzzy +#~ msgid "ISO C++ forbids assignment of arrays" +#~ msgstr "C Igenera Bya" + +#, fuzzy +#~ msgid " in pointer to member function conversion" +#~ msgstr "in Mweretsi Kuri Umumaro Ihindurangero" + +#, fuzzy +#~ msgid " in pointer to member conversion" +#~ msgstr "in Mweretsi Kuri Ihindurangero" + +#, fuzzy +#~ msgid "pointer to member cast via virtual base `%T' of `%T'" +#~ msgstr "Mweretsi Kuri Biturutse Kitaboneka SHINGIRO Bya" + +#, fuzzy +#~ msgid "pointer to member conversion via virtual base `%T' of `%T'" +#~ msgstr "Mweretsi Kuri Ihindurangero Biturutse Kitaboneka SHINGIRO Bya" + +#, fuzzy +#~ msgid "invalid conversion to type `%T' from type `%T'" +#~ msgstr "Sibyo Ihindurangero Kuri Ubwoko Bivuye Ubwoko" + +#, fuzzy +#~ msgid "passing NULL used for non-pointer %s %P of `%D'" +#~ msgstr "kugirango Mweretsi Bya" + +#, fuzzy +#~ msgid "%s to non-pointer type `%T' from NULL" +#~ msgstr "%sKuri Mweretsi Ubwoko Bivuye" + +#, fuzzy +#~ msgid "passing `%T' for %s %P of `%D'" +#~ msgstr "kugirango Bya" + +#, fuzzy +#~ msgid "%s to `%T' from `%T'" +#~ msgstr "%sKuri Bivuye" + +#, fuzzy +#~ msgid "passing negative value `%E' for %s %P of `%D'" +#~ msgstr "Agaciro kugirango Bya" + +#, fuzzy +#~ msgid "%s of negative value `%E' to `%T'" +#~ msgstr "%sBya Agaciro Kuri" + +#, fuzzy +#~ msgid "cannot convert `%T' to `%T' for argument `%P' to `%D'" +#~ msgstr "GUHINDURA Kuri kugirango Kuri" + +#, fuzzy +#~ msgid "cannot convert `%T' to `%T' in %s" +#~ msgstr "GUHINDURA Kuri in" + +#, fuzzy +#~ msgid "in passing argument %P of `%+D'" +#~ msgstr "in Bya" + +#, fuzzy +#~ msgid "returning reference to temporary" +#~ msgstr "Indango Kuri By'igihe gito" + +#, fuzzy +#~ msgid "reference to non-lvalue returned" +#~ msgstr "Indango Kuri" + +#, fuzzy +#~ msgid "reference to local variable `%D' returned" +#~ msgstr "Indango Kuri IMPINDURAGACIRO" + +#, fuzzy +#~ msgid "address of local variable `%D' returned" +#~ msgstr "Aderesi Bya IMPINDURAGACIRO" + +#, fuzzy +#~ msgid "returning a value from a destructor" +#~ msgstr "a Agaciro Bivuye a" + +#, fuzzy +#~ msgid "cannot return from a handler of a function-try-block of a constructor" +#~ msgstr "Garuka Bivuye a Bya a Umumaro Funga Bya a" + +#, fuzzy +#~ msgid "returning a value from a constructor" +#~ msgstr "a Agaciro Bivuye a" + +#, fuzzy +#~ msgid "return-statement with no value, in function declared with a non-void return type" +#~ msgstr "Garuka Inyandiko Na: Oya Agaciro in Umumaro Na: a Garuka Ubwoko" + +#, fuzzy +#~ msgid "return-statement with a value, in function declared with a void return type" +#~ msgstr "Garuka Inyandiko Na: a Agaciro in Umumaro Na: a Garuka Ubwoko" + +#, fuzzy +#~ msgid "`operator new' must not return NULL unless it is declared `throw()' (or -fcheck-new is in effect)" +#~ msgstr "`Mukoresha OYA Garuka ni Cyangwa Gishya ni in INGARUKA" + +#, fuzzy +#~ msgid "type `%T' is not a base type for type `%T'" +#~ msgstr "Ubwoko ni OYA a SHINGIRO Ubwoko kugirango Ubwoko" + +#, fuzzy +#~ msgid "cannot declare variable `%D' to be of type `%T'" +#~ msgstr "IMPINDURAGACIRO Kuri Bya Ubwoko" + +#, fuzzy +#~ msgid "cannot declare parameter `%D' to be of type `%T'" +#~ msgstr "Kuri Bya Ubwoko" + +#, fuzzy +#~ msgid "cannot declare field `%D' to be of type `%T'" +#~ msgstr "Umwanya Kuri Bya Ubwoko" + +#, fuzzy +#~ msgid "invalid return type for member function `%#D'" +#~ msgstr "Sibyo Garuka Ubwoko kugirango Umumaro" + +#, fuzzy +#~ msgid "invalid return type for function `%#D'" +#~ msgstr "Sibyo Garuka Ubwoko kugirango Umumaro" + +#, fuzzy +#~ msgid "cannot allocate an object of type `%T'" +#~ msgstr "Igikoresho Bya Ubwoko" + +#, fuzzy +#~ msgid " because the following virtual functions are abstract:" +#~ msgstr "i Kitaboneka Imimaro Incamake" + +# basctl/source\basicide\basidesh.src:RID_IMGBTN_REMOVEWATCH.text +#, fuzzy +#~ msgid "\t%#D" +#~ msgstr "%#D" + +#, fuzzy +#~ msgid " since type `%T' has abstract virtual functions" +#~ msgstr "guhera Ubwoko Incamake Kitaboneka Imimaro" + +#, fuzzy +#~ msgid "constructor syntax used, but no constructor declared for type `%T'" +#~ msgstr "Oya kugirango Ubwoko" + +#, fuzzy +#~ msgid "comma expression used to initialize return value" +#~ msgstr "Akitso imvugo Kuri gutangiza Garuka Agaciro" + +#, fuzzy +#~ msgid "cannot initialize arrays using this syntax" +#~ msgstr "gutangiza ikoresha iyi" + +#, fuzzy +#~ msgid "initializing array with parameter list" +#~ msgstr "Gutangiza Imbonerahamwe Na: Urutonde" + +#, fuzzy +#~ msgid "initializer for scalar variable requires one element" +#~ msgstr "kugirango IMPINDURAGACIRO Ikigize:" + +#, fuzzy +#~ msgid "braces around scalar initializer for `%T'" +#~ msgstr "Ingirwadusodeko kugirango" + +#, fuzzy +#~ msgid "ignoring extra initializers for `%T'" +#~ msgstr "Birenga kugirango" + +#, fuzzy +#~ msgid "variable-sized object of type `%T' may not be initialized" +#~ msgstr "IMPINDURAGACIRO Igikoresho Bya Ubwoko Gicurasi OYA" + +#, fuzzy +#~ msgid "subobject of type `%T' must be initialized by constructor, not by `%E'" +#~ msgstr "Bya Ubwoko ku OYA ku" + +#, fuzzy +#~ msgid "aggregate has a partly bracketed initializer" +#~ msgstr "a" + +#, fuzzy +#~ msgid "non-empty initializer for array of empty elements" +#~ msgstr "ubusa kugirango Imbonerahamwe Bya ubusa Ibintu" + +#, fuzzy +#~ msgid "initializer list for object of class with virtual base classes" +#~ msgstr "Urutonde kugirango Igikoresho Bya ishuri Na: Kitaboneka SHINGIRO Inzego" + +#, fuzzy +#~ msgid "initializer list for object of class with base classes" +#~ msgstr "Urutonde kugirango Igikoresho Bya ishuri Na: SHINGIRO Inzego" + +#, fuzzy +#~ msgid "initializer list for object using virtual functions" +#~ msgstr "Urutonde kugirango Igikoresho ikoresha Kitaboneka Imimaro" + +#, fuzzy +#~ msgid "missing initializer for member `%D'" +#~ msgstr "Ibuze kugirango" + +#, fuzzy +#~ msgid "uninitialized const member `%D'" +#~ msgstr "Itatangijwe" + +#, fuzzy +#~ msgid "member `%D' with uninitialized const fields" +#~ msgstr "Na: Itatangijwe Imyanya" + +#, fuzzy +#~ msgid "member `%D' is uninitialized reference" +#~ msgstr "ni Itatangijwe Indango" + +#, fuzzy +#~ msgid "index value instead of field name in union initializer" +#~ msgstr "Umubarendanga Agaciro Bya Umwanya Izina: in Ihuza" + +#, fuzzy +#~ msgid "no field `%D' in union being initialized" +#~ msgstr "Oya Umwanya in Ihuza" + +#, fuzzy +#~ msgid "union `%T' with no named members cannot be initialized" +#~ msgstr "Ihuza Na: Oya" + +#, fuzzy +#~ msgid "excess elements in aggregate initializer" +#~ msgstr "Ibintu in" + +#, fuzzy +#~ msgid "circular pointer delegation detected" +#~ msgstr "Cy'uruziga Mweretsi" + +#, fuzzy +#~ msgid "base operand of `->' has non-pointer type `%T'" +#~ msgstr "SHINGIRO Bya Mweretsi Ubwoko" + +#, fuzzy +#~ msgid "result of `operator->()' yields non-pointer result" +#~ msgstr "Igisubizo Bya Mukoresha Mweretsi Igisubizo" + +#, fuzzy +#~ msgid "base operand of `->' is not a pointer" +#~ msgstr "SHINGIRO Bya ni OYA a Mweretsi" + +#, fuzzy +#~ msgid "`%E' cannot be used as a member pointer, since it is of type `%T'" +#~ msgstr "`%E'Nka a Mweretsi guhera ni Bya Ubwoko" + +#, fuzzy +#~ msgid "cannot apply member pointer `%E' to `%E', which is of non-aggregate type `%T'" +#~ msgstr "Gukurikiza Mweretsi Kuri ni Bya Ubwoko" + +#, fuzzy +#~ msgid "member type `%T::' incompatible with object type `%T'" +#~ msgstr "Ubwoko Na: Igikoresho Ubwoko" + +#, fuzzy +#~ msgid "`%T' fails to be a typedef or built-in type" +#~ msgstr "`%T'Kuri a Cyangwa in Ubwoko" + +#, fuzzy +#~ msgid "ISO C++ forbids defining types within %s" +#~ msgstr "C muri" + +#, fuzzy +#~ msgid "call to function `%D' which throws incomplete type `%#T'" +#~ msgstr "Kuri Umumaro Ubwoko" + +#, fuzzy +#~ msgid "call to function which throws incomplete type `%#T'" +#~ msgstr "Kuri Umumaro Ubwoko" + +#, fuzzy +#~ msgid "%s is deprecated, please see the documentation for details" +#~ msgstr "%sni Bitemewe. i kugirango Birambuye" + +#, fuzzy +#~ msgid "Do not obey access control semantics" +#~ msgstr "OYA Igenzura" + +#, fuzzy +#~ msgid "Change when template instances are emitted" +#~ msgstr "Ryari: Inyandikorugero Ingero" + +#, fuzzy +#~ msgid "Check the return value of new" +#~ msgstr "i Garuka Agaciro Bya Gishya" + +#, fuzzy +#~ msgid "Reduce size of object files" +#~ msgstr "Ingano Bya Igikoresho Idosiye" + +#, fuzzy +#~ msgid "Make string literals `char[]' instead of `const char[]'" +#~ msgstr "Ikurikiranyanyuguti INYUGUTI Bya INYUGUTI" + +#, fuzzy +#~ msgid "Dump the entire translation unit to a file" +#~ msgstr "i Umwandiko wahinduwe ururimi Igice: Kuri a IDOSIYE" + +#, fuzzy +#~ msgid "Do not inline member functions by default" +#~ msgstr "OYA Mumurongo Imimaro ku Mburabuzi" + +#, fuzzy +#~ msgid "Do not generate run time type descriptor information" +#~ msgstr "OYA Gukoresha Igihe Ubwoko Ibisobanuro" + +#, fuzzy +#~ msgid "Do not generate code to check exception specifications" +#~ msgstr "OYA ITEGEKONGENGA Kuri Kugenzura... Irengayobora(-)" + +#, fuzzy +#~ msgid "Scope of for-init-statement vars extends outside" +#~ msgstr "Bya kugirango Inyandiko Hanze" + +#, fuzzy +#~ msgid "Do not recognize GNU defined keywords" +#~ msgstr "OYA Amagambo fatizo" + +#, fuzzy +#~ msgid "Enable support for huge objects" +#~ msgstr "Gushigikira kugirango Ibintu" + +#, fuzzy +#~ msgid "Export functions even if they can be inlined" +#~ msgstr "Imimaro ATARIIGIHARWE NIBA" + +#, fuzzy +#~ msgid "Only emit explicit template instantiations" +#~ msgstr "Inyandikorugero" + +#, fuzzy +#~ msgid "Only emit explicit instantiations of inline templates" +#~ msgstr "Bya Mumurongo Inyandikorugero" + +#, fuzzy +#~ msgid "Don't pedwarn about uses of Microsoft extensions" +#~ msgstr "Ibyerekeye Bya Umigereka" + +#, fuzzy +#~ msgid "Recognize and/bitand/bitor/compl/not/or/xor" +#~ msgstr "Na OYA Cyangwa" + +#, fuzzy +#~ msgid "Disable optional diagnostics" +#~ msgstr "Bitari ngombwa" + +#, fuzzy +#~ msgid "Downgrade conformance errors to warnings" +#~ msgstr "Amakosa Kuri Iburira" + +#, fuzzy +#~ msgid "Enable automatic template instantiation" +#~ msgstr "Byikoresha Inyandikorugero" + +#, fuzzy +#~ msgid "Display statistics accumulated during compilation" +#~ msgstr "Sitatisitiki" + +#, fuzzy +#~ msgid "Specify maximum template instantiation depth" +#~ msgstr "Kinini Inyandikorugero Ubujyakuzimu" + +#, fuzzy +#~ msgid "Use __cxa_atexit to register destructors" +#~ msgstr "Kuri Kwiyandikisha" + +#, fuzzy +#~ msgid "Discard unused virtual functions" +#~ msgstr "Kidakoreshwa Kitaboneka Imimaro" + +#, fuzzy +#~ msgid "Implement vtables using thunks" +#~ msgstr "ikoresha" + +#, fuzzy +#~ msgid "Emit common-like symbols as weak symbols" +#~ msgstr "nka Ibimenyetso Nka Ibimenyetso" + +#, fuzzy +#~ msgid "Emit cross referencing information" +#~ msgstr "Kwambukiranya Ibisobanuro" + +#, fuzzy +#~ msgid "Warn about inconsistent return types" +#~ msgstr "Ibyerekeye Garuka" + +#, fuzzy +#~ msgid "Warn about overloaded virtual function names" +#~ msgstr "Ibyerekeye Kitaboneka Umumaro Amazina" + +#, fuzzy +#~ msgid "Don't warn when all ctors/dtors are private" +#~ msgstr "Ryari: Byose By'umwihariko" + +#, fuzzy +#~ msgid "Warn about non virtual destructors" +#~ msgstr "Ibyerekeye Kitaboneka" + +#, fuzzy +#~ msgid "Warn when a function is declared extern, then inline" +#~ msgstr "Ryari: a Umumaro ni Hanyuma Mumurongo" + +#, fuzzy +#~ msgid "Warn when the compiler reorders code" +#~ msgstr "Ryari: i ITEGEKONGENGA" + +#, fuzzy +#~ msgid "Warn when synthesis behavior differs from Cfront" +#~ msgstr "Ryari: imyitwarire Bivuye" + +#, fuzzy +#~ msgid "Don't warn when type converting pointers to member functions" +#~ msgstr "Ryari: Ubwoko Guhindura.... Kuri Imimaro" + +#, fuzzy +#~ msgid "Warn about violations of Effective C++ style rules" +#~ msgstr "Ibyerekeye Bya C IMISUSIRE" + +#, fuzzy +#~ msgid "Warn when overload promotes from unsigned to signed" +#~ msgstr "Ryari: Bivuye Bitashizweho umukono Kuri" + +#, fuzzy +#~ msgid "Warn if a C style cast is used in a program" +#~ msgstr "NIBA a C IMISUSIRE ni in a Porogaramu" + +#, fuzzy +#~ msgid "Don't warn when non-templatized friend functions are declared within a template" +#~ msgstr "Ryari: Imimaro muri a Inyandikorugero" + +#, fuzzy +#~ msgid "Don't announce deprecation of compiler features" +#~ msgstr "Bya Ibiranga" + +# scp/source\cde\unxbasic_cde.lng:STR_BASIC_CDEINT_NETWORK_STRING2.text +#, fuzzy +#~ msgid "note:" +#~ msgstr "Ibisobanuro:" + +#, fuzzy +#~ msgid "warning:" +#~ msgstr "Iburira!" + +#, fuzzy +#~ msgid "ASSIGN'ed label cannot fit into `%A' at %0 -- using wider sibling" +#~ msgstr "Akarango ku ikoresha" + +#, fuzzy +#~ msgid "no INTEGER type can hold a pointer on this configuration" +#~ msgstr "Oya Ubwoko a Mweretsi ku iyi Iboneza" + +#, fuzzy +#~ msgid "configuration: REAL, INTEGER, and LOGICAL are %d bits wide," +#~ msgstr "Iboneza Na" + +#, fuzzy +#~ msgid "and pointers are %d bits wide, but g77 doesn't yet work" +#~ msgstr "Na Akazi" + +#, fuzzy +#~ msgid "properly unless they all are 32 bits wide" +#~ msgstr "Byose" + +#, fuzzy +#~ msgid "Please keep this in mind before you report bugs." +#~ msgstr "Gumana: iyi in Mbere Icyegeranyo" + +#, fuzzy +#~ msgid "configuration: char * holds %d bits, but ftnlen only %d" +#~ msgstr "Iboneza INYUGUTI" + +#, fuzzy +#~ msgid "" +#~ "configuration: char * holds %d bits, but INTEGER only %d --\n" +#~ " ASSIGN statement might fail" +#~ msgstr "Iboneza INYUGUTI Inyandiko" + +#, fuzzy +#~ msgid "In statement function" +#~ msgstr "Inyandiko Umumaro" + +#, fuzzy +#~ msgid "Outside of any program unit:\n" +#~ msgstr "Bya Porogaramu Igice:" + +#, fuzzy +#~ msgid "%A from %B at %0%C" +#~ msgstr "%ABivuye ku" + +#, fuzzy +#~ msgid "directory name must immediately follow -I" +#~ msgstr "bushyinguro Izina: Ako kanya" + +#, fuzzy +#~ msgid "At %0, INCLUDE file %A exists, but is not readable" +#~ msgstr "IDOSIYE ni OYA" + +#, fuzzy +#~ msgid "At %0, INCLUDE nesting too deep" +#~ msgstr "Njyakuzimu" + +#, fuzzy +#~ msgid "Two arithmetic operators in a row at %0 and %1 -- use parentheses" +#~ msgstr "Mukoresha in a Urubariro ku Na Gukoresha %1" + +#, fuzzy +#~ msgid "Operator at %0 has lower precedence than that at %1 -- use parentheses" +#~ msgstr "ku Ntoya ku Gukoresha %1" + +#, fuzzy +#~ msgid "Use .EQV./.NEQV. instead of .EQ./.NE. at %0 for LOGICAL operands at %1 and %2" +#~ msgstr "" +#~ "Project- Id- Version: basctl\n" +#~ "POT- Creation- Date: 2003- 12- 07 17: 13+ 02\n" +#~ "PO- Revision- Date: 2004- 11- 04 10: 13- 0700\n" +#~ "Last- Translator: Language- Team:< en@ li. org> MIME- Version: 1. 0\n" +#~ "Content- Type: text/ plain; charset= UTF- 8\n" +#~ "Content- Transfer- Encoding: 8bit\n" +#~ "X- Generator: KBabel 1. 0\n" +#~ ". Project- Id- Version: basctl\n" +#~ "POT- Creation- Date: 2003- 12- 07 17: 13+ 02\n" +#~ "PO- Revision- Date: 2004- 11- 04 10: 13- 0700\n" +#~ "Last- Translator: Language- Team:< en@ li. org> MIME- Version: 1. 0\n" +#~ "Content- Type: text/ plain; charset= UTF- 8\n" +#~ "Content- Transfer- Encoding: 8bit\n" +#~ "X- Generator: KBabel 1. 0\n" +#~ "." + +#, fuzzy +#~ msgid "Unsupported operand for ** at %1 -- converting to default INTEGER" +#~ msgstr "kugirango ku Guhindura.... Kuri Mburabuzi" + +#, fuzzy +#~ msgid "overflowed output arg list for `%s'" +#~ msgstr "Ibisohoka Urutonde kugirango" + +#, fuzzy +#~ msgid "--driver no longer supported" +#~ msgstr "--Musomyi: Oya" + +#, fuzzy +#~ msgid "argument to `%s' missing" +#~ msgstr "Kuri Ibuze" + +#, fuzzy +#~ msgid "no input files; unwilling to write output files" +#~ msgstr "Oya Iyinjiza Idosiye Kuri Kwandika Ibisohoka Idosiye" + +#, fuzzy +#~ msgid "Implicit declaration of `%A' at %0" +#~ msgstr "Bya ku" + +#, fuzzy +#~ msgid "Non-ISO-C-standard escape sequence `\\%A' at %0" +#~ msgstr "C Bisanzwe ku" + +#, fuzzy +#~ msgid "Unknown escape sequence `\\%A' at %0" +#~ msgstr "ku" + +#, fuzzy +#~ msgid "Unterminated escape sequence `\\' at %0" +#~ msgstr "ku" + +#, fuzzy +#~ msgid "Unknown escape sequence `\\' followed by char code 0x%A at %0" +#~ msgstr "ku INYUGUTI ITEGEKONGENGA ku" + +#, fuzzy +#~ msgid "\\x used at %0 with no following hex digits" +#~ msgstr "\\xku Na: Oya" + +#, fuzzy +#~ msgid "Hex escape at %0 out of range" +#~ msgstr "ku Inyuma Bya Urutonde" + +#, fuzzy +#~ msgid "Escape sequence at %0 out of range for character" +#~ msgstr "ku Inyuma Bya Urutonde kugirango Inyuguti" + +#, fuzzy +#~ msgid "hex escape out of range" +#~ msgstr "Inyuma Bya Urutonde" + +#, fuzzy +#~ msgid "non-ANSI-standard escape sequence, `\\%c'" +#~ msgstr "Bisanzwe" + +#, fuzzy +#~ msgid "unknown escape sequence `\\%c'" +#~ msgstr "Kitazwi" + +#, fuzzy +#~ msgid "unknown escape sequence: `\\' followed by char code 0x%x" +#~ msgstr "Kitazwi ku INYUGUTI ITEGEKONGENGA" + +#, fuzzy +#~ msgid "badly formed directive -- no closing quote" +#~ msgstr "Oya Gushyiraho akugarizo" + +#, fuzzy +#~ msgid "#-lines for entering and leaving files don't match" +#~ msgstr "#-Imirongo kugirango Na Idosiye BIHUYE" + +#, fuzzy +#~ msgid "bad directive -- missing close-quote" +#~ msgstr "Ibuze Gufunga Gushyiraho akugarizo" + +#, fuzzy +#~ msgid "invalid #ident" +#~ msgstr "Sibyo" + +#, fuzzy +#~ msgid "undefined or invalid # directive" +#~ msgstr "kidasobanuye Cyangwa Sibyo" + +#, fuzzy +#~ msgid "invalid #line" +#~ msgstr "Sibyo Umurongo" + +#, fuzzy +#~ msgid "use `#line ...' instead of `# ...' in first line" +#~ msgstr "Gukoresha Umurongo Bya in Itangira Umurongo" + +#, fuzzy +#~ msgid "invalid #-line" +#~ msgstr "Sibyo Umurongo" + +#, fuzzy +#~ msgid "Null character at %0 -- line ignored" +#~ msgstr "Inyuguti ku Umurongo" + +#, fuzzy +#~ msgid "INCLUDE at %0 not the only statement on the source line" +#~ msgstr "ku OYA i Inyandiko ku i Inkomoko Umurongo" + +#, fuzzy +#~ msgid "ASSIGNed FORMAT specifier is too small" +#~ msgstr "ni Gitoya" + +#, fuzzy +#~ msgid "SELECT CASE on CHARACTER type (at %0) not supported -- sorry" +#~ msgstr "ku Ubwoko ku OYA" + +#, fuzzy +#~ msgid "SELECT (at %0) has duplicate cases -- check integer overflow of CASE(s)" +#~ msgstr "ku Gusubiramo Kugenzura... Umubare wuzuye Byarenze urugero Bya S" + +#, fuzzy +#~ msgid "ASSIGN to variable that is too small" +#~ msgstr "Kuri IMPINDURAGACIRO ni Gitoya" + +#, fuzzy +#~ msgid "ASSIGNed GOTO target variable is too small" +#~ msgstr "Intego IMPINDURAGACIRO ni Gitoya" + +#, fuzzy +#~ msgid "Local adjustable symbol `%A' at %0" +#~ msgstr "IKIMENYETSO ku" + +#, fuzzy +#~ msgid "data initializer on host with different endianness" +#~ msgstr "Ibyatanzwe ku Ubuturo Na:" + +#, fuzzy +#~ msgid "%s no longer supported -- try -fvxt" +#~ msgstr "%sOya" + +#, fuzzy +#~ msgid "%s no longer supported -- try -fno-vxt -ff90" +#~ msgstr "%sOya" + +#, fuzzy +#~ msgid "%s disabled, use normal debugging flags" +#~ msgstr "%sYahagaritswe Gukoresha Bisanzwe Amabendera" + +#, fuzzy +#~ msgid "Print g77-specific compiler version info, run internal tests" +#~ msgstr "Verisiyo Ibisobanuro Gukoresha By'imbere" + +#, fuzzy +#~ msgid "Program is written in typical FORTRAN 66 dialect" +#~ msgstr "ni in" + +#, fuzzy +#~ msgid "Program is written in typical Unix f77 dialect" +#~ msgstr "ni in" + +#, fuzzy +#~ msgid "Program does not use Unix-f77 dialectal features" +#~ msgstr "OYA Gukoresha Ibiranga" + +#, fuzzy +#~ msgid "Program is written in Fortran-90-ish dialect" +#~ msgstr "ni in" + +#, fuzzy +#~ msgid "Treat local vars and COMMON blocks as if they were named in SAVE statements" +#~ msgstr "Na Nka NIBA in" + +#, fuzzy +#~ msgid "Allow $ in symbol names" +#~ msgstr "in IKIMENYETSO Amazina" + +#, fuzzy +#~ msgid "f2c-compatible code need not be generated" +#~ msgstr "ITEGEKONGENGA OYA" + +#, fuzzy +#~ msgid "Unsupported; do not generate libf2c-calling code" +#~ msgstr "OYA ITEGEKONGENGA" + +#, fuzzy +#~ msgid "Unsupported; affects code-generation of arrays" +#~ msgstr "ITEGEKONGENGA Bya" + +#, fuzzy +#~ msgid "Program is written in Fortran-90-ish free form" +#~ msgstr "ni in Kigenga Ifishi" + +#, fuzzy +#~ msgid "Warn about use of (only a few for now) Fortran extensions" +#~ msgstr "Ibyerekeye Gukoresha Bya a kugirango NONEAHA Umigereka" + +#, fuzzy +#~ msgid "Program is written in VXT (Digital-like) FORTRAN" +#~ msgstr "ni in nka" + +#, fuzzy +#~ msgid "Disallow all ugly features" +#~ msgstr "Byose Ibiranga" + +#, fuzzy +#~ msgid "Hollerith and typeless constants not passed as arguments" +#~ msgstr "Na OYA Nka ingingo" + +#, fuzzy +#~ msgid "Allow ordinary copying of ASSIGN'ed vars" +#~ msgstr "Bya" + +#, fuzzy +#~ msgid "Dummy array dimensioned to (1) is assumed-size" +#~ msgstr "Imbonerahamwe Kuri 1. ni Ingano" + +#, fuzzy +#~ msgid "Trailing comma in procedure call denotes null argument" +#~ msgstr "Akitso in NTAGIHARI" + +#, fuzzy +#~ msgid "Allow REAL(Z) and AIMAG(Z) given DOUBLE COMPLEX Z" +#~ msgstr "Na" + +#, fuzzy +#~ msgid "Initialization via DATA and PARAMETER is type-compatible" +#~ msgstr "Biturutse Na ni Ubwoko" + +#, fuzzy +#~ msgid "Allow INTEGER and LOGICAL interchangeability" +#~ msgstr "Na" + +#, fuzzy +#~ msgid "Print internal debugging-related info" +#~ msgstr "By'imbere Ibisobanuro" + +#, fuzzy +#~ msgid "Initialize local vars and arrays to zero" +#~ msgstr "Na Kuri Zeru" + +#, fuzzy +#~ msgid "Backslashes in character/hollerith constants not special (C-style)" +#~ msgstr "in Inyuguti OYA Bidasanzwe C IMISUSIRE" + +#, fuzzy +#~ msgid "Have front end emulate COMPLEX arithmetic to avoid bugs" +#~ msgstr "Imbere Impera Kuri" + +#, fuzzy +#~ msgid "Disable the appending of underscores to externals" +#~ msgstr "i Bya Kuri" + +#, fuzzy +#~ msgid "Never append a second underscore to externals" +#~ msgstr "Kongeraho... a ISEGONDA Kuri" + +#, fuzzy +#~ msgid "Intrinsics spelled as e.g. SqRt" +#~ msgstr "g." + +#, fuzzy +#~ msgid "Intrinsics in uppercase" +#~ msgstr "in Inyuguti nkuru" + +#, fuzzy +#~ msgid "Intrinsics letters in arbitrary cases" +#~ msgstr "in" + +#, fuzzy +#~ msgid "Language keywords spelled as e.g. IOStat" +#~ msgstr "g." + +#, fuzzy +#~ msgid "Language keywords in uppercase" +#~ msgstr "Amagambo fatizo in Inyuguti nkuru" + +#, fuzzy +#~ msgid "Language keyword letters in arbitrary cases" +#~ msgstr "Ijambo- banze in" + +#, fuzzy +#~ msgid "Internally convert most source to uppercase" +#~ msgstr "GUHINDURA Inkomoko Kuri Inyuguti nkuru" + +#, fuzzy +#~ msgid "Internally preserve source case" +#~ msgstr "Inkomoko" + +#, fuzzy +#~ msgid "Symbol names spelled in mixed case" +#~ msgstr "Amazina in Bivanze" + +#, fuzzy +#~ msgid "Symbol names in uppercase" +#~ msgstr "Amazina in Inyuguti nkuru" + +#, fuzzy +#~ msgid "Symbol names in lowercase" +#~ msgstr "Amazina in Inyuguti nto" + +#, fuzzy +#~ msgid "Program written in uppercase" +#~ msgstr "in Inyuguti nkuru" + +#, fuzzy +#~ msgid "Program written in lowercase" +#~ msgstr "in Inyuguti nto" + +#, fuzzy +#~ msgid "Program written in strict mixed-case" +#~ msgstr "in Bivanze" + +#, fuzzy +#~ msgid "Compile as if program written in uppercase" +#~ msgstr "Nka NIBA Porogaramu in Inyuguti nkuru" + +#, fuzzy +#~ msgid "Compile as if program written in lowercase" +#~ msgstr "Nka NIBA Porogaramu in Inyuguti nto" + +#, fuzzy +#~ msgid "Preserve all spelling (case) used in program" +#~ msgstr "Byose Ivuganyuguti in Porogaramu" + +#, fuzzy +#~ msgid "Delete libU77 intrinsics with bad interfaces" +#~ msgstr "Na:" + +#, fuzzy +#~ msgid "Disable libU77 intrinsics with bad interfaces" +#~ msgstr "Na:" + +#, fuzzy +#~ msgid "Hide libU77 intrinsics with bad interfaces" +#~ msgstr "Na:" + +#, fuzzy +#~ msgid "Treat initial values of 0 like non-zero values" +#~ msgstr "Uduciro Bya 0 nka Zeru Uduciro" + +#, fuzzy +#~ msgid "Emit special debugging information for COMMON and EQUIVALENCE (disabled)" +#~ msgstr "Bidasanzwe Ibisobanuro kugirango Na Yahagaritswe" + +#, fuzzy +#~ msgid "Take at least one trip through each iterative DO loop" +#~ msgstr "ku Gihinguranya" + +#, fuzzy +#~ msgid "Print names of program units as they are compiled" +#~ msgstr "Amazina Bya Porogaramu Nka" + +#, fuzzy +#~ msgid "Disable fatal diagnostics about inter-procedural problems" +#~ msgstr "Ibyerekeye" + +#, fuzzy +#~ msgid "Make prefix-radix non-decimal constants be typeless" +#~ msgstr "Imbanziriza radix NYACUMI" + +#, fuzzy +#~ msgid "Generate code to check subscript and substring bounds" +#~ msgstr "ITEGEKONGENGA Kuri Kugenzura... Inyandiko nyesi Na" + +#, fuzzy +#~ msgid "Fortran-specific form of -fbounds-check" +#~ msgstr "Ifishi Bya Kugenzura..." + +#, fuzzy +#~ msgid "Disable warnings about inter-procedural problems" +#~ msgstr "Iburira Ibyerekeye" + +#, fuzzy +#~ msgid "Warn about constructs with surprising meanings" +#~ msgstr "Ibyerekeye Na:" + +#, fuzzy +#~ msgid "Add a directory for INCLUDE searching" +#~ msgstr "a bushyinguro kugirango Ishakisha" + +#, fuzzy +#~ msgid "Set the maximum line length" +#~ msgstr "i Kinini Umurongo Uburebure" + +#, fuzzy +#~ msgid "Missing first operand for binary operator at %0" +#~ msgstr "Itangira kugirango Nyabibiri Mukoresha ku" + +#, fuzzy +#~ msgid "Zero-length character constant at %0" +#~ msgstr "Uburebure Inyuguti ku" + +#, fuzzy +#~ msgid "Invalid token at %0 in expression or subexpression at %1" +#~ msgstr "ku in imvugo Cyangwa ku" + +#, fuzzy +#~ msgid "Missing operand for operator at %1 at end of expression at %0" +#~ msgstr "kugirango Mukoresha ku ku Impera Bya imvugo ku" + +#, fuzzy +#~ msgid "Label %A already defined at %1 when redefined at %0" +#~ msgstr "ku Ryari: ku" + +#, fuzzy +#~ msgid "Unrecognized character at %0 [info -f g77 M LEX]" +#~ msgstr "Inyuguti ku Ibisobanuro F" + +#, fuzzy +#~ msgid "Label definition %A at %0 on empty statement (as of %1)" +#~ msgstr "Insobanuro ku ku ubusa Inyandiko Nka Bya" + +#, fuzzy +#~ msgid "Invalid first character at %0 [info -f g77 M LEX]" +#~ msgstr "Itangira Inyuguti ku Ibisobanuro F" + +#, fuzzy +#~ msgid "Line too long as of %0 [info -f g77 M LEX]" +#~ msgstr "Nka Bya Ibisobanuro F" + +#, fuzzy +#~ msgid "Non-numeric character at %0 in label field [info -f g77 M LEX]" +#~ msgstr "Bikurikije umubare Inyuguti ku in Akarango Umwanya Ibisobanuro F" + +#, fuzzy +#~ msgid "Label number at %0 not in range 1-99999" +#~ msgstr "Umubare ku OYA in Urutonde 1." + +#, fuzzy +#~ msgid "At %0, '!' and '/*' are not valid comment delimiters" +#~ msgstr "Na OYA Byemewe Icyo wongeraho" + +#, fuzzy +#~ msgid "Continuation indicator at %0 must appear in column 6 [info -f g77 M LEX]" +#~ msgstr "ku Kugaragara in Inkingi 6 Ibisobanuro F" + +#, fuzzy +#~ msgid "Label at %0 invalid with continuation line indicator at %1 [info -f g77 M LEX]" +#~ msgstr "ku Sibyo Na: Umurongo ku Ibisobanuro F" + +#, fuzzy +#~ msgid "Character constant at %0 has no closing apostrophe at %1" +#~ msgstr "ku Oya ku" + +#, fuzzy +#~ msgid "Hollerith constant at %0 specified %A more characters than are present as of %1" +#~ msgstr "ku Birenzeho Inyuguti Nka Bya" + +#, fuzzy +#~ msgid "Missing close parenthese at %0 needed to match open parenthese at %1" +#~ msgstr "Gufunga ku Kuri BIHUYE Gufungura ku" + +#, fuzzy +#~ msgid "Integer at %0 too large" +#~ msgstr "ku Binini" + +#, fuzzy +#~ msgid "Period at %0 not followed by digits for floating-point number or by `NOT.', `TRUE.', or `FALSE.'" +#~ msgstr "Igihe ku OYA ku kugirango Bihindagurika Akadomo Umubare Cyangwa ku Cyangwa" + +#, fuzzy +#~ msgid "Missing close-period between `.%A' at %0 and %1" +#~ msgstr "Gufunga Igihe hagati ku Na" + +#, fuzzy +#~ msgid "Invalid exponent at %0 for real constant at %1; nondigit `%A' in exponent field" +#~ msgstr "ku kugirango ku in Umwanya" + +#, fuzzy +#~ msgid "Missing value at %1 for real-number exponent at %0" +#~ msgstr "Agaciro ku kugirango Umubare ku" + +#, fuzzy +#~ msgid "Expected binary operator between expressions at %0 and at %1" +#~ msgstr "Itegerejwe Nyabibiri Mukoresha hagati ku Na ku" + +#, fuzzy +#~ msgid "Semicolon at %0 is an invalid token" +#~ msgstr "ku ni Sibyo" + +#, fuzzy +#~ msgid "Extraneous comma in FORMAT statement at %0" +#~ msgstr "Akitso in Inyandiko ku" + +#, fuzzy +#~ msgid "Missing comma in FORMAT statement at %0" +#~ msgstr "Akitso in Inyandiko ku" + +#, fuzzy +#~ msgid "Spurious sign in FORMAT statement at %0" +#~ msgstr "IKIMENYETSO in Inyandiko ku" + +#, fuzzy +#~ msgid "Spurious number in FORMAT statement at %0" +#~ msgstr "Umubare in Inyandiko ku" + +#, fuzzy +#~ msgid "Spurious text trailing number in FORMAT statement at %0" +#~ msgstr "Umwandiko Umubare in Inyandiko ku" + +#, fuzzy +#~ msgid "Unrecognized FORMAT specifier at %0" +#~ msgstr "ku" + +#, fuzzy +#~ msgid "Missing close-parenthese(s) in FORMAT statement at %0" +#~ msgstr "Gufunga S in Inyandiko ku" + +#, fuzzy +#~ msgid "Missing number following period in FORMAT statement at %0" +#~ msgstr "Umubare Igihe in Inyandiko ku" + +#, fuzzy +#~ msgid "Missing number following `E' in FORMAT statement at %0" +#~ msgstr "Umubare in Inyandiko ku" + +#, fuzzy +#~ msgid "Spurious trailing comma preceding terminator at %0" +#~ msgstr "Akitso ku" + +#, fuzzy +#~ msgid "At %0, specify OPERATOR instead of ASSIGNMENT for INTERFACE statement not specifying the assignment operator (=)" +#~ msgstr "Bya kugirango Inyandiko OYA i Igenera Mukoresha" + +#, fuzzy +#~ msgid "At %0, specify ASSIGNMENT instead of OPERATOR for INTERFACE statement specifying the assignment operator (=)" +#~ msgstr "Bya kugirango Inyandiko i Igenera Mukoresha" + +#, fuzzy +#~ msgid "Cannot specify =initialization-expr at %0 unless `::' appears before list of objects" +#~ msgstr "ku Mbere Urutonde Bya Ibintu" + +#, fuzzy +#~ msgid "Reference to label at %1 inconsistent with its definition at %0" +#~ msgstr "Kuri Akarango ku Na: Insobanuro ku" + +#, fuzzy +#~ msgid "Reference to label at %1 inconsistent with earlier reference at %0" +#~ msgstr "Kuri Akarango ku Na: Indango ku" + +#, fuzzy +#~ msgid "DO-statement reference to label at %1 follows its definition at %0" +#~ msgstr "Inyandiko Indango Kuri Akarango ku Insobanuro ku" + +#, fuzzy +#~ msgid "Reference to label at %1 is outside block containing definition at %0" +#~ msgstr "Kuri Akarango ku ni Hanze Funga Insobanuro ku" + +#, fuzzy +#~ msgid "DO-statement references to label at %0 and %2 separated by unterminated block starting at %1" +#~ msgstr "Inyandiko Indango Kuri Akarango ku Na ku Funga ku" + +#, fuzzy +#~ msgid "DO-statement reference to label at %0 and label definition at %2 separated by unterminated block starting at %1" +#~ msgstr "Inyandiko Indango Kuri Akarango ku Na Akarango Insobanuro ku ku Funga ku" + +#, fuzzy +#~ msgid "Label definition at %0 invalid on this kind of statement" +#~ msgstr "Insobanuro ku Sibyo ku iyi Bya Inyandiko" + +#, fuzzy +#~ msgid "Statement at %0 invalid in this context" +#~ msgstr "ku Sibyo in iyi Imvugiro" + +#, fuzzy +#~ msgid "Statement at %0 invalid in context established by statement at %1" +#~ msgstr "ku Sibyo in Imvugiro ku Inyandiko ku" + +#, fuzzy +#~ msgid "Statement at %0 must specify construct name specified at %1" +#~ msgstr "ku Izina: ku" + +#, fuzzy +#~ msgid "Construct name at %0 superfluous, no construct name specified at %1" +#~ msgstr "Izina: ku Oya Izina: ku" + +#, fuzzy +#~ msgid "Construct name at %0 not the same as construct name at %1" +#~ msgstr "Izina: ku OYA i Nka Izina: ku" + +#, fuzzy +#~ msgid "Construct name at %0 does not match construct name for any containing DO constructs" +#~ msgstr "Izina: ku OYA BIHUYE Izina: kugirango" + +#, fuzzy +#~ msgid "Label definition missing at %0 for DO construct specifying label at %1" +#~ msgstr "Insobanuro Ibuze ku kugirango Akarango ku" + +#, fuzzy +#~ msgid "Statement at %0 follows ELSE block for IF construct at %1" +#~ msgstr "ku Funga kugirango ku" + +#, fuzzy +#~ msgid "No label definition for FORMAT statement at %0" +#~ msgstr "Akarango Insobanuro kugirango Inyandiko ku" + +#, fuzzy +#~ msgid "Second occurrence of ELSE WHERE at %0 within WHERE at %1" +#~ msgstr "ukugaragara Bya ku muri ku" + +#, fuzzy +#~ msgid "END statement at %0 missing `%A' keyword required for internal or module procedure(s) bounded by %1" +#~ msgstr "Inyandiko ku Ibuze Ijambo- banze Bya ngombwa kugirango By'imbere Cyangwa Modire S ku" + +#, fuzzy +#~ msgid "MODULE PROCEDURE statement at %0 disallowed because INTERFACE at %1 specifies no generic name, operator, or assignment" +#~ msgstr "Inyandiko ku ku Oya Gifitanye isano Izina: Mukoresha Cyangwa Igenera" + +#, fuzzy +#~ msgid "BLOCK DATA name at %0 superfluous, no name specified at %1" +#~ msgstr "Izina: ku Oya Izina: ku" + +#, fuzzy +#~ msgid "Program name at %0 superfluous, no PROGRAM statement specified at %1" +#~ msgstr "Izina: ku Oya Inyandiko ku" + +#, fuzzy +#~ msgid "Program unit name at %0 not the same as name at %1" +#~ msgstr "Igice: Izina: ku OYA i Nka Izina: ku" + +#, fuzzy +#~ msgid "Type name at %0 not the same as name at %1" +#~ msgstr "Izina: ku OYA i Nka Izina: ku" + +#, fuzzy +#~ msgid "End of source file before end of block started at %0" +#~ msgstr "Impera Bya Inkomoko IDOSIYE Mbere Impera Bya Funga ku" + +#, fuzzy +#~ msgid "Undefined label, first referenced at %0" +#~ msgstr "Akarango Itangira ku" + +#, fuzzy +#~ msgid "SAVE statement or attribute at %1 cannot be specified along with SAVE statement or attribute at %0" +#~ msgstr "Inyandiko Cyangwa Ikiranga ku Na: Inyandiko Cyangwa Ikiranga ku" + +#, fuzzy +#~ msgid "PUBLIC or PRIVATE statement at %1 cannot be specified along with PUBLIC or PRIVATE statement at %0" +#~ msgstr "Cyangwa Inyandiko ku Na: Cyangwa Inyandiko ku" + +#, fuzzy +#~ msgid "RETURN statement at %0 invalid within a main program unit" +#~ msgstr "Inyandiko ku Sibyo muri a Porogaramu Igice:" + +#, fuzzy +#~ msgid "Alternate return specifier at %0 invalid within a main program unit" +#~ msgstr "Garuka ku Sibyo muri a Porogaramu Igice:" + +#, fuzzy +#~ msgid "Alternate return specifier at %0 invalid within a function" +#~ msgstr "Garuka ku Sibyo muri a Umumaro" + +#, fuzzy +#~ msgid "Access specifier or PRIVATE statement at %0 invalid for derived-type definition within other than the specification part of a module" +#~ msgstr "Cyangwa Inyandiko ku Sibyo kugirango Ubwoko Insobanuro muri Ikindi i Bya a Modire" + +#, fuzzy +#~ msgid "Access specifier at %0 must immediately follow derived-type statement at %1 with no intervening statements" +#~ msgstr "ku Ako kanya Ubwoko Inyandiko ku Na: Oya" + +#, fuzzy +#~ msgid "No components specified as of %0 for derived-type definition beginning at %1" +#~ msgstr "Nka Bya kugirango Ubwoko Insobanuro Itangiriro ku" + +#, fuzzy +#~ msgid "No components specified as of %0 for structure definition beginning at %1" +#~ msgstr "Nka Bya kugirango Imiterere Insobanuro Itangiriro ku" + +#, fuzzy +#~ msgid "Missing structure name for outer structure definition at %0" +#~ msgstr "Imiterere Izina: kugirango hanze Imiterere Insobanuro ku" + +#, fuzzy +#~ msgid "Field names at %0 for outer structure definition -- specify them in a subsequent RECORD statement instead" +#~ msgstr "Amazina ku kugirango hanze Imiterere Insobanuro in a Inyandiko" + +#, fuzzy +#~ msgid "Missing field name(s) for structure definition at %0 within structure definition at %1" +#~ msgstr "Umwanya Izina: S kugirango Imiterere Insobanuro ku muri Imiterere Insobanuro ku" + +#, fuzzy +#~ msgid "No components specified as of %0 for map beginning at %1" +#~ msgstr "Nka Bya kugirango Itangiriro ku" + +#, fuzzy +#~ msgid "Zero or one maps specified as of %0 for union beginning at %1 -- at least two are required" +#~ msgstr "Cyangwa Amakarita Nka Bya kugirango Ihuza Itangiriro ku ku Bya ngombwa" + +#, fuzzy +#~ msgid "Missing %A specifier in statement at %0" +#~ msgstr "in Inyandiko ku" + +#, fuzzy +#~ msgid "Items in I/O list starting at %0 invalid for namelist-directed I/O" +#~ msgstr "in Urutonde ku Sibyo kugirango" + +#, fuzzy +#~ msgid "Conflicting I/O control specifications at %0 and %1" +#~ msgstr "Igenzura ku Na" + +#, fuzzy +#~ msgid "No UNIT= specifier in I/O control list at %0" +#~ msgstr "URUGERO in Igenzura Urutonde ku" + +#, fuzzy +#~ msgid "Specification at %0 requires ADVANCE=`NO' specification in same I/O control list" +#~ msgstr "ku in Igenzura Urutonde" + +#, fuzzy +#~ msgid "Specification at %0 requires explicit FMT= specification in same I/O control list" +#~ msgstr "ku in Igenzura Urutonde" + +#, fuzzy +#~ msgid "Second occurrence of CASE DEFAULT at %0 within SELECT CASE at %1" +#~ msgstr "ukugaragara Bya ku muri ku" + +#, fuzzy +#~ msgid "Duplicate or overlapping case values/ranges at %0 and %1" +#~ msgstr "Cyangwa iyorosa Uduciro Ibice ku Na" + +#, fuzzy +#~ msgid "Type and/or kind-type parameter disagreement between CASE value or value within range at %0 and SELECT CASE at %1" +#~ msgstr "Na Cyangwa Ubwoko hagati Agaciro Cyangwa Agaciro muri Urutonde ku Na ku" + +#, fuzzy +#~ msgid "Range specification at %0 invalid for CASE statement within logical-type SELECT CASE statement" +#~ msgstr "ku Sibyo kugirango Inyandiko muri Bijyanye n'inyurabwenge Ubwoko Inyandiko" + +#, fuzzy +#~ msgid "Fortran 90 feature at %0 unsupported" +#~ msgstr "ku" + +#, fuzzy +#~ msgid "Invalid declaration of or reference to symbol `%A' at %0 [initially seen at %1]" +#~ msgstr "Bya Cyangwa Indango Kuri IKIMENYETSO ku ku" + +#, fuzzy +#~ msgid "Null element at %0 for array reference at %1" +#~ msgstr "Ikigize: ku kugirango Imbonerahamwe Indango ku" + +#, fuzzy +#~ msgid "Too few elements (%A missing) as of %0 for array reference at %1" +#~ msgstr "Ibintu Ibuze Nka Bya kugirango Imbonerahamwe Indango ku" + +#, fuzzy +#~ msgid "Too many elements as of %0 for array reference at %1" +#~ msgstr "Ibintu Nka Bya kugirango Imbonerahamwe Indango ku" + +#, fuzzy +#~ msgid "Missing colon as of %0 in substring reference for %1" +#~ msgstr "Nka Bya in Indango kugirango" + +#, fuzzy +#~ msgid "Invalid use at %0 of substring operator on %1" +#~ msgstr "Gukoresha %1 ku Bya Mukoresha ku" + +#, fuzzy +#~ msgid "Substring begin/end point at %0 out of defined range" +#~ msgstr "Impera Akadomo ku Inyuma Bya Urutonde" + +#, fuzzy +#~ msgid "Array element value at %0 out of defined range" +#~ msgstr "Ikigize: Agaciro ku Inyuma Bya Urutonde" + +#, fuzzy +#~ msgid "Expression at %0 has incorrect data type or rank for its context" +#~ msgstr "ku Ibyatanzwe Ubwoko Cyangwa IGICE kugirango Imvugiro" + +#, fuzzy +#~ msgid "Division by 0 (zero) at %0 (IEEE not yet supported)" +#~ msgstr "ku 0 Zeru ku OYA" + +#, fuzzy +#~ msgid "%A step count known to be 0 (zero) at %0" +#~ msgstr "%AIntera IBARA Kuri 0 Zeru ku" + +#, fuzzy +#~ msgid "%A end value plus step count known to overflow at %0" +#~ msgstr "%AImpera Agaciro Guteranya Intera IBARA Kuri Byarenze urugero ku" + +#, fuzzy +#~ msgid "%A begin, end, and step-count values known to result in implementation-dependent behavior due to overflow(s) in intermediate calculations at %0" +#~ msgstr "%AImpera Na Intera IBARA Uduciro Kuri Igisubizo in imyitwarire Kuri Byarenze urugero S in ku" + +#, fuzzy +#~ msgid "%A begin, end, and step-count values known to result in no iterations at %0" +#~ msgstr "%AImpera Na Intera IBARA Uduciro Kuri Igisubizo in Oya Amasubiramo ku" + +#, fuzzy +#~ msgid "Type disagreement between expressions at %0 and %1" +#~ msgstr "hagati ku Na" + +#, fuzzy +#~ msgid "No specification for implied-DO iterator `%A' at %0" +#~ msgstr "kugirango ku" + +#, fuzzy +#~ msgid "Gratuitous parentheses surround implied-DO construct at %0" +#~ msgstr "ku" + +#, fuzzy +#~ msgid "Zero-size specification invalid at %0" +#~ msgstr "Ingano Sibyo ku" + +#, fuzzy +#~ msgid "Zero-size array at %0" +#~ msgstr "Ingano Imbonerahamwe ku" + +#, fuzzy +#~ msgid "Target machine does not support complex entity of kind specified at %0" +#~ msgstr "OYA Gushigikira ITSINDA RY'IMIBARE C Bya ku" + +#, fuzzy +#~ msgid "Target machine does not support DOUBLE COMPLEX, specified at %0" +#~ msgstr "OYA Gushigikira ku" + +#, fuzzy +#~ msgid "Attempt to raise constant zero to a power at %0" +#~ msgstr "Kuri Zeru Kuri a UMWIKUBE ku" + +#, fuzzy +#~ msgid "Reference to generic intrinsic `%A' at %0 could be to form %B or %C" +#~ msgstr "Kuri Gifitanye isano ku Kuri Ifishi Cyangwa" + +#, fuzzy +#~ msgid "Ambiguous use of intrinsic `%A' at %0 [info -f g77 M CMPAMBIG]" +#~ msgstr "Gukoresha Bya ku Ibisobanuro F" + +#, fuzzy +#~ msgid "Intrinsic `%A' referenced %Bly at %0, %Cly at %1 [info -f g77 M EXPIMP]" +#~ msgstr "ku ku Ibisobanuro F" + +#, fuzzy +#~ msgid "Same name `%A' used for %B at %0 and %C at %1 [info -f g77 M INTGLOB]" +#~ msgstr "Izina: kugirango ku Na ku Ibisobanuro F" + +#, fuzzy +#~ msgid "Explicit type declaration for intrinsic `%A' disagrees with invocation at %0" +#~ msgstr "Ubwoko kugirango Na: ku" + +#, fuzzy +#~ msgid "Unable to open INCLUDE file `%A' at %0" +#~ msgstr "Kuri Gufungura IDOSIYE ku" + +#, fuzzy +#~ msgid "Null argument at %0 for statement function reference at %1" +#~ msgstr "ku kugirango Inyandiko Umumaro Indango ku" + +#, fuzzy +#~ msgid "Null argument at %0 for procedure invocation at %1" +#~ msgstr "ku kugirango ku" + +#, fuzzy +#~ msgid "%A too few arguments (starting with dummy argument `%B') as of %0 for statement function reference at %1" +#~ msgstr "%Aingingo Na: Ishusho Nka Bya kugirango Inyandiko Umumaro Indango ku" + +#, fuzzy +#~ msgid "%A too many arguments as of %0 for statement function reference at %1" +#~ msgstr "%Aingingo Nka Bya kugirango Inyandiko Umumaro Indango ku" + +#, fuzzy +#~ msgid "Array supplied at %1 for dummy argument `%A' in statement function reference at %0" +#~ msgstr "ku kugirango Ishusho in Inyandiko Umumaro Indango ku" + +#, fuzzy +#~ msgid "Unsupported FORMAT specifier at %0" +#~ msgstr "ku" + +#, fuzzy +#~ msgid "Variable-expression FORMAT specifier at %0 -- unsupported" +#~ msgstr "imvugo ku" + +#, fuzzy +#~ msgid "Unsupported VXT statement at %0" +#~ msgstr "Inyandiko ku" + +#, fuzzy +#~ msgid "Attempt to specify second initial value for `%A' at %0" +#~ msgstr "Kuri ISEGONDA Agaciro kugirango ku" + +#, fuzzy +#~ msgid "Too few initial values in list of initializers for `%A' at %0" +#~ msgstr "Uduciro in Urutonde Bya kugirango ku" + +#, fuzzy +#~ msgid "Too many initial values in list of initializers starting at %0" +#~ msgstr "Uduciro in Urutonde Bya ku" + +#, fuzzy +#~ msgid "Array or substring specification for `%A' out of range in statement at %0" +#~ msgstr "Cyangwa kugirango Inyuma Bya Urutonde in Inyandiko ku" + +#, fuzzy +#~ msgid "Array subscript #%B out of range for initialization of `%A' in statement at %0" +#~ msgstr "Inyandiko nyesi Inyuma Bya Urutonde kugirango Bya in Inyandiko ku" + +#, fuzzy +#~ msgid "Implied do-loop step count of 0 (zero) for iteration variable `%A' in statement at %0" +#~ msgstr "Intera IBARA Bya 0 Zeru kugirango IMPINDURAGACIRO in Inyandiko ku" + +#, fuzzy +#~ msgid "Implied do-loop iteration count of 0 (zero) for iteration variable `%A' in statement at %0" +#~ msgstr "IBARA Bya 0 Zeru kugirango IMPINDURAGACIRO in Inyandiko ku" + +#, fuzzy +#~ msgid "Not an integer constant expression in implied do-loop in statement at %0" +#~ msgstr "Umubare wuzuye imvugo in in Inyandiko ku" + +#, fuzzy +#~ msgid "Attempt to specify second initial value for element of `%A' at %0" +#~ msgstr "Kuri ISEGONDA Agaciro kugirango Ikigize: Bya ku" + +#, fuzzy +#~ msgid "Attempt to EQUIVALENCE common areas `%A' and `%B' at %0" +#~ msgstr "Kuri Ubuso Na ku" + +#, fuzzy +#~ msgid "Can't place `%A' as directed by EQUIVALENCE due to alignment restrictions" +#~ msgstr "Nka ku Kuri Itunganya Amabwiriza" + +#, fuzzy +#~ msgid "Mismatched EQUIVALENCE requirements for placement of `%A' at both %C and %D bytes offset from `%B'" +#~ msgstr "kugirango Ishyira mu mwanya Bya ku Byombi Na Bayite Nta- boneza Bivuye" + +#, fuzzy +#~ msgid "Array or substring specification for `%A' out of range in EQUIVALENCE statement" +#~ msgstr "Cyangwa kugirango Inyuma Bya Urutonde in Inyandiko" + +#, fuzzy +#~ msgid "Substring of non-CHARACTER entity `%A' in EQUIVALENCE statement" +#~ msgstr "Bya in Inyandiko" + +#, fuzzy +#~ msgid "Array reference to scalar variable `%A' in EQUIVALENCE statement" +#~ msgstr "Indango Kuri IMPINDURAGACIRO in Inyandiko" + +#, fuzzy +#~ msgid "Array subscript #%B out of range for EQUIVALENCE of `%A'" +#~ msgstr "Inyandiko nyesi Inyuma Bya Urutonde kugirango Bya" + +#, fuzzy +#~ msgid "Attempt to extend COMMON area beyond its starting point via EQUIVALENCE of `%A'" +#~ msgstr "Kuri Ubuso Akadomo Biturutse Bya" + +#, fuzzy +#~ msgid "Too few elements in reference to array `%A' in EQUIVALENCE statement" +#~ msgstr "Ibintu in Indango Kuri Imbonerahamwe in Inyandiko" + +#, fuzzy +#~ msgid "Too many elements in reference to array `%A' in EQUIVALENCE statement" +#~ msgstr "Ibintu in Indango Kuri Imbonerahamwe in Inyandiko" + +#, fuzzy +#~ msgid "Mixed CHARACTER and non-CHARACTER types via COMMON/EQUIVALENCE -- for example, `%A' and `%B'" +#~ msgstr "Na Biturutse kugirango Urugero Na" + +#, fuzzy +#~ msgid "Return value `%A' for FUNCTION at %0 not referenced in subprogram" +#~ msgstr "Agaciro kugirango ku OYA in" + +#, fuzzy +#~ msgid "Common block `%A' is SAVEd, explicitly or implicitly, at %0 but not SAVEd at %1" +#~ msgstr "Funga ni Cyangwa ku OYA ku" + +#, fuzzy +#~ msgid "Common block `%A' is %B %D in length at %0 but %C %E at %1" +#~ msgstr "Funga ni in Uburebure ku ku" + +#, fuzzy +#~ msgid "Blank common initialized at %0" +#~ msgstr "ku" + +#, fuzzy +#~ msgid "Intrinsic `%A' is passed as actual argument at %0 but not explicitly declared INTRINSIC" +#~ msgstr "ni Nka ku OYA" + +#, fuzzy +#~ msgid "External procedure `%A' is passed as actual argument at %0 but not explicitly declared EXTERNAL" +#~ msgstr "ni Nka ku OYA" + +#, fuzzy +#~ msgid "Character `%A' (for example) is upper-case in symbol name at %0" +#~ msgstr "kugirango Urugero ni Nkuru in IKIMENYETSO Izina: ku" + +#, fuzzy +#~ msgid "Character `%A' (for example) is lower-case in symbol name at %0" +#~ msgstr "kugirango Urugero ni Ntoya in IKIMENYETSO Izina: ku" + +#, fuzzy +#~ msgid "Character `%A' not followed at some point by lower-case character in symbol name at %0" +#~ msgstr "OYA ku Akadomo ku Ntoya Inyuguti in IKIMENYETSO Izina: ku" + +#, fuzzy +#~ msgid "Initial character `%A' is lower-case in symbol name at %0" +#~ msgstr "Inyuguti ni Ntoya in IKIMENYETSO Izina: ku" + +#, fuzzy +#~ msgid "NAMELIST not adequately supported by run-time library for source files with case preserved" +#~ msgstr "OYA ku Gukoresha Igihe Isomero kugirango Inkomoko Idosiye Na:" + +#, fuzzy +#~ msgid "Nested %% construct (%%VAL, %%REF, or %%DESCR) at %0" +#~ msgstr "Cyangwa ku" + +#, fuzzy +#~ msgid "Statement at %0 invalid in BLOCK DATA program unit at %1" +#~ msgstr "ku Sibyo in Porogaramu Igice: ku" + +#, fuzzy +#~ msgid "Truncating characters on right side of character constant at %0" +#~ msgstr "Inyuguti ku Iburyo: Bya Inyuguti ku" + +#, fuzzy +#~ msgid "Truncating characters on right side of hollerith constant at %0" +#~ msgstr "Inyuguti ku Iburyo: Bya ku" + +#, fuzzy +#~ msgid "Truncating non-zero data on left side of numeric constant at %0" +#~ msgstr "Zeru Ibyatanzwe ku Ibumoso: Bya Bikurikije umubare ku" + +#, fuzzy +#~ msgid "Truncating non-zero data on left side of typeless constant at %0" +#~ msgstr "Zeru Ibyatanzwe ku Ibumoso: Bya ku" + +#, fuzzy +#~ msgid "Typeless constant at %0 too large" +#~ msgstr "ku Binini" + +#, fuzzy +#~ msgid "First-column ampersand continuation at %0" +#~ msgstr "Inkingi ku" + +#, fuzzy +#~ msgid "Global name `%A' defined at %0 already defined at %1 [info -f g77 M GLOBALS]" +#~ msgstr "Izina: ku ku Ibisobanuro F" + +#, fuzzy +#~ msgid "Global name `%A' is %B at %0 but is %C at %1 [info -f g77 M GLOBALS]" +#~ msgstr "Izina: ni ku ni ku Ibisobanuro F" + +#, fuzzy +#~ msgid "Global name `%A' at %0 has different type at %1 [info -f g77 M GLOBALS]" +#~ msgstr "Izina: ku Ubwoko ku Ibisobanuro F" + +#, fuzzy +#~ msgid "Too %B arguments passed to `%A' at %0 versus definition at %1 [info -f g77 M GLOBALS]" +#~ msgstr "ingingo Kuri ku Insobanuro ku Ibisobanuro F" + +#, fuzzy +#~ msgid "Too %B arguments for `%A' at %0 versus invocation at %1 [info -f g77 M GLOBALS]" +#~ msgstr "ingingo kugirango ku ku Ibisobanuro F" + +#, fuzzy +#~ msgid "Argument #%B of `%A' is %C at %0 but is %D at %1 [info -f g77 M GLOBALS]" +#~ msgstr "Bya ni ku ni ku Ibisobanuro F" + +#, fuzzy +#~ msgid "Array `%A' at %0 is too large to handle" +#~ msgstr "ku ni Binini Kuri" + +#, fuzzy +#~ msgid "Statement function `%A' defined at %0 is not used" +#~ msgstr "Umumaro ku ni OYA" + +#, fuzzy +#~ msgid "Intrinsic `%A', invoked at %0, known to be non-Y2K-compliant [info -f g77 M Y2KBAD]" +#~ msgstr "ku Kuri Ibisobanuro F" + +#, fuzzy +#~ msgid "Internal compiler error -- cannot perform operation" +#~ msgstr "Ikosa" + +#, fuzzy +#~ msgid "In unknown kind" +#~ msgstr "Kitazwi" + +#, fuzzy +#~ msgid "In function" +#~ msgstr "Umumaro" + +#, fuzzy +#~ msgid "In program" +#~ msgstr "Porogaramu" + +#, fuzzy +#~ msgid "In block-data unit" +#~ msgstr "Funga Ibyatanzwe Igice:" + +#, fuzzy +#~ msgid "In common block" +#~ msgstr "Funga" + +#, fuzzy +#~ msgid "internal error in check-init: tree code not implemented: %s" +#~ msgstr "By'imbere Ikosa in Kugenzura... ITEGEKONGENGA OYA" + +#, fuzzy +#~ msgid "final field '%s' may not have been initialized" +#~ msgstr "Umwanya Gicurasi OYA" + +#, fuzzy +#~ msgid "internal error - too many interface type" +#~ msgstr "By'imbere Ikosa Ubwoko" + +#, fuzzy +#~ msgid "bad method signature" +#~ msgstr "Uburyo Isinya" + +#, fuzzy +#~ msgid "misplaced ConstantValue attribute (not in any field)" +#~ msgstr "Ikiranga OYA in Umwanya" + +#, fuzzy +#~ msgid "duplicate ConstantValue attribute for field '%s'" +#~ msgstr "Gusubiramo Ikiranga kugirango Umwanya" + +#, fuzzy +#~ msgid "ConstantValue attribute of field '%s' has wrong type" +#~ msgstr "Ikiranga Bya Umwanya Ubwoko" + +#, fuzzy +#~ msgid "field '%s' not found in class" +#~ msgstr "Umwanya OYA Byabonetse in ishuri" + +#, fuzzy +#~ msgid "abstract method in non-abstract class" +#~ msgstr "Incamake Uburyo in Incamake ishuri" + +#, fuzzy +#~ msgid "non-static method '%s' overrides static method" +#~ msgstr "Uburyo Uburyo" + +#, fuzzy +#~ msgid "In %s: overlapped variable and exception ranges at %d" +#~ msgstr "IMPINDURAGACIRO Na Irengayobora(-) Ibice ku" + +#, fuzzy +#~ msgid "bad type in parameter debug info" +#~ msgstr "Ubwoko in Kosora amakosa Ibisobanuro" + +#, fuzzy +#~ msgid "bad PC range for debug info for local `%s'" +#~ msgstr "Urutonde kugirango Kosora amakosa Ibisobanuro kugirango" + +#, fuzzy +#~ msgid "reference `%s' is ambiguous: appears in interface `%s' and interface `%s'" +#~ msgstr "Indango ni in Na" + +#, fuzzy +#~ msgid "field `%s' not found" +#~ msgstr "Umwanya OYA Byabonetse" + +#, fuzzy +#~ msgid "ret instruction not implemented" +#~ msgstr "OYA" + +#, fuzzy +#~ msgid "method '%s' not found in class" +#~ msgstr "Uburyo OYA Byabonetse in ishuri" + +#, fuzzy +#~ msgid "failed to find class '%s'" +#~ msgstr "Byanze Kuri Gushaka ishuri" + +#, fuzzy +#~ msgid "class '%s' has no method named '%s' matching signature '%s'" +#~ msgstr "ishuri Oya Uburyo Isinya" + +#, fuzzy +#~ msgid "invokestatic on non static method" +#~ msgstr "ku Uburyo" + +#, fuzzy +#~ msgid "invokestatic on abstract method" +#~ msgstr "ku Incamake Uburyo" + +#, fuzzy +#~ msgid "invoke[non-static] on static method" +#~ msgstr "ku Uburyo" + +#, fuzzy +#~ msgid "missing field '%s' in '%s'" +#~ msgstr "Ibuze Umwanya in" + +#, fuzzy +#~ msgid "mismatching signature for field '%s' in '%s'" +#~ msgstr "Isinya kugirango Umwanya in" + +#, fuzzy +#~ msgid "assignment to final field `%s' not in field's class" +#~ msgstr "Igenera Kuri Umwanya OYA in ishuri" + +#, fuzzy +#~ msgid "assignment to final static field `%s' not in class initializer" +#~ msgstr "Igenera Kuri Umwanya OYA in ishuri" + +#, fuzzy +#~ msgid "assignment to final field `%s' not in constructor" +#~ msgstr "Igenera Kuri Umwanya OYA in" + +#, fuzzy +#~ msgid "can't expand %s" +#~ msgstr "Kwagura" + +#, fuzzy +#~ msgid "invalid PC in line number table" +#~ msgstr "Sibyo in Umurongo Umubare imbonerahamwe#" + +#, fuzzy +#~ msgid "unreachable bytecode from %d to before %d" +#~ msgstr "Bivuye Kuri Mbere" + +#, fuzzy +#~ msgid "unreachable bytecode from %d to the end of the method" +#~ msgstr "Bivuye Kuri i Impera Bya i Uburyo" + +#, fuzzy +#~ msgid "source file for class `%s' is newer than its matching class file. Source file `%s' used instead" +#~ msgstr "Inkomoko IDOSIYE kugirango ishuri ni ishuri IDOSIYE IDOSIYE" + +#, fuzzy +#~ msgid "bad string constant" +#~ msgstr "Ikurikiranyanyuguti" + +#, fuzzy +#~ msgid "bad value constant type %d, index %d" +#~ msgstr "Agaciro Ubwoko Umubarendanga" + +#, fuzzy +#~ msgid "can't close %s" +#~ msgstr "Gufunga" + +#, fuzzy +#~ msgid "cannot find file for class %s" +#~ msgstr "Gushaka IDOSIYE kugirango ishuri" + +#, fuzzy +#~ msgid "not a valid Java .class file" +#~ msgstr "OYA a Byemewe ishuri IDOSIYE" + +#, fuzzy +#~ msgid "error while parsing constant pool" +#~ msgstr "Ikosa Itsinda" + +#, fuzzy +#~ msgid "error in constant pool entry #%d\n" +#~ msgstr "Ikosa in Itsinda Icyinjijwe" + +#, fuzzy +#~ msgid "reading class %s for the second time from %s" +#~ msgstr "ishuri kugirango i ISEGONDA Igihe Bivuye" + +#, fuzzy +#~ msgid "error while parsing fields" +#~ msgstr "Ikosa Imyanya" + +#, fuzzy +#~ msgid "error while parsing methods" +#~ msgstr "Ikosa" + +#, fuzzy +#~ msgid "error while parsing final attributes" +#~ msgstr "Ikosa Ibiranga" + +#, fuzzy +#~ msgid "the `java.lang.Object' that was found in `%s' didn't have the special zero-length `gnu.gcj.gcj-compiled' attribute. This generally means that your classpath is incorrectly set. Use `info gcj \"Input Options\"' to see the info page describing how to set the classpath" +#~ msgstr "i java Byabonetse in i Bidasanzwe Zeru Uburebure Ikiranga Inzirashuri ni Gushyiraho Ibisobanuro Kuri i Ibisobanuro Ipaji Kuri Gushyiraho i Inzirashuri" + +#, fuzzy +#~ msgid "missing Code attribute" +#~ msgstr "Ibuze Ikiranga" + +#, fuzzy +#~ msgid "source file seen twice on command line and will be compiled only once" +#~ msgstr "Inkomoko IDOSIYE ku Komandi: Umurongo Na Rimwe" + +#, fuzzy +#~ msgid "no input file specified" +#~ msgstr "Oya Iyinjiza IDOSIYE" + +#, fuzzy +#~ msgid "can't close input file %s" +#~ msgstr "Gufunga Iyinjiza IDOSIYE" + +#, fuzzy +#~ msgid "bad zip/jar file %s" +#~ msgstr "Zipu IDOSIYE" + +#, fuzzy +#~ msgid "internal error in generate_bytecode_insn - tree code not implemented: %s" +#~ msgstr "By'imbere Ikosa in ITEGEKONGENGA OYA" + +#, fuzzy +#~ msgid "field initializer type mismatch" +#~ msgstr "Umwanya Ubwoko" + +#, fuzzy +#~ msgid "can't create directory %s" +#~ msgstr "Kurema bushyinguro" + +#, fuzzy +#~ msgid "can't create %s" +#~ msgstr "Kurema" + +#, fuzzy +#~ msgid "only one of `--print-main', `--list-class', and `--complexity' allowed" +#~ msgstr "Bya Gucapa Urutonde Na" + +#, fuzzy +#~ msgid "can't open output file `%s'" +#~ msgstr "Gufungura Ibisohoka IDOSIYE" + +#, fuzzy +#~ msgid "file not found `%s'" +#~ msgstr "Dosiye ntibonetse" + +#, fuzzy +#~ msgid "`%s' is not a valid class name" +#~ msgstr "`%s'ni OYA a Byemewe ishuri Izina:" + +#, fuzzy +#~ msgid "--resource requires -o" +#~ msgstr "--o" + +#, fuzzy +#~ msgid "warning: already-compiled .class files ignored with -C" +#~ msgstr "Iburira ishuri Idosiye Na: C" + +#, fuzzy +#~ msgid "cannot specify both -C and -o" +#~ msgstr "Byombi C Na o" + +#, fuzzy +#~ msgid "cannot create temporary file" +#~ msgstr "Kurema By'igihe gito IDOSIYE" + +#, fuzzy +#~ msgid "using both @FILE with multiple files not implemented" +#~ msgstr "ikoresha Byombi Na: Igikubo Idosiye OYA" + +#, fuzzy +#~ msgid "cannot specify `main' class when not linking" +#~ msgstr "ishuri Ryari: OYA Impuza" + +#, fuzzy +#~ msgid "can't do dependency tracking with input from stdin" +#~ msgstr "Na: Iyinjiza Bivuye" + +#, fuzzy +#~ msgid "couldn't determine target name for dependency tracking" +#~ msgstr "Intego Izina: kugirango" + +#, fuzzy +#~ msgid "" +#~ "unknown encoding: `%s'\n" +#~ "This might mean that your locale's encoding is not supported\n" +#~ "by your system's iconv(3) implementation. If you aren't trying\n" +#~ "to use a particular encoding for your input file, try the\n" +#~ "`--encoding=UTF-8' option" +#~ msgstr "Kitazwi Imisobekere: Impuzandengo- Imisobekere: ni OYA 3. Gukoresha a Imisobekere: kugirango Iyinjiza IDOSIYE Imisobekere: Ihitamo" + +#, fuzzy +#~ msgid "internal error - invalid Utf8 name" +#~ msgstr "By'imbere Ikosa Sibyo Izina:" + +#, fuzzy +#~ msgid "Missing term" +#~ msgstr "Ijambo" + +# starmath/source\smres.src:RID_ERR_LGROUPEXPECTED.text +#, fuzzy +#~ msgid "';' expected" +#~ msgstr "';'ntigatunguranye" + +#, fuzzy +#~ msgid "Missing name" +#~ msgstr "Izina:" + +# starmath/source\smres.src:RID_ERR_LGROUPEXPECTED.text +#, fuzzy +#~ msgid "'*' expected" +#~ msgstr "'*'ntigatunguranye" + +#, fuzzy +#~ msgid "Class or interface declaration expected" +#~ msgstr "Cyangwa Ikitezwe:" + +#, fuzzy +#~ msgid "Missing class name" +#~ msgstr "ishuri Izina:" + +#~ msgid "'{' expected" +#~ msgstr "'{' ntigatunguranye" + +#, fuzzy +#~ msgid "Missing super class name" +#~ msgstr "hejuru ishuri Izina:" + +#, fuzzy +#~ msgid "Missing interface name" +#~ msgstr "Izina:" + +#, fuzzy +#~ msgid "Missing variable initializer" +#~ msgstr "IMPINDURAGACIRO" + +# starmath/source\smres.src:RID_ERR_LGROUPEXPECTED.text +#, fuzzy +#~ msgid "']' expected" +#~ msgstr "']'ntigatunguranye" + +#, fuzzy +#~ msgid "Invalid method declaration, method name required" +#~ msgstr "Uburyo Uburyo Izina: Bya ngombwa" + +#~ msgid "Identifier expected" +#~ msgstr "Ikiranga ntigitunguranye" + +#, fuzzy +#~ msgid "Invalid method declaration, return type required" +#~ msgstr "Uburyo Garuka Ubwoko Bya ngombwa" + +#~ msgid "')' expected" +#~ msgstr "')' ntigatunguranye" + +#, fuzzy +#~ msgid "Missing formal parameter term" +#~ msgstr "Ijambo" + +#, fuzzy +#~ msgid "Missing identifier" +#~ msgstr "Ikiranga" + +#, fuzzy +#~ msgid "Missing class type term" +#~ msgstr "ishuri Ubwoko Ijambo" + +#, fuzzy +#~ msgid "Invalid interface type" +#~ msgstr "Ubwoko" + +# starmath/source\smres.src:RID_ERR_LGROUPEXPECTED.text +#, fuzzy +#~ msgid "':' expected" +#~ msgstr "':'ntigatunguranye" + +#, fuzzy +#~ msgid "Invalid expression statement" +#~ msgstr "imvugo Inyandiko" + +#~ msgid "'(' expected" +#~ msgstr "'(' ntigatunguranye" + +#, fuzzy +#~ msgid "Missing term or ')'" +#~ msgstr "Ijambo Cyangwa" + +#, fuzzy +#~ msgid "Missing or invalid constant expression" +#~ msgstr "Cyangwa Sibyo imvugo" + +#, fuzzy +#~ msgid "Missing term and ')' expected" +#~ msgstr "Ijambo Na Ikitezwe:" + +#, fuzzy +#~ msgid "Invalid control expression" +#~ msgstr "Igenzura imvugo" + +#, fuzzy +#~ msgid "Invalid update expression" +#~ msgstr "Kuvugurura imvugo" + +#, fuzzy +#~ msgid "Invalid init statement" +#~ msgstr "Inyandiko" + +#, fuzzy +#~ msgid "Missing term or ')' expected" +#~ msgstr "Ijambo Cyangwa Ikitezwe:" + +#, fuzzy +#~ msgid "'class' or 'this' expected" +#~ msgstr "'Cyangwa Ikitezwe:" + +#, fuzzy +#~ msgid "'class' expected" +#~ msgstr "'Ikitezwe:" + +#, fuzzy +#~ msgid "')' or term expected" +#~ msgstr "')'Cyangwa Ijambo Ikitezwe:" + +# starmath/source\smres.src:RID_ERR_LGROUPEXPECTED.text +#, fuzzy +#~ msgid "'[' expected" +#~ msgstr "'['ntigatunguranye" + +#, fuzzy +#~ msgid "Field expected" +#~ msgstr "Ikitezwe:" + +#, fuzzy +#~ msgid "Missing term and ']' expected" +#~ msgstr "Ijambo Na Ikitezwe:" + +#, fuzzy +#~ msgid "']' expected, invalid type expression" +#~ msgstr "']'Ikitezwe: Sibyo Ubwoko imvugo" + +#, fuzzy +#~ msgid "Invalid type expression" +#~ msgstr "Ubwoko imvugo" + +#, fuzzy +#~ msgid "Invalid reference type" +#~ msgstr "Indango Ubwoko" + +#, fuzzy +#~ msgid "Constructor invocation must be first thing in a constructor" +#~ msgstr "Itangira in a" + +#, fuzzy +#~ msgid ": `%s' JDK1.1(TM) feature" +#~ msgstr ":`%s'1." + +# desktop/source\app\ssodlg.src:DLG_SSOLOGIN.text +#, fuzzy +#~ msgid "" +#~ "%s.\n" +#~ "%s" +#~ msgstr "%s.%s" + +#, fuzzy +#~ msgid "malformed .zip archive in CLASSPATH: %s" +#~ msgstr "Zipu in" + +#, fuzzy +#~ msgid "Can't find default package `%s'. Check the CLASSPATH environment variable and the access to the archives" +#~ msgstr "Gushaka Mburabuzi i IMPINDURAGACIRO Na i Kuri i Ubushyinguro" + +#, fuzzy +#~ msgid "missing static field `%s'" +#~ msgstr "Ibuze Umwanya" + +#, fuzzy +#~ msgid "not a static field `%s'" +#~ msgstr "OYA a Umwanya" + +#, fuzzy +#~ msgid "No case for %s" +#~ msgstr "kugirango" + +#, fuzzy +#~ msgid "unregistered operator %s" +#~ msgstr "Mukoresha" + +#, fuzzy +#~ msgid "junk at end of signature string" +#~ msgstr "Umwanda ku Impera Bya Isinya Ikurikiranyanyuguti" + +#, fuzzy +#~ msgid "bad pc in exception_table" +#~ msgstr "in" + +#, fuzzy +#~ msgid "exception handler inside code that is being protected" +#~ msgstr "Irengayobora(-) Mo Imbere ITEGEKONGENGA ni Birinzwe" + +#, fuzzy +#~ msgid "unknown opcode %d@pc=%d during verification" +#~ msgstr "Kitazwi" + +#, fuzzy +#~ msgid "verification error at PC=%d" +#~ msgstr "Ikosa ku" + +#, fuzzy +#~ msgid "Disable automatic array bounds checking" +#~ msgstr "Byikoresha Imbonerahamwe" + +#, fuzzy +#~ msgid "Disable assignability checks for stores into object arrays" +#~ msgstr "kugirango Igikoresho" + +#, fuzzy +#~ msgid "Assume native functions are implemented using JNI" +#~ msgstr "Imimaro ikoresha" + +#, fuzzy +#~ msgid "Replace system path" +#~ msgstr "Sisitemu Inzira" + +#, fuzzy +#~ msgid "Set class path" +#~ msgstr "ishuri Inzira" + +#, fuzzy +#~ msgid "Set class path (deprecated: use --classpath instead)" +#~ msgstr "ishuri Inzira Bitemewe. Gukoresha Inzirashuri" + +#, fuzzy +#~ msgid "Choose class whose main method should be used" +#~ msgstr "ishuri bya Uburyo" + +#, fuzzy +#~ msgid "Choose input encoding (default comes from locale)" +#~ msgstr "Iyinjiza Imisobekere: Mburabuzi Bivuye Umwanya" + +#, fuzzy +#~ msgid "Add directory to class path" +#~ msgstr "bushyinguro Kuri ishuri Inzira" + +#, fuzzy +#~ msgid "Directory where class files should be written" +#~ msgstr "ishuri Idosiye" + +#, fuzzy +#~ msgid "Warn if modifiers are specified when not necessary" +#~ msgstr "NIBA Ryari: OYA" + +#, fuzzy +#~ msgid "Warn if deprecated empty statements are found" +#~ msgstr "NIBA Bitemewe. ubusa Byabonetse" + +#, fuzzy +#~ msgid "Warn if .class files are out of date" +#~ msgstr "NIBA ishuri Idosiye Inyuma Bya Itariki" + +#, fuzzy +#~ msgid "Always check for non gcj generated classes archives" +#~ msgstr "Kugenzura... kugirango Inzego Ubushyinguro" + +#, fuzzy +#~ msgid "Never optimize static class initialization code" +#~ msgstr "Kugeza ku ndunduro ishuri ITEGEKONGENGA" + +#, fuzzy +#~ msgid "Use offset tables for virtual method calls" +#~ msgstr "Nta- boneza Imbonerahamwe kugirango Kitaboneka Uburyo Amahamagara:" + +#, fuzzy +#~ msgid "object does not conform to the `%s' protocol" +#~ msgstr "Igikoresho OYA Kuri i Porotokole" + +#, fuzzy +#~ msgid "class `%s' does not implement the `%s' protocol" +#~ msgstr "ishuri OYA i Porotokole" + +#, fuzzy +#~ msgid "unexpected type for `id' (%s)" +#~ msgstr "Ubwoko kugirango" + +#, fuzzy +#~ msgid "undefined type `id', please import " +#~ msgstr "kidasobanuye Ubwoko Kuzana h" + +#, fuzzy +#~ msgid "protocol `%s' has circular dependency" +#~ msgstr "Porotokole Cy'uruziga" + +#, fuzzy +#~ msgid "cannot find protocol declaration for `%s'" +#~ msgstr "Gushaka Porotokole kugirango" + +#, fuzzy +#~ msgid "cannot find interface declaration for `%s'" +#~ msgstr "Gushaka kugirango" + +#, fuzzy +#~ msgid "cannot find reference tag for class `%s'" +#~ msgstr "Gushaka Indango Itagi: kugirango ishuri" + +#, fuzzy +#~ msgid "creating selector for non existant method %s" +#~ msgstr "kugirango Uburyo" + +#, fuzzy +#~ msgid "cannot find class `%s'" +#~ msgstr "Gushaka ishuri" + +#, fuzzy +#~ msgid "class `%s' already exists" +#~ msgstr "ishuri" + +#, fuzzy +#~ msgid "cannot find interface declaration for `%s', superclass of `%s'" +#~ msgstr "Gushaka kugirango Bya" + +#, fuzzy +#~ msgid "circular inheritance in interface declaration for `%s'" +#~ msgstr "Cy'uruziga in kugirango" + +#, fuzzy +#~ msgid "inconsistent instance variable specification" +#~ msgstr "Urugero IMPINDURAGACIRO" + +#, fuzzy +#~ msgid "can not use an object as parameter to a method\n" +#~ msgstr "OYA Gukoresha Igikoresho Nka Kuri a" + +#, fuzzy +#~ msgid "multiple declarations for method `%s'" +#~ msgstr "Igikubo kugirango Uburyo" + +#, fuzzy +#~ msgid "invalid receiver type `%s'" +#~ msgstr "Sibyo Mwakirizi Ubwoko" + +#, fuzzy +#~ msgid "`%s' does not respond to `%s'" +#~ msgstr "`%s'OYA Kuri" + +#, fuzzy +#~ msgid "no super class declared in interface for `%s'" +#~ msgstr "Oya hejuru ishuri in kugirango" + +#, fuzzy +#~ msgid "cannot find class (factory) method" +#~ msgstr "Gushaka ishuri Uburyo" + +#, fuzzy +#~ msgid "return type for `%s' defaults to id" +#~ msgstr "Garuka Ubwoko kugirango Kuri ID" + +#, fuzzy +#~ msgid "method `%s' not implemented by protocol" +#~ msgstr "Uburyo OYA ku Porotokole" + +#, fuzzy +#~ msgid "return type defaults to id" +#~ msgstr "Garuka Ubwoko Kuri ID" + +#, fuzzy +#~ msgid "cannot find method" +#~ msgstr "Gushaka Uburyo" + +#, fuzzy +#~ msgid "instance variable `%s' accessed in class method" +#~ msgstr "Urugero IMPINDURAGACIRO birabonetse in ishuri Uburyo" + +#, fuzzy +#~ msgid "duplicate definition of class method `%s'" +#~ msgstr "Gusubiramo Insobanuro Bya ishuri Uburyo" + +#, fuzzy +#~ msgid "duplicate declaration of class method `%s'" +#~ msgstr "Gusubiramo Bya ishuri Uburyo" + +#, fuzzy +#~ msgid "duplicate definition of instance method `%s'" +#~ msgstr "Gusubiramo Insobanuro Bya Urugero Uburyo" + +#, fuzzy +#~ msgid "duplicate declaration of instance method `%s'" +#~ msgstr "Gusubiramo Bya Urugero Uburyo" + +#, fuzzy +#~ msgid "duplicate interface declaration for category `%s(%s)'" +#~ msgstr "Gusubiramo kugirango Icyiciro" + +#, fuzzy +#~ msgid "instance variable `%s' is declared private" +#~ msgstr "Urugero IMPINDURAGACIRO ni By'umwihariko" + +#, fuzzy +#~ msgid "instance variable `%s' is declared %s" +#~ msgstr "Urugero IMPINDURAGACIRO ni" + +#, fuzzy +#~ msgid "static access to object of type `id'" +#~ msgstr "Kuri Igikoresho Bya Ubwoko" + +#, fuzzy +#~ msgid "incomplete implementation of class `%s'" +#~ msgstr "Bya ishuri" + +#, fuzzy +#~ msgid "incomplete implementation of category `%s'" +#~ msgstr "Bya Icyiciro" + +#, fuzzy +#~ msgid "method definition for `%c%s' not found" +#~ msgstr "Uburyo Insobanuro kugirango OYA Byabonetse" + +#, fuzzy +#~ msgid "%s `%s' does not fully implement the `%s' protocol" +#~ msgstr "%s`%s'OYA i Porotokole" + +#, fuzzy +#~ msgid "`@end' missing in implementation context" +#~ msgstr "`@Ibuze in Imvugiro" + +#, fuzzy +#~ msgid "reimplementation of class `%s'" +#~ msgstr "Bya ishuri" + +#, fuzzy +#~ msgid "conflicting super class name `%s'" +#~ msgstr "hejuru ishuri Izina:" + +#, fuzzy +#~ msgid "duplicate interface declaration for class `%s'" +#~ msgstr "Gusubiramo kugirango ishuri" + +#, fuzzy +#~ msgid "duplicate declaration for protocol `%s'" +#~ msgstr "Gusubiramo kugirango Porotokole" + +#, fuzzy +#~ msgid "[super ...] must appear in a method context" +#~ msgstr "[hejuru Kugaragara in a Uburyo Imvugiro" + +#, fuzzy +#~ msgid "potential selector conflict for method `%s'" +#~ msgstr "kugirango Uburyo" + +#, fuzzy +#~ msgid "`@end' must appear in an implementation context" +#~ msgstr "`@Kugaragara in Imvugiro" + +#, fuzzy +#~ msgid "method definition not in class context" +#~ msgstr "Uburyo Insobanuro OYA in ishuri Imvugiro" + +#, fuzzy +#~ msgid "Dump decls to a .decl file" +#~ msgstr "Kuri a IDOSIYE" + +#, fuzzy +#~ msgid "Generate code for GNU runtime environment" +#~ msgstr "ITEGEKONGENGA kugirango" + +#, fuzzy +#~ msgid "Generate code for NeXT runtime environment" +#~ msgstr "ITEGEKONGENGA kugirango" + +#, fuzzy +#~ msgid "Warn if a selector has multiple methods" +#~ msgstr "NIBA a Igikubo" + +#, fuzzy +#~ msgid "Do not warn if inherited methods are unimplemented" +#~ msgstr "OYA NIBA" + +#, fuzzy +#~ msgid "Generate C header of platform specific features" +#~ msgstr "C Umutwempangano Bya Ibiranga" + +#, fuzzy +#~ msgid "Specify the name of the class for constant strings" +#~ msgstr "i Izina: Bya i ishuri kugirango Ikurikiranyanyuguti" + +#, fuzzy +#~ msgid "(debug) trace parsing process" +#~ msgstr "(Kosora amakosa" + +#, fuzzy +#~ msgid "(debug) trace lexical analysis" +#~ msgstr "(Kosora amakosa" + +#, fuzzy +#~ msgid "-current_version only allowed with -dynamiclib" +#~ msgstr "-Na:" + +#, fuzzy +#~ msgid "-install_name only allowed with -dynamiclib" +#~ msgstr "-Na:" + +#, fuzzy +#~ msgid "-bundle not allowed with -dynamiclib" +#~ msgstr "-OYA Na:" + +#, fuzzy +#~ msgid "-bundle_loader not allowed with -dynamiclib" +#~ msgstr "-OYA Na:" + +#, fuzzy +#~ msgid "-client_name not allowed with -dynamiclib" +#~ msgstr "-OYA Na:" + +#, fuzzy +#~ msgid "-force_cpusubtype_ALL not allowed with -dynamiclib" +#~ msgstr "-OYA Na:" + +#, fuzzy +#~ msgid "-force_flat_namespace not allowed with -dynamiclib" +#~ msgstr "-OYA Na:" + +#, fuzzy +#~ msgid "-keep_private_externs not allowed with -dynamiclib" +#~ msgstr "-OYA Na:" + +#, fuzzy +#~ msgid "-private_bundle not allowed with -dynamiclib" +#~ msgstr "-OYA Na:" + +#, fuzzy +#~ msgid "GNU C does not support -C without using -E" +#~ msgstr "C OYA Gushigikira C ikoresha E" + +#, fuzzy +#~ msgid "GNU C does not support -CC without using -E" +#~ msgstr "C OYA Gushigikira ikoresha E" + +#, fuzzy +#~ msgid "`-p' not supported; use `-pg' and gprof(1)" +#~ msgstr "`-OYA Gukoresha Na 1." + +#, fuzzy +#~ msgid "may not use both -m32 and -m64" +#~ msgstr "Gicurasi OYA Gukoresha Byombi Na" + +#, fuzzy +#~ msgid "The -shared option is not currently supported for VAX ELF." +#~ msgstr "Ihitamo ni OYA kugirango" + +#, fuzzy +#~ msgid "profiling not supported with -mg\n" +#~ msgstr "OYA Na:" + +#, fuzzy +#~ msgid "-pipe is not supported" +#~ msgstr "-ni OYA" + +#, fuzzy +#~ msgid "may not use both -EB and -EL" +#~ msgstr "Gicurasi OYA Gukoresha Byombi Na" + +#, fuzzy +#~ msgid "-pg and -fomit-frame-pointer are incompatible" +#~ msgstr "-Na Ikadiri Mweretsi" + +#, fuzzy +#~ msgid "mno-cygwin and mno-win32 are not compatible" +#~ msgstr "Na OYA" + +#, fuzzy +#~ msgid "shared and mdll are not compatible" +#~ msgstr "Na OYA" + +#, fuzzy +#~ msgid "-E required when input is from standard input" +#~ msgstr "-E Bya ngombwa Ryari: Iyinjiza ni Bivuye Bisanzwe Iyinjiza" + +#, fuzzy +#~ msgid "compilation of header file requested" +#~ msgstr "Bya Umutwempangano IDOSIYE" + +#, fuzzy +#~ msgid " conflicting code gen style switches are used" +#~ msgstr "ITEGEKONGENGA IMISUSIRE" + +#, fuzzy +#~ msgid "-pg or -p and -fomit-frame-pointer are incompatible" +#~ msgstr "-Cyangwa P Na Ikadiri Mweretsi" + +#, fuzzy +#~ msgid "choose either big or little endian, not both" +#~ msgstr "Guhitamo Cyangwa OYA Byombi" + +#, fuzzy +#~ msgid "choose either m340 or m210 not both" +#~ msgstr "Guhitamo Cyangwa OYA Byombi" + +#, fuzzy +#~ msgid "the m210 does not have little endian support" +#~ msgstr "i OYA Gushigikira" + +#, fuzzy +#~ msgid "-mapcs-26 and -mapcs-32 may not be used together" +#~ msgstr "-Na Gicurasi OYA" + +#, fuzzy +#~ msgid "-msoft-float and -mhard_float may not be used together" +#~ msgstr "-Kureremba Na Gicurasi OYA" + +#, fuzzy +#~ msgid "-mbig-endian and -mlittle-endian may not be used together" +#~ msgstr "-Na Gicurasi OYA" + +#, fuzzy +#~ msgid "-mhard-float not supported" +#~ msgstr "-Kureremba OYA" + +#, fuzzy +#~ msgid "-msingle-float and -msoft-float can not both be specified" +#~ msgstr "-Kureremba Na Kureremba OYA Byombi" + +#, fuzzy +#~ msgid "-c or -S required for Ada" +#~ msgstr "-C Cyangwa Bya ngombwa kugirango" + +#, fuzzy +#~ msgid "-fjni and -femit-class-files are incompatible" +#~ msgstr "-Na ishuri Idosiye" + +#, fuzzy +#~ msgid "-fjni and -femit-class-file are incompatible" +#~ msgstr "-Na ishuri IDOSIYE" + +#, fuzzy +#~ msgid "-femit-class-file should used along with -fsyntax-only" +#~ msgstr "-ishuri IDOSIYE Na:" + +#, fuzzy +#~ msgid "-static not valid with -mcoff" +#~ msgstr "-OYA Byemewe Na:" + +#, fuzzy +#~ msgid "-shared not valid with -mcoff" +#~ msgstr "-OYA Byemewe Na:" + +#, fuzzy +#~ msgid "-symbolic not valid with -mcoff" +#~ msgstr "-OYA Byemewe Na:" + +#, fuzzy +#~ msgid "-fpic is not valid with -mcoff" +#~ msgstr "-ni OYA Byemewe Na:" + +#, fuzzy +#~ msgid "-fPIC is not valid with -mcoff" +#~ msgstr "-ni OYA Byemewe Na:" + +#, fuzzy +#~ msgid "-fpic not valid with -mcoff" +#~ msgstr "-OYA Byemewe Na:" + +#, fuzzy +#~ msgid "-fPIC not valid with -mcoff" +#~ msgstr "-OYA Byemewe Na:" diff --git a/libcpp/po/sv.po b/libcpp/po/sv.po new file mode 100644 index 0000000..79f43f6 --- /dev/null +++ b/libcpp/po/sv.po @@ -0,0 +1,913 @@ +# Swedish messages for cpplib. +# Copyright © 2000, 2005, 2006, 2007 Free Software Foundation, Inc. +# Dennis Björklund , 2000, 2001, 2002. +# Göran Uddeborg , 2005, 2006, 2007. +# +# Remember: GCC team does not want RCS keywords in the header! +# +msgid "" +msgstr "" +"Project-Id-Version: cpplib 4.2.1\n" +"Report-Msgid-Bugs-To: http://gcc.gnu.org/bugs.html\n" +"POT-Creation-Date: 2007-11-08 21:08+0000\n" +"PO-Revision-Date: 2007-09-01 12:51+0200\n" +"Last-Translator: Göran Uddeborg \n" +"Language-Team: Swedish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=iso-8859-1\n" +"Content-Transfer-Encoding: 8-bit\n" + +#: charset.c:654 +#, c-format +msgid "conversion from %s to %s not supported by iconv" +msgstr "konveretering från %s till %s stöds inte av iconv" + +#: charset.c:657 +msgid "iconv_open" +msgstr "iconv_open" + +#: charset.c:665 +#, c-format +msgid "no iconv implementation, cannot convert from %s to %s" +msgstr "ingen iconv-implementation, kan inte konvertera från %s till %s" + +#: charset.c:742 +#, c-format +msgid "character 0x%lx is not in the basic source character set\n" +msgstr "tecken 0x%lx finns inte i källkodens grundteckenuppsättning\n" + +#: charset.c:759 charset.c:1352 +msgid "converting to execution character set" +msgstr "konverterar till teckenuppsättning för körning" + +#: charset.c:765 +#, c-format +msgid "character 0x%lx is not unibyte in execution character set" +msgstr "tecken 0x%lx är inte en byte i teckenupsättning för körning" + +#: charset.c:889 +#, c-format +msgid "Character %x might not be NFKC" +msgstr "Tecknet %x är kanske inte NFKC" + +#: charset.c:949 +msgid "universal character names are only valid in C++ and C99" +msgstr "universella teckennamn är endast giltiga i C++ och C99" + +#: charset.c:952 +#, c-format +msgid "the meaning of '\\%c' is different in traditional C" +msgstr "betydelsen av \"\\%c\" är annorlunda i traditionell C" + +#: charset.c:961 +msgid "In _cpp_valid_ucn but not a UCN" +msgstr "I _cpp_valid_ucn men inte en UCN" + +#: charset.c:986 +#, c-format +msgid "incomplete universal character name %.*s" +msgstr "ofullständigt unversellt teckennamn %.*s" + +#: charset.c:998 +#, c-format +msgid "%.*s is not a valid universal character" +msgstr "%.*s är inte ett giltigt universellt tecken" + +#: charset.c:1008 lex.c:484 +msgid "'$' in identifier or number" +msgstr "\"$\" i identifierare eller tal" + +#: charset.c:1018 +#, c-format +msgid "universal character %.*s is not valid in an identifier" +msgstr "universellt tecken %.*s är inte giltigt i en identifierare" + +#: charset.c:1022 +#, c-format +msgid "universal character %.*s is not valid at the start of an identifier" +msgstr "universellt tecken %.*s är inte giltigt vid början av en identifierare" + +#: charset.c:1056 charset.c:1571 +msgid "converting UCN to source character set" +msgstr "vid konvertering av UCN källteckenuppsättning" + +#: charset.c:1060 +msgid "converting UCN to execution character set" +msgstr "vid konverting av UCN till teckenuppsättning för körning" + +#: charset.c:1132 +msgid "the meaning of '\\x' is different in traditional C" +msgstr "betydelsen av \"\\x\" är annorlunda i traditionell C" + +#: charset.c:1149 +msgid "\\x used with no following hex digits" +msgstr "\\x använt utan några följande hexadecimala siffror" + +#: charset.c:1156 +msgid "hex escape sequence out of range" +msgstr "hexadecimal specialsekvens utanför intervallet" + +#: charset.c:1195 +msgid "octal escape sequence out of range" +msgstr "oktal specialsekvens utanför intervallet" + +#: charset.c:1263 +msgid "the meaning of '\\a' is different in traditional C" +msgstr "betydelsen av \"\\a\" är annorlunda i traditionell C" + +#: charset.c:1270 +#, c-format +msgid "non-ISO-standard escape sequence, '\\%c'" +msgstr "icke-ISO-standardspecialsekvens, \"\\%c\"" + +#: charset.c:1278 +#, c-format +msgid "unknown escape sequence '\\%c'" +msgstr "okänd escape-sekvens \"\\%c\"" + +#: charset.c:1286 +#, c-format +msgid "unknown escape sequence: '\\%s'" +msgstr "okänd escape-sekvens: \"\\%s\"" + +#: charset.c:1293 +msgid "converting escape sequence to execution character set" +msgstr "vid konvertering av specialsekvens till teckenuppsättning för körning" + +#: charset.c:1415 charset.c:1478 +msgid "character constant too long for its type" +msgstr "teckenkonstant för lång för sin typ" + +#: charset.c:1418 +msgid "multi-character character constant" +msgstr "flerteckens teckenkonstant" + +#: charset.c:1510 +msgid "empty character constant" +msgstr "tom teckenkonstant" + +#: charset.c:1612 +#, c-format +msgid "failure to convert %s to %s" +msgstr "misslyckades att konvertera %s till %s" + +#: directives.c:215 directives.c:241 +#, c-format +msgid "extra tokens at end of #%s directive" +msgstr "extra symboler vid slutet av direktivet #%s" + +#: directives.c:344 +#, c-format +msgid "#%s is a GCC extension" +msgstr "#%s är en GCC-utvidgning" + +#: directives.c:356 +msgid "suggest not using #elif in traditional C" +msgstr "föreslår att inte använda #elif i traditionell C" + +#: directives.c:359 +#, c-format +msgid "traditional C ignores #%s with the # indented" +msgstr "traditionell C ignorerar #%s dör tecknet # är indenterat" + +#: directives.c:363 +#, c-format +msgid "suggest hiding #%s from traditional C with an indented #" +msgstr "föreslår att dölja #%s från traditionell C med en indenterad #" + +#: directives.c:389 +msgid "embedding a directive within macro arguments is not portable" +msgstr "att bädda in ett direktiv i makroargument är inte portabelt" + +#: directives.c:409 +msgid "style of line directive is a GCC extension" +msgstr "stil på raddirektiv är en GCC-utvidgning" + +#: directives.c:464 +#, c-format +msgid "invalid preprocessing directive #%s" +msgstr "ogiltigt preprocessordirektiv #%s" + +#: directives.c:532 +msgid "\"defined\" cannot be used as a macro name" +msgstr "\"defined\" kan inte användas som ett makronamn" + +#: directives.c:538 +#, c-format +msgid "\"%s\" cannot be used as a macro name as it is an operator in C++" +msgstr "\"%s\" kan inte användas som ett makronamn eftersom det är en operator i C++" + +#: directives.c:541 +#, c-format +msgid "no macro name given in #%s directive" +msgstr "inget makronamn angivet i direktivet #%s" + +#: directives.c:544 +msgid "macro names must be identifiers" +msgstr "makronamn måste vara identifierare" + +#: directives.c:585 +#, c-format +msgid "undefining \"%s\"" +msgstr "avdefinierar \"%s\"" + +#: directives.c:640 +msgid "missing terminating > character" +msgstr "saknar avslutande tecken >" + +#: directives.c:695 +#, c-format +msgid "#%s expects \"FILENAME\" or " +msgstr "#%s förväntar \"FILNAMN\" eller " + +#: directives.c:739 +#, c-format +msgid "empty filename in #%s" +msgstr "tomt filnamn i #%s" + +#: directives.c:749 +msgid "#include nested too deeply" +msgstr "#include nästlad för djupt" + +#: directives.c:790 +msgid "#include_next in primary source file" +msgstr "#include_next i primär källkodsfil" + +#: directives.c:816 +#, c-format +msgid "invalid flag \"%s\" in line directive" +msgstr "ogiltigt flagga \"%s\" i line-direktiv" + +#: directives.c:868 +#, c-format +msgid "\"%s\" after #line is not a positive integer" +msgstr "\"%s\" efter #line är inte ett positivt heltal" + +#: directives.c:874 +msgid "line number out of range" +msgstr "radnummer utanför möjligt intervall" + +#: directives.c:887 directives.c:964 +#, c-format +msgid "\"%s\" is not a valid filename" +msgstr "\"%s\" är inte ett giltigt filnamn" + +#: directives.c:924 +#, c-format +msgid "\"%s\" after # is not a positive integer" +msgstr "\"%s\" efter # är inte ett positivt heltal" + +#: directives.c:1026 +#, c-format +msgid "invalid #%s directive" +msgstr "ogiltigt #%s-direktiv" + +#: directives.c:1089 +#, c-format +msgid "registering pragmas in namespace \"%s\" with mismatched name expansion" +msgstr "registrerar pragman i namnrymden \"%s\" med namnexpansion som inte passar ihop" + +#: directives.c:1098 +#, c-format +msgid "registering pragma \"%s\" with name expansion and no namespace" +msgstr "registrerar pragma \"%s\" med namnexpansion och utan namnrymd" + +#: directives.c:1116 +#, c-format +msgid "registering \"%s\" as both a pragma and a pragma namespace" +msgstr "registrerar \"%s\" både som ett pragma och ett pragma namespace" + +#: directives.c:1119 +#, c-format +msgid "#pragma %s %s is already registered" +msgstr "#pragma %s %s är redan registrerat" + +#: directives.c:1122 +#, c-format +msgid "#pragma %s is already registered" +msgstr "#pragma %s är redan registrerat" + +#: directives.c:1152 +msgid "registering pragma with NULL handler" +msgstr "registrerar pragma med NULL-hanterare" + +#: directives.c:1362 +msgid "#pragma once in main file" +msgstr "#pragma once i huvudfil" + +#: directives.c:1385 +msgid "invalid #pragma GCC poison directive" +msgstr "ogiltigt GCC-direktiv #pragma poison" + +#: directives.c:1394 +#, c-format +msgid "poisoning existing macro \"%s\"" +msgstr "förgiftar existerande makro \"%s\"" + +#: directives.c:1413 +msgid "#pragma system_header ignored outside include file" +msgstr "#pragma system_header ignorerat utanför huvudfil" + +#: directives.c:1437 +#, c-format +msgid "cannot find source file %s" +msgstr "kan inte hitta källfil %s" + +#: directives.c:1441 +#, c-format +msgid "current file is older than %s" +msgstr "aktuell fil är äldre än %s" + +#: directives.c:1620 +msgid "_Pragma takes a parenthesized string literal" +msgstr "_Pragma tar en strängkonstant inom parenteser" + +#: directives.c:1693 +msgid "#else without #if" +msgstr "#else utan #if" + +#: directives.c:1698 +msgid "#else after #else" +msgstr "#else efter #else" + +#: directives.c:1700 directives.c:1733 +msgid "the conditional began here" +msgstr "villkorssatsen började här" + +#: directives.c:1726 +msgid "#elif without #if" +msgstr "#elif utan #if" + +#: directives.c:1731 +msgid "#elif after #else" +msgstr "#elif efter #else" + +#: directives.c:1761 +msgid "#endif without #if" +msgstr "#endif utan #if" + +#: directives.c:1838 +msgid "missing '(' after predicate" +msgstr "saknas '(' efter predikat" + +#: directives.c:1853 +msgid "missing ')' to complete answer" +msgstr "saknas ')' för att avsluta svaret" + +#: directives.c:1873 +msgid "predicate's answer is empty" +msgstr "predikatets svar är tomt" + +#: directives.c:1900 +msgid "assertion without predicate" +msgstr "försäkran utan predikat" + +#: directives.c:1902 +msgid "predicate must be an identifier" +msgstr "predikat måste vara en identifierare" + +#: directives.c:1988 +#, c-format +msgid "\"%s\" re-asserted" +msgstr "\"%s\" omförsäkrat" + +#: directives.c:2271 +#, c-format +msgid "unterminated #%s" +msgstr "oavslutad #%s" + +#: directives-only.c:221 lex.c:1016 traditional.c:162 +msgid "unterminated comment" +msgstr "ej avslutad kommentar" + +#: errors.c:118 +msgid "warning: " +msgstr "varning: " + +#: errors.c:120 +msgid "internal error: " +msgstr "internt fel: " + +#: errors.c:122 +msgid "error: " +msgstr "fel: " + +#: errors.c:186 +msgid "stdout" +msgstr "standard ut" + +#: errors.c:188 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: expr.c:261 +msgid "too many decimal points in number" +msgstr "för många decimalpunker i tal" + +#: expr.c:290 expr.c:365 +#, fuzzy +msgid "fixed-point constants are a GCC extension" +msgstr "imaginära konstanter är en GCC-utvidgning" + +#: expr.c:303 +#, fuzzy, c-format +msgid "invalid digit \"%c\" in binary constant" +msgstr "ogiltigt siffra \"%c\" i oktal konstant" + +#: expr.c:305 +#, c-format +msgid "invalid digit \"%c\" in octal constant" +msgstr "ogiltigt siffra \"%c\" i oktal konstant" + +#: expr.c:313 +#, fuzzy +msgid "invalid prefix \"0b\" for floating constant" +msgstr "ogiltigt suffix \"%.*s\" på flyttalskonstant" + +#: expr.c:319 +msgid "use of C99 hexadecimal floating constant" +msgstr "användning av hexadecimal flyttalskonstant enligt C99" + +#: expr.c:328 +msgid "exponent has no digits" +msgstr "exponenten har inga siffror" + +#: expr.c:335 +msgid "hexadecimal floating constants require an exponent" +msgstr "hexadecimala flyttalskonstanter måste ha en exponent" + +#: expr.c:341 +#, c-format +msgid "invalid suffix \"%.*s\" on floating constant" +msgstr "ogiltigt suffix \"%.*s\" på flyttalskonstant" + +#: expr.c:351 expr.c:393 +#, c-format +msgid "traditional C rejects the \"%.*s\" suffix" +msgstr "traditionell C tillåter inte suffixet \"%.*s\"" + +#: expr.c:358 +#, c-format +msgid "invalid suffix \"%.*s\" with hexadecimal floating constant" +msgstr "ogiltigt suffix \"%.*s\" på hexadecimal flyttalskonstant" + +#: expr.c:369 +#, fuzzy +msgid "decimal float constants are a GCC extension" +msgstr "imaginära konstanter är en GCC-utvidgning" + +#: expr.c:379 +#, c-format +msgid "invalid suffix \"%.*s\" on integer constant" +msgstr "ogiltig ändelse \"%.*s\" på heltalskonstant" + +#: expr.c:401 +msgid "use of C99 long long integer constant" +msgstr "användning av long long heltalskonstant enligt C99" + +#: expr.c:409 +msgid "imaginary constants are a GCC extension" +msgstr "imaginära konstanter är en GCC-utvidgning" + +#: expr.c:412 +#, fuzzy +msgid "binary constants are a GCC extension" +msgstr "imaginära konstanter är en GCC-utvidgning" + +#: expr.c:505 +msgid "integer constant is too large for its type" +msgstr "heltalskonstant är för stor för sin typ" + +#: expr.c:517 +msgid "integer constant is so large that it is unsigned" +msgstr "heltalskonstant är så stor att den är teckenlös" + +#: expr.c:612 +msgid "missing ')' after \"defined\"" +msgstr "saknar ')' efter \"defined\"" + +#: expr.c:619 +msgid "operator \"defined\" requires an identifier" +msgstr "operatorn \"defined\" måste ha en identiferare" + +#: expr.c:627 +#, c-format +msgid "(\"%s\" is an alternative token for \"%s\" in C++)" +msgstr "(\"%s\" är en alternativ symbol för \"%s\" i C++)" + +#: expr.c:637 +msgid "this use of \"defined\" may not be portable" +msgstr "denna användning av \"defined\" är kanske inte portabel" + +#: expr.c:676 +msgid "floating constant in preprocessor expression" +msgstr "flyttalskonstant i preprocessoruttryck" + +#: expr.c:682 +msgid "imaginary number in preprocessor expression" +msgstr "imaginärt tal i preprocessoruttryck" + +#: expr.c:727 +#, c-format +msgid "\"%s\" is not defined" +msgstr "\"%s\" är inte definierad" + +#: expr.c:855 expr.c:884 +#, c-format +msgid "missing binary operator before token \"%s\"" +msgstr "saknad binär operator före symbolen \"%s\"" + +#: expr.c:875 +#, c-format +msgid "token \"%s\" is not valid in preprocessor expressions" +msgstr "symbolen \"%s\" är inte ett giltigt preprocessoruttryck" + +#: expr.c:892 +msgid "missing expression between '(' and ')'" +msgstr "saknat uttryck mellan \"(\" och \")\"" + +#: expr.c:895 +msgid "#if with no expression" +msgstr "#if utan uttryck" + +#: expr.c:898 +#, c-format +msgid "operator '%s' has no right operand" +msgstr "operatorn \"%s\" har ingen högra operand" + +#: expr.c:903 +#, c-format +msgid "operator '%s' has no left operand" +msgstr "operatorn \"%s\" har ingen vänstra operand" + +#: expr.c:929 +msgid " ':' without preceding '?'" +msgstr "\":\" utan föregående \"?\"" + +#: expr.c:956 +msgid "unbalanced stack in #if" +msgstr "obalanserad stack i #if" + +#: expr.c:975 +#, c-format +msgid "impossible operator '%u'" +msgstr "omöjlig operator \"%u\"" + +#: expr.c:1065 +msgid "missing ')' in expression" +msgstr "saknad \")\" i uttryck" + +#: expr.c:1086 +msgid "'?' without following ':'" +msgstr "\"?\" utan följande \":\"" + +#: expr.c:1096 +msgid "integer overflow in preprocessor expression" +msgstr "heltalsspill i preprocessoruttryck" + +#: expr.c:1101 +msgid "missing '(' in expression" +msgstr "saknad \"(\" i uttryck" + +#: expr.c:1133 +#, c-format +msgid "the left operand of \"%s\" changes sign when promoted" +msgstr "vänsteroperanden till \"%s\" byter tecken vid befodran" + +#: expr.c:1138 +#, c-format +msgid "the right operand of \"%s\" changes sign when promoted" +msgstr "högeroperanden till \"%s\" byter tecken vid befodran" + +#: expr.c:1397 +msgid "traditional C rejects the unary plus operator" +msgstr "traditionell C hanterar inte operatorn unärt plus" + +#: expr.c:1480 +msgid "comma operator in operand of #if" +msgstr "kommaoperator i operand till #if" + +#: expr.c:1612 +msgid "division by zero in #if" +msgstr "division med noll i #if" + +#: files.c:442 +msgid "NULL directory in find_file" +msgstr "NOLL-katalog i find_file" + +#: files.c:480 +msgid "one or more PCH files were found, but they were invalid" +msgstr "en eller flera PCH-filer hittades, men de var inte korrekta" + +#: files.c:483 +msgid "use -Winvalid-pch for more information" +msgstr "använd -Winvalid-pch för mer information" + +#: files.c:570 +#, c-format +msgid "%s is a block device" +msgstr "%s är en blockenhet" + +#: files.c:587 +#, c-format +msgid "%s is too large" +msgstr "%s är för stor" + +#: files.c:622 +#, c-format +msgid "%s is shorter than expected" +msgstr "%s är kortare än förväntat" + +#: files.c:852 +#, c-format +msgid "no include path in which to search for %s" +msgstr "ingen huvudfilssökväg att leta efter %s i" + +#: files.c:1157 +msgid "Multiple include guards may be useful for:\n" +msgstr "Multipla inkluderingsvakter kan vara användbart för:\n" + +#: init.c:426 +msgid "cppchar_t must be an unsigned type" +msgstr "cppchar_t måste vare en teckenlös typ" + +#: init.c:430 +#, c-format +msgid "preprocessor arithmetic has maximum precision of %lu bits; target requires %lu bits" +msgstr "preprocessoraretmetik har en högsta precision på %lu bitar; målet kräver %lu bitar" + +#: init.c:437 +msgid "CPP arithmetic must be at least as precise as a target int" +msgstr "CPP-aritmetik måste vara åtminstone så precis som målets int" + +#: init.c:440 +msgid "target char is less than 8 bits wide" +msgstr "målets char är mindre än 8 bitar bred" + +#: init.c:444 +msgid "target wchar_t is narrower than target char" +msgstr "målets wchar_t är smalare än målets char" + +#: init.c:448 +msgid "target int is narrower than target char" +msgstr "målets int är smalare än målets char" + +#: init.c:453 +msgid "CPP half-integer narrower than CPP character" +msgstr "CPP:s halva heltal är smalare än CPP:s tecken" + +#: init.c:457 +#, c-format +msgid "CPP on this host cannot handle wide character constants over %lu bits, but the target requires %lu bits" +msgstr "CPP på denna värd kan inte hantera breda teckenkonstanter över %lu bitar, men målet kräver %lu bitar" + +#: lex.c:283 +msgid "backslash and newline separated by space" +msgstr "bakåtstreck och nyrad skiljda av mellanrum" + +#: lex.c:288 +msgid "backslash-newline at end of file" +msgstr "bakåtstreck-nyrad vid filslut" + +#: lex.c:303 +#, c-format +msgid "trigraph ??%c converted to %c" +msgstr "trigraph ??%c konverterad till %c" + +#: lex.c:310 +#, c-format +msgid "trigraph ??%c ignored, use -trigraphs to enable" +msgstr "trigraph ??%c ingorerad, använd -trigraphs för att aktivera" + +#: lex.c:356 +msgid "\"/*\" within comment" +msgstr "\"/*\" i kommentar" + +#: lex.c:414 +#, c-format +msgid "%s in preprocessing directive" +msgstr "%s i preprocessordirektiv" + +#: lex.c:423 +msgid "null character(s) ignored" +msgstr "nolltecken ignorerat" + +#: lex.c:460 +#, c-format +msgid "`%.*s' is not in NFKC" +msgstr "\"%.*s\" är inte i NFKC" + +#: lex.c:463 +#, c-format +msgid "`%.*s' is not in NFC" +msgstr "\"%.*s\" är inte i NFC" + +#: lex.c:551 +#, c-format +msgid "attempt to use poisoned \"%s\"" +msgstr "försök att använda förgiftad \"%s\"" + +#: lex.c:559 +msgid "__VA_ARGS__ can only appear in the expansion of a C99 variadic macro" +msgstr "__VA_ARGS__ kan endast dyka upp i expansionen av ett C99-makro med variabelt argumentantal" + +#: lex.c:659 +msgid "null character(s) preserved in literal" +msgstr "nolltecken bevarade i konstant" + +#: lex.c:662 +#, c-format +msgid "missing terminating %c character" +msgstr "avslutande %c-tecken saknas" + +#: lex.c:1027 +msgid "C++ style comments are not allowed in ISO C90" +msgstr "C++ kommentarer tillåts inte i ISO C90" + +#: lex.c:1029 +msgid "(this will be reported only once per input file)" +msgstr "(detta rapporteras bara en gång per infil)" + +#: lex.c:1034 +msgid "multi-line comment" +msgstr "flerradskommentar" + +#: lex.c:1347 +#, c-format +msgid "unspellable token %s" +msgstr "ostavbar symbol %s" + +#: line-map.c:320 +#, c-format +msgid "In file included from %s:%u" +msgstr "I fil inkluderad från %s:%u" + +#: line-map.c:338 +#, c-format +msgid "" +",\n" +" from %s:%u" +msgstr "" +",\n" +" från %s:%u" + +#: macro.c:84 +#, c-format +msgid "macro \"%s\" is not used" +msgstr "makrot \"%s\" är inte använt" + +#: macro.c:123 macro.c:319 +#, c-format +msgid "invalid built-in macro \"%s\"" +msgstr "ogiltigt inbyggt makro \"%s\"" + +#: macro.c:157 +msgid "could not determine file timestamp" +msgstr "det gick inte att avgöra fils tidsstämpel" + +#: macro.c:254 +msgid "could not determine date and time" +msgstr "det gick inte att avgöra datum och tid" + +#: macro.c:270 +msgid "__COUNTER__ expanded inside directive with -fdirectives-only" +msgstr "" + +#: macro.c:423 +msgid "invalid string literal, ignoring final '\\'" +msgstr "ogiltig strängkonstant, inorerar avslutande \"\\\"" + +#: macro.c:483 +#, c-format +msgid "pasting \"%s\" and \"%s\" does not give a valid preprocessing token" +msgstr "att sätta ihop \"%s\" och \"%s\" ger inte en giltigt preprocessorsymbol" + +#: macro.c:558 +msgid "ISO C99 requires rest arguments to be used" +msgstr "ISO C99 kräver att restargument används" + +#: macro.c:563 +#, c-format +msgid "macro \"%s\" requires %u arguments, but only %u given" +msgstr "makrot \"%s\" kräver %u argument, men endast %u anges" + +#: macro.c:568 +#, c-format +msgid "macro \"%s\" passed %u arguments, but takes just %u" +msgstr "makro \"%s\" skickade %u argument, men det tar bara %u" + +#: macro.c:679 traditional.c:680 +#, c-format +msgid "unterminated argument list invoking macro \"%s\"" +msgstr "oavslutad argumentlista vid anrop av makrot \"%s\"" + +#: macro.c:782 +#, c-format +msgid "function-like macro \"%s\" must be used with arguments in traditional C" +msgstr "funktionsliknande makrot \"%s\" måste användas med ett argument i traditionell C" + +#: macro.c:1325 +#, c-format +msgid "duplicate macro parameter \"%s\"" +msgstr "dubblerad makroparameter \"%s\"" + +#: macro.c:1371 +#, c-format +msgid "\"%s\" may not appear in macro parameter list" +msgstr "\"%s\" får inte förekomma i en makroparameterlista" + +#: macro.c:1379 +msgid "macro parameters must be comma-separated" +msgstr "makroparametrar måste avdelas av komman" + +#: macro.c:1396 +msgid "parameter name missing" +msgstr "parameternamn saknas" + +#: macro.c:1413 +msgid "anonymous variadic macros were introduced in C99" +msgstr "anonyma variabla makron introducerades i C99" + +#: macro.c:1418 +msgid "ISO C does not permit named variadic macros" +msgstr "ISO C tillåter inte namngivna variabla makron" + +#: macro.c:1427 +msgid "missing ')' in macro parameter list" +msgstr "saknad \")\" i makroparameterlista" + +#: macro.c:1476 +msgid "'##' cannot appear at either end of a macro expansion" +msgstr "\"##\" kan inte förekomma vid någon av ändarna av makroexpansionen" + +#: macro.c:1510 +msgid "ISO C99 requires whitespace after the macro name" +msgstr "ISO C99 kräver mellanrum efter makronamnet" + +#: macro.c:1534 +msgid "missing whitespace after the macro name" +msgstr "mellanrum saknas efter makronamn" + +#: macro.c:1564 +msgid "'#' is not followed by a macro parameter" +msgstr "\"#\" följs inte av en makroparameter" + +#: macro.c:1683 +#, c-format +msgid "\"%s\" redefined" +msgstr "\"%s\" omdefinierad" + +#: macro.c:1688 +msgid "this is the location of the previous definition" +msgstr "detta är platsen för den tidigare definitionen" + +#: macro.c:1738 +#, c-format +msgid "macro argument \"%s\" would be stringified in traditional C" +msgstr "makroargumentet \"%s\" skulle bli gjort till sträng i traditionell C" + +#: macro.c:1761 +#, c-format +msgid "invalid hash type %d in cpp_macro_definition" +msgstr "ogiltig hash-typ %d i cpp_macro_definition" + +#: pch.c:84 pch.c:332 pch.c:344 pch.c:362 pch.c:368 pch.c:377 +msgid "while writing precompiled header" +msgstr "vid skrivning av förkompilerat huvud" + +#: pch.c:485 +#, c-format +msgid "%s: not used because `%.*s' not defined" +msgstr "%s: inte använd för att \"%.*s\" inte är definierad" + +#: pch.c:497 +#, c-format +msgid "%s: not used because `%.*s' defined as `%s' not `%.*s'" +msgstr "%s: används inte för att \"%.*s\" definieras som \"%s\" inte \"%.*s\"" + +#: pch.c:538 +#, c-format +msgid "%s: not used because `%s' is defined" +msgstr "%s: inte använd för att \"%s\" är definierad" + +#: pch.c:558 +#, fuzzy, c-format +msgid "%s: not used because `__COUNTER__' is invalid" +msgstr "%s: inte använd för att \"%s\" är definierad" + +#: pch.c:567 pch.c:737 +msgid "while reading precompiled header" +msgstr "vid läsning av förkompilerat huvud" + +#: traditional.c:750 +#, c-format +msgid "detected recursion whilst expanding macro \"%s\"" +msgstr "upptäckte rekursion vid under expansion av makrot \"%s\"" + +#: traditional.c:917 +msgid "syntax error in macro parameter list" +msgstr "syntaxfel i makroparameterlista" + +#~ msgid "no newline at end of file" +#~ msgstr "inget nyradstecken vid slutet av filen" diff --git a/libcpp/po/tr.po b/libcpp/po/tr.po new file mode 100644 index 0000000..ab84b9f --- /dev/null +++ b/libcpp/po/tr.po @@ -0,0 +1,914 @@ +# Turkish translations for cpplib messages. +# Copyright (C) 2007 Free Software Foundation, Inc. +# +# Nilgün Belma Bugüner , 2001, ..., 2007. +msgid "" +msgstr "" +"Project-Id-Version: cpplib 4.2.0\n" +"Report-Msgid-Bugs-To: http://gcc.gnu.org/bugs.html\n" +"POT-Creation-Date: 2007-11-08 21:08+0000\n" +"PO-Revision-Date: 2007-05-23 01:17+0300\n" +"Last-Translator: Nilgün Belma Bugüner \n" +"Language-Team: Turkish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: charset.c:654 +#, c-format +msgid "conversion from %s to %s not supported by iconv" +msgstr "%s ile %s arasında dönüşüm iconv tarafından desteklenmiyor" + +#: charset.c:657 +msgid "iconv_open" +msgstr "iconv_open" + +#: charset.c:665 +#, c-format +msgid "no iconv implementation, cannot convert from %s to %s" +msgstr "iconv bulunamadığından %s ile %s karakter kümeleri arasında dönüşüm yapılamıyor" + +#: charset.c:742 +#, c-format +msgid "character 0x%lx is not in the basic source character set\n" +msgstr "0x%lx karakteri temel kaynak karakter kümesinde değil\n" + +#: charset.c:759 charset.c:1352 +msgid "converting to execution character set" +msgstr "çalışma karakter kümesine dönüştürülüyor" + +#: charset.c:765 +#, c-format +msgid "character 0x%lx is not unibyte in execution character set" +msgstr "0x%lx karakteri icra karakter kümesindeki tek baytlık karakterlerden değil" + +#: charset.c:889 +#, c-format +msgid "Character %x might not be NFKC" +msgstr "%x karakteri NFKC olmayabilir" + +#: charset.c:949 +msgid "universal character names are only valid in C++ and C99" +msgstr "evrensel karakter isimleri sadece C++ ve C99 için geçerlidir" + +#: charset.c:952 +#, c-format +msgid "the meaning of '\\%c' is different in traditional C" +msgstr "`\\%c'nin anlamı geleneksel C'de farklıdır" + +#: charset.c:961 +msgid "In _cpp_valid_ucn but not a UCN" +msgstr "Bir UCN içinde değil, _cpp_valid_ucn içinde" + +#: charset.c:986 +#, c-format +msgid "incomplete universal character name %.*s" +msgstr "evrensel karakter ismi %.*s tamamlanmamış" + +#: charset.c:998 +#, c-format +msgid "%.*s is not a valid universal character" +msgstr "%.*s geçerli bir evrensel karakter değil" + +#: charset.c:1008 lex.c:484 +msgid "'$' in identifier or number" +msgstr "belirteç ya da sayı içinde '$'" + +#: charset.c:1018 +#, c-format +msgid "universal character %.*s is not valid in an identifier" +msgstr "evrensel karakter %.*s bir belirteç içinde geçerli değil" + +#: charset.c:1022 +#, c-format +msgid "universal character %.*s is not valid at the start of an identifier" +msgstr "evrensel karakter %.*s bir belirtecin başında geçerli değil" + +#: charset.c:1056 charset.c:1571 +msgid "converting UCN to source character set" +msgstr "UCN'den kaynak karakter kümesine dönüşüm" + +#: charset.c:1060 +msgid "converting UCN to execution character set" +msgstr "UCN'den icra karakter kümesine dönüşüm" + +#: charset.c:1132 +msgid "the meaning of '\\x' is different in traditional C" +msgstr "'\\x'in anlamı geleneksel C'de farklıdır" + +#: charset.c:1149 +msgid "\\x used with no following hex digits" +msgstr "\\x izleyen onaltılık rakamlar olmaksızın kullanılmış" + +#: charset.c:1156 +msgid "hex escape sequence out of range" +msgstr "onaltılık önceleme dizgesi kapsamdışı" + +#: charset.c:1195 +msgid "octal escape sequence out of range" +msgstr "sekizlik önceleme dizgesi kapsamdışı" + +#: charset.c:1263 +msgid "the meaning of '\\a' is different in traditional C" +msgstr "`\\a'nın anlamı geleneksel C'de farklıdır" + +#: charset.c:1270 +#, c-format +msgid "non-ISO-standard escape sequence, '\\%c'" +msgstr "ISO standardı olmayan önceleme dizgesi, '\\%c'" + +#: charset.c:1278 +#, c-format +msgid "unknown escape sequence '\\%c'" +msgstr "bilinmeyen önceleme dizgesi '\\%c'" + +#: charset.c:1286 +#, c-format +msgid "unknown escape sequence: '\\%s'" +msgstr "bilinmeyen önceleme dizgesi '\\%s'" + +#: charset.c:1293 +msgid "converting escape sequence to execution character set" +msgstr "önceleme diziliminden icra karakter kümesine dönüşüm" + +#: charset.c:1415 charset.c:1478 +msgid "character constant too long for its type" +msgstr "karakter sabiti, türü için çok uzun" + +#: charset.c:1418 +msgid "multi-character character constant" +msgstr "çoklu-karakter karakter sabiti" + +#: charset.c:1510 +msgid "empty character constant" +msgstr "karakter sabit boş" + +#: charset.c:1612 +#, c-format +msgid "failure to convert %s to %s" +msgstr "`%s' ile `%s' arasında dönüşüm başarısız" + +#: directives.c:215 directives.c:241 +#, c-format +msgid "extra tokens at end of #%s directive" +msgstr "#%s yönergesinin sonunda fazladan dizgecikler" + +#: directives.c:344 +#, c-format +msgid "#%s is a GCC extension" +msgstr "#%s bir GCC uzantısıdır" + +#: directives.c:356 +msgid "suggest not using #elif in traditional C" +msgstr "geleneksel C'de #elif kullanılmıyor varsayılır" + +#: directives.c:359 +#, c-format +msgid "traditional C ignores #%s with the # indented" +msgstr "geleneksel C'de girintili # ile #%s yoksayılır" + +#: directives.c:363 +#, c-format +msgid "suggest hiding #%s from traditional C with an indented #" +msgstr "geleneksel C'den #%s in saklanması için bir girintili # kullanılmış farzedilir" + +#: directives.c:389 +msgid "embedding a directive within macro arguments is not portable" +msgstr "bir yönergenin makro argümanlarla gömülmesi uyarlanabilir değil" + +#: directives.c:409 +msgid "style of line directive is a GCC extension" +msgstr "satır yönergesinin tarzı bir GCC özelliğidir" + +#: directives.c:464 +#, c-format +msgid "invalid preprocessing directive #%s" +msgstr "önişlem yönergesi #%s geçersiz" + +#: directives.c:532 +msgid "\"defined\" cannot be used as a macro name" +msgstr "\"defined\" makro ismi olarak kullanılamaz" + +#: directives.c:538 +#, c-format +msgid "\"%s\" cannot be used as a macro name as it is an operator in C++" +msgstr "\"%s\" C++'da bir işleç olduğundan makro ismi olarak kullanılamaz" + +#: directives.c:541 +#, c-format +msgid "no macro name given in #%s directive" +msgstr "#%s yönergesinde makro ismi verilmemiş" + +#: directives.c:544 +msgid "macro names must be identifiers" +msgstr "makro isimleri tanımlayıcılar olmalı" + +#: directives.c:585 +#, c-format +msgid "undefining \"%s\"" +msgstr "tanımsız yapılan \"%s\"" + +#: directives.c:640 +msgid "missing terminating > character" +msgstr "sonlandıran > karakteri eksik" + +#: directives.c:695 +#, c-format +msgid "#%s expects \"FILENAME\" or " +msgstr "#%s \"DOSYA\" ya da gerektirir" + +#: directives.c:739 +#, c-format +msgid "empty filename in #%s" +msgstr "#%s ile belirtilen dosya boş" + +#: directives.c:749 +msgid "#include nested too deeply" +msgstr "#include iç içeliği çok derin" + +#: directives.c:790 +msgid "#include_next in primary source file" +msgstr "birncil kaynak dosyasında #include_next" + +#: directives.c:816 +#, c-format +msgid "invalid flag \"%s\" in line directive" +msgstr "satır yönergesinde geçersiz \"%s\" seçeneği" + +#: directives.c:868 +#, c-format +msgid "\"%s\" after #line is not a positive integer" +msgstr "#line'dan sonraki \"%s\" bir pozitif tamsayı değil" + +#: directives.c:874 +msgid "line number out of range" +msgstr "satır numarası kapsam dışı" + +#: directives.c:887 directives.c:964 +#, c-format +msgid "\"%s\" is not a valid filename" +msgstr "\"%s\" geçerli bir dosya ismi değil" + +#: directives.c:924 +#, c-format +msgid "\"%s\" after # is not a positive integer" +msgstr "#'dan sonraki \"%s\" bir pozitif tamsayı değil" + +#: directives.c:1026 +#, c-format +msgid "invalid #%s directive" +msgstr "#%s yönergesi geçersiz" + +#: directives.c:1089 +#, c-format +msgid "registering pragmas in namespace \"%s\" with mismatched name expansion" +msgstr "\"%s\" isim-alanındaki pragmalar uyumsuz isim yorumlaması ile kaydediliyor" + +#: directives.c:1098 +#, c-format +msgid "registering pragma \"%s\" with name expansion and no namespace" +msgstr "pragma \"%s\" isim alansız olarak isim yorumlamasıyla kaydediliyor" + +#: directives.c:1116 +#, c-format +msgid "registering \"%s\" as both a pragma and a pragma namespace" +msgstr "\"%s\" hem pragma hem de pragma isim alanı olarak kaydediliyor" + +#: directives.c:1119 +#, c-format +msgid "#pragma %s %s is already registered" +msgstr "#pragma %s %s zaten kayıtlı" + +#: directives.c:1122 +#, c-format +msgid "#pragma %s is already registered" +msgstr "#pragma %s zaten kayıtlı" + +#: directives.c:1152 +msgid "registering pragma with NULL handler" +msgstr "pragma NULL eylemci ile kaydediliyor" + +#: directives.c:1362 +msgid "#pragma once in main file" +msgstr "main dosyasında '#pragma once'" + +#: directives.c:1385 +msgid "invalid #pragma GCC poison directive" +msgstr "geçersiz #pragma GCC poison yönergesi" + +#: directives.c:1394 +#, c-format +msgid "poisoning existing macro \"%s\"" +msgstr "zehirlenen mevcut makro \"%s\"" + +#: directives.c:1413 +msgid "#pragma system_header ignored outside include file" +msgstr "başlık dosyasının dışındaki '#pragma system_header' yoksayıldı" + +#: directives.c:1437 +#, c-format +msgid "cannot find source file %s" +msgstr "%s kaynak dosyası bulunamıyor" + +#: directives.c:1441 +#, c-format +msgid "current file is older than %s" +msgstr "mevcut dosya %s den daha eski" + +#: directives.c:1620 +msgid "_Pragma takes a parenthesized string literal" +msgstr "_Pragma bir parantezli dizge sabiti alır" + +#: directives.c:1693 +msgid "#else without #if" +msgstr "#if siz #else" + +#: directives.c:1698 +msgid "#else after #else" +msgstr "#else den sonra #else" + +#: directives.c:1700 directives.c:1733 +msgid "the conditional began here" +msgstr "koşul başlangıcı burası" + +#: directives.c:1726 +msgid "#elif without #if" +msgstr "#if siz #elif " + +#: directives.c:1731 +msgid "#elif after #else" +msgstr "#else den sonra #elif" + +#: directives.c:1761 +msgid "#endif without #if" +msgstr "#if siz #endif" + +#: directives.c:1838 +msgid "missing '(' after predicate" +msgstr "dayanaktan sonra '(' eksik" + +#: directives.c:1853 +msgid "missing ')' to complete answer" +msgstr "yanıtı tamamlayacak ')' eksik" + +#: directives.c:1873 +msgid "predicate's answer is empty" +msgstr "dayanakların cevabı boş" + +#: directives.c:1900 +msgid "assertion without predicate" +msgstr "dayanaksız olumlama" + +#: directives.c:1902 +msgid "predicate must be an identifier" +msgstr "dayanak bir tanımlayıcı olmalı" + +#: directives.c:1988 +#, c-format +msgid "\"%s\" re-asserted" +msgstr "\"%s\" tekrar olumlanmış" + +#: directives.c:2271 +#, c-format +msgid "unterminated #%s" +msgstr "sonlandırılmamış #%s" + +#: directives-only.c:221 lex.c:1016 traditional.c:162 +msgid "unterminated comment" +msgstr "sonlandırılmamış açıklama" + +#: errors.c:118 +msgid "warning: " +msgstr "uyarı: " + +#: errors.c:120 +msgid "internal error: " +msgstr "iç hata: " + +#: errors.c:122 +msgid "error: " +msgstr "hata: " + +#: errors.c:186 +msgid "stdout" +msgstr "stdÇ" + +#: errors.c:188 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: expr.c:261 +msgid "too many decimal points in number" +msgstr "sayı içindeki ondalık nokta sayısı çok fazla" + +#: expr.c:290 expr.c:365 +#, fuzzy +msgid "fixed-point constants are a GCC extension" +msgstr "sanal sabitler bir GCC genişletmesidir" + +#: expr.c:303 +#, fuzzy, c-format +msgid "invalid digit \"%c\" in binary constant" +msgstr "sekizlik sabit içindeki \"%c\" geçersiz" + +#: expr.c:305 +#, c-format +msgid "invalid digit \"%c\" in octal constant" +msgstr "sekizlik sabit içindeki \"%c\" geçersiz" + +#: expr.c:313 +#, fuzzy +msgid "invalid prefix \"0b\" for floating constant" +msgstr "gerçel sabitin \"%.*s\" soneki geçersiz" + +#: expr.c:319 +msgid "use of C99 hexadecimal floating constant" +msgstr "C99 onaltılık gerçel sayı sabit kullanımı" + +#: expr.c:328 +msgid "exponent has no digits" +msgstr "üs rakam içermiyor" + +#: expr.c:335 +msgid "hexadecimal floating constants require an exponent" +msgstr "onaltılık gerçel sabitler bir üs gerektirir" + +#: expr.c:341 +#, c-format +msgid "invalid suffix \"%.*s\" on floating constant" +msgstr "gerçel sabitin \"%.*s\" soneki geçersiz" + +#: expr.c:351 expr.c:393 +#, c-format +msgid "traditional C rejects the \"%.*s\" suffix" +msgstr "geleneksel C \"%.*s\" sonekini kullanmaz" + +#: expr.c:358 +#, c-format +msgid "invalid suffix \"%.*s\" with hexadecimal floating constant" +msgstr "onaltılık kayan sabitli \"%.*s\" soneki geçersiz" + +#: expr.c:369 +#, fuzzy +msgid "decimal float constants are a GCC extension" +msgstr "sanal sabitler bir GCC genişletmesidir" + +#: expr.c:379 +#, c-format +msgid "invalid suffix \"%.*s\" on integer constant" +msgstr "tamsayı sabitte sonek \"%.*s\" soneki geçersiz" + +#: expr.c:401 +msgid "use of C99 long long integer constant" +msgstr "ISO C99 long long tamsayı sabitleri yasaklar" + +#: expr.c:409 +msgid "imaginary constants are a GCC extension" +msgstr "sanal sabitler bir GCC genişletmesidir" + +#: expr.c:412 +#, fuzzy +msgid "binary constants are a GCC extension" +msgstr "sanal sabitler bir GCC genişletmesidir" + +#: expr.c:505 +msgid "integer constant is too large for its type" +msgstr "tamsayı sabit, türü için oldukça büyük" + +#: expr.c:517 +msgid "integer constant is so large that it is unsigned" +msgstr "tamsayı sabit unsigned olarak oldukça büyük" + +#: expr.c:612 +msgid "missing ')' after \"defined\"" +msgstr "\"defined\" dan sonra ')' eksik" + +#: expr.c:619 +msgid "operator \"defined\" requires an identifier" +msgstr "\"defined\" işleci bir tanımlayıcı gerektirir" + +#: expr.c:627 +#, c-format +msgid "(\"%s\" is an alternative token for \"%s\" in C++)" +msgstr "(C++'da \"%s\" \"%s\" için bir alternatif dizgeciktir)" + +#: expr.c:637 +msgid "this use of \"defined\" may not be portable" +msgstr "\"defined\" bu kullanımıyla uyarlanabilir olmayabilir" + +#: expr.c:676 +msgid "floating constant in preprocessor expression" +msgstr "önişlemci ifadesinde gerçel sayı taşması" + +#: expr.c:682 +msgid "imaginary number in preprocessor expression" +msgstr "önişlemci ifadesinde sanal sayı" + +#: expr.c:727 +#, c-format +msgid "\"%s\" is not defined" +msgstr "\"%s\" tanımlı değil" + +#: expr.c:855 expr.c:884 +#, c-format +msgid "missing binary operator before token \"%s\"" +msgstr "\"%s\" dizgeciğinden önceki iki terimli işleç eksik" + +#: expr.c:875 +#, c-format +msgid "token \"%s\" is not valid in preprocessor expressions" +msgstr "\"%s\" dizgeciği önişlemci ifadelerinde geçersizdir" + +#: expr.c:892 +msgid "missing expression between '(' and ')'" +msgstr "'(' ve ')' arasında ifade eksik" + +#: expr.c:895 +msgid "#if with no expression" +msgstr "#if ifadesiz" + +#: expr.c:898 +#, c-format +msgid "operator '%s' has no right operand" +msgstr "`%s' işlecinin sağ tarafı yok" + +#: expr.c:903 +#, c-format +msgid "operator '%s' has no left operand" +msgstr "`%s' işlecinin sol terimi yok" + +#: expr.c:929 +msgid " ':' without preceding '?'" +msgstr "':' den önce '?' yok" + +#: expr.c:956 +msgid "unbalanced stack in #if" +msgstr "#if ifadesinde karşılıksız yığın" + +#: expr.c:975 +#, c-format +msgid "impossible operator '%u'" +msgstr "işleç '%u' imkansız" + +#: expr.c:1065 +msgid "missing ')' in expression" +msgstr "ifadede ')' eksik" + +#: expr.c:1086 +msgid "'?' without following ':'" +msgstr "'?' dan sonra ':' yok" + +#: expr.c:1096 +msgid "integer overflow in preprocessor expression" +msgstr "önişlemci ifadesinde tamsayı taşması" + +#: expr.c:1101 +msgid "missing '(' in expression" +msgstr "ifadede '(' eksik" + +#: expr.c:1133 +#, c-format +msgid "the left operand of \"%s\" changes sign when promoted" +msgstr "\"%s\"in soldaki terimi yükseltgenirken işaret değiştiriyor" + +#: expr.c:1138 +#, c-format +msgid "the right operand of \"%s\" changes sign when promoted" +msgstr "\"%s\"in sağdaki terimi yükseltgenirken işaret değiştiriyor" + +#: expr.c:1397 +msgid "traditional C rejects the unary plus operator" +msgstr "geleneksel C tekil artı işlecini dışlar" + +#: expr.c:1480 +msgid "comma operator in operand of #if" +msgstr "#if'in teriminde virgül" + +#: expr.c:1612 +msgid "division by zero in #if" +msgstr "#if içinde sıfırla bölme" + +#: files.c:442 +msgid "NULL directory in find_file" +msgstr "find_file içinde boş dizin" + +#: files.c:480 +msgid "one or more PCH files were found, but they were invalid" +msgstr "bir veya daha fazla PCH dosyası bulundu ama bunlar geçersiz" + +#: files.c:483 +msgid "use -Winvalid-pch for more information" +msgstr "daha fazla bilgi almak için -Winvalid-pch kullanın" + +#: files.c:570 +#, c-format +msgid "%s is a block device" +msgstr "%s bir blok aygıtıdır" + +#: files.c:587 +#, c-format +msgid "%s is too large" +msgstr "%s çok büyük" + +#: files.c:622 +#, c-format +msgid "%s is shorter than expected" +msgstr "%s beklenenden daha kısa" + +#: files.c:852 +#, c-format +msgid "no include path in which to search for %s" +msgstr "%s için aranacaklar içinde başlık dosyaları yolu yok" + +#: files.c:1157 +msgid "Multiple include guards may be useful for:\n" +msgstr "Çoklu include önlemleri aşağıdakiler için kullanışlı olabilir:\n" + +#: init.c:426 +msgid "cppchar_t must be an unsigned type" +msgstr "cppchar_t bir usigned tür olmalı" + +#: init.c:430 +#, c-format +msgid "preprocessor arithmetic has maximum precision of %lu bits; target requires %lu bits" +msgstr "önişlemci aritmetiği %lu bitlik maksimum genişliğe sahip; hedef için %lu bit gerekiyor" + +#: init.c:437 +msgid "CPP arithmetic must be at least as precise as a target int" +msgstr "CPP aritmetiği en azından bir hedef int kadar genişlikte olmalı " + +#: init.c:440 +msgid "target char is less than 8 bits wide" +msgstr "hedef char 8bitlik genişlikten küçük" + +#: init.c:444 +msgid "target wchar_t is narrower than target char" +msgstr "hedef wchar_t hedef char'dan daha dar" + +#: init.c:448 +msgid "target int is narrower than target char" +msgstr "hedef int hedef char'dan daha dar" + +#: init.c:453 +msgid "CPP half-integer narrower than CPP character" +msgstr "CPP half-integer'ı CPP character'dan daha dar" + +#: init.c:457 +#, c-format +msgid "CPP on this host cannot handle wide character constants over %lu bits, but the target requires %lu bits" +msgstr "Bu konaktaki CPP %lu bitten büyük karakter sabitleriyle çalışamaz, hedef ise %lu bit gerektiriyor" + +#: lex.c:283 +msgid "backslash and newline separated by space" +msgstr "ters bölü ve satırsonu arasında boşluk var" + +#: lex.c:288 +msgid "backslash-newline at end of file" +msgstr "dosyanın sonunda tersbölülü satırsonu" + +#: lex.c:303 +#, c-format +msgid "trigraph ??%c converted to %c" +msgstr "??%c üçlü harfi %c olarak dönüştürüldü" + +#: lex.c:310 +#, c-format +msgid "trigraph ??%c ignored, use -trigraphs to enable" +msgstr "??%c üçlü harfi yoksayıldı, yoksayılmaması için -trigraphs kullanın" + +#: lex.c:356 +msgid "\"/*\" within comment" +msgstr "açıklama içinde \"/*\" bulundu" + +#: lex.c:414 +#, c-format +msgid "%s in preprocessing directive" +msgstr "önişlem yönergesi içinde %s" + +#: lex.c:423 +msgid "null character(s) ignored" +msgstr "null karakter(ler) yoksayıldı" + +#: lex.c:460 +#, c-format +msgid "`%.*s' is not in NFKC" +msgstr "`%.*s' NFKC'de yok" + +#: lex.c:463 +#, c-format +msgid "`%.*s' is not in NFC" +msgstr "`%.*s' NFC'de yok" + +#: lex.c:551 +#, c-format +msgid "attempt to use poisoned \"%s\"" +msgstr "zehirli \"%s\" kullanılmaya çalışılıyor" + +#: lex.c:559 +msgid "__VA_ARGS__ can only appear in the expansion of a C99 variadic macro" +msgstr "__VA_ARGS__ sadece argümanlarının sayısı değişebilen bir C99 makrosunun genişleme alanında görünebilir" + +#: lex.c:659 +msgid "null character(s) preserved in literal" +msgstr "null karakter(ler) sabit içinde saklanmış" + +#: lex.c:662 +#, c-format +msgid "missing terminating %c character" +msgstr "sonlandıran %c karakteri eksik" + +#: lex.c:1027 +msgid "C++ style comments are not allowed in ISO C90" +msgstr "C++ tarzı açıklamalara ISO C90'da izin verilmez" + +#: lex.c:1029 +msgid "(this will be reported only once per input file)" +msgstr "(her girdi dosyasında sadece bir kere raporlanacaktır)" + +#: lex.c:1034 +msgid "multi-line comment" +msgstr "çok satırlı açıklama" + +#: lex.c:1347 +#, c-format +msgid "unspellable token %s" +msgstr "dizgecik %s okunabilir değil" + +#: line-map.c:320 +#, c-format +msgid "In file included from %s:%u" +msgstr "" +"Sırayla bir altındaki dosyada içerilerek:\n" +"\t\t%s:%u" + +#: line-map.c:338 +#, c-format +msgid "" +",\n" +" from %s:%u" +msgstr "" +",\n" +"\t\t%s:%u" + +#: macro.c:84 +#, c-format +msgid "macro \"%s\" is not used" +msgstr "\"%s\" makrosu kullanılmadı" + +#: macro.c:123 macro.c:319 +#, c-format +msgid "invalid built-in macro \"%s\"" +msgstr "geçersiz yerleşik makro \"%s\"" + +#: macro.c:157 +msgid "could not determine file timestamp" +msgstr "dosya tarih damgası saptanamadı" + +#: macro.c:254 +msgid "could not determine date and time" +msgstr "tarih ve saat saptanamadı" + +#: macro.c:270 +msgid "__COUNTER__ expanded inside directive with -fdirectives-only" +msgstr "" + +#: macro.c:423 +msgid "invalid string literal, ignoring final '\\'" +msgstr "geçersiz dizge sabit, son '\\' yoksayılıyor" + +#: macro.c:483 +#, c-format +msgid "pasting \"%s\" and \"%s\" does not give a valid preprocessing token" +msgstr "\"%s\" ve \"%s\" geçişi geçerli bir önişlem dizgeciği vermez" + +#: macro.c:558 +msgid "ISO C99 requires rest arguments to be used" +msgstr "ISO C kalan argümanların kullanılmış olmasını gerektirir" + +#: macro.c:563 +#, c-format +msgid "macro \"%s\" requires %u arguments, but only %u given" +msgstr "makro \"%s\" %u argüman gerektiriyor ama sadece %u argüman verilmiş" + +#: macro.c:568 +#, c-format +msgid "macro \"%s\" passed %u arguments, but takes just %u" +msgstr "makro \"%s\" için %u argüman verilmiş ama tam %u argüman alıyor" + +#: macro.c:679 traditional.c:680 +#, c-format +msgid "unterminated argument list invoking macro \"%s\"" +msgstr "sonlandırılmamış argüman listesi çağıran makro \"%s\"" + +#: macro.c:782 +#, c-format +msgid "function-like macro \"%s\" must be used with arguments in traditional C" +msgstr "işlev benzeri makro \"%s\" geleneksel C'de argümanlarla kullanılmalıdır" + +#: macro.c:1325 +#, c-format +msgid "duplicate macro parameter \"%s\"" +msgstr "yinelenmiş makro parametresi \"%s\"" + +#: macro.c:1371 +#, c-format +msgid "\"%s\" may not appear in macro parameter list" +msgstr "\"%s\" makro parametre listesinde görünmeyebilir" + +#: macro.c:1379 +msgid "macro parameters must be comma-separated" +msgstr "makro parametreleri virgüllerle ayrılmış olmalı" + +#: macro.c:1396 +msgid "parameter name missing" +msgstr "parametre ismi eksik" + +#: macro.c:1413 +msgid "anonymous variadic macros were introduced in C99" +msgstr "argümanlarının sayısı değişebilen anonim makrolar C99 da tanıtıldı" + +#: macro.c:1418 +msgid "ISO C does not permit named variadic macros" +msgstr "ISO C argümanlarının sayısı değişebilen isimli makrolara izin vermez" + +#: macro.c:1427 +msgid "missing ')' in macro parameter list" +msgstr "makro parametre listesinde ')' eksik" + +#: macro.c:1476 +msgid "'##' cannot appear at either end of a macro expansion" +msgstr "'##' bir makronun her iki ucunda da görünemez" + +#: macro.c:1510 +msgid "ISO C99 requires whitespace after the macro name" +msgstr "ISO C99 makro isminden sonra boşluk gerektirir" + +#: macro.c:1534 +msgid "missing whitespace after the macro name" +msgstr "makro isminden sonra boşluk gerekir" + +#: macro.c:1564 +msgid "'#' is not followed by a macro parameter" +msgstr "'#' işaretinden sonra bir makro parametresi yok" + +#: macro.c:1683 +#, c-format +msgid "\"%s\" redefined" +msgstr "\"%s\" yeniden tanımlanmış" + +#: macro.c:1688 +msgid "this is the location of the previous definition" +msgstr "burası evvelki tanımın yapıldığı yer" + +#: macro.c:1738 +#, c-format +msgid "macro argument \"%s\" would be stringified in traditional C" +msgstr "makro argümanı \"%s\" geleneksel C'de dizgelenmiş olmalıydı" + +#: macro.c:1761 +#, c-format +msgid "invalid hash type %d in cpp_macro_definition" +msgstr "cpp_macro_definition içindeki isimli yapı türü %d geçersiz" + +#: pch.c:84 pch.c:332 pch.c:344 pch.c:362 pch.c:368 pch.c:377 +msgid "while writing precompiled header" +msgstr "önderlemeli başlık yazılırken" + +#: pch.c:485 +#, c-format +msgid "%s: not used because `%.*s' not defined" +msgstr "%s: `%.*s' tanımlı olmadığından kullanılmadı" + +#: pch.c:497 +#, c-format +msgid "%s: not used because `%.*s' defined as `%s' not `%.*s'" +msgstr "%s: `%.*s' kullanılmadı çünkü `%s' olarak tanımlı, `%.*s' değil" + +#: pch.c:538 +#, c-format +msgid "%s: not used because `%s' is defined" +msgstr "%s: `%s' tanımlı olduğundan kullanılmadı" + +#: pch.c:558 +#, fuzzy, c-format +msgid "%s: not used because `__COUNTER__' is invalid" +msgstr "%s: `%s' tanımlı olduğundan kullanılmadı" + +#: pch.c:567 pch.c:737 +msgid "while reading precompiled header" +msgstr "önderlemeli başlık okunurken" + +#: traditional.c:750 +#, c-format +msgid "detected recursion whilst expanding macro \"%s\"" +msgstr "makro \"%s\" genişletilirken iç içelik saptandı" + +#: traditional.c:917 +msgid "syntax error in macro parameter list" +msgstr "makro parametre listesinde sözdizimi hatası" + +#~ msgid "no newline at end of file" +#~ msgstr "dosya sonunda satırsonu karakteri yok" diff --git a/libcpp/po/uk.po b/libcpp/po/uk.po new file mode 100644 index 0000000..1509ca2 --- /dev/null +++ b/libcpp/po/uk.po @@ -0,0 +1,911 @@ +# Ukrainian translation of cpplib. +# Copyright (C) 2007 Free Software Foundation, Inc. +# Maxim V. Dziumanenko , 2007. +# +msgid "" +msgstr "" +"Project-Id-Version: cpplib 4.2.1\n" +"Report-Msgid-Bugs-To: http://gcc.gnu.org/bugs.html\n" +"POT-Creation-Date: 2007-11-08 21:08+0000\n" +"PO-Revision-Date: 2007-08-17 11:23+0300\n" +"Last-Translator: Maxim V. Dziumanenko \n" +"Language-Team: Ukrainian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#: charset.c:654 +#, c-format +msgid "conversion from %s to %s not supported by iconv" +msgstr "перетворення з %s у %s не підтримується iconv" + +#: charset.c:657 +msgid "iconv_open" +msgstr "iconv_open" + +#: charset.c:665 +#, c-format +msgid "no iconv implementation, cannot convert from %s to %s" +msgstr "відсутня реалізація iconv, не вдається перетворити з %s на %s" + +#: charset.c:742 +#, c-format +msgid "character 0x%lx is not in the basic source character set\n" +msgstr "символ 0x%lx відсутній у базовому первинному наборі символів\n" + +#: charset.c:759 charset.c:1352 +msgid "converting to execution character set" +msgstr "перетворення на виконуваний набір символів" + +#: charset.c:765 +#, c-format +msgid "character 0x%lx is not unibyte in execution character set" +msgstr "символ 0x%lx не однобайтовий у виконуваному наборі символів" + +#: charset.c:889 +#, c-format +msgid "Character %x might not be NFKC" +msgstr "Символ %x може не бути NFKC" + +#: charset.c:949 +msgid "universal character names are only valid in C++ and C99" +msgstr "універсальні назви символів допустимі лише у C++ та C99" + +#: charset.c:952 +#, c-format +msgid "the meaning of '\\%c' is different in traditional C" +msgstr "сенс '\\%c' відрізняється від традиційної мови C" + +#: charset.c:961 +msgid "In _cpp_valid_ucn but not a UCN" +msgstr "У _cpp_valid_ucn але не UCN" + +#: charset.c:986 +#, c-format +msgid "incomplete universal character name %.*s" +msgstr "неповна універсальна назва символу %.*s" + +#: charset.c:998 +#, c-format +msgid "%.*s is not a valid universal character" +msgstr "%.*s не є допустимим універсальним символом" + +#: charset.c:1008 lex.c:484 +msgid "'$' in identifier or number" +msgstr "'$' у ідентифікаторі чи числі" + +#: charset.c:1018 +#, c-format +msgid "universal character %.*s is not valid in an identifier" +msgstr "універсальний символ %.*s не є допустимим у ідентифікаторі" + +#: charset.c:1022 +#, c-format +msgid "universal character %.*s is not valid at the start of an identifier" +msgstr "універсальний символ %.*s не є допустимим на початку ідентифікатора" + +#: charset.c:1056 charset.c:1571 +msgid "converting UCN to source character set" +msgstr "перетворення UCN на первинний набір символів" + +#: charset.c:1060 +msgid "converting UCN to execution character set" +msgstr "перетворення UCN на виконуваний набір символів" + +#: charset.c:1132 +msgid "the meaning of '\\x' is different in traditional C" +msgstr "сенс '\\x' відрізняється від традиційної мови C" + +#: charset.c:1149 +msgid "\\x used with no following hex digits" +msgstr "\\x використовується з наступними шістнадцятковими цифрами" + +#: charset.c:1156 +msgid "hex escape sequence out of range" +msgstr "шістнадцяткова escape-послідовність поза межами діапазону" + +#: charset.c:1195 +msgid "octal escape sequence out of range" +msgstr "вісімкова escape-послідовність поза межами діапазону" + +#: charset.c:1263 +msgid "the meaning of '\\a' is different in traditional C" +msgstr "сенс '\\a' відрізняється від традиційної мови C" + +#: charset.c:1270 +#, c-format +msgid "non-ISO-standard escape sequence, '\\%c'" +msgstr "escape-послідовність не за стандартом ISO, '\\%c'" + +#: charset.c:1278 +#, c-format +msgid "unknown escape sequence '\\%c'" +msgstr "Невідома escape-послідовність '\\%c'" + +#: charset.c:1286 +#, c-format +msgid "unknown escape sequence: '\\%s'" +msgstr "Невідома escape-послідовність: '\\%s'" + +#: charset.c:1293 +msgid "converting escape sequence to execution character set" +msgstr "escape-послідовність перетворюється на виконуваний набір символів" + +#: charset.c:1415 charset.c:1478 +msgid "character constant too long for its type" +msgstr "символьна константа надто довга для вказаного типу" + +#: charset.c:1418 +msgid "multi-character character constant" +msgstr "багатосимвольна символьна константа" + +#: charset.c:1510 +msgid "empty character constant" +msgstr "порожня символьна константа" + +#: charset.c:1612 +#, c-format +msgid "failure to convert %s to %s" +msgstr "помилка при перетворені %s на %s" + +#: directives.c:215 directives.c:241 +#, c-format +msgid "extra tokens at end of #%s directive" +msgstr "зайві лексеми наприкінці директиви #%s" + +#: directives.c:344 +#, c-format +msgid "#%s is a GCC extension" +msgstr "#%s є розширенням GCC" + +#: directives.c:356 +msgid "suggest not using #elif in traditional C" +msgstr "рекомендується не використовувати #elif у традиційній мові C" + +#: directives.c:359 +#, c-format +msgid "traditional C ignores #%s with the # indented" +msgstr "у традиційній мові C ігноруються #%s, якщо # з відступом" + +#: directives.c:363 +#, c-format +msgid "suggest hiding #%s from traditional C with an indented #" +msgstr "рекомендується приховувати #%s у традиційній мові C використовуючи відступ перед #" + +#: directives.c:389 +msgid "embedding a directive within macro arguments is not portable" +msgstr "вбудована директива з макро-аргументами не є переносимою" + +#: directives.c:409 +msgid "style of line directive is a GCC extension" +msgstr "стиль директиви line є розширенням GCC" + +#: directives.c:464 +#, c-format +msgid "invalid preprocessing directive #%s" +msgstr "неправильна директива препроцесора #%s" + +#: directives.c:532 +msgid "\"defined\" cannot be used as a macro name" +msgstr "\"defined\" не може використовуватись як назва макросу" + +#: directives.c:538 +#, c-format +msgid "\"%s\" cannot be used as a macro name as it is an operator in C++" +msgstr "\"%s\" не може використовуватись як назва макросу, оскільки це - оператор у C++" + +#: directives.c:541 +#, c-format +msgid "no macro name given in #%s directive" +msgstr "не вказаний макрос у директиві #%s" + +#: directives.c:544 +msgid "macro names must be identifiers" +msgstr "назви макросів повинні бути ідентифікаторами" + +#: directives.c:585 +#, c-format +msgid "undefining \"%s\"" +msgstr "скасовується визначення \"%s\"" + +#: directives.c:640 +msgid "missing terminating > character" +msgstr "відсутній завершальний символ >" + +#: directives.c:695 +#, c-format +msgid "#%s expects \"FILENAME\" or " +msgstr "#%s очікує \"FILENAME\" або " + +#: directives.c:739 +#, c-format +msgid "empty filename in #%s" +msgstr "порожня назва файлу у #%s" + +#: directives.c:749 +msgid "#include nested too deeply" +msgstr "надто глибоке вкладання #include" + +#: directives.c:790 +msgid "#include_next in primary source file" +msgstr "#include_next у первинному файлі тексту програми" + +#: directives.c:816 +#, c-format +msgid "invalid flag \"%s\" in line directive" +msgstr "некоректна ознака \"%s\" у директиві line" + +#: directives.c:868 +#, c-format +msgid "\"%s\" after #line is not a positive integer" +msgstr "\"%s\" після #line не є додатнім цілим числом" + +#: directives.c:874 +msgid "line number out of range" +msgstr "номер рядка за межами діапазону" + +#: directives.c:887 directives.c:964 +#, c-format +msgid "\"%s\" is not a valid filename" +msgstr "\"%s\" не є коректною назвою файлу" + +#: directives.c:924 +#, c-format +msgid "\"%s\" after # is not a positive integer" +msgstr "\"%s\" після # не є додатнім цілим числом" + +#: directives.c:1026 +#, c-format +msgid "invalid #%s directive" +msgstr "некоректна директива #%s" + +#: directives.c:1089 +#, c-format +msgid "registering pragmas in namespace \"%s\" with mismatched name expansion" +msgstr "прагми реєструються у просторі назв \"%s\" за відсутності розширення назв" + +#: directives.c:1098 +#, c-format +msgid "registering pragma \"%s\" with name expansion and no namespace" +msgstr "прагма \"%s\" реєструється з розширенням назви але без простору назви" + +#: directives.c:1116 +#, c-format +msgid "registering \"%s\" as both a pragma and a pragma namespace" +msgstr "\"%s\" реєструється як прагма та як прострі назв прагм" + +#: directives.c:1119 +#, c-format +msgid "#pragma %s %s is already registered" +msgstr "#pragma %s %s вже зареєстровано" + +#: directives.c:1122 +#, c-format +msgid "#pragma %s is already registered" +msgstr "#pragma %s вже зареєстровано" + +#: directives.c:1152 +msgid "registering pragma with NULL handler" +msgstr "реєструється pragma з NULL-обробником" + +#: directives.c:1362 +msgid "#pragma once in main file" +msgstr "#pragma один раз у головному файлі" + +#: directives.c:1385 +msgid "invalid #pragma GCC poison directive" +msgstr "некоректна #pragma GCC poison директива" + +#: directives.c:1394 +#, c-format +msgid "poisoning existing macro \"%s\"" +msgstr "poisoning існуючих макросів \"%s\"" + +#: directives.c:1413 +msgid "#pragma system_header ignored outside include file" +msgstr "#pragma system_header проігноровано за межами включеного файлу" + +#: directives.c:1437 +#, c-format +msgid "cannot find source file %s" +msgstr "не вдається знайти первинний файл %s" + +#: directives.c:1441 +#, c-format +msgid "current file is older than %s" +msgstr "поточний файл старіший ніж %s" + +#: directives.c:1620 +msgid "_Pragma takes a parenthesized string literal" +msgstr "_Pragma охоплює дужками символьний літерал" + +#: directives.c:1693 +msgid "#else without #if" +msgstr "#else без #if" + +#: directives.c:1698 +msgid "#else after #else" +msgstr "#else після #else" + +#: directives.c:1700 directives.c:1733 +msgid "the conditional began here" +msgstr "умова починається тут" + +#: directives.c:1726 +msgid "#elif without #if" +msgstr "#elif без #if" + +#: directives.c:1731 +msgid "#elif after #else" +msgstr "#elif після #else" + +#: directives.c:1761 +msgid "#endif without #if" +msgstr "#endif беp #if" + +#: directives.c:1838 +msgid "missing '(' after predicate" +msgstr "відсутня '(' після предикату" + +#: directives.c:1853 +msgid "missing ')' to complete answer" +msgstr "відсутня ')' для завершення відповіді" + +#: directives.c:1873 +msgid "predicate's answer is empty" +msgstr "відповідь предиката порожня" + +#: directives.c:1900 +msgid "assertion without predicate" +msgstr "твердження без предикату" + +#: directives.c:1902 +msgid "predicate must be an identifier" +msgstr "предикат має бути ідентифікатором" + +#: directives.c:1988 +#, c-format +msgid "\"%s\" re-asserted" +msgstr "\"%s\" повторне ствердження" + +#: directives.c:2271 +#, c-format +msgid "unterminated #%s" +msgstr "незавершене #%s" + +#: directives-only.c:221 lex.c:1016 traditional.c:162 +msgid "unterminated comment" +msgstr "незавершений коментар" + +#: errors.c:118 +msgid "warning: " +msgstr "попередження: " + +#: errors.c:120 +msgid "internal error: " +msgstr "внутрішня помилка: " + +#: errors.c:122 +msgid "error: " +msgstr "error: " + +#: errors.c:186 +msgid "stdout" +msgstr "stdout" + +#: errors.c:188 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: expr.c:261 +msgid "too many decimal points in number" +msgstr "надто багато десяткових точок у числі" + +#: expr.c:290 expr.c:365 +#, fuzzy +msgid "fixed-point constants are a GCC extension" +msgstr "уявні константи є розширенням GCC" + +#: expr.c:303 +#, fuzzy, c-format +msgid "invalid digit \"%c\" in binary constant" +msgstr "некоректна цифра \"%c\" у вісімковій константі" + +#: expr.c:305 +#, c-format +msgid "invalid digit \"%c\" in octal constant" +msgstr "некоректна цифра \"%c\" у вісімковій константі" + +#: expr.c:313 +#, fuzzy +msgid "invalid prefix \"0b\" for floating constant" +msgstr "некоректний суфікс \"%.*s\" у константі з плаваючою комою" + +#: expr.c:319 +msgid "use of C99 hexadecimal floating constant" +msgstr "використовуйте десятково-шістнадцяткову константу з плаваючою комою мови C99" + +#: expr.c:328 +msgid "exponent has no digits" +msgstr "експонента не має цифр" + +#: expr.c:335 +msgid "hexadecimal floating constants require an exponent" +msgstr "для десятково-шістнадцяткової константи з плаваючою комою потрібна експонента" + +#: expr.c:341 +#, c-format +msgid "invalid suffix \"%.*s\" on floating constant" +msgstr "некоректний суфікс \"%.*s\" у константі з плаваючою комою" + +#: expr.c:351 expr.c:393 +#, c-format +msgid "traditional C rejects the \"%.*s\" suffix" +msgstr "традиційною мовою C не сприймається суфікс \"%.*s\"" + +#: expr.c:358 +#, c-format +msgid "invalid suffix \"%.*s\" with hexadecimal floating constant" +msgstr "некоректний суфікс \"%.*s\" з десятково-шістнадцятковою константою з плаваючою комою" + +#: expr.c:369 +#, fuzzy +msgid "decimal float constants are a GCC extension" +msgstr "уявні константи є розширенням GCC" + +#: expr.c:379 +#, c-format +msgid "invalid suffix \"%.*s\" on integer constant" +msgstr "некоректний суфікс \"%.*s\" у цілій константі" + +#: expr.c:401 +msgid "use of C99 long long integer constant" +msgstr "використовуйте цілу константу long long з C99" + +#: expr.c:409 +msgid "imaginary constants are a GCC extension" +msgstr "уявні константи є розширенням GCC" + +#: expr.c:412 +#, fuzzy +msgid "binary constants are a GCC extension" +msgstr "уявні константи є розширенням GCC" + +#: expr.c:505 +msgid "integer constant is too large for its type" +msgstr "ціла константа надто велика для вказаного типу" + +#: expr.c:517 +msgid "integer constant is so large that it is unsigned" +msgstr "ціла константа така велика, що вона не матиме знаку" + +#: expr.c:612 +msgid "missing ')' after \"defined\"" +msgstr "відсутня ')' після \"defined\"" + +#: expr.c:619 +msgid "operator \"defined\" requires an identifier" +msgstr "для оператора \"defined\" потрібен ідентифікатор" + +#: expr.c:627 +#, c-format +msgid "(\"%s\" is an alternative token for \"%s\" in C++)" +msgstr "(\"%s\" - альтернативна лексема для \"%s\" у C++)" + +#: expr.c:637 +msgid "this use of \"defined\" may not be portable" +msgstr "використання \"defined\" може бути непереносимим" + +#: expr.c:676 +msgid "floating constant in preprocessor expression" +msgstr "константа з плаваючою комою у виразі препроцесора" + +#: expr.c:682 +msgid "imaginary number in preprocessor expression" +msgstr "уявне число у виразі препроцесора" + +#: expr.c:727 +#, c-format +msgid "\"%s\" is not defined" +msgstr "\"%s\" не визначено" + +#: expr.c:855 expr.c:884 +#, c-format +msgid "missing binary operator before token \"%s\"" +msgstr "відсутній двійковий оператор перед лексемою \"%s\"" + +#: expr.c:875 +#, c-format +msgid "token \"%s\" is not valid in preprocessor expressions" +msgstr "лексема \"%s\" не є допустимим у виразі препроцесора" + +#: expr.c:892 +msgid "missing expression between '(' and ')'" +msgstr "відсутній вираз між '(' та ')'" + +#: expr.c:895 +msgid "#if with no expression" +msgstr "відсутній вираз після #if" + +#: expr.c:898 +#, c-format +msgid "operator '%s' has no right operand" +msgstr "оператор '%s' не містить коректного операнду" + +#: expr.c:903 +#, c-format +msgid "operator '%s' has no left operand" +msgstr "оператор '%s' не містить лівого операнду" + +#: expr.c:929 +msgid " ':' without preceding '?'" +msgstr " ':' без подовження '?'" + +#: expr.c:956 +msgid "unbalanced stack in #if" +msgstr "незбалансований стек у #if" + +#: expr.c:975 +#, c-format +msgid "impossible operator '%u'" +msgstr "неможливий оператор '%u'" + +#: expr.c:1065 +msgid "missing ')' in expression" +msgstr "відсутня ')' у виразі" + +#: expr.c:1086 +msgid "'?' without following ':'" +msgstr "'?' без наступного ':'" + +#: expr.c:1096 +msgid "integer overflow in preprocessor expression" +msgstr "переповнення цілого числа у виразі препроцесора" + +#: expr.c:1101 +msgid "missing '(' in expression" +msgstr "відсутня '(' у виразі" + +#: expr.c:1133 +#, c-format +msgid "the left operand of \"%s\" changes sign when promoted" +msgstr "лівий операнд \"%s\" змінює знак при підвищенні" + +#: expr.c:1138 +#, c-format +msgid "the right operand of \"%s\" changes sign when promoted" +msgstr "правий оператор \"%s\" змінює знак при підвищенні" + +#: expr.c:1397 +msgid "traditional C rejects the unary plus operator" +msgstr "у традиційній мові C не допускається унарний оператор плюс" + +#: expr.c:1480 +msgid "comma operator in operand of #if" +msgstr "оператор кома у операнді #if" + +#: expr.c:1612 +msgid "division by zero in #if" +msgstr "ділення на нуль у #if" + +#: files.c:442 +msgid "NULL directory in find_file" +msgstr "значення каталогу NULL у find_file" + +#: files.c:480 +msgid "one or more PCH files were found, but they were invalid" +msgstr "знайдено один або більше файлів PCH, але вони некоректні" + +#: files.c:483 +msgid "use -Winvalid-pch for more information" +msgstr "докладніша інформація виводиться, якщо вказати -Winvalid-pch" + +#: files.c:570 +#, c-format +msgid "%s is a block device" +msgstr "%s є блочним пристроєм" + +#: files.c:587 +#, c-format +msgid "%s is too large" +msgstr "%s надто великий" + +#: files.c:622 +#, c-format +msgid "%s is shorter than expected" +msgstr "%s коротший ніж очікувалося" + +#: files.c:852 +#, c-format +msgid "no include path in which to search for %s" +msgstr "відсутні шлях включення у якому ведеться пошук для %s" + +#: files.c:1157 +msgid "Multiple include guards may be useful for:\n" +msgstr "Декілька include guards можуть бути корисні для:\n" + +#: init.c:426 +msgid "cppchar_t must be an unsigned type" +msgstr "cppchar_t має бути беззнакового типу" + +#: init.c:430 +#, c-format +msgid "preprocessor arithmetic has maximum precision of %lu bits; target requires %lu bits" +msgstr "арифметика препроцесора має максимальну точність %lu біт; ціль вимагає %lu біт" + +#: init.c:437 +msgid "CPP arithmetic must be at least as precise as a target int" +msgstr "арифметика CPP повинна мати принаймні таку ж точність я у цільового цілого числа" + +#: init.c:440 +msgid "target char is less than 8 bits wide" +msgstr "ширина цільового типу char менша за 8 біт" + +#: init.c:444 +msgid "target wchar_t is narrower than target char" +msgstr "цільовий wchar_t є вужчим за цільовий char" + +#: init.c:448 +msgid "target int is narrower than target char" +msgstr "цільовий тип int є вужчим ніж цільовий char" + +#: init.c:453 +msgid "CPP half-integer narrower than CPP character" +msgstr "CPP half-integer є вужчим за CPP character" + +#: init.c:457 +#, c-format +msgid "CPP on this host cannot handle wide character constants over %lu bits, but the target requires %lu bits" +msgstr "CPP на цьому вузлі не може обробляти константи з символів шириною понад %lu біт, але для цілі вимагається %lu біт" + +#: lex.c:283 +msgid "backslash and newline separated by space" +msgstr "зворотна коса риска та символ нового рядка відділяються пробілом" + +#: lex.c:288 +msgid "backslash-newline at end of file" +msgstr "зворотна коса риска та символ нового рядка наприкінці файлу" + +#: lex.c:303 +#, c-format +msgid "trigraph ??%c converted to %c" +msgstr "тристоронній ??%c перетворено на %c" + +#: lex.c:310 +#, c-format +msgid "trigraph ??%c ignored, use -trigraphs to enable" +msgstr "тристоронній ??%c проігноровано, використовуйте -trigraphs, щоб увімкнути" + +#: lex.c:356 +msgid "\"/*\" within comment" +msgstr "\"/*\" всередині коментаря" + +#: lex.c:414 +#, c-format +msgid "%s in preprocessing directive" +msgstr "%s в директиві препроцесора" + +#: lex.c:423 +msgid "null character(s) ignored" +msgstr "null-символи проігноровані" + +#: lex.c:460 +#, c-format +msgid "`%.*s' is not in NFKC" +msgstr "`%.*s' не у NFKC" + +#: lex.c:463 +#, c-format +msgid "`%.*s' is not in NFC" +msgstr "`%.*s' не у NFC" + +#: lex.c:551 +#, c-format +msgid "attempt to use poisoned \"%s\"" +msgstr "спроба використати poisoned \"%s\"" + +#: lex.c:559 +msgid "__VA_ARGS__ can only appear in the expansion of a C99 variadic macro" +msgstr "__VA_ARGS__ може з'являтися лише у розширенні макросу variadic з мови C99" + +#: lex.c:659 +msgid "null character(s) preserved in literal" +msgstr "null-символи збережені буквально" + +#: lex.c:662 +#, c-format +msgid "missing terminating %c character" +msgstr "відсутній завершальний символ %c" + +#: lex.c:1027 +msgid "C++ style comments are not allowed in ISO C90" +msgstr "Коментарі у стилі C++ неприпустимі згідно ISO C90" + +#: lex.c:1029 +msgid "(this will be reported only once per input file)" +msgstr "(повідомлення про це з'явиться лише один для вхідного файлу)" + +#: lex.c:1034 +msgid "multi-line comment" +msgstr "багаторядковий коментар" + +#: lex.c:1347 +#, c-format +msgid "unspellable token %s" +msgstr "неможливо розібрати лексему %s" + +#: line-map.c:320 +#, c-format +msgid "In file included from %s:%u" +msgstr "У файлі включеному з %s:%u" + +#: line-map.c:338 +#, c-format +msgid "" +",\n" +" from %s:%u" +msgstr "" +",\n" +" з %s:%u" + +#: macro.c:84 +#, c-format +msgid "macro \"%s\" is not used" +msgstr "макрос \"%s\" не використовується" + +#: macro.c:123 macro.c:319 +#, c-format +msgid "invalid built-in macro \"%s\"" +msgstr "некоректний вбудований макрос \"%s\"" + +#: macro.c:157 +msgid "could not determine file timestamp" +msgstr "не вдається визначити часову мітку файлу" + +#: macro.c:254 +msgid "could not determine date and time" +msgstr "не вдається визначити дату та час" + +#: macro.c:270 +msgid "__COUNTER__ expanded inside directive with -fdirectives-only" +msgstr "" + +#: macro.c:423 +msgid "invalid string literal, ignoring final '\\'" +msgstr "некоректний символьний літерал, ігнорується завершальний символ '\\'" + +#: macro.c:483 +#, c-format +msgid "pasting \"%s\" and \"%s\" does not give a valid preprocessing token" +msgstr "вставка \"%s\" та \"%s\" не призводить до коректної лексеми препроцесора" + +#: macro.c:558 +msgid "ISO C99 requires rest arguments to be used" +msgstr "ISO C99 вимагає, щоб використовувались решта аргументів" + +#: macro.c:563 +#, c-format +msgid "macro \"%s\" requires %u arguments, but only %u given" +msgstr "для макросу \"%s\" потрібно вказати %u аргументів, але вказано лише %u" + +#: macro.c:568 +#, c-format +msgid "macro \"%s\" passed %u arguments, but takes just %u" +msgstr "макросу \"%s\" передано %u аргументів, але з них використано лише %u" + +#: macro.c:679 traditional.c:680 +#, c-format +msgid "unterminated argument list invoking macro \"%s\"" +msgstr "незавершений список аргументів у виклику макросу \"%s\"" + +#: macro.c:782 +#, c-format +msgid "function-like macro \"%s\" must be used with arguments in traditional C" +msgstr "подібний до функції макрос \"%s\" має використовуватися з аргументами у традиційній мові C" + +#: macro.c:1325 +#, c-format +msgid "duplicate macro parameter \"%s\"" +msgstr "дублікат параметра макросу \"%s\"" + +#: macro.c:1371 +#, c-format +msgid "\"%s\" may not appear in macro parameter list" +msgstr "\"%s\" не може з'являтися у списку параметрів макросу" + +#: macro.c:1379 +msgid "macro parameters must be comma-separated" +msgstr "параметри макросу мають бути розділені комами" + +#: macro.c:1396 +msgid "parameter name missing" +msgstr "відсутня назва параметра" + +#: macro.c:1413 +msgid "anonymous variadic macros were introduced in C99" +msgstr "анонімні макроси variadic започатковані у C99" + +#: macro.c:1418 +msgid "ISO C does not permit named variadic macros" +msgstr "ISO C не припускає іменовані макроси variadic" + +#: macro.c:1427 +msgid "missing ')' in macro parameter list" +msgstr "відсутня ')' у списку параметрів макросу" + +#: macro.c:1476 +msgid "'##' cannot appear at either end of a macro expansion" +msgstr "'##' не може з'являтися з обох кінців макро-розширення" + +#: macro.c:1510 +msgid "ISO C99 requires whitespace after the macro name" +msgstr "у ISO C99 має бути пробіл після назви маросу" + +#: macro.c:1534 +msgid "missing whitespace after the macro name" +msgstr "відсутні пробіл після назви макросу" + +#: macro.c:1564 +msgid "'#' is not followed by a macro parameter" +msgstr "'#' не супроводжується параметром макросу" + +#: macro.c:1683 +#, c-format +msgid "\"%s\" redefined" +msgstr "повторне визначення \"%s\"" + +#: macro.c:1688 +msgid "this is the location of the previous definition" +msgstr "...це місце першого визначення" + +#: macro.c:1738 +#, c-format +msgid "macro argument \"%s\" would be stringified in traditional C" +msgstr "аргумент макросу \"%s\" був би перетворений на рядок у традиційній мові C" + +#: macro.c:1761 +#, c-format +msgid "invalid hash type %d in cpp_macro_definition" +msgstr "некоректний типу хешу %d у cpp_macro_definition" + +#: pch.c:84 pch.c:332 pch.c:344 pch.c:362 pch.c:368 pch.c:377 +msgid "while writing precompiled header" +msgstr "при записі попередньо скомпільованих заголовків" + +#: pch.c:485 +#, c-format +msgid "%s: not used because `%.*s' not defined" +msgstr "%s: не використовується оскільки `%.*s' не визначено" + +#: pch.c:497 +#, c-format +msgid "%s: not used because `%.*s' defined as `%s' not `%.*s'" +msgstr "%s: не використовується, оскільки `%.*s' визначено як `%s' не `%.*s'" + +#: pch.c:538 +#, c-format +msgid "%s: not used because `%s' is defined" +msgstr "%s: не використовується, оскільки визначено `%s'" + +#: pch.c:558 +#, fuzzy, c-format +msgid "%s: not used because `__COUNTER__' is invalid" +msgstr "%s: не використовується, оскільки визначено `%s'" + +#: pch.c:567 pch.c:737 +msgid "while reading precompiled header" +msgstr "при читанні попередньо скомпільованого заголовка" + +#: traditional.c:750 +#, c-format +msgid "detected recursion whilst expanding macro \"%s\"" +msgstr "при розширенні макросу \"%s\" виявлено рекурсію" + +#: traditional.c:917 +msgid "syntax error in macro parameter list" +msgstr "синтаксична помилка у списку параметрів макросу" + +#~ msgid "no newline at end of file" +#~ msgstr "відсутній символ нового рядка наприкінці файлу" diff --git a/libcpp/po/vi.po b/libcpp/po/vi.po new file mode 100644 index 0000000..80b1aff --- /dev/null +++ b/libcpp/po/vi.po @@ -0,0 +1,904 @@ +# Vietnamese translation for CPPlib. +# Copyright © 2007 Free Software Foundation, Inc. +# Clytie Siddall , 2005-2007. +msgid "" +msgstr "" +"Project-Id-Version: cpplib 4.3-b20071109\n" +"Report-Msgid-Bugs-To: http://gcc.gnu.org/bugs.html\n" +"POT-Creation-Date: 2007-11-08 21:08+0000\n" +"PO-Revision-Date: 2007-11-30 23:15+1030\n" +"Last-Translator: Clytie Siddall \n" +"Language-Team: Vietnamese \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0\n" +"X-Generator: LocFactoryEditor 1.7b1\n" + +#: charset.c:654 +#, c-format +msgid "conversion from %s to %s not supported by iconv" +msgstr "iconv không hỗ trợ khả năng chuyển đổi từ %s sang %s" + +#: charset.c:657 +msgid "iconv_open" +msgstr "iconv_open (mở)" + +#: charset.c:665 +#, c-format +msgid "no iconv implementation, cannot convert from %s to %s" +msgstr "chÆ°a thi hành iconv nên không thể chuyển đổi từ %s sang %s" + +#: charset.c:742 +#, c-format +msgid "character 0x%lx is not in the basic source character set\n" +msgstr "ký tá»± 0x%lx không phải nằm trong bộ ký tá»± nguồn cÆ¡ bản\n" + +#: charset.c:759 charset.c:1352 +msgid "converting to execution character set" +msgstr "đang chuyển đổi sang bộ ký tá»± thi hành" + +#: charset.c:765 +#, c-format +msgid "character 0x%lx is not unibyte in execution character set" +msgstr "ký tá»± 0x%lx không có dạng byte đơn trong bộ ký tá»± thi hành" + +#: charset.c:889 +#, c-format +msgid "Character %x might not be NFKC" +msgstr "Ký tá»± %x có lẽ không phải có kiểu NFKC" + +#: charset.c:949 +msgid "universal character names are only valid in C++ and C99" +msgstr "tên ký tá»± chung là hợp lệ chỉ trong ngôn ngữ C++ và C99" + +#: charset.c:952 +#, c-format +msgid "the meaning of '\\%c' is different in traditional C" +msgstr "« \\%c » có nghÄ©a khác trong ngôn ngữ C truyền thống" + +#: charset.c:961 +msgid "In _cpp_valid_ucn but not a UCN" +msgstr "Trong « _cpp_valid_ucn » nhÆ°ng mà không phải lả một UCN" + +#: charset.c:986 +#, c-format +msgid "incomplete universal character name %.*s" +msgstr "tên ký tá»± chung %.*s chÆ°a hoàn thành" + +#: charset.c:998 +#, c-format +msgid "%.*s is not a valid universal character" +msgstr "%.*s không phải là ký tá»± chung hợp lệ" + +#: charset.c:1008 lex.c:484 +msgid "'$' in identifier or number" +msgstr "gặp « $ » trong bộ nhận hiện hay con số" + +#: charset.c:1018 +#, c-format +msgid "universal character %.*s is not valid in an identifier" +msgstr "ký tá»± chung %.*s không phải là hợp lệ trong bộ nhận diện" + +#: charset.c:1022 +#, c-format +msgid "universal character %.*s is not valid at the start of an identifier" +msgstr "ký tá»± chung %.*s không phải hợp lệ tại đầu của bộ nhận diện" + +#: charset.c:1056 charset.c:1571 +msgid "converting UCN to source character set" +msgstr "đang chuyển đổi UCN sang bộ ký tá»± nguồn" + +#: charset.c:1060 +msgid "converting UCN to execution character set" +msgstr "đang chuyển đổi UCN sang bộ ký tá»± thi hành" + +#: charset.c:1132 +msgid "the meaning of '\\x' is different in traditional C" +msgstr "« \\x » có nghÄ©a khác trong ngôn ngữ C truyền thống" + +#: charset.c:1149 +msgid "\\x used with no following hex digits" +msgstr "\\x được dùng còn không có chữ số thâp lục theo sau" + +#: charset.c:1156 +msgid "hex escape sequence out of range" +msgstr "dãy thoát thập lục ở ngoài phạm vi" + +#: charset.c:1195 +msgid "octal escape sequence out of range" +msgstr "dãy thoát bát phân ở ngoài phạm vi" + +#: charset.c:1263 +msgid "the meaning of '\\a' is different in traditional C" +msgstr "« \\a » có nghÄ©a khác trong ngôn ngữ C truyền thống" + +#: charset.c:1270 +#, c-format +msgid "non-ISO-standard escape sequence, '\\%c'" +msgstr "dãy thoát khác ISO chuẩn: « \\%c »" + +#: charset.c:1278 +#, c-format +msgid "unknown escape sequence '\\%c'" +msgstr "không biết dãy thoát: « \\%c »" + +#: charset.c:1286 +#, c-format +msgid "unknown escape sequence: '\\%s'" +msgstr "không biết dãy thoát « \\%s »" + +#: charset.c:1293 +msgid "converting escape sequence to execution character set" +msgstr "đang chuyển đổi dãy thoát sang bộ ký tá»± thi hành" + +#: charset.c:1415 charset.c:1478 +msgid "character constant too long for its type" +msgstr "hằng ký tá»± quá dài cho kiểu nó" + +#: charset.c:1418 +msgid "multi-character character constant" +msgstr "hằng ký tá»± đa ký tá»±" + +#: charset.c:1510 +msgid "empty character constant" +msgstr "hằng ký tá»± trống" + +#: charset.c:1612 +#, c-format +msgid "failure to convert %s to %s" +msgstr "lỗi chuyển đổi %s sang %s" + +#: directives.c:215 directives.c:241 +#, c-format +msgid "extra tokens at end of #%s directive" +msgstr "gặp hiệu bài thêm tại kết thúc của chỉ thị #%s" + +#: directives.c:344 +#, c-format +msgid "#%s is a GCC extension" +msgstr "#%s là phần mở rộng kiểu GCC" + +#: directives.c:356 +msgid "suggest not using #elif in traditional C" +msgstr "khuyên bạn không dùng #elif trong ngôn ngữ C truyền thống" + +#: directives.c:359 +#, c-format +msgid "traditional C ignores #%s with the # indented" +msgstr "ngôn ngữ C truyền thống bỏ qua #%s với # được thụt lề" + +#: directives.c:363 +#, c-format +msgid "suggest hiding #%s from traditional C with an indented #" +msgstr "khuyên bạn ẩn #%s ra ngôn ngữ C truyền thống bằng # được thụt lề" + +#: directives.c:389 +msgid "embedding a directive within macro arguments is not portable" +msgstr "khả năng nhúng chỉ thị vào đối số vÄ© lệnh không thể mạng theo" + +#: directives.c:409 +msgid "style of line directive is a GCC extension" +msgstr "kiểu chỉ thị dòng là phần mở rộng GCC" + +#: directives.c:464 +#, c-format +msgid "invalid preprocessing directive #%s" +msgstr "chỉ thị tiền xá»­ lý không hợp lệ #%s" + +#: directives.c:532 +msgid "\"defined\" cannot be used as a macro name" +msgstr "không thể dùng « defined » (đã xác định) nhÆ° là tên vÄ© lệnh" + +#: directives.c:538 +#, c-format +msgid "\"%s\" cannot be used as a macro name as it is an operator in C++" +msgstr "không thể dùng « %s » nhÆ° là tên vÄ© lệnh vì nó là toán tá»­ trong ngôn ngữ C++" + +#: directives.c:541 +#, c-format +msgid "no macro name given in #%s directive" +msgstr "chỉ thị #%s không chứa tên vÄ© lệnh" + +#: directives.c:544 +msgid "macro names must be identifiers" +msgstr "mọi tên vÄ© lệnh phải là bộ nhận diện" + +#: directives.c:585 +#, c-format +msgid "undefining \"%s\"" +msgstr "đang hủy xác định « %s »" + +#: directives.c:640 +msgid "missing terminating > character" +msgstr "thiếu ký tá»± « > » chấm dứt" + +#: directives.c:695 +#, c-format +msgid "#%s expects \"FILENAME\" or " +msgstr "#%s ngờ \"TÊN_TẬP_TIN\" hoặc " + +#: directives.c:739 +#, c-format +msgid "empty filename in #%s" +msgstr "#%s chứa tên tập tin trống" + +#: directives.c:749 +msgid "#include nested too deeply" +msgstr "« #include » (bao gồm) lồng nhau quá sâu" + +#: directives.c:790 +msgid "#include_next in primary source file" +msgstr "gặp « #include_next » (bao gồm kế tiếp) nằm trong tập tin nguồn chính" + +#: directives.c:816 +#, c-format +msgid "invalid flag \"%s\" in line directive" +msgstr "gặp cờ không hợp lệ « %s » nằm trong chỉ thị dòng" + +#: directives.c:868 +#, c-format +msgid "\"%s\" after #line is not a positive integer" +msgstr "« %s » nằm sau « #line » (dòng) không phải là số nguyên dÆ°Æ¡ng" + +#: directives.c:874 +msgid "line number out of range" +msgstr "số hiệu dòng ở ngoài phạm vi" + +#: directives.c:887 directives.c:964 +#, c-format +msgid "\"%s\" is not a valid filename" +msgstr "« %s » không phải là tên tập tin hợp lệ" + +#: directives.c:924 +#, c-format +msgid "\"%s\" after # is not a positive integer" +msgstr "« %s » nằm sau « # » không phải là số nguyên dÆ°Æ¡ng" + +#: directives.c:1026 +#, c-format +msgid "invalid #%s directive" +msgstr "chỉ thị #%s không hợp lệ" + +#: directives.c:1089 +#, c-format +msgid "registering pragmas in namespace \"%s\" with mismatched name expansion" +msgstr "việc đăng ký các lệnh mã nguồn điều khiển trình biên dịch (pragma) trong miền tên « %s » sai mở rộng tên " + +#: directives.c:1098 +#, c-format +msgid "registering pragma \"%s\" with name expansion and no namespace" +msgstr "việc đăng ký lệnh mã nguồn điều khiển trình biên dịch (pragma) « %s » có mở rộng tên nhÆ°ng không có miền tên" + +#: directives.c:1116 +#, c-format +msgid "registering \"%s\" as both a pragma and a pragma namespace" +msgstr "đang đăng ký « %s » là cả lệnh nguồn điều khiển trình biện dịch (pragma), lẫn miền tên của lệnh nguồn điều khiển trình biên dịch." + +#: directives.c:1119 +#, c-format +msgid "#pragma %s %s is already registered" +msgstr "« #pragma %s %s » đã được đăng ký" + +#: directives.c:1122 +#, c-format +msgid "#pragma %s is already registered" +msgstr "« #pragma %s » đã được đăng ký" + +#: directives.c:1152 +msgid "registering pragma with NULL handler" +msgstr "việc đăng ký lệnh mã nguồn điều khiển trình biên dịch (pragma) có bộ quản lý vô giá trị (NULL)" + +#: directives.c:1362 +msgid "#pragma once in main file" +msgstr "Có « #pragma » một lần trong tập tin chính" + +#: directives.c:1385 +msgid "invalid #pragma GCC poison directive" +msgstr "gặp chỉ thị vộ hiệu hóa (poison) GCC « #pragma » không hợp lệ" + +#: directives.c:1394 +#, c-format +msgid "poisoning existing macro \"%s\"" +msgstr "đang vô hiệu hóa vÄ© lệnh tồn tại « %s »" + +#: directives.c:1413 +msgid "#pragma system_header ignored outside include file" +msgstr "« #pragma system_header » (đầu trang hệ thống) bị bỏ qua ở ngoài tập tin bao gồm" + +#: directives.c:1437 +#, c-format +msgid "cannot find source file %s" +msgstr "không tìm thấy tập tin nguồn %s" + +#: directives.c:1441 +#, c-format +msgid "current file is older than %s" +msgstr "tập tin hiện thời là cÅ© hÆ¡n %s" + +#: directives.c:1620 +msgid "_Pragma takes a parenthesized string literal" +msgstr "« _Pragma » nhận một hằng chuỗi được đặt trong ngoặc đơn" + +#: directives.c:1693 +msgid "#else without #if" +msgstr "#else (nếu không) không có #if (nếu)" + +#: directives.c:1698 +msgid "#else after #else" +msgstr "#else (nếu không) nằm sau #else" + +#: directives.c:1700 directives.c:1733 +msgid "the conditional began here" +msgstr "bộ điều kiện đã bắt đầu ở đây" + +#: directives.c:1726 +msgid "#elif without #if" +msgstr "#elif (nếu không thì nếu) không có #if (nếu)" + +#: directives.c:1731 +msgid "#elif after #else" +msgstr "#elif (nếu không thì nếu) nằm sau #else (nếu không)" + +#: directives.c:1761 +msgid "#endif without #if" +msgstr "#endif (thôi nếu) không có #if (nếu)" + +#: directives.c:1838 +msgid "missing '(' after predicate" +msgstr "thiếu « ( » nằm sau vị ngữ" + +#: directives.c:1853 +msgid "missing ')' to complete answer" +msgstr "thiếu « ) » để xong trả lời" + +#: directives.c:1873 +msgid "predicate's answer is empty" +msgstr "vị ngữ chứa trả lời trống" + +#: directives.c:1900 +msgid "assertion without predicate" +msgstr "sá»± khẳng định không có vị ngữ" + +#: directives.c:1902 +msgid "predicate must be an identifier" +msgstr "vị ngữ phải là bộ nhận diện" + +#: directives.c:1988 +#, c-format +msgid "\"%s\" re-asserted" +msgstr "« %s » được khẳng định lại" + +#: directives.c:2271 +#, c-format +msgid "unterminated #%s" +msgstr "#%s chÆ°a chấm dứt" + +#: directives-only.c:221 lex.c:1016 traditional.c:162 +msgid "unterminated comment" +msgstr "gặp chú thích chÆ°a được chấm dứt" + +#: errors.c:118 +msgid "warning: " +msgstr "cảnh báo : " + +#: errors.c:120 +msgid "internal error: " +msgstr "lỗi nôi bộ : " + +#: errors.c:122 +msgid "error: " +msgstr "lỗi: " + +#: errors.c:186 +msgid "stdout" +msgstr "thiết bị xuất chuẩn" + +#: errors.c:188 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: expr.c:261 +msgid "too many decimal points in number" +msgstr "con số chứa quá nhiều dấu thập phân" + +#: expr.c:290 expr.c:365 +msgid "fixed-point constants are a GCC extension" +msgstr "hằng định điểm là phần mở rộng GCC" + +#: expr.c:303 +#, c-format +msgid "invalid digit \"%c\" in binary constant" +msgstr "gặp chữ số không hợp lệ « %c » trong hằng nhị phân" + +#: expr.c:305 +#, c-format +msgid "invalid digit \"%c\" in octal constant" +msgstr "gặp chữ số không hợp lệ « %c » trong hằng bát phân" + +#: expr.c:313 +msgid "invalid prefix \"0b\" for floating constant" +msgstr "gặp tiền tố không hợp lệ « 0b » cho hằng trôi nổi" + +#: expr.c:319 +msgid "use of C99 hexadecimal floating constant" +msgstr "dùng hằng trôi nổi thập lục C99" + +#: expr.c:328 +msgid "exponent has no digits" +msgstr "số mÅ© không co chữ số nào" + +#: expr.c:335 +msgid "hexadecimal floating constants require an exponent" +msgstr "mỗi hằng trôi nổi thập lục cần đến một số mÅ©" + +#: expr.c:341 +#, c-format +msgid "invalid suffix \"%.*s\" on floating constant" +msgstr "gặp hậu tố không hợp lệ « %.*s » nằm trên hằng trôi nổi" + +#: expr.c:351 expr.c:393 +#, c-format +msgid "traditional C rejects the \"%.*s\" suffix" +msgstr "ngôn ngữ C truyền thống từ chối hậu tố « %.*s »" + +#: expr.c:358 +#, c-format +msgid "invalid suffix \"%.*s\" with hexadecimal floating constant" +msgstr "gặp hậu tố không hợp lệ « %.*s » có hằng trôi nổi thập lục" + +#: expr.c:369 +msgid "decimal float constants are a GCC extension" +msgstr "hằng trôi nổi thập lục là phần mở rộng GCC" + +#: expr.c:379 +#, c-format +msgid "invalid suffix \"%.*s\" on integer constant" +msgstr "gặp hậu tố không hợp lệ « %.*s » nằm trên hằng số nguyên" + +#: expr.c:401 +msgid "use of C99 long long integer constant" +msgstr "dùng hằng số nguyên dài dài C99" + +#: expr.c:409 +msgid "imaginary constants are a GCC extension" +msgstr "hằng ảo là phần mở rộng GCC" + +#: expr.c:412 +msgid "binary constants are a GCC extension" +msgstr "hằng nhị phân là phần mở rộng GCC" + +#: expr.c:505 +msgid "integer constant is too large for its type" +msgstr "hằng số nguyên quá lớn cho kiểu nó" + +#: expr.c:517 +msgid "integer constant is so large that it is unsigned" +msgstr "hằng số nguyên quá lớn thì không có dấu" + +#: expr.c:612 +msgid "missing ')' after \"defined\"" +msgstr "thiếu « ) » nằm sau « defined » (đã xác định)" + +#: expr.c:619 +msgid "operator \"defined\" requires an identifier" +msgstr "toán tá»­ « defined » (đã xác định) cần đến bộ nhận diện" + +#: expr.c:627 +#, c-format +msgid "(\"%s\" is an alternative token for \"%s\" in C++)" +msgstr "(« %s » là một hiệu bài thay thế cho « %s » trong ngôn ngữ C++)" + +#: expr.c:637 +msgid "this use of \"defined\" may not be portable" +msgstr "khả năng dùng « defined » (đã xác định) có lẽ không thể mạng theo" + +#: expr.c:676 +msgid "floating constant in preprocessor expression" +msgstr "gặp hằng trôi nổi nằm trong biểu thức tiền xá»­ lý" + +#: expr.c:682 +msgid "imaginary number in preprocessor expression" +msgstr "gặp số ảo nằm trong biểu thức tiền xá»­ lý" + +#: expr.c:727 +#, c-format +msgid "\"%s\" is not defined" +msgstr "chÆ°a xác định « %s »" + +#: expr.c:855 expr.c:884 +#, c-format +msgid "missing binary operator before token \"%s\"" +msgstr "thiếu toán từ nhị phân nằm trước hiệu bài « %s »" + +#: expr.c:875 +#, c-format +msgid "token \"%s\" is not valid in preprocessor expressions" +msgstr "hiệu bài « %s » không hợp lệ trong biểu thức tiền xá»­ lý" + +#: expr.c:892 +msgid "missing expression between '(' and ')'" +msgstr "thiếu biểu thức nằm giữa « ( » và « ) »" + +#: expr.c:895 +msgid "#if with no expression" +msgstr "#if (nếu) không có biểu thức" + +#: expr.c:898 +#, c-format +msgid "operator '%s' has no right operand" +msgstr "toán tá»­ « %s » không có tác tá»­ bên phải" + +#: expr.c:903 +#, c-format +msgid "operator '%s' has no left operand" +msgstr "toán tá»­ « %s » không có tác từ bên trái" + +#: expr.c:929 +msgid " ':' without preceding '?'" +msgstr " Dấu hai chấm « : » không có dấu hỏi « ? » đi trước" + +#: expr.c:956 +msgid "unbalanced stack in #if" +msgstr "có đống không cân bằng trong #if (nếu)" + +#: expr.c:975 +#, c-format +msgid "impossible operator '%u'" +msgstr "toán từ không thể « %u »" + +#: expr.c:1065 +msgid "missing ')' in expression" +msgstr "thiếu « ) » nằm trong biểu thức" + +#: expr.c:1086 +msgid "'?' without following ':'" +msgstr "Dấu hỏi « ? » không có dấu hai chấm « : » đi sau" + +#: expr.c:1096 +msgid "integer overflow in preprocessor expression" +msgstr "tràn số nguyên trong biểu thức tiền xá»­ lý" + +#: expr.c:1101 +msgid "missing '(' in expression" +msgstr "thiếu « ( » nằm trong biểu thức" + +#: expr.c:1133 +#, c-format +msgid "the left operand of \"%s\" changes sign when promoted" +msgstr "tác tá»­ bên trái của « %s » thay đổi dấu (dÆ°Æ¡ng/âm) khi được tăng cấp" + +#: expr.c:1138 +#, c-format +msgid "the right operand of \"%s\" changes sign when promoted" +msgstr "tác tá»­ bên phai của « %s » thay đổi dấu (dÆ°Æ¡ng/âm) khi đươc tăng cấp" + +#: expr.c:1397 +msgid "traditional C rejects the unary plus operator" +msgstr "ngôn ngữ C truyền thống từ chối toán tá»­ cộng chỉ có một tác tá»­" + +#: expr.c:1480 +msgid "comma operator in operand of #if" +msgstr "toán tá»­ dấu phẩy nằm trong tác tá»­ của #if (nếu)" + +#: expr.c:1612 +msgid "division by zero in #if" +msgstr "chia số không trong #if (nếu)" + +#: files.c:442 +msgid "NULL directory in find_file" +msgstr "thÆ° mục RỖNG trong « find_file » (tìm tập tin)" + +#: files.c:480 +msgid "one or more PCH files were found, but they were invalid" +msgstr "tìm thấy một hay nhiều tập tin PCH, nhÆ°ng chúng không hợp lệ" + +#: files.c:483 +msgid "use -Winvalid-pch for more information" +msgstr "hãy thá»­ lệnh « -Winvalid-pch » để tìm thấy thông tin thêm" + +#: files.c:570 +#, c-format +msgid "%s is a block device" +msgstr "%s là một thiết bị khối" + +#: files.c:587 +#, c-format +msgid "%s is too large" +msgstr "%s quá lớn" + +#: files.c:622 +#, c-format +msgid "%s is shorter than expected" +msgstr "ngờ %s dài hÆ¡n" + +#: files.c:852 +#, c-format +msgid "no include path in which to search for %s" +msgstr "không có đường dẫn bao gồm trong đó có thể tìm kíếm %s" + +#: files.c:1157 +msgid "Multiple include guards may be useful for:\n" +msgstr "Nhiều điều bảo vệ bao gồm có lẽ hiệu ích cho :\n" + +#: init.c:426 +msgid "cppchar_t must be an unsigned type" +msgstr "« cppchar_t » phải là kiểu không có dấu dÆ°Æ¡ng/âm" + +#: init.c:430 +#, c-format +msgid "preprocessor arithmetic has maximum precision of %lu bits; target requires %lu bits" +msgstr "toán thuật của trình tiền xá»­ lý có độ chính xác tối đa là %lu bit còn đích cần đến %lu bit" + +#: init.c:437 +msgid "CPP arithmetic must be at least as precise as a target int" +msgstr "toán thuật CPP phải là ít nhất cùng chính xác với « int » đích" + +#: init.c:440 +msgid "target char is less than 8 bits wide" +msgstr "« char » đích có độ rộng ít hÆ¡n 8 bit" + +#: init.c:444 +msgid "target wchar_t is narrower than target char" +msgstr "« wchar_t » đích có độ rộng ít hÆ¡n « char » đích" + +#: init.c:448 +msgid "target int is narrower than target char" +msgstr "« int » đích có độ rộng ít hÆ¡n « char » đích" + +#: init.c:453 +msgid "CPP half-integer narrower than CPP character" +msgstr "nữa số nguyên CPP có độ rộng ít hÆ¡n ký tá»± CPP" + +#: init.c:457 +#, c-format +msgid "CPP on this host cannot handle wide character constants over %lu bits, but the target requires %lu bits" +msgstr "Trên máy này, CPP không thể xá»­ lý hằng ký tá»± rộng hÆ¡n %lu bit, còn đích cần thiết %lu bit" + +#: lex.c:283 +msgid "backslash and newline separated by space" +msgstr "xuyệc ngược và ký tá»± dòng mới phân cách nhau bởi dấu cách" + +#: lex.c:288 +msgid "backslash-newline at end of file" +msgstr "gặp xuyệc ngược-ký tá»± dòng mới tại kết thúc của tập tin" + +#: lex.c:303 +#, c-format +msgid "trigraph ??%c converted to %c" +msgstr "chữ ba « ??%c » đã được chuyển đổi thành « %c »" + +#: lex.c:310 +#, c-format +msgid "trigraph ??%c ignored, use -trigraphs to enable" +msgstr "chữ ba « ??%c » bị bỏ qua nên hãy sÆ° dụng tùy chon « -trigraphs » (chữ ba) để hiệu lá»±c nó" + +#: lex.c:356 +msgid "\"/*\" within comment" +msgstr "gặp « /* » nằm trong chú thích" + +#: lex.c:414 +#, c-format +msgid "%s in preprocessing directive" +msgstr "gặp %s nằm trong chỉ thị tiền xá»­ lý" + +#: lex.c:423 +msgid "null character(s) ignored" +msgstr "(mọi) ký tá»± rỗng bị bỏ qua" + +#: lex.c:460 +#, c-format +msgid "`%.*s' is not in NFKC" +msgstr "« %.*s » không phải nằm trong NFKC" + +#: lex.c:463 +#, c-format +msgid "`%.*s' is not in NFC" +msgstr "« %.*s » không phải nằm trong NFC" + +#: lex.c:551 +#, c-format +msgid "attempt to use poisoned \"%s\"" +msgstr "đã cố gắng dùng « %s » bị vô hiệu hóa" + +#: lex.c:559 +msgid "__VA_ARGS__ can only appear in the expansion of a C99 variadic macro" +msgstr "« __VA_ARGS__ » chỉ có thể xuất hiện trong sá»± mở rộng của vÄ© lệnh biến thiên C99" + +#: lex.c:659 +msgid "null character(s) preserved in literal" +msgstr "(các) ký tá»± rỗng được giữ lại trong điều nghÄ©a chữ" + +#: lex.c:662 +#, c-format +msgid "missing terminating %c character" +msgstr "thiếu ký tá»± « %c » chấm dứt" + +#: lex.c:1027 +msgid "C++ style comments are not allowed in ISO C90" +msgstr "không cho phép chú thích kiểu C++ nằm trong ISO C90" + +#: lex.c:1029 +msgid "(this will be reported only once per input file)" +msgstr "(điều này sẽ được thông báo chỉ một lần cho mỗi tập tin nhập)" + +#: lex.c:1034 +msgid "multi-line comment" +msgstr "gặp chú thích đa dòng" + +#: lex.c:1347 +#, c-format +msgid "unspellable token %s" +msgstr "gặp hiệu bài không thể chính tả %s" + +#: line-map.c:320 +#, c-format +msgid "In file included from %s:%u" +msgstr "Trong tập tin được bao gồm từ %s:%u" + +#: line-map.c:338 +#, c-format +msgid "" +",\n" +" from %s:%u" +msgstr "" +",\n" +" từ %s:%u" + +#: macro.c:84 +#, c-format +msgid "macro \"%s\" is not used" +msgstr "bộ đối số « %s » không được dùng" + +#: macro.c:123 macro.c:319 +#, c-format +msgid "invalid built-in macro \"%s\"" +msgstr "vÄ© lệnh có sẳn không hợp lệ « %s »" + +#: macro.c:157 +msgid "could not determine file timestamp" +msgstr "không thể quyết định nhãn giờ của tập tin" + +#: macro.c:254 +msgid "could not determine date and time" +msgstr "không thể quyết định ngày và giờ" + +#: macro.c:270 +msgid "__COUNTER__ expanded inside directive with -fdirectives-only" +msgstr "__COUNTER__ đã mở rộng bên trong chỉ thị với « -fdirectives-only »" + +#: macro.c:423 +msgid "invalid string literal, ignoring final '\\'" +msgstr "điều nghÄ©a chữ chuỗi không hợp lệ nên bỏ qua « \\ » cuối cùng" + +#: macro.c:483 +#, c-format +msgid "pasting \"%s\" and \"%s\" does not give a valid preprocessing token" +msgstr "việc dán « %s » và « %s » không đưa ra hiệu bài tiền xá»­ lý hợp lệ" + +#: macro.c:558 +msgid "ISO C99 requires rest arguments to be used" +msgstr "ISO C99 cần đến đối số còn lại trong khối được dùng" + +#: macro.c:563 +#, c-format +msgid "macro \"%s\" requires %u arguments, but only %u given" +msgstr "vÄ© lệnh « %s » cần đến %u đối số, nhÆ°ng chỉ đưa ra %u thôi" + +#: macro.c:568 +#, c-format +msgid "macro \"%s\" passed %u arguments, but takes just %u" +msgstr "vÄ© lệnh « %s » đã gởi %u đối số, nhÆ°ng nhận chỉ %u thôi" + +#: macro.c:679 traditional.c:680 +#, c-format +msgid "unterminated argument list invoking macro \"%s\"" +msgstr "danh sách đối số không được chấm dứt có gọi vÄ© lệnh « %s »" + +#: macro.c:782 +#, c-format +msgid "function-like macro \"%s\" must be used with arguments in traditional C" +msgstr "vÄ© lệnh giống hàm số « %s » phải được dùng với đối số trong ngôn ngữ C truyền thống" + +#: macro.c:1325 +#, c-format +msgid "duplicate macro parameter \"%s\"" +msgstr "tham số vÄ© lệnh trùng « %s »" + +#: macro.c:1371 +#, c-format +msgid "\"%s\" may not appear in macro parameter list" +msgstr "không cho phép « %s » xuất hiện trong danh sách tham số vÄ© lệnh" + +#: macro.c:1379 +msgid "macro parameters must be comma-separated" +msgstr "các tham số bộ đối số phải được ngăn cách bởi dấu phẩy" + +#: macro.c:1396 +msgid "parameter name missing" +msgstr "thiếu tên tham số" + +#: macro.c:1413 +msgid "anonymous variadic macros were introduced in C99" +msgstr "vÄ© lệnh biến thiên vô danh đã được giới thiệu trong C99" + +#: macro.c:1418 +msgid "ISO C does not permit named variadic macros" +msgstr "ISO C không cho phép vÄ© lệnh biến thiên có tên" + +#: macro.c:1427 +msgid "missing ')' in macro parameter list" +msgstr "thiếu « ) » trong danh sách tham số bộ đối số" + +#: macro.c:1476 +msgid "'##' cannot appear at either end of a macro expansion" +msgstr "không cho phép « ## » nằm hoặc trước hoặc sau sá»± mở rộng vÄ© lệnh" + +#: macro.c:1510 +msgid "ISO C99 requires whitespace after the macro name" +msgstr "ISO C99 cần đến khoảng trắng nằm sau tên vÄ© lệnh" + +#: macro.c:1534 +msgid "missing whitespace after the macro name" +msgstr "thiếu khoảng trắng nằm sau tên vÄ© lệnh" + +#: macro.c:1564 +msgid "'#' is not followed by a macro parameter" +msgstr "« # » không có tham số vÄ© lệnh đi theo" + +#: macro.c:1683 +#, c-format +msgid "\"%s\" redefined" +msgstr "« %s » đã được xác định lại" + +#: macro.c:1688 +msgid "this is the location of the previous definition" +msgstr "đây là vị trí của lời xác định trước" + +#: macro.c:1738 +#, c-format +msgid "macro argument \"%s\" would be stringified in traditional C" +msgstr "đối số vÄ© lệnh « %s » nên được chuyển đổi thành chuỗi trong ngôn ngữ C truyền thống" + +#: macro.c:1761 +#, c-format +msgid "invalid hash type %d in cpp_macro_definition" +msgstr "gặp kiểu băm không hợp lệ %d trong « cpp_macro_definition » (lời xác định vÄ© lệnh)" + +#: pch.c:84 pch.c:332 pch.c:344 pch.c:362 pch.c:368 pch.c:377 +msgid "while writing precompiled header" +msgstr "trong khi ghi đầu trang biên dịch sẵn" + +#: pch.c:485 +#, c-format +msgid "%s: not used because `%.*s' not defined" +msgstr "%s: không được dùng vì chÆ°a xác định « %.*s »" + +#: pch.c:497 +#, c-format +msgid "%s: not used because `%.*s' defined as `%s' not `%.*s'" +msgstr "%s: không được dùng vì « %.*s » đã được xác định là « %s » không phải « %.*s »" + +#: pch.c:538 +#, c-format +msgid "%s: not used because `%s' is defined" +msgstr "%s: không được dùng vì « %s » đã được xác định" + +#: pch.c:558 +#, c-format +msgid "%s: not used because `__COUNTER__' is invalid" +msgstr "%s: không được dùng vì « __COUNTER__ » không hợp lệ" + +#: pch.c:567 pch.c:737 +msgid "while reading precompiled header" +msgstr "trong khi đọc đầu trang biên dịch sẵn" + +#: traditional.c:750 +#, c-format +msgid "detected recursion whilst expanding macro \"%s\"" +msgstr "đã phát hiện sá»± đệ qui trong khi mở rộng vÄ© lệnh « %s »" + +#: traditional.c:917 +msgid "syntax error in macro parameter list" +msgstr "gặp lỗi cú pháp trong danh sách tham số vÄ© lệnh" diff --git a/libcpp/po/zh_CN.po b/libcpp/po/zh_CN.po new file mode 100644 index 0000000..6b57691 --- /dev/null +++ b/libcpp/po/zh_CN.po @@ -0,0 +1,907 @@ +# Simplified Chinese translation for cpplib. +# Copyright (C) 2005 Free Software Foundation, Inc. +# This file is distributed under the same license as the cpplib package. +# Meng Jie , 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: cpplib 4.3-b20071109\n" +"Report-Msgid-Bugs-To: http://gcc.gnu.org/bugs.html\n" +"POT-Creation-Date: 2007-11-08 21:08+0000\n" +"PO-Revision-Date: 2007-11-11 17:29+0800\n" +"Last-Translator: Meng Jie \n" +"Language-Team: Chinese (simplified) \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: charset.c:654 +#, c-format +msgid "conversion from %s to %s not supported by iconv" +msgstr "iconv 不支持从 %s 到 %s 的转换" + +#: charset.c:657 +msgid "iconv_open" +msgstr "iconv_open" + +#: charset.c:665 +#, c-format +msgid "no iconv implementation, cannot convert from %s to %s" +msgstr "没有 iconv 的实现,无法从 %s 转换到 %s" + +#: charset.c:742 +#, c-format +msgid "character 0x%lx is not in the basic source character set\n" +msgstr "字符 0x%lx 不在基本源字符集中\n" + +#: charset.c:759 charset.c:1352 +msgid "converting to execution character set" +msgstr "转换到可执行文件的字符集" + +#: charset.c:765 +#, c-format +msgid "character 0x%lx is not unibyte in execution character set" +msgstr "字符 0x%lx 在执行字符集中不是单字节的" + +#: charset.c:889 +#, c-format +msgid "Character %x might not be NFKC" +msgstr "字符 %x 可能不是 NFKC" + +#: charset.c:949 +msgid "universal character names are only valid in C++ and C99" +msgstr "Unicode 字符名只在 C++ 和 C99 中有效" + +#: charset.c:952 +#, c-format +msgid "the meaning of '\\%c' is different in traditional C" +msgstr "‘\\%c’的意义与在传统 C 中不同" + +#: charset.c:961 +msgid "In _cpp_valid_ucn but not a UCN" +msgstr "在 _cpp_valid_ucn 中但不是一个 UCN" + +#: charset.c:986 +#, c-format +msgid "incomplete universal character name %.*s" +msgstr "不完全的 Unicode 字符名 %.*s" + +#: charset.c:998 +#, c-format +msgid "%.*s is not a valid universal character" +msgstr "%.*s 不是一个有效的 Unicode 字符" + +#: charset.c:1008 lex.c:484 +msgid "'$' in identifier or number" +msgstr "‘$’出现在标识符或数字中" + +#: charset.c:1018 +#, c-format +msgid "universal character %.*s is not valid in an identifier" +msgstr "Unicode 字符 %.*s 在标识符中无效" + +#: charset.c:1022 +#, c-format +msgid "universal character %.*s is not valid at the start of an identifier" +msgstr "Unicode 字符 %.*s 在标识符开头无效" + +#: charset.c:1056 charset.c:1571 +msgid "converting UCN to source character set" +msgstr "将 UCN 转换到源字符集" + +#: charset.c:1060 +msgid "converting UCN to execution character set" +msgstr "将 UCN 转换到执行字符集" + +#: charset.c:1132 +msgid "the meaning of '\\x' is different in traditional C" +msgstr "‘\\x’的意义与在传统 C 中不同" + +#: charset.c:1149 +msgid "\\x used with no following hex digits" +msgstr "\\x 后没有 16 进制数字" + +#: charset.c:1156 +msgid "hex escape sequence out of range" +msgstr "16 进制转义序列越界" + +#: charset.c:1195 +msgid "octal escape sequence out of range" +msgstr "8 进制转义序列越界" + +#: charset.c:1263 +msgid "the meaning of '\\a' is different in traditional C" +msgstr "‘\\a’的意义与在传统 C 中不同" + +#: charset.c:1270 +#, c-format +msgid "non-ISO-standard escape sequence, '\\%c'" +msgstr "非 ISO 标准的转义序列,‘\\%c’" + +#: charset.c:1278 +#, c-format +msgid "unknown escape sequence '\\%c'" +msgstr "未知的转义序列:‘\\%c’" + +#: charset.c:1286 +#, c-format +msgid "unknown escape sequence: '\\%s'" +msgstr "未知的转义序列:‘\\%s’" + +#: charset.c:1293 +msgid "converting escape sequence to execution character set" +msgstr "将转义序列转换到执行字符集" + +#: charset.c:1415 charset.c:1478 +msgid "character constant too long for its type" +msgstr "字符常量大小超出其类型" + +#: charset.c:1418 +msgid "multi-character character constant" +msgstr "多字节字符常量" + +#: charset.c:1510 +msgid "empty character constant" +msgstr "空的字符常量" + +#: charset.c:1612 +#, c-format +msgid "failure to convert %s to %s" +msgstr "无法从 %s 转换到 %s" + +#: directives.c:215 directives.c:241 +#, c-format +msgid "extra tokens at end of #%s directive" +msgstr "#%s 指示的末尾有多余的标识符" + +#: directives.c:344 +#, c-format +msgid "#%s is a GCC extension" +msgstr "#%s 是一个 GCC 扩展" + +#: directives.c:356 +msgid "suggest not using #elif in traditional C" +msgstr "建议在传统 C 中不使用 #elif" + +#: directives.c:359 +#, c-format +msgid "traditional C ignores #%s with the # indented" +msgstr "当 # 有缩进时传统 C 忽略 #%s" + +#: directives.c:363 +#, c-format +msgid "suggest hiding #%s from traditional C with an indented #" +msgstr "建议使用缩进的 # 以让 #%s 对传统 C 不可见" + +#: directives.c:389 +msgid "embedding a directive within macro arguments is not portable" +msgstr "将一个指示嵌入宏参数中是不可移植的" + +#: directives.c:409 +msgid "style of line directive is a GCC extension" +msgstr "line 指示的风格是一个 GCC 扩展" + +#: directives.c:464 +#, c-format +msgid "invalid preprocessing directive #%s" +msgstr "无效的预处理指示 #%s" + +#: directives.c:532 +msgid "\"defined\" cannot be used as a macro name" +msgstr "“defined”不能被用作宏名" + +#: directives.c:538 +#, c-format +msgid "\"%s\" cannot be used as a macro name as it is an operator in C++" +msgstr "“%s”不能被用作宏名,因为它是 C++ 中的一个操作符" + +#: directives.c:541 +#, c-format +msgid "no macro name given in #%s directive" +msgstr "#%s 指示中未给出宏名" + +#: directives.c:544 +msgid "macro names must be identifiers" +msgstr "宏名必须是标识符" + +#: directives.c:585 +#, c-format +msgid "undefining \"%s\"" +msgstr "取消对“%s”的定义" + +#: directives.c:640 +msgid "missing terminating > character" +msgstr "缺少结尾的 > 字符" + +#: directives.c:695 +#, c-format +msgid "#%s expects \"FILENAME\" or " +msgstr "#%s 需要 \"FILENAME\" 或 " + +#: directives.c:739 +#, c-format +msgid "empty filename in #%s" +msgstr "#%s 中文件名为空" + +#: directives.c:749 +msgid "#include nested too deeply" +msgstr "#include 嵌套过深" + +#: directives.c:790 +msgid "#include_next in primary source file" +msgstr "#include_next 出现在主源文件中" + +#: directives.c:816 +#, c-format +msgid "invalid flag \"%s\" in line directive" +msgstr "line 指示中有无效的标记“%s”" + +#: directives.c:868 +#, c-format +msgid "\"%s\" after #line is not a positive integer" +msgstr "#line 后的“%s”不是一个正整数" + +#: directives.c:874 +msgid "line number out of range" +msgstr "行号超出范围" + +#: directives.c:887 directives.c:964 +#, c-format +msgid "\"%s\" is not a valid filename" +msgstr "“%s”不是一个有效的文件名" + +#: directives.c:924 +#, c-format +msgid "\"%s\" after # is not a positive integer" +msgstr "# 后的“%s”不是一个正整数" + +#: directives.c:1026 +#, c-format +msgid "invalid #%s directive" +msgstr "无效的 #%s 指示" + +#: directives.c:1089 +#, c-format +msgid "registering pragmas in namespace \"%s\" with mismatched name expansion" +msgstr "在命名空间“%s”中注册 pragma 时名称扩展不匹配" + +#: directives.c:1098 +#, c-format +msgid "registering pragma \"%s\" with name expansion and no namespace" +msgstr "pragma “%s”被注册为一个命名扩展,而没有命名空间" + +#: directives.c:1116 +#, c-format +msgid "registering \"%s\" as both a pragma and a pragma namespace" +msgstr "“%s”既被注册为一个pragma 又被注册为一个 pragma 命名空间" + +#: directives.c:1119 +#, c-format +msgid "#pragma %s %s is already registered" +msgstr "#pragma %s %s 已经被注册" + +#: directives.c:1122 +#, c-format +msgid "#pragma %s is already registered" +msgstr "#pragma %s 已经被注册" + +#: directives.c:1152 +msgid "registering pragma with NULL handler" +msgstr "pragma 注册为被 NULL 处理" + +#: directives.c:1362 +msgid "#pragma once in main file" +msgstr "#pragma once 出现在主文件中" + +#: directives.c:1385 +msgid "invalid #pragma GCC poison directive" +msgstr "无效的 #pragma GCC poison 指示" + +#: directives.c:1394 +#, c-format +msgid "poisoning existing macro \"%s\"" +msgstr "对已存在的宏“%s”投毒" + +#: directives.c:1413 +msgid "#pragma system_header ignored outside include file" +msgstr "#pragma system_heade 在包含文件外被忽略" + +#: directives.c:1437 +#, c-format +msgid "cannot find source file %s" +msgstr "找不到源文件 %s" + +#: directives.c:1441 +#, c-format +msgid "current file is older than %s" +msgstr "当前文件早于 %s" + +#: directives.c:1620 +msgid "_Pragma takes a parenthesized string literal" +msgstr "_Pragma 需要一个括起的字符串字面常量" + +#: directives.c:1693 +msgid "#else without #if" +msgstr "#else 没有匹配的 #if" + +#: directives.c:1698 +msgid "#else after #else" +msgstr "#else 出现在 #else 后" + +#: directives.c:1700 directives.c:1733 +msgid "the conditional began here" +msgstr "条件自此开始" + +#: directives.c:1726 +msgid "#elif without #if" +msgstr "#elif 没有匹配的 #if" + +#: directives.c:1731 +msgid "#elif after #else" +msgstr "#elif 出现在 #else 后" + +#: directives.c:1761 +msgid "#endif without #if" +msgstr "#endif 没有匹配的 #if" + +#: directives.c:1838 +msgid "missing '(' after predicate" +msgstr "谓词后缺少‘(’" + +#: directives.c:1853 +msgid "missing ')' to complete answer" +msgstr "完整的答案缺少‘)’" + +#: directives.c:1873 +msgid "predicate's answer is empty" +msgstr "谓词的答案为空" + +#: directives.c:1900 +msgid "assertion without predicate" +msgstr "断言后没有谓词" + +#: directives.c:1902 +msgid "predicate must be an identifier" +msgstr "谓词必须是一个标识符" + +#: directives.c:1988 +#, c-format +msgid "\"%s\" re-asserted" +msgstr "重断言“%s”" + +#: directives.c:2271 +#, c-format +msgid "unterminated #%s" +msgstr "未终止的 #%s" + +#: directives-only.c:221 lex.c:1016 traditional.c:162 +msgid "unterminated comment" +msgstr "未结束的注释" + +#: errors.c:118 +msgid "warning: " +msgstr "警告:" + +#: errors.c:120 +msgid "internal error: " +msgstr "内部错误:" + +#: errors.c:122 +msgid "error: " +msgstr "错误:" + +#: errors.c:186 +msgid "stdout" +msgstr "stdout" + +#: errors.c:188 +#, c-format +msgid "%s: %s" +msgstr "%s:%s" + +#: expr.c:261 +msgid "too many decimal points in number" +msgstr "数字中有太多小数点" + +#: expr.c:290 expr.c:365 +msgid "fixed-point constants are a GCC extension" +msgstr "定点常量是一个 GCC 扩展" + +#: expr.c:303 +#, c-format +msgid "invalid digit \"%c\" in binary constant" +msgstr "二进制常量中有无效数字“%c”" + +#: expr.c:305 +#, c-format +msgid "invalid digit \"%c\" in octal constant" +msgstr "8 进制常量中有非法字符“%c”" + +#: expr.c:313 +msgid "invalid prefix \"0b\" for floating constant" +msgstr "浮点常量的“0b”前缀无效" + +#: expr.c:319 +msgid "use of C99 hexadecimal floating constant" +msgstr "使用 C99 式的 16 进制浮点常量" + +#: expr.c:328 +msgid "exponent has no digits" +msgstr "指数部分没有数字" + +#: expr.c:335 +msgid "hexadecimal floating constants require an exponent" +msgstr "16 进制浮点常量需要指数部分" + +#: expr.c:341 +#, c-format +msgid "invalid suffix \"%.*s\" on floating constant" +msgstr "浮点常量的“%.*s”后缀无效" + +#: expr.c:351 expr.c:393 +#, c-format +msgid "traditional C rejects the \"%.*s\" suffix" +msgstr "传统 C 不接受“%.*s”后缀" + +#: expr.c:358 +#, c-format +msgid "invalid suffix \"%.*s\" with hexadecimal floating constant" +msgstr "十六进制浮点常量的“%.*s”后缀无效" + +#: expr.c:369 +msgid "decimal float constants are a GCC extension" +msgstr "十进制浮点常量是一个 GCC 扩展" + +#: expr.c:379 +#, c-format +msgid "invalid suffix \"%.*s\" on integer constant" +msgstr "整数常量的“%.*s”后缀无效" + +#: expr.c:401 +msgid "use of C99 long long integer constant" +msgstr "使用 C99 long long 整数常量" + +#: expr.c:409 +msgid "imaginary constants are a GCC extension" +msgstr "虚数常量是一个 GCC 扩展" + +#: expr.c:412 +msgid "binary constants are a GCC extension" +msgstr "二进制常量是一个 GCC 扩展" + +#: expr.c:505 +msgid "integer constant is too large for its type" +msgstr "整数常量值超出其类型" + +#: expr.c:517 +msgid "integer constant is so large that it is unsigned" +msgstr "整数常量太大,认定为 unsigned" + +#: expr.c:612 +msgid "missing ')' after \"defined\"" +msgstr "“defined” 后出现‘)’" + +#: expr.c:619 +msgid "operator \"defined\" requires an identifier" +msgstr "操作符“defined”需要一个标识符" + +#: expr.c:627 +#, c-format +msgid "(\"%s\" is an alternative token for \"%s\" in C++)" +msgstr "(在 C++ 中“%s”会是“%s”的替代标识符)" + +#: expr.c:637 +msgid "this use of \"defined\" may not be portable" +msgstr "使用“defined”可能不利于移植" + +#: expr.c:676 +msgid "floating constant in preprocessor expression" +msgstr "浮点常量出现在预处理表达式中" + +#: expr.c:682 +msgid "imaginary number in preprocessor expression" +msgstr "预处理表达式中出现虚数" + +#: expr.c:727 +#, c-format +msgid "\"%s\" is not defined" +msgstr "“%s”未定义" + +#: expr.c:855 expr.c:884 +#, c-format +msgid "missing binary operator before token \"%s\"" +msgstr "标识符“%s”前缺少二元运算符" + +#: expr.c:875 +#, c-format +msgid "token \"%s\" is not valid in preprocessor expressions" +msgstr "标识符“%s”在预处理表达式中无效" + +#: expr.c:892 +msgid "missing expression between '(' and ')'" +msgstr "‘(’与‘)’之间缺少表达式" + +#: expr.c:895 +msgid "#if with no expression" +msgstr "#if 后没有表达式" + +#: expr.c:898 +#, c-format +msgid "operator '%s' has no right operand" +msgstr "操作符‘%s’没有右操作数" + +#: expr.c:903 +#, c-format +msgid "operator '%s' has no left operand" +msgstr "操作符‘%s’没有左操作数" + +#: expr.c:929 +msgid " ':' without preceding '?'" +msgstr "‘:’前没有‘?’" + +#: expr.c:956 +msgid "unbalanced stack in #if" +msgstr "#if 中不平衡的堆栈" + +#: expr.c:975 +#, c-format +msgid "impossible operator '%u'" +msgstr "不可能的操作‘%u’" + +#: expr.c:1065 +msgid "missing ')' in expression" +msgstr "表达式中缺少‘)’" + +#: expr.c:1086 +msgid "'?' without following ':'" +msgstr "‘?’后没有‘:’" + +#: expr.c:1096 +msgid "integer overflow in preprocessor expression" +msgstr "预处理表达式中整数溢出" + +#: expr.c:1101 +msgid "missing '(' in expression" +msgstr "表达式中缺少‘(’" + +#: expr.c:1133 +#, c-format +msgid "the left operand of \"%s\" changes sign when promoted" +msgstr "“%s”的左操作数在提升时变换了符号" + +#: expr.c:1138 +#, c-format +msgid "the right operand of \"%s\" changes sign when promoted" +msgstr "“%s”的右操作数在提升时变换了符号" + +#: expr.c:1397 +msgid "traditional C rejects the unary plus operator" +msgstr "传统 C 不接受单目 + 运算符" + +#: expr.c:1480 +msgid "comma operator in operand of #if" +msgstr "#if 操作数中出现逗号" + +#: expr.c:1612 +msgid "division by zero in #if" +msgstr "#if 中用零做除数" + +#: files.c:442 +msgid "NULL directory in find_file" +msgstr "find_file 中有 NULL 目录" + +#: files.c:480 +msgid "one or more PCH files were found, but they were invalid" +msgstr "找到一个或多个 PCH 文件,但它们是无效的" + +#: files.c:483 +msgid "use -Winvalid-pch for more information" +msgstr "使用 -Winvalid-pch 以获得更多信息" + +#: files.c:570 +#, c-format +msgid "%s is a block device" +msgstr "%s 是一个块设备" + +#: files.c:587 +#, c-format +msgid "%s is too large" +msgstr "%s 过大" + +#: files.c:622 +#, c-format +msgid "%s is shorter than expected" +msgstr "%s 短于预期" + +#: files.c:852 +#, c-format +msgid "no include path in which to search for %s" +msgstr "没有包含路径可供搜索 %s" + +#: files.c:1157 +msgid "Multiple include guards may be useful for:\n" +msgstr "多个防止重包含可能对其有用:\n" + +#: init.c:426 +msgid "cppchar_t must be an unsigned type" +msgstr "cppchar_t 必须是无符号型" + +#: init.c:430 +#, c-format +msgid "preprocessor arithmetic has maximum precision of %lu bits; target requires %lu bits" +msgstr "预处理算术的最高精度为 %lu 位;目标需要 %lu 位" + +#: init.c:437 +msgid "CPP arithmetic must be at least as precise as a target int" +msgstr "CPP 算术必须至少具有目标 int 的精度" + +#: init.c:440 +msgid "target char is less than 8 bits wide" +msgstr "目标 char 短于 8 位" + +#: init.c:444 +msgid "target wchar_t is narrower than target char" +msgstr "目录 wchar_t 短于目标 char" + +#: init.c:448 +msgid "target int is narrower than target char" +msgstr "目标 int 短于目标 char" + +#: init.c:453 +msgid "CPP half-integer narrower than CPP character" +msgstr "CPP 半整数短于 CPP 字符" + +#: init.c:457 +#, c-format +msgid "CPP on this host cannot handle wide character constants over %lu bits, but the target requires %lu bits" +msgstr "在此宿主机上,CPP 不能处理长于 %lu 位的宽字符常量,但目标需要 %lu 位" + +#: lex.c:283 +msgid "backslash and newline separated by space" +msgstr "反斜杠和换行为空格所分隔" + +#: lex.c:288 +msgid "backslash-newline at end of file" +msgstr "反斜杠续行出现在文件末尾" + +#: lex.c:303 +#, c-format +msgid "trigraph ??%c converted to %c" +msgstr "三元符 ??%c 转换为 %c" + +#: lex.c:310 +#, c-format +msgid "trigraph ??%c ignored, use -trigraphs to enable" +msgstr "三元符 ??%c 被忽略,请使用 -trigraphs 来启用" + +#: lex.c:356 +msgid "\"/*\" within comment" +msgstr "“/*”出现在注释中" + +#: lex.c:414 +#, c-format +msgid "%s in preprocessing directive" +msgstr "预处理指示中出现 %s" + +#: lex.c:423 +msgid "null character(s) ignored" +msgstr "忽略空字符" + +#: lex.c:460 +#, c-format +msgid "`%.*s' is not in NFKC" +msgstr "‘%.*s’不在 NFKC 中" + +#: lex.c:463 +#, c-format +msgid "`%.*s' is not in NFC" +msgstr "‘%.*s’不在 NFC 中" + +#: lex.c:551 +#, c-format +msgid "attempt to use poisoned \"%s\"" +msgstr "试图使用有毒的“%s”" + +#: lex.c:559 +msgid "__VA_ARGS__ can only appear in the expansion of a C99 variadic macro" +msgstr "__VA_ARGS__ 只能出现在 C99 可变参数宏的展开中" + +#: lex.c:659 +msgid "null character(s) preserved in literal" +msgstr "空字符将保留在字面字符串中" + +#: lex.c:662 +#, c-format +msgid "missing terminating %c character" +msgstr "缺少结尾的 %c 字符" + +#: lex.c:1027 +msgid "C++ style comments are not allowed in ISO C90" +msgstr "C++ 风格的注释在 ISO C90 中不被允许" + +#: lex.c:1029 +msgid "(this will be reported only once per input file)" +msgstr "(此警告为每个输入文件只报告一次)" + +#: lex.c:1034 +msgid "multi-line comment" +msgstr "多行注释" + +#: lex.c:1347 +#, c-format +msgid "unspellable token %s" +msgstr "无法拼出的标识符 %s" + +#: line-map.c:320 +#, c-format +msgid "In file included from %s:%u" +msgstr "在包含自 %s:%u 的文件中" + +#: line-map.c:338 +#, c-format +msgid "" +",\n" +" from %s:%u" +msgstr "" +",\n" +" 从 %s:%u" + +#: macro.c:84 +#, c-format +msgid "macro \"%s\" is not used" +msgstr "宏“%s”未被使用" + +#: macro.c:123 macro.c:319 +#, c-format +msgid "invalid built-in macro \"%s\"" +msgstr "无效的内建宏“%s”" + +#: macro.c:157 +msgid "could not determine file timestamp" +msgstr "无法决定文件的时间戳" + +#: macro.c:254 +msgid "could not determine date and time" +msgstr "无法决定日期与时间" + +#: macro.c:270 +msgid "__COUNTER__ expanded inside directive with -fdirectives-only" +msgstr "带 -fdirectives-only 时 __COUNTER__ 在指示中扩展" + +#: macro.c:423 +msgid "invalid string literal, ignoring final '\\'" +msgstr "无效的字面字符串,忽略最后的‘\\’" + +#: macro.c:483 +#, c-format +msgid "pasting \"%s\" and \"%s\" does not give a valid preprocessing token" +msgstr "毗连“%s”和“%s”不能给出一个有效的预处理标识符" + +#: macro.c:558 +msgid "ISO C99 requires rest arguments to be used" +msgstr "ISO C99 需要使用剩余的参数" + +#: macro.c:563 +#, c-format +msgid "macro \"%s\" requires %u arguments, but only %u given" +msgstr "宏“%s”需要 %u 个参数,但只给出了 %u 个" + +#: macro.c:568 +#, c-format +msgid "macro \"%s\" passed %u arguments, but takes just %u" +msgstr "宏“%s”传递了 %u 个参数,但只需要 %u 个" + +#: macro.c:679 traditional.c:680 +#, c-format +msgid "unterminated argument list invoking macro \"%s\"" +msgstr "调用宏“%s”时参数列表未终止" + +#: macro.c:782 +#, c-format +msgid "function-like macro \"%s\" must be used with arguments in traditional C" +msgstr "类似函数的宏“%s”在传统 C 中必须与参数一起使用" + +#: macro.c:1325 +#, c-format +msgid "duplicate macro parameter \"%s\"" +msgstr "重复的宏参数“%s”" + +#: macro.c:1371 +#, c-format +msgid "\"%s\" may not appear in macro parameter list" +msgstr "“%s”不能出现在宏参数列表中" + +#: macro.c:1379 +msgid "macro parameters must be comma-separated" +msgstr "宏参数必须由逗号隔开" + +#: macro.c:1396 +msgid "parameter name missing" +msgstr "缺少形参名" + +#: macro.c:1413 +msgid "anonymous variadic macros were introduced in C99" +msgstr "匿名可变参数宏在 C99 中被引入" + +#: macro.c:1418 +msgid "ISO C does not permit named variadic macros" +msgstr "ISO C 不允许有名的可变参数宏" + +#: macro.c:1427 +msgid "missing ')' in macro parameter list" +msgstr "在宏参数表中缺少‘)’" + +#: macro.c:1476 +msgid "'##' cannot appear at either end of a macro expansion" +msgstr "‘##’不能出现在宏展开的两端" + +#: macro.c:1510 +msgid "ISO C99 requires whitespace after the macro name" +msgstr "ISO C99 要求宏名后必须有空白" + +#: macro.c:1534 +msgid "missing whitespace after the macro name" +msgstr "宏名后缺少空白" + +#: macro.c:1564 +msgid "'#' is not followed by a macro parameter" +msgstr "‘#’后没有宏参数" + +#: macro.c:1683 +#, c-format +msgid "\"%s\" redefined" +msgstr "“%s”重定义" + +#: macro.c:1688 +msgid "this is the location of the previous definition" +msgstr "这是先前定义的位置" + +#: macro.c:1738 +#, c-format +msgid "macro argument \"%s\" would be stringified in traditional C" +msgstr "宏参数“%s”将在传统 C 中被字符串化" + +#: macro.c:1761 +#, c-format +msgid "invalid hash type %d in cpp_macro_definition" +msgstr "cpp_macro_definition 中有无效的散列类型 %d" + +#: pch.c:84 pch.c:332 pch.c:344 pch.c:362 pch.c:368 pch.c:377 +msgid "while writing precompiled header" +msgstr "在写入预编译头时" + +#: pch.c:485 +#, c-format +msgid "%s: not used because `%.*s' not defined" +msgstr "%s:未使用因为‘%.*s’未定义" + +#: pch.c:497 +#, c-format +msgid "%s: not used because `%.*s' defined as `%s' not `%.*s'" +msgstr "%s:未使用因为‘%.*s’被定义为‘%s’而非‘%*.s’" + +#: pch.c:538 +#, c-format +msgid "%s: not used because `%s' is defined" +msgstr "%s:未使用因为‘%s’已定义" + +#: pch.c:558 +#, c-format +msgid "%s: not used because `__COUNTER__' is invalid" +msgstr "%s:未使用因为‘__COUNTER__’无效" + +#: pch.c:567 pch.c:737 +msgid "while reading precompiled header" +msgstr "在读取预编译头时" + +#: traditional.c:750 +#, c-format +msgid "detected recursion whilst expanding macro \"%s\"" +msgstr "展开宏“%s”时检测到递归" + +#: traditional.c:917 +msgid "syntax error in macro parameter list" +msgstr "宏参数列表语法错误" + +#~ msgid "no newline at end of file" +#~ msgstr "文件未以空白行结束" diff --git a/libcpp/po/zh_TW.po b/libcpp/po/zh_TW.po new file mode 100644 index 0000000..0747f55 --- /dev/null +++ b/libcpp/po/zh_TW.po @@ -0,0 +1,914 @@ +# Traditional Chinese translation for cpplib. +# Copyright (C) 2005 Free Software Foundation, Inc. +# This file is distributed under the same license as the cpplib package. +# Meng Jie , 2005. +# Wei-Lun Chao , 2006. +# +msgid "" +msgstr "" +"Project-Id-Version: cpplib 4.1.0\n" +"Report-Msgid-Bugs-To: http://gcc.gnu.org/bugs.html\n" +"POT-Creation-Date: 2007-11-08 21:08+0000\n" +"PO-Revision-Date: 2006-03-09 12:37+0800\n" +"Last-Translator: Wei-Lun Chao \n" +"Language-Team: Chinese (traditional) \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: charset.c:654 +#, c-format +msgid "conversion from %s to %s not supported by iconv" +msgstr "iconv 不支援從 %s 到 %s 的轉換" + +#: charset.c:657 +msgid "iconv_open" +msgstr "iconv_open" + +#: charset.c:665 +#, c-format +msgid "no iconv implementation, cannot convert from %s to %s" +msgstr "沒有實作 iconv,無法從 %s 轉換到 %s" + +#: charset.c:742 +#, c-format +msgid "character 0x%lx is not in the basic source character set\n" +msgstr "字元 0x%lx 不在基本來源字元集中\n" + +#: charset.c:759 charset.c:1352 +msgid "converting to execution character set" +msgstr "轉換到可執行檔案的字元集" + +#: charset.c:765 +#, c-format +msgid "character 0x%lx is not unibyte in execution character set" +msgstr "字元 0x%lx 在執行字元集中不是單位元組的" + +#: charset.c:889 +#, c-format +msgid "Character %x might not be NFKC" +msgstr "字元 %x 可能不是 NFKC" + +#: charset.c:949 +msgid "universal character names are only valid in C++ and C99" +msgstr "萬國碼字元名稱只在 C++ 和 C99 中有效" + +#: charset.c:952 +#, c-format +msgid "the meaning of '\\%c' is different in traditional C" +msgstr "「\\%c」的意義與在傳統 C 中不同" + +#: charset.c:961 +msgid "In _cpp_valid_ucn but not a UCN" +msgstr "在 _cpp_valid_ucn 中並不是一個 UCN" + +#: charset.c:986 +#, c-format +msgid "incomplete universal character name %.*s" +msgstr "不完整的萬國碼字元名稱 %.*s" + +#: charset.c:998 +#, c-format +msgid "%.*s is not a valid universal character" +msgstr "%.*s 不是一個有效的萬國碼字元" + +#: charset.c:1008 lex.c:484 +msgid "'$' in identifier or number" +msgstr "「$」出現在識別字或數字中" + +#: charset.c:1018 +#, c-format +msgid "universal character %.*s is not valid in an identifier" +msgstr "萬國碼字元 %.*s 在識別字中無效" + +#: charset.c:1022 +#, c-format +msgid "universal character %.*s is not valid at the start of an identifier" +msgstr "萬國碼字元 %.*s 在識別字開頭無效" + +#: charset.c:1056 charset.c:1571 +msgid "converting UCN to source character set" +msgstr "將 UCN 轉換到來源字元集" + +#: charset.c:1060 +msgid "converting UCN to execution character set" +msgstr "將 UCN 轉換到執行字元集" + +#: charset.c:1132 +msgid "the meaning of '\\x' is different in traditional C" +msgstr "「\\x」的意義與在傳統 C 中不同" + +#: charset.c:1149 +msgid "\\x used with no following hex digits" +msgstr "\\x 後沒有十六進位數字" + +#: charset.c:1156 +msgid "hex escape sequence out of range" +msgstr "十六進位逸出序列越界" + +#: charset.c:1195 +msgid "octal escape sequence out of range" +msgstr "八進位逸出序列越界" + +#: charset.c:1263 +msgid "the meaning of '\\a' is different in traditional C" +msgstr "「\\a」的意義與在傳統 C 中不同" + +#: charset.c:1270 +#, c-format +msgid "non-ISO-standard escape sequence, '\\%c'" +msgstr "非 ISO 標準的逸出序列,「\\%c」" + +#: charset.c:1278 +#, c-format +msgid "unknown escape sequence '\\%c'" +msgstr "不明的逸出序列:「\\%c」" + +#: charset.c:1286 +#, c-format +msgid "unknown escape sequence: '\\%s'" +msgstr "不明的逸出序列:「\\%s」" + +#: charset.c:1293 +msgid "converting escape sequence to execution character set" +msgstr "將逸出序列轉換到執行字元集" + +#: charset.c:1415 charset.c:1478 +msgid "character constant too long for its type" +msgstr "字元常數大小超出其類型" + +#: charset.c:1418 +msgid "multi-character character constant" +msgstr "多位元組字元常數" + +#: charset.c:1510 +msgid "empty character constant" +msgstr "空的字元常數" + +#: charset.c:1612 +#, c-format +msgid "failure to convert %s to %s" +msgstr "無法從 %s 轉換到 %s" + +#: directives.c:215 directives.c:241 +#, c-format +msgid "extra tokens at end of #%s directive" +msgstr "#%s 指令的末尾有多餘的符記" + +#: directives.c:344 +#, c-format +msgid "#%s is a GCC extension" +msgstr "#%s 是 GCC 擴充功能" + +#: directives.c:356 +msgid "suggest not using #elif in traditional C" +msgstr "建議在傳統 C 中不要使用 #elif" + +#: directives.c:359 +#, c-format +msgid "traditional C ignores #%s with the # indented" +msgstr "當 # 有縮排時傳統 C 忽略 #%s" + +#: directives.c:363 +#, c-format +msgid "suggest hiding #%s from traditional C with an indented #" +msgstr "建議使用縮排的 # 以讓 #%s 對傳統 C 不可見" + +#: directives.c:389 +msgid "embedding a directive within macro arguments is not portable" +msgstr "將一個指令內嵌於巨集參數中是不可移植的" + +#: directives.c:409 +msgid "style of line directive is a GCC extension" +msgstr "line 指令的風格是 GCC 擴充功能" + +#: directives.c:464 +#, c-format +msgid "invalid preprocessing directive #%s" +msgstr "無效的預先處理指令 #%s" + +#: directives.c:532 +msgid "\"defined\" cannot be used as a macro name" +msgstr "「defined」不能做為巨集名" + +#: directives.c:538 +#, c-format +msgid "\"%s\" cannot be used as a macro name as it is an operator in C++" +msgstr "「%s」不能做為巨集名,因為它是 C++ 中的一個運算子" + +#: directives.c:541 +#, c-format +msgid "no macro name given in #%s directive" +msgstr "#%s 指令中未給出巨集名" + +#: directives.c:544 +msgid "macro names must be identifiers" +msgstr "巨集名必須是識別字" + +#: directives.c:585 +#, c-format +msgid "undefining \"%s\"" +msgstr "取消對「%s」的定義" + +#: directives.c:640 +msgid "missing terminating > character" +msgstr "缺少結尾的 > 字元" + +#: directives.c:695 +#, c-format +msgid "#%s expects \"FILENAME\" or " +msgstr "#%s 需要 \"FILENAME\" 或 " + +#: directives.c:739 +#, c-format +msgid "empty filename in #%s" +msgstr "#%s 中檔案名稱為空" + +#: directives.c:749 +msgid "#include nested too deeply" +msgstr "#include 巢狀過深" + +#: directives.c:790 +msgid "#include_next in primary source file" +msgstr "#include_next 出現在主來源檔案中" + +#: directives.c:816 +#, c-format +msgid "invalid flag \"%s\" in line directive" +msgstr "line 指令中有無效的標記「%s」" + +#: directives.c:868 +#, c-format +msgid "\"%s\" after #line is not a positive integer" +msgstr "#line 後的「%s」不是一個正整數" + +#: directives.c:874 +msgid "line number out of range" +msgstr "列號超出範圍" + +#: directives.c:887 directives.c:964 +#, c-format +msgid "\"%s\" is not a valid filename" +msgstr "「%s」不是一個有效的檔案名稱" + +#: directives.c:924 +#, c-format +msgid "\"%s\" after # is not a positive integer" +msgstr "# 後的「%s」不是一個正整數" + +#: directives.c:1026 +#, c-format +msgid "invalid #%s directive" +msgstr "無效的 #%s 指令" + +#: directives.c:1089 +#, c-format +msgid "registering pragmas in namespace \"%s\" with mismatched name expansion" +msgstr "" + +#: directives.c:1098 +#, fuzzy, c-format +msgid "registering pragma \"%s\" with name expansion and no namespace" +msgstr "「%s」既被註冊為一個 pragma 又被註冊為一個 pragma 命名空間" + +#: directives.c:1116 +#, c-format +msgid "registering \"%s\" as both a pragma and a pragma namespace" +msgstr "「%s」既被註冊為一個 pragma 又被註冊為一個 pragma 命名空間" + +#: directives.c:1119 +#, c-format +msgid "#pragma %s %s is already registered" +msgstr "#pragma %s %s 已經被註冊" + +#: directives.c:1122 +#, c-format +msgid "#pragma %s is already registered" +msgstr "#pragma %s 已經被註冊" + +#: directives.c:1152 +msgid "registering pragma with NULL handler" +msgstr "" + +#: directives.c:1362 +msgid "#pragma once in main file" +msgstr "#pragma once 出現在主檔案中" + +#: directives.c:1385 +msgid "invalid #pragma GCC poison directive" +msgstr "無效的 #pragma GCC poison 指令" + +#: directives.c:1394 +#, c-format +msgid "poisoning existing macro \"%s\"" +msgstr "對已存在的巨集「%s」加料" + +#: directives.c:1413 +msgid "#pragma system_header ignored outside include file" +msgstr "#pragma system_header 在包含檔案外被忽略" + +#: directives.c:1437 +#, c-format +msgid "cannot find source file %s" +msgstr "找不到來源檔案 %s" + +#: directives.c:1441 +#, c-format +msgid "current file is older than %s" +msgstr "目前檔案早於 %s" + +#: directives.c:1620 +msgid "_Pragma takes a parenthesized string literal" +msgstr "_Pragma 需要一個括起的字串原文" + +#: directives.c:1693 +msgid "#else without #if" +msgstr "#else 沒有匹配的 #if" + +#: directives.c:1698 +msgid "#else after #else" +msgstr "#else 出現在 #else 後" + +#: directives.c:1700 directives.c:1733 +msgid "the conditional began here" +msgstr "條件自此開始" + +#: directives.c:1726 +msgid "#elif without #if" +msgstr "#elif 沒有匹配的 #if" + +#: directives.c:1731 +msgid "#elif after #else" +msgstr "#elif 出現在 #else 後" + +#: directives.c:1761 +msgid "#endif without #if" +msgstr "#endif 沒有匹配的 #if" + +#: directives.c:1838 +msgid "missing '(' after predicate" +msgstr "述語後缺少「(」" + +#: directives.c:1853 +msgid "missing ')' to complete answer" +msgstr "完整的答案缺少「)」" + +#: directives.c:1873 +msgid "predicate's answer is empty" +msgstr "述語的答案為空" + +#: directives.c:1900 +msgid "assertion without predicate" +msgstr "判定語後沒有述語" + +#: directives.c:1902 +msgid "predicate must be an identifier" +msgstr "述語必須是一個識別字" + +#: directives.c:1988 +#, c-format +msgid "\"%s\" re-asserted" +msgstr "已再判定「%s」" + +#: directives.c:2271 +#, c-format +msgid "unterminated #%s" +msgstr "未終止的 #%s" + +#: directives-only.c:221 lex.c:1016 traditional.c:162 +msgid "unterminated comment" +msgstr "未終結的註釋" + +#: errors.c:118 +msgid "warning: " +msgstr "警告:" + +#: errors.c:120 +msgid "internal error: " +msgstr "內部錯誤:" + +#: errors.c:122 +msgid "error: " +msgstr "錯誤:" + +#: errors.c:186 +msgid "stdout" +msgstr "stdout" + +#: errors.c:188 +#, c-format +msgid "%s: %s" +msgstr "%s:%s" + +#: expr.c:261 +msgid "too many decimal points in number" +msgstr "數字中有太多小數點" + +#: expr.c:290 expr.c:365 +#, fuzzy +msgid "fixed-point constants are a GCC extension" +msgstr "虛數常數是一個 GCC 擴充功能" + +#: expr.c:303 +#, fuzzy, c-format +msgid "invalid digit \"%c\" in binary constant" +msgstr "八進位常數中有無效字元「%c」" + +#: expr.c:305 +#, c-format +msgid "invalid digit \"%c\" in octal constant" +msgstr "八進位常數中有無效字元「%c」" + +#: expr.c:313 +#, fuzzy +msgid "invalid prefix \"0b\" for floating constant" +msgstr "浮點常數的「%.*s」字尾無效" + +#: expr.c:319 +msgid "use of C99 hexadecimal floating constant" +msgstr "使用 C99 式的十六進位浮點常數" + +#: expr.c:328 +msgid "exponent has no digits" +msgstr "指數部分沒有數字" + +#: expr.c:335 +msgid "hexadecimal floating constants require an exponent" +msgstr "十六進位浮點常數需要指數部分" + +#: expr.c:341 +#, c-format +msgid "invalid suffix \"%.*s\" on floating constant" +msgstr "浮點常數的「%.*s」字尾無效" + +#: expr.c:351 expr.c:393 +#, c-format +msgid "traditional C rejects the \"%.*s\" suffix" +msgstr "傳統 C 不接受「%.*s」字尾" + +#: expr.c:358 +#, fuzzy, c-format +msgid "invalid suffix \"%.*s\" with hexadecimal floating constant" +msgstr "浮點常數的「%.*s」字尾無效" + +#: expr.c:369 +#, fuzzy +msgid "decimal float constants are a GCC extension" +msgstr "虛數常數是一個 GCC 擴充功能" + +#: expr.c:379 +#, c-format +msgid "invalid suffix \"%.*s\" on integer constant" +msgstr "整數常數的「%.*s」字尾無效" + +#: expr.c:401 +msgid "use of C99 long long integer constant" +msgstr "使用 C99 long long 整數常數" + +#: expr.c:409 +msgid "imaginary constants are a GCC extension" +msgstr "虛數常數是一個 GCC 擴充功能" + +#: expr.c:412 +#, fuzzy +msgid "binary constants are a GCC extension" +msgstr "虛數常數是一個 GCC 擴充功能" + +#: expr.c:505 +msgid "integer constant is too large for its type" +msgstr "整數常數值超出其類型" + +#: expr.c:517 +msgid "integer constant is so large that it is unsigned" +msgstr "整數常數太大,認定為 unsigned" + +#: expr.c:612 +msgid "missing ')' after \"defined\"" +msgstr "「defined」 後缺少「)」" + +#: expr.c:619 +msgid "operator \"defined\" requires an identifier" +msgstr "運算子「defined」需要一個識別字" + +#: expr.c:627 +#, c-format +msgid "(\"%s\" is an alternative token for \"%s\" in C++)" +msgstr "(在 C++ 中「%s」會是「%s」的替代識別字)" + +#: expr.c:637 +msgid "this use of \"defined\" may not be portable" +msgstr "使用「defined」可能不利於移植" + +#: expr.c:676 +msgid "floating constant in preprocessor expression" +msgstr "浮點常數出現在預先處理運算式中" + +#: expr.c:682 +msgid "imaginary number in preprocessor expression" +msgstr "預先處理運算式中出現虛數" + +#: expr.c:727 +#, c-format +msgid "\"%s\" is not defined" +msgstr "「%s」未定義" + +#: expr.c:855 expr.c:884 +#, c-format +msgid "missing binary operator before token \"%s\"" +msgstr "識別字「%s」前缺少二元運算子" + +#: expr.c:875 +#, c-format +msgid "token \"%s\" is not valid in preprocessor expressions" +msgstr "識別字「%s」在預先處理運算式中無效" + +#: expr.c:892 +msgid "missing expression between '(' and ')'" +msgstr "「(」與「)」之間缺少運算式" + +#: expr.c:895 +msgid "#if with no expression" +msgstr "#if 後沒有運算式" + +#: expr.c:898 +#, c-format +msgid "operator '%s' has no right operand" +msgstr "運算子「%s」沒有右運算元" + +#: expr.c:903 +#, c-format +msgid "operator '%s' has no left operand" +msgstr "運算子「%s」沒有左運算元" + +#: expr.c:929 +msgid " ':' without preceding '?'" +msgstr "「:」前沒有「?」" + +#: expr.c:956 +msgid "unbalanced stack in #if" +msgstr "#if 中不平衡的堆疊" + +#: expr.c:975 +#, c-format +msgid "impossible operator '%u'" +msgstr "不可能的運算子「%u」" + +#: expr.c:1065 +msgid "missing ')' in expression" +msgstr "運算式中缺少「)」" + +#: expr.c:1086 +msgid "'?' without following ':'" +msgstr "「?」後沒有「:」" + +#: expr.c:1096 +msgid "integer overflow in preprocessor expression" +msgstr "預先處理運算式中整數溢出" + +#: expr.c:1101 +msgid "missing '(' in expression" +msgstr "運算式中缺少「(」" + +#: expr.c:1133 +#, c-format +msgid "the left operand of \"%s\" changes sign when promoted" +msgstr "「%s」的左運算元在提升時變換了符號" + +#: expr.c:1138 +#, c-format +msgid "the right operand of \"%s\" changes sign when promoted" +msgstr "「%s」的右運算元在提升時變換了符號" + +#: expr.c:1397 +msgid "traditional C rejects the unary plus operator" +msgstr "傳統 C 不接受單元 + 運算子" + +#: expr.c:1480 +msgid "comma operator in operand of #if" +msgstr "#if 運算元中出現逗號" + +#: expr.c:1612 +msgid "division by zero in #if" +msgstr "#if 中用零做除數" + +#: files.c:442 +msgid "NULL directory in find_file" +msgstr "find_file 中有 NULL 目錄" + +#: files.c:480 +msgid "one or more PCH files were found, but they were invalid" +msgstr "找到一個或多個 PCH 檔案,但它們是無效的" + +#: files.c:483 +msgid "use -Winvalid-pch for more information" +msgstr "使用 -Winvalid-pch 以獲得更多資訊" + +#: files.c:570 +#, c-format +msgid "%s is a block device" +msgstr "%s 是一個區塊裝置" + +#: files.c:587 +#, c-format +msgid "%s is too large" +msgstr "%s 過大" + +#: files.c:622 +#, c-format +msgid "%s is shorter than expected" +msgstr "%s 短於預期" + +#: files.c:852 +#, c-format +msgid "no include path in which to search for %s" +msgstr "沒有包含路徑可供搜尋 %s" + +#: files.c:1157 +msgid "Multiple include guards may be useful for:\n" +msgstr "多個防止重包含可能對其有用:\n" + +#: init.c:426 +msgid "cppchar_t must be an unsigned type" +msgstr "cppchar_t 必須是無號類型" + +#: init.c:430 +#, c-format +msgid "preprocessor arithmetic has maximum precision of %lu bits; target requires %lu bits" +msgstr "預先處理算術的最高精度為 %lu 位;目標需要 %lu 位" + +#: init.c:437 +msgid "CPP arithmetic must be at least as precise as a target int" +msgstr "CPP 算術必須至少具有目標 int 的精度" + +#: init.c:440 +msgid "target char is less than 8 bits wide" +msgstr "目標 char 短於 8 位" + +#: init.c:444 +msgid "target wchar_t is narrower than target char" +msgstr "目標 wchar_t 短於目標 char" + +#: init.c:448 +msgid "target int is narrower than target char" +msgstr "目標 int 短於目標 char" + +#: init.c:453 +msgid "CPP half-integer narrower than CPP character" +msgstr "CPP 半整數短於 CPP 字元" + +#: init.c:457 +#, c-format +msgid "CPP on this host cannot handle wide character constants over %lu bits, but the target requires %lu bits" +msgstr "在此宿主機上,CPP 不能處理長於 %lu 位的寬字元常數,但目標需要 %lu 位" + +#: lex.c:283 +msgid "backslash and newline separated by space" +msgstr "反斜線和換列為空格所分隔" + +#: lex.c:288 +msgid "backslash-newline at end of file" +msgstr "反斜線-換列出現在檔案末尾" + +#: lex.c:303 +#, c-format +msgid "trigraph ??%c converted to %c" +msgstr "三元符 ??%c 轉換為 %c" + +#: lex.c:310 +#, c-format +msgid "trigraph ??%c ignored, use -trigraphs to enable" +msgstr "三元符 ??%c 被忽略,請使用 -trigraphs 來啟用" + +#: lex.c:356 +msgid "\"/*\" within comment" +msgstr "「/*」出現在註釋中" + +#: lex.c:414 +#, c-format +msgid "%s in preprocessing directive" +msgstr "預先處理指令中出現 %s" + +#: lex.c:423 +msgid "null character(s) ignored" +msgstr "忽略空字元" + +#: lex.c:460 +#, c-format +msgid "`%.*s' is not in NFKC" +msgstr "「%.*s」不在 NFKC 中" + +#: lex.c:463 +#, c-format +msgid "`%.*s' is not in NFC" +msgstr "「%.*s」不在 NFC 中" + +#: lex.c:551 +#, c-format +msgid "attempt to use poisoned \"%s\"" +msgstr "試圖使用已加料的「%s」" + +#: lex.c:559 +msgid "__VA_ARGS__ can only appear in the expansion of a C99 variadic macro" +msgstr "__VA_ARGS__ 只能出現在 C99 可變參數巨集的展開中" + +#: lex.c:659 +msgid "null character(s) preserved in literal" +msgstr "空字元將保留在原文中" + +#: lex.c:662 +#, fuzzy, c-format +msgid "missing terminating %c character" +msgstr "缺少結尾的 > 字元" + +#: lex.c:1027 +msgid "C++ style comments are not allowed in ISO C90" +msgstr "C++ 風格的註釋在 ISO C90 中不被允許" + +#: lex.c:1029 +msgid "(this will be reported only once per input file)" +msgstr "(此警告為每個輸入檔案只報告一次)" + +#: lex.c:1034 +msgid "multi-line comment" +msgstr "多列註釋" + +#: lex.c:1347 +#, c-format +msgid "unspellable token %s" +msgstr "無法拼出的識別字 %s" + +#: line-map.c:320 +#, c-format +msgid "In file included from %s:%u" +msgstr "在包含自 %s:%u 的檔案中" + +#: line-map.c:338 +#, c-format +msgid "" +",\n" +" from %s:%u" +msgstr "" +",\n" +" 從 %s:%u" + +#: macro.c:84 +#, c-format +msgid "macro \"%s\" is not used" +msgstr "巨集「%s」未被使用" + +#: macro.c:123 macro.c:319 +#, c-format +msgid "invalid built-in macro \"%s\"" +msgstr "無效的內建巨集「%s」" + +#: macro.c:157 +#, fuzzy +msgid "could not determine file timestamp" +msgstr "無法決定日期與時間" + +#: macro.c:254 +msgid "could not determine date and time" +msgstr "無法決定日期與時間" + +#: macro.c:270 +msgid "__COUNTER__ expanded inside directive with -fdirectives-only" +msgstr "" + +#: macro.c:423 +msgid "invalid string literal, ignoring final '\\'" +msgstr "無效的原文字串,忽略最後的「\\」" + +#: macro.c:483 +#, c-format +msgid "pasting \"%s\" and \"%s\" does not give a valid preprocessing token" +msgstr "粘貼「%s」和「%s」不能給出一個有效的預先處理識別字" + +#: macro.c:558 +msgid "ISO C99 requires rest arguments to be used" +msgstr "ISO C99 需要使用剩餘的引數" + +#: macro.c:563 +#, c-format +msgid "macro \"%s\" requires %u arguments, but only %u given" +msgstr "巨集「%s」需要 %u 個引數,但只給出了 %u 個" + +#: macro.c:568 +#, c-format +msgid "macro \"%s\" passed %u arguments, but takes just %u" +msgstr "巨集「%s」傳遞了 %u 個引數,但只需要 %u 個" + +#: macro.c:679 traditional.c:680 +#, c-format +msgid "unterminated argument list invoking macro \"%s\"" +msgstr "呼叫巨集「%s」時引數清單未終止" + +#: macro.c:782 +#, c-format +msgid "function-like macro \"%s\" must be used with arguments in traditional C" +msgstr "類似函式的巨集「%s」在傳統 C 中必須與引數一起使用" + +#: macro.c:1325 +#, c-format +msgid "duplicate macro parameter \"%s\"" +msgstr "重複的巨集參數「%s」" + +#: macro.c:1371 +#, c-format +msgid "\"%s\" may not appear in macro parameter list" +msgstr "「%s」不能出現在巨集參數清單中" + +#: macro.c:1379 +msgid "macro parameters must be comma-separated" +msgstr "巨集參數必須由逗號隔開" + +#: macro.c:1396 +msgid "parameter name missing" +msgstr "缺少參數名" + +#: macro.c:1413 +msgid "anonymous variadic macros were introduced in C99" +msgstr "匿名可變參數巨集在 C99 中被引入" + +#: macro.c:1418 +msgid "ISO C does not permit named variadic macros" +msgstr "ISO C 不允許具名的可變參數巨集" + +#: macro.c:1427 +msgid "missing ')' in macro parameter list" +msgstr "在巨集參數表中缺少「)」" + +#: macro.c:1476 +msgid "'##' cannot appear at either end of a macro expansion" +msgstr "「##」不能出現在巨集展開的兩端" + +#: macro.c:1510 +msgid "ISO C99 requires whitespace after the macro name" +msgstr "ISO C99 要求巨集名後必須有空白" + +#: macro.c:1534 +msgid "missing whitespace after the macro name" +msgstr "巨集名後缺少空白" + +#: macro.c:1564 +msgid "'#' is not followed by a macro parameter" +msgstr "「#」後沒有巨集參數" + +#: macro.c:1683 +#, c-format +msgid "\"%s\" redefined" +msgstr "「%s」重定義" + +#: macro.c:1688 +msgid "this is the location of the previous definition" +msgstr "這是先前定義的位置" + +#: macro.c:1738 +#, c-format +msgid "macro argument \"%s\" would be stringified in traditional C" +msgstr "巨集引數「%s」將在傳統 C 中被字串化" + +#: macro.c:1761 +#, c-format +msgid "invalid hash type %d in cpp_macro_definition" +msgstr "cpp_macro_definition 中有無效的雜湊類型 %d" + +#: pch.c:84 pch.c:332 pch.c:344 pch.c:362 pch.c:368 pch.c:377 +msgid "while writing precompiled header" +msgstr "在寫入預先編譯標頭時" + +#: pch.c:485 +#, c-format +msgid "%s: not used because `%.*s' not defined" +msgstr "%s:未使用,因為「%.*s」未定義" + +#: pch.c:497 +#, c-format +msgid "%s: not used because `%.*s' defined as `%s' not `%.*s'" +msgstr "%s:未使用,因為「%.*s」被定義為「%s」而非「%*.s」" + +#: pch.c:538 +#, c-format +msgid "%s: not used because `%s' is defined" +msgstr "%s:未使用,因為「%s」已定義" + +#: pch.c:558 +#, fuzzy, c-format +msgid "%s: not used because `__COUNTER__' is invalid" +msgstr "%s:未使用,因為「%s」已定義" + +#: pch.c:567 pch.c:737 +msgid "while reading precompiled header" +msgstr "在讀取預先編譯標頭時" + +#: traditional.c:750 +#, c-format +msgid "detected recursion whilst expanding macro \"%s\"" +msgstr "展開巨集「%s」時偵測到遞迴" + +#: traditional.c:917 +msgid "syntax error in macro parameter list" +msgstr "巨集參數清單語法錯誤" + +#~ msgid "no newline at end of file" +#~ msgstr "檔案未以空白列結束" diff --git a/libcpp/symtab.c b/libcpp/symtab.c new file mode 100644 index 0000000..ffa28f5 --- /dev/null +++ b/libcpp/symtab.c @@ -0,0 +1,335 @@ +/* Hash tables. + Copyright (C) 2000, 2001, 2003, 2004 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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + In other words, you are welcome to use, share and improve this program. + You are forbidden to forbid anyone else to use, share and improve + what you give them. Help stamp out software-hoarding! */ + +#include "config.h" +#include "system.h" +#include "symtab.h" + +/* The code below is a specialization of Vladimir Makarov's expandable + hash tables (see libiberty/hashtab.c). The abstraction penalty was + too high to continue using the generic form. This code knows + intrinsically how to calculate a hash value, and how to compare an + existing entry with a potential new one. Also, the ability to + delete members from the table has been removed. */ + +static unsigned int calc_hash (const unsigned char *, size_t); +static void ht_expand (hash_table *); +static double approx_sqrt (double); + +/* Calculate the hash of the string STR of length LEN. */ + +static unsigned int +calc_hash (const unsigned char *str, size_t len) +{ + size_t n = len; + unsigned int r = 0; + + while (n--) + r = HT_HASHSTEP (r, *str++); + + return HT_HASHFINISH (r, len); +} + +/* Initialize an identifier hashtable. */ + +hash_table * +ht_create (unsigned int order) +{ + unsigned int nslots = 1 << order; + hash_table *table; + + table = XCNEW (hash_table); + + /* Strings need no alignment. */ + _obstack_begin (&table->stack, 0, 0, + (void *(*) (long)) xmalloc, + (void (*) (void *)) free); + + obstack_alignment_mask (&table->stack) = 0; + + table->entries = XCNEWVEC (hashnode, nslots); + table->entries_owned = true; + table->nslots = nslots; + return table; +} + +/* Frees all memory associated with a hash table. */ + +void +ht_destroy (hash_table *table) +{ + obstack_free (&table->stack, NULL); + if (table->entries_owned) + free (table->entries); + free (table); +} + +/* Returns the hash entry for the a STR of length LEN. If that string + already exists in the table, returns the existing entry, and, if + INSERT is CPP_ALLOCED, frees the last obstack object. If the + identifier hasn't been seen before, and INSERT is CPP_NO_INSERT, + returns NULL. Otherwise insert and returns a new entry. A new + string is alloced if INSERT is CPP_ALLOC, otherwise INSERT is + CPP_ALLOCED and the item is assumed to be at the top of the + obstack. */ +hashnode +ht_lookup (hash_table *table, const unsigned char *str, size_t len, + enum ht_lookup_option insert) +{ + return ht_lookup_with_hash (table, str, len, calc_hash (str, len), + insert); +} + +hashnode +ht_lookup_with_hash (hash_table *table, const unsigned char *str, + size_t len, unsigned int hash, + enum ht_lookup_option insert) +{ + unsigned int hash2; + unsigned int index; + size_t sizemask; + hashnode node; + + sizemask = table->nslots - 1; + index = hash & sizemask; + table->searches++; + + node = table->entries[index]; + + if (node != NULL) + { + if (node->hash_value == hash + && HT_LEN (node) == (unsigned int) len + && !memcmp (HT_STR (node), str, len)) + { + if (insert == HT_ALLOCED) + /* The string we search for was placed at the end of the + obstack. Release it. */ + obstack_free (&table->stack, (void *) str); + return node; + } + + /* hash2 must be odd, so we're guaranteed to visit every possible + location in the table during rehashing. */ + hash2 = ((hash * 17) & sizemask) | 1; + + for (;;) + { + table->collisions++; + index = (index + hash2) & sizemask; + node = table->entries[index]; + if (node == NULL) + break; + + if (node->hash_value == hash + && HT_LEN (node) == (unsigned int) len + && !memcmp (HT_STR (node), str, len)) + { + if (insert == HT_ALLOCED) + /* The string we search for was placed at the end of the + obstack. Release it. */ + obstack_free (&table->stack, (void *) str); + return node; + } + } + } + + if (insert == HT_NO_INSERT) + return NULL; + + node = (*table->alloc_node) (table); + table->entries[index] = node; + + HT_LEN (node) = (unsigned int) len; + node->hash_value = hash; + if (insert == HT_ALLOC) + HT_STR (node) = (const unsigned char *) obstack_copy0 (&table->stack, + str, len); + else + HT_STR (node) = str; + + if (++table->nelements * 4 >= table->nslots * 3) + /* Must expand the string table. */ + ht_expand (table); + + return node; +} + +/* Double the size of a hash table, re-hashing existing entries. */ + +static void +ht_expand (hash_table *table) +{ + hashnode *nentries, *p, *limit; + unsigned int size, sizemask; + + size = table->nslots * 2; + nentries = XCNEWVEC (hashnode, size); + sizemask = size - 1; + + p = table->entries; + limit = p + table->nslots; + do + if (*p) + { + unsigned int index, hash, hash2; + + hash = (*p)->hash_value; + index = hash & sizemask; + + if (nentries[index]) + { + hash2 = ((hash * 17) & sizemask) | 1; + do + { + index = (index + hash2) & sizemask; + } + while (nentries[index]); + } + nentries[index] = *p; + } + while (++p < limit); + + if (table->entries_owned) + free (table->entries); + table->entries_owned = true; + table->entries = nentries; + table->nslots = size; +} + +/* For all nodes in TABLE, callback CB with parameters TABLE->PFILE, + the node, and V. */ +void +ht_forall (hash_table *table, ht_cb cb, const void *v) +{ + hashnode *p, *limit; + + p = table->entries; + limit = p + table->nslots; + do + if (*p) + { + if ((*cb) (table->pfile, *p, v) == 0) + break; + } + while (++p < limit); +} + +/* Restore the hash table. */ +void +ht_load (hash_table *ht, hashnode *entries, + unsigned int nslots, unsigned int nelements, + bool own) +{ + if (ht->entries_owned) + free (ht->entries); + ht->entries = entries; + ht->nslots = nslots; + ht->nelements = nelements; + ht->entries_owned = own; +} + +/* Dump allocation statistics to stderr. */ + +void +ht_dump_statistics (hash_table *table) +{ + size_t nelts, nids, overhead, headers; + size_t total_bytes, longest; + double sum_of_squares, exp_len, exp_len2, exp2_len; + hashnode *p, *limit; + +#define SCALE(x) ((unsigned long) ((x) < 1024*10 \ + ? (x) \ + : ((x) < 1024*1024*10 \ + ? (x) / 1024 \ + : (x) / (1024*1024)))) +#define LABEL(x) ((x) < 1024*10 ? ' ' : ((x) < 1024*1024*10 ? 'k' : 'M')) + + total_bytes = longest = sum_of_squares = nids = 0; + p = table->entries; + limit = p + table->nslots; + do + if (*p) + { + size_t n = HT_LEN (*p); + + total_bytes += n; + sum_of_squares += (double) n * n; + if (n > longest) + longest = n; + nids++; + } + while (++p < limit); + + nelts = table->nelements; + overhead = obstack_memory_used (&table->stack) - total_bytes; + headers = table->nslots * sizeof (hashnode); + + fprintf (stderr, "\nString pool\nentries\t\t%lu\n", + (unsigned long) nelts); + fprintf (stderr, "identifiers\t%lu (%.2f%%)\n", + (unsigned long) nids, nids * 100.0 / nelts); + fprintf (stderr, "slots\t\t%lu\n", + (unsigned long) table->nslots); + fprintf (stderr, "bytes\t\t%lu%c (%lu%c overhead)\n", + SCALE (total_bytes), LABEL (total_bytes), + SCALE (overhead), LABEL (overhead)); + fprintf (stderr, "table size\t%lu%c\n", + SCALE (headers), LABEL (headers)); + + exp_len = (double)total_bytes / (double)nelts; + exp2_len = exp_len * exp_len; + exp_len2 = (double) sum_of_squares / (double) nelts; + + fprintf (stderr, "coll/search\t%.4f\n", + (double) table->collisions / (double) table->searches); + fprintf (stderr, "ins/search\t%.4f\n", + (double) nelts / (double) table->searches); + fprintf (stderr, "avg. entry\t%.2f bytes (+/- %.2f)\n", + exp_len, approx_sqrt (exp_len2 - exp2_len)); + fprintf (stderr, "longest entry\t%lu\n", + (unsigned long) longest); +#undef SCALE +#undef LABEL +} + +/* Return the approximate positive square root of a number N. This is for + statistical reports, not code generation. */ +static double +approx_sqrt (double x) +{ + double s, d; + + if (x < 0) + abort (); + if (x == 0) + return 0; + + s = x; + do + { + d = (s * s - x) / (2 * s); + s -= d; + } + while (d > .0001); + return s; +} diff --git a/libcpp/system.h b/libcpp/system.h new file mode 100644 index 0000000..e08bdf1 --- /dev/null +++ b/libcpp/system.h @@ -0,0 +1,425 @@ +/* Get common system includes and various definitions and declarations based + on autoconf macros. + Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004 + Free Software Foundation, Inc. + +This file is part of libcpp (aka cpplib). + +GCC 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. + +GCC 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 GCC; see the file COPYING. If not, write to the Free +Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301, USA. */ + + +#ifndef LIBCPP_SYSTEM_H +#define LIBCPP_SYSTEM_H + +/* We must include stdarg.h before stdio.h. */ +#include + +#ifdef HAVE_STDDEF_H +# include +#endif + +#include + +/* Define a generic NULL if one hasn't already been defined. */ +#ifndef NULL +#define NULL 0 +#endif + +/* Use the unlocked open routines from libiberty. */ +#define fopen(PATH,MODE) fopen_unlocked(PATH,MODE) +#define fdopen(FILDES,MODE) fdopen_unlocked(FILDES,MODE) +#define freopen(PATH,MODE,STREAM) freopen_unlocked(PATH,MODE,STREAM) + +/* The compiler is not a multi-threaded application and therefore we + do not have to use the locking functions. In fact, using the locking + functions can cause the compiler to be significantly slower under + I/O bound conditions (such as -g -O0 on very large source files). + + HAVE_DECL_PUTC_UNLOCKED actually indicates whether or not the stdio + code is multi-thread safe by default. If it is set to 0, then do + not worry about using the _unlocked functions. + + fputs_unlocked, fwrite_unlocked, and fprintf_unlocked are + extensions and need to be prototyped by hand (since we do not + define _GNU_SOURCE). */ + +#if defined HAVE_DECL_PUTC_UNLOCKED && HAVE_DECL_PUTC_UNLOCKED + +# ifdef HAVE_PUTC_UNLOCKED +# undef putc +# define putc(C, Stream) putc_unlocked (C, Stream) +# endif +# ifdef HAVE_PUTCHAR_UNLOCKED +# undef putchar +# define putchar(C) putchar_unlocked (C) +# endif +# ifdef HAVE_GETC_UNLOCKED +# undef getc +# define getc(Stream) getc_unlocked (Stream) +# endif +# ifdef HAVE_GETCHAR_UNLOCKED +# undef getchar +# define getchar() getchar_unlocked () +# endif +# ifdef HAVE_FPUTC_UNLOCKED +# undef fputc +# define fputc(C, Stream) fputc_unlocked (C, Stream) +# endif + +# ifdef HAVE_CLEARERR_UNLOCKED +# undef clearerr +# define clearerr(Stream) clearerr_unlocked (Stream) +# if defined (HAVE_DECL_CLEARERR_UNLOCKED) && !HAVE_DECL_CLEARERR_UNLOCKED +extern void clearerr_unlocked (FILE *); +# endif +# endif +# ifdef HAVE_FEOF_UNLOCKED +# undef feof +# define feof(Stream) feof_unlocked (Stream) +# if defined (HAVE_DECL_FEOF_UNLOCKED) && !HAVE_DECL_FEOF_UNLOCKED +extern int feof_unlocked (FILE *); +# endif +# endif +# ifdef HAVE_FILENO_UNLOCKED +# undef fileno +# define fileno(Stream) fileno_unlocked (Stream) +# if defined (HAVE_DECL_FILENO_UNLOCKED) && !HAVE_DECL_FILENO_UNLOCKED +extern int fileno_unlocked (FILE *); +# endif +# endif +# ifdef HAVE_FFLUSH_UNLOCKED +# undef fflush +# define fflush(Stream) fflush_unlocked (Stream) +# if defined (HAVE_DECL_FFLUSH_UNLOCKED) && !HAVE_DECL_FFLUSH_UNLOCKED +extern int fflush_unlocked (FILE *); +# endif +# endif +# ifdef HAVE_FGETC_UNLOCKED +# undef fgetc +# define fgetc(Stream) fgetc_unlocked (Stream) +# if defined (HAVE_DECL_FGETC_UNLOCKED) && !HAVE_DECL_FGETC_UNLOCKED +extern int fgetc_unlocked (FILE *); +# endif +# endif +# ifdef HAVE_FGETS_UNLOCKED +# undef fgets +# define fgets(S, n, Stream) fgets_unlocked (S, n, Stream) +# if defined (HAVE_DECL_FGETS_UNLOCKED) && !HAVE_DECL_FGETS_UNLOCKED +extern char *fgets_unlocked (char *, int, FILE *); +# endif +# endif +# ifdef HAVE_FPUTS_UNLOCKED +# undef fputs +# define fputs(String, Stream) fputs_unlocked (String, Stream) +# if defined (HAVE_DECL_FPUTS_UNLOCKED) && !HAVE_DECL_FPUTS_UNLOCKED +extern int fputs_unlocked (const char *, FILE *); +# endif +# endif +# ifdef HAVE_FERROR_UNLOCKED +# undef ferror +# define ferror(Stream) ferror_unlocked (Stream) +# if defined (HAVE_DECL_FERROR_UNLOCKED) && !HAVE_DECL_FERROR_UNLOCKED +extern int ferror_unlocked (FILE *); +# endif +# endif +# ifdef HAVE_FREAD_UNLOCKED +# undef fread +# define fread(Ptr, Size, N, Stream) fread_unlocked (Ptr, Size, N, Stream) +# if defined (HAVE_DECL_FREAD_UNLOCKED) && !HAVE_DECL_FREAD_UNLOCKED +extern size_t fread_unlocked (void *, size_t, size_t, FILE *); +# endif +# endif +# ifdef HAVE_FWRITE_UNLOCKED +# undef fwrite +# define fwrite(Ptr, Size, N, Stream) fwrite_unlocked (Ptr, Size, N, Stream) +# if defined (HAVE_DECL_FWRITE_UNLOCKED) && !HAVE_DECL_FWRITE_UNLOCKED +extern size_t fwrite_unlocked (const void *, size_t, size_t, FILE *); +# endif +# endif +# ifdef HAVE_FPRINTF_UNLOCKED +# undef fprintf +/* We can't use a function-like macro here because we don't know if + we have varargs macros. */ +# define fprintf fprintf_unlocked +# if defined (HAVE_DECL_FPRINTF_UNLOCKED) && !HAVE_DECL_FPRINTF_UNLOCKED +extern int fprintf_unlocked (FILE *, const char *, ...); +# endif +# endif + +#endif + +/* ??? Glibc's fwrite/fread_unlocked macros cause + "warning: signed and unsigned type in conditional expression". */ +#undef fread_unlocked +#undef fwrite_unlocked + +#include +#include + +#if !defined (errno) && defined (HAVE_DECL_ERRNO) && !HAVE_DECL_ERRNO +extern int errno; +#endif + +/* Some of glibc's string inlines cause warnings. Plus we'd rather + rely on (and therefore test) GCC's string builtins. */ +#define __NO_STRING_INLINES + +#ifdef STRING_WITH_STRINGS +# include +# include +#else +# ifdef HAVE_STRING_H +# include +# else +# ifdef HAVE_STRINGS_H +# include +# endif +# endif +#endif + +#ifdef HAVE_STDLIB_H +# include +#endif + +#ifdef HAVE_UNISTD_H +# include +#endif + +#if HAVE_LIMITS_H +# include +#endif + +/* Infrastructure for defining missing _MAX and _MIN macros. Note that + macros defined with these cannot be used in #if. */ + +/* The extra casts work around common compiler bugs. */ +#define INTTYPE_SIGNED(t) (! ((t) 0 < (t) -1)) +/* The outer cast is needed to work around a bug in Cray C 5.0.3.0. + It is necessary at least when t == time_t. */ +#define INTTYPE_MINIMUM(t) ((t) (INTTYPE_SIGNED (t) \ + ? ~ (t) 0 << (sizeof(t) * CHAR_BIT - 1) : (t) 0)) +#define INTTYPE_MAXIMUM(t) ((t) (~ (t) 0 - INTTYPE_MINIMUM (t))) + +/* Use that infrastructure to provide a few constants. */ +#ifndef UCHAR_MAX +# define UCHAR_MAX INTTYPE_MAXIMUM (unsigned char) +#endif + +#ifdef TIME_WITH_SYS_TIME +# include +# include +#else +# if HAVE_SYS_TIME_H +# include +# else +# ifdef HAVE_TIME_H +# include +# endif +# endif +#endif + +#ifdef HAVE_FCNTL_H +# include +#else +# ifdef HAVE_SYS_FILE_H +# include +# endif +#endif + +#ifdef HAVE_LOCALE_H +# include +#endif + +#ifdef HAVE_LANGINFO_CODESET +# include +#endif + +#ifndef HAVE_SETLOCALE +# define setlocale(category, locale) (locale) +#endif + +#ifdef ENABLE_NLS +#include +#else +/* Stubs. */ +# undef dgettext +# define dgettext(package, msgid) (msgid) +#endif + +#ifndef _ +# define _(msgid) dgettext (PACKAGE, msgid) +#endif + +#ifndef N_ +# define N_(msgid) msgid +#endif + +/* Some systems define these in, e.g., param.h. We undefine these names + here to avoid the warnings. We prefer to use our definitions since we + know they are correct. */ + +#undef MIN +#undef MAX +#define MIN(X,Y) ((X) < (Y) ? (X) : (Y)) +#define MAX(X,Y) ((X) > (Y) ? (X) : (Y)) + +/* The HAVE_DECL_* macros are three-state, undefined, 0 or 1. If they + are defined to 0 then we must provide the relevant declaration + here. These checks will be in the undefined state while configure + is running so be careful to test "defined (HAVE_DECL_*)". */ + +#if defined (HAVE_DECL_ABORT) && !HAVE_DECL_ABORT +extern void abort (void); +#endif + +#if HAVE_SYS_STAT_H +# include +#endif + +/* Test if something is a normal file. */ +#ifndef S_ISREG +#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) +#endif + +/* Test if something is a directory. */ +#ifndef S_ISDIR +#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) +#endif + +/* Test if something is a character special file. */ +#ifndef S_ISCHR +#define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR) +#endif + +/* Test if something is a block special file. */ +#ifndef S_ISBLK +#define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK) +#endif + +/* Test if something is a socket. */ +#ifndef S_ISSOCK +# ifdef S_IFSOCK +# define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK) +# else +# define S_ISSOCK(m) 0 +# endif +#endif + +/* Test if something is a FIFO. */ +#ifndef S_ISFIFO +# ifdef S_IFIFO +# define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) +# else +# define S_ISFIFO(m) 0 +# endif +#endif + +/* Approximate O_NOCTTY and O_BINARY. */ +#ifndef O_NOCTTY +#define O_NOCTTY 0 +#endif +#ifndef O_BINARY +# define O_BINARY 0 +#endif + +/* Filename handling macros. */ +#include "filenames.h" + +/* Get libiberty declarations. */ +#include "libiberty.h" +#include "safe-ctype.h" + +/* 1 if we have C99 designated initializers. + + ??? C99 designated initializers are not supported by most C++ + compilers, including G++. -- gdr, 2005-05-18 */ +#if !defined(HAVE_DESIGNATED_INITIALIZERS) +#define HAVE_DESIGNATED_INITIALIZERS \ + ((!defined(__cplusplus) && (GCC_VERSION >= 2007)) \ + || (__STDC_VERSION__ >= 199901L)) +#endif + +/* Be conservative and only use enum bitfields with GCC. + FIXME: provide a complete autoconf test for buggy enum bitfields. */ + +#if (GCC_VERSION > 2000) +#define ENUM_BITFIELD(TYPE) __extension__ enum TYPE +#else +#define ENUM_BITFIELD(TYPE) unsigned int +#endif + +#ifndef offsetof +#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *) 0)->MEMBER) +#endif + +/* __builtin_expect(A, B) evaluates to A, but notifies the compiler that + the most likely value of A is B. This feature was added at some point + between 2.95 and 3.0. Let's use 3.0 as the lower bound for now. */ +#if (GCC_VERSION < 3000) +#define __builtin_expect(a, b) (a) +#endif + +/* Provide a fake boolean type. We make no attempt to use the + C99 _Bool, as it may not be available in the bootstrap compiler, + and even if it is, it is liable to be buggy. + This must be after all inclusion of system headers, as some of + them will mess us up. */ +#undef bool +#undef true +#undef false +#undef TRUE +#undef FALSE + +#ifndef __cplusplus +#define bool unsigned char +#endif +#define true 1 +#define false 0 + +/* Some compilers do not allow the use of unsigned char in bitfields. */ +#define BOOL_BITFIELD unsigned int + +/* Poison identifiers we do not want to use. */ +#if (GCC_VERSION >= 3000) +#undef calloc +#undef strdup +#undef malloc +#undef realloc + #pragma GCC poison calloc strdup + #pragma GCC poison malloc realloc + +/* Libiberty macros that are no longer used in GCC. */ +#undef ANSI_PROTOTYPES +#undef PTR_CONST +#undef LONG_DOUBLE +#undef VPARAMS +#undef VA_OPEN +#undef VA_FIXEDARG +#undef VA_CLOSE +#undef VA_START + #pragma GCC poison ANSI_PROTOTYPES PTR_CONST LONG_DOUBLE VPARAMS VA_OPEN \ + VA_FIXEDARG VA_CLOSE VA_START + +/* Note: not all uses of the `index' token (e.g. variable names and + structure members) have been eliminated. */ +#undef bcopy +#undef bzero +#undef bcmp +#undef rindex + #pragma GCC poison bcopy bzero bcmp rindex + +#endif /* GCC >= 3.0 */ +#endif /* ! LIBCPP_SYSTEM_H */ diff --git a/libcpp/traditional.c b/libcpp/traditional.c new file mode 100644 index 0000000..6c4dda1 --- /dev/null +++ b/libcpp/traditional.c @@ -0,0 +1,1169 @@ +/* CPP Library - traditional lexical analysis and macro expansion. + Copyright (C) 2002, 2004, 2005, 2007, 2008 Free Software Foundation, Inc. + Contributed by Neil Booth, May 2002 + +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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include "config.h" +#include "system.h" +#include "cpplib.h" +#include "internal.h" + +/* The replacement text of a function-like macro is stored as a + contiguous sequence of aligned blocks, each representing the text + between subsequent parameters. + + Each block comprises the text between its surrounding parameters, + the length of that text, and the one-based index of the following + parameter. The final block in the replacement text is easily + recognizable as it has an argument index of zero. */ + +struct block +{ + unsigned int text_len; + unsigned short arg_index; + uchar text[1]; +}; + +#define BLOCK_HEADER_LEN offsetof (struct block, text) +#define BLOCK_LEN(TEXT_LEN) CPP_ALIGN (BLOCK_HEADER_LEN + (TEXT_LEN)) + +/* Structure holding information about a function-like macro + invocation. */ +struct fun_macro +{ + /* Memory buffer holding the trad_arg array. */ + _cpp_buff *buff; + + /* An array of size the number of macro parameters + 1, containing + the offsets of the start of each macro argument in the output + buffer. The argument continues until the character before the + start of the next one. */ + size_t *args; + + /* The hashnode of the macro. */ + cpp_hashnode *node; + + /* The offset of the macro name in the output buffer. */ + size_t offset; + + /* The line the macro name appeared on. */ + unsigned int line; + + /* Zero-based index of argument being currently lexed. */ + unsigned int argc; +}; + +/* Lexing state. It is mostly used to prevent macro expansion. */ +enum ls {ls_none = 0, /* Normal state. */ + ls_fun_open, /* When looking for '('. */ + ls_fun_close, /* When looking for ')'. */ + ls_defined, /* After defined. */ + ls_defined_close, /* Looking for ')' of defined(). */ + ls_hash, /* After # in preprocessor conditional. */ + ls_predicate, /* After the predicate, maybe paren? */ + ls_answer}; /* In answer to predicate. */ + +/* Lexing TODO: Maybe handle space in escaped newlines. Stop lex.c + from recognizing comments and directives during its lexing pass. */ + +static const uchar *skip_whitespace (cpp_reader *, const uchar *, int); +static cpp_hashnode *lex_identifier (cpp_reader *, const uchar *); +static const uchar *copy_comment (cpp_reader *, const uchar *, int); +static void check_output_buffer (cpp_reader *, size_t); +static void push_replacement_text (cpp_reader *, cpp_hashnode *); +static bool scan_parameters (cpp_reader *, cpp_macro *); +static bool recursive_macro (cpp_reader *, cpp_hashnode *); +static void save_replacement_text (cpp_reader *, cpp_macro *, unsigned int); +static void maybe_start_funlike (cpp_reader *, cpp_hashnode *, const uchar *, + struct fun_macro *); +static void save_argument (struct fun_macro *, size_t); +static void replace_args_and_push (cpp_reader *, struct fun_macro *); +static size_t canonicalize_text (uchar *, const uchar *, size_t, uchar *); + +/* Ensures we have N bytes' space in the output buffer, and + reallocates it if not. */ +static void +check_output_buffer (cpp_reader *pfile, size_t n) +{ + /* We might need two bytes to terminate an unterminated comment, and + one more to terminate the line with a NUL. */ + n += 2 + 1; + + if (n > (size_t) (pfile->out.limit - pfile->out.cur)) + { + size_t size = pfile->out.cur - pfile->out.base; + size_t new_size = (size + n) * 3 / 2; + + pfile->out.base = XRESIZEVEC (unsigned char, pfile->out.base, new_size); + pfile->out.limit = pfile->out.base + new_size; + pfile->out.cur = pfile->out.base + size; + } +} + +/* Skip a C-style block comment in a macro as a result of -CC. + Buffer->cur points to the initial asterisk of the comment. */ +static void +skip_macro_block_comment (cpp_reader *pfile) +{ + const uchar *cur = pfile->buffer->cur; + + cur++; + if (*cur == '/') + cur++; + + /* People like decorating comments with '*', so check for '/' + instead for efficiency. */ + while(! (*cur++ == '/' && cur[-2] == '*') ) + ; + + pfile->buffer->cur = cur; +} + +/* CUR points to the asterisk introducing a comment in the current + context. IN_DEFINE is true if we are in the replacement text of a + macro. + + The asterisk and following comment is copied to the buffer pointed + to by pfile->out.cur, which must be of sufficient size. + Unterminated comments are diagnosed, and correctly terminated in + the output. pfile->out.cur is updated depending upon IN_DEFINE, + -C, -CC and pfile->state.in_directive. + + Returns a pointer to the first character after the comment in the + input buffer. */ +static const uchar * +copy_comment (cpp_reader *pfile, const uchar *cur, int in_define) +{ + bool unterminated, copy = false; + source_location src_loc = pfile->line_table->highest_line; + cpp_buffer *buffer = pfile->buffer; + + buffer->cur = cur; + if (pfile->context->prev) + unterminated = false, skip_macro_block_comment (pfile); + else + unterminated = _cpp_skip_block_comment (pfile); + + if (unterminated) + cpp_error_with_line (pfile, CPP_DL_ERROR, src_loc, 0, + "unterminated comment"); + + /* Comments in directives become spaces so that tokens are properly + separated when the ISO preprocessor re-lexes the line. The + exception is #define. */ + if (pfile->state.in_directive) + { + if (in_define) + { + if (CPP_OPTION (pfile, discard_comments_in_macro_exp)) + pfile->out.cur--; + else + copy = true; + } + else + pfile->out.cur[-1] = ' '; + } + else if (CPP_OPTION (pfile, discard_comments)) + pfile->out.cur--; + else + copy = true; + + if (copy) + { + size_t len = (size_t) (buffer->cur - cur); + memcpy (pfile->out.cur, cur, len); + pfile->out.cur += len; + if (unterminated) + { + *pfile->out.cur++ = '*'; + *pfile->out.cur++ = '/'; + } + } + + return buffer->cur; +} + +/* CUR points to any character in the input buffer. Skips over all + contiguous horizontal white space and NULs, including comments if + SKIP_COMMENTS, until reaching the first non-horizontal-whitespace + character or the end of the current context. Escaped newlines are + removed. + + The whitespace is copied verbatim to the output buffer, except that + comments are handled as described in copy_comment(). + pfile->out.cur is updated. + + Returns a pointer to the first character after the whitespace in + the input buffer. */ +static const uchar * +skip_whitespace (cpp_reader *pfile, const uchar *cur, int skip_comments) +{ + uchar *out = pfile->out.cur; + + for (;;) + { + unsigned int c = *cur++; + *out++ = c; + + if (is_nvspace (c)) + continue; + + if (c == '/' && *cur == '*' && skip_comments) + { + pfile->out.cur = out; + cur = copy_comment (pfile, cur, false /* in_define */); + out = pfile->out.cur; + continue; + } + + out--; + break; + } + + pfile->out.cur = out; + return cur - 1; +} + +/* Lexes and outputs an identifier starting at CUR, which is assumed + to point to a valid first character of an identifier. Returns + the hashnode, and updates out.cur. */ +static cpp_hashnode * +lex_identifier (cpp_reader *pfile, const uchar *cur) +{ + size_t len; + uchar *out = pfile->out.cur; + cpp_hashnode *result; + + do + *out++ = *cur++; + while (is_numchar (*cur)); + + CUR (pfile->context) = cur; + len = out - pfile->out.cur; + result = (cpp_hashnode *) ht_lookup (pfile->hash_table, pfile->out.cur, + len, HT_ALLOC); + pfile->out.cur = out; + return result; +} + +/* Overlays the true file buffer temporarily with text of length LEN + starting at START. The true buffer is restored upon calling + restore_buff(). */ +void +_cpp_overlay_buffer (cpp_reader *pfile, const uchar *start, size_t len) +{ + cpp_buffer *buffer = pfile->buffer; + + pfile->overlaid_buffer = buffer; + pfile->saved_cur = buffer->cur; + pfile->saved_rlimit = buffer->rlimit; + pfile->saved_line_base = buffer->next_line; + buffer->need_line = false; + + buffer->cur = start; + buffer->line_base = start; + buffer->rlimit = start + len; +} + +/* Restores a buffer overlaid by _cpp_overlay_buffer(). */ +void +_cpp_remove_overlay (cpp_reader *pfile) +{ + cpp_buffer *buffer = pfile->overlaid_buffer; + + buffer->cur = pfile->saved_cur; + buffer->rlimit = pfile->saved_rlimit; + buffer->line_base = pfile->saved_line_base; + buffer->need_line = true; + + pfile->overlaid_buffer = NULL; +} + +/* Reads a logical line into the output buffer. Returns TRUE if there + is more text left in the buffer. */ +bool +_cpp_read_logical_line_trad (cpp_reader *pfile) +{ + do + { + if (pfile->buffer->need_line && !_cpp_get_fresh_line (pfile)) + return false; + } + while (!_cpp_scan_out_logical_line (pfile, NULL) || pfile->state.skipping); + + return pfile->buffer != NULL; +} + +/* Set up state for finding the opening '(' of a function-like + macro. */ +static void +maybe_start_funlike (cpp_reader *pfile, cpp_hashnode *node, const uchar *start, struct fun_macro *macro) +{ + unsigned int n = node->value.macro->paramc + 1; + + if (macro->buff) + _cpp_release_buff (pfile, macro->buff); + macro->buff = _cpp_get_buff (pfile, n * sizeof (size_t)); + macro->args = (size_t *) BUFF_FRONT (macro->buff); + macro->node = node; + macro->offset = start - pfile->out.base; + macro->argc = 0; +} + +/* Save the OFFSET of the start of the next argument to MACRO. */ +static void +save_argument (struct fun_macro *macro, size_t offset) +{ + macro->argc++; + if (macro->argc <= macro->node->value.macro->paramc) + macro->args[macro->argc] = offset; +} + +/* Copies the next logical line in the current buffer (starting at + buffer->cur) to the output buffer. The output is guaranteed to + terminate with a NUL character. buffer->cur is updated. + + If MACRO is non-NULL, then we are scanning the replacement list of + MACRO, and we call save_replacement_text() every time we meet an + argument. */ +bool +_cpp_scan_out_logical_line (cpp_reader *pfile, cpp_macro *macro) +{ + bool result = true; + cpp_context *context; + const uchar *cur; + uchar *out; + struct fun_macro fmacro; + unsigned int c, paren_depth = 0, quote; + enum ls lex_state = ls_none; + bool header_ok; + const uchar *start_of_input_line; + + fmacro.buff = NULL; + fmacro.args = NULL; + fmacro.node = NULL; + fmacro.offset = 0; + fmacro.line = 0; + fmacro.argc = 0; + + quote = 0; + header_ok = pfile->state.angled_headers; + CUR (pfile->context) = pfile->buffer->cur; + RLIMIT (pfile->context) = pfile->buffer->rlimit; + pfile->out.cur = pfile->out.base; + pfile->out.first_line = pfile->line_table->highest_line; + /* start_of_input_line is needed to make sure that directives really, + really start at the first character of the line. */ + start_of_input_line = pfile->buffer->cur; + new_context: + context = pfile->context; + cur = CUR (context); + check_output_buffer (pfile, RLIMIT (context) - cur); + out = pfile->out.cur; + + for (;;) + { + if (!context->prev + && cur >= pfile->buffer->notes[pfile->buffer->cur_note].pos) + { + pfile->buffer->cur = cur; + _cpp_process_line_notes (pfile, false); + } + c = *cur++; + *out++ = c; + + /* Whitespace should "continue" out of the switch, + non-whitespace should "break" out of it. */ + switch (c) + { + case ' ': + case '\t': + case '\f': + case '\v': + case '\0': + continue; + + case '\n': + /* If this is a macro's expansion, pop it. */ + if (context->prev) + { + pfile->out.cur = out - 1; + _cpp_pop_context (pfile); + goto new_context; + } + + /* Omit the newline from the output buffer. */ + pfile->out.cur = out - 1; + pfile->buffer->cur = cur; + pfile->buffer->need_line = true; + CPP_INCREMENT_LINE (pfile, 0); + + if ((lex_state == ls_fun_open || lex_state == ls_fun_close) + && !pfile->state.in_directive + && _cpp_get_fresh_line (pfile)) + { + /* Newlines in arguments become a space, but we don't + clear any in-progress quote. */ + if (lex_state == ls_fun_close) + out[-1] = ' '; + cur = pfile->buffer->cur; + continue; + } + goto done; + + case '<': + if (header_ok) + quote = '>'; + break; + case '>': + if (c == quote) + quote = 0; + break; + + case '"': + case '\'': + if (c == quote) + quote = 0; + else if (!quote) + quote = c; + break; + + case '\\': + /* Skip escaped quotes here, it's easier than above. */ + if (*cur == '\\' || *cur == '"' || *cur == '\'') + *out++ = *cur++; + break; + + case '/': + /* Traditional CPP does not recognize comments within + literals. */ + if (!quote && *cur == '*') + { + pfile->out.cur = out; + cur = copy_comment (pfile, cur, macro != 0); + out = pfile->out.cur; + continue; + } + break; + + case '_': + case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': + case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': + case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': + case 's': case 't': case 'u': case 'v': case 'w': case 'x': + case 'y': case 'z': + case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': + case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': + case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': + case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': + case 'Y': case 'Z': + if (!pfile->state.skipping && (quote == 0 || macro)) + { + cpp_hashnode *node; + uchar *out_start = out - 1; + + pfile->out.cur = out_start; + node = lex_identifier (pfile, cur - 1); + out = pfile->out.cur; + cur = CUR (context); + + if (node->type == NT_MACRO + /* Should we expand for ls_answer? */ + && (lex_state == ls_none || lex_state == ls_fun_open) + && !pfile->state.prevent_expansion) + { + /* Macros invalidate MI optimization. */ + pfile->mi_valid = false; + if (! (node->flags & NODE_BUILTIN) + && node->value.macro->fun_like) + { + maybe_start_funlike (pfile, node, out_start, &fmacro); + lex_state = ls_fun_open; + fmacro.line = pfile->line_table->highest_line; + continue; + } + else if (!recursive_macro (pfile, node)) + { + /* Remove the object-like macro's name from the + output, and push its replacement text. */ + pfile->out.cur = out_start; + push_replacement_text (pfile, node); + lex_state = ls_none; + goto new_context; + } + } + else if (macro && (node->flags & NODE_MACRO_ARG) != 0) + { + /* Found a parameter in the replacement text of a + #define. Remove its name from the output. */ + pfile->out.cur = out_start; + save_replacement_text (pfile, macro, node->value.arg_index); + out = pfile->out.base; + } + else if (lex_state == ls_hash) + { + lex_state = ls_predicate; + continue; + } + else if (pfile->state.in_expression + && node == pfile->spec_nodes.n_defined) + { + lex_state = ls_defined; + continue; + } + } + break; + + case '(': + if (quote == 0) + { + paren_depth++; + if (lex_state == ls_fun_open) + { + if (recursive_macro (pfile, fmacro.node)) + lex_state = ls_none; + else + { + lex_state = ls_fun_close; + paren_depth = 1; + out = pfile->out.base + fmacro.offset; + fmacro.args[0] = fmacro.offset; + } + } + else if (lex_state == ls_predicate) + lex_state = ls_answer; + else if (lex_state == ls_defined) + lex_state = ls_defined_close; + } + break; + + case ',': + if (quote == 0 && lex_state == ls_fun_close && paren_depth == 1) + save_argument (&fmacro, out - pfile->out.base); + break; + + case ')': + if (quote == 0) + { + paren_depth--; + if (lex_state == ls_fun_close && paren_depth == 0) + { + cpp_macro *m = fmacro.node->value.macro; + + m->used = 1; + lex_state = ls_none; + save_argument (&fmacro, out - pfile->out.base); + + /* A single zero-length argument is no argument. */ + if (fmacro.argc == 1 + && m->paramc == 0 + && out == pfile->out.base + fmacro.offset + 1) + fmacro.argc = 0; + + if (_cpp_arguments_ok (pfile, m, fmacro.node, fmacro.argc)) + { + /* Remove the macro's invocation from the + output, and push its replacement text. */ + pfile->out.cur = (pfile->out.base + + fmacro.offset); + CUR (context) = cur; + replace_args_and_push (pfile, &fmacro); + goto new_context; + } + } + else if (lex_state == ls_answer || lex_state == ls_defined_close) + lex_state = ls_none; + } + break; + + case '#': + if (cur - 1 == start_of_input_line + /* A '#' from a macro doesn't start a directive. */ + && !pfile->context->prev + && !pfile->state.in_directive) + { + /* A directive. With the way _cpp_handle_directive + currently works, we only want to call it if either we + know the directive is OK, or we want it to fail and + be removed from the output. If we want it to be + passed through (the assembler case) then we must not + call _cpp_handle_directive. */ + pfile->out.cur = out; + cur = skip_whitespace (pfile, cur, true /* skip_comments */); + out = pfile->out.cur; + + if (*cur == '\n') + { + /* Null directive. Ignore it and don't invalidate + the MI optimization. */ + pfile->buffer->need_line = true; + CPP_INCREMENT_LINE (pfile, 0); + result = false; + goto done; + } + else + { + bool do_it = false; + + if (is_numstart (*cur) + && CPP_OPTION (pfile, lang) != CLK_ASM) + do_it = true; + else if (is_idstart (*cur)) + /* Check whether we know this directive, but don't + advance. */ + do_it = lex_identifier (pfile, cur)->is_directive; + + if (do_it || CPP_OPTION (pfile, lang) != CLK_ASM) + { + /* This is a kludge. We want to have the ISO + preprocessor lex the next token. */ + pfile->buffer->cur = cur; + _cpp_handle_directive (pfile, false /* indented */); + result = false; + goto done; + } + } + } + + if (pfile->state.in_expression) + { + lex_state = ls_hash; + continue; + } + break; + + default: + break; + } + + /* Non-whitespace disables MI optimization and stops treating + '<' as a quote in #include. */ + header_ok = false; + if (!pfile->state.in_directive) + pfile->mi_valid = false; + + if (lex_state == ls_none) + continue; + + /* Some of these transitions of state are syntax errors. The + ISO preprocessor will issue errors later. */ + if (lex_state == ls_fun_open) + /* Missing '('. */ + lex_state = ls_none; + else if (lex_state == ls_hash + || lex_state == ls_predicate + || lex_state == ls_defined) + lex_state = ls_none; + + /* ls_answer and ls_defined_close keep going until ')'. */ + } + + done: + if (fmacro.buff) + _cpp_release_buff (pfile, fmacro.buff); + + if (lex_state == ls_fun_close) + cpp_error_with_line (pfile, CPP_DL_ERROR, fmacro.line, 0, + "unterminated argument list invoking macro \"%s\"", + NODE_NAME (fmacro.node)); + return result; +} + +/* Push a context holding the replacement text of the macro NODE on + the context stack. NODE is either object-like, or a function-like + macro with no arguments. */ +static void +push_replacement_text (cpp_reader *pfile, cpp_hashnode *node) +{ + size_t len; + const uchar *text; + uchar *buf; + + if (node->flags & NODE_BUILTIN) + { + text = _cpp_builtin_macro_text (pfile, node); + len = ustrlen (text); + buf = _cpp_unaligned_alloc (pfile, len + 1); + memcpy (buf, text, len); + buf[len]='\n'; + text = buf; + } + else + { + cpp_macro *macro = node->value.macro; + macro->used = 1; + text = macro->exp.text; + macro->traditional = 1; + len = macro->count; + } + + _cpp_push_text_context (pfile, node, text, len); +} + +/* Returns TRUE if traditional macro recursion is detected. */ +static bool +recursive_macro (cpp_reader *pfile, cpp_hashnode *node) +{ + bool recursing = !!(node->flags & NODE_DISABLED); + + /* Object-like macros that are already expanding are necessarily + recursive. + + However, it is possible to have traditional function-like macros + that are not infinitely recursive but recurse to any given depth. + Further, it is easy to construct examples that get ever longer + until the point they stop recursing. So there is no easy way to + detect true recursion; instead we assume any expansion more than + 20 deep since the first invocation of this macro must be + recursing. */ + if (recursing && node->value.macro->fun_like) + { + size_t depth = 0; + cpp_context *context = pfile->context; + + do + { + depth++; + if (context->macro == node && depth > 20) + break; + context = context->prev; + } + while (context); + recursing = context != NULL; + } + + if (recursing) + cpp_error (pfile, CPP_DL_ERROR, + "detected recursion whilst expanding macro \"%s\"", + NODE_NAME (node)); + + return recursing; +} + +/* Return the length of the replacement text of a function-like or + object-like non-builtin macro. */ +size_t +_cpp_replacement_text_len (const cpp_macro *macro) +{ + size_t len; + + if (macro->fun_like && (macro->paramc != 0)) + { + const uchar *exp; + + len = 0; + for (exp = macro->exp.text;;) + { + struct block *b = (struct block *) exp; + + len += b->text_len; + if (b->arg_index == 0) + break; + len += NODE_LEN (macro->params[b->arg_index - 1]); + exp += BLOCK_LEN (b->text_len); + } + } + else + len = macro->count; + + return len; +} + +/* Copy the replacement text of MACRO to DEST, which must be of + sufficient size. It is not NUL-terminated. The next character is + returned. */ +uchar * +_cpp_copy_replacement_text (const cpp_macro *macro, uchar *dest) +{ + if (macro->fun_like && (macro->paramc != 0)) + { + const uchar *exp; + + for (exp = macro->exp.text;;) + { + struct block *b = (struct block *) exp; + cpp_hashnode *param; + + memcpy (dest, b->text, b->text_len); + dest += b->text_len; + if (b->arg_index == 0) + break; + param = macro->params[b->arg_index - 1]; + memcpy (dest, NODE_NAME (param), NODE_LEN (param)); + dest += NODE_LEN (param); + exp += BLOCK_LEN (b->text_len); + } + } + else + { + memcpy (dest, macro->exp.text, macro->count); + dest += macro->count; + } + + return dest; +} + +/* Push a context holding the replacement text of the macro NODE on + the context stack. NODE is either object-like, or a function-like + macro with no arguments. */ +static void +replace_args_and_push (cpp_reader *pfile, struct fun_macro *fmacro) +{ + cpp_macro *macro = fmacro->node->value.macro; + + if (macro->paramc == 0) + push_replacement_text (pfile, fmacro->node); + else + { + const uchar *exp; + uchar *p; + _cpp_buff *buff; + size_t len = 0; + int cxtquote = 0; + + /* Get an estimate of the length of the argument-replaced text. + This is a worst case estimate, assuming that every replacement + text character needs quoting. */ + for (exp = macro->exp.text;;) + { + struct block *b = (struct block *) exp; + + len += b->text_len; + if (b->arg_index == 0) + break; + len += 2 * (fmacro->args[b->arg_index] + - fmacro->args[b->arg_index - 1] - 1); + exp += BLOCK_LEN (b->text_len); + } + + /* Allocate room for the expansion plus \n. */ + buff = _cpp_get_buff (pfile, len + 1); + + /* Copy the expansion and replace arguments. */ + /* Accumulate actual length, including quoting as necessary */ + p = BUFF_FRONT (buff); + len = 0; + for (exp = macro->exp.text;;) + { + struct block *b = (struct block *) exp; + size_t arglen; + int argquote; + uchar *base; + uchar *in; + + len += b->text_len; + /* Copy the non-argument text literally, keeping + track of whether matching quotes have been seen. */ + for (arglen = b->text_len, in = b->text; arglen > 0; arglen--) + { + if (*in == '"') + cxtquote = ! cxtquote; + *p++ = *in++; + } + /* Done if no more arguments */ + if (b->arg_index == 0) + break; + arglen = (fmacro->args[b->arg_index] + - fmacro->args[b->arg_index - 1] - 1); + base = pfile->out.base + fmacro->args[b->arg_index - 1]; + in = base; +#if 0 + /* Skip leading whitespace in the text for the argument to + be substituted. To be compatible with gcc 2.95, we would + also need to trim trailing whitespace. Gcc 2.95 trims + leading and trailing whitespace, which may be a bug. The + current gcc testsuite explicitly checks that this leading + and trailing whitespace in actual arguments is + preserved. */ + while (arglen > 0 && is_space (*in)) + { + in++; + arglen--; + } +#endif + for (argquote = 0; arglen > 0; arglen--) + { + if (cxtquote && *in == '"') + { + if (in > base && *(in-1) != '\\') + argquote = ! argquote; + /* Always add backslash before double quote if argument + is expanded in a quoted context */ + *p++ = '\\'; + len++; + } + else if (cxtquote && argquote && *in == '\\') + { + /* Always add backslash before a backslash in an argument + that is expanded in a quoted context and also in the + range of a quoted context in the argument itself. */ + *p++ = '\\'; + len++; + } + *p++ = *in++; + len++; + } + exp += BLOCK_LEN (b->text_len); + } + + /* \n-terminate. */ + *p = '\n'; + _cpp_push_text_context (pfile, fmacro->node, BUFF_FRONT (buff), len); + + /* So we free buffer allocation when macro is left. */ + pfile->context->buff = buff; + } +} + +/* Read and record the parameters, if any, of a function-like macro + definition. Destroys pfile->out.cur. + + Returns true on success, false on failure (syntax error or a + duplicate parameter). On success, CUR (pfile->context) is just + past the closing parenthesis. */ +static bool +scan_parameters (cpp_reader *pfile, cpp_macro *macro) +{ + const uchar *cur = CUR (pfile->context) + 1; + bool ok; + + for (;;) + { + cur = skip_whitespace (pfile, cur, true /* skip_comments */); + + if (is_idstart (*cur)) + { + ok = false; + if (_cpp_save_parameter (pfile, macro, lex_identifier (pfile, cur))) + break; + cur = skip_whitespace (pfile, CUR (pfile->context), + true /* skip_comments */); + if (*cur == ',') + { + cur++; + continue; + } + ok = (*cur == ')'); + break; + } + + ok = (*cur == ')' && macro->paramc == 0); + break; + } + + if (!ok) + cpp_error (pfile, CPP_DL_ERROR, "syntax error in macro parameter list"); + + CUR (pfile->context) = cur + (*cur == ')'); + + return ok; +} + +/* Save the text from pfile->out.base to pfile->out.cur as + the replacement text for the current macro, followed by argument + ARG_INDEX, with zero indicating the end of the replacement + text. */ +static void +save_replacement_text (cpp_reader *pfile, cpp_macro *macro, + unsigned int arg_index) +{ + size_t len = pfile->out.cur - pfile->out.base; + uchar *exp; + + if (macro->paramc == 0) + { + /* Object-like and function-like macros without parameters + simply store their \n-terminated replacement text. */ + exp = _cpp_unaligned_alloc (pfile, len + 1); + memcpy (exp, pfile->out.base, len); + exp[len] = '\n'; + macro->exp.text = exp; + macro->traditional = 1; + macro->count = len; + } + else + { + /* Store the text's length (unsigned int), the argument index + (unsigned short, base 1) and then the text. */ + size_t blen = BLOCK_LEN (len); + struct block *block; + + if (macro->count + blen > BUFF_ROOM (pfile->a_buff)) + _cpp_extend_buff (pfile, &pfile->a_buff, macro->count + blen); + + exp = BUFF_FRONT (pfile->a_buff); + block = (struct block *) (exp + macro->count); + macro->exp.text = exp; + macro->traditional = 1; + + /* Write out the block information. */ + block->text_len = len; + block->arg_index = arg_index; + memcpy (block->text, pfile->out.base, len); + + /* Lex the rest into the start of the output buffer. */ + pfile->out.cur = pfile->out.base; + + macro->count += blen; + + /* If we've finished, commit the memory. */ + if (arg_index == 0) + BUFF_FRONT (pfile->a_buff) += macro->count; + } +} + +/* Analyze and save the replacement text of a macro. Returns true on + success. */ +bool +_cpp_create_trad_definition (cpp_reader *pfile, cpp_macro *macro) +{ + const uchar *cur; + uchar *limit; + cpp_context *context = pfile->context; + + /* The context has not been set up for command line defines, and CUR + has not been updated for the macro name for in-file defines. */ + pfile->out.cur = pfile->out.base; + CUR (context) = pfile->buffer->cur; + RLIMIT (context) = pfile->buffer->rlimit; + check_output_buffer (pfile, RLIMIT (context) - CUR (context)); + + /* Is this a function-like macro? */ + if (* CUR (context) == '(') + { + bool ok = scan_parameters (pfile, macro); + + /* Remember the params so we can clear NODE_MACRO_ARG flags. */ + macro->params = (cpp_hashnode **) BUFF_FRONT (pfile->a_buff); + + /* Setting macro to NULL indicates an error occurred, and + prevents unnecessary work in _cpp_scan_out_logical_line. */ + if (!ok) + macro = NULL; + else + { + BUFF_FRONT (pfile->a_buff) = (uchar *) ¯o->params[macro->paramc]; + macro->fun_like = 1; + } + } + + /* Skip leading whitespace in the replacement text. */ + pfile->buffer->cur + = skip_whitespace (pfile, CUR (context), + CPP_OPTION (pfile, discard_comments_in_macro_exp)); + + pfile->state.prevent_expansion++; + _cpp_scan_out_logical_line (pfile, macro); + pfile->state.prevent_expansion--; + + if (!macro) + return false; + + /* Skip trailing white space. */ + cur = pfile->out.base; + limit = pfile->out.cur; + while (limit > cur && is_space (limit[-1])) + limit--; + pfile->out.cur = limit; + save_replacement_text (pfile, macro, 0); + + return true; +} + +/* Copy SRC of length LEN to DEST, but convert all contiguous + whitespace to a single space, provided it is not in quotes. The + quote currently in effect is pointed to by PQUOTE, and is updated + by the function. Returns the number of bytes copied. */ +static size_t +canonicalize_text (uchar *dest, const uchar *src, size_t len, uchar *pquote) +{ + uchar *orig_dest = dest; + uchar quote = *pquote; + + while (len) + { + if (is_space (*src) && !quote) + { + do + src++, len--; + while (len && is_space (*src)); + *dest++ = ' '; + } + else + { + if (*src == '\'' || *src == '"') + { + if (!quote) + quote = *src; + else if (quote == *src) + quote = 0; + } + *dest++ = *src++, len--; + } + } + + *pquote = quote; + return dest - orig_dest; +} + +/* Returns true if MACRO1 and MACRO2 have expansions different other + than in the form of their whitespace. */ +bool +_cpp_expansions_different_trad (const cpp_macro *macro1, + const cpp_macro *macro2) +{ + uchar *p1 = XNEWVEC (uchar, macro1->count + macro2->count); + uchar *p2 = p1 + macro1->count; + uchar quote1 = 0, quote2 = 0; + bool mismatch; + size_t len1, len2; + + if (macro1->paramc > 0) + { + const uchar *exp1 = macro1->exp.text, *exp2 = macro2->exp.text; + + mismatch = true; + for (;;) + { + struct block *b1 = (struct block *) exp1; + struct block *b2 = (struct block *) exp2; + + if (b1->arg_index != b2->arg_index) + break; + + len1 = canonicalize_text (p1, b1->text, b1->text_len, "e1); + len2 = canonicalize_text (p2, b2->text, b2->text_len, "e2); + if (len1 != len2 || memcmp (p1, p2, len1)) + break; + if (b1->arg_index == 0) + { + mismatch = false; + break; + } + exp1 += BLOCK_LEN (b1->text_len); + exp2 += BLOCK_LEN (b2->text_len); + } + } + else + { + len1 = canonicalize_text (p1, macro1->exp.text, macro1->count, "e1); + len2 = canonicalize_text (p2, macro2->exp.text, macro2->count, "e2); + mismatch = (len1 != len2 || memcmp (p1, p2, len1)); + } + + free (p1); + return mismatch; +} diff --git a/libcpp/ucnid.h b/libcpp/ucnid.h new file mode 100644 index 0000000..7323dcc --- /dev/null +++ b/libcpp/ucnid.h @@ -0,0 +1,801 @@ +/* Unicode characters and various properties. + Copyright (C) 2003, 2005 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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + + Copyright (C) 1991-2005 Unicode, Inc. All rights reserved. + Distributed under the Terms of Use in + http://www.unicode.org/copyright.html. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of the Unicode data files and any associated + documentation (the "Data Files") or Unicode software and any + associated documentation (the "Software") to deal in the Data Files + or Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, and/or + sell copies of the Data Files or Software, and to permit persons to + whom the Data Files or Software are furnished to do so, provided + that (a) the above copyright notice(s) and this permission notice + appear with all copies of the Data Files or Software, (b) both the + above copyright notice(s) and this permission notice appear in + associated documentation, and (c) there is clear notice in each + modified Data File or in the Software as well as in the + documentation associated with the Data File(s) or Software that the + data or software has been modified. + + THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY + OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE + COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR + ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY + DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS + ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + OF THE DATA FILES OR SOFTWARE. + + Except as contained in this notice, the name of a copyright holder + shall not be used in advertising or otherwise to promote the sale, + use or other dealings in these Data Files or Software without prior + written authorization of the copyright holder. */ + +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x00a9 }, +{ C99| 0| 0|CID|NFC| 0| 0, 0, 0x00aa }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x00b4 }, +{ C99| 0| 0|CID|NFC| 0| 0, 0, 0x00b5 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x00b6 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x00b7 }, +{ 0| 0| 0|CID|NFC| 0| 0, 0, 0x00b9 }, +{ C99| 0| 0|CID|NFC| 0| 0, 0, 0x00ba }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x00bf }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x00d6 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x00d7 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x00f6 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x00f7 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0131 }, +{ C99| 0|CXX|CID|NFC| 0| 0, 0, 0x0133 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x013e }, +{ C99| 0|CXX|CID|NFC| 0| 0, 0, 0x0140 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0148 }, +{ C99| 0|CXX|CID|NFC| 0| 0, 0, 0x0149 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x017e }, +{ C99| 0|CXX|CID|NFC| 0| 0, 0, 0x017f }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x01c3 }, +{ C99| 0|CXX|CID|NFC| 0| 0, 0, 0x01cc }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x01f0 }, +{ C99| 0|CXX|CID|NFC| 0| 0, 0, 0x01f3 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x01f5 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x01f9 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0217 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x024f }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x02a8 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x02af }, +{ C99| 0| 0|CID|NFC| 0| 0, 0, 0x02b8 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x02ba }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x02bb }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x02bc }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x02c1 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x02cf }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x02d1 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x02df }, +{ C99| 0| 0|CID|NFC| 0| 0, 0, 0x02e4 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0379 }, +{ C99| 0| 0|CID|NFC| 0| 0, 0, 0x037a }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0383 }, +{ 0| 0|CXX|CID|NFC| 0| 0, 0, 0x0384 }, +{ 0| 0| 0|CID|NFC| 0| 0, 0, 0x0385 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0386 }, +{ 0| 0| 0|CID| 0| 0| 0, 0, 0x0387 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x038a }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x038b }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x038c }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x038d }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x03a1 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x03a2 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x03ce }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x03cf }, +{ C99| 0|CXX|CID|NFC| 0| 0, 0, 0x03d6 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x03d9 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x03da }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x03db }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x03dc }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x03dd }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x03de }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x03df }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x03e0 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x03e1 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x03ef }, +{ C99| 0|CXX|CID|NFC| 0| 0, 0, 0x03f2 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x03f3 }, +{ 0| 0| 0|CID|NFC| 0| 0, 0, 0x0400 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x040c }, +{ 0| 0|CXX|CID|NFC|NKC| 0, 0, 0x040d }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x040e }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x044f }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0450 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x045c }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x045d }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0481 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x048f }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x04c4 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x04c6 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x04c8 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x04ca }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x04cc }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x04cf }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x04eb }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x04ed }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x04f5 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x04f7 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x04f9 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0530 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0556 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0558 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0559 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0560 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0586 }, +{ C99| 0|CXX|CID|NFC| 0| 0, 0, 0x0587 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x05af }, +{ C99| 0| 0|CID|NFC|NKC| 0, 10, 0x05b0 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 11, 0x05b1 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 12, 0x05b2 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 13, 0x05b3 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 14, 0x05b4 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 15, 0x05b5 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 16, 0x05b6 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 17, 0x05b7 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 18, 0x05b8 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 19, 0x05b9 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x05ba }, +{ C99| 0| 0|CID|NFC|NKC| 0, 20, 0x05bb }, +{ C99| 0| 0|CID|NFC|NKC| 0, 21, 0x05bc }, +{ C99| 0| 0|CID|NFC|NKC| 0, 22, 0x05bd }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x05be }, +{ C99| 0| 0|CID|NFC|NKC| 0, 23, 0x05bf }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x05c0 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 24, 0x05c1 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 25, 0x05c2 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x05cf }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x05ea }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x05ef }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x05f2 }, +{ 0| 0|CXX|CID|NFC|NKC| 0, 0, 0x05f4 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0620 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x063a }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x063f }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x064a }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 27, 0x064b }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 28, 0x064c }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 29, 0x064d }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 30, 0x064e }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 31, 0x064f }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 32, 0x0650 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 33, 0x0651 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 34, 0x0652 }, +{ 0| 0| 0|CID|NFC|NKC|CTX, 0, 0x065f }, +{ C99|DIG| 0|CID|NFC|NKC| 0, 0, 0x0669 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x066f }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0674 }, +{ C99| 0|CXX|CID|NFC| 0| 0, 0, 0x0678 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x06b7 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x06b9 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x06be }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x06bf }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x06ce }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x06cf }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x06d5 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 230, 0x06d6 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 230, 0x06d7 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 230, 0x06d8 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 230, 0x06d9 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 230, 0x06da }, +{ C99| 0| 0|CID|NFC|NKC| 0, 230, 0x06db }, +{ C99| 0| 0|CID|NFC|NKC| 0, 230, 0x06dc }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x06e4 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x06e6 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 230, 0x06e7 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 230, 0x06e8 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x06e9 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 220, 0x06ea }, +{ C99| 0| 0|CID|NFC|NKC| 0, 230, 0x06eb }, +{ C99| 0| 0|CID|NFC|NKC| 0, 230, 0x06ec }, +{ C99| 0| 0|CID|NFC|NKC| 0, 220, 0x06ed }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x06ef }, +{ C99|DIG| 0|CID|NFC|NKC| 0, 0, 0x06f9 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0900 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0903 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0904 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0939 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x093c }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x094c }, +{ C99| 0| 0|CID|NFC|NKC| 0, 9, 0x094d }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x094f }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0950 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 230, 0x0951 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 220, 0x0952 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0957 }, +{ C99| 0|CXX|CID| 0| 0| 0, 0, 0x095f }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0962 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0963 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0965 }, +{ C99|DIG| 0|CID|NFC|NKC| 0, 0, 0x096f }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0980 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0983 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0984 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x098c }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x098e }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0990 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0992 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x09a8 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x09a9 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x09b0 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x09b1 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x09b2 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x09b5 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x09b9 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x09bd }, +{ C99| 0| 0|CID|NFC|NKC|CTX, 0, 0x09be }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x09c4 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x09c6 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x09c8 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x09ca }, +{ C99| 0| 0| 0|NFC|NKC| 0, 0, 0x09cb }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x09cc }, +{ C99| 0| 0|CID|NFC|NKC| 0, 9, 0x09cd }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x09db }, +{ C99| 0|CXX|CID| 0| 0| 0, 0, 0x09dd }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x09de }, +{ C99| 0|CXX|CID| 0| 0| 0, 0, 0x09df }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x09e1 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x09e3 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x09e5 }, +{ C99|DIG| 0|CID|NFC|NKC| 0, 0, 0x09ef }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x09f1 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0a01 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0a02 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0a04 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0a0a }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0a0e }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0a10 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0a12 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0a28 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0a29 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0a30 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0a31 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0a32 }, +{ C99| 0|CXX|CID| 0| 0| 0, 0, 0x0a33 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0a34 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0a35 }, +{ C99| 0|CXX|CID| 0| 0| 0, 0, 0x0a36 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0a37 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0a39 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0a3d }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0a42 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0a46 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0a48 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0a4a }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0a4c }, +{ C99| 0| 0|CID|NFC|NKC| 0, 9, 0x0a4d }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0a58 }, +{ C99| 0|CXX|CID| 0| 0| 0, 0, 0x0a5b }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0a5c }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0a5d }, +{ C99| 0|CXX|CID| 0| 0| 0, 0, 0x0a5e }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0a65 }, +{ C99|DIG| 0|CID|NFC|NKC| 0, 0, 0x0a6f }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0a73 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0a74 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0a80 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0a83 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0a84 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0a8b }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0a8c }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0a8d }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0a8e }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0a91 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0a92 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0aa8 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0aa9 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0ab0 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0ab1 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0ab3 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0ab4 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0ab9 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0abc }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0ac5 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0ac6 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0ac9 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0aca }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0acc }, +{ C99| 0| 0|CID|NFC|NKC| 0, 9, 0x0acd }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0acf }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0ad0 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0adf }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0ae0 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0ae5 }, +{ C99|DIG| 0|CID|NFC|NKC| 0, 0, 0x0aef }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0b00 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0b03 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0b04 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0b0c }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0b0e }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0b10 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0b12 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0b28 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0b29 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0b30 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0b31 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0b33 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0b35 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0b39 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0b3c }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0b3d }, +{ C99| 0| 0|CID|NFC|NKC|CTX, 0, 0x0b3e }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0b43 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0b46 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0b48 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0b4a }, +{ C99| 0| 0| 0|NFC|NKC| 0, 0, 0x0b4b }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0b4c }, +{ C99| 0| 0|CID|NFC|NKC| 0, 9, 0x0b4d }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0b5b }, +{ C99| 0|CXX|CID| 0| 0| 0, 0, 0x0b5d }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0b5e }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0b61 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0b65 }, +{ C99|DIG| 0|CID|NFC|NKC| 0, 0, 0x0b6f }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0b81 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0b83 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0b84 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0b8a }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0b8d }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0b90 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0b91 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0b95 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0b98 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0b9a }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0b9b }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0b9c }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0b9d }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0b9f }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0ba2 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0ba4 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0ba7 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0baa }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0bad }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0bb5 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0bb6 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0bb9 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0bbd }, +{ C99| 0| 0|CID|NFC|NKC|CTX, 0, 0x0bbe }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0bc2 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0bc5 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0bc8 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0bc9 }, +{ C99| 0| 0| 0|NFC|NKC| 0, 0, 0x0bcb }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0bcc }, +{ C99| 0| 0|CID|NFC|NKC| 0, 9, 0x0bcd }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0be6 }, +{ C99|DIG| 0|CID|NFC|NKC| 0, 0, 0x0bef }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0c00 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0c03 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0c04 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0c0c }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0c0d }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0c10 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0c11 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0c28 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0c29 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0c33 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0c34 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0c39 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0c3d }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0c44 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0c45 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0c48 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0c49 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0c4c }, +{ C99| 0| 0|CID|NFC|NKC| 0, 9, 0x0c4d }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0c5f }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0c61 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0c65 }, +{ C99|DIG| 0|CID|NFC|NKC| 0, 0, 0x0c6f }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0c81 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0c83 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0c84 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0c8c }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0c8d }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0c90 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0c91 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0ca8 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0ca9 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0cb3 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0cb4 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0cb9 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0cbd }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0cc1 }, +{ C99| 0| 0|CID|NFC|NKC|CTX, 0, 0x0cc2 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0cc4 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0cc5 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0cc8 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0cc9 }, +{ C99| 0| 0| 0|NFC|NKC| 0, 0, 0x0cca }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0ccc }, +{ C99| 0| 0|CID|NFC|NKC| 0, 9, 0x0ccd }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0cdd }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0cde }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0cdf }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0ce1 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0ce5 }, +{ C99|DIG| 0|CID|NFC|NKC| 0, 0, 0x0cef }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0d01 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0d03 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0d04 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0d0c }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0d0d }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0d10 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0d11 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0d28 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0d29 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0d39 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0d3d }, +{ C99| 0| 0|CID|NFC|NKC|CTX, 0, 0x0d3e }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0d43 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0d45 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0d48 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0d49 }, +{ C99| 0| 0| 0|NFC|NKC| 0, 0, 0x0d4b }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0d4c }, +{ C99| 0| 0|CID|NFC|NKC| 0, 9, 0x0d4d }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0d5f }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0d61 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0d65 }, +{ C99|DIG| 0|CID|NFC|NKC| 0, 0, 0x0d6f }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0e00 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0e30 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0e31 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0e32 }, +{ C99| 0|CXX|CID|NFC| 0| 0, 0, 0x0e33 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0e37 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 103, 0x0e38 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 103, 0x0e39 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 9, 0x0e3a }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0e3f }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0e46 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0e47 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 107, 0x0e48 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 107, 0x0e49 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0e4e }, +{ 0| 0|CXX|CID|NFC|NKC| 0, 0, 0x0e4f }, +{ C99|DIG|CXX|CID|NFC|NKC| 0, 0, 0x0e59 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0e5b }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0e80 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0e82 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0e83 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0e84 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0e86 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0e88 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0e89 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0e8a }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0e8c }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0e8d }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0e93 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0e97 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0e98 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0e9f }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0ea0 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0ea3 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0ea4 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0ea5 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0ea6 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0ea7 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0ea9 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0eab }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0eac }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0eae }, +{ 0| 0|CXX|CID|NFC|NKC| 0, 0, 0x0eaf }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0eb0 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0eb1 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0eb2 }, +{ C99| 0|CXX|CID|NFC| 0| 0, 0, 0x0eb3 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0eb7 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 118, 0x0eb8 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 118, 0x0eb9 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0eba }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0ebc }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0ebd }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0ebf }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0ec4 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0ec5 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x0ec6 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0ec7 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 122, 0x0ec8 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 122, 0x0ec9 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 122, 0x0eca }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0ecd }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0ecf }, +{ C99|DIG| 0|CID|NFC|NKC| 0, 0, 0x0ed9 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0edb }, +{ C99| 0| 0|CID|NFC| 0| 0, 0, 0x0edd }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0eff }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0f00 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0f17 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 220, 0x0f18 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 220, 0x0f19 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0f1f }, +{ C99|DIG| 0|CID|NFC|NKC| 0, 0, 0x0f33 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0f34 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 220, 0x0f35 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0f36 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 220, 0x0f37 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0f38 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 216, 0x0f39 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0f3d }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0f42 }, +{ C99| 0| 0| 0| 0| 0| 0, 0, 0x0f43 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0f47 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0f48 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0f4c }, +{ C99| 0| 0| 0| 0| 0| 0, 0, 0x0f4d }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0f51 }, +{ C99| 0| 0| 0| 0| 0| 0, 0, 0x0f52 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0f56 }, +{ C99| 0| 0| 0| 0| 0| 0, 0, 0x0f57 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0f5b }, +{ C99| 0| 0| 0| 0| 0| 0, 0, 0x0f5c }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0f68 }, +{ C99| 0| 0| 0| 0| 0| 0, 0, 0x0f69 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0f70 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 129, 0x0f71 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 130, 0x0f72 }, +{ C99| 0| 0| 0| 0| 0| 0, 0, 0x0f73 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 132, 0x0f74 }, +{ C99| 0| 0| 0| 0| 0| 0, 0, 0x0f76 }, +{ C99| 0| 0|CID|NFC| 0| 0, 0, 0x0f77 }, +{ C99| 0| 0| 0| 0| 0| 0, 0, 0x0f78 }, +{ C99| 0| 0|CID|NFC| 0| 0, 0, 0x0f79 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 130, 0x0f7a }, +{ C99| 0| 0|CID|NFC|NKC| 0, 130, 0x0f7b }, +{ C99| 0| 0|CID|NFC|NKC| 0, 130, 0x0f7c }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0f7f }, +{ C99| 0| 0|CID|NFC|NKC| 0, 130, 0x0f80 }, +{ C99| 0| 0| 0| 0| 0| 0, 0, 0x0f81 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 230, 0x0f82 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 230, 0x0f83 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 9, 0x0f84 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0f85 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 230, 0x0f86 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0f8b }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0f8f }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0f92 }, +{ C99| 0| 0| 0| 0| 0| 0, 0, 0x0f93 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0f95 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0f96 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0f97 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0f98 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0f9c }, +{ C99| 0| 0| 0| 0| 0| 0, 0, 0x0f9d }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0fa1 }, +{ C99| 0| 0| 0| 0| 0| 0, 0, 0x0fa2 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0fa6 }, +{ C99| 0| 0| 0| 0| 0| 0, 0, 0x0fa7 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0fab }, +{ C99| 0| 0| 0| 0| 0| 0, 0, 0x0fac }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0fad }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0fb0 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x0fb7 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x0fb8 }, +{ C99| 0| 0| 0| 0| 0| 0, 0, 0x0fb9 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x109f }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x10c5 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x10cf }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x10f6 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x10ff }, +{ 0| 0|CXX|CID|NFC|NKC| 0, 0, 0x1159 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x1160 }, +{ 0| 0|CXX|CID|NFC|NKC|CTX, 0, 0x1175 }, +{ 0| 0|CXX|CID|NFC|NKC| 0, 0, 0x11a2 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x11a7 }, +{ 0| 0|CXX|CID|NFC|NKC|CTX, 0, 0x11c2 }, +{ 0| 0|CXX|CID|NFC|NKC| 0, 0, 0x11f9 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x1dff }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x1e99 }, +{ C99| 0|CXX|CID|NFC| 0| 0, 0, 0x1e9a }, +{ C99| 0| 0|CID|NFC| 0| 0, 0, 0x1e9b }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x1e9f }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x1ef9 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x1eff }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x1f15 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x1f17 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x1f1d }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x1f1f }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x1f45 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x1f47 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x1f4d }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x1f4f }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x1f57 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x1f58 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x1f59 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x1f5a }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x1f5b }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x1f5c }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x1f5d }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x1f5e }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x1f70 }, +{ C99| 0|CXX| 0| 0| 0| 0, 0, 0x1f71 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x1f72 }, +{ C99| 0|CXX| 0| 0| 0| 0, 0, 0x1f73 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x1f74 }, +{ C99| 0|CXX| 0| 0| 0| 0, 0, 0x1f75 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x1f76 }, +{ C99| 0|CXX| 0| 0| 0| 0, 0, 0x1f77 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x1f78 }, +{ C99| 0|CXX| 0| 0| 0| 0, 0, 0x1f79 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x1f7a }, +{ C99| 0|CXX| 0| 0| 0| 0, 0, 0x1f7b }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x1f7c }, +{ C99| 0|CXX| 0| 0| 0| 0, 0, 0x1f7d }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x1f7f }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x1fb4 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x1fb5 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x1fba }, +{ C99| 0|CXX| 0| 0| 0| 0, 0, 0x1fbb }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x1fbc }, +{ 0| 0| 0|CID|NFC| 0| 0, 0, 0x1fbd }, +{ C99| 0| 0| 0| 0| 0| 0, 0, 0x1fbe }, +{ 0| 0| 0|CID|NFC| 0| 0, 0, 0x1fc1 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x1fc4 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x1fc5 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x1fc8 }, +{ C99| 0|CXX| 0| 0| 0| 0, 0, 0x1fc9 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x1fca }, +{ C99| 0|CXX| 0| 0| 0| 0, 0, 0x1fcb }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x1fcc }, +{ 0| 0| 0|CID|NFC| 0| 0, 0, 0x1fcf }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x1fd2 }, +{ C99| 0|CXX| 0| 0| 0| 0, 0, 0x1fd3 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x1fd5 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x1fda }, +{ C99| 0|CXX| 0| 0| 0| 0, 0, 0x1fdb }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x1fdf }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x1fe2 }, +{ C99| 0|CXX| 0| 0| 0| 0, 0, 0x1fe3 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x1fea }, +{ C99| 0|CXX| 0| 0| 0| 0, 0, 0x1feb }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x1fec }, +{ 0| 0| 0|CID|NFC| 0| 0, 0, 0x1ff1 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x1ff4 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x1ff5 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x1ff8 }, +{ C99| 0|CXX| 0| 0| 0| 0, 0, 0x1ff9 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x1ffa }, +{ C99| 0|CXX| 0| 0| 0| 0, 0, 0x1ffb }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x1ffc }, +{ 0| 0| 0|CID| 0| 0| 0, 0, 0x203e }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x2040 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x207e }, +{ C99| 0| 0|CID|NFC| 0| 0, 0, 0x207f }, +{ 0| 0| 0|CID|NFC| 0| 0, 0, 0x2101 }, +{ C99| 0| 0|CID|NFC| 0| 0, 0, 0x2102 }, +{ 0| 0| 0|CID|NFC| 0| 0, 0, 0x2106 }, +{ C99| 0| 0|CID|NFC| 0| 0, 0, 0x2107 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x2109 }, +{ C99| 0| 0|CID|NFC| 0| 0, 0, 0x2113 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x2114 }, +{ C99| 0| 0|CID|NFC| 0| 0, 0, 0x2115 }, +{ 0| 0| 0|CID|NFC| 0| 0, 0, 0x2117 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x2118 }, +{ C99| 0| 0|CID|NFC| 0| 0, 0, 0x211d }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x2123 }, +{ C99| 0| 0|CID|NFC| 0| 0, 0, 0x2124 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x2125 }, +{ C99| 0| 0| 0| 0| 0| 0, 0, 0x2126 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x2127 }, +{ C99| 0| 0|CID|NFC| 0| 0, 0, 0x2128 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x2129 }, +{ C99| 0| 0|CID| 0| 0| 0, 0, 0x212a }, +{ C99| 0| 0| 0| 0| 0| 0, 0, 0x212b }, +{ C99| 0| 0|CID|NFC| 0| 0, 0, 0x212d }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x212e }, +{ C99| 0| 0|CID|NFC| 0| 0, 0, 0x2131 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x2132 }, +{ C99| 0| 0|CID|NFC| 0| 0, 0, 0x2138 }, +{ 0| 0| 0|CID|NFC| 0| 0, 0, 0x215f }, +{ C99|DIG| 0|CID|NFC| 0| 0, 0, 0x217f }, +{ C99|DIG| 0|CID|NFC|NKC| 0, 0, 0x2182 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x3004 }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0x3006 }, +{ C99|DIG| 0|CID|NFC|NKC| 0, 0, 0x3007 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x3020 }, +{ C99|DIG| 0|CID|NFC|NKC| 0, 0, 0x3029 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x3040 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x3093 }, +{ 0| 0|CXX|CID|NFC|NKC| 0, 0, 0x3094 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x309a }, +{ C99| 0|CXX|CID|NFC| 0| 0, 0, 0x309c }, +{ 0| 0|CXX|CID|NFC|NKC| 0, 0, 0x309e }, +{ 0| 0| 0|CID|NFC| 0| 0, 0, 0x30a0 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x30f6 }, +{ 0| 0|CXX|CID|NFC|NKC| 0, 0, 0x30fa }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x30fc }, +{ 0| 0|CXX|CID|NFC|NKC| 0, 0, 0x30fe }, +{ 0| 0| 0|CID|NFC| 0| 0, 0, 0x3104 }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x312c }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0x4dff }, +{ C99| 0|CXX|CID|NFC|NKC| 0, 0, 0x9fa5 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0xabff }, +{ C99| 0| 0|CID|NFC|NKC| 0, 0, 0xd7a3 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0xf8ff }, +{ 0| 0|CXX| 0| 0| 0| 0, 0, 0xfa0d }, +{ 0| 0|CXX|CID|NFC|NKC| 0, 0, 0xfa0f }, +{ 0| 0|CXX| 0| 0| 0| 0, 0, 0xfa10 }, +{ 0| 0|CXX|CID|NFC|NKC| 0, 0, 0xfa11 }, +{ 0| 0|CXX| 0| 0| 0| 0, 0, 0xfa12 }, +{ 0| 0|CXX|CID|NFC|NKC| 0, 0, 0xfa14 }, +{ 0| 0|CXX| 0| 0| 0| 0, 0, 0xfa1e }, +{ 0| 0|CXX|CID|NFC|NKC| 0, 0, 0xfa1f }, +{ 0| 0|CXX| 0| 0| 0| 0, 0, 0xfa20 }, +{ 0| 0|CXX|CID|NFC|NKC| 0, 0, 0xfa21 }, +{ 0| 0|CXX| 0| 0| 0| 0, 0, 0xfa22 }, +{ 0| 0|CXX|CID|NFC|NKC| 0, 0, 0xfa24 }, +{ 0| 0|CXX| 0| 0| 0| 0, 0, 0xfa26 }, +{ 0| 0|CXX|CID|NFC|NKC| 0, 0, 0xfa29 }, +{ 0| 0|CXX| 0| 0| 0| 0, 0, 0xfa2d }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0xfb1e }, +{ 0| 0|CXX|CID| 0| 0| 0, 0, 0xfb1f }, +{ 0| 0|CXX|CID|NFC| 0| 0, 0, 0xfb29 }, +{ 0| 0|CXX|CID| 0| 0| 0, 0, 0xfb36 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0xfb37 }, +{ 0| 0|CXX|CID| 0| 0| 0, 0, 0xfb3c }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0xfb3d }, +{ 0| 0|CXX|CID| 0| 0| 0, 0, 0xfb3e }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0xfb3f }, +{ 0| 0|CXX|CID| 0| 0| 0, 0, 0xfb41 }, +{ 0| 0|CXX|CID|NFC|NKC| 0, 0, 0xfb42 }, +{ 0| 0|CXX|CID| 0| 0| 0, 0, 0xfb44 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0xfb45 }, +{ 0| 0|CXX|CID| 0| 0| 0, 0, 0xfb4e }, +{ 0| 0|CXX|CID|NFC| 0| 0, 0, 0xfbb1 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0xfbd2 }, +{ 0| 0|CXX|CID|NFC| 0| 0, 0, 0xfd3d }, +{ 0| 0|CXX|CID|NFC|NKC| 0, 0, 0xfd3f }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0xfd4f }, +{ 0| 0|CXX|CID|NFC| 0| 0, 0, 0xfd8f }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0xfd91 }, +{ 0| 0|CXX|CID|NFC| 0| 0, 0, 0xfdc7 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0xfdef }, +{ 0| 0|CXX|CID|NFC| 0| 0, 0, 0xfdfb }, +{ 0| 0| 0|CID|NFC| 0| 0, 0, 0xfe6f }, +{ 0| 0|CXX|CID|NFC| 0| 0, 0, 0xfe72 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0xfe73 }, +{ 0| 0|CXX|CID|NFC| 0| 0, 0, 0xfe74 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0xfe75 }, +{ 0| 0|CXX|CID|NFC| 0| 0, 0, 0xfefc }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0xff20 }, +{ 0| 0|CXX|CID|NFC| 0| 0, 0, 0xff3a }, +{ 0| 0| 0|CID|NFC| 0| 0, 0, 0xff40 }, +{ 0| 0|CXX|CID|NFC| 0| 0, 0, 0xff5a }, +{ 0| 0| 0|CID|NFC| 0| 0, 0, 0xff65 }, +{ 0| 0|CXX|CID|NFC| 0| 0, 0, 0xffbe }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0xffc1 }, +{ 0| 0|CXX|CID|NFC| 0| 0, 0, 0xffc7 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0xffc9 }, +{ 0| 0|CXX|CID|NFC| 0| 0, 0, 0xffcf }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0xffd1 }, +{ 0| 0|CXX|CID|NFC| 0| 0, 0, 0xffd7 }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0xffd9 }, +{ 0| 0|CXX|CID|NFC| 0| 0, 0, 0xffdc }, +{ 0| 0| 0|CID|NFC|NKC| 0, 0, 0xffff }, diff --git a/libcpp/ucnid.tab b/libcpp/ucnid.tab new file mode 100644 index 0000000..11fc471 --- /dev/null +++ b/libcpp/ucnid.tab @@ -0,0 +1,211 @@ +; Table of UCNs which are valid in identifiers. +; Copyright (C) 2003, 2005 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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +; +; This file reproduces the table in ISO/IEC 9899:1999 (C99) Annex +; D, which is itself a reproduction from ISO/IEC TR 10176:1998, and +; the similar table from ISO/IEC 14882:1988 (C++98) Annex E, which is +; a reproduction of ISO/IEC PDTR 10176. Unfortunately these tables +; are not identical. + +[C99] + +; Latin +00aa 00ba 00c0-00d6 00d8-00f6 00f8-01f5 01fa-0217 0250-02a8 1e00-1e9b +1ea0-1ef9 207f + +; Greek +0386 0388-038a 038c 038e-03a1 03a3-03ce 03d0-03d6 03da 03dc 03de 03e0 +03e2-03f3 1f00-1f15 1f18-1f1d 1f20-1f45 1f48-1f4d 1f50-1f57 1f59 1f5b +1f5d 1f5f-1f7d 1f80-1fb4 1fb6-1fbc 1fc2-1fc4 1fc6-1fcc 1fd0-1fd3 +1fd6-1fdb 1fe0-1fec 1ff2-1ff4 1ff6-1ffc + +; Cyrillic +0401-040c 040e-044f 0451-045c 045e-0481 0490-04c4 04c7-04c8 04cb-04cc +04d0-04eb 04ee-04f5 04f8-04f9 + +; Armenian +0531-0556 0561-0587 + +; Hebrew +05b0-05b9 05bb-05bd 05bf 05c1-05c2 05d0-05ea 05f0-05f2 + +; Arabic +0621-063a 0640-0652 0670-06b7 06ba-06be 06c0-06ce 06d0-06dc 06e5-06e8 +06ea-06ed + +; Devanagari +0901-0903 0905-0939 093e-094d 0950-0952 0958-0963 + +; Bengali +0981-0983 0985-098c 098f-0990 0993-09a8 09aa-09b0 09b2 09b6-09b9 +09be-09c4 09c7-09c8 09cb-09cd 09dc-09dd 09df-09e3 09f0-09f1 + +; Gurmukhi +0a02 0a05-0a0a 0a0f-0a10 0a13-0a28 0a2a-0a30 0a32-0a33 0a35-0a36 +0a38-0a39 0a3e-0a42 0a47-0a48 0a4b-0a4d 0a59-0a5c 0a5e 0a74 + +; Gujarati +0a81-0a83 0a85-0a8b 0a8d 0a8f-0a91 0a93-0aa8 0aaa-0ab0 0ab2-0ab3 +0ab5-0ab9 0abd-0ac5 0ac7-0ac9 0acb-0acd 0ad0 0ae0 + +; Oriya +0b01-0b03 0b05-0b0c 0b0f-0b10 0b13-0b28 0b2a-0b30 0b32-0b33 0b36-0b39 +0b3e-0b43 0b47-0b48 0b4b-0b4d 0b5c-0b5d 0b5f-0b61 + +; Tamil +0b82-0b83 0b85-0b8a 0b8e-0b90 0b92-0b95 0b99-0b9a 0b9c 0b9e-0b9f +0ba3-0ba4 0ba8-0baa 0bae-0bb5 0bb7-0bb9 0bbe-0bc2 0bc6-0bc8 0bca-0bcd + +; Telugu +0c01-0c03 0c05-0c0c 0c0e-0c10 0c12-0c28 0c2a-0c33 0c35-0c39 0c3e-0c44 +0c46-0c48 0c4a-0c4d 0c60-0c61 + +; Kannada +0c82-0c83 0c85-0c8c 0c8e-0c90 0c92-0ca8 0caa-0cb3 0cb5-0cb9 0cbe-0cc4 +0cc6-0cc8 0cca-0ccd 0cde 0ce0-0ce1 + +; Malayalam +0d02-0d03 0d05-0d0c 0d0e-0d10 0d12-0d28 0d2a-0d39 0d3e-0d43 0d46-0d48 +0d4a-0d4d 0d60-0d61 + +# CORRECTION: exclude 0e50-0e59 from the Thai range as it also appears +# in the Digits range below. +; Thai +0e01-0e3a 0e40-0e49 0e5a-0e5b + +; Lao +0e81-0e82 0e84 0e87-0e88 0e8a 0e8d 0e94-0e97 0e99-0e9f 0ea1-0ea3 0ea5 +0ea7 0eaa-0eab 0ead-0eae 0eb0-0eb9 0ebb-0ebd 0ec0-0ec4 0ec6 0ec8-0ecd +0edc-0edd + +; Tibetan +0f00 0f18-0f19 0f35 0f37 0f39 0f3e-0f47 0f49-0f69 0f71-0f84 0f86-0f8b +0f90-0f95 0f97 0f99-0fad 0fb1-0fb7 0fb9 + +; Georgian +10a0-10c5 10d0-10f6 + +; Hiragana +3041-3093 309b-309c + +; Katakana +30a1-30f6 30fb-30fc + +; Bopomofo +3105-312c + +; CJK Unified Ideographs +4e00-9fa5 + +; Hangul +ac00-d7a3 + +; Special characters +00b5 00b7 02b0-02b8 02bb 02bd-02c1 02d0-02d1 02e0-02e4 037a 0559 093d +0b3d 1fbe 203f-2040 2102 2107 210a-2113 2115 2118-211d 2124 2126 2128 +212a-2131 2133-2138 2160-2182 3005-3007 3021-3029 + +; Digits +0660-0669 06f0-06f9 0966-096f 09e6-09ef 0a66-0a6f 0ae6-0aef 0b66-0b6f +0be7-0bef 0c66-0c6f 0ce6-0cef 0d66-0d6f 0e50-0e59 0ed0-0ed9 0f20-0f33 + +[CXX] + +; Latin +00c0-00d6 00d8-00f6 00f8-01f5 01fa-0217 0250-02a8 1e00-1e9a 1ea0-1ef9 + +; Greek +0384 0388-038a 038c 038e-03a1 03a3-03ce 03d0-03d6 03da 03dc 03de 03e0 +03e2-03f3 1f00-1f15 1f18-1f1d 1f20-1f45 1f48-1f4d 1f50-1f57 1f59 1f5b +1f5d 1f5f-1f7d 1f80-1fb4 1fb6-1fbc 1fc2-1fc4 1fc6-1fcc 1fd0-1fd3 +1fd6-1fdb 1fe0-1fec 1ff2-1ff4 1ff6-1ffc + +; Cyrillic +0401-040d 040f-044f 0451-045c 045e-0481 0490-04c4 04c7-04c8 04cb-04cc +04d0-04eb 04ee-04f5 04f8-04f9 + +; Armenian +0531-0556 0561-0587 + +; Hebrew +05d0-05ea 05f0-05f4 + +; Arabic +0621-063a 0640-0652 0670-06b7 06ba-06be 06c0-06ce 06e5-06e7 + +; Devanagari +0905-0939 0958-0962 + +; Bengali +0985-098c 098f-0990 0993-09a8 09aa-09b0 09b2 09b6-09b9 09dc-09dd +09df-09e1 09f0-09f1 + +; Gurmukhi +0a05-0a0a 0a0f-0a10 0a13-0a28 0a2a-0a30 0a32-0a33 0a35-0a36 0a38-0a39 +0a59-0a5c 0a5e + +; Gujarati +0a85-0a8b 0a8d 0a8f-0a91 0a93-0aa8 0aaa-0ab0 0ab2-0ab3 0ab5-0ab9 0ae0 + +; Oriya +0b05-0b0c 0b0f-0b10 0b13-0b28 0b2a-0b30 0b32-0b33 0b36-0b39 0b5c-0b5d +0b5f-0b61 + +; Tamil +0b85-0b8a 0b8e-0b90 0b92-0b95 0b99-0b9a 0b9c 0b9e-0b9f 0ba3-0ba4 +0ba8-0baa 0bae-0bb5 0bb7-0bb9 + +; Telugu +0c05-0c0c 0c0e-0c10 0c12-0c28 0c2a-0c33 0c35-0c39 0c60-0c61 + +; Kannada +0c85-0c8c 0c8e-0c90 0c92-0ca8 0caa-0cb3 0cb5-0cb9 0ce0-0ce1 + +; Malayalam +0d05-0d0c 0d0e-0d10 0d12-0d28 0d2a-0d39 0d60-0d61 + +; Thai +0e01-0e30 0e32-0e33 0e40-0e46 0e4f-0e5b + +; Digits +0e50-0e59 + +; Lao +0e81-0e82 0e84 0e87-0e88 0e8a 0e8d 0e94-0e97 0e99-0e9f 0ea1-0ea3 0ea5 +0ea7 0eaa-0eab 0ead-0eb0 0eb2 0eb3 0ebd 0ec0-0ec4 0ec6 + +; Georgian +10a0-10c5 10d0-10f6 + +; Hiragana +3041-3094 309b-309e + +; Katakana +30a1-30fe + +; Bopomofo +3105-312c + +; Hangul +1100-1159 1161-11a2 11a8-11f9 + +; CJK Unified Ideographs +f900-fa2d fb1f-fb36 fb38-fb3c fb3e fb40-fb41 fb42-fb44 fb46-fbb1 +fbd3-fd3f fd50-fd8f fd92-fdc7 fdf0-fdfb fe70-fe72 fe74 fe76-fefc +ff21-ff3a ff41-ff5a ff66-ffbe ffc2-ffc7 ffca-ffcf ffd2-ffd7 +ffda-ffdc 4e00-9fa5 + diff --git a/libiberty/COPYING.LIB b/libiberty/COPYING.LIB new file mode 100644 index 0000000..ae23fcf --- /dev/null +++ b/libiberty/COPYING.LIB @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +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 and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, 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 library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete 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 distribute a copy of this License along with the +Library. + + 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 Library or any portion +of it, thus forming a work based on the Library, 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) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +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 Library, 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 Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you 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. + + If distribution of 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 satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be 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. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library 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. + + 9. 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 Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +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 with +this License. + + 11. 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 Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library 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 Library. + +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. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library 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. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser 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 Library +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 Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +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 + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "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 +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. 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 LIBRARY 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 +LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), 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 Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. 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. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog new file mode 100644 index 0000000..1260eeb --- /dev/null +++ b/libiberty/ChangeLog @@ -0,0 +1,7578 @@ +2007-11-12 Joseph Myers + + * floatformat.c (floatformat_ibm_long_double_is_valid): Fix + compiler warnings. + (floatformat_ibm_long_double): Use + floatformat_ibm_long_double_is_valid. + +2007-11-07 Joseph Myers + Daniel Jacobowitz + + * floatformat.c (mant_bits_set): New. + (floatformat_to_double): Use it. Note no special handling of + split formats. + (floatformat_from_double): Note no special handing of split + formats. + (floatformat_ibm_long_double_is_valid, + floatformat_ibm_long_double): New. + (floatformat_ieee_single_big, floatformat_ieee_single_little, + floatformat_ieee_double_big, floatformat_ieee_double_little, + floatformat_ieee_double_littlebyte_bigword, floatformat_vax_f, + floatformat_vax_d, floatformat_vax_g, floatformat_i387_ext, + floatformat_m68881_ext, floatformat_i960_ext, + floatformat_m88110_ext, floatformat_m88110_harris_ext, + floatformat_arm_ext_big, floatformat_arm_ext_littlebyte_bigword, + floatformat_ia64_spill_big, floatformat_ia64_spill_little, + floatformat_ia64_quad_big, floatformat_ia64_quad_little): Update + for addition of split_half field. + +2007-09-06 Tom Tromey + + * pexecute.txh (pex_free): Document process killing. + +2007-08-31 Douglas Gregor + + * cp-demangle.c (d_dump): Handle + DEMANGLE_COMPONENT_RVALUE_REFERENCE. + (d_make_comp): Ditto. + (cplus_demangle_type): Ditto. + (d_print_comp): Ditto. + (d_print_mod): Ditto. + (d_print_function_type): Ditto. + +2007-08-24 Kai Tietz + + * pex-common.h: (pex_funcs): Retyped wait and exec_child to pid_t. + * pex-djgpp.c: Likewise. + * pex-msdos.c: Likewise. + * pex-unix.c: Likewise. + * pex-win32.c: Likewise. + +2007-08-17 Michael Snyder + + * make-relative-prefix.c (make_relative_prefix_1): Resource leaks. + +2007-08-03 Michael Snyder + + * make-relative-prefix.c (make_relative_prefix_1): Fix resource + leak. + +2007-07-31 Michael Snyder + + * cp-demangle.c (d_print_comp): Guard against null. + +2007-07-25 Ben Elliston + + * Makefile.in (CFILES): Remove ternary.c. + (REQUIRED_OFILES): Remove ./ternary.o. + (INSTALLED_HEADERS): Remove ternary.h. + (ternary.o): Remove. + * ternary.c: Remove. + +2007-07-23 DJ Delorie + + * argv.c (writeargv): Fix typo in inline documentation. + * functions.texi: Regenerate. + +2007-07-17 DJ Delorie + + * configure.ac (target_header_dir, msdosdjgpp): Remove duplicate + gettimeofday entry. + * configure: Likewise. + +2007-07-11 Alexandre Oliva + + * maint-tool (deps): Output stamp-h instead of config.h. + * Makefile.in: Rebuild deps. + (maintainer-clean-subdir): Depend on stamp-h rather than config.h. + +2007-07-02 Simon Baldwin + + * argv.c (writeargv): Removed declaration of unused variable. + +2007-06-14 Paolo Bonzini + + * configure.ac: Use ACX_PROG_CC_ALMOST_PEDANTIC too. + * configure: Regenerate. + +2007-06-14 Paolo Bonzini + + * aclocal.m4: Include config/warnings.m4. + * configure.ac: Use ACX_PROG_CC_WARNING_OPTS. + * configure: Regenerate. + +2007-06-07 Geoffrey Keating + + * configure.ac: Non-default multilibs can be cross compilations. + * configure: Regenerate + +2007-05-07 Nathan Froyd + + * argv.c (writeargv): New function. + +2007-05-05 Geoffrey Keating + + * cp-demangle.c (d_name): Detect local-source-name. + (d_prefix): Likewise. + (d_unqualified_name): Implement local-source-name. + +2007-05-03 Joel Brobecker + + * filename_cmp.c: Replace include of ctype.h by include of + safe-ctype.h. + (filename_cmp): Use TOLOWER instead of tolower for conversions + that are locale-independent. + * Makefile.in (filename_cmp.o): Add dependency on safe-ctype.h. + +2007-04-11 Thomas Neumann tneumann@users.sourceforge.net + + * argv.c: Use ANSI C declarations. + * make-relative-prefix.c: Likewise. + +2007-04-06 Joel Brobecker + + * filename_cmp.c (filename_cmp): Improve documentation. + +2007-04-02 Andreas Schwab + + * filename_cmp.c: Include "config.h". + +2007-03-29 Joel Brobecker + + * filename_cmp.c: New file. + * Makefile.in (CFILES): Add filename_cmp.c. + (REQUIRED_OFILES): Add filename_cmp.o + (filename_cmp.o): New rule. + * functions.texi: Regenerate. + +2007-03-15 Geoffrey Keating + + * cp-demangle.c (d_encoding): Exit early on error. + (d_pointer_to_member_type): Exit early if cplus_demangle_type + returns NULL. + (cplus_demangle_type): Likewise. + * testsuite/demangle-expected: New testcase. + +2007-03-01 Brooks Moses + + * Makefile.in: Add install-pdf target as copied from + automake v1.10 rules. + * testsuite/Makefile.in: Add dummy install-pdf target. + +2007-03-01 Peter Breitenlohner + Eric Botcazou + + PR other/16513 + * Makefile.in: Install library under $(MULTIOSDIR), not $(MULTISUBDIR). + Install headers in multilib independent location. + +2007-02-26 DJ Delorie + + * configure.ac: add djgpp-specific results, so we don't have to + link during a cross compilation. + * configure: Regenerated. + +2007-01-31 Ralf Wildenhues + + * hex.c: Fix typo. + * choose-temp.c: Likewise. + * functions.texi: Regenerate. + +2007-01-31 Vladimir Prus + + * pex-common.h (struct pex_obj): New fields + stderr_pipe and read_err. + * pex-common.c (pex_init_common): Initialize + stderr_pipe. + (pex_run_in_environment): Add error checking + for PEX_STDERR_TO_PIPE. Create a pipe + for stderr if necessary. + (pex_read_err): New. + (pex_free): Close read_err. + * pexecute.txh: Document changes. + * functions.texi: Regenerated. + +2007-01-31 Ben Elliston + + * strsignal.c (psignal): Change type of signo to int. + * functions.texi: Regenerate. + +2007-01-29 Simon Baldwin + + * cp-demangle.h (cplus_demangle_operators): External definition + suppressed if not building for libstdc++. + * cp-demangle.c (__gcclibcxx_demangle_callback): Augmented interface + to demangling, provides a malloc-less version of __cxa_demangle. + (cplus_demangle_print_callback): Public callback version of + cplus_demangle_print. + (struct d_growable_string): New growable string structure. + (d_growable_string_init): New function, provides support for + growable strings separate from print info. + (d_growable_string_resize): Likewise. + (d_growable_string_append_buffer): Likewise. + (d_growable_string_callback_adapter):): Likewise. + (d_print_init): New print info initialization function. + (d_print_error): Macro replace by inline function. + (d_print_saw_error): Likewise. + (d_append_char): Likewise. + (d_append_buffer): Likewise. + (d_append_string): New inline function, replaces the + d_append_string_constant macro. + (d_flush_buffer): New function, flushes buffer to callback. + (d_demangle_callback, is_ctor_or_dtor): Malloc-based fallback + for unsupported dynamic arrays replaced by alloca(). + (d_demangle): Return string length estimating removed. + (d_dump): Moved error case handling from call site into function. + (d_print_resize): Function removed. + (d_print_append_char): Likewise. + (d_print_append_buffer): Likewise. + (d_print_error): Likewise. + (d_print_comp): Added special case handling for Java arrays. + (java_demangle_v3): Removed string post-processing for Java arrays, + now replaced by special case handling in d_print_comp. + (cplus_demangle_v3_callback): Augmented interface to demangling, + provides a malloc-less version of cplus_demangle_v3. + (java_demangle_v3_callback): Augmented interface to demangling, + provides a malloc-less version of java_demangle_v3. + +2007-01-12 Ben Elliston + + * pex-unix.c (writeerr): Cast write result to void. + + * choose-temp.c (choose_temp_base): Check the result of the call + to mktemp rather than testing the length of the modified string. + +2006-12-20 Geoffrey Keating + + * cp-demangle.h: Add comment explaining what to do to avoid + overrunning string. + (d_check_char): New. + (d_next_char): Don't advance past trailing '\0'. + * cp-demangle.c (cplus_demangle_mangled_name): Use d_check_char. + (d_nested_name): Likewise. + (d_special_name): Likewise. + (d_call_offset): Likewise. + (d_function_type): Likewise. + (d_array_type): Likewise. + (d_pointer_to_member_type): Likewise. + (d_template_param): Likewise. + (d_template_args): Likewise. + (d_template_arg): Likewise. + (d_expr_primary): Likewise. + (d_local_name): Likewise. + (d_substitution): Likewise. + (d_ctor_dtor_name): Use d_advance rather than d_next_char. + * testsuite/test-demangle.c: Include sys/mman.h. + (MAP_ANONYMOUS): Define. + (protect_end): New. + (main): Use protect_end. + * testsuite/demangle-expected: Add testcases for overrunning + the end of the string. + +2006-11-30 Andrew Stubbs + J"orn Rennecke + + PR driver/29931 + * make-relative-prefix.c (make_relative_prefix_1): New function, + broken out of make_relative_prefix. Make link resolution dependent + on new parameter. + (make_relative_prefix): Use make_relative_prefix_1. + (make_relative_prefix_ignore_links): New function. + +2006-11-08 Vladimir Prus + + * pex-win32.c (no_suffixes): Remove. + (std_suffixes): Add "" as first element. + (find_executable): Remove detection of already-present + extension. Try all suffixes in std_suffixes. + +2006-11-07 Julian Brown + + * floatformat.c (get_field): Fix segfault with little-endian word + order on 64-bit hosts. + (put_field): Likewise. + (min): Move definition. + +2006-10-26 Danny Smith + + pex-win32.c (argv_to_cmdline): Replace xmalloc with XNEWVEC. + (find_executable): Likewise. + (win32_spawn): Cast alloca return to (char**). + Replace malloc with XNEWVEC. + bcopy.c (bcopy): Add explict casts in assignments. + +2006-10-25 Ben Elliston + + * pexecute.txh: Wrap pexecute's "flag" argument with @var {..}. + +2006-10-10 Brooks Moses + + * Makefile.in: Added "pdf", "libiberty.pdf" target support. + * testsuite/Makefile.in: Added empty "pdf" target. + +2006-09-22 Ian Lance Taylor + + PR other/29176 + * cp-demangle.c (d_substitution): Check for overflow when + computing substitution index. + +2006-08-30 Corinna Vinschen + + * configure.ac: Add case for Mingw as host. + * configure: Regenerate. + +2006-08-27 Ian Lance Taylor + + PR driver/27622 + * pex-common.h (struct pex_funcs): Add toclose parameter to + exec_child field. + * pex-common.c (pex_run_in_environment): Pass toclose to + exec_child. + * pex-djgpp.c (pex_djgpp_exec_child): Add toclose parameter. + * pex-unix.c (pex_unix_exec_child): Likewise. + * pex-msdos.c (pex_msdos_exec_child): Likewise. + * pex-win32.c (pex_win32_exec_child): Likewise. + + PR other/28797 + * cp-demangle.c (d_pointer_to_member_type): Do add a substitution + for a qualified member which is not a function. + * testsuite/demangle-expected: Add test case. + +2006-07-27 Jan Hubicka + + PR rtl-optimization/28071 + * hashtab.c (htab_empty): Clear out n_deleted/n_elements; + downsize the hashtable. + +2006-07-04 Peter O'Gorman + + * Makefile.in: chmod 644 before ranlib during install. + +2006-06-02 Mark Shinwell + + * pex-unix.c (pex_unix_exec_child): Insert cast when assigning + to environ. + +2006-06-01 Mark Shinwell + + * pex-common.c: New function pex_run_in_environment. + * pex-common.h: Add environment parameter to exec_child. + * pex-msdos.c: Add environment parameter to pex_msdos_exec_child. + * pex-djgpp.c: Add environment parameter to pex_djgpp_exec_child. + (pex_djgpp_exec_child): Pass environment to child process. + * pex-unix.c: Add environment parameter to pex_unix_exec_child. + (pex_unix_exec_child): Pass environment to child process. + * pex-win32.c: Add environment parameter to pex_win32_exec_child. + New function env_compare for comparing VAR=VALUE pairs. + (win32_spawn): Assemble environment block and pass to CreateProcess. + (spawn_script): Pass environment through to win32_spawn. + (pex_win32_exec_child): Pass environment through to spawn_script and + win32_spawn. + * functions.texi: Regenerate. + * pexecute.txh: Document pex_run_in_environment. + +2006-05-28 Mark Shinwell + + * mkstemps.c: Open temporary files in binary mode. + +2006-05-12 Anton Blanchard + + * cplus-dem.c (demangle_fund_type): Ensure buf is large enough to + hold "int%u_t". + +2006-04-24 Julian Brown + + * floatformat.c (floatformat_to_double): Fix (biased) exponent=0 case. + +2006-03-29 Jim Blandy + + * pex-common.c (pex_input_file, pex_input_pipe): New functions. + (pex_init_common): Initialize obj->input_file. + (pex_run): Close any file opened by pex_input_file. + * pexecute.txh (pex_input_file, pex_input_pipe): New docs. + * pex-common.h (struct pex_obj): New field input_file. + (struct pex_funcs): New function ptr fdopenw. + * pex-unix.c (pex_unix_fdopenw): New function. + (funcs): List it as our fdopenw function. + * pex-win32.c (pex_win32_fdopenw): New function. + (funcs): List it as our fdopenw function. + * pex-djgpp.c (funcs): Leave fdopenw null. + * pex-msdos (funcs): Same. + * functions.texi: Regenerated. + +2006-04-10 Jim Blandy + + * pex-common.c (temp_file): New function, containing guts of + pex-style temporary file name generation. + (pex_run): Use it. + +2006-04-06 Carlos O'Donell + + * Makefile.in: Add install-html, install-html-am, and + install-html-recursive targets. Define mkdir_p and + NORMAL_INSTALL. + * configure.ac: AC_SUBST datarootdir, docdir, htmldir. + * configure: Regenerate. + * testsuite/Makefile.in: Add install-html and html targets. + +2006-03-31 Mark Mitchell + + * pex-win32.c (): Include. + (fix_argv): Remove. + (argv_to_cmdline): New function. + (std_suffixes): New variable. + (no_suffixes): Likewise. + (find_executable): New function. + (win32_spawn): Likewise. + (spawn_script): Use win32_spawn instead of _spawnv[p]. + (pex_win32_exec_child): Replace MSVCRT calls with Win32 API calls. + (pex_win32_wait): Likewise. + +2006-03-24 Jim Blandy + + * pex-common.c (pex_run): Simplify output name handling. + +2006-03-12 Jim Blandy + + * pex-common.h (struct pex_obj): Doc fixes. + +2006-03-11 Jim Blandy + + * functions.texi: Regenerate. + +2006-02-21 Ben Elliston + + * pexecute.c (pwait): Syntax fix for previous change. + +2006-02-17 Uttam Pawar + + * pexecute.c (pwait): Free vector pointer. + * partition.c (partition_print): Free class_elements pointer. + +2006-02-11 Roger Sayle + R. Scott Bailey + Bill Northcott + + PR bootstrap/16787 + * floatformat.c: Include where available. + (NAN): Use value of DBL_QNAN if defined, and NAN isn't. + +2006-01-29 Gabriel Dos Reis + + * configure.ac: Add -Wc++-compat to ac_libibety_warn_cflags where + supported. + * configure: Regenerated. + +2006-01-20 Carlos O'Donell + + * testsuite/Makefile.in: Add test-expandargv test. + * testsuite/test-expandargv.c: New test. + * argv.c (expandargv): Check for errors with ferror, + rather than just by looking at return value from fread. + +2005-12-17 Gabriel Dos Reis + + * floatformat.c (floatformat_i387_ext_is_valid): Use explicit cast + to convert from "from". + (floatformat_to_double): Likewise. + (floatformat_from_double): Use explicit cast to convert from "to". + +2005-12-10 Terry Laurenzo + + PR java/9861 + * cp-demangle.c (d_bare_function_type): Recognize new 'J' qualifer + and include return type when found. + (d_print_comp)[DEMANGLE_COMPONENT_FUNCTION_TYPE]: Add + conditional logic to change printing order of return type.when + the DMGL_RET_POSTFIX option is present. + (java_demangle_v3): Add DMGL_RET_POSTFIX option to d_demangle + call. + * testsuite/test-demangle.c (main): Recognize option --ret-postfix + * testsuite/demangle-expected: Test cases to verify extended encoding. + Updated comment to document --ret-postfix option. + +2005-11-06 Richard Guenther + + * splay-tree.c (rotate_left): New function. + (rotate_right): Likewise. + (splay_tree_splay_helper): Remove. + (splay_tree_splay): Re-implement. + +2005-10-31 Mark Kettenis + + * floatformat.c (floatformat_vax_aingle, floatformat_vax_double): + New variables. + +2005-10-07 Mark Mitchell + + * at-file.texi: Fix typo. + +2005-10-03 Mark Mitchell + + * at-file.texi: New file. + +2005-09-27 Mark Mitchell + + * argv.c (expandargv): Do not use xmalloc_failed. + +2005-09-26 Mark Mitchell + + * argv.c (safe-ctype.h): Include it. + (ISBLANK): Remove. + (stdio.h): Include. + (buildargv): Use ISSPACE instead of ISBLANK. + (expandargv): New function. + * Makefile.in: Regenerated. + +2005-09-14 Christopher Faylor + + * pex-win32.c: Include "windows.h". + (backslashify): New function. + (fix_argv): Use backslashify to convert path to windows format. + Allocate one more place in new argv for potential executable from '#!' + parsing. + (tack_on_executable): New function. Conditional on USE_MINGW_MSYS + (openkey): Ditto. + (mingw_rootify): Ditto. + (msys_rootify): Ditto. + (spawn_script): New function. + (pex_win32_exec_child): Save translated argv in newargv. Pass to + spawn_script if spawnv* fails. + (main): New function. Conditional on MAIN. Useful for testing. + +2005-08-17 Mark Kettenis + + * floatformat.c (floatformat_always_valid): Change type of last + argument to `void *'. + (floatformat_i387_ext_is_valid): Likewise. + (floatformat_to_double): Change type of second argument to `const + void *'. + (floatformat_from_double): Change type of last argument to `void + *'. + (floatformat_is_valid): Change type of last argument to `const + void *'. + (ieee_test): Remove redundant casts. + +2005-08-17 Kelley Cook + + * strverscmp.c: Update FSF address. + * testsuite/Makefile.in: Likewise. + * testsuite/test-demangle.c: Likewise. + * testsuite/test-pexecute.c: Likewise. + +2005-07-23 Kaveh R. Ghazi + + * getopt.c: Include ansidecl.h before system headers. + +2005-07-22 Ben Elliston + + * getopt.c: Include "ansidecl.h". + (_getopt_initialize): Mark argc and argv parameters as unused. + +2005-07-22 Ben Elliston + + * regex.c (regcomp): Change type of `i' from unsigned to int. + +2005-07-22 Ben Elliston + + Recover patch lost in the sourceware repository: + 2005-07-09 Ben Elliston + * memcpy.c: Remove ANSI_PROTOTYPES conditional code. + * memmove.c: Likewise. + * objalloc.c: Likewise. + +2005-07-22 Ben Elliston + + * configure.ac: Check for a getopt(3) declaration. + * configure, config.in: Regenerate. + +2005-07-15 Ben Elliston + + * regex.c (TRANSLATE): Cast rhs of ternary expression to char. + +2005-07-12 Ben Elliston + + * floatformat.c (floatformat_to_double): Add a comment about a + potential source of warnings when compiling this file. + +2005-07-12 Ben Elliston + + * pexecute.c (pexecute): Cast string litrals to char *. + * regex.c (re_comp): Cast a call to gettext() to char *. + +2005-07-07 Kelley Cook + + * config.table: Delete file. Move former contents into ... + * configure.ac: ... here and escape any brackets for m4. + * Makefile.in (config.status): Remove dependency on config.table. + * configure: Regenerate. + +2005-07-07 Kelley Cook + + * config.in: Regenerate for 6/20 change. + +2005-07-03 Steve Ellcey + + PR other/13906 + * md5.c (md5_process_bytes): Check alignment. + +2005-07-01 Ian Lance Taylor + + PR other/22268 + * cp-demangle.c (d_expr_primary): Don't run off the end of the + string while looking for the end of a literal value. + * testsuite/demangle-expected: Add test case. + +2005-06-30 Daniel Berlin + + * hashtab.c (EMPTY_ENTRY): Moved and renamed. + (DELETED_ENTRY): Ditto. + +2005-06-20 Geoffrey Keating + + * strverscmp.c: New. + * Makefile.in (CFILES): Add strverscmp.c. + (CONFIGURED_OFILES): Add strverscmp.o. + (strverscmp.o): New rule. + (stamp-functions): Add $(srcdir) to files in source directory. + * configure.ac (funcs): Add strverscmp. + (AC_CHECK_FUNCS): Add strverscmp. + * configure: Regenerate. + * functions.texi: Regenerate. + +2005-05-28 Eli Zaretskii + + * configure.ac: Add snprintf and vsnprintf to AC_CHEK_DECLS. + * config.in, configure: Regenerate. + +2005-05-25 Richard Henderson + + * cp-demangle.c (d_dump): Handle DEMANGLE_COMPONENT_HIDDEN_ALIAS. + (d_make_comp, d_print_comp): Likewise. + (d_special_name): Generate one. + * testsuite/demangle-expected: Add a hidden alias test. + +2005-05-24 Gabriel Dos Reis + + * configure.ac: Check declarations for calloc(), getenv(), + malloc(), realloc() and sbrk(). + * config.in: Regenerate. + * configure: Likewise. + + * alloca.c (C_alloca): Change "new" to "new_storage". Use XNEWVEC + instead of xmalloc. + * choose-temp.c (choose_temp_base): Use XNEWVEC instea od xmalloc. + * concat.c (liiberty_concat_ptr): Surround definition with an + extern "C" block, if __cplusplus. + (concat): Use XNEWVEC instead of xmalloc. + (reconcat): Likewise. + * cp-demangle.c (struct d_print_template): Rename member + "template" to "template_decl". Adjust use throughout the file. + (d_print_resize): Properly cast return value of realloc(). + (cplus_demangle_print): Same for malloc(). + (d_demangle): Likewise. + * cp-demint.c (cplus_demangle_fill_builtin_type): Rename parameter + "typename" to "type_name". + * cplus-dem.c (grow_vect): Use XRESIZEVEC instead of xrealloc(). + (work_stuff_copy_to_from): Use XNEWVEC insteand of xmalloc(). + (demangle_template_value_parm): Likewise. + (demangle_template): Likewise. + (recursively_demangle): Likewise. + (do_hpacc_template_literal): Likewise. + (do_arg): Likewise. + (remember_type): Likewise. + (remember_Ktype): Likewise. + (register_Btype): Likewise. + (string_need): Use XRESIZEVEC instead of xrealloc(). + * dyn-string.c (dyn_string_init): Use XNEWVEC. + (dyn_string_new): Use XNEW. + (dyn_string_resize): Use XRESIZEVEC. + * fnmatch.c (fnmatch): Rename local variable "not" to "negate". + * getopt.c (getenv): Declare only if !__cplusplus and !getenv. + Otherwise include . + (exchange): Cast return value of malloc(). + * hashtab.c (htab_size): Define as both macro and non-inline + function. + (htab_elements): Likewise. + * getpwd.c (getpwd): Use XNEWVEC. + (htab_create_alloc_ex): Use C90 prototype-style. + * lrealpath.c (lrealpath): Appropriately cast return value of + malloc(). + * make-relative-prefix.c (save_string): Likewise. + * make-temp-file.c (try_dir): Rename from "try". Adjust use in + the file. + (choose_tmpdir): Use XNEWVEC. + * mkstemps.c (mkstemps): Rename parameter "template" to "pattern". + * pex-common.c (pex_init_common): Use XNEW. + (pex_add_remove): Use XRESIZEVEC. + (pex_run): Likewise. + (pex_get_status_and_time): Likewise. + * pex-djgpp.c (pex_djgpp_exec_child): Likewise. + * pex-msdos.c (pex_init): Use XNEW. + (pex_msdos_exec_child): Likewise. + (pex_msdos_exec_child): Use XRESIZEVEC. + * pex-unix.c (pex_wait): Use XNEW. + * pex-win32.c (fix_argv): Use XNEWVEC. + * pexecute.c (pwait): Likewise. + * setenv.c (setenv): Properly cast return value of malloc(). + * sigsetmask.c (sigsetmask): Rename local variables "old" and + "new" to "old_sig" and "new_sig". + * sort.c (main): Use XNEWVEC. + * spaces.c (spaces): Cast return value of malloc(). + * strndup.c (strndup): Likewise. + * ternary.c (ternary_insert): Use XNEW. + * xmalloc.c (malloc, realloc, calloc, sbrk): Surround declaration + with an extern "C" block if __cplusplus. + * xstrdup.c (xstrdup): Cast return value of memcpy(). + * xstrerror.c (strerror): Enclose declaration in an extern "C" + block if __cplusplus. + * xstrndup.c (xstrndup): Use XNEW. Cast return value of memcpy(). + +2005-05-16 Andreas Jaeger + + * getpwd.c: Remove unneeded prototype getcwd and move getwd so + that it's only declared if needed. + + * getopt1.c: Change order of includes so that __GNU_LIBRARY__ is + defined. + +2005-05-15 Andreas Jaeger + + * functions.texi: Regenerated. + +2005-05-15 Eli Zaretskii + + * pexecute.txh: Enclose multi-word data types in @deftypefn in + braces. Minor wording fixes. Use --- for em-dash. Use + @enumerate in enumerated lists. + + * fopen_unlocked.c: Enclose multi-word data types in @deftypefn in + braces. + +2005-05-11 Eli Zaretskii + + * pex-djgpp.c: Include string.h, fcntl.h, unistd.h, and + sys/stat.h. + (pex_init): Fix last argument to pex_init_common. + (pex_djgpp_exec_child): Remove leading underscore from _open, + _dup, _dup2, _close, and _spawnv/_spawnvp. Replace `program', + which is undeclared, with `executable', which was unused. Remove + unused variable `e'. Fix casting of last arg to spawnv/spawnvp. + (pex_djgpp_wait): Declare arguments with ATTRIBUTE_UNUSED. + +2005-05-11 Paul Brook + + * Makefile.in: Regenerate dependencies. + +2005-05-10 Nick Clifton + + * Update the address and phone number of the FSF organization in + the GPL notices in the following files: + COPYING.LIB, Makefile.in, _doprnt.c, argv.c, asprintf.c, + choose-temp.c, clock.c, concat.c, copying-lib.texi, cp-demangle.c, + cp-demangle.h, cp-demint.c, cplus-dem.c, dyn-string.c, fdmatch.c, + fibheap.c, floatformat.c, fnmatch.c, fopen_unlocked.c, + gather-docs, getopt.c, getopt1.c, getruntime.c, hashtab.c, hex.c, + lbasename.c, lrealpath.c, maint-tool, make-relative-prefix.c, + make-temp-file.c, md5.c, mempcpy.c, mkstemps.c, objalloc.c, + obstack.c, partition.c, pex-common.c, pex-common.h, pex-djgpp.c, + pex-msdos.c, pex-one.c, pex-unix.c, pex-win32.c, pexecute.c, + physmem.c, putenv.c, regex.c, safe-ctype.c, setenv.c, snprintf.c, + sort.c, spaces.c, splay-tree.c, stpcpy.c, stpncpy.c, strndup.c, + strtod.c, ternary.c, unlink-if-ordinary.c, vasprintf.c, + vsnprintf.c, vsprintf.c, xexit.c, xmalloc.c, xstrndup.c + +2005-05-06 Kelley Cook + + * aclocal.m4 (AC_DEFINE_NOAUTOHEADER): Remove. + * configure.ac: Replace any AC_DEFINE_NOAUTOHEADER with AC_DEFINE. + * configure: Regenerate. + +2005-05-06 Kelley Cook + + * configure.ac: Use AC_C_BIGENDIAN instead of AC_C_BIGENDIAN_CROSS. + Use AC_CHECK_SIZEOF instead of AC_COMPILE_CHECK_SIZEOF. + * aclocal.m4: Don't include accross.m4. + * configure, config.in: Regenerate. + +2005-04-25 Kaveh R. Ghazi + + * fopen_unlocked.c (unlock_std_streams): New. + + * functions.texi: Regenerate. + +2005-04-16 Kaveh R. Ghazi + + * fopen_unlocked.c (unlock_stream): New. + Consolidate unlocking code into a helper function. + + * functions.texi: Regenerate. + +2005-04-13 Gabriel Dos Reis + + * asprintf.c: Include config.h. + * basename.c: Likewise. + * fdmatch.c: Likewise. + * hex.c: Likewise. + * lbasename.c: Likewise. + * spaces.c: Likewise. + * xatexit.c:Likewise. + * configure.ac: Do check declarations for basename, ffs, asprintf + and vasprintf for real. + * configure: Regenerate. + +2005-04-13 Gabriel Dos Reis + + * argv.c (dupargv): Allocate space of argv[argc], not + sizeof(char *) of that amount. Cast result to char *. + +2005-04-12 Gabriel Dos Reis + + * regex.c (wcs_re_match_2_internal, byte_re_match_2_internal): + Replace not with negate. + +2005-04-12 Gabriel Dos Reis + + * configure.ac: Check declarations for basename, ffs, asprintf, + vasprintf. + * configure: Regenerate. + * config.in: Likewise. + +2005-04-11 Kaveh R. Ghazi + + * Makefile.in (CFILES): Add fopen_unlocked.c. + (REQUIRED_OFILES): Add ./fopen_unlocked.o. + Regenerate dependencies. + + * configure.ac: Check for stdio_ext.h and __fsetlocking. + + * fopen_unlocked.c: New file. + + * functions.texi, configure, config.in: Regenerate. + +2005-04-04 Ian Lance Taylor + + * testsuite/test-pexecute.c (TEST_PEX_RUN): Move variable + declaration before statement. + +2005-04-02 Kaveh R. Ghazi + + * bcmp.c: Fix warnings and implement using memcmp. + * bcopy.c: Fix warnings. + * bzero.c: Fix warnings and implement using memset. + + * configure.ac (ac_libiberty_warn_cflags): Add -Wwrite-strings + -Wstrict-prototypes. + * configure, config.in: Regenerate. + + * bsearch.c, index.c, rindex.c, strstr.c, strtol.c, waitpid.c: Fix + warnings and reconcile interfaces with relevant standards. + +2005-04-02 Ian Lance Taylor + + * cp-demangle.c: Update copyright. + +2005-03-31 Joseph S. Myers + + * gettimeofday.c: Add "Supplemental" to @deftypefn. + * functions.texi: Regenerate. + +2005-03-28 Ian Lance Taylor + + * pex-common.c: New file. + * pex-one.c: New file. + * pexecute.c: New file. + * pex-common.h: Include . + (struct pex_obj): Define. + (struct pex_funcs): Define. + (pex_init_common): Declare. + * pex-unix.c: Rewrite. + * pex-win32.c: Rewrite. + * pex-djgpp.c: Rewrite. + * pex-msdos.c: Rewrite. + * testsuite/text-pexecute.c: New file. + * pexecute.txh: Rewrite. + * configure.ac: Check for wait3 and wait4. Set CHECK to + really-check rather than check-cplus-dem. + * functions.texi: Rebuild. + * Makefile.in: Rebuild dependencies. + (CFILES): Add pexecute.c, pex-common.c, pex-one.c. + (REQUIRED_OFILES): Add pexecute.o, pex-common.o, pex-one.o. + * testsuite/Makefile.in (really-check): New target. + (check-pexecute, test-pexecute): New targets. + * configure: Rebuild. + +2005-03-28 Mark Kettenis + + * unlink-if-ordinary.c: Include . + +2005-03-27 Gabriel Dos Reis + + Convert libiberty to use ISO C prototype style 7/n. + * regex.c (PARAMS): Remove definition. + (PREFIX): Unconditionaly define using ISO C ## operator. + (init_syntax_once, extract_number, extract_number_and_incr, + print_fastmap, print_partial_compiled_pattern, + print_compiled_pattern, print_double_string, printchar, + convert_mbs_to_wcs, re_set_syntax, regex_grow_registers, + regex_compile, store_op1, store_op2, insert_op1, insert_op2, + at_begline_loc_p, at_endline_p, group_in_compile_stack, + insert_space, wcs_compile_range, byte_compile_range, + truncate_wchar, re_compile_fastmap, re_compile_fastmap, + re_set_registers, re_search, re_search_2, re_search_3, re_match, + re_match_2, count_mbs_length, wcs_re_match_2_internal, + byte_re_match_2_internal, group_match_null_string_p, + alt_match_null_string_p, common_op_match_null_string_p, + bcmp_translate, re_compile_pattern, re_comp, re_exec, regcomp, + regexec, regerror, regfree): Use ISO C prototype style. + * partition.c: (elem_compare): Likewise. + * cp-demangle.c (print_usage): Likewise. + +2005-03-27 Gabriel Dos Reis + + Convert libiberty to use ISO C prototype style 5/n. + * random.c (srandom, initstate, setstate, random): Use ISO C + prototypes. + * putenv.c (putenv): Likewise. + * physmem.c (physmem_available, physmem_total, main): Likewise. + * pex-win32.c (fix_argv, pexecute, pwait): Likewise. + * pex-unix.c (pexecute, pwait): Likewise. + * pex-msdos.c (pexecute, pwait): Likewise. + * pex-djgpp.c (pexecute, pwait): Likewise. + * partition.c (partition_new, partition_delete, partition_union) + (elem_compare, partition_print): Likewise. + * obstack.c (_obstack_begin, _obstack_begin_1, _obstack_newchunk, + _obstack_allocated_p, _obstack_free, obstack_free, + _obstack_memory_used, print_and_abort, obstack_next_free, + obstack_object_size, obstack_base): Likewise. Remove codes + predicated on !defined(__STDC__). + * objalloc.c (objalloc_create, _objalloc_alloc, objalloc_free, + objalloc_free_block): Use ISO C prototypes. + * mkstemps.c (mkstemps): Likewise. + * memset.c (memset): Likewise. + * mempcpy.c (mempcpy): Likewise. + * rename.c (rename): Likewise. + * rindex.c (rindex): Likewise. + * setenv.c (setenv, unsetenv): Likewise. + * sigsetmask.c (sigsetmask): Likewise. + * snprintf.c (snprintf): Likewise. + * sort.c (sort_pointers, xmalloc): Likewise. + * spaces.c (spaces): Likewise. + * splay-tree.c (splay_tree_delete_helper, + splay_tree_splay_helper, splay_tree_splay, + splay_tree_foreach_helper, splay_tree_xmalloc_allocate, + splay_tree_new, splay_tree_xmalloc_allocate, + splay_tree_new_with_allocator, splay_tree_delete, + splay_tree_insert, splay_tree_remove, splay_tree_lookup, + splay_tree_max, splay_tree_min, splay_tree_predecessor, + splay_tree_successor, splay_tree_foreach, + splay_tree_compare_ints, splay_tree_compare_pointers): Likewise. + * stpcpy.c (stpcpy): Likewise. + * stpncpy.c (stpncpy): Likewise. + * strcasecmp.c (strcasecmp): Likewise. + * strchr.c (strchr): Likewise. + * strdup.c (strdup): Likewise. + +2005-03-27 Gabriel Dos Reis + + Convert libiberty to use ISO C prototype style 6/n. + * strerror.c (init_error_tables, errno_max, strerror, strerrno, + strtoerrno, main): Use ISO C prototype style. + * strncasecmp.c (strncasecmp): Likewise. + * strncmp.c (strncmp): Likewise. + * strndup.c (strndup): Likewise. + * strrchr.c (strrchr): Likewise. + * strsignal.c (init_signal_tables, signo_max, strsignal, + strsigno, strtosigno, psignal, main): Likewise. + * strstr.c (strstr): Likewise. + * strtod.c (strtod, atof): Likewise. + * strtol.c (strtol): Likewise. + * strtoul.c (strtoul): Likewise. + * ternary.c (ternary_insert, ternary_cleanup, ternary_search, + ternary_recursivesearch): Likewise. + * tmpnam.c (tmpnam): Likewise. + * unlink-if-ordinary.c (unlink_if_ordinary): Likewise. + * vasprintf.c (int_vasprintf, vasprintf, checkit, main): Likewise. + * vfork.c (vfork): Likewise. + * vfprintf.c (vfprintf): Likewise. + * vprintf.c (vprintf): Likewise. + * vsnprintf.c (vsnprintf, checkit, main): Likewise. + * vsprintf.c (vsprintf): Likewise. + * waitpid.c (waitpid): Likewise. + * xatexit.c (xatexit, xatexit_cleanup): Likewise. + * xexit.c (xexit): Likewise. + * xmalloc.c (xmalloc_set_program_name, xmalloc_failed, xmalloc, + xcalloc, xrealloc): Likewise. + * xmemdup.c (xmemdup): Likewise. + * xstrdup.c (xstrdup): Likewise. + * xstrerror.c (xstrerror): Likewise. + * xstrndup.c (xstrndup): Likewise. + +2005-03-27 Andreas Jaeger + + * configure.ac (ac_c_preproc_warn_flag): Remove -Wtraditional + flags. + * configure: Regenerated. + +2005-03-27 Gabriel Dos Reis + + * getopt1.c (getopt_long_only): Fix thinko. + +2005-03-27 Gabriel Dos Reis + + Convert libiberty to use ISO C prototype style 4/n. + * hashtab.c (higher_prime_index, hash_pointer, eq_pointer, + htab_size, htab_elements, htab_mod_1, htab_mod, htab_mod_m2, + htab_create_alloc, htab_set_functions_ex, htab_create, + htab_try_create, htab_delete, htab_empty, + find_empty_slot_for_expand, htab_expand, htab_find_with_hash, + htab_find, htab_find_slot_with_hash, htab_find_slot, + htab_remove_elt, htab_remove_elt_with_hash, htab_clear_slot, + htab_traverse_noresize, htab_traverse, htab_collisions, + htab_hash_string, iterative_hash): Use ISO C prototype. + * hex.c (hex_init): Likewise. + * index.c (index): Likewise. + * insque.c (insque, remque): Likewise. + * lbasename.c (lbasename): Likewise. + * lrealpath.c (lrealpath): Likewise. + * make-relative-prefix.c (save_string, split_directories, + free_split_directories, make_relative_prefix): Likewise. + * make-temp-file.c (try, choose_tmpdir, make_temp_file): Likewise. + * md5.c (md5_init_ctx, md5_read_ctx, md5_finish_ctx, md5_stream, + md5_buffer, md5_process_bytes, md5_process_block): Likewise. + * memchr.c (memchr): Likewise. + * memcpy.c (memcpy): Likewise. + * memmove.c (memmove): Likewise. + * gettimeofday.c (gettimeofday): Likewise. + * getruntime.c (get_run_time): Likewise. + * getpwd.c (getpwd, getpwd): Likewise. + * getpagesize.c (getpagesize): Likewise. + * getopt1.c (getopt_long, getopt_long_only, main): Likewise. + * getopt.c (my_index, exchange, _getopt_initialize, + _getopt_internal, getopt, main): Likewise. + * getcwd.c (getcwd): Likewise. + * fnmatch.c (fnmatch): Likewise. + * floatformat.c (floatformat_always_valid, + floatformat_i387_ext_is_valid, get_field, floatformat_to_double, + put_field, floatformat_from_double, floatformat_is_valid, + ieee_test, main): Likewise. + * fibheap.c (fibheap_new, fibnode_new, fibheap_compare, + fibheap_comp_data, fibheap_insert, fibheap_min, fibheap_min_key, + fibheap_union, fibheap_extract_min, fibheap_replace_key_data, + fibheap_replace_key, fibheap_replace_data, fibheap_delete_node, + fibheap_delete, fibheap_empty, fibheap_extr_min_node, + fibheap_ins_root, fibheap_rem_root, fibheap_consolidate, + fibheap_link, fibheap_cut, fibheap_cascading_cut, + fibnode_insert_after, fibnode_remove): Likewise. + * ffs.c (ffs): Likewise. + * fdmatch.c (fdmatch): Likewise. + * dyn-string.c (dyn_string_init, dyn_string_new, + dyn_string_delete, dyn_string_release, dyn_string_resize, + dyn_string_clear, dyn_string_copy, dyn_string_copy_cstr, + dyn_string_prepend, dyn_string_prepend_cstr, dyn_string_insert, + dyn_string_insert_cstr, dyn_string_insert_char, + dyn_string_append, dyn_string_append_cstr, + dyn_string_append_char, dyn_string_substring, dyn_string_eq): + Likewise. + +2005-03-27 Gabriel Dos Reis + + Convert libiberty to use ISO C prototype style 3/n. + * cplus-dem.c (set_cplus_marker_for_demangling, consume_count, + consume_count_with_underscores, code_for_qualifier, + qualifier_string, demangle_qualifier, cplus_demangle_opname, + cplus_mangle_opname, cplus_demangle_set_style, + cplus_demangle_name_to_style, cplus_demangle, grow_vect, + ada_demangle, internal_cplus_demangle, squangle_mop_up, + work_stuff_copy_to_from, delete_non_B_K_work_stuff, + delete_work_stuff, mop_up, demangle_signature, + demangle_method_args, demangle_template_template_parm, + demangle_expression, demangle_integral_value, + demangle_real_value, demangle_template_value_parm, + demangle_template, arm_pt, demangle_arm_hp_template, + demangle_class_name, demangle_class, iterate_demangle_function, + demangle_prefix, gnu_special, recursively_demangle, arm_special, + demangle_qualified, get_count, do_type, demangle_fund_type, + do_hpacc_template_const_value, do_hpacc_template_literal, + snarf_numeric_literal, do_arg, remember_type, remember_Ktype, + register_Btype, remember_Btype, forget_B_and_K_types, + forget_types, demangle_args, demangle_nested_args, + demangle_function_name, string_need, string_delete, string_init, + string_clear, string_empty, string_append, string_appends, + string_appendn, string_prepend, string_prepends, string_prependn, + string_append_template_idx): Use ISO C prootype style. + * cp-demint.c (cplus_demangle_fill_component, + cplus_demangle_fill_builtin_type, cplus_demangle_fill_operator, + cplus_demangle_v3_components): Likewise. + +2005-03-26 Gabriel Dos Reis + + Convert libiberty to use ISO C prototype style 2/n. + * cp-demangle.h: Remove uses of PARAMS. + * cp-demangle.c: Likewise. + (d_dump, cplus_demangle_fill_name, + cplus_demangle_fill_extended_operator, cplus_demangle_fill_ctor, + cplus_demangle_fill_dtor, d_make_empty, d_make_comp, d_make_name, + d_make_builtin_type, d_make_operator, d_make_extended_operator, + d_make_ctor, d_make_dtor, d_make_template_param, d_make_sub, + cplus_demangle_mangled_name, has_return_type, + is_ctor_dtor_or_conversion, d_encoding, d_name, d_nested_name, + d_prefix, d_unqualified_name, d_source_name, d_number, + d_identifier, d_operator_name, d_special_name, d_call_offset, + d_ctor_dtor_name, cplus_demangle_type, d_cv_qualifiers, + d_function_type, d_bare_function_type, d_class_enum_type, + d_array_type, d_pointer_to_member_type, d_template_param, + d_template_args, d_template_arg, d_expression, d_expr_primary, + d_local_name, d_discriminator, d_add_substitution, + d_substitution, d_print_resize, d_print_append_char, + d_print_append_buffer, d_print_error, cplus_demangle_print, + d_print_comp, d_print_java_identifier, d_print_mod_list, + d_print_mod, d_print_function_type, d_print_array_type, + d_print_expr_op, d_print_cast, cplus_demangle_init_info, + d_demangle, __cxa_demangle, cplus_demangle_v3, java_demangle_v3, + is_ctor_or_dtor, is_gnu_v3_mangled_ctor, is_gnu_v3_mangled_dtor, + print_usage, main): + +2005-03-26 Gabriel Dos Reis + + Convert libiberty to ISO C prototype style 1/n. + * _doprnt.c: Remove conditional #include on + ANSI_PROTOTYPES as the latter is always assumed. + (_doprnt, checkit, main): Use ISO C prototype. + * alloca.c (find_stack_direction, C_alloca): Use ISO C prototype. + * argv.c: Remove conditional #includes on ANSI_PROTOTYPES. + (dupargv, freeargv, buildargv, main): Use ISO C prototype. + * atexit.c (atexit): Likewise + * asprintf.c: Remove conditional include on ANSI_PROTOTYPES. + (asprintf): Use ISO C prototype. + * basename.c (basename): Likewise + * bcmp.c (bcmp): Likewise. + * bcopy.c (bcopy): Likewise. + * bzero.c (bzero): Likewise. + * bsearch.c (bsearch): Likewise. Improve const-correctness. + * choose-temp.c (choose_temp_base): Likewise. + * calloc.c: Remove conditional #include on ANSI_PROTOTYPES. + (calloc): Use ISO C prototype. + * clock.c (clock): Likewise. + * concat.c: Remove conditional #include on ANSI_PROTOTYPES. + (vconcat_length, vconcat_copy, concat_length, concat_copy, + concat_copy2, concat, reconcat, main): Use ISO C prototype. + * copysign.c (copysign): Likewise. + +2005-03-24 Kaveh R. Ghazi + + * Makefile.in (CFILES): Add strndup.c and xstrndup.c. + (REQUIRED_OFILES): Add xstrndup.o. + (CONFIGURED_OFILES): Add strndup.o. + Regenerate dependencies. + + * configure.ac (funcs, AC_CHECK_FUNCS): Add strndup. + + * strndup.c, xstrndup.c: New. + + * config.in, configure, functions.texi: Regenerate. + +2005-03-24 Kaveh R. Ghazi + + * xmemdup.c, xstrdup.c: Expose the tail call. + +2005-03-09 Mark Mitchell + + * configure.ac (funcs): Add gettimeofday. + * configure: Regenerated. + * gettimeofday.c: New file. + * Makefile.in (CFILES): Add gettimeofday. + (CONFIGURED_OFILES): Add gettimeofday.o. + (./gettimeofday.o): New rule. + +2005-03-09 Ian Lance Taylor + + * pex-os2.c: Remove. + * configure.ac: Remove *-*-os2-emx* case when setting pexecute. + * Makefile.in (CFILES): Remove pex-os2.c. + (CONFIGURED_OFILES): Remove pex-os2.o. + (pex-os2.o): Remove target. + * configure: Rebuild. + +2005-03-07 Ian Lance Taylor + + * mpw-config.in: Remove. + * mpw-make.sed: Remove. + * mpw.c: Remove. + * Makefile.in (CFILES): Remove pex-mpw.c. + (CONFIGURED_OFILES): Remove pex-mpw.o. + (mpw.o, pex-mpw.o): Remove targets. + * maint-tool (undoc): Remove reference to mpw.c. + +2005-03-06 DJ Delorie + + * configure.ac (target_header_dir): vfork is a stub under djgpp. + * configure: Regenerated. + +2005-03-01 Jan Beulich + + * Makefile.in (CFILES): Add unlink-if-ordinary.c + (REQUIRED_OFILES): Add unlink-if-ordinary.o. + Add dependencies and rule for unlink-if-ordinary.o. + * unlink-if-ordinary.c: New. + +2005-03-01 Ben Elliston + + * hashtab.c (htab_find_slot_with_hash): Make function + documentation clearer. + +2005-02-13 Jason Merrill + + * cp-demangle.c (__cxa_demangle): Change resolution of ambiguous + arguments. + +2005-01-11 Tobias Schl"uter + + * hex.c (hex_value): Group 'unsigned int' together to get correct + markup. + * functions.texi: Regenerated. + +2004-12-27 H.J. Lu + + * Makefile.in: Undo to 2004-12-17. + * aclocal.m4: Likewise. + * config.table: Likewise. + * configure.ac: Likewise. + * maint-tool: Likewise. + * configure: Likewise. + +2004-12-19 H.J. Lu + + PR bootstrap/19072 + * Makefile.in (enable_shared): New substitute. + (LTTARGETLIB): New. + (PREFIXTARGETLIB): New. + (LTTESTLIB): New. + (PREFIXTESTLIB): New. + (CCLD): New. + (LINK): New. + ($(TARGETLIB)): Use $(LINK) to create libraries and create + targets by hand. + ($(TESTLIB)): Likewise. + (mostlyclean): Don't remove .libs. Remove the libtool object + directory. + + * config.table (enable_shared): Removed. + + * configure.ac (enable_static): Set to yes. + (AC_PROG_LIBTOOL): Removed. + (AM_DISABLE_SHARED): Uncommented. + (AM_PROG_LIBTOOL): Likewise. + (LIBOBJS): Add `./' to avoid VPATH. + (LTLIBOBJS): Likewise. + (enable_shared): Substitute. + * configure: Regenerated. + +2004-12-18 H.J. Lu + + * Makefile.in (top_builddir): Set to `.'. + (OUTPUT_OPTION): Removed. + (LIBTOOL): New. + (LTLIBOBJS): New. + (EXTRA_LTOFILES): New. + (FLAGS_TO_PASS): Add EXTRA_LTOFILES. + (all): Remove stamp-picdir. + (LTCOMPILE): New. + (.c.lo): New rule. + (REQUIRED_LTOFILES): New. + (CONFIGURED_LTOFILES): New. + ($(TARGETLIB)): Check .libs for PIC object files. Depend on + $(REQUIRED_LTOFILES) $(EXTRA_LTOFILES) $(LTLIBOBJS). + (stamp-picdir): Completely removed. + (maint-missing): Pass $(REQUIRED_LTOFILES) + $(CONFIGURED_LTOFILES) instead of (REQUIRED_OFILES) + $(CONFIGURED_OFILES) + (maint-buildall): Depend on $(REQUIRED_LTOFILES) + $(CONFIGURED_LTOFILES). + (mostlyclean): Also remove *.lo .libs. + Run "make maint-deps". + + * aclocal.m4: Include ../libtool.m4. + + * config.table: Don't check --enable-shared. + + * configure.ac (AC_PROG_LIBTOOL): Add. + (AC_PROG_CC_C_O): Removed. + (OUTPUT_OPTION): Removed. + (NO_MINUS_C_MINUS_O): Removed. + (ltpexecute): New substitute. + (LIBOBJS): Cleanup. + * configure: Regenerated. + + * maint-tool: Updated for .lo/libtool. + +2004-12-11 Ben Elliston + + * configure.ac: Invoke AC_CHECK_SIZEOF for sizeof (int). + * configure: Regenerate. + * config.in: Likewise. + +2004-12-07 DJ Delorie + + * splay-tree.c (splay_tree_delete_helper): Redesign the logic so + that recursion (and thus large stack space) is not needed. + +2004-11-29 Matt Kraai + + * pex-unix.c: Fix the spelling of longjmp. + +2004-11-23 Ian Lance Taylor + + PR other/18623 + * cp-demangle.c (d_call_offset): Remove useless local variables + offset and virtual_offset. + * cplus-dem.c (ada_demangle): Remove useless local variable + at_start_name. + (demangle_template): Remove useless local variable start. + +2004-11-19 Roger Sayle + + * objalloc.c, strsignal.c, xstrerror.c: Include "config.h" before + "ansidecl.h" to avoid redeclaration errors with native compilers. + * regex.c: Protect config.h from multiple inclusion. + +2004-11-12 Mike Stump + + * Makefile.in (libiberty.html): Fix html generation. + +2004-09-08 Adam Nemet + + * vasprintf.c: Accept __va_copy in addition to va_copy. + +2004-09-03 Paolo Bonzini + + * configure: Regenerate. + +2004-09-02 Paolo Bonzini + + * configure.ac: Do not enable multilibs for build-side libiberty. + +2004-06-29 Danny Smith + + * lrealpath.c (lrealpath): Add _WIN32 support. + +2004-06-28 Zack Weinberg + + * cp-demangle.h: Declare cplus_demangle_operators, + cplus_demangle_builtin_types, cplus_demangle_mangled_name, and + cplus_demangle_type as static if IN_GLIBCPP_V3. + +2004-06-28 Ian Lance Taylor + + PR other/16240 + * cp-demangle.c (d_expr_primary): Check for a failure return from + cplus_demangle_type. + * testsuite/demangle-expected: Add test case. + +2004-05-31 Danny Smith + + * pex-win32.c (fix_argv): Expand comment. + +2004-05-25 Daniel Jacobowitz + + * Makefile.in: Add .NOEXPORT. + +2004-04-29 Douglas B Rupp + + * mkstemps.c (mkstemps) [VMS]: Remove special open option. Update + copyright. + +2004-04-26 Maciej W. Rozycki + + * configure.ac (UNSIGNED_64BIT_TYPE): Unquote the definition. + * configure: Regenerate. + +2004-04-22 Richard Henderson + + * hashtab.c: Include limits.h, stdint.h, ansidecl.h. + (CHAR_BIT): Provide default. + (struct prime_ent, prime_tab): New. + (higher_prime_index): Rename from higher_prime_number, return index. + (htab_mod_1): New. + (htab_mod, htab_mod_m2): Use it. + (htab_create_alloc, htab_create_alloc_ex): Store prime index. + (htab_expand): Likewise. + * configure.ac: Check for stdint.h. + (UNSIGNED_64BIT_TYPE): New define and checks to fill it in. + * config.in, configure: Rebuild. + +2004-04-13 Ian Lance Taylor + + * strerror.c: Include config.h, and redefine sys_nerr and + sys_errlist, before including ansidecl.h and libiberty.h. + +2004-04-13 Jeff Law + + * hashtab.c (htab_remove_elt_with_hash): New function. + (htab_remove_elt): Implement in terms of htab_remove_elt_with_hash. + +2004-03-31 Richard Henderson + + * hashtab.c (htab_size): Move to top of file; mark inline. + (htab_elements): Likewise. + (htab_mod, htab_mod_m2): New. + (htab_delete): Refactor htab->size and htab->entries. + (htab_empty): Likewise. + (find_empty_slot_for_expand): Use htab_size, htab_mod, htab_mod_m2. + (htab_find_with_hash, htab_find_slot_with_hash): Likewise. + (htab_clear_slot): Use htab_size, htab_elements. + (htab_traverse_noresize, htab_traverse): Likewise. + +2004-03-17 Ian Lance Taylor + + * pex-unix.c (pexecute): Use vfork instead of fork, with + appropriate changes to make this safe. + * pex-common.h (STDERR_FILE_NO): Define. + + * Makefile.in: Clean up REQUIRED_OFILES and CONFIGURED_OFILES for + an 80 column screen. Run maint-deps. + +2004-03-09 Kelley Cook + + * configure.ac: Bump version to 2.59. Apply suggested autoupdates. + * acconfig.h: Delete redundant file. + * config.in: Regenerate. + * configure: Regenerate. + +2004-03-09 Hans-Peter Nilsson + + * configure: Regenerate for config/accross.m4 correction. + +2004-03-07 Andreas Jaeger + + * testsuite/test-demangle.c: Include and for + prototypes. + (main): Initialize style. + +2004-02-24 Ian Lance Taylor + + * cp-demangle.h (enum d_builtin_type_print): Add D_PRINT_UNSIGNED, + D_PRINT_UNSIGNED_LONG, D_PRINT_LONG_LONG, + D_PRINT_UNSIGNED_LONG_LONG, D_PRINT_FLOAT. + * cp-demangle.c (cplus_demangle_builtin_types): Change char and + short types to D_PRINT_DEFAULT. Change other integer types to use + new D_PRINT_* values where appropriate. Change float types to + D_PRINT_FLOAT. + (d_print_comp) [LITERAL, LITERAL_NEG]: Handle new D_PRINT_* + values. + * testsuite/demangle-expected: Adjust two test cases. + + * cp-demangle.c (d_print_function_type): Print a space before the + parenthesis around the function type in more cases. + * testsuite/demangle-expected: Adjust one test case. + + * cp-demangle.c (d_print_comp) [UNARY]: Don't emit extra + parentheses around a cast. + * testsuite/demangle-expected: Adjust two test cases to match new + output. + + * cp-demangle.c (__cxa_demangle): Pass DMGL_PARAMS to d_demangle. + + * cp-demangle.c (d_print_comp) [RESTRICT, VOLATILE, CONST]: Don't + push more than one of the same CV-qualifier on the top of the + stack. + (d_print_comp) [ARRAY_TYPE]: If the array itself is CV-qualified, + move the CV-qualifiers to apply to the element type instead. + (d_print_array_type): When checking the modifiers, keep looking + past ones which have been printed already. + * testsuite/demangle-expected: Add three test cases. + +2004-02-23 Ian Lance Taylor + + * cp-demangle.c (__cxa_demangle): Adjust last patch to handle + empty string correctly. + + * cp-demangle.c (__cxa_demangle): It is not an error if status is + not NULL. It is an error if the mangled name is the same as a + built-in type name. + (main): If IN_GLIBCPP_V3 is defined, test __cxa_demangle rather + than cplus_demangle_v3. + + * dyn-string.c: Remove test of IN_LIBGCC2 and IN_GLIBCPP_V3 and + the associated #define of RETURN_ON_ALLOCATION_FAILURE. + +2004-02-16 Matt Kraai + + * regex.c: Include . + (regcomp): Cast i to int. + (regerror): Add ATTRIBUTE_UNUSED to parameter preg. + +2004-01-25 Ian Lance Taylor + + * configure.ac: Add m4_pattern_allow(LIBOBJS). + * configure: Regenerate. + +2004-01-22 DJ Delorie + + * Makefile.in: Convert to ./ throughout. Rebuild dependencies + with explicit build rules. + (VPATH): Remove. + (.c.o): Poison. + * configure.ac (pexecute, LIBOBJS): Add ./ . + * maint-tool: Build dependencies with explicit rules. + +2004-01-15 Kazu Hirata + + * strdup.c (strdup): Constify the argument. + +2004-01-14 Loren J. Rittle + + * Makefile.in (distclean): Remove config.cache. + +2004-01-13 Daniel Jacobowitz + + * cp-demangle.c (d_make_comp): DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE + takes two parameters. + * cp-demint.c (cplus_demangle_fill_component): Likewise. + +2004-01-12 Ian Lance Taylor + + * cp-demangle.c: Include "cp-demangle.h". If IN_GLIBCPP_V3 is + defined, rename some functions which are to become static via + #define. + (CP_STATIC_IF_GLIBCPP_V3): Define. + (struct d_operator_info): Move definition to cp-demangle.h, and + rename to demangle_operator_info. Change all uses. + (enum d_builtin_type_print): Move definition to cp-demangle.h. + (struct d_builtin_type_info): Move definition to cp-demangle.h, + and rename to demangle_builtin_type_info. Change all uses. + (enum d_comp_type): Move definition to include/demangle.h, and + rename to demangle_component_type, and change all enums to start + with DEMANGLE_COMPONENT_ instead of D_. Change all uses. + (struct d_comp): Move definition to include/demangle.h, and rename + to demangle_component. Change all uses. + (struct d_info): Move definition to cp-demangle.h. + (cplus_demangle_fill_name): New function. + (cplus_demangle_fill_extended_operator): New function. + (cplus_demangle_fill_ctor): New function. + (cplus_demangle_fill_dtor): New function. + (d_make_empty): Remove type parameter. Change all callers. + (d_make_name): Use cplus_demangle_fill_name. + (d_make_extended_operator): Use + cplus_demangle_fill_extended_operator. + (d_make_ctor): Use cplus_demangle_fill_ctor. + (d_make_dtor): Use cplus_demangle_fill_dtor. + (cplus_demangle_mangled_name): Rename from d_mangled_name. Make + non-static by default. Change all callers. + (cplus_demangle_operators): Rename from d_operators. Change all + uses. Make non-static by default. Add sentinel at end of array. + (d_operator_name): Adjust initialization of high for new sentinel + in cplus_demangle_operators. + (cplus_demangle_builtin_types): Rename from d_builtin_types. + Change all uses. Make non-static by default. Change initializer + to use D_BUILTIN_TYPE_COUNT instead of magic number 26. + (cplus_demangle_type): Rename from d_type. Make non-static by + default. Change all callers. + (cplus_demangle_init_info): Rename from d_init_info. Make + non-static by default. Change all callers. + * cp-demangle.h: New file. + * cp-demint.c: New file. + * Makefile.in: Rebuild dependencies. + (CFILES): Add cp-demint.c. + (REQUIRED_OFILES): Add cp-demint.o. + +2004-01-09 Kelley Cook + + * configure.in: Rename file to ... + * configure.ac: ... this. + * Makefile.in: Update a comment for above change. + * README: Likewise. + * config.in: Regenerate. + +2004-01-02 Ian Lance Taylor + + * cp-demangle.c (d_encoding): When DMGL_PARAMS is not set, strip + CV-qualifiers from D_COMP_LOCAL_NAME right subtree. + * cplus-dem.c (demangle_arm_hp_template): Set DMGL_PARAMS when + demangling template parameters. + * testsuite/test-demangle.c (fail): New static function. + (main): Support new options in input file: --no-params, + --is-v3-ctor, and --is-v3-dtor. + * testsuite/demangle-expected: Add --no-params to most tests, and + add the correct result when parameters are not demangled. Add + some simple tests for V3 constructor/destructor recognition. + +2003-12-25 Kaveh R. Ghazi + + * cp-demangle.c (is_ctor_or_dtor): Fix error in last change. + +2003-12-22 Daniel Jacobowitz + + PR debug/13272 + * Makefile.in (lbasename.o): Depend on filenames.h. + * lbasename.c: Include "filenames.h" instead of defining + its macros locally. + +2003-12-22 Ian Lance Taylor + + * cp-demangle.c (CP_DYNAMIC_ARRAYS): Define if compiler supports + dynamic arrays. + (struct d_operator_info): Add len field. + (struct d_builtin_type_info): Add len and java_len fields. + (struct d_standard_sub_info): Add simple_len, full_len, and + set_last_name_len fields. + (struct d_comp): Add len field to s_string. + (struct d_info): Add send, did_subs, and expansion fields. + (d_append_string_constant): Define. + (d_append_string): Remove. Change all users to use + d_append_string_constant or d_append_buffer instead. + (d_make_sub): Add len parameter. Change all callers. + (d_name): Increase expansion when substituting std::. + (d_unqualified_name): Increase expansion for an operator. + (d_number): Don't use multiplication for negative numbers. + (d_identifier): Make sure there are enough characters in the + string for the specified length. Adjust expansion for an + anonymous namespace. + (d_operators): Initialize len field. + (d_special_name, d_ctor_dtor_name): Increase expansion. + (d_builtin_types): Initialize len and java_len fields. + (d_type): Increase expansion for a builtin type. + (d_cv_qualifiers): Increase expansion for each qualifier. + (d_bare_function_type): Decrease expansion when removing single + void parameter. + (d_template_param): Increment did_subs. + (d_expression): Increase expansion for an operator. + (d_expr_primary): Decrease expansion for a type we will print + specially. + (standard_subs): Initialize new fields. + (d_substitution): Increment did_subs when doing a normal + substitution. Increase expansion for a special substitution. + (d_print): Add estimate parameter. Change all callers. + (d_print_comp) [D_COMP_NAME]: Handle C++ case inline. + (d_print_comp) [D_COMP_BINARY]: Use length to avoid strcmp call. + (d_print_java_identifier): Rename from d_print_identifier. Handle + only Java case. Change caller. + (d_init_info): Change return type to void. Change all callers. + Initialize send, did_subs, and expansion fields. Do not + initialize comps and subs fields. + (d_demangle): Ifdef CP_DYNAMIC_ARRAYS, allocate comps and subs + arrays on stack. Make an estimate of the length of the demangled + name. Ifdef CP_DEMANGLE_DEBUG, print estimation failures. + (is_ctor_or_dtor): Ifdef CP_DYNAMIC_ARRAYS, allocate comps and + subs arrays on stack. + +2003-12-20 Ian Lance Taylor + + * cp-demangle.c (d_identifier): In Java mode, skip an optional '$' + after the identifier. + * testsuite/demangle-expected: Add test case. + +2003-12-19 Ian Lance Taylor + + Fix for PR c++/13447: + * cp-demangle.c (enum d_comp_type): Add D_COMP_LOCAL_NAME. + (d_dump, d_make_comp): Handle D_COMP_LOCAL_NAME. + (is_ctor_dtor_or_conversion): Handle D_COMP_LOCAL_NAME like + D_COMP_QUAL_NAME. + (is_ctor_or_dtor): Likewise. + (d_local_name): Use D_COMP_LOCAL_NAME rather than + D_COMP_QUAL_NAME. + (d_print_comp) [D_COMP_LOCAL_NAME]: New. + (d_prinT_comp) [D_COMP_TYPED_NAME]: If the left tree is + D_COMP_LOCAL_NAME, pull any qualifiers off its right subtree. + (d_print_mod_list): Handle D_COMP_LOCAL_NAME. + * testsuite/demangle-expected: Add two test cases. + + * cp-demangle.c (d_print_function_type): Clear the global modifier + list when printing the modifiers, not just when printing the + function parameters. + * testsuite/demangle-expected: Add two test cases. + +2003-12-15 Ian Lance Taylor + + * cp-demangle.c (d_print_function_type): Print the function + parameters with no modifiers. + * testsuite/demangle-expected: Add test case. + + * cp-demangle.c (d_demangle): If DMGL_PARAMS is not set, don't + expect that we've read the entire string. + (is_ctor_or_dtor): Don't expect that we've read the entire + string--reverse patch of 2003-11-29. + +2003-12-15 Brendan Kehoe + + * libiberty/Makefile.in (floatformat.o): Add dependency on + config.h to accompany change of 2003-12-03. + +2003-12-15 Ian Lance Taylor + + Fix handling of constructor/destructor of standard substitution: + * cp-demangle.c (struct d_standard_sub_info): Define. + (d_substitution): Add prefix argument. Change all callers. + Rework handling of standard substitutions to print full name when + qualifying a constructor/destructor, or when DMGL_VERBOSE is set. + * testsuite/demangle-expected: Add test case. + + Fix handling of negative literal constants: + * cp-demangle.c (enum d_comp_type): Add D_COMP_LITERAL_NEG. + (d_dump, d_make_comp): Handle D_COMP_LITERAL_NEG. + (d_expr_primary): Use D_COMP_LITERAL_NEG for a negative number. + (d_print_comp): Handle D_COMP_LITERAL_NEG. + * testsuite/demangle-expected: Add test case. + +2003-12-04 Ian Lance Taylor + + * cp-demangle.c (IS_UPPER, IS_LOWER): Define. + (d_last_char): Define new macro. + (d_make_name): Reject an empty name. + (d_prefix, d_unqualified_name, d_type): Use new IS_* macros. + (d_substitution, d_print_identifier): Likewise. + (d_print_comp) [D_COMP_OPERATOR]: Likewise. + (d_print_comp) [D_COMP_TEMPLATE]: Use new d_last_char macro. + (d_print_mod) Use new d_last_char macro. + (d_print_cast): Use new d_last_char macro. + (is_ctor_or_dtor): Don't leak memory. + + Fix handling of member function modifiers: + * cp-demangle.c (enum d_comp_type): Add D_COMP_RESTRICT_THIS, + D_COMP_VOLATILE_THIS, and D_COMP_CONST_THIS. + (d_dump): Dump new d_comp_type values. + (d_make_comp): Accept new d_comp_type values. + (has_return_type): Only accept _THIS variants of qualifiers. + (d_encoding): Without DMGL_PARAMS, only remove _THIS variants of + qualifiers. + (d_cv_qualifiers): Add member_fn parameter. Change all callers. + (d_print_comp) [D_COMP_TYPED_NAME]: Rather than removing + qualifiers and printing them at the end, add _THIS qualifiers to + the modifier list. + (d_print_comp) [D_COMP_*_THIS]: New cases. + (d_print_comp) [D_COMP_PTRMEM_TYPE]: Remove special handling of + qualifiers. + (d_print_mod_list): Add suffix parameter. Change all callers. + Keep walking the list even if the current modifier has been + printed. + (d_print_mod): Handle new _THIS qualifiers. + (d_print_function_type): Handle new _THIS qualifiers when deciding + whether to print a parenthesis. Put a space before the + parenthesis in some cases. Call d_print_mod_list again at the + end, passing suffix as 1. + (is_ctor_or_dtor): Look for new _THIS qualifiers. + * testsuite/demangle-expected: Add test case. + + Fix for PR gcc/13304: + * cp-demangle.c (d_print_comp) [D_COMP_TEMPLATE]: If the character + before the '<' is itself a '<', insert a space. + (d_print_cast): Likewise. + * testsuite/demangle-expected: Add test case. + + Fix for PR gcc/13244: + * cp-demangle.c (d_print_comp) [D_COMP_BINARY]: Wrap an expression + which uses the '>' operator in an extra layer of parens. + * testsuite/demangle-expected: Add test case. + +2003-12-03 Ian Lance Taylor + + * floatformat.c: Include "config.h" and if available. + (INFINITY, NAN): Define if not defined by . + (floatformat_to_double): Handle NaN, infinity, and denormalized + numbers. + (floatformat_from_double): Likewise. + (ieee_test): In debugging code, use little endian rather than big + endian. Correct tests to handle NaN and to check correct sign of + zero. Omit m68k extended test. + (main): Add more debugging cases. + +2003-11-29 Ian Lance Taylor + + * cp-demangle.c (d_demangle): Only return success if we consumed + the entire demangled string. + (is_ctor_or_dtor): Likewise. + + * testsuite/demangle-expected: Revert one part of 2003-06-26 patch + to restore expected result of EDG test case to original expected + result. + +2003-11-26 Ian Lance Taylor + + * cp-demangle.c (struct d_print_mod): Add templates field. + (d_make_builtin_type): Check for NULL type. + (d_make_extended_operator): Check for NULL name. + (d_make_ctor, d_make_dtor): Likewise. + (d_mangled_name): Add top_level parameter. Change all callers. + (d_encoding): If DMGL_PARAMS is not set, strip off initial + CV-qualifiers. + (d_type): Check some return values we rely on. + (d_bare_function_type, d_array_type): Likewise. + (d_pointer_to_member_type, d_template_args): Likewise. + (d_add_substitution): Fail if argument is NULL. + (d_print_resize): Check whether buf is NULL. + (d_print_comp): Save current templates list with each modifier. + Don't pass the modifier list down when printing a template. + (d_print_cast): Don't pass the modifier list down when printing a + template. + (d_print_mod_list): Temporarily set templates list while printing + a modifier. + (d_print_mod): Check that buf is not NULL before using it. + (d_print_function_type): Print parens if there is no modifier. + (d_init_info): Permit as many substitutions as there are + characters in the mangled name. + * testsuite/demangle-expected: Add two new test cases. + +2003-11-25 Ian Lance Taylor + + * cp-demangle.c (java_demangle_v3): Pass DMGL_PARAMS to + d_demangle. + +2003-11-22 Ian Lance Taylor + + * cp-demangle.c (d_encoding): Add top_level parameter. Change all + callers. + (print_usage): Display new -p option. + (long_options): Add --no-params. + (main): Accept and handle -p. + +2003-11-21 Ian Lance Taylor + + * cp-demangle.c (has_return_type): Skip qualifiers when checking + whether we have a template. + * testsuite/demangle-expected: Add four new tests. + +2003-11-20 Ian Lance Taylor + + * testsuite/demangle-expected: Minor changes to match output of + new demangler: adjust whitespace in four tests, and change order + of qualifiers in one test. + + * cp-demangle.c: Complete rewrite. + +2003-11-19 Mark Mitchell + + * cp-demangle.c (demangle_type): Correct thinko in substitution + processing. + +2003-11-18 Ian Lance Taylor + + * cp-demangle.c (demangle_operator_name): Remove space before + "sizeof". + (demangle_type_ptr): Put qualifiers in the right place. Handle + qualifiers in pointer to member specially. + (demangle_type): Handle qualifiers for pointer or reference + specially. Handle function type. + (demangle_local_name): Save and restore caret around demangling of + initial encoding. + + * testsuite/test-demangle.c (main): Don't pass DMGL_VERBOSE to + cplus_demangle. + + * testsuite/Makefile.in (test-demangle): Depend upon libiberty.a. + +2003-10-31 Andreas Jaeger + + * floatformat.c (floatformat_always_valid): Add unused attribute. + +2003-10-30 Josef Zlomek + + Jan Hubicka + * vasprintf.c (int_vasprintf): Pass va_list by value. + Use va_copy for copying va_list. + (vasprintf): Pass va_list by value. + +2003-10-30 Josef Zlomek + + * hashtab.c (htab_find_slot_with_hash): Decrease n_deleted + instead of increasing n_elements when inserting to deleted slot. + +2003-10-20 J. Brobecker + + * cplus-dem.c (demangle_template): Register a new Btype only + when needed. + * testsuite/demangle-expected: Add a new test. + +2003-10-16 H.J. Lu + + * testsuite/demangle-expected: Update the expected output of + _GLOBAL__I__Z2fnv. + +2003-10-02 Daniel Jacobowitz + + * strerror.c: Revert last change. Declare static sys_nerr + and sys_errlist using different names. + +2003-10-01 Daniel Jacobowitz + + * strerror.c: Don't provide or reference sys_errlist if + strerror is available. + +2003-10-01 H.J. Lu + + * configure.in: Check if $MAKEINFO is missing. + * configure: Regenerated. + +2003-09-24 Daniel Jacobowitz + + * configure.in: Use AC_PROG_CPP_WERROR. + * configure: Regenerated. + +2003-09-22 Andrew Cagney + + * floatformat.c (floatformat_i387_ext_is_valid): New function. + (floatformat_always_valid): New function. + (floatformat_i387_ext): Initialize new "is_valid" field to + "floatformat_i387_ext_is_valid". + (floatformat_ieee_single_little): Initialize "is_valid" field to + floatformat_always_valid. + (floatformat_ieee_double_big): Ditto. + (floatformat_ieee_double_little): Ditto. + (floatformat_ieee_double_little): Ditto. + (floatformat_ieee_double_littlebyte_bigword): Ditto. + (floatformat_i960_ext): Ditto. + (floatformat_m88110_ext): Ditto. + (floatformat_m88110_harris_ext): Ditto. + (floatformat_arm_ext_big): Ditto. + (floatformat_arm_ext_littlebyte_bigword): Ditto. + (floatformat_ia64_spill_big): Ditto. + (floatformat_ia64_spill_little): Ditto. + (floatformat_ia64_quad_big): Ditto. + (floatformat_ia64_quad_little): Ditto. + (floatformat_ia64_quad_little): Ditto. + (floatformat_is_valid): Call "is_valid". + +2003-09-15 Andrew Cagney + + * floatformat.c (get_field): Make "data" constant. + (floatformat_is_valid, floatformat_to_double): Make "from" + constant, fix casts. + (floatformat_from_double): Make "from" constant. + +2003-09-15 Daniel Jacobowitz + + * floatformat.c (floatformat_is_valid): New function. + (get_field, put_field): Correct comments. + +2003-09-06 Josef Zlomek + + * fibheap.c (fibheap_replace_key_data): Change type of OKEY to + FIBHEAPKEY_T. + +2003-09-02 John David Anglin + + PR bootstrap/12100 + * aclocal.m4 (AC_LANG_FUNC_LINK_TRY): Define. + * configure: Rebuilt. + +2003-08-27 Daniel Jacobowitz + + * aclocal.m4: Include acx.m4 and no-executables.m4. + (libiberty_AC_FUNC_STRNCMP): Use AC_LIBOBJ. + (LIB_AC_PROG_CC): Remove. + * configure.in: Update AC_PREREQ to 2.57. Use GCC_NO_EXECUTABLES. + Use AC_PROG_CC and set ac_libiberty_warn_cflags instead of using + LIB_AC_PROG_CC. Use AC_LIBOBJ. Call AC_ISC_POSIX later, only if + performing link tests. + * configure: Regenerated. + +2003-08-12 Nathanael Nerode + + * cp-demangle.c: Clarify what package(s) this is part of. + +2003-07-05 Danny Smith + + * pex-win32.c (pexecute): Mark parameters this_pname and + temp_base as unused. Remove unused variables retries, + sleep_interval. Initialize org_stdin, org_stdout. + (pwait): Mark parameter flags as unused. + +2003-07-02 Danny Smith + + * pex-win32.c (fix_argv): Ensure that the executable pathname + uses Win32 backslashes. + (pexecute): Cast away constness when assigning *errmsg_arg. + +2003-06-26 H.J. Lu + + * testsuite/demangle-expected: Add more GNU V3 testcases. + +2003-06-22 Zack Weinberg + + * safe-ctype.c: Use HOST_CHARSET_ASCII and HOST_CHARSET_EBCDIC, + not HC_ASCII and HC_EBCDIC. + Add documentation in form expected by gather-docs. + * hex.c: Use HOST_CHARSET, not hand-coded check of character set. + * Makefile.in, functions.texi: Regenerate. + +2003-06-21 Zack Weinberg + + * safe-ctype.c: Separate out EOF==-1 check. Use HOST_CHARSET + for charset determination. + +2003-06-19 Dara Hazeghi + + * configure.in: Add check for malloc.h needed by + m68k for function free(). + * configure: Regenerated. + * config.in: Add HAVE_MALLOC_H. + * hashtab.c: include malloc.h were available for + free(). + +2003-06-09 Albert Chin-A-Young + + PR bootstrap/10974 + * physmem.c: Update comment. + * configure.in: Modify test for _system_configuration for older + AIX systems. + + * config.in, configure: Regenerated. + +2003-06-05 John David Anglin + + PR other/10810 + * test-demangle.c (getline): Fix fence-post error. + +2003-06-03 Nick Clifton + + * asprintf.c: Change comment to note that -1 is returned upon + error. + * vasprintf.c: Likewise. + (vasprintf): Return -1 upon error. + * functions.texi: Document changes to asprintf and vasprintf. + +2003-05-19 Kelley Cook + + * config.table: Accept i[345867]86 variant. + +2003-05-15 Jim Blandy + + * hex.c (_hex_value): Make this unsigned. + (hex_value): Update documentation for new return type. hex_value + now expands to an unsigned int expression, to avoid unexpected + sign extension when we store it in a bfd_vma, which is larger than + int on some platforms. + * functions.texi: Regenerated. + +2003-05-07 Josef Zlomek + + * splay-tree.c (splay_tree_predecessor): Fix comment. + (splay_tree_successor): Fix comment. + +2003-05-07 Jason Merrill + + * hashtab.c (iterative_hash): New fn. + * configure.in: Add AC_C_BIGENDIAN_CROSS. + * aclocal.m4: Include accross.m4. + * configure, config.in: Regenerate. + +2003-05-04 Kaveh R. Ghazi + + * configure.in (AC_CHECK_FUNCS): Don't make multiple calls. + * configure: Regenerate. + +2003-05-03 Carlo Wood + + * cp-demangle.c: Fix typo in "char_traints" string-literal. + +2003-04-22 Kaveh R. Ghazi + + * vsnprintf.c (vsnprintf): Don't pad string with extra nulls. + (main): Test that we don't write too much data. + +2003-04-16 Kaveh R. Ghazi + + * configure.in (funcs, AC_CHECK_FUNCS): Add snprintf and + vsnprintf. + * snprintf.c, vsnprintf.c: New files. + * Makefile.in (CFILES): Add snprintf.c and vsnprintf.c. + (CONFIGURED_OFILES): Add snprintf.o and vsnprintf.o. + Regenerate dependencies. + + * functions.texi, configure, config.in: Regenerated. + +2003-04-15 Kaveh R. Ghazi + + * mempcpy.c, stpcpy.c, stpncpy.c: New files. + * configure.in (funcs, AC_CHECK_FUNCS): Add mempcpy, stpcpy + and stpncpy. + * Makefile.in (CFILES): Add mempcpy.c, stpcpy.c and stpncpy.c. + (CONFIGURED_OFILES): Add mempcpy.o, stpcpy.o and stpncpy.o. + Regenerate dependencies. + + * functions.texi, configure, config.in: Regenerated. + +2003-04-15 Kaveh R. Ghazi + + * argv.c: Fix comments. + * calloc.c: Don't unnecessarily include "libiberty.h". + (bzero): Add prototype. + * floatformat.c: Include "ansidecl.h", rely on ANSI_PROTOTYPES. + * getcwd.c (getcwd): Use standard definition to avoid conflicts + with system headers. + * hashtab.c (htab_traverse): Delete unused variables. + * rename.c: Include "ansidecl.h". + (rename): Use standard definition to avoid conflicts with system + headers. + * strsignal.c: Rely on ANSI_PROTOTYPES. + * strstr.c: Check GNUC >= 2, not GNUC == 2. + * vfprintf.c: Include "ansidecl.h", rely on ANSI_PROTOTYPES. + * vprintf.c: Include "ansidecl.h" earlier, rely on + ANSI_PROTOTYPES. + * vsprintf.c: Include "ansidecl.h" earlier, rely on + ANSI_PROTOTYPES and possibly include . + + * Makefile.in: Regenerate dependencies. + +2003-04-15 DJ Delorie + + * maint-tool (deps): Scan for headers in $srcdir also. + +2003-04-15 Kaveh R. Ghazi + + PR target/10338 + PR bootstrap/10198 + PR bootstrap/10140 + * getopt.c (exchange, _getopt_initialize): Use mempcpy not + __mempcpy. + * regex.c (regerror): Likewise. + +2003-04-14 Roger Sayle + + * argv.c: Use ANSI_PROTOTYPES instead of __STDC__. + * memchr.c: Likewise. + * strcasecmp.c: Likewise. + * strncasecmp.c: Likewise. + * strncmp.c: Likewise. + * xatexit.c: Likewise. + * xmalloc.c: Likewise. + + * copysign.c: Use traditional function declaration instead of DEFUN. + * sigsetmask.c: Likewise. + + * memcmp.c: Both of the above, ANSI_PROTOTYPES and DEFUN. + * memset.c: Likewise. + + * memcpy.c: ANSI_PROTOTYPES, DEFUN and prototype bcopy. + * memmove.c: Likewise. + +2003-04-14 Roger Sayle + + * strdup.c (strdup): Tweak implementation to use memcpy. + +2003-04-14 Kaveh R. Ghazi + + * configure.in (HAVE_UINTPTR_T): Always define. + * configure: Regenerated. + +2003-03-23 Alexandre Oliva + + * Makefile.in (MULTIOSDIR): New macro. Use $(CC) $(LIBCFLAGS) + instead of $$CC alone. + (install_to_tooldir): Use it. + +2003-17-03 Jan Hubicka + + * hashtab.c (htab_traverse_noresize): Break out from ... + * hashtab.c (htab_traverse): ... here. + +2003-12-03 Jan Hubicka + + * hashtab.c (htab_expand): Fix warning. + + * hashtab.c (htab_expand): Compute the size of hashtable based + on the number of elements actually used. + (htab_traverse): Call htab_expand when table is too empty. + +2003-03-11 Carlo Wood + + * cplus-dem.c (demangle_integral_value): Correction to reflect + patch of 2002-01-10 in order to also make negative multi-digits + without leading underscore work. + +2003-03-03 Mark Mitchell + + * cplus-dem.c: Add license exception to copyright notice. + +2003-02-27 Kaveh R. Ghazi + + * physmem.c: Formatting changes from upstream. + +2003-02-24 Danny Smith + + * physmem.c (physmem_total): Add _WIN32 support. + (physmem_available): Likewise. + +2003-02-24 Rainer Orth + + * physmem.c (physmem_total) [HAVE_GETSYSINFO]: Test for + GSI_PHYSMEM. + (physmem_available) [HAVE_TABLE]: Test for TBL_VMSTATS. + +2003-02-22 Kaveh R. Ghazi + + * configure.in: Check for sys/systemcfg.h and + _system_configuration. + * physmem.c: Add support for AIX. Tweek formatting as per + upstream coreutils beta. + +2003-02-22 Kaveh R. Ghazi + Richard Earnshaw + Geoffrey Keating + + * configure.in: Check for sys/sysctl.h and sysctl. + * physmem.c: Add support for *bsd and darwin. + * Makefile.in: Generate depedency for physmem.o. + +2003-02-21 Rainer Orth + + * physmem.c (physmem_total) [HAVE_GETSYSINFO]: Use getsysinfo on + Tru64 UNIX. + (physmem_available) [HAVE_TABLE && HAVE_SYS_TABLE_H]: Use table on + Tru64 UNIX. + + * configure.in (AC_CHECK_HEADERS): Check for sys/sysinfo.h, + machine/hal_sysinfo.h, sys/table.h. + (checkfuncs, AC_CHECKFUNCS): Check for getsysinfo, table. + * configure, config.in: Regenerate. + +2003-02-21 Kaveh R. Ghazi + + * configure.in: Check for sys/sysmp.h and sysmp. + * physmem.c: Pull upstream copy, add support for irix6. + + * config.in, configure: Regenerated. + +2003-02-21 Kaveh R. Ghazi + + * physmem.c (physmem_total, physmem_available): De-ANSI-fy. + * configure.in (AC_CHECK_FUNCS): Add pstat_getstatic and + pstat_getdynamic. + +2003-02-20 Kaveh R. Ghazi + + * Makefile.in (CFILES): Add physmem.c. + (REQUIRED_OFILES): Add physmem.o. + * configure.in: Check for sys/pstat.h. + (checkfuncs): Add pstat_getstatic and pstat_getdynamic. + * physmem.c: New file, copied from textutils. + + * config.in, configure: Regenerated. + +2003-02-20 Daniel Jacobowitz + + * Makefile.in (CFILES): Add lrealpath.c. + (REQUIRED_OFILES): Add lrealpath.o. + (lrealpath.o): Add rule. + * aclocal.m4 (libiberty_NEED_DECLARATION): Add. + * configure.in: Add realpath and canonicalize_file_name to + checkfuncs and AC_CHECK_FUNCS. Use libiberty_NEED_DECLARATION + for canonicalize_file_name. + * lrealpath.c: New file. + * make-relative-prefix.c: Update documentation. + (make_relative_prefix): Simplify. Use lbasename and lrealpath. + * config.in: Regenerated. + * configure: Regenerated. + * functions.texi: Regenerated. + +2003-02-20 jmc + + * cplus_dem.c: Fix typo: intializes -> initializes. + +2003-02-20 Alexandre Oliva + + * configure.in: Propagate ORIGINAL_LD_FOR_MULTILIBS to + config.status. + * configure: Rebuilt. + +2003-02-13 Daniel Jacobowitz + + Fix PR c++/7612. + * cplus-dem.c (demangle_signature): Call string_delete. + Remove extra string_init. + (demangle_arm_hp_template): Call string_delete instead of + string_clear. Add missing string_delete call. + (demangle_qualified): Add missing string_delete call. + (do_type): Remove unused variable btype. Add missing string_delete + call. Call string_delete instead of string_clear. + (demangle_fund_type): Move variable btype inside of the switch + statement. Add missing string_delete call. + (do_arg): Call string_delete instead of string_clear. Remove extra + string_init. + (demangle_nested_args): Free work->previous_argument. + +2003-02-12 Kaveh R. Ghazi + + * acconfig.h: New file. Add uintptr_t. + * config.in: Regenerated. + +2003-02-04 Joseph S. Myers + + * libiberty.texi: Update to GFDL 1.2. + +2003-01-30 Christian Cornelssen + + * Makefile.in (libiberty_topdir): New subst. + (mkinstalldirs): Redefine in terms of the above. + * configure.in: AC_SUBST it. + * configure: Regenerate. + +2003-01-28 Christian Cornelssen + + * Makefile.in (all-subdir, check-subdir, installcheck-subdir) + (info-subdir, install-info-subdir, clean-info-subdir) + (dvi-subdir, install-subdir, etags-subdir, mostlyclean-subdir) + (clean-subdir, distclean-subdir, maintainer-clean-subdir): + Pass $(FLAGS_TO_PASS). + +2003-01-27 Alexandre Oliva + + * Makefile.in (install_to_tooldir): Instead of $(MULTISUBDIR), use + /`$$CC -print-multi-os-directory`. + +2003-01-26 Daniel Jacobowitz + + * hashtab.c (htab_create_alloc_ex): New function. + (hatab_set_functions_ex): New function. + (htab_delete, htab_expand): Support alternate allocation functions. + +2003-01-24 Christopher Faylor + + * configure.in: Remove special pex-cygwin consideration. + * configure: Regenerate. + * pex-cygwin.c: Remove. + * Makefile.in: Remove pex-cygwin.[co] lines. + +2003-01-24 Zack Weinberg + + * Makefile.in (CFILES): Add pex-*.c. + (REQUIRED_OFILES): Change pexecute.o to @pexecute@ + (CONFIGURED_OFILES): Add pex-*.o. + (TEXIFILES): Add pexecute.txh. + (pexecute.o): Delete rule. + (pex-cygwin.o, pex-djgpp.o, pex-mpw.o, pex-msdos.o, pex-os2.o, + pex-unix.o, pex-win32.o): New rules. + * configure.in: Change AC_INIT argument to xmalloc.c. + Compute appropriate pexecute implementation and substitute it + as @pexecute@. + + * pexecute.c: Split up into... + * pex-cygwin.c, pex-djgpp.c, pex-mpw.c, pex-msdos.c, pex-os2.c, + pex-unix.c, pex-win32.c, pex-common.h, pexecute.txh: ... these + new files. + + * functions.texi: Regenerate. + * configure: Regenerate. + +2003-01-20 Josef Zlomek + + * hashtab.c (htab_expand): Fix allocation of new entries. + +2003-01-09 Christian Cornelssen + + * Makefile.in (FLAGS_TO_PASS): Also pass DESTDIR. + + * Makefile.in (install_to_libdir, install_to_tooldir): Add a + mkinstalldirs command. + +2002-12-04 Danny Smith + + * make-relative-prefix.c (HAVE_HOST_EXECUTABLE_SUFFIX): + Define for hosts with HOST_EXECUTABLE_SUFFIX. + +2002-11-24 Nick Clifton + + * make-relative-prefix.c (make_relative_prefix): Ensure return + string is empty before using strcat to construct it. + +2002-11-22 Daniel Jacobowitz + + * Makefile.in: Add make-relative-prefix.c. + * make-relative-prefix.c: New file. + * functions.texi: Rebuilt. + +2002-11-16 Jakub Jelinek + + * md5.c (md5_process_block): Avoid `function-like macro "F{G,H,I}" must be + used with arguments in traditional C' warnings. + +2002-10-16 Jakub Jelinek + + * config.table: Use mh-s390pic for s390x too. + +2002-10-06 Andreas Jaeger + + * libiberty/cplus-dem.c (ada_demangle): Get rid of unneeded + variable and of strict-aliasing warning. + (grow_vect): Use char as first parameter. + +2002-09-22 Kaveh R. Ghazi + + * Makefile.in (all): Fix multilib parallel build. + +2002-09-19 John David Anglin + + * cp-demangle.c (demangling_new): Cast 0 to enum. + (demangle_char): Cast return of strdup to char *. + (is_gnu_v3_mangled_ctor): Cast 0 to enum. + (is_gnu_v3_mangled_dtor): Likewise. + * cplus-dem.c (grow_vect): Cast return of xrealloc to void *. + (work_stuff_copy_to_from): Cast return of xmalloc to char **. + * fibheap.c (fibnode_new): Cast return of xcalloc to fibnode_t. + * md5.c (md5_process_bytes): Cast results back to const void *. + (md5_process_block): Add cast to const md5_uint32 *. + * regex.c (re_compile_fastmap): Cast enum to UCHAR_T. + * safe-ctype.c (L, XL, U, XU, D, P, _, C, Z, M, V, T, S): Add cast to + unsigned short. + * splay-tree.c (splay_tree_xmalloc_allocate): Cast return of xmalloc + to void *. + * vasprintf.c (int_vasprintf): Cast return of malloc to char *. + +2002-09-19 Nick Clifton + + * README: Update email addresses for bugs and patches. + +2002-09-10 Mike Stump + + * splay-tree.c (splay_tree_successor): Fix comments. + +2002-09-11 Zack Weinberg + + * cplus-dem.c: Code under #ifdef MAIN moved to gcc/cp/cxxfilt.c. + * testsuite/Makefile.in: Adjust for test-demangle. + * testsuite/regress-demangle: Deleted. + * testsuite/test-demangle.c: New file. + * testsuite/demangle-expected: Change \$ to $ throughout, now that + this file is not being read by a shell script. + +2002-09-05 Roger Sayle + + * regex.c: Only use "#pragma alloca" on AIX when not using gcc. + +2002-08-07 DJ Delorie + + * regex.c (re_error_msgid): Just use a simple array of strings. + (re_compile_pattern): Compensate. + (re_comp): Likewise. + (re_comp): Likewise. + (regerror): Likewise. + +2002-07-29 Neil Booth + + * cplus-dem.c (PREPEND_BLANK): Remove. + +2002-07-10 Jason Merrill + + * cp-demangle.c (demangle_identifier): Support extended Unicode + characters. + +2002-07-08 Kaveh R. Ghazi + + * cp-demangle.c (demangle_v3_with_details): Wrap in + !defined IN_GLIBCPP_V3. + +2002-07-01 Mark Mitchell + + * cp-demangle.c (demangle_operator_name): Add type_arg parameter. + Set it for the "st" operator. + (demangle_expression): Handle expressions with types as arguments. + +2002-06-30 Douglas Rupp + + * configure.in (OUTPUT_OPTION,NO_MINUS_C_MINUS_O): Configure. + * Makefile.in (OUTPUT_OPTION): Use. + +2002-06-22 Peter Breitenlohner + + * Makefile.in (install_to_libdir): Add $(DESTDIR). + (install_to_tooldir): Likewise. + +2002-06-17 Douglas Rupp + + * lbasename.c: Add 2002 to copyright. + (IS_DIR_SEPARATOR): Remove VMS junk. + +2002-06-05 Geoffrey Keating + + * hashtab.c (htab_create): New stub function for backward + compatibility. + (htab_try_create): Likewise. + +2002-06-03 Geoffrey Keating + + * hashtab.c (htab_create): Delete. + (htab_try_create): Delete. + (htab_create_alloc): New. + (htab_delete): Support user-specified memory allocation. + (htab_expand): Likewise. + +2002-05-22 Roman Lechtchinsky + + * configure.in: Fix typo in the code checking for sys_errlist. + * configure: Regenerated. + +2002-05-13 Andreas Schwab + + * config.table: Use mh-x86pic also for x86-64. + +2002-05-08 Alexandre Oliva + + * configure.in (ORIGINAL_LD_FOR_MULTILIBS): Preserve LD at + script entry, and set LD to it when configuring multilibs. + * configure: Rebuilt. + +2002-05-07 Mark Mitchell + + * configure.in (AC_TYPE_PID_T): Use it. + * configure: Regenerated. + * getruntime.c: Include . + * waitpid.c: Likewise. Use pid_t, not int, as the type of "pid". + +2002-04-09 Richard Henderson + + * hashtab.c (higher_prime_number): Use 7 as minimum. + (find_empty_slot_for_expand): Don't compute hash2 unless needed. + (htab_find_slot_with_hash): Likewise. + +2002-04-01 Phil Edwards + + * cp-demangle.c (__cxa_demangle): Also protect with IN_GLIBCPP_V3. + (is_gnu_v3_mangled_ctor, is_gnu_v3_mangled_ctor): Conditionally + not compile if IN_GLIBCPP_V3 defined. + * dyn-string.c: Also allow IN_GLIBCPP_V3 to change allocation scheme. + +2002-03-30 Bryce McKinlay + + * cp-demangle.c (java_demangle_v3): Don't try to release "demangled" + if it is NULL. + +2002-03-27 DJ Delorie + + * hex.c: Add documentation. + (_hex_value): Provide non-ASCII empty table. + (hex_init): Initialize the non-ASCII table. + * functions.texi: Regenerate. + +2002-03-27 Mark Mitchell + + * dyn-string.c: Add libgcc exception to copyright notice. + +2002-03-26 H.J. Lu (hjl@gnu.org) + + * config.table: Support --with-build-subdir. + * configure.in: Likewise. + * configure: Rebuild. + +2002-03-18 Stuart Griffith + + * strtod.c (strtod): Increment 8 chars, not 7, when `infinity' + seen. + +2002-03-12 Mark Mitchell + + * cp-demangle.c: Add libgcc exception to cp-demangle.c copyright + notice. + +2002-03-11 Douglas B Rupp + + * xatexit.c [VMS]: Include stdlib.h and unixlib.h. + +2002-03-06 Jim Blandy + + * splay-tree.c (splay_tree_xmalloc_allocate, + splay_tree_xmalloc_deallocate): Use K&R-style definitions, not + prototyped definitions. Mark `data' arguments as unused. + +2002-03-06 Andrew Cagney + + * floatformat.c (floatformat_arm_ext_big): Delete definition. + +2002-03-04 Phil Edwards + + * configure.in: Add --enable-install-libiberty option. + * Makefile.in (INSTALLED_HEADERS): New variable. + (install_to_libdir): Possibly also copy headers. + * configure: Regenerated. + +2002-03-04 Neil Booth + + * xmalloc.c (xmalloc_fail): Clarify error message further. + +2002-03-03 Neil Booth + + * xmalloc.c (xmalloc_fail): Clarify error message. + +2002-02-22 Jim Blandy + + * splay-tree.c (splay_tree_xmalloc_allocate, + splay_tree_xmalloc_deallocate): New functions. + (splay_tree_new): Call splay_tree_new_with_allocator, passing the + above functions and a dummy data pointer. + (splay_tree_new_with_allocator): New function. + (splay_tree_delete_helper, splay_tree_delete, splay_tree_insert, + splay_tree_remove): Use the splay tree's allocation and + deallocation functions. + +2002-02-19 Scott Snyder + + * testsuite/demangle-expected: Add test case for infinite loop in + demangler. + * cplus-dem.c (demangle_arm_hp_template): Stop trying to demangle + if do_type() doesn't make any progress --- prevents an infinite + loop. + +2002-02-18 Carlo Wood + + PR c++/5390 + * cplus-dem.c (demangle_integral_value): Accept multi-digit + numbers that do not start with an underscore; This is needed + for integer template parameters. This doesn't break anything + because multi-digit numbers are never followed by a digit. + * testsuite/demangle-expected: Corrected all mangled test + cases with multi-digit template parameters: g++ 2.95.x does + not generate underscores around these parameters. + +2002-02-05 Jason Merrill + + * cplus-dem.c (flags): Add DMGL_VERBOSE + (cplus_demangle_v3_p): Remove. + (demangle_it): Add DMGL_TYPES to passed flags. + * cp-demangle.c (cplus_demangle_v3_all): Remove. + (cplus_demangle_v3_type): Remove. + (cplus_demangle_v3): Add options parm. + +2002-02-02 H.J. Lu (hjl@gnu.org) + + * cp-demangle.c (cp_demangle_type): Do not protect with + IN_LIBGCC2. + (cplus_demangle_v3_all): New. + (cplus_demangle_v3): Call cplus_demangle_v3_all. + (cplus_demangle_v3_type): Call cplus_demangle_v3_all. + + * cplus-dem.c (cplus_demangle_v3_p): New function pointer. + Initialized to cplus_demangle_v3. + (cplus_demangle_with_style): Call cplus_demangle_v3_p instead + of cplus_demangle_v3. + (main): Set cplus_demangle_v3_p to cplus_demangle_v3_type for + command line symbol. + + * testsuite/regress-demangle: Pass the mangled name at the + command line. + +2002-02-01 H.J. Lu + + * cp-demangle.c (cp_demangle_type): Call demangling_new with + DMGL_GNU_V3. + +2002-01-31 Phil Edwards + + * cp-demangle.c: Revert yesterday's change. + +2002-01-31 Adam Megacz + + * gcc/libiberty/configure.in: Treat mingw the same as cywin + wrt HAVE_SYS_ERRLIST. + +2002-01-30 Phil Edwards + + * cp-demangle.c (cp_demangle_type): Do not protect with IN_LIBGCC2. + (cplus_demangle_v3): Mimic __cxa_demangle and fall back on + cp_demangle_type. + * testsuite/demangle-expected: New gnu-v3 test. + +2002-01-22 Momchil Velikov + + * configure.in (variable detection): Use arrays of unspecified + size instead of plain integers. + +2002-01-18 DJ Delorie + + * Makefile.in (TESTLIB): New. This library is for future + testsuites. + (CFILES, REQUIRED_OFILES, CONFIGURED_OFILES): Re-alphabetize, + break down by letter. + (REQUIRED_OFILES): List long-to-compile files first. + (maint-deps): New, target for updating dependencies. + (dependencies): Update. + * maint-tool: Add dependency-generating option. + * configure.in: Check for _doprnt even if we're not providing it. + * configure: Regenerate. + + * _doprnt.c: Modifications to allow compiling on any platform. + * copysign.c: Likewise. + * putenv.c: Likewise. + * setenv.c: Likewise. + * vsprintf.c: Likewise. + +2002-01-15 Douglas B Rupp + + * mkstemps.c (mkstemps): On VMS, open temp file with option + that causes it to be deleted when closed. + +2002-01-02 Kaveh R. Ghazi + + * cp-demangle.c (long_options): Const-ify. + * cplus-dem.c (long_options): Likewise. + + * cplus-dem.c (mystrstr): Delete. All callers changed to use + strstr instead. + +2001-12-31 Ira Ruben + + * aclocal.m4 (libiberty_AC_FUNC_STRNCMP): Use anon mmap as 2nd try. + * configure: Regenerated. + +2001-12-24 Douglas B. Rupp + + * configure.in (uintptr_t): Use AC_CHECK_TYPE. + * configure: Regenerated. + +2001-12-12 Craig Rodrigues + + PR other/2719 + * cplus-dem.c (consume_count): Treat negative count as an error. + * testsuite/demangle-expected: Added testcase. + +Tue Dec 11 07:08:57 2001 Douglas B. Rupp + + * configure.in: Hardcode that vfork works on VMS host. + * configure: Regenerated. + +2001-12-06 Richard Henderson + + * cplus-dem.c (libiberty_demanglers): Add no_demangling case. + (cplus_demangle): Support no_demangling. + +2001-11-27 Zack Weinberg + + * _doprnt.c: Moved here from gcc/doprint.c. Adjust to build + in libiberty context. Fix typo in leading comment. + * configure.in: Fix various AC_DEFINEs so autoheader works. + If any of vprintf, vsprintf, vfprintf is missing from libc, + then AC_REPLACE_FUNCS(_doprnt). + +2001-11-26 DJ Delorie + Daniel Jacobowitz + + * Makefile.in (stamp-h): Depend on Makefile for proper + serialization. + (*-subdir): Depend on config.h for proper serialization. + +2001-11-26 DJ Delorie + + * configure.in: Check for alloca.h (for regex.c and putenv.c). + * configure: Regenerate. + * config.h: Add HAVE_ALLOCA_H. + +2001-11-16 Kaveh R. Ghazi + + * regex.c: Check defined(__STDC__) || defined(ALMOST_STDC) || + defined(HAVE_STRINGIZE) to determine whether ISO CPP token pasting + is available. + +Thu Nov 15 11:06:25 2001 Jeffrey A Law (law@cygnus.com) + + * config.in (HAVE_UINTPTR_T): Provide autoconf stub. + * configure.in (HAVE_UINTPTR_T): Test for system defining + uintptr_t and define HAVE_UINTPTR_T appropriately. + * regex.c (uintptr_t): Do not provide a definition if the + system provided one. + + * regex.c (PREFIX): Provide an alternate definition for + non-ANSI/ISO compilers. + (ARG_PREFIX): Likewise. + +2001-11-12 Jim Meyering + + * obstack.c (_): Honor the setting of ENABLE_NLS. Otherwise, + this code would end up calling gettext even in packages built + with --disable-nls. + * getopt.c (_): Likewise. + * regex.c (_): Likewise. + +2001-11-03 Alan Modra + + * configure.in: Cope with missing makeinfo. + * configure: Regenerate. + +2001-10-22 Kaveh R. Ghazi + + * hex.c (hex_init): Provide empty stub. + + * hex.c (hex_init): Delete. + (_hex_value): Const-ify and initialize at compile-time. + +2001-10-19 H.J. Lu + + * Makefile.in ($(TARGETLIB)): Also generate pic/$(TARGETLIB) if + necessary. + +2001-10-17 DJ Delorie + + * argv.c, asprintf.c, choose-temp.c, concat.c, cplus-dem.c, + ffs.c, fnmatch.txh, getruntime.c, make-temp-file.c, + mkstemps.c, pexecute.c, random.c, strsignal.c, vasprintf.c: + Improve manual formatting. + * functions.texi: Regenerate. + +2001-10-15 DJ Delorie + + * Makefile.in (TEXIFILES): Add fnmatch.txh. + (maint-undoc): New. + maint-tool: Add "undoc" tool. + * alloca.c, argv.c, asprintf.c, choose-temp.c, concat.c, + fdmatch.c, ffs.c, getruntime.c, insque.c, lbasename.c, + make-temp-file.c, mkstemps.c, pexecute.c, random.c, spaces.c, + strerror.s, strsignal.c, strtol.c, vasprintf.c: Add or update + documentation. + * fnmatch.txh: New. + * functions.texi: Regenerate. + +2001-10-10 Joseph S. Myers + + * bcmp.c, setenv.c: Use "nonzero" instead of "non-zero". + * strtod.c: Use "ISO C" instead of "ANSI C". + * functions.texi: Regenerate. + +2001-10-07 Joseph S. Myers + + * alloca.c, clock.c, getcwd.c, getpagesize.c, getpwd.c, index.c, + libiberty.texi, memchr.c, putenv.c, rindex.c, strchr.c, strdup.c, + strerror.c, strrchr.c, strstr.c, strtod.c, tmpnam.c, vfork.c, + xatexit.c, xmalloc.c, xstrerror.c: Improve manual formatting. Fix + spelling. Give names to function arguments in documentation. Use + (void) prototypes in documentation. + * functions.texi: Regenerate. + +2001-10-07 Kaveh R. Ghazi + + * argv.c (buildargv, tests, main): Const-ify. + * cp-demangle.c (operator_code): Likewise. + * cplus-dem.c (optable, libiberty_demanglers, + cplus_demangle_set_style, cplus_demangle_name_to_style, + print_demangler_list): Likewise. + * hashtab.c (higher_prime_number): Likewise. + * strcasecmp.c (charmap): Likewise. + * strerror.c (error_info, strerror, main): Likewise. + * strncasecmp.c (charmap): Likewise. + * strsignal.c (signal_info): Likewise. + +2001-09-29 DJ Delorie + + * configure: Regenerate. + +2001-09-28 Kaveh R. Ghazi + + * concat.c: Include stdlib.h. + +2001-09-27 Eli Zaretskii + + * libiberty.texi: (Top level): Add syncodeindex pg. Add + @dircategory and @direntry directives. Add @finalout. + (many nodes): Lose the next,prev,up pointers on the @nide line. + (Using, Supplemental Functions, Replacement Functions): Fix + markup. + (Functions): Move around, to allow makeinfo to build the manual + without next,prev,up pointers in thye node lines. + (Licenses): Fix typos. + + * index.c, rindex.c, strchr.c, strerror.c, strrchr.c, strstr.c, + strtol.c, xatexit.c, xexit.c, xmalloc.c: Fix spelling and markup. + * functions.texi: Regenerate. + + * copying-lib.texi: Lose the next,prev,up pointers on the @node + line. + +2001-09-27 DJ Delorie + + * configure.in: Don't use in-tree texinfo, because libiberty must + be built before it. Check for makeinfo version 4 or higher. + * functions.texi: Regenerate. + +2001-09-20 DJ Delorie + Phil Edwards + + * configure.in (MAKEINFO, PERL): Detect these. + (--enable-maintainer-mode): Add. + * configure: Regenerate. + * Makefile.in (MAKEINFO, PERL): Define. + (libiberty.info, libiberty.dvi, libiberty.html): New. + (CFILES): Add bsearch.c. + (CONFIGURED_OFILES): New, list of objects configure might add. + (maint-missing, maint-buildall): New, for maintainers only. + (clean, mostlyclean): Add info/dvi/html files. + * libiberty.texi, copying-lib.texi, obstacks.texi, functions.texi: New. + * gather-docs: New, for maintainers. + * maint-tool: New, for maintainers. + * alloca.c, atexit.c, basename.c, bcmp.c, bcopy.c, bsearch.c, + bzero.c, calloc.c, clock.c, configure.in, configure, getcwd.c, + getpagesize.c, getpwd.c, index.c, memchr.c, memcmp.c, memcpy.c, + memmove.c, memset.c, putenv.c, rename.c, rindex.c, setenv.c, + sigsetmask.c, strcasecmp.c, strchr.c, strdup.c, strerror.c, + strncasecmp.c, strncmp.c, strrchr.c, strstr.c, strtod.c, strtol.c, + tmpnam.c, vfork.c, vprintf.c, waitpid.c, xatexit.c, xexit.c, + xmalloc.c, xmemdup.c, xstrdup.c, xstrerror.c: Add or update + documentation. + +2001-09-25 Kaveh R. Ghazi + + * concat.c (reconcat): Fix for traditional C. + +2001-09-24 Kaveh R. Ghazi + + * concat.c (reconcat): New function. + +2001-09-17 Kaveh R. Ghazi + + * concat.c (vconcat_length, vconcat_copy, concat_length, + concat_copy, concat_copy2): New functions. + (concat): Use vconcat_length/vconcat_copy. + + * alloca.c (libiberty_optr, libiberty_nptr, libiberty_len): + Define. + +2001-09-04 Kaveh R. Ghazi + + * asprintf.c: Don't define USE_STDARG. Use VPARAMS, VA_OPEN, + VA_FIXEDARG & VA_CLOSE. + + * vasprintf.c: Check HAVE_STRING_H when including string.h. + (checkit): Delete redundant prototype. Add ATTRIBUTE_PRINTF_1. + Use VA_OPEN, VA_FIXEDARG & VA_CLOSE. Free allocated string. + +2001-08-27 Kaveh R. Ghazi + + * concat.c (concat): Use VPARAMS, VA_OPEN, VA_FIXEDARG & VA_CLOSE. + +2001-08-23 Ulrich Drepper + + * regex.c (truncate_wchar): Use wcrtomb not wctomb. + +2001-08-23 Ulrich Drepper + + * posix/regex.c [_LIBC] (convert_mbs_to_wcs): Use __mbrtowc + instead of mbrtowc. + [_LIBC]: Use __iswctype instead of iswctype, __wcslen instead of + wcslen, and __wcscoll instead of wcscoll. + +2001-08-22 Matt Kraai + + * fibheap.c (fibheap_init, fibnode_init): Remove. + (fibheap_new, fibnode_new): Use xcalloc to allocate and + initialize memory. + (fibheap_insert): Remove check for node allocation failure. + +2001-08-21 Richard Henderson + + * Makefile.in (fibheap.o): Depend on config.h. + * fibheap.c: Tidy formatting. Use config.h.` Rearrange some + functions for inlining. + +Tue Aug 21 12:35:04 2001 Christopher Faylor + + * configure.in: Need to set HAVE_SYS_ERRLIST and HAVE_SYS_NERR whenever + hosting on cygwin. + * configure: Regenerate. + +2001-08-20 Andrew Cagney + + * floatformat.c (floatformat_m88110_ext): Remove #ifdef + HARRIS_FLOAT_FORMAT. + (floatformat_ia64_spill_little, floatformat_ia64_quad_little) + (floatformat_ia64_spill_big, floatformat_ia64_quad_big) + (floatformat_arm_ext_big, floatformat_arm_ext_littlebyte_bigword) + (floatformat_m88110_harris_ext): New float formats. + +2001-08-20 Daniel Berlin + + * fibheap.c: New file. Fibonacci heap. + + * Makefile.in (CFILES): Add fibheap.c. + (REQUIRED_OFILES): Add fibheap.o. + (fibheap.o): Add dependencies for fibheap.o. + +2001-08-17 Christopher Faylor + + * configure.in: Always set HAVE_SYS_ERRLIST when targetting cygwin. + * configure: Regenerate. + +2001-08-16 Richard Henderson + + * hashtab.c (htab_hash_string): New. + +2001-08-13 Andrew Cagney + + * floatformat.c (floatformat_ieee_double_littlebyte_bigword): Fix + name. + +2001-08-12 Isamu Hasegawa + + * regex.c (wcs_regex_compile): Use appropriate string + to compare with collating element. + Fix the padding for the alignment. + +2001-08-10 Andrew Cagney + + * lbasename.c (lbasename): Change function definition to return a + const char pointer. + +2001-08-07 Jason Merrill + + * cp-demangle.c (demangle_special_name): "GR" -> "reference temporary + for". + +2001-08-03 Richard Henderson + + * Makefile.in (concat.o): Depend on config.h. + +2001-07-30 Andreas Jaeger + + * concat.c: Include "config.h". + +2001-07-30 Andreas Jaeger + + * regex.c: Declare wcs functions only if compiling with + MBS_SUPPORT. + Don't use #elif for traditional C. + +2001-07-23 Ulrich Drepper + + * regex.c: Revamp memory allocation for WCHAR functions to + not use too much stack. + +2001-07-30 Andreas Jaeger + + * regex.c: Declare wcs functions only if compiling with + MBS_SUPPORT. + Don't use #elif for traditional C. + +2001-07-25 Daniel Jacobowitz + + * Makefile.in (regex.o): Add dependency on config.h. + +2001-07-18 Andreas Schwab + + * regex.c (WORDCHAR_P) [WCHAR]: Also return true for the + underscore character. + +2001-07-18 Ulrich Drepper + + * regex.c: Limit string length printed in debug messages to 100 + chars. + +2001-07-18 Andreas Jaeger + + * regex.c: Place under LGPL version 2.1. + +2001-07-10 Jeff Johnston + + * Makefile.in: Add support for regex code. + * regex.c: New file. + +2001-07-05 Mark Klein + + * Makefile.in: Add ffs.c dependency. + * configure.in: Add ffs.c. + * ffs.c: New file. + +2001-06-18 Richard Henderson + + * concat.c: Include . + +2001-06-11 Loren J. Rittle + + bootstrap/3106 + * strerror.c (sys_nerr): Hide the OS header version. + * strsignal.c (sys_nsig): Likewise. + +2001-06-10 Richard Henderson + + * concat.c: Include string.h. Fix int vs size_t usage. + Simplify the iteration loops. Use memcpy. + +2001-05-16 Matt Kraai + + * partition.c: Fix misspelling of `implementation'. + +2001-05-09 Thiemo Seufer + + * md5.c (md5_init_ctx): Declare constants as unsigned. + (md5_process_block): Likewise. + +2001-05-07 Zack Weinberg + + * cp-demangle.c (demangle_v3_with_details, + is_gnu_v3_mangled_ctor, is_gnu_v3_mangled_dtor): Use K+R style + function definition. + * ternary.c: Use K+R style function definitions. Use PTR, not + void *. Make arguments constant where possible. + +2001-05-07 Mark Mitchell + + * splay-tree.h (splay_tree_max): New function. + (splay_tree_min): Likewise. + +2001-04-15 Daniel Berlin + + * ternary.c: New file - Ternary search tree implementation. + + * Makefile.in: Add ternary.o, and ternary.c dependencies. + +2001-04-03 Zack Weinberg + + * make-temp-file.c (try): Inline. + +2001-02-28 Richard Henderson + + * Makefile.in (make-temp-file.o): Depend on config.h. + +2001-03-27 Kaveh R. Ghazi + + * memchr.c (memchr): Adjust condition to avoid infinite loop. + +2001-03-23 Jakub Jelinek + + * cp-demangle.c (demangle_discriminator): `_0' is discriminator #1, + `_' not followed by a digit is invalid. + +2001-03-22 Jim Blandy + + * cp-demangle.c (string_list_delete): Use dyn_string_delete + instead of free, to free the contents as well as the string + structure. + +2001-03-21 Zack Weinberg + + * make-temp-file.c: Always default DIR_SEPARATOR to '/'. + Don't default P_tmpdir to anything. Try /var/tmp before + /usr/tmp. + +2001-03-20 Zack Weinberg + + * choose-temp.c: Split off make_temp_file, and the code + duplicated between it and choose_temp_base, into... + * make-temp-file.c: ... here; new file. + + * Makefile.in (CFILES): Add make-temp-file.c. + (REQUIRED_OFILES): Add make-temp-file.o. + +2001-03-20 Jim Blandy + + * cp-demangle.c (struct demangling_def): New fields: + is_constructor and is_destructor. + (demangling_new): Initialize them. + (demangle_ctor_dtor_name): Set them, if we detect a constructor + or destructor. + (demangle_v3_with_details, is_gnu_v3_mangled_ctor, + is_gnu_v3_mangled_dtor): New functions. + +2001-03-20 Jason Merrill + + * cplus-dem.c (main): Skip initial $. + +2001-03-15 Michael Meissner + + * hashtab.c (higher_prime_number): Silence warning that 4294967291 + might be a signed integer under pre-ISO C systems. + +2001-03-10 Neil Booth + John David Anglin + + * libiberty/lbasename.c: New file. + * libiberty/Makefile.in: Update for lbasename. + +2001-03-06 Zack Weinberg + + * aclocal.m4 (libiberty_AC_FUNC_C_ALLOCA): New. + * configure.in: Replace all alloca logic with a simple use of + the above new macro. + * config.table: Kill *-*-beos* entry. + * config/mh-beos: Delete. + * configure, config.in: Regenerate. + + * Makefile.in (ALLOCA, HFILES): Kill. + (REQUIRED_OFILES): Add alloca.o. + (alloca.o): Depend on libiberty.h. + (argv.o): Don't depend on alloca-conf.h. + * alloca-conf.h: Delete. + * alloca.c: Include libiberty.h. Kill all #ifdef emacs + blocks. Provide the C alloca unconditionally. Use PTR where + appropriate. Make i00afunc static. + * argv.c: Don't include alloca-conf.h. + +2001-03-04 John David Anglin + + * cplus-dem.c (main): Cast enum style to int. + +2001-02-16 Loren J. Rittle + + * cplus-dem.c (main): Initialize style. + +2001-02-02 Phil Edwards + + * COPYING.LIB: Update to LGPL 2.1 from the FSF. + +2001-01-31 Bryce McKinlay + + Add support for Java demangling under the v3 ABI: + * cp-demangle.c (NAMESPACE_SEPARATOR): New define. + (struct demangling_def): Add `style' field. + (demangling_new): New parameter `style'. Set it in demangling_t. + (demangle_prefix): Use NAMESPACE_SEPARATOR. + (demangle_type_ptr): Don't emit pointer symbol if doing Java output. + (cp_demangle): New parameter `style'. Pass it to demangling_new(). + (main): Call cp_demangle with extra parameter. + (java_demangle_v3): New function. + (java_builtin_type_names): New. Table of primitive type names used + for Java demangling. + (demangle_builtin_type): Look up in java_builtin_type_names if doing + Java output. + * cplus-dem.c (cplus_demangle): Use java_demangle_v3 to do Java + demangling. + (long_options): Remove obsolete `java' option. + (main): Remove explicit handling of `java' option. Instead, pass style + parameter in cplus_demangle flags as gdb does. + * testsuite/demangle.expected: Add some Java test cases. + +2000-12-29 DJ Delorie + + * fnmatch.c: Make the note about the origins of this file more + accurate, at least until we can sync with glibc. + * getopt.c: Ditto. + * getopt1.c: Ditto. + * md5.c: Ditto. + * obstack.c: Ditto. + +2000-12-26 Michael Sokolov + + * bsearch.c: New file. + * configure.in (funcs): Add bsearch. + (AC_CHECK_FUNCS): Likewise. + * configure, config.in: Regenerate. + +2000-12-13 Michael Sokolov + + * safe-ctype.c: #include "ansidecl.h". + * strtod.c: Likewise. + +2000-12-13 Michael Sokolov + + * strtoul.c: Include safe-ctype.h, not ctype.h. + +2000-12-07 Zack Weinberg + + * safe-ctype.c: New file. + * Makefile.in (CFILES): Add safe-ctype.c. + (REQUIRED_OFILES): Add safe-ctype.o. + + * argv.c: Define ISBLANK and use it, not isspace. + * basename.c, cplus-dem.c, fnmatch.c, pexecute.c, strtod.c, + strtol.c, strtoul.c: Include safe-ctype.h, not ctype.h. Use + uppercase ctype macros. Don't test ISUPPER(c)/ISLOWER(c) + before calling TOLOWER(c)/TOUPPER(c). + +2000-12-07 Mike Stump + + * Makefile.in (distclean): When cleaning, remove testsuite. + +2000-12-05 Jason Merrill + + * cp-demangle.c (cplus_demangle_v3): Check that it's a v3 mangled + name before allocating the dyn_string. + +2000-12-04 Jason Merrill + + * cp-demangle.c: s/new_abi/v3/. + * cplus-dem.c: Likewise. + (current_demangling_style): Now auto_demangling. + (cplus_demangle): Try v3 demangling if AUTO_DEMANGLING. + (main): Use standard symbol chars for auto_demangling. + +2000-11-26 Mark Mitchell + + * hashtab.c (higher_prime_number): Use a table, rather than a + seive, to find the next prime. + +2000-11-22 H.J. Lu + + * cplus-dem.c (main): Handle gnat_demangling. + +2000-11-22 Zack Weinberg + + * aclocal.m4 (LIB_AC_PROG_CC): Moved here from configure.in. + (AC_DEFINE_NOAUTOHEADER): New - work around bug in autoheader. + * configure.in: Call AC_C_INLINE and AC_C_CONST. Use three + argument form of AC_DEFINE in dummy definitions block. Use + AC_DEFINE_NOAUTOHEADER for real definitions of things defined + in dummy block. Preload cache variables instead of bypassing + tests, where possible. + * acconfig.h: Removed. + + * xmalloc.c (xmalloc_failed): New function, does error + reporting on failed allocation. + (xmalloc, xcalloc, xrealloc): Use it. + +2000-11-21 Hans-Peter Nilsson + + * cplus-dem.c (cplus_demangle): Fix formatting. + (grow_vect): Ditto. + (ada_demangle): Ditto. + (internal_cplus_demangle): Ditto. + (mop_up): Ditto. + +2000-11-21 H.J. Lu + + * cplus-dem.c (main): Handle java_demangling. + +2000-11-19 Kaveh R. Ghazi + + * cplus-dem.c (grow_vect): Prototype. + (ada_demangle): Cast the arg of ctype macros to unsigned char. + +2000-11-15 Hans-Peter Nilsson + + * cplus-dem.c (ada_demangle): Add back ATTRIBUTE_UNUSED for + parameter `option'. + +2000-11-15 Kenneth Block + + * cplus-dem.c: Eliminate use of DEFUN, it is obsolete and cannot + be used in GCC. + +2000-11-15 Kenneth Block + + * cplus-dem.c: Add gnat demangler. Add java to demangle style + list. + +2000-11-04 Hans-Peter Nilsson + + * hashtab.c (htab_expand): Change to return int. Use calloc or + xcalloc depending on htab->return_allocation_failure. Return zero + if calloc fails. + (htab_create): Update comment to cover memory allocation. + (htab_try_create): New. + (htab_find_slot_with_hash): Return NULL if htab_expand fails. + Update comment to cover this. + +2000-11-03 Hans-Peter Nilsson + + * hashtab.c: Change void * to PTR where necessary. + (htab_create, htab_expand): Correct formatting of comment before + function. + +2000-10-22 Alex Samuel + + * cp-demangle.c (string_list_def): Add caret_position and comments. + (result_caret_pos): New macro. + (result_append_string): Rename to... + (result_add_string): ... this, and insert at caret position. + Rename throughout. + (result_append): Rename to... + (result_add): ... this, and insert at caret position. Rename + throughout. + (result_append_char): Rename to... + (result_add_char): ... this, and insert at caret position. Rename + throughout. + (result_append_space): Remove. + (string_list_new): Initialize caret position. + (result_add_separated_char): Use caret position. + (result_get_caret): New funtion. + (result_set_caret): Likewise. + (result_shift_caret): Likewise. + (result_previous_char_is_space): Likewise. + (substitution_start): Use caret position. + (substitution_add): Likewise. + (demangling_new): Initialize caret position. + (demangle_encoding): Use caret position. + (demanglin_nested_name): Put CV qualifiers after name. + (demangle_type_ptr): Use switch statement. Handle pointers to + arrays. Don't use result_append_space. Use caret position. + (demangle_type): Emit CV qualifiers after underlying type. Adjust + call to demangle_array_type. + (demangle_array_type): Add parameter to handle pointers to arrays. + +2000-10-01 Mark Mitchell + + * splay-tree.c (splay_tree_insert): Fix formatting. + +2000-09-16 Mark Mitchell + + * splay-tree.c (splay_tree_predecessor): Fix typo in comment. + +2000-09-14 Michael Sokolov + + * splay-tree.c: #include . + +2000-09-14 Hans-Peter Nilsson + + * testsuite/demangle-expected: Add two tests for anonymous + namespaces. + * cplus-dem.c (gnu_special): Handle anonymous namespaces. + +2000-09-10 Mark Mitchell + + * splay-tree.c (splay_tree_predecessor): New function. + (splay_tree_successor): Likewise. + +2000-09-10 Hans-Peter Nilsson + + * testsuite/demangle-expected: Add four tests for type_info + mangling. + * cplus-dem.c (gnu_special): Use do_type, not demangle_fund_type, + for a non-template non-qualified type_info function or node. + +2000-09-08 Alex Samuel + + * cp-demangle.c: Fix copyright banner. + +2000-09-07 Michael Sokolov + + * md5.c: #include "ansidecl.h". + +2000-09-06 Alex Samuel + + * cp-demangle.c (status_allocation_failed): Rearrange whitespace. + (demangle_type): Handle substitution candidates correctly in the + face of special substitutions. + +2000-09-05 Alex Samuel + + * cp-demangle.c (demangle_encoding): Rename variable. + (demangle_name): Rename parameter. Handle return type + suppression. + (demangle_nested_name): Rename parameter. + (demangle_prefix): Likewise. Change return type suppression. + (demangle_unqualified_name): Add parameter. Flag constructors and + conversion operators. + (demangle_special_name): Fix comment. + (demangle_type): Rename variable. + (demangle_bare_function_type): Check for missing return type and + parameter. + (demangle_class_enum_type): Rename parameter. + (demangle_discriminator): Fix misspelling in comment. + +2000-08-31 DJ Delorie + + * configure.in (Cygwin): special case cygwin only when we're + building cygwin, not when we're hosting cygwin. + +2000-09-04 Alex Samuel + + * cp-demangle.c (demangle_template_arg): Eat an `E' after an + . + +2000-09-04 Alex Samuel + + * cp-demangle.c (demangle_type_ptr): Increment position past + pointer and reference characters. + +2000-09-04 Alex Samuel + + * cp-demangle.c (demangle_nv_offset): New function. + (demangle_v_offset): Likewise. + (demangle_call_offset): Likewise. + (demangle_special_name): Update thunk demangling to comply with + ABI changes. + +2000-09-03 Alex Samuel + + * cp-demangle.c (ANONYMOUS_NAMESPACE_PREFIX): New macro. + (substitution_def): Remove template_parm_number. + (NOT_TEMPLATE_PARM): Remove. + (result_insert_string): New macro. + (result_insert): Likewise. + (result_insert_char): Likewise. + (substitution_add): Remove last parameter. Don't store template + parm number. + (BFT_NO_RETURN_TYPE): Define as NULL. + (demangle_encoding): Adjust call to demangle_bare_function_type. + (demangle_name): Adjust substitution. Adjust call to + substitution_add. + (demangle_prefix): Adjust call to substitution_add. + (demangle_identifier): Handle anonymous namespaces. + (demangle_operator_name): Change demangling of vendor-extended + operator to match ABI changes. + (demangle_type_ptr): Change parameters. Make recursive. Handle + substitutions here. + (demangle_type): Adjust calls to demangle_template_param, + substitution_add, and demangle_type_ptr. Fix substitution of + templated types. + (demangle_function_type): Change parameter to a pointer. + (demangle_bare_function_type): Likewise. Adjust insertion point. + (demangle_template_param): Remove last parameter. + (demangle_expr_primary): Remove unused variable. Adjust call to + demangle_template_param. + (is_mangled_char): Accept `$' and `.'. + * cplus-dem.c (gnu_new_abi_symbol_characters): Add '$' and '.'. + * dyn-string.c (dyn_string_insert_char): New function. + +2000-08-31 Hans-Peter Nilsson + + * testsuite/demangle-expected: Add nine tests for + underscore-after-number followed by five tests for name-signature + delimiter. + +2000-08-28 Richard Henderson + + * Makefile.in (md5.o): Depend on config.h. + +2000-08-28 Jason Merrill + + * Makefile.in (REQUIRED_OFILES): Add md5.o. + (CFILES): Add md5.c. + * md5.c: New file. + +2000-08-27 Alex Samuel + + * cp-demangle.c (demangle_name): Initialize template_p in local + name case. Don't re-add substitutions as candidates. + (demangle_nested_name): Use . + (demangle_prefix): Likewise. Don't add template names as + substitution candidates twice, or re-add a substitution or the + last prefix component. + (demangle_local_name): Adjust output format. + +2000-08-25 Alex Samuel + + * cp-demangle.c (result_add_separated_char): Change parameter to + int. + (substitution_add): Don't check for duplicates. Check if + previously allocated size is zero. + (demangle_name): Remove duplicate check for std substitution. + Clear template flag appropriately. + (demangle_prefix): Remove argument to demangle_substitution. + Don't check that template flag is already set. + (demangle_operator_name): Add pt operator. + (demangle_type): Don't treat r as built-in type. Remove argument + to demangle_substitution. Fix substitution candidate mechanics. + Handle s. Improve comments. + (demangle_template_param): Don't handle template arg lists here. + (demangle_substitution): Remove parameter. + (print_usage): Remove extra fprintf option. + +2000-08-24 Greg McGary + + * libiberty/random.c (end_ptr): Revert previous change. + +2000-08-24 Greg McGary + + * libiberty/cplus-dem.c (cplus_demangle_opname, cplus_mangle_opname, + demangle_expression, demangle_function_name): Use ARRAY_SIZE. + * libiberty/random.c (end_ptr): Likewise. + +2000-08-23 Alex Samuel + + * cp-demangle.c (result_close_template_list): Remove function. + (result_add_separated_char): New function. + (result_open_template_list): New macro. + (result_close_template_list): Likewise. + (demangle_prefix): Don't set template_p if the + prefix ends with a ctor name. + (demangle_type_ptr): Remove duplicate RETURN_IF_ERROR. + (demangle_type): Check for template args after substitution. + (demangle_template_args): Use result_open_template_list. + +2000-08-02 Zack Weinberg + + * pexecute.c: Don't use vfork. Initialize 'pid' before retry loop. + +2000-07-26 Dave Pitts + + * config/mh-openedition.h: Added -DLE370 definition. + +2000-07-26 Mark Elbrecht + + * pexecute.c (pexecute) [__MSDOS__]: Change __GO32__ to + __DJGPP__. Use P_WAIT instead of constant in the spawnv* call. + Cast program to 'char *' in errmsg_arg assignment. + (PWAIT_ERROR): Define. + (pwait): Use PWAIT_ERROR. Adjust DJGPP's status code to conform + to DJGPP's WIF* macros. + +2000-07-27 RodneyBrown + Jeff Law + + * getcwd.c: Include string.h, stdlib.h for prototypes + + * Makefile.in (rename.o, waitpid.o): Depend on config.h + * rename.c: Include config.h, unistd.h + * waitpid.c: Include config.h, sys/wait.h + +2000-07-24 Hans-Peter Nilsson + + * cplus-dem.c (work_stuff_copy_to_from): New. + (delete_non_B_K_work_stuff): New. + (delete_work_stuff): New. + (mop_up): Break out work_stuff partly destruction to + delete_non_B_K_work_stuff. + (iterate_demangle_function): New. + (demangle_prefix): Call iterate_demangle_function instead of + demangle_function_name. Leave handling of name-signature + __-delimiters to iterate_demangle_function. + (demangle_integral_value): Strip an optional + following underscore cautiously. Handle negative numbers. + +2000-07-24 Daniel Berlin + + * cplus-dem.c (demangle_signature): Change if (GNU_DEMANGLING) to + if (AUTO_DEMANGLING || GNU_DEMANGLING) + +2000-07-21 Alex Samuel + + * cp-demangle.c (demangle_ctor_dtor_name): Remove not-in-charge + allocating ctor mangling. + (demangle_array_type): Handle empty and non-constant array length. + +2000-07-23 Michael Sokolov + Jeff Law + + * configure.in (AC_CHECK_HEADERS): Add time.h. + (AC_HEADER_TIME): Add check. + * configure, config.in: Regenerate. + * getruntime.c: Portably #include and/or . + + * configure.in (AC_CHECK_HEADERS): Add limits.h. + * configure, config.in: Regenerate. + * sort.c: Portably #include and/or . + * strtol.c, strtoul.c: #include "config.h". Portably #include + and/or . + * Makefile.in (strtol.o, strtoul.o): Update dependencies. + + * aclocal.m4 (libiberty_AC_DECLARE_ERRNO): New macro. + * configure.in (libiberty_AC_DECLARE_ERRNO): Add check. + * configure, config.in: Regenerate. + * pexecute.c, strtol.c, strtoul.c: Declare errno if necessary. + + * cp-demangle.c, mkstemps.c: #include . + +2000-07-21 Mike Stump + + * Makefile.in (xexit.o): Add dependency for config.h in xexit.c. + * (vasprintf.o): Add dependency for config.h in vasprintf.c. + +2000-07-21 Kaveh R. Ghazi + + * cp-demangle.c (cp_demangle_type): Wrap in IN_LIBGCC2. + + * setenv.c (setenv): Initialize variable `ep'. + + * sigsetmask.c (abort): Prototype. + + * vasprintf.c: Include config.h. Check ANSI_PROTOTYPES, not + __STDC__ for stdarg.h include. + (int_vasprintf): Prototype. + (checkit): Prototype. Use VPARAMS/ANSI_PROTOTYPES/VA_START in + definition. Cast `global_total_width' in comparison. + (main): Prototype. Return a value. + + * vfork.c (fork): Prototype. + + * xexit.c: Include config.h. + +2000-07-20 Joseph S. Myers + + * cplus-dem.c (demangle_fund_type): Make 'dec' an unsigned int, + and print it with %u. + +2000-07-17 Hans-Peter Nilsson + + * testsuite/regress-demangle (failed test): Show result and + expected output. + +2000-07-07 Andrew Haley + + * cplus-dem.c (main): fflush() after emitting last char before + waiting for input. + +2000-06-28 Alex Samuel + + * cp-demangle.c (demangle_encoding): Accept no substitutions. + (demangle_name): Handle followed by + . + (demangle_type): Follow special substitutions with + + (demangle_subtitution): Set template_p for special substitutions. + (main): Fix typos. + +2000-06-27 Alex Samuel + + * cp-demangle.c (demangle_special_name): Swap base and derived + class when demangling construction vtables. + +2000-06-21 Alex Samuel + + * cp-demangle.c: Don't include ctype.h. + (IS_DIGIT): New macro. + (IS_ALPHA): Likewise. Use IS_DIGIT and IS_ALPHA throughout + instead of isdigit and isalpanum. + (demangling_def): Make name and next const pointers. + (STATUS_ALLOCATION_FAILED): New status code. + (dyn_string_append_space): Handle failure in + dyn_string_append_char. + (int_to_dyn_string): Likewise. Change return value to status_t. + (string_list_new): Handle failure of dyn_string_init. + (result_close_template_list): Change return type to status_t. + Handle failure in dyn_string_append. + (result_push): Change return value to status_t. Handle failure in + string_list_new. Handle failure of result_push throughout. + (substitution_add): Change return value to status_t. Handle + dyn_string failures. Handle failure of substitution_add + throughout. + (template_arg_list_new): Return NULL on allocation failure. + (result_append_string): Return STATUS_ALLOCATION_FAILED on error. + Handle error result throughout. + (result_append): Likewise. + (result_append_char): Likewise. + (result_append_space): Likewise. + (demangling_new): Make argument a const pointer. Handle + allocation failures. + (demangle_template_args): Handle failure in template_arg_list_new + and result_close_template_list. + (demangle_discriminator): Return if int_to_dyn_string fails. + (cp_demangle): Likewise. + (cp_demangle_type): New function. + (cplus_demangle_new_abi): Don't call dyn_string_delete. Abort on + memory allocation failure. + (main): Likewise. + * dyn-string.c (RETURN_ON_ALLOCATION_FAILURE): Define if + IN_LIBGCC2. + (dyn_string_init): Change return value to int. Handle + RETURN_ON_ALLOCATION_FAILURE case. + (dyn_string_new): Handle RETURN_ON_ALLOCATION_FAILURE case. + (dyn_string_release): Delete the dyn_string. + (dyn_string_resize): Handle RETURN_ON_ALLOCATION_FAILURE case. + (dyn_string_copy): Change return type to int. + (dyn_string_copy_cstr): Likewise. + (dyn_string_prepend): Likewise. + (dyn_string_prepend_cstr): Likewise. + (dyn_string_insert): Likewise. + (dyn_string_insert_cstr): Likewise. + (dyn_string_append): Likewise. + (dyn_string_append_cstr): Likewise. + (dyn_string_append_char): Likewise. + (dyn_string_substring): Likewise. + +2000-06-09 Zack Weinberg + + * cp-demangle.c (demangle_operator_name): Add spaces before + names beginning with a letter: delete, delete[], new, new[], + sizeof. + (demangle_special_name): Handle TF and TJ . + +Thu Jun 8 18:52:24 2000 Philippe De Muyter + + * cp-demangle.c (template_arg_list_new): Revert previous PARAMS patch. + +Thu Jun 8 09:25:54 2000 Philippe De Muyter + + * cp-demangle.c (stdio.h): File included unconditionaly. + (template_arg_list_new): Parameter list is PARAMS ((void)), not (). + * dyn-string.c (stdio.h): File included. + * partition.c (partition_print): No `&' needed to take the address of + a function. + +2000-06-07 Kaveh R. Ghazi + + * configure.in (ac_libiberty_warn_cflags): Add -pedantic. + + * choose-temp.c (try, choose_temp_base, make_temp_file): Constify. + + * cp-demangle.c (demangle_char): Change parameter from char to int. + (demangle_expression, demangle_expr_primary): Remove extra + semi-colon in prototype. + + * dyn-string.c (dyn_string_append_char): Change parameter from + char to int. + + * memcmp.c (memcmp): Constify. + + * mkstemps.c (gcc_uint64_t): Mark GNUC `long long' case with + __extension__. + + * partition.c (elem_compare): Prototype. Don't cast away + const-ness. + + * setenv.c (setenv): Use braces to avoid ambiguous `else'. + +2000-06-07 Kaveh R. Ghazi + + * Makefile.in (cp-demangle.o): Depend on $(INCDIR)/demangle.h. + + * cp-demangle.c: Include demangle.h. + (template_arg_list_new): DeANSIfy. + (cp_demangle): Make static and add prototype. + (operator_code, operators): Constify. + (demangle_operator_name): Likewise for variables `p1', `p2' and `p'. + +2000-06-05 Alex Samuel + + * cp-demangle.c (demangle_prefix): Cast argument to isdigit to + unsigned char. + (demangle_unqualified_name): Likewise. + (demangle_number_literally): Likewise. + (demangle_type): Likewise. + (demangle_substitution): Likewise. + (is_mangled_char): Likewise, for isalnum. + +2000-06-04 Alex Samuel + + * Makefile.in (CFILES): Add cp-demangle.c and dyn-string.c. + (REQUIRED_OFILES): Add cp-demangle.o and dyn-string.o. + (cp-demangle.o): New dependency. + (dyn-string.o): Likewise. + + * dyn-string.c: Move here from gcc/dyn-string.c. Add new functions. + + * cplus-dem.c (libiberty_demanglers): Add initializer for new-ABI + demangler. + (cplus_demangle): Call cplus_demangle_new_abi if in new-ABI + demangling mode. + (gnu_new_abi_symbol_characters): New function. + (main): Use gnu_new_abi_symbol_characters. * cp-demangle.c: New + file. + * cp-demangle.c: New file. + +Tue May 30 16:45:25 2000 Andrew Cagney + + * floatformat.c: Add name to each floatformat field. + +Tue May 30 15:07:52 2000 Jeffrey A Law (law@cygnus.com) + + * Makefile.in (objalloc.o): Depend on config.h + +2000-05-29 Zack Weinberg + + * hashtab.c, partition.c, sort.c, xmemdup.c: Include string.h + if HAVE_STRING_H. + * pexecute.c, xexit.c: Include stdlib.h if HAVE_STDLIB_H. + * objalloc.c: Include config.h. Include stdlib.h and don't + declare malloc or free if HAVE_STDLIB_H. + * strerror.c, strsignal.c: Include stdlib.h if HAVE_STDLIB_H, + else declare malloc without prototype. Include string.h if + HAVE_STRING_H, else declare memset without prototype. Don't + include stddef.h. + +2000-05-23 Mike Stump + + * Makefile.in (xmalloc.o): Add dependency for config.h, fixes make + -j3. + +2000-05-18 J. David Anglin + + * xmalloc.c: Include config.h for HAVE_SBRK definition. + +2000-05-16 Horst von Brand + + * hashtab.c (hash_pointer): Delete low-order bits which are + probably zero, also eliminate a warning on alpha. + +2000-05-15 David Edelsohn + + * Makefile.in: Change "pic" to depend on $(PICFLAG), not + on $(enable_shared). + +2000-05-10 Jakub Jelinek + + * config.table: Use mh-sparcpic for sparc*-*-*. + +2000-05-08 Nick Clifton + + * Makefile.in (CFILES): Add strncmp.c. + (NEEDED): Add strncmp. + +2000-05-04 Kaveh R. Ghazi + + * cplus-dem.c (cplus_demangle_opname, demangle_function_name): + Cast the arguments to `islower' to `unsigned char'. + (print_demangler_list): Prototype. + +Thu May 4 17:14:41 2000 Philippe De Muyter + + * sort.c (UCHAR_MAX): Provide fallback definition. + +2000-04-29 Alexandre Oliva + + * Makefile.in (maintainer-clean-subdir): Fix handling of empty + SUBDIRS. + +2000-04-28 Kenneth Block + Jason Merrill + + * cplus-dem.c (libiberty_demanglers): New table for demangle styles. + (cplus_demangle_set_style): New function for setting style. + (cplus_demangle_name_to_style): New function to translate name. + +2000-04-27 Kaveh R. Ghazi + + * aclocal.m4: New file with new test libiberty_AC_FUNC_STRNCMP. + + * configure.in (AC_CHECK_HEADERS): Add sys/mman.h fcntl.h. + (libiberty_AC_FUNC_STRNCMP): Invoke. + + * strncmp.c: New file. + +Thu Apr 27 16:58:43 MET DST 2000 Jan Hubicka + + * hashtab.c (htab_expand): Add prototype. + (find_empty_slot_for_expand): Likewise. + +2000-04-24 Kaveh R. Ghazi + + * hashtab.c (hash_pointer, eq_pointer): Make definition static to + match prototype. + (htab_expand): Cast the return value of xcalloc. + +2000-04-24 Mark Mitchell + + * hashtab.c (hash_pointer): New function. + (eq_pointer): Likewise. + (htab_hash_pointer): New variable. + (htab_eq_pointer): Likewise. + +2000-04-23 Mark Mitchell + + * sort.c (sort_pointers): Fix endianness bugs. + + * sort.c: New file. + * Makefile.in (CFILES): Add sort.c + (REQUIRED_OFILES): Add sort.o. + (sort.o): New target. + +2000-04-21 Michael Sokolov + + * Makefile.in (*-subdir): Revamp slightly to avoid losing on + 4.3BSD systems. + +Tue Apr 18 16:23:31 2000 Richard Kenner + + * hashtab.c: Various minor cleanups. + (htab_find_slot_with_hash): INSERT is now enum insert_option. + (htab_find_slot): Likewise. + +2000-04-16 Dave Pitts + + * cplus-dem.c (cplus_demangle_opname): Changed to use islower. + +2000-04-05 Richard Henderson + + * splay-tree.c (splay_tree_remove): New. + +2000-03-30 Mark Mitchell + + * hashtab.c (find_empty_slot_for_expand): Use hashval_t for hash + codes. + (htab_find_with_hash): Likewise. + (htab_find_slot_with_hash): Likewise. + +2000-03-29 Zack Weinberg + + * hashtab.c (htab_find_with_hash): Avoid calculating hash2 + unless it will be used. Rearrange loop for better + optimization. + (higher_prime_number): Add static prototype. + +Thu Mar 16 01:33:58 2000 Jeffrey A Law (law@cygnus.com) + + * Makefile.in (partition.o): Depend on config.h + +2000-03-14 Bernd Schmidt + + * hashtab.c (find_empty_slot_for_expand): New function. + (htab_expand): Use it instead of htab_find_slot. + (htab_find_with_hash): Renamed from htab_find; now accepts extra + argument HASH. + (htab_find_slot_with_hash): Likewise for htab_find_slot. + (htab_find): New wrapper function. + (htab_find_slot): Likewise. + (htab_traverse): Pass slot, not entry, to called function. + +2000-03-09 Alex Samuel + + * Makefile.in (CFILES): Add partition.c. + (REQUIRED_OFILES): Add partition.o. + (partition.o): New rule. + * partition.c: New file. + +2000-03-09 Zack Weinberg + + * hashtab.c (htab_create): Set del_f. + (htab_delete, htab_empty, htab_remove_elt, htab_clear_slot): + Use it. + +2000-03-08 Zack Weinberg + + * hashtab.c: Remove debugging variables (all_searches, + all_collisions, all_expansions). Delete + all_hash_table_collisions. + (create_hash_table, delete_hash_table, empty_hash_table, + find_hash_table_entry, remove_element_from_hash_table_entry, + clear_hash_table_slot, traverse_hash_table, hash_table_size, + hash_table_elements_number, hash_table_collisions): Rename to: + htab_create, htab_delete, htab_empty, htab_find_slot, + htab_remove_elt, htab_clear_slot, htab_traverse, htab_size, + htab_elements, htab_collisions. + (htab_find): New function, handles common case where you don't + plan to add or delete an entry. + (htab_expand): Don't create a whole new table, just a new + entry vector. + (htab_find_slot): Simplify logic. + +1999-08-03 Ian Lance Taylor + + * floatformat.c: Add casts to avoid signed/unsigned warnings. + * pexecute.c: Add ATTRIBUTE_UNUSED as needed on Unix. + + * Makefile.in (install_to_libdir): Change $(TARGETLIB).n to + $(TARGETLIB)n so it works on MSDOS. + (install_to_tooldir): Likewise. + +1999-07-21 Ian Lance Taylor + + From Mark Elbrecht: + * makefile.dos: Remove; obsolete. + * configure.bat: Remove; obsolete. + +1999-07-11 Ian Lance Taylor + + * splay-tree.c (splay_tree_insert): Add initialization to avoid + warning. + +2000-01-04 Mumit Khan + + * pexecute.c: Conditionally include string.h. + (fix_argv): Handle embedded whitespace in args for Mingw32. + +2000-01-04 Kaveh R. Ghazi + + * configure.in (ac_libiberty_warn_cflags): Turn on warnings if + we're using gcc. + + * Makefile.in (COMPILE.c): Add @ac_libiberty_warn_cflags@ + +1999-12-27 Geoff Keating + + * vasprintf.c (int_vasprintf): Don't re-read the format character + as this mishandles strings like '%%s'. + +1999-12-05 Mark Mitchell + + * splay-tree.c (splay_tree_new): Use struct splay_tree_node_s + rather than struct splay_tree_node. + (splay_tree_insert): Use struct splay_tree_s rather than struct + splay_tree. + +Sun Nov 28 00:59:39 1999 Philippe De Muyter + + * hashtab.c (sys/types.h): File included. + +1999-11-22 Jason Merrill + + * strtoul.c, strtol.c, random.c: Remove advertising clause from + BSD license, pursuant with + + ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change + +Wed Nov 10 09:42:39 1999 Jeffrey A Law (law@cygnus.com) + + * hashtab.c: Include stdio.h. + +Mon Nov 8 09:23:41 1999 Jeffrey A Law (law@cygnus.com) + + * hashtab.c (traverse_hash_table): Protect prototype with PARAMS. + +Tue Nov 2 03:23:13 1999 Philippe De Muyter + + * xstrdup (sys/types.h): Include this file. + +1999-10-28 Nathan Sidwell + + * Makefile.in (SUBDIRS): New macro. + (mostlyclean, clean, distclean, maintainer-clean): Adjust to + avoid multiple subdirectory cleaning. + (*-subdir): Use SUBDIRS. + +1999-10-25 Jim Kingdon + + * cplus-dem.c: Move declarations of standard_symbol_characters and + hp_symbol_characters inside #ifdef MAIN to avoid compiler + warnings. + +1999-10-23 08:51 -0700 Zack Weinberg + + * hashtab.c (find_hash_table_entry): When returning a + DELETED_ENTRY slot, change it to EMPTY_ENTRY first. + (clear_hash_table_slot): New function which deletes an entry + by its position in the table, not its value. + (traverse_hash_table): New function which calls a hook + function for every live entry in the table. + +1999-10-19 Mark Mitchell + + * cplus-dem.c (INTBUF_SIZE): New macro. + (string_append_template_idx): New function. + (demangle_expression): Likewise. + (demangle_integral_value): Use it. + (demangle_real_value): New function, split out from ... + (demangle_template_value_parm): ... here. Use + string_append_template_idx. Use demangle_real_value. + (demangle_template): Use string_append_template_idx. + (demangle_qualified): Use consume_count_with_underscores. + (get_count): Tweak formatting. + (do_type): Use string_append_template_idx. + +1999-10-18 Kaveh R. Ghazi + + * calloc.c: Add a public domain notice. + +Mon Oct 18 02:30:47 1999 Philippe De Muyter + + * setenv.c (sys/types.h, stdio.h): Include those files unconditionaly. + +Fri Oct 15 01:47:51 1999 Vladimir Makarov + + * Makefile.in (CFILES): Add hashtab.c + (REQUIRED_OFILES): Add hashtab.o + (hashtab.o): Add dependencies. + * hashtab.c: New file + +Wed Oct 13 01:16:47 1999 Mumit Khan + + * basename.c (DIR_SEPARATOR): New macro. + (DIR_SEPARATOR_2): Likewise. + (HAVE_DOS_BASED_FILESYSTEM): Likewise. + (IS_DIR_SEPARATOR): Likewise. + (main): Handle MSDOS style pathname. + +1999-10-11 Mark Mitchell + + * cplus-dem.c (do_type): Handle pointer to member types whose + enclosing classes have namespace scope. + +Sun Oct 10 01:23:50 1999 Marc Espie + + * config.table: Provide a backup shell for executing move-if-change. + +1999-10-02 Mark Mitchell + + * xmalloc.c (xmalloc): Fix spelling error. + (xcalloc, xrealloc): Likewise. + +1999-10-02 Kaveh R. Ghazi + + * cplus-dem.c (fancy_abort, demangle_integral_value, + demangle_arm_hp_template, recursively_demangle, + standard_symbol_characters, hp_symbol_characters, main): Add prototype. + (program_name, program_version, fatal): Constify a char*. + (usage, fatal): Mark with ATTRIBUTE_NORETURN. + (main): Call return, not exit. + +1999-09-25 Kaveh R. Ghazi + + * choose-temp.c: Remove obsolete comment about gcc. + (make_temp_file): Constify a char*. + +Wed Sep 8 20:03:28 1999 Kaveh R. Ghazi + + * xmemdup.c: Include sys/types.h. + +1999-09-07 Jeff Garzik + + * xmemdup.c: New xmemdup function. + * Makefile.in, makefile.vms, vmsbuild.com: Use xmemdup.[co]. + +Tue Sep 7 23:32:18 1999 Linas Vepstas + + * config.table: Add openedition target. + * config/mh-openedition: New file. + +Thu Sep 2 01:36:12 1999 Marc Espie + + * pexecute.c (pexecute): Fill in temp_base when needed. + +1999-08-31 Richard Henderson + + * getpwd.c: Check HAVE_GETCWD before defining it away. + +1999-08-30 Kaveh R. Ghazi + + * Makefile.in (CFILES): Add calloc.c and getpwd.c. + (REQUIRED_OFILES): Add getpwd.o. + (getpwd.o): Add target. + + * configure.in (AC_PREREQ): Bump to 2.13. + (AC_CHECK_HEADERS): Add check for . + + * getpwd.c: New file, moved here from gcc. + +1999-08-25 Kaveh R. Ghazi + + * cplus-dem.c (gnu_special): Cast a `size_t' to `long' when + comparing against a signed quantity. + (arm_special): Likewise. + (demangle_fund_type): Likewise. + (do_hpacc_template_const_value): Mark parameter `work' with + ATTRIBUTE_UNUSED. + (main): Constify variable `valid_symbols'. + +Tue Aug 24 02:50:45 1999 Philippe De Muyter + + * strtoul.c (strtoul): Add parentheses around && within ||. + +Fri Aug 6 23:32:29 1999 Daniel Jacobowitz + + * Makefile.in (FLAGS_TO_PASS): Include prefix, exec_prefix, + libdir, libsubdir and tooldir. + +1999-08-01 Mark Mitchell + + * splay-tree.c (splay_tree_insert): Return the new node. + +1999-07-14 Richard Henderson + + * argv.c: Include stdlib.h and string.h instead of + prototyping directly. + * choose-temp.c: Conditionally include string.h. + +1999-07-12 Jason Merrill + + * Makefile.in (NEEDED): Add bcmp, bcopy, bzero. + +1999-07-11 Ian Lance Taylor + + * splay-tree.c (splay_tree_insert): Add initialization to avoid + warning. + +1999-07-07 Jason Merrill + + * Makefile.in (needed-list): Only include stuff we actually need + for libstdc++. + +1999-06-21 Andreas Schwab + + * configure.in (checkfuncs): Add gettimeofday. + * config.in, configure: Regenerated. + +Mon Jun 21 05:56:01 1999 Mumit Khan + + * configure.in (*-*-uwin*): UWIN has sys_{errlist,nerr} even if + the test fails. + * configure: Regenerate. + +1999-06-10 Mike Stump + + * Makefile.in (setenv.o): Add config.h dep for setenv.o to fix + parallel builds. + +1999-05-28 Kaveh R. Ghazi + + * putenv.c: Include ansidecl.h to define `const'. + * setenv.c: Likewise. + +Wed May 26 03:58:20 1999 "Melissa O'Neill" + + * Makefile.in (CFILES): Add putenv.c and setenv.c. + * configure.in (funcs): Add putenv and setenv. + (AC_CHECK_FUNCS): Check for putenv and setenv. + * configure: Rebuilt. + * putenv.c setenv.c: New files. + + * getcwd.c (getcwd): If pathname is NULL, then obtain SIZE + bytes of space using malloc. + +Mon May 17 01:42:34 1999 Stu Grossman + + * cplus-dem.c (demangle_fund_type (near 'I' case)): Don't advance + the *mangled pointer beyond the end of the string. Clean up code to + match prevailing coding style. + +1999-05-13 Michael Hayes + + * tmpnam.c (L_tmpnam): Fix typo. + +Thu May 13 01:14:46 1999 Marc Espie + + * cplus-dem.c (standard_symbol_characters): Renamed from + standard_symbol_alphabet. No longer modify TABLE. + (hp_symbol_characters): Renamed from hp_symbol_alphabet. No longer + modify TABLE. + (main): Corresponding changes. Use strchr to determine if a + character is valid. + +1999-05-11 Jim Blandy + + * cplus-dem.c (main): Use table lookup to distinguish identifier + characters from non-identifier characters. + (standard_symbol_alphabet, hp_symbol_alphabet): New functions. + +Thu May 6 20:34:42 1999 Fred Fish + + * configure.in (sys/resource.h): Add to AC_CHECK_HEADERS list. + * getruntime.c: Only attempt to include sys/resource.h and + use getrusage if both HAVE_GETRUSAGE and HAVE_SYS_RESOURCE_H + are defined. + +Mon Apr 26 01:36:06 1999 Donn Terry (donn@interix.com) + + * configure.in (alloca detection): Handle alloca directly for interix. + * configure: Rebuilt. + +Sun Apr 25 01:18:21 1999 Mumit Khan + + * choose-temp.c (DIR_SEPARATOR): Use '\\' only for native windows32. + +1999-04-20 Jim Blandy + + Fix from Dale Hawkins: + * cplus-dem.c (mop_up): Set typevec_size to zero, so it'll be + reallocated properly if we use it again. + + * cplus-dem.c (demangle_fund_type): Check for buffer overrun. Be + stricter about syntax. Always null-terminate string. + +Thu Apr 15 23:00:55 1999 Mumit Khan + + * configure.in (checkfuncs): Check for sbrk. + * config.in: Rebuilt. + * configure: Likewise. + * xmalloc.c: Use HAVE_SBRK instead of the host specific definitions. + +1999-04-12 Jim Blandy + + Fix from Marcus Daniels: + * cplus-dem.c (demangle_fund_type): Don't run off the end of the + identifier looking for another underscore. + +Sun Apr 11 23:20:59 1999 Mumit Khan + + * pexecute.c: Change all references to __UWIN__ to _UWIN. + * xmalloc.c: Likewise. + (xcalloc): UWIN has sbrk. + (xrealloc): Fix guard macro. + +1999-04-11 Richard Henderson + + * alloca-conf.h (alloca) [C_ALLOCA]: Don't use Gcc builtin + or . + * clock.c (GNU_HZ): New definition. + (clock): Use it. + * getruntime.c: Likewise. + + * config.table: Use mh-beos. + * config/mh-beos: New file. + +1999-04-11 Mark Mitchell + + * cplus-dem.c (demangle_template_value_parm): Handle + pointers-to-members. + (do_type): Handle template parameters as qualifiers. + +1999-04-01 Jim Blandy + + * cplus-dem.c: Attempt to handle overflows in counts with some + semblance of grace. + (consume_count): Detect overflows. Return -1 to indicate errors, + instead of zero. + (demangle_template_value_parm, demangle_template): Handle change + to consume_count's return convention. + +1999-04-05 Tom Tromey + + * testsuite/regress-demangle: New file. + * testsuite/demangle-expected: New file. + + * Makefile.in (all, check, installcheck, info, install-info, + clean-info, dvi, install, etags, tags, mostlyclean, clean, + distclean, maintainer-clean, realclean): Depend on corresponding + `-subdir' target. + (all-subdir check-subdir installcheck-subdir info-subdir + install-info-subdir clean-info-subdir dvi-subdir + install-info-subdir etags-subdir mostlyclean-subdir clean-subdir + distclean-subdir maintainer-clean-subdir): New target. + * testsuite/Makefile.in: New file. + * configure: Rebuilt. + * configure.in: Create testsuite/Makefile. + +1999-04-02 Mark Mitchell + + * splay-tree.h (splay_tree_compare_pointers): Define. + +1999-03-30 Mark Mitchell + + * splay-tree.c (splay_tree_compare_ints): Define. + +1999-03-30 Tom Tromey + + * cplus-dem.c (consume_count): If `count' wraps, return 0 and + don't advance input pointer. + (demangle_class_name): If consume_count didn't find a count, do + nothing. Don't bother with `strlen' sanity check; consume_count + does it for us. + +1999-03-16 Stan Shebs + + From Art Haas : + * cplus-dem.c (demangle_prefix): Don't grab all the '__' strings + when doing arm or hp style. + (demangle_nested_args): Decr forgetting_types field when done. + +Thu Mar 11 01:22:58 1999 Mumit Khan + + * pexecute.c (__CYGWIN32__): Rename to + (__CYGWIN__): this. + * xmalloc.c: Likewise. + + Changes to support i386-pc-uwin. + * configure.in (*-*-uwin*): Workaround for vfork bug. + * configure: Regenerate. + * pexecute.c (pexecute): Be like standard Unix. + (pwait): Likewise. + * xmalloc.c (first_break): Define. + (xmalloc_set_program_name): Use. + (xmalloc): Use. + +Thu Mar 11 01:07:55 1999 Franz Sirl + + * config.table: Cleanup and add mh-*pic handling for alpha, arm, powerpc + +Sun Feb 28 22:30:44 1999 Geoffrey Noer + + * config.table: Check cygwin*, not cygwin32*. + +Tue Feb 9 16:39:01 1999 Dave Brolley + + * Makefile.in: Change mkstemp -> mkstemps. + +Tue Feb 9 01:12:27 1999 Marc Espie + + * Makefile.in (REQUIRED_OFILES): remove mkstemp.o + * configure.in (funcs): Check for and conditionally add mkstemps to + the list of functions libiberty will provide. + * configure: Rebuilt. + +Wed Feb 3 00:01:15 1999 Mumit Khan + + * clock.c (HZ): Define in terms of (ISO C) CLOCKS_PER_SEC on + platforms that don't have HZ. + * getruntime.c (HZ): Likewise. + +Sat Jan 30 13:28:04 1999 Richard Henderson + + * Makefile.in (xstrdup.o): Depend on config.h. + +Wed Jan 13 07:26:44 1999 H.J. Lu (hjl@gnu.org) + + * cplus-dem.c (mop_up): Set work->previous_argument to NULL after + freeing it. + +Wed Jan 13 14:16:36 1999 Kaveh R. Ghazi + + * xstrdup.c (xstrdup): Switch from strcpy to memcpy for speed. + +Tue Jan 5 15:58:29 1999 Elena Zannoni + + * Makefile.in (CFILES): fix typo, splay-tree.c instead of + splay-tree.o. + +1999-01-04 Jason Molenda (jsm@bugshack.cygnus.com) + + * configure.in: Require autoconf 2.12.1 or higher. + +1998-12-30 Michael Meissner + + * random.c (NULL): Don't redefine NULL if it is already defined. + +Tue Dec 22 09:43:35 1998 Kaveh R. Ghazi + + * argv.c (buildargv): Cast the result of alloca in assignment. + + * choose-temp.c: Include stdlib.h. + + * cplus-dem.c (demangle_arm_pt): Remove unused prototype. + (snarf_numeric_literal): Constify first parameter. + (code_for_qualifier): Avoid a gcc extension, make the parameter an + int, not a char. + (demangle_qualifier): Likewise. + (demangle_signature): Cast the argument of a ctype function to + unsigned char. + (arm_pt): Add parens around assignment used as truth value. + (demangle_arm_hp_template): Constify variable `args'. + (do_hpacc_template_const_value): Cast the argument of a ctype + function to unsigned char. + (do_hpacc_template_literal): Remove unused variable `i'. + (snarf_numeric_literal): Constify parameter `args'. + Cast the argument of a ctype function to unsigned char. + + * floatformat.c (floatformat_to_double): Add explicit braces to + avoid ambiguous `else'. + + * fnmatch.c (fnmatch): Change type of variables `c', `c1', + `cstart' and `cend' to unsigned char. Cast the argument of macro + `FOLD', which uses ctype functions, to unsigned char. + + * objalloc.c (free): Add prototype. + +Sun Dec 20 16:03:46 1998 Hans-Peter Nilsson + + * Makefile.in (CFILES): Fix typo: splay-tree.c, not splay-tree.o + +Fri Dec 18 17:50:18 1998 David Taylor + + * cplus-dem.c (demangle_arm_pt): remove declaration -- function + doesn't exist. + (do_hpacc_template_literal): remove unused variable `i'. + +Fri Dec 18 16:11:43 EST 1998 Andrew MacLeod + + * cplus-dem.c (demangle_fund_type): Process CV and u codes before + bumping the pointer we read from. Also prepend these codes, + as we do in other places. + +1998-12-18 Nick Clifton + + * cplus-dem.c (demangle_arm_hp_template): Make variable 'args' be + 'const char *' in order to match its usage when calling siblings. + (snarf_numeric_literal): Make first arg 'const char **' in order + to match usage. + +Mon Dec 14 09:55:50 1998 Kaveh R. Ghazi + + * choose-temp.c: Don't check IN_GCC anymore. + + * floatformat.c (floatformat_from_double): Use `const', not `CONST'. + * memchr.c (memchr): Likewise. + * memcpy.c (memcpy): Likewise. + * memmove.c (memmove): Likewise. + + * mkstemp.c: Don't check IN_GCC anymore. + * pexecute.c: Likewise. + * splay-tree.c: Likewise. + + * strchr.c (strchr): Use `const', not `CONST'. + * strrchr.c (strrchr): Likewise. + * strtol.c (strtol): Likewise. + * strtoul.c (strtoul): Likewise. + +Fri Dec 4 13:51:04 1998 David Taylor + Elena Zannoni + Stan Shebs + Edith Epstein + Andres MacLeod + Satish Pai + + * HP aCC demangling support. + * cplus-dem.c + (main): Remove default to HP style demangling, set to EDG + demangling correctly when -edg specified; set the demangling style + when user specifies 'edg'. Set strip_underscore to + prepends_underscore, if not HPUXHPPA. Set + current_demangling_style to hp_demangling if HPUXHPPA. Set + current demangling style correctly if the switch is hp. Read + label correctly also in the HP style case. + (work_stuff): add temp_start field; add field for volatile member + function. + (arm_pt): handle ARM_DEMANGLING and EDG_DEMANGLING styles; HP + style for this case is the same as ARM. + (demangle_args): handle EDG_DEMANGLING style; support HP style. + (demangle_arm_hp_template): new function. (It was + demangle_arm_pt.); check and set value of temp_start field in + multiple places. Also, when ceching for end of template args, + check to see if at end of static member of template class. + (demangle_class): new local variable : save_class_name_end Don't + include template args in string defining class. + (demangle_class_name): use demangel_arm_hp_template. + (demangle_function_name): handle case where demangling style is + HP_DEMANGLING and currently point at an 'X' in the mangled name. + Handle EDG_DEMANGLING style. Handle constructor and destructor + ops for HP style. + (demangle_prefix): handle EDG_DEMANGLING and ARM_DEMANGLING + styles. global destructor and constructor for HP style are same + as for ARM style. Same for local variables. + (demangle_qualified): handle EDG_DEMANGLING style. + (demangle_signature): add case for volatile member function. For + cases '1' - '9' : initialize the temp_start field to -1 and handle + the EDG_DEMANGLING style. for case 'F' : handle EDG_DEMANGLING + and AUTO_DEMANGLING styles. If expecting a function and managed + to demangle the funct args, then handle the LUCID_DEMANGLING, + ARM_DEMANGLING, and EDG_DEMANGLING styles. Add case for local + class name after "Lnnn_ in HP style case. HP style too needs to + forget types. _nnn is OK for HP style, so don't report failure. + (do_hpacc_template_const_value): new function. Handle template's + value param for HP/aCC. + (do_hpacc_template_literal): new function. Handle a template's + literal parameter for HP aCC. + (recursively_demangle): new function + (snarf_numeric_literal): new function. + (usage): add 'edg' to the list of demangling styles; add hp switch + to message. + +Sat Nov 28 17:25:22 1998 Christopher Faylor + + * pexecute.c: Remove obsolete ifdefed cygwin code. + +Fri Nov 27 13:26:06 1998 Kaveh R. Ghazi + + * choose-temp.c: Always include libiberty.h. Avoid redundancies. + * cplus-dem.c: Likewise. Conform to libiberty.h. + * pexecute.c: Likewise. + * splay-tree.c: Likewise. + +1998-11-25 Mike Stump + + * Makefile.in (splay-tree.o): Add config.h dependency. + +Mon Nov 23 16:59:49 1998 Kaveh R. Ghazi + + * configure.in: Use AC_PREREQ(2.12.1). + +1998-11-16 Benjamin Kosnik + + * cplus-dem.c (demangle_fund_type): Add demangling for C9x types. + +Thu Nov 19 22:15:50 1998 Jeffrey A Law (law@cygnus.com) + + * mpw.c (mpw_access): Add missing parens. + +Thu Nov 19 12:59:21 1998 Kaveh R. Ghazi + + * configure.in: Call AC_HEADER_SYS_WAIT. + + * pexecute.c: Include sys/wait.h when !IN_GCC. + +Thu Nov 19 14:38:20 1998 Geoffrey Noer + + * pexecute.c: revert back to checking old Cygwin + preprocessor symbol until some time has passed. + +Wed Nov 18 08:52:26 1998 Christopher Faylor + + * pexecute.c: Reorganize WIN32 case to accomodate Cygwin + since it will now support similar constructs. + +Fri Nov 13 19:18:05 1998 Kaveh R. Ghazi + + * configure.in: Check for calloc. + + * calloc.c: New file. + + * xmalloc.c (xcalloc): New function. + +Fri Nov 13 08:51:46 EST 1998 Andrew MacLeod + + *cplus-dem.c (demangle_prefix): Use the last "__" + in the mangled name when looking for the signature. This allows + template names to begin with "__". + +1998-11-08 Mark Mitchell + + * cplus-dem.c (type_kind_t): Add tk_reference. + (demangle_template_value_parm): Handle it. + (do_type): Use it for references, instead of tk_pointer. + + * cplus-dem.c (demangle_template_value_parm): Use cplus_demangle, + not internal_cplus_demangle. + +Sat Nov 7 16:02:10 1998 Kaveh R. Ghazi + + * choose-temp.c: Don't include gansidecl.h. + * mkstemp.c: Likewise. + * pexecute.c: Likewise. + +Mon Nov 2 15:05:33 1998 Geoffrey Noer + + * configure.in: detect cygwin* instead of cygwin32* + * configure: regenerate + +Mon Nov 2 10:22:01 1998 Kaveh R. Ghazi + + * pexecute.c: Check HAVE_CONFIG_H, not IN_GCC, when determining + whether to include config.h. Possibly include unistd.h in the + !IN_GCC case. Define VFORK_STRING as a printable function call + for error messages (either "vfork" or "fork".) If HAVE_VFORK_H is + defined, include vfork.h. If VMS is defined, define vfork() + appropriately. Remove vfork check on USG, we're using autoconf. + (pexecute): Set `errmsg_fmt' to VFORK_STRING instead of checking + locally what string to use. + +1998-10-26 Mark Mitchell + + * splay-tree.c: Tweak include directives to make sure declarations of + xmalloc and free are available. + +1998-10-25 Mark Mitchell + + * cplus-dem.c (gnu_special): Fix handling of virtual tables in + anonymous namespaces. + +1998-10-23 Mark Mitchell + + * cplus-dem.c (work_stuff): Replace const_type and volatile_type + with type_quals. + (TYPE_UNQUALIFIED): New macro. + (TYPE_QUAL_CONST): Likewise. + (TYPE_QUAL_VOLATILE): Likewise. + (TYPE_QUAL_RESTRICT): Likewise. + (code_for_qualifier): New function. + (qualifier_string): Likewise. + (demangle_qualifier): Likewise. + (internal_cplus_demangle): Use them. + (demangle_signature): Likewise. + (demangle_template_value_parm): Likewise. + (do_type): Likewise. + (demangle_fund_type)): Likewise. + +Thu Oct 22 19:58:43 1998 Kaveh R. Ghazi + + * splay-tree.c (splay_tree_foreach_helper): Make definition static + to match prototype. + +1998-10-21 Mark Mitchell + + * splay-tree.c: New file. + * Makefile.in (CFILES): Add it. + (REQUIRED_OFILES): Likewise. + (splay-tree.o): Add dependencies. + +Tue Oct 20 12:29:02 1998 Andreas Schwab + + * cplus-dem.c (demangle_qualified): Fix off-by-one when checking + range of 'K' index. + +Thu Oct 15 18:51:12 1998 Kaveh R. Ghazi + + * choose-temp.c: Prototype mkstemps() when IN_GCC. + + * cplus-dem.c (consume_count): Cast argument of ctype macro to + `unsigned char'. + (cplus_demangle_opname): Cast the result of `strlen' to (int) when + comparing against one. + (cplus_mangle_opname): Likewise. + (demangle_integral_value): Cast argument of ctype macro to + `unsigned char'. + (demangle_template_value_parm): Likewise. + (demangle_template): Initialize variable `bindex'. Cast the + result of `strlen' to (int) when comparing against one. Remove + unused variable `start_of_value_parm'. + (demangle_class_name): Cast the result of `strlen' to (int) when + comparing against one. + (demangle_prefix): Cast argument of ctype macro to `unsigned char'. + (gnu_special): Likewise. Cast the result of `strlen' to (int) + when comparing against one. + (demangle_qualified): Cast argument of ctype macro to `unsigned char'. + (get_count): Likewise. + (do_type): Likewise. Cast the result of `strlen' to (int) when + comparing against one. + (demangle_fund_type): Cast argument of ctype macro to `unsigned char'. + (demangle_function_name): Cast the result of `strlen' to (int) + when comparing against one. + + * mkstemp.c (mkstemps): Cast variable `len' to (int) when + comparing against one. + +Tue Oct 13 23:51:51 1998 Jeffrey A Law (law@cygnus.com) + + * mkstemp.c: Check HAVE_SYS_TIME_H before including sys/time.h + * configure.in (AC_CHECK_HEADERS): Check for sys/time.h too. + * config.in, configure: Rebuilt. + + * getopt.c: Check HAVE_STRINGS_H before including strings.h. + * configure.in (AC_CHECK_HEADERS): Check for strings.h too. + * config.in, configure: Rebuilt. + +Mon Oct 12 19:15:59 1998 Geoffrey Noer + + * configure.in: in comment, call AC_EXEEXT instead of AM_EXEEXT + +Sun Oct 11 17:36:06 1998 Michael Tiemann + + * Makefile.in (cplus-dem.o, obstack.o): Depend upon config.h. + +Thu Oct 8 23:42:08 1998 Jeffrey A Law (law@cygnus.com) + + * Merge egcs & devo libiberty. + +1998-09-08 Martin von Löwis + + * cplus-dem.c (demangle_arm_pt): Demangle anonymous namespaces. + +Mon Sep 7 23:29:01 1998 Kaveh R. Ghazi + + * mkstemp.c: Include config.h even when not IN_GCC. Wrap header + inclusions inside HAVE_*_H macros. Include ansidecl.h when not + IN_GCC. + + * vasprintf.c: Include stdarg.h/varargs.h first. + + * vprintf.c: Likewise. + +Sat Sep 5 03:24:49 1998 Jeffrey A Law (law@cygnus.com) + + * pexecute.c: Updates from gcc. Copy in gcc has been removed. This + is the canonical copy. Define ISSPACE if !IN_GCC. + * alloca.c, vfprintf.c, choose-temp.c, mkstemp.c, getopt.c: Similarly. + * getopt1.c, obstack.c: Similarly. + * Makefile.in: Build mkstemp.o + +Tue Sep 1 23:12:47 1998 Christopher Faylor + + * configure.in: Include asprintf in list of functions known not + to be in newlib. + * configure: Rebuild. + +Wed Aug 19 14:05:01 1998 Mumit Khan + + * cplus-dem.c (work_stuff): Add dllimported. + (demangled_prefix): Mark symbols imported from PE DLL. + (internal_cplus_demangled): Handle. + +1998-08-17 Jason Merrill + + * cplus-dem.c (do_type): Fix simple array handling. If we fail, + stay failed. + +Mon Aug 17 10:40:34 1998 Kaveh R. Ghazi + + * cplus-dem.c: Include config.h if it exists. Also, only + prototype malloc/realloc if we can't get stdlib.h. + +Sat Aug 15 16:15:01 1998 Ian Lance Taylor + + * configure.in: Switch back to checking --with-target-subdir when + deciding whether to check for newlib, undoing part of July 15 + change. + * configure: Rebuild. + +Thu Aug 13 16:47:38 1998 Mark Mitchell + + * cplus-dem.c (type_kind_t): New type. + (demangle_template_value_parm): Add type_kind_t parameter. Rely + on this paramter, rather than demangling the type again. + (demangle_integral_value): Pass tk_integral. + (demangle_template_: Pass the value returned from do_type. + (do_type): Return a type_kind_t. Pass tk_integral to + demangle_template_value_parm for array bounds. + (demangle_fund_type): Likewise. + + Also incorporate from GCC version: + + Tue Jul 21 13:28:19 1998 Jason Merrill + + * cplus-dem.c (do_type): Use demangle_template_value_parm for arrays. + +Thu Aug 13 16:47:38 1998 Kaveh R. Ghazi + + * cplus-dem.c (demangle_nested_args): Make function definition + static to match the prototype. + +Tue Jul 28 11:33:09 1998 Mark Mitchell + + * cplus-dem.c (type_kind_t): New type. + (demangle_template_value_parm): Add type_kind_t parameter. Rely + on this paramter, rather than demangling the type again. + (demangle_integral_value): Pass tk_integral. + (demangle_template_: Pass the value returned from do_type. + (do_type): Return a type_kind_t. Pass tk_integral to + demangle_template_value_parm for array bounds. + (demangle_fund_type): Likewise. + + Also incorporate from GCC version: + + Tue Jul 21 13:28:19 1998 Jason Merrill + + * cplus-dem.c (do_type): Use demangle_template_value_parm for arrays. + +Mon Jul 27 12:16:08 1998 Ian Lance Taylor + + * Makefile.in (ALLOCA): New variable. + ($(TARGETLIB)): Add $(ALLOCA) to library. + (needed-list): Add $(ALLOCA). + ($(ALLOCA)): Depend upon stamp-picdir. + +Sun Jul 19 08:23:17 1998 Kaveh R. Ghazi + + * cplus-dem.c (demangle_nested_args): Make function definition + static to match the prototype. + +Wed Jul 15 00:12:58 1998 Ian Lance Taylor + + * configure.in: Check --with-cross-host rather than + --with-target-subdir when deciding whether build uses a cross + compiler, and when deciding where to install the library. + * configure: Rebuild. + +Sun Jul 12 01:27:05 1998 Jason Merrill + + * cplus-dem.c (demangle_nested_args): Return a value. + +Sat Jul 11 16:19:48 1998 Mark Mitchell + + * cplus-dem.c (string): Move definition before work_stuff. + (work_stuff): Add volatile_type, forgetting_types, + previous_argument, and nrepeats fields. + (SCOPE_STRING): New macro. + (demangle_template): Add `remember' parameter. Add comment. + Register the `B' code type here, if remembering. Tidy. Fix crash + on NULL tmpl_argvec. Be consistent with use of tname/trawname. + (demangle_nested_args): New function. + (internal_cplus_demangle): Handle volatile-qualified member + functions. + (mop_up): Delete the previous_argument string if present. + (demangle_signature): Tidy. Handle volatile-qualified member + functions. Handle back-references using the `B' code. Use extra + parameter to demangle_template and SCOPE_STRING where appropriate. + (demangle_template_value_parm): Fix thinko; 'B' is not an integral + code. + (demangle_class): Use SCOPE_STRING. + (gnu_special): Pass additional argument to demangle_template. + Use SCOPE_STRING. + (demangle_qualified): Save qualified types for later + back-references. Handle constructors and destructors for template + types correctly. + (do_type): Tidy. Use SCOPE_STRING. Pass extra argument to + demangle_template. Use demangled_nested_args. Don't remember + qualified types here; that's now done in demangle_qualified. + Similarly for templates. + (do_arg): Improve commment. Handle 'n' repeat code. + (remember_type): Check forgetting_types. + (demangle_args): Deal with 'n' repeat codes. Tidy. + +Thu Jul 2 16:26:24 1998 Ian Lance Taylor + + * config.table: Only use mh-fbsd21 on *-*-freebsd2.2.[012], not on + *-*-freebsd2.2.*. From Dmitrij Tejblum . + +Mon Jun 15 16:29:01 1998 Ian Lance Taylor + + * configure.in (setobjs): Correct quoting error in cygwin32 case. + From Chris Faylor . + +Mon Jun 1 13:47:55 1998 Jason Molenda (crash@bugshack.cygnus.com) + + * obstack.c: Update to latest FSF version. + +Mon Jun 1 14:17:36 1998 Mike Stump + + * Makefile.in: Add a dependency on stamp-picdir for the + objects, so that we can do a parallel build. + +Sat May 30 22:17:13 1998 Mumit Khan + + * configure.in (checkfuncs): Add missing "'". + +Fri May 29 12:40:41 1998 Jason Molenda (crash@bugshack.cygnus.com) + + * obstack.c (_obstack_memory_used): Elide this function if we're + on a system with GNU libc. + +Tue May 26 18:28:43 1998 Ian Lance Taylor + + * Makefile.in (distclean): Remove config.log. + +Tue May 26 15:01:52 1998 Andreas Schwab + + * Makefile.in (distclean): Don't remove alloca-conf.h. + +Fri May 22 01:38:07 1998 Hans-Peter Nilsson + + * cplus-dem.c (MBUF_SIZE): Bumped from 512 to 32767. + +1998-05-21 Mark Mitchell + + * cplus-dem.c (do_type): Handle volatile qualification. + +1998-05-21 Manfred Hollstein + + * configure.in: Check for unistd.h as well. + * configure: Rebuild. + * config.in: Rebuild. + * getpagesize.c (GNU_OUR_PAGESIZE): Use sysconf only if _SC_PAGESIZE + is defined in unistd.h. Reformat conditional block for easier reading. + + * config.table (shared): Default to no if ${enable_shared} + is unset or empty; this logic is used by the toplevel + configure scripts, too. + +Sat May 16 14:01:26 1998 Jeffrey A Law (law@cygnus.com) + + * config.table: Add line to set enable_shared in the Makefile + as needed. + +Wed May 13 14:24:38 1998 Kaveh R. Ghazi + + * cplus-dem.c (squangle_mop_up): Change return type to void. + (internal_cplus_demangle): Remove unused parameter `options'. + All callers changed. + (cplus_demangle_opname): Remove function wide variable `int i' and + replace with `size_t i' at each location where it is used. + (cplus_mangle_opname): change type of `i' from int to size_t. + +Wed May 13 13:39:38 1998 Ian Lance Taylor + + * alloca-conf.h: Include config.h. Check HAVE_ALLOCA_H rather + than sparc or sun. + * Makefile.in (argv.o): Depend upon config.h and alloca-conf.h. + +Fri May 8 00:23:51 1998 Ian Lance Taylor + + * configure.in: Set libiberty_topdir correctly when srcdir is + "." and with_target_subdir is not set. + * configure: Rebuild. + +Thu May 7 13:01:44 1998 Ian Lance Taylor + + * configure.in: Add *-*-mingw32* case. + * configure: Rebuild. + +Wed May 6 11:33:51 1998 Ian Lance Taylor + + * config.table: Never use a PIC file for *-*-cygwin32*. + + * Makefile.in (config.status): Depend upon config.table. + + * configure.in: On a cygwin32 host, always compile random, and + don't test for sys_siglist, strsignal, or psignal. + * configure: Rebuild. + + * clock.c: Check HAVE_SYS_PARAM_H rather than NO_SYS_PARAM_H. + * getcwd.c: Likewise. + * getpagesize.c: Likewise. + * getruntime.c: Likewise. + +Tue May 5 18:08:32 1998 Ian Lance Taylor + + Use autoconf tests rather than the old dummy.c test: + * configure.in: Add AC_ARG_WITH calls for --with-target-subdir and + --with-newlib. Add AC_CONFIG_HEADER. Use AC_REPLACE_FUNCS for + most functions. Add special cases to handle newlib and VxWorks. + Remove target_makefile_frag. Create stamp-h in AC_OUTPUT if + CONFIG_HEADERS is set. Only call config-ml.in in AC_OUTPUT if + CONFIG_FILES is set; set ac_file before calling it. + * config.table (arm-*-riscix*, *-*-cygwin32): Remove. + (*-*-hpux*, *-*-hiux*, *-*-irix4*, *-*-solaris2*): Remove. + (*-*-sysv4*, *-*-go32, *-*-vxworks5*, *-*-vxworks): Remove + (i[3456]-*-mingw32*): Remove. + * Makefile.in (ERRORS_CC, CONFIG_H, NEEDED_LIST): Remove. + (LIBOBJS): New variable. + (HOST_OFILES, DO_ALSO, STAGESTUFF): Remove. + (all): Depend upon needed-list. Don't check RULE1. + (@target_makefile_frag@): Remove. + (COMPILE.c): Include @DEFS@. + (HFILES): Add alloca-conf.h. + (REQUIRED_OFILES): Remove basename.o. + ($(TARGETLIB)): New target. + (stamp-needed, lneeded-list, needed.awk, stamp-config): Remove. + (lconfig.h, needed2.awk, dummy.o, errors): Remove. + (needed-list, config.h): Rewrite. + (RULE1, $(RULE1), RULE2, $(RULE2)): Remove. + (.always.): Remove. + (Makefile): Set CONFIG_FILES and CONFIG_HEADERS. + (stamp-h): New target. + (atexit.o, clock.o, getcwd.o, getpagesize.o): New targets. + (basename.o): Don't depend upon config.h. + (getruntime.o): Depend upon config.h. + * atexit.c: Include config.h. Check HAVE_ON_EXIT rather than + NEED_on_exit. + * basename.c: Don't include config.h. Don't check NEED_basename. + * clock.c: Include config.h. + * getcwd.c: Likewise. + * getpagesize.c: Likewise. + * getruntime.c: Likewise. Fix checks which set HAVE_GETRUSAGE and + HAVE_TIMES. + * strerror.c: Change uses of NEED_sys_errlist to + HAVE_SYS_ERRLIST. Likewise for NEED_strerror and HAVE_STRERROR. + * strsignal.c: Likewise for NEED_sys_siglist and HAVE_SYS_SIGLIST, + and for NEED_strsignal and HAVE_STRSIGNAL and for NEED_psignal and + HAVE_PSIGNAL. + * acconfig.h: New file. + * dummy.c: Remove. + * functions.def: Remove. + * config/mh-cxux7 (HDEFINES): Remove -DHAVE_SYSCONF. + * config/mh-windows (HDEFINES): Remove. + * config/mh-cygwin32: Remove. + * config/mh-go32: Remove. + * config/mh-irix4: Remove. + * config/mh-riscix: Remove. + * config/mh-sysv4: Remove. + * config/mt-mingw32: Remove. + * config/mt-vxworks5: Remove. + * config.in: New file, generated using autoheader. + * configure: Rebuild. + +Mon May 4 13:00:28 1998 Ian Lance Taylor + + * configure.in: Rewrite to use autoconf. + * configure: Generate using autoconf. + * config/mh-a68bsd: Remove. + * config/mh-apollo68: Remove. + * config/mh-hpbsd: Remove. + * config/mh-ncr3000: Remove. + * config/mh-sysv: Remove. + * config/mh-aix (RANLIB, INSTALL): Don't define. + * config/mh-cxux7 (RANLIB, INSTALL): Don't define. + * config/mh-irix4 (CC, RANLIB, INSTALL): Don't define. + * config/mh-sysv4 (RANLIB, INSTALL): Don't define. + * config.table: Change config_shell to CONFIG_SHELL, and use + libiberty_topdir to find move-if-change. + (m68k-apollo-bsd*, m68k-apollo-sysv*): Remove. + (i[3456]86-ncr-sysv4*, *-*-dgux*, hppa*-hp-bsd*): Remove. + (*-*-irix*, *-*-m88kbcs*, *-*-sysv*): Remove. + * Makefile.in (srcdir): Set to @srcdir@. + (VPATH): Likewise. + (prefix, exec_prefix, bindir, libdir): Set to autoconf variables. + (SHELL, INSTALL, INSTALL_PROGRAM, INSTALL_DATA): Likewise. + (CC, CFLAGS, RANLIB)): Likewise. + (datadir, man*dir, infodir, includedir, MAKEINFO): Remove. + (target_makefile_frag, host_makefile_frag): Add substitutions. + (INSTALL_DEST): Set to @INSTALL_DEST@. + (Makefile): Depend upon config.status. Don't depend upon + $(host_makefile_frag) or $(target_makefile_frag). + (config.status): New target. + +Sun May 3 17:58:49 1998 Ian Lance Taylor + + * config/mt-sunos4: Remove. Should be handled by --with-headers + and --with-libraries options at top level. + * config.table: Never use mt-sunos4. + + * alloca-conf.h: New file, combining alloca-norm.h and + alloca-botch.h. + * alloca-norm.h: Remove. + * alloca-botch.h: Remove. + * configure.in: Set shell variables files and links to empty. + * config.table: Don't set shell variable files. + * configure.bat: Don't create alloca-conf.h. + * makefile.vms: Likewise. + * mpw-config.in: Likewise. + * vmsbuild.com: Likewise. + +Fri May 1 11:41:42 1998 Ian Lance Taylor + + * Makefile.in ($(HOST_OFILES) $(REQUIRED_OFILES)): Remove old + target depending upon config.h. + (alloca.o): Add target depending upon config.h + (basename.o, choose-temp.o, fnmatch.o): Likewise. + (getopt.o, getopt1.o, pexecute.o, strerror.o): Likewise. + (strsignal.o, xstrerror.o): Likewise. + +Fri May 1 04:26:25 1998 Peter Schauer + + * cplus-dem.c (cplus_demangle_opname): Initialize work. + +Mon Apr 27 15:53:30 EDT 1998 Andrew MacLeod + + * cplus-dem.c (demangle_qualified): Replace missing else. + +Sun Apr 26 15:38:50 1998 Andreas Schwab + + * cplus-dem.c (gnu_special): Fix off-by-one bug when checking the + length in the name of a virtual table. + +Wed Apr 22 10:53:49 EDT 1998 Andrew MacLeod + + * cplus-dem.c (struct work stuff): Add field for B and K mangle codes. + (cplus_demangle_opname): Call mop_up_squangle. + (cplus_demangle): Initialize squangle info, then call + internal_cplus_demangle. (Most code moved there as well) + (internal_cplus_demangle): New function, performs most of what use + to be done in cplus_demangle, but is only called with this file. + (squangle_mop_up): New function to clean up B and K code data. + (mop_up): set pointers to NULL after freeing. + (demangle_signature, demangle_template, demangle_class): Add + switch elements to handle K and B codes. + (demangle_prefix, gnu_special, demangle_qualified): Add + code to handle K and B codes. + (do_type, demangle_fund_type): Handle B and K codes. + (remember_Ktype): New function to store K info. + (register_Btype, remember_Btype): New functions for B codes. + (forget_B_and_K_types): New function to destroy B and K info. + +Fri Apr 10 01:49:10 1998 Jeffrey A Law (law@cygnus.com) + + * COPYING.LIB, choose-temp.c, cplus-dem.c: Sync with egcs & gcc. + +Thu Mar 5 09:23:28 1998 Manfred Hollstein + + * config.table: Make locating frag files failsafe even for the + special case if configuring and building in srcdir. + +Mon Feb 23 14:33:15 1998 Ian Lance Taylor + + * choose-temp.c: Fix handling of sys/file.h to work in libiberty. + +Sun Feb 22 18:03:23 1998 Jeffrey A Law (law@cygnus.com) + + * choose-temp.c: Sync with copy in gcc. + +Thu Feb 12 16:29:49 1998 Ian Lance Taylor + + * getopt.c: Update to latest FSF version. + * getopt1.c: Likewise. + +Tue Feb 10 16:58:33 1998 Stan Shebs + + * cplus-dem.c (gnu_special): Don't get confused by . + strings that are not actually lengths. + +Fri Feb 6 01:35:17 1998 Manfred Hollstein + + * Makefile.in (FLAGS_TO_PASS): Don't pass PICFLAG. + (.c.o): Check value of enable_shared, not PICFLAG. + (stamp-picdir): Dito. + +Thu Feb 5 18:48:56 1998 Geoffrey Noer + + * config/mh-cygwin32: remove vasprintf.o from EXTRA_OFILES + since it gets built automatically + +Sun Feb 1 02:52:32 1998 Mike Stump + + * config.table (vxworks configs): Default to VxWorks 5.x, as that is + the currently shipping OS. + +Tue Jan 27 16:08:20 1998 Pat Rankin + + * vmsbuild.com [REQUIRE_OFILES]: Synchronized with Makefile.in: + Add fnmatch.o and objalloc.o; remove vasprintf.o. + [config.h]: Define NEED_strsignal. + +Mon Jan 19 12:20:01 1998 Ian Lance Taylor + + * functions.def: Correct argument types for strerror and + strsignal. Reported by Alex Gutman . + +Sun Jan 18 15:57:28 1998 Michael Snyder + + * vasprintf.c (int_vasprintf): Increase buffer size for float/double + values. + +Sat Jan 17 22:28:38 1998 Mumit Khan + J.J. VanderHeijden + + Add mingw32 support. + * pexecute.c (pexecute): New function for mingw32. Supports pipes. + (pwait): New function for mingw32. + + * config.table (i[3456]86-*-mingw32*): Support for i386-mingw32. + * config/mt-mingw32: New file. + * xmalloc.c (first_break): Not used for mingw32. + (xmalloc_set_program_name): Don't use sbrk on mingw32. + (xmalloc): Likewise. + (xrealloc): Likewise. + +Sat Jan 17 22:28:05 1998 Jeffrey A Law (law@cygnus.com) + + * choose-temp.c: Sync with gcc version. + +Tue Jan 13 18:34:39 1998 Jim Wilson + + * Makefile.in (install_to_libdir, install_to_tooldir): Add MULTISUBDIR + to all filenames in libdir and tooldir. + (distclean): Do MULTICLEAN before deleting Makefile. + (stamp-needed, stamp-config): Add MULTISRCTOP to + pathname for move-if-change. + +Thu Dec 4 17:25:19 1997 Jeffrey A Law (law@cygnus.com) + + * strsignal.c (sys_nsig): Try NSIG and _NSIG. + +Wed Nov 19 13:37:06 1997 Michael Meissner + + * alloca-norm.h (alloca, GCC case): Don't redefine alloca if it + was already defined previously. + +Mon Nov 10 12:48:03 1997 Philippe De Muyter + + * Makefile.in (INSTALL): Use ../install-sh, not install. + +Tue Oct 28 23:41:15 1997 Judy Goldberg + + * Makefile.in (CFILES): Add pexecute.c. + +Wed Oct 15 19:13:48 1997 Ian Lance Taylor + + * asprintf.c: Consistently use either stdarg or varargs. + +Tue Oct 14 12:01:00 1997 Mark Mitchell + + * cplus-dem.c (demangle_signature): Don't look for return types on + constructors. Handle member template constructors. + +Fri Oct 3 17:53:30 1997 Ian Lance Taylor + + * README: Fix configuration instructions. + +Mon Sep 29 12:28:41 1997 Ian Lance Taylor + + * pexecute.c: Update to current version from /gd/gnu/lib: + + Mon Sep 29 12:27:59 1997 Ian Lance Taylor + + * pexecute.c: Use spawn if __CYGWIN32__. + + 1997-08-08 Paul Eggert + + * pexecute.c: Include "config.h" first, as per autoconf manual. + + Fri Jun 27 15:20:29 1997 Scott Christley + + * pexecute.c (fix_argv): New function. + (pexecute): Win32 but not Cygwin32 needs its arguments fixed. + Add underscore to cwait function call. + +Sun Sep 28 12:00:52 1997 Mark Mitchell + + * cplus-dem.c (demangle_template): Add new parameter. Handle new + template-function mangling. + (consume_count_with_underscores): New function. + (demangle_signature): Handle new name-mangling scheme. + +Wed Sep 24 00:31:59 1997 Felix Lee + + * asprintf.c: stdarg.h when ALMOST_STDC + * config/mh-windows (EXTRA_OFILES): add asprintf.o and + strncasecmp.o. + +Thu Aug 28 14:27:15 1997 Andrew Cagney + + * vasprintf.c (vasprintf): Allow for _BSD_VA_LIST_. + + * config.table: Add case for FreeBSD 2.1 and 2.2, needs mh-fbsd21. + + * config/mh-fbsd21 (EXTRA_OFILES): Force vasprintf.o + +Wed Sep 10 12:43:10 1997 Jason Merrill + + * cplus-dem.c (demangle_fund_type): Change "complex" to "__complex". + +Fri Sep 5 16:34:42 1997 Andrew Cagney + + * asprintf.c (asprintf): New file. + * Makefile.in (CFILES): Add asprintf.c + * functions.def: Ditto. + +Thu Aug 28 18:53:34 1997 Andrew Cagney + + * argv.c (dupargv): New function, duplicate an argument vector. + +Tue Aug 19 20:28:45 1997 Geoffrey Noer + + * config/mh-cygwin32: also build random.o + +Tue Aug 19 17:10:56 1997 Jason Merrill + + * cplus-dem.c: Add 'extern' to prepends_underscore. + +Wed Jul 30 11:42:19 1997 Per Bothner + + * cplus-dem.c: Various changes to produce Java output when passed + DMGL_JAVA. Thus "::" becomes "." and "JArray" becomes "Foo[]". + (main): Support --java and -j flags to set DMGL_JAVA. + +Tue Jul 22 19:05:23 1997 Robert Hoehne + + * config/mh-go32 (CC, AR, RANLIB): Don't define. + +Tue Jul 22 17:49:54 1997 Ian Lance Taylor + + * Makefile.in (REQUIRED_OFILES): Add pexecute.o. + (pexecute.o): New target. + + * Makefile.in (stamp-needed): New target, replacing needed-list. + (needed-list): Just depend upon stamp-needed. + (stamp-config): New target, replacing config.h. + (config.h): Just depend upon stamp-config. + (mostlyclean): Remove stamp-*. + +Thu Jun 12 11:00:18 1997 Angela Marie Thomas (angela@cygnus.com) + + * Makefile.in (FLAGS_TO_PASS): pass INSTALL, INSTALL_PROGRAM and + INSTALL_DATA for multilibbed installs + +Tue Jun 3 13:21:05 1997 Doug Evans + + Tue Dec 10 09:44:57 1996 Paul Eggert + + * choose-temp.c (choose_temp_base): Don't dump core if TMPDIR is empty. + + * choose-temp.c (try): Insist that temp dir be searchable. + + Wed Oct 23 17:36:39 1996 Doug Rupp (rupp@gnat.com) + + * choose-temp.c (choose_temp_base): On VMS, use proper syntax + for current directory. + + Sat Feb 15 19:03:48 1997 Geoffrey Noer (noer@cygnus.com) + + * pexecute.c: Remove special cases for cygwin32. + (pwait): Remove local definition of `pid'. + + Tue Nov 12 18:26:15 1996 Doug Rupp (rupp@gnat.com) + + * pexecute.c (vfork): Supply new definition for VMS. + (pwait): Use waitpid instead of wait for VMS. + +Tue May 20 14:02:20 1997 Brendan Kehoe + + * cplus-dem.c (do_type): Handle `J'. + (demangle_fund_type): Print "complex" for it. + +Wed Apr 30 12:15:45 1997 Jason Merrill + + * configure.in: Don't turn on multilib here. + +Mon Apr 28 19:04:31 1997 Michael Snyder + + * obstack.c: move _obstack_memory_used outside of ifdef. Cannot be + elided; needed by gdb and not present in libc. + +Thu Apr 24 19:33:47 1997 Ian Lance Taylor + + * Makefile.in (clean): Remove tmpmulti.out. + +Tue Apr 22 10:25:15 1997 Fred Fish + + * floatformat.c (floatformat_ieee_double_littlebyte_bigword): + Add new floatformat, mainly for ARM doubles. + +Mon Apr 14 12:11:16 1997 Ian Lance Taylor + + * config.table: Use ${config_shell} with ${moveifchange}. From + Thomas Graichen . + +Fri Apr 4 03:09:24 1997 Ulrich Drepper + + * configure.in: Enable multilibing by default. + Update multilib template to read config-ml.in. + +Tue Apr 1 16:26:39 1997 Klaus Kaempf + + * makefile.vms: Add objalloc. + +Mon Mar 31 23:57:51 1997 H.J. Lu + + * cplus-dem.c (demangle_it): Add prototype declaration. + (usage, fatal): Likewise. + + * xexit.c (_xexit_cleanup): Add prototype. + + * strerror.c (init_error_tables): Declare. + +Fri Mar 28 11:43:20 1997 H.J. Lu + + * functions.def: Add DEF of vasprintf, and DEFFUNC of strsignal. + * strsignal.c: Only define strsignal if NEED_strsignal. + * Makefile.in (REQUIRED_OFILES): Remove vasprintf.o. + * configure.in: Add NEED_strsignal to xconfig.h. Add vasprintf.o + to xneeded-list. + * config/mh-cygwin32 (HDEFINES): Add -DNEED_strsignal. + (EXTRA_OFILES): Define to vasprintf.o. + * config/mh-windows (HDEFINES): Add -DNEED_strsignal. + (EXTRA_OFILES): Add vasprintf.o. + * config/mt-vxworks5 (vxconfig.h): Define NEED_strsignal. + (vxneeded-list): Add vasprintf.o. + +Thu Mar 20 17:02:09 1997 Ian Lance Taylor + + * objalloc.c: Include . + +Mon Mar 17 19:23:11 1997 Ian Lance Taylor + + * objalloc.c: New file. + * Makefile.in (CFILES): Add objalloc.c + (REQUIRED_OFILES): Add objalloc.o. + (objalloc.o): New target. + +Sat Mar 15 18:49:41 1997 Ian Lance Taylor + + * obstack.c: Update to current FSF version. + +Fri Mar 14 14:18:47 1997 Ian Lance Taylor + + * cplus-dem.c: Add prototypes for all static functions. + (mystrstr): Make static. Make arguments and result const. + (cplus_match): Remove; not used. + +Tue Mar 11 14:20:31 1997 Brendan Kehoe + + * cplus-dem.c (gnu_special): Call demangled_fund_type for other + __t* symbols. + +Tue Mar 11 15:41:21 1997 H.J. Lu + + * spaces.c: Declare malloc and free properly. + * strsignal.c (init_signal_tables): Add prototype. + * xatexit.c (_xexit_cleanup): Add parameter declarations. + +Wed Feb 19 15:43:24 1997 Brendan Kehoe + + * Makefile.in (lneeded-list): If alloca.o is needed, xexit.o is + also required because of xmalloc.o. + +Fri Feb 14 13:43:38 1997 Ian Lance Taylor + + * strsignal.c: Unconditionally redefine sys_siglist around the + inclusion of the system header files. + +Thu Feb 13 22:01:04 1997 Klaus Kaempf + + * makefile.vms: Remove 8 bit characters. Update to latest + gcc release. + +Tue Feb 4 11:52:19 1997 Ian Lance Taylor + + * strsignal.c: Use NEED_sys_siglist instead of + LOSING_SYS_SIGLIST. + * config.table: Don't use mh-lynxos. + * config/mh-lynxos: Remove. + +Thu Jan 16 14:51:03 1997 Bob Manson + + * cplus-dem.c: Fix indenting; make identical to the copy + in GCC. + (do_type, case 'M'): Check for a template as well as a class. + +Thu Dec 19 13:51:33 1996 Brendan Kehoe + + * config/mt-vxworks5 (vxneeded-list): Remove sigsetmask.o, since + vxworks 5.[0-3] all have sigsetmask in them; the one provided by + libiberty is incorrect, as well. + +Mon Dec 2 15:03:42 1996 Michael Meissner + + * alloca.c (alloca): When compiled with an ANSI/ISO compiler, + alloca takes a size_t argument, not just unsigned. + +Mon Nov 18 15:42:08 1996 Jason Merrill + + * cplus-dem.c: Note that this file also lives in GCC. + +Mon Nov 18 15:19:00 1996 Dawn Perchik + + * alloca.c: Remove include of libiberty.h for hpux. + * argv.c: Replace defs from libiberty.h. + * spaces.c: Put back externs from removed from libiberty.h. + * vasprintf.c: Remove include of libiberty.h for hpux. + +Mon Nov 18 14:08:00 1996 Dawn Perchik + + * cplus-dem.c: Checking in again; last checkin filed due to sticky tag. + +Wed Nov 13 08:22:00 1996 Dawn Perchik + + * cplus-dem.c: Revert last two commits due to conflicts with + hpux system headers. + +Wed Nov 13 08:22:00 1996 Dawn Perchik + + * alloca.c, argv.c, spaces.c, strcasecmp.c, vasprintf.c, vprintf.c: + Revert last commit due to conflicts with hpux system headers. + +Wed Nov 13 10:36:50 1996 Michael Meissner + + * cplus-dem.c (x{m,re}alloc): Make declarations compatibile with + libiberty.h when compiled with a standard compiler. + +Tue Nov 12 16:31:00 1996 Dawn Perchik + + * alloca.c: Include libiberty.h for definition of xmalloc. + Don't redefine NULL. + * argv.c: Move prototypes to libiberty.h. + * cplus-dem.c: Include libiberty.h for definition of xmalloc. + Don't redefine NULL. + Use casts to eliminate compiler warnings. + * spaces.c: Remove prototypes for malloc and free which are + already in libibrty.h. + * strcasecmp.c: Use casts to eliminate compiler warnings. + * vasprintf.c: Include libiberty.h for definition of malloc. + Don't redefine NULL. + * vprintf.c: Include stdarg.h if __STDC__. + +Fri Oct 11 15:42:12 1996 Stu Grossman (grossman@critters.cygnus.com) + + * config/mh-windows: Add strcasecmp.o to EXTRA_OFILES. + +Fri Oct 11 11:16:31 1996 Stan Shebs + + * mpw.c (mpwify_filename): Rewrite to simplify, and to handle + upward components correctly. + +Tue Oct 8 08:55:34 1996 Stu Grossman (grossman@critters.cygnus.com) + + * config.table, config/mh-windows: Add support for building under + MSVC (the Microsoft build environment). + +Mon Oct 7 10:50:27 1996 Ian Lance Taylor + + * fnmatch.c: Undef const if not __STDC__. + +Thu Oct 3 13:46:39 1996 Ian Lance Taylor + + * fnmatch.c: New file. + * Makefile.in (CFILES): Add fnmatch.c. + (REQUIRED_OFILES): Add fnmatch.o. + (fnmatch.o): New target. + +Wed Sep 18 14:49:13 1996 Jason Merrill + + * cplus-dem.c (demangle_template): Fix handling of address args. + (gnu_special): Handle type_info stuff. + +Fri Sep 13 17:52:55 1996 Stan Shebs + + * mpw.c (DebugPI): Make settable from the env var DEBUG_PATHNAMES. + (mpwify_filename): Handle "::/" case. + +Thu Sep 12 13:30:40 1996 Geoffrey Noer + + * config/mh-cygwin32: new file (need -DNEED_basename and + -DNEED_sys_siglist for native NT rebuilding) + * config.table (*-*-cygwin32): new entry + * choose-temp.c: bring in sync with gcc (revert Aug 17 change) + +Thu Aug 29 16:48:45 1996 Michael Meissner + + * config.table (i[345]86-*-*): Recognize i686 for pentium pro. + +Tue Aug 27 13:47:58 1996 Stan Shebs + + * pexecute.c (pexecute) [MPW]: Remove old bogus code that + messed with arguments that included a '/', add escape chars + to double quotes, remove const decl from arg that Mac + compilers don't seem to like. + +Sat Aug 17 04:44:27 1996 Geoffrey Noer + + * pexecute.c: Update test for win32 (&& ! cygwin32). + * choose-temp.c: fix WIN32 preprocessor defines + +Thu Aug 15 12:26:48 1996 Stan Shebs + + * mpw-make.sed: Add @DASH_C_FLAG@ and @SEGMENT_FLAG({Default})@ + to editing of default makefile rule. + +Sun Aug 11 21:03:27 1996 Stu Grossman (grossman@critters.cygnus.com) + + * alloca-norm.h: Include if _WIN32. + * argv.c: Include non-prototyped decls for malloc and string + functions if ! _WIN32 or if __GNUC__. + +Thu Aug 8 12:42:40 1996 Klaus Kaempf + + * config.h-vms: New file. + * makefile.vms: Use it. + +Wed Aug 7 17:16:12 1996 Stu Grossman (grossman@critters.cygnus.com) + + * getopt.c (_getopt_internal): If argc is 0, just return (before + we reference *argv and segfault). + +Mon Aug 5 01:29:08 1996 Jason Merrill + + * Makefile.in (distclean): Add multilib.out. + +Thu Jul 18 17:40:55 1996 Ian Lance Taylor + + * alloca-norm.h: Change #ifdef sparc to #if defined (sparc) && + defined (sun). From Andrew Gierth . + +Mon Jul 1 13:40:44 1996 Ken Raeburn + + Tue May 28 15:29:03 1996 Pat Rankin + + * vmsbuild.com (REQUIRD_OFILES): Add choose-temp.o and xstrdup.o. + + Thu Jan 25 18:20:04 1996 Pat Rankin + + * vmsbuild.com: Changes to handle DEFFUNC(on_exit). + (do_ofiles): Allow nonexistent source file in pass 3. + (chk_deffunc): New routine. + +Tue Jun 25 19:24:43 1996 Doug Evans + + * pexecute.c (PEXECUTE_VERBOSE): Define. + (MPW pexecute): Check flags & PEXECUTE_VERBOSE instead of verbose_flag. + +Tue Jun 25 23:11:48 1996 Jason Molenda (crash@godzilla.cygnus.co.jp) + + * Makefile.in (docdir): Removed. + +Tue Jun 25 23:01:07 1996 Jason Molenda (crash@godzilla.cygnus.co.jp) + + * Makefile.in (oldincludedir): Removed. + +Tue Jun 25 22:50:07 1996 Jason Molenda (crash@godzilla.cygnus.co.jp) + + * Makefile.in (datadir): Set to $(prefix)/share. + +Thu Jun 20 21:17:52 1996 Ian Lance Taylor + + * cplus-dem.c (demangle_arm_pt): Reindent. Avoid endless loop by + checking for errors from do_type. + +Tue Jun 18 14:36:19 1996 Klaus Kaempf + + * makefile.vms: New file. + * xmalloc.c: If VMS, include and rather + than declaring malloc, realloc, and sbrk. + +Mon Jun 10 13:17:17 1996 Doug Evans + + * pexecute.c: New file. + +Wed Jun 5 16:57:45 1996 Richard Henderson + + * xmalloc.c: Declare sbrk. + +Sat May 4 05:08:45 1996 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) + + * alloca-norm.h: Add SPARCworks cc compatible __builtin_alloca + declaration. + +Mon Apr 22 18:41:49 1996 Ian Lance Taylor + + * xstrerror.c: Include . + +Sun Apr 21 11:55:12 1996 Doug Evans + + * Makefile.in (CFILES): Add atexit.c. + +Sun Apr 21 09:50:09 1996 Stephen L Moshier (moshier@world.std.com) + + * choose-temp.c: Include sys/types.h before sys/file.h for sco3.2v5. + +Wed Apr 17 11:17:55 1996 Doug Evans + + * choose-temp.c: Don't #include sys/file.h ifdef NO_SYS_FILE_H. + #include + * config/mt-vxworks5 (HDEFINES): Define NO_SYS_FILE_H. + +Tue Apr 16 11:27:16 1996 Jeffrey A Law (law@cygnus.com) + + * Makefile.in (lneeded-list): If alloca.o is needed, so is xmalloc.o. + Reverts Feb 8, 1995 change. + +Mon Apr 15 12:53:26 1996 Doug Evans + + * choose-temp.c: New file. + * Makefile.in (CFILES): Add choose-temp.c. + (REQUIRED_OFILES): Add choose-temp.o. + +Sat Apr 13 14:19:30 1996 Stu Grossman (grossman@critters.cygnus.com) + + * floatformat.c (floatformat_to_double): Don't bias exponent when + handling zero's, denorms or NaNs. + +Thu Apr 11 13:36:56 1996 Stu Grossman (grossman@critters.cygnus.com) + + * floatformat.c (floatformat_to_double): Fix bugs with handling + numbers with fractions < 32 bits. + +Mon Apr 8 14:48:34 1996 Ian Lance Taylor + + * config.table: Permit --enable-shared to specify a list of + directories. + +Tue Mar 19 22:02:07 1996 Jason Merrill + + * cplus-dem.c (demangle_template): Fix for non-mangled pointer + arguments. + +Fri Mar 8 17:24:18 1996 Ian Lance Taylor + + * configure.in: If srcdir is `.' and with_target_subdir is not + `.', then set MULTISRCTOP before calling config-ml.in. + +Thu Mar 7 13:37:10 1996 Stan Shebs + + * mpw.c (mpw_open): Add debugging output option. + +Wed Mar 6 17:36:03 1996 Jason Merrill + + * cplus-dem.c (demangle_template): Fix for address-of-extern arguments. + +Tue Feb 27 12:00:50 1996 Raymond Jou + + * mpw.c (mpwify_filename): Change 6 to 5 in + strncmp (unixname, "/tmp/", 5). + +Tue Feb 20 10:55:53 1996 Ian Lance Taylor + + * cplus-dem.c (demangle_template): Initialize is_bool. Correctly + handle 0 as a pointer value parameter. + +Mon Feb 5 16:41:44 1996 Ian Lance Taylor + + * Makefile.in (all): Depend upon required-list. + (required-list): New target. + (clean): Remove required-list. + +Wed Jan 31 10:19:41 1996 Steve Chamberlain + + * win32.c: Deleted. + * config.table (i386-*-win32): Deleted. + * config/mh-i386win32: Deleted. + +Thu Jan 18 11:34:17 1996 Ian Lance Taylor + + * cplus-dem.c (cplus_demangle_opname): Change opname parameter to + const char *. + (cplus_mangle_opname): Change return type and opname parameter to + const char *. Don't cast return value. + +Tue Jan 16 12:13:11 1996 Stan Shebs + + * mpw.c: Include Timer.h, in order to get m68k Microseconds trap + definition. + +Wed Jan 3 13:15:04 1996 Fred Fish + + * obstack.c: Update copyright to 1996. + (_obstack_memory_used): Define new function. Called via + obstack_memory_used macro. + +Thu Dec 28 11:39:40 1995 Ian Lance Taylor + + * xstrdup.c: New file. + * Makefile.in (CFILES): Add xstrdup.c. + (REQUIRED_OFILES): Add xstrdup.o. + (xstrdup.o): New target. + +Mon Dec 11 18:18:52 1995 Mike Stump + + * atexit.c: New stub to provide atexit on systems that have + on_exit, like SunOS 4.1.x systems. + * functions.def (on_exit, atexit): Ditto. + +Mon Dec 11 15:42:14 1995 Stan Shebs + + * mpw.c (mpw_abort): Remove decl. + (mpw_access): Move debugging printf. + +Sat Dec 2 01:25:23 1995 Ian Lance Taylor + + * config.table: Consistently use ${host} rather than ${xhost} or + ${target}. + * configure.in: Don't bother to set ${xhost} before calling + config.table. + +Tue Nov 28 14:16:57 1995 Brendan Kehoe + + * Makefile.in (.c.o): Use test instead of the left bracket, to + avoid problems with some versions of make. + +Tue Nov 28 11:45:17 1995 Stan Shebs + + * mpw-make.sed: Fix INCDIR edit to work with Nov 14 change. + +Tue Nov 21 11:26:34 1995 Fred Fish + + * config/mh-hpux: Remove. It was only used to define EXTRA_OFILES, + which was set to just alloca.o, which is now automatically marked + as needed by the autoconfiguration process. + +Tue Nov 21 14:15:06 1995 Ian Lance Taylor + + * config.table: Check ${with_cross_host} rather than comparing + ${host} and ${target}. + +Thu Nov 16 14:34:42 1995 Ian Lance Taylor + + * configure.in: If with_target_subdir is empty, set xhost to + ${host} rather than ${target} before calling config.table. + +Tue Nov 14 01:38:30 1995 Doug Evans + + * Makefile.in (MULTITOP): Deleted. + (MULTISRCTOP, MULTIBUILDTOP): New. + (FLAGS_TO_PASS): Delete INCDIR. + (INCDIR): Add $(MULTISRCTOP). + (install_to_libdir): Add $(MULTISUBDIR). Call $(MULTIDO). + * configure.in: Delete call to cfg-ml-com.in. Call config-ml.in + instead of cfg-ml-pos.in. + (cross-compile check): Change to test for with_target_subdir. + (EXTRA_LINKS): Delete. + +Sun Nov 12 12:13:04 1995 Stan Shebs + + * mpw-make.sed: Add getpagesize.c.o to needed-list. + * mpw.c [USE_MW_HEADERS]: Conditionalize compiling of + functions that are supplied by Metrowerks libraries. + (fstat): Clean up descriptor->pointer conversion code. + (InstallConsole, etc): Empty definitions, for when linking + with SIOUX. + +Sun Nov 5 19:25:27 1995 Per Bothner + + * Makefile.in (FLAGS_TO_PASS): Also pass PICFLAGS. + (.c.o): Stylistic change. + +Thu Nov 2 12:06:29 1995 Ian Lance Taylor + + * strtol.c, strtoul.c: Don't include . From + phdm@info.ucl.ac.be (Philippe De Muyter). + +Wed Nov 1 11:59:36 1995 Ian Lance Taylor + + * configure.in: Correct sed call. + +Mon Oct 30 13:03:45 1995 Per Bothner + + * configure.in: Clean up / simplify for native. + + * configure.in: Merge in stuff from ../xiberty/configure.in. + * Makefile.in (CC): Add definition (so it can be overrridden + by ../configure). + +Tue Oct 24 17:57:27 1995 Stan Shebs + + * mpw-make.sed: Leave strerror.c.o in standard list of functions. + * mpw.c (R_OK, ENOENT, EACCESS, ENOSYS): Remove. + (link): Remove useless definition with error return. + (last_microseconds, warn_if_spin_delay, record_for_spin_delay): + Use UnsignedWide type for microsecond counts. + +Thu Oct 19 10:52:07 1995 Michael Meissner + + * memcmp.c (memcmp): Argument types are const void *, not void + *const. + + * strncasecmp.c (strncasecmp): Include ansidecl.h/stdarg.h, not + sys/types.h. + * strcasecmp.c (strcasecmp): Ditto. + +Tue Oct 10 11:03:24 1995 Fred Fish + + * Makefile.in (BISON): Remove macro. + +Tue Sep 26 15:06:46 1995 Stan Shebs + + * Makefile.in (HFILES): Add default empty definition. + * mpw-config.in (config.h): Only update if changed. + * mpw-make.in: Remove. + * mpw-make.sed: New file, edits Makefile.in into MPW makefile. + * mpw.c: Remove semi-clone of strerror code. + (sys_nerr, sys_errlist): Define here. + (Microseconds): Only define as A-line trap if m68k Mac. + +Wed Sep 20 12:53:32 1995 Ian Lance Taylor + + * Makefile.in (maintainer-clean): New synonym for distclean. + +Mon Aug 28 19:47:52 1995 Per Bothner + + * config.table: For host, generalize rs6000-ibm-aix* + to *-ibm-aix* so we also include powerpc. + +Tue Aug 22 03:18:05 1995 Ken Raeburn + + Fri Jun 16 18:35:40 1995 Pat Rankin (rankin@eql.caltech.edu) + + * xstrerror.c: New file. + * Makefile.in, vmsbuild.com: Compile it. + +Mon Jul 31 12:16:32 1995 steve chamberlain + + * config.table (i386-*-win32): New. + +Fri Jul 21 11:35:52 1995 Doug Evans + + * Makefile.in (MULTITOP): New variable. + (MULTIDIRS, MULTISUBDIR, MULTIDO, MULTICLEAN): Likewise. + (all): Add multilib support. + (install_to_tooldir, *clean): Likewise. + +Mon Jul 10 11:47:27 1995 Ken Raeburn + + * makefile.dos (OBJS): Add hex.o. From DJ Delorie. + +Fri Jun 30 17:28:59 1995 Pat Rankin (rankin@eql.caltech.edu) + + * vmsbuild.com: create "new-lib.olb", build libiberty under that + name, and then make it become "liberty.olb" when done, so that an + incomplete build attempt never leaves behind something which looks + like a complete library. + +Thu Jun 29 00:22:02 1995 Steve Chamberlain + + * config/mh-i386pe: New file for PE hosts. + * config.table: Understand PE hosts. + +Wed Jun 28 19:13:23 1995 Jason Merrill + + * cplus-dem.c: Update from gcc. + + * argv.c, dummy.c: If __STDC__, #include "alloca-conf.h" after + . + * alloca-norm.h: If __STDC__, declare alloca with its parameter. + +Thu Jun 22 18:57:47 1995 Stan Shebs + + * mpw-make.in (ALL_CFLAGS): Define NEED_basename. + * mpw.c: Only test DebugPI once whenever printing debug info. + (mpwify_filename): If filename is /tmp/foo, change it into :_foo, + also fix to not write on input filename buffer. + (mpw_access): Use stat() instead of open(), works for directories + as well as files. + +Mon Jun 19 00:33:22 1995 Jason Merrill + + * Makefile.in: Massage broken shells that require 'else true'. + +Sat Jun 17 23:21:58 1995 Fred Fish + + * alloca-norm.h: Declare alloca as type "PTR" to match functions.def. + Declare __builtin_alloca in the sparc case, as argv.c did. + * argv.c: Replace inline version of alloca-norm.h at start of file with + a #include of alloca-conf.h. Precede it with an include of ansidecl.h + because alloca-norm.h needs to declare alloca as "PTR". + +Mon Jun 12 14:24:26 1995 Steve Chamberlain + + * win32.c: New file. + +Fri Jun 9 15:16:14 1995 Jason Merrill + + * dummy.c: #include "alloca-conf.h". + +Wed Jun 7 11:46:23 1995 Jason Merrill + + * Makefile.in (mostlyclean): Remove stamp-picdir. + (clean): Don't. + +Mon Jun 5 18:46:06 1995 Jason Merrill + + * config.table (frags): Use toplevel pic frags. + + * Makefile.in (PICFLAG): New macro. + (all): Depend on stamp-picdir. + (needed-list): Ditto. + (.c.o): Also build pic object. + (stamp-picdir): New rule. + (mostlyclean): Remove pic. + (clean): Remove stamp-picdir. + +Fri Mar 24 16:55:48 1995 Pat Rankin (rankin@eql.caltech.edu) + + * vmsbuild.com (config.h): Add `#define NEED_basename'. + +Tue May 23 10:12:46 1995 Per Bothner + + * clock.c, getopt.c, strtod.c, vsprintf.c: Change from using LGPL + to libio-style copyright. + * getpagesize.c: Remove FSF copyright. + +Sat May 20 12:30:23 1995 Ken Raeburn + + Added improved VMS support from Pat Rankin: + + Fri Mar 17 18:40:36 1995 Pat Rankin (rankin@eql.caltech.edu) + + * vmsbuild.com: new file. + + * getpagesize.c (getpagesize): implement for VMS; + * strerror.c (strerror, strerrno, strtoerrno): add rudimentary + support for EVMSERR. + +Thu May 18 17:01:42 1995 Ken Raeburn + + Wed May 10 14:28:16 1995 Richard Earnshaw (rearnsha@armltd.co.uk) + + * floatformat.c (floatformat_arm_ext): Define. + +Tue May 16 13:30:59 1995 Per Bothner + + * basename.c, bcmp.c, getcwd.c, insque.c, rename.c, sigsetmask.c, + strerror.c, strsignal.c: Remove FSF copyright. + * sigsetmask.c: #include - seems to be needed by ISC. + +Mon May 15 19:53:17 1995 Per Bothner + + * bcopy.c, bzero.c, memcmp.c, memcpy.c, memset.c, strchr.c, + strrchr.c, strstr.c, vfork.c: Remove FSF Copyright, because this + might contaminate libstdc++ with the LGPL. (OK'd by RMS 11 Oct 94.) + * strchr.c, strrchr.c: Add cast to suppress const warning. + +Thu May 4 14:36:42 1995 Jason Merrill + + * cplus-dem.c: Use const instead of CONST. Don't include + ansidecl.h directly. + +Wed Apr 19 01:30:27 1995 Jason Merrill + + * cplus-dem.c: Don't include libiberty.h. Do declare xmalloc and + xrealloc. + (-DMAIN): Don't rely on an externally-defined version number; + instead, require the version number to be defined as a + preprocessor macro. Handle the RS/6000 leading dot. Define + xmalloc, xrealloc and fatal. Don't strip a leading underscore + if we couldn't demangle the word. + +Tue Apr 4 13:03:51 1995 Stan Shebs + + (Old mpw.c change descriptions retained for informational value.) + * mpw.c (warning_threshold): Default to .4 sec. + (overflow_count, current_progress): New globals. + (warn_if_spin_delay): Include current progress type, + such as program name, in message. + (mpw_start_progress): Set current_progress variable from arg. + (mpw_end_progress): Report spin delays by power-of-two-size + buckets instead of constant-size buckets. + + * mpw.c: Clean up formatting, types, returns, etc. + (ENOSYS): Define. + (mpw_fread, mpw_fwrite): Define. + (sleep): Define correctly. + + * mpw.c: New code to implement cursor spinning support. + (umask): New function. + (mpw_fopen, mpw_fseek, stat, fstat): Call PROGRESS. + + * mpw.c (mpw_basename, mpw_mixed_basename): New functions, find + basenames for MPW and MPW/Unix filenames. + (mpw_special_init): New function, calls Macsbug if desired. + + * mpw.c: Add GPL notice. + (mpwify_filename): Add more transformations. + (mpw_fopen): Call mpwify_filename on file names. + (rename): Remove. + (chdir, getcwd): Add simple definitions. + + * mpw.c: Random cleanups, remove unused code bits. + Added copy of strerror.c for gcc's use. + (stat, fstat, _stat): New versions based on Guido van Rossum code. + + * mpw.c (mpw_fseek): Make it work correctly when doing SEEK_CUR. + + * mpw.c (stat): Remove hack definition, get from sys/stat.h. + (fork, vfork, etc): Print error messages if called. + (getrusage, sbrk, environ, isatty, link, utime, mkdir, rmdir, + rename, chown): Define. + + * mpw-config.in: New file, MPW version of configure.in. + * mpw-make.in: New file, MPW version of Makefile.in. + * mpw.c: New file, MPW compatibility routines. + +Fri Mar 24 14:10:30 1995 Jim Kingdon (kingdon@lioth.cygnus.com) + + * basename.c: Include config.h before checking for NEED_basename. + +Thu Mar 23 19:09:54 1995 Jason Merrill + + * functions.def: Add DEFFUNC for basename. + + * basename.c: Only define basename if NEED_basename. + +Thu Mar 16 13:36:05 1995 Jason Merrill + + * config.table: Fix --enable-shared logic for native builds. + +Mon Mar 13 11:05:11 1995 Jason Merrill + + * cplus-dem.c (demangle_template): Demangle bool literals properly. + +Mon Mar 6 23:57:28 1995 Stu Grossman (grossman@cygnus.com) + + * strtol.c strtoul.c: Replace these with less buggy versions from + NetBSD. (strtoul in particular couldn't handle base 16.) + +Wed Mar 1 15:59:01 1995 Ian Lance Taylor + + * config/mt-vxworks5 (HDEFINES): Define NO_SYS_PARAM_H. + + * clock.c: If NO_SYS_PARAM_H is defined, don't include + . + * getcwd.c, getpagesize.c, getruntime.c: Likewise. + +Fri Feb 17 15:40:55 1995 Ian Lance Taylor + + * getruntime.c (get_run_time): Don't assume that CLOCKS_PER_SEC is + a number; ANSI appears to permit any expression, including a + function call. + + * config.table (*-*-vxworks5*): Use mt-vxworks5 when configuring + xiberty. + * config/mt-vxworks5: New file. + +Thu Feb 9 14:19:45 1995 Ian Lance Taylor + + * basename.c (basename): Change argument to be const. + +Wed Feb 8 18:06:52 1995 Jason Merrill + + * Makefile.in (lneeded-list): Don't worry about xmalloc. + +Sun Jan 15 00:40:36 1995 Jeff Law (law@snake.cs.utah.edu) + + * Makefile.in (distclean): Delete xhost-mkfrag. + +Thu Jan 12 16:54:18 1995 Jason Merrill + + * Makefile.in (lneeded-list): If alloca.o is needed, so is xmalloc.o. + +Wed Jan 11 22:39:56 1995 Ken Raeburn + + * hex.c: New file. + * Makefile.in (REQUIRED_OFILES, CFILES): List it. + (hex.o): Add dependencies. + + * cplus-dem.c (demangle_prefix): For GNU style constructor and + destructor names, try demangling the remainder of the string. + +Wed Dec 28 00:49:15 1994 Ian Lance Taylor + + * vasprintf.c (int_vasprintf): New static function. + (vasprintf): Use int_vasprintf. Removes assumption that va_list + is assignment compatible. + +Sat Nov 5 19:29:12 1994 Jason Merrill (jason@phydeaux.cygnus.com) + + * Makefile.in (LIBCFLAGS): New variable. + (FLAGS_TO_PASS): Pass it. + (.c.o): Use it. + +Thu Nov 3 19:09:47 1994 Ken Raeburn + + * getopt.c, getopt1.c: Do compile these functions under Linux, + since many native versions are based on glibc but are buggy. + +Mon Oct 24 15:16:46 1994 Per Bothner + + * vasprintf.c: Make 'format' arg be const, to avoid a mismatch + with prototype in GNU libc. Support stdarg.h as well as varargs.h. + +Tue Oct 11 17:48:27 1994 Jason Merrill (jason@phydeaux.cygnus.com) + + * Makefile.in (REQUIRED_OFILES): Add vasprintf.o. + * functions.def: Remove vasprintf. + +Wed Sep 14 17:04:55 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) + + * xmalloc.c (first_break): New static variable. + (xmalloc_set_program_name): Record sbrk (0) in first_break. + (xmalloc): If memory allocation fails, try to report how much + memory was allocated by the program up to this point. + (xrealloc): Likewise. + +Sun Sep 04 17:58:10 1994 Richard Earnshaw (rwe@pegasus.esprit.ec.org) + + * Makefile.in (ERRORS_CC): New variable, defaulted to $(CC). Use it + when linking dummy. + * config.table: Add host RISCiX Makefile frag. + * config/mh-riscix: New file. + +Thu Aug 25 17:29:44 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) + + * Makefile.in (FLAGS_TO_PASS): Define. + ($(RULE1)): Use $(FLAGS_TO_PASS). + +Wed Aug 24 17:08:47 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) + + * vasprintf.c: Include . + (vasprintf): Add casts to void for va_arg to avoid gcc warnings. + * xatexit.c: Declare malloc. + +Fri Aug 19 15:29:12 1994 Kung Hsu (kung@mexican.cygnus.com) + + * cplus-dem.c (demangle_args): Fix a bug in previous patch (the + one below). + +Thu Aug 18 14:37:14 1994 Kung Hsu (kung@mexican.cygnus.com) + + * cplus-dem.c (demangle args): Handle ARM repeat encoding where + the type index is greater than 9. + +Wed Aug 17 16:13:49 1994 Kung Hsu (kung@mexican.cygnus.com) + + * cplus-dem.c (demangle_qualified): accept optional '_' between + qualified name. This is baecause the template name may end with + numeric and can mixed up with the length of next qualified name. + +Wed Aug 3 05:52:14 1994 D. V. Henkel-Wallace (gumby@cygnus.com) + + * config/mt-sunos4: Use our standard location for cross-includes + and cross-libs when the target is also a "host" environment (ie no + newlib; includes and such don't belong to us). This is specific + to the Cygnus Support environment. + +Tue Aug 2 15:25:12 1994 Kung Hsu (kung@mexican.cygnus.com) + + * cplus-dem.c (demangle_template): demangle as xxx<'Q'> not + xxx. + +Mon Aug 1 17:02:48 1994 Kung Hsu (kung@mexican.cygnus.com) + + * cplus-dem.c (main): flush stdout to make pipe work. + +Sat Jul 16 12:56:32 1994 Stan Shebs (shebs@andros.cygnus.com) + + * config.table (*-*-cxux7*): Recognize. + * floatformat.c (floatformat_m88110_ext) [HARRIS_FLOAT_FORMAT]: + Harris-specific float format. + * config/mh-cxux7: New file. + +Wed Jun 29 00:26:17 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) + + * cplus-dem.c (demangle_template): Make sure that the result of + consume_count doesn't index beyond the end of the string. + +Mon Jun 20 23:54:37 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) + + * cplus-dem.c (gnu_special): Handle vtable mangling of gcc-2.4.5 and + earlier. Improve test for new vtable mangling. Change output back + to `virtual table'. + +Mon Jun 20 11:37:30 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) + + * obstack.c: Always compile this code, even if using the GNU + library. Avoids problems with relatively recent binary + incompatibility. + +Thu Jun 16 17:54:01 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * cplus-dem.c: Include libiberty.h. + (xmalloc, xrealloc, free): Don't declare. + (strstr): Don't declare parameters. + (xmalloc, xrealloc): Don't define. + (long_options): Add no-strip-underscores. + (main): Call xmalloc_set_program_name. Pass n in short options to + getopt_long. Handle option 'n' to not strip underscores. + (usage): Mention -n and --no-strip-underscores. + +Sun Jun 12 01:37:09 1994 Jason Merrill (jason@deneb.cygnus.com) + + * cplus-dem.c (demangle_template): Separate consecutive >'s with a + space. + (gnu_special): Demangle template and qualified names in a vtable name. + +Fri May 27 12:27:52 1994 Ken Raeburn (raeburn@cujo.cygnus.com) + + From gas-2.3 and binutils-2.4 net releases: + + Wed May 11 22:32:00 1994 DJ Delorie (dj@ctron.com) + + * makefile.dos: [new] Makefile for dos/go32 + * configure.bat: update for latest files + * msdos.c: remove some functions now in libc.a + +Fri May 20 18:53:32 1994 Per Bothner (bothner@kalessin.cygnus.com) + + * cplus-dem.c (gnu_special): Recognize thunks, as well as + the new naming style for vtables (when -fvtable-thunks). + +Wed May 18 13:34:06 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * Makefile.in (XTRAFLAGS): Don't define. + (.c.o, dummy.o): Don't use XTRAFLAGS. + ($(RULE1)): Don't pass XTRAFLAGS down in recursive call. + +Fri May 13 16:02:12 1994 Jim Kingdon (kingdon@lioth.cygnus.com) + + * vasprintf.c: New file. + * Makefile.in, functions.def: Add it. + +Fri May 13 16:20:28 1994 Jason Merrill (jason@deneb.cygnus.com) + + * cplus-dem.c (demangle_fund_type): Grok bool. + +Fri May 6 14:44:21 1994 Steve Chamberlain (sac@cygnus.com) + + * config.table: Add go32 + * config/mh-go32: New template. + +Fri May 6 11:01:59 1994 D. V. Henkel-Wallace (gumby@rtl.cygnus.com) + + * config.table, config/mt-sunos4: config for when sun4 is cross target. + +Mon Apr 11 00:54:33 1994 Richard Stallman (rms@mole.gnu.ai.mit.edu) + + * getopt.c [not __GNU_LIBRARY__] [__GCC__] [not __STDC__]: + Declare strlen to return int. Don't include stddef.h. + +Fri Apr 1 00:38:17 1994 Jim Wilson (wilson@mole.gnu.ai.mit.edu) + + * getopt.c: Delete use of IN_GCC to control whether + stddef.h or gstddef.h is included. + +Thu Apr 14 14:00:56 1994 Kung Hsu (kung@mexican.cygnus.com) + + * cplus-dem.c (demangle_signature): Fix a bug in template function + type numbering. + +Wed Apr 13 17:23:03 1994 Kung Hsu (kung@mexican.cygnus.com) + + * cplus-dem.c (demangle_signature): Fix template function with arm + style argument type number, Tn. + +Wed Apr 13 17:11:15 1994 Jason Merrill (jason@deneb.cygnus.com) + + * cplus-dem.c (optable): Add new[] and delete[]. + +Fri Apr 8 11:21:42 1994 Jim Kingdon (kingdon@deneb.cygnus.com) + + * argv.c (buildargv): Don't produce empty argument just because + there is trailing whitespace. + +Wed Apr 6 11:42:14 1994 Kung Hsu (kung@mexican.cygnus.com) + + * cplus-dem.c (demangle_template): fix 'Q' qualified name bug. + Handle 'p' same as 'P'. + * cplus-dem.c (do_type): Handle 'p' same as 'P'. + +Sat Mar 26 12:00:13 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) + + * floatformat.c (get_field, put_field): Fix off by one error in + little endian case. + +Thu Mar 24 10:40:19 1994 Jim Kingdon (kingdon@lioth.cygnus.com) + + * floatformat.c (floatformat_from_double): Pass unsigned char *, + not char *, to put_field. + +Fri Mar 18 12:34:33 1994 Per Bothner (bothner@kalessin.cygnus.com) + + * memmove.c: Re-wrote; placed in public domain. + +Wed Mar 16 10:33:07 1994 Jim Kingdon (kingdon@lioth.cygnus.com) + + * cplus-dem.c (demangle_prefix): If ARM demangling, don't treat + __Q* as a constructor. + +Mon Mar 14 12:26:02 1994 Ian Lance Taylor (ian@cygnus.com) + + * ieee-float.c: Removed; no longer used. + * Makefile.in: Changed accordingly. + +Mon Mar 7 12:28:17 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * floatformat.c (get_field): Removed unused local variable i. + (put_field): Removed unused local variable i. + +Sun Feb 27 21:50:11 1994 Jim Kingdon (kingdon@deneb.cygnus.com) + + * floatformat.c: New file, intended to replace ieee-float.c. + * Makefile.in: Change accordingly. + +Thu Feb 24 11:51:12 1994 David J. Mackenzie (djm@rtl.cygnus.com) + + * getopt.c: Remove #ifdef GETOPT_COMPAT and #if 0 code. + (_getopt_initialize): New function, broken out of _getopt_internal. + (_getopt_internal): + 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. + +Thu Feb 10 14:44:16 1994 Richard Stallman (rms@mole.gnu.ai.mit.edu) + + * getopt.c [not __GNU_LIBRARY__] [__GNUC__] [not IN_GCC]: + Test just __STDC__, not emacs. + +Wed Feb 9 00:14:00 1994 Richard Stallman (rms@mole.gnu.ai.mit.edu) + + * getopt.c [not __GNU_LIBRARY__] [__GNUC__] [not IN_GCC] + [emacs] [not __STDC__]: Don't include stddef.h. Don't declare strlen. + +Fri Dec 24 19:43:00 1993 Noah Friedman (friedman@nutrimat.gnu.ai.mit.edu) + + * getopt.c (_NO_PROTO): Define before config.h is included. + +Mon Sep 20 15:59:03 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) + + * getopt.c, getopt1.c [emacs || CONFIG_BROKETS]: Include + only under these, else "config.h". + +Thu Aug 12 18:16:49 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) + + * getopt.c, getopt1.c [HAVE_CONFIG_H]: Include + instead of "config.h". + +Sun Feb 20 17:17:01 1994 Ian Lance Taylor (ian@lisa.cygnus.com) + + * concat.c: Check ANSI_PROTOTYPES rather than __STDC__ to decide + whether to use prototypes or not. + * strerror.c (const): Never undefine; let ansidecl.h handle it. + * strsignal.c (const): Likewise. + +Thu Feb 17 13:27:35 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * xatexit.c (_xexit_cleanup): Declare as extern; don't initialize. + Merging common and initialized variables need not be supported by + ANSI C compilers. + (xatexit): Initialize _xexit_cleanup if not already set. + * xexit.c: Comment fix. + +Wed Feb 16 01:15:36 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * xmalloc.c: Don't declare xexit; it's declared in libiberty.h. + (xrealloc): If oldmem is NULL, allocate with malloc, rather than + assuming that realloc works correctly. + +Tue Feb 15 09:26:16 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) + + * concat.c, ieee-float.c: Replace inclusion of + with explicit function declarations, as recommended by Ian Taylor. + +Sat Feb 12 10:31:11 1994 David J. Mackenzie (djm@rtl.cygnus.com) + + * xmalloc.c (xmalloc, xrealloc): Use PTR and size_t throughout. + (malloc, realloc): Declare. + +Thu Feb 10 17:08:19 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * argv.c, basename.c: Include ansidecl.h and libiberty.h. + * concat.c, fdmatch.c, getruntime.c, spaces.c: Likewise. + * strerror.c, strsignal.c, xatexit.c, xexit.c: Likewise. + * xmalloc.c: Likewise. + * concat.c: Don't declare xmalloc. If __STDC__, use + macros, not macros. + * spaces.c (spaces): Make return type const. Don't crash if + malloc returns NULL. + * strerror.c (struct error_info): Make name and msg fields const. + (error_names): Make const. + (strerrno): Make const. + (strtoerrno): Make argument const. + * strsignal.c (struct signal_info): Make name and msg fields + const. + (signal_names, sys_siglist): Make const. + (strsignal, strsigno): Make const. + (strtosigno): Make argument const. + * xatexit.c: Declare parameter types. + * xmalloc.c (name): Make const. + (xmalloc_set_program_name): Make argument const. + * Makefile.in (INCDIR): Define. + (.c.o): Use $(INCDIR). + (dummy.o): Likewise. + (argv.o, basename.o): New targets; depend on libiberty.h. + (concat.o, fdmatch.o, getruntime.o, spaces.o): Likewise. + (strerror.o, strsignal.o, xatexit.o, xexit.o): Likewise. + (xmalloc.o): Likewise. + (cplus-dem.o): New target; depend on demangle.h. + (getopt.o, getopt1.o): New targets; depend on getopt.h. + (ieee-float.o): New target; depend on ieee-float.h. + (obstack.o): New target; depend on obstack.h. + +Tue Feb 8 05:29:08 1994 David J. Mackenzie (djm@thepub.cygnus.com) + + Handle obstack_chunk_alloc returning NULL. This allows + obstacks to be used by libraries, without forcing them + to call exit or longjmp. + * obstack.c (_obstack_begin, _obstack_begin_1, _obstack_newchunk): + If CALL_CHUNKFUN returns NULL, set alloc_failed, else clear it. + (_obstack_begin, _obstack_begin_1): Return 1 if successful, 0 if not. + +Tue Feb 8 00:32:28 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) + + * concat.c, ieee-float.c: Include . + +Sun Feb 6 21:28:46 1994 David J. Mackenzie (djm@thepub.cygnus.com) + + * xmalloc.c (xmalloc_set_program_name): New function. + (xmalloc, xrealloc): Include the name in the error message, if set. + + * Replace atexit.c with xatexit.c. + * Makefile.in (CFILES), functions.def: Change references. + +Sat Feb 5 14:02:32 1994 Stan Shebs (shebs@andros.cygnus.com) + + * getruntime.c (get_run_time): Use getrusage or times if + HAVE_GETRUSAGE or HAVE_TIMES are defined. + +Fri Feb 4 15:49:38 1994 David J. Mackenzie (djm@thepub.cygnus.com) + + * atexit.c: New file. + * Makefile.in (CFILES), functions.def: Add it. + * xexit.c: New file. + * Makefile.in (CFILES, REQUIRED_OFILES): Add it. + * xmalloc.c (xmalloc, xrealloc): Call xexit instead of exit. + Change request for 0 bytes into request for 1 byte. + +Wed Feb 2 11:36:49 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * xmalloc.c (xmalloc, xrealloc): Print size using %lu, and cast to + unsigned long, to avoid warnings. + +Fri Jan 28 17:49:06 1994 Ken Raeburn (raeburn@cujo.cygnus.com) + + * dummy.c: Don't include time.h ever; always define clock_t as + "unsigned long". Until gcc/fixincludes ensures that clock_t + exists, __STDC__ isn't a sufficient test. And if clock() doesn't + exist, clock_t probably doesn't either. + +Mon Jan 24 11:52:31 1994 Stan Shebs (shebs@andros.cygnus.com) + + * clock.c, getruntime.c: New files. + * Makefile.in: Add to file lists. + * functions.def (clock): Add to list. + * dummy.c (time.h): Add if __STDC__. + (clock_t): #define as "unsigned long" if not __STDC__. + +Tue Jan 11 11:27:44 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * strtod.c: Declare atof. From edler@jan.ultra.nyu.edu (Jan + Edler). + +Tue Dec 28 14:17:30 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * Makefile.in (errors): Use CFLAGS as well as LDFLAGS when + linking. + +Fri Dec 17 12:26:07 1993 Kung Hsu (kung@cirdan.cygnus.com) + + * cplus-dem.c (demangle_arm_pt): New function. Common code + for ARM template demangling. + * cplus-dem.c (demangle_class_name): Use demangle_arm_pt. + * cplus-dem.c (demangle_prefix): Likewise. + +Tue Nov 30 15:47:48 1993 Jason Merrill (jason@deneb.cygnus.com) + + * cplus-dem.c (cplus_demangle_opname): Add CONST to please gcc. + +Sat Nov 27 11:05:50 1993 Fred Fish (fnf@cygnus.com) + + Merge changes from tom@basil.icce.rug.nl (Tom R.Hageman) + * strerror.c, strsignal.c: As a small space optimization, don't + include messages when they aren't actually used. + + Merge changes from takefive.co.at!joe (Josef Leherbauer) + * cplus-dem.c (demangle_prefix, demangle_function_name, + cplus_demangle_opname): Fixes for systems where cplus_marker + is something other than '$'. + +Fri Nov 26 13:51:11 1993 Per Bothner (bothner@kalessin.cygnus.com) + + * waitpid.c: Simple-minded approcimation to waitpid + using vanilla wait. + * functions.def, Makefile.in: Update accordingly, + +Thu Nov 18 18:01:15 1993 Kung Hsu (kung@cirdan.cygnus.com) + + * cplus-dem.c(demangle_template): fix bug template instantiation + with value of user defined type. + +Wed Nov 17 18:30:21 1993 Kung Hsu (kung@cirdan.cygnus.com) + + * cplus-dem.c(cplus_demangle_opname): add the subject new function + to support unified search of operator in class. + +Wed Nov 10 09:47:22 1993 Jim Kingdon (kingdon@lioth.cygnus.com) + + gcc -Wall lint: + * strtoul.c (strtoul): use "(digit = *s) != '\0'" not just + "digit = *s" as condition in while loop. + +Tue Nov 9 15:52:22 1993 Mark Eichin (eichin@cygnus.com) + + * Makefile.in: pass SHELL to recursive make + +Thu Nov 4 12:09:26 1993 Per Bothner (bothner@kalessin.cygnus.com) + + * vfprintf.c, vprintf.c, vsprintf.c: Make format arg + be (const char*), for ANSI (and gcc w/fixproto) consistency. + +Thu Nov 4 08:29:04 1993 Jim Kingdon (kingdon@lioth.cygnus.com) + + * config.table: Make *-*-hiux* use mh-hpux. + +Fri Oct 22 07:53:15 1993 Jim Kingdon (kingdon@lioth.cygnus.com) + + * config.table: Add * to end of all OS names. + +Tue Oct 19 17:12:01 1993 david d `zoo' zuhn (zoo@rtl.cygnus.com) + + * Makefile.in (lneeded-list): ensure that object file names are + not duplicated, as multiple instances of the same object file in + a library causes problems on some machines + +Mon Oct 18 21:59:28 1993 Jim Kingdon (kingdon@lioth.cygnus.com) + + * strcasecmp.c, strncasecmp.c: Change u_char to unsigned char. + +Fri Oct 15 22:17:11 1993 david d `zoo' zuhn (zoo@rtl.cygnus.com) + + * strncasecmp.c: new file, implements strncasecmp + * strcasecmp.c: new file, implement strcasecmp + + * Makefile.in (CFILES): list these two new source files + + * functions.def: add strcasecmp and strncasecmp entries + +Fri Oct 15 14:53:05 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * strtoul.c (strtoul), strtol.c (strtol): Handle overflow + according to ANSI C. + +Thu Oct 14 16:34:19 1993 Kung Hsu (kung@cirdan.cygnus.com) + + * cplus-dem.c: add support of ARM global constructor/destructor, + and 'G' for passing record or union in parameter. + +Wed Oct 13 13:36:19 1993 Jim Kingdon (kingdon@lioth.cygnus.com) + + * Makefile.in: Fix comment to clarify that stuff in REQUIRED_OFILES + should not be in functions.def. + +Wed Oct 13 13:13:38 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * functions.def: Removed xmalloc. Stuff in REQUIRED_OFILES should + not be in functions.def. + +Mon Oct 4 18:26:39 1993 Kung Hsu (kung@cirdan.cygnus.com) + + * cplus-dem.c: change globl constructor/destructor to proper name + +Tue Sep 28 18:11:07 1993 Kung Hsu (kung@cirdan.cygnus.com) + + * cplus-dem.c: fix bug in constructor/destructor + +Tue Sep 28 16:20:49 1993 Kung Hsu (kung@cirdan.cygnus.com) + + * cplus-dem.c: support both old and new _vt$... vtbl mangled names + +Fri Sep 24 19:07:16 1993 Jason Merrill (jason@deneb.cygnus.com) + + * cplus-dem.c: Fix demangle_template prototype + +Fri Sep 24 17:32:55 1993 Kung Hsu (kung@cirdan.cygnus.com) + + * cplus-dem.c: fix template demangling + * cplus-dem.c: fix const type demangling + * cplus-dem.c: fix constructor/destructor, virtual table, + qualifier, global constructor/destructor demangling + +Wed Sep 1 23:13:11 1993 Jim Kingdon (kingdon@lioth.cygnus.com) + + * strsignal.c, strerror.c: Use fully-bracketed initializer to + keep gcc -Wall happy. + +Fri Aug 27 10:30:09 1993 Jason Merrill (jason@deneb.cygnus.com) + + * cplus-dem.c (do_type): Add CONSTS to make gcc happy with last + patch. + +Fri Aug 27 11:24:54 1993 Jim Kingdon (kingdon@lioth.cygnus.com) + + Patch from Paul Flinders: + * cplus-dem.c (do_type): Deal with arrays. + +Tue Aug 24 14:23:50 1993 Jim Kingdon (kingdon@lioth.cygnus.com) + + * cplus-dem.c (demangle_qualified: Deal with GNU format for more + than 9 classes. + +Wed Aug 18 19:50:29 1993 Jason Merrill (jason@deneb.cygnus.com) + + * Makefile.in (dummy.o): Redirect to /dev/null to avoid "variable + not initialized" warnings under HP/UX + +Sun Aug 15 20:42:40 1993 Jim Kingdon (kingdon@lioth.cygnus.com) + + * strerror.c: Move include of stdio.h after sys_errlist #define. + Also remove NULL definition (stdio.h always defines NULL, so it + never did anything but clutter up the code). + +Sat Aug 14 14:21:49 1993 david d `zoo' zuhn (zoo@rtl.cygnus.com) + + * Makefile.in, functions.def: handle xmalloc.c + + * xmalloc.c: provide xmalloc and xrealloc functions + +Thu Aug 12 17:38:57 1993 David J. Mackenzie (djm@thepub.cygnus.com) + + * cplus-dem.c: Fix a comment. + +Sat Aug 7 13:56:35 1993 David J. Mackenzie (djm@thepub.cygnus.com) + + * getopt1.c: Declare const the way getopt.c does. + +Fri Aug 6 17:03:13 1993 David J. Mackenzie (djm@thepub.cygnus.com) + + * obstack.c, alloca.c: Update from FSF. + * getopt.c, getopt1.c: Update to current FSF version, which + doesn't use alloca. + +Tue Jul 27 14:03:57 1993 Brendan Kehoe (brendan@lisa.cygnus.com) + + * Makefile.in (demangle): Add the target with a message saying + where demangle went. + +Mon Jul 26 15:49:54 1993 Jim Kingdon (kingdon@lioth.cygnus.com) + + * Makefile.in: Remove obsolete `demangle' target. + +Thu Jul 22 08:31:01 1993 Fred Fish (fnf@deneb.cygnus.com) + + * cplus-dem.c (arm_special): Apply patch from arg@lucid.com to + avoid infinite loop on vtbl symbols with disambiguating "junk" + tacked on the end. + +Mon Jul 19 14:10:37 1993 david d `zoo' zuhn (zoo@rtl.cygnus.com) + + * strsignal.c: work around some systems losing definitions of + sys_siglist + + * config/mh-lynxos: this system has a losing definition of + sys_siglist + + * config.table: use mh-lynxos for *-*-lynxos + +Mon Jul 19 17:08:52 1993 Ken Raeburn (raeburn@rtl.cygnus.com) + + * config.table: Add support for HPPA BSD hosts. + + * config/mh-hpbsd: New file. + +Mon Jul 12 18:00:40 1993 K. Richard Pixley (rich@cygnus.com) + + * Makefile.in (TAGS): make work when srcdir != objdir. + +Sun Jun 27 15:35:31 1993 David J. Mackenzie (djm@thepub.cygnus.com) + + * cplus-dem.c (main): Add long options, including --help and + --version. + (usage): New function from code in main. + +Tue Jun 22 11:37:38 1993 Per Bothner (bothner@deneb.cygnus.com) + + * config.table: New shell scipt, sourced by both ./configure,in + and ../xiberty/configure.in, to avoid maintainance lossages. + * configure.in and ../xiberty/configure.in: Use config.table. + + * configure.in: Don't use mh-aix for AIX 3.2, only for 3.1. + * configure.in: Map *-*-irix* (except irix4) to mh-sysv. + * ../xiberty/configure.in: Update from ./configure.in. + +Tue Jun 15 17:05:31 1993 david d `zoo' zuhn (zoo at cirdan.cygnus.com) + + * Makefile.in: remove parentdir support + +Wed May 26 12:59:09 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) + + * cplus-dem.c (xrealloc): Match definition with prototype. + +Tue May 25 14:27:51 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) + + * cplus-dem.c (demangle_prefix): Demangle cfront + local variables as an extension to ARM demangling. + +Fri May 21 09:53:57 1993 Jim Kingdon (kingdon@lioth.cygnus.com) + + * ieee-float.c: Don't require pointers to double to be aligned. + +Tue May 18 17:12:10 1993 Fred Fish (fnf@cygnus.com) + + (merge changes from dlong@cse.ucsc.edu) + * cplus-dem.c (consume_count): Simplify. + * cplus-dem.c (arm_pt, demangle_class_name): New functions. + * cplus-dem.c (various): Calls to arm_pt, demangle_class_name. + + * cplus-dem.c (xmalloc, xrealloc, strstr): Make extern decls into + full prototypes. + * cplus-dem.c (free): Add prototype. + * cplus-dem.c (optable): Fully bracketize initializer. + +Fri May 14 17:13:05 1993 Per Bothner (bothner@cygnus.com) + + * cplus-dem.c: Whether initial underscores are stripped + depends on the external variable prepends_underscore + (which is generated by the binutils Makefile). + +Fri May 14 07:32:20 1993 Ken Raeburn (raeburn@deneb.cygnus.com) + + * cplus-dem.c (mop_up, arm_special): Remove some unused variables. + +Tue May 4 20:31:59 1993 Fred Fish (fnf@cygnus.com) + + * cplus-dem.c (consume_count): Return zero if arg does not + start with digit, and don't consume any input. + +Tue May 4 08:10:28 1993 Jim Kingdon (kingdon@cygnus.com) + + * Makefile.in (demangle): Use ${srcdir} not $^. + + * strtod.c: New file, needed at least for BSD 4.3. + +Sun May 2 11:30:42 1993 Fred Fish (fnf@cygnus.com) + + * strsignal.c (sys_siglist): For ANSI compilations, type is + "const char *const". Also remove conditionalization on __STDC__ + since const is defined away for non-ANSI. + +Wed Apr 28 19:29:55 1993 Ken Raeburn (raeburn@deneb.cygnus.com) + + * configure.in: Recognize *-*-hpux. + * config/mh-hpux: New file. + +Tue Apr 27 15:22:19 1993 Per Bothner (bothner@cygnus.com) + + * tmpnam.c: Added ANSI tmpnam() function. + * functions.def, Makefile.in: Update accordingly. + +Tue Apr 27 13:38:38 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) + + * cplus-dem.c (demangle_function_name): Get the demangling of + stop__1A right. + +Fri Apr 16 23:48:24 1993 Jim Kingdon (kingdon at calvin) + + * cplus-dem.c: Declare strstr return type. + +Fri Mar 26 12:01:26 1993 Jim Kingdon (kingdon@cygnus.com) + + * strsignal.c: Add some AIX signals. + +Thu Mar 25 15:17:23 1993 Ian Lance Taylor (ian@cygnus.com) + + * Makefile.in (MAKEOVERRIDES): Define to be empty. + +Wed Mar 24 01:59:25 1993 david d `zoo' zuhn (zoo at poseidon.cygnus.com) + + * Makefile.in: add installcheck & dvi targets + +Thu Mar 18 14:05:44 1993 Per Bothner (bothner@rtl.cygnus.com) + + * ieee-float.c: New file, moved from ../gdb (since it is + needed by ../opcode/m68k-dis.c). + +Tue Mar 2 17:47:31 1993 Fred Fish (fnf@cygnus.com) + + * cplus-dem.c: Replace all references to cfront with ARM. + +Fri Feb 26 00:17:07 1993 Per Bothner (bothner@rtl.cygnus.com) + + * cplus-dem.c: Fix main program (when compiled with -DMAIN) + to be more useful as a filter. + +Sat Feb 20 21:41:39 1993 Brendan Kehoe (brendan@lisa.cygnus.com) + + * Makefile.in (install_to_libdir, install_to_tooldir): Go into the + destination directory before running $(RANLIB), in case that + program tries to create a file in the current directory as part of + its work. + +Thu Feb 18 23:00:19 1993 John Gilmore (gnu@cygnus.com) + + * strsignal.c (sys_siglist): Remove yet another *%^&%&$# "const" + because BSD 4.4 lacks one. Isn't this fun? + +Thu Feb 18 11:24:25 1993 Fred Fish (fnf@cygnus.com) + + * cplus-dem.c (demangle_signature): Set func_done after + demangling a template. + * cplus-dem.c (demangle_template): Fix several small bugs + in demangling GNU style templates. + * cplus-dem.c (demangle_prefix): Fix for templates in GNU + style constructors. + * cplus-dem.c (gnu_special): Fix for templates in GNU style + static data members. + +Tue Feb 16 17:28:35 1993 Fred Fish (fnf@cygnus.com) + + * cplus-dem.c (demangle_signature): Modify to include type + modifiers like static and const in remembered types. + +Thu Feb 11 22:20:47 1993 Fred Fish (fnf@cygnus.com) + + * cplus-dem.c (demangled_qualified): Add new parameter that tells + whether to prepend or append the qualifiers. + * cplus-dem.c (string_prepends): Used now, remove #if 0. + * cplus-dem.c (demangle_signature): Call demangle_qualified + with prepending. + * cplus-dem.c (gnu_special): Recognize static data members that + use qualified names. + * cplus-dem.c (demangle_qualified): Accumulate qualifiers in a + temporary buffer and the prepend or append them to the result, + as specified by the new "append" flag. + * cplus-dem.c (do_type): Call demangled_qualified with + appending. + +Mon Dec 28 10:47:19 1992 Ken Raeburn (raeburn@cygnus.com) + + * strsignal.c (signal_table): Now const. + (init_signal_tables): Variable eip now points to const. + + * strerror.c (error_table): Now const. + (init_error_tables): Variable eip now points to const. + +Tue Dec 15 15:36:50 1992 Per Bothner (bothner@cygnus.com) + + * memchr.c (memchr): New (ANSI standard) function. + * Makefile.in, functions.def: Added memchr. + * Makefile.in (AR_FLAGS): Use rc instad of non-standard cq. + +Wed Dec 2 22:49:10 1992 david d `zoo' zuhn (zoo at cirdan.cygnus.com) + + * getopt.c: remove use of USG around , which never meant + anything anyway + + * config/mh-{aix,apollo68,ncr3000,sysv,sysv4}: removed definitions + of USG and USGr4 + +Thu Nov 19 03:09:33 1992 Brendan Kehoe (brendan@lisa.cygnus.com) + + * cplus-dem.c (demangle_fund_type): Recognize `w', a wide character; + it's now a type according to the ANSI X3J16 working paper; output + "wchar_t" for it. + (demangle_template): Accept `w' as an integral type. + (xmalloc, xrealloc): Use `char *', not `PTR'. Cast calls to their + counterparts malloc and realloc to `char *'. + (main): Exit with a 0 status. + * Makefile.in (demangle): Don't expect the user to define + DEMANGLE, instead force to be cplus-dem.c. Look in $(srcdir)/../include + for demangle.h. Pass it any HDEFINES or XTRAFLAGS. + +Wed Nov 18 18:56:20 1992 John Gilmore (gnu@cygnus.com) + + * Makefile.in (AR_FLAGS): Avoid verbosity. + * config/mh-sysv4: Remove AR_FLAGS override, use INSTALL=cp, + replace USGr4 with HAVE_SYSCONF. + * config/mh-solaris: Remove; mh-sysv4 works now. + * getpagesize.c: Replace USGr4 with HAVE_SYSCONF. + * configure.in: Simplify host matching table, remove separate + solaris config file. + +Sun Nov 15 09:35:16 1992 Fred Fish (fnf@cygnus.com) + + * configure.in (i[34]86-*-solaris2*): Add, use mh-sysv4. + +Tue Nov 3 21:27:03 1992 Brendan Kehoe (brendan@cygnus.com) + + * cplus-dem.c (xmalloc, xrealloc): Add decls. + (remember_type): Don't cast xmalloc. + (string_need): Likewise; don't cast xrealloc either. + +Fri Oct 23 08:52:01 1992 Ian Lance Taylor (ian@cygnus.com) + + * Makefile.in, functions.defs, rename.c: added simple + implementation of rename, since some binutils programs use it. + +Thu Oct 15 15:18:22 1992 Per Bothner (bothner@cygnus.com) + + * strsignal.c: Add appropriate 'const' to sys_siglist + extern declaration (if __STDC__). (Needed for Linux.) + * strsignal.c (strsignal): Add cast to remove const-ness. + +Fri Oct 9 03:22:55 1992 John Gilmore (gnu@cygnus.com) + + * Makefile.in (needed.awk, needed2.awk): Remove erroneous \'s + before "'s, diagnosed by BSD 4.4 awk. + +Thu Oct 8 15:25:12 1992 Ian Lance Taylor (ian@cygnus.com) + + * Makefile.in: create config.h and needed-list through $(CONFIG_H) + and $(NEEDED_LIST), to give some hooks for xiberty. + +Thu Oct 1 23:31:42 1992 david d `zoo' zuhn (zoo at cirdan.cygnus.com) + + * configure.in: use cpu-vendor-triple instead of nested cases + +Wed Sep 30 11:26:59 1992 Per Bothner (bothner@rtl.cygnus.com) + + * Makefile.in, argv.c, basename.c, bcmp.c, bcopy.c, bzero.c, + concat.c, cplus-dem.c, fdmatch.c, getcwd.c, getopt.c, getopt1.c, + getpagesize.c, insque.c, memcmp.c, memcpy.c, memmove.c, memset.c, + obstack.c, sigsetmask.c, spaces.c, strchr.c, strerror.c, + strrchr.c, strsignal.c, strstr.c, vfork.c, vsprintf.c: + Convert from using GPL to LGPL. + +Sat Sep 26 04:01:30 1992 John Gilmore (gnu@cygnus.com) + + * Makefile.in (errors): Leave dummy.o and dummy around so that + we can see how the needed list was generated (it's sometimes wrong). + (mostlyclean): Remove them. + +Mon Sep 21 14:50:42 1992 Ian Lance Taylor (ian@cygnus.com) + + * getcwd.c: supply a default if MAXPATHLEN is not defined. + + * config/mh-irix4: set EXTRA_OFILES to alloca.o, from WRS. + +Wed Sep 9 12:41:48 1992 Ian Lance Taylor (ian@cygnus.com) + + * Makefile.in: Use XTRAFLAGS when compiling, so that xiberty works + when cross-compiling. + +Thu Sep 3 13:29:39 1992 K. Richard Pixley (rich@sendai.cygnus.com) + + * cplus-dem.c: (demangle_prefix): reduction in strength of strstr + as a time optimization. + + * cplus-dem.c (cplus_demangle): remove strpbrk test. Appears to + be more expensive than simply demangling. + + * cplus-dem.c (cplus_match): new function. + +Tue Sep 1 15:24:04 1992 Per Bothner (bothner@rtl.cygnus.com) + + * cplus-dem.c: #include , to define NULL. + Define current_demangling_style. + +Sun Aug 30 17:58:19 1992 Per Bothner (bothner@rtl.cygnus.com) + + * cplus-dem.c: New file, moved from ../gdb. + * cplus-dem.c (set_cplus_marker_for_demangling): New exported + function, to avoid compiling in target-dependency for CPLUS_MARKER. + * cplus-dem.c (cplus_demangle): Allow demangling style option + to be passed as a parameter, but using the global variable + current_demangling_style as a default. + * Makefile.in: Update for cplus-dem.c + +Sat Aug 29 10:44:09 1992 Fred Fish (fnf@cygnus.com) + + * obstack.c: Merge in comment changes from FSF version. Now + matches the FSF version exactly. + +Fri Aug 28 18:39:08 1992 John Gilmore (gnu@cygnus.com) + + * obstack.c (CALL_FREEFUN): Can't use ?: with void values (at + least on losing DECstations!); use if-then-else instead. + +Wed Aug 19 14:40:34 1992 Ian Lance Taylor (ian@cygnus.com) + + * Makefile.in: always create installation directories. + +Mon Aug 10 17:33:40 1992 david d `zoo' zuhn (zoo at cirdan.cygnus.com) + + * Makefile.in: clean up definition of CFILES, more comments + +Sat Aug 8 23:10:59 1992 Fred Fish (fnf@cygnus.com) + + * getopt.c (my_index): Make first arg const to match strchr, + which it sometimes is remapped to. + +Sat Aug 1 13:48:50 1992 Fred Fish (fnf@cygnus.com) + + * obstack.c (DEFAULT_ALIGNMENT): Update to match FSF version. + * obstack.c (_obstack_begin): Initialize use_extra_arg. + * obstack.c (_obstack_begin_1): New, from FSF version. + +Mon Jul 20 21:07:58 1992 Fred Fish (fnf@cygnus.com) + + * obstack.c (CALL_CHECKFUN, CALL_FREEFUN): Use use_extra_arg and + extra_arg. + * obstack.c (_obstack_begin): Remove area_id and flags arguments + (previously added for mmalloc support, interface has changed). + Also convert flags usage to use use_extra_arg and maybe_empty_object. + +Fri Jul 10 00:41:53 1992 Fred Fish (fnf@cygnus.com) + + * argv.c: Move expandargv inline and eliminate static variables. + Rewrite to always allocate in powers of two. Fix to return an + argv with a single null string arg if passed a null string. + +Fri Jul 3 20:27:29 1992 Fred Fish (fnf@cygnus.com) + + * random.c, sigsetmask.c, strerror.c, strsignal.c: Remove + "(void)" casts from function calls where the return value is + ignored, in accordance with GNU coding standards. + +Mon Jun 29 10:54:19 1992 Fred Fish (fnf at cygnus.com) + + * bcopy.c, strerror.c, strsignal.c: Lint. + +Thu Jun 25 09:18:41 1992 K. Richard Pixley (rich@rtl.cygnus.com) + + * getopt.c: merge changes from make. + +Thu Jun 25 04:43:22 1992 John Gilmore (gnu at cygnus.com) + + * alloca.c: Incorporate fixes from gdb/alloca.c. + FIXME: Eventually move gdb's alloca configuration files here, + and remove gdb/alloca.c and its Makefile.in support. + +Tue Jun 23 21:56:30 1992 Fred Fish (fnf@cygnus.com) + + * dummy.c: Define NOTHING to /*nothing*/, change return type + of main to int and return zero. + * functions.def: Supply NOTHING as the fourth arg to macros + that don't have an explicit arg, to satisfy picky preprocessors. + +Wed Jun 17 18:13:58 1992 Per Bothner (bothner@rtl.cygnus.com) + + * Makefile.in: Clean up *clean rules, as per standards.texi. + +Tue Jun 16 16:11:59 1992 K. Richard Pixley (rich@rtl.cygnus.com) + + * getopt.c, getopt1.c: merged largely gratuitous, mostly + whitespace diffs from other prep distributions. + +Mon Jun 15 12:25:46 1992 Fred Fish (fnf@cygnus.com) + + * config/mh-ncr3000 (INSTALL): Don't use /usr/ucb/install, + it is broken on ncr 3000's. + +Mon Jun 15 01:03:26 1992 John Gilmore (gnu at cygnus.com) + + * sigsetmask.c: Rewrite. Old one was very confused about its + arguments and result. New one can't do much, but at least knows + what it can't do, and it's good enough for GDB's use. + +Sun Jun 14 15:17:40 1992 Stu Grossman (grossman at cygnus.com) + + * functions.def: Use proper prototype for strtoul. + +Fri Jun 12 19:22:40 1992 John Gilmore (gnu at cygnus.com) + + * Makefile.in: Add random.c. + * config/mh-*: Use "true" rather than "echo >/dev/null" for ranlib. + * configure.in: update solaris2 config. + +Wed Jun 10 16:31:29 1992 Fred Fish (fnf@cygnus.com) + + * random.c: Add for random() and srandom(). + * functions.def: Add random + +Tue Jun 9 17:27:18 1992 Fred Fish (fnf@cygnus.com) + + * config/{mh-ncr3000, mh-sysv4}: Add definition for INSTALL + using /usr/ucb/install. + +Mon Jun 1 13:20:17 1992 Per Bothner (bothner@rtl.cygnus.com) + + * strerror.c: Kludge to guard against a conflict with + possible declaration of sys_errlist in errno.h. + +Sun May 31 15:07:47 1992 Mark Eichin (eichin at cygnus.com) + + * configure.in, config/mh-solaris: add solaris2 config support. + +Fri May 29 17:23:23 1992 Per Bothner (bothner@rtl.cygnus.com) + + * sigsetmask.c: #ifdef out sigsetmask if SIG_SETMASK + is not defined (should be defined in signal.h, says Posix.). + +Mon May 18 17:35:04 1992 K. Richard Pixley (rich@cygnus.com) + + * getopt.c: merged changes from make-3.62.11. + +Fri May 8 14:53:07 1992 K. Richard Pixley (rich@cygnus.com) + + * getopt.c: merged changes from bison-1.18. + +Tue May 5 11:51:40 1992 Per Bothner (bothner@rtl.cygnus.com) + + * Makefile.in: Don't have $(EXTRA_OFILES) depend on config.h, + since that introduces a circular dependency. + ($(EXTRA_OFILES) are used to build config.h.) + + * strtoul.c: Fixes to handle non-decimal bases better. + +Wed Apr 22 09:27:51 1992 Fred Fish (fnf@cygnus.com) + + * config/mh-ncr3000: Replace MINUS_G with CFLAGS. + * Makefile.dos: Finish MINUS_G eradication. + * Makefile.in (CFILES): Add strsignal.c. + * Makefile.in (REQUIRED_OFILES): Add strerror.o strsignal.o + * Makefile.in (needed-list): Split creation of errors file to + separate make target. + * Makefile.in (config.h, needed2.awk, errors): New targets. + * Makefile.in (clean): Split to multiple lines, add needed2.awk + and config.h. + * dummy.c (DEFFUNC, DEFVAR): Add defines and undefs. + * functions.def (strerror): Remove from optional list. + * functions.def (sys_nerr, sys_errlist, sys_siglist): DEFVAR's + * functions.def (strerror, psignal): DEFFUNC's + * strerror.c: Rewrite from scratch to use sys_errlist only if + available, add errno_max(), add strerrno(), add strtoerrno(), + add test driver. + * strsignal.c: New file, signal equivalent to strerror.c. + Uses sys_siglist if available, defines signo_max(), strsignal(), + strsigno(), strtosigno(), psignal(), and test driver. + +Mon Apr 20 20:49:32 1992 K. Richard Pixley (rich@cygnus.com) + + * Makefile.in: do not print recursion line. + + * Makefile.in: allow CFLAGS to be passed in from command line. + Removed MINUS_G. Default CFLAGS to -g. + +Mon Apr 20 12:57:46 1992 Per Bothner (bothner@rtl.cygnus.com) + + * config/mh-aix: New. EXTRA_OFILES lists copysign.o, + so libg++ users don't have to be inconvenienced by a + libc.a bug (libc.a needs copysign, but doesn't define it!). + * configure.in: Use config/mh-aix. + * strtoul.c: Handle '-' as required by ANSI. + Clean up radix handling. + * strstr.c: Fix buggy algorithm. + * Makefile.in: Change so that ${EXTRA_OFILES} is + appended to needed-list (which is used by libg++). + +Fri Apr 10 22:51:41 1992 Fred Fish (fnf@cygnus.com) + + * configure.in: Recognize new ncr3000 config. + * config/mh-ncr3000: New config file. + +Wed Apr 1 23:31:43 1992 John Gilmore (gnu at cygnus.com) + + * argv.c, dummy.c: Lint. + +Tue Mar 31 18:46:44 1992 Fred Fish (fnf@cygnus.com) + + * config/mh-sysv4: New config file. + * configure.in (host_makefile_frag): Set to config/mh-sysv4 for + host_os == sysv4. + * getpagesize.c: For SVR4, use sysconf(_SC_PAGESIZE) to get + pagesize. + +Sun Mar 29 12:26:42 1992 John Gilmore (gnu at cygnus.com) + + * getopt.c: Lint. + +Fri Mar 27 08:32:55 1992 Fred Fish (fnf@cygnus.com) + + * functions.def (alloca): Fix return type and args to avoid + type clash with gcc's builtin alloca. + +Tue Mar 24 23:33:42 1992 K. Richard Pixley (rich@cygnus.com) + + * configure.in, config/mh-irix4: irix4 support. + + * Makefile.in, functions.def, alloca.c: added alloca. + +Tue Mar 24 17:34:46 1992 Stu Grossman (grossman at cygnus.com) + + * obstack.c (CALL_FREEFUN): Make it compile on DECstations. + +Thu Mar 19 13:57:42 1992 Fred Fish (fnf@cygnus.com) + + * argv.c: Fix various external function definitions to be + correct in an ANSI compilation environment. + +Sat Mar 14 17:28:17 1992 Fred Fish (fnf@cygnus.com) + + * obstack.c: Changes to support calling mmalloc functions, + which take an additional argument over malloc functions. + +Fri Mar 6 22:01:10 1992 K. Richard Pixley (rich@cygnus.com) + + * added check target. + +Thu Feb 27 22:19:39 1992 Per Bothner (bothner@cygnus.com) + + * argv.c: #include alloca-conf.h (needed by AIX). + +Wed Feb 26 18:04:40 1992 K. Richard Pixley (rich@cygnus.com) + + * Makefile.in, configure.in: removed traces of namesubdir, + -subdirs, $(subdir), $(unsubdir), some rcs triggers. Forced + copyrights to '92, changed some from Cygnus to FSF. + +Sat Feb 22 01:09:21 1992 Stu Grossman (grossman at cygnus.com) + + * argv.c: Check in Fred's version which fixes problems with + alloca(). + +Fri Feb 7 21:46:08 1992 Stu Grossman (grossman at cygnus.com) + + * makefile.dos: Remove NUL to keep patch from failing. + +Thu Jan 30 22:48:41 1992 Stu Grossman (grossman at cygnus.com) + + * getopt.c (_getopt_internal): Fix usage of enum has_arg. + +Mon Jan 20 18:53:23 1992 Stu Grossman (grossman at cygnus.com) + + * getopt.c, getopt1.c, ../include/getopt.h: Get latest versions. + +Sat Jan 18 16:53:01 1992 Fred Fish (fnf at cygnus.com) + + * argv.c: New file to build and destroy standard argument + vectors from a command string. + + * Makefile.in: Add argv.c and argv.o to appropriate macros. + +Fri Dec 20 12:12:57 1991 Fred Fish (fnf at cygnus.com) + + * configure.in: Change svr4 references to sysv4. + + * rindex.c: Declare return type of externally used function + strrchr(). + +Thu Dec 19 18:35:03 1991 John Gilmore (gnu at cygnus.com) + + * Makefile.in: Remove "***" in normal output, since Make produces + this on errors, and it's convenient to search for. + +Tue Dec 17 23:21:30 1991 Per Bothner (bothner at cygnus.com) + + * memcmp.c, memcpy.c, memmove.c, memset.c, strchr.c, strrchr.c: + New ANSI functions. The old non-ANSI functions (such as bcopy) + should be avoided. + * bcopy.c: Fix to correctly handle overlapping regions. + * index.c, rindex.c: Re-write in terms of strchr() and strrchr(). + * functions.def: Add the new functions. + * functions.def: Add 4th parameter to DEF macro, + an ansidecl.h-style prototype. + * dummy.c: Use expanded DEF macro to create a dummy function + call, with correct parameter types. (This avoids some + complaints from gcc about predefined builtins.) + + Move the functionality of config/mh-default into Makefile.in. + This avoid duplication, and simplifies things slightly. + * Makefile.in: Tweak so we don't need config/mh-default. + * README: Update. + * configure.in: No longer need config/mh-default. + * config/mh-default: Deleted. + * config/mh-sysv: Remove lines copied from old mh-default. + +Tue Dec 17 05:46:46 1991 John Gilmore (gnu at cygnus.com) + + * fdmatch.c (fdmatch): Don't compare st_rdev, which is for + 'mknod' device numbers. + +Mon Dec 16 12:25:34 1991 Fred Fish (fnf at cygnus.com) + + * fdmatch.c, Makefile.in: Add new function that takes two + open file descriptors and returns nonzero if they refer to + the same file, zero otherwise. (used in gdb) + +Wed Dec 11 17:40:39 1991 Steve Chamberlain (sac at rtl.cygnus.com) + From DJ: + * msdos.c: stub functions for dos. + * makefile.dos, configdj.bat: new. + * getopt.c: Don't include alloca-conf.h in a GO32 world. + + +Tue Dec 10 04:14:49 1991 K. Richard Pixley (rich at rtl.cygnus.com) + + * Makefile.in: infodir belongs in datadir. + +Fri Dec 6 23:26:45 1991 K. Richard Pixley (rich at rtl.cygnus.com) + + * Makefile.in: remove spaces following hyphens because bsd make + can't cope. added standards.text support. install using + INSTALL_DATA. + + * configure.in: remove commontargets as it is no longer a + recognized hook. + +Thu Dec 5 22:46:46 1991 K. Richard Pixley (rich at rtl.cygnus.com) + + * Makefile.in: idestdir and ddestdir go away. Added copyrights + and shift gpl to v2. Added ChangeLog if it didn't exist. docdir + and mandir now keyed off datadir by default. + +Fri Nov 22 19:15:29 1991 John Gilmore (gnu at cygnus.com) + + * Makefile.in: find-needed.awk does not fit in 14 chars. + + * Makefile.in: Suppress error checking when compiling the test + program, because Ultrix make/sh aborts there due to a bug. + +Fri Nov 22 12:23:17 1991 Per Bothner (bothner at cygnus.com) + + * Makefile.in: Re-did how EXTRA_OFILES is used to be more useful. + * README: Explained how the auto-configuration works, + and how to add new files and/or configurations. + +Fri Nov 22 09:45:23 1991 John Gilmore (gnu at cygnus.com) + + * strtoul.c: Avoid defining ULONG_MAX if already defined; + cast a const char * to char * for pedants. + + * getopt.c: Only define "const" after local include files get to, + and only if they haven't defined it. + +Thu Nov 21 16:58:53 1991 John Gilmore (gnu at cygnus.com) + + * getcwd.c (remove getwd.c): GNU code should call getcwd(). We + emulate it with getwd() if available. This avoids callers having + to find a MAXPATHLEN or PATH_MAX value from somewhere. + * Makefile.in, functions.def: getwd->getcwd. + * configure.in: Use generic case for every system. + * config/mh-{delta88,mach,rs6000,svr4}: Remove. + * config/mh-sysv: Use default handling, just add -DUSG. + +Thu Nov 14 10:58:05 1991 Per Bothner (bothner at cygnus.com) + + * Makefile.in, config/mh-default: Re-do make magic + so that for the default ("automatic") mode we only + compile the files we actually need. Do this using + a recursive make: The top-level generates the list + of needed files (loosely, the ones missing in libc), + and then passes that list to the recursive make. + * config/mh-mach: Remove obsolete STRERROR-{C,O} macros. + +Tue Nov 12 19:10:57 1991 John Gilmore (gnu at cygnus.com) + + RS/6000 host support (grumble). + + * configure.in: Build alloca-conf.h file from alloca-norm.h + (everything else) or alloca-botch.h (rs/6000). + * Makefile.in: Include . on the include path. + * getopt.c: Use alloca-conf.h. + * alloca-norm.h: How to declare alloca on reasonable machines. + * alloca-botch.h: How to declare alloca on braindead machines. + +Tue Nov 12 09:21:48 1991 Fred Fish (fnf at cygnus.com) + + * concat.c : New file, like concat() in gdb but can take a + variable number of arguments rather than fixed at 3 args. For + now, client applications must supply an xmalloc(), which is a + front end function to malloc() that deals with out-of-memory + conditions. + + * Makefile.in: Add concat.c and concat.o to appropriate macros. + +Sat Nov 9 13:29:59 1991 Fred Fish (fnf at cygnus.com) + + * config/mh-svr4: Add sigsetmask to list of required functions. + +Sun Nov 3 11:57:56 1991 Per Bothner (bothner at cygnus.com) + + * vsprintf.c: New file. + * functions.def, Makefile.in: Add vsprintf. + +Sun Oct 27 16:31:22 1991 John Gilmore (gnu at cygnus.com) + + * configure.in, config/mh-rs6000: Add rs/6000 host support. + * Makefile.in: Compile with debug info. + +Fri Oct 25 17:01:12 1991 Per Bothner (bothner at cygnus.com) + + * Makefile.in, configure.in, and new files: dummy.c, functions.def, + config/mf-default: Added a default configuration mode, + which includes into libiberty.a functions that are "missing" in libc. + * strdup.c, vprintf.c, vfprintf.c: New files. + +Thu Oct 24 02:29:26 1991 Fred Fish (fnf at cygnus.com) + + * config/hmake-svr4: New file. + + * config/hmake-sysv: Add HOST_CFILES and HOST_OFILES. + + * basename.c, bcmp.c, bcopy.c, bzero.c, getpagesize.c getwd.c, + index.c, insque.c, rindex.c, spaces.c, strstr.c, vfork.c: New + files containing either portable C versions or emulations using + native library calls. + + * strerror.c: Add copyright, internal documentation, etc. + + * strtol.c: Replace hardwired hex constants with some more + portable macros. Remove illegal (according to gcc) cast. + + * strtoul.c: Replace hardwired hex constant with more portable + macro. + + * Makefile.in: Move TARGETLIB and CFLAGS where makefile fragments + can override them. Add new source and object file names to CFILES + and OFILES respectively. + + * configure.in: Add support for SVR4 makefile fragments. + +Tue Oct 22 19:00:23 1991 Steve Chamberlain (steve at cygnus.com) + + * Makefile.in: Move RANLIB, AR and AR_FLAGS to where they can be + over-ridden by config/hmake-* + * configure.in: added m88kcvs to sysv list + +Fri Oct 4 01:29:08 1991 John Gilmore (gnu at cygnus.com) + + * Makefile.in: Most hosts need strerror, but one or two don't, + and they override these definitions in the host-dependent makefile + fragment. + * config/hmake-mach: The odd man out on strerror -- it's supplied. + * strerror.c: New file. + + * strtol.c, strtoul.c: Add strtol to libiberty, since Mach lacks + it and bfd uses it. + * configure.in, Makefile.in, config/hmake-mach: Only configure + strtol & strotoul in on Mach. + +Tue Sep 3 06:36:23 1991 John Gilmore (gnu at cygint.cygnus.com) + + * obstack.c: Merge with latest FSF version. + + +Local Variables: +version-control: never +End: diff --git a/libiberty/Makefile.in b/libiberty/Makefile.in new file mode 100644 index 0000000..b98dcea --- /dev/null +++ b/libiberty/Makefile.in @@ -0,0 +1,1183 @@ +# Makefile for the libiberty library. +# Originally written by K. Richard Pixley . +# +# Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, +# 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software +# Foundation +# +# This file is part of the libiberty library. +# Libiberty is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# Libiberty 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with libiberty; see the file COPYING.LIB. If not, +# write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, +# Boston, MA 02110-1301, USA. + +libiberty_topdir = @libiberty_topdir@ +srcdir = @srcdir@ + +prefix = @prefix@ + +exec_prefix = @exec_prefix@ +bindir = @bindir@ +libdir = @libdir@ +includedir = @includedir@ +target_header_dir = @target_header_dir@ + +SHELL = @SHELL@ + +# Multilib support variables. +MULTISRCTOP = +MULTIBUILDTOP = +MULTIDIRS = +MULTISUBDIR = +MULTIDO = true +MULTICLEAN = true + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ +mkinstalldirs = $(SHELL) $(libiberty_topdir)/mkinstalldirs + +# Some compilers can't handle cc -c blah.c -o foo/blah.o. +OUTPUT_OPTION = @OUTPUT_OPTION@ + +AR = @AR@ +AR_FLAGS = rc + +CC = @CC@ +CFLAGS = @CFLAGS@ +LIBCFLAGS = $(CFLAGS) +RANLIB = @RANLIB@ +MAKEINFO = @MAKEINFO@ +PERL = @PERL@ + +PICFLAG = + +MAKEOVERRIDES = + +TARGETLIB = ./libiberty.a +TESTLIB = ./testlib.a + +LIBOBJS = @LIBOBJS@ + +# A configuration can specify extra .o files that should be included, +# even if they are in libc. (Perhaps the libc version is buggy.) +EXTRA_OFILES = + +# Flags to pass to a recursive make. +FLAGS_TO_PASS = \ + "AR=$(AR)" \ + "AR_FLAGS=$(AR_FLAGS)" \ + "CC=$(CC)" \ + "CFLAGS=$(CFLAGS)" \ + "DESTDIR=$(DESTDIR)" \ + "LIBCFLAGS=$(LIBCFLAGS)" \ + "EXTRA_OFILES=$(EXTRA_OFILES)" \ + "HDEFINES=$(HDEFINES)" \ + "INSTALL=$(INSTALL)" \ + "INSTALL_DATA=$(INSTALL_DATA)" \ + "INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \ + "LDFLAGS=$(LDFLAGS)" \ + "LOADLIBES=$(LOADLIBES)" \ + "RANLIB=$(RANLIB)" \ + "SHELL=$(SHELL)" \ + "prefix=$(prefix)" \ + "exec_prefix=$(exec_prefix)" \ + "libdir=$(libdir)" \ + "libsubdir=$(libsubdir)" \ + "tooldir=$(tooldir)" + +# Subdirectories to recurse into. We need to override this during cleaning +SUBDIRS = + +# FIXME: add @BUILD_INFO@ once we're sure it works for everyone. +all: stamp-picdir $(TARGETLIB) needed-list required-list all-subdir + @: $(MAKE) ; exec $(MULTIDO) $(FLAGS_TO_PASS) multi-do DO=all + +.PHONY: check installcheck +check: check-subdir +installcheck: installcheck-subdir + +@host_makefile_frag@ + +INCDIR=$(srcdir)/$(MULTISRCTOP)../include + +COMPILE.c = $(CC) -c @DEFS@ $(LIBCFLAGS) -I. -I$(INCDIR) $(HDEFINES) @ac_libiberty_warn_cflags@ + +# Just to make sure we don't use a built-in rule with VPATH +.c.o: + false + +# NOTE: If you add new files to the library, add them to this list +# (alphabetical), and add them to REQUIRED_OFILES, or +# CONFIGURED_OFILES and funcs in configure.ac. Also run "make maint-deps" +# to build the new rules. +CFILES = alloca.c argv.c asprintf.c atexit.c \ + basename.c bcmp.c bcopy.c bsearch.c bzero.c \ + calloc.c choose-temp.c clock.c concat.c cp-demangle.c \ + cp-demint.c cplus-dem.c \ + dyn-string.c \ + fdmatch.c ffs.c fibheap.c filename_cmp.c floatformat.c \ + fnmatch.c fopen_unlocked.c \ + getcwd.c getopt.c getopt1.c getpagesize.c getpwd.c getruntime.c \ + gettimeofday.c \ + hashtab.c hex.c \ + index.c insque.c \ + lbasename.c \ + lrealpath.c \ + make-relative-prefix.c \ + make-temp-file.c md5.c memchr.c memcmp.c memcpy.c memmove.c \ + mempcpy.c memset.c mkstemps.c \ + objalloc.c obstack.c \ + partition.c pexecute.c \ + pex-common.c pex-djgpp.c pex-msdos.c pex-one.c \ + pex-unix.c pex-win32.c \ + physmem.c putenv.c \ + random.c regex.c rename.c rindex.c \ + safe-ctype.c setenv.c sigsetmask.c snprintf.c sort.c spaces.c \ + splay-tree.c stpcpy.c stpncpy.c strcasecmp.c strchr.c strdup.c \ + strerror.c strncasecmp.c strncmp.c strrchr.c strsignal.c \ + strstr.c strtod.c strtol.c strtoul.c strndup.c strverscmp.c \ + tmpnam.c \ + unlink-if-ordinary.c \ + vasprintf.c vfork.c vfprintf.c vprintf.c vsnprintf.c vsprintf.c \ + waitpid.c \ + xatexit.c xexit.c xmalloc.c xmemdup.c xstrdup.c xstrerror.c \ + xstrndup.c + +# These are always included in the library. The first four are listed +# first and by compile time to optimize parallel builds. +REQUIRED_OFILES = ./regex.o ./cplus-dem.o ./cp-demangle.o ./md5.o \ + ./alloca.o ./argv.o \ + ./choose-temp.o ./concat.o ./cp-demint.o \ + ./dyn-string.o \ + ./fdmatch.o ./fibheap.o ./filename_cmp.o ./floatformat.o \ + ./fnmatch.o ./fopen_unlocked.o \ + ./getopt.o ./getopt1.o ./getpwd.o ./getruntime.o \ + ./hashtab.o ./hex.o \ + ./lbasename.o ./lrealpath.o \ + ./make-relative-prefix.o ./make-temp-file.o \ + ./objalloc.o ./obstack.o \ + ./partition.o ./pexecute.o ./physmem.o \ + ./pex-common.o ./pex-one.o @pexecute@ \ + ./safe-ctype.o ./sort.o ./spaces.o ./splay-tree.o ./strerror.o \ + ./strsignal.o \ + ./unlink-if-ordinary.o \ + ./xatexit.o ./xexit.o ./xmalloc.o ./xmemdup.o ./xstrdup.o \ + ./xstrerror.o ./xstrndup.o + +# These are all the objects that configure may add to the library via +# $funcs or EXTRA_OFILES. This list exists here only for "make +# maint-missing" and "make check". +CONFIGURED_OFILES = ./asprintf.o ./atexit.o \ + ./basename.o ./bcmp.o ./bcopy.o ./bsearch.o ./bzero.o \ + ./calloc.o ./clock.o ./copysign.o \ + ./_doprnt.o \ + ./ffs.o \ + ./getcwd.o ./getpagesize.o ./gettimeofday.o \ + ./index.o ./insque.o \ + ./memchr.o ./memcmp.o ./memcpy.o ./memmove.o ./mempcpy.o \ + ./memset.o ./mkstemps.o \ + ./pex-djgpp.o ./pex-msdos.o \ + ./pex-unix.o ./pex-win32.o \ + ./putenv.o \ + ./random.o ./rename.o ./rindex.o \ + ./setenv.o ./sigsetmask.o ./snprintf.o ./stpcpy.o ./stpncpy.o \ + ./strcasecmp.o ./strchr.o ./strdup.o ./strncasecmp.o \ + ./strncmp.o ./strndup.o ./strrchr.o ./strstr.o \ + ./strtod.o ./strtol.o ./strtoul.o ./strverscmp.o \ + ./tmpnam.o \ + ./vasprintf.o ./vfork.o ./vfprintf.o ./vprintf.o ./vsnprintf.o \ + ./vsprintf.o \ + ./waitpid.o + +# These files are installed if the library has been configured to do so. +INSTALLED_HEADERS = \ + $(INCDIR)/ansidecl.h \ + $(INCDIR)/demangle.h \ + $(INCDIR)/dyn-string.h \ + $(INCDIR)/fibheap.h \ + $(INCDIR)/floatformat.h \ + $(INCDIR)/hashtab.h \ + $(INCDIR)/libiberty.h \ + $(INCDIR)/objalloc.h \ + $(INCDIR)/partition.h \ + $(INCDIR)/safe-ctype.h \ + $(INCDIR)/sort.h \ + $(INCDIR)/splay-tree.h + +$(TARGETLIB): $(REQUIRED_OFILES) $(EXTRA_OFILES) $(LIBOBJS) + -rm -f $(TARGETLIB) pic/$(TARGETLIB) + $(AR) $(AR_FLAGS) $(TARGETLIB) \ + $(REQUIRED_OFILES) $(EXTRA_OFILES) $(LIBOBJS) + $(RANLIB) $(TARGETLIB) + if [ x"$(PICFLAG)" != x ]; then \ + cd pic; \ + $(AR) $(AR_FLAGS) $(TARGETLIB) \ + $(REQUIRED_OFILES) $(EXTRA_OFILES) $(LIBOBJS); \ + $(RANLIB) $(TARGETLIB); \ + cd ..; \ + else true; fi + +$(TESTLIB): $(REQUIRED_OFILES) $(CONFIGURED_OFILES) + -rm -f $(TESTLIB) + $(AR) $(AR_FLAGS) $(TESTLIB) \ + $(REQUIRED_OFILES) $(CONFIGURED_OFILES) + $(RANLIB) $(TESTLIB) + +info: libiberty.info info-subdir +install-info: install-info-subdir +clean-info: clean-info-subdir +dvi: libiberty.dvi dvi-subdir + +LIBIBERTY_PDFFILES = libiberty.pdf + +pdf: $(LIBIBERTY_PDFFILES) pdf-subdir + +.PHONY: install-pdf + +pdf__strip_dir = `echo $$p | sed -e 's|^.*/||'`; + +install-pdf: $(LIBIBERTY_PDFFILES) + @$(NORMAL_INSTALL) + test -z "$(pdfdir)" || $(mkinstalldirs) "$(DESTDIR)$(pdfdir)" + @list='$(LIBIBERTY_PDFFILES)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(pdf__strip_dir) \ + echo " $(INSTALL_DATA) '$$d$$p' '$(DESTDIR)$(pdfdir)/$$f'"; \ + $(INSTALL_DATA) "$$d$$p" "$(DESTDIR)$(pdfdir)/$$f"; \ + done + +# html, install-html targets +HTMLS = libiberty.html + +html: $(HTMLS) + +.PHONY: install-html install-html-am install-html-recursive + +NORMAL_INSTALL = : +mkdir_p = mkdir -p -- + +html__strip_dir = `echo $$p | sed -e 's|^.*/||'`; + +install-html: install-html-recursive install-html-am + +install-html-am: $(HTMLS) + @$(NORMAL_INSTALL) + test -z "$(htmldir)" || $(mkdir_p) "$(DESTDIR)$(htmldir)" + @list='$(HTMLS)'; for p in $$list; do \ + if test -f "$$p" || test -d "$$p"; then d=""; else d="$(srcdir)/"; fi; \ + f=$(html__strip_dir) \ + if test -d "$$d$$p"; then \ + echo " $(mkdir_p) '$(DESTDIR)$(htmldir)/$$f'"; \ + $(mkdir_p) "$(DESTDIR)$(htmldir)/$$f" || exit 1; \ + echo " $(INSTALL_DATA) '$$d$$p'/* '$(DESTDIR)$(htmldir)/$$f'"; \ + $(INSTALL_DATA) "$$d$$p"/* "$(DESTDIR)$(htmldir)/$$f"; \ + else \ + echo " $(INSTALL_DATA) '$$d$$p' '$(DESTDIR)$(htmldir)/$$f'"; \ + $(INSTALL_DATA) "$$d$$p" "$(DESTDIR)$(htmldir)/$$f"; \ + fi; \ + done + +install-html-recursive: + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +TEXISRC = \ + $(srcdir)/libiberty.texi \ + $(srcdir)/copying-lib.texi \ + $(srcdir)/obstacks.texi \ + $(srcdir)/functions.texi + +# Additional files that have texi snippets that need to be collected +# and sorted. Some are here because the sources are imported from +# elsewhere. Others represent headers in ../include. +TEXIFILES = fnmatch.txh pexecute.txh + +libiberty.info : $(srcdir)/libiberty.texi $(TEXISRC) + $(MAKEINFO) -I$(srcdir) $(srcdir)/libiberty.texi + +libiberty.dvi : $(srcdir)/libiberty.texi $(TEXISRC) + texi2dvi $(srcdir)/libiberty.texi + +libiberty.pdf : $(srcdir)/libiberty.texi $(TEXISRC) + texi2pdf $(srcdir)/libiberty.texi + +libiberty.html : $(srcdir)/libiberty.texi $(TEXISRC) + $(MAKEINFO) --no-split --html -I$(srcdir) -o $@ $< + +@MAINT@$(srcdir)/functions.texi : stamp-functions +@MAINT@ @true + +@MAINT@stamp-functions : $(CFILES:%=$(srcdir)/%) $(TEXIFILES:%=$(srcdir)/%) $(srcdir)/gather-docs Makefile +@MAINT@@HAVE_PERL@ $(PERL) $(srcdir)/gather-docs $(srcdir) $(srcdir)/functions.texi $(CFILES) $(TEXIFILES) +@MAINT@ echo stamp > stamp-functions + +INSTALL_DEST = @INSTALL_DEST@ +install: + +# This is tricky. Even though CC in the Makefile contains +# multilib-specific flags, it's overridden by FLAGS_TO_PASS from the +# default multilib, so we have to take LIBCFLAGS into account as well, +# since it will be passed the multilib flags. +MULTIOSDIR = `$(CC) $(LIBCFLAGS) -print-multi-os-directory` +install_to_libdir: all + ${mkinstalldirs} $(DESTDIR)$(libdir)/$(MULTIOSDIR) + $(INSTALL_DATA) $(TARGETLIB) $(DESTDIR)$(libdir)/$(MULTIOSDIR)/$(TARGETLIB)n + ( cd $(DESTDIR)$(libdir)/$(MULTIOSDIR) ; chmod 644 $(TARGETLIB)n ;$(RANLIB) $(TARGETLIB)n ) + mv -f $(DESTDIR)$(libdir)/$(MULTIOSDIR)/$(TARGETLIB)n $(DESTDIR)$(libdir)/$(MULTIOSDIR)/$(TARGETLIB) + if test -n "${target_header_dir}"; then \ + case "${target_header_dir}" in \ + /*) thd=${target_header_dir};; \ + *) thd=${includedir}/${target_header_dir};; \ + esac; \ + ${mkinstalldirs} $(DESTDIR)$${thd}; \ + for h in ${INSTALLED_HEADERS}; do \ + ${INSTALL_DATA} $$h $(DESTDIR)$${thd}; \ + done; \ + fi + @$(MULTIDO) $(FLAGS_TO_PASS) multi-do DO=install + +install_to_tooldir: all + ${mkinstalldirs} $(DESTDIR)$(tooldir)/lib/$(MULTIOSDIR) + $(INSTALL_DATA) $(TARGETLIB) $(DESTDIR)$(tooldir)/lib/$(MULTIOSDIR)/$(TARGETLIB)n + ( cd $(DESTDIR)$(tooldir)/lib/$(MULTIOSDIR) ; chmod 644 $(TARGETLIB)n; $(RANLIB) $(TARGETLIB)n ) + mv -f $(DESTDIR)$(tooldir)/lib/$(MULTIOSDIR)/$(TARGETLIB)n $(DESTDIR)$(tooldir)/lib/$(MULTIOSDIR)/$(TARGETLIB) + @$(MULTIDO) $(FLAGS_TO_PASS) multi-do DO=install + +# needed-list is used by libstdc++. NEEDED is the list of functions +# to include there. Do not add anything LGPL to this list; libstdc++ +# can't use anything encumbering. +NEEDED = atexit calloc memchr memcmp memcpy memmove memset rename strchr \ + strerror strncmp strrchr strstr strtol strtoul tmpnam vfprintf vprintf \ + vfork waitpid bcmp bcopy bzero +needed-list: Makefile + rm -f needed-list; touch needed-list; \ + for f in $(NEEDED); do \ + for g in $(LIBOBJS) $(EXTRA_OFILES); do \ + case "$$g" in \ + *$$f*) echo $$g >> needed-list ;; \ + esac; \ + done; \ + done + +# required-list was used when building a shared bfd/opcodes/libiberty +# library. I don't know if it used by anything currently. +required-list: Makefile + echo $(REQUIRED_OFILES) > required-list + +stamp-picdir: + if [ x"$(PICFLAG)" != x ] && [ ! -d pic ]; then \ + mkdir pic; \ + else true; fi + touch stamp-picdir + +.PHONY: all etags tags ls clean stage1 stage2 + +etags tags: TAGS etags-subdir + +TAGS: $(CFILES) + etags `for i in $(CFILES); do echo $(srcdir)/$$i ; done` + +# The standalone demangler (c++filt) has been moved to binutils. +demangle: + @echo "The standalone demangler, now named c++filt, is now" + @echo "a part of binutils." + @false + +ls: + @echo Makefile $(CFILES) + +# Various targets for maintainers. + +maint-missing : + @$(PERL) $(srcdir)/maint-tool -s $(srcdir) missing $(CFILES) $(REQUIRED_OFILES) $(CONFIGURED_OFILES) + +maint-buildall : $(REQUIRED_OFILES) $(CONFIGURED_OFILES) + @true + +maint-undoc : $(srcdir)/functions.texi + @$(PERL) $(srcdir)/maint-tool -s $(srcdir) undoc + +maint-deps : + @$(PERL) $(srcdir)/maint-tool -s $(srcdir) deps $(INCDIR) + +# Need to deal with profiled libraries, too. + +# Cleaning has to be done carefully to ensure that we don't clean our SUBDIRS +# multiple times, hence our explicit recursion with an empty SUBDIRS. +mostlyclean: mostlyclean-subdir + -rm -rf *.o pic core errs \#* *.E a.out + -rm -f needed.awk needed2.awk errors dummy needed-list config.h stamp-* + -rm -f $(CONFIG_H) $(NEEDED_LIST) stamp-picdir + -rm -f libiberty.aux libiberty.cp libiberty.cps libiberty.fn libiberty.ky + -rm -f libiberty.log libiberty.tmp libiberty.tps libiberty.pg + -rm -f libiberty.pgs libiberty.toc libiberty.tp libiberty.tpl libiberty.vr + -rm -f libtexi.stamp + @$(MULTICLEAN) multi-clean DO=mostlyclean +clean: clean-subdir + $(MAKE) SUBDIRS="" mostlyclean + -rm -f *.a required-list tmpmulti.out + -rm -f libiberty.dvi libiberty.pdf libiberty.info* libiberty.html + @$(MULTICLEAN) multi-clean DO=clean +distclean: distclean-subdir + $(MAKE) SUBDIRS="" clean + @$(MULTICLEAN) multi-clean DO=distclean + -rm -f *~ Makefile config.cache config.status xhost-mkfrag TAGS multilib.out + -rm -f config.log + -rmdir testsuite 2>/dev/null +maintainer-clean realclean: maintainer-clean-subdir + $(MAKE) SUBDIRS="" distclean + +force: + +Makefile: $(srcdir)/Makefile.in config.status + CONFIG_FILES=Makefile CONFIG_HEADERS= $(SHELL) ./config.status + +# Depending on Makefile makes sure that config.status has been re-run +# if needed. This prevents problems with parallel builds. +config.h: stamp-h ; @true +stamp-h: $(srcdir)/config.in config.status Makefile + CONFIG_FILES= CONFIG_HEADERS=config.h:$(srcdir)/config.in $(SHELL) ./config.status + +config.status: $(srcdir)/configure + $(SHELL) ./config.status --recheck + +# Depending on stamp-h makes sure that config.status has been re-run +# if needed. This prevents problems with parallel builds, in case +# subdirectories need to run config.status also. +all-subdir check-subdir installcheck-subdir info-subdir \ +install-info-subdir clean-info-subdir dvi-subdir pdf-subdir install-subdir \ +etags-subdir mostlyclean-subdir clean-subdir distclean-subdir \ +maintainer-clean-subdir: stamp-h + @subdirs='$(SUBDIRS)'; \ + target=`echo $@ | sed -e 's/-subdir//'`; \ + for dir in $$subdirs ; do \ + cd $$dir && $(MAKE) $(FLAGS_TO_PASS) $$target; \ + done + +$(REQUIRED_OFILES) $(EXTRA_OFILES) $(LIBOBJS): stamp-picdir +$(CONFIGURED_OFILES): stamp-picdir + +# Don't export variables to the environment, in order to not confuse +# configure. +.NOEXPORT: + +# The dependencies in the remainder of this file are automatically +# generated by "make maint-deps". Manual edits will be lost. + +./_doprnt.o: $(srcdir)/_doprnt.c stamp-h $(INCDIR)/ansidecl.h \ + $(INCDIR)/safe-ctype.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/_doprnt.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/_doprnt.c $(OUTPUT_OPTION) + +./alloca.o: $(srcdir)/alloca.c stamp-h $(INCDIR)/ansidecl.h $(INCDIR)/libiberty.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/alloca.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/alloca.c $(OUTPUT_OPTION) + +./argv.o: $(srcdir)/argv.c stamp-h $(INCDIR)/ansidecl.h $(INCDIR)/libiberty.h \ + $(INCDIR)/safe-ctype.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/argv.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/argv.c $(OUTPUT_OPTION) + +./asprintf.o: $(srcdir)/asprintf.c stamp-h $(INCDIR)/ansidecl.h \ + $(INCDIR)/libiberty.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/asprintf.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/asprintf.c $(OUTPUT_OPTION) + +./atexit.o: $(srcdir)/atexit.c stamp-h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/atexit.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/atexit.c $(OUTPUT_OPTION) + +./basename.o: $(srcdir)/basename.c stamp-h $(INCDIR)/ansidecl.h \ + $(INCDIR)/libiberty.h $(INCDIR)/safe-ctype.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/basename.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/basename.c $(OUTPUT_OPTION) + +./bcmp.o: $(srcdir)/bcmp.c + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/bcmp.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/bcmp.c $(OUTPUT_OPTION) + +./bcopy.o: $(srcdir)/bcopy.c + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/bcopy.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/bcopy.c $(OUTPUT_OPTION) + +./bsearch.o: $(srcdir)/bsearch.c stamp-h $(INCDIR)/ansidecl.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/bsearch.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/bsearch.c $(OUTPUT_OPTION) + +./bzero.o: $(srcdir)/bzero.c + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/bzero.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/bzero.c $(OUTPUT_OPTION) + +./calloc.o: $(srcdir)/calloc.c $(INCDIR)/ansidecl.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/calloc.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/calloc.c $(OUTPUT_OPTION) + +./choose-temp.o: $(srcdir)/choose-temp.c stamp-h $(INCDIR)/ansidecl.h \ + $(INCDIR)/libiberty.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/choose-temp.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/choose-temp.c $(OUTPUT_OPTION) + +./clock.o: $(srcdir)/clock.c stamp-h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/clock.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/clock.c $(OUTPUT_OPTION) + +./concat.o: $(srcdir)/concat.c stamp-h $(INCDIR)/ansidecl.h $(INCDIR)/libiberty.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/concat.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/concat.c $(OUTPUT_OPTION) + +./copysign.o: $(srcdir)/copysign.c $(INCDIR)/ansidecl.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/copysign.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/copysign.c $(OUTPUT_OPTION) + +./cp-demangle.o: $(srcdir)/cp-demangle.c stamp-h $(INCDIR)/ansidecl.h \ + $(srcdir)/cp-demangle.h $(INCDIR)/demangle.h \ + $(INCDIR)/dyn-string.h $(INCDIR)/getopt.h $(INCDIR)/libiberty.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/cp-demangle.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/cp-demangle.c $(OUTPUT_OPTION) + +./cp-demint.o: $(srcdir)/cp-demint.c stamp-h $(INCDIR)/ansidecl.h \ + $(srcdir)/cp-demangle.h $(INCDIR)/demangle.h \ + $(INCDIR)/libiberty.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/cp-demint.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/cp-demint.c $(OUTPUT_OPTION) + +./cplus-dem.o: $(srcdir)/cplus-dem.c stamp-h $(INCDIR)/ansidecl.h \ + $(INCDIR)/demangle.h $(INCDIR)/libiberty.h \ + $(INCDIR)/safe-ctype.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/cplus-dem.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/cplus-dem.c $(OUTPUT_OPTION) + +./dyn-string.o: $(srcdir)/dyn-string.c stamp-h $(INCDIR)/ansidecl.h \ + $(INCDIR)/dyn-string.h $(INCDIR)/libiberty.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/dyn-string.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/dyn-string.c $(OUTPUT_OPTION) + +./fdmatch.o: $(srcdir)/fdmatch.c stamp-h $(INCDIR)/ansidecl.h \ + $(INCDIR)/libiberty.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/fdmatch.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/fdmatch.c $(OUTPUT_OPTION) + +./ffs.o: $(srcdir)/ffs.c + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/ffs.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/ffs.c $(OUTPUT_OPTION) + +./fibheap.o: $(srcdir)/fibheap.c stamp-h $(INCDIR)/ansidecl.h $(INCDIR)/fibheap.h \ + $(INCDIR)/libiberty.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/fibheap.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/fibheap.c $(OUTPUT_OPTION) + +./filename_cmp.o: $(srcdir)/filename_cmp.c stamp-h $(INCDIR)/filenames.h \ + $(INCDIR)/safe-ctype.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/filename_cmp.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/filename_cmp.c $(OUTPUT_OPTION) + +./floatformat.o: $(srcdir)/floatformat.c stamp-h $(INCDIR)/ansidecl.h \ + $(INCDIR)/floatformat.h $(INCDIR)/libiberty.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/floatformat.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/floatformat.c $(OUTPUT_OPTION) + +./fnmatch.o: $(srcdir)/fnmatch.c stamp-h $(INCDIR)/fnmatch.h \ + $(INCDIR)/safe-ctype.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/fnmatch.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/fnmatch.c $(OUTPUT_OPTION) + +./fopen_unlocked.o: $(srcdir)/fopen_unlocked.c stamp-h $(INCDIR)/ansidecl.h \ + $(INCDIR)/libiberty.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/fopen_unlocked.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/fopen_unlocked.c $(OUTPUT_OPTION) + +./getcwd.o: $(srcdir)/getcwd.c stamp-h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/getcwd.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/getcwd.c $(OUTPUT_OPTION) + +./getopt.o: $(srcdir)/getopt.c stamp-h $(INCDIR)/ansidecl.h $(INCDIR)/getopt.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/getopt.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/getopt.c $(OUTPUT_OPTION) + +./getopt1.o: $(srcdir)/getopt1.c stamp-h $(INCDIR)/getopt.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/getopt1.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/getopt1.c $(OUTPUT_OPTION) + +./getpagesize.o: $(srcdir)/getpagesize.c stamp-h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/getpagesize.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/getpagesize.c $(OUTPUT_OPTION) + +./getpwd.o: $(srcdir)/getpwd.c stamp-h $(INCDIR)/ansidecl.h $(INCDIR)/libiberty.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/getpwd.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/getpwd.c $(OUTPUT_OPTION) + +./getruntime.o: $(srcdir)/getruntime.c stamp-h $(INCDIR)/ansidecl.h \ + $(INCDIR)/libiberty.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/getruntime.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/getruntime.c $(OUTPUT_OPTION) + +./gettimeofday.o: $(srcdir)/gettimeofday.c stamp-h $(INCDIR)/ansidecl.h \ + $(INCDIR)/libiberty.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/gettimeofday.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/gettimeofday.c $(OUTPUT_OPTION) + +./hashtab.o: $(srcdir)/hashtab.c stamp-h $(INCDIR)/ansidecl.h $(INCDIR)/hashtab.h \ + $(INCDIR)/libiberty.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/hashtab.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/hashtab.c $(OUTPUT_OPTION) + +./hex.o: $(srcdir)/hex.c stamp-h $(INCDIR)/ansidecl.h $(INCDIR)/libiberty.h \ + $(INCDIR)/safe-ctype.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/hex.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/hex.c $(OUTPUT_OPTION) + +./index.o: $(srcdir)/index.c + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/index.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/index.c $(OUTPUT_OPTION) + +./insque.o: $(srcdir)/insque.c + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/insque.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/insque.c $(OUTPUT_OPTION) + +./lbasename.o: $(srcdir)/lbasename.c stamp-h $(INCDIR)/ansidecl.h \ + $(INCDIR)/filenames.h $(INCDIR)/libiberty.h \ + $(INCDIR)/safe-ctype.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/lbasename.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/lbasename.c $(OUTPUT_OPTION) + +./lrealpath.o: $(srcdir)/lrealpath.c stamp-h $(INCDIR)/ansidecl.h \ + $(INCDIR)/libiberty.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/lrealpath.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/lrealpath.c $(OUTPUT_OPTION) + +./make-relative-prefix.o: $(srcdir)/make-relative-prefix.c stamp-h \ + $(INCDIR)/ansidecl.h $(INCDIR)/libiberty.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/make-relative-prefix.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/make-relative-prefix.c $(OUTPUT_OPTION) + +./make-temp-file.o: $(srcdir)/make-temp-file.c stamp-h $(INCDIR)/ansidecl.h \ + $(INCDIR)/libiberty.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/make-temp-file.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/make-temp-file.c $(OUTPUT_OPTION) + +./md5.o: $(srcdir)/md5.c stamp-h $(INCDIR)/ansidecl.h $(INCDIR)/md5.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/md5.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/md5.c $(OUTPUT_OPTION) + +./memchr.o: $(srcdir)/memchr.c $(INCDIR)/ansidecl.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/memchr.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/memchr.c $(OUTPUT_OPTION) + +./memcmp.o: $(srcdir)/memcmp.c $(INCDIR)/ansidecl.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/memcmp.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/memcmp.c $(OUTPUT_OPTION) + +./memcpy.o: $(srcdir)/memcpy.c $(INCDIR)/ansidecl.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/memcpy.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/memcpy.c $(OUTPUT_OPTION) + +./memmove.o: $(srcdir)/memmove.c $(INCDIR)/ansidecl.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/memmove.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/memmove.c $(OUTPUT_OPTION) + +./mempcpy.o: $(srcdir)/mempcpy.c $(INCDIR)/ansidecl.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/mempcpy.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/mempcpy.c $(OUTPUT_OPTION) + +./memset.o: $(srcdir)/memset.c $(INCDIR)/ansidecl.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/memset.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/memset.c $(OUTPUT_OPTION) + +./mkstemps.o: $(srcdir)/mkstemps.c stamp-h $(INCDIR)/ansidecl.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/mkstemps.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/mkstemps.c $(OUTPUT_OPTION) + +./msdos.o: $(srcdir)/msdos.c + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/msdos.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/msdos.c $(OUTPUT_OPTION) + +./objalloc.o: $(srcdir)/objalloc.c stamp-h $(INCDIR)/ansidecl.h \ + $(INCDIR)/objalloc.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/objalloc.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/objalloc.c $(OUTPUT_OPTION) + +./obstack.o: $(srcdir)/obstack.c stamp-h $(INCDIR)/obstack.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/obstack.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/obstack.c $(OUTPUT_OPTION) + +./partition.o: $(srcdir)/partition.c stamp-h $(INCDIR)/ansidecl.h \ + $(INCDIR)/libiberty.h $(INCDIR)/partition.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/partition.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/partition.c $(OUTPUT_OPTION) + +./pex-common.o: $(srcdir)/pex-common.c stamp-h $(INCDIR)/ansidecl.h \ + $(INCDIR)/libiberty.h $(srcdir)/pex-common.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/pex-common.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/pex-common.c $(OUTPUT_OPTION) + +./pex-djgpp.o: $(srcdir)/pex-djgpp.c stamp-h $(INCDIR)/ansidecl.h \ + $(INCDIR)/libiberty.h $(srcdir)/pex-common.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/pex-djgpp.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/pex-djgpp.c $(OUTPUT_OPTION) + +./pex-msdos.o: $(srcdir)/pex-msdos.c stamp-h $(INCDIR)/ansidecl.h \ + $(INCDIR)/libiberty.h $(srcdir)/pex-common.h \ + $(INCDIR)/safe-ctype.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/pex-msdos.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/pex-msdos.c $(OUTPUT_OPTION) + +./pex-one.o: $(srcdir)/pex-one.c stamp-h $(INCDIR)/ansidecl.h \ + $(INCDIR)/libiberty.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/pex-one.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/pex-one.c $(OUTPUT_OPTION) + +./pex-unix.o: $(srcdir)/pex-unix.c stamp-h $(INCDIR)/ansidecl.h \ + $(INCDIR)/libiberty.h $(srcdir)/pex-common.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/pex-unix.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/pex-unix.c $(OUTPUT_OPTION) + +./pex-win32.o: $(srcdir)/pex-win32.c stamp-h $(INCDIR)/ansidecl.h \ + $(INCDIR)/libiberty.h $(srcdir)/pex-common.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/pex-win32.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/pex-win32.c $(OUTPUT_OPTION) + +./pexecute.o: $(srcdir)/pexecute.c stamp-h $(INCDIR)/ansidecl.h \ + $(INCDIR)/libiberty.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/pexecute.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/pexecute.c $(OUTPUT_OPTION) + +./physmem.o: $(srcdir)/physmem.c stamp-h $(INCDIR)/ansidecl.h \ + $(INCDIR)/libiberty.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/physmem.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/physmem.c $(OUTPUT_OPTION) + +./putenv.o: $(srcdir)/putenv.c stamp-h $(INCDIR)/ansidecl.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/putenv.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/putenv.c $(OUTPUT_OPTION) + +./random.o: $(srcdir)/random.c $(INCDIR)/ansidecl.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/random.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/random.c $(OUTPUT_OPTION) + +./regex.o: $(srcdir)/regex.c stamp-h $(INCDIR)/ansidecl.h $(INCDIR)/xregex.h \ + $(INCDIR)/xregex2.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/regex.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/regex.c $(OUTPUT_OPTION) + +./rename.o: $(srcdir)/rename.c stamp-h $(INCDIR)/ansidecl.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/rename.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/rename.c $(OUTPUT_OPTION) + +./rindex.o: $(srcdir)/rindex.c + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/rindex.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/rindex.c $(OUTPUT_OPTION) + +./safe-ctype.o: $(srcdir)/safe-ctype.c $(INCDIR)/ansidecl.h \ + $(INCDIR)/safe-ctype.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/safe-ctype.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/safe-ctype.c $(OUTPUT_OPTION) + +./setenv.o: $(srcdir)/setenv.c stamp-h $(INCDIR)/ansidecl.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/setenv.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/setenv.c $(OUTPUT_OPTION) + +./sigsetmask.o: $(srcdir)/sigsetmask.c $(INCDIR)/ansidecl.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/sigsetmask.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/sigsetmask.c $(OUTPUT_OPTION) + +./snprintf.o: $(srcdir)/snprintf.c $(INCDIR)/ansidecl.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/snprintf.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/snprintf.c $(OUTPUT_OPTION) + +./sort.o: $(srcdir)/sort.c stamp-h $(INCDIR)/ansidecl.h $(INCDIR)/libiberty.h \ + $(INCDIR)/sort.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/sort.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/sort.c $(OUTPUT_OPTION) + +./spaces.o: $(srcdir)/spaces.c stamp-h $(INCDIR)/ansidecl.h $(INCDIR)/libiberty.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/spaces.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/spaces.c $(OUTPUT_OPTION) + +./splay-tree.o: $(srcdir)/splay-tree.c stamp-h $(INCDIR)/ansidecl.h \ + $(INCDIR)/libiberty.h $(INCDIR)/splay-tree.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/splay-tree.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/splay-tree.c $(OUTPUT_OPTION) + +./stpcpy.o: $(srcdir)/stpcpy.c $(INCDIR)/ansidecl.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/stpcpy.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/stpcpy.c $(OUTPUT_OPTION) + +./stpncpy.o: $(srcdir)/stpncpy.c $(INCDIR)/ansidecl.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/stpncpy.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/stpncpy.c $(OUTPUT_OPTION) + +./strcasecmp.o: $(srcdir)/strcasecmp.c $(INCDIR)/ansidecl.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/strcasecmp.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/strcasecmp.c $(OUTPUT_OPTION) + +./strchr.o: $(srcdir)/strchr.c $(INCDIR)/ansidecl.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/strchr.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/strchr.c $(OUTPUT_OPTION) + +./strdup.o: $(srcdir)/strdup.c $(INCDIR)/ansidecl.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/strdup.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/strdup.c $(OUTPUT_OPTION) + +./strerror.o: $(srcdir)/strerror.c stamp-h $(INCDIR)/ansidecl.h \ + $(INCDIR)/libiberty.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/strerror.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/strerror.c $(OUTPUT_OPTION) + +./strncasecmp.o: $(srcdir)/strncasecmp.c $(INCDIR)/ansidecl.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/strncasecmp.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/strncasecmp.c $(OUTPUT_OPTION) + +./strncmp.o: $(srcdir)/strncmp.c $(INCDIR)/ansidecl.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/strncmp.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/strncmp.c $(OUTPUT_OPTION) + +./strndup.o: $(srcdir)/strndup.c $(INCDIR)/ansidecl.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/strndup.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/strndup.c $(OUTPUT_OPTION) + +./strrchr.o: $(srcdir)/strrchr.c $(INCDIR)/ansidecl.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/strrchr.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/strrchr.c $(OUTPUT_OPTION) + +./strsignal.o: $(srcdir)/strsignal.c stamp-h $(INCDIR)/ansidecl.h \ + $(INCDIR)/libiberty.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/strsignal.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/strsignal.c $(OUTPUT_OPTION) + +./strstr.o: $(srcdir)/strstr.c + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/strstr.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/strstr.c $(OUTPUT_OPTION) + +./strtod.o: $(srcdir)/strtod.c $(INCDIR)/ansidecl.h $(INCDIR)/safe-ctype.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/strtod.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/strtod.c $(OUTPUT_OPTION) + +./strtol.o: $(srcdir)/strtol.c stamp-h $(INCDIR)/safe-ctype.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/strtol.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/strtol.c $(OUTPUT_OPTION) + +./strtoul.o: $(srcdir)/strtoul.c stamp-h $(INCDIR)/ansidecl.h \ + $(INCDIR)/safe-ctype.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/strtoul.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/strtoul.c $(OUTPUT_OPTION) + +./strverscmp.o: $(srcdir)/strverscmp.c $(INCDIR)/ansidecl.h $(INCDIR)/libiberty.h \ + $(INCDIR)/safe-ctype.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/strverscmp.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/strverscmp.c $(OUTPUT_OPTION) + +./tmpnam.o: $(srcdir)/tmpnam.c + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/tmpnam.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/tmpnam.c $(OUTPUT_OPTION) + +./unlink-if-ordinary.o: $(srcdir)/unlink-if-ordinary.c stamp-h \ + $(INCDIR)/ansidecl.h $(INCDIR)/libiberty.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/unlink-if-ordinary.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/unlink-if-ordinary.c $(OUTPUT_OPTION) + +./vasprintf.o: $(srcdir)/vasprintf.c stamp-h $(INCDIR)/ansidecl.h \ + $(INCDIR)/libiberty.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/vasprintf.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/vasprintf.c $(OUTPUT_OPTION) + +./vfork.o: $(srcdir)/vfork.c $(INCDIR)/ansidecl.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/vfork.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/vfork.c $(OUTPUT_OPTION) + +./vfprintf.o: $(srcdir)/vfprintf.c $(INCDIR)/ansidecl.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/vfprintf.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/vfprintf.c $(OUTPUT_OPTION) + +./vprintf.o: $(srcdir)/vprintf.c $(INCDIR)/ansidecl.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/vprintf.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/vprintf.c $(OUTPUT_OPTION) + +./vsnprintf.o: $(srcdir)/vsnprintf.c stamp-h $(INCDIR)/ansidecl.h \ + $(INCDIR)/libiberty.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/vsnprintf.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/vsnprintf.c $(OUTPUT_OPTION) + +./vsprintf.o: $(srcdir)/vsprintf.c $(INCDIR)/ansidecl.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/vsprintf.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/vsprintf.c $(OUTPUT_OPTION) + +./waitpid.o: $(srcdir)/waitpid.c stamp-h $(INCDIR)/ansidecl.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/waitpid.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/waitpid.c $(OUTPUT_OPTION) + +./xatexit.o: $(srcdir)/xatexit.c stamp-h $(INCDIR)/ansidecl.h \ + $(INCDIR)/libiberty.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/xatexit.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/xatexit.c $(OUTPUT_OPTION) + +./xexit.o: $(srcdir)/xexit.c stamp-h $(INCDIR)/ansidecl.h $(INCDIR)/libiberty.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/xexit.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/xexit.c $(OUTPUT_OPTION) + +./xmalloc.o: $(srcdir)/xmalloc.c stamp-h $(INCDIR)/ansidecl.h \ + $(INCDIR)/libiberty.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/xmalloc.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/xmalloc.c $(OUTPUT_OPTION) + +./xmemdup.o: $(srcdir)/xmemdup.c stamp-h $(INCDIR)/ansidecl.h \ + $(INCDIR)/libiberty.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/xmemdup.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/xmemdup.c $(OUTPUT_OPTION) + +./xstrdup.o: $(srcdir)/xstrdup.c stamp-h $(INCDIR)/ansidecl.h \ + $(INCDIR)/libiberty.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/xstrdup.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/xstrdup.c $(OUTPUT_OPTION) + +./xstrerror.o: $(srcdir)/xstrerror.c stamp-h $(INCDIR)/ansidecl.h \ + $(INCDIR)/libiberty.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/xstrerror.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/xstrerror.c $(OUTPUT_OPTION) + +./xstrndup.o: $(srcdir)/xstrndup.c stamp-h $(INCDIR)/ansidecl.h \ + $(INCDIR)/libiberty.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/xstrndup.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/xstrndup.c $(OUTPUT_OPTION) + diff --git a/libiberty/README b/libiberty/README new file mode 100644 index 0000000..886bd67 --- /dev/null +++ b/libiberty/README @@ -0,0 +1,66 @@ +This directory contains the -liberty library of free software. +It is a collection of subroutines used by various GNU programs. +Current members include: + + getopt -- get options from command line + obstack -- stacks of arbitrarily-sized objects + strerror -- error message strings corresponding to errno + strtol -- string-to-long conversion + strtoul -- string-to-unsigned-long conversion + +We expect many of the GNU subroutines that are floating around to +eventually arrive here. + +The library must be configured from the top source directory. Don't +try to run configure in this directory. Follow the configuration +instructions in ../README. + +Please report bugs to "gcc-bugs@gcc.gnu.org" and send fixes to +"gcc-patches@gcc.gnu.org". Thank you. + +ADDING A NEW FILE +================= + +There are two sets of files: Those that are "required" will be +included in the library for all configurations, while those +that are "optional" will be included in the library only if "needed." + +To add a new required file, edit Makefile to add the source file +name to CFILES and the object file to REQUIRED_OFILES. + +To add a new optional file, it must provide a single function, and the +name of the function must be the same as the name of the file. + + * Add the source file name to CFILES. + + * Add the function to name to the funcs shell variable in + configure.ac. + + * Add the function to the AC_CHECK_FUNCS lists just after the + setting of the funcs shell variable. These AC_CHECK_FUNCS calls + are never executed; they are there to make autoheader work + better. + + * Consider the special cases of building libiberty; as of this + writing, the special cases are newlib and VxWorks. If a + particular special case provides the function, you do not need + to do anything. If it does not provide the function, add the + object file to LIBOBJS, and add the function name to the case + controlling whether to define HAVE_func. + +The optional file you've added (e.g. getcwd.c) should compile and work +on all hosts where it is needed. It does not have to work or even +compile on hosts where it is not needed. + +ADDING A NEW CONFIGURATION +========================== + +On most hosts you should be able to use the scheme for automatically +figuring out which files are needed. In that case, you probably +don't need a special Makefile stub for that configuration. + +If the fully automatic scheme doesn't work, you may be able to get +by with defining EXTRA_OFILES in your Makefile stub. This is +a list of object file names that should be treated as required +for this configuration - they will be included in libiberty.a, +regardless of whatever might be in the C library. diff --git a/libiberty/_doprnt.c b/libiberty/_doprnt.c new file mode 100644 index 0000000..ca97bc8 --- /dev/null +++ b/libiberty/_doprnt.c @@ -0,0 +1,296 @@ +/* Provide a version of _doprnt in terms of fprintf. + Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. + Contributed by Kaveh Ghazi (ghazi@caip.rutgers.edu) 3/29/98 + +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, 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include "config.h" +#include "ansidecl.h" +#include "safe-ctype.h" + +#include +#include +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif + +#undef _doprnt + +#ifdef HAVE__DOPRNT +#define TEST +#endif + +#ifdef TEST /* Make sure to use the internal one. */ +#define _doprnt my_doprnt +#endif + +#define COPY_VA_INT \ + do { \ + const int value = abs (va_arg (ap, int)); \ + char buf[32]; \ + ptr++; /* Go past the asterisk. */ \ + *sptr = '\0'; /* NULL terminate sptr. */ \ + sprintf(buf, "%d", value); \ + strcat(sptr, buf); \ + while (*sptr) sptr++; \ + } while (0) + +#define PRINT_CHAR(CHAR) \ + do { \ + putc(CHAR, stream); \ + ptr++; \ + total_printed++; \ + continue; \ + } while (0) + +#define PRINT_TYPE(TYPE) \ + do { \ + int result; \ + TYPE value = va_arg (ap, TYPE); \ + *sptr++ = *ptr++; /* Copy the type specifier. */ \ + *sptr = '\0'; /* NULL terminate sptr. */ \ + result = fprintf(stream, specifier, value); \ + if (result == -1) \ + return -1; \ + else \ + { \ + total_printed += result; \ + continue; \ + } \ + } while (0) + +int +_doprnt (const char *format, va_list ap, FILE *stream) +{ + const char * ptr = format; + char specifier[128]; + int total_printed = 0; + + while (*ptr != '\0') + { + if (*ptr != '%') /* While we have regular characters, print them. */ + PRINT_CHAR(*ptr); + else /* We got a format specifier! */ + { + char * sptr = specifier; + int wide_width = 0, short_width = 0; + + *sptr++ = *ptr++; /* Copy the % and move forward. */ + + while (strchr ("-+ #0", *ptr)) /* Move past flags. */ + *sptr++ = *ptr++; + + if (*ptr == '*') + COPY_VA_INT; + else + while (ISDIGIT(*ptr)) /* Handle explicit numeric value. */ + *sptr++ = *ptr++; + + if (*ptr == '.') + { + *sptr++ = *ptr++; /* Copy and go past the period. */ + if (*ptr == '*') + COPY_VA_INT; + else + while (ISDIGIT(*ptr)) /* Handle explicit numeric value. */ + *sptr++ = *ptr++; + } + while (strchr ("hlL", *ptr)) + { + switch (*ptr) + { + case 'h': + short_width = 1; + break; + case 'l': + wide_width++; + break; + case 'L': + wide_width = 2; + break; + default: + abort(); + } + *sptr++ = *ptr++; + } + + switch (*ptr) + { + case 'd': + case 'i': + case 'o': + case 'u': + case 'x': + case 'X': + case 'c': + { + /* Short values are promoted to int, so just copy it + as an int and trust the C library printf to cast it + to the right width. */ + if (short_width) + PRINT_TYPE(int); + else + { + switch (wide_width) + { + case 0: + PRINT_TYPE(int); + break; + case 1: + PRINT_TYPE(long); + break; + case 2: + default: +#if defined(__GNUC__) || defined(HAVE_LONG_LONG) + PRINT_TYPE(long long); +#else + PRINT_TYPE(long); /* Fake it and hope for the best. */ +#endif + break; + } /* End of switch (wide_width) */ + } /* End of else statement */ + } /* End of integer case */ + break; + case 'f': + case 'e': + case 'E': + case 'g': + case 'G': + { + if (wide_width == 0) + PRINT_TYPE(double); + else + { +#if defined(__GNUC__) || defined(HAVE_LONG_DOUBLE) + PRINT_TYPE(long double); +#else + PRINT_TYPE(double); /* Fake it and hope for the best. */ +#endif + } + } + break; + case 's': + PRINT_TYPE(char *); + break; + case 'p': + PRINT_TYPE(void *); + break; + case '%': + PRINT_CHAR('%'); + break; + default: + abort(); + } /* End of switch (*ptr) */ + } /* End of else statement */ + } + + return total_printed; +} + +#ifdef TEST + +#include +#ifndef M_PI +#define M_PI (3.1415926535897932385) +#endif + +#define RESULT(x) do \ +{ \ + int i = (x); \ + printf ("printed %d characters\n", i); \ + fflush(stdin); \ +} while (0) + +static int checkit (const char * format, ...) ATTRIBUTE_PRINTF_1; + +static int +checkit (const char* format, ...) +{ + int result; + VA_OPEN (args, format); + VA_FIXEDARG (args, char *, format); + + result = _doprnt (format, args, stdout); + VA_CLOSE (args); + + return result; +} + +int +main (void) +{ + RESULT(checkit ("<%d>\n", 0x12345678)); + RESULT(printf ("<%d>\n", 0x12345678)); + + RESULT(checkit ("<%200d>\n", 5)); + RESULT(printf ("<%200d>\n", 5)); + + RESULT(checkit ("<%.300d>\n", 6)); + RESULT(printf ("<%.300d>\n", 6)); + + RESULT(checkit ("<%100.150d>\n", 7)); + RESULT(printf ("<%100.150d>\n", 7)); + + RESULT(checkit ("<%s>\n", + "jjjjjjjjjiiiiiiiiiiiiiiioooooooooooooooooppppppppppppaa\n\ +777777777777777777333333333333366666666666622222222222777777777777733333")); + RESULT(printf ("<%s>\n", + "jjjjjjjjjiiiiiiiiiiiiiiioooooooooooooooooppppppppppppaa\n\ +777777777777777777333333333333366666666666622222222222777777777777733333")); + + RESULT(checkit ("<%f><%0+#f>%s%d%s>\n", + 1.0, 1.0, "foo", 77, "asdjffffffffffffffiiiiiiiiiiixxxxx")); + RESULT(printf ("<%f><%0+#f>%s%d%s>\n", + 1.0, 1.0, "foo", 77, "asdjffffffffffffffiiiiiiiiiiixxxxx")); + + RESULT(checkit ("<%4f><%.4f><%%><%4.4f>\n", M_PI, M_PI, M_PI)); + RESULT(printf ("<%4f><%.4f><%%><%4.4f>\n", M_PI, M_PI, M_PI)); + + RESULT(checkit ("<%*f><%.*f><%%><%*.*f>\n", 3, M_PI, 3, M_PI, 3, 3, M_PI)); + RESULT(printf ("<%*f><%.*f><%%><%*.*f>\n", 3, M_PI, 3, M_PI, 3, 3, M_PI)); + + RESULT(checkit ("<%d><%i><%o><%u><%x><%X><%c>\n", + 75, 75, 75, 75, 75, 75, 75)); + RESULT(printf ("<%d><%i><%o><%u><%x><%X><%c>\n", + 75, 75, 75, 75, 75, 75, 75)); + + RESULT(checkit ("<%d><%i><%o><%u><%x><%X><%c>\n", + 75, 75, 75, 75, 75, 75, 75)); + RESULT(printf ("<%d><%i><%o><%u><%x><%X><%c>\n", + 75, 75, 75, 75, 75, 75, 75)); + + RESULT(checkit ("Testing (hd) short: <%d><%ld><%hd><%hd><%d>\n", 123, (long)234, 345, 123456789, 456)); + RESULT(printf ("Testing (hd) short: <%d><%ld><%hd><%hd><%d>\n", 123, (long)234, 345, 123456789, 456)); + +#if defined(__GNUC__) || defined (HAVE_LONG_LONG) + RESULT(checkit ("Testing (lld) long long: <%d><%lld><%d>\n", 123, 234234234234234234LL, 345)); + RESULT(printf ("Testing (lld) long long: <%d><%lld><%d>\n", 123, 234234234234234234LL, 345)); + RESULT(checkit ("Testing (Ld) long long: <%d><%Ld><%d>\n", 123, 234234234234234234LL, 345)); + RESULT(printf ("Testing (Ld) long long: <%d><%Ld><%d>\n", 123, 234234234234234234LL, 345)); +#endif + +#if defined(__GNUC__) || defined (HAVE_LONG_DOUBLE) + RESULT(checkit ("Testing (Lf) long double: <%.20f><%.20Lf><%0+#.20f>\n", + 1.23456, 1.234567890123456789L, 1.23456)); + RESULT(printf ("Testing (Lf) long double: <%.20f><%.20Lf><%0+#.20f>\n", + 1.23456, 1.234567890123456789L, 1.23456)); +#endif + + return 0; +} +#endif /* TEST */ diff --git a/libiberty/aclocal.m4 b/libiberty/aclocal.m4 new file mode 100644 index 0000000..06cf3f9 --- /dev/null +++ b/libiberty/aclocal.m4 @@ -0,0 +1,222 @@ +sinclude(../config-aux/acx.m4) +sinclude(../config-aux/no-executables.m4) +sinclude(../config-aux/warnings.m4) + +dnl See whether strncmp reads past the end of its string parameters. +dnl On some versions of SunOS4 at least, strncmp reads a word at a time +dnl but erroneously reads past the end of strings. This can cause +dnl a SEGV in some cases. +AC_DEFUN(libiberty_AC_FUNC_STRNCMP, +[AC_REQUIRE([AC_FUNC_MMAP]) +AC_CACHE_CHECK([for working strncmp], ac_cv_func_strncmp_works, +[AC_TRY_RUN([ +/* Test by Jim Wilson and Kaveh Ghazi. + Check whether strncmp reads past the end of its string parameters. */ +#include + +#ifdef HAVE_FCNTL_H +#include +#endif + +#ifdef HAVE_SYS_MMAN_H +#include +#endif + +#ifndef MAP_ANON +#ifdef MAP_ANONYMOUS +#define MAP_ANON MAP_ANONYMOUS +#else +#define MAP_ANON MAP_FILE +#endif +#endif + +#ifndef MAP_FILE +#define MAP_FILE 0 +#endif +#ifndef O_RDONLY +#define O_RDONLY 0 +#endif + +#define MAP_LEN 0x10000 + +main () +{ +#if defined(HAVE_MMAP) || defined(HAVE_MMAP_ANYWHERE) + char *p; + int dev_zero; + + dev_zero = open ("/dev/zero", O_RDONLY); + if (dev_zero < 0) + exit (1); + + p = (char *) mmap (0, MAP_LEN, PROT_READ|PROT_WRITE, + MAP_ANON|MAP_PRIVATE, dev_zero, 0); + if (p == (char *)-1) + p = (char *) mmap (0, MAP_LEN, PROT_READ|PROT_WRITE, + MAP_ANON|MAP_PRIVATE, -1, 0); + if (p == (char *)-1) + exit (2); + else + { + char *string = "__si_type_info"; + char *q = (char *) p + MAP_LEN - strlen (string) - 2; + char *r = (char *) p + 0xe; + + strcpy (q, string); + strcpy (r, string); + strncmp (r, q, 14); + } +#endif /* HAVE_MMAP || HAVE_MMAP_ANYWHERE */ + exit (0); +} +], ac_cv_func_strncmp_works=yes, ac_cv_func_strncmp_works=no, + ac_cv_func_strncmp_works=no) +rm -f core core.* *.core]) +if test $ac_cv_func_strncmp_works = no ; then + AC_LIBOBJ([strncmp]) +fi +]) + +dnl See if errno must be declared even when is included. +AC_DEFUN(libiberty_AC_DECLARE_ERRNO, +[AC_CACHE_CHECK(whether errno must be declared, libiberty_cv_declare_errno, +[AC_TRY_COMPILE( +[#include ], +[int x = errno;], +libiberty_cv_declare_errno=no, +libiberty_cv_declare_errno=yes)]) +if test $libiberty_cv_declare_errno = yes +then AC_DEFINE(NEED_DECLARATION_ERRNO, 1, + [Define if errno must be declared even when is included.]) +fi +]) + +dnl See whether we need a declaration for a function. +AC_DEFUN(libiberty_NEED_DECLARATION, +[AC_MSG_CHECKING([whether $1 must be declared]) +AC_CACHE_VAL(libiberty_cv_decl_needed_$1, +[AC_TRY_COMPILE([ +#include "confdefs.h" +#include +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif], +[char *(*pfn) = (char *(*)) $1], +libiberty_cv_decl_needed_$1=no, libiberty_cv_decl_needed_$1=yes)]) +AC_MSG_RESULT($libiberty_cv_decl_needed_$1) +if test $libiberty_cv_decl_needed_$1 = yes; then + AC_DEFINE([NEED_DECLARATION_]translit($1, [a-z], [A-Z]), 1, + [Define if $1 is not declared in system header files.]) +fi +])dnl + +# We always want a C version of alloca() compiled into libiberty, +# because native-compiler support for the real alloca is so !@#$% +# unreliable that GCC has decided to use it only when being compiled +# by GCC. This is the part of AC_FUNC_ALLOCA that calculates the +# information alloca.c needs. +AC_DEFUN(libiberty_AC_FUNC_C_ALLOCA, +[AC_CACHE_CHECK(whether alloca needs Cray hooks, ac_cv_os_cray, +[AC_EGREP_CPP(webecray, +[#if defined(CRAY) && ! defined(CRAY2) +webecray +#else +wenotbecray +#endif +], ac_cv_os_cray=yes, ac_cv_os_cray=no)]) +if test $ac_cv_os_cray = yes; then + for ac_func in _getb67 GETB67 getb67; do + AC_CHECK_FUNC($ac_func, + [AC_DEFINE_UNQUOTED(CRAY_STACKSEG_END, $ac_func, + [Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP + systems. This function is required for alloca.c support on those + systems.]) break]) + done +fi + +AC_CACHE_CHECK(stack direction for C alloca, ac_cv_c_stack_direction, +[AC_TRY_RUN([find_stack_direction () +{ + static char *addr = 0; + auto char dummy; + if (addr == 0) + { + addr = &dummy; + return find_stack_direction (); + } + else + return (&dummy > addr) ? 1 : -1; +} +main () +{ + exit (find_stack_direction() < 0); +}], + ac_cv_c_stack_direction=1, + ac_cv_c_stack_direction=-1, + ac_cv_c_stack_direction=0)]) +AC_DEFINE_UNQUOTED(STACK_DIRECTION, $ac_cv_c_stack_direction, + [Define if you know the direction of stack growth for your system; + otherwise it will be automatically deduced at run-time. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown]) +]) + +# AC_LANG_FUNC_LINK_TRY(C)(FUNCTION) +# ---------------------------------- +# Don't include because on OSF/1 3.0 it includes +# which includes which contains a +# prototype for select. Similarly for bzero. +# +# This test used to merely assign f=$1 in main(), but that was +# optimized away by HP unbundled cc A.05.36 for ia64 under +O3, +# presumably on the basis that there's no need to do that store if the +# program is about to exit. Conversely, the AIX linker optimizes an +# unused external declaration that initializes f=$1. So this test +# program has both an external initialization of f, and a use of f in +# main that affects the exit status. +# +m4_define([AC_LANG_FUNC_LINK_TRY(C)], +[AC_LANG_PROGRAM( +[/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $1 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. Under hpux, + including includes and causes problems + checking for functions defined therein. */ +#if defined (__STDC__) && !defined (_HPUX_SOURCE) +# include +#else +# include +#endif +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $1 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$1) || defined (__stub___$1) +choke me +#else +char (*f) () = $1; +#endif +#ifdef __cplusplus +} +#endif +], [return f != $1;])]) + diff --git a/libiberty/alloca.c b/libiberty/alloca.c new file mode 100644 index 0000000..9b2e9cb --- /dev/null +++ b/libiberty/alloca.c @@ -0,0 +1,483 @@ +/* alloca.c -- allocate automatically reclaimed memory + (Mostly) portable public-domain implementation -- D A Gwyn + + This implementation of the PWB library alloca function, + which is used to allocate space off the run-time stack so + that it is automatically reclaimed upon procedure exit, + was inspired by discussions with J. Q. Johnson of Cornell. + J.Otto Tennant contributed the Cray support. + + There are some preprocessor constants that can + be defined when compiling for your specific system, for + improved efficiency; however, the defaults should be okay. + + The general concept of this implementation is to keep + track of all alloca-allocated blocks, and reclaim any + that are found to be deeper in the stack than the current + invocation. This heuristic does not reclaim storage as + soon as it becomes invalid, but it will do so eventually. + + As a special case, alloca(0) reclaims storage without + allocating any. It is a good idea to use alloca(0) in + your main control loop, etc. to force garbage collection. */ + +/* + +@deftypefn Replacement void* alloca (size_t @var{size}) + +This function allocates memory which will be automatically reclaimed +after the procedure exits. The @libib{} implementation does not free +the memory immediately but will do so eventually during subsequent +calls to this function. Memory is allocated using @code{xmalloc} under +normal circumstances. + +The header file @file{alloca-conf.h} can be used in conjunction with the +GNU Autoconf test @code{AC_FUNC_ALLOCA} to test for and properly make +available this function. The @code{AC_FUNC_ALLOCA} test requires that +client code use a block of preprocessor code to be safe (see the Autoconf +manual for more); this header incorporates that logic and more, including +the possibility of a GCC built-in function. + +@end deftypefn + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif + +/* These variables are used by the ASTRDUP implementation that relies + on C_alloca. */ +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ +const char *libiberty_optr; +char *libiberty_nptr; +unsigned long libiberty_len; +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +/* If your stack is a linked list of frames, you have to + provide an "address metric" ADDRESS_FUNCTION macro. */ + +#if defined (CRAY) && defined (CRAY_STACKSEG_END) +static long i00afunc (); +#define ADDRESS_FUNCTION(arg) (char *) i00afunc (&(arg)) +#else +#define ADDRESS_FUNCTION(arg) &(arg) +#endif + +#ifndef NULL +#define NULL 0 +#endif + +/* Define STACK_DIRECTION if you know the direction of stack + growth for your system; otherwise it will be automatically + deduced at run-time. + + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ + +#ifndef STACK_DIRECTION +#define STACK_DIRECTION 0 /* Direction unknown. */ +#endif + +#if STACK_DIRECTION != 0 + +#define STACK_DIR STACK_DIRECTION /* Known at compile-time. */ + +#else /* STACK_DIRECTION == 0; need run-time code. */ + +static int stack_dir; /* 1 or -1 once known. */ +#define STACK_DIR stack_dir + +static void +find_stack_direction (void) +{ + static char *addr = NULL; /* Address of first `dummy', once known. */ + auto char dummy; /* To get stack address. */ + + if (addr == NULL) + { /* Initial entry. */ + addr = ADDRESS_FUNCTION (dummy); + + find_stack_direction (); /* Recurse once. */ + } + else + { + /* Second entry. */ + if (ADDRESS_FUNCTION (dummy) > addr) + stack_dir = 1; /* Stack grew upward. */ + else + stack_dir = -1; /* Stack grew downward. */ + } +} + +#endif /* STACK_DIRECTION == 0 */ + +/* An "alloca header" is used to: + (a) chain together all alloca'ed blocks; + (b) keep track of stack depth. + + It is very important that sizeof(header) agree with malloc + alignment chunk size. The following default should work okay. */ + +#ifndef ALIGN_SIZE +#define ALIGN_SIZE sizeof(double) +#endif + +typedef union hdr +{ + char align[ALIGN_SIZE]; /* To force sizeof(header). */ + struct + { + union hdr *next; /* For chaining headers. */ + char *deep; /* For stack depth measure. */ + } h; +} header; + +static header *last_alloca_header = NULL; /* -> last alloca header. */ + +/* Return a pointer to at least SIZE bytes of storage, + which will be automatically reclaimed upon exit from + the procedure that called alloca. Originally, this space + was supposed to be taken from the current stack frame of the + caller, but that method cannot be made to work for some + implementations of C, for example under Gould's UTX/32. */ + +/* @undocumented C_alloca */ + +PTR +C_alloca (size_t size) +{ + auto char probe; /* Probes stack depth: */ + register char *depth = ADDRESS_FUNCTION (probe); + +#if STACK_DIRECTION == 0 + if (STACK_DIR == 0) /* Unknown growth direction. */ + find_stack_direction (); +#endif + + /* Reclaim garbage, defined as all alloca'd storage that + was allocated from deeper in the stack than currently. */ + + { + register header *hp; /* Traverses linked list. */ + + for (hp = last_alloca_header; hp != NULL;) + if ((STACK_DIR > 0 && hp->h.deep > depth) + || (STACK_DIR < 0 && hp->h.deep < depth)) + { + register header *np = hp->h.next; + + free ((PTR) hp); /* Collect garbage. */ + + hp = np; /* -> next header. */ + } + else + break; /* Rest are not deeper. */ + + last_alloca_header = hp; /* -> last valid storage. */ + } + + if (size == 0) + return NULL; /* No allocation required. */ + + /* Allocate combined header + user data storage. */ + + { + register void *new_storage = XNEWVEC (char, sizeof (header) + size); + /* Address of header. */ + + if (new_storage == 0) + abort(); + + ((header *) new_storage)->h.next = last_alloca_header; + ((header *) new_storage)->h.deep = depth; + + last_alloca_header = (header *) new_storage; + + /* User storage begins just after header. */ + + return (PTR) ((char *) new_storage + sizeof (header)); + } +} + +#if defined (CRAY) && defined (CRAY_STACKSEG_END) + +#ifdef DEBUG_I00AFUNC +#include +#endif + +#ifndef CRAY_STACK +#define CRAY_STACK +#ifndef CRAY2 +/* Stack structures for CRAY-1, CRAY X-MP, and CRAY Y-MP */ +struct stack_control_header + { + long shgrow:32; /* Number of times stack has grown. */ + long shaseg:32; /* Size of increments to stack. */ + long shhwm:32; /* High water mark of stack. */ + long shsize:32; /* Current size of stack (all segments). */ + }; + +/* The stack segment linkage control information occurs at + the high-address end of a stack segment. (The stack + grows from low addresses to high addresses.) The initial + part of the stack segment linkage control information is + 0200 (octal) words. This provides for register storage + for the routine which overflows the stack. */ + +struct stack_segment_linkage + { + long ss[0200]; /* 0200 overflow words. */ + long sssize:32; /* Number of words in this segment. */ + long ssbase:32; /* Offset to stack base. */ + long:32; + long sspseg:32; /* Offset to linkage control of previous + segment of stack. */ + long:32; + long sstcpt:32; /* Pointer to task common address block. */ + long sscsnm; /* Private control structure number for + microtasking. */ + long ssusr1; /* Reserved for user. */ + long ssusr2; /* Reserved for user. */ + long sstpid; /* Process ID for pid based multi-tasking. */ + long ssgvup; /* Pointer to multitasking thread giveup. */ + long sscray[7]; /* Reserved for Cray Research. */ + long ssa0; + long ssa1; + long ssa2; + long ssa3; + long ssa4; + long ssa5; + long ssa6; + long ssa7; + long sss0; + long sss1; + long sss2; + long sss3; + long sss4; + long sss5; + long sss6; + long sss7; + }; + +#else /* CRAY2 */ +/* The following structure defines the vector of words + returned by the STKSTAT library routine. */ +struct stk_stat + { + long now; /* Current total stack size. */ + long maxc; /* Amount of contiguous space which would + be required to satisfy the maximum + stack demand to date. */ + long high_water; /* Stack high-water mark. */ + long overflows; /* Number of stack overflow ($STKOFEN) calls. */ + long hits; /* Number of internal buffer hits. */ + long extends; /* Number of block extensions. */ + long stko_mallocs; /* Block allocations by $STKOFEN. */ + long underflows; /* Number of stack underflow calls ($STKRETN). */ + long stko_free; /* Number of deallocations by $STKRETN. */ + long stkm_free; /* Number of deallocations by $STKMRET. */ + long segments; /* Current number of stack segments. */ + long maxs; /* Maximum number of stack segments so far. */ + long pad_size; /* Stack pad size. */ + long current_address; /* Current stack segment address. */ + long current_size; /* Current stack segment size. This + number is actually corrupted by STKSTAT to + include the fifteen word trailer area. */ + long initial_address; /* Address of initial segment. */ + long initial_size; /* Size of initial segment. */ + }; + +/* The following structure describes the data structure which trails + any stack segment. I think that the description in 'asdef' is + out of date. I only describe the parts that I am sure about. */ + +struct stk_trailer + { + long this_address; /* Address of this block. */ + long this_size; /* Size of this block (does not include + this trailer). */ + long unknown2; + long unknown3; + long link; /* Address of trailer block of previous + segment. */ + long unknown5; + long unknown6; + long unknown7; + long unknown8; + long unknown9; + long unknown10; + long unknown11; + long unknown12; + long unknown13; + long unknown14; + }; + +#endif /* CRAY2 */ +#endif /* not CRAY_STACK */ + +#ifdef CRAY2 +/* Determine a "stack measure" for an arbitrary ADDRESS. + I doubt that "lint" will like this much. */ + +static long +i00afunc (long *address) +{ + struct stk_stat status; + struct stk_trailer *trailer; + long *block, size; + long result = 0; + + /* We want to iterate through all of the segments. The first + step is to get the stack status structure. We could do this + more quickly and more directly, perhaps, by referencing the + $LM00 common block, but I know that this works. */ + + STKSTAT (&status); + + /* Set up the iteration. */ + + trailer = (struct stk_trailer *) (status.current_address + + status.current_size + - 15); + + /* There must be at least one stack segment. Therefore it is + a fatal error if "trailer" is null. */ + + if (trailer == 0) + abort (); + + /* Discard segments that do not contain our argument address. */ + + while (trailer != 0) + { + block = (long *) trailer->this_address; + size = trailer->this_size; + if (block == 0 || size == 0) + abort (); + trailer = (struct stk_trailer *) trailer->link; + if ((block <= address) && (address < (block + size))) + break; + } + + /* Set the result to the offset in this segment and add the sizes + of all predecessor segments. */ + + result = address - block; + + if (trailer == 0) + { + return result; + } + + do + { + if (trailer->this_size <= 0) + abort (); + result += trailer->this_size; + trailer = (struct stk_trailer *) trailer->link; + } + while (trailer != 0); + + /* We are done. Note that if you present a bogus address (one + not in any segment), you will get a different number back, formed + from subtracting the address of the first block. This is probably + not what you want. */ + + return (result); +} + +#else /* not CRAY2 */ +/* Stack address function for a CRAY-1, CRAY X-MP, or CRAY Y-MP. + Determine the number of the cell within the stack, + given the address of the cell. The purpose of this + routine is to linearize, in some sense, stack addresses + for alloca. */ + +static long +i00afunc (long address) +{ + long stkl = 0; + + long size, pseg, this_segment, stack; + long result = 0; + + struct stack_segment_linkage *ssptr; + + /* Register B67 contains the address of the end of the + current stack segment. If you (as a subprogram) store + your registers on the stack and find that you are past + the contents of B67, you have overflowed the segment. + + B67 also points to the stack segment linkage control + area, which is what we are really interested in. */ + + stkl = CRAY_STACKSEG_END (); + ssptr = (struct stack_segment_linkage *) stkl; + + /* If one subtracts 'size' from the end of the segment, + one has the address of the first word of the segment. + + If this is not the first segment, 'pseg' will be + nonzero. */ + + pseg = ssptr->sspseg; + size = ssptr->sssize; + + this_segment = stkl - size; + + /* It is possible that calling this routine itself caused + a stack overflow. Discard stack segments which do not + contain the target address. */ + + while (!(this_segment <= address && address <= stkl)) + { +#ifdef DEBUG_I00AFUNC + fprintf (stderr, "%011o %011o %011o\n", this_segment, address, stkl); +#endif + if (pseg == 0) + break; + stkl = stkl - pseg; + ssptr = (struct stack_segment_linkage *) stkl; + size = ssptr->sssize; + pseg = ssptr->sspseg; + this_segment = stkl - size; + } + + result = address - this_segment; + + /* If you subtract pseg from the current end of the stack, + you get the address of the previous stack segment's end. + This seems a little convoluted to me, but I'll bet you save + a cycle somewhere. */ + + while (pseg != 0) + { +#ifdef DEBUG_I00AFUNC + fprintf (stderr, "%011o %011o\n", pseg, size); +#endif + stkl = stkl - pseg; + ssptr = (struct stack_segment_linkage *) stkl; + size = ssptr->sssize; + pseg = ssptr->sspseg; + result += size; + } + return (result); +} + +#endif /* not CRAY2 */ +#endif /* CRAY */ diff --git a/libiberty/argv.c b/libiberty/argv.c new file mode 100644 index 0000000..38bd449 --- /dev/null +++ b/libiberty/argv.c @@ -0,0 +1,513 @@ +/* Create and destroy argument vectors (argv's) + Copyright (C) 1992, 2001 Free Software Foundation, Inc. + Written by Fred Fish @ Cygnus Support + +This file is part of the libiberty library. +Libiberty is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +Libiberty 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with libiberty; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + + +/* Create and destroy argument vectors. An argument vector is simply an + array of string pointers, terminated by a NULL pointer. */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include "ansidecl.h" +#include "libiberty.h" +#include "safe-ctype.h" + +/* Routines imported from standard C runtime libraries. */ + +#include +#include +#include +#include + +#ifndef NULL +#define NULL 0 +#endif + +#ifndef EOS +#define EOS '\0' +#endif + +#define INITIAL_MAXARGC 8 /* Number of args + NULL in initial argv */ + + +/* + +@deftypefn Extension char** dupargv (char **@var{vector}) + +Duplicate an argument vector. Simply scans through @var{vector}, +duplicating each argument until the terminating @code{NULL} is found. +Returns a pointer to the argument vector if successful. Returns +@code{NULL} if there is insufficient memory to complete building the +argument vector. + +@end deftypefn + +*/ + +char ** +dupargv (char **argv) +{ + int argc; + char **copy; + + if (argv == NULL) + return NULL; + + /* the vector */ + for (argc = 0; argv[argc] != NULL; argc++); + copy = (char **) malloc ((argc + 1) * sizeof (char *)); + if (copy == NULL) + return NULL; + + /* the strings */ + for (argc = 0; argv[argc] != NULL; argc++) + { + int len = strlen (argv[argc]); + copy[argc] = (char *) malloc (len + 1); + if (copy[argc] == NULL) + { + freeargv (copy); + return NULL; + } + strcpy (copy[argc], argv[argc]); + } + copy[argc] = NULL; + return copy; +} + +/* + +@deftypefn Extension void freeargv (char **@var{vector}) + +Free an argument vector that was built using @code{buildargv}. Simply +scans through @var{vector}, freeing the memory for each argument until +the terminating @code{NULL} is found, and then frees @var{vector} +itself. + +@end deftypefn + +*/ + +void freeargv (char **vector) +{ + register char **scan; + + if (vector != NULL) + { + for (scan = vector; *scan != NULL; scan++) + { + free (*scan); + } + free (vector); + } +} + +/* + +@deftypefn Extension char** buildargv (char *@var{sp}) + +Given a pointer to a string, parse the string extracting fields +separated by whitespace and optionally enclosed within either single +or double quotes (which are stripped off), and build a vector of +pointers to copies of the string for each field. The input string +remains unchanged. The last element of the vector is followed by a +@code{NULL} element. + +All of the memory for the pointer array and copies of the string +is obtained from @code{malloc}. All of the memory can be returned to the +system with the single function call @code{freeargv}, which takes the +returned result of @code{buildargv}, as it's argument. + +Returns a pointer to the argument vector if successful. Returns +@code{NULL} if @var{sp} is @code{NULL} or if there is insufficient +memory to complete building the argument vector. + +If the input is a null string (as opposed to a @code{NULL} pointer), +then buildarg returns an argument vector that has one arg, a null +string. + +@end deftypefn + +The memory for the argv array is dynamically expanded as necessary. + +In order to provide a working buffer for extracting arguments into, +with appropriate stripping of quotes and translation of backslash +sequences, we allocate a working buffer at least as long as the input +string. This ensures that we always have enough space in which to +work, since the extracted arg is never larger than the input string. + +The argument vector is always kept terminated with a @code{NULL} arg +pointer, so it can be passed to @code{freeargv} at any time, or +returned, as appropriate. + +*/ + +char **buildargv (const char *input) +{ + char *arg; + char *copybuf; + int squote = 0; + int dquote = 0; + int bsquote = 0; + int argc = 0; + int maxargc = 0; + char **argv = NULL; + char **nargv; + + if (input != NULL) + { + copybuf = (char *) alloca (strlen (input) + 1); + /* Is a do{}while to always execute the loop once. Always return an + argv, even for null strings. See NOTES above, test case below. */ + do + { + /* Pick off argv[argc] */ + while (ISBLANK (*input)) + { + input++; + } + if ((maxargc == 0) || (argc >= (maxargc - 1))) + { + /* argv needs initialization, or expansion */ + if (argv == NULL) + { + maxargc = INITIAL_MAXARGC; + nargv = (char **) malloc (maxargc * sizeof (char *)); + } + else + { + maxargc *= 2; + nargv = (char **) realloc (argv, maxargc * sizeof (char *)); + } + if (nargv == NULL) + { + if (argv != NULL) + { + freeargv (argv); + argv = NULL; + } + break; + } + argv = nargv; + argv[argc] = NULL; + } + /* Begin scanning arg */ + arg = copybuf; + while (*input != EOS) + { + if (ISSPACE (*input) && !squote && !dquote && !bsquote) + { + break; + } + else + { + if (bsquote) + { + bsquote = 0; + *arg++ = *input; + } + else if (*input == '\\') + { + bsquote = 1; + } + else if (squote) + { + if (*input == '\'') + { + squote = 0; + } + else + { + *arg++ = *input; + } + } + else if (dquote) + { + if (*input == '"') + { + dquote = 0; + } + else + { + *arg++ = *input; + } + } + else + { + if (*input == '\'') + { + squote = 1; + } + else if (*input == '"') + { + dquote = 1; + } + else + { + *arg++ = *input; + } + } + input++; + } + } + *arg = EOS; + argv[argc] = strdup (copybuf); + if (argv[argc] == NULL) + { + freeargv (argv); + argv = NULL; + break; + } + argc++; + argv[argc] = NULL; + + while (ISSPACE (*input)) + { + input++; + } + } + while (*input != EOS); + } + return (argv); +} + +/* + +@deftypefn Extension int writeargv (const char **@var{argv}, FILE *@var{file}) + +Write each member of ARGV, handling all necessary quoting, to the file +named by FILE, separated by whitespace. Return 0 on success, non-zero +if an error occurred while writing to FILE. + +@end deftypefn + +*/ + +int +writeargv (char **argv, FILE *f) +{ + int status = 0; + + if (f == NULL) + return 1; + + while (*argv != NULL) + { + const char *arg = *argv; + + while (*arg != EOS) + { + char c = *arg; + + if (ISSPACE(c) || c == '\\' || c == '\'' || c == '"') + if (EOF == fputc ('\\', f)) + { + status = 1; + goto done; + } + + if (EOF == fputc (c, f)) + { + status = 1; + goto done; + } + arg++; + } + + if (EOF == fputc ('\n', f)) + { + status = 1; + goto done; + } + argv++; + } + + done: + return status; +} + +/* + +@deftypefn Extension void expandargv (int *@var{argcp}, char ***@var{argvp}) + +The @var{argcp} and @code{argvp} arguments are pointers to the usual +@code{argc} and @code{argv} arguments to @code{main}. This function +looks for arguments that begin with the character @samp{@@}. Any such +arguments are interpreted as ``response files''. The contents of the +response file are interpreted as additional command line options. In +particular, the file is separated into whitespace-separated strings; +each such string is taken as a command-line option. The new options +are inserted in place of the option naming the response file, and +@code{*argcp} and @code{*argvp} will be updated. If the value of +@code{*argvp} is modified by this function, then the new value has +been dynamically allocated and can be deallocated by the caller with +@code{freeargv}. However, most callers will simply call +@code{expandargv} near the beginning of @code{main} and allow the +operating system to free the memory when the program exits. + +@end deftypefn + +*/ + +void +expandargv (int *argcp, char ***argvp) +{ + /* The argument we are currently processing. */ + int i = 0; + /* Non-zero if ***argvp has been dynamically allocated. */ + int argv_dynamic = 0; + /* Loop over the arguments, handling response files. We always skip + ARGVP[0], as that is the name of the program being run. */ + while (++i < *argcp) + { + /* The name of the response file. */ + const char *filename; + /* The response file. */ + FILE *f; + /* An upper bound on the number of characters in the response + file. */ + long pos; + /* The number of characters in the response file, when actually + read. */ + size_t len; + /* A dynamically allocated buffer used to hold options read from a + response file. */ + char *buffer; + /* Dynamically allocated storage for the options read from the + response file. */ + char **file_argv; + /* The number of options read from the response file, if any. */ + size_t file_argc; + /* We are only interested in options of the form "@file". */ + filename = (*argvp)[i]; + if (filename[0] != '@') + continue; + /* Read the contents of the file. */ + f = fopen (++filename, "r"); + if (!f) + continue; + if (fseek (f, 0L, SEEK_END) == -1) + goto error; + pos = ftell (f); + if (pos == -1) + goto error; + if (fseek (f, 0L, SEEK_SET) == -1) + goto error; + buffer = (char *) xmalloc (pos * sizeof (char) + 1); + len = fread (buffer, sizeof (char), pos, f); + if (len != (size_t) pos + /* On Windows, fread may return a value smaller than POS, + due to CR/LF->CR translation when reading text files. + That does not in-and-of itself indicate failure. */ + && ferror (f)) + goto error; + /* Add a NUL terminator. */ + buffer[len] = '\0'; + /* Parse the string. */ + file_argv = buildargv (buffer); + /* If *ARGVP is not already dynamically allocated, copy it. */ + if (!argv_dynamic) + { + *argvp = dupargv (*argvp); + if (!*argvp) + { + fputs ("\nout of memory\n", stderr); + xexit (1); + } + } + /* Count the number of arguments. */ + file_argc = 0; + while (file_argv[file_argc] && *file_argv[file_argc]) + ++file_argc; + /* Now, insert FILE_ARGV into ARGV. The "+1" below handles the + NULL terminator at the end of ARGV. */ + *argvp = ((char **) + xrealloc (*argvp, + (*argcp + file_argc + 1) * sizeof (char *))); + memmove (*argvp + i + file_argc, *argvp + i + 1, + (*argcp - i) * sizeof (char *)); + memcpy (*argvp + i, file_argv, file_argc * sizeof (char *)); + /* The original option has been replaced by all the new + options. */ + *argcp += file_argc - 1; + /* Free up memory allocated to process the response file. We do + not use freeargv because the individual options in FILE_ARGV + are now in the main ARGV. */ + free (file_argv); + free (buffer); + /* Rescan all of the arguments just read to support response + files that include other response files. */ + --i; + error: + /* We're all done with the file now. */ + fclose (f); + } +} + +#ifdef MAIN + +/* Simple little test driver. */ + +static const char *const tests[] = +{ + "a simple command line", + "arg 'foo' is single quoted", + "arg \"bar\" is double quoted", + "arg \"foo bar\" has embedded whitespace", + "arg 'Jack said \\'hi\\'' has single quotes", + "arg 'Jack said \\\"hi\\\"' has double quotes", + "a b c d e f g h i j k l m n o p q r s t u v w x y z 1 2 3 4 5 6 7 8 9", + + /* This should be expanded into only one argument. */ + "trailing-whitespace ", + + "", + NULL +}; + +int +main (void) +{ + char **argv; + const char *const *test; + char **targs; + + for (test = tests; *test != NULL; test++) + { + printf ("buildargv(\"%s\")\n", *test); + if ((argv = buildargv (*test)) == NULL) + { + printf ("failed!\n\n"); + } + else + { + for (targs = argv; *targs != NULL; targs++) + { + printf ("\t\"%s\"\n", *targs); + } + printf ("\n"); + } + freeargv (argv); + } + + return 0; +} + +#endif /* MAIN */ diff --git a/libiberty/asprintf.c b/libiberty/asprintf.c new file mode 100644 index 0000000..3cf5052 --- /dev/null +++ b/libiberty/asprintf.c @@ -0,0 +1,56 @@ +/* Like sprintf but provides a pointer to malloc'd storage, which must + be freed by the caller. + Copyright (C) 1997, 2003 Free Software Foundation, Inc. + Contributed by Cygnus Solutions. + +This file is part of the libiberty library. +Libiberty is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +Libiberty 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with libiberty; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include "ansidecl.h" +#include "libiberty.h" + +#include + +/* + +@deftypefn Extension int asprintf (char **@var{resptr}, const char *@var{format}, ...) + +Like @code{sprintf}, but instead of passing a pointer to a buffer, you +pass a pointer to a pointer. This function will compute the size of +the buffer needed, allocate memory with @code{malloc}, and store a +pointer to the allocated memory in @code{*@var{resptr}}. The value +returned is the same as @code{sprintf} would return. If memory could +not be allocated, minus one is returned and @code{NULL} is stored in +@code{*@var{resptr}}. + +@end deftypefn + +*/ + +int +asprintf (char **buf, const char *fmt, ...) +{ + int status; + VA_OPEN (ap, fmt); + VA_FIXEDARG (ap, char **, buf); + VA_FIXEDARG (ap, const char *, fmt); + status = vasprintf (buf, fmt, ap); + VA_CLOSE (ap); + return status; +} diff --git a/libiberty/at-file.texi b/libiberty/at-file.texi new file mode 100644 index 0000000..080d195 --- /dev/null +++ b/libiberty/at-file.texi @@ -0,0 +1,15 @@ +@c This file is designed to be included in manuals that use +@c expandargv. + +@item @@@var{file} +Read command-line options from @var{file}. The options read are +inserted in place of the original @@@var{file} option. If @var{file} +does not exist, or cannot be read, then the option will be treated +literally, and not removed. + +Options in @var{file} are separated by whitespace. A whitespace +character may be included in an option by surrounding the entire +option in either single or double quotes. Any character (including a +backslash) may be included by prefixing the character to be included +with a backslash. The @var{file} may itself contain additional +@@@var{file} options; any such options will be processed recursively. diff --git a/libiberty/atexit.c b/libiberty/atexit.c new file mode 100644 index 0000000..e091f01 --- /dev/null +++ b/libiberty/atexit.c @@ -0,0 +1,27 @@ +/* Wrapper to implement ANSI C's atexit using SunOS's on_exit. */ +/* This function is in the public domain. --Mike Stump. */ + +/* + +@deftypefn Supplemental int atexit (void (*@var{f})()) + +Causes function @var{f} to be called at exit. Returns 0. + +@end deftypefn + +*/ + +#include "config.h" + +#ifdef HAVE_ON_EXIT + +int +atexit(void (*f)(void)) +{ + /* If the system doesn't provide a definition for atexit, use on_exit + if the system provides that. */ + on_exit (f, 0); + return 0; +} + +#endif diff --git a/libiberty/basename.c b/libiberty/basename.c new file mode 100644 index 0000000..0f2c069 --- /dev/null +++ b/libiberty/basename.c @@ -0,0 +1,62 @@ +/* Return the basename of a pathname. + This file is in the public domain. */ + +/* + +@deftypefn Supplemental char* basename (const char *@var{name}) + +Returns a pointer to the last component of pathname @var{name}. +Behavior is undefined if the pathname ends in a directory separator. + +@end deftypefn + +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include "ansidecl.h" +#include "libiberty.h" +#include "safe-ctype.h" + +#ifndef DIR_SEPARATOR +#define DIR_SEPARATOR '/' +#endif + +#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ + defined (__OS2__) +#define HAVE_DOS_BASED_FILE_SYSTEM +#ifndef DIR_SEPARATOR_2 +#define DIR_SEPARATOR_2 '\\' +#endif +#endif + +/* Define IS_DIR_SEPARATOR. */ +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +char * +basename (const char *name) +{ + const char *base; + +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + /* Skip over the disk name in MSDOS pathnames. */ + if (ISALPHA (name[0]) && name[1] == ':') + name += 2; +#endif + + for (base = name; *name; name++) + { + if (IS_DIR_SEPARATOR (*name)) + { + base = name + 1; + } + } + return (char *) base; +} + diff --git a/libiberty/bcmp.c b/libiberty/bcmp.c new file mode 100644 index 0000000..c639f98 --- /dev/null +++ b/libiberty/bcmp.c @@ -0,0 +1,27 @@ +/* bcmp + This function is in the public domain. */ + +/* + +@deftypefn Supplemental int bcmp (char *@var{x}, char *@var{y}, int @var{count}) + +Compares the first @var{count} bytes of two areas of memory. Returns +zero if they are the same, nonzero otherwise. Returns zero if +@var{count} is zero. A nonzero result only indicates a difference, +it does not indicate any sorting order (say, by having a positive +result mean @var{x} sorts before @var{y}). + +@end deftypefn + +*/ + +#include + +extern int memcmp(const void *, const void *, size_t); + +int +bcmp (const void *s1, const void *s2, size_t count) +{ + return memcmp (s1, s2, count); +} + diff --git a/libiberty/bcopy.c b/libiberty/bcopy.c new file mode 100644 index 0000000..f9b7a8a --- /dev/null +++ b/libiberty/bcopy.c @@ -0,0 +1,31 @@ +/* bcopy -- copy memory regions of arbitary length + +@deftypefn Supplemental void bcopy (char *@var{in}, char *@var{out}, int @var{length}) + +Copies @var{length} bytes from memory region @var{in} to region +@var{out}. The use of @code{bcopy} is deprecated in new programs. + +@end deftypefn + +*/ + +#include + +void +bcopy (const void *src, void *dest, size_t len) +{ + if (dest < src) + { + const char *firsts = (const char *) src; + char *firstd = (char *) dest; + while (len--) + *firstd++ = *firsts++; + } + else + { + const char *lasts = (const char *)src + (len-1); + char *lastd = (char *)dest + (len-1); + while (len--) + *lastd-- = *lasts--; + } +} diff --git a/libiberty/bsearch.c b/libiberty/bsearch.c new file mode 100644 index 0000000..771d5de --- /dev/null +++ b/libiberty/bsearch.c @@ -0,0 +1,89 @@ +/* + * Copyright (c) 1990 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. [rescinded 22 July 1999] + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + +@deftypefn Supplemental void* bsearch (const void *@var{key}, const void *@var{base}, size_t @var{nmemb}, size_t @var{size}, int (*@var{compar})(const void *, const void *)) + +Performs a search over an array of @var{nmemb} elements pointed to by +@var{base} for a member that matches the object pointed to by @var{key}. +The size of each member is specified by @var{size}. The array contents +should be sorted in ascending order according to the @var{compar} +comparison function. This routine should take two arguments pointing to +the @var{key} and to an array member, in that order, and should return an +integer less than, equal to, or greater than zero if the @var{key} object +is respectively less than, matching, or greater than the array member. + +@end deftypefn + +*/ + +#include "config.h" +#include "ansidecl.h" +#include /* size_t */ +#include + +/* + * Perform a binary search. + * + * The code below is a bit sneaky. After a comparison fails, we + * divide the work in half by moving either left or right. If lim + * is odd, moving left simply involves halving lim: e.g., when lim + * is 5 we look at item 2, so we change lim to 2 so that we will + * look at items 0 & 1. If lim is even, the same applies. If lim + * is odd, moving right again involes halving lim, this time moving + * the base up one item past p: e.g., when lim is 5 we change base + * to item 3 and make lim 2 so that we will look at items 3 and 4. + * If lim is even, however, we have to shrink it by one before + * halving: e.g., when lim is 4, we still looked at item 2, so we + * have to make lim 3, then halve, obtaining 1, so that we will only + * look at item 3. + */ +void * +bsearch (register const void *key, const void *base0, + size_t nmemb, register size_t size, + register int (*compar)(const void *, const void *)) +{ + register const char *base = (const char *) base0; + register int lim, cmp; + register const void *p; + + for (lim = nmemb; lim != 0; lim >>= 1) { + p = base + (lim >> 1) * size; + cmp = (*compar)(key, p); + if (cmp == 0) + return (void *)p; + if (cmp > 0) { /* key > p: move right */ + base = (const char *)p + size; + lim--; + } /* else move left */ + } + return (NULL); +} diff --git a/libiberty/bzero.c b/libiberty/bzero.c new file mode 100644 index 0000000..44ad73d --- /dev/null +++ b/libiberty/bzero.c @@ -0,0 +1,23 @@ +/* Portable version of bzero for systems without it. + This function is in the public domain. */ + +/* + +@deftypefn Supplemental void bzero (char *@var{mem}, int @var{count}) + +Zeros @var{count} bytes starting at @var{mem}. Use of this function +is deprecated in favor of @code{memset}. + +@end deftypefn + +*/ + +#include + +extern void *memset(void *, int, size_t); + +void +bzero (void *to, size_t count) +{ + memset (to, 0, count); +} diff --git a/libiberty/calloc.c b/libiberty/calloc.c new file mode 100644 index 0000000..f4bd27b --- /dev/null +++ b/libiberty/calloc.c @@ -0,0 +1,34 @@ +/* calloc -- allocate memory which has been initialized to zero. + This function is in the public domain. */ + +/* + +@deftypefn Supplemental void* calloc (size_t @var{nelem}, size_t @var{elsize}) + +Uses @code{malloc} to allocate storage for @var{nelem} objects of +@var{elsize} bytes each, then zeros the memory. + +@end deftypefn + +*/ + +#include "ansidecl.h" +#include + +/* For systems with larger pointers than ints, this must be declared. */ +PTR malloc (size_t); +void bzero (PTR, size_t); + +PTR +calloc (size_t nelem, size_t elsize) +{ + register PTR ptr; + + if (nelem == 0 || elsize == 0) + nelem = elsize = 1; + + ptr = malloc (nelem * elsize); + if (ptr) bzero (ptr, nelem * elsize); + + return ptr; +} diff --git a/libiberty/choose-temp.c b/libiberty/choose-temp.c new file mode 100644 index 0000000..b1c2e5b --- /dev/null +++ b/libiberty/choose-temp.c @@ -0,0 +1,71 @@ +/* Utility to pick a temporary filename prefix. + Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. + +This file is part of the libiberty library. +Libiberty is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +Libiberty 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with libiberty; see the file COPYING.LIB. If not, +write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include /* May get P_tmpdir. */ +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif + +#include "libiberty.h" +extern char *choose_tmpdir (void); + +/* Name of temporary file. + mktemp requires 6 trailing X's. */ +#define TEMP_FILE "ccXXXXXX" +#define TEMP_FILE_LEN (sizeof(TEMP_FILE) - 1) + +/* + +@deftypefn Extension char* choose_temp_base (void) + +Return a prefix for temporary file names or @code{NULL} if unable to +find one. The current directory is chosen if all else fails so the +program is exited if a temporary directory can't be found (@code{mktemp} +fails). The buffer for the result is obtained with @code{xmalloc}. + +This function is provided for backwards compatibility only. Its use is +not recommended. + +@end deftypefn + +*/ + +char * +choose_temp_base (void) +{ + const char *base = choose_tmpdir (); + char *temp_filename; + int len; + + len = strlen (base); + temp_filename = XNEWVEC (char, len + TEMP_FILE_LEN + 1); + strcpy (temp_filename, base); + strcpy (temp_filename + len, TEMP_FILE); + + if (mktemp (temp_filename) == 0) + abort (); + return temp_filename; +} diff --git a/libiberty/clock.c b/libiberty/clock.c new file mode 100644 index 0000000..07d902e --- /dev/null +++ b/libiberty/clock.c @@ -0,0 +1,103 @@ +/* ANSI-compatible clock function. + Copyright (C) 1994, 1995, 1999 Free Software Foundation, Inc. + +This file is part of the libiberty library. This library 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 library 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 GNU CC; see the file COPYING. If not, write to +the Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + +As a special exception, if you link this library with files +compiled with a GNU compiler to produce an executable, this does not cause +the resulting executable to be covered by the GNU General Public License. +This exception does not however invalidate any other reasons why +the executable file might be covered by the GNU General Public License. */ + +/* + +@deftypefn Supplemental long clock (void) + +Returns an approximation of the CPU time used by the process as a +@code{clock_t}; divide this number by @samp{CLOCKS_PER_SEC} to get the +number of seconds used. + +@end deftypefn + +*/ + +#include "config.h" + +#ifdef HAVE_GETRUSAGE +#include +#include +#endif + +#ifdef HAVE_TIMES +#ifdef HAVE_SYS_PARAM_H +#include +#endif +#include +#endif + +#ifdef HAVE_UNISTD_H +#include +#endif + +#ifdef _SC_CLK_TCK +#define GNU_HZ sysconf(_SC_CLK_TCK) +#else +#ifdef HZ +#define GNU_HZ HZ +#else +#ifdef CLOCKS_PER_SEC +#define GNU_HZ CLOCKS_PER_SEC +#endif +#endif +#endif + +/* FIXME: should be able to declare as clock_t. */ + +long +clock (void) +{ +#ifdef HAVE_GETRUSAGE + struct rusage rusage; + + getrusage (0, &rusage); + return (rusage.ru_utime.tv_sec * 1000000 + rusage.ru_utime.tv_usec + + rusage.ru_stime.tv_sec * 1000000 + rusage.ru_stime.tv_usec); +#else +#ifdef HAVE_TIMES + struct tms tms; + + times (&tms); + return (tms.tms_utime + tms.tms_stime) * (1000000 / GNU_HZ); +#else +#ifdef VMS + struct + { + int proc_user_time; + int proc_system_time; + int child_user_time; + int child_system_time; + } vms_times; + + times (&vms_times); + return (vms_times.proc_user_time + vms_times.proc_system_time) * 10000; +#else + /* A fallback, if nothing else available. */ + return 0; +#endif /* VMS */ +#endif /* HAVE_TIMES */ +#endif /* HAVE_GETRUSAGE */ +} + diff --git a/libiberty/concat.c b/libiberty/concat.c new file mode 100644 index 0000000..1f329ea --- /dev/null +++ b/libiberty/concat.c @@ -0,0 +1,232 @@ +/* Concatenate variable number of strings. + Copyright (C) 1991, 1994, 2001 Free Software Foundation, Inc. + Written by Fred Fish @ Cygnus Support + +This file is part of the libiberty library. +Libiberty is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +Libiberty 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with libiberty; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + + +/* + +@deftypefn Extension char* concat (const char *@var{s1}, const char *@var{s2}, @dots{}, @code{NULL}) + +Concatenate zero or more of strings and return the result in freshly +@code{xmalloc}ed memory. Returns @code{NULL} if insufficient memory is +available. The argument list is terminated by the first @code{NULL} +pointer encountered. Pointers to empty strings are ignored. + +@end deftypefn + +NOTES + + This function uses xmalloc() which is expected to be a front end + function to malloc() that deals with low memory situations. In + typical use, if malloc() returns NULL then xmalloc() diverts to an + error handler routine which never returns, and thus xmalloc will + never return a NULL pointer. If the client application wishes to + deal with low memory situations itself, it should supply an xmalloc + that just directly invokes malloc and blindly returns whatever + malloc returns. + +*/ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include "ansidecl.h" +#include "libiberty.h" +#include /* size_t */ + +#include + +# if HAVE_STRING_H +# include +# else +# if HAVE_STRINGS_H +# include +# endif +# endif + +#if HAVE_STDLIB_H +#include +#endif + +static inline unsigned long vconcat_length (const char *, va_list); +static inline unsigned long +vconcat_length (const char *first, va_list args) +{ + unsigned long length = 0; + const char *arg; + + for (arg = first; arg ; arg = va_arg (args, const char *)) + length += strlen (arg); + + return length; +} + +static inline char * +vconcat_copy (char *dst, const char *first, va_list args) +{ + char *end = dst; + const char *arg; + + for (arg = first; arg ; arg = va_arg (args, const char *)) + { + unsigned long length = strlen (arg); + memcpy (end, arg, length); + end += length; + } + *end = '\000'; + + return dst; +} + +/* @undocumented concat_length */ + +unsigned long +concat_length (const char *first, ...) +{ + unsigned long length; + + VA_OPEN (args, first); + VA_FIXEDARG (args, const char *, first); + length = vconcat_length (first, args); + VA_CLOSE (args); + + return length; +} + +/* @undocumented concat_copy */ + +char * +concat_copy (char *dst, const char *first, ...) +{ + char *save_dst; + + VA_OPEN (args, first); + VA_FIXEDARG (args, char *, dst); + VA_FIXEDARG (args, const char *, first); + vconcat_copy (dst, first, args); + save_dst = dst; /* With K&R C, dst goes out of scope here. */ + VA_CLOSE (args); + + return save_dst; +} + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ +char *libiberty_concat_ptr; +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +/* @undocumented concat_copy2 */ + +char * +concat_copy2 (const char *first, ...) +{ + VA_OPEN (args, first); + VA_FIXEDARG (args, const char *, first); + vconcat_copy (libiberty_concat_ptr, first, args); + VA_CLOSE (args); + + return libiberty_concat_ptr; +} + +char * +concat (const char *first, ...) +{ + char *newstr; + + /* First compute the size of the result and get sufficient memory. */ + VA_OPEN (args, first); + VA_FIXEDARG (args, const char *, first); + newstr = XNEWVEC (char, vconcat_length (first, args) + 1); + VA_CLOSE (args); + + /* Now copy the individual pieces to the result string. */ + VA_OPEN (args, first); + VA_FIXEDARG (args, const char *, first); + vconcat_copy (newstr, first, args); + VA_CLOSE (args); + + return newstr; +} + +/* + +@deftypefn Extension char* reconcat (char *@var{optr}, const char *@var{s1}, @dots{}, @code{NULL}) + +Same as @code{concat}, except that if @var{optr} is not @code{NULL} it +is freed after the string is created. This is intended to be useful +when you're extending an existing string or building up a string in a +loop: + +@example + str = reconcat (str, "pre-", str, NULL); +@end example + +@end deftypefn + +*/ + +char * +reconcat (char *optr, const char *first, ...) +{ + char *newstr; + + /* First compute the size of the result and get sufficient memory. */ + VA_OPEN (args, first); + VA_FIXEDARG (args, char *, optr); + VA_FIXEDARG (args, const char *, first); + newstr = XNEWVEC (char, vconcat_length (first, args) + 1); + VA_CLOSE (args); + + /* Now copy the individual pieces to the result string. */ + VA_OPEN (args, first); + VA_FIXEDARG (args, char *, optr); + VA_FIXEDARG (args, const char *, first); + vconcat_copy (newstr, first, args); + if (optr) /* Done before VA_CLOSE so optr stays in scope for K&R C. */ + free (optr); + VA_CLOSE (args); + + return newstr; +} + +#ifdef MAIN +#define NULLP (char *)0 + +/* Simple little test driver. */ + +#include + +int +main (void) +{ + printf ("\"\" = \"%s\"\n", concat (NULLP)); + printf ("\"a\" = \"%s\"\n", concat ("a", NULLP)); + printf ("\"ab\" = \"%s\"\n", concat ("a", "b", NULLP)); + printf ("\"abc\" = \"%s\"\n", concat ("a", "b", "c", NULLP)); + printf ("\"abcd\" = \"%s\"\n", concat ("ab", "cd", NULLP)); + printf ("\"abcde\" = \"%s\"\n", concat ("ab", "c", "de", NULLP)); + printf ("\"abcdef\" = \"%s\"\n", concat ("", "a", "", "bcd", "ef", NULLP)); + return 0; +} + +#endif diff --git a/libiberty/config.h-vms b/libiberty/config.h-vms new file mode 100644 index 0000000..ccac6a2 --- /dev/null +++ b/libiberty/config.h-vms @@ -0,0 +1,13 @@ +#ifndef NEED_strerror +#define NEED_strerror +#endif +#ifndef NEED_basename +#define NEED_basename +#endif +#ifndef NEED_psignal +#define NEED_psignal +#endif +#ifndef NEED_on_exit +#define NEED_on_exit +#endif + diff --git a/libiberty/config.in b/libiberty/config.in new file mode 100644 index 0000000..8bd10cd --- /dev/null +++ b/libiberty/config.in @@ -0,0 +1,444 @@ +/* config.in. Generated from configure.ac by autoheader. */ + +/* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems. + This function is required for alloca.c support on those systems. */ +#undef CRAY_STACKSEG_END + +/* Define to 1 if you have the header file. */ +#undef HAVE_ALLOCA_H + +/* Define to 1 if you have the `asprintf' function. */ +#undef HAVE_ASPRINTF + +/* Define to 1 if you have the `atexit' function. */ +#undef HAVE_ATEXIT + +/* Define to 1 if you have the `basename' function. */ +#undef HAVE_BASENAME + +/* Define to 1 if you have the `bcmp' function. */ +#undef HAVE_BCMP + +/* Define to 1 if you have the `bcopy' function. */ +#undef HAVE_BCOPY + +/* Define to 1 if you have the `bsearch' function. */ +#undef HAVE_BSEARCH + +/* Define to 1 if you have the `bzero' function. */ +#undef HAVE_BZERO + +/* Define to 1 if you have the `calloc' function. */ +#undef HAVE_CALLOC + +/* Define to 1 if you have the `canonicalize_file_name' function. */ +#undef HAVE_CANONICALIZE_FILE_NAME + +/* Define to 1 if you have the `clock' function. */ +#undef HAVE_CLOCK + +/* Define to 1 if you have the declaration of `asprintf', and to 0 if you + don't. */ +#undef HAVE_DECL_ASPRINTF + +/* Define to 1 if you have the declaration of `basename', and to 0 if you + don't. */ +#undef HAVE_DECL_BASENAME + +/* Define to 1 if you have the declaration of `calloc', and to 0 if you don't. + */ +#undef HAVE_DECL_CALLOC + +/* Define to 1 if you have the declaration of `ffs', and to 0 if you don't. */ +#undef HAVE_DECL_FFS + +/* Define to 1 if you have the declaration of `getenv', and to 0 if you don't. + */ +#undef HAVE_DECL_GETENV + +/* Define to 1 if you have the declaration of `getopt', and to 0 if you don't. + */ +#undef HAVE_DECL_GETOPT + +/* Define to 1 if you have the declaration of `malloc', and to 0 if you don't. + */ +#undef HAVE_DECL_MALLOC + +/* Define to 1 if you have the declaration of `realloc', and to 0 if you + don't. */ +#undef HAVE_DECL_REALLOC + +/* Define to 1 if you have the declaration of `sbrk', and to 0 if you don't. + */ +#undef HAVE_DECL_SBRK + +/* Define to 1 if you have the declaration of `snprintf', and to 0 if you + don't. */ +#undef HAVE_DECL_SNPRINTF + +/* Define to 1 if you have the declaration of `strverscmp', and to 0 if you + don't. */ +#undef HAVE_DECL_STRVERSCMP + +/* Define to 1 if you have the declaration of `vasprintf', and to 0 if you + don't. */ +#undef HAVE_DECL_VASPRINTF + +/* Define to 1 if you have the declaration of `vsnprintf', and to 0 if you + don't. */ +#undef HAVE_DECL_VSNPRINTF + +/* Define to 1 if you have the header file. */ +#undef HAVE_FCNTL_H + +/* Define to 1 if you have the `ffs' function. */ +#undef HAVE_FFS + +/* Define to 1 if you have the `fork' function. */ +#undef HAVE_FORK + +/* Define to 1 if you have the `getcwd' function. */ +#undef HAVE_GETCWD + +/* Define to 1 if you have the `getpagesize' function. */ +#undef HAVE_GETPAGESIZE + +/* Define to 1 if you have the `getrusage' function. */ +#undef HAVE_GETRUSAGE + +/* Define to 1 if you have the `getsysinfo' function. */ +#undef HAVE_GETSYSINFO + +/* Define to 1 if you have the `gettimeofday' function. */ +#undef HAVE_GETTIMEOFDAY + +/* Define to 1 if you have the `index' function. */ +#undef HAVE_INDEX + +/* Define to 1 if you have the `insque' function. */ +#undef HAVE_INSQUE + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_LIMITS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MACHINE_HAL_SYSINFO_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MALLOC_H + +/* Define to 1 if you have the `memchr' function. */ +#undef HAVE_MEMCHR + +/* Define to 1 if you have the `memcmp' function. */ +#undef HAVE_MEMCMP + +/* Define to 1 if you have the `memcpy' function. */ +#undef HAVE_MEMCPY + +/* Define to 1 if you have the `memmove' function. */ +#undef HAVE_MEMMOVE + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the `mempcpy' function. */ +#undef HAVE_MEMPCPY + +/* Define to 1 if you have the `memset' function. */ +#undef HAVE_MEMSET + +/* Define to 1 if you have the `mkstemps' function. */ +#undef HAVE_MKSTEMPS + +/* Define to 1 if you have a working `mmap' system call. */ +#undef HAVE_MMAP + +/* Define to 1 if you have the `on_exit' function. */ +#undef HAVE_ON_EXIT + +/* Define to 1 if you have the `psignal' function. */ +#undef HAVE_PSIGNAL + +/* Define to 1 if you have the `pstat_getdynamic' function. */ +#undef HAVE_PSTAT_GETDYNAMIC + +/* Define to 1 if you have the `pstat_getstatic' function. */ +#undef HAVE_PSTAT_GETSTATIC + +/* Define to 1 if you have the `putenv' function. */ +#undef HAVE_PUTENV + +/* Define to 1 if you have the `random' function. */ +#undef HAVE_RANDOM + +/* Define to 1 if you have the `realpath' function. */ +#undef HAVE_REALPATH + +/* Define to 1 if you have the `rename' function. */ +#undef HAVE_RENAME + +/* Define to 1 if you have the `rindex' function. */ +#undef HAVE_RINDEX + +/* Define to 1 if you have the `sbrk' function. */ +#undef HAVE_SBRK + +/* Define to 1 if you have the `setenv' function. */ +#undef HAVE_SETENV + +/* Define to 1 if you have the `sigsetmask' function. */ +#undef HAVE_SIGSETMASK + +/* Define to 1 if you have the `snprintf' function. */ +#undef HAVE_SNPRINTF + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDIO_EXT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the `stpcpy' function. */ +#undef HAVE_STPCPY + +/* Define to 1 if you have the `stpncpy' function. */ +#undef HAVE_STPNCPY + +/* Define to 1 if you have the `strcasecmp' function. */ +#undef HAVE_STRCASECMP + +/* Define to 1 if you have the `strchr' function. */ +#undef HAVE_STRCHR + +/* Define to 1 if you have the `strdup' function. */ +#undef HAVE_STRDUP + +/* Define to 1 if you have the `strerror' function. */ +#undef HAVE_STRERROR + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the `strncasecmp' function. */ +#undef HAVE_STRNCASECMP + +/* Define to 1 if you have the `strndup' function. */ +#undef HAVE_STRNDUP + +/* Define to 1 if you have the `strrchr' function. */ +#undef HAVE_STRRCHR + +/* Define to 1 if you have the `strsignal' function. */ +#undef HAVE_STRSIGNAL + +/* Define to 1 if you have the `strstr' function. */ +#undef HAVE_STRSTR + +/* Define to 1 if you have the `strtod' function. */ +#undef HAVE_STRTOD + +/* Define to 1 if you have the `strtol' function. */ +#undef HAVE_STRTOL + +/* Define to 1 if you have the `strtoul' function. */ +#undef HAVE_STRTOUL + +/* Define to 1 if you have the `strverscmp' function. */ +#undef HAVE_STRVERSCMP + +/* Define to 1 if you have the `sysconf' function. */ +#undef HAVE_SYSCONF + +/* Define to 1 if you have the `sysctl' function. */ +#undef HAVE_SYSCTL + +/* Define to 1 if you have the `sysmp' function. */ +#undef HAVE_SYSMP + +/* Define if you have the sys_errlist variable. */ +#undef HAVE_SYS_ERRLIST + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_FILE_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_MMAN_H + +/* Define if you have the sys_nerr variable. */ +#undef HAVE_SYS_NERR + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_PARAM_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_PSTAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_RESOURCE_H + +/* Define if you have the sys_siglist variable. */ +#undef HAVE_SYS_SIGLIST + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SYSCTL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SYSINFO_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SYSMP_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SYSTEMCFG_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TABLE_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TIME_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have that is POSIX.1 compatible. */ +#undef HAVE_SYS_WAIT_H + +/* Define to 1 if you have the `table' function. */ +#undef HAVE_TABLE + +/* Define to 1 if you have the `times' function. */ +#undef HAVE_TIMES + +/* Define to 1 if you have the header file. */ +#undef HAVE_TIME_H + +/* Define to 1 if you have the `tmpnam' function. */ +#undef HAVE_TMPNAM + +/* Define if you have the \`uintptr_t' type. */ +#undef HAVE_UINTPTR_T + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to 1 if you have the `vasprintf' function. */ +#undef HAVE_VASPRINTF + +/* Define to 1 if you have the `vfork' function. */ +#undef HAVE_VFORK + +/* Define to 1 if you have the header file. */ +#undef HAVE_VFORK_H + +/* Define to 1 if you have the `vfprintf' function. */ +#undef HAVE_VFPRINTF + +/* Define to 1 if you have the `vprintf' function. */ +#undef HAVE_VPRINTF + +/* Define to 1 if you have the `vsnprintf' function. */ +#undef HAVE_VSNPRINTF + +/* Define to 1 if you have the `vsprintf' function. */ +#undef HAVE_VSPRINTF + +/* Define to 1 if you have the `wait3' function. */ +#undef HAVE_WAIT3 + +/* Define to 1 if you have the `wait4' function. */ +#undef HAVE_WAIT4 + +/* Define to 1 if you have the `waitpid' function. */ +#undef HAVE_WAITPID + +/* Define to 1 if `fork' works. */ +#undef HAVE_WORKING_FORK + +/* Define to 1 if `vfork' works. */ +#undef HAVE_WORKING_VFORK + +/* Define to 1 if you have the `_doprnt' function. */ +#undef HAVE__DOPRNT + +/* Define if you have the _system_configuration variable. */ +#undef HAVE__SYSTEM_CONFIGURATION + +/* Define to 1 if you have the `__fsetlocking' function. */ +#undef HAVE___FSETLOCKING + +/* Define if canonicalize_file_name is not declared in system header files. */ +#undef NEED_DECLARATION_CANONICALIZE_FILE_NAME + +/* Define if errno must be declared even when is included. */ +#undef NEED_DECLARATION_ERRNO + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +#undef NO_MINUS_C_MINUS_O + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* The size of `int', as computed by sizeof. */ +#undef SIZEOF_INT + +/* Define if you know the direction of stack growth for your system; otherwise + it will be automatically deduced at run-time. STACK_DIRECTION > 0 => grows + toward higher addresses STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ +#undef STACK_DIRECTION + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Define to 1 if you can safely include both and . */ +#undef TIME_WITH_SYS_TIME + +/* Define to an unsigned 64-bit type available in the compiler. */ +#undef UNSIGNED_64BIT_TYPE + +/* Define to 1 if your processor stores words with the most significant byte + first (like Motorola and SPARC, unlike Intel and VAX). */ +#undef WORDS_BIGENDIAN + +/* Define to empty if `const' does not conform to ANSI C. */ +#undef const + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +#undef inline +#endif + +/* Define to `int' if does not define. */ +#undef pid_t + +/* Define to `unsigned long' if does not define. */ +#undef uintptr_t + +/* Define as `fork' if `vfork' does not work. */ +#undef vfork diff --git a/libiberty/config/mh-aix b/libiberty/config/mh-aix new file mode 100644 index 0000000..6b64505 --- /dev/null +++ b/libiberty/config/mh-aix @@ -0,0 +1,9 @@ +# This file is only needed by AIX 3.1. +HDEFINES = -D__IEEE_BIG_ENDIAN + +# Most releases of AIX 3.1 include an incorrect internal version of copysign +# in libc.a for use by some libc public functions including modf. The public +# version of copysign in libm.a is usable. For the sake of libg++ (which +# uses modf), we add copysign here. Supposedly, this problem is fixed in AIX +# 3.1.8 and above, including all releases of AIX 3.2. +EXTRA_OFILES = copysign.o diff --git a/libiberty/config/mh-cxux7 b/libiberty/config/mh-cxux7 new file mode 100644 index 0000000..a924b08 --- /dev/null +++ b/libiberty/config/mh-cxux7 @@ -0,0 +1 @@ +HDEFINES = -DHARRIS_FLOAT_FORMAT diff --git a/libiberty/config/mh-fbsd21 b/libiberty/config/mh-fbsd21 new file mode 100644 index 0000000..1375a78 --- /dev/null +++ b/libiberty/config/mh-fbsd21 @@ -0,0 +1 @@ +EXTRA_OFILES=vasprintf.o diff --git a/libiberty/config/mh-openedition b/libiberty/config/mh-openedition new file mode 100644 index 0000000..8de8ed1 --- /dev/null +++ b/libiberty/config/mh-openedition @@ -0,0 +1,3 @@ +HDEFINES = -D_ALL_SOURCE -DLE370 +CC=c89 + diff --git a/libiberty/config/mh-windows b/libiberty/config/mh-windows new file mode 100644 index 0000000..3ff5f79 --- /dev/null +++ b/libiberty/config/mh-windows @@ -0,0 +1 @@ +EXTRA_OFILES=asprintf.o strcasecmp.o strncasecmp.o vasprintf.o diff --git a/libiberty/configure b/libiberty/configure new file mode 100755 index 0000000..51ee4ec --- /dev/null +++ b/libiberty/configure @@ -0,0 +1,10596 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.61. +# +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + + + +# PATH needs CR +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +as_nl=' +' +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + { (exit 1); exit 1; } +fi + +# Work around bugs in pre-3.0 UWIN ksh. +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + + +# Name of the executable. +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# CDPATH. +$as_unset CDPATH + + +if test "x$CONFIG_SHELL" = x; then + if (eval ":") 2>/dev/null; then + as_have_required=yes +else + as_have_required=no +fi + + if test $as_have_required = yes && (eval ": +(as_func_return () { + (exit \$1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = \"\$1\" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test \$exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=\$LINENO + as_lineno_2=\$LINENO + test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && + test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } +") 2> /dev/null; then + : +else + as_candidate_shells= + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + case $as_dir in + /*) + for as_base in sh bash ksh sh5; do + as_candidate_shells="$as_candidate_shells $as_dir/$as_base" + done;; + esac +done +IFS=$as_save_IFS + + + for as_shell in $as_candidate_shells $SHELL; do + # Try only shells that exist, to save several forks. + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { ("$as_shell") 2> /dev/null <<\_ASEOF +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + +: +_ASEOF +}; then + CONFIG_SHELL=$as_shell + as_have_required=yes + if { "$as_shell" 2> /dev/null <<\_ASEOF +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + +: +(as_func_return () { + (exit $1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = "$1" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test $exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } + +_ASEOF +}; then + break +fi + +fi + + done + + if test "x$CONFIG_SHELL" != x; then + for as_var in BASH_ENV ENV + do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var + done + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} +fi + + + if test $as_have_required = no; then + echo This script requires a shell more modern than all the + echo shells that I found on your system. Please install a + echo modern shell, or manually run the script under such a + echo shell if you do have one. + { (exit 1); exit 1; } +fi + + +fi + +fi + + + +(eval "as_func_return () { + (exit \$1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = \"\$1\" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test \$exitcode = 0") || { + echo No shell found that supports shell functions. + echo Please tell autoconf@gnu.org about your system, + echo including any error possibly output before this + echo message +} + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in +-n*) + case `echo 'x\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + *) ECHO_C='\c';; + esac;; +*) + ECHO_N='-n';; +esac + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir +fi +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + + +exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} + +# Identity of this package. +PACKAGE_NAME= +PACKAGE_TARNAME= +PACKAGE_VERSION= +PACKAGE_STRING= +PACKAGE_BUGREPORT= + +ac_unique_file="xmalloc.c" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='SHELL +PATH_SEPARATOR +PACKAGE_NAME +PACKAGE_TARNAME +PACKAGE_VERSION +PACKAGE_STRING +PACKAGE_BUGREPORT +exec_prefix +prefix +program_transform_name +bindir +sbindir +libexecdir +datarootdir +datadir +sysconfdir +sharedstatedir +localstatedir +includedir +oldincludedir +docdir +infodir +htmldir +dvidir +pdfdir +psdir +libdir +localedir +mandir +DEFS +ECHO_C +ECHO_N +ECHO_T +LIBS +build_alias +host_alias +target_alias +libiberty_topdir +MAINT +NOTMAINT +MAKEINFO +BUILD_INFO +PERL +HAVE_PERL +build +build_cpu +build_vendor +build_os +host +host_cpu +host_vendor +host_os +AR +RANLIB +CC +CFLAGS +LDFLAGS +CPPFLAGS +ac_ct_CC +EXEEXT +OBJEXT +CPP +ac_libiberty_warn_cflags +NO_MINUS_C_MINUS_O +OUTPUT_OPTION +GREP +EGREP +INSTALL_PROGRAM +INSTALL_SCRIPT +INSTALL_DATA +LIBOBJS +CHECK +target_header_dir +pexecute +INSTALL_DEST +LTLIBOBJS' +ac_subst_files='host_makefile_frag' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` + eval enable_$ac_feature=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` + eval enable_$ac_feature=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package | sed 's/[-.]/_/g'` + eval with_$ac_package=\$ac_optarg ;; + + -without-* | --without-*) + ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package | sed 's/[-.]/_/g'` + eval with_$ac_package=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) { echo "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + { echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } +fi + +# Be sure to have absolute directory names. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; } +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + { echo "$as_me: error: Working directory cannot be determined" >&2 + { (exit 1); exit 1; }; } +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + { echo "$as_me: error: pwd does not report name of working directory" >&2 + { (exit 1); exit 1; }; } + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$0" || +$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$0" : 'X\(//\)[^/]' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +echo X"$0" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 + { (exit 1); exit 1; }; } +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2 + { (exit 1); exit 1; }; } + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures this package to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + + cat <<\_ACEOF + +Optional Features: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-maintainer-mode + enable make rules and dependencies not useful + (and sometimes confusing) to the casual installer + --enable-multilib build many library versions (default) + --enable-install-libiberty Install headers for end users + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-target-subdir=SUBDIR Configuring in a subdirectory for target + --with-build-subdir=SUBDIR Configuring in a subdirectory for build + --with-cross-host=HOST Configuring with a cross compiler + --with-newlib Configuring with newlib + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CPP C preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +configure +generated by GNU Autoconf 2.61 + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by $as_me, which was +generated by GNU Autoconf 2.61. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + echo "PATH: $as_dir" +done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; + 2) + ac_configure_args1="$ac_configure_args1 '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + ac_configure_args="$ac_configure_args '$ac_arg'" + ;; + esac + done +done +$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } +$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + cat <<\_ASBOX +## ---------------- ## +## Cache variables. ## +## ---------------- ## +_ASBOX + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 +echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + *) $as_unset $ac_var ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + cat <<\_ASBOX +## ----------------- ## +## Output variables. ## +## ----------------- ## +_ASBOX + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + cat <<\_ASBOX +## ------------------- ## +## File substitutions. ## +## ------------------- ## +_ASBOX + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + cat <<\_ASBOX +## ----------- ## +## confdefs.h. ## +## ----------- ## +_ASBOX + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + echo "$as_me: caught signal $ac_signal" + echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer explicitly selected file to automatically selected ones. +if test -n "$CONFIG_SITE"; then + set x "$CONFIG_SITE" +elif test "x$prefix" != xNONE; then + set x "$prefix/share/config.site" "$prefix/etc/config.site" +else + set x "$ac_default_prefix/share/config.site" \ + "$ac_default_prefix/etc/config.site" +fi +shift +for ac_site_file +do + if test -r "$ac_site_file"; then + { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 +echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special + # files actually), so we avoid doing that. + if test -f "$cache_file"; then + { echo "$as_me:$LINENO: loading cache $cache_file" >&5 +echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { echo "$as_me:$LINENO: creating cache $cache_file" >&5 +echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 +echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 +echo "$as_me: former value: $ac_old_val" >&2;} + { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 +echo "$as_me: current value: $ac_new_val" >&2;} + ac_cache_corrupted=: + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 +echo "$as_me: error: changes in the environment can compromise the build" >&2;} + { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } +fi + + + + + + + + + + + + + + + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + +# This works around the fact that libtool configuration may change LD +# for this particular configuration, but some shells, instead of +# keeping the changes in LD private, export them just because LD is +# exported. We don't use libtool yet, but some day we might, so... +ORIGINAL_LD_FOR_MULTILIBS=$LD + + +# Check whether --with-target-subdir was given. +if test "${with_target_subdir+set}" = set; then + withval=$with_target_subdir; +fi + + +# Check whether --with-build-subdir was given. +if test "${with_build_subdir+set}" = set; then + withval=$with_build_subdir; +fi + + +# Check whether --with-cross-host was given. +if test "${with_cross_host+set}" = set; then + withval=$with_cross_host; +fi + + +# Check whether --with-newlib was given. +if test "${with_newlib+set}" = set; then + withval=$with_newlib; +fi + + +if test "${srcdir}" = "."; then + if test -n "${with_build_subdir}"; then + libiberty_topdir="${srcdir}/../.." + with_target_subdir= + elif test -z "${with_target_subdir}"; then + libiberty_topdir="${srcdir}/.." + else + if test "${with_target_subdir}" != "."; then + libiberty_topdir="${srcdir}/${with_multisrctop}../.." + else + libiberty_topdir="${srcdir}/${with_multisrctop}.." + fi + fi +else + libiberty_topdir="${srcdir}/.." +fi + +ac_aux_dir= +for ac_dir in ../config-aux "$srcdir"/../config-aux; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in ../config-aux \"$srcdir\"/../config-aux" >&5 +echo "$as_me: error: cannot find install-sh or install.sh in ../config-aux \"$srcdir\"/../config-aux" >&2;} + { (exit 1); exit 1; }; } +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + + + + +{ echo "$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles" >&5 +echo $ECHO_N "checking whether to enable maintainer-specific portions of Makefiles... $ECHO_C" >&6; } + # Check whether --enable-maintainer-mode was given. +if test "${enable_maintainer_mode+set}" = set; then + enableval=$enable_maintainer_mode; maintainer_mode=$enableval +else + maintainer_mode=no +fi + + +{ echo "$as_me:$LINENO: result: $maintainer_mode" >&5 +echo "${ECHO_T}$maintainer_mode" >&6; } + +if test "$maintainer_mode" = "yes"; then + MAINT='' + NOTMAINT='#' +else + MAINT='#' + NOTMAINT='' +fi + +# Do we have a single-tree copy of texinfo? Even if we do, we can't +# rely on it - libiberty is built before texinfo. +# Extract the first word of "makeinfo", so it can be a program name with args. +set dummy makeinfo; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_MAKEINFO+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$MAKEINFO"; then + ac_cv_prog_MAKEINFO="$MAKEINFO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_MAKEINFO="makeinfo" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +MAKEINFO=$ac_cv_prog_MAKEINFO +if test -n "$MAKEINFO"; then + { echo "$as_me:$LINENO: result: $MAKEINFO" >&5 +echo "${ECHO_T}$MAKEINFO" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + +if test "x$MAKEINFO" = "x"; then + MAKEINFO="@echo makeinfo missing; true" + BUILD_INFO= +else + BUILD_INFO=info + case "$MAKEINFO" in + */missing\ makeinfo*) + BUILD_INFO= + { echo "$as_me:$LINENO: WARNING: +*** Makeinfo is missing. Info documentation will not be built." >&5 +echo "$as_me: WARNING: +*** Makeinfo is missing. Info documentation will not be built." >&2;} + ;; + *) + case x"`$MAKEINFO --version | grep 'GNU texinfo'`" in + x*\ [1-3].* ) + MAKEINFO="@echo $MAKEINFO is too old, 4.0 or newer required; true" + BUILD_INFO= + { echo "$as_me:$LINENO: WARNING: +*** Makeinfo is too old. Info documentation will not be built." >&5 +echo "$as_me: WARNING: +*** Makeinfo is too old. Info documentation will not be built." >&2;} + ;; + esac + ;; + esac +fi + + + +# Extract the first word of "perl", so it can be a program name with args. +set dummy perl; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_PERL+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$PERL"; then + ac_cv_prog_PERL="$PERL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_PERL="perl" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +PERL=$ac_cv_prog_PERL +if test -n "$PERL"; then + { echo "$as_me:$LINENO: result: $PERL" >&5 +echo "${ECHO_T}$PERL" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + +if test x"$PERL" = x""; then + HAVE_PERL='#' +else + HAVE_PERL='' +fi + + +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + { { echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5 +echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;} + { (exit 1); exit 1; }; } + +{ echo "$as_me:$LINENO: checking build system type" >&5 +echo $ECHO_N "checking build system type... $ECHO_C" >&6; } +if test "${ac_cv_build+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 +echo "$as_me: error: cannot guess build type; you must specify one" >&2;} + { (exit 1); exit 1; }; } +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5 +echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_build" >&5 +echo "${ECHO_T}$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) { { echo "$as_me:$LINENO: error: invalid value of canonical build" >&5 +echo "$as_me: error: invalid value of canonical build" >&2;} + { (exit 1); exit 1; }; };; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ echo "$as_me:$LINENO: checking host system type" >&5 +echo $ECHO_N "checking host system type... $ECHO_C" >&6; } +if test "${ac_cv_host+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5 +echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;} + { (exit 1); exit 1; }; } +fi + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_host" >&5 +echo "${ECHO_T}$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) { { echo "$as_me:$LINENO: error: invalid value of canonical host" >&5 +echo "$as_me: error: invalid value of canonical host" >&2;} + { (exit 1); exit 1; }; };; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. +set dummy ${ac_tool_prefix}ar; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_AR+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AR="${ac_tool_prefix}ar" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { echo "$as_me:$LINENO: result: $AR" >&5 +echo "${ECHO_T}$AR" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_AR"; then + ac_ct_AR=$AR + # Extract the first word of "ar", so it can be a program name with args. +set dummy ar; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_ac_ct_AR+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_AR="ar" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { echo "$as_me:$LINENO: result: $ac_ct_AR" >&5 +echo "${ECHO_T}$ac_ct_AR" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + if test "x$ac_ct_AR" = x; then + AR="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +else + AR="$ac_cv_prog_AR" +fi + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_RANLIB+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { echo "$as_me:$LINENO: result: $RANLIB" >&5 +echo "${ECHO_T}$RANLIB" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 +echo "${ECHO_T}$ac_ct_RANLIB" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + + +# Add --enable-multilib to configure. +# Default to --enable-multilib +# Check whether --enable-multilib was given. +if test "${enable_multilib+set}" = set; then + enableval=$enable_multilib; case "$enableval" in + yes) multilib=yes ;; + no) multilib=no ;; + *) { { echo "$as_me:$LINENO: error: bad value $enableval for multilib option" >&5 +echo "$as_me: error: bad value $enableval for multilib option" >&2;} + { (exit 1); exit 1; }; } ;; + esac +else + multilib=yes +fi + + +# Even if the default multilib is not a cross compilation, +# it may be that some of the other multilibs are. +if test $cross_compiling = no && test $multilib = yes \ + && test "x${with_multisubdir}" != x ; then + cross_compiling=maybe +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + +# Provide some information about the compiler. +echo "$as_me:$LINENO: checking for C compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (ac_try="$ac_compiler --version >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler --version >&5") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler -v >&5") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler -V >&5") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +# FIXME: Cleanup? +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + gcc_no_link=no +else + gcc_no_link=yes +fi + +if test x$gcc_no_link = xyes; then + # Setting cross_compile will disable run tests; it will + # also disable AC_CHECK_FILE but that's generally + # correct if we can't link. + cross_compiling=yes + EXEEXT= +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 +echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; } +ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` +# +# List of possible output files, starting from the most likely. +# The algorithm is not robust to junk in `.', hence go to wildcards (a.*) +# only as a last resort. b.out is created by i960 compilers. +ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out' +# +# The IRIX 6 linker writes into existing files which may not be +# executable, retaining their permissions. Remove them first so a +# subsequent execution test works. +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { (ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi + +{ echo "$as_me:$LINENO: result: $ac_file" >&5 +echo "${ECHO_T}$ac_file" >&6; } +if test -z "$ac_file"; then + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: C compiler cannot create executables +See \`config.log' for more details." >&5 +echo "$as_me: error: C compiler cannot create executables +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; } +fi + +ac_exeext=$ac_cv_exeext + +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ echo "$as_me:$LINENO: checking whether the C compiler works" >&5 +echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; } +# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 +# If not cross compiling, check that we can run a simple program. +if test "$cross_compiling" != yes; then + if { ac_try='./$ac_file' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { echo "$as_me:$LINENO: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + fi + fi +fi +{ echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } + +rm -f a.out a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 +echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; } +{ echo "$as_me:$LINENO: result: $cross_compiling" >&5 +echo "${ECHO_T}$cross_compiling" >&6; } + +{ echo "$as_me:$LINENO: checking for suffix of executables" >&5 +echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; } +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest$ac_cv_exeext +{ echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 +echo "${ECHO_T}$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +fi +{ echo "$as_me:$LINENO: checking for suffix of object files" >&5 +echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; } +if test "${ac_cv_objext+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 +echo "${ECHO_T}$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; } +if test "${ac_cv_c_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_compiler_gnu=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; } +GCC=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; } +if test "${ac_cv_prog_cc_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + CFLAGS="" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 +echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; } +if test "${ac_cv_prog_cc_c89+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_c89=$ac_arg +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { echo "$as_me:$LINENO: result: none needed" >&5 +echo "${ECHO_T}none needed" >&6; } ;; + xno) + { echo "$as_me:$LINENO: result: unsupported" >&5 +echo "${ECHO_T}unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;; +esac + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 +echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test "${ac_cv_prog_CPP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi + +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi + +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ echo "$as_me:$LINENO: result: $CPP" >&5 +echo "${ECHO_T}$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi + +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi + +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&5 +echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +ac_c_preproc_warn_flag=yes + + +ac_libiberty_warn_cflags= +save_CFLAGS="$CFLAGS" +for option in -W -Wall -Wwrite-strings -Wc++-compat \ + -Wstrict-prototypes; do + as_acx_Woption=`echo "acx_cv_prog_cc_warning_$option" | $as_tr_sh` + + { echo "$as_me:$LINENO: checking whether $CC supports $option" >&5 +echo $ECHO_N "checking whether $CC supports $option... $ECHO_C" >&6; } +if { as_var=$as_acx_Woption; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + CFLAGS="$option" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + eval "$as_acx_Woption=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_acx_Woption=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +ac_res=`eval echo '${'$as_acx_Woption'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } + if test `eval echo '${'$as_acx_Woption'}'` = yes; then + ac_libiberty_warn_cflags="$ac_libiberty_warn_cflags${ac_libiberty_warn_cflags:+ }$option" +fi + + done +CFLAGS="$save_CFLAGS" + +if test "$GCC" = yes; then + { echo "$as_me:$LINENO: checking whether $CC supports -pedantic " >&5 +echo $ECHO_N "checking whether $CC supports -pedantic ... $ECHO_C" >&6; } +if test "${acx_cv_prog_cc_pedantic_+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + save_CFLAGS="$CFLAGS" +CFLAGS="-pedantic " +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + acx_cv_prog_cc_pedantic_=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + acx_cv_prog_cc_pedantic_=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +CFLAGS="$save_CFLAGS" +fi +{ echo "$as_me:$LINENO: result: $acx_cv_prog_cc_pedantic_" >&5 +echo "${ECHO_T}$acx_cv_prog_cc_pedantic_" >&6; } +if test $acx_cv_prog_cc_pedantic_ = yes; then + ac_libiberty_warn_cflags="$ac_libiberty_warn_cflags${ac_libiberty_warn_cflags:+ }-pedantic " +fi + + +fi + + + +if test "x$CC" != xcc; then + { echo "$as_me:$LINENO: checking whether $CC and cc understand -c and -o together" >&5 +echo $ECHO_N "checking whether $CC and cc understand -c and -o together... $ECHO_C" >&6; } +else + { echo "$as_me:$LINENO: checking whether cc understands -c and -o together" >&5 +echo $ECHO_N "checking whether cc understands -c and -o together... $ECHO_C" >&6; } +fi +set dummy $CC; ac_cc=`echo $2 | + sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` +if { as_var=ac_cv_prog_cc_${ac_cc}_c_o; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +# Make sure it works both with $CC and with simple cc. +# We do the test twice because some compilers refuse to overwrite an +# existing .o file with -o, though they will create one. +ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5' +rm -f conftest2.* +if { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + test -f conftest2.$ac_objext && { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; +then + eval ac_cv_prog_cc_${ac_cc}_c_o=yes + if test "x$CC" != xcc; then + # Test first that cc exists at all. + if { ac_try='cc -c conftest.$ac_ext >&5' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5' + rm -f conftest2.* + if { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + test -f conftest2.$ac_objext && { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; + then + # cc works too. + : + else + # cc exists but doesn't like -o. + eval ac_cv_prog_cc_${ac_cc}_c_o=no + fi + fi + fi +else + eval ac_cv_prog_cc_${ac_cc}_c_o=no +fi +rm -f core conftest* + +fi +if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } + +cat >>confdefs.h <<\_ACEOF +#define NO_MINUS_C_MINUS_O 1 +_ACEOF + +fi + +# autoconf is lame and doesn't give us any substitution variable for this. +if eval "test \"`echo '$ac_cv_prog_cc_'${ac_cc}_c_o`\" = no"; then + NO_MINUS_C_MINUS_O=yes +else + OUTPUT_OPTION='-o $@' +fi + + + +{ echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5 +echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6; } +if test "${ac_cv_c_const+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +/* FIXME: Include the comments suggested by Paul. */ +#ifndef __cplusplus + /* Ultrix mips cc rejects this. */ + typedef int charset[2]; + const charset cs; + /* SunOS 4.1.1 cc rejects this. */ + char const *const *pcpcc; + char **ppc; + /* NEC SVR4.0.2 mips cc rejects this. */ + struct point {int x, y;}; + static struct point const zero = {0,0}; + /* AIX XL C 1.02.0.0 rejects this. + It does not let you subtract one const X* pointer from another in + an arm of an if-expression whose if-part is not a constant + expression */ + const char *g = "string"; + pcpcc = &g + (g ? g-g : 0); + /* HPUX 7.0 cc rejects these. */ + ++pcpcc; + ppc = (char**) pcpcc; + pcpcc = (char const *const *) ppc; + { /* SCO 3.2v4 cc rejects this. */ + char *t; + char const *s = 0 ? (char *) 0 : (char const *) 0; + + *t++ = 0; + if (s) return 0; + } + { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ + int x[] = {25, 17}; + const int *foo = &x[0]; + ++foo; + } + { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ + typedef const int *iptr; + iptr p = 0; + ++p; + } + { /* AIX XL C 1.02.0.0 rejects this saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; }; + struct s *b; b->j = 5; + } + { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; + if (!foo) return 0; + } + return !cs[0] && !zero.x; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_c_const=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_c_const=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 +echo "${ECHO_T}$ac_cv_c_const" >&6; } +if test $ac_cv_c_const = no; then + +cat >>confdefs.h <<\_ACEOF +#define const +_ACEOF + +fi + +{ echo "$as_me:$LINENO: checking for inline" >&5 +echo $ECHO_N "checking for inline... $ECHO_C" >&6; } +if test "${ac_cv_c_inline+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifndef __cplusplus +typedef int foo_t; +static $ac_kw foo_t static_foo () {return 0; } +$ac_kw foo_t foo () {return 0; } +#endif + +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_c_inline=$ac_kw +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_inline" != no && break +done + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5 +echo "${ECHO_T}$ac_cv_c_inline" >&6; } + + +case $ac_cv_c_inline in + inline | yes) ;; + *) + case $ac_cv_c_inline in + no) ac_val=;; + *) ac_val=$ac_cv_c_inline;; + esac + cat >>confdefs.h <<_ACEOF +#ifndef __cplusplus +#define inline $ac_val +#endif +_ACEOF + ;; +esac + + +{ echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 +echo $ECHO_N "checking for grep that handles long lines and -e... $ECHO_C" >&6; } +if test "${ac_cv_path_GREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Extract the first word of "grep ggrep" to use in msg output +if test -z "$GREP"; then +set dummy grep ggrep; ac_prog_name=$2 +if test "${ac_cv_path_GREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_path_GREP_found=false +# Loop through the user's path and test for each of PROGNAME-LIST +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue + # Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + ac_count=`expr $ac_count + 1` + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + + $ac_path_GREP_found && break 3 + done +done + +done +IFS=$as_save_IFS + + +fi + +GREP="$ac_cv_path_GREP" +if test -z "$GREP"; then + { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } +fi + +else + ac_cv_path_GREP=$GREP +fi + + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 +echo "${ECHO_T}$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ echo "$as_me:$LINENO: checking for egrep" >&5 +echo $ECHO_N "checking for egrep... $ECHO_C" >&6; } +if test "${ac_cv_path_EGREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + # Extract the first word of "egrep" to use in msg output +if test -z "$EGREP"; then +set dummy egrep; ac_prog_name=$2 +if test "${ac_cv_path_EGREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_path_EGREP_found=false +# Loop through the user's path and test for each of PROGNAME-LIST +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue + # Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + ac_count=`expr $ac_count + 1` + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + + $ac_path_EGREP_found && break 3 + done +done + +done +IFS=$as_save_IFS + + +fi + +EGREP="$ac_cv_path_EGREP" +if test -z "$EGREP"; then + { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } +fi + +else + ac_cv_path_EGREP=$EGREP +fi + + + fi +fi +{ echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 +echo "${ECHO_T}$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; } +if test "${ac_cv_header_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_header_stdc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_header_stdc=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then + : +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +fi +{ echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +echo "${ECHO_T}$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +cat >>confdefs.h <<\_ACEOF +#define STDC_HEADERS 1 +_ACEOF + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. + + + + + + + + + +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_Header=no" +fi + +rm -f conftest.err conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +{ echo "$as_me:$LINENO: checking whether byte ordering is bigendian" >&5 +echo $ECHO_N "checking whether byte ordering is bigendian... $ECHO_C" >&6; } +if test "${ac_cv_c_bigendian+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # See if sys/param.h defines the BYTE_ORDER macro. +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include + +int +main () +{ +#if ! (defined BYTE_ORDER && defined BIG_ENDIAN && defined LITTLE_ENDIAN \ + && BYTE_ORDER && BIG_ENDIAN && LITTLE_ENDIAN) + bogus endian macros +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + # It does; now see whether it defined to BIG_ENDIAN or not. +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include + +int +main () +{ +#if BYTE_ORDER != BIG_ENDIAN + not big endian +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_c_bigendian=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_c_bigendian=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # It does not; compile a test program. +if test "$cross_compiling" = yes; then + # try to guess the endianness by grepping values into an object file + ac_cv_c_bigendian=unknown + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; +short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; +void _ascii () { char *s = (char *) ascii_mm; s = (char *) ascii_ii; } +short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; +short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; +void _ebcdic () { char *s = (char *) ebcdic_mm; s = (char *) ebcdic_ii; } +int +main () +{ + _ascii (); _ebcdic (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + if grep BIGenDianSyS conftest.$ac_objext >/dev/null ; then + ac_cv_c_bigendian=yes +fi +if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then + if test "$ac_cv_c_bigendian" = unknown; then + ac_cv_c_bigendian=no + else + # finding both strings is unlikely to happen, but who knows? + ac_cv_c_bigendian=unknown + fi +fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ + + /* Are we little or big endian? From Harbison&Steele. */ + union + { + long int l; + char c[sizeof (long int)]; + } u; + u.l = 1; + return u.c[sizeof (long int) - 1] == 1; + + ; + return 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_c_bigendian=no +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_c_bigendian=yes +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_c_bigendian" >&5 +echo "${ECHO_T}$ac_cv_c_bigendian" >&6; } +case $ac_cv_c_bigendian in + yes) + +cat >>confdefs.h <<\_ACEOF +#define WORDS_BIGENDIAN 1 +_ACEOF + ;; + no) + ;; + *) + { { echo "$as_me:$LINENO: error: unknown endianness +presetting ac_cv_c_bigendian=no (or yes) will help" >&5 +echo "$as_me: error: unknown endianness +presetting ac_cv_c_bigendian=no (or yes) will help" >&2;} + { (exit 1); exit 1; }; } ;; +esac + + + + +ac_config_headers="$ac_config_headers config.h:config.in" + + + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +{ echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; } +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in + ./ | .// | /cC/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + done + done + ;; +esac +done +IFS=$as_save_IFS + + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ echo "$as_me:$LINENO: result: $INSTALL" >&5 +echo "${ECHO_T}$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + + +# Don't build the shared library for build. +if [ -n "${with_build_subdir}" ]; then + enable_shared=no +fi + +frag= +case "${host}" in + rs6000-ibm-aix3.1 | rs6000-ibm-aix) + frag=mh-aix ;; + *-*-cxux7*) frag=mh-cxux7 ;; + *-*-freebsd2.1.*) frag=mh-fbsd21 ;; + *-*-freebsd2.2.[012]) frag=mh-fbsd21 ;; + i370-*-opened*) frag=mh-openedition ;; + i[34567]86-*-windows*) frag=mh-windows ;; +esac + +if [ -n "${frag}" ]; then + frags=${libiberty_topdir}/libiberty/config/$frag +else + frags= +fi + +# If they didn't specify --enable-shared, don't generate shared libs. +case "${enable_shared}" in + yes) shared=yes ;; + no) shared=no ;; + "") shared=no ;; + *) shared=yes ;; +esac +if [ "${shared}" = "yes" ]; then + frag= + case "${host}" in + *-*-cygwin*) ;; + alpha*-*-linux*) frag=mh-elfalphapic ;; + arm*-*-*) frag=mh-armpic ;; + hppa*-*-*) frag=mh-papic ;; + i[34567]86-*-* | x86_64-*-*) + frag=mh-x86pic ;; + powerpc*-*-aix*) ;; + powerpc*-*-*) frag=mh-ppcpic ;; + sparc*-*-*) frag=mh-sparcpic ;; + s390*-*-*) frag=mh-s390pic ;; + *) frag=mh-${host_cpu}pic ;; + esac + if [ -n "${frag}" ]; then + frags="${frags} ${libiberty_topdir}/config/${frag}" + fi +fi + +echo "# Warning: this fragment is automatically generated" > temp-frag + +for frag in ${frags}; do + if [ -f ${frag} ]; then + echo "Appending ${frag} to xhost-mkfrag" + echo "# Following fragment copied from ${frag}" >> temp-frag + cat ${frag} >> temp-frag + fi +done + +# record if we want to build shared libs. +if [ "${shared}" = "yes" ]; then + echo enable_shared = yes >> temp-frag +else + echo enable_shared = no >> temp-frag +fi + +frag=xhost-mkfrag +${CONFIG_SHELL-/bin/sh} ${libiberty_topdir}/move-if-change temp-frag xhost-mkfrag + +host_makefile_frag=${frag} + + +# It's OK to check for header files. Although the compiler may not be +# able to link anything, it had better be able to at least compile +# something. + + + + + + + + + + + + + + + + + + + + + + + + +for ac_header in sys/file.h sys/param.h limits.h stdlib.h malloc.h string.h unistd.h strings.h sys/time.h time.h sys/resource.h sys/stat.h sys/mman.h fcntl.h alloca.h sys/pstat.h sys/sysmp.h sys/sysinfo.h machine/hal_sysinfo.h sys/table.h sys/sysctl.h sys/systemcfg.h stdint.h stdio_ext.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_Header=no" +fi + +rm -f conftest.err conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +{ echo "$as_me:$LINENO: checking for sys/wait.h that is POSIX.1 compatible" >&5 +echo $ECHO_N "checking for sys/wait.h that is POSIX.1 compatible... $ECHO_C" >&6; } +if test "${ac_cv_header_sys_wait_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#ifndef WEXITSTATUS +# define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8) +#endif +#ifndef WIFEXITED +# define WIFEXITED(stat_val) (((stat_val) & 255) == 0) +#endif + +int +main () +{ + int s; + wait (&s); + s = WIFEXITED (s) ? WEXITSTATUS (s) : 1; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_header_sys_wait_h=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_header_sys_wait_h=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_header_sys_wait_h" >&5 +echo "${ECHO_T}$ac_cv_header_sys_wait_h" >&6; } +if test $ac_cv_header_sys_wait_h = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_SYS_WAIT_H 1 +_ACEOF + +fi + +{ echo "$as_me:$LINENO: checking whether time.h and sys/time.h may both be included" >&5 +echo $ECHO_N "checking whether time.h and sys/time.h may both be included... $ECHO_C" >&6; } +if test "${ac_cv_header_time+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include + +int +main () +{ +if ((struct tm *) 0) +return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_header_time=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_header_time=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_header_time" >&5 +echo "${ECHO_T}$ac_cv_header_time" >&6; } +if test $ac_cv_header_time = yes; then + +cat >>confdefs.h <<\_ACEOF +#define TIME_WITH_SYS_TIME 1 +_ACEOF + +fi + + +{ echo "$as_me:$LINENO: checking whether errno must be declared" >&5 +echo $ECHO_N "checking whether errno must be declared... $ECHO_C" >&6; } +if test "${libiberty_cv_declare_errno+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +int x = errno; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + libiberty_cv_declare_errno=no +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + libiberty_cv_declare_errno=yes +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $libiberty_cv_declare_errno" >&5 +echo "${ECHO_T}$libiberty_cv_declare_errno" >&6; } +if test $libiberty_cv_declare_errno = yes +then +cat >>confdefs.h <<\_ACEOF +#define NEED_DECLARATION_ERRNO 1 +_ACEOF + +fi + + +# Determine the size of an int for struct fibnode. +{ echo "$as_me:$LINENO: checking for int" >&5 +echo $ECHO_N "checking for int... $ECHO_C" >&6; } +if test "${ac_cv_type_int+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +typedef int ac__type_new_; +int +main () +{ +if ((ac__type_new_ *) 0) + return 0; +if (sizeof (ac__type_new_)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_type_int=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_type_int=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_type_int" >&5 +echo "${ECHO_T}$ac_cv_type_int" >&6; } + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ echo "$as_me:$LINENO: checking size of int" >&5 +echo $ECHO_N "checking size of int... $ECHO_C" >&6; } +if test "${ac_cv_sizeof_int+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + typedef int ac__type_sizeof_; +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=0 ac_mid=0 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + typedef int ac__type_sizeof_; +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid; break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr $ac_mid + 1` + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + typedef int ac__type_sizeof_; +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=-1 ac_mid=-1 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + typedef int ac__type_sizeof_; +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=$ac_mid; break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_hi=`expr '(' $ac_mid ')' - 1` + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo= ac_hi= +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +# Binary search between lo and hi bounds. +while test "x$ac_lo" != "x$ac_hi"; do + ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + typedef int ac__type_sizeof_; +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr '(' $ac_mid ')' + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in +?*) ac_cv_sizeof_int=$ac_lo;; +'') if test "$ac_cv_type_int" = yes; then + { { echo "$as_me:$LINENO: error: cannot compute sizeof (int) +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute sizeof (int) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; } + else + ac_cv_sizeof_int=0 + fi ;; +esac +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + typedef int ac__type_sizeof_; +static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); } +static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); } +#include +#include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (((long int) (sizeof (ac__type_sizeof_))) < 0) + { + long int i = longval (); + if (i != ((long int) (sizeof (ac__type_sizeof_)))) + return 1; + fprintf (f, "%ld\n", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ((long int) (sizeof (ac__type_sizeof_)))) + return 1; + fprintf (f, "%lu\n", i); + } + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_sizeof_int=`cat conftest.val` +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +if test "$ac_cv_type_int" = yes; then + { { echo "$as_me:$LINENO: error: cannot compute sizeof (int) +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute sizeof (int) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; } + else + ac_cv_sizeof_int=0 + fi +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +rm -f conftest.val +fi +{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_int" >&5 +echo "${ECHO_T}$ac_cv_sizeof_int" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_INT $ac_cv_sizeof_int +_ACEOF + + + +{ echo "$as_me:$LINENO: checking for uintptr_t" >&5 +echo $ECHO_N "checking for uintptr_t... $ECHO_C" >&6; } +if test "${ac_cv_type_uintptr_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +typedef uintptr_t ac__type_new_; +int +main () +{ +if ((ac__type_new_ *) 0) + return 0; +if (sizeof (ac__type_new_)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_type_uintptr_t=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_type_uintptr_t=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_type_uintptr_t" >&5 +echo "${ECHO_T}$ac_cv_type_uintptr_t" >&6; } +if test $ac_cv_type_uintptr_t = yes; then + : +else + +cat >>confdefs.h <<_ACEOF +#define uintptr_t unsigned long +_ACEOF + +fi + + +# Look for a 64-bit type. +{ echo "$as_me:$LINENO: checking for a 64-bit type" >&5 +echo $ECHO_N "checking for a 64-bit type... $ECHO_C" >&6; } +if test "${liberty_cv_uint64+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef HAVE_STDINT_H +#include +#endif +int +main () +{ +extern uint64_t foo; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + liberty_cv_uint64=uint64_t +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef HAVE_LIMITS_H +#include +#endif +#ifndef CHAR_BIT +#define CHAR_BIT 8 +#endif +int +main () +{ +extern char foo[sizeof(long) * CHAR_BIT >= 64 ? 1 : -1]; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + liberty_cv_uint64="unsigned long" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef HAVE_LIMITS_H +#include +#endif +#ifndef CHAR_BIT +#define CHAR_BIT 8 +#endif +int +main () +{ +extern char foo[sizeof(long long) * CHAR_BIT >= 64 ? 1 : -1]; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + liberty_cv_uint64="unsigned long long" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + liberty_cv_uint64=none +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +{ echo "$as_me:$LINENO: result: $liberty_cv_uint64" >&5 +echo "${ECHO_T}$liberty_cv_uint64" >&6; } +if test "$liberty_cv_uint64" != none; then + +cat >>confdefs.h <<_ACEOF +#define UNSIGNED_64BIT_TYPE $liberty_cv_uint64 +_ACEOF + +fi + +# Given the above check, we always have uintptr_t or a fallback +# definition. So define HAVE_UINTPTR_T in case any imported code +# relies on it. + +cat >>confdefs.h <<\_ACEOF +#define HAVE_UINTPTR_T 1 +_ACEOF + + +{ echo "$as_me:$LINENO: checking for pid_t" >&5 +echo $ECHO_N "checking for pid_t... $ECHO_C" >&6; } +if test "${ac_cv_type_pid_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +typedef pid_t ac__type_new_; +int +main () +{ +if ((ac__type_new_ *) 0) + return 0; +if (sizeof (ac__type_new_)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_type_pid_t=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_type_pid_t=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_type_pid_t" >&5 +echo "${ECHO_T}$ac_cv_type_pid_t" >&6; } +if test $ac_cv_type_pid_t = yes; then + : +else + +cat >>confdefs.h <<_ACEOF +#define pid_t int +_ACEOF + +fi + + +# This is the list of functions which libiberty will provide if they +# are not available on the host. + +funcs="asprintf" +funcs="$funcs atexit" +funcs="$funcs basename" +funcs="$funcs bcmp" +funcs="$funcs bcopy" +funcs="$funcs bsearch" +funcs="$funcs bzero" +funcs="$funcs calloc" +funcs="$funcs clock" +funcs="$funcs ffs" +funcs="$funcs getcwd" +funcs="$funcs getpagesize" +funcs="$funcs gettimeofday" +funcs="$funcs index" +funcs="$funcs insque" +funcs="$funcs memchr" +funcs="$funcs memcmp" +funcs="$funcs memcpy" +funcs="$funcs memmove" +funcs="$funcs mempcpy" +funcs="$funcs memset" +funcs="$funcs mkstemps" +funcs="$funcs putenv" +funcs="$funcs random" +funcs="$funcs rename" +funcs="$funcs rindex" +funcs="$funcs setenv" +funcs="$funcs snprintf" +funcs="$funcs sigsetmask" +funcs="$funcs stpcpy" +funcs="$funcs stpncpy" +funcs="$funcs strcasecmp" +funcs="$funcs strchr" +funcs="$funcs strdup" +funcs="$funcs strncasecmp" +funcs="$funcs strndup" +funcs="$funcs strrchr" +funcs="$funcs strstr" +funcs="$funcs strtod" +funcs="$funcs strtol" +funcs="$funcs strtoul" +funcs="$funcs strverscmp" +funcs="$funcs tmpnam" +funcs="$funcs vasprintf" +funcs="$funcs vfprintf" +funcs="$funcs vprintf" +funcs="$funcs vsnprintf" +funcs="$funcs vsprintf" +funcs="$funcs waitpid" + +# Also in the old function.def file: alloca, vfork, getopt. + +vars="sys_errlist sys_nerr sys_siglist" + +checkfuncs="getrusage on_exit psignal strerror strsignal sysconf times sbrk gettimeofday" +checkfuncs="$checkfuncs realpath canonicalize_file_name pstat_getstatic pstat_getdynamic sysmp" +checkfuncs="$checkfuncs getsysinfo table sysctl wait3 wait4 __fsetlocking" + +# These are neither executed nor required, but they help keep +# autoheader happy without adding a bunch of text to acconfig.h. +if test "x" = "y"; then + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +for ac_func in asprintf atexit basename bcmp bcopy bsearch bzero calloc clock \ + getcwd getpagesize gettimeofday index insque mkstemps memchr memcmp memcpy \ + memmove mempcpy memset putenv random rename rindex sigsetmask \ + strcasecmp setenv stpcpy stpncpy strchr strdup strncasecmp strndup strrchr strstr \ + strtod strtol strtoul strverscmp tmpnam vasprintf vfprintf vprintf \ + vsprintf waitpid getrusage on_exit psignal strerror strsignal \ + sysconf times sbrk gettimeofday ffs snprintf vsnprintf \ + pstat_getstatic pstat_getdynamic sysmp getsysinfo table sysctl wait3 wait4 \ + realpath canonicalize_file_name __fsetlocking +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test x$gcc_no_link = xyes; then + { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 +echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} + { (exit 1); exit 1; }; } +fi +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. Under hpux, + including includes and causes problems + checking for functions defined therein. */ +#if defined (__STDC__) && !defined (_HPUX_SOURCE) +# include +#else +# include +#endif +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != $ac_func; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + { echo "$as_me:$LINENO: checking whether basename is declared" >&5 +echo $ECHO_N "checking whether basename is declared... $ECHO_C" >&6; } +if test "${ac_cv_have_decl_basename+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef basename + (void) basename; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_basename=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_basename=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_basename" >&5 +echo "${ECHO_T}$ac_cv_have_decl_basename" >&6; } +if test $ac_cv_have_decl_basename = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_BASENAME 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_BASENAME 0 +_ACEOF + + +fi +{ echo "$as_me:$LINENO: checking whether ffs is declared" >&5 +echo $ECHO_N "checking whether ffs is declared... $ECHO_C" >&6; } +if test "${ac_cv_have_decl_ffs+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef ffs + (void) ffs; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_ffs=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_ffs=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_ffs" >&5 +echo "${ECHO_T}$ac_cv_have_decl_ffs" >&6; } +if test $ac_cv_have_decl_ffs = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FFS 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FFS 0 +_ACEOF + + +fi +{ echo "$as_me:$LINENO: checking whether asprintf is declared" >&5 +echo $ECHO_N "checking whether asprintf is declared... $ECHO_C" >&6; } +if test "${ac_cv_have_decl_asprintf+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef asprintf + (void) asprintf; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_asprintf=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_asprintf=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_asprintf" >&5 +echo "${ECHO_T}$ac_cv_have_decl_asprintf" >&6; } +if test $ac_cv_have_decl_asprintf = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_ASPRINTF 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_ASPRINTF 0 +_ACEOF + + +fi +{ echo "$as_me:$LINENO: checking whether vasprintf is declared" >&5 +echo $ECHO_N "checking whether vasprintf is declared... $ECHO_C" >&6; } +if test "${ac_cv_have_decl_vasprintf+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef vasprintf + (void) vasprintf; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_vasprintf=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_vasprintf=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_vasprintf" >&5 +echo "${ECHO_T}$ac_cv_have_decl_vasprintf" >&6; } +if test $ac_cv_have_decl_vasprintf = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_VASPRINTF 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_VASPRINTF 0 +_ACEOF + + +fi +{ echo "$as_me:$LINENO: checking whether snprintf is declared" >&5 +echo $ECHO_N "checking whether snprintf is declared... $ECHO_C" >&6; } +if test "${ac_cv_have_decl_snprintf+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef snprintf + (void) snprintf; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_snprintf=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_snprintf=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_snprintf" >&5 +echo "${ECHO_T}$ac_cv_have_decl_snprintf" >&6; } +if test $ac_cv_have_decl_snprintf = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_SNPRINTF 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_SNPRINTF 0 +_ACEOF + + +fi +{ echo "$as_me:$LINENO: checking whether vsnprintf is declared" >&5 +echo $ECHO_N "checking whether vsnprintf is declared... $ECHO_C" >&6; } +if test "${ac_cv_have_decl_vsnprintf+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef vsnprintf + (void) vsnprintf; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_vsnprintf=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_vsnprintf=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_vsnprintf" >&5 +echo "${ECHO_T}$ac_cv_have_decl_vsnprintf" >&6; } +if test $ac_cv_have_decl_vsnprintf = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_VSNPRINTF 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_VSNPRINTF 0 +_ACEOF + + +fi + + + +cat >>confdefs.h <<\_ACEOF +#define HAVE_SYS_ERRLIST 1 +_ACEOF + + +cat >>confdefs.h <<\_ACEOF +#define HAVE_SYS_NERR 1 +_ACEOF + + +cat >>confdefs.h <<\_ACEOF +#define HAVE_SYS_SIGLIST 1 +_ACEOF + +fi + +# For each of these functions, if the host does not provide the +# function we want to put FN.o in LIBOBJS, and if the host does +# provide the function, we want to define HAVE_FN in config.h. + +setobjs= +CHECK= +target_header_dir= +if test -n "${with_target_subdir}"; then + + # We are being configured as a target library. AC_REPLACE_FUNCS + # may not work correctly, because the compiler may not be able to + # link executables. Note that we may still be being configured + # native. + + # If we are being configured for newlib, we know which functions + # newlib provide and which ones we will be expected to provide. + + if test "x${with_newlib}" = "xyes"; then + case " $LIBOBJS " in + *" asprintf.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS asprintf.$ac_objext" + ;; +esac + + case " $LIBOBJS " in + *" basename.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS basename.$ac_objext" + ;; +esac + + case " $LIBOBJS " in + *" insque.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS insque.$ac_objext" + ;; +esac + + case " $LIBOBJS " in + *" random.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS random.$ac_objext" + ;; +esac + + case " $LIBOBJS " in + *" strdup.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS strdup.$ac_objext" + ;; +esac + + case " $LIBOBJS " in + *" vasprintf.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS vasprintf.$ac_objext" + ;; +esac + + + for f in $funcs; do + case "$f" in + asprintf | basename | insque | random | strdup | vasprintf) + ;; + *) + n=HAVE_`echo $f | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >>confdefs.h <<_ACEOF +#define $n 1 +_ACEOF + + ;; + esac + done + + # newlib doesnt provide any of the variables in $vars, so we + # dont have to check them here. + + # Of the functions in $checkfuncs, newlib only has strerror. + cat >>confdefs.h <<\_ACEOF +#define HAVE_STRERROR 1 +_ACEOF + + + setobjs=yes + + fi + + # If we are being configured for Mingw, we know which functions + # Mingw provides and which ones we will be expected to provide. + + case "${host}" in + *-*-mingw*) + case " $LIBOBJS " in + *" asprintf.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS asprintf.$ac_objext" + ;; +esac + + case " $LIBOBJS " in + *" basename.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS basename.$ac_objext" + ;; +esac + + case " $LIBOBJS " in + *" bcmp.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS bcmp.$ac_objext" + ;; +esac + + case " $LIBOBJS " in + *" bcopy.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS bcopy.$ac_objext" + ;; +esac + + case " $LIBOBJS " in + *" bzero.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS bzero.$ac_objext" + ;; +esac + + case " $LIBOBJS " in + *" clock.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS clock.$ac_objext" + ;; +esac + + case " $LIBOBJS " in + *" ffs.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS ffs.$ac_objext" + ;; +esac + + case " $LIBOBJS " in + *" getpagesize.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS getpagesize.$ac_objext" + ;; +esac + + case " $LIBOBJS " in + *" index.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS index.$ac_objext" + ;; +esac + + case " $LIBOBJS " in + *" insque.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS insque.$ac_objext" + ;; +esac + + case " $LIBOBJS " in + *" mempcpy.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS mempcpy.$ac_objext" + ;; +esac + + case " $LIBOBJS " in + *" mkstemps.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS mkstemps.$ac_objext" + ;; +esac + + case " $LIBOBJS " in + *" random.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS random.$ac_objext" + ;; +esac + + case " $LIBOBJS " in + *" rindex.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS rindex.$ac_objext" + ;; +esac + + case " $LIBOBJS " in + *" sigsetmask.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS sigsetmask.$ac_objext" + ;; +esac + + case " $LIBOBJS " in + *" stpcpy.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS stpcpy.$ac_objext" + ;; +esac + + case " $LIBOBJS " in + *" stpncpy.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS stpncpy.$ac_objext" + ;; +esac + + case " $LIBOBJS " in + *" strndup.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS strndup.$ac_objext" + ;; +esac + + case " $LIBOBJS " in + *" strverscmp.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS strverscmp.$ac_objext" + ;; +esac + + case " $LIBOBJS " in + *" vasprintf.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS vasprintf.$ac_objext" + ;; +esac + + case " $LIBOBJS " in + *" waitpid.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS waitpid.$ac_objext" + ;; +esac + + + for f in $funcs; do + case "$f" in + asprintf | basename | bcmp | bcopy | bzero | clock | ffs | getpagesize | index | insque | mempcpy | mkstemps | random | rindex | sigsetmask | stpcpy | stpncpy | strdup | strndup | strverscmp | vasprintf | waitpid) + ;; + *) + n=HAVE_`echo $f | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >>confdefs.h <<_ACEOF +#define $n 1 +_ACEOF + + ;; + esac + done + + # Mingw doesnt provide any of the variables in $vars, so we + # dont have to check them here. + + # Of the functions in $checkfuncs, Mingw only has strerror. + cat >>confdefs.h <<\_ACEOF +#define HAVE_STRERROR 1 +_ACEOF + + + setobjs=yes + ;; + + esac + + # We may wish to install the target headers somewhere. + # Check whether --enable-install-libiberty was given. +if test "${enable_install_libiberty+set}" = set; then + enableval=$enable_install_libiberty; enable_install_libiberty=$enableval +else + enable_install_libiberty=no +fi + + # Option parsed, now set things appropriately. + case x"$enable_install_libiberty" in + xyes|x) + target_header_dir=libiberty + ;; + xno) + target_header_dir= + ;; + *) + # This could be sanity-checked in various ways... + target_header_dir="${enable_install_libiberty}" + ;; + esac + + +else + + # Not a target library, so we set things up to run the test suite. + CHECK=really-check + +fi + + + + +case "${host}" in + *-*-cygwin* | *-*-mingw*) + cat >>confdefs.h <<\_ACEOF +#define HAVE_SYS_ERRLIST 1 +_ACEOF + + cat >>confdefs.h <<\_ACEOF +#define HAVE_SYS_NERR 1 +_ACEOF + + ;; +esac + +if test -z "${setobjs}"; then + case "${host}" in + + *-*-vxworks*) + # Handle VxWorks configuration specially, since on VxWorks the + # libraries are actually on the target board, not in the file + # system. + case " $LIBOBJS " in + *" basename.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS basename.$ac_objext" + ;; +esac + + case " $LIBOBJS " in + *" getpagesize.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS getpagesize.$ac_objext" + ;; +esac + + case " $LIBOBJS " in + *" insque.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS insque.$ac_objext" + ;; +esac + + case " $LIBOBJS " in + *" random.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS random.$ac_objext" + ;; +esac + + case " $LIBOBJS " in + *" strcasecmp.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS strcasecmp.$ac_objext" + ;; +esac + + case " $LIBOBJS " in + *" strncasecmp.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS strncasecmp.$ac_objext" + ;; +esac + + case " $LIBOBJS " in + *" strdup.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS strdup.$ac_objext" + ;; +esac + + case " $LIBOBJS " in + *" vfork.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS vfork.$ac_objext" + ;; +esac + + case " $LIBOBJS " in + *" waitpid.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS waitpid.$ac_objext" + ;; +esac + + case " $LIBOBJS " in + *" vasprintf.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS vasprintf.$ac_objext" + ;; +esac + + for f in $funcs; do + case "$f" in + basename | getpagesize | insque | random | strcasecmp) + ;; + strncasecmp | strdup | vfork | waitpid | vasprintf) + ;; + *) + n=HAVE_`echo $f | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >>confdefs.h <<_ACEOF +#define $n 1 +_ACEOF + + ;; + esac + done + + # VxWorks doesn't provide any of the variables in $vars, so we + # don't have to check them here. + + # Of the functions in $checkfuncs, VxWorks only has strerror. + cat >>confdefs.h <<\_ACEOF +#define HAVE_STRERROR 1 +_ACEOF + + + setobjs=yes + ;; + + *-*-msdosdjgpp) + for f in atexit basename bcmp bcopy bsearch bzero calloc clock ffs \ + getcwd getpagesize getrusage gettimeofday \ + index insque memchr memcmp memcpy memmove memset psignal \ + putenv random rename rindex sbrk setenv stpcpy strcasecmp \ + strchr strdup strerror strncasecmp strrchr strstr strtod \ + strtol strtoul sysconf times tmpnam vfprintf vprintf \ + vsprintf waitpid + do + n=HAVE_`echo $f | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >>confdefs.h <<_ACEOF +#define $n 1 +_ACEOF + + done + + + setobjs=yes + ;; + + esac +fi + +if test -z "${setobjs}"; then + + case "${host}" in + + *-*-cygwin*) + # The Cygwin library actually uses a couple of files from + # libiberty when it is built. If we are building a native + # Cygwin, and we run the tests, we will appear to have these + # files. However, when we go on to build winsup, we will wind up + # with a library which does not have the files, since they should + # have come from libiberty. + + # We handle this by removing the functions the winsup library + # provides from our shell variables, so that they appear to be + # missing. + + # DJ - only if we're *building* cygwin, not just building *with* cygwin + + if test -n "${with_target_subdir}" + then + funcs="`echo $funcs | sed -e 's/random//'`" + case " $LIBOBJS " in + *" random.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS random.$ac_objext" + ;; +esac + + vars="`echo $vars | sed -e 's/sys_siglist//'`" + checkfuncs="`echo $checkfuncs | sed -e 's/strsignal//' -e 's/psignal//'`" + fi + ;; + + *-*-mingw32*) + # Under mingw32, sys_nerr and sys_errlist exist, but they are + # macros, so the test below won't find them. + libiberty_cv_var_sys_nerr=yes + libiberty_cv_var_sys_errlist=yes + ;; + + *-*-msdosdjgpp*) + # vfork and fork are stubs. + ac_cv_func_vfork_works=no + ;; + + *-*-uwin*) + # Under some versions of uwin, vfork is notoriously buggy and the test + # can hang configure; on other versions, vfork exists just as a stub. + # FIXME: This should be removed once vfork in uwin's runtime is fixed. + ac_cv_func_vfork_works=no + # Under uwin 2.0+, sys_nerr and sys_errlist exist, but they are + # macros (actually, these are imported from a DLL, but the end effect + # is the same), so the test below won't find them. + libiberty_cv_var_sys_nerr=yes + libiberty_cv_var_sys_errlist=yes + ;; + + *-*-*vms*) + # Under VMS, vfork works very different than on Unix. The standard test + # won't work, and it isn't easily adaptable. It makes more sense to + # just force it. + ac_cv_func_vfork_works=yes + ;; + + esac + + # We haven't set the list of objects yet. Use the standard autoconf + # tests. This will only work if the compiler works. + { echo "$as_me:$LINENO: checking for library containing strerror" >&5 +echo $ECHO_N "checking for library containing strerror... $ECHO_C" >&6; } +if test "${ac_cv_search_strerror+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_func_search_save_LIBS=$LIBS +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char strerror (); +int +main () +{ +return strerror (); + ; + return 0; +} +_ACEOF +for ac_lib in '' cposix; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if test x$gcc_no_link = xyes; then + { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 +echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} + { (exit 1); exit 1; }; } +fi +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + ac_cv_search_strerror=$ac_res +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext + if test "${ac_cv_search_strerror+set}" = set; then + break +fi +done +if test "${ac_cv_search_strerror+set}" = set; then + : +else + ac_cv_search_strerror=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_search_strerror" >&5 +echo "${ECHO_T}$ac_cv_search_strerror" >&6; } +ac_res=$ac_cv_search_strerror +if test "$ac_res" != no; then + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + + +for ac_func in $funcs +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test x$gcc_no_link = xyes; then + { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 +echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} + { (exit 1); exit 1; }; } +fi +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. Under hpux, + including includes and causes problems + checking for functions defined therein. */ +#if defined (__STDC__) && !defined (_HPUX_SOURCE) +# include +#else +# include +#endif +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != $ac_func; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +else + case " $LIBOBJS " in + *" $ac_func.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS $ac_func.$ac_objext" + ;; +esac + +fi +done + + + { echo "$as_me:$LINENO: checking whether alloca needs Cray hooks" >&5 +echo $ECHO_N "checking whether alloca needs Cray hooks... $ECHO_C" >&6; } +if test "${ac_cv_os_cray+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#if defined(CRAY) && ! defined(CRAY2) +webecray +#else +wenotbecray +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "webecray" >/dev/null 2>&1; then + ac_cv_os_cray=yes +else + ac_cv_os_cray=no +fi +rm -f conftest* + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_os_cray" >&5 +echo "${ECHO_T}$ac_cv_os_cray" >&6; } +if test $ac_cv_os_cray = yes; then + for ac_func in _getb67 GETB67 getb67; do + as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test x$gcc_no_link = xyes; then + { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 +echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} + { (exit 1); exit 1; }; } +fi +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. Under hpux, + including includes and causes problems + checking for functions defined therein. */ +#if defined (__STDC__) && !defined (_HPUX_SOURCE) +# include +#else +# include +#endif +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != $ac_func; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_var'}'` = yes; then + +cat >>confdefs.h <<_ACEOF +#define CRAY_STACKSEG_END $ac_func +_ACEOF + break +fi + + done +fi + +{ echo "$as_me:$LINENO: checking stack direction for C alloca" >&5 +echo $ECHO_N "checking stack direction for C alloca... $ECHO_C" >&6; } +if test "${ac_cv_c_stack_direction+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + ac_cv_c_stack_direction=0 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +find_stack_direction () +{ + static char *addr = 0; + auto char dummy; + if (addr == 0) + { + addr = &dummy; + return find_stack_direction (); + } + else + return (&dummy > addr) ? 1 : -1; +} +main () +{ + exit (find_stack_direction() < 0); +} +_ACEOF +rm -f conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_c_stack_direction=1 +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_c_stack_direction=-1 +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_c_stack_direction" >&5 +echo "${ECHO_T}$ac_cv_c_stack_direction" >&6; } + +cat >>confdefs.h <<_ACEOF +#define STACK_DIRECTION $ac_cv_c_stack_direction +_ACEOF + + + +for ac_header in vfork.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_Header=no" +fi + +rm -f conftest.err conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + + +for ac_func in fork vfork +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test x$gcc_no_link = xyes; then + { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 +echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} + { (exit 1); exit 1; }; } +fi +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. Under hpux, + including includes and causes problems + checking for functions defined therein. */ +#if defined (__STDC__) && !defined (_HPUX_SOURCE) +# include +#else +# include +#endif +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != $ac_func; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +if test "x$ac_cv_func_fork" = xyes; then + { echo "$as_me:$LINENO: checking for working fork" >&5 +echo $ECHO_N "checking for working fork... $ECHO_C" >&6; } +if test "${ac_cv_func_fork_works+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + ac_cv_func_fork_works=cross +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ + + /* By Ruediger Kuhlmann. */ + return fork () < 0; + + ; + return 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_fork_works=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_func_fork_works=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_func_fork_works" >&5 +echo "${ECHO_T}$ac_cv_func_fork_works" >&6; } + +else + ac_cv_func_fork_works=$ac_cv_func_fork +fi +if test "x$ac_cv_func_fork_works" = xcross; then + case $host in + *-*-amigaos* | *-*-msdosdjgpp*) + # Override, as these systems have only a dummy fork() stub + ac_cv_func_fork_works=no + ;; + *) + ac_cv_func_fork_works=yes + ;; + esac + { echo "$as_me:$LINENO: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&5 +echo "$as_me: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&2;} +fi +ac_cv_func_vfork_works=$ac_cv_func_vfork +if test "x$ac_cv_func_vfork" = xyes; then + { echo "$as_me:$LINENO: checking for working vfork" >&5 +echo $ECHO_N "checking for working vfork... $ECHO_C" >&6; } +if test "${ac_cv_func_vfork_works+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + ac_cv_func_vfork_works=cross +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Thanks to Paul Eggert for this test. */ +$ac_includes_default +#include +#ifdef HAVE_VFORK_H +# include +#endif +/* On some sparc systems, changes by the child to local and incoming + argument registers are propagated back to the parent. The compiler + is told about this with #include , but some compilers + (e.g. gcc -O) don't grok . Test for this by using a + static variable whose address is put into a register that is + clobbered by the vfork. */ +static void +#ifdef __cplusplus +sparc_address_test (int arg) +# else +sparc_address_test (arg) int arg; +#endif +{ + static pid_t child; + if (!child) { + child = vfork (); + if (child < 0) { + perror ("vfork"); + _exit(2); + } + if (!child) { + arg = getpid(); + write(-1, "", 0); + _exit (arg); + } + } +} + +int +main () +{ + pid_t parent = getpid (); + pid_t child; + + sparc_address_test (0); + + child = vfork (); + + if (child == 0) { + /* Here is another test for sparc vfork register problems. This + test uses lots of local variables, at least as many local + variables as main has allocated so far including compiler + temporaries. 4 locals are enough for gcc 1.40.3 on a Solaris + 4.1.3 sparc, but we use 8 to be safe. A buggy compiler should + reuse the register of parent for one of the local variables, + since it will think that parent can't possibly be used any more + in this routine. Assigning to the local variable will thus + munge parent in the parent process. */ + pid_t + p = getpid(), p1 = getpid(), p2 = getpid(), p3 = getpid(), + p4 = getpid(), p5 = getpid(), p6 = getpid(), p7 = getpid(); + /* Convince the compiler that p..p7 are live; otherwise, it might + use the same hardware register for all 8 local variables. */ + if (p != p1 || p != p2 || p != p3 || p != p4 + || p != p5 || p != p6 || p != p7) + _exit(1); + + /* On some systems (e.g. IRIX 3.3), vfork doesn't separate parent + from child file descriptors. If the child closes a descriptor + before it execs or exits, this munges the parent's descriptor + as well. Test for this by closing stdout in the child. */ + _exit(close(fileno(stdout)) != 0); + } else { + int status; + struct stat st; + + while (wait(&status) != child) + ; + return ( + /* Was there some problem with vforking? */ + child < 0 + + /* Did the child fail? (This shouldn't happen.) */ + || status + + /* Did the vfork/compiler bug occur? */ + || parent != getpid() + + /* Did the file descriptor bug occur? */ + || fstat(fileno(stdout), &st) != 0 + ); + } +} +_ACEOF +rm -f conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_vfork_works=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_func_vfork_works=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_func_vfork_works" >&5 +echo "${ECHO_T}$ac_cv_func_vfork_works" >&6; } + +fi; +if test "x$ac_cv_func_fork_works" = xcross; then + ac_cv_func_vfork_works=$ac_cv_func_vfork + { echo "$as_me:$LINENO: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&5 +echo "$as_me: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&2;} +fi + +if test "x$ac_cv_func_vfork_works" = xyes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_WORKING_VFORK 1 +_ACEOF + +else + +cat >>confdefs.h <<\_ACEOF +#define vfork fork +_ACEOF + +fi +if test "x$ac_cv_func_fork_works" = xyes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_WORKING_FORK 1 +_ACEOF + +fi + + if test $ac_cv_func_vfork_works = no; then + case " $LIBOBJS " in + *" vfork.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS vfork.$ac_objext" + ;; +esac + + fi + # We only need _doprnt if we might use it to implement v*printf. + if test $ac_cv_func_vprintf != yes \ + || test $ac_cv_func_vfprintf != yes \ + || test $ac_cv_func_vsprintf != yes; then + +for ac_func in _doprnt +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test x$gcc_no_link = xyes; then + { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 +echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} + { (exit 1); exit 1; }; } +fi +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. Under hpux, + including includes and causes problems + checking for functions defined therein. */ +#if defined (__STDC__) && !defined (_HPUX_SOURCE) +# include +#else +# include +#endif +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != $ac_func; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +else + case " $LIBOBJS " in + *" $ac_func.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS $ac_func.$ac_objext" + ;; +esac + +fi +done + + + else + +for ac_func in _doprnt +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test x$gcc_no_link = xyes; then + { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 +echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} + { (exit 1); exit 1; }; } +fi +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. Under hpux, + including includes and causes problems + checking for functions defined therein. */ +#if defined (__STDC__) && !defined (_HPUX_SOURCE) +# include +#else +# include +#endif +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != $ac_func; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + fi + + for v in $vars; do + { echo "$as_me:$LINENO: checking for $v" >&5 +echo $ECHO_N "checking for $v... $ECHO_C" >&6; } + if { as_var=libiberty_cv_var_$v; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test x$gcc_no_link = xyes; then + { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 +echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} + { (exit 1); exit 1; }; } +fi +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +int *p; +int +main () +{ +extern int $v []; p = $v; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + eval "libiberty_cv_var_$v=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "libiberty_cv_var_$v=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi + + if eval "test \"`echo '$libiberty_cv_var_'$v`\" = yes"; then + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } + n=HAVE_`echo $v | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >>confdefs.h <<_ACEOF +#define $n 1 +_ACEOF + + else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } + fi + done + + # special check for _system_configuration because AIX <4.3.2 do not + # contain the `physmem' member. + { echo "$as_me:$LINENO: checking for external symbol _system_configuration" >&5 +echo $ECHO_N "checking for external symbol _system_configuration... $ECHO_C" >&6; } + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +double x = _system_configuration.physmem; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } + +cat >>confdefs.h <<\_ACEOF +#define HAVE__SYSTEM_CONFIGURATION 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + + +for ac_func in $checkfuncs +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test x$gcc_no_link = xyes; then + { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 +echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} + { (exit 1); exit 1; }; } +fi +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. Under hpux, + including includes and causes problems + checking for functions defined therein. */ +#if defined (__STDC__) && !defined (_HPUX_SOURCE) +# include +#else +# include +#endif +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != $ac_func; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + { echo "$as_me:$LINENO: checking whether basename is declared" >&5 +echo $ECHO_N "checking whether basename is declared... $ECHO_C" >&6; } +if test "${ac_cv_have_decl_basename+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef basename + (void) basename; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_basename=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_basename=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_basename" >&5 +echo "${ECHO_T}$ac_cv_have_decl_basename" >&6; } +if test $ac_cv_have_decl_basename = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_BASENAME 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_BASENAME 0 +_ACEOF + + +fi +{ echo "$as_me:$LINENO: checking whether ffs is declared" >&5 +echo $ECHO_N "checking whether ffs is declared... $ECHO_C" >&6; } +if test "${ac_cv_have_decl_ffs+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef ffs + (void) ffs; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_ffs=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_ffs=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_ffs" >&5 +echo "${ECHO_T}$ac_cv_have_decl_ffs" >&6; } +if test $ac_cv_have_decl_ffs = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FFS 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FFS 0 +_ACEOF + + +fi +{ echo "$as_me:$LINENO: checking whether asprintf is declared" >&5 +echo $ECHO_N "checking whether asprintf is declared... $ECHO_C" >&6; } +if test "${ac_cv_have_decl_asprintf+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef asprintf + (void) asprintf; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_asprintf=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_asprintf=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_asprintf" >&5 +echo "${ECHO_T}$ac_cv_have_decl_asprintf" >&6; } +if test $ac_cv_have_decl_asprintf = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_ASPRINTF 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_ASPRINTF 0 +_ACEOF + + +fi +{ echo "$as_me:$LINENO: checking whether vasprintf is declared" >&5 +echo $ECHO_N "checking whether vasprintf is declared... $ECHO_C" >&6; } +if test "${ac_cv_have_decl_vasprintf+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef vasprintf + (void) vasprintf; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_vasprintf=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_vasprintf=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_vasprintf" >&5 +echo "${ECHO_T}$ac_cv_have_decl_vasprintf" >&6; } +if test $ac_cv_have_decl_vasprintf = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_VASPRINTF 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_VASPRINTF 0 +_ACEOF + + +fi +{ echo "$as_me:$LINENO: checking whether snprintf is declared" >&5 +echo $ECHO_N "checking whether snprintf is declared... $ECHO_C" >&6; } +if test "${ac_cv_have_decl_snprintf+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef snprintf + (void) snprintf; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_snprintf=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_snprintf=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_snprintf" >&5 +echo "${ECHO_T}$ac_cv_have_decl_snprintf" >&6; } +if test $ac_cv_have_decl_snprintf = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_SNPRINTF 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_SNPRINTF 0 +_ACEOF + + +fi +{ echo "$as_me:$LINENO: checking whether vsnprintf is declared" >&5 +echo $ECHO_N "checking whether vsnprintf is declared... $ECHO_C" >&6; } +if test "${ac_cv_have_decl_vsnprintf+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef vsnprintf + (void) vsnprintf; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_vsnprintf=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_vsnprintf=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_vsnprintf" >&5 +echo "${ECHO_T}$ac_cv_have_decl_vsnprintf" >&6; } +if test $ac_cv_have_decl_vsnprintf = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_VSNPRINTF 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_VSNPRINTF 0 +_ACEOF + + +fi + + + { echo "$as_me:$LINENO: checking whether calloc is declared" >&5 +echo $ECHO_N "checking whether calloc is declared... $ECHO_C" >&6; } +if test "${ac_cv_have_decl_calloc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef calloc + (void) calloc; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_calloc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_calloc=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_calloc" >&5 +echo "${ECHO_T}$ac_cv_have_decl_calloc" >&6; } +if test $ac_cv_have_decl_calloc = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_CALLOC 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_CALLOC 0 +_ACEOF + + +fi +{ echo "$as_me:$LINENO: checking whether getenv is declared" >&5 +echo $ECHO_N "checking whether getenv is declared... $ECHO_C" >&6; } +if test "${ac_cv_have_decl_getenv+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef getenv + (void) getenv; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_getenv=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_getenv=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_getenv" >&5 +echo "${ECHO_T}$ac_cv_have_decl_getenv" >&6; } +if test $ac_cv_have_decl_getenv = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_GETENV 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_GETENV 0 +_ACEOF + + +fi +{ echo "$as_me:$LINENO: checking whether getopt is declared" >&5 +echo $ECHO_N "checking whether getopt is declared... $ECHO_C" >&6; } +if test "${ac_cv_have_decl_getopt+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef getopt + (void) getopt; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_getopt=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_getopt=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_getopt" >&5 +echo "${ECHO_T}$ac_cv_have_decl_getopt" >&6; } +if test $ac_cv_have_decl_getopt = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_GETOPT 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_GETOPT 0 +_ACEOF + + +fi +{ echo "$as_me:$LINENO: checking whether malloc is declared" >&5 +echo $ECHO_N "checking whether malloc is declared... $ECHO_C" >&6; } +if test "${ac_cv_have_decl_malloc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef malloc + (void) malloc; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_malloc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_malloc=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_malloc" >&5 +echo "${ECHO_T}$ac_cv_have_decl_malloc" >&6; } +if test $ac_cv_have_decl_malloc = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_MALLOC 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_MALLOC 0 +_ACEOF + + +fi +{ echo "$as_me:$LINENO: checking whether realloc is declared" >&5 +echo $ECHO_N "checking whether realloc is declared... $ECHO_C" >&6; } +if test "${ac_cv_have_decl_realloc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef realloc + (void) realloc; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_realloc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_realloc=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_realloc" >&5 +echo "${ECHO_T}$ac_cv_have_decl_realloc" >&6; } +if test $ac_cv_have_decl_realloc = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_REALLOC 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_REALLOC 0 +_ACEOF + + +fi +{ echo "$as_me:$LINENO: checking whether sbrk is declared" >&5 +echo $ECHO_N "checking whether sbrk is declared... $ECHO_C" >&6; } +if test "${ac_cv_have_decl_sbrk+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef sbrk + (void) sbrk; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_sbrk=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_sbrk=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_sbrk" >&5 +echo "${ECHO_T}$ac_cv_have_decl_sbrk" >&6; } +if test $ac_cv_have_decl_sbrk = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_SBRK 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_SBRK 0 +_ACEOF + + +fi + + + { echo "$as_me:$LINENO: checking whether strverscmp is declared" >&5 +echo $ECHO_N "checking whether strverscmp is declared... $ECHO_C" >&6; } +if test "${ac_cv_have_decl_strverscmp+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef strverscmp + (void) strverscmp; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_strverscmp=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_strverscmp=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_strverscmp" >&5 +echo "${ECHO_T}$ac_cv_have_decl_strverscmp" >&6; } +if test $ac_cv_have_decl_strverscmp = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_STRVERSCMP 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_STRVERSCMP 0 +_ACEOF + + +fi + + + { echo "$as_me:$LINENO: checking whether canonicalize_file_name must be declared" >&5 +echo $ECHO_N "checking whether canonicalize_file_name must be declared... $ECHO_C" >&6; } +if test "${libiberty_cv_decl_needed_canonicalize_file_name+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include "confdefs.h" +#include +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +int +main () +{ +char *(*pfn) = (char *(*)) canonicalize_file_name + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + libiberty_cv_decl_needed_canonicalize_file_name=no +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + libiberty_cv_decl_needed_canonicalize_file_name=yes +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +{ echo "$as_me:$LINENO: result: $libiberty_cv_decl_needed_canonicalize_file_name" >&5 +echo "${ECHO_T}$libiberty_cv_decl_needed_canonicalize_file_name" >&6; } +if test $libiberty_cv_decl_needed_canonicalize_file_name = yes; then + +cat >>confdefs.h <<\_ACEOF +#define NEED_DECLARATION_CANONICALIZE_FILE_NAME 1 +_ACEOF + +fi + +fi + +# Figure out which version of pexecute to use. +case "${host}" in + *-*-mingw* | *-*-winnt*) pexecute=./pex-win32.o ;; + *-*-msdosdjgpp*) pexecute=./pex-djgpp.o ;; + *-*-msdos*) pexecute=./pex-msdos.o ;; + *) pexecute=./pex-unix.o ;; +esac + + +if test x$gcc_no_link = xyes; then + if test "x${ac_cv_func_mmap_fixed_mapped+set}" != xset; then + ac_cv_func_mmap_fixed_mapped=no + fi +fi +if test "x${ac_cv_func_mmap_fixed_mapped}" != xno; then + + +for ac_header in stdlib.h unistd.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_Header=no" +fi + +rm -f conftest.err conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +for ac_func in getpagesize +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test x$gcc_no_link = xyes; then + { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 +echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} + { (exit 1); exit 1; }; } +fi +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. Under hpux, + including includes and causes problems + checking for functions defined therein. */ +#if defined (__STDC__) && !defined (_HPUX_SOURCE) +# include +#else +# include +#endif +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != $ac_func; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +{ echo "$as_me:$LINENO: checking for working mmap" >&5 +echo $ECHO_N "checking for working mmap... $ECHO_C" >&6; } +if test "${ac_cv_func_mmap_fixed_mapped+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + ac_cv_func_mmap_fixed_mapped=no +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +/* malloc might have been renamed as rpl_malloc. */ +#undef malloc + +/* Thanks to Mike Haertel and Jim Avera for this test. + Here is a matrix of mmap possibilities: + mmap private not fixed + mmap private fixed at somewhere currently unmapped + mmap private fixed at somewhere already mapped + mmap shared not fixed + mmap shared fixed at somewhere currently unmapped + mmap shared fixed at somewhere already mapped + For private mappings, we should verify that changes cannot be read() + back from the file, nor mmap's back from the file at a different + address. (There have been systems where private was not correctly + implemented like the infamous i386 svr4.0, and systems where the + VM page cache was not coherent with the file system buffer cache + like early versions of FreeBSD and possibly contemporary NetBSD.) + For shared mappings, we should conversely verify that changes get + propagated back to all the places they're supposed to be. + + Grep wants private fixed already mapped. + The main things grep needs to know about mmap are: + * does it exist and is it safe to write into the mmap'd area + * how to use it (BSD variants) */ + +#include +#include + +#if !defined STDC_HEADERS && !defined HAVE_STDLIB_H +char *malloc (); +#endif + +/* This mess was copied from the GNU getpagesize.h. */ +#ifndef HAVE_GETPAGESIZE +/* Assume that all systems that can run configure have sys/param.h. */ +# ifndef HAVE_SYS_PARAM_H +# define HAVE_SYS_PARAM_H 1 +# endif + +# ifdef _SC_PAGESIZE +# define getpagesize() sysconf(_SC_PAGESIZE) +# else /* no _SC_PAGESIZE */ +# ifdef HAVE_SYS_PARAM_H +# include +# ifdef EXEC_PAGESIZE +# define getpagesize() EXEC_PAGESIZE +# else /* no EXEC_PAGESIZE */ +# ifdef NBPG +# define getpagesize() NBPG * CLSIZE +# ifndef CLSIZE +# define CLSIZE 1 +# endif /* no CLSIZE */ +# else /* no NBPG */ +# ifdef NBPC +# define getpagesize() NBPC +# else /* no NBPC */ +# ifdef PAGESIZE +# define getpagesize() PAGESIZE +# endif /* PAGESIZE */ +# endif /* no NBPC */ +# endif /* no NBPG */ +# endif /* no EXEC_PAGESIZE */ +# else /* no HAVE_SYS_PARAM_H */ +# define getpagesize() 8192 /* punt totally */ +# endif /* no HAVE_SYS_PARAM_H */ +# endif /* no _SC_PAGESIZE */ + +#endif /* no HAVE_GETPAGESIZE */ + +int +main () +{ + char *data, *data2, *data3; + int i, pagesize; + int fd; + + pagesize = getpagesize (); + + /* First, make a file with some known garbage in it. */ + data = (char *) malloc (pagesize); + if (!data) + return 1; + for (i = 0; i < pagesize; ++i) + *(data + i) = rand (); + umask (0); + fd = creat ("conftest.mmap", 0600); + if (fd < 0) + return 1; + if (write (fd, data, pagesize) != pagesize) + return 1; + close (fd); + + /* Next, try to mmap the file at a fixed address which already has + something else allocated at it. If we can, also make sure that + we see the same garbage. */ + fd = open ("conftest.mmap", O_RDWR); + if (fd < 0) + return 1; + data2 = (char *) malloc (2 * pagesize); + if (!data2) + return 1; + data2 += (pagesize - ((long int) data2 & (pagesize - 1))) & (pagesize - 1); + if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_FIXED, fd, 0L)) + return 1; + for (i = 0; i < pagesize; ++i) + if (*(data + i) != *(data2 + i)) + return 1; + + /* Finally, make sure that changes to the mapped area do not + percolate back to the file as seen by read(). (This is a bug on + some variants of i386 svr4.0.) */ + for (i = 0; i < pagesize; ++i) + *(data2 + i) = *(data2 + i) + 1; + data3 = (char *) malloc (pagesize); + if (!data3) + return 1; + if (read (fd, data3, pagesize) != pagesize) + return 1; + for (i = 0; i < pagesize; ++i) + if (*(data + i) != *(data3 + i)) + return 1; + close (fd); + return 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_mmap_fixed_mapped=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_func_mmap_fixed_mapped=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_func_mmap_fixed_mapped" >&5 +echo "${ECHO_T}$ac_cv_func_mmap_fixed_mapped" >&6; } +if test $ac_cv_func_mmap_fixed_mapped = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_MMAP 1 +_ACEOF + +fi +rm -f conftest.mmap + +fi + +{ echo "$as_me:$LINENO: checking for working strncmp" >&5 +echo $ECHO_N "checking for working strncmp... $ECHO_C" >&6; } +if test "${ac_cv_func_strncmp_works+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + ac_cv_func_strncmp_works=no +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Test by Jim Wilson and Kaveh Ghazi. + Check whether strncmp reads past the end of its string parameters. */ +#include + +#ifdef HAVE_FCNTL_H +#include +#endif + +#ifdef HAVE_SYS_MMAN_H +#include +#endif + +#ifndef MAP_ANON +#ifdef MAP_ANONYMOUS +#define MAP_ANON MAP_ANONYMOUS +#else +#define MAP_ANON MAP_FILE +#endif +#endif + +#ifndef MAP_FILE +#define MAP_FILE 0 +#endif +#ifndef O_RDONLY +#define O_RDONLY 0 +#endif + +#define MAP_LEN 0x10000 + +main () +{ +#if defined(HAVE_MMAP) || defined(HAVE_MMAP_ANYWHERE) + char *p; + int dev_zero; + + dev_zero = open ("/dev/zero", O_RDONLY); + if (dev_zero < 0) + exit (1); + + p = (char *) mmap (0, MAP_LEN, PROT_READ|PROT_WRITE, + MAP_ANON|MAP_PRIVATE, dev_zero, 0); + if (p == (char *)-1) + p = (char *) mmap (0, MAP_LEN, PROT_READ|PROT_WRITE, + MAP_ANON|MAP_PRIVATE, -1, 0); + if (p == (char *)-1) + exit (2); + else + { + char *string = "__si_type_info"; + char *q = (char *) p + MAP_LEN - strlen (string) - 2; + char *r = (char *) p + 0xe; + + strcpy (q, string); + strcpy (r, string); + strncmp (r, q, 14); + } +#endif /* HAVE_MMAP || HAVE_MMAP_ANYWHERE */ + exit (0); +} + +_ACEOF +rm -f conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_strncmp_works=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_func_strncmp_works=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +rm -f core core.* *.core +fi +{ echo "$as_me:$LINENO: result: $ac_cv_func_strncmp_works" >&5 +echo "${ECHO_T}$ac_cv_func_strncmp_works" >&6; } +if test $ac_cv_func_strncmp_works = no ; then + case " $LIBOBJS " in + *" strncmp.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS strncmp.$ac_objext" + ;; +esac + +fi + + +# Install a library built with a cross compiler in $(tooldir) rather +# than $(libdir). +if test -z "${with_cross_host}"; then + INSTALL_DEST=libdir +else + INSTALL_DEST=tooldir +fi + + + +L="" +for l in x $LIBOBJS; do + case $l in + x) ;; + *) L="$L ./$l" ;; + esac +done +LIBOBJS="$L" + + + + + +# We need multilib support, but only if configuring for the target. +ac_config_files="$ac_config_files Makefile" + +ac_config_commands="$ac_config_commands default" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 +echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + *) $as_unset $ac_var ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + test "x$cache_file" != "x/dev/null" && + { echo "$as_me:$LINENO: updating cache $cache_file" >&5 +echo "$as_me: updating cache $cache_file" >&6;} + cat confcache >$cache_file + else + { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 +echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + +: ${CONFIG_STATUS=./config.status} +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 +echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >$CONFIG_STATUS <<_ACEOF +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false +SHELL=\${CONFIG_SHELL-$SHELL} +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + + + +# PATH needs CR +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +as_nl=' +' +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + { (exit 1); exit 1; } +fi + +# Work around bugs in pre-3.0 UWIN ksh. +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + + +# Name of the executable. +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# CDPATH. +$as_unset CDPATH + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in +-n*) + case `echo 'x\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + *) ECHO_C='\c';; + esac;; +*) + ECHO_N='-n';; +esac + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir +fi +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 + +# Save the log message, to keep $[0] and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by $as_me, which was +generated by GNU Autoconf 2.61. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTIONS] [FILE]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF +ac_cs_version="\\ +config.status +configured by $0, generated by GNU Autoconf 2.61, + with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" + +Copyright (C) 2006 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +# If no file are specified by the user, then we need to provide default +# value. By we need to know if files were specified by the user. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + echo "$ac_cs_version"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + CONFIG_FILES="$CONFIG_FILES $ac_optarg" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + { echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) { echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$ac_config_targets $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF +if \$ac_cs_recheck; then + echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 + CONFIG_SHELL=$SHELL + export CONFIG_SHELL + exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF +# +# INIT-COMMANDS +# +srcdir=${srcdir} +host=${host} +target=${target} +with_target_subdir=${with_target_subdir} +with_multisubdir=${with_multisubdir} +ac_configure_args="--enable-multilib ${ac_configure_args}" +CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} +ORIGINAL_LD_FOR_MULTILIBS="${ORIGINAL_LD_FOR_MULTILIBS}" +libiberty_topdir=${libiberty_topdir} + + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h:config.in" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "default") CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;; + + *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= + trap 'exit_status=$? + { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status +' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || +{ + echo "$me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} + +# +# Set up the sed scripts for CONFIG_FILES section. +# + +# No need to generate the scripts if there are no CONFIG_FILES. +# This happens for instance when ./config.status config.h +if test -n "$CONFIG_FILES"; then + +_ACEOF + +# Create sed commands to just substitute file output variables. + +# Remaining file output variables are in a fragment that also has non-file +# output varibles. + + + +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + cat >conf$$subs.sed <<_ACEOF +SHELL!$SHELL$ac_delim +PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim +PACKAGE_NAME!$PACKAGE_NAME$ac_delim +PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim +PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim +PACKAGE_STRING!$PACKAGE_STRING$ac_delim +PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim +exec_prefix!$exec_prefix$ac_delim +prefix!$prefix$ac_delim +program_transform_name!$program_transform_name$ac_delim +bindir!$bindir$ac_delim +sbindir!$sbindir$ac_delim +libexecdir!$libexecdir$ac_delim +datarootdir!$datarootdir$ac_delim +datadir!$datadir$ac_delim +sysconfdir!$sysconfdir$ac_delim +sharedstatedir!$sharedstatedir$ac_delim +localstatedir!$localstatedir$ac_delim +includedir!$includedir$ac_delim +oldincludedir!$oldincludedir$ac_delim +docdir!$docdir$ac_delim +infodir!$infodir$ac_delim +htmldir!$htmldir$ac_delim +dvidir!$dvidir$ac_delim +pdfdir!$pdfdir$ac_delim +psdir!$psdir$ac_delim +libdir!$libdir$ac_delim +localedir!$localedir$ac_delim +mandir!$mandir$ac_delim +DEFS!$DEFS$ac_delim +ECHO_C!$ECHO_C$ac_delim +ECHO_N!$ECHO_N$ac_delim +ECHO_T!$ECHO_T$ac_delim +LIBS!$LIBS$ac_delim +build_alias!$build_alias$ac_delim +host_alias!$host_alias$ac_delim +target_alias!$target_alias$ac_delim +libiberty_topdir!$libiberty_topdir$ac_delim +MAINT!$MAINT$ac_delim +NOTMAINT!$NOTMAINT$ac_delim +MAKEINFO!$MAKEINFO$ac_delim +BUILD_INFO!$BUILD_INFO$ac_delim +PERL!$PERL$ac_delim +HAVE_PERL!$HAVE_PERL$ac_delim +build!$build$ac_delim +build_cpu!$build_cpu$ac_delim +build_vendor!$build_vendor$ac_delim +build_os!$build_os$ac_delim +host!$host$ac_delim +host_cpu!$host_cpu$ac_delim +host_vendor!$host_vendor$ac_delim +host_os!$host_os$ac_delim +AR!$AR$ac_delim +RANLIB!$RANLIB$ac_delim +CC!$CC$ac_delim +CFLAGS!$CFLAGS$ac_delim +LDFLAGS!$LDFLAGS$ac_delim +CPPFLAGS!$CPPFLAGS$ac_delim +ac_ct_CC!$ac_ct_CC$ac_delim +EXEEXT!$EXEEXT$ac_delim +OBJEXT!$OBJEXT$ac_delim +CPP!$CPP$ac_delim +ac_libiberty_warn_cflags!$ac_libiberty_warn_cflags$ac_delim +NO_MINUS_C_MINUS_O!$NO_MINUS_C_MINUS_O$ac_delim +OUTPUT_OPTION!$OUTPUT_OPTION$ac_delim +GREP!$GREP$ac_delim +EGREP!$EGREP$ac_delim +INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim +INSTALL_SCRIPT!$INSTALL_SCRIPT$ac_delim +INSTALL_DATA!$INSTALL_DATA$ac_delim +LIBOBJS!$LIBOBJS$ac_delim +CHECK!$CHECK$ac_delim +target_header_dir!$target_header_dir$ac_delim +pexecute!$pexecute$ac_delim +INSTALL_DEST!$INSTALL_DEST$ac_delim +LTLIBOBJS!$LTLIBOBJS$ac_delim +_ACEOF + + if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 76; then + break + elif $ac_last_try; then + { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed` +if test -n "$ac_eof"; then + ac_eof=`echo "$ac_eof" | sort -nru | sed 1q` + ac_eof=`expr $ac_eof + 1` +fi + +cat >>$CONFIG_STATUS <<_ACEOF +cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b end +/^[ ]*@host_makefile_frag@[ ]*$/{ +r $host_makefile_frag +d +} +_ACEOF +sed ' +s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g +s/^/s,@/; s/!/@,|#_!!_#|/ +:n +t n +s/'"$ac_delim"'$/,g/; t +s/$/\\/; p +N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n +' >>$CONFIG_STATUS >$CONFIG_STATUS <<_ACEOF +:end +s/|#_!!_#|//g +CEOF$ac_eof +_ACEOF + + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/ +s/:*\${srcdir}:*/:/ +s/:*@srcdir@:*/:/ +s/^\([^=]*=[ ]*\):*/\1/ +s/:*$// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF +fi # test -n "$CONFIG_FILES" + + +for ac_tag in :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5 +echo "$as_me: error: Invalid tag $ac_tag." >&2;} + { (exit 1); exit 1; }; };; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 +echo "$as_me: error: cannot find input file: $ac_f" >&2;} + { (exit 1); exit 1; }; };; + esac + ac_file_inputs="$ac_file_inputs $ac_f" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input="Generated from "`IFS=: + echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure." + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + fi + + case $ac_tag in + *:-:* | *:-) cat >"$tmp/stdin";; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + { as_dir="$ac_dir" + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 +echo "$as_me: error: cannot create directory $as_dir" >&2;} + { (exit 1); exit 1; }; }; } + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= + +case `sed -n '/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p +' $ac_file_inputs` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF + sed "$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s&@configure_input@&$configure_input&;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +$ac_datarootdir_hack +" $ac_file_inputs | sed -f "$tmp/subs-1.sed" >$tmp/out + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && + { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&5 +echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&2;} + + rm -f "$tmp/stdin" + case $ac_file in + -) cat "$tmp/out"; rm -f "$tmp/out";; + *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;; + esac + ;; + :H) + # + # CONFIG_HEADER + # +_ACEOF + +# Transform confdefs.h into a sed script `conftest.defines', that +# substitutes the proper values into config.h.in to produce config.h. +rm -f conftest.defines conftest.tail +# First, append a space to every undef/define line, to ease matching. +echo 's/$/ /' >conftest.defines +# Then, protect against being on the right side of a sed subst, or in +# an unquoted here document, in config.status. If some macros were +# called several times there might be several #defines for the same +# symbol, which is useless. But do not sort them, since the last +# AC_DEFINE must be honored. +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +# These sed commands are passed to sed as "A NAME B PARAMS C VALUE D", where +# NAME is the cpp macro being defined, VALUE is the value it is being given. +# PARAMS is the parameter list in the macro definition--in most cases, it's +# just an empty string. +ac_dA='s,^\\([ #]*\\)[^ ]*\\([ ]*' +ac_dB='\\)[ (].*,\\1define\\2' +ac_dC=' ' +ac_dD=' ,' + +uniq confdefs.h | + sed -n ' + t rset + :rset + s/^[ ]*#[ ]*define[ ][ ]*// + t ok + d + :ok + s/[\\&,]/\\&/g + s/^\('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/ '"$ac_dA"'\1'"$ac_dB"'\2'"${ac_dC}"'\3'"$ac_dD"'/p + s/^\('"$ac_word_re"'\)[ ]*\(.*\)/'"$ac_dA"'\1'"$ac_dB$ac_dC"'\2'"$ac_dD"'/p + ' >>conftest.defines + +# Remove the space that was appended to ease matching. +# Then replace #undef with comments. This is necessary, for +# example, in the case of _POSIX_SOURCE, which is predefined and required +# on some systems where configure will not decide to define it. +# (The regexp can be short, since the line contains either #define or #undef.) +echo 's/ $// +s,^[ #]*u.*,/* & */,' >>conftest.defines + +# Break up conftest.defines: +ac_max_sed_lines=50 + +# First sed command is: sed -f defines.sed $ac_file_inputs >"$tmp/out1" +# Second one is: sed -f defines.sed "$tmp/out1" >"$tmp/out2" +# Third one will be: sed -f defines.sed "$tmp/out2" >"$tmp/out1" +# et cetera. +ac_in='$ac_file_inputs' +ac_out='"$tmp/out1"' +ac_nxt='"$tmp/out2"' + +while : +do + # Write a here document: + cat >>$CONFIG_STATUS <<_ACEOF + # First, check the format of the line: + cat >"\$tmp/defines.sed" <<\\CEOF +/^[ ]*#[ ]*undef[ ][ ]*$ac_word_re[ ]*\$/b def +/^[ ]*#[ ]*define[ ][ ]*$ac_word_re[( ]/b def +b +:def +_ACEOF + sed ${ac_max_sed_lines}q conftest.defines >>$CONFIG_STATUS + echo 'CEOF + sed -f "$tmp/defines.sed"' "$ac_in >$ac_out" >>$CONFIG_STATUS + ac_in=$ac_out; ac_out=$ac_nxt; ac_nxt=$ac_in + sed 1,${ac_max_sed_lines}d conftest.defines >conftest.tail + grep . conftest.tail >/dev/null || break + rm -f conftest.defines + mv conftest.tail conftest.defines +done +rm -f conftest.defines conftest.tail + +echo "ac_result=$ac_in" >>$CONFIG_STATUS +cat >>$CONFIG_STATUS <<\_ACEOF + if test x"$ac_file" != x-; then + echo "/* $configure_input */" >"$tmp/config.h" + cat "$ac_result" >>"$tmp/config.h" + if diff $ac_file "$tmp/config.h" >/dev/null 2>&1; then + { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 +echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f $ac_file + mv "$tmp/config.h" $ac_file + fi + else + echo "/* $configure_input */" + cat "$ac_result" + fi + rm -f "$tmp/out12" + ;; + + :C) { echo "$as_me:$LINENO: executing $ac_file commands" >&5 +echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "default":C) test -z "$CONFIG_HEADERS" || echo timestamp > stamp-h +if test -n "$CONFIG_FILES"; then + if test -n "${with_target_subdir}"; then + # FIXME: We shouldn't need to set ac_file + ac_file=Makefile + LD="${ORIGINAL_LD_FOR_MULTILIBS}" + . ${libiberty_topdir}/config-ml.in + fi +fi ;; + + esac +done # for ac_tag + + +{ (exit 0); exit 0; } +_ACEOF +chmod +x $CONFIG_STATUS +ac_clean_files=$ac_clean_files_save + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || { (exit 1); exit 1; } +fi + diff --git a/libiberty/configure.ac b/libiberty/configure.ac new file mode 100644 index 0000000..0d42616 --- /dev/null +++ b/libiberty/configure.ac @@ -0,0 +1,738 @@ +dnl Process this file with autoconf to produce a configure script + +AC_PREREQ(2.59) +AC_INIT +AC_CONFIG_SRCDIR([xmalloc.c]) + +# This works around the fact that libtool configuration may change LD +# for this particular configuration, but some shells, instead of +# keeping the changes in LD private, export them just because LD is +# exported. We don't use libtool yet, but some day we might, so... +ORIGINAL_LD_FOR_MULTILIBS=$LD + +dnl We use these options to decide which functions to include. +AC_ARG_WITH(target-subdir, +[ --with-target-subdir=SUBDIR Configuring in a subdirectory for target]) +AC_ARG_WITH(build-subdir, +[ --with-build-subdir=SUBDIR Configuring in a subdirectory for build]) +AC_ARG_WITH(cross-host, +[ --with-cross-host=HOST Configuring with a cross compiler]) +AC_ARG_WITH(newlib, +[ --with-newlib Configuring with newlib]) + +if test "${srcdir}" = "."; then + if test -n "${with_build_subdir}"; then + libiberty_topdir="${srcdir}/../.." + with_target_subdir= + elif test -z "${with_target_subdir}"; then + libiberty_topdir="${srcdir}/.." + else + if test "${with_target_subdir}" != "."; then + libiberty_topdir="${srcdir}/${with_multisrctop}../.." + else + libiberty_topdir="${srcdir}/${with_multisrctop}.." + fi + fi +else + libiberty_topdir="${srcdir}/.." +fi +AC_SUBST(libiberty_topdir) +AC_CONFIG_AUX_DIR(../config-aux) +AC_CONFIG_MACRO_DIR(../config-aux) + +dnl Very limited version of automake's enable-maintainer-mode + +AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) + dnl maintainer-mode is disabled by default + AC_ARG_ENABLE(maintainer-mode, +[ --enable-maintainer-mode + enable make rules and dependencies not useful + (and sometimes confusing) to the casual installer], + maintainer_mode=$enableval, + maintainer_mode=no) + +AC_MSG_RESULT($maintainer_mode) + +if test "$maintainer_mode" = "yes"; then + MAINT='' + NOTMAINT='#' +else + MAINT='#' + NOTMAINT='' +fi +AC_SUBST(MAINT)dnl +AC_SUBST(NOTMAINT)dnl + +# Do we have a single-tree copy of texinfo? Even if we do, we can't +# rely on it - libiberty is built before texinfo. +AC_CHECK_PROG(MAKEINFO, makeinfo, makeinfo, ) +if test "x$MAKEINFO" = "x"; then + MAKEINFO="@echo makeinfo missing; true" + BUILD_INFO= +else + BUILD_INFO=info + case "$MAKEINFO" in + */missing\ makeinfo*) + BUILD_INFO= + AC_MSG_WARN([ +*** Makeinfo is missing. Info documentation will not be built.]) + ;; + *) + case x"`$MAKEINFO --version | grep 'GNU texinfo'`" in + x*\ [[1-3]].* ) + MAKEINFO="@echo $MAKEINFO is too old, 4.0 or newer required; true" + BUILD_INFO= + AC_MSG_WARN([ +*** Makeinfo is too old. Info documentation will not be built.]) + ;; + esac + ;; + esac +fi +AC_SUBST(MAKEINFO) +AC_SUBST(BUILD_INFO) + +AC_CHECK_PROG(PERL, perl, perl, ) +if test x"$PERL" = x""; then + HAVE_PERL='#' +else + HAVE_PERL='' +fi +AC_SUBST(HAVE_PERL) + +AC_CANONICAL_HOST + +dnl When we start using automake: +dnl AM_INIT_AUTOMAKE(libiberty, 1.0) + +dnl These must be called before AM_PROG_LIBTOOL, because it may want +dnl to call AC_CHECK_PROG. +AC_CHECK_TOOL(AR, ar) +AC_CHECK_TOOL(RANLIB, ranlib, :) + +dnl When switching to automake, replace the following with AM_ENABLE_MULTILIB. +# Add --enable-multilib to configure. +# Default to --enable-multilib +AC_ARG_ENABLE(multilib, +[ --enable-multilib build many library versions (default)], +[case "$enableval" in + yes) multilib=yes ;; + no) multilib=no ;; + *) AC_MSG_ERROR([bad value $enableval for multilib option]) ;; + esac], + [multilib=yes]) + +# Even if the default multilib is not a cross compilation, +# it may be that some of the other multilibs are. +if test $cross_compiling = no && test $multilib = yes \ + && test "x${with_multisubdir}" != x ; then + cross_compiling=maybe +fi + +GCC_NO_EXECUTABLES +AC_PROG_CC +AC_PROG_CPP_WERROR + +ACX_PROG_CC_WARNING_OPTS([-W -Wall -Wwrite-strings -Wc++-compat \ + -Wstrict-prototypes], [ac_libiberty_warn_cflags]) +ACX_PROG_CC_WARNING_ALMOST_PEDANTIC([], [ac_libiberty_warn_cflags]) + +AC_PROG_CC_C_O +# autoconf is lame and doesn't give us any substitution variable for this. +if eval "test \"`echo '$ac_cv_prog_cc_'${ac_cc}_c_o`\" = no"; then + NO_MINUS_C_MINUS_O=yes +else + OUTPUT_OPTION='-o $@' +fi +AC_SUBST(NO_MINUS_C_MINUS_O) +AC_SUBST(OUTPUT_OPTION) + +AC_C_CONST +AC_C_INLINE +AC_C_BIGENDIAN + +dnl When we start using libtool: +dnl Default to a non shared library. This may be overridden by the +dnl configure option --enable-shared. +dnl AM_DISABLE_SHARED + +dnl When we start using libtool: +dnl AM_PROG_LIBTOOL + +dnl When we start using automake: +dnl AM_CONFIG_HEADER(config.h:config.in) +AC_CONFIG_HEADER(config.h:config.in) + +dnl When we start using automake: +dnl AM_MAINTAINER_MODE +dnl AC_EXEEXT + +dnl When we start using automake: +dnl AM_PROG_INSTALL +AC_PROG_INSTALL + +# Don't build the shared library for build. +if [[ -n "${with_build_subdir}" ]]; then + enable_shared=no +fi + +frag= +case "${host}" in + rs6000-ibm-aix3.1 | rs6000-ibm-aix) + frag=mh-aix ;; + *-*-cxux7*) frag=mh-cxux7 ;; + *-*-freebsd2.1.*) frag=mh-fbsd21 ;; + *-*-freebsd2.2.[[012]]) frag=mh-fbsd21 ;; + i370-*-opened*) frag=mh-openedition ;; + i[[34567]]86-*-windows*) frag=mh-windows ;; +esac + +if [[ -n "${frag}" ]]; then + frags=${libiberty_topdir}/libiberty/config/$frag +else + frags= +fi + +# If they didn't specify --enable-shared, don't generate shared libs. +case "${enable_shared}" in + yes) shared=yes ;; + no) shared=no ;; + "") shared=no ;; + *) shared=yes ;; +esac +if [[ "${shared}" = "yes" ]]; then + frag= + case "${host}" in + *-*-cygwin*) ;; + alpha*-*-linux*) frag=mh-elfalphapic ;; + arm*-*-*) frag=mh-armpic ;; + hppa*-*-*) frag=mh-papic ;; + i[[34567]]86-*-* | x86_64-*-*) + frag=mh-x86pic ;; + powerpc*-*-aix*) ;; + powerpc*-*-*) frag=mh-ppcpic ;; + sparc*-*-*) frag=mh-sparcpic ;; + s390*-*-*) frag=mh-s390pic ;; + *) frag=mh-${host_cpu}pic ;; + esac + if [[ -n "${frag}" ]]; then + frags="${frags} ${libiberty_topdir}/config/${frag}" + fi +fi + +echo "# Warning: this fragment is automatically generated" > temp-frag + +for frag in ${frags}; do + if [[ -f ${frag} ]]; then + echo "Appending ${frag} to xhost-mkfrag" + echo "# Following fragment copied from ${frag}" >> temp-frag + cat ${frag} >> temp-frag + fi +done + +# record if we want to build shared libs. +if [[ "${shared}" = "yes" ]]; then + echo enable_shared = yes >> temp-frag +else + echo enable_shared = no >> temp-frag +fi + +frag=xhost-mkfrag +${CONFIG_SHELL-/bin/sh} ${libiberty_topdir}/move-if-change temp-frag xhost-mkfrag + +host_makefile_frag=${frag} +AC_SUBST_FILE(host_makefile_frag) + +# It's OK to check for header files. Although the compiler may not be +# able to link anything, it had better be able to at least compile +# something. +AC_CHECK_HEADERS(sys/file.h sys/param.h limits.h stdlib.h malloc.h string.h unistd.h strings.h sys/time.h time.h sys/resource.h sys/stat.h sys/mman.h fcntl.h alloca.h sys/pstat.h sys/sysmp.h sys/sysinfo.h machine/hal_sysinfo.h sys/table.h sys/sysctl.h sys/systemcfg.h stdint.h stdio_ext.h) +AC_HEADER_SYS_WAIT +AC_HEADER_TIME + +libiberty_AC_DECLARE_ERRNO + +# Determine the size of an int for struct fibnode. +AC_CHECK_SIZEOF([int]) + +AC_CHECK_TYPE(uintptr_t, unsigned long) + +# Look for a 64-bit type. +AC_MSG_CHECKING([for a 64-bit type]) +AC_CACHE_VAL(liberty_cv_uint64, +[AC_TRY_COMPILE( +[#ifdef HAVE_STDINT_H +#include +#endif], +[extern uint64_t foo;], +liberty_cv_uint64=uint64_t, +[AC_TRY_COMPILE( +[#ifdef HAVE_LIMITS_H +#include +#endif +#ifndef CHAR_BIT +#define CHAR_BIT 8 +#endif], +[extern char foo[sizeof(long) * CHAR_BIT >= 64 ? 1 : -1];], +liberty_cv_uint64="unsigned long", +[AC_TRY_COMPILE( +[#ifdef HAVE_LIMITS_H +#include +#endif +#ifndef CHAR_BIT +#define CHAR_BIT 8 +#endif], +[extern char foo[sizeof(long long) * CHAR_BIT >= 64 ? 1 : -1];], +liberty_cv_uint64="unsigned long long", liberty_cv_uint64=none)])])]) +AC_MSG_RESULT($liberty_cv_uint64) +if test "$liberty_cv_uint64" != none; then + AC_DEFINE_UNQUOTED(UNSIGNED_64BIT_TYPE, $liberty_cv_uint64, + [Define to an unsigned 64-bit type available in the compiler.]) +fi + +# Given the above check, we always have uintptr_t or a fallback +# definition. So define HAVE_UINTPTR_T in case any imported code +# relies on it. +AC_DEFINE(HAVE_UINTPTR_T, 1, [Define if you have the \`uintptr_t' type.]) + +AC_TYPE_PID_T + +# This is the list of functions which libiberty will provide if they +# are not available on the host. + +funcs="asprintf" +funcs="$funcs atexit" +funcs="$funcs basename" +funcs="$funcs bcmp" +funcs="$funcs bcopy" +funcs="$funcs bsearch" +funcs="$funcs bzero" +funcs="$funcs calloc" +funcs="$funcs clock" +funcs="$funcs ffs" +funcs="$funcs getcwd" +funcs="$funcs getpagesize" +funcs="$funcs gettimeofday" +funcs="$funcs index" +funcs="$funcs insque" +funcs="$funcs memchr" +funcs="$funcs memcmp" +funcs="$funcs memcpy" +funcs="$funcs memmove" +funcs="$funcs mempcpy" +funcs="$funcs memset" +funcs="$funcs mkstemps" +funcs="$funcs putenv" +funcs="$funcs random" +funcs="$funcs rename" +funcs="$funcs rindex" +funcs="$funcs setenv" +funcs="$funcs snprintf" +funcs="$funcs sigsetmask" +funcs="$funcs stpcpy" +funcs="$funcs stpncpy" +funcs="$funcs strcasecmp" +funcs="$funcs strchr" +funcs="$funcs strdup" +funcs="$funcs strncasecmp" +funcs="$funcs strndup" +funcs="$funcs strrchr" +funcs="$funcs strstr" +funcs="$funcs strtod" +funcs="$funcs strtol" +funcs="$funcs strtoul" +funcs="$funcs strverscmp" +funcs="$funcs tmpnam" +funcs="$funcs vasprintf" +funcs="$funcs vfprintf" +funcs="$funcs vprintf" +funcs="$funcs vsnprintf" +funcs="$funcs vsprintf" +funcs="$funcs waitpid" + +# Also in the old function.def file: alloca, vfork, getopt. + +vars="sys_errlist sys_nerr sys_siglist" + +checkfuncs="getrusage on_exit psignal strerror strsignal sysconf times sbrk gettimeofday" +checkfuncs="$checkfuncs realpath canonicalize_file_name pstat_getstatic pstat_getdynamic sysmp" +checkfuncs="$checkfuncs getsysinfo table sysctl wait3 wait4 __fsetlocking" + +# These are neither executed nor required, but they help keep +# autoheader happy without adding a bunch of text to acconfig.h. +if test "x" = "y"; then + AC_CHECK_FUNCS(asprintf atexit basename bcmp bcopy bsearch bzero calloc clock \ + getcwd getpagesize gettimeofday index insque mkstemps memchr memcmp memcpy \ + memmove mempcpy memset putenv random rename rindex sigsetmask \ + strcasecmp setenv stpcpy stpncpy strchr strdup strncasecmp strndup strrchr strstr \ + strtod strtol strtoul strverscmp tmpnam vasprintf vfprintf vprintf \ + vsprintf waitpid getrusage on_exit psignal strerror strsignal \ + sysconf times sbrk gettimeofday ffs snprintf vsnprintf \ + pstat_getstatic pstat_getdynamic sysmp getsysinfo table sysctl wait3 wait4 \ + realpath canonicalize_file_name __fsetlocking) + AC_CHECK_DECLS([basename, ffs, asprintf, vasprintf, snprintf, vsnprintf]) + AC_DEFINE(HAVE_SYS_ERRLIST, 1, [Define if you have the sys_errlist variable.]) + AC_DEFINE(HAVE_SYS_NERR, 1, [Define if you have the sys_nerr variable.]) + AC_DEFINE(HAVE_SYS_SIGLIST, 1, [Define if you have the sys_siglist variable.]) +fi + +# For each of these functions, if the host does not provide the +# function we want to put FN.o in LIBOBJS, and if the host does +# provide the function, we want to define HAVE_FN in config.h. + +setobjs= +CHECK= +target_header_dir= +if test -n "${with_target_subdir}"; then + + # We are being configured as a target library. AC_REPLACE_FUNCS + # may not work correctly, because the compiler may not be able to + # link executables. Note that we may still be being configured + # native. + + # If we are being configured for newlib, we know which functions + # newlib provide and which ones we will be expected to provide. + + if test "x${with_newlib}" = "xyes"; then + AC_LIBOBJ([asprintf]) + AC_LIBOBJ([basename]) + AC_LIBOBJ([insque]) + AC_LIBOBJ([random]) + AC_LIBOBJ([strdup]) + AC_LIBOBJ([vasprintf]) + + for f in $funcs; do + case "$f" in + asprintf | basename | insque | random | strdup | vasprintf) + ;; + *) + n=HAVE_`echo $f | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + AC_DEFINE_UNQUOTED($n) + ;; + esac + done + + # newlib doesnt provide any of the variables in $vars, so we + # dont have to check them here. + + # Of the functions in $checkfuncs, newlib only has strerror. + AC_DEFINE(HAVE_STRERROR) + + setobjs=yes + + fi + + # If we are being configured for Mingw, we know which functions + # Mingw provides and which ones we will be expected to provide. + + case "${host}" in + *-*-mingw*) + AC_LIBOBJ([asprintf]) + AC_LIBOBJ([basename]) + AC_LIBOBJ([bcmp]) + AC_LIBOBJ([bcopy]) + AC_LIBOBJ([bzero]) + AC_LIBOBJ([clock]) + AC_LIBOBJ([ffs]) + AC_LIBOBJ([getpagesize]) + AC_LIBOBJ([index]) + AC_LIBOBJ([insque]) + AC_LIBOBJ([mempcpy]) + AC_LIBOBJ([mkstemps]) + AC_LIBOBJ([random]) + AC_LIBOBJ([rindex]) + AC_LIBOBJ([sigsetmask]) + AC_LIBOBJ([stpcpy]) + AC_LIBOBJ([stpncpy]) + AC_LIBOBJ([strndup]) + AC_LIBOBJ([strverscmp]) + AC_LIBOBJ([vasprintf]) + AC_LIBOBJ([waitpid]) + + for f in $funcs; do + case "$f" in + asprintf | basename | bcmp | bcopy | bzero | clock | ffs | getpagesize | index | insque | mempcpy | mkstemps | random | rindex | sigsetmask | stpcpy | stpncpy | strdup | strndup | strverscmp | vasprintf | waitpid) + ;; + *) + n=HAVE_`echo $f | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + AC_DEFINE_UNQUOTED($n) + ;; + esac + done + + # Mingw doesnt provide any of the variables in $vars, so we + # dont have to check them here. + + # Of the functions in $checkfuncs, Mingw only has strerror. + AC_DEFINE(HAVE_STRERROR) + + setobjs=yes + ;; + + esac + + # We may wish to install the target headers somewhere. + AC_ARG_ENABLE(install-libiberty, + [ --enable-install-libiberty Install headers for end users], + enable_install_libiberty=$enableval, + enable_install_libiberty=no)dnl + + # Option parsed, now set things appropriately. + case x"$enable_install_libiberty" in + xyes|x) + target_header_dir=libiberty + ;; + xno) + target_header_dir= + ;; + *) + # This could be sanity-checked in various ways... + target_header_dir="${enable_install_libiberty}" + ;; + esac + + +else + + # Not a target library, so we set things up to run the test suite. + CHECK=really-check + +fi + +AC_SUBST(CHECK) +AC_SUBST(target_header_dir) + +case "${host}" in + *-*-cygwin* | *-*-mingw*) + AC_DEFINE(HAVE_SYS_ERRLIST) + AC_DEFINE(HAVE_SYS_NERR) + ;; +esac + +if test -z "${setobjs}"; then + case "${host}" in + + *-*-vxworks*) + # Handle VxWorks configuration specially, since on VxWorks the + # libraries are actually on the target board, not in the file + # system. + AC_LIBOBJ([basename]) + AC_LIBOBJ([getpagesize]) + AC_LIBOBJ([insque]) + AC_LIBOBJ([random]) + AC_LIBOBJ([strcasecmp]) + AC_LIBOBJ([strncasecmp]) + AC_LIBOBJ([strdup]) + AC_LIBOBJ([vfork]) + AC_LIBOBJ([waitpid]) + AC_LIBOBJ([vasprintf]) + for f in $funcs; do + case "$f" in + basename | getpagesize | insque | random | strcasecmp) + ;; + strncasecmp | strdup | vfork | waitpid | vasprintf) + ;; + *) + n=HAVE_`echo $f | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + AC_DEFINE_UNQUOTED($n) + ;; + esac + done + + # VxWorks doesn't provide any of the variables in $vars, so we + # don't have to check them here. + + # Of the functions in $checkfuncs, VxWorks only has strerror. + AC_DEFINE(HAVE_STRERROR) + + setobjs=yes + ;; + + *-*-msdosdjgpp) + for f in atexit basename bcmp bcopy bsearch bzero calloc clock ffs \ + getcwd getpagesize getrusage gettimeofday \ + index insque memchr memcmp memcpy memmove memset psignal \ + putenv random rename rindex sbrk setenv stpcpy strcasecmp \ + strchr strdup strerror strncasecmp strrchr strstr strtod \ + strtol strtoul sysconf times tmpnam vfprintf vprintf \ + vsprintf waitpid + do + n=HAVE_`echo $f | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + AC_DEFINE_UNQUOTED($n) + done + + + setobjs=yes + ;; + + esac +fi + +if test -z "${setobjs}"; then + + case "${host}" in + + *-*-cygwin*) + # The Cygwin library actually uses a couple of files from + # libiberty when it is built. If we are building a native + # Cygwin, and we run the tests, we will appear to have these + # files. However, when we go on to build winsup, we will wind up + # with a library which does not have the files, since they should + # have come from libiberty. + + # We handle this by removing the functions the winsup library + # provides from our shell variables, so that they appear to be + # missing. + + # DJ - only if we're *building* cygwin, not just building *with* cygwin + + if test -n "${with_target_subdir}" + then + funcs="`echo $funcs | sed -e 's/random//'`" + AC_LIBOBJ([random]) + vars="`echo $vars | sed -e 's/sys_siglist//'`" + checkfuncs="`echo $checkfuncs | sed -e 's/strsignal//' -e 's/psignal//'`" + fi + ;; + + *-*-mingw32*) + # Under mingw32, sys_nerr and sys_errlist exist, but they are + # macros, so the test below won't find them. + libiberty_cv_var_sys_nerr=yes + libiberty_cv_var_sys_errlist=yes + ;; + + *-*-msdosdjgpp*) + # vfork and fork are stubs. + ac_cv_func_vfork_works=no + ;; + + *-*-uwin*) + # Under some versions of uwin, vfork is notoriously buggy and the test + # can hang configure; on other versions, vfork exists just as a stub. + # FIXME: This should be removed once vfork in uwin's runtime is fixed. + ac_cv_func_vfork_works=no + # Under uwin 2.0+, sys_nerr and sys_errlist exist, but they are + # macros (actually, these are imported from a DLL, but the end effect + # is the same), so the test below won't find them. + libiberty_cv_var_sys_nerr=yes + libiberty_cv_var_sys_errlist=yes + ;; + + *-*-*vms*) + # Under VMS, vfork works very different than on Unix. The standard test + # won't work, and it isn't easily adaptable. It makes more sense to + # just force it. + ac_cv_func_vfork_works=yes + ;; + + esac + + # We haven't set the list of objects yet. Use the standard autoconf + # tests. This will only work if the compiler works. + AC_ISC_POSIX + AC_REPLACE_FUNCS($funcs) + libiberty_AC_FUNC_C_ALLOCA + AC_FUNC_FORK + if test $ac_cv_func_vfork_works = no; then + AC_LIBOBJ([vfork]) + fi + # We only need _doprnt if we might use it to implement v*printf. + if test $ac_cv_func_vprintf != yes \ + || test $ac_cv_func_vfprintf != yes \ + || test $ac_cv_func_vsprintf != yes; then + AC_REPLACE_FUNCS(_doprnt) + else + AC_CHECK_FUNCS(_doprnt) + fi + + for v in $vars; do + AC_MSG_CHECKING([for $v]) + AC_CACHE_VAL(libiberty_cv_var_$v, + [AC_LINK_IFELSE([AC_LANG_PROGRAM([[int *p;]],[[extern int $v []; p = $v;]])], + [eval "libiberty_cv_var_$v=yes"], + [eval "libiberty_cv_var_$v=no"])]) + if eval "test \"`echo '$libiberty_cv_var_'$v`\" = yes"; then + AC_MSG_RESULT(yes) + n=HAVE_`echo $v | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + AC_DEFINE_UNQUOTED($n) + else + AC_MSG_RESULT(no) + fi + done + + # special check for _system_configuration because AIX <4.3.2 do not + # contain the `physmem' member. + AC_MSG_CHECKING([for external symbol _system_configuration]) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[double x = _system_configuration.physmem;]])], + [AC_MSG_RESULT([yes]) + AC_DEFINE(HAVE__SYSTEM_CONFIGURATION, 1, + [Define if you have the _system_configuration variable.])], + [AC_MSG_RESULT([no])]) + + AC_CHECK_FUNCS($checkfuncs) + AC_CHECK_DECLS([basename, ffs, asprintf, vasprintf, snprintf, vsnprintf]) + AC_CHECK_DECLS([calloc, getenv, getopt, malloc, realloc, sbrk]) + AC_CHECK_DECLS([strverscmp]) + libiberty_NEED_DECLARATION(canonicalize_file_name) +fi + +# Figure out which version of pexecute to use. +case "${host}" in + *-*-mingw* | *-*-winnt*) pexecute=./pex-win32.o ;; + *-*-msdosdjgpp*) pexecute=./pex-djgpp.o ;; + *-*-msdos*) pexecute=./pex-msdos.o ;; + *) pexecute=./pex-unix.o ;; +esac +AC_SUBST(pexecute) + +libiberty_AC_FUNC_STRNCMP + +# Install a library built with a cross compiler in $(tooldir) rather +# than $(libdir). +if test -z "${with_cross_host}"; then + INSTALL_DEST=libdir +else + INSTALL_DEST=tooldir +fi +AC_SUBST(INSTALL_DEST) + +m4_pattern_allow(LIBOBJS) +L="" +for l in x $LIBOBJS; do + case $l in + x) ;; + *) L="$L ./$l" ;; + esac +done +LIBOBJS="$L" + +dnl Required by html and install-html +AC_SUBST(datarootdir) +AC_SUBST(docdir) +AC_SUBST(htmldir) + +# We need multilib support, but only if configuring for the target. +AC_CONFIG_FILES([Makefile]) +AC_CONFIG_COMMANDS([default], + [[test -z "$CONFIG_HEADERS" || echo timestamp > stamp-h +if test -n "$CONFIG_FILES"; then + if test -n "${with_target_subdir}"; then + # FIXME: We shouldn't need to set ac_file + ac_file=Makefile + LD="${ORIGINAL_LD_FOR_MULTILIBS}" + . ${libiberty_topdir}/config-ml.in + fi +fi]], +[[srcdir=${srcdir} +host=${host} +target=${target} +with_target_subdir=${with_target_subdir} +with_multisubdir=${with_multisubdir} +ac_configure_args="--enable-multilib ${ac_configure_args}" +CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} +ORIGINAL_LD_FOR_MULTILIBS="${ORIGINAL_LD_FOR_MULTILIBS}" +libiberty_topdir=${libiberty_topdir} +]]) +AC_OUTPUT diff --git a/libiberty/copying-lib.texi b/libiberty/copying-lib.texi new file mode 100644 index 0000000..79e1038 --- /dev/null +++ b/libiberty/copying-lib.texi @@ -0,0 +1,565 @@ +@node Library Copying +@appendixsec GNU LESSER GENERAL PUBLIC LICENSE + +@cindex LGPL, Lesser General Public License +@center Version 2.1, February 1999 + +@display +Copyright @copyright{} 1991, 1999 Free Software Foundation, Inc. +51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA + +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts +as the successor of the GNU Library Public License, version 2, hence the +version number 2.1.] +@end display + +@appendixsubsec Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software---to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software---typically libraries---of the Free +Software Foundation and other authors who decide to use it. You can use +it too, but we suggest you first think carefully about whether this +license or the ordinary General Public License is the better strategy to +use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +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 and use pieces of it +in new free programs; and that you are informed that you can do these +things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the @dfn{Lesser} General Public License because it +does @emph{Less} to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +``work based on the library'' and a ``work that uses the library''. The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + +@iftex +@appendixsubsec TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION +@end iftex +@ifinfo +@center GNU LESSER GENERAL PUBLIC LICENSE +@center TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION +@end ifinfo + +@enumerate 0 +@item +This License Agreement applies to any software library or other program +which contains a notice placed by the copyright holder or other +authorized party saying it may be distributed under the terms of this +Lesser General Public License (also called ``this License''). Each +licensee is addressed as ``you''. + + A ``library'' means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The ``Library'', below, refers to any such software library or work +which has been distributed under these terms. A ``work based on the +Library'' means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term ``modification''.) + + ``Source code'' for a work means the preferred form of the work for +making modifications to it. For a library, 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 library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + +@item +You may copy and distribute verbatim copies of the Library's +complete 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 distribute a copy of this License along with the +Library. + + 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. + +@item +You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + +@enumerate a +@item +The modified work must itself be a software library. + +@item +You must cause the files modified to carry prominent notices +stating that you changed the files and the date of any change. + +@item +You must cause the whole of the work to be licensed at no +charge to all third parties under the terms of this License. + +@item +If a facility in the modified Library refers to a function or a +table of data to be supplied by an application program that uses +the facility, other than as an argument passed when the facility +is invoked, then you must make a good faith effort to ensure that, +in the event an application does not supply such function or +table, the facility still operates, and performs whatever part of +its purpose remains meaningful. + +(For example, a function in a library to compute square roots has +a purpose that is entirely well-defined independent of the +application. Therefore, Subsection 2d requires that any +application-supplied function or table used by this function must +be optional: if the application does not supply it, the square +root function must still compute square roots.) +@end enumerate + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +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 Library, 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 Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + +@item +You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + +@item +You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you 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. + + If distribution of 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 satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + +@item +A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a ``work that uses the Library''. Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a ``work that uses the Library'' with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a ``work that uses the +library''. The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a ``work that uses the Library'' uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + +@item +As an exception to the Sections above, you may also combine or +link a ``work that uses the Library'' with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + +@enumerate a +@item +Accompany the work with the complete corresponding +machine-readable source code for the Library including whatever +changes were used in the work (which must be distributed under +Sections 1 and 2 above); and, if the work is an executable linked +with the Library, with the complete machine-readable ``work that +uses the Library'', as object code and/or source code, so that the +user can modify the Library and then relink to produce a modified +executable containing the modified Library. (It is understood +that the user who changes the contents of definitions files in the +Library will not necessarily be able to recompile the application +to use the modified definitions.) + +@item +Use a suitable shared library mechanism for linking with the Library. A +suitable mechanism is one that (1) uses at run time a copy of the +library already present on the user's computer system, rather than +copying library functions into the executable, and (2) will operate +properly with a modified version of the library, if the user installs +one, as long as the modified version is interface-compatible with the +version that the work was made with. + +@item +Accompany the work with a written offer, valid for at +least three years, to give the same user the materials +specified in Subsection 6a, above, for a charge no more +than the cost of performing this distribution. + +@item +If distribution of the work is made by offering access to copy +from a designated place, offer equivalent access to copy the above +specified materials from the same place. + +@item +Verify that the user has already received a copy of these +materials or that you have already sent this user a copy. +@end enumerate + + For an executable, the required form of the ``work that uses the +Library'' must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be 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. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + +@item +You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + +@enumerate a +@item +Accompany the combined library with a copy of the same work +based on the Library, uncombined with any other library +facilities. This must be distributed under the terms of the +Sections above. + +@item +Give prominent notice with the combined library of the fact +that part of it is a work based on the Library, and explaining +where to find the accompanying uncombined form of the same work. +@end enumerate + +@item +You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library 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. + +@item +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 Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + +@item +Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +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 with +this License. + +@item +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 Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library 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 Library. + +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. + +@item +If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library 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. + +@item +The Free Software Foundation may publish revised and/or new +versions of the Lesser 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 Library +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 Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + +@item +If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +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. + +@iftex +@heading NO WARRANTY +@end iftex +@ifinfo +@center NO WARRANTY +@end ifinfo + +@item +BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY ``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 +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +@item +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 LIBRARY 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 +LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. +@end enumerate + +@iftex +@heading END OF TERMS AND CONDITIONS +@end iftex +@ifinfo +@center END OF TERMS AND CONDITIONS +@end ifinfo + +@page +@appendixsubsec How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. 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. + +@smallexample +@var{one line to give the library's name and an idea of what it does.} +Copyright (C) @var{year} @var{name of author} + +This library is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or (at +your option) any later version. + +This library 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 +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, +USA. +@end smallexample + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a ``copyright disclaimer'' for the library, if +necessary. Here is a sample; alter the names: + +@smallexample +Yoyodyne, Inc., hereby disclaims all copyright interest in the library +`Frob' (a library for tweaking knobs) written by James Random Hacker. + +@var{signature of Ty Coon}, 1 April 1990 +Ty Coon, President of Vice +@end smallexample + +That's all there is to it! diff --git a/libiberty/copysign.c b/libiberty/copysign.c new file mode 100644 index 0000000..6793f22 --- /dev/null +++ b/libiberty/copysign.c @@ -0,0 +1,154 @@ +#include + +#ifdef __IEEE_BIG_ENDIAN + +typedef union +{ + double value; + struct + { + unsigned int sign : 1; + unsigned int exponent: 11; + unsigned int fraction0:4; + unsigned int fraction1:16; + unsigned int fraction2:16; + unsigned int fraction3:16; + + } number; + struct + { + unsigned int sign : 1; + unsigned int exponent: 11; + unsigned int quiet:1; + unsigned int function0:3; + unsigned int function1:16; + unsigned int function2:16; + unsigned int function3:16; + } nan; + struct + { + unsigned long msw; + unsigned long lsw; + } parts; + long aslong[2]; +} __ieee_double_shape_type; + +#endif + +#ifdef __IEEE_LITTLE_ENDIAN + +typedef union +{ + double value; + struct + { +#ifdef __SMALL_BITFIELDS + unsigned int fraction3:16; + unsigned int fraction2:16; + unsigned int fraction1:16; + unsigned int fraction0: 4; +#else + unsigned int fraction1:32; + unsigned int fraction0:20; +#endif + unsigned int exponent :11; + unsigned int sign : 1; + } number; + struct + { +#ifdef __SMALL_BITFIELDS + unsigned int function3:16; + unsigned int function2:16; + unsigned int function1:16; + unsigned int function0:3; +#else + unsigned int function1:32; + unsigned int function0:19; +#endif + unsigned int quiet:1; + unsigned int exponent: 11; + unsigned int sign : 1; + } nan; + struct + { + unsigned long lsw; + unsigned long msw; + } parts; + + long aslong[2]; + +} __ieee_double_shape_type; + +#endif + +#ifdef __IEEE_BIG_ENDIAN +typedef union +{ + float value; + struct + { + unsigned int sign : 1; + unsigned int exponent: 8; + unsigned int fraction0: 7; + unsigned int fraction1: 16; + } number; + struct + { + unsigned int sign:1; + unsigned int exponent:8; + unsigned int quiet:1; + unsigned int function0:6; + unsigned int function1:16; + } nan; + long p1; + +} __ieee_float_shape_type; +#endif + +#ifdef __IEEE_LITTLE_ENDIAN +typedef union +{ + float value; + struct + { + unsigned int fraction0: 7; + unsigned int fraction1: 16; + unsigned int exponent: 8; + unsigned int sign : 1; + } number; + struct + { + unsigned int function1:16; + unsigned int function0:6; + unsigned int quiet:1; + unsigned int exponent:8; + unsigned int sign:1; + } nan; + long p1; + +} __ieee_float_shape_type; +#endif + +#if defined(__IEEE_BIG_ENDIAN) || defined(__IEEE_LITTLE_ENDIAN) + +double +copysign (double x, double y) +{ + __ieee_double_shape_type a,b; + b.value = y; + a.value = x; + a.number.sign =b.number.sign; + return a.value; +} + +#else + +double +copysign (double x, double y) +{ + if ((x < 0 && y > 0) || (x > 0 && y < 0)) + return -x; + return x; +} + +#endif diff --git a/libiberty/cp-demangle.c b/libiberty/cp-demangle.c new file mode 100644 index 0000000..3fc6a21 --- /dev/null +++ b/libiberty/cp-demangle.c @@ -0,0 +1,4537 @@ +/* Demangler for g++ V3 ABI. + Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. + Written by Ian Lance Taylor . + + This file is part of the libiberty library, which is part of GCC. + + This file 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. + + In addition to the permissions in the GNU General Public License, the + Free Software Foundation gives you unlimited permission to link the + compiled version of this file into combinations with other programs, + and to distribute those combinations without any restriction coming + from the use of this file. (The General Public License restrictions + do apply in other respects; for example, they cover modification of + the file, and distribution when not linked into a combined + executable.) + + 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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +/* This code implements a demangler for the g++ V3 ABI. The ABI is + described on this web page: + http://www.codesourcery.com/cxx-abi/abi.html#mangling + + This code was written while looking at the demangler written by + Alex Samuel . + + This code first pulls the mangled name apart into a list of + components, and then walks the list generating the demangled + name. + + This file will normally define the following functions, q.v.: + char *cplus_demangle_v3(const char *mangled, int options) + char *java_demangle_v3(const char *mangled) + int cplus_demangle_v3_callback(const char *mangled, int options, + demangle_callbackref callback) + int java_demangle_v3_callback(const char *mangled, + demangle_callbackref callback) + enum gnu_v3_ctor_kinds is_gnu_v3_mangled_ctor (const char *name) + enum gnu_v3_dtor_kinds is_gnu_v3_mangled_dtor (const char *name) + + Also, the interface to the component list is public, and defined in + demangle.h. The interface consists of these types, which are + defined in demangle.h: + enum demangle_component_type + struct demangle_component + demangle_callbackref + and these functions defined in this file: + cplus_demangle_fill_name + cplus_demangle_fill_extended_operator + cplus_demangle_fill_ctor + cplus_demangle_fill_dtor + cplus_demangle_print + cplus_demangle_print_callback + and other functions defined in the file cp-demint.c. + + This file also defines some other functions and variables which are + only to be used by the file cp-demint.c. + + Preprocessor macros you can define while compiling this file: + + IN_LIBGCC2 + If defined, this file defines the following functions, q.v.: + char *__cxa_demangle (const char *mangled, char *buf, size_t *len, + int *status) + int __gcclibcxx_demangle_callback (const char *, + void (*) + (const char *, size_t, void *), + void *) + instead of cplus_demangle_v3[_callback]() and + java_demangle_v3[_callback](). + + IN_GLIBCPP_V3 + If defined, this file defines only __cxa_demangle() and + __gcclibcxx_demangle_callback(), and no other publically visible + functions or variables. + + STANDALONE_DEMANGLER + If defined, this file defines a main() function which demangles + any arguments, or, if none, demangles stdin. + + CP_DEMANGLE_DEBUG + If defined, turns on debugging mode, which prints information on + stdout about the mangled string. This is not generally useful. +*/ + +#if defined (_AIX) && !defined (__GNUC__) + #pragma alloca +#endif + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif + +#ifdef HAVE_ALLOCA_H +# include +#else +# ifndef alloca +# ifdef __GNUC__ +# define alloca __builtin_alloca +# else +extern char *alloca (); +# endif /* __GNUC__ */ +# endif /* alloca */ +#endif /* HAVE_ALLOCA_H */ + +#include "ansidecl.h" +#include "libiberty.h" +#include "demangle.h" +#include "cp-demangle.h" + +/* If IN_GLIBCPP_V3 is defined, some functions are made static. We + also rename them via #define to avoid compiler errors when the + static definition conflicts with the extern declaration in a header + file. */ +#ifdef IN_GLIBCPP_V3 + +#define CP_STATIC_IF_GLIBCPP_V3 static + +#define cplus_demangle_fill_name d_fill_name +static int d_fill_name (struct demangle_component *, const char *, int); + +#define cplus_demangle_fill_extended_operator d_fill_extended_operator +static int +d_fill_extended_operator (struct demangle_component *, int, + struct demangle_component *); + +#define cplus_demangle_fill_ctor d_fill_ctor +static int +d_fill_ctor (struct demangle_component *, enum gnu_v3_ctor_kinds, + struct demangle_component *); + +#define cplus_demangle_fill_dtor d_fill_dtor +static int +d_fill_dtor (struct demangle_component *, enum gnu_v3_dtor_kinds, + struct demangle_component *); + +#define cplus_demangle_mangled_name d_mangled_name +static struct demangle_component *d_mangled_name (struct d_info *, int); + +#define cplus_demangle_type d_type +static struct demangle_component *d_type (struct d_info *); + +#define cplus_demangle_print d_print +static char *d_print (int, const struct demangle_component *, int, size_t *); + +#define cplus_demangle_print_callback d_print_callback +static int d_print_callback (int, const struct demangle_component *, + demangle_callbackref, void *); + +#define cplus_demangle_init_info d_init_info +static void d_init_info (const char *, int, size_t, struct d_info *); + +#else /* ! defined(IN_GLIBCPP_V3) */ +#define CP_STATIC_IF_GLIBCPP_V3 +#endif /* ! defined(IN_GLIBCPP_V3) */ + +/* See if the compiler supports dynamic arrays. */ + +#ifdef __GNUC__ +#define CP_DYNAMIC_ARRAYS +#else +#ifdef __STDC__ +#ifdef __STDC_VERSION__ +#if __STDC_VERSION__ >= 199901L +#define CP_DYNAMIC_ARRAYS +#endif /* __STDC__VERSION >= 199901L */ +#endif /* defined (__STDC_VERSION__) */ +#endif /* defined (__STDC__) */ +#endif /* ! defined (__GNUC__) */ + +/* We avoid pulling in the ctype tables, to prevent pulling in + additional unresolved symbols when this code is used in a library. + FIXME: Is this really a valid reason? This comes from the original + V3 demangler code. + + As of this writing this file has the following undefined references + when compiled with -DIN_GLIBCPP_V3: realloc, free, memcpy, strcpy, + strcat, strlen. */ + +#define IS_DIGIT(c) ((c) >= '0' && (c) <= '9') +#define IS_UPPER(c) ((c) >= 'A' && (c) <= 'Z') +#define IS_LOWER(c) ((c) >= 'a' && (c) <= 'z') + +/* The prefix prepended by GCC to an identifier represnting the + anonymous namespace. */ +#define ANONYMOUS_NAMESPACE_PREFIX "_GLOBAL_" +#define ANONYMOUS_NAMESPACE_PREFIX_LEN \ + (sizeof (ANONYMOUS_NAMESPACE_PREFIX) - 1) + +/* Information we keep for the standard substitutions. */ + +struct d_standard_sub_info +{ + /* The code for this substitution. */ + char code; + /* The simple string it expands to. */ + const char *simple_expansion; + /* The length of the simple expansion. */ + int simple_len; + /* The results of a full, verbose, expansion. This is used when + qualifying a constructor/destructor, or when in verbose mode. */ + const char *full_expansion; + /* The length of the full expansion. */ + int full_len; + /* What to set the last_name field of d_info to; NULL if we should + not set it. This is only relevant when qualifying a + constructor/destructor. */ + const char *set_last_name; + /* The length of set_last_name. */ + int set_last_name_len; +}; + +/* Accessors for subtrees of struct demangle_component. */ + +#define d_left(dc) ((dc)->u.s_binary.left) +#define d_right(dc) ((dc)->u.s_binary.right) + +/* A list of templates. This is used while printing. */ + +struct d_print_template +{ + /* Next template on the list. */ + struct d_print_template *next; + /* This template. */ + const struct demangle_component *template_decl; +}; + +/* A list of type modifiers. This is used while printing. */ + +struct d_print_mod +{ + /* Next modifier on the list. These are in the reverse of the order + in which they appeared in the mangled string. */ + struct d_print_mod *next; + /* The modifier. */ + const struct demangle_component *mod; + /* Whether this modifier was printed. */ + int printed; + /* The list of templates which applies to this modifier. */ + struct d_print_template *templates; +}; + +/* We use these structures to hold information during printing. */ + +struct d_growable_string +{ + /* Buffer holding the result. */ + char *buf; + /* Current length of data in buffer. */ + size_t len; + /* Allocated size of buffer. */ + size_t alc; + /* Set to 1 if we had a memory allocation failure. */ + int allocation_failure; +}; + +enum { D_PRINT_BUFFER_LENGTH = 256 }; +struct d_print_info +{ + /* The options passed to the demangler. */ + int options; + /* Fixed-length allocated buffer for demangled data, flushed to the + callback with a NUL termination once full. */ + char buf[D_PRINT_BUFFER_LENGTH]; + /* Current length of data in buffer. */ + size_t len; + /* The last character printed, saved individually so that it survives + any buffer flush. */ + char last_char; + /* Callback function to handle demangled buffer flush. */ + demangle_callbackref callback; + /* Opaque callback argument. */ + void *opaque; + /* The current list of templates, if any. */ + struct d_print_template *templates; + /* The current list of modifiers (e.g., pointer, reference, etc.), + if any. */ + struct d_print_mod *modifiers; + /* Set to 1 if we saw a demangling error. */ + int demangle_failure; +}; + +#ifdef CP_DEMANGLE_DEBUG +static void d_dump (struct demangle_component *, int); +#endif + +static struct demangle_component * +d_make_empty (struct d_info *); + +static struct demangle_component * +d_make_comp (struct d_info *, enum demangle_component_type, + struct demangle_component *, + struct demangle_component *); + +static struct demangle_component * +d_make_name (struct d_info *, const char *, int); + +static struct demangle_component * +d_make_builtin_type (struct d_info *, + const struct demangle_builtin_type_info *); + +static struct demangle_component * +d_make_operator (struct d_info *, + const struct demangle_operator_info *); + +static struct demangle_component * +d_make_extended_operator (struct d_info *, int, + struct demangle_component *); + +static struct demangle_component * +d_make_ctor (struct d_info *, enum gnu_v3_ctor_kinds, + struct demangle_component *); + +static struct demangle_component * +d_make_dtor (struct d_info *, enum gnu_v3_dtor_kinds, + struct demangle_component *); + +static struct demangle_component * +d_make_template_param (struct d_info *, long); + +static struct demangle_component * +d_make_sub (struct d_info *, const char *, int); + +static int +has_return_type (struct demangle_component *); + +static int +is_ctor_dtor_or_conversion (struct demangle_component *); + +static struct demangle_component *d_encoding (struct d_info *, int); + +static struct demangle_component *d_name (struct d_info *); + +static struct demangle_component *d_nested_name (struct d_info *); + +static struct demangle_component *d_prefix (struct d_info *); + +static struct demangle_component *d_unqualified_name (struct d_info *); + +static struct demangle_component *d_source_name (struct d_info *); + +static long d_number (struct d_info *); + +static struct demangle_component *d_identifier (struct d_info *, int); + +static struct demangle_component *d_operator_name (struct d_info *); + +static struct demangle_component *d_special_name (struct d_info *); + +static int d_call_offset (struct d_info *, int); + +static struct demangle_component *d_ctor_dtor_name (struct d_info *); + +static struct demangle_component ** +d_cv_qualifiers (struct d_info *, struct demangle_component **, int); + +static struct demangle_component * +d_function_type (struct d_info *); + +static struct demangle_component * +d_bare_function_type (struct d_info *, int); + +static struct demangle_component * +d_class_enum_type (struct d_info *); + +static struct demangle_component *d_array_type (struct d_info *); + +static struct demangle_component * +d_pointer_to_member_type (struct d_info *); + +static struct demangle_component * +d_template_param (struct d_info *); + +static struct demangle_component *d_template_args (struct d_info *); + +static struct demangle_component * +d_template_arg (struct d_info *); + +static struct demangle_component *d_expression (struct d_info *); + +static struct demangle_component *d_expr_primary (struct d_info *); + +static struct demangle_component *d_local_name (struct d_info *); + +static int d_discriminator (struct d_info *); + +static int +d_add_substitution (struct d_info *, struct demangle_component *); + +static struct demangle_component *d_substitution (struct d_info *, int); + +static void d_growable_string_init (struct d_growable_string *, size_t); + +static inline void +d_growable_string_resize (struct d_growable_string *, size_t); + +static inline void +d_growable_string_append_buffer (struct d_growable_string *, + const char *, size_t); +static void +d_growable_string_callback_adapter (const char *, size_t, void *); + +static void +d_print_init (struct d_print_info *, int, demangle_callbackref, void *); + +static inline void d_print_error (struct d_print_info *); + +static inline int d_print_saw_error (struct d_print_info *); + +static inline void d_print_flush (struct d_print_info *); + +static inline void d_append_char (struct d_print_info *, char); + +static inline void d_append_buffer (struct d_print_info *, + const char *, size_t); + +static inline void d_append_string (struct d_print_info *, const char *); + +static inline char d_last_char (struct d_print_info *); + +static void +d_print_comp (struct d_print_info *, const struct demangle_component *); + +static void +d_print_java_identifier (struct d_print_info *, const char *, int); + +static void +d_print_mod_list (struct d_print_info *, struct d_print_mod *, int); + +static void +d_print_mod (struct d_print_info *, const struct demangle_component *); + +static void +d_print_function_type (struct d_print_info *, + const struct demangle_component *, + struct d_print_mod *); + +static void +d_print_array_type (struct d_print_info *, + const struct demangle_component *, + struct d_print_mod *); + +static void +d_print_expr_op (struct d_print_info *, const struct demangle_component *); + +static void +d_print_cast (struct d_print_info *, const struct demangle_component *); + +static int d_demangle_callback (const char *, int, + demangle_callbackref, void *); +static char *d_demangle (const char *, int, size_t *); + +#ifdef CP_DEMANGLE_DEBUG + +static void +d_dump (struct demangle_component *dc, int indent) +{ + int i; + + if (dc == NULL) + { + if (indent == 0) + printf ("failed demangling\n"); + return; + } + + for (i = 0; i < indent; ++i) + putchar (' '); + + switch (dc->type) + { + case DEMANGLE_COMPONENT_NAME: + printf ("name '%.*s'\n", dc->u.s_name.len, dc->u.s_name.s); + return; + case DEMANGLE_COMPONENT_TEMPLATE_PARAM: + printf ("template parameter %ld\n", dc->u.s_number.number); + return; + case DEMANGLE_COMPONENT_CTOR: + printf ("constructor %d\n", (int) dc->u.s_ctor.kind); + d_dump (dc->u.s_ctor.name, indent + 2); + return; + case DEMANGLE_COMPONENT_DTOR: + printf ("destructor %d\n", (int) dc->u.s_dtor.kind); + d_dump (dc->u.s_dtor.name, indent + 2); + return; + case DEMANGLE_COMPONENT_SUB_STD: + printf ("standard substitution %s\n", dc->u.s_string.string); + return; + case DEMANGLE_COMPONENT_BUILTIN_TYPE: + printf ("builtin type %s\n", dc->u.s_builtin.type->name); + return; + case DEMANGLE_COMPONENT_OPERATOR: + printf ("operator %s\n", dc->u.s_operator.op->name); + return; + case DEMANGLE_COMPONENT_EXTENDED_OPERATOR: + printf ("extended operator with %d args\n", + dc->u.s_extended_operator.args); + d_dump (dc->u.s_extended_operator.name, indent + 2); + return; + + case DEMANGLE_COMPONENT_QUAL_NAME: + printf ("qualified name\n"); + break; + case DEMANGLE_COMPONENT_LOCAL_NAME: + printf ("local name\n"); + break; + case DEMANGLE_COMPONENT_TYPED_NAME: + printf ("typed name\n"); + break; + case DEMANGLE_COMPONENT_TEMPLATE: + printf ("template\n"); + break; + case DEMANGLE_COMPONENT_VTABLE: + printf ("vtable\n"); + break; + case DEMANGLE_COMPONENT_VTT: + printf ("VTT\n"); + break; + case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE: + printf ("construction vtable\n"); + break; + case DEMANGLE_COMPONENT_TYPEINFO: + printf ("typeinfo\n"); + break; + case DEMANGLE_COMPONENT_TYPEINFO_NAME: + printf ("typeinfo name\n"); + break; + case DEMANGLE_COMPONENT_TYPEINFO_FN: + printf ("typeinfo function\n"); + break; + case DEMANGLE_COMPONENT_THUNK: + printf ("thunk\n"); + break; + case DEMANGLE_COMPONENT_VIRTUAL_THUNK: + printf ("virtual thunk\n"); + break; + case DEMANGLE_COMPONENT_COVARIANT_THUNK: + printf ("covariant thunk\n"); + break; + case DEMANGLE_COMPONENT_JAVA_CLASS: + printf ("java class\n"); + break; + case DEMANGLE_COMPONENT_GUARD: + printf ("guard\n"); + break; + case DEMANGLE_COMPONENT_REFTEMP: + printf ("reference temporary\n"); + break; + case DEMANGLE_COMPONENT_HIDDEN_ALIAS: + printf ("hidden alias\n"); + break; + case DEMANGLE_COMPONENT_RESTRICT: + printf ("restrict\n"); + break; + case DEMANGLE_COMPONENT_VOLATILE: + printf ("volatile\n"); + break; + case DEMANGLE_COMPONENT_CONST: + printf ("const\n"); + break; + case DEMANGLE_COMPONENT_RESTRICT_THIS: + printf ("restrict this\n"); + break; + case DEMANGLE_COMPONENT_VOLATILE_THIS: + printf ("volatile this\n"); + break; + case DEMANGLE_COMPONENT_CONST_THIS: + printf ("const this\n"); + break; + case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL: + printf ("vendor type qualifier\n"); + break; + case DEMANGLE_COMPONENT_POINTER: + printf ("pointer\n"); + break; + case DEMANGLE_COMPONENT_REFERENCE: + printf ("reference\n"); + break; + case DEMANGLE_COMPONENT_RVALUE_REFERENCE: + printf ("rvalue reference\n"); + break; + case DEMANGLE_COMPONENT_COMPLEX: + printf ("complex\n"); + break; + case DEMANGLE_COMPONENT_IMAGINARY: + printf ("imaginary\n"); + break; + case DEMANGLE_COMPONENT_VENDOR_TYPE: + printf ("vendor type\n"); + break; + case DEMANGLE_COMPONENT_FUNCTION_TYPE: + printf ("function type\n"); + break; + case DEMANGLE_COMPONENT_ARRAY_TYPE: + printf ("array type\n"); + break; + case DEMANGLE_COMPONENT_PTRMEM_TYPE: + printf ("pointer to member type\n"); + break; + case DEMANGLE_COMPONENT_ARGLIST: + printf ("argument list\n"); + break; + case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST: + printf ("template argument list\n"); + break; + case DEMANGLE_COMPONENT_CAST: + printf ("cast\n"); + break; + case DEMANGLE_COMPONENT_UNARY: + printf ("unary operator\n"); + break; + case DEMANGLE_COMPONENT_BINARY: + printf ("binary operator\n"); + break; + case DEMANGLE_COMPONENT_BINARY_ARGS: + printf ("binary operator arguments\n"); + break; + case DEMANGLE_COMPONENT_TRINARY: + printf ("trinary operator\n"); + break; + case DEMANGLE_COMPONENT_TRINARY_ARG1: + printf ("trinary operator arguments 1\n"); + break; + case DEMANGLE_COMPONENT_TRINARY_ARG2: + printf ("trinary operator arguments 1\n"); + break; + case DEMANGLE_COMPONENT_LITERAL: + printf ("literal\n"); + break; + case DEMANGLE_COMPONENT_LITERAL_NEG: + printf ("negative literal\n"); + break; + } + + d_dump (d_left (dc), indent + 2); + d_dump (d_right (dc), indent + 2); +} + +#endif /* CP_DEMANGLE_DEBUG */ + +/* Fill in a DEMANGLE_COMPONENT_NAME. */ + +CP_STATIC_IF_GLIBCPP_V3 +int +cplus_demangle_fill_name (struct demangle_component *p, const char *s, int len) +{ + if (p == NULL || s == NULL || len == 0) + return 0; + p->type = DEMANGLE_COMPONENT_NAME; + p->u.s_name.s = s; + p->u.s_name.len = len; + return 1; +} + +/* Fill in a DEMANGLE_COMPONENT_EXTENDED_OPERATOR. */ + +CP_STATIC_IF_GLIBCPP_V3 +int +cplus_demangle_fill_extended_operator (struct demangle_component *p, int args, + struct demangle_component *name) +{ + if (p == NULL || args < 0 || name == NULL) + return 0; + p->type = DEMANGLE_COMPONENT_EXTENDED_OPERATOR; + p->u.s_extended_operator.args = args; + p->u.s_extended_operator.name = name; + return 1; +} + +/* Fill in a DEMANGLE_COMPONENT_CTOR. */ + +CP_STATIC_IF_GLIBCPP_V3 +int +cplus_demangle_fill_ctor (struct demangle_component *p, + enum gnu_v3_ctor_kinds kind, + struct demangle_component *name) +{ + if (p == NULL + || name == NULL + || (kind < gnu_v3_complete_object_ctor + && kind > gnu_v3_complete_object_allocating_ctor)) + return 0; + p->type = DEMANGLE_COMPONENT_CTOR; + p->u.s_ctor.kind = kind; + p->u.s_ctor.name = name; + return 1; +} + +/* Fill in a DEMANGLE_COMPONENT_DTOR. */ + +CP_STATIC_IF_GLIBCPP_V3 +int +cplus_demangle_fill_dtor (struct demangle_component *p, + enum gnu_v3_dtor_kinds kind, + struct demangle_component *name) +{ + if (p == NULL + || name == NULL + || (kind < gnu_v3_deleting_dtor + && kind > gnu_v3_base_object_dtor)) + return 0; + p->type = DEMANGLE_COMPONENT_DTOR; + p->u.s_dtor.kind = kind; + p->u.s_dtor.name = name; + return 1; +} + +/* Add a new component. */ + +static struct demangle_component * +d_make_empty (struct d_info *di) +{ + struct demangle_component *p; + + if (di->next_comp >= di->num_comps) + return NULL; + p = &di->comps[di->next_comp]; + ++di->next_comp; + return p; +} + +/* Add a new generic component. */ + +static struct demangle_component * +d_make_comp (struct d_info *di, enum demangle_component_type type, + struct demangle_component *left, + struct demangle_component *right) +{ + struct demangle_component *p; + + /* We check for errors here. A typical error would be a NULL return + from a subroutine. We catch those here, and return NULL + upward. */ + switch (type) + { + /* These types require two parameters. */ + case DEMANGLE_COMPONENT_QUAL_NAME: + case DEMANGLE_COMPONENT_LOCAL_NAME: + case DEMANGLE_COMPONENT_TYPED_NAME: + case DEMANGLE_COMPONENT_TEMPLATE: + case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE: + case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL: + case DEMANGLE_COMPONENT_PTRMEM_TYPE: + case DEMANGLE_COMPONENT_UNARY: + case DEMANGLE_COMPONENT_BINARY: + case DEMANGLE_COMPONENT_BINARY_ARGS: + case DEMANGLE_COMPONENT_TRINARY: + case DEMANGLE_COMPONENT_TRINARY_ARG1: + case DEMANGLE_COMPONENT_TRINARY_ARG2: + case DEMANGLE_COMPONENT_LITERAL: + case DEMANGLE_COMPONENT_LITERAL_NEG: + if (left == NULL || right == NULL) + return NULL; + break; + + /* These types only require one parameter. */ + case DEMANGLE_COMPONENT_VTABLE: + case DEMANGLE_COMPONENT_VTT: + case DEMANGLE_COMPONENT_TYPEINFO: + case DEMANGLE_COMPONENT_TYPEINFO_NAME: + case DEMANGLE_COMPONENT_TYPEINFO_FN: + case DEMANGLE_COMPONENT_THUNK: + case DEMANGLE_COMPONENT_VIRTUAL_THUNK: + case DEMANGLE_COMPONENT_COVARIANT_THUNK: + case DEMANGLE_COMPONENT_JAVA_CLASS: + case DEMANGLE_COMPONENT_GUARD: + case DEMANGLE_COMPONENT_REFTEMP: + case DEMANGLE_COMPONENT_HIDDEN_ALIAS: + case DEMANGLE_COMPONENT_POINTER: + case DEMANGLE_COMPONENT_REFERENCE: + case DEMANGLE_COMPONENT_RVALUE_REFERENCE: + case DEMANGLE_COMPONENT_COMPLEX: + case DEMANGLE_COMPONENT_IMAGINARY: + case DEMANGLE_COMPONENT_VENDOR_TYPE: + case DEMANGLE_COMPONENT_ARGLIST: + case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST: + case DEMANGLE_COMPONENT_CAST: + if (left == NULL) + return NULL; + break; + + /* This needs a right parameter, but the left parameter can be + empty. */ + case DEMANGLE_COMPONENT_ARRAY_TYPE: + if (right == NULL) + return NULL; + break; + + /* These are allowed to have no parameters--in some cases they + will be filled in later. */ + case DEMANGLE_COMPONENT_FUNCTION_TYPE: + case DEMANGLE_COMPONENT_RESTRICT: + case DEMANGLE_COMPONENT_VOLATILE: + case DEMANGLE_COMPONENT_CONST: + case DEMANGLE_COMPONENT_RESTRICT_THIS: + case DEMANGLE_COMPONENT_VOLATILE_THIS: + case DEMANGLE_COMPONENT_CONST_THIS: + break; + + /* Other types should not be seen here. */ + default: + return NULL; + } + + p = d_make_empty (di); + if (p != NULL) + { + p->type = type; + p->u.s_binary.left = left; + p->u.s_binary.right = right; + } + return p; +} + +/* Add a new name component. */ + +static struct demangle_component * +d_make_name (struct d_info *di, const char *s, int len) +{ + struct demangle_component *p; + + p = d_make_empty (di); + if (! cplus_demangle_fill_name (p, s, len)) + return NULL; + return p; +} + +/* Add a new builtin type component. */ + +static struct demangle_component * +d_make_builtin_type (struct d_info *di, + const struct demangle_builtin_type_info *type) +{ + struct demangle_component *p; + + if (type == NULL) + return NULL; + p = d_make_empty (di); + if (p != NULL) + { + p->type = DEMANGLE_COMPONENT_BUILTIN_TYPE; + p->u.s_builtin.type = type; + } + return p; +} + +/* Add a new operator component. */ + +static struct demangle_component * +d_make_operator (struct d_info *di, const struct demangle_operator_info *op) +{ + struct demangle_component *p; + + p = d_make_empty (di); + if (p != NULL) + { + p->type = DEMANGLE_COMPONENT_OPERATOR; + p->u.s_operator.op = op; + } + return p; +} + +/* Add a new extended operator component. */ + +static struct demangle_component * +d_make_extended_operator (struct d_info *di, int args, + struct demangle_component *name) +{ + struct demangle_component *p; + + p = d_make_empty (di); + if (! cplus_demangle_fill_extended_operator (p, args, name)) + return NULL; + return p; +} + +/* Add a new constructor component. */ + +static struct demangle_component * +d_make_ctor (struct d_info *di, enum gnu_v3_ctor_kinds kind, + struct demangle_component *name) +{ + struct demangle_component *p; + + p = d_make_empty (di); + if (! cplus_demangle_fill_ctor (p, kind, name)) + return NULL; + return p; +} + +/* Add a new destructor component. */ + +static struct demangle_component * +d_make_dtor (struct d_info *di, enum gnu_v3_dtor_kinds kind, + struct demangle_component *name) +{ + struct demangle_component *p; + + p = d_make_empty (di); + if (! cplus_demangle_fill_dtor (p, kind, name)) + return NULL; + return p; +} + +/* Add a new template parameter. */ + +static struct demangle_component * +d_make_template_param (struct d_info *di, long i) +{ + struct demangle_component *p; + + p = d_make_empty (di); + if (p != NULL) + { + p->type = DEMANGLE_COMPONENT_TEMPLATE_PARAM; + p->u.s_number.number = i; + } + return p; +} + +/* Add a new standard substitution component. */ + +static struct demangle_component * +d_make_sub (struct d_info *di, const char *name, int len) +{ + struct demangle_component *p; + + p = d_make_empty (di); + if (p != NULL) + { + p->type = DEMANGLE_COMPONENT_SUB_STD; + p->u.s_string.string = name; + p->u.s_string.len = len; + } + return p; +} + +/* ::= _Z + + TOP_LEVEL is non-zero when called at the top level. */ + +CP_STATIC_IF_GLIBCPP_V3 +struct demangle_component * +cplus_demangle_mangled_name (struct d_info *di, int top_level) +{ + if (! d_check_char (di, '_')) + return NULL; + if (! d_check_char (di, 'Z')) + return NULL; + return d_encoding (di, top_level); +} + +/* Return whether a function should have a return type. The argument + is the function name, which may be qualified in various ways. The + rules are that template functions have return types with some + exceptions, function types which are not part of a function name + mangling have return types with some exceptions, and non-template + function names do not have return types. The exceptions are that + constructors, destructors, and conversion operators do not have + return types. */ + +static int +has_return_type (struct demangle_component *dc) +{ + if (dc == NULL) + return 0; + switch (dc->type) + { + default: + return 0; + case DEMANGLE_COMPONENT_TEMPLATE: + return ! is_ctor_dtor_or_conversion (d_left (dc)); + case DEMANGLE_COMPONENT_RESTRICT_THIS: + case DEMANGLE_COMPONENT_VOLATILE_THIS: + case DEMANGLE_COMPONENT_CONST_THIS: + return has_return_type (d_left (dc)); + } +} + +/* Return whether a name is a constructor, a destructor, or a + conversion operator. */ + +static int +is_ctor_dtor_or_conversion (struct demangle_component *dc) +{ + if (dc == NULL) + return 0; + switch (dc->type) + { + default: + return 0; + case DEMANGLE_COMPONENT_QUAL_NAME: + case DEMANGLE_COMPONENT_LOCAL_NAME: + return is_ctor_dtor_or_conversion (d_right (dc)); + case DEMANGLE_COMPONENT_CTOR: + case DEMANGLE_COMPONENT_DTOR: + case DEMANGLE_COMPONENT_CAST: + return 1; + } +} + +/* ::= <(function) name> + ::= <(data) name> + ::= + + TOP_LEVEL is non-zero when called at the top level, in which case + if DMGL_PARAMS is not set we do not demangle the function + parameters. We only set this at the top level, because otherwise + we would not correctly demangle names in local scopes. */ + +static struct demangle_component * +d_encoding (struct d_info *di, int top_level) +{ + char peek = d_peek_char (di); + + if (peek == 'G' || peek == 'T') + return d_special_name (di); + else + { + struct demangle_component *dc; + + dc = d_name (di); + + if (dc != NULL && top_level && (di->options & DMGL_PARAMS) == 0) + { + /* Strip off any initial CV-qualifiers, as they really apply + to the `this' parameter, and they were not output by the + v2 demangler without DMGL_PARAMS. */ + while (dc->type == DEMANGLE_COMPONENT_RESTRICT_THIS + || dc->type == DEMANGLE_COMPONENT_VOLATILE_THIS + || dc->type == DEMANGLE_COMPONENT_CONST_THIS) + dc = d_left (dc); + + /* If the top level is a DEMANGLE_COMPONENT_LOCAL_NAME, then + there may be CV-qualifiers on its right argument which + really apply here; this happens when parsing a class + which is local to a function. */ + if (dc->type == DEMANGLE_COMPONENT_LOCAL_NAME) + { + struct demangle_component *dcr; + + dcr = d_right (dc); + while (dcr->type == DEMANGLE_COMPONENT_RESTRICT_THIS + || dcr->type == DEMANGLE_COMPONENT_VOLATILE_THIS + || dcr->type == DEMANGLE_COMPONENT_CONST_THIS) + dcr = d_left (dcr); + dc->u.s_binary.right = dcr; + } + + return dc; + } + + peek = d_peek_char (di); + if (dc == NULL || peek == '\0' || peek == 'E') + return dc; + return d_make_comp (di, DEMANGLE_COMPONENT_TYPED_NAME, dc, + d_bare_function_type (di, has_return_type (dc))); + } +} + +/* ::= + ::= + ::= + ::= + + ::= + ::= St + + ::= + ::= +*/ + +static struct demangle_component * +d_name (struct d_info *di) +{ + char peek = d_peek_char (di); + struct demangle_component *dc; + + switch (peek) + { + case 'N': + return d_nested_name (di); + + case 'Z': + return d_local_name (di); + + case 'L': + return d_unqualified_name (di); + + case 'S': + { + int subst; + + if (d_peek_next_char (di) != 't') + { + dc = d_substitution (di, 0); + subst = 1; + } + else + { + d_advance (di, 2); + dc = d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, + d_make_name (di, "std", 3), + d_unqualified_name (di)); + di->expansion += 3; + subst = 0; + } + + if (d_peek_char (di) != 'I') + { + /* The grammar does not permit this case to occur if we + called d_substitution() above (i.e., subst == 1). We + don't bother to check. */ + } + else + { + /* This is , which means that we just saw + , which is a substitution + candidate if we didn't just get it from a + substitution. */ + if (! subst) + { + if (! d_add_substitution (di, dc)) + return NULL; + } + dc = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, dc, + d_template_args (di)); + } + + return dc; + } + + default: + dc = d_unqualified_name (di); + if (d_peek_char (di) == 'I') + { + /* This is , which means that we just saw + , which is a substitution + candidate. */ + if (! d_add_substitution (di, dc)) + return NULL; + dc = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, dc, + d_template_args (di)); + } + return dc; + } +} + +/* ::= N [] E + ::= N [] E +*/ + +static struct demangle_component * +d_nested_name (struct d_info *di) +{ + struct demangle_component *ret; + struct demangle_component **pret; + + if (! d_check_char (di, 'N')) + return NULL; + + pret = d_cv_qualifiers (di, &ret, 1); + if (pret == NULL) + return NULL; + + *pret = d_prefix (di); + if (*pret == NULL) + return NULL; + + if (! d_check_char (di, 'E')) + return NULL; + + return ret; +} + +/* ::= + ::= + ::= + ::= + ::= + + ::= <(template) unqualified-name> + ::= + ::= +*/ + +static struct demangle_component * +d_prefix (struct d_info *di) +{ + struct demangle_component *ret = NULL; + + while (1) + { + char peek; + enum demangle_component_type comb_type; + struct demangle_component *dc; + + peek = d_peek_char (di); + if (peek == '\0') + return NULL; + + /* The older code accepts a here, but I don't see + that in the grammar. The older code does not accept a + here. */ + + comb_type = DEMANGLE_COMPONENT_QUAL_NAME; + if (IS_DIGIT (peek) + || IS_LOWER (peek) + || peek == 'C' + || peek == 'D' + || peek == 'L') + dc = d_unqualified_name (di); + else if (peek == 'S') + dc = d_substitution (di, 1); + else if (peek == 'I') + { + if (ret == NULL) + return NULL; + comb_type = DEMANGLE_COMPONENT_TEMPLATE; + dc = d_template_args (di); + } + else if (peek == 'T') + dc = d_template_param (di); + else if (peek == 'E') + return ret; + else + return NULL; + + if (ret == NULL) + ret = dc; + else + ret = d_make_comp (di, comb_type, ret, dc); + + if (peek != 'S' && d_peek_char (di) != 'E') + { + if (! d_add_substitution (di, ret)) + return NULL; + } + } +} + +/* ::= + ::= + ::= + ::= + + ::= L +*/ + +static struct demangle_component * +d_unqualified_name (struct d_info *di) +{ + char peek; + + peek = d_peek_char (di); + if (IS_DIGIT (peek)) + return d_source_name (di); + else if (IS_LOWER (peek)) + { + struct demangle_component *ret; + + ret = d_operator_name (di); + if (ret != NULL && ret->type == DEMANGLE_COMPONENT_OPERATOR) + di->expansion += sizeof "operator" + ret->u.s_operator.op->len - 2; + return ret; + } + else if (peek == 'C' || peek == 'D') + return d_ctor_dtor_name (di); + else if (peek == 'L') + { + struct demangle_component * ret; + + d_advance (di, 1); + + ret = d_source_name (di); + if (ret == NULL) + return NULL; + if (! d_discriminator (di)) + return NULL; + return ret; + } + else + return NULL; +} + +/* ::= <(positive length) number> */ + +static struct demangle_component * +d_source_name (struct d_info *di) +{ + long len; + struct demangle_component *ret; + + len = d_number (di); + if (len <= 0) + return NULL; + ret = d_identifier (di, len); + di->last_name = ret; + return ret; +} + +/* number ::= [n] <(non-negative decimal integer)> */ + +static long +d_number (struct d_info *di) +{ + int negative; + char peek; + long ret; + + negative = 0; + peek = d_peek_char (di); + if (peek == 'n') + { + negative = 1; + d_advance (di, 1); + peek = d_peek_char (di); + } + + ret = 0; + while (1) + { + if (! IS_DIGIT (peek)) + { + if (negative) + ret = - ret; + return ret; + } + ret = ret * 10 + peek - '0'; + d_advance (di, 1); + peek = d_peek_char (di); + } +} + +/* identifier ::= <(unqualified source code identifier)> */ + +static struct demangle_component * +d_identifier (struct d_info *di, int len) +{ + const char *name; + + name = d_str (di); + + if (di->send - name < len) + return NULL; + + d_advance (di, len); + + /* A Java mangled name may have a trailing '$' if it is a C++ + keyword. This '$' is not included in the length count. We just + ignore the '$'. */ + if ((di->options & DMGL_JAVA) != 0 + && d_peek_char (di) == '$') + d_advance (di, 1); + + /* Look for something which looks like a gcc encoding of an + anonymous namespace, and replace it with a more user friendly + name. */ + if (len >= (int) ANONYMOUS_NAMESPACE_PREFIX_LEN + 2 + && memcmp (name, ANONYMOUS_NAMESPACE_PREFIX, + ANONYMOUS_NAMESPACE_PREFIX_LEN) == 0) + { + const char *s; + + s = name + ANONYMOUS_NAMESPACE_PREFIX_LEN; + if ((*s == '.' || *s == '_' || *s == '$') + && s[1] == 'N') + { + di->expansion -= len - sizeof "(anonymous namespace)"; + return d_make_name (di, "(anonymous namespace)", + sizeof "(anonymous namespace)" - 1); + } + } + + return d_make_name (di, name, len); +} + +/* operator_name ::= many different two character encodings. + ::= cv + ::= v +*/ + +#define NL(s) s, (sizeof s) - 1 + +CP_STATIC_IF_GLIBCPP_V3 +const struct demangle_operator_info cplus_demangle_operators[] = +{ + { "aN", NL ("&="), 2 }, + { "aS", NL ("="), 2 }, + { "aa", NL ("&&"), 2 }, + { "ad", NL ("&"), 1 }, + { "an", NL ("&"), 2 }, + { "cl", NL ("()"), 0 }, + { "cm", NL (","), 2 }, + { "co", NL ("~"), 1 }, + { "dV", NL ("/="), 2 }, + { "da", NL ("delete[]"), 1 }, + { "de", NL ("*"), 1 }, + { "dl", NL ("delete"), 1 }, + { "dv", NL ("/"), 2 }, + { "eO", NL ("^="), 2 }, + { "eo", NL ("^"), 2 }, + { "eq", NL ("=="), 2 }, + { "ge", NL (">="), 2 }, + { "gt", NL (">"), 2 }, + { "ix", NL ("[]"), 2 }, + { "lS", NL ("<<="), 2 }, + { "le", NL ("<="), 2 }, + { "ls", NL ("<<"), 2 }, + { "lt", NL ("<"), 2 }, + { "mI", NL ("-="), 2 }, + { "mL", NL ("*="), 2 }, + { "mi", NL ("-"), 2 }, + { "ml", NL ("*"), 2 }, + { "mm", NL ("--"), 1 }, + { "na", NL ("new[]"), 1 }, + { "ne", NL ("!="), 2 }, + { "ng", NL ("-"), 1 }, + { "nt", NL ("!"), 1 }, + { "nw", NL ("new"), 1 }, + { "oR", NL ("|="), 2 }, + { "oo", NL ("||"), 2 }, + { "or", NL ("|"), 2 }, + { "pL", NL ("+="), 2 }, + { "pl", NL ("+"), 2 }, + { "pm", NL ("->*"), 2 }, + { "pp", NL ("++"), 1 }, + { "ps", NL ("+"), 1 }, + { "pt", NL ("->"), 2 }, + { "qu", NL ("?"), 3 }, + { "rM", NL ("%="), 2 }, + { "rS", NL (">>="), 2 }, + { "rm", NL ("%"), 2 }, + { "rs", NL (">>"), 2 }, + { "st", NL ("sizeof "), 1 }, + { "sz", NL ("sizeof "), 1 }, + { NULL, NULL, 0, 0 } +}; + +static struct demangle_component * +d_operator_name (struct d_info *di) +{ + char c1; + char c2; + + c1 = d_next_char (di); + c2 = d_next_char (di); + if (c1 == 'v' && IS_DIGIT (c2)) + return d_make_extended_operator (di, c2 - '0', d_source_name (di)); + else if (c1 == 'c' && c2 == 'v') + return d_make_comp (di, DEMANGLE_COMPONENT_CAST, + cplus_demangle_type (di), NULL); + else + { + /* LOW is the inclusive lower bound. */ + int low = 0; + /* HIGH is the exclusive upper bound. We subtract one to ignore + the sentinel at the end of the array. */ + int high = ((sizeof (cplus_demangle_operators) + / sizeof (cplus_demangle_operators[0])) + - 1); + + while (1) + { + int i; + const struct demangle_operator_info *p; + + i = low + (high - low) / 2; + p = cplus_demangle_operators + i; + + if (c1 == p->code[0] && c2 == p->code[1]) + return d_make_operator (di, p); + + if (c1 < p->code[0] || (c1 == p->code[0] && c2 < p->code[1])) + high = i; + else + low = i + 1; + if (low == high) + return NULL; + } + } +} + +/* ::= TV + ::= TT + ::= TI + ::= TS + ::= GV <(object) name> + ::= T <(base) encoding> + ::= Tc <(base) encoding> + Also g++ extensions: + ::= TC <(offset) number> _ <(base) type> + ::= TF + ::= TJ + ::= GR + ::= GA +*/ + +static struct demangle_component * +d_special_name (struct d_info *di) +{ + di->expansion += 20; + if (d_check_char (di, 'T')) + { + switch (d_next_char (di)) + { + case 'V': + di->expansion -= 5; + return d_make_comp (di, DEMANGLE_COMPONENT_VTABLE, + cplus_demangle_type (di), NULL); + case 'T': + di->expansion -= 10; + return d_make_comp (di, DEMANGLE_COMPONENT_VTT, + cplus_demangle_type (di), NULL); + case 'I': + return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO, + cplus_demangle_type (di), NULL); + case 'S': + return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO_NAME, + cplus_demangle_type (di), NULL); + + case 'h': + if (! d_call_offset (di, 'h')) + return NULL; + return d_make_comp (di, DEMANGLE_COMPONENT_THUNK, + d_encoding (di, 0), NULL); + + case 'v': + if (! d_call_offset (di, 'v')) + return NULL; + return d_make_comp (di, DEMANGLE_COMPONENT_VIRTUAL_THUNK, + d_encoding (di, 0), NULL); + + case 'c': + if (! d_call_offset (di, '\0')) + return NULL; + if (! d_call_offset (di, '\0')) + return NULL; + return d_make_comp (di, DEMANGLE_COMPONENT_COVARIANT_THUNK, + d_encoding (di, 0), NULL); + + case 'C': + { + struct demangle_component *derived_type; + long offset; + struct demangle_component *base_type; + + derived_type = cplus_demangle_type (di); + offset = d_number (di); + if (offset < 0) + return NULL; + if (! d_check_char (di, '_')) + return NULL; + base_type = cplus_demangle_type (di); + /* We don't display the offset. FIXME: We should display + it in verbose mode. */ + di->expansion += 5; + return d_make_comp (di, DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE, + base_type, derived_type); + } + + case 'F': + return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO_FN, + cplus_demangle_type (di), NULL); + case 'J': + return d_make_comp (di, DEMANGLE_COMPONENT_JAVA_CLASS, + cplus_demangle_type (di), NULL); + + default: + return NULL; + } + } + else if (d_check_char (di, 'G')) + { + switch (d_next_char (di)) + { + case 'V': + return d_make_comp (di, DEMANGLE_COMPONENT_GUARD, d_name (di), NULL); + + case 'R': + return d_make_comp (di, DEMANGLE_COMPONENT_REFTEMP, d_name (di), + NULL); + + case 'A': + return d_make_comp (di, DEMANGLE_COMPONENT_HIDDEN_ALIAS, + d_encoding (di, 0), NULL); + + default: + return NULL; + } + } + else + return NULL; +} + +/* ::= h _ + ::= v _ + + ::= <(offset) number> + + ::= <(offset) number> _ <(virtual offset) number> + + The C parameter, if not '\0', is a character we just read which is + the start of the . + + We don't display the offset information anywhere. FIXME: We should + display it in verbose mode. */ + +static int +d_call_offset (struct d_info *di, int c) +{ + if (c == '\0') + c = d_next_char (di); + + if (c == 'h') + d_number (di); + else if (c == 'v') + { + d_number (di); + if (! d_check_char (di, '_')) + return 0; + d_number (di); + } + else + return 0; + + if (! d_check_char (di, '_')) + return 0; + + return 1; +} + +/* ::= C1 + ::= C2 + ::= C3 + ::= D0 + ::= D1 + ::= D2 +*/ + +static struct demangle_component * +d_ctor_dtor_name (struct d_info *di) +{ + if (di->last_name != NULL) + { + if (di->last_name->type == DEMANGLE_COMPONENT_NAME) + di->expansion += di->last_name->u.s_name.len; + else if (di->last_name->type == DEMANGLE_COMPONENT_SUB_STD) + di->expansion += di->last_name->u.s_string.len; + } + switch (d_peek_char (di)) + { + case 'C': + { + enum gnu_v3_ctor_kinds kind; + + switch (d_peek_next_char (di)) + { + case '1': + kind = gnu_v3_complete_object_ctor; + break; + case '2': + kind = gnu_v3_base_object_ctor; + break; + case '3': + kind = gnu_v3_complete_object_allocating_ctor; + break; + default: + return NULL; + } + d_advance (di, 2); + return d_make_ctor (di, kind, di->last_name); + } + + case 'D': + { + enum gnu_v3_dtor_kinds kind; + + switch (d_peek_next_char (di)) + { + case '0': + kind = gnu_v3_deleting_dtor; + break; + case '1': + kind = gnu_v3_complete_object_dtor; + break; + case '2': + kind = gnu_v3_base_object_dtor; + break; + default: + return NULL; + } + d_advance (di, 2); + return d_make_dtor (di, kind, di->last_name); + } + + default: + return NULL; + } +} + +/* ::= + ::= + ::= + ::= + ::= + ::= + ::= + ::= + ::= + ::= P + ::= R + ::= O (C++0x) + ::= C + ::= G + ::= U + + ::= various one letter codes + ::= u +*/ + +CP_STATIC_IF_GLIBCPP_V3 +const struct demangle_builtin_type_info +cplus_demangle_builtin_types[D_BUILTIN_TYPE_COUNT] = +{ + /* a */ { NL ("signed char"), NL ("signed char"), D_PRINT_DEFAULT }, + /* b */ { NL ("bool"), NL ("boolean"), D_PRINT_BOOL }, + /* c */ { NL ("char"), NL ("byte"), D_PRINT_DEFAULT }, + /* d */ { NL ("double"), NL ("double"), D_PRINT_FLOAT }, + /* e */ { NL ("long double"), NL ("long double"), D_PRINT_FLOAT }, + /* f */ { NL ("float"), NL ("float"), D_PRINT_FLOAT }, + /* g */ { NL ("__float128"), NL ("__float128"), D_PRINT_FLOAT }, + /* h */ { NL ("unsigned char"), NL ("unsigned char"), D_PRINT_DEFAULT }, + /* i */ { NL ("int"), NL ("int"), D_PRINT_INT }, + /* j */ { NL ("unsigned int"), NL ("unsigned"), D_PRINT_UNSIGNED }, + /* k */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT }, + /* l */ { NL ("long"), NL ("long"), D_PRINT_LONG }, + /* m */ { NL ("unsigned long"), NL ("unsigned long"), D_PRINT_UNSIGNED_LONG }, + /* n */ { NL ("__int128"), NL ("__int128"), D_PRINT_DEFAULT }, + /* o */ { NL ("unsigned __int128"), NL ("unsigned __int128"), + D_PRINT_DEFAULT }, + /* p */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT }, + /* q */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT }, + /* r */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT }, + /* s */ { NL ("short"), NL ("short"), D_PRINT_DEFAULT }, + /* t */ { NL ("unsigned short"), NL ("unsigned short"), D_PRINT_DEFAULT }, + /* u */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT }, + /* v */ { NL ("void"), NL ("void"), D_PRINT_VOID }, + /* w */ { NL ("wchar_t"), NL ("char"), D_PRINT_DEFAULT }, + /* x */ { NL ("long long"), NL ("long"), D_PRINT_LONG_LONG }, + /* y */ { NL ("unsigned long long"), NL ("unsigned long long"), + D_PRINT_UNSIGNED_LONG_LONG }, + /* z */ { NL ("..."), NL ("..."), D_PRINT_DEFAULT }, +}; + +CP_STATIC_IF_GLIBCPP_V3 +struct demangle_component * +cplus_demangle_type (struct d_info *di) +{ + char peek; + struct demangle_component *ret; + int can_subst; + + /* The ABI specifies that when CV-qualifiers are used, the base type + is substitutable, and the fully qualified type is substitutable, + but the base type with a strict subset of the CV-qualifiers is + not substitutable. The natural recursive implementation of the + CV-qualifiers would cause subsets to be substitutable, so instead + we pull them all off now. + + FIXME: The ABI says that order-insensitive vendor qualifiers + should be handled in the same way, but we have no way to tell + which vendor qualifiers are order-insensitive and which are + order-sensitive. So we just assume that they are all + order-sensitive. g++ 3.4 supports only one vendor qualifier, + __vector, and it treats it as order-sensitive when mangling + names. */ + + peek = d_peek_char (di); + if (peek == 'r' || peek == 'V' || peek == 'K') + { + struct demangle_component **pret; + + pret = d_cv_qualifiers (di, &ret, 0); + if (pret == NULL) + return NULL; + *pret = cplus_demangle_type (di); + if (! *pret || ! d_add_substitution (di, ret)) + return NULL; + return ret; + } + + can_subst = 1; + + switch (peek) + { + case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': + case 'h': case 'i': case 'j': case 'l': case 'm': case 'n': + case 'o': case 's': case 't': + case 'v': case 'w': case 'x': case 'y': case 'z': + ret = d_make_builtin_type (di, + &cplus_demangle_builtin_types[peek - 'a']); + di->expansion += ret->u.s_builtin.type->len; + can_subst = 0; + d_advance (di, 1); + break; + + case 'u': + d_advance (di, 1); + ret = d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_TYPE, + d_source_name (di), NULL); + break; + + case 'F': + ret = d_function_type (di); + break; + + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + case 'N': + case 'Z': + ret = d_class_enum_type (di); + break; + + case 'A': + ret = d_array_type (di); + break; + + case 'M': + ret = d_pointer_to_member_type (di); + break; + + case 'T': + ret = d_template_param (di); + if (d_peek_char (di) == 'I') + { + /* This is . The + part is a substitution + candidate. */ + if (! d_add_substitution (di, ret)) + return NULL; + ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret, + d_template_args (di)); + } + break; + + case 'S': + /* If this is a special substitution, then it is the start of + . */ + { + char peek_next; + + peek_next = d_peek_next_char (di); + if (IS_DIGIT (peek_next) + || peek_next == '_' + || IS_UPPER (peek_next)) + { + ret = d_substitution (di, 0); + /* The substituted name may have been a template name and + may be followed by tepmlate args. */ + if (d_peek_char (di) == 'I') + ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret, + d_template_args (di)); + else + can_subst = 0; + } + else + { + ret = d_class_enum_type (di); + /* If the substitution was a complete type, then it is not + a new substitution candidate. However, if the + substitution was followed by template arguments, then + the whole thing is a substitution candidate. */ + if (ret != NULL && ret->type == DEMANGLE_COMPONENT_SUB_STD) + can_subst = 0; + } + } + break; + + case 'O': + d_advance (di, 1); + ret = d_make_comp (di, DEMANGLE_COMPONENT_RVALUE_REFERENCE, + cplus_demangle_type (di), NULL); + break; + + case 'P': + d_advance (di, 1); + ret = d_make_comp (di, DEMANGLE_COMPONENT_POINTER, + cplus_demangle_type (di), NULL); + break; + + case 'R': + d_advance (di, 1); + ret = d_make_comp (di, DEMANGLE_COMPONENT_REFERENCE, + cplus_demangle_type (di), NULL); + break; + + case 'C': + d_advance (di, 1); + ret = d_make_comp (di, DEMANGLE_COMPONENT_COMPLEX, + cplus_demangle_type (di), NULL); + break; + + case 'G': + d_advance (di, 1); + ret = d_make_comp (di, DEMANGLE_COMPONENT_IMAGINARY, + cplus_demangle_type (di), NULL); + break; + + case 'U': + d_advance (di, 1); + ret = d_source_name (di); + ret = d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL, + cplus_demangle_type (di), ret); + break; + + default: + return NULL; + } + + if (can_subst) + { + if (! d_add_substitution (di, ret)) + return NULL; + } + + return ret; +} + +/* ::= [r] [V] [K] */ + +static struct demangle_component ** +d_cv_qualifiers (struct d_info *di, + struct demangle_component **pret, int member_fn) +{ + char peek; + + peek = d_peek_char (di); + while (peek == 'r' || peek == 'V' || peek == 'K') + { + enum demangle_component_type t; + + d_advance (di, 1); + if (peek == 'r') + { + t = (member_fn + ? DEMANGLE_COMPONENT_RESTRICT_THIS + : DEMANGLE_COMPONENT_RESTRICT); + di->expansion += sizeof "restrict"; + } + else if (peek == 'V') + { + t = (member_fn + ? DEMANGLE_COMPONENT_VOLATILE_THIS + : DEMANGLE_COMPONENT_VOLATILE); + di->expansion += sizeof "volatile"; + } + else + { + t = (member_fn + ? DEMANGLE_COMPONENT_CONST_THIS + : DEMANGLE_COMPONENT_CONST); + di->expansion += sizeof "const"; + } + + *pret = d_make_comp (di, t, NULL, NULL); + if (*pret == NULL) + return NULL; + pret = &d_left (*pret); + + peek = d_peek_char (di); + } + + return pret; +} + +/* ::= F [Y] E */ + +static struct demangle_component * +d_function_type (struct d_info *di) +{ + struct demangle_component *ret; + + if (! d_check_char (di, 'F')) + return NULL; + if (d_peek_char (di) == 'Y') + { + /* Function has C linkage. We don't print this information. + FIXME: We should print it in verbose mode. */ + d_advance (di, 1); + } + ret = d_bare_function_type (di, 1); + if (! d_check_char (di, 'E')) + return NULL; + return ret; +} + +/* ::= [J]+ */ + +static struct demangle_component * +d_bare_function_type (struct d_info *di, int has_return_type) +{ + struct demangle_component *return_type; + struct demangle_component *tl; + struct demangle_component **ptl; + char peek; + + /* Detect special qualifier indicating that the first argument + is the return type. */ + peek = d_peek_char (di); + if (peek == 'J') + { + d_advance (di, 1); + has_return_type = 1; + } + + return_type = NULL; + tl = NULL; + ptl = &tl; + while (1) + { + struct demangle_component *type; + + peek = d_peek_char (di); + if (peek == '\0' || peek == 'E') + break; + type = cplus_demangle_type (di); + if (type == NULL) + return NULL; + if (has_return_type) + { + return_type = type; + has_return_type = 0; + } + else + { + *ptl = d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, type, NULL); + if (*ptl == NULL) + return NULL; + ptl = &d_right (*ptl); + } + } + + /* There should be at least one parameter type besides the optional + return type. A function which takes no arguments will have a + single parameter type void. */ + if (tl == NULL) + return NULL; + + /* If we have a single parameter type void, omit it. */ + if (d_right (tl) == NULL + && d_left (tl)->type == DEMANGLE_COMPONENT_BUILTIN_TYPE + && d_left (tl)->u.s_builtin.type->print == D_PRINT_VOID) + { + di->expansion -= d_left (tl)->u.s_builtin.type->len; + tl = NULL; + } + + return d_make_comp (di, DEMANGLE_COMPONENT_FUNCTION_TYPE, return_type, tl); +} + +/* ::= */ + +static struct demangle_component * +d_class_enum_type (struct d_info *di) +{ + return d_name (di); +} + +/* ::= A <(positive dimension) number> _ <(element) type> + ::= A [<(dimension) expression>] _ <(element) type> +*/ + +static struct demangle_component * +d_array_type (struct d_info *di) +{ + char peek; + struct demangle_component *dim; + + if (! d_check_char (di, 'A')) + return NULL; + + peek = d_peek_char (di); + if (peek == '_') + dim = NULL; + else if (IS_DIGIT (peek)) + { + const char *s; + + s = d_str (di); + do + { + d_advance (di, 1); + peek = d_peek_char (di); + } + while (IS_DIGIT (peek)); + dim = d_make_name (di, s, d_str (di) - s); + if (dim == NULL) + return NULL; + } + else + { + dim = d_expression (di); + if (dim == NULL) + return NULL; + } + + if (! d_check_char (di, '_')) + return NULL; + + return d_make_comp (di, DEMANGLE_COMPONENT_ARRAY_TYPE, dim, + cplus_demangle_type (di)); +} + +/* ::= M <(class) type> <(member) type> */ + +static struct demangle_component * +d_pointer_to_member_type (struct d_info *di) +{ + struct demangle_component *cl; + struct demangle_component *mem; + struct demangle_component **pmem; + + if (! d_check_char (di, 'M')) + return NULL; + + cl = cplus_demangle_type (di); + + /* The ABI specifies that any type can be a substitution source, and + that M is followed by two types, and that when a CV-qualified + type is seen both the base type and the CV-qualified types are + substitution sources. The ABI also specifies that for a pointer + to a CV-qualified member function, the qualifiers are attached to + the second type. Given the grammar, a plain reading of the ABI + suggests that both the CV-qualified member function and the + non-qualified member function are substitution sources. However, + g++ does not work that way. g++ treats only the CV-qualified + member function as a substitution source. FIXME. So to work + with g++, we need to pull off the CV-qualifiers here, in order to + avoid calling add_substitution() in cplus_demangle_type(). But + for a CV-qualified member which is not a function, g++ does + follow the ABI, so we need to handle that case here by calling + d_add_substitution ourselves. */ + + pmem = d_cv_qualifiers (di, &mem, 1); + if (pmem == NULL) + return NULL; + *pmem = cplus_demangle_type (di); + if (*pmem == NULL) + return NULL; + + if (pmem != &mem && (*pmem)->type != DEMANGLE_COMPONENT_FUNCTION_TYPE) + { + if (! d_add_substitution (di, mem)) + return NULL; + } + + return d_make_comp (di, DEMANGLE_COMPONENT_PTRMEM_TYPE, cl, mem); +} + +/* ::= T_ + ::= T <(parameter-2 non-negative) number> _ +*/ + +static struct demangle_component * +d_template_param (struct d_info *di) +{ + long param; + + if (! d_check_char (di, 'T')) + return NULL; + + if (d_peek_char (di) == '_') + param = 0; + else + { + param = d_number (di); + if (param < 0) + return NULL; + param += 1; + } + + if (! d_check_char (di, '_')) + return NULL; + + ++di->did_subs; + + return d_make_template_param (di, param); +} + +/* ::= I + E */ + +static struct demangle_component * +d_template_args (struct d_info *di) +{ + struct demangle_component *hold_last_name; + struct demangle_component *al; + struct demangle_component **pal; + + /* Preserve the last name we saw--don't let the template arguments + clobber it, as that would give us the wrong name for a subsequent + constructor or destructor. */ + hold_last_name = di->last_name; + + if (! d_check_char (di, 'I')) + return NULL; + + al = NULL; + pal = &al; + while (1) + { + struct demangle_component *a; + + a = d_template_arg (di); + if (a == NULL) + return NULL; + + *pal = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, a, NULL); + if (*pal == NULL) + return NULL; + pal = &d_right (*pal); + + if (d_peek_char (di) == 'E') + { + d_advance (di, 1); + break; + } + } + + di->last_name = hold_last_name; + + return al; +} + +/* ::= + ::= X E + ::= +*/ + +static struct demangle_component * +d_template_arg (struct d_info *di) +{ + struct demangle_component *ret; + + switch (d_peek_char (di)) + { + case 'X': + d_advance (di, 1); + ret = d_expression (di); + if (! d_check_char (di, 'E')) + return NULL; + return ret; + + case 'L': + return d_expr_primary (di); + + default: + return cplus_demangle_type (di); + } +} + +/* ::= <(unary) operator-name> + ::= <(binary) operator-name> + ::= <(trinary) operator-name> + ::= st + ::= + ::= sr + ::= sr + ::= +*/ + +static struct demangle_component * +d_expression (struct d_info *di) +{ + char peek; + + peek = d_peek_char (di); + if (peek == 'L') + return d_expr_primary (di); + else if (peek == 'T') + return d_template_param (di); + else if (peek == 's' && d_peek_next_char (di) == 'r') + { + struct demangle_component *type; + struct demangle_component *name; + + d_advance (di, 2); + type = cplus_demangle_type (di); + name = d_unqualified_name (di); + if (d_peek_char (di) != 'I') + return d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, type, name); + else + return d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, type, + d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, name, + d_template_args (di))); + } + else + { + struct demangle_component *op; + int args; + + op = d_operator_name (di); + if (op == NULL) + return NULL; + + if (op->type == DEMANGLE_COMPONENT_OPERATOR) + di->expansion += op->u.s_operator.op->len - 2; + + if (op->type == DEMANGLE_COMPONENT_OPERATOR + && strcmp (op->u.s_operator.op->code, "st") == 0) + return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op, + cplus_demangle_type (di)); + + switch (op->type) + { + default: + return NULL; + case DEMANGLE_COMPONENT_OPERATOR: + args = op->u.s_operator.op->args; + break; + case DEMANGLE_COMPONENT_EXTENDED_OPERATOR: + args = op->u.s_extended_operator.args; + break; + case DEMANGLE_COMPONENT_CAST: + args = 1; + break; + } + + switch (args) + { + case 1: + return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op, + d_expression (di)); + case 2: + { + struct demangle_component *left; + + left = d_expression (di); + return d_make_comp (di, DEMANGLE_COMPONENT_BINARY, op, + d_make_comp (di, + DEMANGLE_COMPONENT_BINARY_ARGS, + left, + d_expression (di))); + } + case 3: + { + struct demangle_component *first; + struct demangle_component *second; + + first = d_expression (di); + second = d_expression (di); + return d_make_comp (di, DEMANGLE_COMPONENT_TRINARY, op, + d_make_comp (di, + DEMANGLE_COMPONENT_TRINARY_ARG1, + first, + d_make_comp (di, + DEMANGLE_COMPONENT_TRINARY_ARG2, + second, + d_expression (di)))); + } + default: + return NULL; + } + } +} + +/* ::= L <(value) number> E + ::= L <(value) float> E + ::= L E +*/ + +static struct demangle_component * +d_expr_primary (struct d_info *di) +{ + struct demangle_component *ret; + + if (! d_check_char (di, 'L')) + return NULL; + if (d_peek_char (di) == '_') + ret = cplus_demangle_mangled_name (di, 0); + else + { + struct demangle_component *type; + enum demangle_component_type t; + const char *s; + + type = cplus_demangle_type (di); + if (type == NULL) + return NULL; + + /* If we have a type we know how to print, we aren't going to + print the type name itself. */ + if (type->type == DEMANGLE_COMPONENT_BUILTIN_TYPE + && type->u.s_builtin.type->print != D_PRINT_DEFAULT) + di->expansion -= type->u.s_builtin.type->len; + + /* Rather than try to interpret the literal value, we just + collect it as a string. Note that it's possible to have a + floating point literal here. The ABI specifies that the + format of such literals is machine independent. That's fine, + but what's not fine is that versions of g++ up to 3.2 with + -fabi-version=1 used upper case letters in the hex constant, + and dumped out gcc's internal representation. That makes it + hard to tell where the constant ends, and hard to dump the + constant in any readable form anyhow. We don't attempt to + handle these cases. */ + + t = DEMANGLE_COMPONENT_LITERAL; + if (d_peek_char (di) == 'n') + { + t = DEMANGLE_COMPONENT_LITERAL_NEG; + d_advance (di, 1); + } + s = d_str (di); + while (d_peek_char (di) != 'E') + { + if (d_peek_char (di) == '\0') + return NULL; + d_advance (di, 1); + } + ret = d_make_comp (di, t, type, d_make_name (di, s, d_str (di) - s)); + } + if (! d_check_char (di, 'E')) + return NULL; + return ret; +} + +/* ::= Z <(function) encoding> E <(entity) name> [] + ::= Z <(function) encoding> E s [] +*/ + +static struct demangle_component * +d_local_name (struct d_info *di) +{ + struct demangle_component *function; + + if (! d_check_char (di, 'Z')) + return NULL; + + function = d_encoding (di, 0); + + if (! d_check_char (di, 'E')) + return NULL; + + if (d_peek_char (di) == 's') + { + d_advance (di, 1); + if (! d_discriminator (di)) + return NULL; + return d_make_comp (di, DEMANGLE_COMPONENT_LOCAL_NAME, function, + d_make_name (di, "string literal", + sizeof "string literal" - 1)); + } + else + { + struct demangle_component *name; + + name = d_name (di); + if (! d_discriminator (di)) + return NULL; + return d_make_comp (di, DEMANGLE_COMPONENT_LOCAL_NAME, function, name); + } +} + +/* ::= _ <(non-negative) number> + + We demangle the discriminator, but we don't print it out. FIXME: + We should print it out in verbose mode. */ + +static int +d_discriminator (struct d_info *di) +{ + long discrim; + + if (d_peek_char (di) != '_') + return 1; + d_advance (di, 1); + discrim = d_number (di); + if (discrim < 0) + return 0; + return 1; +} + +/* Add a new substitution. */ + +static int +d_add_substitution (struct d_info *di, struct demangle_component *dc) +{ + if (dc == NULL) + return 0; + if (di->next_sub >= di->num_subs) + return 0; + di->subs[di->next_sub] = dc; + ++di->next_sub; + return 1; +} + +/* ::= S _ + ::= S_ + ::= St + ::= Sa + ::= Sb + ::= Ss + ::= Si + ::= So + ::= Sd + + If PREFIX is non-zero, then this type is being used as a prefix in + a qualified name. In this case, for the standard substitutions, we + need to check whether we are being used as a prefix for a + constructor or destructor, and return a full template name. + Otherwise we will get something like std::iostream::~iostream() + which does not correspond particularly well to any function which + actually appears in the source. +*/ + +static const struct d_standard_sub_info standard_subs[] = +{ + { 't', NL ("std"), + NL ("std"), + NULL, 0 }, + { 'a', NL ("std::allocator"), + NL ("std::allocator"), + NL ("allocator") }, + { 'b', NL ("std::basic_string"), + NL ("std::basic_string"), + NL ("basic_string") }, + { 's', NL ("std::string"), + NL ("std::basic_string, std::allocator >"), + NL ("basic_string") }, + { 'i', NL ("std::istream"), + NL ("std::basic_istream >"), + NL ("basic_istream") }, + { 'o', NL ("std::ostream"), + NL ("std::basic_ostream >"), + NL ("basic_ostream") }, + { 'd', NL ("std::iostream"), + NL ("std::basic_iostream >"), + NL ("basic_iostream") } +}; + +static struct demangle_component * +d_substitution (struct d_info *di, int prefix) +{ + char c; + + if (! d_check_char (di, 'S')) + return NULL; + + c = d_next_char (di); + if (c == '_' || IS_DIGIT (c) || IS_UPPER (c)) + { + int id; + + id = 0; + if (c != '_') + { + do + { + if (IS_DIGIT (c)) + id = id * 36 + c - '0'; + else if (IS_UPPER (c)) + id = id * 36 + c - 'A' + 10; + else + return NULL; + if (id < 0) + return NULL; + c = d_next_char (di); + } + while (c != '_'); + + ++id; + } + + if (id >= di->next_sub) + return NULL; + + ++di->did_subs; + + return di->subs[id]; + } + else + { + int verbose; + const struct d_standard_sub_info *p; + const struct d_standard_sub_info *pend; + + verbose = (di->options & DMGL_VERBOSE) != 0; + if (! verbose && prefix) + { + char peek; + + peek = d_peek_char (di); + if (peek == 'C' || peek == 'D') + verbose = 1; + } + + pend = (&standard_subs[0] + + sizeof standard_subs / sizeof standard_subs[0]); + for (p = &standard_subs[0]; p < pend; ++p) + { + if (c == p->code) + { + const char *s; + int len; + + if (p->set_last_name != NULL) + di->last_name = d_make_sub (di, p->set_last_name, + p->set_last_name_len); + if (verbose) + { + s = p->full_expansion; + len = p->full_len; + } + else + { + s = p->simple_expansion; + len = p->simple_len; + } + di->expansion += len; + return d_make_sub (di, s, len); + } + } + + return NULL; + } +} + +/* Initialize a growable string. */ + +static void +d_growable_string_init (struct d_growable_string *dgs, size_t estimate) +{ + dgs->buf = NULL; + dgs->len = 0; + dgs->alc = 0; + dgs->allocation_failure = 0; + + if (estimate > 0) + d_growable_string_resize (dgs, estimate); +} + +/* Grow a growable string to a given size. */ + +static inline void +d_growable_string_resize (struct d_growable_string *dgs, size_t need) +{ + size_t newalc; + char *newbuf; + + if (dgs->allocation_failure) + return; + + /* Start allocation at two bytes to avoid any possibility of confusion + with the special value of 1 used as a return in *palc to indicate + allocation failures. */ + newalc = dgs->alc > 0 ? dgs->alc : 2; + while (newalc < need) + newalc <<= 1; + + newbuf = (char *) realloc (dgs->buf, newalc); + if (newbuf == NULL) + { + free (dgs->buf); + dgs->buf = NULL; + dgs->len = 0; + dgs->alc = 0; + dgs->allocation_failure = 1; + return; + } + dgs->buf = newbuf; + dgs->alc = newalc; +} + +/* Append a buffer to a growable string. */ + +static inline void +d_growable_string_append_buffer (struct d_growable_string *dgs, + const char *s, size_t l) +{ + size_t need; + + need = dgs->len + l + 1; + if (need > dgs->alc) + d_growable_string_resize (dgs, need); + + if (dgs->allocation_failure) + return; + + memcpy (dgs->buf + dgs->len, s, l); + dgs->buf[dgs->len + l] = '\0'; + dgs->len += l; +} + +/* Bridge growable strings to the callback mechanism. */ + +static void +d_growable_string_callback_adapter (const char *s, size_t l, void *opaque) +{ + struct d_growable_string *dgs = (struct d_growable_string*) opaque; + + d_growable_string_append_buffer (dgs, s, l); +} + +/* Initialize a print information structure. */ + +static void +d_print_init (struct d_print_info *dpi, int options, + demangle_callbackref callback, void *opaque) +{ + dpi->options = options; + dpi->len = 0; + dpi->last_char = '\0'; + dpi->templates = NULL; + dpi->modifiers = NULL; + + dpi->callback = callback; + dpi->opaque = opaque; + + dpi->demangle_failure = 0; +} + +/* Indicate that an error occurred during printing, and test for error. */ + +static inline void +d_print_error (struct d_print_info *dpi) +{ + dpi->demangle_failure = 1; +} + +static inline int +d_print_saw_error (struct d_print_info *dpi) +{ + return dpi->demangle_failure != 0; +} + +/* Flush buffered characters to the callback. */ + +static inline void +d_print_flush (struct d_print_info *dpi) +{ + dpi->buf[dpi->len] = '\0'; + dpi->callback (dpi->buf, dpi->len, dpi->opaque); + dpi->len = 0; +} + +/* Append characters and buffers for printing. */ + +static inline void +d_append_char (struct d_print_info *dpi, char c) +{ + if (dpi->len == sizeof (dpi->buf) - 1) + d_print_flush (dpi); + + dpi->buf[dpi->len++] = c; + dpi->last_char = c; +} + +static inline void +d_append_buffer (struct d_print_info *dpi, const char *s, size_t l) +{ + size_t i; + + for (i = 0; i < l; i++) + d_append_char (dpi, s[i]); +} + +static inline void +d_append_string (struct d_print_info *dpi, const char *s) +{ + d_append_buffer (dpi, s, strlen (s)); +} + +static inline char +d_last_char (struct d_print_info *dpi) +{ + return dpi->last_char; +} + +/* Turn components into a human readable string. OPTIONS is the + options bits passed to the demangler. DC is the tree to print. + CALLBACK is a function to call to flush demangled string segments + as they fill the intermediate buffer, and OPAQUE is a generalized + callback argument. On success, this returns 1. On failure, + it returns 0, indicating a bad parse. It does not use heap + memory to build an output string, so cannot encounter memory + allocation failure. */ + +CP_STATIC_IF_GLIBCPP_V3 +int +cplus_demangle_print_callback (int options, + const struct demangle_component *dc, + demangle_callbackref callback, void *opaque) +{ + struct d_print_info dpi; + + d_print_init (&dpi, options, callback, opaque); + + d_print_comp (&dpi, dc); + + d_print_flush (&dpi); + + return ! d_print_saw_error (&dpi); +} + +/* Turn components into a human readable string. OPTIONS is the + options bits passed to the demangler. DC is the tree to print. + ESTIMATE is a guess at the length of the result. This returns a + string allocated by malloc, or NULL on error. On success, this + sets *PALC to the size of the allocated buffer. On failure, this + sets *PALC to 0 for a bad parse, or to 1 for a memory allocation + failure. */ + +CP_STATIC_IF_GLIBCPP_V3 +char * +cplus_demangle_print (int options, const struct demangle_component *dc, + int estimate, size_t *palc) +{ + struct d_growable_string dgs; + + d_growable_string_init (&dgs, estimate); + + if (! cplus_demangle_print_callback (options, dc, + d_growable_string_callback_adapter, + &dgs)) + { + free (dgs.buf); + *palc = 0; + return NULL; + } + + *palc = dgs.allocation_failure ? 1 : dgs.alc; + return dgs.buf; +} + +/* Subroutine to handle components. */ + +static void +d_print_comp (struct d_print_info *dpi, + const struct demangle_component *dc) +{ + if (dc == NULL) + { + d_print_error (dpi); + return; + } + if (d_print_saw_error (dpi)) + return; + + switch (dc->type) + { + case DEMANGLE_COMPONENT_NAME: + if ((dpi->options & DMGL_JAVA) == 0) + d_append_buffer (dpi, dc->u.s_name.s, dc->u.s_name.len); + else + d_print_java_identifier (dpi, dc->u.s_name.s, dc->u.s_name.len); + return; + + case DEMANGLE_COMPONENT_QUAL_NAME: + case DEMANGLE_COMPONENT_LOCAL_NAME: + d_print_comp (dpi, d_left (dc)); + if ((dpi->options & DMGL_JAVA) == 0) + d_append_string (dpi, "::"); + else + d_append_char (dpi, '.'); + d_print_comp (dpi, d_right (dc)); + return; + + case DEMANGLE_COMPONENT_TYPED_NAME: + { + struct d_print_mod *hold_modifiers; + struct demangle_component *typed_name; + struct d_print_mod adpm[4]; + unsigned int i; + struct d_print_template dpt; + + /* Pass the name down to the type so that it can be printed in + the right place for the type. We also have to pass down + any CV-qualifiers, which apply to the this parameter. */ + hold_modifiers = dpi->modifiers; + i = 0; + typed_name = d_left (dc); + while (typed_name != NULL) + { + if (i >= sizeof adpm / sizeof adpm[0]) + { + d_print_error (dpi); + return; + } + + adpm[i].next = dpi->modifiers; + dpi->modifiers = &adpm[i]; + adpm[i].mod = typed_name; + adpm[i].printed = 0; + adpm[i].templates = dpi->templates; + ++i; + + if (typed_name->type != DEMANGLE_COMPONENT_RESTRICT_THIS + && typed_name->type != DEMANGLE_COMPONENT_VOLATILE_THIS + && typed_name->type != DEMANGLE_COMPONENT_CONST_THIS) + break; + + typed_name = d_left (typed_name); + } + + if (typed_name == NULL) + { + d_print_error (dpi); + return; + } + + /* If typed_name is a template, then it applies to the + function type as well. */ + if (typed_name->type == DEMANGLE_COMPONENT_TEMPLATE) + { + dpt.next = dpi->templates; + dpi->templates = &dpt; + dpt.template_decl = typed_name; + } + + /* If typed_name is a DEMANGLE_COMPONENT_LOCAL_NAME, then + there may be CV-qualifiers on its right argument which + really apply here; this happens when parsing a class which + is local to a function. */ + if (typed_name->type == DEMANGLE_COMPONENT_LOCAL_NAME) + { + struct demangle_component *local_name; + + local_name = d_right (typed_name); + while (local_name->type == DEMANGLE_COMPONENT_RESTRICT_THIS + || local_name->type == DEMANGLE_COMPONENT_VOLATILE_THIS + || local_name->type == DEMANGLE_COMPONENT_CONST_THIS) + { + if (i >= sizeof adpm / sizeof adpm[0]) + { + d_print_error (dpi); + return; + } + + adpm[i] = adpm[i - 1]; + adpm[i].next = &adpm[i - 1]; + dpi->modifiers = &adpm[i]; + + adpm[i - 1].mod = local_name; + adpm[i - 1].printed = 0; + adpm[i - 1].templates = dpi->templates; + ++i; + + local_name = d_left (local_name); + } + } + + d_print_comp (dpi, d_right (dc)); + + if (typed_name->type == DEMANGLE_COMPONENT_TEMPLATE) + dpi->templates = dpt.next; + + /* If the modifiers didn't get printed by the type, print them + now. */ + while (i > 0) + { + --i; + if (! adpm[i].printed) + { + d_append_char (dpi, ' '); + d_print_mod (dpi, adpm[i].mod); + } + } + + dpi->modifiers = hold_modifiers; + + return; + } + + case DEMANGLE_COMPONENT_TEMPLATE: + { + struct d_print_mod *hold_dpm; + struct demangle_component *dcl; + + /* Don't push modifiers into a template definition. Doing so + could give the wrong definition for a template argument. + Instead, treat the template essentially as a name. */ + + hold_dpm = dpi->modifiers; + dpi->modifiers = NULL; + + dcl = d_left (dc); + + if ((dpi->options & DMGL_JAVA) != 0 + && dcl->type == DEMANGLE_COMPONENT_NAME + && dcl->u.s_name.len == 6 + && strncmp (dcl->u.s_name.s, "JArray", 6) == 0) + { + /* Special-case Java arrays, so that JArray appears + instead as TYPE[]. */ + + d_print_comp (dpi, d_right (dc)); + d_append_string (dpi, "[]"); + } + else + { + d_print_comp (dpi, dcl); + if (d_last_char (dpi) == '<') + d_append_char (dpi, ' '); + d_append_char (dpi, '<'); + d_print_comp (dpi, d_right (dc)); + /* Avoid generating two consecutive '>' characters, to avoid + the C++ syntactic ambiguity. */ + if (d_last_char (dpi) == '>') + d_append_char (dpi, ' '); + d_append_char (dpi, '>'); + } + + dpi->modifiers = hold_dpm; + + return; + } + + case DEMANGLE_COMPONENT_TEMPLATE_PARAM: + { + long i; + struct demangle_component *a; + struct d_print_template *hold_dpt; + + if (dpi->templates == NULL) + { + d_print_error (dpi); + return; + } + i = dc->u.s_number.number; + for (a = d_right (dpi->templates->template_decl); + a != NULL; + a = d_right (a)) + { + if (a->type != DEMANGLE_COMPONENT_TEMPLATE_ARGLIST) + { + d_print_error (dpi); + return; + } + if (i <= 0) + break; + --i; + } + if (i != 0 || a == NULL) + { + d_print_error (dpi); + return; + } + + /* While processing this parameter, we need to pop the list of + templates. This is because the template parameter may + itself be a reference to a parameter of an outer + template. */ + + hold_dpt = dpi->templates; + dpi->templates = hold_dpt->next; + + d_print_comp (dpi, d_left (a)); + + dpi->templates = hold_dpt; + + return; + } + + case DEMANGLE_COMPONENT_CTOR: + d_print_comp (dpi, dc->u.s_ctor.name); + return; + + case DEMANGLE_COMPONENT_DTOR: + d_append_char (dpi, '~'); + d_print_comp (dpi, dc->u.s_dtor.name); + return; + + case DEMANGLE_COMPONENT_VTABLE: + d_append_string (dpi, "vtable for "); + d_print_comp (dpi, d_left (dc)); + return; + + case DEMANGLE_COMPONENT_VTT: + d_append_string (dpi, "VTT for "); + d_print_comp (dpi, d_left (dc)); + return; + + case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE: + d_append_string (dpi, "construction vtable for "); + d_print_comp (dpi, d_left (dc)); + d_append_string (dpi, "-in-"); + d_print_comp (dpi, d_right (dc)); + return; + + case DEMANGLE_COMPONENT_TYPEINFO: + d_append_string (dpi, "typeinfo for "); + d_print_comp (dpi, d_left (dc)); + return; + + case DEMANGLE_COMPONENT_TYPEINFO_NAME: + d_append_string (dpi, "typeinfo name for "); + d_print_comp (dpi, d_left (dc)); + return; + + case DEMANGLE_COMPONENT_TYPEINFO_FN: + d_append_string (dpi, "typeinfo fn for "); + d_print_comp (dpi, d_left (dc)); + return; + + case DEMANGLE_COMPONENT_THUNK: + d_append_string (dpi, "non-virtual thunk to "); + d_print_comp (dpi, d_left (dc)); + return; + + case DEMANGLE_COMPONENT_VIRTUAL_THUNK: + d_append_string (dpi, "virtual thunk to "); + d_print_comp (dpi, d_left (dc)); + return; + + case DEMANGLE_COMPONENT_COVARIANT_THUNK: + d_append_string (dpi, "covariant return thunk to "); + d_print_comp (dpi, d_left (dc)); + return; + + case DEMANGLE_COMPONENT_JAVA_CLASS: + d_append_string (dpi, "java Class for "); + d_print_comp (dpi, d_left (dc)); + return; + + case DEMANGLE_COMPONENT_GUARD: + d_append_string (dpi, "guard variable for "); + d_print_comp (dpi, d_left (dc)); + return; + + case DEMANGLE_COMPONENT_REFTEMP: + d_append_string (dpi, "reference temporary for "); + d_print_comp (dpi, d_left (dc)); + return; + + case DEMANGLE_COMPONENT_HIDDEN_ALIAS: + d_append_string (dpi, "hidden alias for "); + d_print_comp (dpi, d_left (dc)); + return; + + case DEMANGLE_COMPONENT_SUB_STD: + d_append_buffer (dpi, dc->u.s_string.string, dc->u.s_string.len); + return; + + case DEMANGLE_COMPONENT_RESTRICT: + case DEMANGLE_COMPONENT_VOLATILE: + case DEMANGLE_COMPONENT_CONST: + { + struct d_print_mod *pdpm; + + /* When printing arrays, it's possible to have cases where the + same CV-qualifier gets pushed on the stack multiple times. + We only need to print it once. */ + + for (pdpm = dpi->modifiers; pdpm != NULL; pdpm = pdpm->next) + { + if (! pdpm->printed) + { + if (pdpm->mod->type != DEMANGLE_COMPONENT_RESTRICT + && pdpm->mod->type != DEMANGLE_COMPONENT_VOLATILE + && pdpm->mod->type != DEMANGLE_COMPONENT_CONST) + break; + if (pdpm->mod->type == dc->type) + { + d_print_comp (dpi, d_left (dc)); + return; + } + } + } + } + /* Fall through. */ + case DEMANGLE_COMPONENT_RESTRICT_THIS: + case DEMANGLE_COMPONENT_VOLATILE_THIS: + case DEMANGLE_COMPONENT_CONST_THIS: + case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL: + case DEMANGLE_COMPONENT_POINTER: + case DEMANGLE_COMPONENT_REFERENCE: + case DEMANGLE_COMPONENT_RVALUE_REFERENCE: + case DEMANGLE_COMPONENT_COMPLEX: + case DEMANGLE_COMPONENT_IMAGINARY: + { + /* We keep a list of modifiers on the stack. */ + struct d_print_mod dpm; + + dpm.next = dpi->modifiers; + dpi->modifiers = &dpm; + dpm.mod = dc; + dpm.printed = 0; + dpm.templates = dpi->templates; + + d_print_comp (dpi, d_left (dc)); + + /* If the modifier didn't get printed by the type, print it + now. */ + if (! dpm.printed) + d_print_mod (dpi, dc); + + dpi->modifiers = dpm.next; + + return; + } + + case DEMANGLE_COMPONENT_BUILTIN_TYPE: + if ((dpi->options & DMGL_JAVA) == 0) + d_append_buffer (dpi, dc->u.s_builtin.type->name, + dc->u.s_builtin.type->len); + else + d_append_buffer (dpi, dc->u.s_builtin.type->java_name, + dc->u.s_builtin.type->java_len); + return; + + case DEMANGLE_COMPONENT_VENDOR_TYPE: + d_print_comp (dpi, d_left (dc)); + return; + + case DEMANGLE_COMPONENT_FUNCTION_TYPE: + { + if ((dpi->options & DMGL_RET_POSTFIX) != 0) + d_print_function_type (dpi, dc, dpi->modifiers); + + /* Print return type if present */ + if (d_left (dc) != NULL) + { + struct d_print_mod dpm; + + /* We must pass this type down as a modifier in order to + print it in the right location. */ + dpm.next = dpi->modifiers; + dpi->modifiers = &dpm; + dpm.mod = dc; + dpm.printed = 0; + dpm.templates = dpi->templates; + + d_print_comp (dpi, d_left (dc)); + + dpi->modifiers = dpm.next; + + if (dpm.printed) + return; + + /* In standard prefix notation, there is a space between the + return type and the function signature. */ + if ((dpi->options & DMGL_RET_POSTFIX) == 0) + d_append_char (dpi, ' '); + } + + if ((dpi->options & DMGL_RET_POSTFIX) == 0) + d_print_function_type (dpi, dc, dpi->modifiers); + + return; + } + + case DEMANGLE_COMPONENT_ARRAY_TYPE: + { + struct d_print_mod *hold_modifiers; + struct d_print_mod adpm[4]; + unsigned int i; + struct d_print_mod *pdpm; + + /* We must pass this type down as a modifier in order to print + multi-dimensional arrays correctly. If the array itself is + CV-qualified, we act as though the element type were + CV-qualified. We do this by copying the modifiers down + rather than fiddling pointers, so that we don't wind up + with a d_print_mod higher on the stack pointing into our + stack frame after we return. */ + + hold_modifiers = dpi->modifiers; + + adpm[0].next = hold_modifiers; + dpi->modifiers = &adpm[0]; + adpm[0].mod = dc; + adpm[0].printed = 0; + adpm[0].templates = dpi->templates; + + i = 1; + pdpm = hold_modifiers; + while (pdpm != NULL + && (pdpm->mod->type == DEMANGLE_COMPONENT_RESTRICT + || pdpm->mod->type == DEMANGLE_COMPONENT_VOLATILE + || pdpm->mod->type == DEMANGLE_COMPONENT_CONST)) + { + if (! pdpm->printed) + { + if (i >= sizeof adpm / sizeof adpm[0]) + { + d_print_error (dpi); + return; + } + + adpm[i] = *pdpm; + adpm[i].next = dpi->modifiers; + dpi->modifiers = &adpm[i]; + pdpm->printed = 1; + ++i; + } + + pdpm = pdpm->next; + } + + d_print_comp (dpi, d_right (dc)); + + dpi->modifiers = hold_modifiers; + + if (adpm[0].printed) + return; + + while (i > 1) + { + --i; + d_print_mod (dpi, adpm[i].mod); + } + + d_print_array_type (dpi, dc, dpi->modifiers); + + return; + } + + case DEMANGLE_COMPONENT_PTRMEM_TYPE: + { + struct d_print_mod dpm; + + dpm.next = dpi->modifiers; + dpi->modifiers = &dpm; + dpm.mod = dc; + dpm.printed = 0; + dpm.templates = dpi->templates; + + d_print_comp (dpi, d_right (dc)); + + /* If the modifier didn't get printed by the type, print it + now. */ + if (! dpm.printed) + { + d_append_char (dpi, ' '); + d_print_comp (dpi, d_left (dc)); + d_append_string (dpi, "::*"); + } + + dpi->modifiers = dpm.next; + + return; + } + + case DEMANGLE_COMPONENT_ARGLIST: + case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST: + d_print_comp (dpi, d_left (dc)); + if (d_right (dc) != NULL) + { + d_append_string (dpi, ", "); + d_print_comp (dpi, d_right (dc)); + } + return; + + case DEMANGLE_COMPONENT_OPERATOR: + { + char c; + + d_append_string (dpi, "operator"); + c = dc->u.s_operator.op->name[0]; + if (IS_LOWER (c)) + d_append_char (dpi, ' '); + d_append_buffer (dpi, dc->u.s_operator.op->name, + dc->u.s_operator.op->len); + return; + } + + case DEMANGLE_COMPONENT_EXTENDED_OPERATOR: + d_append_string (dpi, "operator "); + d_print_comp (dpi, dc->u.s_extended_operator.name); + return; + + case DEMANGLE_COMPONENT_CAST: + d_append_string (dpi, "operator "); + d_print_cast (dpi, dc); + return; + + case DEMANGLE_COMPONENT_UNARY: + if (d_left (dc)->type != DEMANGLE_COMPONENT_CAST) + d_print_expr_op (dpi, d_left (dc)); + else + { + d_append_char (dpi, '('); + d_print_cast (dpi, d_left (dc)); + d_append_char (dpi, ')'); + } + d_append_char (dpi, '('); + d_print_comp (dpi, d_right (dc)); + d_append_char (dpi, ')'); + return; + + case DEMANGLE_COMPONENT_BINARY: + if (d_right (dc)->type != DEMANGLE_COMPONENT_BINARY_ARGS) + { + d_print_error (dpi); + return; + } + + /* We wrap an expression which uses the greater-than operator in + an extra layer of parens so that it does not get confused + with the '>' which ends the template parameters. */ + if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR + && d_left (dc)->u.s_operator.op->len == 1 + && d_left (dc)->u.s_operator.op->name[0] == '>') + d_append_char (dpi, '('); + + d_append_char (dpi, '('); + d_print_comp (dpi, d_left (d_right (dc))); + d_append_string (dpi, ") "); + d_print_expr_op (dpi, d_left (dc)); + d_append_string (dpi, " ("); + d_print_comp (dpi, d_right (d_right (dc))); + d_append_char (dpi, ')'); + + if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR + && d_left (dc)->u.s_operator.op->len == 1 + && d_left (dc)->u.s_operator.op->name[0] == '>') + d_append_char (dpi, ')'); + + return; + + case DEMANGLE_COMPONENT_BINARY_ARGS: + /* We should only see this as part of DEMANGLE_COMPONENT_BINARY. */ + d_print_error (dpi); + return; + + case DEMANGLE_COMPONENT_TRINARY: + if (d_right (dc)->type != DEMANGLE_COMPONENT_TRINARY_ARG1 + || d_right (d_right (dc))->type != DEMANGLE_COMPONENT_TRINARY_ARG2) + { + d_print_error (dpi); + return; + } + d_append_char (dpi, '('); + d_print_comp (dpi, d_left (d_right (dc))); + d_append_string (dpi, ") "); + d_print_expr_op (dpi, d_left (dc)); + d_append_string (dpi, " ("); + d_print_comp (dpi, d_left (d_right (d_right (dc)))); + d_append_string (dpi, ") : ("); + d_print_comp (dpi, d_right (d_right (d_right (dc)))); + d_append_char (dpi, ')'); + return; + + case DEMANGLE_COMPONENT_TRINARY_ARG1: + case DEMANGLE_COMPONENT_TRINARY_ARG2: + /* We should only see these are part of DEMANGLE_COMPONENT_TRINARY. */ + d_print_error (dpi); + return; + + case DEMANGLE_COMPONENT_LITERAL: + case DEMANGLE_COMPONENT_LITERAL_NEG: + { + enum d_builtin_type_print tp; + + /* For some builtin types, produce simpler output. */ + tp = D_PRINT_DEFAULT; + if (d_left (dc)->type == DEMANGLE_COMPONENT_BUILTIN_TYPE) + { + tp = d_left (dc)->u.s_builtin.type->print; + switch (tp) + { + case D_PRINT_INT: + case D_PRINT_UNSIGNED: + case D_PRINT_LONG: + case D_PRINT_UNSIGNED_LONG: + case D_PRINT_LONG_LONG: + case D_PRINT_UNSIGNED_LONG_LONG: + if (d_right (dc)->type == DEMANGLE_COMPONENT_NAME) + { + if (dc->type == DEMANGLE_COMPONENT_LITERAL_NEG) + d_append_char (dpi, '-'); + d_print_comp (dpi, d_right (dc)); + switch (tp) + { + default: + break; + case D_PRINT_UNSIGNED: + d_append_char (dpi, 'u'); + break; + case D_PRINT_LONG: + d_append_char (dpi, 'l'); + break; + case D_PRINT_UNSIGNED_LONG: + d_append_string (dpi, "ul"); + break; + case D_PRINT_LONG_LONG: + d_append_string (dpi, "ll"); + break; + case D_PRINT_UNSIGNED_LONG_LONG: + d_append_string (dpi, "ull"); + break; + } + return; + } + break; + + case D_PRINT_BOOL: + if (d_right (dc)->type == DEMANGLE_COMPONENT_NAME + && d_right (dc)->u.s_name.len == 1 + && dc->type == DEMANGLE_COMPONENT_LITERAL) + { + switch (d_right (dc)->u.s_name.s[0]) + { + case '0': + d_append_string (dpi, "false"); + return; + case '1': + d_append_string (dpi, "true"); + return; + default: + break; + } + } + break; + + default: + break; + } + } + + d_append_char (dpi, '('); + d_print_comp (dpi, d_left (dc)); + d_append_char (dpi, ')'); + if (dc->type == DEMANGLE_COMPONENT_LITERAL_NEG) + d_append_char (dpi, '-'); + if (tp == D_PRINT_FLOAT) + d_append_char (dpi, '['); + d_print_comp (dpi, d_right (dc)); + if (tp == D_PRINT_FLOAT) + d_append_char (dpi, ']'); + } + return; + + default: + d_print_error (dpi); + return; + } +} + +/* Print a Java dentifier. For Java we try to handle encoded extended + Unicode characters. The C++ ABI doesn't mention Unicode encoding, + so we don't it for C++. Characters are encoded as + __U+_. */ + +static void +d_print_java_identifier (struct d_print_info *dpi, const char *name, int len) +{ + const char *p; + const char *end; + + end = name + len; + for (p = name; p < end; ++p) + { + if (end - p > 3 + && p[0] == '_' + && p[1] == '_' + && p[2] == 'U') + { + unsigned long c; + const char *q; + + c = 0; + for (q = p + 3; q < end; ++q) + { + int dig; + + if (IS_DIGIT (*q)) + dig = *q - '0'; + else if (*q >= 'A' && *q <= 'F') + dig = *q - 'A' + 10; + else if (*q >= 'a' && *q <= 'f') + dig = *q - 'a' + 10; + else + break; + + c = c * 16 + dig; + } + /* If the Unicode character is larger than 256, we don't try + to deal with it here. FIXME. */ + if (q < end && *q == '_' && c < 256) + { + d_append_char (dpi, c); + p = q; + continue; + } + } + + d_append_char (dpi, *p); + } +} + +/* Print a list of modifiers. SUFFIX is 1 if we are printing + qualifiers on this after printing a function. */ + +static void +d_print_mod_list (struct d_print_info *dpi, + struct d_print_mod *mods, int suffix) +{ + struct d_print_template *hold_dpt; + + if (mods == NULL || d_print_saw_error (dpi)) + return; + + if (mods->printed + || (! suffix + && (mods->mod->type == DEMANGLE_COMPONENT_RESTRICT_THIS + || mods->mod->type == DEMANGLE_COMPONENT_VOLATILE_THIS + || mods->mod->type == DEMANGLE_COMPONENT_CONST_THIS))) + { + d_print_mod_list (dpi, mods->next, suffix); + return; + } + + mods->printed = 1; + + hold_dpt = dpi->templates; + dpi->templates = mods->templates; + + if (mods->mod->type == DEMANGLE_COMPONENT_FUNCTION_TYPE) + { + d_print_function_type (dpi, mods->mod, mods->next); + dpi->templates = hold_dpt; + return; + } + else if (mods->mod->type == DEMANGLE_COMPONENT_ARRAY_TYPE) + { + d_print_array_type (dpi, mods->mod, mods->next); + dpi->templates = hold_dpt; + return; + } + else if (mods->mod->type == DEMANGLE_COMPONENT_LOCAL_NAME) + { + struct d_print_mod *hold_modifiers; + struct demangle_component *dc; + + /* When this is on the modifier stack, we have pulled any + qualifiers off the right argument already. Otherwise, we + print it as usual, but don't let the left argument see any + modifiers. */ + + hold_modifiers = dpi->modifiers; + dpi->modifiers = NULL; + d_print_comp (dpi, d_left (mods->mod)); + dpi->modifiers = hold_modifiers; + + if ((dpi->options & DMGL_JAVA) == 0) + d_append_string (dpi, "::"); + else + d_append_char (dpi, '.'); + + dc = d_right (mods->mod); + while (dc->type == DEMANGLE_COMPONENT_RESTRICT_THIS + || dc->type == DEMANGLE_COMPONENT_VOLATILE_THIS + || dc->type == DEMANGLE_COMPONENT_CONST_THIS) + dc = d_left (dc); + + d_print_comp (dpi, dc); + + dpi->templates = hold_dpt; + return; + } + + d_print_mod (dpi, mods->mod); + + dpi->templates = hold_dpt; + + d_print_mod_list (dpi, mods->next, suffix); +} + +/* Print a modifier. */ + +static void +d_print_mod (struct d_print_info *dpi, + const struct demangle_component *mod) +{ + switch (mod->type) + { + case DEMANGLE_COMPONENT_RESTRICT: + case DEMANGLE_COMPONENT_RESTRICT_THIS: + d_append_string (dpi, " restrict"); + return; + case DEMANGLE_COMPONENT_VOLATILE: + case DEMANGLE_COMPONENT_VOLATILE_THIS: + d_append_string (dpi, " volatile"); + return; + case DEMANGLE_COMPONENT_CONST: + case DEMANGLE_COMPONENT_CONST_THIS: + d_append_string (dpi, " const"); + return; + case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL: + d_append_char (dpi, ' '); + d_print_comp (dpi, d_right (mod)); + return; + case DEMANGLE_COMPONENT_POINTER: + /* There is no pointer symbol in Java. */ + if ((dpi->options & DMGL_JAVA) == 0) + d_append_char (dpi, '*'); + return; + case DEMANGLE_COMPONENT_REFERENCE: + d_append_char (dpi, '&'); + return; + case DEMANGLE_COMPONENT_RVALUE_REFERENCE: + d_append_string (dpi, "&&"); + return; + case DEMANGLE_COMPONENT_COMPLEX: + d_append_string (dpi, "complex "); + return; + case DEMANGLE_COMPONENT_IMAGINARY: + d_append_string (dpi, "imaginary "); + return; + case DEMANGLE_COMPONENT_PTRMEM_TYPE: + if (d_last_char (dpi) != '(') + d_append_char (dpi, ' '); + d_print_comp (dpi, d_left (mod)); + d_append_string (dpi, "::*"); + return; + case DEMANGLE_COMPONENT_TYPED_NAME: + d_print_comp (dpi, d_left (mod)); + return; + default: + /* Otherwise, we have something that won't go back on the + modifier stack, so we can just print it. */ + d_print_comp (dpi, mod); + return; + } +} + +/* Print a function type, except for the return type. */ + +static void +d_print_function_type (struct d_print_info *dpi, + const struct demangle_component *dc, + struct d_print_mod *mods) +{ + int need_paren; + int saw_mod; + int need_space; + struct d_print_mod *p; + struct d_print_mod *hold_modifiers; + + need_paren = 0; + saw_mod = 0; + need_space = 0; + for (p = mods; p != NULL; p = p->next) + { + if (p->printed) + break; + + saw_mod = 1; + switch (p->mod->type) + { + case DEMANGLE_COMPONENT_POINTER: + case DEMANGLE_COMPONENT_REFERENCE: + case DEMANGLE_COMPONENT_RVALUE_REFERENCE: + need_paren = 1; + break; + case DEMANGLE_COMPONENT_RESTRICT: + case DEMANGLE_COMPONENT_VOLATILE: + case DEMANGLE_COMPONENT_CONST: + case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL: + case DEMANGLE_COMPONENT_COMPLEX: + case DEMANGLE_COMPONENT_IMAGINARY: + case DEMANGLE_COMPONENT_PTRMEM_TYPE: + need_space = 1; + need_paren = 1; + break; + case DEMANGLE_COMPONENT_RESTRICT_THIS: + case DEMANGLE_COMPONENT_VOLATILE_THIS: + case DEMANGLE_COMPONENT_CONST_THIS: + break; + default: + break; + } + if (need_paren) + break; + } + + if (d_left (dc) != NULL && ! saw_mod) + need_paren = 1; + + if (need_paren) + { + if (! need_space) + { + if (d_last_char (dpi) != '(' + && d_last_char (dpi) != '*') + need_space = 1; + } + if (need_space && d_last_char (dpi) != ' ') + d_append_char (dpi, ' '); + d_append_char (dpi, '('); + } + + hold_modifiers = dpi->modifiers; + dpi->modifiers = NULL; + + d_print_mod_list (dpi, mods, 0); + + if (need_paren) + d_append_char (dpi, ')'); + + d_append_char (dpi, '('); + + if (d_right (dc) != NULL) + d_print_comp (dpi, d_right (dc)); + + d_append_char (dpi, ')'); + + d_print_mod_list (dpi, mods, 1); + + dpi->modifiers = hold_modifiers; +} + +/* Print an array type, except for the element type. */ + +static void +d_print_array_type (struct d_print_info *dpi, + const struct demangle_component *dc, + struct d_print_mod *mods) +{ + int need_space; + + need_space = 1; + if (mods != NULL) + { + int need_paren; + struct d_print_mod *p; + + need_paren = 0; + for (p = mods; p != NULL; p = p->next) + { + if (! p->printed) + { + if (p->mod->type == DEMANGLE_COMPONENT_ARRAY_TYPE) + { + need_space = 0; + break; + } + else + { + need_paren = 1; + need_space = 1; + break; + } + } + } + + if (need_paren) + d_append_string (dpi, " ("); + + d_print_mod_list (dpi, mods, 0); + + if (need_paren) + d_append_char (dpi, ')'); + } + + if (need_space) + d_append_char (dpi, ' '); + + d_append_char (dpi, '['); + + if (d_left (dc) != NULL) + d_print_comp (dpi, d_left (dc)); + + d_append_char (dpi, ']'); +} + +/* Print an operator in an expression. */ + +static void +d_print_expr_op (struct d_print_info *dpi, + const struct demangle_component *dc) +{ + if (dc->type == DEMANGLE_COMPONENT_OPERATOR) + d_append_buffer (dpi, dc->u.s_operator.op->name, + dc->u.s_operator.op->len); + else + d_print_comp (dpi, dc); +} + +/* Print a cast. */ + +static void +d_print_cast (struct d_print_info *dpi, + const struct demangle_component *dc) +{ + if (d_left (dc)->type != DEMANGLE_COMPONENT_TEMPLATE) + d_print_comp (dpi, d_left (dc)); + else + { + struct d_print_mod *hold_dpm; + struct d_print_template dpt; + + /* It appears that for a templated cast operator, we need to put + the template parameters in scope for the operator name, but + not for the parameters. The effect is that we need to handle + the template printing here. */ + + hold_dpm = dpi->modifiers; + dpi->modifiers = NULL; + + dpt.next = dpi->templates; + dpi->templates = &dpt; + dpt.template_decl = d_left (dc); + + d_print_comp (dpi, d_left (d_left (dc))); + + dpi->templates = dpt.next; + + if (d_last_char (dpi) == '<') + d_append_char (dpi, ' '); + d_append_char (dpi, '<'); + d_print_comp (dpi, d_right (d_left (dc))); + /* Avoid generating two consecutive '>' characters, to avoid + the C++ syntactic ambiguity. */ + if (d_last_char (dpi) == '>') + d_append_char (dpi, ' '); + d_append_char (dpi, '>'); + + dpi->modifiers = hold_dpm; + } +} + +/* Initialize the information structure we use to pass around + information. */ + +CP_STATIC_IF_GLIBCPP_V3 +void +cplus_demangle_init_info (const char *mangled, int options, size_t len, + struct d_info *di) +{ + di->s = mangled; + di->send = mangled + len; + di->options = options; + + di->n = mangled; + + /* We can not need more components than twice the number of chars in + the mangled string. Most components correspond directly to + chars, but the ARGLIST types are exceptions. */ + di->num_comps = 2 * len; + di->next_comp = 0; + + /* Similarly, we can not need more substitutions than there are + chars in the mangled string. */ + di->num_subs = len; + di->next_sub = 0; + di->did_subs = 0; + + di->last_name = NULL; + + di->expansion = 0; +} + +/* Internal implementation for the demangler. If MANGLED is a g++ v3 ABI + mangled name, return strings in repeated callback giving the demangled + name. OPTIONS is the usual libiberty demangler options. On success, + this returns 1. On failure, returns 0. */ + +static int +d_demangle_callback (const char *mangled, int options, + demangle_callbackref callback, void *opaque) +{ + int type; + struct d_info di; + struct demangle_component *dc; + int status; + + if (mangled[0] == '_' && mangled[1] == 'Z') + type = 0; + else if (strncmp (mangled, "_GLOBAL_", 8) == 0 + && (mangled[8] == '.' || mangled[8] == '_' || mangled[8] == '$') + && (mangled[9] == 'D' || mangled[9] == 'I') + && mangled[10] == '_') + { + const char *intro; + + intro = (mangled[9] == 'I') + ? "global constructors keyed to " + : "global destructors keyed to "; + + callback (intro, strlen (intro), opaque); + callback (mangled + 11, strlen (mangled + 11), opaque); + return 1; + } + else + { + if ((options & DMGL_TYPES) == 0) + return 0; + type = 1; + } + + cplus_demangle_init_info (mangled, options, strlen (mangled), &di); + + { +#ifdef CP_DYNAMIC_ARRAYS + __extension__ struct demangle_component comps[di.num_comps]; + __extension__ struct demangle_component *subs[di.num_subs]; + + di.comps = comps; + di.subs = subs; +#else + di.comps = alloca (di.num_comps * sizeof (*di.comps)); + di.subs = alloca (di.num_subs * sizeof (*di.subs)); +#endif + + if (type) + dc = cplus_demangle_type (&di); + else + dc = cplus_demangle_mangled_name (&di, 1); + + /* If DMGL_PARAMS is set, then if we didn't consume the entire + mangled string, then we didn't successfully demangle it. If + DMGL_PARAMS is not set, we didn't look at the trailing + parameters. */ + if (((options & DMGL_PARAMS) != 0) && d_peek_char (&di) != '\0') + dc = NULL; + +#ifdef CP_DEMANGLE_DEBUG + d_dump (dc, 0); +#endif + + status = (dc != NULL) + ? cplus_demangle_print_callback (options, dc, callback, opaque) + : 0; + } + + return status; +} + +/* Entry point for the demangler. If MANGLED is a g++ v3 ABI mangled + name, return a buffer allocated with malloc holding the demangled + name. OPTIONS is the usual libiberty demangler options. On + success, this sets *PALC to the allocated size of the returned + buffer. On failure, this sets *PALC to 0 for a bad name, or 1 for + a memory allocation failure, and returns NULL. */ + +static char * +d_demangle (const char *mangled, int options, size_t *palc) +{ + struct d_growable_string dgs; + int status; + + d_growable_string_init (&dgs, 0); + + status = d_demangle_callback (mangled, options, + d_growable_string_callback_adapter, &dgs); + if (status == 0) + { + free (dgs.buf); + *palc = 0; + return NULL; + } + + *palc = dgs.allocation_failure ? 1 : 0; + return dgs.buf; +} + +#if defined(IN_LIBGCC2) || defined(IN_GLIBCPP_V3) + +extern char *__cxa_demangle (const char *, char *, size_t *, int *); + +/* ia64 ABI-mandated entry point in the C++ runtime library for + performing demangling. MANGLED_NAME is a NUL-terminated character + string containing the name to be demangled. + + OUTPUT_BUFFER is a region of memory, allocated with malloc, of + *LENGTH bytes, into which the demangled name is stored. If + OUTPUT_BUFFER is not long enough, it is expanded using realloc. + OUTPUT_BUFFER may instead be NULL; in that case, the demangled name + is placed in a region of memory allocated with malloc. + + If LENGTH is non-NULL, the length of the buffer containing the + demangled name, is placed in *LENGTH. + + The return value is a pointer to the start of the NUL-terminated + demangled name, or NULL if the demangling fails. The caller is + responsible for deallocating this memory using free. + + *STATUS is set to one of the following values: + 0: The demangling operation succeeded. + -1: A memory allocation failure occurred. + -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules. + -3: One of the arguments is invalid. + + The demangling is performed using the C++ ABI mangling rules, with + GNU extensions. */ + +char * +__cxa_demangle (const char *mangled_name, char *output_buffer, + size_t *length, int *status) +{ + char *demangled; + size_t alc; + + if (mangled_name == NULL) + { + if (status != NULL) + *status = -3; + return NULL; + } + + if (output_buffer != NULL && length == NULL) + { + if (status != NULL) + *status = -3; + return NULL; + } + + demangled = d_demangle (mangled_name, DMGL_PARAMS | DMGL_TYPES, &alc); + + if (demangled == NULL) + { + if (status != NULL) + { + if (alc == 1) + *status = -1; + else + *status = -2; + } + return NULL; + } + + if (output_buffer == NULL) + { + if (length != NULL) + *length = alc; + } + else + { + if (strlen (demangled) < *length) + { + strcpy (output_buffer, demangled); + free (demangled); + demangled = output_buffer; + } + else + { + free (output_buffer); + *length = alc; + } + } + + if (status != NULL) + *status = 0; + + return demangled; +} + +extern int __gcclibcxx_demangle_callback (const char *, + void (*) + (const char *, size_t, void *), + void *); + +/* Alternative, allocationless entry point in the C++ runtime library + for performing demangling. MANGLED_NAME is a NUL-terminated character + string containing the name to be demangled. + + CALLBACK is a callback function, called with demangled string + segments as demangling progresses; it is called at least once, + but may be called more than once. OPAQUE is a generalized pointer + used as a callback argument. + + The return code is one of the following values, equivalent to + the STATUS values of __cxa_demangle() (excluding -1, since this + function performs no memory allocations): + 0: The demangling operation succeeded. + -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules. + -3: One of the arguments is invalid. + + The demangling is performed using the C++ ABI mangling rules, with + GNU extensions. */ + +int +__gcclibcxx_demangle_callback (const char *mangled_name, + void (*callback) (const char *, size_t, void *), + void *opaque) +{ + int status; + + if (mangled_name == NULL || callback == NULL) + return -3; + + status = d_demangle_callback (mangled_name, DMGL_PARAMS | DMGL_TYPES, + callback, opaque); + if (status == 0) + return -2; + + return 0; +} + +#else /* ! (IN_LIBGCC2 || IN_GLIBCPP_V3) */ + +/* Entry point for libiberty demangler. If MANGLED is a g++ v3 ABI + mangled name, return a buffer allocated with malloc holding the + demangled name. Otherwise, return NULL. */ + +char * +cplus_demangle_v3 (const char *mangled, int options) +{ + size_t alc; + + return d_demangle (mangled, options, &alc); +} + +int +cplus_demangle_v3_callback (const char *mangled, int options, + demangle_callbackref callback, void *opaque) +{ + return d_demangle_callback (mangled, options, callback, opaque); +} + +/* Demangle a Java symbol. Java uses a subset of the V3 ABI C++ mangling + conventions, but the output formatting is a little different. + This instructs the C++ demangler not to emit pointer characters ("*"), to + use Java's namespace separator symbol ("." instead of "::"), and to output + JArray as TYPE[]. */ + +char * +java_demangle_v3 (const char *mangled) +{ + size_t alc; + + return d_demangle (mangled, DMGL_JAVA | DMGL_PARAMS | DMGL_RET_POSTFIX, &alc); +} + +int +java_demangle_v3_callback (const char *mangled, + demangle_callbackref callback, void *opaque) +{ + return d_demangle_callback (mangled, + DMGL_JAVA | DMGL_PARAMS | DMGL_RET_POSTFIX, + callback, opaque); +} + +#endif /* IN_LIBGCC2 || IN_GLIBCPP_V3 */ + +#ifndef IN_GLIBCPP_V3 + +/* Demangle a string in order to find out whether it is a constructor + or destructor. Return non-zero on success. Set *CTOR_KIND and + *DTOR_KIND appropriately. */ + +static int +is_ctor_or_dtor (const char *mangled, + enum gnu_v3_ctor_kinds *ctor_kind, + enum gnu_v3_dtor_kinds *dtor_kind) +{ + struct d_info di; + struct demangle_component *dc; + int ret; + + *ctor_kind = (enum gnu_v3_ctor_kinds) 0; + *dtor_kind = (enum gnu_v3_dtor_kinds) 0; + + cplus_demangle_init_info (mangled, DMGL_GNU_V3, strlen (mangled), &di); + + { +#ifdef CP_DYNAMIC_ARRAYS + __extension__ struct demangle_component comps[di.num_comps]; + __extension__ struct demangle_component *subs[di.num_subs]; + + di.comps = comps; + di.subs = subs; +#else + di.comps = alloca (di.num_comps * sizeof (*di.comps)); + di.subs = alloca (di.num_subs * sizeof (*di.subs)); +#endif + + dc = cplus_demangle_mangled_name (&di, 1); + + /* Note that because we did not pass DMGL_PARAMS, we don't expect + to demangle the entire string. */ + + ret = 0; + while (dc != NULL) + { + switch (dc->type) + { + default: + dc = NULL; + break; + case DEMANGLE_COMPONENT_TYPED_NAME: + case DEMANGLE_COMPONENT_TEMPLATE: + case DEMANGLE_COMPONENT_RESTRICT_THIS: + case DEMANGLE_COMPONENT_VOLATILE_THIS: + case DEMANGLE_COMPONENT_CONST_THIS: + dc = d_left (dc); + break; + case DEMANGLE_COMPONENT_QUAL_NAME: + case DEMANGLE_COMPONENT_LOCAL_NAME: + dc = d_right (dc); + break; + case DEMANGLE_COMPONENT_CTOR: + *ctor_kind = dc->u.s_ctor.kind; + ret = 1; + dc = NULL; + break; + case DEMANGLE_COMPONENT_DTOR: + *dtor_kind = dc->u.s_dtor.kind; + ret = 1; + dc = NULL; + break; + } + } + } + + return ret; +} + +/* Return whether NAME is the mangled form of a g++ V3 ABI constructor + name. A non-zero return indicates the type of constructor. */ + +enum gnu_v3_ctor_kinds +is_gnu_v3_mangled_ctor (const char *name) +{ + enum gnu_v3_ctor_kinds ctor_kind; + enum gnu_v3_dtor_kinds dtor_kind; + + if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind)) + return (enum gnu_v3_ctor_kinds) 0; + return ctor_kind; +} + + +/* Return whether NAME is the mangled form of a g++ V3 ABI destructor + name. A non-zero return indicates the type of destructor. */ + +enum gnu_v3_dtor_kinds +is_gnu_v3_mangled_dtor (const char *name) +{ + enum gnu_v3_ctor_kinds ctor_kind; + enum gnu_v3_dtor_kinds dtor_kind; + + if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind)) + return (enum gnu_v3_dtor_kinds) 0; + return dtor_kind; +} + +#endif /* IN_GLIBCPP_V3 */ + +#ifdef STANDALONE_DEMANGLER + +#include "getopt.h" +#include "dyn-string.h" + +static void print_usage (FILE* fp, int exit_value); + +#define IS_ALPHA(CHAR) \ + (((CHAR) >= 'a' && (CHAR) <= 'z') \ + || ((CHAR) >= 'A' && (CHAR) <= 'Z')) + +/* Non-zero if CHAR is a character than can occur in a mangled name. */ +#define is_mangled_char(CHAR) \ + (IS_ALPHA (CHAR) || IS_DIGIT (CHAR) \ + || (CHAR) == '_' || (CHAR) == '.' || (CHAR) == '$') + +/* The name of this program, as invoked. */ +const char* program_name; + +/* Prints usage summary to FP and then exits with EXIT_VALUE. */ + +static void +print_usage (FILE* fp, int exit_value) +{ + fprintf (fp, "Usage: %s [options] [names ...]\n", program_name); + fprintf (fp, "Options:\n"); + fprintf (fp, " -h,--help Display this message.\n"); + fprintf (fp, " -p,--no-params Don't display function parameters\n"); + fprintf (fp, " -v,--verbose Produce verbose demanglings.\n"); + fprintf (fp, "If names are provided, they are demangled. Otherwise filters standard input.\n"); + + exit (exit_value); +} + +/* Option specification for getopt_long. */ +static const struct option long_options[] = +{ + { "help", no_argument, NULL, 'h' }, + { "no-params", no_argument, NULL, 'p' }, + { "verbose", no_argument, NULL, 'v' }, + { NULL, no_argument, NULL, 0 }, +}; + +/* Main entry for a demangling filter executable. It will demangle + its command line arguments, if any. If none are provided, it will + filter stdin to stdout, replacing any recognized mangled C++ names + with their demangled equivalents. */ + +int +main (int argc, char *argv[]) +{ + int i; + int opt_char; + int options = DMGL_PARAMS | DMGL_ANSI | DMGL_TYPES; + + /* Use the program name of this program, as invoked. */ + program_name = argv[0]; + + /* Parse options. */ + do + { + opt_char = getopt_long (argc, argv, "hpv", long_options, NULL); + switch (opt_char) + { + case '?': /* Unrecognized option. */ + print_usage (stderr, 1); + break; + + case 'h': + print_usage (stdout, 0); + break; + + case 'p': + options &= ~ DMGL_PARAMS; + break; + + case 'v': + options |= DMGL_VERBOSE; + break; + } + } + while (opt_char != -1); + + if (optind == argc) + /* No command line arguments were provided. Filter stdin. */ + { + dyn_string_t mangled = dyn_string_new (3); + char *s; + + /* Read all of input. */ + while (!feof (stdin)) + { + char c; + + /* Pile characters into mangled until we hit one that can't + occur in a mangled name. */ + c = getchar (); + while (!feof (stdin) && is_mangled_char (c)) + { + dyn_string_append_char (mangled, c); + if (feof (stdin)) + break; + c = getchar (); + } + + if (dyn_string_length (mangled) > 0) + { +#ifdef IN_GLIBCPP_V3 + s = __cxa_demangle (dyn_string_buf (mangled), NULL, NULL, NULL); +#else + s = cplus_demangle_v3 (dyn_string_buf (mangled), options); +#endif + + if (s != NULL) + { + fputs (s, stdout); + free (s); + } + else + { + /* It might not have been a mangled name. Print the + original text. */ + fputs (dyn_string_buf (mangled), stdout); + } + + dyn_string_clear (mangled); + } + + /* If we haven't hit EOF yet, we've read one character that + can't occur in a mangled name, so print it out. */ + if (!feof (stdin)) + putchar (c); + } + + dyn_string_delete (mangled); + } + else + /* Demangle command line arguments. */ + { + /* Loop over command line arguments. */ + for (i = optind; i < argc; ++i) + { + char *s; +#ifdef IN_GLIBCPP_V3 + int status; +#endif + + /* Attempt to demangle. */ +#ifdef IN_GLIBCPP_V3 + s = __cxa_demangle (argv[i], NULL, NULL, &status); +#else + s = cplus_demangle_v3 (argv[i], options); +#endif + + /* If it worked, print the demangled name. */ + if (s != NULL) + { + printf ("%s\n", s); + free (s); + } + else + { +#ifdef IN_GLIBCPP_V3 + fprintf (stderr, "Failed: %s (status %d)\n", argv[i], status); +#else + fprintf (stderr, "Failed: %s\n", argv[i]); +#endif + } + } + } + + return 0; +} + +#endif /* STANDALONE_DEMANGLER */ diff --git a/libiberty/cp-demangle.h b/libiberty/cp-demangle.h new file mode 100644 index 0000000..8622f29 --- /dev/null +++ b/libiberty/cp-demangle.h @@ -0,0 +1,168 @@ +/* Internal demangler interface for g++ V3 ABI. + Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. + Written by Ian Lance Taylor . + + This file is part of the libiberty library, which is part of GCC. + + This file 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. + + In addition to the permissions in the GNU General Public License, the + Free Software Foundation gives you unlimited permission to link the + compiled version of this file into combinations with other programs, + and to distribute those combinations without any restriction coming + from the use of this file. (The General Public License restrictions + do apply in other respects; for example, they cover modification of + the file, and distribution when not linked into a combined + executable.) + + 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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +/* This file provides some definitions shared by cp-demangle.c and + cp-demint.c. It should not be included by any other files. */ + +/* Information we keep for operators. */ + +struct demangle_operator_info +{ + /* Mangled name. */ + const char *code; + /* Real name. */ + const char *name; + /* Length of real name. */ + int len; + /* Number of arguments. */ + int args; +}; + +/* How to print the value of a builtin type. */ + +enum d_builtin_type_print +{ + /* Print as (type)val. */ + D_PRINT_DEFAULT, + /* Print as integer. */ + D_PRINT_INT, + /* Print as unsigned integer, with trailing "u". */ + D_PRINT_UNSIGNED, + /* Print as long, with trailing "l". */ + D_PRINT_LONG, + /* Print as unsigned long, with trailing "ul". */ + D_PRINT_UNSIGNED_LONG, + /* Print as long long, with trailing "ll". */ + D_PRINT_LONG_LONG, + /* Print as unsigned long long, with trailing "ull". */ + D_PRINT_UNSIGNED_LONG_LONG, + /* Print as bool. */ + D_PRINT_BOOL, + /* Print as float--put value in square brackets. */ + D_PRINT_FLOAT, + /* Print in usual way, but here to detect void. */ + D_PRINT_VOID +}; + +/* Information we keep for a builtin type. */ + +struct demangle_builtin_type_info +{ + /* Type name. */ + const char *name; + /* Length of type name. */ + int len; + /* Type name when using Java. */ + const char *java_name; + /* Length of java name. */ + int java_len; + /* How to print a value of this type. */ + enum d_builtin_type_print print; +}; + +/* The information structure we pass around. */ + +struct d_info +{ + /* The string we are demangling. */ + const char *s; + /* The end of the string we are demangling. */ + const char *send; + /* The options passed to the demangler. */ + int options; + /* The next character in the string to consider. */ + const char *n; + /* The array of components. */ + struct demangle_component *comps; + /* The index of the next available component. */ + int next_comp; + /* The number of available component structures. */ + int num_comps; + /* The array of substitutions. */ + struct demangle_component **subs; + /* The index of the next substitution. */ + int next_sub; + /* The number of available entries in the subs array. */ + int num_subs; + /* The number of substitutions which we actually made from the subs + array, plus the number of template parameter references we + saw. */ + int did_subs; + /* The last name we saw, for constructors and destructors. */ + struct demangle_component *last_name; + /* A running total of the length of large expansions from the + mangled name to the demangled name, such as standard + substitutions and builtin types. */ + int expansion; +}; + +/* To avoid running past the ending '\0', don't: + - call d_peek_next_char if d_peek_char returned '\0' + - call d_advance with an 'i' that is too large + - call d_check_char(di, '\0') + Everything else is safe. */ +#define d_peek_char(di) (*((di)->n)) +#define d_peek_next_char(di) ((di)->n[1]) +#define d_advance(di, i) ((di)->n += (i)) +#define d_check_char(di, c) (d_peek_char(di) == c ? ((di)->n++, 1) : 0) +#define d_next_char(di) (d_peek_char(di) == '\0' ? '\0' : *((di)->n++)) +#define d_str(di) ((di)->n) + +/* Functions and arrays in cp-demangle.c which are referenced by + functions in cp-demint.c. */ +#ifdef IN_GLIBCPP_V3 +#define CP_STATIC_IF_GLIBCPP_V3 static +#else +#define CP_STATIC_IF_GLIBCPP_V3 extern +#endif + +#ifndef IN_GLIBCPP_V3 +extern const struct demangle_operator_info cplus_demangle_operators[]; +#endif + +#define D_BUILTIN_TYPE_COUNT (26) + +CP_STATIC_IF_GLIBCPP_V3 +const struct demangle_builtin_type_info +cplus_demangle_builtin_types[D_BUILTIN_TYPE_COUNT]; + +CP_STATIC_IF_GLIBCPP_V3 +struct demangle_component * +cplus_demangle_mangled_name (struct d_info *, int); + +CP_STATIC_IF_GLIBCPP_V3 +struct demangle_component * +cplus_demangle_type (struct d_info *); + +extern void +cplus_demangle_init_info (const char *, int, size_t, struct d_info *); + +/* cp-demangle.c needs to define this a little differently */ +#undef CP_STATIC_IF_GLIBCPP_V3 diff --git a/libiberty/cp-demint.c b/libiberty/cp-demint.c new file mode 100644 index 0000000..2e8f8d2 --- /dev/null +++ b/libiberty/cp-demint.c @@ -0,0 +1,234 @@ +/* Demangler component interface functions. + Copyright (C) 2004 Free Software Foundation, Inc. + Written by Ian Lance Taylor . + + This file is part of the libiberty library, which is part of GCC. + + This file 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. + + In addition to the permissions in the GNU General Public License, the + Free Software Foundation gives you unlimited permission to link the + compiled version of this file into combinations with other programs, + and to distribute those combinations without any restriction coming + from the use of this file. (The General Public License restrictions + do apply in other respects; for example, they cover modification of + the file, and distribution when not linked into a combined + executable.) + + 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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +/* This file implements a few interface functions which are provided + for use with struct demangle_component trees. These functions are + declared in demangle.h. These functions are closely tied to the + demangler code in cp-demangle.c, and other interface functions can + be found in that file. We put these functions in a separate file + because they are not needed by the demangler, and so we avoid + having them pulled in by programs which only need the + demangler. */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif + +#include "ansidecl.h" +#include "libiberty.h" +#include "demangle.h" +#include "cp-demangle.h" + +/* Fill in most component types. */ + +int +cplus_demangle_fill_component (struct demangle_component *p, + enum demangle_component_type type, + struct demangle_component *left, + struct demangle_component *right) +{ + if (p == NULL) + return 0; + switch (type) + { + case DEMANGLE_COMPONENT_QUAL_NAME: + case DEMANGLE_COMPONENT_LOCAL_NAME: + case DEMANGLE_COMPONENT_TYPED_NAME: + case DEMANGLE_COMPONENT_TEMPLATE: + case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE: + case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL: + case DEMANGLE_COMPONENT_FUNCTION_TYPE: + case DEMANGLE_COMPONENT_ARRAY_TYPE: + case DEMANGLE_COMPONENT_PTRMEM_TYPE: + case DEMANGLE_COMPONENT_ARGLIST: + case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST: + case DEMANGLE_COMPONENT_UNARY: + case DEMANGLE_COMPONENT_BINARY: + case DEMANGLE_COMPONENT_BINARY_ARGS: + case DEMANGLE_COMPONENT_TRINARY: + case DEMANGLE_COMPONENT_TRINARY_ARG1: + case DEMANGLE_COMPONENT_TRINARY_ARG2: + case DEMANGLE_COMPONENT_LITERAL: + case DEMANGLE_COMPONENT_LITERAL_NEG: + break; + + /* These component types only have one subtree. */ + case DEMANGLE_COMPONENT_VTABLE: + case DEMANGLE_COMPONENT_VTT: + case DEMANGLE_COMPONENT_TYPEINFO: + case DEMANGLE_COMPONENT_TYPEINFO_NAME: + case DEMANGLE_COMPONENT_TYPEINFO_FN: + case DEMANGLE_COMPONENT_THUNK: + case DEMANGLE_COMPONENT_VIRTUAL_THUNK: + case DEMANGLE_COMPONENT_COVARIANT_THUNK: + case DEMANGLE_COMPONENT_JAVA_CLASS: + case DEMANGLE_COMPONENT_GUARD: + case DEMANGLE_COMPONENT_REFTEMP: + case DEMANGLE_COMPONENT_RESTRICT: + case DEMANGLE_COMPONENT_VOLATILE: + case DEMANGLE_COMPONENT_CONST: + case DEMANGLE_COMPONENT_RESTRICT_THIS: + case DEMANGLE_COMPONENT_VOLATILE_THIS: + case DEMANGLE_COMPONENT_CONST_THIS: + case DEMANGLE_COMPONENT_POINTER: + case DEMANGLE_COMPONENT_REFERENCE: + case DEMANGLE_COMPONENT_COMPLEX: + case DEMANGLE_COMPONENT_IMAGINARY: + case DEMANGLE_COMPONENT_VENDOR_TYPE: + case DEMANGLE_COMPONENT_CAST: + if (right != NULL) + return 0; + break; + + default: + /* Other types do not use subtrees. */ + return 0; + } + + p->type = type; + p->u.s_binary.left = left; + p->u.s_binary.right = right; + + return 1; +} + +/* Fill in a DEMANGLE_COMPONENT_BUILTIN_TYPE. */ + +int +cplus_demangle_fill_builtin_type (struct demangle_component *p, + const char *type_name) +{ + int len; + unsigned int i; + + if (p == NULL || type_name == NULL) + return 0; + len = strlen (type_name); + for (i = 0; i < D_BUILTIN_TYPE_COUNT; ++i) + { + if (len == cplus_demangle_builtin_types[i].len + && strcmp (type_name, cplus_demangle_builtin_types[i].name) == 0) + { + p->type = DEMANGLE_COMPONENT_BUILTIN_TYPE; + p->u.s_builtin.type = &cplus_demangle_builtin_types[i]; + return 1; + } + } + return 0; +} + +/* Fill in a DEMANGLE_COMPONENT_OPERATOR. */ + +int +cplus_demangle_fill_operator (struct demangle_component *p, + const char *opname, int args) +{ + int len; + unsigned int i; + + if (p == NULL || opname == NULL) + return 0; + len = strlen (opname); + for (i = 0; cplus_demangle_operators[i].name != NULL; ++i) + { + if (len == cplus_demangle_operators[i].len + && args == cplus_demangle_operators[i].args + && strcmp (opname, cplus_demangle_operators[i].name) == 0) + { + p->type = DEMANGLE_COMPONENT_OPERATOR; + p->u.s_operator.op = &cplus_demangle_operators[i]; + return 1; + } + } + return 0; +} + +/* Translate a mangled name into components. */ + +struct demangle_component * +cplus_demangle_v3_components (const char *mangled, int options, void **mem) +{ + size_t len; + int type; + struct d_info di; + struct demangle_component *dc; + + len = strlen (mangled); + + if (mangled[0] == '_' && mangled[1] == 'Z') + type = 0; + else + { + if ((options & DMGL_TYPES) == 0) + return NULL; + type = 1; + } + + cplus_demangle_init_info (mangled, options, len, &di); + + di.comps = ((struct demangle_component *) + malloc (di.num_comps * sizeof (struct demangle_component))); + di.subs = ((struct demangle_component **) + malloc (di.num_subs * sizeof (struct demangle_component *))); + if (di.comps == NULL || di.subs == NULL) + { + if (di.comps != NULL) + free (di.comps); + if (di.subs != NULL) + free (di.subs); + return NULL; + } + + if (! type) + dc = cplus_demangle_mangled_name (&di, 1); + else + dc = cplus_demangle_type (&di); + + /* If DMGL_PARAMS is set, then if we didn't consume the entire + mangled string, then we didn't successfully demangle it. */ + if ((options & DMGL_PARAMS) != 0 && d_peek_char (&di) != '\0') + dc = NULL; + + free (di.subs); + + if (dc != NULL) + *mem = di.comps; + else + free (di.comps); + + return dc; +} diff --git a/libiberty/cplus-dem.c b/libiberty/cplus-dem.c new file mode 100644 index 0000000..1f8b1fc --- /dev/null +++ b/libiberty/cplus-dem.c @@ -0,0 +1,4717 @@ +/* Demangler for GNU C++ + Copyright 1989, 1991, 1994, 1995, 1996, 1997, 1998, 1999, + 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + Written by James Clark (jjc@jclark.uucp) + Rewritten by Fred Fish (fnf@cygnus.com) for ARM and Lucid demangling + Modified by Satish Pai (pai@apollo.hp.com) for HP demangling + +This file is part of the libiberty library. +Libiberty is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +In addition to the permissions in the GNU Library General Public +License, the Free Software Foundation gives you unlimited permission +to link the compiled version of this file into combinations with other +programs, and to distribute those combinations without any restriction +coming from the use of this file. (The Library Public License +restrictions do apply in other respects; for example, they cover +modification of the file, and distribution when not linked into a +combined executable.) + +Libiberty 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with libiberty; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +/* This file exports two functions; cplus_mangle_opname and cplus_demangle. + + This file imports xmalloc and xrealloc, which are like malloc and + realloc except that they generate a fatal error if there is no + available memory. */ + +/* This file lives in both GCC and libiberty. When making changes, please + try not to break either. */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "safe-ctype.h" + +#include +#include +#include + +#ifdef HAVE_STDLIB_H +#include +#else +char * malloc (); +char * realloc (); +#endif + +#include +#undef CURRENT_DEMANGLING_STYLE +#define CURRENT_DEMANGLING_STYLE work->options + +#include "libiberty.h" + +static char *ada_demangle (const char *, int); + +#define min(X,Y) (((X) < (Y)) ? (X) : (Y)) + +/* A value at least one greater than the maximum number of characters + that will be output when using the `%d' format with `printf'. */ +#define INTBUF_SIZE 32 + +extern void fancy_abort (void) ATTRIBUTE_NORETURN; + +/* In order to allow a single demangler executable to demangle strings + using various common values of CPLUS_MARKER, as well as any specific + one set at compile time, we maintain a string containing all the + commonly used ones, and check to see if the marker we are looking for + is in that string. CPLUS_MARKER is usually '$' on systems where the + assembler can deal with that. Where the assembler can't, it's usually + '.' (but on many systems '.' is used for other things). We put the + current defined CPLUS_MARKER first (which defaults to '$'), followed + by the next most common value, followed by an explicit '$' in case + the value of CPLUS_MARKER is not '$'. + + We could avoid this if we could just get g++ to tell us what the actual + cplus marker character is as part of the debug information, perhaps by + ensuring that it is the character that terminates the gcc_compiled + marker symbol (FIXME). */ + +#if !defined (CPLUS_MARKER) +#define CPLUS_MARKER '$' +#endif + +enum demangling_styles current_demangling_style = auto_demangling; + +static char cplus_markers[] = { CPLUS_MARKER, '.', '$', '\0' }; + +static char char_str[2] = { '\000', '\000' }; + +void +set_cplus_marker_for_demangling (int ch) +{ + cplus_markers[0] = ch; +} + +typedef struct string /* Beware: these aren't required to be */ +{ /* '\0' terminated. */ + char *b; /* pointer to start of string */ + char *p; /* pointer after last character */ + char *e; /* pointer after end of allocated space */ +} string; + +/* Stuff that is shared between sub-routines. + Using a shared structure allows cplus_demangle to be reentrant. */ + +struct work_stuff +{ + int options; + char **typevec; + char **ktypevec; + char **btypevec; + int numk; + int numb; + int ksize; + int bsize; + int ntypes; + int typevec_size; + int constructor; + int destructor; + int static_type; /* A static member function */ + int temp_start; /* index in demangled to start of template args */ + int type_quals; /* The type qualifiers. */ + int dllimported; /* Symbol imported from a PE DLL */ + char **tmpl_argvec; /* Template function arguments. */ + int ntmpl_args; /* The number of template function arguments. */ + int forgetting_types; /* Nonzero if we are not remembering the types + we see. */ + string* previous_argument; /* The last function argument demangled. */ + int nrepeats; /* The number of times to repeat the previous + argument. */ +}; + +#define PRINT_ANSI_QUALIFIERS (work -> options & DMGL_ANSI) +#define PRINT_ARG_TYPES (work -> options & DMGL_PARAMS) + +static const struct optable +{ + const char *const in; + const char *const out; + const int flags; +} optable[] = { + {"nw", " new", DMGL_ANSI}, /* new (1.92, ansi) */ + {"dl", " delete", DMGL_ANSI}, /* new (1.92, ansi) */ + {"new", " new", 0}, /* old (1.91, and 1.x) */ + {"delete", " delete", 0}, /* old (1.91, and 1.x) */ + {"vn", " new []", DMGL_ANSI}, /* GNU, pending ansi */ + {"vd", " delete []", DMGL_ANSI}, /* GNU, pending ansi */ + {"as", "=", DMGL_ANSI}, /* ansi */ + {"ne", "!=", DMGL_ANSI}, /* old, ansi */ + {"eq", "==", DMGL_ANSI}, /* old, ansi */ + {"ge", ">=", DMGL_ANSI}, /* old, ansi */ + {"gt", ">", DMGL_ANSI}, /* old, ansi */ + {"le", "<=", DMGL_ANSI}, /* old, ansi */ + {"lt", "<", DMGL_ANSI}, /* old, ansi */ + {"plus", "+", 0}, /* old */ + {"pl", "+", DMGL_ANSI}, /* ansi */ + {"apl", "+=", DMGL_ANSI}, /* ansi */ + {"minus", "-", 0}, /* old */ + {"mi", "-", DMGL_ANSI}, /* ansi */ + {"ami", "-=", DMGL_ANSI}, /* ansi */ + {"mult", "*", 0}, /* old */ + {"ml", "*", DMGL_ANSI}, /* ansi */ + {"amu", "*=", DMGL_ANSI}, /* ansi (ARM/Lucid) */ + {"aml", "*=", DMGL_ANSI}, /* ansi (GNU/g++) */ + {"convert", "+", 0}, /* old (unary +) */ + {"negate", "-", 0}, /* old (unary -) */ + {"trunc_mod", "%", 0}, /* old */ + {"md", "%", DMGL_ANSI}, /* ansi */ + {"amd", "%=", DMGL_ANSI}, /* ansi */ + {"trunc_div", "/", 0}, /* old */ + {"dv", "/", DMGL_ANSI}, /* ansi */ + {"adv", "/=", DMGL_ANSI}, /* ansi */ + {"truth_andif", "&&", 0}, /* old */ + {"aa", "&&", DMGL_ANSI}, /* ansi */ + {"truth_orif", "||", 0}, /* old */ + {"oo", "||", DMGL_ANSI}, /* ansi */ + {"truth_not", "!", 0}, /* old */ + {"nt", "!", DMGL_ANSI}, /* ansi */ + {"postincrement","++", 0}, /* old */ + {"pp", "++", DMGL_ANSI}, /* ansi */ + {"postdecrement","--", 0}, /* old */ + {"mm", "--", DMGL_ANSI}, /* ansi */ + {"bit_ior", "|", 0}, /* old */ + {"or", "|", DMGL_ANSI}, /* ansi */ + {"aor", "|=", DMGL_ANSI}, /* ansi */ + {"bit_xor", "^", 0}, /* old */ + {"er", "^", DMGL_ANSI}, /* ansi */ + {"aer", "^=", DMGL_ANSI}, /* ansi */ + {"bit_and", "&", 0}, /* old */ + {"ad", "&", DMGL_ANSI}, /* ansi */ + {"aad", "&=", DMGL_ANSI}, /* ansi */ + {"bit_not", "~", 0}, /* old */ + {"co", "~", DMGL_ANSI}, /* ansi */ + {"call", "()", 0}, /* old */ + {"cl", "()", DMGL_ANSI}, /* ansi */ + {"alshift", "<<", 0}, /* old */ + {"ls", "<<", DMGL_ANSI}, /* ansi */ + {"als", "<<=", DMGL_ANSI}, /* ansi */ + {"arshift", ">>", 0}, /* old */ + {"rs", ">>", DMGL_ANSI}, /* ansi */ + {"ars", ">>=", DMGL_ANSI}, /* ansi */ + {"component", "->", 0}, /* old */ + {"pt", "->", DMGL_ANSI}, /* ansi; Lucid C++ form */ + {"rf", "->", DMGL_ANSI}, /* ansi; ARM/GNU form */ + {"indirect", "*", 0}, /* old */ + {"method_call", "->()", 0}, /* old */ + {"addr", "&", 0}, /* old (unary &) */ + {"array", "[]", 0}, /* old */ + {"vc", "[]", DMGL_ANSI}, /* ansi */ + {"compound", ", ", 0}, /* old */ + {"cm", ", ", DMGL_ANSI}, /* ansi */ + {"cond", "?:", 0}, /* old */ + {"cn", "?:", DMGL_ANSI}, /* pseudo-ansi */ + {"max", ">?", 0}, /* old */ + {"mx", ">?", DMGL_ANSI}, /* pseudo-ansi */ + {"min", "*", DMGL_ANSI}, /* ansi */ + {"sz", "sizeof ", DMGL_ANSI} /* pseudo-ansi */ +}; + +/* These values are used to indicate the various type varieties. + They are all non-zero so that they can be used as `success' + values. */ +typedef enum type_kind_t +{ + tk_none, + tk_pointer, + tk_reference, + tk_integral, + tk_bool, + tk_char, + tk_real +} type_kind_t; + +const struct demangler_engine libiberty_demanglers[] = +{ + { + NO_DEMANGLING_STYLE_STRING, + no_demangling, + "Demangling disabled" + } + , + { + AUTO_DEMANGLING_STYLE_STRING, + auto_demangling, + "Automatic selection based on executable" + } + , + { + GNU_DEMANGLING_STYLE_STRING, + gnu_demangling, + "GNU (g++) style demangling" + } + , + { + LUCID_DEMANGLING_STYLE_STRING, + lucid_demangling, + "Lucid (lcc) style demangling" + } + , + { + ARM_DEMANGLING_STYLE_STRING, + arm_demangling, + "ARM style demangling" + } + , + { + HP_DEMANGLING_STYLE_STRING, + hp_demangling, + "HP (aCC) style demangling" + } + , + { + EDG_DEMANGLING_STYLE_STRING, + edg_demangling, + "EDG style demangling" + } + , + { + GNU_V3_DEMANGLING_STYLE_STRING, + gnu_v3_demangling, + "GNU (g++) V3 ABI-style demangling" + } + , + { + JAVA_DEMANGLING_STYLE_STRING, + java_demangling, + "Java style demangling" + } + , + { + GNAT_DEMANGLING_STYLE_STRING, + gnat_demangling, + "GNAT style demangling" + } + , + { + NULL, unknown_demangling, NULL + } +}; + +#define STRING_EMPTY(str) ((str) -> b == (str) -> p) +#define APPEND_BLANK(str) {if (!STRING_EMPTY(str)) \ + string_append(str, " ");} +#define LEN_STRING(str) ( (STRING_EMPTY(str))?0:((str)->p - (str)->b)) + +/* The scope separator appropriate for the language being demangled. */ + +#define SCOPE_STRING(work) ((work->options & DMGL_JAVA) ? "." : "::") + +#define ARM_VTABLE_STRING "__vtbl__" /* Lucid/ARM virtual table prefix */ +#define ARM_VTABLE_STRLEN 8 /* strlen (ARM_VTABLE_STRING) */ + +/* Prototypes for local functions */ + +static void delete_work_stuff (struct work_stuff *); + +static void delete_non_B_K_work_stuff (struct work_stuff *); + +static char *mop_up (struct work_stuff *, string *, int); + +static void squangle_mop_up (struct work_stuff *); + +static void work_stuff_copy_to_from (struct work_stuff *, struct work_stuff *); + +#if 0 +static int +demangle_method_args (struct work_stuff *, const char **, string *); +#endif + +static char * +internal_cplus_demangle (struct work_stuff *, const char *); + +static int +demangle_template_template_parm (struct work_stuff *work, + const char **, string *); + +static int +demangle_template (struct work_stuff *work, const char **, string *, + string *, int, int); + +static int +arm_pt (struct work_stuff *, const char *, int, const char **, + const char **); + +static int +demangle_class_name (struct work_stuff *, const char **, string *); + +static int +demangle_qualified (struct work_stuff *, const char **, string *, + int, int); + +static int demangle_class (struct work_stuff *, const char **, string *); + +static int demangle_fund_type (struct work_stuff *, const char **, string *); + +static int demangle_signature (struct work_stuff *, const char **, string *); + +static int demangle_prefix (struct work_stuff *, const char **, string *); + +static int gnu_special (struct work_stuff *, const char **, string *); + +static int arm_special (const char **, string *); + +static void string_need (string *, int); + +static void string_delete (string *); + +static void +string_init (string *); + +static void string_clear (string *); + +#if 0 +static int string_empty (string *); +#endif + +static void string_append (string *, const char *); + +static void string_appends (string *, string *); + +static void string_appendn (string *, const char *, int); + +static void string_prepend (string *, const char *); + +static void string_prependn (string *, const char *, int); + +static void string_append_template_idx (string *, int); + +static int get_count (const char **, int *); + +static int consume_count (const char **); + +static int consume_count_with_underscores (const char**); + +static int demangle_args (struct work_stuff *, const char **, string *); + +static int demangle_nested_args (struct work_stuff*, const char**, string*); + +static int do_type (struct work_stuff *, const char **, string *); + +static int do_arg (struct work_stuff *, const char **, string *); + +static void +demangle_function_name (struct work_stuff *, const char **, string *, + const char *); + +static int +iterate_demangle_function (struct work_stuff *, + const char **, string *, const char *); + +static void remember_type (struct work_stuff *, const char *, int); + +static void remember_Btype (struct work_stuff *, const char *, int, int); + +static int register_Btype (struct work_stuff *); + +static void remember_Ktype (struct work_stuff *, const char *, int); + +static void forget_types (struct work_stuff *); + +static void forget_B_and_K_types (struct work_stuff *); + +static void string_prepends (string *, string *); + +static int +demangle_template_value_parm (struct work_stuff*, const char**, + string*, type_kind_t); + +static int +do_hpacc_template_const_value (struct work_stuff *, const char **, string *); + +static int +do_hpacc_template_literal (struct work_stuff *, const char **, string *); + +static int snarf_numeric_literal (const char **, string *); + +/* There is a TYPE_QUAL value for each type qualifier. They can be + combined by bitwise-or to form the complete set of qualifiers for a + type. */ + +#define TYPE_UNQUALIFIED 0x0 +#define TYPE_QUAL_CONST 0x1 +#define TYPE_QUAL_VOLATILE 0x2 +#define TYPE_QUAL_RESTRICT 0x4 + +static int code_for_qualifier (int); + +static const char* qualifier_string (int); + +static const char* demangle_qualifier (int); + +static int demangle_expression (struct work_stuff *, const char **, string *, + type_kind_t); + +static int +demangle_integral_value (struct work_stuff *, const char **, string *); + +static int +demangle_real_value (struct work_stuff *, const char **, string *); + +static void +demangle_arm_hp_template (struct work_stuff *, const char **, int, string *); + +static void +recursively_demangle (struct work_stuff *, const char **, string *, int); + +static void grow_vect (char **, size_t *, size_t, int); + +/* Translate count to integer, consuming tokens in the process. + Conversion terminates on the first non-digit character. + + Trying to consume something that isn't a count results in no + consumption of input and a return of -1. + + Overflow consumes the rest of the digits, and returns -1. */ + +static int +consume_count (const char **type) +{ + int count = 0; + + if (! ISDIGIT ((unsigned char)**type)) + return -1; + + while (ISDIGIT ((unsigned char)**type)) + { + count *= 10; + + /* Check for overflow. + We assume that count is represented using two's-complement; + no power of two is divisible by ten, so if an overflow occurs + when multiplying by ten, the result will not be a multiple of + ten. */ + if ((count % 10) != 0) + { + while (ISDIGIT ((unsigned char) **type)) + (*type)++; + return -1; + } + + count += **type - '0'; + (*type)++; + } + + if (count < 0) + count = -1; + + return (count); +} + + +/* Like consume_count, but for counts that are preceded and followed + by '_' if they are greater than 10. Also, -1 is returned for + failure, since 0 can be a valid value. */ + +static int +consume_count_with_underscores (const char **mangled) +{ + int idx; + + if (**mangled == '_') + { + (*mangled)++; + if (!ISDIGIT ((unsigned char)**mangled)) + return -1; + + idx = consume_count (mangled); + if (**mangled != '_') + /* The trailing underscore was missing. */ + return -1; + + (*mangled)++; + } + else + { + if (**mangled < '0' || **mangled > '9') + return -1; + + idx = **mangled - '0'; + (*mangled)++; + } + + return idx; +} + +/* C is the code for a type-qualifier. Return the TYPE_QUAL + corresponding to this qualifier. */ + +static int +code_for_qualifier (int c) +{ + switch (c) + { + case 'C': + return TYPE_QUAL_CONST; + + case 'V': + return TYPE_QUAL_VOLATILE; + + case 'u': + return TYPE_QUAL_RESTRICT; + + default: + break; + } + + /* C was an invalid qualifier. */ + abort (); +} + +/* Return the string corresponding to the qualifiers given by + TYPE_QUALS. */ + +static const char* +qualifier_string (int type_quals) +{ + switch (type_quals) + { + case TYPE_UNQUALIFIED: + return ""; + + case TYPE_QUAL_CONST: + return "const"; + + case TYPE_QUAL_VOLATILE: + return "volatile"; + + case TYPE_QUAL_RESTRICT: + return "__restrict"; + + case TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE: + return "const volatile"; + + case TYPE_QUAL_CONST | TYPE_QUAL_RESTRICT: + return "const __restrict"; + + case TYPE_QUAL_VOLATILE | TYPE_QUAL_RESTRICT: + return "volatile __restrict"; + + case TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE | TYPE_QUAL_RESTRICT: + return "const volatile __restrict"; + + default: + break; + } + + /* TYPE_QUALS was an invalid qualifier set. */ + abort (); +} + +/* C is the code for a type-qualifier. Return the string + corresponding to this qualifier. This function should only be + called with a valid qualifier code. */ + +static const char* +demangle_qualifier (int c) +{ + return qualifier_string (code_for_qualifier (c)); +} + +int +cplus_demangle_opname (const char *opname, char *result, int options) +{ + int len, len1, ret; + string type; + struct work_stuff work[1]; + const char *tem; + + len = strlen(opname); + result[0] = '\0'; + ret = 0; + memset ((char *) work, 0, sizeof (work)); + work->options = options; + + if (opname[0] == '_' && opname[1] == '_' + && opname[2] == 'o' && opname[3] == 'p') + { + /* ANSI. */ + /* type conversion operator. */ + tem = opname + 4; + if (do_type (work, &tem, &type)) + { + strcat (result, "operator "); + strncat (result, type.b, type.p - type.b); + string_delete (&type); + ret = 1; + } + } + else if (opname[0] == '_' && opname[1] == '_' + && ISLOWER((unsigned char)opname[2]) + && ISLOWER((unsigned char)opname[3])) + { + if (opname[4] == '\0') + { + /* Operator. */ + size_t i; + for (i = 0; i < ARRAY_SIZE (optable); i++) + { + if (strlen (optable[i].in) == 2 + && memcmp (optable[i].in, opname + 2, 2) == 0) + { + strcat (result, "operator"); + strcat (result, optable[i].out); + ret = 1; + break; + } + } + } + else + { + if (opname[2] == 'a' && opname[5] == '\0') + { + /* Assignment. */ + size_t i; + for (i = 0; i < ARRAY_SIZE (optable); i++) + { + if (strlen (optable[i].in) == 3 + && memcmp (optable[i].in, opname + 2, 3) == 0) + { + strcat (result, "operator"); + strcat (result, optable[i].out); + ret = 1; + break; + } + } + } + } + } + else if (len >= 3 + && opname[0] == 'o' + && opname[1] == 'p' + && strchr (cplus_markers, opname[2]) != NULL) + { + /* see if it's an assignment expression */ + if (len >= 10 /* op$assign_ */ + && memcmp (opname + 3, "assign_", 7) == 0) + { + size_t i; + for (i = 0; i < ARRAY_SIZE (optable); i++) + { + len1 = len - 10; + if ((int) strlen (optable[i].in) == len1 + && memcmp (optable[i].in, opname + 10, len1) == 0) + { + strcat (result, "operator"); + strcat (result, optable[i].out); + strcat (result, "="); + ret = 1; + break; + } + } + } + else + { + size_t i; + for (i = 0; i < ARRAY_SIZE (optable); i++) + { + len1 = len - 3; + if ((int) strlen (optable[i].in) == len1 + && memcmp (optable[i].in, opname + 3, len1) == 0) + { + strcat (result, "operator"); + strcat (result, optable[i].out); + ret = 1; + break; + } + } + } + } + else if (len >= 5 && memcmp (opname, "type", 4) == 0 + && strchr (cplus_markers, opname[4]) != NULL) + { + /* type conversion operator */ + tem = opname + 5; + if (do_type (work, &tem, &type)) + { + strcat (result, "operator "); + strncat (result, type.b, type.p - type.b); + string_delete (&type); + ret = 1; + } + } + squangle_mop_up (work); + return ret; + +} + +/* Takes operator name as e.g. "++" and returns mangled + operator name (e.g. "postincrement_expr"), or NULL if not found. + + If OPTIONS & DMGL_ANSI == 1, return the ANSI name; + if OPTIONS & DMGL_ANSI == 0, return the old GNU name. */ + +const char * +cplus_mangle_opname (const char *opname, int options) +{ + size_t i; + int len; + + len = strlen (opname); + for (i = 0; i < ARRAY_SIZE (optable); i++) + { + if ((int) strlen (optable[i].out) == len + && (options & DMGL_ANSI) == (optable[i].flags & DMGL_ANSI) + && memcmp (optable[i].out, opname, len) == 0) + return optable[i].in; + } + return (0); +} + +/* Add a routine to set the demangling style to be sure it is valid and + allow for any demangler initialization that maybe necessary. */ + +enum demangling_styles +cplus_demangle_set_style (enum demangling_styles style) +{ + const struct demangler_engine *demangler = libiberty_demanglers; + + for (; demangler->demangling_style != unknown_demangling; ++demangler) + if (style == demangler->demangling_style) + { + current_demangling_style = style; + return current_demangling_style; + } + + return unknown_demangling; +} + +/* Do string name to style translation */ + +enum demangling_styles +cplus_demangle_name_to_style (const char *name) +{ + const struct demangler_engine *demangler = libiberty_demanglers; + + for (; demangler->demangling_style != unknown_demangling; ++demangler) + if (strcmp (name, demangler->demangling_style_name) == 0) + return demangler->demangling_style; + + return unknown_demangling; +} + +/* char *cplus_demangle (const char *mangled, int options) + + If MANGLED is a mangled function name produced by GNU C++, then + a pointer to a @code{malloc}ed string giving a C++ representation + of the name will be returned; otherwise NULL will be returned. + It is the caller's responsibility to free the string which + is returned. + + The OPTIONS arg may contain one or more of the following bits: + + DMGL_ANSI ANSI qualifiers such as `const' and `void' are + included. + DMGL_PARAMS Function parameters are included. + + For example, + + cplus_demangle ("foo__1Ai", DMGL_PARAMS) => "A::foo(int)" + cplus_demangle ("foo__1Ai", DMGL_PARAMS | DMGL_ANSI) => "A::foo(int)" + cplus_demangle ("foo__1Ai", 0) => "A::foo" + + cplus_demangle ("foo__1Afe", DMGL_PARAMS) => "A::foo(float,...)" + cplus_demangle ("foo__1Afe", DMGL_PARAMS | DMGL_ANSI)=> "A::foo(float,...)" + cplus_demangle ("foo__1Afe", 0) => "A::foo" + + Note that any leading underscores, or other such characters prepended by + the compilation system, are presumed to have already been stripped from + MANGLED. */ + +char * +cplus_demangle (const char *mangled, int options) +{ + char *ret; + struct work_stuff work[1]; + + if (current_demangling_style == no_demangling) + return xstrdup (mangled); + + memset ((char *) work, 0, sizeof (work)); + work->options = options; + if ((work->options & DMGL_STYLE_MASK) == 0) + work->options |= (int) current_demangling_style & DMGL_STYLE_MASK; + + /* The V3 ABI demangling is implemented elsewhere. */ + if (GNU_V3_DEMANGLING || AUTO_DEMANGLING) + { + ret = cplus_demangle_v3 (mangled, work->options); + if (ret || GNU_V3_DEMANGLING) + return ret; + } + + if (JAVA_DEMANGLING) + { + ret = java_demangle_v3 (mangled); + if (ret) + return ret; + } + + if (GNAT_DEMANGLING) + return ada_demangle(mangled,options); + + ret = internal_cplus_demangle (work, mangled); + squangle_mop_up (work); + return (ret); +} + + +/* Assuming *OLD_VECT points to an array of *SIZE objects of size + ELEMENT_SIZE, grow it to contain at least MIN_SIZE objects, + updating *OLD_VECT and *SIZE as necessary. */ + +static void +grow_vect (char **old_vect, size_t *size, size_t min_size, int element_size) +{ + if (*size < min_size) + { + *size *= 2; + if (*size < min_size) + *size = min_size; + *old_vect = XRESIZEVAR (char, *old_vect, *size * element_size); + } +} + +/* Demangle ada names: + 1. Discard final __{DIGIT}+ or ${DIGIT}+ + 2. Convert other instances of embedded "__" to `.'. + 3. Discard leading _ada_. + 4. Remove everything after first ___ if it is followed by 'X'. + 5. Put symbols that should be suppressed in <...> brackets. + The resulting string is valid until the next call of ada_demangle. */ + +static char * +ada_demangle (const char *mangled, int option ATTRIBUTE_UNUSED) +{ + int i, j; + int len0; + const char* p; + char *demangled = NULL; + int changed; + size_t demangled_size = 0; + + changed = 0; + + if (strncmp (mangled, "_ada_", 5) == 0) + { + mangled += 5; + changed = 1; + } + + if (mangled[0] == '_' || mangled[0] == '<') + goto Suppress; + + p = strstr (mangled, "___"); + if (p == NULL) + len0 = strlen (mangled); + else + { + if (p[3] == 'X') + { + len0 = p - mangled; + changed = 1; + } + else + goto Suppress; + } + + /* Make demangled big enough for possible expansion by operator name. */ + grow_vect (&demangled, + &demangled_size, 2 * len0 + 1, + sizeof (char)); + + if (ISDIGIT ((unsigned char) mangled[len0 - 1])) { + for (i = len0 - 2; i >= 0 && ISDIGIT ((unsigned char) mangled[i]); i -= 1) + ; + if (i > 1 && mangled[i] == '_' && mangled[i - 1] == '_') + { + len0 = i - 1; + changed = 1; + } + else if (mangled[i] == '$') + { + len0 = i; + changed = 1; + } + } + + for (i = 0, j = 0; i < len0 && ! ISALPHA ((unsigned char)mangled[i]); + i += 1, j += 1) + demangled[j] = mangled[i]; + + while (i < len0) + { + if (i < len0 - 2 && mangled[i] == '_' && mangled[i + 1] == '_') + { + demangled[j] = '.'; + changed = 1; + i += 2; j += 1; + } + else + { + demangled[j] = mangled[i]; + i += 1; j += 1; + } + } + demangled[j] = '\000'; + + for (i = 0; demangled[i] != '\0'; i += 1) + if (ISUPPER ((unsigned char)demangled[i]) || demangled[i] == ' ') + goto Suppress; + + if (! changed) + return NULL; + else + return demangled; + + Suppress: + grow_vect (&demangled, + &demangled_size, strlen (mangled) + 3, + sizeof (char)); + + if (mangled[0] == '<') + strcpy (demangled, mangled); + else + sprintf (demangled, "<%s>", mangled); + + return demangled; +} + +/* This function performs most of what cplus_demangle use to do, but + to be able to demangle a name with a B, K or n code, we need to + have a longer term memory of what types have been seen. The original + now initializes and cleans up the squangle code info, while internal + calls go directly to this routine to avoid resetting that info. */ + +static char * +internal_cplus_demangle (struct work_stuff *work, const char *mangled) +{ + + string decl; + int success = 0; + char *demangled = NULL; + int s1, s2, s3, s4; + s1 = work->constructor; + s2 = work->destructor; + s3 = work->static_type; + s4 = work->type_quals; + work->constructor = work->destructor = 0; + work->type_quals = TYPE_UNQUALIFIED; + work->dllimported = 0; + + if ((mangled != NULL) && (*mangled != '\0')) + { + string_init (&decl); + + /* First check to see if gnu style demangling is active and if the + string to be demangled contains a CPLUS_MARKER. If so, attempt to + recognize one of the gnu special forms rather than looking for a + standard prefix. In particular, don't worry about whether there + is a "__" string in the mangled string. Consider "_$_5__foo" for + example. */ + + if ((AUTO_DEMANGLING || GNU_DEMANGLING)) + { + success = gnu_special (work, &mangled, &decl); + } + if (!success) + { + success = demangle_prefix (work, &mangled, &decl); + } + if (success && (*mangled != '\0')) + { + success = demangle_signature (work, &mangled, &decl); + } + if (work->constructor == 2) + { + string_prepend (&decl, "global constructors keyed to "); + work->constructor = 0; + } + else if (work->destructor == 2) + { + string_prepend (&decl, "global destructors keyed to "); + work->destructor = 0; + } + else if (work->dllimported == 1) + { + string_prepend (&decl, "import stub for "); + work->dllimported = 0; + } + demangled = mop_up (work, &decl, success); + } + work->constructor = s1; + work->destructor = s2; + work->static_type = s3; + work->type_quals = s4; + return demangled; +} + + +/* Clear out and squangling related storage */ +static void +squangle_mop_up (struct work_stuff *work) +{ + /* clean up the B and K type mangling types. */ + forget_B_and_K_types (work); + if (work -> btypevec != NULL) + { + free ((char *) work -> btypevec); + } + if (work -> ktypevec != NULL) + { + free ((char *) work -> ktypevec); + } +} + + +/* Copy the work state and storage. */ + +static void +work_stuff_copy_to_from (struct work_stuff *to, struct work_stuff *from) +{ + int i; + + delete_work_stuff (to); + + /* Shallow-copy scalars. */ + memcpy (to, from, sizeof (*to)); + + /* Deep-copy dynamic storage. */ + if (from->typevec_size) + to->typevec = XNEWVEC (char *, from->typevec_size); + + for (i = 0; i < from->ntypes; i++) + { + int len = strlen (from->typevec[i]) + 1; + + to->typevec[i] = XNEWVEC (char, len); + memcpy (to->typevec[i], from->typevec[i], len); + } + + if (from->ksize) + to->ktypevec = XNEWVEC (char *, from->ksize); + + for (i = 0; i < from->numk; i++) + { + int len = strlen (from->ktypevec[i]) + 1; + + to->ktypevec[i] = XNEWVEC (char, len); + memcpy (to->ktypevec[i], from->ktypevec[i], len); + } + + if (from->bsize) + to->btypevec = XNEWVEC (char *, from->bsize); + + for (i = 0; i < from->numb; i++) + { + int len = strlen (from->btypevec[i]) + 1; + + to->btypevec[i] = XNEWVEC (char , len); + memcpy (to->btypevec[i], from->btypevec[i], len); + } + + if (from->ntmpl_args) + to->tmpl_argvec = XNEWVEC (char *, from->ntmpl_args); + + for (i = 0; i < from->ntmpl_args; i++) + { + int len = strlen (from->tmpl_argvec[i]) + 1; + + to->tmpl_argvec[i] = XNEWVEC (char, len); + memcpy (to->tmpl_argvec[i], from->tmpl_argvec[i], len); + } + + if (from->previous_argument) + { + to->previous_argument = XNEW (string); + string_init (to->previous_argument); + string_appends (to->previous_argument, from->previous_argument); + } +} + + +/* Delete dynamic stuff in work_stuff that is not to be re-used. */ + +static void +delete_non_B_K_work_stuff (struct work_stuff *work) +{ + /* Discard the remembered types, if any. */ + + forget_types (work); + if (work -> typevec != NULL) + { + free ((char *) work -> typevec); + work -> typevec = NULL; + work -> typevec_size = 0; + } + if (work->tmpl_argvec) + { + int i; + + for (i = 0; i < work->ntmpl_args; i++) + if (work->tmpl_argvec[i]) + free ((char*) work->tmpl_argvec[i]); + + free ((char*) work->tmpl_argvec); + work->tmpl_argvec = NULL; + } + if (work->previous_argument) + { + string_delete (work->previous_argument); + free ((char*) work->previous_argument); + work->previous_argument = NULL; + } +} + + +/* Delete all dynamic storage in work_stuff. */ +static void +delete_work_stuff (struct work_stuff *work) +{ + delete_non_B_K_work_stuff (work); + squangle_mop_up (work); +} + + +/* Clear out any mangled storage */ + +static char * +mop_up (struct work_stuff *work, string *declp, int success) +{ + char *demangled = NULL; + + delete_non_B_K_work_stuff (work); + + /* If demangling was successful, ensure that the demangled string is null + terminated and return it. Otherwise, free the demangling decl. */ + + if (!success) + { + string_delete (declp); + } + else + { + string_appendn (declp, "", 1); + demangled = declp->b; + } + return (demangled); +} + +/* + +LOCAL FUNCTION + + demangle_signature -- demangle the signature part of a mangled name + +SYNOPSIS + + static int + demangle_signature (struct work_stuff *work, const char **mangled, + string *declp); + +DESCRIPTION + + Consume and demangle the signature portion of the mangled name. + + DECLP is the string where demangled output is being built. At + entry it contains the demangled root name from the mangled name + prefix. I.E. either a demangled operator name or the root function + name. In some special cases, it may contain nothing. + + *MANGLED points to the current unconsumed location in the mangled + name. As tokens are consumed and demangling is performed, the + pointer is updated to continuously point at the next token to + be consumed. + + Demangling GNU style mangled names is nasty because there is no + explicit token that marks the start of the outermost function + argument list. */ + +static int +demangle_signature (struct work_stuff *work, + const char **mangled, string *declp) +{ + int success = 1; + int func_done = 0; + int expect_func = 0; + int expect_return_type = 0; + const char *oldmangled = NULL; + string trawname; + string tname; + + while (success && (**mangled != '\0')) + { + switch (**mangled) + { + case 'Q': + oldmangled = *mangled; + success = demangle_qualified (work, mangled, declp, 1, 0); + if (success) + remember_type (work, oldmangled, *mangled - oldmangled); + if (AUTO_DEMANGLING || GNU_DEMANGLING) + expect_func = 1; + oldmangled = NULL; + break; + + case 'K': + oldmangled = *mangled; + success = demangle_qualified (work, mangled, declp, 1, 0); + if (AUTO_DEMANGLING || GNU_DEMANGLING) + { + expect_func = 1; + } + oldmangled = NULL; + break; + + case 'S': + /* Static member function */ + if (oldmangled == NULL) + { + oldmangled = *mangled; + } + (*mangled)++; + work -> static_type = 1; + break; + + case 'C': + case 'V': + case 'u': + work->type_quals |= code_for_qualifier (**mangled); + + /* a qualified member function */ + if (oldmangled == NULL) + oldmangled = *mangled; + (*mangled)++; + break; + + case 'L': + /* Local class name follows after "Lnnn_" */ + if (HP_DEMANGLING) + { + while (**mangled && (**mangled != '_')) + (*mangled)++; + if (!**mangled) + success = 0; + else + (*mangled)++; + } + else + success = 0; + break; + + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + if (oldmangled == NULL) + { + oldmangled = *mangled; + } + work->temp_start = -1; /* uppermost call to demangle_class */ + success = demangle_class (work, mangled, declp); + if (success) + { + remember_type (work, oldmangled, *mangled - oldmangled); + } + if (AUTO_DEMANGLING || GNU_DEMANGLING || EDG_DEMANGLING) + { + /* EDG and others will have the "F", so we let the loop cycle + if we are looking at one. */ + if (**mangled != 'F') + expect_func = 1; + } + oldmangled = NULL; + break; + + case 'B': + { + string s; + success = do_type (work, mangled, &s); + if (success) + { + string_append (&s, SCOPE_STRING (work)); + string_prepends (declp, &s); + string_delete (&s); + } + oldmangled = NULL; + expect_func = 1; + } + break; + + case 'F': + /* Function */ + /* ARM/HP style demangling includes a specific 'F' character after + the class name. For GNU style, it is just implied. So we can + safely just consume any 'F' at this point and be compatible + with either style. */ + + oldmangled = NULL; + func_done = 1; + (*mangled)++; + + /* For lucid/ARM/HP style we have to forget any types we might + have remembered up to this point, since they were not argument + types. GNU style considers all types seen as available for + back references. See comment in demangle_args() */ + + if (LUCID_DEMANGLING || ARM_DEMANGLING || HP_DEMANGLING || EDG_DEMANGLING) + { + forget_types (work); + } + success = demangle_args (work, mangled, declp); + /* After picking off the function args, we expect to either + find the function return type (preceded by an '_') or the + end of the string. */ + if (success && (AUTO_DEMANGLING || EDG_DEMANGLING) && **mangled == '_') + { + ++(*mangled); + /* At this level, we do not care about the return type. */ + success = do_type (work, mangled, &tname); + string_delete (&tname); + } + + break; + + case 't': + /* G++ Template */ + string_init(&trawname); + string_init(&tname); + if (oldmangled == NULL) + { + oldmangled = *mangled; + } + success = demangle_template (work, mangled, &tname, + &trawname, 1, 1); + if (success) + { + remember_type (work, oldmangled, *mangled - oldmangled); + } + string_append (&tname, SCOPE_STRING (work)); + + string_prepends(declp, &tname); + if (work -> destructor & 1) + { + string_prepend (&trawname, "~"); + string_appends (declp, &trawname); + work->destructor -= 1; + } + if ((work->constructor & 1) || (work->destructor & 1)) + { + string_appends (declp, &trawname); + work->constructor -= 1; + } + string_delete(&trawname); + string_delete(&tname); + oldmangled = NULL; + expect_func = 1; + break; + + case '_': + if ((AUTO_DEMANGLING || GNU_DEMANGLING) && expect_return_type) + { + /* Read the return type. */ + string return_type; + + (*mangled)++; + success = do_type (work, mangled, &return_type); + APPEND_BLANK (&return_type); + + string_prepends (declp, &return_type); + string_delete (&return_type); + break; + } + else + /* At the outermost level, we cannot have a return type specified, + so if we run into another '_' at this point we are dealing with + a mangled name that is either bogus, or has been mangled by + some algorithm we don't know how to deal with. So just + reject the entire demangling. */ + /* However, "_nnn" is an expected suffix for alternate entry point + numbered nnn for a function, with HP aCC, so skip over that + without reporting failure. pai/1997-09-04 */ + if (HP_DEMANGLING) + { + (*mangled)++; + while (**mangled && ISDIGIT ((unsigned char)**mangled)) + (*mangled)++; + } + else + success = 0; + break; + + case 'H': + if (AUTO_DEMANGLING || GNU_DEMANGLING) + { + /* A G++ template function. Read the template arguments. */ + success = demangle_template (work, mangled, declp, 0, 0, + 0); + if (!(work->constructor & 1)) + expect_return_type = 1; + (*mangled)++; + break; + } + else + /* fall through */ + {;} + + default: + if (AUTO_DEMANGLING || GNU_DEMANGLING) + { + /* Assume we have stumbled onto the first outermost function + argument token, and start processing args. */ + func_done = 1; + success = demangle_args (work, mangled, declp); + } + else + { + /* Non-GNU demanglers use a specific token to mark the start + of the outermost function argument tokens. Typically 'F', + for ARM/HP-demangling, for example. So if we find something + we are not prepared for, it must be an error. */ + success = 0; + } + break; + } + /* + if (AUTO_DEMANGLING || GNU_DEMANGLING) + */ + { + if (success && expect_func) + { + func_done = 1; + if (LUCID_DEMANGLING || ARM_DEMANGLING || EDG_DEMANGLING) + { + forget_types (work); + } + success = demangle_args (work, mangled, declp); + /* Since template include the mangling of their return types, + we must set expect_func to 0 so that we don't try do + demangle more arguments the next time we get here. */ + expect_func = 0; + } + } + } + if (success && !func_done) + { + if (AUTO_DEMANGLING || GNU_DEMANGLING) + { + /* With GNU style demangling, bar__3foo is 'foo::bar(void)', and + bar__3fooi is 'foo::bar(int)'. We get here when we find the + first case, and need to ensure that the '(void)' gets added to + the current declp. Note that with ARM/HP, the first case + represents the name of a static data member 'foo::bar', + which is in the current declp, so we leave it alone. */ + success = demangle_args (work, mangled, declp); + } + } + if (success && PRINT_ARG_TYPES) + { + if (work->static_type) + string_append (declp, " static"); + if (work->type_quals != TYPE_UNQUALIFIED) + { + APPEND_BLANK (declp); + string_append (declp, qualifier_string (work->type_quals)); + } + } + + return (success); +} + +#if 0 + +static int +demangle_method_args (struct work_stuff *work, const char **mangled, + string *declp) +{ + int success = 0; + + if (work -> static_type) + { + string_append (declp, *mangled + 1); + *mangled += strlen (*mangled); + success = 1; + } + else + { + success = demangle_args (work, mangled, declp); + } + return (success); +} + +#endif + +static int +demangle_template_template_parm (struct work_stuff *work, + const char **mangled, string *tname) +{ + int i; + int r; + int need_comma = 0; + int success = 1; + string temp; + + string_append (tname, "template <"); + /* get size of template parameter list */ + if (get_count (mangled, &r)) + { + for (i = 0; i < r; i++) + { + if (need_comma) + { + string_append (tname, ", "); + } + + /* Z for type parameters */ + if (**mangled == 'Z') + { + (*mangled)++; + string_append (tname, "class"); + } + /* z for template parameters */ + else if (**mangled == 'z') + { + (*mangled)++; + success = + demangle_template_template_parm (work, mangled, tname); + if (!success) + { + break; + } + } + else + { + /* temp is initialized in do_type */ + success = do_type (work, mangled, &temp); + if (success) + { + string_appends (tname, &temp); + } + string_delete(&temp); + if (!success) + { + break; + } + } + need_comma = 1; + } + + } + if (tname->p[-1] == '>') + string_append (tname, " "); + string_append (tname, "> class"); + return (success); +} + +static int +demangle_expression (struct work_stuff *work, const char **mangled, + string *s, type_kind_t tk) +{ + int need_operator = 0; + int success; + + success = 1; + string_appendn (s, "(", 1); + (*mangled)++; + while (success && **mangled != 'W' && **mangled != '\0') + { + if (need_operator) + { + size_t i; + size_t len; + + success = 0; + + len = strlen (*mangled); + + for (i = 0; i < ARRAY_SIZE (optable); ++i) + { + size_t l = strlen (optable[i].in); + + if (l <= len + && memcmp (optable[i].in, *mangled, l) == 0) + { + string_appendn (s, " ", 1); + string_append (s, optable[i].out); + string_appendn (s, " ", 1); + success = 1; + (*mangled) += l; + break; + } + } + + if (!success) + break; + } + else + need_operator = 1; + + success = demangle_template_value_parm (work, mangled, s, tk); + } + + if (**mangled != 'W') + success = 0; + else + { + string_appendn (s, ")", 1); + (*mangled)++; + } + + return success; +} + +static int +demangle_integral_value (struct work_stuff *work, + const char **mangled, string *s) +{ + int success; + + if (**mangled == 'E') + success = demangle_expression (work, mangled, s, tk_integral); + else if (**mangled == 'Q' || **mangled == 'K') + success = demangle_qualified (work, mangled, s, 0, 1); + else + { + int value; + + /* By default, we let the number decide whether we shall consume an + underscore. */ + int multidigit_without_leading_underscore = 0; + int leave_following_underscore = 0; + + success = 0; + + if (**mangled == '_') + { + if (mangled[0][1] == 'm') + { + /* Since consume_count_with_underscores does not handle the + `m'-prefix we must do it here, using consume_count and + adjusting underscores: we have to consume the underscore + matching the prepended one. */ + multidigit_without_leading_underscore = 1; + string_appendn (s, "-", 1); + (*mangled) += 2; + } + else + { + /* Do not consume a following underscore; + consume_count_with_underscores will consume what + should be consumed. */ + leave_following_underscore = 1; + } + } + else + { + /* Negative numbers are indicated with a leading `m'. */ + if (**mangled == 'm') + { + string_appendn (s, "-", 1); + (*mangled)++; + } + /* Since consume_count_with_underscores does not handle + multi-digit numbers that do not start with an underscore, + and this number can be an integer template parameter, + we have to call consume_count. */ + multidigit_without_leading_underscore = 1; + /* These multi-digit numbers never end on an underscore, + so if there is one then don't eat it. */ + leave_following_underscore = 1; + } + + /* We must call consume_count if we expect to remove a trailing + underscore, since consume_count_with_underscores expects + the leading underscore (that we consumed) if it is to handle + multi-digit numbers. */ + if (multidigit_without_leading_underscore) + value = consume_count (mangled); + else + value = consume_count_with_underscores (mangled); + + if (value != -1) + { + char buf[INTBUF_SIZE]; + sprintf (buf, "%d", value); + string_append (s, buf); + + /* Numbers not otherwise delimited, might have an underscore + appended as a delimeter, which we should skip. + + ??? This used to always remove a following underscore, which + is wrong. If other (arbitrary) cases are followed by an + underscore, we need to do something more radical. */ + + if ((value > 9 || multidigit_without_leading_underscore) + && ! leave_following_underscore + && **mangled == '_') + (*mangled)++; + + /* All is well. */ + success = 1; + } + } + + return success; +} + +/* Demangle the real value in MANGLED. */ + +static int +demangle_real_value (struct work_stuff *work, + const char **mangled, string *s) +{ + if (**mangled == 'E') + return demangle_expression (work, mangled, s, tk_real); + + if (**mangled == 'm') + { + string_appendn (s, "-", 1); + (*mangled)++; + } + while (ISDIGIT ((unsigned char)**mangled)) + { + string_appendn (s, *mangled, 1); + (*mangled)++; + } + if (**mangled == '.') /* fraction */ + { + string_appendn (s, ".", 1); + (*mangled)++; + while (ISDIGIT ((unsigned char)**mangled)) + { + string_appendn (s, *mangled, 1); + (*mangled)++; + } + } + if (**mangled == 'e') /* exponent */ + { + string_appendn (s, "e", 1); + (*mangled)++; + while (ISDIGIT ((unsigned char)**mangled)) + { + string_appendn (s, *mangled, 1); + (*mangled)++; + } + } + + return 1; +} + +static int +demangle_template_value_parm (struct work_stuff *work, const char **mangled, + string *s, type_kind_t tk) +{ + int success = 1; + + if (**mangled == 'Y') + { + /* The next argument is a template parameter. */ + int idx; + + (*mangled)++; + idx = consume_count_with_underscores (mangled); + if (idx == -1 + || (work->tmpl_argvec && idx >= work->ntmpl_args) + || consume_count_with_underscores (mangled) == -1) + return -1; + if (work->tmpl_argvec) + string_append (s, work->tmpl_argvec[idx]); + else + string_append_template_idx (s, idx); + } + else if (tk == tk_integral) + success = demangle_integral_value (work, mangled, s); + else if (tk == tk_char) + { + char tmp[2]; + int val; + if (**mangled == 'm') + { + string_appendn (s, "-", 1); + (*mangled)++; + } + string_appendn (s, "'", 1); + val = consume_count(mangled); + if (val <= 0) + success = 0; + else + { + tmp[0] = (char)val; + tmp[1] = '\0'; + string_appendn (s, &tmp[0], 1); + string_appendn (s, "'", 1); + } + } + else if (tk == tk_bool) + { + int val = consume_count (mangled); + if (val == 0) + string_appendn (s, "false", 5); + else if (val == 1) + string_appendn (s, "true", 4); + else + success = 0; + } + else if (tk == tk_real) + success = demangle_real_value (work, mangled, s); + else if (tk == tk_pointer || tk == tk_reference) + { + if (**mangled == 'Q') + success = demangle_qualified (work, mangled, s, + /*isfuncname=*/0, + /*append=*/1); + else + { + int symbol_len = consume_count (mangled); + if (symbol_len == -1) + return -1; + if (symbol_len == 0) + string_appendn (s, "0", 1); + else + { + char *p = XNEWVEC (char, symbol_len + 1), *q; + strncpy (p, *mangled, symbol_len); + p [symbol_len] = '\0'; + /* We use cplus_demangle here, rather than + internal_cplus_demangle, because the name of the entity + mangled here does not make use of any of the squangling + or type-code information we have built up thus far; it is + mangled independently. */ + q = cplus_demangle (p, work->options); + if (tk == tk_pointer) + string_appendn (s, "&", 1); + /* FIXME: Pointer-to-member constants should get a + qualifying class name here. */ + if (q) + { + string_append (s, q); + free (q); + } + else + string_append (s, p); + free (p); + } + *mangled += symbol_len; + } + } + + return success; +} + +/* Demangle the template name in MANGLED. The full name of the + template (e.g., S) is placed in TNAME. The name without the + template parameters (e.g. S) is placed in TRAWNAME if TRAWNAME is + non-NULL. If IS_TYPE is nonzero, this template is a type template, + not a function template. If both IS_TYPE and REMEMBER are nonzero, + the template is remembered in the list of back-referenceable + types. */ + +static int +demangle_template (struct work_stuff *work, const char **mangled, + string *tname, string *trawname, + int is_type, int remember) +{ + int i; + int r; + int need_comma = 0; + int success = 0; + int is_java_array = 0; + string temp; + + (*mangled)++; + if (is_type) + { + /* get template name */ + if (**mangled == 'z') + { + int idx; + (*mangled)++; + (*mangled)++; + + idx = consume_count_with_underscores (mangled); + if (idx == -1 + || (work->tmpl_argvec && idx >= work->ntmpl_args) + || consume_count_with_underscores (mangled) == -1) + return (0); + + if (work->tmpl_argvec) + { + string_append (tname, work->tmpl_argvec[idx]); + if (trawname) + string_append (trawname, work->tmpl_argvec[idx]); + } + else + { + string_append_template_idx (tname, idx); + if (trawname) + string_append_template_idx (trawname, idx); + } + } + else + { + if ((r = consume_count (mangled)) <= 0 + || (int) strlen (*mangled) < r) + { + return (0); + } + is_java_array = (work -> options & DMGL_JAVA) + && strncmp (*mangled, "JArray1Z", 8) == 0; + if (! is_java_array) + { + string_appendn (tname, *mangled, r); + } + if (trawname) + string_appendn (trawname, *mangled, r); + *mangled += r; + } + } + if (!is_java_array) + string_append (tname, "<"); + /* get size of template parameter list */ + if (!get_count (mangled, &r)) + { + return (0); + } + if (!is_type) + { + /* Create an array for saving the template argument values. */ + work->tmpl_argvec = XNEWVEC (char *, r); + work->ntmpl_args = r; + for (i = 0; i < r; i++) + work->tmpl_argvec[i] = 0; + } + for (i = 0; i < r; i++) + { + if (need_comma) + { + string_append (tname, ", "); + } + /* Z for type parameters */ + if (**mangled == 'Z') + { + (*mangled)++; + /* temp is initialized in do_type */ + success = do_type (work, mangled, &temp); + if (success) + { + string_appends (tname, &temp); + + if (!is_type) + { + /* Save the template argument. */ + int len = temp.p - temp.b; + work->tmpl_argvec[i] = XNEWVEC (char, len + 1); + memcpy (work->tmpl_argvec[i], temp.b, len); + work->tmpl_argvec[i][len] = '\0'; + } + } + string_delete(&temp); + if (!success) + { + break; + } + } + /* z for template parameters */ + else if (**mangled == 'z') + { + int r2; + (*mangled)++; + success = demangle_template_template_parm (work, mangled, tname); + + if (success + && (r2 = consume_count (mangled)) > 0 + && (int) strlen (*mangled) >= r2) + { + string_append (tname, " "); + string_appendn (tname, *mangled, r2); + if (!is_type) + { + /* Save the template argument. */ + int len = r2; + work->tmpl_argvec[i] = XNEWVEC (char, len + 1); + memcpy (work->tmpl_argvec[i], *mangled, len); + work->tmpl_argvec[i][len] = '\0'; + } + *mangled += r2; + } + if (!success) + { + break; + } + } + else + { + string param; + string* s; + + /* otherwise, value parameter */ + + /* temp is initialized in do_type */ + success = do_type (work, mangled, &temp); + string_delete(&temp); + if (!success) + break; + + if (!is_type) + { + s = ¶m; + string_init (s); + } + else + s = tname; + + success = demangle_template_value_parm (work, mangled, s, + (type_kind_t) success); + + if (!success) + { + if (!is_type) + string_delete (s); + success = 0; + break; + } + + if (!is_type) + { + int len = s->p - s->b; + work->tmpl_argvec[i] = XNEWVEC (char, len + 1); + memcpy (work->tmpl_argvec[i], s->b, len); + work->tmpl_argvec[i][len] = '\0'; + + string_appends (tname, s); + string_delete (s); + } + } + need_comma = 1; + } + if (is_java_array) + { + string_append (tname, "[]"); + } + else + { + if (tname->p[-1] == '>') + string_append (tname, " "); + string_append (tname, ">"); + } + + if (is_type && remember) + { + const int bindex = register_Btype (work); + remember_Btype (work, tname->b, LEN_STRING (tname), bindex); + } + + /* + if (work -> static_type) + { + string_append (declp, *mangled + 1); + *mangled += strlen (*mangled); + success = 1; + } + else + { + success = demangle_args (work, mangled, declp); + } + } + */ + return (success); +} + +static int +arm_pt (struct work_stuff *work, const char *mangled, + int n, const char **anchor, const char **args) +{ + /* Check if ARM template with "__pt__" in it ("parameterized type") */ + /* Allow HP also here, because HP's cfront compiler follows ARM to some extent */ + if ((ARM_DEMANGLING || HP_DEMANGLING) && (*anchor = strstr (mangled, "__pt__"))) + { + int len; + *args = *anchor + 6; + len = consume_count (args); + if (len == -1) + return 0; + if (*args + len == mangled + n && **args == '_') + { + ++*args; + return 1; + } + } + if (AUTO_DEMANGLING || EDG_DEMANGLING) + { + if ((*anchor = strstr (mangled, "__tm__")) + || (*anchor = strstr (mangled, "__ps__")) + || (*anchor = strstr (mangled, "__pt__"))) + { + int len; + *args = *anchor + 6; + len = consume_count (args); + if (len == -1) + return 0; + if (*args + len == mangled + n && **args == '_') + { + ++*args; + return 1; + } + } + else if ((*anchor = strstr (mangled, "__S"))) + { + int len; + *args = *anchor + 3; + len = consume_count (args); + if (len == -1) + return 0; + if (*args + len == mangled + n && **args == '_') + { + ++*args; + return 1; + } + } + } + + return 0; +} + +static void +demangle_arm_hp_template (struct work_stuff *work, const char **mangled, + int n, string *declp) +{ + const char *p; + const char *args; + const char *e = *mangled + n; + string arg; + + /* Check for HP aCC template spec: classXt1t2 where t1, t2 are + template args */ + if (HP_DEMANGLING && ((*mangled)[n] == 'X')) + { + char *start_spec_args = NULL; + int hold_options; + + /* First check for and omit template specialization pseudo-arguments, + such as in "Spec<#1,#1.*>" */ + start_spec_args = strchr (*mangled, '<'); + if (start_spec_args && (start_spec_args - *mangled < n)) + string_appendn (declp, *mangled, start_spec_args - *mangled); + else + string_appendn (declp, *mangled, n); + (*mangled) += n + 1; + string_init (&arg); + if (work->temp_start == -1) /* non-recursive call */ + work->temp_start = declp->p - declp->b; + + /* We want to unconditionally demangle parameter types in + template parameters. */ + hold_options = work->options; + work->options |= DMGL_PARAMS; + + string_append (declp, "<"); + while (1) + { + string_delete (&arg); + switch (**mangled) + { + case 'T': + /* 'T' signals a type parameter */ + (*mangled)++; + if (!do_type (work, mangled, &arg)) + goto hpacc_template_args_done; + break; + + case 'U': + case 'S': + /* 'U' or 'S' signals an integral value */ + if (!do_hpacc_template_const_value (work, mangled, &arg)) + goto hpacc_template_args_done; + break; + + case 'A': + /* 'A' signals a named constant expression (literal) */ + if (!do_hpacc_template_literal (work, mangled, &arg)) + goto hpacc_template_args_done; + break; + + default: + /* Today, 1997-09-03, we have only the above types + of template parameters */ + /* FIXME: maybe this should fail and return null */ + goto hpacc_template_args_done; + } + string_appends (declp, &arg); + /* Check if we're at the end of template args. + 0 if at end of static member of template class, + _ if done with template args for a function */ + if ((**mangled == '\000') || (**mangled == '_')) + break; + else + string_append (declp, ","); + } + hpacc_template_args_done: + string_append (declp, ">"); + string_delete (&arg); + if (**mangled == '_') + (*mangled)++; + work->options = hold_options; + return; + } + /* ARM template? (Also handles HP cfront extensions) */ + else if (arm_pt (work, *mangled, n, &p, &args)) + { + int hold_options; + string type_str; + + string_init (&arg); + string_appendn (declp, *mangled, p - *mangled); + if (work->temp_start == -1) /* non-recursive call */ + work->temp_start = declp->p - declp->b; + + /* We want to unconditionally demangle parameter types in + template parameters. */ + hold_options = work->options; + work->options |= DMGL_PARAMS; + + string_append (declp, "<"); + /* should do error checking here */ + while (args < e) { + string_delete (&arg); + + /* Check for type or literal here */ + switch (*args) + { + /* HP cfront extensions to ARM for template args */ + /* spec: Xt1Lv1 where t1 is a type, v1 is a literal value */ + /* FIXME: We handle only numeric literals for HP cfront */ + case 'X': + /* A typed constant value follows */ + args++; + if (!do_type (work, &args, &type_str)) + goto cfront_template_args_done; + string_append (&arg, "("); + string_appends (&arg, &type_str); + string_delete (&type_str); + string_append (&arg, ")"); + if (*args != 'L') + goto cfront_template_args_done; + args++; + /* Now snarf a literal value following 'L' */ + if (!snarf_numeric_literal (&args, &arg)) + goto cfront_template_args_done; + break; + + case 'L': + /* Snarf a literal following 'L' */ + args++; + if (!snarf_numeric_literal (&args, &arg)) + goto cfront_template_args_done; + break; + default: + /* Not handling other HP cfront stuff */ + { + const char* old_args = args; + if (!do_type (work, &args, &arg)) + goto cfront_template_args_done; + + /* Fail if we didn't make any progress: prevent infinite loop. */ + if (args == old_args) + { + work->options = hold_options; + return; + } + } + } + string_appends (declp, &arg); + string_append (declp, ","); + } + cfront_template_args_done: + string_delete (&arg); + if (args >= e) + --declp->p; /* remove extra comma */ + string_append (declp, ">"); + work->options = hold_options; + } + else if (n>10 && strncmp (*mangled, "_GLOBAL_", 8) == 0 + && (*mangled)[9] == 'N' + && (*mangled)[8] == (*mangled)[10] + && strchr (cplus_markers, (*mangled)[8])) + { + /* A member of the anonymous namespace. */ + string_append (declp, "{anonymous}"); + } + else + { + if (work->temp_start == -1) /* non-recursive call only */ + work->temp_start = 0; /* disable in recursive calls */ + string_appendn (declp, *mangled, n); + } + *mangled += n; +} + +/* Extract a class name, possibly a template with arguments, from the + mangled string; qualifiers, local class indicators, etc. have + already been dealt with */ + +static int +demangle_class_name (struct work_stuff *work, const char **mangled, + string *declp) +{ + int n; + int success = 0; + + n = consume_count (mangled); + if (n == -1) + return 0; + if ((int) strlen (*mangled) >= n) + { + demangle_arm_hp_template (work, mangled, n, declp); + success = 1; + } + + return (success); +} + +/* + +LOCAL FUNCTION + + demangle_class -- demangle a mangled class sequence + +SYNOPSIS + + static int + demangle_class (struct work_stuff *work, const char **mangled, + strint *declp) + +DESCRIPTION + + DECLP points to the buffer into which demangling is being done. + + *MANGLED points to the current token to be demangled. On input, + it points to a mangled class (I.E. "3foo", "13verylongclass", etc.) + On exit, it points to the next token after the mangled class on + success, or the first unconsumed token on failure. + + If the CONSTRUCTOR or DESTRUCTOR flags are set in WORK, then + we are demangling a constructor or destructor. In this case + we prepend "class::class" or "class::~class" to DECLP. + + Otherwise, we prepend "class::" to the current DECLP. + + Reset the constructor/destructor flags once they have been + "consumed". This allows demangle_class to be called later during + the same demangling, to do normal class demangling. + + Returns 1 if demangling is successful, 0 otherwise. + +*/ + +static int +demangle_class (struct work_stuff *work, const char **mangled, string *declp) +{ + int success = 0; + int btype; + string class_name; + char *save_class_name_end = 0; + + string_init (&class_name); + btype = register_Btype (work); + if (demangle_class_name (work, mangled, &class_name)) + { + save_class_name_end = class_name.p; + if ((work->constructor & 1) || (work->destructor & 1)) + { + /* adjust so we don't include template args */ + if (work->temp_start && (work->temp_start != -1)) + { + class_name.p = class_name.b + work->temp_start; + } + string_prepends (declp, &class_name); + if (work -> destructor & 1) + { + string_prepend (declp, "~"); + work -> destructor -= 1; + } + else + { + work -> constructor -= 1; + } + } + class_name.p = save_class_name_end; + remember_Ktype (work, class_name.b, LEN_STRING(&class_name)); + remember_Btype (work, class_name.b, LEN_STRING(&class_name), btype); + string_prepend (declp, SCOPE_STRING (work)); + string_prepends (declp, &class_name); + success = 1; + } + string_delete (&class_name); + return (success); +} + + +/* Called when there's a "__" in the mangled name, with `scan' pointing to + the rightmost guess. + + Find the correct "__"-sequence where the function name ends and the + signature starts, which is ambiguous with GNU mangling. + Call demangle_signature here, so we can make sure we found the right + one; *mangled will be consumed so caller will not make further calls to + demangle_signature. */ + +static int +iterate_demangle_function (struct work_stuff *work, const char **mangled, + string *declp, const char *scan) +{ + const char *mangle_init = *mangled; + int success = 0; + string decl_init; + struct work_stuff work_init; + + if (*(scan + 2) == '\0') + return 0; + + /* Do not iterate for some demangling modes, or if there's only one + "__"-sequence. This is the normal case. */ + if (ARM_DEMANGLING || LUCID_DEMANGLING || HP_DEMANGLING || EDG_DEMANGLING + || strstr (scan + 2, "__") == NULL) + { + demangle_function_name (work, mangled, declp, scan); + return 1; + } + + /* Save state so we can restart if the guess at the correct "__" was + wrong. */ + string_init (&decl_init); + string_appends (&decl_init, declp); + memset (&work_init, 0, sizeof work_init); + work_stuff_copy_to_from (&work_init, work); + + /* Iterate over occurrences of __, allowing names and types to have a + "__" sequence in them. We must start with the first (not the last) + occurrence, since "__" most often occur between independent mangled + parts, hence starting at the last occurence inside a signature + might get us a "successful" demangling of the signature. */ + + while (scan[2]) + { + demangle_function_name (work, mangled, declp, scan); + success = demangle_signature (work, mangled, declp); + if (success) + break; + + /* Reset demangle state for the next round. */ + *mangled = mangle_init; + string_clear (declp); + string_appends (declp, &decl_init); + work_stuff_copy_to_from (work, &work_init); + + /* Leave this underscore-sequence. */ + scan += 2; + + /* Scan for the next "__" sequence. */ + while (*scan && (scan[0] != '_' || scan[1] != '_')) + scan++; + + /* Move to last "__" in this sequence. */ + while (*scan && *scan == '_') + scan++; + scan -= 2; + } + + /* Delete saved state. */ + delete_work_stuff (&work_init); + string_delete (&decl_init); + + return success; +} + +/* + +LOCAL FUNCTION + + demangle_prefix -- consume the mangled name prefix and find signature + +SYNOPSIS + + static int + demangle_prefix (struct work_stuff *work, const char **mangled, + string *declp); + +DESCRIPTION + + Consume and demangle the prefix of the mangled name. + While processing the function name root, arrange to call + demangle_signature if the root is ambiguous. + + DECLP points to the string buffer into which demangled output is + placed. On entry, the buffer is empty. On exit it contains + the root function name, the demangled operator name, or in some + special cases either nothing or the completely demangled result. + + MANGLED points to the current pointer into the mangled name. As each + token of the mangled name is consumed, it is updated. Upon entry + the current mangled name pointer points to the first character of + the mangled name. Upon exit, it should point to the first character + of the signature if demangling was successful, or to the first + unconsumed character if demangling of the prefix was unsuccessful. + + Returns 1 on success, 0 otherwise. + */ + +static int +demangle_prefix (struct work_stuff *work, const char **mangled, + string *declp) +{ + int success = 1; + const char *scan; + int i; + + if (strlen(*mangled) > 6 + && (strncmp(*mangled, "_imp__", 6) == 0 + || strncmp(*mangled, "__imp_", 6) == 0)) + { + /* it's a symbol imported from a PE dynamic library. Check for both + new style prefix _imp__ and legacy __imp_ used by older versions + of dlltool. */ + (*mangled) += 6; + work->dllimported = 1; + } + else if (strlen(*mangled) >= 11 && strncmp(*mangled, "_GLOBAL_", 8) == 0) + { + char *marker = strchr (cplus_markers, (*mangled)[8]); + if (marker != NULL && *marker == (*mangled)[10]) + { + if ((*mangled)[9] == 'D') + { + /* it's a GNU global destructor to be executed at program exit */ + (*mangled) += 11; + work->destructor = 2; + if (gnu_special (work, mangled, declp)) + return success; + } + else if ((*mangled)[9] == 'I') + { + /* it's a GNU global constructor to be executed at program init */ + (*mangled) += 11; + work->constructor = 2; + if (gnu_special (work, mangled, declp)) + return success; + } + } + } + else if ((ARM_DEMANGLING || HP_DEMANGLING || EDG_DEMANGLING) && strncmp(*mangled, "__std__", 7) == 0) + { + /* it's a ARM global destructor to be executed at program exit */ + (*mangled) += 7; + work->destructor = 2; + } + else if ((ARM_DEMANGLING || HP_DEMANGLING || EDG_DEMANGLING) && strncmp(*mangled, "__sti__", 7) == 0) + { + /* it's a ARM global constructor to be executed at program initial */ + (*mangled) += 7; + work->constructor = 2; + } + + /* This block of code is a reduction in strength time optimization + of: + scan = strstr (*mangled, "__"); */ + + { + scan = *mangled; + + do { + scan = strchr (scan, '_'); + } while (scan != NULL && *++scan != '_'); + + if (scan != NULL) --scan; + } + + if (scan != NULL) + { + /* We found a sequence of two or more '_', ensure that we start at + the last pair in the sequence. */ + i = strspn (scan, "_"); + if (i > 2) + { + scan += (i - 2); + } + } + + if (scan == NULL) + { + success = 0; + } + else if (work -> static_type) + { + if (!ISDIGIT ((unsigned char)scan[0]) && (scan[0] != 't')) + { + success = 0; + } + } + else if ((scan == *mangled) + && (ISDIGIT ((unsigned char)scan[2]) || (scan[2] == 'Q') + || (scan[2] == 't') || (scan[2] == 'K') || (scan[2] == 'H'))) + { + /* The ARM says nothing about the mangling of local variables. + But cfront mangles local variables by prepending __ + to them. As an extension to ARM demangling we handle this case. */ + if ((LUCID_DEMANGLING || ARM_DEMANGLING || HP_DEMANGLING) + && ISDIGIT ((unsigned char)scan[2])) + { + *mangled = scan + 2; + consume_count (mangled); + string_append (declp, *mangled); + *mangled += strlen (*mangled); + success = 1; + } + else + { + /* A GNU style constructor starts with __[0-9Qt]. But cfront uses + names like __Q2_3foo3bar for nested type names. So don't accept + this style of constructor for cfront demangling. A GNU + style member-template constructor starts with 'H'. */ + if (!(LUCID_DEMANGLING || ARM_DEMANGLING || HP_DEMANGLING || EDG_DEMANGLING)) + work -> constructor += 1; + *mangled = scan + 2; + } + } + else if (ARM_DEMANGLING && scan[2] == 'p' && scan[3] == 't') + { + /* Cfront-style parameterized type. Handled later as a signature. */ + success = 1; + + /* ARM template? */ + demangle_arm_hp_template (work, mangled, strlen (*mangled), declp); + } + else if (EDG_DEMANGLING && ((scan[2] == 't' && scan[3] == 'm') + || (scan[2] == 'p' && scan[3] == 's') + || (scan[2] == 'p' && scan[3] == 't'))) + { + /* EDG-style parameterized type. Handled later as a signature. */ + success = 1; + + /* EDG template? */ + demangle_arm_hp_template (work, mangled, strlen (*mangled), declp); + } + else if ((scan == *mangled) && !ISDIGIT ((unsigned char)scan[2]) + && (scan[2] != 't')) + { + /* Mangled name starts with "__". Skip over any leading '_' characters, + then find the next "__" that separates the prefix from the signature. + */ + if (!(ARM_DEMANGLING || LUCID_DEMANGLING || HP_DEMANGLING || EDG_DEMANGLING) + || (arm_special (mangled, declp) == 0)) + { + while (*scan == '_') + { + scan++; + } + if ((scan = strstr (scan, "__")) == NULL || (*(scan + 2) == '\0')) + { + /* No separator (I.E. "__not_mangled"), or empty signature + (I.E. "__not_mangled_either__") */ + success = 0; + } + else + return iterate_demangle_function (work, mangled, declp, scan); + } + } + else if (*(scan + 2) != '\0') + { + /* Mangled name does not start with "__" but does have one somewhere + in there with non empty stuff after it. Looks like a global + function name. Iterate over all "__":s until the right + one is found. */ + return iterate_demangle_function (work, mangled, declp, scan); + } + else + { + /* Doesn't look like a mangled name */ + success = 0; + } + + if (!success && (work->constructor == 2 || work->destructor == 2)) + { + string_append (declp, *mangled); + *mangled += strlen (*mangled); + success = 1; + } + return (success); +} + +/* + +LOCAL FUNCTION + + gnu_special -- special handling of gnu mangled strings + +SYNOPSIS + + static int + gnu_special (struct work_stuff *work, const char **mangled, + string *declp); + + +DESCRIPTION + + Process some special GNU style mangling forms that don't fit + the normal pattern. For example: + + _$_3foo (destructor for class foo) + _vt$foo (foo virtual table) + _vt$foo$bar (foo::bar virtual table) + __vt_foo (foo virtual table, new style with thunks) + _3foo$varname (static data member) + _Q22rs2tu$vw (static data member) + __t6vector1Zii (constructor with template) + __thunk_4__$_7ostream (virtual function thunk) + */ + +static int +gnu_special (struct work_stuff *work, const char **mangled, string *declp) +{ + int n; + int success = 1; + const char *p; + + if ((*mangled)[0] == '_' + && strchr (cplus_markers, (*mangled)[1]) != NULL + && (*mangled)[2] == '_') + { + /* Found a GNU style destructor, get past "__" */ + (*mangled) += 3; + work -> destructor += 1; + } + else if ((*mangled)[0] == '_' + && (((*mangled)[1] == '_' + && (*mangled)[2] == 'v' + && (*mangled)[3] == 't' + && (*mangled)[4] == '_') + || ((*mangled)[1] == 'v' + && (*mangled)[2] == 't' + && strchr (cplus_markers, (*mangled)[3]) != NULL))) + { + /* Found a GNU style virtual table, get past "_vt" + and create the decl. Note that we consume the entire mangled + input string, which means that demangle_signature has no work + to do. */ + if ((*mangled)[2] == 'v') + (*mangled) += 5; /* New style, with thunks: "__vt_" */ + else + (*mangled) += 4; /* Old style, no thunks: "_vt" */ + while (**mangled != '\0') + { + switch (**mangled) + { + case 'Q': + case 'K': + success = demangle_qualified (work, mangled, declp, 0, 1); + break; + case 't': + success = demangle_template (work, mangled, declp, 0, 1, + 1); + break; + default: + if (ISDIGIT((unsigned char)*mangled[0])) + { + n = consume_count(mangled); + /* We may be seeing a too-large size, or else a + "." indicating a static local symbol. In + any case, declare victory and move on; *don't* try + to use n to allocate. */ + if (n > (int) strlen (*mangled)) + { + success = 1; + break; + } + } + else + { + n = strcspn (*mangled, cplus_markers); + } + string_appendn (declp, *mangled, n); + (*mangled) += n; + } + + p = strpbrk (*mangled, cplus_markers); + if (success && ((p == NULL) || (p == *mangled))) + { + if (p != NULL) + { + string_append (declp, SCOPE_STRING (work)); + (*mangled)++; + } + } + else + { + success = 0; + break; + } + } + if (success) + string_append (declp, " virtual table"); + } + else if ((*mangled)[0] == '_' + && (strchr("0123456789Qt", (*mangled)[1]) != NULL) + && (p = strpbrk (*mangled, cplus_markers)) != NULL) + { + /* static data member, "_3foo$varname" for example */ + (*mangled)++; + switch (**mangled) + { + case 'Q': + case 'K': + success = demangle_qualified (work, mangled, declp, 0, 1); + break; + case 't': + success = demangle_template (work, mangled, declp, 0, 1, 1); + break; + default: + n = consume_count (mangled); + if (n < 0 || n > (long) strlen (*mangled)) + { + success = 0; + break; + } + + if (n > 10 && strncmp (*mangled, "_GLOBAL_", 8) == 0 + && (*mangled)[9] == 'N' + && (*mangled)[8] == (*mangled)[10] + && strchr (cplus_markers, (*mangled)[8])) + { + /* A member of the anonymous namespace. There's information + about what identifier or filename it was keyed to, but + it's just there to make the mangled name unique; we just + step over it. */ + string_append (declp, "{anonymous}"); + (*mangled) += n; + + /* Now p points to the marker before the N, so we need to + update it to the first marker after what we consumed. */ + p = strpbrk (*mangled, cplus_markers); + break; + } + + string_appendn (declp, *mangled, n); + (*mangled) += n; + } + if (success && (p == *mangled)) + { + /* Consumed everything up to the cplus_marker, append the + variable name. */ + (*mangled)++; + string_append (declp, SCOPE_STRING (work)); + n = strlen (*mangled); + string_appendn (declp, *mangled, n); + (*mangled) += n; + } + else + { + success = 0; + } + } + else if (strncmp (*mangled, "__thunk_", 8) == 0) + { + int delta; + + (*mangled) += 8; + delta = consume_count (mangled); + if (delta == -1) + success = 0; + else + { + char *method = internal_cplus_demangle (work, ++*mangled); + + if (method) + { + char buf[50]; + sprintf (buf, "virtual function thunk (delta:%d) for ", -delta); + string_append (declp, buf); + string_append (declp, method); + free (method); + n = strlen (*mangled); + (*mangled) += n; + } + else + { + success = 0; + } + } + } + else if (strncmp (*mangled, "__t", 3) == 0 + && ((*mangled)[3] == 'i' || (*mangled)[3] == 'f')) + { + p = (*mangled)[3] == 'i' ? " type_info node" : " type_info function"; + (*mangled) += 4; + switch (**mangled) + { + case 'Q': + case 'K': + success = demangle_qualified (work, mangled, declp, 0, 1); + break; + case 't': + success = demangle_template (work, mangled, declp, 0, 1, 1); + break; + default: + success = do_type (work, mangled, declp); + break; + } + if (success && **mangled != '\0') + success = 0; + if (success) + string_append (declp, p); + } + else + { + success = 0; + } + return (success); +} + +static void +recursively_demangle(struct work_stuff *work, const char **mangled, + string *result, int namelength) +{ + char * recurse = (char *)NULL; + char * recurse_dem = (char *)NULL; + + recurse = XNEWVEC (char, namelength + 1); + memcpy (recurse, *mangled, namelength); + recurse[namelength] = '\000'; + + recurse_dem = cplus_demangle (recurse, work->options); + + if (recurse_dem) + { + string_append (result, recurse_dem); + free (recurse_dem); + } + else + { + string_appendn (result, *mangled, namelength); + } + free (recurse); + *mangled += namelength; +} + +/* + +LOCAL FUNCTION + + arm_special -- special handling of ARM/lucid mangled strings + +SYNOPSIS + + static int + arm_special (const char **mangled, + string *declp); + + +DESCRIPTION + + Process some special ARM style mangling forms that don't fit + the normal pattern. For example: + + __vtbl__3foo (foo virtual table) + __vtbl__3foo__3bar (bar::foo virtual table) + + */ + +static int +arm_special (const char **mangled, string *declp) +{ + int n; + int success = 1; + const char *scan; + + if (strncmp (*mangled, ARM_VTABLE_STRING, ARM_VTABLE_STRLEN) == 0) + { + /* Found a ARM style virtual table, get past ARM_VTABLE_STRING + and create the decl. Note that we consume the entire mangled + input string, which means that demangle_signature has no work + to do. */ + scan = *mangled + ARM_VTABLE_STRLEN; + while (*scan != '\0') /* first check it can be demangled */ + { + n = consume_count (&scan); + if (n == -1) + { + return (0); /* no good */ + } + scan += n; + if (scan[0] == '_' && scan[1] == '_') + { + scan += 2; + } + } + (*mangled) += ARM_VTABLE_STRLEN; + while (**mangled != '\0') + { + n = consume_count (mangled); + if (n == -1 + || n > (long) strlen (*mangled)) + return 0; + string_prependn (declp, *mangled, n); + (*mangled) += n; + if ((*mangled)[0] == '_' && (*mangled)[1] == '_') + { + string_prepend (declp, "::"); + (*mangled) += 2; + } + } + string_append (declp, " virtual table"); + } + else + { + success = 0; + } + return (success); +} + +/* + +LOCAL FUNCTION + + demangle_qualified -- demangle 'Q' qualified name strings + +SYNOPSIS + + static int + demangle_qualified (struct work_stuff *, const char *mangled, + string *result, int isfuncname, int append); + +DESCRIPTION + + Demangle a qualified name, such as "Q25Outer5Inner" which is + the mangled form of "Outer::Inner". The demangled output is + prepended or appended to the result string according to the + state of the append flag. + + If isfuncname is nonzero, then the qualified name we are building + is going to be used as a member function name, so if it is a + constructor or destructor function, append an appropriate + constructor or destructor name. I.E. for the above example, + the result for use as a constructor is "Outer::Inner::Inner" + and the result for use as a destructor is "Outer::Inner::~Inner". + +BUGS + + Numeric conversion is ASCII dependent (FIXME). + + */ + +static int +demangle_qualified (struct work_stuff *work, const char **mangled, + string *result, int isfuncname, int append) +{ + int qualifiers = 0; + int success = 1; + char num[2]; + string temp; + string last_name; + int bindex = register_Btype (work); + + /* We only make use of ISFUNCNAME if the entity is a constructor or + destructor. */ + isfuncname = (isfuncname + && ((work->constructor & 1) || (work->destructor & 1))); + + string_init (&temp); + string_init (&last_name); + + if ((*mangled)[0] == 'K') + { + /* Squangling qualified name reuse */ + int idx; + (*mangled)++; + idx = consume_count_with_underscores (mangled); + if (idx == -1 || idx >= work -> numk) + success = 0; + else + string_append (&temp, work -> ktypevec[idx]); + } + else + switch ((*mangled)[1]) + { + case '_': + /* GNU mangled name with more than 9 classes. The count is preceded + by an underscore (to distinguish it from the <= 9 case) and followed + by an underscore. */ + (*mangled)++; + qualifiers = consume_count_with_underscores (mangled); + if (qualifiers == -1) + success = 0; + break; + + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + /* The count is in a single digit. */ + num[0] = (*mangled)[1]; + num[1] = '\0'; + qualifiers = atoi (num); + + /* If there is an underscore after the digit, skip it. This is + said to be for ARM-qualified names, but the ARM makes no + mention of such an underscore. Perhaps cfront uses one. */ + if ((*mangled)[2] == '_') + { + (*mangled)++; + } + (*mangled) += 2; + break; + + case '0': + default: + success = 0; + } + + if (!success) + return success; + + /* Pick off the names and collect them in the temp buffer in the order + in which they are found, separated by '::'. */ + + while (qualifiers-- > 0) + { + int remember_K = 1; + string_clear (&last_name); + + if (*mangled[0] == '_') + (*mangled)++; + + if (*mangled[0] == 't') + { + /* Here we always append to TEMP since we will want to use + the template name without the template parameters as a + constructor or destructor name. The appropriate + (parameter-less) value is returned by demangle_template + in LAST_NAME. We do not remember the template type here, + in order to match the G++ mangling algorithm. */ + success = demangle_template(work, mangled, &temp, + &last_name, 1, 0); + if (!success) + break; + } + else if (*mangled[0] == 'K') + { + int idx; + (*mangled)++; + idx = consume_count_with_underscores (mangled); + if (idx == -1 || idx >= work->numk) + success = 0; + else + string_append (&temp, work->ktypevec[idx]); + remember_K = 0; + + if (!success) break; + } + else + { + if (EDG_DEMANGLING) + { + int namelength; + /* Now recursively demangle the qualifier + * This is necessary to deal with templates in + * mangling styles like EDG */ + namelength = consume_count (mangled); + if (namelength == -1) + { + success = 0; + break; + } + recursively_demangle(work, mangled, &temp, namelength); + } + else + { + string_delete (&last_name); + success = do_type (work, mangled, &last_name); + if (!success) + break; + string_appends (&temp, &last_name); + } + } + + if (remember_K) + remember_Ktype (work, temp.b, LEN_STRING (&temp)); + + if (qualifiers > 0) + string_append (&temp, SCOPE_STRING (work)); + } + + remember_Btype (work, temp.b, LEN_STRING (&temp), bindex); + + /* If we are using the result as a function name, we need to append + the appropriate '::' separated constructor or destructor name. + We do this here because this is the most convenient place, where + we already have a pointer to the name and the length of the name. */ + + if (isfuncname) + { + string_append (&temp, SCOPE_STRING (work)); + if (work -> destructor & 1) + string_append (&temp, "~"); + string_appends (&temp, &last_name); + } + + /* Now either prepend the temp buffer to the result, or append it, + depending upon the state of the append flag. */ + + if (append) + string_appends (result, &temp); + else + { + if (!STRING_EMPTY (result)) + string_append (&temp, SCOPE_STRING (work)); + string_prepends (result, &temp); + } + + string_delete (&last_name); + string_delete (&temp); + return (success); +} + +/* + +LOCAL FUNCTION + + get_count -- convert an ascii count to integer, consuming tokens + +SYNOPSIS + + static int + get_count (const char **type, int *count) + +DESCRIPTION + + Assume that *type points at a count in a mangled name; set + *count to its value, and set *type to the next character after + the count. There are some weird rules in effect here. + + If *type does not point at a string of digits, return zero. + + If *type points at a string of digits followed by an + underscore, set *count to their value as an integer, advance + *type to point *after the underscore, and return 1. + + If *type points at a string of digits not followed by an + underscore, consume only the first digit. Set *count to its + value as an integer, leave *type pointing after that digit, + and return 1. + + The excuse for this odd behavior: in the ARM and HP demangling + styles, a type can be followed by a repeat count of the form + `Nxy', where: + + `x' is a single digit specifying how many additional copies + of the type to append to the argument list, and + + `y' is one or more digits, specifying the zero-based index of + the first repeated argument in the list. Yes, as you're + unmangling the name you can figure this out yourself, but + it's there anyway. + + So, for example, in `bar__3fooFPiN51', the first argument is a + pointer to an integer (`Pi'), and then the next five arguments + are the same (`N5'), and the first repeat is the function's + second argument (`1'). +*/ + +static int +get_count (const char **type, int *count) +{ + const char *p; + int n; + + if (!ISDIGIT ((unsigned char)**type)) + return (0); + else + { + *count = **type - '0'; + (*type)++; + if (ISDIGIT ((unsigned char)**type)) + { + p = *type; + n = *count; + do + { + n *= 10; + n += *p - '0'; + p++; + } + while (ISDIGIT ((unsigned char)*p)); + if (*p == '_') + { + *type = p + 1; + *count = n; + } + } + } + return (1); +} + +/* RESULT will be initialised here; it will be freed on failure. The + value returned is really a type_kind_t. */ + +static int +do_type (struct work_stuff *work, const char **mangled, string *result) +{ + int n; + int done; + int success; + string decl; + const char *remembered_type; + int type_quals; + type_kind_t tk = tk_none; + + string_init (&decl); + string_init (result); + + done = 0; + success = 1; + while (success && !done) + { + int member; + switch (**mangled) + { + + /* A pointer type */ + case 'P': + case 'p': + (*mangled)++; + if (! (work -> options & DMGL_JAVA)) + string_prepend (&decl, "*"); + if (tk == tk_none) + tk = tk_pointer; + break; + + /* A reference type */ + case 'R': + (*mangled)++; + string_prepend (&decl, "&"); + if (tk == tk_none) + tk = tk_reference; + break; + + /* An array */ + case 'A': + { + ++(*mangled); + if (!STRING_EMPTY (&decl) + && (decl.b[0] == '*' || decl.b[0] == '&')) + { + string_prepend (&decl, "("); + string_append (&decl, ")"); + } + string_append (&decl, "["); + if (**mangled != '_') + success = demangle_template_value_parm (work, mangled, &decl, + tk_integral); + if (**mangled == '_') + ++(*mangled); + string_append (&decl, "]"); + break; + } + + /* A back reference to a previously seen type */ + case 'T': + (*mangled)++; + if (!get_count (mangled, &n) || n >= work -> ntypes) + { + success = 0; + } + else + { + remembered_type = work -> typevec[n]; + mangled = &remembered_type; + } + break; + + /* A function */ + case 'F': + (*mangled)++; + if (!STRING_EMPTY (&decl) + && (decl.b[0] == '*' || decl.b[0] == '&')) + { + string_prepend (&decl, "("); + string_append (&decl, ")"); + } + /* After picking off the function args, we expect to either find the + function return type (preceded by an '_') or the end of the + string. */ + if (!demangle_nested_args (work, mangled, &decl) + || (**mangled != '_' && **mangled != '\0')) + { + success = 0; + break; + } + if (success && (**mangled == '_')) + (*mangled)++; + break; + + case 'M': + case 'O': + { + type_quals = TYPE_UNQUALIFIED; + + member = **mangled == 'M'; + (*mangled)++; + + string_append (&decl, ")"); + + /* We don't need to prepend `::' for a qualified name; + demangle_qualified will do that for us. */ + if (**mangled != 'Q') + string_prepend (&decl, SCOPE_STRING (work)); + + if (ISDIGIT ((unsigned char)**mangled)) + { + n = consume_count (mangled); + if (n == -1 + || (int) strlen (*mangled) < n) + { + success = 0; + break; + } + string_prependn (&decl, *mangled, n); + *mangled += n; + } + else if (**mangled == 'X' || **mangled == 'Y') + { + string temp; + do_type (work, mangled, &temp); + string_prepends (&decl, &temp); + string_delete (&temp); + } + else if (**mangled == 't') + { + string temp; + string_init (&temp); + success = demangle_template (work, mangled, &temp, + NULL, 1, 1); + if (success) + { + string_prependn (&decl, temp.b, temp.p - temp.b); + string_delete (&temp); + } + else + break; + } + else if (**mangled == 'Q') + { + success = demangle_qualified (work, mangled, &decl, + /*isfuncnam=*/0, + /*append=*/0); + if (!success) + break; + } + else + { + success = 0; + break; + } + + string_prepend (&decl, "("); + if (member) + { + switch (**mangled) + { + case 'C': + case 'V': + case 'u': + type_quals |= code_for_qualifier (**mangled); + (*mangled)++; + break; + + default: + break; + } + + if (*(*mangled)++ != 'F') + { + success = 0; + break; + } + } + if ((member && !demangle_nested_args (work, mangled, &decl)) + || **mangled != '_') + { + success = 0; + break; + } + (*mangled)++; + if (! PRINT_ANSI_QUALIFIERS) + { + break; + } + if (type_quals != TYPE_UNQUALIFIED) + { + APPEND_BLANK (&decl); + string_append (&decl, qualifier_string (type_quals)); + } + break; + } + case 'G': + (*mangled)++; + break; + + case 'C': + case 'V': + case 'u': + if (PRINT_ANSI_QUALIFIERS) + { + if (!STRING_EMPTY (&decl)) + string_prepend (&decl, " "); + + string_prepend (&decl, demangle_qualifier (**mangled)); + } + (*mangled)++; + break; + /* + } + */ + + /* fall through */ + default: + done = 1; + break; + } + } + + if (success) switch (**mangled) + { + /* A qualified name, such as "Outer::Inner". */ + case 'Q': + case 'K': + { + success = demangle_qualified (work, mangled, result, 0, 1); + break; + } + + /* A back reference to a previously seen squangled type */ + case 'B': + (*mangled)++; + if (!get_count (mangled, &n) || n >= work -> numb) + success = 0; + else + string_append (result, work->btypevec[n]); + break; + + case 'X': + case 'Y': + /* A template parm. We substitute the corresponding argument. */ + { + int idx; + + (*mangled)++; + idx = consume_count_with_underscores (mangled); + + if (idx == -1 + || (work->tmpl_argvec && idx >= work->ntmpl_args) + || consume_count_with_underscores (mangled) == -1) + { + success = 0; + break; + } + + if (work->tmpl_argvec) + string_append (result, work->tmpl_argvec[idx]); + else + string_append_template_idx (result, idx); + + success = 1; + } + break; + + default: + success = demangle_fund_type (work, mangled, result); + if (tk == tk_none) + tk = (type_kind_t) success; + break; + } + + if (success) + { + if (!STRING_EMPTY (&decl)) + { + string_append (result, " "); + string_appends (result, &decl); + } + } + else + string_delete (result); + string_delete (&decl); + + if (success) + /* Assume an integral type, if we're not sure. */ + return (int) ((tk == tk_none) ? tk_integral : tk); + else + return 0; +} + +/* Given a pointer to a type string that represents a fundamental type + argument (int, long, unsigned int, etc) in TYPE, a pointer to the + string in which the demangled output is being built in RESULT, and + the WORK structure, decode the types and add them to the result. + + For example: + + "Ci" => "const int" + "Sl" => "signed long" + "CUs" => "const unsigned short" + + The value returned is really a type_kind_t. */ + +static int +demangle_fund_type (struct work_stuff *work, + const char **mangled, string *result) +{ + int done = 0; + int success = 1; + char buf[INTBUF_SIZE + 5 /* 'int%u_t' */]; + unsigned int dec = 0; + type_kind_t tk = tk_integral; + + /* First pick off any type qualifiers. There can be more than one. */ + + while (!done) + { + switch (**mangled) + { + case 'C': + case 'V': + case 'u': + if (PRINT_ANSI_QUALIFIERS) + { + if (!STRING_EMPTY (result)) + string_prepend (result, " "); + string_prepend (result, demangle_qualifier (**mangled)); + } + (*mangled)++; + break; + case 'U': + (*mangled)++; + APPEND_BLANK (result); + string_append (result, "unsigned"); + break; + case 'S': /* signed char only */ + (*mangled)++; + APPEND_BLANK (result); + string_append (result, "signed"); + break; + case 'J': + (*mangled)++; + APPEND_BLANK (result); + string_append (result, "__complex"); + break; + default: + done = 1; + break; + } + } + + /* Now pick off the fundamental type. There can be only one. */ + + switch (**mangled) + { + case '\0': + case '_': + break; + case 'v': + (*mangled)++; + APPEND_BLANK (result); + string_append (result, "void"); + break; + case 'x': + (*mangled)++; + APPEND_BLANK (result); + string_append (result, "long long"); + break; + case 'l': + (*mangled)++; + APPEND_BLANK (result); + string_append (result, "long"); + break; + case 'i': + (*mangled)++; + APPEND_BLANK (result); + string_append (result, "int"); + break; + case 's': + (*mangled)++; + APPEND_BLANK (result); + string_append (result, "short"); + break; + case 'b': + (*mangled)++; + APPEND_BLANK (result); + string_append (result, "bool"); + tk = tk_bool; + break; + case 'c': + (*mangled)++; + APPEND_BLANK (result); + string_append (result, "char"); + tk = tk_char; + break; + case 'w': + (*mangled)++; + APPEND_BLANK (result); + string_append (result, "wchar_t"); + tk = tk_char; + break; + case 'r': + (*mangled)++; + APPEND_BLANK (result); + string_append (result, "long double"); + tk = tk_real; + break; + case 'd': + (*mangled)++; + APPEND_BLANK (result); + string_append (result, "double"); + tk = tk_real; + break; + case 'f': + (*mangled)++; + APPEND_BLANK (result); + string_append (result, "float"); + tk = tk_real; + break; + case 'G': + (*mangled)++; + if (!ISDIGIT ((unsigned char)**mangled)) + { + success = 0; + break; + } + case 'I': + (*mangled)++; + if (**mangled == '_') + { + int i; + (*mangled)++; + for (i = 0; + i < (long) sizeof (buf) - 1 && **mangled && **mangled != '_'; + (*mangled)++, i++) + buf[i] = **mangled; + if (**mangled != '_') + { + success = 0; + break; + } + buf[i] = '\0'; + (*mangled)++; + } + else + { + strncpy (buf, *mangled, 2); + buf[2] = '\0'; + *mangled += min (strlen (*mangled), 2); + } + sscanf (buf, "%x", &dec); + sprintf (buf, "int%u_t", dec); + APPEND_BLANK (result); + string_append (result, buf); + break; + + /* fall through */ + /* An explicit type, such as "6mytype" or "7integer" */ + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + int bindex = register_Btype (work); + string btype; + string_init (&btype); + if (demangle_class_name (work, mangled, &btype)) { + remember_Btype (work, btype.b, LEN_STRING (&btype), bindex); + APPEND_BLANK (result); + string_appends (result, &btype); + } + else + success = 0; + string_delete (&btype); + break; + } + case 't': + { + string btype; + string_init (&btype); + success = demangle_template (work, mangled, &btype, 0, 1, 1); + string_appends (result, &btype); + string_delete (&btype); + break; + } + default: + success = 0; + break; + } + + return success ? ((int) tk) : 0; +} + + +/* Handle a template's value parameter for HP aCC (extension from ARM) + **mangled points to 'S' or 'U' */ + +static int +do_hpacc_template_const_value (struct work_stuff *work ATTRIBUTE_UNUSED, + const char **mangled, string *result) +{ + int unsigned_const; + + if (**mangled != 'U' && **mangled != 'S') + return 0; + + unsigned_const = (**mangled == 'U'); + + (*mangled)++; + + switch (**mangled) + { + case 'N': + string_append (result, "-"); + /* fall through */ + case 'P': + (*mangled)++; + break; + case 'M': + /* special case for -2^31 */ + string_append (result, "-2147483648"); + (*mangled)++; + return 1; + default: + return 0; + } + + /* We have to be looking at an integer now */ + if (!(ISDIGIT ((unsigned char)**mangled))) + return 0; + + /* We only deal with integral values for template + parameters -- so it's OK to look only for digits */ + while (ISDIGIT ((unsigned char)**mangled)) + { + char_str[0] = **mangled; + string_append (result, char_str); + (*mangled)++; + } + + if (unsigned_const) + string_append (result, "U"); + + /* FIXME? Some day we may have 64-bit (or larger :-) ) constants + with L or LL suffixes. pai/1997-09-03 */ + + return 1; /* success */ +} + +/* Handle a template's literal parameter for HP aCC (extension from ARM) + **mangled is pointing to the 'A' */ + +static int +do_hpacc_template_literal (struct work_stuff *work, const char **mangled, + string *result) +{ + int literal_len = 0; + char * recurse; + char * recurse_dem; + + if (**mangled != 'A') + return 0; + + (*mangled)++; + + literal_len = consume_count (mangled); + + if (literal_len <= 0) + return 0; + + /* Literal parameters are names of arrays, functions, etc. and the + canonical representation uses the address operator */ + string_append (result, "&"); + + /* Now recursively demangle the literal name */ + recurse = XNEWVEC (char, literal_len + 1); + memcpy (recurse, *mangled, literal_len); + recurse[literal_len] = '\000'; + + recurse_dem = cplus_demangle (recurse, work->options); + + if (recurse_dem) + { + string_append (result, recurse_dem); + free (recurse_dem); + } + else + { + string_appendn (result, *mangled, literal_len); + } + (*mangled) += literal_len; + free (recurse); + + return 1; +} + +static int +snarf_numeric_literal (const char **args, string *arg) +{ + if (**args == '-') + { + char_str[0] = '-'; + string_append (arg, char_str); + (*args)++; + } + else if (**args == '+') + (*args)++; + + if (!ISDIGIT ((unsigned char)**args)) + return 0; + + while (ISDIGIT ((unsigned char)**args)) + { + char_str[0] = **args; + string_append (arg, char_str); + (*args)++; + } + + return 1; +} + +/* Demangle the next argument, given by MANGLED into RESULT, which + *should be an uninitialized* string. It will be initialized here, + and free'd should anything go wrong. */ + +static int +do_arg (struct work_stuff *work, const char **mangled, string *result) +{ + /* Remember where we started so that we can record the type, for + non-squangling type remembering. */ + const char *start = *mangled; + + string_init (result); + + if (work->nrepeats > 0) + { + --work->nrepeats; + + if (work->previous_argument == 0) + return 0; + + /* We want to reissue the previous type in this argument list. */ + string_appends (result, work->previous_argument); + return 1; + } + + if (**mangled == 'n') + { + /* A squangling-style repeat. */ + (*mangled)++; + work->nrepeats = consume_count(mangled); + + if (work->nrepeats <= 0) + /* This was not a repeat count after all. */ + return 0; + + if (work->nrepeats > 9) + { + if (**mangled != '_') + /* The repeat count should be followed by an '_' in this + case. */ + return 0; + else + (*mangled)++; + } + + /* Now, the repeat is all set up. */ + return do_arg (work, mangled, result); + } + + /* Save the result in WORK->previous_argument so that we can find it + if it's repeated. Note that saving START is not good enough: we + do not want to add additional types to the back-referenceable + type vector when processing a repeated type. */ + if (work->previous_argument) + string_delete (work->previous_argument); + else + work->previous_argument = XNEW (string); + + if (!do_type (work, mangled, work->previous_argument)) + return 0; + + string_appends (result, work->previous_argument); + + remember_type (work, start, *mangled - start); + return 1; +} + +static void +remember_type (struct work_stuff *work, const char *start, int len) +{ + char *tem; + + if (work->forgetting_types) + return; + + if (work -> ntypes >= work -> typevec_size) + { + if (work -> typevec_size == 0) + { + work -> typevec_size = 3; + work -> typevec = XNEWVEC (char *, work->typevec_size); + } + else + { + work -> typevec_size *= 2; + work -> typevec + = XRESIZEVEC (char *, work->typevec, work->typevec_size); + } + } + tem = XNEWVEC (char, len + 1); + memcpy (tem, start, len); + tem[len] = '\0'; + work -> typevec[work -> ntypes++] = tem; +} + + +/* Remember a K type class qualifier. */ +static void +remember_Ktype (struct work_stuff *work, const char *start, int len) +{ + char *tem; + + if (work -> numk >= work -> ksize) + { + if (work -> ksize == 0) + { + work -> ksize = 5; + work -> ktypevec = XNEWVEC (char *, work->ksize); + } + else + { + work -> ksize *= 2; + work -> ktypevec + = XRESIZEVEC (char *, work->ktypevec, work->ksize); + } + } + tem = XNEWVEC (char, len + 1); + memcpy (tem, start, len); + tem[len] = '\0'; + work -> ktypevec[work -> numk++] = tem; +} + +/* Register a B code, and get an index for it. B codes are registered + as they are seen, rather than as they are completed, so map > + registers map > as B0, and temp as B1 */ + +static int +register_Btype (struct work_stuff *work) +{ + int ret; + + if (work -> numb >= work -> bsize) + { + if (work -> bsize == 0) + { + work -> bsize = 5; + work -> btypevec = XNEWVEC (char *, work->bsize); + } + else + { + work -> bsize *= 2; + work -> btypevec + = XRESIZEVEC (char *, work->btypevec, work->bsize); + } + } + ret = work -> numb++; + work -> btypevec[ret] = NULL; + return(ret); +} + +/* Store a value into a previously registered B code type. */ + +static void +remember_Btype (struct work_stuff *work, const char *start, + int len, int index) +{ + char *tem; + + tem = XNEWVEC (char, len + 1); + memcpy (tem, start, len); + tem[len] = '\0'; + work -> btypevec[index] = tem; +} + +/* Lose all the info related to B and K type codes. */ +static void +forget_B_and_K_types (struct work_stuff *work) +{ + int i; + + while (work -> numk > 0) + { + i = --(work -> numk); + if (work -> ktypevec[i] != NULL) + { + free (work -> ktypevec[i]); + work -> ktypevec[i] = NULL; + } + } + + while (work -> numb > 0) + { + i = --(work -> numb); + if (work -> btypevec[i] != NULL) + { + free (work -> btypevec[i]); + work -> btypevec[i] = NULL; + } + } +} +/* Forget the remembered types, but not the type vector itself. */ + +static void +forget_types (struct work_stuff *work) +{ + int i; + + while (work -> ntypes > 0) + { + i = --(work -> ntypes); + if (work -> typevec[i] != NULL) + { + free (work -> typevec[i]); + work -> typevec[i] = NULL; + } + } +} + +/* Process the argument list part of the signature, after any class spec + has been consumed, as well as the first 'F' character (if any). For + example: + + "__als__3fooRT0" => process "RT0" + "complexfunc5__FPFPc_PFl_i" => process "PFPc_PFl_i" + + DECLP must be already initialised, usually non-empty. It won't be freed + on failure. + + Note that g++ differs significantly from ARM and lucid style mangling + with regards to references to previously seen types. For example, given + the source fragment: + + class foo { + public: + foo::foo (int, foo &ia, int, foo &ib, int, foo &ic); + }; + + foo::foo (int, foo &ia, int, foo &ib, int, foo &ic) { ia = ib = ic; } + void foo (int, foo &ia, int, foo &ib, int, foo &ic) { ia = ib = ic; } + + g++ produces the names: + + __3fooiRT0iT2iT2 + foo__FiR3fooiT1iT1 + + while lcc (and presumably other ARM style compilers as well) produces: + + foo__FiR3fooT1T2T1T2 + __ct__3fooFiR3fooT1T2T1T2 + + Note that g++ bases its type numbers starting at zero and counts all + previously seen types, while lucid/ARM bases its type numbers starting + at one and only considers types after it has seen the 'F' character + indicating the start of the function args. For lucid/ARM style, we + account for this difference by discarding any previously seen types when + we see the 'F' character, and subtracting one from the type number + reference. + + */ + +static int +demangle_args (struct work_stuff *work, const char **mangled, + string *declp) +{ + string arg; + int need_comma = 0; + int r; + int t; + const char *tem; + char temptype; + + if (PRINT_ARG_TYPES) + { + string_append (declp, "("); + if (**mangled == '\0') + { + string_append (declp, "void"); + } + } + + while ((**mangled != '_' && **mangled != '\0' && **mangled != 'e') + || work->nrepeats > 0) + { + if ((**mangled == 'N') || (**mangled == 'T')) + { + temptype = *(*mangled)++; + + if (temptype == 'N') + { + if (!get_count (mangled, &r)) + { + return (0); + } + } + else + { + r = 1; + } + if ((HP_DEMANGLING || ARM_DEMANGLING || EDG_DEMANGLING) && work -> ntypes >= 10) + { + /* If we have 10 or more types we might have more than a 1 digit + index so we'll have to consume the whole count here. This + will lose if the next thing is a type name preceded by a + count but it's impossible to demangle that case properly + anyway. Eg if we already have 12 types is T12Pc "(..., type1, + Pc, ...)" or "(..., type12, char *, ...)" */ + if ((t = consume_count(mangled)) <= 0) + { + return (0); + } + } + else + { + if (!get_count (mangled, &t)) + { + return (0); + } + } + if (LUCID_DEMANGLING || ARM_DEMANGLING || HP_DEMANGLING || EDG_DEMANGLING) + { + t--; + } + /* Validate the type index. Protect against illegal indices from + malformed type strings. */ + if ((t < 0) || (t >= work -> ntypes)) + { + return (0); + } + while (work->nrepeats > 0 || --r >= 0) + { + tem = work -> typevec[t]; + if (need_comma && PRINT_ARG_TYPES) + { + string_append (declp, ", "); + } + if (!do_arg (work, &tem, &arg)) + { + return (0); + } + if (PRINT_ARG_TYPES) + { + string_appends (declp, &arg); + } + string_delete (&arg); + need_comma = 1; + } + } + else + { + if (need_comma && PRINT_ARG_TYPES) + string_append (declp, ", "); + if (!do_arg (work, mangled, &arg)) + return (0); + if (PRINT_ARG_TYPES) + string_appends (declp, &arg); + string_delete (&arg); + need_comma = 1; + } + } + + if (**mangled == 'e') + { + (*mangled)++; + if (PRINT_ARG_TYPES) + { + if (need_comma) + { + string_append (declp, ","); + } + string_append (declp, "..."); + } + } + + if (PRINT_ARG_TYPES) + { + string_append (declp, ")"); + } + return (1); +} + +/* Like demangle_args, but for demangling the argument lists of function + and method pointers or references, not top-level declarations. */ + +static int +demangle_nested_args (struct work_stuff *work, const char **mangled, + string *declp) +{ + string* saved_previous_argument; + int result; + int saved_nrepeats; + + /* The G++ name-mangling algorithm does not remember types on nested + argument lists, unless -fsquangling is used, and in that case the + type vector updated by remember_type is not used. So, we turn + off remembering of types here. */ + ++work->forgetting_types; + + /* For the repeat codes used with -fsquangling, we must keep track of + the last argument. */ + saved_previous_argument = work->previous_argument; + saved_nrepeats = work->nrepeats; + work->previous_argument = 0; + work->nrepeats = 0; + + /* Actually demangle the arguments. */ + result = demangle_args (work, mangled, declp); + + /* Restore the previous_argument field. */ + if (work->previous_argument) + { + string_delete (work->previous_argument); + free ((char *) work->previous_argument); + } + work->previous_argument = saved_previous_argument; + --work->forgetting_types; + work->nrepeats = saved_nrepeats; + + return result; +} + +static void +demangle_function_name (struct work_stuff *work, const char **mangled, + string *declp, const char *scan) +{ + size_t i; + string type; + const char *tem; + + string_appendn (declp, (*mangled), scan - (*mangled)); + string_need (declp, 1); + *(declp -> p) = '\0'; + + /* Consume the function name, including the "__" separating the name + from the signature. We are guaranteed that SCAN points to the + separator. */ + + (*mangled) = scan + 2; + /* We may be looking at an instantiation of a template function: + foo__Xt1t2_Ft3t4, where t1, t2, ... are template arguments and a + following _F marks the start of the function arguments. Handle + the template arguments first. */ + + if (HP_DEMANGLING && (**mangled == 'X')) + { + demangle_arm_hp_template (work, mangled, 0, declp); + /* This leaves MANGLED pointing to the 'F' marking func args */ + } + + if (LUCID_DEMANGLING || ARM_DEMANGLING || HP_DEMANGLING || EDG_DEMANGLING) + { + + /* See if we have an ARM style constructor or destructor operator. + If so, then just record it, clear the decl, and return. + We can't build the actual constructor/destructor decl until later, + when we recover the class name from the signature. */ + + if (strcmp (declp -> b, "__ct") == 0) + { + work -> constructor += 1; + string_clear (declp); + return; + } + else if (strcmp (declp -> b, "__dt") == 0) + { + work -> destructor += 1; + string_clear (declp); + return; + } + } + + if (declp->p - declp->b >= 3 + && declp->b[0] == 'o' + && declp->b[1] == 'p' + && strchr (cplus_markers, declp->b[2]) != NULL) + { + /* see if it's an assignment expression */ + if (declp->p - declp->b >= 10 /* op$assign_ */ + && memcmp (declp->b + 3, "assign_", 7) == 0) + { + for (i = 0; i < ARRAY_SIZE (optable); i++) + { + int len = declp->p - declp->b - 10; + if ((int) strlen (optable[i].in) == len + && memcmp (optable[i].in, declp->b + 10, len) == 0) + { + string_clear (declp); + string_append (declp, "operator"); + string_append (declp, optable[i].out); + string_append (declp, "="); + break; + } + } + } + else + { + for (i = 0; i < ARRAY_SIZE (optable); i++) + { + int len = declp->p - declp->b - 3; + if ((int) strlen (optable[i].in) == len + && memcmp (optable[i].in, declp->b + 3, len) == 0) + { + string_clear (declp); + string_append (declp, "operator"); + string_append (declp, optable[i].out); + break; + } + } + } + } + else if (declp->p - declp->b >= 5 && memcmp (declp->b, "type", 4) == 0 + && strchr (cplus_markers, declp->b[4]) != NULL) + { + /* type conversion operator */ + tem = declp->b + 5; + if (do_type (work, &tem, &type)) + { + string_clear (declp); + string_append (declp, "operator "); + string_appends (declp, &type); + string_delete (&type); + } + } + else if (declp->b[0] == '_' && declp->b[1] == '_' + && declp->b[2] == 'o' && declp->b[3] == 'p') + { + /* ANSI. */ + /* type conversion operator. */ + tem = declp->b + 4; + if (do_type (work, &tem, &type)) + { + string_clear (declp); + string_append (declp, "operator "); + string_appends (declp, &type); + string_delete (&type); + } + } + else if (declp->b[0] == '_' && declp->b[1] == '_' + && ISLOWER((unsigned char)declp->b[2]) + && ISLOWER((unsigned char)declp->b[3])) + { + if (declp->b[4] == '\0') + { + /* Operator. */ + for (i = 0; i < ARRAY_SIZE (optable); i++) + { + if (strlen (optable[i].in) == 2 + && memcmp (optable[i].in, declp->b + 2, 2) == 0) + { + string_clear (declp); + string_append (declp, "operator"); + string_append (declp, optable[i].out); + break; + } + } + } + else + { + if (declp->b[2] == 'a' && declp->b[5] == '\0') + { + /* Assignment. */ + for (i = 0; i < ARRAY_SIZE (optable); i++) + { + if (strlen (optable[i].in) == 3 + && memcmp (optable[i].in, declp->b + 2, 3) == 0) + { + string_clear (declp); + string_append (declp, "operator"); + string_append (declp, optable[i].out); + break; + } + } + } + } + } +} + +/* a mini string-handling package */ + +static void +string_need (string *s, int n) +{ + int tem; + + if (s->b == NULL) + { + if (n < 32) + { + n = 32; + } + s->p = s->b = XNEWVEC (char, n); + s->e = s->b + n; + } + else if (s->e - s->p < n) + { + tem = s->p - s->b; + n += tem; + n *= 2; + s->b = XRESIZEVEC (char, s->b, n); + s->p = s->b + tem; + s->e = s->b + n; + } +} + +static void +string_delete (string *s) +{ + if (s->b != NULL) + { + free (s->b); + s->b = s->e = s->p = NULL; + } +} + +static void +string_init (string *s) +{ + s->b = s->p = s->e = NULL; +} + +static void +string_clear (string *s) +{ + s->p = s->b; +} + +#if 0 + +static int +string_empty (string *s) +{ + return (s->b == s->p); +} + +#endif + +static void +string_append (string *p, const char *s) +{ + int n; + if (s == NULL || *s == '\0') + return; + n = strlen (s); + string_need (p, n); + memcpy (p->p, s, n); + p->p += n; +} + +static void +string_appends (string *p, string *s) +{ + int n; + + if (s->b != s->p) + { + n = s->p - s->b; + string_need (p, n); + memcpy (p->p, s->b, n); + p->p += n; + } +} + +static void +string_appendn (string *p, const char *s, int n) +{ + if (n != 0) + { + string_need (p, n); + memcpy (p->p, s, n); + p->p += n; + } +} + +static void +string_prepend (string *p, const char *s) +{ + if (s != NULL && *s != '\0') + { + string_prependn (p, s, strlen (s)); + } +} + +static void +string_prepends (string *p, string *s) +{ + if (s->b != s->p) + { + string_prependn (p, s->b, s->p - s->b); + } +} + +static void +string_prependn (string *p, const char *s, int n) +{ + char *q; + + if (n != 0) + { + string_need (p, n); + for (q = p->p - 1; q >= p->b; q--) + { + q[n] = q[0]; + } + memcpy (p->b, s, n); + p->p += n; + } +} + +static void +string_append_template_idx (string *s, int idx) +{ + char buf[INTBUF_SIZE + 1 /* 'T' */]; + sprintf(buf, "T%d", idx); + string_append (s, buf); +} diff --git a/libiberty/dyn-string.c b/libiberty/dyn-string.c new file mode 100644 index 0000000..9de50ed --- /dev/null +++ b/libiberty/dyn-string.c @@ -0,0 +1,397 @@ +/* An abstract string datatype. + Copyright (C) 1998, 1999, 2000, 2002, 2004 Free Software Foundation, Inc. + Contributed by Mark Mitchell (mark@markmitchell.com). + +This file is part of GNU CC. + +GNU CC 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. + +In addition to the permissions in the GNU General Public License, the +Free Software Foundation gives you unlimited permission to link the +compiled version of this file into combinations with other programs, +and to distribute those combinations without any restriction coming +from the use of this file. (The General Public License restrictions +do apply in other respects; for example, they cover modification of +the file, and distribution when not linked into a combined +executable.) + +GNU CC 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 GNU CC; see the file COPYING. If not, write to +the Free Software Foundation, 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#ifdef HAVE_STRING_H +#include +#endif + +#ifdef HAVE_STDLIB_H +#include +#endif + +#include "libiberty.h" +#include "dyn-string.h" + +/* Performs in-place initialization of a dyn_string struct. This + function can be used with a dyn_string struct on the stack or + embedded in another object. The contents of of the string itself + are still dynamically allocated. The string initially is capable + of holding at least SPACE characeters, including the terminating + NUL. If SPACE is 0, it will silently be increated to 1. + + If RETURN_ON_ALLOCATION_FAILURE is defined and memory allocation + fails, returns 0. Otherwise returns 1. */ + +int +dyn_string_init (struct dyn_string *ds_struct_ptr, int space) +{ + /* We need at least one byte in which to store the terminating NUL. */ + if (space == 0) + space = 1; + +#ifdef RETURN_ON_ALLOCATION_FAILURE + ds_struct_ptr->s = (char *) malloc (space); + if (ds_struct_ptr->s == NULL) + return 0; +#else + ds_struct_ptr->s = XNEWVEC (char, space); +#endif + ds_struct_ptr->allocated = space; + ds_struct_ptr->length = 0; + ds_struct_ptr->s[0] = '\0'; + + return 1; +} + +/* Create a new dynamic string capable of holding at least SPACE + characters, including the terminating NUL. If SPACE is 0, it will + be silently increased to 1. If RETURN_ON_ALLOCATION_FAILURE is + defined and memory allocation fails, returns NULL. Otherwise + returns the newly allocated string. */ + +dyn_string_t +dyn_string_new (int space) +{ + dyn_string_t result; +#ifdef RETURN_ON_ALLOCATION_FAILURE + result = (dyn_string_t) malloc (sizeof (struct dyn_string)); + if (result == NULL) + return NULL; + if (!dyn_string_init (result, space)) + { + free (result); + return NULL; + } +#else + result = XNEW (struct dyn_string); + dyn_string_init (result, space); +#endif + return result; +} + +/* Free the memory used by DS. */ + +void +dyn_string_delete (dyn_string_t ds) +{ + free (ds->s); + free (ds); +} + +/* Returns the contents of DS in a buffer allocated with malloc. It + is the caller's responsibility to deallocate the buffer using free. + DS is then set to the empty string. Deletes DS itself. */ + +char* +dyn_string_release (dyn_string_t ds) +{ + /* Store the old buffer. */ + char* result = ds->s; + /* The buffer is no longer owned by DS. */ + ds->s = NULL; + /* Delete DS. */ + free (ds); + /* Return the old buffer. */ + return result; +} + +/* Increase the capacity of DS so it can hold at least SPACE + characters, plus the terminating NUL. This function will not (at + present) reduce the capacity of DS. Returns DS on success. + + If RETURN_ON_ALLOCATION_FAILURE is defined and a memory allocation + operation fails, deletes DS and returns NULL. */ + +dyn_string_t +dyn_string_resize (dyn_string_t ds, int space) +{ + int new_allocated = ds->allocated; + + /* Increase SPACE to hold the NUL termination. */ + ++space; + + /* Increase allocation by factors of two. */ + while (space > new_allocated) + new_allocated *= 2; + + if (new_allocated != ds->allocated) + { + ds->allocated = new_allocated; + /* We actually need more space. */ +#ifdef RETURN_ON_ALLOCATION_FAILURE + ds->s = (char *) realloc (ds->s, ds->allocated); + if (ds->s == NULL) + { + free (ds); + return NULL; + } +#else + ds->s = XRESIZEVEC (char, ds->s, ds->allocated); +#endif + } + + return ds; +} + +/* Sets the contents of DS to the empty string. */ + +void +dyn_string_clear (dyn_string_t ds) +{ + /* A dyn_string always has room for at least the NUL terminator. */ + ds->s[0] = '\0'; + ds->length = 0; +} + +/* Makes the contents of DEST the same as the contents of SRC. DEST + and SRC must be distinct. Returns 1 on success. On failure, if + RETURN_ON_ALLOCATION_FAILURE, deletes DEST and returns 0. */ + +int +dyn_string_copy (dyn_string_t dest, dyn_string_t src) +{ + if (dest == src) + abort (); + + /* Make room in DEST. */ + if (dyn_string_resize (dest, src->length) == NULL) + return 0; + /* Copy DEST into SRC. */ + strcpy (dest->s, src->s); + /* Update the size of DEST. */ + dest->length = src->length; + return 1; +} + +/* Copies SRC, a NUL-terminated string, into DEST. Returns 1 on + success. On failure, if RETURN_ON_ALLOCATION_FAILURE, deletes DEST + and returns 0. */ + +int +dyn_string_copy_cstr (dyn_string_t dest, const char *src) +{ + int length = strlen (src); + /* Make room in DEST. */ + if (dyn_string_resize (dest, length) == NULL) + return 0; + /* Copy DEST into SRC. */ + strcpy (dest->s, src); + /* Update the size of DEST. */ + dest->length = length; + return 1; +} + +/* Inserts SRC at the beginning of DEST. DEST is expanded as + necessary. SRC and DEST must be distinct. Returns 1 on success. + On failure, if RETURN_ON_ALLOCATION_FAILURE, deletes DEST and + returns 0. */ + +int +dyn_string_prepend (dyn_string_t dest, dyn_string_t src) +{ + return dyn_string_insert (dest, 0, src); +} + +/* Inserts SRC, a NUL-terminated string, at the beginning of DEST. + DEST is expanded as necessary. Returns 1 on success. On failure, + if RETURN_ON_ALLOCATION_FAILURE, deletes DEST and returns 0. */ + +int +dyn_string_prepend_cstr (dyn_string_t dest, const char *src) +{ + return dyn_string_insert_cstr (dest, 0, src); +} + +/* Inserts SRC into DEST starting at position POS. DEST is expanded + as necessary. SRC and DEST must be distinct. Returns 1 on + success. On failure, if RETURN_ON_ALLOCATION_FAILURE, deletes DEST + and returns 0. */ + +int +dyn_string_insert (dyn_string_t dest, int pos, dyn_string_t src) +{ + int i; + + if (src == dest) + abort (); + + if (dyn_string_resize (dest, dest->length + src->length) == NULL) + return 0; + /* Make room for the insertion. Be sure to copy the NUL. */ + for (i = dest->length; i >= pos; --i) + dest->s[i + src->length] = dest->s[i]; + /* Splice in the new stuff. */ + strncpy (dest->s + pos, src->s, src->length); + /* Compute the new length. */ + dest->length += src->length; + return 1; +} + +/* Inserts SRC, a NUL-terminated string, into DEST starting at + position POS. DEST is expanded as necessary. Returns 1 on + success. On failure, RETURN_ON_ALLOCATION_FAILURE, deletes DEST + and returns 0. */ + +int +dyn_string_insert_cstr (dyn_string_t dest, int pos, const char *src) +{ + int i; + int length = strlen (src); + + if (dyn_string_resize (dest, dest->length + length) == NULL) + return 0; + /* Make room for the insertion. Be sure to copy the NUL. */ + for (i = dest->length; i >= pos; --i) + dest->s[i + length] = dest->s[i]; + /* Splice in the new stuff. */ + strncpy (dest->s + pos, src, length); + /* Compute the new length. */ + dest->length += length; + return 1; +} + +/* Inserts character C into DEST starting at position POS. DEST is + expanded as necessary. Returns 1 on success. On failure, + RETURN_ON_ALLOCATION_FAILURE, deletes DEST and returns 0. */ + +int +dyn_string_insert_char (dyn_string_t dest, int pos, int c) +{ + int i; + + if (dyn_string_resize (dest, dest->length + 1) == NULL) + return 0; + /* Make room for the insertion. Be sure to copy the NUL. */ + for (i = dest->length; i >= pos; --i) + dest->s[i + 1] = dest->s[i]; + /* Add the new character. */ + dest->s[pos] = c; + /* Compute the new length. */ + ++dest->length; + return 1; +} + +/* Append S to DS, resizing DS if necessary. Returns 1 on success. + On failure, if RETURN_ON_ALLOCATION_FAILURE, deletes DEST and + returns 0. */ + +int +dyn_string_append (dyn_string_t dest, dyn_string_t s) +{ + if (dyn_string_resize (dest, dest->length + s->length) == 0) + return 0; + strcpy (dest->s + dest->length, s->s); + dest->length += s->length; + return 1; +} + +/* Append the NUL-terminated string S to DS, resizing DS if necessary. + Returns 1 on success. On failure, if RETURN_ON_ALLOCATION_FAILURE, + deletes DEST and returns 0. */ + +int +dyn_string_append_cstr (dyn_string_t dest, const char *s) +{ + int len = strlen (s); + + /* The new length is the old length plus the size of our string, plus + one for the null at the end. */ + if (dyn_string_resize (dest, dest->length + len) == NULL) + return 0; + strcpy (dest->s + dest->length, s); + dest->length += len; + return 1; +} + +/* Appends C to the end of DEST. Returns 1 on success. On failiure, + if RETURN_ON_ALLOCATION_FAILURE, deletes DEST and returns 0. */ + +int +dyn_string_append_char (dyn_string_t dest, int c) +{ + /* Make room for the extra character. */ + if (dyn_string_resize (dest, dest->length + 1) == NULL) + return 0; + /* Append the character; it will overwrite the old NUL. */ + dest->s[dest->length] = c; + /* Add a new NUL at the end. */ + dest->s[dest->length + 1] = '\0'; + /* Update the length. */ + ++(dest->length); + return 1; +} + +/* Sets the contents of DEST to the substring of SRC starting at START + and ending before END. START must be less than or equal to END, + and both must be between zero and the length of SRC, inclusive. + Returns 1 on success. On failure, if RETURN_ON_ALLOCATION_FAILURE, + deletes DEST and returns 0. */ + +int +dyn_string_substring (dyn_string_t dest, dyn_string_t src, + int start, int end) +{ + int i; + int length = end - start; + + if (start > end || start > src->length || end > src->length) + abort (); + + /* Make room for the substring. */ + if (dyn_string_resize (dest, length) == NULL) + return 0; + /* Copy the characters in the substring, */ + for (i = length; --i >= 0; ) + dest->s[i] = src->s[start + i]; + /* NUL-terimate the result. */ + dest->s[length] = '\0'; + /* Record the length of the substring. */ + dest->length = length; + + return 1; +} + +/* Returns non-zero if DS1 and DS2 have the same contents. */ + +int +dyn_string_eq (dyn_string_t ds1, dyn_string_t ds2) +{ + /* If DS1 and DS2 have different lengths, they must not be the same. */ + if (ds1->length != ds2->length) + return 0; + else + return !strcmp (ds1->s, ds2->s); +} diff --git a/libiberty/fdmatch.c b/libiberty/fdmatch.c new file mode 100644 index 0000000..f613cb3 --- /dev/null +++ b/libiberty/fdmatch.c @@ -0,0 +1,68 @@ +/* Compare two open file descriptors to see if they refer to the same file. + Copyright (C) 1991 Free Software Foundation, Inc. + +This file is part of the libiberty library. +Libiberty is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +Libiberty 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with libiberty; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + + +/* + +@deftypefn Extension int fdmatch (int @var{fd1}, int @var{fd2}) + +Check to see if two open file descriptors refer to the same file. +This is useful, for example, when we have an open file descriptor for +an unnamed file, and the name of a file that we believe to correspond +to that fd. This can happen when we are exec'd with an already open +file (@code{stdout} for example) or from the SVR4 @file{/proc} calls +that return open file descriptors for mapped address spaces. All we +have to do is open the file by name and check the two file descriptors +for a match, which is done by comparing major and minor device numbers +and inode numbers. + +@end deftypefn + +BUGS + + (FIXME: does this work for networks?) + It works for NFS, which assigns a device number to each mount. + +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include "ansidecl.h" +#include "libiberty.h" +#include +#include + +int fdmatch (int fd1, int fd2) +{ + struct stat sbuf1; + struct stat sbuf2; + + if ((fstat (fd1, &sbuf1) == 0) && + (fstat (fd2, &sbuf2) == 0) && + (sbuf1.st_dev == sbuf2.st_dev) && + (sbuf1.st_ino == sbuf2.st_ino)) + { + return (1); + } + else + { + return (0); + } +} diff --git a/libiberty/ffs.c b/libiberty/ffs.c new file mode 100644 index 0000000..603cbe8 --- /dev/null +++ b/libiberty/ffs.c @@ -0,0 +1,26 @@ +/* ffs -- Find the first bit set in the parameter + +@deftypefn Supplemental int ffs (int @var{valu}) + +Find the first (least significant) bit set in @var{valu}. Bits are +numbered from right to left, starting with bit 1 (corresponding to the +value 1). If @var{valu} is zero, zero is returned. + +@end deftypefn + +*/ + +int +ffs (register int valu) +{ + register int bit; + + if (valu == 0) + return 0; + + for (bit = 1; !(valu & 1); bit++) + valu >>= 1; + + return bit; +} + diff --git a/libiberty/fibheap.c b/libiberty/fibheap.c new file mode 100644 index 0000000..c032149 --- /dev/null +++ b/libiberty/fibheap.c @@ -0,0 +1,478 @@ +/* A Fibonacci heap datatype. + Copyright 1998, 1999, 2000, 2001 Free Software Foundation, Inc. + Contributed by Daniel Berlin (dan@cgsoftware.com). + +This file is part of GNU CC. + +GNU CC 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. + +GNU CC 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 GNU CC; see the file COPYING. If not, write to +the Free Software Foundation, 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#ifdef HAVE_LIMITS_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#include "libiberty.h" +#include "fibheap.h" + + +#define FIBHEAPKEY_MIN LONG_MIN + +static void fibheap_ins_root (fibheap_t, fibnode_t); +static void fibheap_rem_root (fibheap_t, fibnode_t); +static void fibheap_consolidate (fibheap_t); +static void fibheap_link (fibheap_t, fibnode_t, fibnode_t); +static void fibheap_cut (fibheap_t, fibnode_t, fibnode_t); +static void fibheap_cascading_cut (fibheap_t, fibnode_t); +static fibnode_t fibheap_extr_min_node (fibheap_t); +static int fibheap_compare (fibheap_t, fibnode_t, fibnode_t); +static int fibheap_comp_data (fibheap_t, fibheapkey_t, void *, fibnode_t); +static fibnode_t fibnode_new (void); +static void fibnode_insert_after (fibnode_t, fibnode_t); +#define fibnode_insert_before(a, b) fibnode_insert_after (a->left, b) +static fibnode_t fibnode_remove (fibnode_t); + + +/* Create a new fibonacci heap. */ +fibheap_t +fibheap_new (void) +{ + return (fibheap_t) xcalloc (1, sizeof (struct fibheap)); +} + +/* Create a new fibonacci heap node. */ +static fibnode_t +fibnode_new (void) +{ + fibnode_t node; + + node = (fibnode_t) xcalloc (1, sizeof *node); + node->left = node; + node->right = node; + + return node; +} + +static inline int +fibheap_compare (fibheap_t heap ATTRIBUTE_UNUSED, fibnode_t a, fibnode_t b) +{ + if (a->key < b->key) + return -1; + if (a->key > b->key) + return 1; + return 0; +} + +static inline int +fibheap_comp_data (fibheap_t heap, fibheapkey_t key, void *data, fibnode_t b) +{ + struct fibnode a; + + a.key = key; + a.data = data; + + return fibheap_compare (heap, &a, b); +} + +/* Insert DATA, with priority KEY, into HEAP. */ +fibnode_t +fibheap_insert (fibheap_t heap, fibheapkey_t key, void *data) +{ + fibnode_t node; + + /* Create the new node. */ + node = fibnode_new (); + + /* Set the node's data. */ + node->data = data; + node->key = key; + + /* Insert it into the root list. */ + fibheap_ins_root (heap, node); + + /* If their was no minimum, or this key is less than the min, + it's the new min. */ + if (heap->min == NULL || node->key < heap->min->key) + heap->min = node; + + heap->nodes++; + + return node; +} + +/* Return the data of the minimum node (if we know it). */ +void * +fibheap_min (fibheap_t heap) +{ + /* If there is no min, we can't easily return it. */ + if (heap->min == NULL) + return NULL; + return heap->min->data; +} + +/* Return the key of the minimum node (if we know it). */ +fibheapkey_t +fibheap_min_key (fibheap_t heap) +{ + /* If there is no min, we can't easily return it. */ + if (heap->min == NULL) + return 0; + return heap->min->key; +} + +/* Union HEAPA and HEAPB into a new heap. */ +fibheap_t +fibheap_union (fibheap_t heapa, fibheap_t heapb) +{ + fibnode_t a_root, b_root, temp; + + /* If one of the heaps is empty, the union is just the other heap. */ + if ((a_root = heapa->root) == NULL) + { + free (heapa); + return heapb; + } + if ((b_root = heapb->root) == NULL) + { + free (heapb); + return heapa; + } + + /* Merge them to the next nodes on the opposite chain. */ + a_root->left->right = b_root; + b_root->left->right = a_root; + temp = a_root->left; + a_root->left = b_root->left; + b_root->left = temp; + heapa->nodes += heapb->nodes; + + /* And set the new minimum, if it's changed. */ + if (fibheap_compare (heapa, heapb->min, heapa->min) < 0) + heapa->min = heapb->min; + + free (heapb); + return heapa; +} + +/* Extract the data of the minimum node from HEAP. */ +void * +fibheap_extract_min (fibheap_t heap) +{ + fibnode_t z; + void *ret = NULL; + + /* If we don't have a min set, it means we have no nodes. */ + if (heap->min != NULL) + { + /* Otherwise, extract the min node, free the node, and return the + node's data. */ + z = fibheap_extr_min_node (heap); + ret = z->data; + free (z); + } + + return ret; +} + +/* Replace both the KEY and the DATA associated with NODE. */ +void * +fibheap_replace_key_data (fibheap_t heap, fibnode_t node, + fibheapkey_t key, void *data) +{ + void *odata; + fibheapkey_t okey; + fibnode_t y; + + /* If we wanted to, we could actually do a real increase by redeleting and + inserting. However, this would require O (log n) time. So just bail out + for now. */ + if (fibheap_comp_data (heap, key, data, node) > 0) + return NULL; + + odata = node->data; + okey = node->key; + node->data = data; + node->key = key; + y = node->parent; + + if (okey == key) + return odata; + + /* These two compares are specifically <= 0 to make sure that in the case + of equality, a node we replaced the data on, becomes the new min. This + is needed so that delete's call to extractmin gets the right node. */ + if (y != NULL && fibheap_compare (heap, node, y) <= 0) + { + fibheap_cut (heap, node, y); + fibheap_cascading_cut (heap, y); + } + + if (fibheap_compare (heap, node, heap->min) <= 0) + heap->min = node; + + return odata; +} + +/* Replace the DATA associated with NODE. */ +void * +fibheap_replace_data (fibheap_t heap, fibnode_t node, void *data) +{ + return fibheap_replace_key_data (heap, node, node->key, data); +} + +/* Replace the KEY associated with NODE. */ +fibheapkey_t +fibheap_replace_key (fibheap_t heap, fibnode_t node, fibheapkey_t key) +{ + int okey = node->key; + fibheap_replace_key_data (heap, node, key, node->data); + return okey; +} + +/* Delete NODE from HEAP. */ +void * +fibheap_delete_node (fibheap_t heap, fibnode_t node) +{ + void *ret = node->data; + + /* To perform delete, we just make it the min key, and extract. */ + fibheap_replace_key (heap, node, FIBHEAPKEY_MIN); + fibheap_extract_min (heap); + + return ret; +} + +/* Delete HEAP. */ +void +fibheap_delete (fibheap_t heap) +{ + while (heap->min != NULL) + free (fibheap_extr_min_node (heap)); + + free (heap); +} + +/* Determine if HEAP is empty. */ +int +fibheap_empty (fibheap_t heap) +{ + return heap->nodes == 0; +} + +/* Extract the minimum node of the heap. */ +static fibnode_t +fibheap_extr_min_node (fibheap_t heap) +{ + fibnode_t ret = heap->min; + fibnode_t x, y, orig; + + /* Attach the child list of the minimum node to the root list of the heap. + If there is no child list, we don't do squat. */ + for (x = ret->child, orig = NULL; x != orig && x != NULL; x = y) + { + if (orig == NULL) + orig = x; + y = x->right; + x->parent = NULL; + fibheap_ins_root (heap, x); + } + + /* Remove the old root. */ + fibheap_rem_root (heap, ret); + heap->nodes--; + + /* If we are left with no nodes, then the min is NULL. */ + if (heap->nodes == 0) + heap->min = NULL; + else + { + /* Otherwise, consolidate to find new minimum, as well as do the reorg + work that needs to be done. */ + heap->min = ret->right; + fibheap_consolidate (heap); + } + + return ret; +} + +/* Insert NODE into the root list of HEAP. */ +static void +fibheap_ins_root (fibheap_t heap, fibnode_t node) +{ + /* If the heap is currently empty, the new node becomes the singleton + circular root list. */ + if (heap->root == NULL) + { + heap->root = node; + node->left = node; + node->right = node; + return; + } + + /* Otherwise, insert it in the circular root list between the root + and it's right node. */ + fibnode_insert_after (heap->root, node); +} + +/* Remove NODE from the rootlist of HEAP. */ +static void +fibheap_rem_root (fibheap_t heap, fibnode_t node) +{ + if (node->left == node) + heap->root = NULL; + else + heap->root = fibnode_remove (node); +} + +/* Consolidate the heap. */ +static void +fibheap_consolidate (fibheap_t heap) +{ + fibnode_t a[1 + 8 * sizeof (long)]; + fibnode_t w; + fibnode_t y; + fibnode_t x; + int i; + int d; + int D; + + D = 1 + 8 * sizeof (long); + + memset (a, 0, sizeof (fibnode_t) * D); + + while ((w = heap->root) != NULL) + { + x = w; + fibheap_rem_root (heap, w); + d = x->degree; + while (a[d] != NULL) + { + y = a[d]; + if (fibheap_compare (heap, x, y) > 0) + { + fibnode_t temp; + temp = x; + x = y; + y = temp; + } + fibheap_link (heap, y, x); + a[d] = NULL; + d++; + } + a[d] = x; + } + heap->min = NULL; + for (i = 0; i < D; i++) + if (a[i] != NULL) + { + fibheap_ins_root (heap, a[i]); + if (heap->min == NULL || fibheap_compare (heap, a[i], heap->min) < 0) + heap->min = a[i]; + } +} + +/* Make NODE a child of PARENT. */ +static void +fibheap_link (fibheap_t heap ATTRIBUTE_UNUSED, + fibnode_t node, fibnode_t parent) +{ + if (parent->child == NULL) + parent->child = node; + else + fibnode_insert_before (parent->child, node); + node->parent = parent; + parent->degree++; + node->mark = 0; +} + +/* Remove NODE from PARENT's child list. */ +static void +fibheap_cut (fibheap_t heap, fibnode_t node, fibnode_t parent) +{ + fibnode_remove (node); + parent->degree--; + fibheap_ins_root (heap, node); + node->parent = NULL; + node->mark = 0; +} + +static void +fibheap_cascading_cut (fibheap_t heap, fibnode_t y) +{ + fibnode_t z; + + while ((z = y->parent) != NULL) + { + if (y->mark == 0) + { + y->mark = 1; + return; + } + else + { + fibheap_cut (heap, y, z); + y = z; + } + } +} + +static void +fibnode_insert_after (fibnode_t a, fibnode_t b) +{ + if (a == a->right) + { + a->right = b; + a->left = b; + b->right = a; + b->left = a; + } + else + { + b->right = a->right; + a->right->left = b; + a->right = b; + b->left = a; + } +} + +static fibnode_t +fibnode_remove (fibnode_t node) +{ + fibnode_t ret; + + if (node == node->left) + ret = NULL; + else + ret = node->left; + + if (node->parent != NULL && node->parent->child == node) + node->parent->child = ret; + + node->right->left = node->left; + node->left->right = node->right; + + node->parent = NULL; + node->left = node; + node->right = node; + + return ret; +} diff --git a/libiberty/filename_cmp.c b/libiberty/filename_cmp.c new file mode 100644 index 0000000..0a4d0d8 --- /dev/null +++ b/libiberty/filename_cmp.c @@ -0,0 +1,78 @@ +/* File name comparison routine. + + Copyright (C) 2007 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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef HAVE_STRING_H +#include +#endif + +#include "filenames.h" +#include "safe-ctype.h" + +/* + +@deftypefn Extension int filename_cmp (const char *@var{s1}, const char *@var{s2}) + +Return zero if the two file names @var{s1} and @var{s2} are equivalent. +If not equivalent, the returned value is similar to what @code{strcmp} +would return. In other words, it returns a negative value if @var{s1} +is less than @var{s2}, or a positive value if @var{s2} is greater than +@var{s2}. + +This function does not normalize file names. As a result, this function +will treat filenames that are spelled differently as different even in +the case when the two filenames point to the same underlying file. +However, it does handle the fact that on DOS-like file systems, forward +and backward slashes are equal. + +@end deftypefn + +*/ + +int +filename_cmp (const char *s1, const char *s2) +{ +#ifndef HAVE_DOS_BASED_FILE_SYSTEM + return strcmp(s1, s2); +#else + for (;;) + { + int c1 = TOLOWER (*s1); + int c2 = TOLOWER (*s2); + + /* On DOS-based file systems, the '/' and the '\' are equivalent. */ + if (c1 == '/') + c1 = '\\'; + if (c2 == '/') + c2 = '\\'; + + if (c1 != c2) + return (c1 - c2); + + if (c1 == '\0') + return 0; + + s1++; + s2++; + } +#endif +} + diff --git a/libiberty/floatformat.c b/libiberty/floatformat.c new file mode 100644 index 0000000..cbf13ea --- /dev/null +++ b/libiberty/floatformat.c @@ -0,0 +1,759 @@ +/* IEEE floating point support routines, for GDB, the GNU Debugger. + Copyright 1991, 1994, 1999, 2000, 2003, 2005, 2006 + Free Software Foundation, Inc. + +This file is part of GDB. + +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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* This is needed to pick up the NAN macro on some systems. */ +#define _GNU_SOURCE + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#ifdef HAVE_STRING_H +#include +#endif + +/* On some platforms, provides DBL_QNAN. */ +#ifdef STDC_HEADERS +#include +#endif + +#include "ansidecl.h" +#include "libiberty.h" +#include "floatformat.h" + +#ifndef INFINITY +#ifdef HUGE_VAL +#define INFINITY HUGE_VAL +#else +#define INFINITY (1.0 / 0.0) +#endif +#endif + +#ifndef NAN +#ifdef DBL_QNAN +#define NAN DBL_QNAN +#else +#define NAN (0.0 / 0.0) +#endif +#endif + +static int mant_bits_set (const struct floatformat *, const unsigned char *); +static unsigned long get_field (const unsigned char *, + enum floatformat_byteorders, + unsigned int, + unsigned int, + unsigned int); +static int floatformat_always_valid (const struct floatformat *fmt, + const void *from); + +static int +floatformat_always_valid (const struct floatformat *fmt ATTRIBUTE_UNUSED, + const void *from ATTRIBUTE_UNUSED) +{ + return 1; +} + +/* The odds that CHAR_BIT will be anything but 8 are low enough that I'm not + going to bother with trying to muck around with whether it is defined in + a system header, what we do if not, etc. */ +#define FLOATFORMAT_CHAR_BIT 8 + +/* floatformats for IEEE single and double, big and little endian. */ +const struct floatformat floatformat_ieee_single_big = +{ + floatformat_big, 32, 0, 1, 8, 127, 255, 9, 23, + floatformat_intbit_no, + "floatformat_ieee_single_big", + floatformat_always_valid, + NULL +}; +const struct floatformat floatformat_ieee_single_little = +{ + floatformat_little, 32, 0, 1, 8, 127, 255, 9, 23, + floatformat_intbit_no, + "floatformat_ieee_single_little", + floatformat_always_valid, + NULL +}; +const struct floatformat floatformat_ieee_double_big = +{ + floatformat_big, 64, 0, 1, 11, 1023, 2047, 12, 52, + floatformat_intbit_no, + "floatformat_ieee_double_big", + floatformat_always_valid, + NULL +}; +const struct floatformat floatformat_ieee_double_little = +{ + floatformat_little, 64, 0, 1, 11, 1023, 2047, 12, 52, + floatformat_intbit_no, + "floatformat_ieee_double_little", + floatformat_always_valid, + NULL +}; + +/* floatformat for IEEE double, little endian byte order, with big endian word + ordering, as on the ARM. */ + +const struct floatformat floatformat_ieee_double_littlebyte_bigword = +{ + floatformat_littlebyte_bigword, 64, 0, 1, 11, 1023, 2047, 12, 52, + floatformat_intbit_no, + "floatformat_ieee_double_littlebyte_bigword", + floatformat_always_valid, + NULL +}; + +/* floatformat for VAX. Not quite IEEE, but close enough. */ + +const struct floatformat floatformat_vax_f = +{ + floatformat_vax, 32, 0, 1, 8, 129, 0, 9, 23, + floatformat_intbit_no, + "floatformat_vax_f", + floatformat_always_valid, + NULL +}; +const struct floatformat floatformat_vax_d = +{ + floatformat_vax, 64, 0, 1, 8, 129, 0, 9, 55, + floatformat_intbit_no, + "floatformat_vax_d", + floatformat_always_valid, + NULL +}; +const struct floatformat floatformat_vax_g = +{ + floatformat_vax, 64, 0, 1, 11, 1025, 0, 12, 52, + floatformat_intbit_no, + "floatformat_vax_g", + floatformat_always_valid, + NULL +}; + +static int floatformat_i387_ext_is_valid (const struct floatformat *fmt, + const void *from); + +static int +floatformat_i387_ext_is_valid (const struct floatformat *fmt, const void *from) +{ + /* In the i387 double-extended format, if the exponent is all ones, + then the integer bit must be set. If the exponent is neither 0 + nor ~0, the intbit must also be set. Only if the exponent is + zero can it be zero, and then it must be zero. */ + unsigned long exponent, int_bit; + const unsigned char *ufrom = (const unsigned char *) from; + + exponent = get_field (ufrom, fmt->byteorder, fmt->totalsize, + fmt->exp_start, fmt->exp_len); + int_bit = get_field (ufrom, fmt->byteorder, fmt->totalsize, + fmt->man_start, 1); + + if ((exponent == 0) != (int_bit == 0)) + return 0; + else + return 1; +} + +const struct floatformat floatformat_i387_ext = +{ + floatformat_little, 80, 0, 1, 15, 0x3fff, 0x7fff, 16, 64, + floatformat_intbit_yes, + "floatformat_i387_ext", + floatformat_i387_ext_is_valid, + NULL +}; +const struct floatformat floatformat_m68881_ext = +{ + /* Note that the bits from 16 to 31 are unused. */ + floatformat_big, 96, 0, 1, 15, 0x3fff, 0x7fff, 32, 64, + floatformat_intbit_yes, + "floatformat_m68881_ext", + floatformat_always_valid, + NULL +}; +const struct floatformat floatformat_i960_ext = +{ + /* Note that the bits from 0 to 15 are unused. */ + floatformat_little, 96, 16, 17, 15, 0x3fff, 0x7fff, 32, 64, + floatformat_intbit_yes, + "floatformat_i960_ext", + floatformat_always_valid, + NULL +}; +const struct floatformat floatformat_m88110_ext = +{ + floatformat_big, 80, 0, 1, 15, 0x3fff, 0x7fff, 16, 64, + floatformat_intbit_yes, + "floatformat_m88110_ext", + floatformat_always_valid, + NULL +}; +const struct floatformat floatformat_m88110_harris_ext = +{ + /* Harris uses raw format 128 bytes long, but the number is just an ieee + double, and the last 64 bits are wasted. */ + floatformat_big,128, 0, 1, 11, 0x3ff, 0x7ff, 12, 52, + floatformat_intbit_no, + "floatformat_m88110_ext_harris", + floatformat_always_valid, + NULL +}; +const struct floatformat floatformat_arm_ext_big = +{ + /* Bits 1 to 16 are unused. */ + floatformat_big, 96, 0, 17, 15, 0x3fff, 0x7fff, 32, 64, + floatformat_intbit_yes, + "floatformat_arm_ext_big", + floatformat_always_valid, + NULL +}; +const struct floatformat floatformat_arm_ext_littlebyte_bigword = +{ + /* Bits 1 to 16 are unused. */ + floatformat_littlebyte_bigword, 96, 0, 17, 15, 0x3fff, 0x7fff, 32, 64, + floatformat_intbit_yes, + "floatformat_arm_ext_littlebyte_bigword", + floatformat_always_valid, + NULL +}; +const struct floatformat floatformat_ia64_spill_big = +{ + floatformat_big, 128, 0, 1, 17, 65535, 0x1ffff, 18, 64, + floatformat_intbit_yes, + "floatformat_ia64_spill_big", + floatformat_always_valid, + NULL +}; +const struct floatformat floatformat_ia64_spill_little = +{ + floatformat_little, 128, 0, 1, 17, 65535, 0x1ffff, 18, 64, + floatformat_intbit_yes, + "floatformat_ia64_spill_little", + floatformat_always_valid, + NULL +}; +const struct floatformat floatformat_ia64_quad_big = +{ + floatformat_big, 128, 0, 1, 15, 16383, 0x7fff, 16, 112, + floatformat_intbit_no, + "floatformat_ia64_quad_big", + floatformat_always_valid, + NULL +}; +const struct floatformat floatformat_ia64_quad_little = +{ + floatformat_little, 128, 0, 1, 15, 16383, 0x7fff, 16, 112, + floatformat_intbit_no, + "floatformat_ia64_quad_little", + floatformat_always_valid, + NULL +}; + +static int +floatformat_ibm_long_double_is_valid (const struct floatformat *fmt, + const void *from) +{ + const unsigned char *ufrom = (const unsigned char *) from; + const struct floatformat *hfmt = fmt->split_half; + long top_exp, bot_exp; + int top_nan = 0; + + top_exp = get_field (ufrom, hfmt->byteorder, hfmt->totalsize, + hfmt->exp_start, hfmt->exp_len); + bot_exp = get_field (ufrom + 8, hfmt->byteorder, hfmt->totalsize, + hfmt->exp_start, hfmt->exp_len); + + if ((unsigned long) top_exp == hfmt->exp_nan) + top_nan = mant_bits_set (hfmt, ufrom); + + /* A NaN is valid with any low part. */ + if (top_nan) + return 1; + + /* An infinity, zero or denormal requires low part 0 (positive or + negative). */ + if ((unsigned long) top_exp == hfmt->exp_nan || top_exp == 0) + { + if (bot_exp != 0) + return 0; + + return !mant_bits_set (hfmt, ufrom + 8); + } + + /* The top part is now a finite normal value. The long double value + is the sum of the two parts, and the top part must equal the + result of rounding the long double value to nearest double. Thus + the bottom part must be <= 0.5ulp of the top part in absolute + value, and if it is < 0.5ulp then the long double is definitely + valid. */ + if (bot_exp < top_exp - 53) + return 1; + if (bot_exp > top_exp - 53 && bot_exp != 0) + return 0; + if (bot_exp == 0) + { + /* The bottom part is 0 or denormal. Determine which, and if + denormal the first two set bits. */ + int first_bit = -1, second_bit = -1, cur_bit; + for (cur_bit = 0; (unsigned int) cur_bit < hfmt->man_len; cur_bit++) + if (get_field (ufrom + 8, hfmt->byteorder, hfmt->totalsize, + hfmt->man_start + cur_bit, 1)) + { + if (first_bit == -1) + first_bit = cur_bit; + else + { + second_bit = cur_bit; + break; + } + } + /* Bottom part 0 is OK. */ + if (first_bit == -1) + return 1; + /* The real exponent of the bottom part is -first_bit. */ + if (-first_bit < top_exp - 53) + return 1; + if (-first_bit > top_exp - 53) + return 0; + /* The bottom part is at least 0.5ulp of the top part. For this + to be OK, the bottom part must be exactly 0.5ulp (i.e. no + more bits set) and the top part must have last bit 0. */ + if (second_bit != -1) + return 0; + return !get_field (ufrom, hfmt->byteorder, hfmt->totalsize, + hfmt->man_start + hfmt->man_len - 1, 1); + } + else + { + /* The bottom part is at least 0.5ulp of the top part. For this + to be OK, it must be exactly 0.5ulp (i.e. no explicit bits + set) and the top part must have last bit 0. */ + if (get_field (ufrom, hfmt->byteorder, hfmt->totalsize, + hfmt->man_start + hfmt->man_len - 1, 1)) + return 0; + return !mant_bits_set (hfmt, ufrom + 8); + } +} + +const struct floatformat floatformat_ibm_long_double = +{ + floatformat_big, 128, 0, 1, 11, 1023, 2047, 12, 52, + floatformat_intbit_no, + "floatformat_ibm_long_double", + floatformat_ibm_long_double_is_valid, + &floatformat_ieee_double_big +}; + + +#ifndef min +#define min(a, b) ((a) < (b) ? (a) : (b)) +#endif + +/* Return 1 if any bits are explicitly set in the mantissa of UFROM, + format FMT, 0 otherwise. */ +static int +mant_bits_set (const struct floatformat *fmt, const unsigned char *ufrom) +{ + unsigned int mant_bits, mant_off; + int mant_bits_left; + + mant_off = fmt->man_start; + mant_bits_left = fmt->man_len; + while (mant_bits_left > 0) + { + mant_bits = min (mant_bits_left, 32); + + if (get_field (ufrom, fmt->byteorder, fmt->totalsize, + mant_off, mant_bits) != 0) + return 1; + + mant_off += mant_bits; + mant_bits_left -= mant_bits; + } + return 0; +} + +/* Extract a field which starts at START and is LEN bits long. DATA and + TOTAL_LEN are the thing we are extracting it from, in byteorder ORDER. */ +static unsigned long +get_field (const unsigned char *data, enum floatformat_byteorders order, + unsigned int total_len, unsigned int start, unsigned int len) +{ + unsigned long result = 0; + unsigned int cur_byte; + int lo_bit, hi_bit, cur_bitshift = 0; + int nextbyte = (order == floatformat_little) ? 1 : -1; + + /* Start is in big-endian bit order! Fix that first. */ + start = total_len - (start + len); + + /* Start at the least significant part of the field. */ + if (order == floatformat_little) + cur_byte = start / FLOATFORMAT_CHAR_BIT; + else + cur_byte = (total_len - start - 1) / FLOATFORMAT_CHAR_BIT; + + lo_bit = start % FLOATFORMAT_CHAR_BIT; + hi_bit = min (lo_bit + len, FLOATFORMAT_CHAR_BIT); + + do + { + unsigned int shifted = *(data + cur_byte) >> lo_bit; + unsigned int bits = hi_bit - lo_bit; + unsigned int mask = (1 << bits) - 1; + result |= (shifted & mask) << cur_bitshift; + len -= bits; + cur_bitshift += bits; + cur_byte += nextbyte; + lo_bit = 0; + hi_bit = min (len, FLOATFORMAT_CHAR_BIT); + } + while (len != 0); + + return result; +} + +/* Convert from FMT to a double. + FROM is the address of the extended float. + Store the double in *TO. */ + +void +floatformat_to_double (const struct floatformat *fmt, + const void *from, double *to) +{ + const unsigned char *ufrom = (const unsigned char *) from; + double dto; + long exponent; + unsigned long mant; + unsigned int mant_bits, mant_off; + int mant_bits_left; + int special_exponent; /* It's a NaN, denorm or zero */ + + /* Split values are not handled specially, since the top half has + the correctly rounded double value (in the only supported case of + split values). */ + + exponent = get_field (ufrom, fmt->byteorder, fmt->totalsize, + fmt->exp_start, fmt->exp_len); + + /* If the exponent indicates a NaN, we don't have information to + decide what to do. So we handle it like IEEE, except that we + don't try to preserve the type of NaN. FIXME. */ + if ((unsigned long) exponent == fmt->exp_nan) + { + int nan = mant_bits_set (fmt, ufrom); + + /* On certain systems (such as GNU/Linux), the use of the + INFINITY macro below may generate a warning that can not be + silenced due to a bug in GCC (PR preprocessor/11931). The + preprocessor fails to recognise the __extension__ keyword in + conjunction with the GNU/C99 extension for hexadecimal + floating point constants and will issue a warning when + compiling with -pedantic. */ + if (nan) + dto = NAN; + else + dto = INFINITY; + + if (get_field (ufrom, fmt->byteorder, fmt->totalsize, fmt->sign_start, 1)) + dto = -dto; + + *to = dto; + + return; + } + + mant_bits_left = fmt->man_len; + mant_off = fmt->man_start; + dto = 0.0; + + special_exponent = exponent == 0 || (unsigned long) exponent == fmt->exp_nan; + + /* Don't bias zero's, denorms or NaNs. */ + if (!special_exponent) + exponent -= fmt->exp_bias; + + /* Build the result algebraically. Might go infinite, underflow, etc; + who cares. */ + + /* If this format uses a hidden bit, explicitly add it in now. Otherwise, + increment the exponent by one to account for the integer bit. */ + + if (!special_exponent) + { + if (fmt->intbit == floatformat_intbit_no) + dto = ldexp (1.0, exponent); + else + exponent++; + } + + while (mant_bits_left > 0) + { + mant_bits = min (mant_bits_left, 32); + + mant = get_field (ufrom, fmt->byteorder, fmt->totalsize, + mant_off, mant_bits); + + /* Handle denormalized numbers. FIXME: What should we do for + non-IEEE formats? */ + if (special_exponent && exponent == 0 && mant != 0) + dto += ldexp ((double)mant, + (- fmt->exp_bias + - mant_bits + - (mant_off - fmt->man_start) + + 1)); + else + dto += ldexp ((double)mant, exponent - mant_bits); + if (exponent != 0) + exponent -= mant_bits; + mant_off += mant_bits; + mant_bits_left -= mant_bits; + } + + /* Negate it if negative. */ + if (get_field (ufrom, fmt->byteorder, fmt->totalsize, fmt->sign_start, 1)) + dto = -dto; + *to = dto; +} + +static void put_field (unsigned char *, enum floatformat_byteorders, + unsigned int, + unsigned int, + unsigned int, + unsigned long); + +/* Set a field which starts at START and is LEN bits long. DATA and + TOTAL_LEN are the thing we are extracting it from, in byteorder ORDER. */ +static void +put_field (unsigned char *data, enum floatformat_byteorders order, + unsigned int total_len, unsigned int start, unsigned int len, + unsigned long stuff_to_put) +{ + unsigned int cur_byte; + int lo_bit, hi_bit; + int nextbyte = (order == floatformat_little) ? 1 : -1; + + /* Start is in big-endian bit order! Fix that first. */ + start = total_len - (start + len); + + /* Start at the least significant part of the field. */ + if (order == floatformat_little) + cur_byte = start / FLOATFORMAT_CHAR_BIT; + else + cur_byte = (total_len - start - 1) / FLOATFORMAT_CHAR_BIT; + + lo_bit = start % FLOATFORMAT_CHAR_BIT; + hi_bit = min (lo_bit + len, FLOATFORMAT_CHAR_BIT); + + do + { + unsigned char *byte_ptr = data + cur_byte; + unsigned int bits = hi_bit - lo_bit; + unsigned int mask = ((1 << bits) - 1) << lo_bit; + *byte_ptr = (*byte_ptr & ~mask) | ((stuff_to_put << lo_bit) & mask); + stuff_to_put >>= bits; + len -= bits; + cur_byte += nextbyte; + lo_bit = 0; + hi_bit = min (len, FLOATFORMAT_CHAR_BIT); + } + while (len != 0); +} + +/* The converse: convert the double *FROM to an extended float + and store where TO points. Neither FROM nor TO have any alignment + restrictions. */ + +void +floatformat_from_double (const struct floatformat *fmt, + const double *from, void *to) +{ + double dfrom; + int exponent; + double mant; + unsigned int mant_bits, mant_off; + int mant_bits_left; + unsigned char *uto = (unsigned char *) to; + + dfrom = *from; + memset (uto, 0, fmt->totalsize / FLOATFORMAT_CHAR_BIT); + + /* Split values are not handled specially, since a bottom half of + zero is correct for any value representable as double (in the + only supported case of split values). */ + + /* If negative, set the sign bit. */ + if (dfrom < 0) + { + put_field (uto, fmt->byteorder, fmt->totalsize, fmt->sign_start, 1, 1); + dfrom = -dfrom; + } + + if (dfrom == 0) + { + /* 0.0. */ + return; + } + + if (dfrom != dfrom) + { + /* NaN. */ + put_field (uto, fmt->byteorder, fmt->totalsize, fmt->exp_start, + fmt->exp_len, fmt->exp_nan); + /* Be sure it's not infinity, but NaN value is irrelevant. */ + put_field (uto, fmt->byteorder, fmt->totalsize, fmt->man_start, + 32, 1); + return; + } + + if (dfrom + dfrom == dfrom) + { + /* This can only happen for an infinite value (or zero, which we + already handled above). */ + put_field (uto, fmt->byteorder, fmt->totalsize, fmt->exp_start, + fmt->exp_len, fmt->exp_nan); + return; + } + + mant = frexp (dfrom, &exponent); + if (exponent + fmt->exp_bias - 1 > 0) + put_field (uto, fmt->byteorder, fmt->totalsize, fmt->exp_start, + fmt->exp_len, exponent + fmt->exp_bias - 1); + else + { + /* Handle a denormalized number. FIXME: What should we do for + non-IEEE formats? */ + put_field (uto, fmt->byteorder, fmt->totalsize, fmt->exp_start, + fmt->exp_len, 0); + mant = ldexp (mant, exponent + fmt->exp_bias - 1); + } + + mant_bits_left = fmt->man_len; + mant_off = fmt->man_start; + while (mant_bits_left > 0) + { + unsigned long mant_long; + mant_bits = mant_bits_left < 32 ? mant_bits_left : 32; + + mant *= 4294967296.0; + mant_long = (unsigned long)mant; + mant -= mant_long; + + /* If the integer bit is implicit, and we are not creating a + denormalized number, then we need to discard it. */ + if ((unsigned int) mant_bits_left == fmt->man_len + && fmt->intbit == floatformat_intbit_no + && exponent + fmt->exp_bias - 1 > 0) + { + mant_long &= 0x7fffffff; + mant_bits -= 1; + } + else if (mant_bits < 32) + { + /* The bits we want are in the most significant MANT_BITS bits of + mant_long. Move them to the least significant. */ + mant_long >>= 32 - mant_bits; + } + + put_field (uto, fmt->byteorder, fmt->totalsize, + mant_off, mant_bits, mant_long); + mant_off += mant_bits; + mant_bits_left -= mant_bits; + } +} + +/* Return non-zero iff the data at FROM is a valid number in format FMT. */ + +int +floatformat_is_valid (const struct floatformat *fmt, const void *from) +{ + return fmt->is_valid (fmt, from); +} + + +#ifdef IEEE_DEBUG + +#include + +/* This is to be run on a host which uses IEEE floating point. */ + +void +ieee_test (double n) +{ + double result; + + floatformat_to_double (&floatformat_ieee_double_little, &n, &result); + if ((n != result && (! isnan (n) || ! isnan (result))) + || (n < 0 && result >= 0) + || (n >= 0 && result < 0)) + printf ("Differ(to): %.20g -> %.20g\n", n, result); + + floatformat_from_double (&floatformat_ieee_double_little, &n, &result); + if ((n != result && (! isnan (n) || ! isnan (result))) + || (n < 0 && result >= 0) + || (n >= 0 && result < 0)) + printf ("Differ(from): %.20g -> %.20g\n", n, result); + +#if 0 + { + char exten[16]; + + floatformat_from_double (&floatformat_m68881_ext, &n, exten); + floatformat_to_double (&floatformat_m68881_ext, exten, &result); + if (n != result) + printf ("Differ(to+from): %.20g -> %.20g\n", n, result); + } +#endif + +#if IEEE_DEBUG > 1 + /* This is to be run on a host which uses 68881 format. */ + { + long double ex = *(long double *)exten; + if (ex != n) + printf ("Differ(from vs. extended): %.20g\n", n); + } +#endif +} + +int +main (void) +{ + ieee_test (0.0); + ieee_test (0.5); + ieee_test (256.0); + ieee_test (0.12345); + ieee_test (234235.78907234); + ieee_test (-512.0); + ieee_test (-0.004321); + ieee_test (1.2E-70); + ieee_test (1.2E-316); + ieee_test (4.9406564584124654E-324); + ieee_test (- 4.9406564584124654E-324); + ieee_test (- 0.0); + ieee_test (- INFINITY); + ieee_test (- NAN); + ieee_test (INFINITY); + ieee_test (NAN); + return 0; +} +#endif diff --git a/libiberty/fnmatch.c b/libiberty/fnmatch.c new file mode 100644 index 0000000..fc897be --- /dev/null +++ b/libiberty/fnmatch.c @@ -0,0 +1,220 @@ +/* Copyright (C) 1991, 1992, 1993 Free Software Foundation, Inc. + +NOTE: This source is derived from an old version taken from the GNU C +Library (glibc). + +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, 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +#ifdef HAVE_CONFIG_H +#if defined (CONFIG_BROKETS) +/* We use instead of "config.h" so that a compilation + using -I. -I$srcdir will use ./config.h rather than $srcdir/config.h + (which it would do because it found this file in $srcdir). */ +#include +#else +#include "config.h" +#endif +#endif + + +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif + +/* This code to undef const added in libiberty. */ +#ifndef __STDC__ +/* This is a separate conditional since some stdc systems + reject `defined (const)'. */ +#ifndef const +#define const +#endif +#endif + +#include +#include +#include + +/* 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__) + + +#if !defined(__GNU_LIBRARY__) && !defined(STDC_HEADERS) +extern int errno; +#endif + +/* Match STRING against the filename pattern PATTERN, returning zero if + it matches, nonzero if not. */ +int +fnmatch (const char *pattern, const char *string, int flags) +{ + register const char *p = pattern, *n = string; + register unsigned char c; + +#define FOLD(c) ((flags & FNM_CASEFOLD) ? TOLOWER (c) : (c)) + + while ((c = *p++) != '\0') + { + c = FOLD (c); + + switch (c) + { + case '?': + if (*n == '\0') + return FNM_NOMATCH; + else if ((flags & FNM_FILE_NAME) && *n == '/') + return FNM_NOMATCH; + else if ((flags & FNM_PERIOD) && *n == '.' && + (n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/'))) + return FNM_NOMATCH; + break; + + case '\\': + if (!(flags & FNM_NOESCAPE)) + { + c = *p++; + c = FOLD (c); + } + if (FOLD ((unsigned char)*n) != c) + return FNM_NOMATCH; + break; + + case '*': + if ((flags & FNM_PERIOD) && *n == '.' && + (n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/'))) + return FNM_NOMATCH; + + for (c = *p++; c == '?' || c == '*'; c = *p++, ++n) + if (((flags & FNM_FILE_NAME) && *n == '/') || + (c == '?' && *n == '\0')) + return FNM_NOMATCH; + + if (c == '\0') + return 0; + + { + unsigned char c1 = (!(flags & FNM_NOESCAPE) && c == '\\') ? *p : c; + c1 = FOLD (c1); + for (--p; *n != '\0'; ++n) + if ((c == '[' || FOLD ((unsigned char)*n) == c1) && + fnmatch (p, n, flags & ~FNM_PERIOD) == 0) + return 0; + return FNM_NOMATCH; + } + + case '[': + { + /* Nonzero if the sense of the character class is inverted. */ + register int negate; + + if (*n == '\0') + return FNM_NOMATCH; + + if ((flags & FNM_PERIOD) && *n == '.' && + (n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/'))) + return FNM_NOMATCH; + + negate = (*p == '!' || *p == '^'); + if (negate) + ++p; + + c = *p++; + for (;;) + { + register unsigned char cstart = c, cend = c; + + if (!(flags & FNM_NOESCAPE) && c == '\\') + cstart = cend = *p++; + + cstart = cend = FOLD (cstart); + + if (c == '\0') + /* [ (unterminated) loses. */ + return FNM_NOMATCH; + + c = *p++; + c = FOLD (c); + + if ((flags & FNM_FILE_NAME) && c == '/') + /* [/] can never match. */ + return FNM_NOMATCH; + + if (c == '-' && *p != ']') + { + cend = *p++; + if (!(flags & FNM_NOESCAPE) && cend == '\\') + cend = *p++; + if (cend == '\0') + return FNM_NOMATCH; + cend = FOLD (cend); + + c = *p++; + } + + if (FOLD ((unsigned char)*n) >= cstart + && FOLD ((unsigned char)*n) <= cend) + goto matched; + + if (c == ']') + break; + } + if (!negate) + return FNM_NOMATCH; + break; + + matched:; + /* Skip the rest of the [...] that already matched. */ + while (c != ']') + { + if (c == '\0') + /* [... (unterminated) loses. */ + return FNM_NOMATCH; + + c = *p++; + if (!(flags & FNM_NOESCAPE) && c == '\\') + /* XXX 1003.2d11 is unclear if this is right. */ + ++p; + } + if (negate) + return FNM_NOMATCH; + } + break; + + default: + if (c != FOLD ((unsigned char)*n)) + return FNM_NOMATCH; + } + + ++n; + } + + if (*n == '\0') + return 0; + + if ((flags & FNM_LEADING_DIR) && *n == '/') + /* The FNM_LEADING_DIR flag says that "foo*" matches "foobar/frobozz". */ + return 0; + + return FNM_NOMATCH; +} + +#endif /* _LIBC or not __GNU_LIBRARY__. */ diff --git a/libiberty/fnmatch.txh b/libiberty/fnmatch.txh new file mode 100644 index 0000000..92e11bc --- /dev/null +++ b/libiberty/fnmatch.txh @@ -0,0 +1,48 @@ +@deftypefn Replacement int fnmatch (const char *@var{pattern}, const char *@var{string}, int @var{flags}) + +Matches @var{string} against @var{pattern}, returning zero if it +matches, @code{FNM_NOMATCH} if not. @var{pattern} may contain the +wildcards @code{?} to match any one character, @code{*} to match any +zero or more characters, or a set of alternate characters in square +brackets, like @samp{[a-gt8]}, which match one character (@code{a} +through @code{g}, or @code{t}, or @code{8}, in this example) if that one +character is in the set. A set may be inverted (i.e., match anything +except what's in the set) by giving @code{^} or @code{!} as the first +character in the set. To include those characters in the set, list them +as anything other than the first character of the set. To include a +dash in the set, list it last in the set. A backslash character makes +the following character not special, so for example you could match +against a literal asterisk with @samp{\*}. To match a literal +backslash, use @samp{\\}. + +@code{flags} controls various aspects of the matching process, and is a +boolean OR of zero or more of the following values (defined in +@code{}): + +@table @code + +@item FNM_PATHNAME +@itemx FNM_FILE_NAME +@var{string} is assumed to be a path name. No wildcard will ever match +@code{/}. + +@item FNM_NOESCAPE +Do not interpret backslashes as quoting the following special character. + +@item FNM_PERIOD +A leading period (at the beginning of @var{string}, or if +@code{FNM_PATHNAME} after a slash) is not matched by @code{*} or +@code{?} but must be matched explicitly. + +@item FNM_LEADING_DIR +Means that @var{string} also matches @var{pattern} if some initial part +of @var{string} matches, and is followed by @code{/} and zero or more +characters. For example, @samp{foo*} would match either @samp{foobar} +or @samp{foobar/grill}. + +@item FNM_CASEFOLD +Ignores case when performing the comparison. + +@end table + +@end deftypefn diff --git a/libiberty/fopen_unlocked.c b/libiberty/fopen_unlocked.c new file mode 100644 index 0000000..3c3cefe --- /dev/null +++ b/libiberty/fopen_unlocked.c @@ -0,0 +1,126 @@ +/* Implement fopen_unlocked and related functions. + Copyright (C) 2005 Free Software Foundation, Inc. + Written by Kaveh R. Ghazi . + +This file is part of the libiberty library. +Libiberty is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +Libiberty 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with libiberty; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +/* + +@deftypefn Extension void unlock_stream (FILE * @var{stream}) + +If the OS supports it, ensure that the supplied stream is setup to +avoid any multi-threaded locking. Otherwise leave the @code{FILE} +pointer unchanged. If the @var{stream} is @code{NULL} do nothing. + +@end deftypefn + +@deftypefn Extension void unlock_std_streams (void) + +If the OS supports it, ensure that the standard I/O streams, +@code{stdin}, @code{stdout} and @code{stderr} are setup to avoid any +multi-threaded locking. Otherwise do nothing. + +@end deftypefn + +@deftypefn Extension {FILE *} fopen_unlocked (const char *@var{path}, const char * @var{mode}) + +Opens and returns a @code{FILE} pointer via @code{fopen}. If the +operating system supports it, ensure that the stream is setup to avoid +any multi-threaded locking. Otherwise return the @code{FILE} pointer +unchanged. + +@end deftypefn + +@deftypefn Extension {FILE *} fdopen_unlocked (int @var{fildes}, const char * @var{mode}) + +Opens and returns a @code{FILE} pointer via @code{fdopen}. If the +operating system supports it, ensure that the stream is setup to avoid +any multi-threaded locking. Otherwise return the @code{FILE} pointer +unchanged. + +@end deftypefn + +@deftypefn Extension {FILE *} freopen_unlocked (const char * @var{path}, const char * @var{mode}, FILE * @var{stream}) + +Opens and returns a @code{FILE} pointer via @code{freopen}. If the +operating system supports it, ensure that the stream is setup to avoid +any multi-threaded locking. Otherwise return the @code{FILE} pointer +unchanged. + +@end deftypefn + +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include +#ifdef HAVE_STDIO_EXT_H +#include +#endif + +#include "libiberty.h" + +/* This is an inline helper function to consolidate attempts to unlock + a stream. */ + +static inline void +unlock_1 (FILE *const fp ATTRIBUTE_UNUSED) +{ +#if defined(HAVE___FSETLOCKING) && defined(FSETLOCKING_BYCALLER) + if (fp) + __fsetlocking (fp, FSETLOCKING_BYCALLER); +#endif +} + +void +unlock_stream (FILE *fp) +{ + unlock_1 (fp); +} + +void +unlock_std_streams (void) +{ + unlock_1 (stdin); + unlock_1 (stdout); + unlock_1 (stderr); +} + +FILE * +fopen_unlocked (const char *path, const char *mode) +{ + FILE *const fp = fopen (path, mode); + unlock_1 (fp); + return fp; +} + +FILE * +fdopen_unlocked (int fildes, const char *mode) +{ + FILE *const fp = fdopen (fildes, mode); + unlock_1 (fp); + return fp; +} + +FILE * +freopen_unlocked (const char *path, const char *mode, FILE *stream) +{ + FILE *const fp = freopen (path, mode, stream); + unlock_1 (fp); + return fp; +} diff --git a/libiberty/functions.texi b/libiberty/functions.texi new file mode 100644 index 0000000..e6ab84c --- /dev/null +++ b/libiberty/functions.texi @@ -0,0 +1,1582 @@ +@c Automatically generated from *.c and others (the comments before +@c each entry tell you which file and where in that file). DO NOT EDIT! +@c Edit the *.c files, configure with --enable-maintainer-mode, +@c and let gather-docs build you a new copy. + +@c safe-ctype.c:25 +@defvr Extension HOST_CHARSET +This macro indicates the basic character set and encoding used by the +host: more precisely, the encoding used for character constants in +preprocessor @samp{#if} statements (the C "execution character set"). +It is defined by @file{safe-ctype.h}, and will be an integer constant +with one of the following values: + +@ftable @code +@item HOST_CHARSET_UNKNOWN +The host character set is unknown - that is, not one of the next two +possibilities. + +@item HOST_CHARSET_ASCII +The host character set is ASCII. + +@item HOST_CHARSET_EBCDIC +The host character set is some variant of EBCDIC. (Only one of the +nineteen EBCDIC varying characters is tested; exercise caution.) +@end ftable +@end defvr + +@c alloca.c:26 +@deftypefn Replacement void* alloca (size_t @var{size}) + +This function allocates memory which will be automatically reclaimed +after the procedure exits. The @libib{} implementation does not free +the memory immediately but will do so eventually during subsequent +calls to this function. Memory is allocated using @code{xmalloc} under +normal circumstances. + +The header file @file{alloca-conf.h} can be used in conjunction with the +GNU Autoconf test @code{AC_FUNC_ALLOCA} to test for and properly make +available this function. The @code{AC_FUNC_ALLOCA} test requires that +client code use a block of preprocessor code to be safe (see the Autoconf +manual for more); this header incorporates that logic and more, including +the possibility of a GCC built-in function. + +@end deftypefn + +@c asprintf.c:32 +@deftypefn Extension int asprintf (char **@var{resptr}, const char *@var{format}, ...) + +Like @code{sprintf}, but instead of passing a pointer to a buffer, you +pass a pointer to a pointer. This function will compute the size of +the buffer needed, allocate memory with @code{malloc}, and store a +pointer to the allocated memory in @code{*@var{resptr}}. The value +returned is the same as @code{sprintf} would return. If memory could +not be allocated, minus one is returned and @code{NULL} is stored in +@code{*@var{resptr}}. + +@end deftypefn + +@c atexit.c:6 +@deftypefn Supplemental int atexit (void (*@var{f})()) + +Causes function @var{f} to be called at exit. Returns 0. + +@end deftypefn + +@c basename.c:6 +@deftypefn Supplemental char* basename (const char *@var{name}) + +Returns a pointer to the last component of pathname @var{name}. +Behavior is undefined if the pathname ends in a directory separator. + +@end deftypefn + +@c bcmp.c:6 +@deftypefn Supplemental int bcmp (char *@var{x}, char *@var{y}, int @var{count}) + +Compares the first @var{count} bytes of two areas of memory. Returns +zero if they are the same, nonzero otherwise. Returns zero if +@var{count} is zero. A nonzero result only indicates a difference, +it does not indicate any sorting order (say, by having a positive +result mean @var{x} sorts before @var{y}). + +@end deftypefn + +@c bcopy.c:3 +@deftypefn Supplemental void bcopy (char *@var{in}, char *@var{out}, int @var{length}) + +Copies @var{length} bytes from memory region @var{in} to region +@var{out}. The use of @code{bcopy} is deprecated in new programs. + +@end deftypefn + +@c bsearch.c:33 +@deftypefn Supplemental void* bsearch (const void *@var{key}, const void *@var{base}, size_t @var{nmemb}, size_t @var{size}, int (*@var{compar})(const void *, const void *)) + +Performs a search over an array of @var{nmemb} elements pointed to by +@var{base} for a member that matches the object pointed to by @var{key}. +The size of each member is specified by @var{size}. The array contents +should be sorted in ascending order according to the @var{compar} +comparison function. This routine should take two arguments pointing to +the @var{key} and to an array member, in that order, and should return an +integer less than, equal to, or greater than zero if the @var{key} object +is respectively less than, matching, or greater than the array member. + +@end deftypefn + +@c argv.c:124 +@deftypefn Extension char** buildargv (char *@var{sp}) + +Given a pointer to a string, parse the string extracting fields +separated by whitespace and optionally enclosed within either single +or double quotes (which are stripped off), and build a vector of +pointers to copies of the string for each field. The input string +remains unchanged. The last element of the vector is followed by a +@code{NULL} element. + +All of the memory for the pointer array and copies of the string +is obtained from @code{malloc}. All of the memory can be returned to the +system with the single function call @code{freeargv}, which takes the +returned result of @code{buildargv}, as it's argument. + +Returns a pointer to the argument vector if successful. Returns +@code{NULL} if @var{sp} is @code{NULL} or if there is insufficient +memory to complete building the argument vector. + +If the input is a null string (as opposed to a @code{NULL} pointer), +then buildarg returns an argument vector that has one arg, a null +string. + +@end deftypefn + +@c bzero.c:6 +@deftypefn Supplemental void bzero (char *@var{mem}, int @var{count}) + +Zeros @var{count} bytes starting at @var{mem}. Use of this function +is deprecated in favor of @code{memset}. + +@end deftypefn + +@c calloc.c:6 +@deftypefn Supplemental void* calloc (size_t @var{nelem}, size_t @var{elsize}) + +Uses @code{malloc} to allocate storage for @var{nelem} objects of +@var{elsize} bytes each, then zeros the memory. + +@end deftypefn + +@c choose-temp.c:42 +@deftypefn Extension char* choose_temp_base (void) + +Return a prefix for temporary file names or @code{NULL} if unable to +find one. The current directory is chosen if all else fails so the +program is exited if a temporary directory can't be found (@code{mktemp} +fails). The buffer for the result is obtained with @code{xmalloc}. + +This function is provided for backwards compatibility only. Its use is +not recommended. + +@end deftypefn + +@c make-temp-file.c:87 +@deftypefn Replacement char* choose_tmpdir () + +Returns a pointer to a directory path suitable for creating temporary +files in. + +@end deftypefn + +@c clock.c:27 +@deftypefn Supplemental long clock (void) + +Returns an approximation of the CPU time used by the process as a +@code{clock_t}; divide this number by @samp{CLOCKS_PER_SEC} to get the +number of seconds used. + +@end deftypefn + +@c concat.c:24 +@deftypefn Extension char* concat (const char *@var{s1}, const char *@var{s2}, @dots{}, @code{NULL}) + +Concatenate zero or more of strings and return the result in freshly +@code{xmalloc}ed memory. Returns @code{NULL} if insufficient memory is +available. The argument list is terminated by the first @code{NULL} +pointer encountered. Pointers to empty strings are ignored. + +@end deftypefn + +@c argv.c:52 +@deftypefn Extension char** dupargv (char **@var{vector}) + +Duplicate an argument vector. Simply scans through @var{vector}, +duplicating each argument until the terminating @code{NULL} is found. +Returns a pointer to the argument vector if successful. Returns +@code{NULL} if there is insufficient memory to complete building the +argument vector. + +@end deftypefn + +@c strerror.c:567 +@deftypefn Extension int errno_max (void) + +Returns the maximum @code{errno} value for which a corresponding +symbolic name or message is available. Note that in the case where we +use the @code{sys_errlist} supplied by the system, it is possible for +there to be more symbolic names than messages, or vice versa. In +fact, the manual page for @code{perror(3C)} explicitly warns that one +should check the size of the table (@code{sys_nerr}) before indexing +it, since new error codes may be added to the system before they are +added to the table. Thus @code{sys_nerr} might be smaller than value +implied by the largest @code{errno} value defined in @code{}. + +We return the maximum value that can be used to obtain a meaningful +symbolic name or message. + +@end deftypefn + +@c argv.c:348 +@deftypefn Extension void expandargv (int *@var{argcp}, char ***@var{argvp}) + +The @var{argcp} and @code{argvp} arguments are pointers to the usual +@code{argc} and @code{argv} arguments to @code{main}. This function +looks for arguments that begin with the character @samp{@@}. Any such +arguments are interpreted as ``response files''. The contents of the +response file are interpreted as additional command line options. In +particular, the file is separated into whitespace-separated strings; +each such string is taken as a command-line option. The new options +are inserted in place of the option naming the response file, and +@code{*argcp} and @code{*argvp} will be updated. If the value of +@code{*argvp} is modified by this function, then the new value has +been dynamically allocated and can be deallocated by the caller with +@code{freeargv}. However, most callers will simply call +@code{expandargv} near the beginning of @code{main} and allow the +operating system to free the memory when the program exits. + +@end deftypefn + +@c fdmatch.c:23 +@deftypefn Extension int fdmatch (int @var{fd1}, int @var{fd2}) + +Check to see if two open file descriptors refer to the same file. +This is useful, for example, when we have an open file descriptor for +an unnamed file, and the name of a file that we believe to correspond +to that fd. This can happen when we are exec'd with an already open +file (@code{stdout} for example) or from the SVR4 @file{/proc} calls +that return open file descriptors for mapped address spaces. All we +have to do is open the file by name and check the two file descriptors +for a match, which is done by comparing major and minor device numbers +and inode numbers. + +@end deftypefn + +@c fopen_unlocked.c:48 +@deftypefn Extension {FILE *} fdopen_unlocked (int @var{fildes}, const char * @var{mode}) + +Opens and returns a @code{FILE} pointer via @code{fdopen}. If the +operating system supports it, ensure that the stream is setup to avoid +any multi-threaded locking. Otherwise return the @code{FILE} pointer +unchanged. + +@end deftypefn + +@c ffs.c:3 +@deftypefn Supplemental int ffs (int @var{valu}) + +Find the first (least significant) bit set in @var{valu}. Bits are +numbered from right to left, starting with bit 1 (corresponding to the +value 1). If @var{valu} is zero, zero is returned. + +@end deftypefn + +@c filename_cmp.c:32 +@deftypefn Extension int filename_cmp (const char *@var{s1}, const char *@var{s2}) + +Return zero if the two file names @var{s1} and @var{s2} are equivalent. +If not equivalent, the returned value is similar to what @code{strcmp} +would return. In other words, it returns a negative value if @var{s1} +is less than @var{s2}, or a positive value if @var{s2} is greater than +@var{s2}. + +This function does not normalize file names. As a result, this function +will treat filenames that are spelled differently as different even in +the case when the two filenames point to the same underlying file. +However, it does handle the fact that on DOS-like file systems, forward +and backward slashes are equal. + +@end deftypefn + +@c fnmatch.txh:1 +@deftypefn Replacement int fnmatch (const char *@var{pattern}, const char *@var{string}, int @var{flags}) + +Matches @var{string} against @var{pattern}, returning zero if it +matches, @code{FNM_NOMATCH} if not. @var{pattern} may contain the +wildcards @code{?} to match any one character, @code{*} to match any +zero or more characters, or a set of alternate characters in square +brackets, like @samp{[a-gt8]}, which match one character (@code{a} +through @code{g}, or @code{t}, or @code{8}, in this example) if that one +character is in the set. A set may be inverted (i.e., match anything +except what's in the set) by giving @code{^} or @code{!} as the first +character in the set. To include those characters in the set, list them +as anything other than the first character of the set. To include a +dash in the set, list it last in the set. A backslash character makes +the following character not special, so for example you could match +against a literal asterisk with @samp{\*}. To match a literal +backslash, use @samp{\\}. + +@code{flags} controls various aspects of the matching process, and is a +boolean OR of zero or more of the following values (defined in +@code{}): + +@table @code + +@item FNM_PATHNAME +@itemx FNM_FILE_NAME +@var{string} is assumed to be a path name. No wildcard will ever match +@code{/}. + +@item FNM_NOESCAPE +Do not interpret backslashes as quoting the following special character. + +@item FNM_PERIOD +A leading period (at the beginning of @var{string}, or if +@code{FNM_PATHNAME} after a slash) is not matched by @code{*} or +@code{?} but must be matched explicitly. + +@item FNM_LEADING_DIR +Means that @var{string} also matches @var{pattern} if some initial part +of @var{string} matches, and is followed by @code{/} and zero or more +characters. For example, @samp{foo*} would match either @samp{foobar} +or @samp{foobar/grill}. + +@item FNM_CASEFOLD +Ignores case when performing the comparison. + +@end table + +@end deftypefn + +@c fopen_unlocked.c:39 +@deftypefn Extension {FILE *} fopen_unlocked (const char *@var{path}, const char * @var{mode}) + +Opens and returns a @code{FILE} pointer via @code{fopen}. If the +operating system supports it, ensure that the stream is setup to avoid +any multi-threaded locking. Otherwise return the @code{FILE} pointer +unchanged. + +@end deftypefn + +@c argv.c:97 +@deftypefn Extension void freeargv (char **@var{vector}) + +Free an argument vector that was built using @code{buildargv}. Simply +scans through @var{vector}, freeing the memory for each argument until +the terminating @code{NULL} is found, and then frees @var{vector} +itself. + +@end deftypefn + +@c fopen_unlocked.c:57 +@deftypefn Extension {FILE *} freopen_unlocked (const char * @var{path}, const char * @var{mode}, FILE * @var{stream}) + +Opens and returns a @code{FILE} pointer via @code{freopen}. If the +operating system supports it, ensure that the stream is setup to avoid +any multi-threaded locking. Otherwise return the @code{FILE} pointer +unchanged. + +@end deftypefn + +@c getruntime.c:82 +@deftypefn Replacement long get_run_time (void) + +Returns the time used so far, in microseconds. If possible, this is +the time used by this process, else it is the elapsed time since the +process started. + +@end deftypefn + +@c getcwd.c:6 +@deftypefn Supplemental char* getcwd (char *@var{pathname}, int @var{len}) + +Copy the absolute pathname for the current working directory into +@var{pathname}, which is assumed to point to a buffer of at least +@var{len} bytes, and return a pointer to the buffer. If the current +directory's path doesn't fit in @var{len} characters, the result is +@code{NULL} and @code{errno} is set. If @var{pathname} is a null pointer, +@code{getcwd} will obtain @var{len} bytes of space using +@code{malloc}. + +@end deftypefn + +@c getpagesize.c:5 +@deftypefn Supplemental int getpagesize (void) + +Returns the number of bytes in a page of memory. This is the +granularity of many of the system memory management routines. No +guarantee is made as to whether or not it is the same as the basic +memory management hardware page size. + +@end deftypefn + +@c getpwd.c:5 +@deftypefn Supplemental char* getpwd (void) + +Returns the current working directory. This implementation caches the +result on the assumption that the process will not call @code{chdir} +between calls to @code{getpwd}. + +@end deftypefn + +@c gettimeofday.c:12 +@deftypefn Supplemental int gettimeofday (struct timeval *@var{tp}, void *@var{tz}) + +Writes the current time to @var{tp}. This implementation requires +that @var{tz} be NULL. Returns 0 on success, -1 on failure. + +@end deftypefn + +@c hex.c:33 +@deftypefn Extension void hex_init (void) + +Initializes the array mapping the current character set to +corresponding hex values. This function must be called before any +call to @code{hex_p} or @code{hex_value}. If you fail to call it, a +default ASCII-based table will normally be used on ASCII systems. + +@end deftypefn + +@c hex.c:42 +@deftypefn Extension int hex_p (int @var{c}) + +Evaluates to non-zero if the given character is a valid hex character, +or zero if it is not. Note that the value you pass will be cast to +@code{unsigned char} within the macro. + +@end deftypefn + +@c hex.c:50 +@deftypefn Extension {unsigned int} hex_value (int @var{c}) + +Returns the numeric equivalent of the given character when interpreted +as a hexadecimal digit. The result is undefined if you pass an +invalid hex digit. Note that the value you pass will be cast to +@code{unsigned char} within the macro. + +The @code{hex_value} macro returns @code{unsigned int}, rather than +signed @code{int}, to make it easier to use in parsing addresses from +hex dump files: a signed @code{int} would be sign-extended when +converted to a wider unsigned type --- like @code{bfd_vma}, on some +systems. + +@end deftypefn + +@c index.c:5 +@deftypefn Supplemental char* index (char *@var{s}, int @var{c}) + +Returns a pointer to the first occurrence of the character @var{c} in +the string @var{s}, or @code{NULL} if not found. The use of @code{index} is +deprecated in new programs in favor of @code{strchr}. + +@end deftypefn + +@c insque.c:6 +@deftypefn Supplemental void insque (struct qelem *@var{elem}, struct qelem *@var{pred}) +@deftypefnx Supplemental void remque (struct qelem *@var{elem}) + +Routines to manipulate queues built from doubly linked lists. The +@code{insque} routine inserts @var{elem} in the queue immediately +after @var{pred}. The @code{remque} routine removes @var{elem} from +its containing queue. These routines expect to be passed pointers to +structures which have as their first members a forward pointer and a +back pointer, like this prototype (although no prototype is provided): + +@example +struct qelem @{ + struct qelem *q_forw; + struct qelem *q_back; + char q_data[]; +@}; +@end example + +@end deftypefn + +@c safe-ctype.c:46 +@deffn Extension ISALPHA (@var{c}) +@deffnx Extension ISALNUM (@var{c}) +@deffnx Extension ISBLANK (@var{c}) +@deffnx Extension ISCNTRL (@var{c}) +@deffnx Extension ISDIGIT (@var{c}) +@deffnx Extension ISGRAPH (@var{c}) +@deffnx Extension ISLOWER (@var{c}) +@deffnx Extension ISPRINT (@var{c}) +@deffnx Extension ISPUNCT (@var{c}) +@deffnx Extension ISSPACE (@var{c}) +@deffnx Extension ISUPPER (@var{c}) +@deffnx Extension ISXDIGIT (@var{c}) + +These twelve macros are defined by @file{safe-ctype.h}. Each has the +same meaning as the corresponding macro (with name in lowercase) +defined by the standard header @file{ctype.h}. For example, +@code{ISALPHA} returns true for alphabetic characters and false for +others. However, there are two differences between these macros and +those provided by @file{ctype.h}: + +@itemize @bullet +@item These macros are guaranteed to have well-defined behavior for all +values representable by @code{signed char} and @code{unsigned char}, and +for @code{EOF}. + +@item These macros ignore the current locale; they are true for these +fixed sets of characters: +@multitable {@code{XDIGIT}} {yada yada yada yada yada yada yada yada} +@item @code{ALPHA} @tab @kbd{A-Za-z} +@item @code{ALNUM} @tab @kbd{A-Za-z0-9} +@item @code{BLANK} @tab @kbd{space tab} +@item @code{CNTRL} @tab @code{!PRINT} +@item @code{DIGIT} @tab @kbd{0-9} +@item @code{GRAPH} @tab @code{ALNUM || PUNCT} +@item @code{LOWER} @tab @kbd{a-z} +@item @code{PRINT} @tab @code{GRAPH ||} @kbd{space} +@item @code{PUNCT} @tab @kbd{`~!@@#$%^&*()_-=+[@{]@}\|;:'",<.>/?} +@item @code{SPACE} @tab @kbd{space tab \n \r \f \v} +@item @code{UPPER} @tab @kbd{A-Z} +@item @code{XDIGIT} @tab @kbd{0-9A-Fa-f} +@end multitable + +Note that, if the host character set is ASCII or a superset thereof, +all these macros will return false for all values of @code{char} outside +the range of 7-bit ASCII. In particular, both ISPRINT and ISCNTRL return +false for characters with numeric values from 128 to 255. +@end itemize +@end deffn + +@c safe-ctype.c:95 +@deffn Extension ISIDNUM (@var{c}) +@deffnx Extension ISIDST (@var{c}) +@deffnx Extension IS_VSPACE (@var{c}) +@deffnx Extension IS_NVSPACE (@var{c}) +@deffnx Extension IS_SPACE_OR_NUL (@var{c}) +@deffnx Extension IS_ISOBASIC (@var{c}) +These six macros are defined by @file{safe-ctype.h} and provide +additional character classes which are useful when doing lexical +analysis of C or similar languages. They are true for the following +sets of characters: + +@multitable {@code{SPACE_OR_NUL}} {yada yada yada yada yada yada yada yada} +@item @code{IDNUM} @tab @kbd{A-Za-z0-9_} +@item @code{IDST} @tab @kbd{A-Za-z_} +@item @code{VSPACE} @tab @kbd{\r \n} +@item @code{NVSPACE} @tab @kbd{space tab \f \v \0} +@item @code{SPACE_OR_NUL} @tab @code{VSPACE || NVSPACE} +@item @code{ISOBASIC} @tab @code{VSPACE || NVSPACE || PRINT} +@end multitable +@end deffn + +@c lbasename.c:23 +@deftypefn Replacement {const char*} lbasename (const char *@var{name}) + +Given a pointer to a string containing a typical pathname +(@samp{/usr/src/cmd/ls/ls.c} for example), returns a pointer to the +last component of the pathname (@samp{ls.c} in this case). The +returned pointer is guaranteed to lie within the original +string. This latter fact is not true of many vendor C +libraries, which return special strings or modify the passed +strings for particular input. + +In particular, the empty string returns the same empty string, +and a path ending in @code{/} returns the empty string after it. + +@end deftypefn + +@c lrealpath.c:25 +@deftypefn Replacement {const char*} lrealpath (const char *@var{name}) + +Given a pointer to a string containing a pathname, returns a canonical +version of the filename. Symlinks will be resolved, and ``.'' and ``..'' +components will be simplified. The returned value will be allocated using +@code{malloc}, or @code{NULL} will be returned on a memory allocation error. + +@end deftypefn + +@c make-relative-prefix.c:24 +@deftypefn Extension {const char*} make_relative_prefix (const char *@var{progname}, const char *@var{bin_prefix}, const char *@var{prefix}) + +Given three paths @var{progname}, @var{bin_prefix}, @var{prefix}, +return the path that is in the same position relative to +@var{progname}'s directory as @var{prefix} is relative to +@var{bin_prefix}. That is, a string starting with the directory +portion of @var{progname}, followed by a relative pathname of the +difference between @var{bin_prefix} and @var{prefix}. + +If @var{progname} does not contain any directory separators, +@code{make_relative_prefix} will search @env{PATH} to find a program +named @var{progname}. Also, if @var{progname} is a symbolic link, +the symbolic link will be resolved. + +For example, if @var{bin_prefix} is @code{/alpha/beta/gamma/gcc/delta}, +@var{prefix} is @code{/alpha/beta/gamma/omega/}, and @var{progname} is +@code{/red/green/blue/gcc}, then this function will return +@code{/red/green/blue/../../omega/}. + +The return value is normally allocated via @code{malloc}. If no +relative prefix can be found, return @code{NULL}. + +@end deftypefn + +@c make-temp-file.c:137 +@deftypefn Replacement char* make_temp_file (const char *@var{suffix}) + +Return a temporary file name (as a string) or @code{NULL} if unable to +create one. @var{suffix} is a suffix to append to the file name. The +string is @code{malloc}ed, and the temporary file has been created. + +@end deftypefn + +@c memchr.c:3 +@deftypefn Supplemental void* memchr (const void *@var{s}, int @var{c}, size_t @var{n}) + +This function searches memory starting at @code{*@var{s}} for the +character @var{c}. The search only ends with the first occurrence of +@var{c}, or after @var{length} characters; in particular, a null +character does not terminate the search. If the character @var{c} is +found within @var{length} characters of @code{*@var{s}}, a pointer +to the character is returned. If @var{c} is not found, then @code{NULL} is +returned. + +@end deftypefn + +@c memcmp.c:6 +@deftypefn Supplemental int memcmp (const void *@var{x}, const void *@var{y}, size_t @var{count}) + +Compares the first @var{count} bytes of two areas of memory. Returns +zero if they are the same, a value less than zero if @var{x} is +lexically less than @var{y}, or a value greater than zero if @var{x} +is lexically greater than @var{y}. Note that lexical order is determined +as if comparing unsigned char arrays. + +@end deftypefn + +@c memcpy.c:6 +@deftypefn Supplemental void* memcpy (void *@var{out}, const void *@var{in}, size_t @var{length}) + +Copies @var{length} bytes from memory region @var{in} to region +@var{out}. Returns a pointer to @var{out}. + +@end deftypefn + +@c memmove.c:6 +@deftypefn Supplemental void* memmove (void *@var{from}, const void *@var{to}, size_t @var{count}) + +Copies @var{count} bytes from memory area @var{from} to memory area +@var{to}, returning a pointer to @var{to}. + +@end deftypefn + +@c mempcpy.c:23 +@deftypefn Supplemental void* mempcpy (void *@var{out}, const void *@var{in}, size_t @var{length}) + +Copies @var{length} bytes from memory region @var{in} to region +@var{out}. Returns a pointer to @var{out} + @var{length}. + +@end deftypefn + +@c memset.c:6 +@deftypefn Supplemental void* memset (void *@var{s}, int @var{c}, size_t @var{count}) + +Sets the first @var{count} bytes of @var{s} to the constant byte +@var{c}, returning a pointer to @var{s}. + +@end deftypefn + +@c mkstemps.c:58 +@deftypefn Replacement int mkstemps (char *@var{pattern}, int @var{suffix_len}) + +Generate a unique temporary file name from @var{pattern}. +@var{pattern} has the form: + +@example + @var{path}/ccXXXXXX@var{suffix} +@end example + +@var{suffix_len} tells us how long @var{suffix} is (it can be zero +length). The last six characters of @var{pattern} before @var{suffix} +must be @samp{XXXXXX}; they are replaced with a string that makes the +filename unique. Returns a file descriptor open on the file for +reading and writing. + +@end deftypefn + +@c pexecute.txh:266 +@deftypefn Extension void pex_free (struct pex_obj @var{obj}) + +Clean up and free all data associated with @var{obj}. + +@end deftypefn + +@c pexecute.txh:241 +@deftypefn Extension int pex_get_status (struct pex_obj *@var{obj}, int @var{count}, int *@var{vector}) + +Returns the exit status of all programs run using @var{obj}. +@var{count} is the number of results expected. The results will be +placed into @var{vector}. The results are in the order of the calls +to @code{pex_run}. Returns 0 on error, 1 on success. + +@end deftypefn + +@c pexecute.txh:250 +@deftypefn Extension int pex_get_times (struct pex_obj *@var{obj}, int @var{count}, struct pex_time *@var{vector}) + +Returns the process execution times of all programs run using +@var{obj}. @var{count} is the number of results expected. The +results will be placed into @var{vector}. The results are in the +order of the calls to @code{pex_run}. Returns 0 on error, 1 on +success. + +@code{struct pex_time} has the following fields of the type +@code{unsigned long}: @code{user_seconds}, +@code{user_microseconds}, @code{system_seconds}, +@code{system_microseconds}. On systems which do not support reporting +process times, all the fields will be set to @code{0}. + +@end deftypefn + +@c pexecute.txh:2 +@deftypefn Extension {struct pex_obj *} pex_init (int @var{flags}, const char *@var{pname}, const char *@var{tempbase}) + +Prepare to execute one or more programs, with standard output of each +program fed to standard input of the next. This is a system +independent interface to execute a pipeline. + +@var{flags} is a bitwise combination of the following: + +@table @code + +@vindex PEX_RECORD_TIMES +@item PEX_RECORD_TIMES +Record subprocess times if possible. + +@vindex PEX_USE_PIPES +@item PEX_USE_PIPES +Use pipes for communication between processes, if possible. + +@vindex PEX_SAVE_TEMPS +@item PEX_SAVE_TEMPS +Don't delete temporary files used for communication between +processes. + +@end table + +@var{pname} is the name of program to be executed, used in error +messages. @var{tempbase} is a base name to use for any required +temporary files; it may be @code{NULL} to use a randomly chosen name. + +@end deftypefn + +@c pexecute.txh:155 +@deftypefn Extension {FILE *} pex_input_file (struct pex_obj *@var{obj}, int @var{flags}, const char *@var{in_name}) + +Return a stream for a temporary file to pass to the first program in +the pipeline as input. + +The name of the input file is chosen according to the same rules +@code{pex_run} uses to choose output file names, based on +@var{in_name}, @var{obj} and the @code{PEX_SUFFIX} bit in @var{flags}. + +Don't call @code{fclose} on the returned stream; the first call to +@code{pex_run} closes it automatically. + +If @var{flags} includes @code{PEX_BINARY_OUTPUT}, open the stream in +binary mode; otherwise, open it in the default mode. Including +@code{PEX_BINARY_OUTPUT} in @var{flags} has no effect on Unix. +@end deftypefn + +@c pexecute.txh:172 +@deftypefn Extension {FILE *} pex_input_pipe (struct pex_obj *@var{obj}, int @var{binary}) + +Return a stream @var{fp} for a pipe connected to the standard input of +the first program in the pipeline; @var{fp} is opened for writing. +You must have passed @code{PEX_USE_PIPES} to the @code{pex_init} call +that returned @var{obj}. + +You must close @var{fp} using @code{fclose} yourself when you have +finished writing data to the pipeline. + +The file descriptor underlying @var{fp} is marked not to be inherited +by child processes. + +On systems that do not support pipes, this function returns +@code{NULL}, and sets @code{errno} to @code{EINVAL}. If you would +like to write code that is portable to all systems the @code{pex} +functions support, consider using @code{pex_input_file} instead. + +There are two opportunities for deadlock using +@code{pex_input_pipe}: + +@itemize @bullet +@item +Most systems' pipes can buffer only a fixed amount of data; a process +that writes to a full pipe blocks. Thus, if you write to @file{fp} +before starting the first process, you run the risk of blocking when +there is no child process yet to read the data and allow you to +continue. @code{pex_input_pipe} makes no promises about the +size of the pipe's buffer, so if you need to write any data at all +before starting the first process in the pipeline, consider using +@code{pex_input_file} instead. + +@item +Using @code{pex_input_pipe} and @code{pex_read_output} together +may also cause deadlock. If the output pipe fills up, so that each +program in the pipeline is waiting for the next to read more data, and +you fill the input pipe by writing more data to @var{fp}, then there +is no way to make progress: the only process that could read data from +the output pipe is you, but you are blocked on the input pipe. + +@end itemize + +@end deftypefn + +@c pexecute.txh:272 +@deftypefn Extension {const char *} pex_one (int @var{flags}, const char *@var{executable}, char * const *@var{argv}, const char *@var{pname}, const char *@var{outname}, const char *@var{errname}, int *@var{status}, int *@var{err}) + +An interface to permit the easy execution of a +single program. The return value and most of the parameters are as +for a call to @code{pex_run}. @var{flags} is restricted to a +combination of @code{PEX_SEARCH}, @code{PEX_STDERR_TO_STDOUT}, and +@code{PEX_BINARY_OUTPUT}. @var{outname} is interpreted as if +@code{PEX_LAST} were set. On a successful return, @code{*@var{status}} will +be set to the exit status of the program. + +@end deftypefn + +@c pexecute.txh:228 +@deftypefn Extension {FILE *} pex_read_err (struct pex_obj *@var{obj}, int @var{binary}) + +Returns a @code{FILE} pointer which may be used to read the standard +error of the last program in the pipeline. When this is used, +@code{PEX_LAST} should not be used in a call to @code{pex_run}. After +this is called, @code{pex_run} may no longer be called with the same +@var{obj}. @var{binary} should be non-zero if the file should be +opened in binary mode. Don't call @code{fclose} on the returned file; +it will be closed by @code{pex_free}. + +@end deftypefn + +@c pexecute.txh:216 +@deftypefn Extension {FILE *} pex_read_output (struct pex_obj *@var{obj}, int @var{binary}) + +Returns a @code{FILE} pointer which may be used to read the standard +output of the last program in the pipeline. When this is used, +@code{PEX_LAST} should not be used in a call to @code{pex_run}. After +this is called, @code{pex_run} may no longer be called with the same +@var{obj}. @var{binary} should be non-zero if the file should be +opened in binary mode. Don't call @code{fclose} on the returned file; +it will be closed by @code{pex_free}. + +@end deftypefn + +@c pexecute.txh:33 +@deftypefn Extension {const char *} pex_run (struct pex_obj *@var{obj}, int @var{flags}, const char *@var{executable}, char * const *@var{argv}, const char *@var{outname}, const char *@var{errname}, int *@var{err}) + +Execute one program in a pipeline. On success this returns +@code{NULL}. On failure it returns an error message, a statically +allocated string. + +@var{obj} is returned by a previous call to @code{pex_init}. + +@var{flags} is a bitwise combination of the following: + +@table @code + +@vindex PEX_LAST +@item PEX_LAST +This must be set on the last program in the pipeline. In particular, +it should be set when executing a single program. The standard output +of the program will be sent to @var{outname}, or, if @var{outname} is +@code{NULL}, to the standard output of the calling program. Do @emph{not} +set this bit if you want to call @code{pex_read_output} +(described below). After a call to @code{pex_run} with this bit set, +@var{pex_run} may no longer be called with the same @var{obj}. + +@vindex PEX_SEARCH +@item PEX_SEARCH +Search for the program using the user's executable search path. + +@vindex PEX_SUFFIX +@item PEX_SUFFIX +@var{outname} is a suffix. See the description of @var{outname}, +below. + +@vindex PEX_STDERR_TO_STDOUT +@item PEX_STDERR_TO_STDOUT +Send the program's standard error to standard output, if possible. + +@vindex PEX_BINARY_INPUT +@vindex PEX_BINARY_OUTPUT +@vindex PEX_BINARY_ERROR +@item PEX_BINARY_INPUT +@itemx PEX_BINARY_OUTPUT +@itemx PEX_BINARY_ERROR +The standard input (output or error) of the program should be read (written) in +binary mode rather than text mode. These flags are ignored on systems +which do not distinguish binary mode and text mode, such as Unix. For +proper behavior these flags should match appropriately---a call to +@code{pex_run} using @code{PEX_BINARY_OUTPUT} should be followed by a +call using @code{PEX_BINARY_INPUT}. + +@vindex PEX_STDERR_TO_PIPE +@item PEX_STDERR_TO_PIPE +Send the program's standard error to a pipe, if possible. This flag +cannot be specified together with @code{PEX_STDERR_TO_STDOUT}. This +flag can be specified only on the last program in pipeline. + +@end table + +@var{executable} is the program to execute. @var{argv} is the set of +arguments to pass to the program; normally @code{@var{argv}[0]} will +be a copy of @var{executable}. + +@var{outname} is used to set the name of the file to use for standard +output. There are two cases in which no output file will be used: + +@enumerate +@item +if @code{PEX_LAST} is not set in @var{flags}, and @code{PEX_USE_PIPES} +was set in the call to @code{pex_init}, and the system supports pipes + +@item +if @code{PEX_LAST} is set in @var{flags}, and @var{outname} is +@code{NULL} +@end enumerate + +@noindent +Otherwise the code will use a file to hold standard +output. If @code{PEX_LAST} is not set, this file is considered to be +a temporary file, and it will be removed when no longer needed, unless +@code{PEX_SAVE_TEMPS} was set in the call to @code{pex_init}. + +There are two cases to consider when setting the name of the file to +hold standard output. + +@enumerate +@item +@code{PEX_SUFFIX} is set in @var{flags}. In this case +@var{outname} may not be @code{NULL}. If the @var{tempbase} parameter +to @code{pex_init} was not @code{NULL}, then the output file name is +the concatenation of @var{tempbase} and @var{outname}. If +@var{tempbase} was @code{NULL}, then the output file name is a random +file name ending in @var{outname}. + +@item +@code{PEX_SUFFIX} was not set in @var{flags}. In this +case, if @var{outname} is not @code{NULL}, it is used as the output +file name. If @var{outname} is @code{NULL}, and @var{tempbase} was +not NULL, the output file name is randomly chosen using +@var{tempbase}. Otherwise the output file name is chosen completely +at random. +@end enumerate + +@var{errname} is the file name to use for standard error output. If +it is @code{NULL}, standard error is the same as the caller's. +Otherwise, standard error is written to the named file. + +On an error return, the code sets @code{*@var{err}} to an @code{errno} +value, or to 0 if there is no relevant @code{errno}. + +@end deftypefn + +@c pexecute.txh:142 +@deftypefn Extension {const char *} pex_run_in_environment (struct pex_obj *@var{obj}, int @var{flags}, const char *@var{executable}, char * const *@var{argv}, char * const *@var{env}, int @var{env_size}, const char *@var{outname}, const char *@var{errname}, int *@var{err}) + +Execute one program in a pipeline, permitting the environment for the +program to be specified. Behaviour and parameters not listed below are +as for @code{pex_run}. + +@var{env} is the environment for the child process, specified as an array of +character pointers. Each element of the array should point to a string of the +form @code{VAR=VALUE}, with the exception of the last element that must be +@code{NULL}. + +@end deftypefn + +@c pexecute.txh:284 +@deftypefn Extension int pexecute (const char *@var{program}, char * const *@var{argv}, const char *@var{this_pname}, const char *@var{temp_base}, char **@var{errmsg_fmt}, char **@var{errmsg_arg}, int @var{flags}) + +This is the old interface to execute one or more programs. It is +still supported for compatibility purposes, but is no longer +documented. + +@end deftypefn + +@c strsignal.c:539 +@deftypefn Supplemental void psignal (int @var{signo}, char *@var{message}) + +Print @var{message} to the standard error, followed by a colon, +followed by the description of the signal specified by @var{signo}, +followed by a newline. + +@end deftypefn + +@c putenv.c:21 +@deftypefn Supplemental int putenv (const char *@var{string}) + +Uses @code{setenv} or @code{unsetenv} to put @var{string} into +the environment or remove it. If @var{string} is of the form +@samp{name=value} the string is added; if no @samp{=} is present the +name is unset/removed. + +@end deftypefn + +@c pexecute.txh:292 +@deftypefn Extension int pwait (int @var{pid}, int *@var{status}, int @var{flags}) + +Another part of the old execution interface. + +@end deftypefn + +@c random.c:39 +@deftypefn Supplement {long int} random (void) +@deftypefnx Supplement void srandom (unsigned int @var{seed}) +@deftypefnx Supplement void* initstate (unsigned int @var{seed}, void *@var{arg_state}, unsigned long @var{n}) +@deftypefnx Supplement void* setstate (void *@var{arg_state}) + +Random number functions. @code{random} returns a random number in the +range 0 to @code{LONG_MAX}. @code{srandom} initializes the random +number generator to some starting point determined by @var{seed} +(else, the values returned by @code{random} are always the same for each +run of the program). @code{initstate} and @code{setstate} allow fine-grained +control over the state of the random number generator. + +@end deftypefn + +@c concat.c:173 +@deftypefn Extension char* reconcat (char *@var{optr}, const char *@var{s1}, @dots{}, @code{NULL}) + +Same as @code{concat}, except that if @var{optr} is not @code{NULL} it +is freed after the string is created. This is intended to be useful +when you're extending an existing string or building up a string in a +loop: + +@example + str = reconcat (str, "pre-", str, NULL); +@end example + +@end deftypefn + +@c rename.c:6 +@deftypefn Supplemental int rename (const char *@var{old}, const char *@var{new}) + +Renames a file from @var{old} to @var{new}. If @var{new} already +exists, it is removed. + +@end deftypefn + +@c rindex.c:5 +@deftypefn Supplemental char* rindex (const char *@var{s}, int @var{c}) + +Returns a pointer to the last occurrence of the character @var{c} in +the string @var{s}, or @code{NULL} if not found. The use of @code{rindex} is +deprecated in new programs in favor of @code{strrchr}. + +@end deftypefn + +@c setenv.c:22 +@deftypefn Supplemental int setenv (const char *@var{name}, const char *@var{value}, int @var{overwrite}) +@deftypefnx Supplemental void unsetenv (const char *@var{name}) + +@code{setenv} adds @var{name} to the environment with value +@var{value}. If the name was already present in the environment, +the new value will be stored only if @var{overwrite} is nonzero. +The companion @code{unsetenv} function removes @var{name} from the +environment. This implementation is not safe for multithreaded code. + +@end deftypefn + +@c strsignal.c:348 +@deftypefn Extension int signo_max (void) + +Returns the maximum signal value for which a corresponding symbolic +name or message is available. Note that in the case where we use the +@code{sys_siglist} supplied by the system, it is possible for there to +be more symbolic names than messages, or vice versa. In fact, the +manual page for @code{psignal(3b)} explicitly warns that one should +check the size of the table (@code{NSIG}) before indexing it, since +new signal codes may be added to the system before they are added to +the table. Thus @code{NSIG} might be smaller than value implied by +the largest signo value defined in @code{}. + +We return the maximum value that can be used to obtain a meaningful +symbolic name or message. + +@end deftypefn + +@c sigsetmask.c:8 +@deftypefn Supplemental int sigsetmask (int @var{set}) + +Sets the signal mask to the one provided in @var{set} and returns +the old mask (which, for libiberty's implementation, will always +be the value @code{1}). + +@end deftypefn + +@c snprintf.c:28 +@deftypefn Supplemental int snprintf (char *@var{buf}, size_t @var{n}, const char *@var{format}, ...) + +This function is similar to sprintf, but it will print at most @var{n} +characters. On error the return value is -1, otherwise it returns the +number of characters that would have been printed had @var{n} been +sufficiently large, regardless of the actual value of @var{n}. Note +some pre-C99 system libraries do not implement this correctly so users +cannot generally rely on the return value if the system version of +this function is used. + +@end deftypefn + +@c spaces.c:22 +@deftypefn Extension char* spaces (int @var{count}) + +Returns a pointer to a memory region filled with the specified +number of spaces and null terminated. The returned pointer is +valid until at least the next call. + +@end deftypefn + +@c stpcpy.c:23 +@deftypefn Supplemental char* stpcpy (char *@var{dst}, const char *@var{src}) + +Copies the string @var{src} into @var{dst}. Returns a pointer to +@var{dst} + strlen(@var{src}). + +@end deftypefn + +@c stpncpy.c:23 +@deftypefn Supplemental char* stpncpy (char *@var{dst}, const char *@var{src}, size_t @var{len}) + +Copies the string @var{src} into @var{dst}, copying exactly @var{len} +and padding with zeros if necessary. If @var{len} < strlen(@var{src}) +then return @var{dst} + @var{len}, otherwise returns @var{dst} + +strlen(@var{src}). + +@end deftypefn + +@c strcasecmp.c:15 +@deftypefn Supplemental int strcasecmp (const char *@var{s1}, const char *@var{s2}) + +A case-insensitive @code{strcmp}. + +@end deftypefn + +@c strchr.c:6 +@deftypefn Supplemental char* strchr (const char *@var{s}, int @var{c}) + +Returns a pointer to the first occurrence of the character @var{c} in +the string @var{s}, or @code{NULL} if not found. If @var{c} is itself the +null character, the results are undefined. + +@end deftypefn + +@c strdup.c:3 +@deftypefn Supplemental char* strdup (const char *@var{s}) + +Returns a pointer to a copy of @var{s} in memory obtained from +@code{malloc}, or @code{NULL} if insufficient memory was available. + +@end deftypefn + +@c strerror.c:670 +@deftypefn Replacement {const char*} strerrno (int @var{errnum}) + +Given an error number returned from a system call (typically returned +in @code{errno}), returns a pointer to a string containing the +symbolic name of that error number, as found in @code{}. + +If the supplied error number is within the valid range of indices for +symbolic names, but no name is available for the particular error +number, then returns the string @samp{Error @var{num}}, where @var{num} +is the error number. + +If the supplied error number is not within the range of valid +indices, then returns @code{NULL}. + +The contents of the location pointed to are only guaranteed to be +valid until the next call to @code{strerrno}. + +@end deftypefn + +@c strerror.c:603 +@deftypefn Supplemental char* strerror (int @var{errnoval}) + +Maps an @code{errno} number to an error message string, the contents +of which are implementation defined. On systems which have the +external variables @code{sys_nerr} and @code{sys_errlist}, these +strings will be the same as the ones used by @code{perror}. + +If the supplied error number is within the valid range of indices for +the @code{sys_errlist}, but no message is available for the particular +error number, then returns the string @samp{Error @var{num}}, where +@var{num} is the error number. + +If the supplied error number is not a valid index into +@code{sys_errlist}, returns @code{NULL}. + +The returned string is only guaranteed to be valid only until the +next call to @code{strerror}. + +@end deftypefn + +@c strncasecmp.c:15 +@deftypefn Supplemental int strncasecmp (const char *@var{s1}, const char *@var{s2}) + +A case-insensitive @code{strncmp}. + +@end deftypefn + +@c strncmp.c:6 +@deftypefn Supplemental int strncmp (const char *@var{s1}, const char *@var{s2}, size_t @var{n}) + +Compares the first @var{n} bytes of two strings, returning a value as +@code{strcmp}. + +@end deftypefn + +@c strndup.c:23 +@deftypefn Extension char* strndup (const char *@var{s}, size_t @var{n}) + +Returns a pointer to a copy of @var{s} with at most @var{n} characters +in memory obtained from @code{malloc}, or @code{NULL} if insufficient +memory was available. The result is always NUL terminated. + +@end deftypefn + +@c strrchr.c:6 +@deftypefn Supplemental char* strrchr (const char *@var{s}, int @var{c}) + +Returns a pointer to the last occurrence of the character @var{c} in +the string @var{s}, or @code{NULL} if not found. If @var{c} is itself the +null character, the results are undefined. + +@end deftypefn + +@c strsignal.c:383 +@deftypefn Supplemental {const char *} strsignal (int @var{signo}) + +Maps an signal number to an signal message string, the contents of +which are implementation defined. On systems which have the external +variable @code{sys_siglist}, these strings will be the same as the +ones used by @code{psignal()}. + +If the supplied signal number is within the valid range of indices for +the @code{sys_siglist}, but no message is available for the particular +signal number, then returns the string @samp{Signal @var{num}}, where +@var{num} is the signal number. + +If the supplied signal number is not a valid index into +@code{sys_siglist}, returns @code{NULL}. + +The returned string is only guaranteed to be valid only until the next +call to @code{strsignal}. + +@end deftypefn + +@c strsignal.c:446 +@deftypefn Extension {const char*} strsigno (int @var{signo}) + +Given an signal number, returns a pointer to a string containing the +symbolic name of that signal number, as found in @code{}. + +If the supplied signal number is within the valid range of indices for +symbolic names, but no name is available for the particular signal +number, then returns the string @samp{Signal @var{num}}, where +@var{num} is the signal number. + +If the supplied signal number is not within the range of valid +indices, then returns @code{NULL}. + +The contents of the location pointed to are only guaranteed to be +valid until the next call to @code{strsigno}. + +@end deftypefn + +@c strstr.c:6 +@deftypefn Supplemental char* strstr (const char *@var{string}, const char *@var{sub}) + +This function searches for the substring @var{sub} in the string +@var{string}, not including the terminating null characters. A pointer +to the first occurrence of @var{sub} is returned, or @code{NULL} if the +substring is absent. If @var{sub} points to a string with zero +length, the function returns @var{string}. + +@end deftypefn + +@c strtod.c:27 +@deftypefn Supplemental double strtod (const char *@var{string}, char **@var{endptr}) + +This ISO C function converts the initial portion of @var{string} to a +@code{double}. If @var{endptr} is not @code{NULL}, a pointer to the +character after the last character used in the conversion is stored in +the location referenced by @var{endptr}. If no conversion is +performed, zero is returned and the value of @var{string} is stored in +the location referenced by @var{endptr}. + +@end deftypefn + +@c strerror.c:729 +@deftypefn Extension int strtoerrno (const char *@var{name}) + +Given the symbolic name of a error number (e.g., @code{EACCES}), map it +to an errno value. If no translation is found, returns 0. + +@end deftypefn + +@c strtol.c:33 +@deftypefn Supplemental {long int} strtol (const char *@var{string}, char **@var{endptr}, int @var{base}) +@deftypefnx Supplemental {unsigned long int} strtoul (const char *@var{string}, char **@var{endptr}, int @var{base}) + +The @code{strtol} function converts the string in @var{string} to a +long integer value according to the given @var{base}, which must be +between 2 and 36 inclusive, or be the special value 0. If @var{base} +is 0, @code{strtol} will look for the prefixes @code{0} and @code{0x} +to indicate bases 8 and 16, respectively, else default to base 10. +When the base is 16 (either explicitly or implicitly), a prefix of +@code{0x} is allowed. The handling of @var{endptr} is as that of +@code{strtod} above. The @code{strtoul} function is the same, except +that the converted value is unsigned. + +@end deftypefn + +@c strsignal.c:500 +@deftypefn Extension int strtosigno (const char *@var{name}) + +Given the symbolic name of a signal, map it to a signal number. If no +translation is found, returns 0. + +@end deftypefn + +@c strverscmp.c:25 +@deftypefun int strverscmp (const char *@var{s1}, const char *@var{s2}) +The @code{strverscmp} function compares the string @var{s1} against +@var{s2}, considering them as holding indices/version numbers. Return +value follows the same conventions as found in the @code{strverscmp} +function. In fact, if @var{s1} and @var{s2} contain no digits, +@code{strverscmp} behaves like @code{strcmp}. + +Basically, we compare strings normally (character by character), until +we find a digit in each string - then we enter a special comparison +mode, where each sequence of digits is taken as a whole. If we reach the +end of these two parts without noticing a difference, we return to the +standard comparison mode. There are two types of numeric parts: +"integral" and "fractional" (those begin with a '0'). The types +of the numeric parts affect the way we sort them: + +@itemize @bullet +@item +integral/integral: we compare values as you would expect. + +@item +fractional/integral: the fractional part is less than the integral one. +Again, no surprise. + +@item +fractional/fractional: the things become a bit more complex. +If the common prefix contains only leading zeroes, the longest part is less +than the other one; else the comparison behaves normally. +@end itemize + +@smallexample +strverscmp ("no digit", "no digit") + @result{} 0 // @r{same behavior as strcmp.} +strverscmp ("item#99", "item#100") + @result{} <0 // @r{same prefix, but 99 < 100.} +strverscmp ("alpha1", "alpha001") + @result{} >0 // @r{fractional part inferior to integral one.} +strverscmp ("part1_f012", "part1_f01") + @result{} >0 // @r{two fractional parts.} +strverscmp ("foo.009", "foo.0") + @result{} <0 // @r{idem, but with leading zeroes only.} +@end smallexample + +This function is especially useful when dealing with filename sorting, +because filenames frequently hold indices/version numbers. +@end deftypefun + +@c tmpnam.c:3 +@deftypefn Supplemental char* tmpnam (char *@var{s}) + +This function attempts to create a name for a temporary file, which +will be a valid file name yet not exist when @code{tmpnam} checks for +it. @var{s} must point to a buffer of at least @code{L_tmpnam} bytes, +or be @code{NULL}. Use of this function creates a security risk, and it must +not be used in new projects. Use @code{mkstemp} instead. + +@end deftypefn + +@c unlink-if-ordinary.c:27 +@deftypefn Supplemental int unlink_if_ordinary (const char*) + +Unlinks the named file, unless it is special (e.g. a device file). +Returns 0 when the file was unlinked, a negative value (and errno set) when +there was an error deleting the file, and a positive value if no attempt +was made to unlink the file because it is special. + +@end deftypefn + +@c fopen_unlocked.c:31 +@deftypefn Extension void unlock_std_streams (void) + +If the OS supports it, ensure that the standard I/O streams, +@code{stdin}, @code{stdout} and @code{stderr} are setup to avoid any +multi-threaded locking. Otherwise do nothing. + +@end deftypefn + +@c fopen_unlocked.c:23 +@deftypefn Extension void unlock_stream (FILE * @var{stream}) + +If the OS supports it, ensure that the supplied stream is setup to +avoid any multi-threaded locking. Otherwise leave the @code{FILE} +pointer unchanged. If the @var{stream} is @code{NULL} do nothing. + +@end deftypefn + +@c vasprintf.c:47 +@deftypefn Extension int vasprintf (char **@var{resptr}, const char *@var{format}, va_list @var{args}) + +Like @code{vsprintf}, but instead of passing a pointer to a buffer, +you pass a pointer to a pointer. This function will compute the size +of the buffer needed, allocate memory with @code{malloc}, and store a +pointer to the allocated memory in @code{*@var{resptr}}. The value +returned is the same as @code{vsprintf} would return. If memory could +not be allocated, minus one is returned and @code{NULL} is stored in +@code{*@var{resptr}}. + +@end deftypefn + +@c vfork.c:6 +@deftypefn Supplemental int vfork (void) + +Emulates @code{vfork} by calling @code{fork} and returning its value. + +@end deftypefn + +@c vprintf.c:3 +@deftypefn Supplemental int vprintf (const char *@var{format}, va_list @var{ap}) +@deftypefnx Supplemental int vfprintf (FILE *@var{stream}, const char *@var{format}, va_list @var{ap}) +@deftypefnx Supplemental int vsprintf (char *@var{str}, const char *@var{format}, va_list @var{ap}) + +These functions are the same as @code{printf}, @code{fprintf}, and +@code{sprintf}, respectively, except that they are called with a +@code{va_list} instead of a variable number of arguments. Note that +they do not call @code{va_end}; this is the application's +responsibility. In @libib{} they are implemented in terms of the +nonstandard but common function @code{_doprnt}. + +@end deftypefn + +@c vsnprintf.c:28 +@deftypefn Supplemental int vsnprintf (char *@var{buf}, size_t @var{n}, const char *@var{format}, va_list @var{ap}) + +This function is similar to vsprintf, but it will print at most +@var{n} characters. On error the return value is -1, otherwise it +returns the number of characters that would have been printed had +@var{n} been sufficiently large, regardless of the actual value of +@var{n}. Note some pre-C99 system libraries do not implement this +correctly so users cannot generally rely on the return value if the +system version of this function is used. + +@end deftypefn + +@c waitpid.c:3 +@deftypefn Supplemental int waitpid (int @var{pid}, int *@var{status}, int) + +This is a wrapper around the @code{wait} function. Any ``special'' +values of @var{pid} depend on your implementation of @code{wait}, as +does the return value. The third argument is unused in @libib{}. + +@end deftypefn + +@c argv.c:293 +@deftypefn Extension int writeargv (const char **@var{argv}, FILE *@var{file}) + +Write each member of ARGV, handling all necessary quoting, to the file +named by FILE, separated by whitespace. Return 0 on success, non-zero +if an error occurred while writing to FILE. + +@end deftypefn + +@c xatexit.c:11 +@deftypefun int xatexit (void (*@var{fn}) (void)) + +Behaves as the standard @code{atexit} function, but with no limit on +the number of registered functions. Returns 0 on success, or @minus{}1 on +failure. If you use @code{xatexit} to register functions, you must use +@code{xexit} to terminate your program. + +@end deftypefun + +@c xmalloc.c:38 +@deftypefn Replacement void* xcalloc (size_t @var{nelem}, size_t @var{elsize}) + +Allocate memory without fail, and set it to zero. This routine functions +like @code{calloc}, but will behave the same as @code{xmalloc} if memory +cannot be found. + +@end deftypefn + +@c xexit.c:22 +@deftypefn Replacement void xexit (int @var{code}) + +Terminates the program. If any functions have been registered with +the @code{xatexit} replacement function, they will be called first. +Termination is handled via the system's normal @code{exit} call. + +@end deftypefn + +@c xmalloc.c:22 +@deftypefn Replacement void* xmalloc (size_t) + +Allocate memory without fail. If @code{malloc} fails, this will print +a message to @code{stderr} (using the name set by +@code{xmalloc_set_program_name}, +if any) and then call @code{xexit}. Note that it is therefore safe for +a program to contain @code{#define malloc xmalloc} in its source. + +@end deftypefn + +@c xmalloc.c:53 +@deftypefn Replacement void xmalloc_failed (size_t) + +This function is not meant to be called by client code, and is listed +here for completeness only. If any of the allocation routines fail, this +function will be called to print an error message and terminate execution. + +@end deftypefn + +@c xmalloc.c:46 +@deftypefn Replacement void xmalloc_set_program_name (const char *@var{name}) + +You can use this to set the name of the program used by +@code{xmalloc_failed} when printing a failure message. + +@end deftypefn + +@c xmemdup.c:7 +@deftypefn Replacement void* xmemdup (void *@var{input}, size_t @var{copy_size}, size_t @var{alloc_size}) + +Duplicates a region of memory without fail. First, @var{alloc_size} bytes +are allocated, then @var{copy_size} bytes from @var{input} are copied into +it, and the new memory is returned. If fewer bytes are copied than were +allocated, the remaining memory is zeroed. + +@end deftypefn + +@c xmalloc.c:32 +@deftypefn Replacement void* xrealloc (void *@var{ptr}, size_t @var{size}) +Reallocate memory without fail. This routine functions like @code{realloc}, +but will behave the same as @code{xmalloc} if memory cannot be found. + +@end deftypefn + +@c xstrdup.c:7 +@deftypefn Replacement char* xstrdup (const char *@var{s}) + +Duplicates a character string without fail, using @code{xmalloc} to +obtain memory. + +@end deftypefn + +@c xstrerror.c:7 +@deftypefn Replacement char* xstrerror (int @var{errnum}) + +Behaves exactly like the standard @code{strerror} function, but +will never return a @code{NULL} pointer. + +@end deftypefn + +@c xstrndup.c:23 +@deftypefn Replacement char* xstrndup (const char *@var{s}, size_t @var{n}) + +Returns a pointer to a copy of @var{s} with at most @var{n} characters +without fail, using @code{xmalloc} to obtain memory. The result is +always NUL terminated. + +@end deftypefn + + diff --git a/libiberty/gather-docs b/libiberty/gather-docs new file mode 100644 index 0000000..be4dbbf --- /dev/null +++ b/libiberty/gather-docs @@ -0,0 +1,128 @@ +#!/usr/bin/perl +# -*- perl -*- + +# Copyright (C) 2001 +# Free Software Foundation +# +# This file is part of the libiberty library. +# Libiberty is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# Libiberty 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with libiberty; see the file COPYING.LIB. If not, +# write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, +# Boston, MA 02110-1301, USA. +# +# Originally written by DJ Delorie + + + +# This program looks for texinfo snippets in source files and other +# files, and builds per-category files with entries sorted in +# alphabetical order. + +# The syntax it looks for is lines starting with '@def' in *.c and +# other files (see TEXIFILES in Makefile.in). Entries are terminated +# at the next @def* (which begins a new entry) or, for C files, a line +# that begins with '*/' without leading spaces (this assumes that the +# texinfo snippet is within a C-style /* */ comment). + +# + + + +if ($ARGV[0] eq "-v") { + $verbose = 1; + shift; +} + +$srcdir = shift; +$outfile = shift; + +if ($outfile !~ /\S/ || ! -f "$srcdir/Makefile.in" ) { + print STDERR "Usage: gather-docs [-v] srcdir outfile.txi [files with snippets in them ...]\n"; + exit 1; +} + +$errors = 0; + +for $in (@ARGV) { + + if (!open(IN, "$srcdir/$in")) { + print STDERR "Cannot open $srcdir/$in for reading: $!\n"; + $errors ++; + + } else { + $first = 1; + $pertinent = 0; + $man_mode = 0; + $line = 0; + + while () { + $line ++; + $pertinent = 1 if /^\@def[a-z]*[a-wyz] /; + $pertinent = 0 if /^\*\//; + next unless $pertinent; + + if (/^\@def[a-z]*[a-wyz] /) { + + ($name) = m/[^\(]* ([^\( \t\r\n]+) *\(/; + $name =~ s/[ ]*$//; + $key = $name; + $key =~ tr/A-Z/a-z/; + $key =~ s/[^a-z0-9]+/ /g; + $name{$key} = $node; + $lines{$key} = ''; + $src_file{$key} = $in; + $src_line{$key} = $line; + print "\nReading $in :" if $verbose && $first; + $first = 0; + print " $name" if $verbose; + $node_lines{$key} .= $_; + + } else { + $node_lines{$key} .= $_; + } + + $pertinent = 0 if /^\@end def/; + } + close (IN); + } +} + +print "\n" if $verbose; +exit $errors if $errors; + +if (!open (OUT, "> $outfile")) { + print STDERR "Cannot open $outfile for writing: $!\n"; + $errors ++; + next; +} +print "Writing $outfile\n" if $verbose; + +print OUT "\@c Automatically generated from *.c and others (the comments before\n"; +print OUT "\@c each entry tell you which file and where in that file). DO NOT EDIT!\n"; +print OUT "\@c Edit the *.c files, configure with --enable-maintainer-mode,\n"; +print OUT "\@c and let gather-docs build you a new copy.\n\n"; + +for $key (sort keys %name) { + print OUT "\@c $src_file{$key}:$src_line{$key}\n"; + print OUT $node_lines{$key}; + print OUT "\n"; +} + +if (! print OUT "\n") { + print STDERR "Disk full writing $srcdir/$cat.texi\n"; + $errors ++; +} + +close (OUT); + +exit $errors; diff --git a/libiberty/getcwd.c b/libiberty/getcwd.c new file mode 100644 index 0000000..28f26eb --- /dev/null +++ b/libiberty/getcwd.c @@ -0,0 +1,62 @@ +/* Emulate getcwd using getwd. + This function is in the public domain. */ + +/* + +@deftypefn Supplemental char* getcwd (char *@var{pathname}, int @var{len}) + +Copy the absolute pathname for the current working directory into +@var{pathname}, which is assumed to point to a buffer of at least +@var{len} bytes, and return a pointer to the buffer. If the current +directory's path doesn't fit in @var{len} characters, the result is +@code{NULL} and @code{errno} is set. If @var{pathname} is a null pointer, +@code{getcwd} will obtain @var{len} bytes of space using +@code{malloc}. + +@end deftypefn + +*/ + +#include "config.h" + +#ifdef HAVE_SYS_PARAM_H +#include +#endif +#include +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif + +extern char *getwd (); +extern int errno; + +#ifndef MAXPATHLEN +#define MAXPATHLEN 1024 +#endif + +char * +getcwd (char *buf, size_t len) +{ + char ourbuf[MAXPATHLEN]; + char *result; + + result = getwd (ourbuf); + if (result) { + if (strlen (ourbuf) >= len) { + errno = ERANGE; + return 0; + } + if (!buf) { + buf = (char*)malloc(len); + if (!buf) { + errno = ENOMEM; + return 0; + } + } + strcpy (buf, ourbuf); + } + return buf; +} diff --git a/libiberty/getopt.c b/libiberty/getopt.c new file mode 100644 index 0000000..d9c3532 --- /dev/null +++ b/libiberty/getopt.c @@ -0,0 +1,1052 @@ +/* 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 drepper@gnu.org + before changing it! + + Copyright (C) 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, + 1996, 1997, 1998, 2005 Free Software Foundation, Inc. + + NOTE: This source is derived from an old version taken from the GNU C + Library (glibc). + + 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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, + USA. */ + +/* This tells Alpha OSF/1 not to define a getopt prototype in . + Ditto for AIX 3.2 and . */ +#ifndef _NO_PROTO +# define _NO_PROTO +#endif + +#ifdef HAVE_CONFIG_H +# include +#endif + +#if !defined __STDC__ || !__STDC__ +/* This is a separate conditional since some stdc systems + reject `defined (const)'. */ +# ifndef const +# define const +# endif +#endif + +#include "ansidecl.h" +#include + +/* 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. */ + +#define GETOPT_INTERFACE_VERSION 2 +#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 +# include +# if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION +# define ELIDE_CODE +# endif +#endif + +#ifndef ELIDE_CODE + + +/* 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 +# include +#endif /* GNU C library. */ + +#ifdef VMS +# include +# if HAVE_STRING_H - 0 +# include +# endif +#endif + +#ifndef _ +/* This is for other GNU distributions with internationalized messages. + When compiling libc, the _ macro is predefined. */ +# if (HAVE_LIBINTL_H && ENABLE_NLS) || defined _LIBC +# include +# 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 -1, 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. */ + +/* 1003.2 says this must be 1 before any call. */ +int optind = 1; + +/* Formerly, initialization of getopt depended on optind==0, which + causes problems with re-calling getopt as programs generally don't + know that. */ + +int __getopt_initialized = 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 -1 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 +# define my_index strchr +#else + +# if HAVE_STRING_H +# include +# else +# if HAVE_STRINGS_H +# include +# endif +# endif + +/* Avoid depending on library functions or files + whose names are inconsistent. */ + +#if HAVE_STDLIB_H && HAVE_DECL_GETENV +# include +#elif !defined(getenv) +# ifdef __cplusplus +extern "C" { +# endif /* __cplusplus */ +extern char *getenv (const char *); +# ifdef __cplusplus +} +# endif /* __cplusplus */ +#endif + +static char * +my_index (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__) && !defined strlen +/* 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; + +#ifdef _LIBC +/* Bash 2.0 gives us an environment variable containing flags + indicating ARGV elements that should not be considered arguments. */ + +/* Defined in getopt_init.c */ +extern char *__getopt_nonoption_flags; + +static int nonoption_flags_max_len; +static int nonoption_flags_len; + +static int original_argc; +static char *const *original_argv; + +/* Make sure the environment variable bash 2.0 puts in the environment + is valid for the getopt call we must make sure that the ARGV passed + to getopt is that one passed to the process. */ +static void +__attribute__ ((unused)) +store_args_and_env (int argc, char *const *argv) +{ + /* XXX This is no good solution. We should rather copy the args so + that we can compare them later. But we must not use malloc(3). */ + original_argc = argc; + original_argv = argv; +} +# ifdef text_set_element +text_set_element (__libc_subinit, store_args_and_env); +# endif /* text_set_element */ + +# define SWAP_FLAGS(ch1, ch2) \ + if (nonoption_flags_len > 0) \ + { \ + char __tmp = __getopt_nonoption_flags[ch1]; \ + __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \ + __getopt_nonoption_flags[ch2] = __tmp; \ + } +#else /* !_LIBC */ +# define SWAP_FLAGS(ch1, ch2) +#endif /* _LIBC */ + +/* 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 (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. */ + +#ifdef _LIBC + /* First make sure the handling of the `__getopt_nonoption_flags' + string can work normally. Our top argument must be in the range + of the string. */ + if (nonoption_flags_len > 0 && top >= nonoption_flags_max_len) + { + /* We must extend the array. The user plays games with us and + presents new arguments. */ + char *new_str = (char *) malloc (top + 1); + if (new_str == NULL) + nonoption_flags_len = nonoption_flags_max_len = 0; + else + { + memset (mempcpy (new_str, __getopt_nonoption_flags, + nonoption_flags_max_len), + '\0', top + 1 - nonoption_flags_max_len); + nonoption_flags_max_len = top + 1; + __getopt_nonoption_flags = new_str; + } + } +#endif + + 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; + SWAP_FLAGS (bottom + i, top - (middle - bottom) + i); + } + /* 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; + SWAP_FLAGS (bottom + i, middle + i); + } + /* 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 (int, char *const *, const char *); +#endif +static const char * +_getopt_initialize (int argc ATTRIBUTE_UNUSED, + char *const *argv ATTRIBUTE_UNUSED, + 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; + + 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; + +#ifdef _LIBC + if (posixly_correct == NULL + && argc == original_argc && argv == original_argv) + { + if (nonoption_flags_max_len == 0) + { + if (__getopt_nonoption_flags == NULL + || __getopt_nonoption_flags[0] == '\0') + nonoption_flags_max_len = -1; + else + { + const char *orig_str = __getopt_nonoption_flags; + int len = nonoption_flags_max_len = strlen (orig_str); + if (nonoption_flags_max_len < argc) + nonoption_flags_max_len = argc; + __getopt_nonoption_flags = + (char *) malloc (nonoption_flags_max_len); + if (__getopt_nonoption_flags == NULL) + nonoption_flags_max_len = -1; + else + memset (mempcpy (__getopt_nonoption_flags, orig_str, len), + '\0', nonoption_flags_max_len - len); + } + } + nonoption_flags_len = nonoption_flags_max_len; + } + else + nonoption_flags_len = 0; +#endif + + 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 -1. + 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 (int argc, char *const *argv, const char *optstring, + const struct option *longopts, + int *longind, int long_only) +{ + optarg = NULL; + + if (optind == 0 || !__getopt_initialized) + { + if (optind == 0) + optind = 1; /* Don't scan ARGV[0], the program name. */ + optstring = _getopt_initialize (argc, argv, optstring); + __getopt_initialized = 1; + } + + /* 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. The later information + is only used when the used in the GNU libc. */ +#ifdef _LIBC +# define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0' \ + || (optind < nonoption_flags_len \ + && __getopt_nonoption_flags[optind] == '1')) +#else +# define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0') +#endif + + 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 -1; + } + + /* 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 -1; + 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 = -1; + 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 ((unsigned int) (nameend - nextchar) + == (unsigned int) 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 '?'; + } + /* Convenience. Treat POSIX -W foo same as long option --foo */ + if (temp[0] == 'W' && temp[1] == ';') + { + char *nameend; + const struct option *p; + const struct option *pfound = NULL; + int exact = 0; + int ambig = 0; + int indfound = 0; + int option_index; + + /* 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 = '?'; + return c; + } + else + /* We already incremented `optind' once; + increment it again when taking next ARGV-elt as argument. */ + optarg = argv[optind++]; + + /* optarg is now the argument, see if it's in the + table of longopts. */ + + for (nextchar = nameend = optarg; *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 ((unsigned int) (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 `-W %s' is ambiguous\n"), + argv[0], argv[optind]); + nextchar += strlen (nextchar); + optind++; + return '?'; + } + if (pfound != NULL) + { + option_index = indfound; + 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) + fprintf (stderr, _("\ +%s: option `-W %s' doesn't allow an argument\n"), + argv[0], pfound->name); + + nextchar += strlen (nextchar); + 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); + return optstring[0] == ':' ? ':' : '?'; + } + } + nextchar += strlen (nextchar); + if (longind != NULL) + *longind = option_index; + if (pfound->flag) + { + *(pfound->flag) = pfound->val; + return 0; + } + return pfound->val; + } + nextchar = NULL; + return 'W'; /* Let the application handle it. */ + } + 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 (int argc, char *const *argv, const char *optstring) +{ + return _getopt_internal (argc, argv, optstring, + (const struct option *) 0, + (int *) 0, + 0); +} + +#endif /* Not ELIDE_CODE. */ + +#ifdef TEST + +/* Compile with -DTEST to make an executable for use in testing + the above definition of `getopt'. */ + +int +main (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 == -1) + 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 */ diff --git a/libiberty/getopt1.c b/libiberty/getopt1.c new file mode 100644 index 0000000..255b144 --- /dev/null +++ b/libiberty/getopt1.c @@ -0,0 +1,180 @@ +/* getopt_long and getopt_long_only entry points for GNU getopt. + Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98,2005 + Free Software Foundation, Inc. + + NOTE: This source is derived from an old version taken from the GNU C + Library (glibc). + + 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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, + USA. */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#if !defined __STDC__ || !__STDC__ +/* This is a separate conditional since some stdc systems + reject `defined (const)'. */ +#ifndef const +#define const +#endif +#endif + +#include + +#include "getopt.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. */ + +#define GETOPT_INTERFACE_VERSION 2 +#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 +#include +#if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION +#define ELIDE_CODE +#endif +#endif + +#ifndef ELIDE_CODE + + +/* This needs to come after some library #include + to get __GNU_LIBRARY__ defined. */ +#ifdef __GNU_LIBRARY__ +#include +#endif + +#ifndef NULL +#define NULL 0 +#endif + +int +getopt_long (int argc, char *const *argv, const char *options, + const struct option *long_options, int *opt_index) +{ + return _getopt_internal (argc, argv, options, long_options, opt_index, 0); +} + +/* Like getopt_long, but '-' as well as '--' can indicate a long option. + If an option that starts with '-' (not '--') doesn't match a long option, + but does match a short option, it is parsed as a short option + instead. */ + +int +getopt_long_only (int argc, char *const *argv, const char *options, + const struct option *long_options, int *opt_index) +{ + return _getopt_internal (argc, argv, options, long_options, opt_index, 1); +} + + +#endif /* Not ELIDE_CODE. */ + +#ifdef TEST + +#include + +int +main (int argc, char **argv) +{ + int c; + int digit_optind = 0; + + while (1) + { + int this_option_optind = optind ? optind : 1; + int option_index = 0; + static struct option long_options[] = + { + {"add", 1, 0, 0}, + {"append", 0, 0, 0}, + {"delete", 1, 0, 0}, + {"verbose", 0, 0, 0}, + {"create", 0, 0, 0}, + {"file", 1, 0, 0}, + {0, 0, 0, 0} + }; + + c = getopt_long (argc, argv, "abc:d:0123456789", + long_options, &option_index); + if (c == -1) + break; + + switch (c) + { + case 0: + printf ("option %s", long_options[option_index].name); + if (optarg) + printf (" with arg %s", optarg); + printf ("\n"); + break; + + 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 'd': + printf ("option d 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 */ diff --git a/libiberty/getpagesize.c b/libiberty/getpagesize.c new file mode 100644 index 0000000..1c3a263 --- /dev/null +++ b/libiberty/getpagesize.c @@ -0,0 +1,90 @@ +/* Emulation of getpagesize() for systems that need it. */ + +/* + +@deftypefn Supplemental int getpagesize (void) + +Returns the number of bytes in a page of memory. This is the +granularity of many of the system memory management routines. No +guarantee is made as to whether or not it is the same as the basic +memory management hardware page size. + +@end deftypefn + +BUGS + + Is intended as a reasonable replacement for systems where this + is not provided as a system call. The value of 4096 may or may + not be correct for the systems where it is returned as the default + value. + +*/ + +#ifndef VMS + +#include "config.h" + +#include +#ifdef HAVE_SYS_PARAM_H +#include +#endif + +#undef GNU_OUR_PAGESIZE +#if defined (HAVE_SYSCONF) && defined (HAVE_UNISTD_H) +#include +#ifdef _SC_PAGESIZE +#define GNU_OUR_PAGESIZE sysconf(_SC_PAGESIZE) +#endif +#endif + +#ifndef GNU_OUR_PAGESIZE +# ifdef PAGESIZE +# define GNU_OUR_PAGESIZE PAGESIZE +# else /* no PAGESIZE */ +# ifdef EXEC_PAGESIZE +# define GNU_OUR_PAGESIZE EXEC_PAGESIZE +# else /* no EXEC_PAGESIZE */ +# ifdef NBPG +# define GNU_OUR_PAGESIZE (NBPG * CLSIZE) +# ifndef CLSIZE +# define CLSIZE 1 +# endif /* CLSIZE */ +# else /* no NBPG */ +# ifdef NBPC +# define GNU_OUR_PAGESIZE NBPC +# else /* no NBPC */ +# define GNU_OUR_PAGESIZE 4096 /* Just punt and use reasonable value */ +# endif /* NBPC */ +# endif /* NBPG */ +# endif /* EXEC_PAGESIZE */ +# endif /* PAGESIZE */ +#endif /* GNU_OUR_PAGESIZE */ + +int +getpagesize (void) +{ + return (GNU_OUR_PAGESIZE); +} + +#else /* VMS */ + +#if 0 /* older distributions of gcc-vms are missing */ +#include +#endif +#ifndef SYI$_PAGE_SIZE /* VMS V5.4 and earlier didn't have this yet */ +#define SYI$_PAGE_SIZE 4452 +#endif +extern unsigned long lib$getsyi(const unsigned short *,...); + +int getpagesize (void) +{ + long pagsiz = 0L; + unsigned short itmcod = SYI$_PAGE_SIZE; + + (void) lib$getsyi (&itmcod, (void *) &pagsiz); + if (pagsiz == 0L) + pagsiz = 512L; /* VAX default */ + return (int) pagsiz; +} + +#endif /* VMS */ diff --git a/libiberty/getpwd.c b/libiberty/getpwd.c new file mode 100644 index 0000000..fa5c132 --- /dev/null +++ b/libiberty/getpwd.c @@ -0,0 +1,128 @@ +/* getpwd.c - get the working directory */ + +/* + +@deftypefn Supplemental char* getpwd (void) + +Returns the current working directory. This implementation caches the +result on the assumption that the process will not call @code{chdir} +between calls to @code{getpwd}. + +@end deftypefn + +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include +#ifndef errno +extern int errno; +#endif + +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_SYS_PARAM_H +#include +#endif +#if HAVE_SYS_STAT_H +#include +#endif +#if HAVE_LIMITS_H +#include +#endif + +#include "libiberty.h" + +/* Virtually every UN*X system now in common use (except for pre-4.3-tahoe + BSD systems) now provides getcwd as called for by POSIX. Allow for + the few exceptions to the general rule here. */ + +#if !defined(HAVE_GETCWD) && defined(HAVE_GETWD) +/* Prototype in case the system headers doesn't provide it. */ +extern char *getwd (); +#define getcwd(buf,len) getwd(buf) +#endif + +#ifdef MAXPATHLEN +#define GUESSPATHLEN (MAXPATHLEN + 1) +#else +#define GUESSPATHLEN 100 +#endif + +#if !(defined (VMS) || (defined(_WIN32) && !defined(__CYGWIN__))) + +/* Get the working directory. Use the PWD environment variable if it's + set correctly, since this is faster and gives more uniform answers + to the user. Yield the working directory if successful; otherwise, + yield 0 and set errno. */ + +char * +getpwd (void) +{ + static char *pwd; + static int failure_errno; + + char *p = pwd; + size_t s; + struct stat dotstat, pwdstat; + + if (!p && !(errno = failure_errno)) + { + if (! ((p = getenv ("PWD")) != 0 + && *p == '/' + && stat (p, &pwdstat) == 0 + && stat (".", &dotstat) == 0 + && dotstat.st_ino == pwdstat.st_ino + && dotstat.st_dev == pwdstat.st_dev)) + + /* The shortcut didn't work. Try the slow, ``sure'' way. */ + for (s = GUESSPATHLEN; !getcwd (p = XNEWVEC (char, s), s); s *= 2) + { + int e = errno; + free (p); +#ifdef ERANGE + if (e != ERANGE) +#endif + { + errno = failure_errno = e; + p = 0; + break; + } + } + + /* Cache the result. This assumes that the program does + not invoke chdir between calls to getpwd. */ + pwd = p; + } + return p; +} + +#else /* VMS || _WIN32 && !__CYGWIN__ */ + +#ifndef MAXPATHLEN +#define MAXPATHLEN 255 +#endif + +char * +getpwd (void) +{ + static char *pwd = 0; + + if (!pwd) + pwd = getcwd (XNEWVEC (char, MAXPATHLEN + 1), MAXPATHLEN + 1 +#ifdef VMS + , 0 +#endif + ); + return pwd; +} + +#endif /* VMS || _WIN32 && !__CYGWIN__ */ diff --git a/libiberty/getruntime.c b/libiberty/getruntime.c new file mode 100644 index 0000000..82f3d2e --- /dev/null +++ b/libiberty/getruntime.c @@ -0,0 +1,116 @@ +/* Return time used so far, in microseconds. + Copyright (C) 1994, 1999, 2002 Free Software Foundation, Inc. + +This file is part of the libiberty library. +Libiberty is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +Libiberty 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with libiberty; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +#include "config.h" + +#include "ansidecl.h" +#include "libiberty.h" + +/* On some systems (such as WindISS), you must include + to get the definition of "time_t" before you include . */ +#include + +/* There are several ways to get elapsed execution time; unfortunately no + single way is available for all host systems, nor are there reliable + ways to find out which way is correct for a given host. */ + +#ifdef TIME_WITH_SYS_TIME +# include +# include +#else +# if HAVE_SYS_TIME_H +# include +# else +# ifdef HAVE_TIME_H +# include +# endif +# endif +#endif + +#if defined (HAVE_GETRUSAGE) && defined (HAVE_SYS_RESOURCE_H) +#include +#endif + +#ifdef HAVE_TIMES +#ifdef HAVE_SYS_PARAM_H +#include +#endif +#include +#endif + +#ifdef HAVE_UNISTD_H +#include +#endif + +/* This is a fallback; if wrong, it will likely make obviously wrong + results. */ + +#ifndef CLOCKS_PER_SEC +#define CLOCKS_PER_SEC 1 +#endif + +#ifdef _SC_CLK_TCK +#define GNU_HZ sysconf(_SC_CLK_TCK) +#else +#ifdef HZ +#define GNU_HZ HZ +#else +#ifdef CLOCKS_PER_SEC +#define GNU_HZ CLOCKS_PER_SEC +#endif +#endif +#endif + +/* + +@deftypefn Replacement long get_run_time (void) + +Returns the time used so far, in microseconds. If possible, this is +the time used by this process, else it is the elapsed time since the +process started. + +@end deftypefn + +*/ + +long +get_run_time (void) +{ +#if defined (HAVE_GETRUSAGE) && defined (HAVE_SYS_RESOURCE_H) + struct rusage rusage; + + getrusage (0, &rusage); + return (rusage.ru_utime.tv_sec * 1000000 + rusage.ru_utime.tv_usec + + rusage.ru_stime.tv_sec * 1000000 + rusage.ru_stime.tv_usec); +#else /* ! HAVE_GETRUSAGE */ +#ifdef HAVE_TIMES + struct tms tms; + + times (&tms); + return (tms.tms_utime + tms.tms_stime) * (1000000 / GNU_HZ); +#else /* ! HAVE_TIMES */ + /* Fall back on clock and hope it's correctly implemented. */ + const long clocks_per_sec = CLOCKS_PER_SEC; + if (clocks_per_sec <= 1000000) + return clock () * (1000000 / clocks_per_sec); + else + return clock () / clocks_per_sec; +#endif /* HAVE_TIMES */ +#endif /* HAVE_GETRUSAGE */ +} diff --git a/libiberty/gettimeofday.c b/libiberty/gettimeofday.c new file mode 100644 index 0000000..fca1679 --- /dev/null +++ b/libiberty/gettimeofday.c @@ -0,0 +1,30 @@ +#include "config.h" +#include "libiberty.h" +#ifdef HAVE_TIME_H +#include +#endif +#ifdef HAVE_SYS_TIME_H +#include +#endif + +/* + +@deftypefn Supplemental int gettimeofday (struct timeval *@var{tp}, void *@var{tz}) + +Writes the current time to @var{tp}. This implementation requires +that @var{tz} be NULL. Returns 0 on success, -1 on failure. + +@end deftypefn + +*/ + +int +gettimeofday (struct timeval *tp, void *tz) +{ + if (tz) + abort (); + tp->tv_usec = 0; + if (time (&tp->tv_sec) == (time_t) -1) + return -1; + return 0; +} diff --git a/libiberty/hashtab.c b/libiberty/hashtab.c new file mode 100644 index 0000000..bf34a6d --- /dev/null +++ b/libiberty/hashtab.c @@ -0,0 +1,955 @@ +/* An expandable hash tables datatype. + Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 + Free Software Foundation, Inc. + Contributed by Vladimir Makarov (vmakarov@cygnus.com). + +This file is part of the libiberty library. +Libiberty is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +Libiberty 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with libiberty; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +/* This package implements basic hash table functionality. It is possible + to search for an entry, create an entry and destroy an entry. + + Elements in the table are generic pointers. + + The size of the table is not fixed; if the occupancy of the table + grows too high the hash table will be expanded. + + The abstract data implementation is based on generalized Algorithm D + from Knuth's book "The art of computer programming". Hash table is + expanded by creation of new hash table and transferring elements from + the old table to the new table. */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_MALLOC_H +#include +#endif +#ifdef HAVE_LIMITS_H +#include +#endif +#ifdef HAVE_STDINT_H +#include +#endif + +#include + +#include "libiberty.h" +#include "ansidecl.h" +#include "hashtab.h" + +#ifndef CHAR_BIT +#define CHAR_BIT 8 +#endif + +static unsigned int higher_prime_index (unsigned long); +static hashval_t htab_mod_1 (hashval_t, hashval_t, hashval_t, int); +static hashval_t htab_mod (hashval_t, htab_t); +static hashval_t htab_mod_m2 (hashval_t, htab_t); +static hashval_t hash_pointer (const void *); +static int eq_pointer (const void *, const void *); +static int htab_expand (htab_t); +static PTR *find_empty_slot_for_expand (htab_t, hashval_t); + +/* At some point, we could make these be NULL, and modify the + hash-table routines to handle NULL specially; that would avoid + function-call overhead for the common case of hashing pointers. */ +htab_hash htab_hash_pointer = hash_pointer; +htab_eq htab_eq_pointer = eq_pointer; + +/* Table of primes and multiplicative inverses. + + Note that these are not minimally reduced inverses. Unlike when generating + code to divide by a constant, we want to be able to use the same algorithm + all the time. All of these inverses (are implied to) have bit 32 set. + + For the record, here's the function that computed the table; it's a + vastly simplified version of the function of the same name from gcc. */ + +#if 0 +unsigned int +ceil_log2 (unsigned int x) +{ + int i; + for (i = 31; i >= 0 ; --i) + if (x > (1u << i)) + return i+1; + abort (); +} + +unsigned int +choose_multiplier (unsigned int d, unsigned int *mlp, unsigned char *shiftp) +{ + unsigned long long mhigh; + double nx; + int lgup, post_shift; + int pow, pow2; + int n = 32, precision = 32; + + lgup = ceil_log2 (d); + pow = n + lgup; + pow2 = n + lgup - precision; + + nx = ldexp (1.0, pow) + ldexp (1.0, pow2); + mhigh = nx / d; + + *shiftp = lgup - 1; + *mlp = mhigh; + return mhigh >> 32; +} +#endif + +struct prime_ent +{ + hashval_t prime; + hashval_t inv; + hashval_t inv_m2; /* inverse of prime-2 */ + hashval_t shift; +}; + +static struct prime_ent const prime_tab[] = { + { 7, 0x24924925, 0x9999999b, 2 }, + { 13, 0x3b13b13c, 0x745d1747, 3 }, + { 31, 0x08421085, 0x1a7b9612, 4 }, + { 61, 0x0c9714fc, 0x15b1e5f8, 5 }, + { 127, 0x02040811, 0x0624dd30, 6 }, + { 251, 0x05197f7e, 0x073260a5, 7 }, + { 509, 0x01824366, 0x02864fc8, 8 }, + { 1021, 0x00c0906d, 0x014191f7, 9 }, + { 2039, 0x0121456f, 0x0161e69e, 10 }, + { 4093, 0x00300902, 0x00501908, 11 }, + { 8191, 0x00080041, 0x00180241, 12 }, + { 16381, 0x000c0091, 0x00140191, 13 }, + { 32749, 0x002605a5, 0x002a06e6, 14 }, + { 65521, 0x000f00e2, 0x00110122, 15 }, + { 131071, 0x00008001, 0x00018003, 16 }, + { 262139, 0x00014002, 0x0001c004, 17 }, + { 524287, 0x00002001, 0x00006001, 18 }, + { 1048573, 0x00003001, 0x00005001, 19 }, + { 2097143, 0x00004801, 0x00005801, 20 }, + { 4194301, 0x00000c01, 0x00001401, 21 }, + { 8388593, 0x00001e01, 0x00002201, 22 }, + { 16777213, 0x00000301, 0x00000501, 23 }, + { 33554393, 0x00001381, 0x00001481, 24 }, + { 67108859, 0x00000141, 0x000001c1, 25 }, + { 134217689, 0x000004e1, 0x00000521, 26 }, + { 268435399, 0x00000391, 0x000003b1, 27 }, + { 536870909, 0x00000019, 0x00000029, 28 }, + { 1073741789, 0x0000008d, 0x00000095, 29 }, + { 2147483647, 0x00000003, 0x00000007, 30 }, + /* Avoid "decimal constant so large it is unsigned" for 4294967291. */ + { 0xfffffffb, 0x00000006, 0x00000008, 31 } +}; + +/* The following function returns an index into the above table of the + nearest prime number which is greater than N, and near a power of two. */ + +static unsigned int +higher_prime_index (unsigned long n) +{ + unsigned int low = 0; + unsigned int high = sizeof(prime_tab) / sizeof(prime_tab[0]); + + while (low != high) + { + unsigned int mid = low + (high - low) / 2; + if (n > prime_tab[mid].prime) + low = mid + 1; + else + high = mid; + } + + /* If we've run out of primes, abort. */ + if (n > prime_tab[low].prime) + { + fprintf (stderr, "Cannot find prime bigger than %lu\n", n); + abort (); + } + + return low; +} + +/* Returns a hash code for P. */ + +static hashval_t +hash_pointer (const PTR p) +{ + return (hashval_t) ((long)p >> 3); +} + +/* Returns non-zero if P1 and P2 are equal. */ + +static int +eq_pointer (const PTR p1, const PTR p2) +{ + return p1 == p2; +} + + +/* The parens around the function names in the next two definitions + are essential in order to prevent macro expansions of the name. + The bodies, however, are expanded as expected, so they are not + recursive definitions. */ + +/* Return the current size of given hash table. */ + +#define htab_size(htab) ((htab)->size) + +size_t +(htab_size) (htab_t htab) +{ + return htab_size (htab); +} + +/* Return the current number of elements in given hash table. */ + +#define htab_elements(htab) ((htab)->n_elements - (htab)->n_deleted) + +size_t +(htab_elements) (htab_t htab) +{ + return htab_elements (htab); +} + +/* Return X % Y. */ + +static inline hashval_t +htab_mod_1 (hashval_t x, hashval_t y, hashval_t inv, int shift) +{ + /* The multiplicative inverses computed above are for 32-bit types, and + requires that we be able to compute a highpart multiply. */ +#ifdef UNSIGNED_64BIT_TYPE + __extension__ typedef UNSIGNED_64BIT_TYPE ull; + if (sizeof (hashval_t) * CHAR_BIT <= 32) + { + hashval_t t1, t2, t3, t4, q, r; + + t1 = ((ull)x * inv) >> 32; + t2 = x - t1; + t3 = t2 >> 1; + t4 = t1 + t3; + q = t4 >> shift; + r = x - (q * y); + + return r; + } +#endif + + /* Otherwise just use the native division routines. */ + return x % y; +} + +/* Compute the primary hash for HASH given HTAB's current size. */ + +static inline hashval_t +htab_mod (hashval_t hash, htab_t htab) +{ + const struct prime_ent *p = &prime_tab[htab->size_prime_index]; + return htab_mod_1 (hash, p->prime, p->inv, p->shift); +} + +/* Compute the secondary hash for HASH given HTAB's current size. */ + +static inline hashval_t +htab_mod_m2 (hashval_t hash, htab_t htab) +{ + const struct prime_ent *p = &prime_tab[htab->size_prime_index]; + return 1 + htab_mod_1 (hash, p->prime - 2, p->inv_m2, p->shift); +} + +/* This function creates table with length slightly longer than given + source length. Created hash table is initiated as empty (all the + hash table entries are HTAB_EMPTY_ENTRY). The function returns the + created hash table, or NULL if memory allocation fails. */ + +htab_t +htab_create_alloc (size_t size, htab_hash hash_f, htab_eq eq_f, + htab_del del_f, htab_alloc alloc_f, htab_free free_f) +{ + htab_t result; + unsigned int size_prime_index; + + size_prime_index = higher_prime_index (size); + size = prime_tab[size_prime_index].prime; + + result = (htab_t) (*alloc_f) (1, sizeof (struct htab)); + if (result == NULL) + return NULL; + result->entries = (PTR *) (*alloc_f) (size, sizeof (PTR)); + if (result->entries == NULL) + { + if (free_f != NULL) + (*free_f) (result); + return NULL; + } + result->size = size; + result->size_prime_index = size_prime_index; + result->hash_f = hash_f; + result->eq_f = eq_f; + result->del_f = del_f; + result->alloc_f = alloc_f; + result->free_f = free_f; + return result; +} + +/* As above, but use the variants of alloc_f and free_f which accept + an extra argument. */ + +htab_t +htab_create_alloc_ex (size_t size, htab_hash hash_f, htab_eq eq_f, + htab_del del_f, void *alloc_arg, + htab_alloc_with_arg alloc_f, + htab_free_with_arg free_f) +{ + htab_t result; + unsigned int size_prime_index; + + size_prime_index = higher_prime_index (size); + size = prime_tab[size_prime_index].prime; + + result = (htab_t) (*alloc_f) (alloc_arg, 1, sizeof (struct htab)); + if (result == NULL) + return NULL; + result->entries = (PTR *) (*alloc_f) (alloc_arg, size, sizeof (PTR)); + if (result->entries == NULL) + { + if (free_f != NULL) + (*free_f) (alloc_arg, result); + return NULL; + } + result->size = size; + result->size_prime_index = size_prime_index; + result->hash_f = hash_f; + result->eq_f = eq_f; + result->del_f = del_f; + result->alloc_arg = alloc_arg; + result->alloc_with_arg_f = alloc_f; + result->free_with_arg_f = free_f; + return result; +} + +/* Update the function pointers and allocation parameter in the htab_t. */ + +void +htab_set_functions_ex (htab_t htab, htab_hash hash_f, htab_eq eq_f, + htab_del del_f, PTR alloc_arg, + htab_alloc_with_arg alloc_f, htab_free_with_arg free_f) +{ + htab->hash_f = hash_f; + htab->eq_f = eq_f; + htab->del_f = del_f; + htab->alloc_arg = alloc_arg; + htab->alloc_with_arg_f = alloc_f; + htab->free_with_arg_f = free_f; +} + +/* These functions exist solely for backward compatibility. */ + +#undef htab_create +htab_t +htab_create (size_t size, htab_hash hash_f, htab_eq eq_f, htab_del del_f) +{ + return htab_create_alloc (size, hash_f, eq_f, del_f, xcalloc, free); +} + +htab_t +htab_try_create (size_t size, htab_hash hash_f, htab_eq eq_f, htab_del del_f) +{ + return htab_create_alloc (size, hash_f, eq_f, del_f, calloc, free); +} + +/* This function frees all memory allocated for given hash table. + Naturally the hash table must already exist. */ + +void +htab_delete (htab_t htab) +{ + size_t size = htab_size (htab); + PTR *entries = htab->entries; + int i; + + if (htab->del_f) + for (i = size - 1; i >= 0; i--) + if (entries[i] != HTAB_EMPTY_ENTRY && entries[i] != HTAB_DELETED_ENTRY) + (*htab->del_f) (entries[i]); + + if (htab->free_f != NULL) + { + (*htab->free_f) (entries); + (*htab->free_f) (htab); + } + else if (htab->free_with_arg_f != NULL) + { + (*htab->free_with_arg_f) (htab->alloc_arg, entries); + (*htab->free_with_arg_f) (htab->alloc_arg, htab); + } +} + +/* This function clears all entries in the given hash table. */ + +void +htab_empty (htab_t htab) +{ + size_t size = htab_size (htab); + PTR *entries = htab->entries; + int i; + + if (htab->del_f) + for (i = size - 1; i >= 0; i--) + if (entries[i] != HTAB_EMPTY_ENTRY && entries[i] != HTAB_DELETED_ENTRY) + (*htab->del_f) (entries[i]); + + /* Instead of clearing megabyte, downsize the table. */ + if (size > 1024*1024 / sizeof (PTR)) + { + int nindex = higher_prime_index (1024 / sizeof (PTR)); + int nsize = prime_tab[nindex].prime; + + if (htab->free_f != NULL) + (*htab->free_f) (htab->entries); + else if (htab->free_with_arg_f != NULL) + (*htab->free_with_arg_f) (htab->alloc_arg, htab->entries); + if (htab->alloc_with_arg_f != NULL) + htab->entries = (PTR *) (*htab->alloc_with_arg_f) (htab->alloc_arg, nsize, + sizeof (PTR *)); + else + htab->entries = (PTR *) (*htab->alloc_f) (nsize, sizeof (PTR *)); + htab->size = nsize; + htab->size_prime_index = nindex; + } + else + memset (entries, 0, size * sizeof (PTR)); + htab->n_deleted = 0; + htab->n_elements = 0; +} + +/* Similar to htab_find_slot, but without several unwanted side effects: + - Does not call htab->eq_f when it finds an existing entry. + - Does not change the count of elements/searches/collisions in the + hash table. + This function also assumes there are no deleted entries in the table. + HASH is the hash value for the element to be inserted. */ + +static PTR * +find_empty_slot_for_expand (htab_t htab, hashval_t hash) +{ + hashval_t index = htab_mod (hash, htab); + size_t size = htab_size (htab); + PTR *slot = htab->entries + index; + hashval_t hash2; + + if (*slot == HTAB_EMPTY_ENTRY) + return slot; + else if (*slot == HTAB_DELETED_ENTRY) + abort (); + + hash2 = htab_mod_m2 (hash, htab); + for (;;) + { + index += hash2; + if (index >= size) + index -= size; + + slot = htab->entries + index; + if (*slot == HTAB_EMPTY_ENTRY) + return slot; + else if (*slot == HTAB_DELETED_ENTRY) + abort (); + } +} + +/* The following function changes size of memory allocated for the + entries and repeatedly inserts the table elements. The occupancy + of the table after the call will be about 50%. Naturally the hash + table must already exist. Remember also that the place of the + table entries is changed. If memory allocation failures are allowed, + this function will return zero, indicating that the table could not be + expanded. If all goes well, it will return a non-zero value. */ + +static int +htab_expand (htab_t htab) +{ + PTR *oentries; + PTR *olimit; + PTR *p; + PTR *nentries; + size_t nsize, osize, elts; + unsigned int oindex, nindex; + + oentries = htab->entries; + oindex = htab->size_prime_index; + osize = htab->size; + olimit = oentries + osize; + elts = htab_elements (htab); + + /* Resize only when table after removal of unused elements is either + too full or too empty. */ + if (elts * 2 > osize || (elts * 8 < osize && osize > 32)) + { + nindex = higher_prime_index (elts * 2); + nsize = prime_tab[nindex].prime; + } + else + { + nindex = oindex; + nsize = osize; + } + + if (htab->alloc_with_arg_f != NULL) + nentries = (PTR *) (*htab->alloc_with_arg_f) (htab->alloc_arg, nsize, + sizeof (PTR *)); + else + nentries = (PTR *) (*htab->alloc_f) (nsize, sizeof (PTR *)); + if (nentries == NULL) + return 0; + htab->entries = nentries; + htab->size = nsize; + htab->size_prime_index = nindex; + htab->n_elements -= htab->n_deleted; + htab->n_deleted = 0; + + p = oentries; + do + { + PTR x = *p; + + if (x != HTAB_EMPTY_ENTRY && x != HTAB_DELETED_ENTRY) + { + PTR *q = find_empty_slot_for_expand (htab, (*htab->hash_f) (x)); + + *q = x; + } + + p++; + } + while (p < olimit); + + if (htab->free_f != NULL) + (*htab->free_f) (oentries); + else if (htab->free_with_arg_f != NULL) + (*htab->free_with_arg_f) (htab->alloc_arg, oentries); + return 1; +} + +/* This function searches for a hash table entry equal to the given + element. It cannot be used to insert or delete an element. */ + +PTR +htab_find_with_hash (htab_t htab, const PTR element, hashval_t hash) +{ + hashval_t index, hash2; + size_t size; + PTR entry; + + htab->searches++; + size = htab_size (htab); + index = htab_mod (hash, htab); + + entry = htab->entries[index]; + if (entry == HTAB_EMPTY_ENTRY + || (entry != HTAB_DELETED_ENTRY && (*htab->eq_f) (entry, element))) + return entry; + + hash2 = htab_mod_m2 (hash, htab); + for (;;) + { + htab->collisions++; + index += hash2; + if (index >= size) + index -= size; + + entry = htab->entries[index]; + if (entry == HTAB_EMPTY_ENTRY + || (entry != HTAB_DELETED_ENTRY && (*htab->eq_f) (entry, element))) + return entry; + } +} + +/* Like htab_find_slot_with_hash, but compute the hash value from the + element. */ + +PTR +htab_find (htab_t htab, const PTR element) +{ + return htab_find_with_hash (htab, element, (*htab->hash_f) (element)); +} + +/* This function searches for a hash table slot containing an entry + equal to the given element. To delete an entry, call this with + insert=NO_INSERT, then call htab_clear_slot on the slot returned + (possibly after doing some checks). To insert an entry, call this + with insert=INSERT, then write the value you want into the returned + slot. When inserting an entry, NULL may be returned if memory + allocation fails. */ + +PTR * +htab_find_slot_with_hash (htab_t htab, const PTR element, + hashval_t hash, enum insert_option insert) +{ + PTR *first_deleted_slot; + hashval_t index, hash2; + size_t size; + PTR entry; + + size = htab_size (htab); + if (insert == INSERT && size * 3 <= htab->n_elements * 4) + { + if (htab_expand (htab) == 0) + return NULL; + size = htab_size (htab); + } + + index = htab_mod (hash, htab); + + htab->searches++; + first_deleted_slot = NULL; + + entry = htab->entries[index]; + if (entry == HTAB_EMPTY_ENTRY) + goto empty_entry; + else if (entry == HTAB_DELETED_ENTRY) + first_deleted_slot = &htab->entries[index]; + else if ((*htab->eq_f) (entry, element)) + return &htab->entries[index]; + + hash2 = htab_mod_m2 (hash, htab); + for (;;) + { + htab->collisions++; + index += hash2; + if (index >= size) + index -= size; + + entry = htab->entries[index]; + if (entry == HTAB_EMPTY_ENTRY) + goto empty_entry; + else if (entry == HTAB_DELETED_ENTRY) + { + if (!first_deleted_slot) + first_deleted_slot = &htab->entries[index]; + } + else if ((*htab->eq_f) (entry, element)) + return &htab->entries[index]; + } + + empty_entry: + if (insert == NO_INSERT) + return NULL; + + if (first_deleted_slot) + { + htab->n_deleted--; + *first_deleted_slot = HTAB_EMPTY_ENTRY; + return first_deleted_slot; + } + + htab->n_elements++; + return &htab->entries[index]; +} + +/* Like htab_find_slot_with_hash, but compute the hash value from the + element. */ + +PTR * +htab_find_slot (htab_t htab, const PTR element, enum insert_option insert) +{ + return htab_find_slot_with_hash (htab, element, (*htab->hash_f) (element), + insert); +} + +/* This function deletes an element with the given value from hash + table (the hash is computed from the element). If there is no matching + element in the hash table, this function does nothing. */ + +void +htab_remove_elt (htab_t htab, PTR element) +{ + htab_remove_elt_with_hash (htab, element, (*htab->hash_f) (element)); +} + + +/* This function deletes an element with the given value from hash + table. If there is no matching element in the hash table, this + function does nothing. */ + +void +htab_remove_elt_with_hash (htab_t htab, PTR element, hashval_t hash) +{ + PTR *slot; + + slot = htab_find_slot_with_hash (htab, element, hash, NO_INSERT); + if (*slot == HTAB_EMPTY_ENTRY) + return; + + if (htab->del_f) + (*htab->del_f) (*slot); + + *slot = HTAB_DELETED_ENTRY; + htab->n_deleted++; +} + +/* This function clears a specified slot in a hash table. It is + useful when you've already done the lookup and don't want to do it + again. */ + +void +htab_clear_slot (htab_t htab, PTR *slot) +{ + if (slot < htab->entries || slot >= htab->entries + htab_size (htab) + || *slot == HTAB_EMPTY_ENTRY || *slot == HTAB_DELETED_ENTRY) + abort (); + + if (htab->del_f) + (*htab->del_f) (*slot); + + *slot = HTAB_DELETED_ENTRY; + htab->n_deleted++; +} + +/* This function scans over the entire hash table calling + CALLBACK for each live entry. If CALLBACK returns false, + the iteration stops. INFO is passed as CALLBACK's second + argument. */ + +void +htab_traverse_noresize (htab_t htab, htab_trav callback, PTR info) +{ + PTR *slot; + PTR *limit; + + slot = htab->entries; + limit = slot + htab_size (htab); + + do + { + PTR x = *slot; + + if (x != HTAB_EMPTY_ENTRY && x != HTAB_DELETED_ENTRY) + if (!(*callback) (slot, info)) + break; + } + while (++slot < limit); +} + +/* Like htab_traverse_noresize, but does resize the table when it is + too empty to improve effectivity of subsequent calls. */ + +void +htab_traverse (htab_t htab, htab_trav callback, PTR info) +{ + if (htab_elements (htab) * 8 < htab_size (htab)) + htab_expand (htab); + + htab_traverse_noresize (htab, callback, info); +} + +/* Return the fraction of fixed collisions during all work with given + hash table. */ + +double +htab_collisions (htab_t htab) +{ + if (htab->searches == 0) + return 0.0; + + return (double) htab->collisions / (double) htab->searches; +} + +/* Hash P as a null-terminated string. + + Copied from gcc/hashtable.c. Zack had the following to say with respect + to applicability, though note that unlike hashtable.c, this hash table + implementation re-hashes rather than chain buckets. + + http://gcc.gnu.org/ml/gcc-patches/2001-08/msg01021.html + From: Zack Weinberg + Date: Fri, 17 Aug 2001 02:15:56 -0400 + + I got it by extracting all the identifiers from all the source code + I had lying around in mid-1999, and testing many recurrences of + the form "H_n = H_{n-1} * K + c_n * L + M" where K, L, M were either + prime numbers or the appropriate identity. This was the best one. + I don't remember exactly what constituted "best", except I was + looking at bucket-length distributions mostly. + + So it should be very good at hashing identifiers, but might not be + as good at arbitrary strings. + + I'll add that it thoroughly trounces the hash functions recommended + for this use at http://burtleburtle.net/bob/hash/index.html, both + on speed and bucket distribution. I haven't tried it against the + function they just started using for Perl's hashes. */ + +hashval_t +htab_hash_string (const PTR p) +{ + const unsigned char *str = (const unsigned char *) p; + hashval_t r = 0; + unsigned char c; + + while ((c = *str++) != 0) + r = r * 67 + c - 113; + + return r; +} + +/* DERIVED FROM: +-------------------------------------------------------------------- +lookup2.c, by Bob Jenkins, December 1996, Public Domain. +hash(), hash2(), hash3, and mix() are externally useful functions. +Routines to test the hash are included if SELF_TEST is defined. +You can use this free for any purpose. It has no warranty. +-------------------------------------------------------------------- +*/ + +/* +-------------------------------------------------------------------- +mix -- mix 3 32-bit values reversibly. +For every delta with one or two bit set, and the deltas of all three + high bits or all three low bits, whether the original value of a,b,c + is almost all zero or is uniformly distributed, +* If mix() is run forward or backward, at least 32 bits in a,b,c + have at least 1/4 probability of changing. +* If mix() is run forward, every bit of c will change between 1/3 and + 2/3 of the time. (Well, 22/100 and 78/100 for some 2-bit deltas.) +mix() was built out of 36 single-cycle latency instructions in a + structure that could supported 2x parallelism, like so: + a -= b; + a -= c; x = (c>>13); + b -= c; a ^= x; + b -= a; x = (a<<8); + c -= a; b ^= x; + c -= b; x = (b>>13); + ... + Unfortunately, superscalar Pentiums and Sparcs can't take advantage + of that parallelism. They've also turned some of those single-cycle + latency instructions into multi-cycle latency instructions. Still, + this is the fastest good hash I could find. There were about 2^^68 + to choose from. I only looked at a billion or so. +-------------------------------------------------------------------- +*/ +/* same, but slower, works on systems that might have 8 byte hashval_t's */ +#define mix(a,b,c) \ +{ \ + a -= b; a -= c; a ^= (c>>13); \ + b -= c; b -= a; b ^= (a<< 8); \ + c -= a; c -= b; c ^= ((b&0xffffffff)>>13); \ + a -= b; a -= c; a ^= ((c&0xffffffff)>>12); \ + b -= c; b -= a; b = (b ^ (a<<16)) & 0xffffffff; \ + c -= a; c -= b; c = (c ^ (b>> 5)) & 0xffffffff; \ + a -= b; a -= c; a = (a ^ (c>> 3)) & 0xffffffff; \ + b -= c; b -= a; b = (b ^ (a<<10)) & 0xffffffff; \ + c -= a; c -= b; c = (c ^ (b>>15)) & 0xffffffff; \ +} + +/* +-------------------------------------------------------------------- +hash() -- hash a variable-length key into a 32-bit value + k : the key (the unaligned variable-length array of bytes) + len : the length of the key, counting by bytes + level : can be any 4-byte value +Returns a 32-bit value. Every bit of the key affects every bit of +the return value. Every 1-bit and 2-bit delta achieves avalanche. +About 36+6len instructions. + +The best hash table sizes are powers of 2. There is no need to do +mod a prime (mod is sooo slow!). If you need less than 32 bits, +use a bitmask. For example, if you need only 10 bits, do + h = (h & hashmask(10)); +In which case, the hash table should have hashsize(10) elements. + +If you are hashing n strings (ub1 **)k, do it like this: + for (i=0, h=0; i= 12) /* aligned */ + { + a += *(hashval_t *)(k+0); + b += *(hashval_t *)(k+4); + c += *(hashval_t *)(k+8); + mix(a,b,c); + k += 12; len -= 12; + } + else /* unaligned */ +#endif + while (len >= 12) + { + a += (k[0] +((hashval_t)k[1]<<8) +((hashval_t)k[2]<<16) +((hashval_t)k[3]<<24)); + b += (k[4] +((hashval_t)k[5]<<8) +((hashval_t)k[6]<<16) +((hashval_t)k[7]<<24)); + c += (k[8] +((hashval_t)k[9]<<8) +((hashval_t)k[10]<<16)+((hashval_t)k[11]<<24)); + mix(a,b,c); + k += 12; len -= 12; + } + + /*------------------------------------- handle the last 11 bytes */ + c += length; + switch(len) /* all the case statements fall through */ + { + case 11: c+=((hashval_t)k[10]<<24); + case 10: c+=((hashval_t)k[9]<<16); + case 9 : c+=((hashval_t)k[8]<<8); + /* the first byte of c is reserved for the length */ + case 8 : b+=((hashval_t)k[7]<<24); + case 7 : b+=((hashval_t)k[6]<<16); + case 6 : b+=((hashval_t)k[5]<<8); + case 5 : b+=k[4]; + case 4 : a+=((hashval_t)k[3]<<24); + case 3 : a+=((hashval_t)k[2]<<16); + case 2 : a+=((hashval_t)k[1]<<8); + case 1 : a+=k[0]; + /* case 0: nothing left to add */ + } + mix(a,b,c); + /*-------------------------------------------- report the result */ + return c; +} diff --git a/libiberty/hex.c b/libiberty/hex.c new file mode 100644 index 0000000..5eeafdb --- /dev/null +++ b/libiberty/hex.c @@ -0,0 +1,192 @@ +/* Hex character manipulation support. + Copyright (C) 1995, 2001 Free Software Foundation, Inc. + +This file is part of the libiberty library. +Libiberty is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +Libiberty 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with libiberty; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +#include /* for EOF */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include "libiberty.h" +#include "safe-ctype.h" /* for HOST_CHARSET_ASCII */ + +#if EOF != -1 + #error "hex.c requires EOF == -1" +#endif + +/* + +@deftypefn Extension void hex_init (void) + +Initializes the array mapping the current character set to +corresponding hex values. This function must be called before any +call to @code{hex_p} or @code{hex_value}. If you fail to call it, a +default ASCII-based table will normally be used on ASCII systems. + +@end deftypefn + +@deftypefn Extension int hex_p (int @var{c}) + +Evaluates to non-zero if the given character is a valid hex character, +or zero if it is not. Note that the value you pass will be cast to +@code{unsigned char} within the macro. + +@end deftypefn + +@deftypefn Extension {unsigned int} hex_value (int @var{c}) + +Returns the numeric equivalent of the given character when interpreted +as a hexadecimal digit. The result is undefined if you pass an +invalid hex digit. Note that the value you pass will be cast to +@code{unsigned char} within the macro. + +The @code{hex_value} macro returns @code{unsigned int}, rather than +signed @code{int}, to make it easier to use in parsing addresses from +hex dump files: a signed @code{int} would be sign-extended when +converted to a wider unsigned type --- like @code{bfd_vma}, on some +systems. + +@end deftypefn + +@undocumented _hex_array_size +@undocumented _hex_bad +@undocumented _hex_value + +*/ + + +/* Are we ASCII? */ +#if HOST_CHARSET == HOST_CHARSET_ASCII + +const unsigned char _hex_value[_hex_array_size] = +{ + _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* NUL SOH STX ETX */ + _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* EOT ENQ ACK BEL */ + _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* BS HT LF VT */ + _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* FF CR SO SI */ + _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* DLE DC1 DC2 DC3 */ + _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* DC4 NAK SYN ETB */ + _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* CAN EM SUB ESC */ + _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* FS GS RS US */ + + _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* SP ! " # */ + _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* $ % & ' */ + _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* ( ) * + */ + _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* , - . / */ + 0, 1, 2, 3, /* 0 1 2 3 */ + 4, 5, 6, 7, /* 4 5 6 7 */ + 8, 9, _hex_bad, _hex_bad, /* 8 9 : ; */ + _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* < = > ? */ + + _hex_bad, 10, 11, 12, /* @ A B C */ + 13, 14, 15, _hex_bad, /* D E F G */ + _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* H I J K */ + _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* L M N O */ + _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* P Q R S */ + _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* T U V W */ + _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* X Y Z [ */ + _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* \ ] ^ _ */ + + _hex_bad, 10, 11, 12, /* ` a b c */ + 13, 14, 15, _hex_bad, /* d e f g */ + _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* h i j k */ + _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* l m n o */ + _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* p q r s */ + _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* t u v w */ + _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* x y z { */ + _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* | } ~ DEL */ + + /* The high half of unsigned char, all values are _hex_bad. */ + _hex_bad, _hex_bad, _hex_bad, _hex_bad, + _hex_bad, _hex_bad, _hex_bad, _hex_bad, + _hex_bad, _hex_bad, _hex_bad, _hex_bad, + _hex_bad, _hex_bad, _hex_bad, _hex_bad, + _hex_bad, _hex_bad, _hex_bad, _hex_bad, + _hex_bad, _hex_bad, _hex_bad, _hex_bad, + _hex_bad, _hex_bad, _hex_bad, _hex_bad, + _hex_bad, _hex_bad, _hex_bad, _hex_bad, + + _hex_bad, _hex_bad, _hex_bad, _hex_bad, + _hex_bad, _hex_bad, _hex_bad, _hex_bad, + _hex_bad, _hex_bad, _hex_bad, _hex_bad, + _hex_bad, _hex_bad, _hex_bad, _hex_bad, + _hex_bad, _hex_bad, _hex_bad, _hex_bad, + _hex_bad, _hex_bad, _hex_bad, _hex_bad, + _hex_bad, _hex_bad, _hex_bad, _hex_bad, + _hex_bad, _hex_bad, _hex_bad, _hex_bad, + + _hex_bad, _hex_bad, _hex_bad, _hex_bad, + _hex_bad, _hex_bad, _hex_bad, _hex_bad, + _hex_bad, _hex_bad, _hex_bad, _hex_bad, + _hex_bad, _hex_bad, _hex_bad, _hex_bad, + _hex_bad, _hex_bad, _hex_bad, _hex_bad, + _hex_bad, _hex_bad, _hex_bad, _hex_bad, + _hex_bad, _hex_bad, _hex_bad, _hex_bad, + _hex_bad, _hex_bad, _hex_bad, _hex_bad, + + _hex_bad, _hex_bad, _hex_bad, _hex_bad, + _hex_bad, _hex_bad, _hex_bad, _hex_bad, + _hex_bad, _hex_bad, _hex_bad, _hex_bad, + _hex_bad, _hex_bad, _hex_bad, _hex_bad, + _hex_bad, _hex_bad, _hex_bad, _hex_bad, + _hex_bad, _hex_bad, _hex_bad, _hex_bad, + _hex_bad, _hex_bad, _hex_bad, _hex_bad, + _hex_bad, _hex_bad, _hex_bad, _hex_bad, +}; +#define HEX_TABLE_INITIALIZED + +#else + +unsigned char _hex_value[_hex_array_size]; + +#endif /* not ASCII */ + +void +hex_init (void) +{ +#ifndef HEX_TABLE_INITIALIZED + int i; + + for (i=0; i<_hex_array_size; i++) + { + switch (i) + { + case '0': _hex_value[i] = 0; break; + case '1': _hex_value[i] = 1; break; + case '2': _hex_value[i] = 2; break; + case '3': _hex_value[i] = 3; break; + case '4': _hex_value[i] = 4; break; + case '5': _hex_value[i] = 5; break; + case '6': _hex_value[i] = 6; break; + case '7': _hex_value[i] = 7; break; + case '8': _hex_value[i] = 8; break; + case '9': _hex_value[i] = 9; break; + + case 'a': case 'A': _hex_value[i] = 10; break; + case 'b': case 'B': _hex_value[i] = 11; break; + case 'c': case 'C': _hex_value[i] = 12; break; + case 'd': case 'D': _hex_value[i] = 13; break; + case 'e': case 'E': _hex_value[i] = 14; break; + case 'f': case 'F': _hex_value[i] = 15; break; + + default: + _hex_value[i] = _hex_bad; + break; + } + } +#endif +} diff --git a/libiberty/index.c b/libiberty/index.c new file mode 100644 index 0000000..acd0a45 --- /dev/null +++ b/libiberty/index.c @@ -0,0 +1,21 @@ +/* Stub implementation of (obsolete) index(). */ + +/* + +@deftypefn Supplemental char* index (char *@var{s}, int @var{c}) + +Returns a pointer to the first occurrence of the character @var{c} in +the string @var{s}, or @code{NULL} if not found. The use of @code{index} is +deprecated in new programs in favor of @code{strchr}. + +@end deftypefn + +*/ + +extern char * strchr(const char *, int); + +char * +index (const char *s, int c) +{ + return strchr (s, c); +} diff --git a/libiberty/insque.c b/libiberty/insque.c new file mode 100644 index 0000000..3473bb9 --- /dev/null +++ b/libiberty/insque.c @@ -0,0 +1,50 @@ +/* insque(3C) routines + This file is in the public domain. */ + +/* + +@deftypefn Supplemental void insque (struct qelem *@var{elem}, struct qelem *@var{pred}) +@deftypefnx Supplemental void remque (struct qelem *@var{elem}) + +Routines to manipulate queues built from doubly linked lists. The +@code{insque} routine inserts @var{elem} in the queue immediately +after @var{pred}. The @code{remque} routine removes @var{elem} from +its containing queue. These routines expect to be passed pointers to +structures which have as their first members a forward pointer and a +back pointer, like this prototype (although no prototype is provided): + +@example +struct qelem @{ + struct qelem *q_forw; + struct qelem *q_back; + char q_data[]; +@}; +@end example + +@end deftypefn + +*/ + + +struct qelem { + struct qelem *q_forw; + struct qelem *q_back; +}; + + +void +insque (struct qelem *elem, struct qelem *pred) +{ + elem -> q_forw = pred -> q_forw; + pred -> q_forw -> q_back = elem; + elem -> q_back = pred; + pred -> q_forw = elem; +} + + +void +remque (struct qelem *elem) +{ + elem -> q_forw -> q_back = elem -> q_back; + elem -> q_back -> q_forw = elem -> q_forw; +} diff --git a/libiberty/lbasename.c b/libiberty/lbasename.c new file mode 100644 index 0000000..56fcd62 --- /dev/null +++ b/libiberty/lbasename.c @@ -0,0 +1,64 @@ +/* Libiberty basename. Like basename, but is not overridden by the + system C library. + Copyright (C) 2001, 2002 Free Software Foundation, Inc. + +This file is part of the libiberty library. +Libiberty is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +Libiberty 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with libiberty; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +/* + +@deftypefn Replacement {const char*} lbasename (const char *@var{name}) + +Given a pointer to a string containing a typical pathname +(@samp{/usr/src/cmd/ls/ls.c} for example), returns a pointer to the +last component of the pathname (@samp{ls.c} in this case). The +returned pointer is guaranteed to lie within the original +string. This latter fact is not true of many vendor C +libraries, which return special strings or modify the passed +strings for particular input. + +In particular, the empty string returns the same empty string, +and a path ending in @code{/} returns the empty string after it. + +@end deftypefn + +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include "ansidecl.h" +#include "libiberty.h" +#include "safe-ctype.h" +#include "filenames.h" + +const char * +lbasename (const char *name) +{ + const char *base; + +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + /* Skip over a possible disk name. */ + if (ISALPHA (name[0]) && name[1] == ':') + name += 2; +#endif + + for (base = name; *name; name++) + if (IS_DIR_SEPARATOR (*name)) + base = name + 1; + + return base; +} diff --git a/libiberty/libiberty.texi b/libiberty/libiberty.texi new file mode 100644 index 0000000..d3701e6 --- /dev/null +++ b/libiberty/libiberty.texi @@ -0,0 +1,324 @@ +\input texinfo @c -*-texinfo-*- +@c %**start of header +@setfilename libiberty.info +@settitle @sc{gnu} libiberty +@c %**end of header + +@syncodeindex fn cp +@syncodeindex vr cp +@syncodeindex pg cp + +@finalout +@c %**end of header + +@dircategory GNU libraries +@direntry +* Libiberty: (libiberty). Library of utility functions which + are missing or broken on some systems. +@end direntry + +@macro libib +@code{libiberty} +@end macro + +@c The edition date is written in three locations. Search for 'thedate'. +@ifinfo +This manual describes the GNU @libib library of utility subroutines. +This edition accompanies GCC 3, September 2001. + +Copyright @copyright{} 2001 Free Software Foundation, Inc. + + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.2 + or any later version published by the Free Software Foundation; + with no Invariant Sections, with no Front-Cover Texts, and with no + Back-Cover Texts. A copy of the license is included in the + section entitled ``GNU Free Documentation License''. + +@ignore +Permission is granted to process this file through TeX and print the +results, provided the printed document carries a copying permission +notice identical to this one except for the removal of this paragraph +(this paragraph not being relevant to the printed manual). + +@end ignore +@end ifinfo + + +@c The edition date is written in three locations. Search for 'thedate'. +@titlepage +@title @sc{gnu} libiberty +@subtitle September 2001 +@subtitle for GCC 3 +@author Phil Edwards et al. +@page + + +@vskip 0pt plus 1filll +Copyright @copyright{} 2001 Free Software Foundation, Inc. + + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.2 + or any later version published by the Free Software Foundation; + with no Invariant Sections, with no Front-Cover Texts, and with no + Back-Cover Texts. A copy of the license is included in the + section entitled ``GNU Free Documentation License''. + +@end titlepage +@contents +@page + +@ifnottex +@node Top,Using,, +@top Introduction + +The @libib{} library is a collection of subroutines used by various +GNU programs. It is available under the Library General Public +License; for more information, see @ref{Library Copying}. + +@c The edition date is written in three locations. Search for 'thedate'. +This edition accompanies GCC 3, September 2001. + +@end ifnottex + +@menu +* Using:: How to use libiberty in your code. + +* Overview:: Overview of available function groups. + +* Functions:: Available functions, macros, and global variables. + +* Obstacks:: Object Stacks. + +* Licenses:: The various licenses under which libiberty sources are + distributed. + +* Index:: Index of functions and categories. +@end menu + +@node Using +@chapter Using +@cindex using libiberty +@cindex libiberty usage +@cindex how to use + +@c THIS SECTION IS CRAP AND NEEDS REWRITING BADLY. + +To date, @libib{} is generally not installed on its own. It has evolved +over years but does not have its own version number nor release schedule. + +Possibly the easiest way to use @libib{} in your projects is to drop the +@libib{} code into your project's sources, and to build the library along +with your own sources; the library would then be linked in at the end. This +prevents any possible version mismatches with other copies of libiberty +elsewhere on the system. + +Passing @option{--enable-install-libiberty} to the @command{configure} +script when building @libib{} causes the header files and archive library +to be installed when @kbd{make install} is run. This option also takes +an (optional) argument to specify the installation location, in the same +manner as @option{--prefix}. + +For your own projects, an approach which offers stability and flexibility +is to include @libib{} with your code, but allow the end user to optionally +choose to use a previously-installed version instead. In this way the +user may choose (for example) to install @libib{} as part of GCC, and use +that version for all software built with that compiler. (This approach +has proven useful with software using the GNU @code{readline} library.) + +Making use of @libib{} code usually requires that you include one or more +header files from the @libib{} distribution. (They will be named as +necessary in the function descriptions.) At link time, you will need to +add @option{-liberty} to your link command invocation. + + +@node Overview +@chapter Overview + +Functions contained in @libib{} can be divided into three general categories. + + +@menu +* Supplemental Functions:: Providing functions which don't exist + on older operating systems. + +* Replacement Functions:: These functions are sometimes buggy or + unpredictable on some operating systems. + +* Extensions:: Functions which provide useful extensions + or safety wrappers around existing code. +@end menu + +@node Supplemental Functions +@section Supplemental Functions +@cindex supplemental functions +@cindex functions, supplemental +@cindex functions, missing + +Certain operating systems do not provide functions which have since +become standardized, or at least common. For example, the Single +Unix Specification Version 2 requires that the @code{basename} +function be provided, but an OS which predates that specification +might not have this function. This should not prevent well-written +code from running on such a system. + +Similarly, some functions exist only among a particular ``flavor'' +or ``family'' of operating systems. As an example, the @code{bzero} +function is often not present on systems outside the BSD-derived +family of systems. + +Many such functions are provided in @libib{}. They are quickly +listed here with little description, as systems which lack them +become less and less common. Each function @var{foo} is implemented +in @file{@var{foo}.c} but not declared in any @libib{} header file; more +comments and caveats for each function's implementation are often +available in the source file. Generally, the function can simply +be declared as @code{extern}. + + + +@node Replacement Functions +@section Replacement Functions +@cindex replacement functions +@cindex functions, replacement + +Some functions have extremely limited implementations on different +platforms. Other functions are tedious to use correctly; for example, +proper use of @code{malloc} calls for the return value to be checked and +appropriate action taken if memory has been exhausted. A group of +``replacement functions'' is available in @libib{} to address these issues +for some of the most commonly used subroutines. + +All of these functions are declared in the @file{libiberty.h} header +file. Many of the implementations will use preprocessor macros set by +GNU Autoconf, if you decide to make use of that program. Some of these +functions may call one another. + + +@menu +* Memory Allocation:: Testing and handling failed memory + requests automatically. +* Exit Handlers:: Calling routines on program exit. +* Error Reporting:: Mapping errno and signal numbers to + more useful string formats. +@end menu + +@node Memory Allocation +@subsection Memory Allocation +@cindex memory allocation + +The functions beginning with the letter @samp{x} are wrappers around +standard functions; the functions provided by the system environment +are called and their results checked before the results are passed back +to client code. If the standard functions fail, these wrappers will +terminate the program. Thus, these versions can be used with impunity. + + +@node Exit Handlers +@subsection Exit Handlers +@cindex exit handlers + +The existence and implementation of the @code{atexit} routine varies +amongst the flavors of Unix. @libib{} provides an unvarying dependable +implementation via @code{xatexit} and @code{xexit}. + + +@node Error Reporting +@subsection Error Reporting +@cindex error reporting + +These are a set of routines to facilitate programming with the system +@code{errno} interface. The @libib{} source file @file{strerror.c} +contains a good deal of documentation for these functions. + +@c signal stuff + + +@node Extensions +@section Extensions +@cindex extensions +@cindex functions, extension + +@libib{} includes additional functionality above and beyond standard +functions, which has proven generically useful in GNU programs, such as +obstacks and regex. These functions are often copied from other +projects as they gain popularity, and are included here to provide a +central location from which to use, maintain, and distribute them. + +@menu +* Obstacks:: Stacks of arbitrary objects. +@end menu + +@c This is generated from the glibc manual using a make-obstacks-texi.sh +@c script of Phil's. Hope it's accurate. +@include obstacks.texi + +@node Functions +@chapter Function, Variable, and Macro Listing. +@include functions.texi + +@node Licenses +@appendix Licenses + +@menu + +* Library Copying:: The GNU Library General Public License +* BSD:: Regents of the University of California + +@end menu + +@c This takes care of Library Copying. It is the copying-lib.texi from the +@c GNU web site, with its @node line altered to make makeinfo shut up. +@include copying-lib.texi + +@page +@node BSD +@appendixsec BSD + +Copyright @copyright{} 1990 Regents of the University of California. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +@enumerate + +@item +Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +@item +Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +@item +[rescinded 22 July 1999] + +@item +Neither the name of the University nor the names of its contributors +may be used to endorse or promote products derived from this software +without specific prior written permission. + +@end enumerate + +THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + +@node Index +@unnumbered Index + +@printindex cp + +@bye + diff --git a/libiberty/lrealpath.c b/libiberty/lrealpath.c new file mode 100644 index 0000000..b27c8de --- /dev/null +++ b/libiberty/lrealpath.c @@ -0,0 +1,157 @@ +/* Libiberty realpath. Like realpath, but more consistent behavior. + Based on gdb_realpath from GDB. + + Copyright 2003 Free Software Foundation, Inc. + + This file is part of the libiberty library. + + 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., 51 Franklin Street - Fifth Floor, + Boston, MA 02110-1301, USA. */ + +/* + +@deftypefn Replacement {const char*} lrealpath (const char *@var{name}) + +Given a pointer to a string containing a pathname, returns a canonical +version of the filename. Symlinks will be resolved, and ``.'' and ``..'' +components will be simplified. The returned value will be allocated using +@code{malloc}, or @code{NULL} will be returned on a memory allocation error. + +@end deftypefn + +*/ + +#include "config.h" +#include "ansidecl.h" +#include "libiberty.h" + +#ifdef HAVE_LIMITS_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif + +/* On GNU libc systems the declaration is only visible with _GNU_SOURCE. */ +#if defined(HAVE_CANONICALIZE_FILE_NAME) \ + && defined(NEED_DECLARATION_CANONICALIZE_FILE_NAME) +extern char *canonicalize_file_name (const char *); +#endif + +#if defined(HAVE_REALPATH) +# if defined (PATH_MAX) +# define REALPATH_LIMIT PATH_MAX +# else +# if defined (MAXPATHLEN) +# define REALPATH_LIMIT MAXPATHLEN +# endif +# endif +#else + /* cygwin has realpath, so it won't get here. */ +# if defined (_WIN32) +# define WIN32_LEAN_AND_MEAN +# include /* for GetFullPathName */ +# endif +#endif + +char * +lrealpath (const char *filename) +{ + /* Method 1: The system has a compile time upper bound on a filename + path. Use that and realpath() to canonicalize the name. This is + the most common case. Note that, if there isn't a compile time + upper bound, you want to avoid realpath() at all costs. */ +#if defined(REALPATH_LIMIT) + { + char buf[REALPATH_LIMIT]; + const char *rp = realpath (filename, buf); + if (rp == NULL) + rp = filename; + return strdup (rp); + } +#endif /* REALPATH_LIMIT */ + + /* Method 2: The host system (i.e., GNU) has the function + canonicalize_file_name() which malloc's a chunk of memory and + returns that, use that. */ +#if defined(HAVE_CANONICALIZE_FILE_NAME) + { + char *rp = canonicalize_file_name (filename); + if (rp == NULL) + return strdup (filename); + else + return rp; + } +#endif + + /* Method 3: Now we're getting desperate! The system doesn't have a + compile time buffer size and no alternative function. Query the + OS, using pathconf(), for the buffer limit. Care is needed + though, some systems do not limit PATH_MAX (return -1 for + pathconf()) making it impossible to pass a correctly sized buffer + to realpath() (it could always overflow). On those systems, we + skip this. */ +#if defined (HAVE_REALPATH) && defined (HAVE_UNISTD_H) + { + /* Find out the max path size. */ + long path_max = pathconf ("/", _PC_PATH_MAX); + if (path_max > 0) + { + /* PATH_MAX is bounded. */ + char *buf, *rp, *ret; + buf = (char *) malloc (path_max); + if (buf == NULL) + return NULL; + rp = realpath (filename, buf); + ret = strdup (rp ? rp : filename); + free (buf); + return ret; + } + } +#endif + + /* The MS Windows method. If we don't have realpath, we assume we + don't have symlinks and just canonicalize to a Windows absolute + path. GetFullPath converts ../ and ./ in relative paths to + absolute paths, filling in current drive if one is not given + or using the current directory of a specified drive (eg, "E:foo"). + It also converts all forward slashes to back slashes. */ +#if defined (_WIN32) + { + char buf[MAX_PATH]; + char* basename; + DWORD len = GetFullPathName (filename, MAX_PATH, buf, &basename); + if (len == 0 || len > MAX_PATH - 1) + return strdup (filename); + else + { + /* The file system is case-preserving but case-insensitive, + Canonicalize to lowercase, using the codepage associated + with the process locale. */ + CharLowerBuff (buf, len); + return strdup (buf); + } + } +#endif + + /* This system is a lost cause, just duplicate the filename. */ + return strdup (filename); +} diff --git a/libiberty/maint-tool b/libiberty/maint-tool new file mode 100644 index 0000000..a460b55 --- /dev/null +++ b/libiberty/maint-tool @@ -0,0 +1,296 @@ +#!/usr/bin/perl +# -*- perl -*- + +# Copyright (C) 2001, 2007 +# Free Software Foundation +# +# This file is part of the libiberty library. +# Libiberty is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# Libiberty 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with libiberty; see the file COPYING.LIB. If not, +# write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, +# Boston, MA 02110-1301, USA. +# +# Originally written by DJ Delorie + + +# This is a trivial script which checks the lists of C and O files in +# the Makefile for consistency. + +$mode = shift; +$srcdir = "."; + +if ($mode eq "-s") { + $srcdir = shift; + $mode = shift; +} + +&missing() if $mode eq "missing"; +&undoc() if $mode eq "undoc"; +&deps() if $mode eq "deps"; + +exit 0; + +format STDOUT = +^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<~ +$out + ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<~~ +$out +. + +###################################################################### + +sub missing { + + opendir(S, $srcdir); + while ($f = readdir S) { + $have{$f} = 1; + } + closedir(S); + opendir(S, "."); + while ($f = readdir S) { + $have{$f} = 1; + } + closedir(S); + + for $a (@ARGV) { + $listed{$a} = 1; + $have{$a} = 0; + } + + for $f (sort keys %have) { + next unless $have{$f}; + if ($f =~ /\.c$/) { + print "S $f\n"; + } + } + for $f (sort keys %listed) { + if ($f =~ /(.*)\.c$/) { + $base = $1; + if (! $listed{"$base.o"}) { + print "O $f\n"; + } + } + } +} + +###################################################################### + +sub undoc { + + opendir(S, $srcdir); + while ($file = readdir S) { + if ($file =~ /\.texi$/) { + open(T, "$srcdir/$file"); + while () { + if (/^\@deftype[^\(]* ([^\s\(]+) *\(/) { + $documented{$1} = 1; + } + } + close(T); + } + if ($file =~ /\.c$/) { + open(C, "$srcdir/$file"); + while () { + if (/\@undocumented (\S+)/) { + $documented{$1} = 1; + } + if (/^static /) { + if (! /[\(;]/) { + s/[\r\n]+$/ /; + $_ .= ; + } + while ($_ =~ /\([^\)]*$/) { + s/[\r\n]+$/ /; + $_ .= ; + } + } + s/ VPARAMS([ \(])/$1/; + s/PREFIX\(([^\)]*)\)/byte_$1/; + if (/^static [^\(]* ([^\s\(]+) *\(.*\)$/) { + $documented{$1} = 1; + } + } + } + } + closedir(D); + + # $out = join(' ', sort keys %documented); + # write; + # print "\n"; + + system "etags $srcdir/*.c $srcdir/../include/*.h"; + open(TAGS, "TAGS"); + while () { + s/[\r\n]+$//; + if (/^\014$/) { + $filename = ; + $filename =~ s/[\r\n]+$//; + $filename =~ s/,\d+$//; + $filename =~ s@.*[/\\]@@; + next; + } + if ($filename =~ /\.c$/ ) { + next unless /^[_a-zA-Z]/; + } else { + next unless /^\# *define/; + s/\# *define *//; + } + + s/ VPARAMS//; + s/ *\177.*//; + s/,$//; + s/DEFUN\(//; + s/\(//; + + next if /^static /; + next if /\s/; + next if /^_/; + next if $documented{$_}; + next if /_H_?$/; + + if ($seen_in{$_} ne $filename) { + $saw{$_} ++; + } + $seen_in{$_} = $filename; + } + + for $k (keys %saw) { + delete $saw{$k} if $saw{$k} > 1; + } + + for $k (sort keys %saw) { + $fromfile{$seen_in{$k}} .= " " if $fromfile{$seen_in{$k}}; + $fromfile{$seen_in{$k}} .= $k; + } + + for $f (sort keys %fromfile) { + $out = "$f: $fromfile{$f}"; + write; + } +} + +###################################################################### + +sub deps_for { + my($f) = @_; + my(%d); + open(F, $f); + %d = (); + while () { + if (/^#\s*include\s+["<](.*)[">]/) { + $d{$1} = 1; + } + } + close(F); + return keys %d; +} + +sub canonicalize { + my ($p) = @_; + 0 while $p =~ s@/\./@/@g; + 0 while $p =~ s@^\./@@g; + 0 while $p =~ s@/[^/]+/\.\./@/@g; + return $p; +} + +sub locals_first { + my ($a,$b) = @_; + return -1 if $a eq "config.h"; + return 1 if $b eq "config.h"; + return $a cmp $b; +} + +sub deps { + + $crule = "\tif [ x\"\$(PICFLAG)\" != x ]; then \\\n"; + $crule .= "\t \$(COMPILE.c) \$(PICFLAG) \$< -o pic/\$@; \\\n"; + $crule .= "\telse true; fi\n"; + $crule .= "\t\$(COMPILE.c) \$< \$(OUTPUT_OPTION)\n"; + $crule .= "\n"; + + $incdir = shift @ARGV; + + opendir(INC, $incdir); + while ($f = readdir INC) { + next unless $f =~ /\.h$/; + $mine{$f} = "\$(INCDIR)/$f"; + $deps{$f} = join(' ', &deps_for("$incdir/$f")); + } + + opendir(INC, $srcdir); + while ($f = readdir INC) { + next unless $f =~ /\.h$/; + $mine{$f} = "\$(srcdir)/$f"; + $deps{$f} = join(' ', &deps_for("$srcdir/$f")); + } + + $mine{'config.h'} = "stamp-h"; + + open(IN, "$srcdir/Makefile.in"); + open(OUT, ">$srcdir/Makefile.tmp"); + while () { + last if /remainder of this file/; + print OUT; + } + print OUT "# The dependencies in the remainder of this file are automatically\n"; + print OUT "# generated by \"make maint-deps\". Manual edits will be lost.\n\n"; + + opendir(S, $srcdir); + for $f (sort readdir S) { + if ($f =~ /\.c$/) { + + %scanned = (); + @pending = &deps_for("$srcdir/$f"); + while (@pending) { + @tmp = @pending; + @pending = (); + for $p (@tmp) { + next unless $mine{$p}; + if (!$scanned{$p}) { + push(@pending, split(' ', $deps{$p})); + $scanned{$p} = 1; + } + } + } + @deps = sort { &locals_first($a,$b) } keys %scanned; + $obj = $f; + $obj =~ s/\.c$/.o/; + $obj = "./$obj:"; + if ($#deps >= 0) { + print OUT "$obj \$(srcdir)/$f"; + $len = length("$obj $f"); + for $dt (@deps) { + $d = $mine{$dt}; + if ($len + length($d) > 70) { + printf OUT " \\\n\t$d"; + $len = 8 + length($d); + } else { + print OUT " $d"; + $len += length($d) + 1; + } + } + print OUT "\n"; + } else { + print OUT "$obj \$(srcdir)/$f\n"; + } + $c = $crule; + $c =~ s@\$\<@\$\(srcdir\)\/$f@g; + print OUT $c; + } + } + closedir(S); + close(IN); + close(OUT); + + rename("$srcdir/Makefile.tmp", "$srcdir/Makefile.in"); +} diff --git a/libiberty/make-relative-prefix.c b/libiberty/make-relative-prefix.c new file mode 100644 index 0000000..80e7f92 --- /dev/null +++ b/libiberty/make-relative-prefix.c @@ -0,0 +1,414 @@ +/* Relative (relocatable) prefix support. + Copyright (C) 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, + 1999, 2000, 2001, 2002, 2006 Free Software Foundation, Inc. + +This file is part of libiberty. + +GCC 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. + +GCC 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 GCC; see the file COPYING. If not, write to the Free +Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA +02110-1301, USA. */ + +/* + +@deftypefn Extension {const char*} make_relative_prefix (const char *@var{progname}, const char *@var{bin_prefix}, const char *@var{prefix}) + +Given three paths @var{progname}, @var{bin_prefix}, @var{prefix}, +return the path that is in the same position relative to +@var{progname}'s directory as @var{prefix} is relative to +@var{bin_prefix}. That is, a string starting with the directory +portion of @var{progname}, followed by a relative pathname of the +difference between @var{bin_prefix} and @var{prefix}. + +If @var{progname} does not contain any directory separators, +@code{make_relative_prefix} will search @env{PATH} to find a program +named @var{progname}. Also, if @var{progname} is a symbolic link, +the symbolic link will be resolved. + +For example, if @var{bin_prefix} is @code{/alpha/beta/gamma/gcc/delta}, +@var{prefix} is @code{/alpha/beta/gamma/omega/}, and @var{progname} is +@code{/red/green/blue/gcc}, then this function will return +@code{/red/green/blue/../../omega/}. + +The return value is normally allocated via @code{malloc}. If no +relative prefix can be found, return @code{NULL}. + +@end deftypefn + +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif + +#include + +#include "ansidecl.h" +#include "libiberty.h" + +#ifndef R_OK +#define R_OK 4 +#define W_OK 2 +#define X_OK 1 +#endif + +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +#endif + +#if defined (_WIN32) || defined (__MSDOS__) \ + || defined (__DJGPP__) || defined (__OS2__) +# define HAVE_DOS_BASED_FILE_SYSTEM +# define HAVE_HOST_EXECUTABLE_SUFFIX +# define HOST_EXECUTABLE_SUFFIX ".exe" +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# define PATH_SEPARATOR ';' +#else +# define PATH_SEPARATOR ':' +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif + +#define DIR_UP ".." + +static char *save_string (const char *, int); +static char **split_directories (const char *, int *); +static void free_split_directories (char **); + +static char * +save_string (const char *s, int len) +{ + char *result = (char *) malloc (len + 1); + + memcpy (result, s, len); + result[len] = 0; + return result; +} + +/* Split a filename into component directories. */ + +static char ** +split_directories (const char *name, int *ptr_num_dirs) +{ + int num_dirs = 0; + char **dirs; + const char *p, *q; + int ch; + + /* Count the number of directories. Special case MSDOS disk names as part + of the initial directory. */ + p = name; +#ifdef HAVE_DOS_BASED_FILE_SYSTEM + if (name[1] == ':' && IS_DIR_SEPARATOR (name[2])) + { + p += 3; + num_dirs++; + } +#endif /* HAVE_DOS_BASED_FILE_SYSTEM */ + + while ((ch = *p++) != '\0') + { + if (IS_DIR_SEPARATOR (ch)) + { + num_dirs++; + while (IS_DIR_SEPARATOR (*p)) + p++; + } + } + + dirs = (char **) malloc (sizeof (char *) * (num_dirs + 2)); + if (dirs == NULL) + return NULL; + + /* Now copy the directory parts. */ + num_dirs = 0; + p = name; +#ifdef HAVE_DOS_BASED_FILE_SYSTEM + if (name[1] == ':' && IS_DIR_SEPARATOR (name[2])) + { + dirs[num_dirs++] = save_string (p, 3); + if (dirs[num_dirs - 1] == NULL) + { + free (dirs); + return NULL; + } + p += 3; + } +#endif /* HAVE_DOS_BASED_FILE_SYSTEM */ + + q = p; + while ((ch = *p++) != '\0') + { + if (IS_DIR_SEPARATOR (ch)) + { + while (IS_DIR_SEPARATOR (*p)) + p++; + + dirs[num_dirs++] = save_string (q, p - q); + if (dirs[num_dirs - 1] == NULL) + { + dirs[num_dirs] = NULL; + free_split_directories (dirs); + return NULL; + } + q = p; + } + } + + if (p - 1 - q > 0) + dirs[num_dirs++] = save_string (q, p - 1 - q); + dirs[num_dirs] = NULL; + + if (dirs[num_dirs - 1] == NULL) + { + free_split_directories (dirs); + return NULL; + } + + if (ptr_num_dirs) + *ptr_num_dirs = num_dirs; + return dirs; +} + +/* Release storage held by split directories. */ + +static void +free_split_directories (char **dirs) +{ + int i = 0; + + if (dirs != NULL) + { + while (dirs[i] != NULL) + free (dirs[i++]); + + free ((char *) dirs); + } +} + +/* Given three strings PROGNAME, BIN_PREFIX, PREFIX, return a string that gets + to PREFIX starting with the directory portion of PROGNAME and a relative + pathname of the difference between BIN_PREFIX and PREFIX. + + For example, if BIN_PREFIX is /alpha/beta/gamma/gcc/delta, PREFIX is + /alpha/beta/gamma/omega/, and PROGNAME is /red/green/blue/gcc, then this + function will return /red/green/blue/../../omega/. + + If no relative prefix can be found, return NULL. */ + +static char * +make_relative_prefix_1 (const char *progname, const char *bin_prefix, + const char *prefix, const int resolve_links) +{ + char **prog_dirs = NULL, **bin_dirs = NULL, **prefix_dirs = NULL; + int prog_num, bin_num, prefix_num; + int i, n, common; + int needed_len; + char *ret = NULL, *ptr, *full_progname; + + if (progname == NULL || bin_prefix == NULL || prefix == NULL) + return NULL; + + /* If there is no full pathname, try to find the program by checking in each + of the directories specified in the PATH environment variable. */ + if (lbasename (progname) == progname) + { + char *temp; + + temp = getenv ("PATH"); + if (temp) + { + char *startp, *endp, *nstore; + size_t prefixlen = strlen (temp) + 1; + if (prefixlen < 2) + prefixlen = 2; + + nstore = (char *) alloca (prefixlen + strlen (progname) + 1); + + startp = endp = temp; + while (1) + { + if (*endp == PATH_SEPARATOR || *endp == 0) + { + if (endp == startp) + { + nstore[0] = '.'; + nstore[1] = DIR_SEPARATOR; + nstore[2] = '\0'; + } + else + { + strncpy (nstore, startp, endp - startp); + if (! IS_DIR_SEPARATOR (endp[-1])) + { + nstore[endp - startp] = DIR_SEPARATOR; + nstore[endp - startp + 1] = 0; + } + else + nstore[endp - startp] = 0; + } + strcat (nstore, progname); + if (! access (nstore, X_OK) +#ifdef HAVE_HOST_EXECUTABLE_SUFFIX + || ! access (strcat (nstore, HOST_EXECUTABLE_SUFFIX), X_OK) +#endif + ) + { + progname = nstore; + break; + } + + if (*endp == 0) + break; + endp = startp = endp + 1; + } + else + endp++; + } + } + } + + if ( resolve_links ) + { + full_progname = lrealpath (progname); + if (full_progname == NULL) + return NULL; + } + else + full_progname = strdup(progname); + + prog_dirs = split_directories (full_progname, &prog_num); + free (full_progname); + if (prog_dirs == NULL) + return NULL; + + bin_dirs = split_directories (bin_prefix, &bin_num); + if (bin_dirs == NULL) + goto bailout; + + /* Remove the program name from comparison of directory names. */ + prog_num--; + + /* If we are still installed in the standard location, we don't need to + specify relative directories. Also, if argv[0] still doesn't contain + any directory specifiers after the search above, then there is not much + we can do. */ + if (prog_num == bin_num) + { + for (i = 0; i < bin_num; i++) + { + if (strcmp (prog_dirs[i], bin_dirs[i]) != 0) + break; + } + + if (prog_num <= 0 || i == bin_num) + goto bailout; + } + + prefix_dirs = split_directories (prefix, &prefix_num); + if (prefix_dirs == NULL) + goto bailout; + + /* Find how many directories are in common between bin_prefix & prefix. */ + n = (prefix_num < bin_num) ? prefix_num : bin_num; + for (common = 0; common < n; common++) + { + if (strcmp (bin_dirs[common], prefix_dirs[common]) != 0) + break; + } + + /* If there are no common directories, there can be no relative prefix. */ + if (common == 0) + goto bailout; + + /* Two passes: first figure out the size of the result string, and + then construct it. */ + needed_len = 0; + for (i = 0; i < prog_num; i++) + needed_len += strlen (prog_dirs[i]); + needed_len += sizeof (DIR_UP) * (bin_num - common); + for (i = common; i < prefix_num; i++) + needed_len += strlen (prefix_dirs[i]); + needed_len += 1; /* Trailing NUL. */ + + ret = (char *) malloc (needed_len); + if (ret == NULL) + goto bailout; + + /* Build up the pathnames in argv[0]. */ + *ret = '\0'; + for (i = 0; i < prog_num; i++) + strcat (ret, prog_dirs[i]); + + /* Now build up the ..'s. */ + ptr = ret + strlen(ret); + for (i = common; i < bin_num; i++) + { + strcpy (ptr, DIR_UP); + ptr += sizeof (DIR_UP) - 1; + *(ptr++) = DIR_SEPARATOR; + } + *ptr = '\0'; + + /* Put in directories to move over to prefix. */ + for (i = common; i < prefix_num; i++) + strcat (ret, prefix_dirs[i]); + + bailout: + free_split_directories (prog_dirs); + free_split_directories (bin_dirs); + free_split_directories (prefix_dirs); + + return ret; +} + + +/* Do the full job, including symlink resolution. + This path will find files installed in the same place as the + program even when a soft link has been made to the program + from somwhere else. */ + +char * +make_relative_prefix (const char *progname, const char *bin_prefix, + const char *prefix) +{ + return make_relative_prefix_1 (progname, bin_prefix, prefix, 1); +} + +/* Make the relative pathname without attempting to resolve any links. + '..' etc may also be left in the pathname. + This will find the files the user meant the program to find if the + installation is patched together with soft links. */ + +char * +make_relative_prefix_ignore_links (const char *progname, + const char *bin_prefix, + const char *prefix) +{ + return make_relative_prefix_1 (progname, bin_prefix, prefix, 0); +} + diff --git a/libiberty/make-temp-file.c b/libiberty/make-temp-file.c new file mode 100644 index 0000000..5e21414 --- /dev/null +++ b/libiberty/make-temp-file.c @@ -0,0 +1,177 @@ +/* Utility to pick a temporary filename prefix. + Copyright (C) 1996, 1997, 1998, 2001 Free Software Foundation, Inc. + +This file is part of the libiberty library. +Libiberty is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +Libiberty 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with libiberty; see the file COPYING.LIB. If not, +write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include /* May get P_tmpdir. */ +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_SYS_FILE_H +#include /* May get R_OK, etc. on some systems. */ +#endif + +#ifndef R_OK +#define R_OK 4 +#define W_OK 2 +#define X_OK 1 +#endif + +#include "libiberty.h" +extern int mkstemps (char *, int); + +/* '/' works just fine on MS-DOS based systems. */ +#ifndef DIR_SEPARATOR +#define DIR_SEPARATOR '/' +#endif + +/* Name of temporary file. + mktemp requires 6 trailing X's. */ +#define TEMP_FILE "ccXXXXXX" +#define TEMP_FILE_LEN (sizeof(TEMP_FILE) - 1) + +/* Subroutine of choose_tmpdir. + If BASE is non-NULL, return it. + Otherwise it checks if DIR is a usable directory. + If success, DIR is returned. + Otherwise NULL is returned. */ + +static inline const char *try_dir (const char *, const char *); + +static inline const char * +try_dir (const char *dir, const char *base) +{ + if (base != 0) + return base; + if (dir != 0 + && access (dir, R_OK | W_OK | X_OK) == 0) + return dir; + return 0; +} + +static const char tmp[] = { DIR_SEPARATOR, 't', 'm', 'p', 0 }; +static const char usrtmp[] = +{ DIR_SEPARATOR, 'u', 's', 'r', DIR_SEPARATOR, 't', 'm', 'p', 0 }; +static const char vartmp[] = +{ DIR_SEPARATOR, 'v', 'a', 'r', DIR_SEPARATOR, 't', 'm', 'p', 0 }; + +static char *memoized_tmpdir; + +/* + +@deftypefn Replacement char* choose_tmpdir () + +Returns a pointer to a directory path suitable for creating temporary +files in. + +@end deftypefn + +*/ + +char * +choose_tmpdir (void) +{ + const char *base = 0; + char *tmpdir; + unsigned int len; + + if (memoized_tmpdir) + return memoized_tmpdir; + + base = try_dir (getenv ("TMPDIR"), base); + base = try_dir (getenv ("TMP"), base); + base = try_dir (getenv ("TEMP"), base); + +#ifdef P_tmpdir + base = try_dir (P_tmpdir, base); +#endif + + /* Try /var/tmp, /usr/tmp, then /tmp. */ + base = try_dir (vartmp, base); + base = try_dir (usrtmp, base); + base = try_dir (tmp, base); + + /* If all else fails, use the current directory! */ + if (base == 0) + base = "."; + + /* Append DIR_SEPARATOR to the directory we've chosen + and return it. */ + len = strlen (base); + tmpdir = XNEWVEC (char, len + 2); + strcpy (tmpdir, base); + tmpdir[len] = DIR_SEPARATOR; + tmpdir[len+1] = '\0'; + + memoized_tmpdir = tmpdir; + return tmpdir; +} + +/* + +@deftypefn Replacement char* make_temp_file (const char *@var{suffix}) + +Return a temporary file name (as a string) or @code{NULL} if unable to +create one. @var{suffix} is a suffix to append to the file name. The +string is @code{malloc}ed, and the temporary file has been created. + +@end deftypefn + +*/ + +char * +make_temp_file (const char *suffix) +{ + const char *base = choose_tmpdir (); + char *temp_filename; + int base_len, suffix_len; + int fd; + + if (suffix == 0) + suffix = ""; + + base_len = strlen (base); + suffix_len = strlen (suffix); + + temp_filename = XNEWVEC (char, base_len + + TEMP_FILE_LEN + + suffix_len + 1); + strcpy (temp_filename, base); + strcpy (temp_filename + base_len, TEMP_FILE); + strcpy (temp_filename + base_len + TEMP_FILE_LEN, suffix); + + fd = mkstemps (temp_filename, suffix_len); + /* If mkstemps failed, then something bad is happening. Maybe we should + issue a message about a possible security attack in progress? */ + if (fd == -1) + abort (); + /* Similarly if we can not close the file. */ + if (close (fd)) + abort (); + return temp_filename; +} diff --git a/libiberty/makefile.vms b/libiberty/makefile.vms new file mode 100644 index 0000000..6a7dd45 --- /dev/null +++ b/libiberty/makefile.vms @@ -0,0 +1,33 @@ +# +# Makefile for libiberty under openVMS/Alpha +# +# For use with gnu-make for vms +# +# Created by Klaus K"ampf, kkaempf@progis.de +# +# + +OBJS=bcopy.obj,bcmp.obj,getopt.obj,obstack.obj,xexit.obj,xmalloc.obj,hex.obj,\ + getopt1.obj,cplus-dem.obj,strncasecmp.obj,strcasecmp.obj,strdup.obj,\ + concat.obj,getruntime.obj,getpagesize.obj,alloca.obj,xstrerror.obj,\ + xmemdup.obj,xstrdup.obj,xatexit.obj,choose-temp.obj,fnmatch.obj,objalloc.obj + +ifeq ($(CC),gcc) +CFLAGS=/include=([],[-.include]) +else +# assume dec c +CFLAGS=/noopt/debug/include=([],[-.include])/define=("const=")/warnings=disable=(missingreturn,implicitfunc) +endif + +libiberty.olb: config.h alloca-conf.h $(OBJS) + purge + lib/create libiberty *.obj + +config.h: config.h-vms + $(CP) $< $@ + +clean: + $$ purge + $(RM) config.h; + $(RM) *.obj; + $(RM) libiberty.olb; diff --git a/libiberty/md5.c b/libiberty/md5.c new file mode 100644 index 0000000..83e0beb --- /dev/null +++ b/libiberty/md5.c @@ -0,0 +1,430 @@ +/* md5.c - Functions to compute MD5 message digest of files or memory blocks + according to the definition of MD5 in RFC 1321 from April 1992. + Copyright (C) 1995, 1996 Free Software Foundation, Inc. + + NOTE: This source is derived from an old version taken from the GNU C + Library (glibc). + + 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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* Written by Ulrich Drepper , 1995. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#if STDC_HEADERS || defined _LIBC +# include +# include +#else +# ifndef HAVE_MEMCPY +# define memcpy(d, s, n) bcopy ((s), (d), (n)) +# endif +#endif + +#include "ansidecl.h" +#include "md5.h" + +#ifdef _LIBC +# include +# if __BYTE_ORDER == __BIG_ENDIAN +# define WORDS_BIGENDIAN 1 +# endif +#endif + +#ifdef WORDS_BIGENDIAN +# define SWAP(n) \ + (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24)) +#else +# define SWAP(n) (n) +#endif + + +/* This array contains the bytes used to pad the buffer to the next + 64-byte boundary. (RFC 1321, 3.1: Step 1) */ +static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ }; + + +/* Initialize structure containing state of computation. + (RFC 1321, 3.3: Step 3) */ +void +md5_init_ctx (struct md5_ctx *ctx) +{ + ctx->A = (md5_uint32) 0x67452301; + ctx->B = (md5_uint32) 0xefcdab89; + ctx->C = (md5_uint32) 0x98badcfe; + ctx->D = (md5_uint32) 0x10325476; + + ctx->total[0] = ctx->total[1] = 0; + ctx->buflen = 0; +} + +/* Put result from CTX in first 16 bytes following RESBUF. The result + must be in little endian byte order. + + IMPORTANT: On some systems it is required that RESBUF is correctly + aligned for a 32 bits value. */ +void * +md5_read_ctx (const struct md5_ctx *ctx, void *resbuf) +{ + ((md5_uint32 *) resbuf)[0] = SWAP (ctx->A); + ((md5_uint32 *) resbuf)[1] = SWAP (ctx->B); + ((md5_uint32 *) resbuf)[2] = SWAP (ctx->C); + ((md5_uint32 *) resbuf)[3] = SWAP (ctx->D); + + return resbuf; +} + +/* Process the remaining bytes in the internal buffer and the usual + prolog according to the standard and write the result to RESBUF. + + IMPORTANT: On some systems it is required that RESBUF is correctly + aligned for a 32 bits value. */ +void * +md5_finish_ctx (struct md5_ctx *ctx, void *resbuf) +{ + /* Take yet unprocessed bytes into account. */ + md5_uint32 bytes = ctx->buflen; + size_t pad; + + /* Now count remaining bytes. */ + ctx->total[0] += bytes; + if (ctx->total[0] < bytes) + ++ctx->total[1]; + + pad = bytes >= 56 ? 64 + 56 - bytes : 56 - bytes; + memcpy (&ctx->buffer[bytes], fillbuf, pad); + + /* Put the 64-bit file length in *bits* at the end of the buffer. */ + *(md5_uint32 *) &ctx->buffer[bytes + pad] = SWAP (ctx->total[0] << 3); + *(md5_uint32 *) &ctx->buffer[bytes + pad + 4] = SWAP ((ctx->total[1] << 3) | + (ctx->total[0] >> 29)); + + /* Process last bytes. */ + md5_process_block (ctx->buffer, bytes + pad + 8, ctx); + + return md5_read_ctx (ctx, resbuf); +} + +/* Compute MD5 message digest for bytes read from STREAM. The + resulting message digest number will be written into the 16 bytes + beginning at RESBLOCK. */ +int +md5_stream (FILE *stream, void *resblock) +{ + /* Important: BLOCKSIZE must be a multiple of 64. */ +#define BLOCKSIZE 4096 + struct md5_ctx ctx; + char buffer[BLOCKSIZE + 72]; + size_t sum; + + /* Initialize the computation context. */ + md5_init_ctx (&ctx); + + /* Iterate over full file contents. */ + while (1) + { + /* We read the file in blocks of BLOCKSIZE bytes. One call of the + computation function processes the whole buffer so that with the + next round of the loop another block can be read. */ + size_t n; + sum = 0; + + /* Read block. Take care for partial reads. */ + do + { + n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream); + + sum += n; + } + while (sum < BLOCKSIZE && n != 0); + if (n == 0 && ferror (stream)) + return 1; + + /* If end of file is reached, end the loop. */ + if (n == 0) + break; + + /* Process buffer with BLOCKSIZE bytes. Note that + BLOCKSIZE % 64 == 0 + */ + md5_process_block (buffer, BLOCKSIZE, &ctx); + } + + /* Add the last bytes if necessary. */ + if (sum > 0) + md5_process_bytes (buffer, sum, &ctx); + + /* Construct result in desired memory. */ + md5_finish_ctx (&ctx, resblock); + return 0; +} + +/* Compute MD5 message digest for LEN bytes beginning at BUFFER. The + result is always in little endian byte order, so that a byte-wise + output yields to the wanted ASCII representation of the message + digest. */ +void * +md5_buffer (const char *buffer, size_t len, void *resblock) +{ + struct md5_ctx ctx; + + /* Initialize the computation context. */ + md5_init_ctx (&ctx); + + /* Process whole buffer but last len % 64 bytes. */ + md5_process_bytes (buffer, len, &ctx); + + /* Put result in desired memory area. */ + return md5_finish_ctx (&ctx, resblock); +} + + +void +md5_process_bytes (const void *buffer, size_t len, struct md5_ctx *ctx) +{ + /* When we already have some bits in our internal buffer concatenate + both inputs first. */ + if (ctx->buflen != 0) + { + size_t left_over = ctx->buflen; + size_t add = 128 - left_over > len ? len : 128 - left_over; + + memcpy (&ctx->buffer[left_over], buffer, add); + ctx->buflen += add; + + if (left_over + add > 64) + { + md5_process_block (ctx->buffer, (left_over + add) & ~63, ctx); + /* The regions in the following copy operation cannot overlap. */ + memcpy (ctx->buffer, &ctx->buffer[(left_over + add) & ~63], + (left_over + add) & 63); + ctx->buflen = (left_over + add) & 63; + } + + buffer = (const void *) ((const char *) buffer + add); + len -= add; + } + + /* Process available complete blocks. */ + if (len > 64) + { +#if !_STRING_ARCH_unaligned +/* To check alignment gcc has an appropriate operator. Other + compilers don't. */ +# if __GNUC__ >= 2 +# define UNALIGNED_P(p) (((md5_uintptr) p) % __alignof__ (md5_uint32) != 0) +# else +# define UNALIGNED_P(p) (((md5_uintptr) p) % sizeof (md5_uint32) != 0) +# endif + if (UNALIGNED_P (buffer)) + while (len > 64) + { + md5_process_block (memcpy (ctx->buffer, buffer, 64), 64, ctx); + buffer = (const char *) buffer + 64; + len -= 64; + } + else +#endif + md5_process_block (buffer, len & ~63, ctx); + buffer = (const void *) ((const char *) buffer + (len & ~63)); + len &= 63; + } + + /* Move remaining bytes in internal buffer. */ + if (len > 0) + { + memcpy (ctx->buffer, buffer, len); + ctx->buflen = len; + } +} + + +/* These are the four functions used in the four steps of the MD5 algorithm + and defined in the RFC 1321. The first function is a little bit optimized + (as found in Colin Plumbs public domain implementation). */ +/* #define FF(b, c, d) ((b & c) | (~b & d)) */ +#define FF(b, c, d) (d ^ (b & (c ^ d))) +#define FG(b, c, d) FF (d, b, c) +#define FH(b, c, d) (b ^ c ^ d) +#define FI(b, c, d) (c ^ (b | ~d)) + +/* Process LEN bytes of BUFFER, accumulating context into CTX. + It is assumed that LEN % 64 == 0. */ + +void +md5_process_block (const void *buffer, size_t len, struct md5_ctx *ctx) +{ + md5_uint32 correct_words[16]; + const md5_uint32 *words = (const md5_uint32 *) buffer; + size_t nwords = len / sizeof (md5_uint32); + const md5_uint32 *endp = words + nwords; + md5_uint32 A = ctx->A; + md5_uint32 B = ctx->B; + md5_uint32 C = ctx->C; + md5_uint32 D = ctx->D; + + /* First increment the byte count. RFC 1321 specifies the possible + length of the file up to 2^64 bits. Here we only compute the + number of bytes. Do a double word increment. */ + ctx->total[0] += len; + if (ctx->total[0] < len) + ++ctx->total[1]; + + /* Process all bytes in the buffer with 64 bytes in each round of + the loop. */ + while (words < endp) + { + md5_uint32 *cwp = correct_words; + md5_uint32 A_save = A; + md5_uint32 B_save = B; + md5_uint32 C_save = C; + md5_uint32 D_save = D; + + /* First round: using the given function, the context and a constant + the next context is computed. Because the algorithms processing + unit is a 32-bit word and it is determined to work on words in + little endian byte order we perhaps have to change the byte order + before the computation. To reduce the work for the next steps + we store the swapped words in the array CORRECT_WORDS. */ + +#define OP(a, b, c, d, s, T) \ + do \ + { \ + a += FF (b, c, d) + (*cwp++ = SWAP (*words)) + T; \ + ++words; \ + CYCLIC (a, s); \ + a += b; \ + } \ + while (0) + + /* It is unfortunate that C does not provide an operator for + cyclic rotation. Hope the C compiler is smart enough. */ +#define CYCLIC(w, s) (w = (w << s) | (w >> (32 - s))) + + /* Before we start, one word to the strange constants. + They are defined in RFC 1321 as + + T[i] = (int) (4294967296.0 * fabs (sin (i))), i=1..64 + */ + + /* Round 1. */ + OP (A, B, C, D, 7, (md5_uint32) 0xd76aa478); + OP (D, A, B, C, 12, (md5_uint32) 0xe8c7b756); + OP (C, D, A, B, 17, (md5_uint32) 0x242070db); + OP (B, C, D, A, 22, (md5_uint32) 0xc1bdceee); + OP (A, B, C, D, 7, (md5_uint32) 0xf57c0faf); + OP (D, A, B, C, 12, (md5_uint32) 0x4787c62a); + OP (C, D, A, B, 17, (md5_uint32) 0xa8304613); + OP (B, C, D, A, 22, (md5_uint32) 0xfd469501); + OP (A, B, C, D, 7, (md5_uint32) 0x698098d8); + OP (D, A, B, C, 12, (md5_uint32) 0x8b44f7af); + OP (C, D, A, B, 17, (md5_uint32) 0xffff5bb1); + OP (B, C, D, A, 22, (md5_uint32) 0x895cd7be); + OP (A, B, C, D, 7, (md5_uint32) 0x6b901122); + OP (D, A, B, C, 12, (md5_uint32) 0xfd987193); + OP (C, D, A, B, 17, (md5_uint32) 0xa679438e); + OP (B, C, D, A, 22, (md5_uint32) 0x49b40821); + + /* For the second to fourth round we have the possibly swapped words + in CORRECT_WORDS. Redefine the macro to take an additional first + argument specifying the function to use. */ +#undef OP +#define OP(a, b, c, d, k, s, T) \ + do \ + { \ + a += FX (b, c, d) + correct_words[k] + T; \ + CYCLIC (a, s); \ + a += b; \ + } \ + while (0) + +#define FX(b, c, d) FG (b, c, d) + + /* Round 2. */ + OP (A, B, C, D, 1, 5, (md5_uint32) 0xf61e2562); + OP (D, A, B, C, 6, 9, (md5_uint32) 0xc040b340); + OP (C, D, A, B, 11, 14, (md5_uint32) 0x265e5a51); + OP (B, C, D, A, 0, 20, (md5_uint32) 0xe9b6c7aa); + OP (A, B, C, D, 5, 5, (md5_uint32) 0xd62f105d); + OP (D, A, B, C, 10, 9, (md5_uint32) 0x02441453); + OP (C, D, A, B, 15, 14, (md5_uint32) 0xd8a1e681); + OP (B, C, D, A, 4, 20, (md5_uint32) 0xe7d3fbc8); + OP (A, B, C, D, 9, 5, (md5_uint32) 0x21e1cde6); + OP (D, A, B, C, 14, 9, (md5_uint32) 0xc33707d6); + OP (C, D, A, B, 3, 14, (md5_uint32) 0xf4d50d87); + OP (B, C, D, A, 8, 20, (md5_uint32) 0x455a14ed); + OP (A, B, C, D, 13, 5, (md5_uint32) 0xa9e3e905); + OP (D, A, B, C, 2, 9, (md5_uint32) 0xfcefa3f8); + OP (C, D, A, B, 7, 14, (md5_uint32) 0x676f02d9); + OP (B, C, D, A, 12, 20, (md5_uint32) 0x8d2a4c8a); + +#undef FX +#define FX(b, c, d) FH (b, c, d) + + /* Round 3. */ + OP (A, B, C, D, 5, 4, (md5_uint32) 0xfffa3942); + OP (D, A, B, C, 8, 11, (md5_uint32) 0x8771f681); + OP (C, D, A, B, 11, 16, (md5_uint32) 0x6d9d6122); + OP (B, C, D, A, 14, 23, (md5_uint32) 0xfde5380c); + OP (A, B, C, D, 1, 4, (md5_uint32) 0xa4beea44); + OP (D, A, B, C, 4, 11, (md5_uint32) 0x4bdecfa9); + OP (C, D, A, B, 7, 16, (md5_uint32) 0xf6bb4b60); + OP (B, C, D, A, 10, 23, (md5_uint32) 0xbebfbc70); + OP (A, B, C, D, 13, 4, (md5_uint32) 0x289b7ec6); + OP (D, A, B, C, 0, 11, (md5_uint32) 0xeaa127fa); + OP (C, D, A, B, 3, 16, (md5_uint32) 0xd4ef3085); + OP (B, C, D, A, 6, 23, (md5_uint32) 0x04881d05); + OP (A, B, C, D, 9, 4, (md5_uint32) 0xd9d4d039); + OP (D, A, B, C, 12, 11, (md5_uint32) 0xe6db99e5); + OP (C, D, A, B, 15, 16, (md5_uint32) 0x1fa27cf8); + OP (B, C, D, A, 2, 23, (md5_uint32) 0xc4ac5665); + +#undef FX +#define FX(b, c, d) FI (b, c, d) + + /* Round 4. */ + OP (A, B, C, D, 0, 6, (md5_uint32) 0xf4292244); + OP (D, A, B, C, 7, 10, (md5_uint32) 0x432aff97); + OP (C, D, A, B, 14, 15, (md5_uint32) 0xab9423a7); + OP (B, C, D, A, 5, 21, (md5_uint32) 0xfc93a039); + OP (A, B, C, D, 12, 6, (md5_uint32) 0x655b59c3); + OP (D, A, B, C, 3, 10, (md5_uint32) 0x8f0ccc92); + OP (C, D, A, B, 10, 15, (md5_uint32) 0xffeff47d); + OP (B, C, D, A, 1, 21, (md5_uint32) 0x85845dd1); + OP (A, B, C, D, 8, 6, (md5_uint32) 0x6fa87e4f); + OP (D, A, B, C, 15, 10, (md5_uint32) 0xfe2ce6e0); + OP (C, D, A, B, 6, 15, (md5_uint32) 0xa3014314); + OP (B, C, D, A, 13, 21, (md5_uint32) 0x4e0811a1); + OP (A, B, C, D, 4, 6, (md5_uint32) 0xf7537e82); + OP (D, A, B, C, 11, 10, (md5_uint32) 0xbd3af235); + OP (C, D, A, B, 2, 15, (md5_uint32) 0x2ad7d2bb); + OP (B, C, D, A, 9, 21, (md5_uint32) 0xeb86d391); + + /* Add the starting values of the context. */ + A += A_save; + B += B_save; + C += C_save; + D += D_save; + } + + /* Put checksum in context given as argument. */ + ctx->A = A; + ctx->B = B; + ctx->C = C; + ctx->D = D; +} diff --git a/libiberty/memchr.c b/libiberty/memchr.c new file mode 100644 index 0000000..451f817 --- /dev/null +++ b/libiberty/memchr.c @@ -0,0 +1,32 @@ +/* + +@deftypefn Supplemental void* memchr (const void *@var{s}, int @var{c}, size_t @var{n}) + +This function searches memory starting at @code{*@var{s}} for the +character @var{c}. The search only ends with the first occurrence of +@var{c}, or after @var{length} characters; in particular, a null +character does not terminate the search. If the character @var{c} is +found within @var{length} characters of @code{*@var{s}}, a pointer +to the character is returned. If @var{c} is not found, then @code{NULL} is +returned. + +@end deftypefn + +*/ + +#include +#include + +PTR +memchr (register const PTR src_void, int c, size_t length) +{ + const unsigned char *src = (const unsigned char *)src_void; + + while (length-- > 0) + { + if (*src == c) + return (PTR)src; + src++; + } + return NULL; +} diff --git a/libiberty/memcmp.c b/libiberty/memcmp.c new file mode 100644 index 0000000..39edfca --- /dev/null +++ b/libiberty/memcmp.c @@ -0,0 +1,34 @@ +/* memcmp -- compare two memory regions. + This function is in the public domain. */ + +/* + +@deftypefn Supplemental int memcmp (const void *@var{x}, const void *@var{y}, size_t @var{count}) + +Compares the first @var{count} bytes of two areas of memory. Returns +zero if they are the same, a value less than zero if @var{x} is +lexically less than @var{y}, or a value greater than zero if @var{x} +is lexically greater than @var{y}. Note that lexical order is determined +as if comparing unsigned char arrays. + +@end deftypefn + +*/ + +#include +#include + +int +memcmp (const PTR str1, const PTR str2, size_t count) +{ + register const unsigned char *s1 = (const unsigned char*)str1; + register const unsigned char *s2 = (const unsigned char*)str2; + + while (count-- > 0) + { + if (*s1++ != *s2++) + return s1[-1] < s2[-1] ? -1 : 1; + } + return 0; +} + diff --git a/libiberty/memcpy.c b/libiberty/memcpy.c new file mode 100644 index 0000000..9b5b242 --- /dev/null +++ b/libiberty/memcpy.c @@ -0,0 +1,25 @@ +/* memcpy (the standard C function) + This function is in the public domain. */ + +/* + +@deftypefn Supplemental void* memcpy (void *@var{out}, const void *@var{in}, size_t @var{length}) + +Copies @var{length} bytes from memory region @var{in} to region +@var{out}. Returns a pointer to @var{out}. + +@end deftypefn + +*/ + +#include +#include + +void bcopy (const void*, void*, size_t); + +PTR +memcpy (PTR out, const PTR in, size_t length) +{ + bcopy(in, out, length); + return out; +} diff --git a/libiberty/memmove.c b/libiberty/memmove.c new file mode 100644 index 0000000..06a24fc --- /dev/null +++ b/libiberty/memmove.c @@ -0,0 +1,25 @@ +/* Wrapper to implement ANSI C's memmove using BSD's bcopy. */ +/* This function is in the public domain. --Per Bothner. */ + +/* + +@deftypefn Supplemental void* memmove (void *@var{from}, const void *@var{to}, size_t @var{count}) + +Copies @var{count} bytes from memory area @var{from} to memory area +@var{to}, returning a pointer to @var{to}. + +@end deftypefn + +*/ + +#include +#include + +void bcopy (const void*, void*, size_t); + +PTR +memmove (PTR s1, const PTR s2, size_t n) +{ + bcopy (s2, s1, n); + return s1; +} diff --git a/libiberty/mempcpy.c b/libiberty/mempcpy.c new file mode 100644 index 0000000..beda7df --- /dev/null +++ b/libiberty/mempcpy.c @@ -0,0 +1,41 @@ +/* Implement the mempcpy function. + Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc. + Written by Kaveh R. Ghazi . + +This file is part of the libiberty library. +Libiberty is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +Libiberty 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with libiberty; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +/* + +@deftypefn Supplemental void* mempcpy (void *@var{out}, const void *@var{in}, size_t @var{length}) + +Copies @var{length} bytes from memory region @var{in} to region +@var{out}. Returns a pointer to @var{out} + @var{length}. + +@end deftypefn + +*/ + +#include +#include + +extern PTR memcpy (PTR, const PTR, size_t); + +PTR +mempcpy (PTR dst, const PTR src, size_t len) +{ + return (char *) memcpy (dst, src, len) + len; +} diff --git a/libiberty/memset.c b/libiberty/memset.c new file mode 100644 index 0000000..1951ad6 --- /dev/null +++ b/libiberty/memset.c @@ -0,0 +1,25 @@ +/* memset + This implementation is in the public domain. */ + +/* + +@deftypefn Supplemental void* memset (void *@var{s}, int @var{c}, size_t @var{count}) + +Sets the first @var{count} bytes of @var{s} to the constant byte +@var{c}, returning a pointer to @var{s}. + +@end deftypefn + +*/ + +#include +#include + +PTR +memset (PTR dest, register int val, register size_t len) +{ + register unsigned char *ptr = (unsigned char*)dest; + while (len-- > 0) + *ptr++ = val; + return dest; +} diff --git a/libiberty/mkstemps.c b/libiberty/mkstemps.c new file mode 100644 index 0000000..6c2e472 --- /dev/null +++ b/libiberty/mkstemps.c @@ -0,0 +1,140 @@ +/* Copyright (C) 1991, 1992, 1996, 1998, 2004 Free Software Foundation, Inc. + This file is derived from mkstemp.c from the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, + Boston, MA 02110-1301, USA. */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#include +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_SYS_TIME_H +#include +#endif +#include "ansidecl.h" + +/* We need to provide a type for gcc_uint64_t. */ +#ifdef __GNUC__ +__extension__ typedef unsigned long long gcc_uint64_t; +#else +typedef unsigned long gcc_uint64_t; +#endif + +#ifndef TMP_MAX +#define TMP_MAX 16384 +#endif + +#ifndef O_BINARY +# define O_BINARY 0 +#endif + +/* + +@deftypefn Replacement int mkstemps (char *@var{pattern}, int @var{suffix_len}) + +Generate a unique temporary file name from @var{pattern}. +@var{pattern} has the form: + +@example + @var{path}/ccXXXXXX@var{suffix} +@end example + +@var{suffix_len} tells us how long @var{suffix} is (it can be zero +length). The last six characters of @var{pattern} before @var{suffix} +must be @samp{XXXXXX}; they are replaced with a string that makes the +filename unique. Returns a file descriptor open on the file for +reading and writing. + +@end deftypefn + +*/ + +int +mkstemps (char *pattern, int suffix_len) +{ + static const char letters[] + = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + static gcc_uint64_t value; +#ifdef HAVE_GETTIMEOFDAY + struct timeval tv; +#endif + char *XXXXXX; + size_t len; + int count; + + len = strlen (pattern); + + if ((int) len < 6 + suffix_len + || strncmp (&pattern[len - 6 - suffix_len], "XXXXXX", 6)) + { + return -1; + } + + XXXXXX = &pattern[len - 6 - suffix_len]; + +#ifdef HAVE_GETTIMEOFDAY + /* Get some more or less random data. */ + gettimeofday (&tv, NULL); + value += ((gcc_uint64_t) tv.tv_usec << 16) ^ tv.tv_sec ^ getpid (); +#else + value += getpid (); +#endif + + for (count = 0; count < TMP_MAX; ++count) + { + gcc_uint64_t v = value; + int fd; + + /* Fill in the random bits. */ + XXXXXX[0] = letters[v % 62]; + v /= 62; + XXXXXX[1] = letters[v % 62]; + v /= 62; + XXXXXX[2] = letters[v % 62]; + v /= 62; + XXXXXX[3] = letters[v % 62]; + v /= 62; + XXXXXX[4] = letters[v % 62]; + v /= 62; + XXXXXX[5] = letters[v % 62]; + + fd = open (pattern, O_BINARY|O_RDWR|O_CREAT|O_EXCL, 0600); + if (fd >= 0) + /* The file does not exist. */ + return fd; + + /* This is a random value. It is only necessary that the next + TMP_MAX values generated by adding 7777 to VALUE are different + with (module 2^32). */ + value += 7777; + } + + /* We return the null string if we can't find a unique file name. */ + pattern[0] = '\0'; + return -1; +} diff --git a/libiberty/msdos.c b/libiberty/msdos.c new file mode 100644 index 0000000..923e64d --- /dev/null +++ b/libiberty/msdos.c @@ -0,0 +1,15 @@ +char msg[] = "No vfork available - aborting\n"; +vfork() +{ + write(1, msg, sizeof(msg)); +} + +sigsetmask() +{ + /* no signals support in go32 (yet) */ +} + +waitpid() +{ + return -1; +} diff --git a/libiberty/objalloc.c b/libiberty/objalloc.c new file mode 100644 index 0000000..3ddac2c --- /dev/null +++ b/libiberty/objalloc.c @@ -0,0 +1,291 @@ +/* objalloc.c -- routines to allocate memory for objects + Copyright 1997 Free Software Foundation, Inc. + Written by Ian Lance Taylor, Cygnus Solutions. + +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, 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +#include "config.h" +#include "ansidecl.h" + +#include "objalloc.h" + +/* Get a definition for NULL. */ +#include + +#if VMS +#include +#include +#else + +/* Get a definition for size_t. */ +#include + +#ifdef HAVE_STDLIB_H +#include +#else +/* For systems with larger pointers than ints, this must be declared. */ +extern PTR malloc (size_t); +extern void free (PTR); +#endif + +#endif + +/* These routines allocate space for an object. Freeing allocated + space may or may not free all more recently allocated space. + + We handle large and small allocation requests differently. If we + don't have enough space in the current block, and the allocation + request is for more than 512 bytes, we simply pass it through to + malloc. */ + +/* The objalloc structure is defined in objalloc.h. */ + +/* This structure appears at the start of each chunk. */ + +struct objalloc_chunk +{ + /* Next chunk. */ + struct objalloc_chunk *next; + /* If this chunk contains large objects, this is the value of + current_ptr when this chunk was allocated. If this chunk + contains small objects, this is NULL. */ + char *current_ptr; +}; + +/* The aligned size of objalloc_chunk. */ + +#define CHUNK_HEADER_SIZE \ + ((sizeof (struct objalloc_chunk) + OBJALLOC_ALIGN - 1) \ + &~ (OBJALLOC_ALIGN - 1)) + +/* We ask for this much memory each time we create a chunk which is to + hold small objects. */ + +#define CHUNK_SIZE (4096 - 32) + +/* A request for this amount or more is just passed through to malloc. */ + +#define BIG_REQUEST (512) + +/* Create an objalloc structure. */ + +struct objalloc * +objalloc_create (void) +{ + struct objalloc *ret; + struct objalloc_chunk *chunk; + + ret = (struct objalloc *) malloc (sizeof *ret); + if (ret == NULL) + return NULL; + + ret->chunks = (PTR) malloc (CHUNK_SIZE); + if (ret->chunks == NULL) + { + free (ret); + return NULL; + } + + chunk = (struct objalloc_chunk *) ret->chunks; + chunk->next = NULL; + chunk->current_ptr = NULL; + + ret->current_ptr = (char *) chunk + CHUNK_HEADER_SIZE; + ret->current_space = CHUNK_SIZE - CHUNK_HEADER_SIZE; + + return ret; +} + +/* Allocate space from an objalloc structure. */ + +PTR +_objalloc_alloc (struct objalloc *o, unsigned long len) +{ + /* We avoid confusion from zero sized objects by always allocating + at least 1 byte. */ + if (len == 0) + len = 1; + + len = (len + OBJALLOC_ALIGN - 1) &~ (OBJALLOC_ALIGN - 1); + + if (len <= o->current_space) + { + o->current_ptr += len; + o->current_space -= len; + return (PTR) (o->current_ptr - len); + } + + if (len >= BIG_REQUEST) + { + char *ret; + struct objalloc_chunk *chunk; + + ret = (char *) malloc (CHUNK_HEADER_SIZE + len); + if (ret == NULL) + return NULL; + + chunk = (struct objalloc_chunk *) ret; + chunk->next = (struct objalloc_chunk *) o->chunks; + chunk->current_ptr = o->current_ptr; + + o->chunks = (PTR) chunk; + + return (PTR) (ret + CHUNK_HEADER_SIZE); + } + else + { + struct objalloc_chunk *chunk; + + chunk = (struct objalloc_chunk *) malloc (CHUNK_SIZE); + if (chunk == NULL) + return NULL; + chunk->next = (struct objalloc_chunk *) o->chunks; + chunk->current_ptr = NULL; + + o->current_ptr = (char *) chunk + CHUNK_HEADER_SIZE; + o->current_space = CHUNK_SIZE - CHUNK_HEADER_SIZE; + + o->chunks = (PTR) chunk; + + return objalloc_alloc (o, len); + } +} + +/* Free an entire objalloc structure. */ + +void +objalloc_free (struct objalloc *o) +{ + struct objalloc_chunk *l; + + l = (struct objalloc_chunk *) o->chunks; + while (l != NULL) + { + struct objalloc_chunk *next; + + next = l->next; + free (l); + l = next; + } + + free (o); +} + +/* Free a block from an objalloc structure. This also frees all more + recently allocated blocks. */ + +void +objalloc_free_block (struct objalloc *o, PTR block) +{ + struct objalloc_chunk *p, *small; + char *b = (char *) block; + + /* First set P to the chunk which contains the block we are freeing, + and set Q to the last small object chunk we see before P. */ + small = NULL; + for (p = (struct objalloc_chunk *) o->chunks; p != NULL; p = p->next) + { + if (p->current_ptr == NULL) + { + if (b > (char *) p && b < (char *) p + CHUNK_SIZE) + break; + small = p; + } + else + { + if (b == (char *) p + CHUNK_HEADER_SIZE) + break; + } + } + + /* If we can't find the chunk, the caller has made a mistake. */ + if (p == NULL) + abort (); + + if (p->current_ptr == NULL) + { + struct objalloc_chunk *q; + struct objalloc_chunk *first; + + /* The block is in a chunk containing small objects. We can + free every chunk through SMALL, because they have certainly + been allocated more recently. After SMALL, we will not see + any chunks containing small objects; we can free any big + chunk if the current_ptr is greater than or equal to B. We + can then reset the new current_ptr to B. */ + + first = NULL; + q = (struct objalloc_chunk *) o->chunks; + while (q != p) + { + struct objalloc_chunk *next; + + next = q->next; + if (small != NULL) + { + if (small == q) + small = NULL; + free (q); + } + else if (q->current_ptr > b) + free (q); + else if (first == NULL) + first = q; + + q = next; + } + + if (first == NULL) + first = p; + o->chunks = (PTR) first; + + /* Now start allocating from this small block again. */ + o->current_ptr = b; + o->current_space = ((char *) p + CHUNK_SIZE) - b; + } + else + { + struct objalloc_chunk *q; + char *current_ptr; + + /* This block is in a large chunk by itself. We can free + everything on the list up to and including this block. We + then start allocating from the next chunk containing small + objects, setting current_ptr from the value stored with the + large chunk we are freeing. */ + + current_ptr = p->current_ptr; + p = p->next; + + q = (struct objalloc_chunk *) o->chunks; + while (q != p) + { + struct objalloc_chunk *next; + + next = q->next; + free (q); + q = next; + } + + o->chunks = (PTR) p; + + while (p->current_ptr != NULL) + p = p->next; + + o->current_ptr = current_ptr; + o->current_space = ((char *) p + CHUNK_SIZE) - current_ptr; + } +} diff --git a/libiberty/obstack.c b/libiberty/obstack.c new file mode 100644 index 0000000..a6dbaf0 --- /dev/null +++ b/libiberty/obstack.c @@ -0,0 +1,510 @@ +/* obstack.c - subroutines used implicitly by object stack macros + Copyright (C) 1988,89,90,91,92,93,94,96,97 Free Software Foundation, Inc. + + + NOTE: This source is derived from an old version taken from the GNU C + Library (glibc). + + 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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, + USA. */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "obstack.h" + +/* NOTE BEFORE MODIFYING THIS FILE: This version number must be + incremented whenever callers compiled using an old obstack.h can no + longer properly call the functions in this obstack.c. */ +#define OBSTACK_INTERFACE_VERSION 1 + +/* Comment out all this code if we are using the GNU C Library, and are not + actually compiling the library itself, and the installed library + supports the same library interface we do. 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. */ + +#include /* Random thing to get __GNU_LIBRARY__. */ +#if !defined (_LIBC) && defined (__GNU_LIBRARY__) && __GNU_LIBRARY__ > 1 +#include +#if _GNU_OBSTACK_INTERFACE_VERSION == OBSTACK_INTERFACE_VERSION +#define ELIDE_CODE +#endif +#endif + + +#ifndef ELIDE_CODE + + +#define POINTER void * + +/* Determine default alignment. */ +struct fooalign {char x; double d;}; +#define DEFAULT_ALIGNMENT \ + ((PTR_INT_TYPE) ((char *) &((struct fooalign *) 0)->d - (char *) 0)) +/* If malloc were really smart, it would round addresses to DEFAULT_ALIGNMENT. + But in fact it might be less smart and round addresses to as much as + DEFAULT_ROUNDING. So we prepare for it to do that. */ +union fooround {long x; double d;}; +#define DEFAULT_ROUNDING (sizeof (union fooround)) + +/* When we copy a long block of data, this is the unit to do it with. + On some machines, copying successive ints does not work; + in such a case, redefine COPYING_UNIT to `long' (if that works) + or `char' as a last resort. */ +#ifndef COPYING_UNIT +#define COPYING_UNIT int +#endif + + +/* The functions allocating more room by calling `obstack_chunk_alloc' + jump to the handler pointed to by `obstack_alloc_failed_handler'. + This variable by default points to the internal function + `print_and_abort'. */ +static void print_and_abort (void); +void (*obstack_alloc_failed_handler) (void) = print_and_abort; + +/* Exit value used when `print_and_abort' is used. */ +#if defined __GNU_LIBRARY__ || defined HAVE_STDLIB_H +#include +#endif +#ifndef EXIT_FAILURE +#define EXIT_FAILURE 1 +#endif +int obstack_exit_failure = EXIT_FAILURE; + +/* The non-GNU-C macros copy the obstack into this global variable + to avoid multiple evaluation. */ + +struct obstack *_obstack; + +/* Define a macro that either calls functions with the traditional malloc/free + calling interface, or calls functions with the mmalloc/mfree interface + (that adds an extra first argument), based on the state of use_extra_arg. + For free, do not use ?:, since some compilers, like the MIPS compilers, + do not allow (expr) ? void : void. */ + +#if defined (__STDC__) && __STDC__ +#define CALL_CHUNKFUN(h, size) \ + (((h) -> use_extra_arg) \ + ? (*(h)->chunkfun) ((h)->extra_arg, (size)) \ + : (*(struct _obstack_chunk *(*) (long)) (h)->chunkfun) ((size))) + +#define CALL_FREEFUN(h, old_chunk) \ + do { \ + if ((h) -> use_extra_arg) \ + (*(h)->freefun) ((h)->extra_arg, (old_chunk)); \ + else \ + (*(void (*) (void *)) (h)->freefun) ((old_chunk)); \ + } while (0) +#else +#define CALL_CHUNKFUN(h, size) \ + (((h) -> use_extra_arg) \ + ? (*(h)->chunkfun) ((h)->extra_arg, (size)) \ + : (*(struct _obstack_chunk *(*) ()) (h)->chunkfun) ((size))) + +#define CALL_FREEFUN(h, old_chunk) \ + do { \ + if ((h) -> use_extra_arg) \ + (*(h)->freefun) ((h)->extra_arg, (old_chunk)); \ + else \ + (*(void (*) ()) (h)->freefun) ((old_chunk)); \ + } while (0) +#endif + + +/* Initialize an obstack H for use. Specify chunk size SIZE (0 means default). + Objects start on multiples of ALIGNMENT (0 means use default). + CHUNKFUN is the function to use to allocate chunks, + and FREEFUN the function to free them. + + Return nonzero if successful, zero if out of memory. + To recover from an out of memory error, + free up some memory, then call this again. */ + +int +_obstack_begin (struct obstack *h, int size, int alignment, + POINTER (*chunkfun) (long), void (*freefun) (void *)) +{ + register struct _obstack_chunk *chunk; /* points to new chunk */ + + if (alignment == 0) + alignment = (int) DEFAULT_ALIGNMENT; + if (size == 0) + /* Default size is what GNU malloc can fit in a 4096-byte block. */ + { + /* 12 is sizeof (mhead) and 4 is EXTRA from GNU malloc. + Use the values for range checking, because if range checking is off, + the extra bytes won't be missed terribly, but if range checking is on + and we used a larger request, a whole extra 4096 bytes would be + allocated. + + These number are irrelevant to the new GNU malloc. I suspect it is + less sensitive to the size of the request. */ + int extra = ((((12 + DEFAULT_ROUNDING - 1) & ~(DEFAULT_ROUNDING - 1)) + + 4 + DEFAULT_ROUNDING - 1) + & ~(DEFAULT_ROUNDING - 1)); + size = 4096 - extra; + } + + h->chunkfun = (struct _obstack_chunk * (*)(void *, long)) chunkfun; + h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun; + h->chunk_size = size; + h->alignment_mask = alignment - 1; + h->use_extra_arg = 0; + + chunk = h->chunk = CALL_CHUNKFUN (h, h -> chunk_size); + if (!chunk) + (*obstack_alloc_failed_handler) (); + h->next_free = h->object_base = chunk->contents; + h->chunk_limit = chunk->limit + = (char *) chunk + h->chunk_size; + chunk->prev = 0; + /* The initial chunk now contains no empty object. */ + h->maybe_empty_object = 0; + h->alloc_failed = 0; + return 1; +} + +int +_obstack_begin_1 (struct obstack *h, int size, int alignment, + POINTER (*chunkfun) (POINTER, long), + void (*freefun) (POINTER, POINTER), POINTER arg) +{ + register struct _obstack_chunk *chunk; /* points to new chunk */ + + if (alignment == 0) + alignment = (int) DEFAULT_ALIGNMENT; + if (size == 0) + /* Default size is what GNU malloc can fit in a 4096-byte block. */ + { + /* 12 is sizeof (mhead) and 4 is EXTRA from GNU malloc. + Use the values for range checking, because if range checking is off, + the extra bytes won't be missed terribly, but if range checking is on + and we used a larger request, a whole extra 4096 bytes would be + allocated. + + These number are irrelevant to the new GNU malloc. I suspect it is + less sensitive to the size of the request. */ + int extra = ((((12 + DEFAULT_ROUNDING - 1) & ~(DEFAULT_ROUNDING - 1)) + + 4 + DEFAULT_ROUNDING - 1) + & ~(DEFAULT_ROUNDING - 1)); + size = 4096 - extra; + } + + h->chunkfun = (struct _obstack_chunk * (*)(void *,long)) chunkfun; + h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun; + h->chunk_size = size; + h->alignment_mask = alignment - 1; + h->extra_arg = arg; + h->use_extra_arg = 1; + + chunk = h->chunk = CALL_CHUNKFUN (h, h -> chunk_size); + if (!chunk) + (*obstack_alloc_failed_handler) (); + h->next_free = h->object_base = chunk->contents; + h->chunk_limit = chunk->limit + = (char *) chunk + h->chunk_size; + chunk->prev = 0; + /* The initial chunk now contains no empty object. */ + h->maybe_empty_object = 0; + h->alloc_failed = 0; + return 1; +} + +/* Allocate a new current chunk for the obstack *H + on the assumption that LENGTH bytes need to be added + to the current object, or a new object of length LENGTH allocated. + Copies any partial object from the end of the old chunk + to the beginning of the new one. */ + +void +_obstack_newchunk (struct obstack *h, int length) +{ + register struct _obstack_chunk *old_chunk = h->chunk; + register struct _obstack_chunk *new_chunk; + register long new_size; + register long obj_size = h->next_free - h->object_base; + register long i; + long already; + + /* Compute size for new chunk. */ + new_size = (obj_size + length) + (obj_size >> 3) + 100; + if (new_size < h->chunk_size) + new_size = h->chunk_size; + + /* Allocate and initialize the new chunk. */ + new_chunk = CALL_CHUNKFUN (h, new_size); + if (!new_chunk) + (*obstack_alloc_failed_handler) (); + h->chunk = new_chunk; + new_chunk->prev = old_chunk; + new_chunk->limit = h->chunk_limit = (char *) new_chunk + new_size; + + /* Move the existing object to the new chunk. + Word at a time is fast and is safe if the object + is sufficiently aligned. */ + if (h->alignment_mask + 1 >= DEFAULT_ALIGNMENT) + { + for (i = obj_size / sizeof (COPYING_UNIT) - 1; + i >= 0; i--) + ((COPYING_UNIT *)new_chunk->contents)[i] + = ((COPYING_UNIT *)h->object_base)[i]; + /* We used to copy the odd few remaining bytes as one extra COPYING_UNIT, + but that can cross a page boundary on a machine + which does not do strict alignment for COPYING_UNITS. */ + already = obj_size / sizeof (COPYING_UNIT) * sizeof (COPYING_UNIT); + } + else + already = 0; + /* Copy remaining bytes one by one. */ + for (i = already; i < obj_size; i++) + new_chunk->contents[i] = h->object_base[i]; + + /* If the object just copied was the only data in OLD_CHUNK, + free that chunk and remove it from the chain. + But not if that chunk might contain an empty object. */ + if (h->object_base == old_chunk->contents && ! h->maybe_empty_object) + { + new_chunk->prev = old_chunk->prev; + CALL_FREEFUN (h, old_chunk); + } + + h->object_base = new_chunk->contents; + h->next_free = h->object_base + obj_size; + /* The new chunk certainly contains no empty object yet. */ + h->maybe_empty_object = 0; +} + +/* Return nonzero if object OBJ has been allocated from obstack H. + This is here for debugging. + If you use it in a program, you are probably losing. */ + +/* Suppress -Wmissing-prototypes warning. We don't want to declare this in + obstack.h because it is just for debugging. */ +int _obstack_allocated_p (struct obstack *h, POINTER obj); + +int +_obstack_allocated_p (struct obstack *h, POINTER obj) +{ + register struct _obstack_chunk *lp; /* below addr of any objects in this chunk */ + register struct _obstack_chunk *plp; /* point to previous chunk if any */ + + lp = (h)->chunk; + /* We use >= rather than > since the object cannot be exactly at + the beginning of the chunk but might be an empty object exactly + at the end of an adjacent chunk. */ + while (lp != 0 && ((POINTER) lp >= obj || (POINTER) (lp)->limit < obj)) + { + plp = lp->prev; + lp = plp; + } + return lp != 0; +} + +/* Free objects in obstack H, including OBJ and everything allocate + more recently than OBJ. If OBJ is zero, free everything in H. */ + +#undef obstack_free + +/* This function has two names with identical definitions. + This is the first one, called from non-ANSI code. */ + +void +_obstack_free (struct obstack *h, POINTER obj) +{ + register struct _obstack_chunk *lp; /* below addr of any objects in this chunk */ + register struct _obstack_chunk *plp; /* point to previous chunk if any */ + + lp = h->chunk; + /* We use >= because there cannot be an object at the beginning of a chunk. + But there can be an empty object at that address + at the end of another chunk. */ + while (lp != 0 && ((POINTER) lp >= obj || (POINTER) (lp)->limit < obj)) + { + plp = lp->prev; + CALL_FREEFUN (h, lp); + lp = plp; + /* If we switch chunks, we can't tell whether the new current + chunk contains an empty object, so assume that it may. */ + h->maybe_empty_object = 1; + } + if (lp) + { + h->object_base = h->next_free = (char *) (obj); + h->chunk_limit = lp->limit; + h->chunk = lp; + } + else if (obj != 0) + /* obj is not in any of the chunks! */ + abort (); +} + +/* This function is used from ANSI code. */ + +void +obstack_free (struct obstack *h, POINTER obj) +{ + register struct _obstack_chunk *lp; /* below addr of any objects in this chunk */ + register struct _obstack_chunk *plp; /* point to previous chunk if any */ + + lp = h->chunk; + /* We use >= because there cannot be an object at the beginning of a chunk. + But there can be an empty object at that address + at the end of another chunk. */ + while (lp != 0 && ((POINTER) lp >= obj || (POINTER) (lp)->limit < obj)) + { + plp = lp->prev; + CALL_FREEFUN (h, lp); + lp = plp; + /* If we switch chunks, we can't tell whether the new current + chunk contains an empty object, so assume that it may. */ + h->maybe_empty_object = 1; + } + if (lp) + { + h->object_base = h->next_free = (char *) (obj); + h->chunk_limit = lp->limit; + h->chunk = lp; + } + else if (obj != 0) + /* obj is not in any of the chunks! */ + abort (); +} + +int +_obstack_memory_used (struct obstack *h) +{ + register struct _obstack_chunk* lp; + register int nbytes = 0; + + for (lp = h->chunk; lp != 0; lp = lp->prev) + { + nbytes += lp->limit - (char *) lp; + } + return nbytes; +} + +/* Define the error handler. */ +#ifndef _ +# if (HAVE_LIBINTL_H && ENABLE_NLS) || defined _LIBC +# include +# ifndef _ +# define _(Str) gettext (Str) +# endif +# else +# define _(Str) (Str) +# endif +#endif + +static void +print_and_abort (void) +{ + fputs (_("memory exhausted\n"), stderr); + exit (obstack_exit_failure); +} + +#if 0 +/* These are now turned off because the applications do not use it + and it uses bcopy via obstack_grow, which causes trouble on sysV. */ + +/* Now define the functional versions of the obstack macros. + Define them to simply use the corresponding macros to do the job. */ + +/* The function names appear in parentheses in order to prevent + the macro-definitions of the names from being expanded there. */ + +POINTER (obstack_base) (struct obstack *obstack) +{ + return obstack_base (obstack); +} + +POINTER (obstack_next_free) (struct obstack *obstack) +{ + return obstack_next_free (obstack); +} + +int (obstack_object_size) (struct obstack *obstack) +{ + return obstack_object_size (obstack); +} + +int (obstack_room) (struct obstack *obstack) +{ + return obstack_room (obstack); +} + +int (obstack_make_room) (struct obstack *obstack, int length) +{ + return obstack_make_room (obstack, length); +} + +void (obstack_grow) (struct obstack *obstack, POINTER pointer, int length) +{ + obstack_grow (obstack, pointer, length); +} + +void (obstack_grow0) (struct obstack *obstack, POINTER pointer, int length) +{ + obstack_grow0 (obstack, pointer, length); +} + +void (obstack_1grow) (struct obstack *obstack, int character) +{ + obstack_1grow (obstack, character); +} + +void (obstack_blank) (struct obstack *obstack, int length) +{ + obstack_blank (obstack, length); +} + +void (obstack_1grow_fast) (struct obstack *obstack, int character) +{ + obstack_1grow_fast (obstack, character); +} + +void (obstack_blank_fast) (struct obstack *obstack, int length) +{ + obstack_blank_fast (obstack, length); +} + +POINTER (obstack_finish) (struct obstack *obstack) +{ + return obstack_finish (obstack); +} + +POINTER (obstack_alloc) (struct obstack *obstack, int length) +{ + return obstack_alloc (obstack, length); +} + +POINTER (obstack_copy) (struct obstack *obstack, POINTER pointer, int length) +{ + return obstack_copy (obstack, pointer, length); +} + +POINTER (obstack_copy0) (struct obstack *obstack, POINTER pointer, int length) +{ + return obstack_copy0 (obstack, pointer, length); +} + +#endif /* 0 */ + +#endif /* !ELIDE_CODE */ diff --git a/libiberty/obstacks.texi b/libiberty/obstacks.texi new file mode 100644 index 0000000..9bddf7c --- /dev/null +++ b/libiberty/obstacks.texi @@ -0,0 +1,758 @@ +@node Obstacks,Licenses,Functions,Top +@chapter Obstacks +@cindex obstacks + +An @dfn{obstack} is a pool of memory containing a stack of objects. You +can create any number of separate obstacks, and then allocate objects in +specified obstacks. Within each obstack, the last object allocated must +always be the first one freed, but distinct obstacks are independent of +each other. + +Aside from this one constraint of order of freeing, obstacks are totally +general: an obstack can contain any number of objects of any size. They +are implemented with macros, so allocation is usually very fast as long as +the objects are usually small. And the only space overhead per object is +the padding needed to start each object on a suitable boundary. + +@menu +* Creating Obstacks:: How to declare an obstack in your program. +* Preparing for Obstacks:: Preparations needed before you can + use obstacks. +* Allocation in an Obstack:: Allocating objects in an obstack. +* Freeing Obstack Objects:: Freeing objects in an obstack. +* Obstack Functions:: The obstack functions are both + functions and macros. +* Growing Objects:: Making an object bigger by stages. +* Extra Fast Growing:: Extra-high-efficiency (though more + complicated) growing objects. +* Status of an Obstack:: Inquiries about the status of an obstack. +* Obstacks Data Alignment:: Controlling alignment of objects in obstacks. +* Obstack Chunks:: How obstacks obtain and release chunks; + efficiency considerations. +* Summary of Obstacks:: +@end menu + +@node Creating Obstacks +@section Creating Obstacks + +The utilities for manipulating obstacks are declared in the header +file @file{obstack.h}. +@pindex obstack.h + +@comment obstack.h +@comment GNU +@deftp {Data Type} {struct obstack} +An obstack is represented by a data structure of type @code{struct +obstack}. This structure has a small fixed size; it records the status +of the obstack and how to find the space in which objects are allocated. +It does not contain any of the objects themselves. You should not try +to access the contents of the structure directly; use only the functions +described in this chapter. +@end deftp + +You can declare variables of type @code{struct obstack} and use them as +obstacks, or you can allocate obstacks dynamically like any other kind +of object. Dynamic allocation of obstacks allows your program to have a +variable number of different stacks. (You can even allocate an +obstack structure in another obstack, but this is rarely useful.) + +All the functions that work with obstacks require you to specify which +obstack to use. You do this with a pointer of type @code{struct obstack +*}. In the following, we often say ``an obstack'' when strictly +speaking the object at hand is such a pointer. + +The objects in the obstack are packed into large blocks called +@dfn{chunks}. The @code{struct obstack} structure points to a chain of +the chunks currently in use. + +The obstack library obtains a new chunk whenever you allocate an object +that won't fit in the previous chunk. Since the obstack library manages +chunks automatically, you don't need to pay much attention to them, but +you do need to supply a function which the obstack library should use to +get a chunk. Usually you supply a function which uses @code{malloc} +directly or indirectly. You must also supply a function to free a chunk. +These matters are described in the following section. + +@node Preparing for Obstacks +@section Preparing for Using Obstacks + +Each source file in which you plan to use the obstack functions +must include the header file @file{obstack.h}, like this: + +@smallexample +#include +@end smallexample + +@findex obstack_chunk_alloc +@findex obstack_chunk_free +Also, if the source file uses the macro @code{obstack_init}, it must +declare or define two functions or macros that will be called by the +obstack library. One, @code{obstack_chunk_alloc}, is used to allocate +the chunks of memory into which objects are packed. The other, +@code{obstack_chunk_free}, is used to return chunks when the objects in +them are freed. These macros should appear before any use of obstacks +in the source file. + +Usually these are defined to use @code{malloc} via the intermediary +@code{xmalloc} (@pxref{Unconstrained Allocation, , , libc, The GNU C Library Reference Manual}). This is done with +the following pair of macro definitions: + +@smallexample +#define obstack_chunk_alloc xmalloc +#define obstack_chunk_free free +@end smallexample + +@noindent +Though the memory you get using obstacks really comes from @code{malloc}, +using obstacks is faster because @code{malloc} is called less often, for +larger blocks of memory. @xref{Obstack Chunks}, for full details. + +At run time, before the program can use a @code{struct obstack} object +as an obstack, it must initialize the obstack by calling +@code{obstack_init}. + +@comment obstack.h +@comment GNU +@deftypefun int obstack_init (struct obstack *@var{obstack-ptr}) +Initialize obstack @var{obstack-ptr} for allocation of objects. This +function calls the obstack's @code{obstack_chunk_alloc} function. If +allocation of memory fails, the function pointed to by +@code{obstack_alloc_failed_handler} is called. The @code{obstack_init} +function always returns 1 (Compatibility notice: Former versions of +obstack returned 0 if allocation failed). +@end deftypefun + +Here are two examples of how to allocate the space for an obstack and +initialize it. First, an obstack that is a static variable: + +@smallexample +static struct obstack myobstack; +@dots{} +obstack_init (&myobstack); +@end smallexample + +@noindent +Second, an obstack that is itself dynamically allocated: + +@smallexample +struct obstack *myobstack_ptr + = (struct obstack *) xmalloc (sizeof (struct obstack)); + +obstack_init (myobstack_ptr); +@end smallexample + +@comment obstack.h +@comment GNU +@defvar obstack_alloc_failed_handler +The value of this variable is a pointer to a function that +@code{obstack} uses when @code{obstack_chunk_alloc} fails to allocate +memory. The default action is to print a message and abort. +You should supply a function that either calls @code{exit} +(@pxref{Program Termination, , , libc, The GNU C Library Reference Manual}) or @code{longjmp} (@pxref{Non-Local +Exits, , , libc, The GNU C Library Reference Manual}) and doesn't return. + +@smallexample +void my_obstack_alloc_failed (void) +@dots{} +obstack_alloc_failed_handler = &my_obstack_alloc_failed; +@end smallexample + +@end defvar + +@node Allocation in an Obstack +@section Allocation in an Obstack +@cindex allocation (obstacks) + +The most direct way to allocate an object in an obstack is with +@code{obstack_alloc}, which is invoked almost like @code{malloc}. + +@comment obstack.h +@comment GNU +@deftypefun {void *} obstack_alloc (struct obstack *@var{obstack-ptr}, int @var{size}) +This allocates an uninitialized block of @var{size} bytes in an obstack +and returns its address. Here @var{obstack-ptr} specifies which obstack +to allocate the block in; it is the address of the @code{struct obstack} +object which represents the obstack. Each obstack function or macro +requires you to specify an @var{obstack-ptr} as the first argument. + +This function calls the obstack's @code{obstack_chunk_alloc} function if +it needs to allocate a new chunk of memory; it calls +@code{obstack_alloc_failed_handler} if allocation of memory by +@code{obstack_chunk_alloc} failed. +@end deftypefun + +For example, here is a function that allocates a copy of a string @var{str} +in a specific obstack, which is in the variable @code{string_obstack}: + +@smallexample +struct obstack string_obstack; + +char * +copystring (char *string) +@{ + size_t len = strlen (string) + 1; + char *s = (char *) obstack_alloc (&string_obstack, len); + memcpy (s, string, len); + return s; +@} +@end smallexample + +To allocate a block with specified contents, use the function +@code{obstack_copy}, declared like this: + +@comment obstack.h +@comment GNU +@deftypefun {void *} obstack_copy (struct obstack *@var{obstack-ptr}, void *@var{address}, int @var{size}) +This allocates a block and initializes it by copying @var{size} +bytes of data starting at @var{address}. It calls +@code{obstack_alloc_failed_handler} if allocation of memory by +@code{obstack_chunk_alloc} failed. +@end deftypefun + +@comment obstack.h +@comment GNU +@deftypefun {void *} obstack_copy0 (struct obstack *@var{obstack-ptr}, void *@var{address}, int @var{size}) +Like @code{obstack_copy}, but appends an extra byte containing a null +character. This extra byte is not counted in the argument @var{size}. +@end deftypefun + +The @code{obstack_copy0} function is convenient for copying a sequence +of characters into an obstack as a null-terminated string. Here is an +example of its use: + +@smallexample +char * +obstack_savestring (char *addr, int size) +@{ + return obstack_copy0 (&myobstack, addr, size); +@} +@end smallexample + +@noindent +Contrast this with the previous example of @code{savestring} using +@code{malloc} (@pxref{Basic Allocation, , , libc, The GNU C Library Reference Manual}). + +@node Freeing Obstack Objects +@section Freeing Objects in an Obstack +@cindex freeing (obstacks) + +To free an object allocated in an obstack, use the function +@code{obstack_free}. Since the obstack is a stack of objects, freeing +one object automatically frees all other objects allocated more recently +in the same obstack. + +@comment obstack.h +@comment GNU +@deftypefun void obstack_free (struct obstack *@var{obstack-ptr}, void *@var{object}) +If @var{object} is a null pointer, everything allocated in the obstack +is freed. Otherwise, @var{object} must be the address of an object +allocated in the obstack. Then @var{object} is freed, along with +everything allocated in @var{obstack} since @var{object}. +@end deftypefun + +Note that if @var{object} is a null pointer, the result is an +uninitialized obstack. To free all memory in an obstack but leave it +valid for further allocation, call @code{obstack_free} with the address +of the first object allocated on the obstack: + +@smallexample +obstack_free (obstack_ptr, first_object_allocated_ptr); +@end smallexample + +Recall that the objects in an obstack are grouped into chunks. When all +the objects in a chunk become free, the obstack library automatically +frees the chunk (@pxref{Preparing for Obstacks}). Then other +obstacks, or non-obstack allocation, can reuse the space of the chunk. + +@node Obstack Functions +@section Obstack Functions and Macros +@cindex macros + +The interfaces for using obstacks may be defined either as functions or +as macros, depending on the compiler. The obstack facility works with +all C compilers, including both @w{ISO C} and traditional C, but there are +precautions you must take if you plan to use compilers other than GNU C. + +If you are using an old-fashioned @w{non-ISO C} compiler, all the obstack +``functions'' are actually defined only as macros. You can call these +macros like functions, but you cannot use them in any other way (for +example, you cannot take their address). + +Calling the macros requires a special precaution: namely, the first +operand (the obstack pointer) may not contain any side effects, because +it may be computed more than once. For example, if you write this: + +@smallexample +obstack_alloc (get_obstack (), 4); +@end smallexample + +@noindent +you will find that @code{get_obstack} may be called several times. +If you use @code{*obstack_list_ptr++} as the obstack pointer argument, +you will get very strange results since the incrementation may occur +several times. + +In @w{ISO C}, each function has both a macro definition and a function +definition. The function definition is used if you take the address of the +function without calling it. An ordinary call uses the macro definition by +default, but you can request the function definition instead by writing the +function name in parentheses, as shown here: + +@smallexample +char *x; +void *(*funcp) (); +/* @r{Use the macro}. */ +x = (char *) obstack_alloc (obptr, size); +/* @r{Call the function}. */ +x = (char *) (obstack_alloc) (obptr, size); +/* @r{Take the address of the function}. */ +funcp = obstack_alloc; +@end smallexample + +@noindent +This is the same situation that exists in @w{ISO C} for the standard library +functions. @xref{Macro Definitions, , , libc, The GNU C Library Reference Manual}. + +@strong{Warning:} When you do use the macros, you must observe the +precaution of avoiding side effects in the first operand, even in @w{ISO C}. + +If you use the GNU C compiler, this precaution is not necessary, because +various language extensions in GNU C permit defining the macros so as to +compute each argument only once. + +@node Growing Objects +@section Growing Objects +@cindex growing objects (in obstacks) +@cindex changing the size of a block (obstacks) + +Because memory in obstack chunks is used sequentially, it is possible to +build up an object step by step, adding one or more bytes at a time to the +end of the object. With this technique, you do not need to know how much +data you will put in the object until you come to the end of it. We call +this the technique of @dfn{growing objects}. The special functions +for adding data to the growing object are described in this section. + +You don't need to do anything special when you start to grow an object. +Using one of the functions to add data to the object automatically +starts it. However, it is necessary to say explicitly when the object is +finished. This is done with the function @code{obstack_finish}. + +The actual address of the object thus built up is not known until the +object is finished. Until then, it always remains possible that you will +add so much data that the object must be copied into a new chunk. + +While the obstack is in use for a growing object, you cannot use it for +ordinary allocation of another object. If you try to do so, the space +already added to the growing object will become part of the other object. + +@comment obstack.h +@comment GNU +@deftypefun void obstack_blank (struct obstack *@var{obstack-ptr}, int @var{size}) +The most basic function for adding to a growing object is +@code{obstack_blank}, which adds space without initializing it. +@end deftypefun + +@comment obstack.h +@comment GNU +@deftypefun void obstack_grow (struct obstack *@var{obstack-ptr}, void *@var{data}, int @var{size}) +To add a block of initialized space, use @code{obstack_grow}, which is +the growing-object analogue of @code{obstack_copy}. It adds @var{size} +bytes of data to the growing object, copying the contents from +@var{data}. +@end deftypefun + +@comment obstack.h +@comment GNU +@deftypefun void obstack_grow0 (struct obstack *@var{obstack-ptr}, void *@var{data}, int @var{size}) +This is the growing-object analogue of @code{obstack_copy0}. It adds +@var{size} bytes copied from @var{data}, followed by an additional null +character. +@end deftypefun + +@comment obstack.h +@comment GNU +@deftypefun void obstack_1grow (struct obstack *@var{obstack-ptr}, char @var{c}) +To add one character at a time, use the function @code{obstack_1grow}. +It adds a single byte containing @var{c} to the growing object. +@end deftypefun + +@comment obstack.h +@comment GNU +@deftypefun void obstack_ptr_grow (struct obstack *@var{obstack-ptr}, void *@var{data}) +Adding the value of a pointer one can use the function +@code{obstack_ptr_grow}. It adds @code{sizeof (void *)} bytes +containing the value of @var{data}. +@end deftypefun + +@comment obstack.h +@comment GNU +@deftypefun void obstack_int_grow (struct obstack *@var{obstack-ptr}, int @var{data}) +A single value of type @code{int} can be added by using the +@code{obstack_int_grow} function. It adds @code{sizeof (int)} bytes to +the growing object and initializes them with the value of @var{data}. +@end deftypefun + +@comment obstack.h +@comment GNU +@deftypefun {void *} obstack_finish (struct obstack *@var{obstack-ptr}) +When you are finished growing the object, use the function +@code{obstack_finish} to close it off and return its final address. + +Once you have finished the object, the obstack is available for ordinary +allocation or for growing another object. + +This function can return a null pointer under the same conditions as +@code{obstack_alloc} (@pxref{Allocation in an Obstack}). +@end deftypefun + +When you build an object by growing it, you will probably need to know +afterward how long it became. You need not keep track of this as you grow +the object, because you can find out the length from the obstack just +before finishing the object with the function @code{obstack_object_size}, +declared as follows: + +@comment obstack.h +@comment GNU +@deftypefun int obstack_object_size (struct obstack *@var{obstack-ptr}) +This function returns the current size of the growing object, in bytes. +Remember to call this function @emph{before} finishing the object. +After it is finished, @code{obstack_object_size} will return zero. +@end deftypefun + +If you have started growing an object and wish to cancel it, you should +finish it and then free it, like this: + +@smallexample +obstack_free (obstack_ptr, obstack_finish (obstack_ptr)); +@end smallexample + +@noindent +This has no effect if no object was growing. + +@cindex shrinking objects +You can use @code{obstack_blank} with a negative size argument to make +the current object smaller. Just don't try to shrink it beyond zero +length---there's no telling what will happen if you do that. + +@node Extra Fast Growing +@section Extra Fast Growing Objects +@cindex efficiency and obstacks + +The usual functions for growing objects incur overhead for checking +whether there is room for the new growth in the current chunk. If you +are frequently constructing objects in small steps of growth, this +overhead can be significant. + +You can reduce the overhead by using special ``fast growth'' +functions that grow the object without checking. In order to have a +robust program, you must do the checking yourself. If you do this checking +in the simplest way each time you are about to add data to the object, you +have not saved anything, because that is what the ordinary growth +functions do. But if you can arrange to check less often, or check +more efficiently, then you make the program faster. + +The function @code{obstack_room} returns the amount of room available +in the current chunk. It is declared as follows: + +@comment obstack.h +@comment GNU +@deftypefun int obstack_room (struct obstack *@var{obstack-ptr}) +This returns the number of bytes that can be added safely to the current +growing object (or to an object about to be started) in obstack +@var{obstack} using the fast growth functions. +@end deftypefun + +While you know there is room, you can use these fast growth functions +for adding data to a growing object: + +@comment obstack.h +@comment GNU +@deftypefun void obstack_1grow_fast (struct obstack *@var{obstack-ptr}, char @var{c}) +The function @code{obstack_1grow_fast} adds one byte containing the +character @var{c} to the growing object in obstack @var{obstack-ptr}. +@end deftypefun + +@comment obstack.h +@comment GNU +@deftypefun void obstack_ptr_grow_fast (struct obstack *@var{obstack-ptr}, void *@var{data}) +The function @code{obstack_ptr_grow_fast} adds @code{sizeof (void *)} +bytes containing the value of @var{data} to the growing object in +obstack @var{obstack-ptr}. +@end deftypefun + +@comment obstack.h +@comment GNU +@deftypefun void obstack_int_grow_fast (struct obstack *@var{obstack-ptr}, int @var{data}) +The function @code{obstack_int_grow_fast} adds @code{sizeof (int)} bytes +containing the value of @var{data} to the growing object in obstack +@var{obstack-ptr}. +@end deftypefun + +@comment obstack.h +@comment GNU +@deftypefun void obstack_blank_fast (struct obstack *@var{obstack-ptr}, int @var{size}) +The function @code{obstack_blank_fast} adds @var{size} bytes to the +growing object in obstack @var{obstack-ptr} without initializing them. +@end deftypefun + +When you check for space using @code{obstack_room} and there is not +enough room for what you want to add, the fast growth functions +are not safe. In this case, simply use the corresponding ordinary +growth function instead. Very soon this will copy the object to a +new chunk; then there will be lots of room available again. + +So, each time you use an ordinary growth function, check afterward for +sufficient space using @code{obstack_room}. Once the object is copied +to a new chunk, there will be plenty of space again, so the program will +start using the fast growth functions again. + +Here is an example: + +@smallexample +@group +void +add_string (struct obstack *obstack, const char *ptr, int len) +@{ + while (len > 0) + @{ + int room = obstack_room (obstack); + if (room == 0) + @{ + /* @r{Not enough room. Add one character slowly,} + @r{which may copy to a new chunk and make room.} */ + obstack_1grow (obstack, *ptr++); + len--; + @} + else + @{ + if (room > len) + room = len; + /* @r{Add fast as much as we have room for.} */ + len -= room; + while (room-- > 0) + obstack_1grow_fast (obstack, *ptr++); + @} + @} +@} +@end group +@end smallexample + +@node Status of an Obstack +@section Status of an Obstack +@cindex obstack status +@cindex status of obstack + +Here are functions that provide information on the current status of +allocation in an obstack. You can use them to learn about an object while +still growing it. + +@comment obstack.h +@comment GNU +@deftypefun {void *} obstack_base (struct obstack *@var{obstack-ptr}) +This function returns the tentative address of the beginning of the +currently growing object in @var{obstack-ptr}. If you finish the object +immediately, it will have that address. If you make it larger first, it +may outgrow the current chunk---then its address will change! + +If no object is growing, this value says where the next object you +allocate will start (once again assuming it fits in the current +chunk). +@end deftypefun + +@comment obstack.h +@comment GNU +@deftypefun {void *} obstack_next_free (struct obstack *@var{obstack-ptr}) +This function returns the address of the first free byte in the current +chunk of obstack @var{obstack-ptr}. This is the end of the currently +growing object. If no object is growing, @code{obstack_next_free} +returns the same value as @code{obstack_base}. +@end deftypefun + +@comment obstack.h +@comment GNU +@deftypefun int obstack_object_size (struct obstack *@var{obstack-ptr}) +This function returns the size in bytes of the currently growing object. +This is equivalent to + +@smallexample +obstack_next_free (@var{obstack-ptr}) - obstack_base (@var{obstack-ptr}) +@end smallexample +@end deftypefun + +@node Obstacks Data Alignment +@section Alignment of Data in Obstacks +@cindex alignment (in obstacks) + +Each obstack has an @dfn{alignment boundary}; each object allocated in +the obstack automatically starts on an address that is a multiple of the +specified boundary. By default, this boundary is 4 bytes. + +To access an obstack's alignment boundary, use the macro +@code{obstack_alignment_mask}, whose function prototype looks like +this: + +@comment obstack.h +@comment GNU +@deftypefn Macro int obstack_alignment_mask (struct obstack *@var{obstack-ptr}) +The value is a bit mask; a bit that is 1 indicates that the corresponding +bit in the address of an object should be 0. The mask value should be one +less than a power of 2; the effect is that all object addresses are +multiples of that power of 2. The default value of the mask is 3, so that +addresses are multiples of 4. A mask value of 0 means an object can start +on any multiple of 1 (that is, no alignment is required). + +The expansion of the macro @code{obstack_alignment_mask} is an lvalue, +so you can alter the mask by assignment. For example, this statement: + +@smallexample +obstack_alignment_mask (obstack_ptr) = 0; +@end smallexample + +@noindent +has the effect of turning off alignment processing in the specified obstack. +@end deftypefn + +Note that a change in alignment mask does not take effect until +@emph{after} the next time an object is allocated or finished in the +obstack. If you are not growing an object, you can make the new +alignment mask take effect immediately by calling @code{obstack_finish}. +This will finish a zero-length object and then do proper alignment for +the next object. + +@node Obstack Chunks +@section Obstack Chunks +@cindex efficiency of chunks +@cindex chunks + +Obstacks work by allocating space for themselves in large chunks, and +then parceling out space in the chunks to satisfy your requests. Chunks +are normally 4096 bytes long unless you specify a different chunk size. +The chunk size includes 8 bytes of overhead that are not actually used +for storing objects. Regardless of the specified size, longer chunks +will be allocated when necessary for long objects. + +The obstack library allocates chunks by calling the function +@code{obstack_chunk_alloc}, which you must define. When a chunk is no +longer needed because you have freed all the objects in it, the obstack +library frees the chunk by calling @code{obstack_chunk_free}, which you +must also define. + +These two must be defined (as macros) or declared (as functions) in each +source file that uses @code{obstack_init} (@pxref{Creating Obstacks}). +Most often they are defined as macros like this: + +@smallexample +#define obstack_chunk_alloc malloc +#define obstack_chunk_free free +@end smallexample + +Note that these are simple macros (no arguments). Macro definitions with +arguments will not work! It is necessary that @code{obstack_chunk_alloc} +or @code{obstack_chunk_free}, alone, expand into a function name if it is +not itself a function name. + +If you allocate chunks with @code{malloc}, the chunk size should be a +power of 2. The default chunk size, 4096, was chosen because it is long +enough to satisfy many typical requests on the obstack yet short enough +not to waste too much memory in the portion of the last chunk not yet used. + +@comment obstack.h +@comment GNU +@deftypefn Macro int obstack_chunk_size (struct obstack *@var{obstack-ptr}) +This returns the chunk size of the given obstack. +@end deftypefn + +Since this macro expands to an lvalue, you can specify a new chunk size by +assigning it a new value. Doing so does not affect the chunks already +allocated, but will change the size of chunks allocated for that particular +obstack in the future. It is unlikely to be useful to make the chunk size +smaller, but making it larger might improve efficiency if you are +allocating many objects whose size is comparable to the chunk size. Here +is how to do so cleanly: + +@smallexample +if (obstack_chunk_size (obstack_ptr) < @var{new-chunk-size}) + obstack_chunk_size (obstack_ptr) = @var{new-chunk-size}; +@end smallexample + +@node Summary of Obstacks +@section Summary of Obstack Functions + +Here is a summary of all the functions associated with obstacks. Each +takes the address of an obstack (@code{struct obstack *}) as its first +argument. + +@table @code +@item void obstack_init (struct obstack *@var{obstack-ptr}) +Initialize use of an obstack. @xref{Creating Obstacks}. + +@item void *obstack_alloc (struct obstack *@var{obstack-ptr}, int @var{size}) +Allocate an object of @var{size} uninitialized bytes. +@xref{Allocation in an Obstack}. + +@item void *obstack_copy (struct obstack *@var{obstack-ptr}, void *@var{address}, int @var{size}) +Allocate an object of @var{size} bytes, with contents copied from +@var{address}. @xref{Allocation in an Obstack}. + +@item void *obstack_copy0 (struct obstack *@var{obstack-ptr}, void *@var{address}, int @var{size}) +Allocate an object of @var{size}+1 bytes, with @var{size} of them copied +from @var{address}, followed by a null character at the end. +@xref{Allocation in an Obstack}. + +@item void obstack_free (struct obstack *@var{obstack-ptr}, void *@var{object}) +Free @var{object} (and everything allocated in the specified obstack +more recently than @var{object}). @xref{Freeing Obstack Objects}. + +@item void obstack_blank (struct obstack *@var{obstack-ptr}, int @var{size}) +Add @var{size} uninitialized bytes to a growing object. +@xref{Growing Objects}. + +@item void obstack_grow (struct obstack *@var{obstack-ptr}, void *@var{address}, int @var{size}) +Add @var{size} bytes, copied from @var{address}, to a growing object. +@xref{Growing Objects}. + +@item void obstack_grow0 (struct obstack *@var{obstack-ptr}, void *@var{address}, int @var{size}) +Add @var{size} bytes, copied from @var{address}, to a growing object, +and then add another byte containing a null character. @xref{Growing +Objects}. + +@item void obstack_1grow (struct obstack *@var{obstack-ptr}, char @var{data-char}) +Add one byte containing @var{data-char} to a growing object. +@xref{Growing Objects}. + +@item void *obstack_finish (struct obstack *@var{obstack-ptr}) +Finalize the object that is growing and return its permanent address. +@xref{Growing Objects}. + +@item int obstack_object_size (struct obstack *@var{obstack-ptr}) +Get the current size of the currently growing object. @xref{Growing +Objects}. + +@item void obstack_blank_fast (struct obstack *@var{obstack-ptr}, int @var{size}) +Add @var{size} uninitialized bytes to a growing object without checking +that there is enough room. @xref{Extra Fast Growing}. + +@item void obstack_1grow_fast (struct obstack *@var{obstack-ptr}, char @var{data-char}) +Add one byte containing @var{data-char} to a growing object without +checking that there is enough room. @xref{Extra Fast Growing}. + +@item int obstack_room (struct obstack *@var{obstack-ptr}) +Get the amount of room now available for growing the current object. +@xref{Extra Fast Growing}. + +@item int obstack_alignment_mask (struct obstack *@var{obstack-ptr}) +The mask used for aligning the beginning of an object. This is an +lvalue. @xref{Obstacks Data Alignment}. + +@item int obstack_chunk_size (struct obstack *@var{obstack-ptr}) +The size for allocating chunks. This is an lvalue. @xref{Obstack Chunks}. + +@item void *obstack_base (struct obstack *@var{obstack-ptr}) +Tentative starting address of the currently growing object. +@xref{Status of an Obstack}. + +@item void *obstack_next_free (struct obstack *@var{obstack-ptr}) +Address just after the end of the currently growing object. +@xref{Status of an Obstack}. +@end table + diff --git a/libiberty/partition.c b/libiberty/partition.c new file mode 100644 index 0000000..5f0745c --- /dev/null +++ b/libiberty/partition.c @@ -0,0 +1,183 @@ +/* List implementation of a partition of consecutive integers. + Copyright (C) 2000, 2001 Free Software Foundation, Inc. + Contributed by CodeSourcery, LLC. + + This file is part of GNU CC. + + GNU CC 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. + + GNU CC 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 GNU CC; see the file COPYING. If not, write to + the Free Software Foundation, 51 Franklin Street - Fifth Floor, + Boston, MA 02110-1301, USA. */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef HAVE_STDLIB_H +#include +#endif + +#ifdef HAVE_STRING_H +#include +#endif + +#include "libiberty.h" +#include "partition.h" + +static int elem_compare (const void *, const void *); + +/* Creates a partition of NUM_ELEMENTS elements. Initially each + element is in a class by itself. */ + +partition +partition_new (int num_elements) +{ + int e; + + partition part = (partition) + xmalloc (sizeof (struct partition_def) + + (num_elements - 1) * sizeof (struct partition_elem)); + part->num_elements = num_elements; + for (e = 0; e < num_elements; ++e) + { + part->elements[e].class_element = e; + part->elements[e].next = &(part->elements[e]); + part->elements[e].class_count = 1; + } + + return part; +} + +/* Freeds a partition. */ + +void +partition_delete (partition part) +{ + free (part); +} + +/* Unites the classes containing ELEM1 and ELEM2 into a single class + of partition PART. If ELEM1 and ELEM2 are already in the same + class, does nothing. Returns the canonical element of the + resulting union class. */ + +int +partition_union (partition part, int elem1, int elem2) +{ + struct partition_elem *elements = part->elements; + struct partition_elem *e1; + struct partition_elem *e2; + struct partition_elem *p; + struct partition_elem *old_next; + /* The canonical element of the resulting union class. */ + int class_element = elements[elem1].class_element; + + /* If they're already in the same class, do nothing. */ + if (class_element == elements[elem2].class_element) + return class_element; + + /* Make sure ELEM1 is in the larger class of the two. If not, swap + them. This way we always scan the shorter list. */ + if (elements[elem1].class_count < elements[elem2].class_count) + { + int temp = elem1; + elem1 = elem2; + elem2 = temp; + class_element = elements[elem1].class_element; + } + + e1 = &(elements[elem1]); + e2 = &(elements[elem2]); + + /* Keep a count of the number of elements in the list. */ + elements[class_element].class_count + += elements[e2->class_element].class_count; + + /* Update the class fields in elem2's class list. */ + e2->class_element = class_element; + for (p = e2->next; p != e2; p = p->next) + p->class_element = class_element; + + /* Splice ELEM2's class list into ELEM1's. These are circular + lists. */ + old_next = e1->next; + e1->next = e2->next; + e2->next = old_next; + + return class_element; +} + +/* Compare elements ELEM1 and ELEM2 from array of integers, given a + pointer to each. Used to qsort such an array. */ + +static int +elem_compare (const void *elem1, const void *elem2) +{ + int e1 = * (const int *) elem1; + int e2 = * (const int *) elem2; + if (e1 < e2) + return -1; + else if (e1 > e2) + return 1; + else + return 0; +} + +/* Prints PART to the file pointer FP. The elements of each + class are sorted. */ + +void +partition_print (partition part, FILE *fp) +{ + char *done; + int num_elements = part->num_elements; + struct partition_elem *elements = part->elements; + int *class_elements; + int e; + + /* Flag the elements we've already printed. */ + done = (char *) xmalloc (num_elements); + memset (done, 0, num_elements); + + /* A buffer used to sort elements in a class. */ + class_elements = (int *) xmalloc (num_elements * sizeof (int)); + + fputc ('[', fp); + for (e = 0; e < num_elements; ++e) + /* If we haven't printed this element, print its entire class. */ + if (! done[e]) + { + int c = e; + int count = elements[elements[e].class_element].class_count; + int i; + + /* Collect the elements in this class. */ + for (i = 0; i < count; ++i) { + class_elements[i] = c; + done[c] = 1; + c = elements[c].next - elements; + } + /* Sort them. */ + qsort ((void *) class_elements, count, sizeof (int), elem_compare); + /* Print them. */ + fputc ('(', fp); + for (i = 0; i < count; ++i) + fprintf (fp, i == 0 ? "%d" : " %d", class_elements[i]); + fputc (')', fp); + } + fputc (']', fp); + + free (class_elements); + free (done); +} + diff --git a/libiberty/pex-common.c b/libiberty/pex-common.c new file mode 100644 index 0000000..7f35536 --- /dev/null +++ b/libiberty/pex-common.c @@ -0,0 +1,643 @@ +/* Common code for executing a program in a sub-process. + Copyright (C) 2005 Free Software Foundation, Inc. + Written by Ian Lance Taylor . + +This file is part of the libiberty library. +Libiberty is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +Libiberty 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with libiberty; see the file COPYING.LIB. If not, +write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +#include "config.h" +#include "libiberty.h" +#include "pex-common.h" + +#include +#include +#ifdef NEED_DECLARATION_ERRNO +extern int errno; +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif + +extern int mkstemps (char *, int); + +/* This file contains subroutines for the program execution routines + (pex_init, pex_run, etc.). This file is compiled on all + systems. */ + +static void pex_add_remove (struct pex_obj *, const char *, int); +static int pex_get_status_and_time (struct pex_obj *, int, const char **, + int *); + +/* Initialize a pex_obj structure. */ + +struct pex_obj * +pex_init_common (int flags, const char *pname, const char *tempbase, + const struct pex_funcs *funcs) +{ + struct pex_obj *obj; + + obj = XNEW (struct pex_obj); + obj->flags = flags; + obj->pname = pname; + obj->tempbase = tempbase; + obj->next_input = STDIN_FILE_NO; + obj->next_input_name = NULL; + obj->next_input_name_allocated = 0; + obj->stderr_pipe = -1; + obj->count = 0; + obj->children = NULL; + obj->status = NULL; + obj->time = NULL; + obj->number_waited = 0; + obj->input_file = NULL; + obj->read_output = NULL; + obj->read_err = NULL; + obj->remove_count = 0; + obj->remove = NULL; + obj->funcs = funcs; + obj->sysdep = NULL; + return obj; +} + +/* Add a file to be removed when we are done. */ + +static void +pex_add_remove (struct pex_obj *obj, const char *name, int allocated) +{ + char *add; + + ++obj->remove_count; + obj->remove = XRESIZEVEC (char *, obj->remove, obj->remove_count); + if (allocated) + add = (char *) name; + else + add = xstrdup (name); + obj->remove[obj->remove_count - 1] = add; +} + +/* Generate a temporary file name based on OBJ, FLAGS, and NAME. + Return NULL if we were unable to reserve a temporary filename. + + If non-NULL, the result is either allocated with malloc, or the + same pointer as NAME. */ +static char * +temp_file (struct pex_obj *obj, int flags, char *name) +{ + if (name == NULL) + { + if (obj->tempbase == NULL) + { + name = make_temp_file (NULL); + } + else + { + int len = strlen (obj->tempbase); + int out; + + if (len >= 6 + && strcmp (obj->tempbase + len - 6, "XXXXXX") == 0) + name = xstrdup (obj->tempbase); + else + name = concat (obj->tempbase, "XXXXXX", NULL); + + out = mkstemps (name, 0); + if (out < 0) + { + free (name); + return NULL; + } + + /* This isn't obj->funcs->close because we got the + descriptor from mkstemps, not from a function in + obj->funcs. Calling close here is just like what + make_temp_file does. */ + close (out); + } + } + else if ((flags & PEX_SUFFIX) != 0) + { + if (obj->tempbase == NULL) + name = make_temp_file (name); + else + name = concat (obj->tempbase, name, NULL); + } + + return name; +} + + +/* As for pex_run (), but permits the environment for the child process + to be specified. */ + +const char * +pex_run_in_environment (struct pex_obj *obj, int flags, const char *executable, + char * const * argv, char * const * env, + const char *orig_outname, const char *errname, + int *err) +{ + const char *errmsg; + int in, out, errdes; + char *outname; + int outname_allocated; + int p[2]; + int toclose; + long pid; + + in = -1; + out = -1; + errdes = -1; + outname = (char *) orig_outname; + outname_allocated = 0; + + /* If the user called pex_input_file, close the file now. */ + if (obj->input_file) + { + if (fclose (obj->input_file) == EOF) + { + errmsg = "closing pipeline input file"; + goto error_exit; + } + obj->input_file = NULL; + } + + /* Set IN. */ + + if (obj->next_input_name != NULL) + { + /* We have to make sure that the previous process has completed + before we try to read the file. */ + if (!pex_get_status_and_time (obj, 0, &errmsg, err)) + goto error_exit; + + in = obj->funcs->open_read (obj, obj->next_input_name, + (flags & PEX_BINARY_INPUT) != 0); + if (in < 0) + { + *err = errno; + errmsg = "open temporary file"; + goto error_exit; + } + if (obj->next_input_name_allocated) + { + free (obj->next_input_name); + obj->next_input_name_allocated = 0; + } + obj->next_input_name = NULL; + } + else + { + in = obj->next_input; + if (in < 0) + { + *err = 0; + errmsg = "pipeline already complete"; + goto error_exit; + } + } + + /* Set OUT and OBJ->NEXT_INPUT/OBJ->NEXT_INPUT_NAME. */ + + if ((flags & PEX_LAST) != 0) + { + if (outname == NULL) + out = STDOUT_FILE_NO; + else if ((flags & PEX_SUFFIX) != 0) + { + outname = concat (obj->tempbase, outname, NULL); + outname_allocated = 1; + } + obj->next_input = -1; + } + else if ((obj->flags & PEX_USE_PIPES) == 0) + { + outname = temp_file (obj, flags, outname); + if (! outname) + { + *err = 0; + errmsg = "could not create temporary file"; + goto error_exit; + } + + if (outname != orig_outname) + outname_allocated = 1; + + if ((obj->flags & PEX_SAVE_TEMPS) == 0) + { + pex_add_remove (obj, outname, outname_allocated); + outname_allocated = 0; + } + + /* Hand off ownership of outname to the next stage. */ + obj->next_input_name = outname; + obj->next_input_name_allocated = outname_allocated; + outname_allocated = 0; + } + else + { + if (obj->funcs->pipe (obj, p, (flags & PEX_BINARY_OUTPUT) != 0) < 0) + { + *err = errno; + errmsg = "pipe"; + goto error_exit; + } + + out = p[WRITE_PORT]; + obj->next_input = p[READ_PORT]; + } + + if (out < 0) + { + out = obj->funcs->open_write (obj, outname, + (flags & PEX_BINARY_OUTPUT) != 0); + if (out < 0) + { + *err = errno; + errmsg = "open temporary output file"; + goto error_exit; + } + } + + if (outname_allocated) + { + free (outname); + outname_allocated = 0; + } + + /* Set ERRDES. */ + + if (errname != NULL && (flags & PEX_STDERR_TO_PIPE) != 0) + { + *err = 0; + errmsg = "both ERRNAME and PEX_STDERR_TO_PIPE specified."; + goto error_exit; + } + + if (obj->stderr_pipe != -1) + { + *err = 0; + errmsg = "PEX_STDERR_TO_PIPE used in the middle of pipeline"; + goto error_exit; + } + + if (errname == NULL) + { + if (flags & PEX_STDERR_TO_PIPE) + { + if (obj->funcs->pipe (obj, p, (flags & PEX_BINARY_ERROR) != 0) < 0) + { + *err = errno; + errmsg = "pipe"; + goto error_exit; + } + + errdes = p[WRITE_PORT]; + obj->stderr_pipe = p[READ_PORT]; + } + else + { + errdes = STDERR_FILE_NO; + } + } + else + { + errdes = obj->funcs->open_write (obj, errname, + (flags & PEX_BINARY_ERROR) != 0); + if (errdes < 0) + { + *err = errno; + errmsg = "open error file"; + goto error_exit; + } + } + + /* If we are using pipes, the child process has to close the next + input pipe. */ + + if ((obj->flags & PEX_USE_PIPES) == 0) + toclose = -1; + else + toclose = obj->next_input; + + /* Run the program. */ + + pid = obj->funcs->exec_child (obj, flags, executable, argv, env, + in, out, errdes, toclose, &errmsg, err); + if (pid < 0) + goto error_exit; + + ++obj->count; + obj->children = XRESIZEVEC (long, obj->children, obj->count); + obj->children[obj->count - 1] = pid; + + return NULL; + + error_exit: + if (in >= 0 && in != STDIN_FILE_NO) + obj->funcs->close (obj, in); + if (out >= 0 && out != STDOUT_FILE_NO) + obj->funcs->close (obj, out); + if (errdes >= 0 && errdes != STDERR_FILE_NO) + obj->funcs->close (obj, errdes); + if (outname_allocated) + free (outname); + return errmsg; +} + +/* Run a program. */ + +const char * +pex_run (struct pex_obj *obj, int flags, const char *executable, + char * const * argv, const char *orig_outname, const char *errname, + int *err) +{ + return pex_run_in_environment (obj, flags, executable, argv, NULL, + orig_outname, errname, err); +} + +/* Return a FILE pointer for a temporary file to fill with input for + the pipeline. */ +FILE * +pex_input_file (struct pex_obj *obj, int flags, const char *in_name) +{ + char *name = (char *) in_name; + FILE *f; + + /* This must be called before the first pipeline stage is run, and + there must not have been any other input selected. */ + if (obj->count != 0 + || (obj->next_input >= 0 && obj->next_input != STDIN_FILE_NO) + || obj->next_input_name) + { + errno = EINVAL; + return NULL; + } + + name = temp_file (obj, flags, name); + if (! name) + return NULL; + + f = fopen (name, (flags & PEX_BINARY_OUTPUT) ? "wb" : "w"); + if (! f) + { + free (name); + return NULL; + } + + obj->input_file = f; + obj->next_input_name = name; + obj->next_input_name_allocated = (name != in_name); + + return f; +} + +/* Return a stream for a pipe connected to the standard input of the + first stage of the pipeline. */ +FILE * +pex_input_pipe (struct pex_obj *obj, int binary) +{ + int p[2]; + FILE *f; + + /* You must call pex_input_pipe before the first pex_run or pex_one. */ + if (obj->count > 0) + goto usage_error; + + /* You must be using pipes. Implementations that don't support + pipes clear this flag before calling pex_init_common. */ + if (! (obj->flags & PEX_USE_PIPES)) + goto usage_error; + + /* If we have somehow already selected other input, that's a + mistake. */ + if ((obj->next_input >= 0 && obj->next_input != STDIN_FILE_NO) + || obj->next_input_name) + goto usage_error; + + if (obj->funcs->pipe (obj, p, binary != 0) < 0) + return NULL; + + f = obj->funcs->fdopenw (obj, p[WRITE_PORT], binary != 0); + if (! f) + { + int saved_errno = errno; + obj->funcs->close (obj, p[READ_PORT]); + obj->funcs->close (obj, p[WRITE_PORT]); + errno = saved_errno; + return NULL; + } + + obj->next_input = p[READ_PORT]; + + return f; + + usage_error: + errno = EINVAL; + return NULL; +} + +/* Return a FILE pointer for the output of the last program + executed. */ + +FILE * +pex_read_output (struct pex_obj *obj, int binary) +{ + if (obj->next_input_name != NULL) + { + const char *errmsg; + int err; + + /* We have to make sure that the process has completed before we + try to read the file. */ + if (!pex_get_status_and_time (obj, 0, &errmsg, &err)) + { + errno = err; + return NULL; + } + + obj->read_output = fopen (obj->next_input_name, binary ? "rb" : "r"); + + if (obj->next_input_name_allocated) + { + free (obj->next_input_name); + obj->next_input_name_allocated = 0; + } + obj->next_input_name = NULL; + } + else + { + int o; + + o = obj->next_input; + if (o < 0 || o == STDIN_FILE_NO) + return NULL; + obj->read_output = obj->funcs->fdopenr (obj, o, binary); + obj->next_input = -1; + } + + return obj->read_output; +} + +FILE * +pex_read_err (struct pex_obj *obj, int binary) +{ + int o; + + o = obj->stderr_pipe; + if (o < 0 || o == STDIN_FILE_NO) + return NULL; + obj->read_err = obj->funcs->fdopenr (obj, o, binary); + return obj->read_err; +} + +/* Get the exit status and, if requested, the resource time for all + the child processes. Return 0 on failure, 1 on success. */ + +static int +pex_get_status_and_time (struct pex_obj *obj, int done, const char **errmsg, + int *err) +{ + int ret; + int i; + + if (obj->number_waited == obj->count) + return 1; + + obj->status = XRESIZEVEC (int, obj->status, obj->count); + if ((obj->flags & PEX_RECORD_TIMES) != 0) + obj->time = XRESIZEVEC (struct pex_time, obj->time, obj->count); + + ret = 1; + for (i = obj->number_waited; i < obj->count; ++i) + { + if (obj->funcs->wait (obj, obj->children[i], &obj->status[i], + obj->time == NULL ? NULL : &obj->time[i], + done, errmsg, err) < 0) + ret = 0; + } + obj->number_waited = i; + + return ret; +} + +/* Get exit status of executed programs. */ + +int +pex_get_status (struct pex_obj *obj, int count, int *vector) +{ + if (obj->status == NULL) + { + const char *errmsg; + int err; + + if (!pex_get_status_and_time (obj, 0, &errmsg, &err)) + return 0; + } + + if (count > obj->count) + { + memset (vector + obj->count, 0, (count - obj->count) * sizeof (int)); + count = obj->count; + } + + memcpy (vector, obj->status, count * sizeof (int)); + + return 1; +} + +/* Get process times of executed programs. */ + +int +pex_get_times (struct pex_obj *obj, int count, struct pex_time *vector) +{ + if (obj->status == NULL) + { + const char *errmsg; + int err; + + if (!pex_get_status_and_time (obj, 0, &errmsg, &err)) + return 0; + } + + if (obj->time == NULL) + return 0; + + if (count > obj->count) + { + memset (vector + obj->count, 0, + (count - obj->count) * sizeof (struct pex_time)); + count = obj->count; + } + + memcpy (vector, obj->time, count * sizeof (struct pex_time)); + + return 1; +} + +/* Free a pex_obj structure. */ + +void +pex_free (struct pex_obj *obj) +{ + if (obj->next_input >= 0 && obj->next_input != STDIN_FILE_NO) + obj->funcs->close (obj, obj->next_input); + + /* If the caller forgot to wait for the children, we do it here, to + avoid zombies. */ + if (obj->status == NULL) + { + const char *errmsg; + int err; + + obj->flags &= ~ PEX_RECORD_TIMES; + pex_get_status_and_time (obj, 1, &errmsg, &err); + } + + if (obj->next_input_name_allocated) + free (obj->next_input_name); + if (obj->children != NULL) + free (obj->children); + if (obj->status != NULL) + free (obj->status); + if (obj->time != NULL) + free (obj->time); + if (obj->read_output != NULL) + fclose (obj->read_output); + if (obj->read_err != NULL) + fclose (obj->read_err); + + if (obj->remove_count > 0) + { + int i; + + for (i = 0; i < obj->remove_count; ++i) + { + remove (obj->remove[i]); + free (obj->remove[i]); + } + free (obj->remove); + } + + if (obj->funcs->cleanup != NULL) + obj->funcs->cleanup (obj); + + free (obj); +} diff --git a/libiberty/pex-common.h b/libiberty/pex-common.h new file mode 100644 index 0000000..5b7bfcc --- /dev/null +++ b/libiberty/pex-common.h @@ -0,0 +1,153 @@ +/* Utilities to execute a program in a subprocess (possibly linked by pipes + with other subprocesses), and wait for it. Shared logic. + Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004 + Free Software Foundation, Inc. + +This file is part of the libiberty library. +Libiberty is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +Libiberty 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with libiberty; see the file COPYING.LIB. If not, +write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +#ifndef PEX_COMMON_H +#define PEX_COMMON_H + +#include "config.h" +#include "libiberty.h" +#include + +/* pid_t is may defined by config.h or sys/types.h needs to be + included. */ +#if !defined(pid_t) && defined(HAVE_SYS_TYPES_H) +#include +#endif + +#define install_error_msg "installation problem, cannot exec `%s'" + +/* stdin file number. */ +#define STDIN_FILE_NO 0 + +/* stdout file number. */ +#define STDOUT_FILE_NO 1 + +/* stderr file number. */ +#define STDERR_FILE_NO 2 + +/* value of `pipe': port index for reading. */ +#define READ_PORT 0 + +/* value of `pipe': port index for writing. */ +#define WRITE_PORT 1 + +/* The structure used by pex_init and friends. */ + +struct pex_obj +{ + /* Flags. */ + int flags; + /* Name of calling program, for error messages. */ + const char *pname; + /* Base name to use for temporary files. */ + const char *tempbase; + /* Pipe to use as stdin for next process. */ + int next_input; + /* File name to use as stdin for next process. */ + char *next_input_name; + /* Whether next_input_name was allocated using malloc. */ + int next_input_name_allocated; + /* If not -1, stderr pipe from the last process. */ + int stderr_pipe; + /* Number of child processes. */ + int count; + /* PIDs of child processes; array allocated using malloc. */ + long *children; + /* Exit statuses of child processes; array allocated using malloc. */ + int *status; + /* Time used by child processes; array allocated using malloc. */ + struct pex_time *time; + /* Number of children we have already waited for. */ + int number_waited; + /* FILE created by pex_input_file. */ + FILE *input_file; + /* FILE created by pex_read_output. */ + FILE *read_output; + /* FILE created by pex_read_err. */ + FILE *read_err; + /* Number of temporary files to remove. */ + int remove_count; + /* List of temporary files to remove; array allocated using malloc + of strings allocated using malloc. */ + char **remove; + /* Pointers to system dependent functions. */ + const struct pex_funcs *funcs; + /* For use by system dependent code. */ + void *sysdep; +}; + +/* Functions passed to pex_run_common. */ + +struct pex_funcs +{ + /* Open file NAME for reading. If BINARY is non-zero, open in + binary mode. Return >= 0 on success, -1 on error. */ + int (*open_read) (struct pex_obj *, const char */* name */, int /* binary */); + /* Open file NAME for writing. If BINARY is non-zero, open in + binary mode. Return >= 0 on success, -1 on error. */ + int (*open_write) (struct pex_obj *, const char */* name */, + int /* binary */); + /* Execute a child process. FLAGS, EXECUTABLE, ARGV, ERR are from + pex_run. IN, OUT, ERRDES, TOCLOSE are all descriptors, from + open_read, open_write, or pipe, or they are one of STDIN_FILE_NO, + STDOUT_FILE_NO or STDERR_FILE_NO; if IN, OUT, and ERRDES are not + STD*_FILE_NO, they should be closed. If the descriptor TOCLOSE + is not -1, and the system supports pipes, TOCLOSE should be + closed in the child process. The function should handle the + PEX_STDERR_TO_STDOUT flag. Return >= 0 on success, or -1 on + error and set *ERRMSG and *ERR. */ + pid_t (*exec_child) (struct pex_obj *, int /* flags */, + const char */* executable */, char * const * /* argv */, + char * const * /* env */, + int /* in */, int /* out */, int /* errdes */, + int /* toclose */, const char **/* errmsg */, + int */* err */); + /* Close a descriptor. Return 0 on success, -1 on error. */ + int (*close) (struct pex_obj *, int); + /* Wait for a child to complete, returning exit status in *STATUS + and time in *TIME (if it is not null). CHILD is from fork. DONE + is 1 if this is called via pex_free. ERRMSG and ERR are as in + fork. Return 0 on success, -1 on error. */ + int (*wait) (struct pex_obj *, pid_t /* child */, int * /* status */, + struct pex_time * /* time */, int /* done */, + const char ** /* errmsg */, int * /* err */); + /* Create a pipe (only called if PEX_USE_PIPES is set) storing two + descriptors in P[0] and P[1]. If BINARY is non-zero, open in + binary mode. Return 0 on success, -1 on error. */ + int (*pipe) (struct pex_obj *, int * /* p */, int /* binary */); + /* Get a FILE pointer to read from a file descriptor (only called if + PEX_USE_PIPES is set). If BINARY is non-zero, open in binary + mode. Return pointer on success, NULL on error. */ + FILE * (*fdopenr) (struct pex_obj *, int /* fd */, int /* binary */); + /* Get a FILE pointer to write to the file descriptor FD (only + called if PEX_USE_PIPES is set). If BINARY is non-zero, open in + binary mode. Arrange for FD not to be inherited by the child + processes. Return pointer on success, NULL on error. */ + FILE * (*fdopenw) (struct pex_obj *, int /* fd */, int /* binary */); + /* Free any system dependent data associated with OBJ. May be + NULL if there is nothing to do. */ + void (*cleanup) (struct pex_obj *); +}; + +extern struct pex_obj *pex_init_common (int, const char *, const char *, + const struct pex_funcs *); + +#endif diff --git a/libiberty/pex-djgpp.c b/libiberty/pex-djgpp.c new file mode 100644 index 0000000..bd27938 --- /dev/null +++ b/libiberty/pex-djgpp.c @@ -0,0 +1,294 @@ +/* Utilities to execute a program in a subprocess (possibly linked by pipes + with other subprocesses), and wait for it. DJGPP specialization. + Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2005 + Free Software Foundation, Inc. + +This file is part of the libiberty library. +Libiberty is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +Libiberty 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with libiberty; see the file COPYING.LIB. If not, +write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +#include "pex-common.h" + +#include +#include +#ifdef NEED_DECLARATION_ERRNO +extern int errno; +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#include +#include +#include +#include +#include + +/* Use ECHILD if available, otherwise use EINVAL. */ +#ifdef ECHILD +#define PWAIT_ERROR ECHILD +#else +#define PWAIT_ERROR EINVAL +#endif + +static int pex_djgpp_open_read (struct pex_obj *, const char *, int); +static int pex_djgpp_open_write (struct pex_obj *, const char *, int); +static pid_t pex_djgpp_exec_child (struct pex_obj *, int, const char *, + char * const *, char * const *, + int, int, int, int, + const char **, int *); +static int pex_djgpp_close (struct pex_obj *, int); +static int pex_djgpp_wait (struct pex_obj *, pid_t, int *, struct pex_time *, + int, const char **, int *); + +/* The list of functions we pass to the common routines. */ + +const struct pex_funcs funcs = +{ + pex_djgpp_open_read, + pex_djgpp_open_write, + pex_djgpp_exec_child, + pex_djgpp_close, + pex_djgpp_wait, + NULL, /* pipe */ + NULL, /* fdopenr */ + NULL, /* fdopenw */ + NULL /* cleanup */ +}; + +/* Return a newly initialized pex_obj structure. */ + +struct pex_obj * +pex_init (int flags, const char *pname, const char *tempbase) +{ + /* DJGPP does not support pipes. */ + flags &= ~ PEX_USE_PIPES; + return pex_init_common (flags, pname, tempbase, &funcs); +} + +/* Open a file for reading. */ + +static int +pex_djgpp_open_read (struct pex_obj *obj ATTRIBUTE_UNUSED, + const char *name, int binary) +{ + return open (name, O_RDONLY | (binary ? O_BINARY : O_TEXT)); +} + +/* Open a file for writing. */ + +static int +pex_djgpp_open_write (struct pex_obj *obj ATTRIBUTE_UNUSED, + const char *name, int binary) +{ + /* Note that we can't use O_EXCL here because gcc may have already + created the temporary file via make_temp_file. */ + return open (name, + (O_WRONLY | O_CREAT | O_TRUNC + | (binary ? O_BINARY : O_TEXT)), + S_IRUSR | S_IWUSR); +} + +/* Close a file. */ + +static int +pex_djgpp_close (struct pex_obj *obj ATTRIBUTE_UNUSED, int fd) +{ + return close (fd); +} + +/* Execute a child. */ + +static pid_t +pex_djgpp_exec_child (struct pex_obj *obj, int flags, const char *executable, + char * const * argv, char * const * env, + int in, int out, int errdes, + int toclose ATTRIBUTE_UNUSED, const char **errmsg, + int *err) +{ + int org_in, org_out, org_errdes; + int status; + int *statuses; + + org_in = -1; + org_out = -1; + org_errdes = -1; + + if (in != STDIN_FILE_NO) + { + org_in = dup (STDIN_FILE_NO); + if (org_in < 0) + { + *err = errno; + *errmsg = "dup"; + return (pid_t) -1; + } + if (dup2 (in, STDIN_FILE_NO) < 0) + { + *err = errno; + *errmsg = "dup2"; + return (pid_t) -1; + } + if (close (in) < 0) + { + *err = errno; + *errmsg = "close"; + return (pid_t) -1; + } + } + + if (out != STDOUT_FILE_NO) + { + org_out = dup (STDOUT_FILE_NO); + if (org_out < 0) + { + *err = errno; + *errmsg = "dup"; + return (pid_t) -1; + } + if (dup2 (out, STDOUT_FILE_NO) < 0) + { + *err = errno; + *errmsg = "dup2"; + return (pid_t) -1; + } + if (close (out) < 0) + { + *err = errno; + *errmsg = "close"; + return (pid_t) -1; + } + } + + if (errdes != STDERR_FILE_NO + || (flags & PEX_STDERR_TO_STDOUT) != 0) + { + org_errdes = dup (STDERR_FILE_NO); + if (org_errdes < 0) + { + *err = errno; + *errmsg = "dup"; + return (pid_t) -1; + } + if (dup2 ((flags & PEX_STDERR_TO_STDOUT) != 0 ? STDOUT_FILE_NO : errdes, + STDERR_FILE_NO) < 0) + { + *err = errno; + *errmsg = "dup2"; + return (pid_t) -1; + } + if (errdes != STDERR_FILE_NO) + { + if (close (errdes) < 0) + { + *err = errno; + *errmsg = "close"; + return (pid_t) -1; + } + } + } + + if (env) + status = (((flags & PEX_SEARCH) != 0 ? spawnvpe : spawnve) + (P_WAIT, executable, argv, env)); + else + status = (((flags & PEX_SEARCH) != 0 ? spawnvp : spawnv) + (P_WAIT, executable, argv)); + + if (status == -1) + { + *err = errno; + *errmsg = ((flags & PEX_SEARCH) != 0) ? "spawnvp" : "spawnv"; + } + + if (in != STDIN_FILE_NO) + { + if (dup2 (org_in, STDIN_FILE_NO) < 0) + { + *err = errno; + *errmsg = "dup2"; + return (pid_t) -1; + } + if (close (org_in) < 0) + { + *err = errno; + *errmsg = "close"; + return (pid_t) -1; + } + } + + if (out != STDOUT_FILE_NO) + { + if (dup2 (org_out, STDOUT_FILE_NO) < 0) + { + *err = errno; + *errmsg = "dup2"; + return (pid_t) -1; + } + if (close (org_out) < 0) + { + *err = errno; + *errmsg = "close"; + return (pid_t) -1; + } + } + + if (errdes != STDERR_FILE_NO + || (flags & PEX_STDERR_TO_STDOUT) != 0) + { + if (dup2 (org_errdes, STDERR_FILE_NO) < 0) + { + *err = errno; + *errmsg = "dup2"; + return (pid_t) -1; + } + if (close (org_errdes) < 0) + { + *err = errno; + *errmsg = "close"; + return (pid_t) -1; + } + } + + /* Save the exit status for later. When we are called, obj->count + is the number of children which have executed before this + one. */ + statuses = (int *) obj->sysdep; + statuses = XRESIZEVEC (int, statuses, obj->count + 1); + statuses[obj->count] = status; + obj->sysdep = (void *) statuses; + + return (pid_t) obj->count; +} + +/* Wait for a child process to complete. Actually the child process + has already completed, and we just need to return the exit + status. */ + +static int +pex_djgpp_wait (struct pex_obj *obj, pid_t pid, int *status, + struct pex_time *time, int done ATTRIBUTE_UNUSED, + const char **errmsg ATTRIBUTE_UNUSED, + int *err ATTRIBUTE_UNUSED) +{ + int *statuses; + + if (time != NULL) + memset (time, 0, sizeof *time); + + statuses = (int *) obj->sysdep; + *status = statuses[pid]; + + return 0; +} diff --git a/libiberty/pex-msdos.c b/libiberty/pex-msdos.c new file mode 100644 index 0000000..ab4d736 --- /dev/null +++ b/libiberty/pex-msdos.c @@ -0,0 +1,319 @@ +/* Utilities to execute a program in a subprocess (possibly linked by pipes + with other subprocesses), and wait for it. Generic MSDOS specialization. + Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2005 + Free Software Foundation, Inc. + +This file is part of the libiberty library. +Libiberty is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +Libiberty 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with libiberty; see the file COPYING.LIB. If not, +write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +#include "pex-common.h" + +#include +#include +#ifdef NEED_DECLARATION_ERRNO +extern int errno; +#endif +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif + +#include "safe-ctype.h" +#include + +/* The structure we keep in obj->sysdep. */ + +#define PEX_MSDOS_FILE_COUNT 3 + +#define PEX_MSDOS_FD_OFFSET 10 + +struct pex_msdos +{ + /* An array of file names. We refer to these using file descriptors + of 10 + array index. */ + const char *files[PEX_MSDOS_FILE_COUNT]; + /* Exit statuses of programs which have been run. */ + int *statuses; +}; + +static int pex_msdos_open (struct pex_obj *, const char *, int); +static int pex_msdos_open (struct pex_obj *, const char *, int); +static int pex_msdos_fdindex (struct pex_msdos *, int); +static pid_t pex_msdos_exec_child (struct pex_obj *, int, const char *, + char * const *, char * const *, + int, int, int, int, + int, const char **, int *); +static int pex_msdos_close (struct pex_obj *, int); +static int pex_msdos_wait (struct pex_obj *, pid_t, int *, struct pex_time *, + int, const char **, int *); +static void pex_msdos_cleanup (struct pex_obj *); + +/* The list of functions we pass to the common routines. */ + +const struct pex_funcs funcs = +{ + pex_msdos_open, + pex_msdos_open, + pex_msdos_exec_child, + pex_msdos_close, + pex_msdos_wait, + NULL, /* pipe */ + NULL, /* fdopenr */ + NULL, /* fdopenw */ + pex_msdos_cleanup +}; + +/* Return a newly initialized pex_obj structure. */ + +struct pex_obj * +pex_init (int flags, const char *pname, const char *tempbase) +{ + struct pex_obj *ret; + int i; + + /* MSDOS does not support pipes. */ + flags &= ~ PEX_USE_PIPES; + + ret = pex_init_common (flags, pname, tempbase, funcs); + + ret->sysdep = XNEW (struct pex_msdos); + for (i = 0; i < PEX_MSDOS_FILE_COUNT; ++i) + ret->files[i] = NULL; + ret->statuses = NULL; + + return ret; +} + +/* Open a file. FIXME: We ignore the binary argument, since we have + no way to handle it. */ + +static int +pex_msdos_open (struct pex_obj *obj, const char *name, + int binary ATTRIBUTE_UNUSED) +{ + struct pex_msdos *ms; + int i; + + ms = (struct pex_msdos *) obj->sysdep; + + for (i = 0; i < PEX_MSDOS_FILE_COUNT; ++i) + { + if (ms->files[i] == NULL) + { + ms->files[i] = xstrdup (name); + return i + PEX_MSDOS_FD_OFFSET; + } + } + + abort (); +} + +/* Get the index into msdos->files associated with an open file + descriptor. */ + +static int +pex_msdos_fdindex (struct pex_msdos *ms, int fd) +{ + fd -= PEX_MSDOS_FD_OFFSET; + if (fd < 0 || fd >= PEX_MSDOS_FILE_COUNT || ms->files[fd] == NULL) + abort (); + return fd; +} + + +/* Close a file. */ + +static int +pex_msdos_close (struct pex_obj *obj, int fd) +{ + struct pex_msdos *ms; + int fdinex; + + ms = (struct pex_msdos *) obj->sysdep; + fdindex = pe_msdos_fdindex (ms, fd); + free (ms->files[fdindex]); + ms->files[fdindex] = NULL; +} + +/* Execute a child. */ + +static pid_t +pex_msdos_exec_child (struct pex_obj *obj, int flags, const char *executable, + char * const * argv, char * const * env, int in, int out, + int toclose ATTRIBUTE_UNUSED, + int errdes ATTRIBUTE_UNUSED, const char **errmsg, + int *err) +{ + struct pex_msdos *ms; + char *temp_base; + int temp_base_allocated; + char *rf; + int inindex; + char *infile; + int outindex; + char *outfile; + char *scmd; + FILE *argfile; + int i; + int status; + + ms = (struct pex_msdos *) obj->sysdep; + + /* FIXME: I don't know how to redirect stderr, so we ignore ERRDES + and PEX_STDERR_TO_STDOUT. */ + + temp_base = obj->temp_base; + if (temp_base != NULL) + temp_base_allocated = 0; + else + { + temp_base = choose_temp_base (); + temp_base_allocated = 1; + } + + rf = concat (temp_base, ".gp", NULL); + + if (temp_base_allocated) + free (temp_base); + + if (in == STDIN_FILE_NO) + { + inindex = -1; + infile = ""; + } + else + { + inindex = pex_msdos_fdindex (ms, in); + infile = ms->files[inindex]; + } + + if (out == STDOUT_FILE_NO) + { + outindex = -1; + outfile = ""; + } + else + { + outindex = pex_msdos_fdindex (ms, out); + outfile = ms->files[outindex]; + } + + scmd = XNEWVEC (char, strlen (program) + + ((flags & PEXECUTE_SEARCH) != 0 ? 4 : 0) + + strlen (rf) + + strlen (infile) + + strlen (outfile) + + 10); + sprintf (scmd, "%s%s @%s%s%s%s%s", + program, + (flags & PEXECUTE_SEARCH) != 0 ? ".exe" : "", + rf, + inindex != -1 ? " <" : "", + infile, + outindex != -1 ? " >" : "", + outfile); + + argfile = fopen (rf, "w"); + if (argfile == NULL) + { + *err = errno; + free (scmd); + free (rf); + *errmsg = "cannot open temporary command file"; + return (pid_t) -1; + } + + for (i = 1; argv[i] != NULL; ++i) + { + char *p; + + for (p = argv[i]; *p != '\0'; ++p) + { + if (*p == '"' || *p == '\'' || *p == '\\' || ISSPACE (*p)) + putc ('\\', argfile); + putc (*p, argfile); + } + putc ('\n', argfile); + } + + fclose (argfile); + + status = system (scmd); + + if (status == -1) + { + *err = errno; + remove (rf); + free (scmd); + free (rf); + *errmsg = "system"; + return (pid_t) -1; + } + + remove (rf); + free (scmd); + free (rf); + + /* Save the exit status for later. When we are called, obj->count + is the number of children which have executed before this + one. */ + ms->statuses = XRESIZEVEC(int, ms->statuses, obj->count + 1); + ms->statuses[obj->count] = status; + + return (pid_t) obj->count; +} + +/* Wait for a child process to complete. Actually the child process + has already completed, and we just need to return the exit + status. */ + +static int +pex_msdos_wait (struct pex_obj *obj, pid_t pid, int *status, + struct pex_time *time, int done ATTRIBUTE_UNUSED, + const char **errmsg ATTRIBUTE_UNUSED, + int *err ATTRIBUTE_UNUSED) +{ + struct pex_msdos *ms; + + ms = (struct pex_msdos *) obj->sysdep; + + if (time != NULL) + memset (time, 0, sizeof *time); + + *status = ms->statuses[pid]; + + return 0; +} + +/* Clean up the pex_msdos structure. */ + +static void +pex_msdos_cleanup (struct pex_obj *obj) +{ + struct pex_msdos *ms; + int i; + + ms = (struct pex_msdos *) obj->sysdep; + for (i = 0; i < PEX_MSDOS_FILE_COUNT; ++i) + if (msdos->files[i] != NULL) + free (msdos->files[i]); + if (msdos->statuses != NULL) + free (msdos->statuses); + free (msdos); + obj->sysdep = NULL; +} diff --git a/libiberty/pex-one.c b/libiberty/pex-one.c new file mode 100644 index 0000000..696b8bc --- /dev/null +++ b/libiberty/pex-one.c @@ -0,0 +1,43 @@ +/* Execute a program and wait for a result. + Copyright (C) 2005 Free Software Foundation, Inc. + +This file is part of the libiberty library. +Libiberty is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +Libiberty 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with libiberty; see the file COPYING.LIB. If not, +write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +#include "config.h" +#include "libiberty.h" + +const char * +pex_one (int flags, const char *executable, char * const *argv, + const char *pname, const char *outname, const char *errname, + int *status, int *err) +{ + struct pex_obj *obj; + const char *errmsg; + + obj = pex_init (0, pname, NULL); + errmsg = pex_run (obj, flags, executable, argv, outname, errname, err); + if (errmsg == NULL) + { + if (!pex_get_status (obj, 1, status)) + { + *err = 0; + errmsg = "pex_get_status failed"; + } + } + pex_free (obj); + return errmsg; +} diff --git a/libiberty/pex-unix.c b/libiberty/pex-unix.c new file mode 100644 index 0000000..366e96e --- /dev/null +++ b/libiberty/pex-unix.c @@ -0,0 +1,538 @@ +/* Utilities to execute a program in a subprocess (possibly linked by pipes + with other subprocesses), and wait for it. Generic Unix version + (also used for UWIN and VMS). + Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005 + Free Software Foundation, Inc. + +This file is part of the libiberty library. +Libiberty is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +Libiberty 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with libiberty; see the file COPYING.LIB. If not, +write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +#include "config.h" +#include "libiberty.h" +#include "pex-common.h" + +#include +#include +#include +#ifdef NEED_DECLARATION_ERRNO +extern int errno; +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif + +#include + +#ifdef HAVE_FCNTL_H +#include +#endif +#ifdef HAVE_SYS_WAIT_H +#include +#endif +#ifdef HAVE_GETRUSAGE +#include +#include +#endif +#ifdef HAVE_SYS_STAT_H +#include +#endif + + +#ifdef vfork /* Autoconf may define this to fork for us. */ +# define VFORK_STRING "fork" +#else +# define VFORK_STRING "vfork" +#endif +#ifdef HAVE_VFORK_H +#include +#endif +#ifdef VMS +#define vfork() (decc$$alloc_vfork_blocks() >= 0 ? \ + lib$get_current_invo_context(decc$$get_vfork_jmpbuf()) : -1) +#endif /* VMS */ + + +/* File mode to use for private and world-readable files. */ + +#if defined (S_IRUSR) && defined (S_IWUSR) && defined (S_IRGRP) && defined (S_IWGRP) && defined (S_IROTH) && defined (S_IWOTH) +#define PUBLIC_MODE \ + (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH) +#else +#define PUBLIC_MODE 0666 +#endif + +/* Get the exit status of a particular process, and optionally get the + time that it took. This is simple if we have wait4, slightly + harder if we have waitpid, and is a pain if we only have wait. */ + +static pid_t pex_wait (struct pex_obj *, pid_t, int *, struct pex_time *); + +#ifdef HAVE_WAIT4 + +static pid_t +pex_wait (struct pex_obj *obj ATTRIBUTE_UNUSED, pid_t pid, int *status, + struct pex_time *time) +{ + pid_t ret; + struct rusage r; + +#ifdef HAVE_WAITPID + if (time == NULL) + return waitpid (pid, status, 0); +#endif + + ret = wait4 (pid, status, 0, &r); + + if (time != NULL) + { + time->user_seconds = r.ru_utime.tv_sec; + time->user_microseconds= r.ru_utime.tv_usec; + time->system_seconds = r.ru_stime.tv_sec; + time->system_microseconds= r.ru_stime.tv_usec; + } + + return ret; +} + +#else /* ! defined (HAVE_WAIT4) */ + +#ifdef HAVE_WAITPID + +#ifndef HAVE_GETRUSAGE + +static pid_t +pex_wait (struct pex_obj *obj ATTRIBUTE_UNUSED, pid_t pid, int *status, + struct pex_time *time) +{ + if (time != NULL) + memset (time, 0, sizeof (struct pex_time)); + return waitpid (pid, status, 0); +} + +#else /* defined (HAVE_GETRUSAGE) */ + +static pid_t +pex_wait (struct pex_obj *obj ATTRIBUTE_UNUSED, pid_t pid, int *status, + struct pex_time *time) +{ + struct rusage r1, r2; + pid_t ret; + + if (time == NULL) + return waitpid (pid, status, 0); + + getrusage (RUSAGE_CHILDREN, &r1); + + ret = waitpid (pid, status, 0); + if (ret < 0) + return ret; + + getrusage (RUSAGE_CHILDREN, &r2); + + time->user_seconds = r2.ru_utime.tv_sec - r1.ru_utime.tv_sec; + time->user_microseconds = r2.ru_utime.tv_usec - r1.ru_utime.tv_usec; + if (r2.ru_utime.tv_usec < r1.ru_utime.tv_usec) + { + --time->user_seconds; + time->user_microseconds += 1000000; + } + + time->system_seconds = r2.ru_stime.tv_sec - r1.ru_stime.tv_sec; + time->system_microseconds = r2.ru_stime.tv_usec - r1.ru_stime.tv_usec; + if (r2.ru_stime.tv_usec < r1.ru_stime.tv_usec) + { + --time->system_seconds; + time->system_microseconds += 1000000; + } + + return ret; +} + +#endif /* defined (HAVE_GETRUSAGE) */ + +#else /* ! defined (HAVE_WAITPID) */ + +struct status_list +{ + struct status_list *next; + pid_t pid; + int status; + struct pex_time time; +}; + +static pid_t +pex_wait (struct pex_obj *obj, pid_t pid, int *status, struct pex_time *time) +{ + struct status_list **pp; + + for (pp = (struct status_list **) &obj->sysdep; + *pp != NULL; + pp = &(*pp)->next) + { + if ((*pp)->pid == pid) + { + struct status_list *p; + + p = *pp; + *status = p->status; + if (time != NULL) + *time = p->time; + *pp = p->next; + free (p); + return pid; + } + } + + while (1) + { + pid_t cpid; + struct status_list *psl; + struct pex_time pt; +#ifdef HAVE_GETRUSAGE + struct rusage r1, r2; +#endif + + if (time != NULL) + { +#ifdef HAVE_GETRUSAGE + getrusage (RUSAGE_CHILDREN, &r1); +#else + memset (&pt, 0, sizeof (struct pex_time)); +#endif + } + + cpid = wait (status); + +#ifdef HAVE_GETRUSAGE + if (time != NULL && cpid >= 0) + { + getrusage (RUSAGE_CHILDREN, &r2); + + pt.user_seconds = r2.ru_utime.tv_sec - r1.ru_utime.tv_sec; + pt.user_microseconds = r2.ru_utime.tv_usec - r1.ru_utime.tv_usec; + if (pt.user_microseconds < 0) + { + --pt.user_seconds; + pt.user_microseconds += 1000000; + } + + pt.system_seconds = r2.ru_stime.tv_sec - r1.ru_stime.tv_sec; + pt.system_microseconds = r2.ru_stime.tv_usec - r1.ru_stime.tv_usec; + if (pt.system_microseconds < 0) + { + --pt.system_seconds; + pt.system_microseconds += 1000000; + } + } +#endif + + if (cpid < 0 || cpid == pid) + { + if (time != NULL) + *time = pt; + return cpid; + } + + psl = XNEW (struct status_list); + psl->pid = cpid; + psl->status = *status; + if (time != NULL) + psl->time = pt; + psl->next = (struct status_list *) obj->sysdep; + obj->sysdep = (void *) psl; + } +} + +#endif /* ! defined (HAVE_WAITPID) */ +#endif /* ! defined (HAVE_WAIT4) */ + +static void pex_child_error (struct pex_obj *, const char *, const char *, int) + ATTRIBUTE_NORETURN; +static int pex_unix_open_read (struct pex_obj *, const char *, int); +static int pex_unix_open_write (struct pex_obj *, const char *, int); +static pid_t pex_unix_exec_child (struct pex_obj *, int, const char *, + char * const *, char * const *, + int, int, int, int, + const char **, int *); +static int pex_unix_close (struct pex_obj *, int); +static int pex_unix_wait (struct pex_obj *, pid_t, int *, struct pex_time *, + int, const char **, int *); +static int pex_unix_pipe (struct pex_obj *, int *, int); +static FILE *pex_unix_fdopenr (struct pex_obj *, int, int); +static FILE *pex_unix_fdopenw (struct pex_obj *, int, int); +static void pex_unix_cleanup (struct pex_obj *); + +/* The list of functions we pass to the common routines. */ + +const struct pex_funcs funcs = +{ + pex_unix_open_read, + pex_unix_open_write, + pex_unix_exec_child, + pex_unix_close, + pex_unix_wait, + pex_unix_pipe, + pex_unix_fdopenr, + pex_unix_fdopenw, + pex_unix_cleanup +}; + +/* Return a newly initialized pex_obj structure. */ + +struct pex_obj * +pex_init (int flags, const char *pname, const char *tempbase) +{ + return pex_init_common (flags, pname, tempbase, &funcs); +} + +/* Open a file for reading. */ + +static int +pex_unix_open_read (struct pex_obj *obj ATTRIBUTE_UNUSED, const char *name, + int binary ATTRIBUTE_UNUSED) +{ + return open (name, O_RDONLY); +} + +/* Open a file for writing. */ + +static int +pex_unix_open_write (struct pex_obj *obj ATTRIBUTE_UNUSED, const char *name, + int binary ATTRIBUTE_UNUSED) +{ + /* Note that we can't use O_EXCL here because gcc may have already + created the temporary file via make_temp_file. */ + return open (name, O_WRONLY | O_CREAT | O_TRUNC, PUBLIC_MODE); +} + +/* Close a file. */ + +static int +pex_unix_close (struct pex_obj *obj ATTRIBUTE_UNUSED, int fd) +{ + return close (fd); +} + +/* Report an error from a child process. We don't use stdio routines, + because we might be here due to a vfork call. */ + +static void +pex_child_error (struct pex_obj *obj, const char *executable, + const char *errmsg, int err) +{ +#define writeerr(s) (void) write (STDERR_FILE_NO, s, strlen (s)) + writeerr (obj->pname); + writeerr (": error trying to exec '"); + writeerr (executable); + writeerr ("': "); + writeerr (errmsg); + writeerr (": "); + writeerr (xstrerror (err)); + writeerr ("\n"); + _exit (-1); +} + +/* Execute a child. */ + +extern char **environ; + +static pid_t +pex_unix_exec_child (struct pex_obj *obj, int flags, const char *executable, + char * const * argv, char * const * env, + int in, int out, int errdes, + int toclose, const char **errmsg, int *err) +{ + pid_t pid; + + /* We declare these to be volatile to avoid warnings from gcc about + them being clobbered by vfork. */ + volatile int sleep_interval; + volatile int retries; + + sleep_interval = 1; + pid = -1; + for (retries = 0; retries < 4; ++retries) + { + pid = vfork (); + if (pid >= 0) + break; + sleep (sleep_interval); + sleep_interval *= 2; + } + + switch (pid) + { + case -1: + *err = errno; + *errmsg = VFORK_STRING; + return (pid_t) -1; + + case 0: + /* Child process. */ + if (in != STDIN_FILE_NO) + { + if (dup2 (in, STDIN_FILE_NO) < 0) + pex_child_error (obj, executable, "dup2", errno); + if (close (in) < 0) + pex_child_error (obj, executable, "close", errno); + } + if (out != STDOUT_FILE_NO) + { + if (dup2 (out, STDOUT_FILE_NO) < 0) + pex_child_error (obj, executable, "dup2", errno); + if (close (out) < 0) + pex_child_error (obj, executable, "close", errno); + } + if (errdes != STDERR_FILE_NO) + { + if (dup2 (errdes, STDERR_FILE_NO) < 0) + pex_child_error (obj, executable, "dup2", errno); + if (close (errdes) < 0) + pex_child_error (obj, executable, "close", errno); + } + if (toclose >= 0) + { + if (close (toclose) < 0) + pex_child_error (obj, executable, "close", errno); + } + if ((flags & PEX_STDERR_TO_STDOUT) != 0) + { + if (dup2 (STDOUT_FILE_NO, STDERR_FILE_NO) < 0) + pex_child_error (obj, executable, "dup2", errno); + } + + if (env) + environ = (char**) env; + + if ((flags & PEX_SEARCH) != 0) + { + execvp (executable, argv); + pex_child_error (obj, executable, "execvp", errno); + } + else + { + execv (executable, argv); + pex_child_error (obj, executable, "execv", errno); + } + + /* NOTREACHED */ + return (pid_t) -1; + + default: + /* Parent process. */ + if (in != STDIN_FILE_NO) + { + if (close (in) < 0) + { + *err = errno; + *errmsg = "close"; + return (pid_t) -1; + } + } + if (out != STDOUT_FILE_NO) + { + if (close (out) < 0) + { + *err = errno; + *errmsg = "close"; + return (pid_t) -1; + } + } + if (errdes != STDERR_FILE_NO) + { + if (close (errdes) < 0) + { + *err = errno; + *errmsg = "close"; + return (pid_t) -1; + } + } + + return pid; + } +} + +/* Wait for a child process to complete. */ + +static int +pex_unix_wait (struct pex_obj *obj, pid_t pid, int *status, + struct pex_time *time, int done, const char **errmsg, + int *err) +{ + /* If we are cleaning up when the caller didn't retrieve process + status for some reason, encourage the process to go away. */ + if (done) + kill (pid, SIGTERM); + + if (pex_wait (obj, pid, status, time) < 0) + { + *err = errno; + *errmsg = "wait"; + return -1; + } + + return 0; +} + +/* Create a pipe. */ + +static int +pex_unix_pipe (struct pex_obj *obj ATTRIBUTE_UNUSED, int *p, + int binary ATTRIBUTE_UNUSED) +{ + return pipe (p); +} + +/* Get a FILE pointer to read from a file descriptor. */ + +static FILE * +pex_unix_fdopenr (struct pex_obj *obj ATTRIBUTE_UNUSED, int fd, + int binary ATTRIBUTE_UNUSED) +{ + return fdopen (fd, "r"); +} + +static FILE * +pex_unix_fdopenw (struct pex_obj *obj ATTRIBUTE_UNUSED, int fd, + int binary ATTRIBUTE_UNUSED) +{ + if (fcntl (fd, F_SETFD, FD_CLOEXEC) < 0) + return NULL; + return fdopen (fd, "w"); +} + +static void +pex_unix_cleanup (struct pex_obj *obj ATTRIBUTE_UNUSED) +{ +#if !defined (HAVE_WAIT4) && !defined (HAVE_WAITPID) + while (obj->sysdep != NULL) + { + struct status_list *this; + struct status_list *next; + + this = (struct status_list *) obj->sysdep; + next = this->next; + free (this); + obj->sysdep = (void *) next; + } +#endif +} diff --git a/libiberty/pex-win32.c b/libiberty/pex-win32.c new file mode 100644 index 0000000..05d44e9 --- /dev/null +++ b/libiberty/pex-win32.c @@ -0,0 +1,889 @@ +/* Utilities to execute a program in a subprocess (possibly linked by pipes + with other subprocesses), and wait for it. Generic Win32 specialization. + Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006 + Free Software Foundation, Inc. + +This file is part of the libiberty library. +Libiberty is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +Libiberty 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with libiberty; see the file COPYING.LIB. If not, +write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +#include "pex-common.h" + +#include + +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_SYS_WAIT_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +/* mingw32 headers may not define the following. */ + +#ifndef _P_WAIT +# define _P_WAIT 0 +# define _P_NOWAIT 1 +# define _P_OVERLAY 2 +# define _P_NOWAITO 3 +# define _P_DETACH 4 + +# define WAIT_CHILD 0 +# define WAIT_GRANDCHILD 1 +#endif + +#define MINGW_NAME "Minimalist GNU for Windows" +#define MINGW_NAME_LEN (sizeof(MINGW_NAME) - 1) + +extern char *stpcpy (char *dst, const char *src); + +/* Ensure that the executable pathname uses Win32 backslashes. This + is not necessary on NT, but on W9x, forward slashes causes + failure of spawn* and exec* functions (and probably any function + that calls CreateProcess) *iff* the executable pathname (argv[0]) + is a quoted string. And quoting is necessary in case a pathname + contains embedded white space. You can't win. */ +static void +backslashify (char *s) +{ + while ((s = strchr (s, '/')) != NULL) + *s = '\\'; + return; +} + +static int pex_win32_open_read (struct pex_obj *, const char *, int); +static int pex_win32_open_write (struct pex_obj *, const char *, int); +static pid_t pex_win32_exec_child (struct pex_obj *, int, const char *, + char * const *, char * const *, + int, int, int, int, + const char **, int *); +static int pex_win32_close (struct pex_obj *, int); +static int pex_win32_wait (struct pex_obj *, pid_t, int *, + struct pex_time *, int, const char **, int *); +static int pex_win32_pipe (struct pex_obj *, int *, int); +static FILE *pex_win32_fdopenr (struct pex_obj *, int, int); +static FILE *pex_win32_fdopenw (struct pex_obj *, int, int); + +/* The list of functions we pass to the common routines. */ + +const struct pex_funcs funcs = +{ + pex_win32_open_read, + pex_win32_open_write, + pex_win32_exec_child, + pex_win32_close, + pex_win32_wait, + pex_win32_pipe, + pex_win32_fdopenr, + pex_win32_fdopenw, + NULL /* cleanup */ +}; + +/* Return a newly initialized pex_obj structure. */ + +struct pex_obj * +pex_init (int flags, const char *pname, const char *tempbase) +{ + return pex_init_common (flags, pname, tempbase, &funcs); +} + +/* Open a file for reading. */ + +static int +pex_win32_open_read (struct pex_obj *obj ATTRIBUTE_UNUSED, const char *name, + int binary) +{ + return _open (name, _O_RDONLY | (binary ? _O_BINARY : _O_TEXT)); +} + +/* Open a file for writing. */ + +static int +pex_win32_open_write (struct pex_obj *obj ATTRIBUTE_UNUSED, const char *name, + int binary) +{ + /* Note that we can't use O_EXCL here because gcc may have already + created the temporary file via make_temp_file. */ + return _open (name, + (_O_WRONLY | _O_CREAT | _O_TRUNC + | (binary ? _O_BINARY : _O_TEXT)), + _S_IREAD | _S_IWRITE); +} + +/* Close a file. */ + +static int +pex_win32_close (struct pex_obj *obj ATTRIBUTE_UNUSED, int fd) +{ + return _close (fd); +} + +#ifdef USE_MINGW_MSYS +static const char *mingw_keys[] = {"SOFTWARE", "Microsoft", "Windows", "CurrentVersion", "Uninstall", NULL}; + +/* Tack the executable on the end of a (possibly slash terminated) buffer + and convert everything to \. */ +static const char * +tack_on_executable (char *buf, const char *executable) +{ + char *p = strchr (buf, '\0'); + if (p > buf && (p[-1] == '\\' || p[-1] == '/')) + p[-1] = '\0'; + backslashify (strcat (buf, executable)); + return buf; +} + +/* Walk down a registry hierarchy until the end. Return the key. */ +static HKEY +openkey (HKEY hStart, const char *keys[]) +{ + HKEY hKey, hTmp; + for (hKey = hStart; *keys; keys++) + { + LONG res; + hTmp = hKey; + res = RegOpenKey (hTmp, *keys, &hKey); + + if (hTmp != HKEY_LOCAL_MACHINE) + RegCloseKey (hTmp); + + if (res != ERROR_SUCCESS) + return NULL; + } + return hKey; +} + +/* Return the "mingw root" as derived from the mingw uninstall information. */ +static const char * +mingw_rootify (const char *executable) +{ + HKEY hKey, hTmp; + DWORD maxlen; + char *namebuf, *foundbuf; + DWORD i; + LONG res; + + /* Open the uninstall "directory". */ + hKey = openkey (HKEY_LOCAL_MACHINE, mingw_keys); + + /* Not found. */ + if (!hKey) + return executable; + + /* Need to enumerate all of the keys here looking for one the most recent + one for MinGW. */ + if (RegQueryInfoKey (hKey, NULL, NULL, NULL, NULL, &maxlen, NULL, NULL, + NULL, NULL, NULL, NULL) != ERROR_SUCCESS) + { + RegCloseKey (hKey); + return executable; + } + namebuf = XNEWVEC (char, ++maxlen); + foundbuf = XNEWVEC (char, maxlen); + foundbuf[0] = '\0'; + if (!namebuf || !foundbuf) + { + RegCloseKey (hKey); + if (namebuf) + free (namebuf); + if (foundbuf) + free (foundbuf); + return executable; + } + + /* Look through all of the keys for one that begins with Minimal GNU... + Try to get the latest version by doing a string compare although that + string never really works with version number sorting. */ + for (i = 0; RegEnumKey (hKey, i, namebuf, maxlen) == ERROR_SUCCESS; i++) + { + int match = strcasecmp (namebuf, MINGW_NAME); + if (match < 0) + continue; + if (match > 0 && strncasecmp (namebuf, MINGW_NAME, MINGW_NAME_LEN) > 0) + continue; + if (strcasecmp (namebuf, foundbuf) > 0) + strcpy (foundbuf, namebuf); + } + free (namebuf); + + /* If foundbuf is empty, we didn't find anything. Punt. */ + if (!foundbuf[0]) + { + free (foundbuf); + RegCloseKey (hKey); + return executable; + } + + /* Open the key that we wanted */ + res = RegOpenKey (hKey, foundbuf, &hTmp); + RegCloseKey (hKey); + free (foundbuf); + + /* Don't know why this would fail, but you gotta check */ + if (res != ERROR_SUCCESS) + return executable; + + maxlen = 0; + /* Get the length of the value pointed to by InstallLocation */ + if (RegQueryValueEx (hTmp, "InstallLocation", 0, NULL, NULL, + &maxlen) != ERROR_SUCCESS || maxlen == 0) + { + RegCloseKey (hTmp); + return executable; + } + + /* Allocate space for the install location */ + foundbuf = XNEWVEC (char, maxlen + strlen (executable)); + if (!foundbuf) + { + free (foundbuf); + RegCloseKey (hTmp); + } + + /* Read the install location into the buffer */ + res = RegQueryValueEx (hTmp, "InstallLocation", 0, NULL, (LPBYTE) foundbuf, + &maxlen); + RegCloseKey (hTmp); + if (res != ERROR_SUCCESS) + { + free (foundbuf); + return executable; + } + + /* Concatenate the install location and the executable, turn all slashes + to backslashes, and return that. */ + return tack_on_executable (foundbuf, executable); +} + +/* Read the install location of msys from it's installation file and + rootify the executable based on that. */ +static const char * +msys_rootify (const char *executable) +{ + size_t bufsize = 64; + size_t execlen = strlen (executable) + 1; + char *buf; + DWORD res = 0; + for (;;) + { + buf = XNEWVEC (char, bufsize + execlen); + if (!buf) + break; + res = GetPrivateProfileString ("InstallSettings", "InstallPath", NULL, + buf, bufsize, "msys.ini"); + if (!res) + break; + if (strlen (buf) < bufsize) + break; + res = 0; + free (buf); + bufsize *= 2; + if (bufsize > 65536) + { + buf = NULL; + break; + } + } + + if (res) + return tack_on_executable (buf, executable); + + /* failed */ + if (buf) + free (buf); + return executable; +} +#endif + +/* Return a Windows command-line from ARGV. It is the caller's + responsibility to free the string returned. */ + +static char * +argv_to_cmdline (char *const *argv) +{ + char *cmdline; + char *p; + size_t cmdline_len; + int i, j, k; + + cmdline_len = 0; + for (i = 0; argv[i]; i++) + { + /* We quote every last argument. This simplifies the problem; + we need only escape embedded double-quotes and immediately + preceeding backslash characters. A sequence of backslach characters + that is not follwed by a double quote character will not be + escaped. */ + for (j = 0; argv[i][j]; j++) + { + if (argv[i][j] == '"') + { + /* Escape preceeding backslashes. */ + for (k = j - 1; k >= 0 && argv[i][k] == '\\'; k--) + cmdline_len++; + /* Escape the qote character. */ + cmdline_len++; + } + } + /* Trailing backslashes also need to be escaped because they will be + followed by the terminating quote. */ + for (k = j - 1; k >= 0 && argv[i][k] == '\\'; k--) + cmdline_len++; + cmdline_len += j; + cmdline_len += 3; /* for leading and trailing quotes and space */ + } + cmdline = XNEWVEC (char, cmdline_len); + p = cmdline; + for (i = 0; argv[i]; i++) + { + *p++ = '"'; + for (j = 0; argv[i][j]; j++) + { + if (argv[i][j] == '"') + { + for (k = j - 1; k >= 0 && argv[i][k] == '\\'; k--) + *p++ = '\\'; + *p++ = '\\'; + } + *p++ = argv[i][j]; + } + for (k = j - 1; k >= 0 && argv[i][k] == '\\'; k--) + *p++ = '\\'; + *p++ = '"'; + *p++ = ' '; + } + p[-1] = '\0'; + return cmdline; +} + +/* We'll try the passed filename with all the known standard + extensions, and then without extension. We try no extension + last so that we don't try to run some random extension-less + file that might be hanging around. We try both extension + and no extension so that we don't need any fancy logic + to determine if a file has extension. */ +static const char *const +std_suffixes[] = { + ".com", + ".exe", + ".bat", + ".cmd", + "", + 0 +}; + +/* Returns the full path to PROGRAM. If SEARCH is true, look for + PROGRAM in each directory in PATH. */ + +static char * +find_executable (const char *program, BOOL search) +{ + char *full_executable; + char *e; + size_t fe_len; + const char *path = 0; + const char *const *ext; + const char *p, *q; + size_t proglen = strlen (program); + int has_slash = (strchr (program, '/') || strchr (program, '\\')); + HANDLE h; + + if (has_slash) + search = FALSE; + + if (search) + path = getenv ("PATH"); + if (!path) + path = ""; + + fe_len = 0; + for (p = path; *p; p = q) + { + q = p; + while (*q != ';' && *q != '\0') + q++; + if ((size_t)(q - p) > fe_len) + fe_len = q - p; + if (*q == ';') + q++; + } + fe_len = fe_len + 1 + proglen + 5 /* space for extension */; + full_executable = XNEWVEC (char, fe_len); + + p = path; + do + { + q = p; + while (*q != ';' && *q != '\0') + q++; + + e = full_executable; + memcpy (e, p, q - p); + e += (q - p); + if (q - p) + *e++ = '\\'; + strcpy (e, program); + + if (*q == ';') + q++; + + for (e = full_executable; *e; e++) + if (*e == '/') + *e = '\\'; + + /* At this point, e points to the terminating NUL character for + full_executable. */ + for (ext = std_suffixes; *ext; ext++) + { + /* Remove any current extension. */ + *e = '\0'; + /* Add the new one. */ + strcat (full_executable, *ext); + + /* Attempt to open this file. */ + h = CreateFile (full_executable, GENERIC_READ, + FILE_SHARE_READ | FILE_SHARE_WRITE, + 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); + if (h != INVALID_HANDLE_VALUE) + goto found; + } + p = q; + } + while (*p); + free (full_executable); + return 0; + + found: + CloseHandle (h); + return full_executable; +} + +/* Low-level process creation function and helper. */ + +static int +env_compare (const void *a_ptr, const void *b_ptr) +{ + const char *a; + const char *b; + unsigned char c1; + unsigned char c2; + + a = *(const char **) a_ptr; + b = *(const char **) b_ptr; + + /* a and b will be of the form: VAR=VALUE + We compare only the variable name part here using a case-insensitive + comparison algorithm. It might appear that in fact strcasecmp () can + take the place of this whole function, and indeed it could, save for + the fact that it would fail in cases such as comparing A1=foo and + A=bar (because 1 is less than = in the ASCII character set). + (Environment variables containing no numbers would work in such a + scenario.) */ + + do + { + c1 = (unsigned char) tolower (*a++); + c2 = (unsigned char) tolower (*b++); + + if (c1 == '=') + c1 = '\0'; + + if (c2 == '=') + c2 = '\0'; + } + while (c1 == c2 && c1 != '\0'); + + return c1 - c2; +} + +static pid_t +win32_spawn (const char *executable, + BOOL search, + char *const *argv, + char *const *env, /* array of strings of the form: VAR=VALUE */ + DWORD dwCreationFlags, + LPSTARTUPINFO si, + LPPROCESS_INFORMATION pi) +{ + char *full_executable; + char *cmdline; + char **env_copy; + char *env_block = NULL; + + full_executable = NULL; + cmdline = NULL; + + if (env) + { + int env_size; + + /* Count the number of environment bindings supplied. */ + for (env_size = 0; env[env_size]; env_size++) + continue; + + /* Assemble an environment block, if required. This consists of + VAR=VALUE strings juxtaposed (with one null character between each + pair) and an additional null at the end. */ + if (env_size > 0) + { + int var; + int total_size = 1; /* 1 is for the final null. */ + char *bufptr; + + /* Windows needs the members of the block to be sorted by variable + name. */ + env_copy = (char **) alloca (sizeof (char *) * env_size); + memcpy (env_copy, env, sizeof (char *) * env_size); + qsort (env_copy, env_size, sizeof (char *), env_compare); + + for (var = 0; var < env_size; var++) + total_size += strlen (env[var]) + 1; + + env_block = XNEWVEC (char, total_size); + bufptr = env_block; + for (var = 0; var < env_size; var++) + bufptr = stpcpy (bufptr, env_copy[var]) + 1; + + *bufptr = '\0'; + } + } + + full_executable = find_executable (executable, search); + if (!full_executable) + goto error; + cmdline = argv_to_cmdline (argv); + if (!cmdline) + goto error; + + /* Create the child process. */ + if (!CreateProcess (full_executable, cmdline, + /*lpProcessAttributes=*/NULL, + /*lpThreadAttributes=*/NULL, + /*bInheritHandles=*/TRUE, + dwCreationFlags, + (LPVOID) env_block, + /*lpCurrentDirectory=*/NULL, + si, + pi)) + { + if (env_block) + free (env_block); + + free (full_executable); + + return (pid_t) -1; + } + + /* Clean up. */ + CloseHandle (pi->hThread); + free (full_executable); + if (env_block) + free (env_block); + + return (pid_t) pi->hProcess; + + error: + if (env_block) + free (env_block); + if (cmdline) + free (cmdline); + if (full_executable) + free (full_executable); + + return (pid_t) -1; +} + +static pid_t +spawn_script (const char *executable, char *const *argv, + char* const *env, + DWORD dwCreationFlags, + LPSTARTUPINFO si, + LPPROCESS_INFORMATION pi) +{ + pid_t pid = (pid_t) -1; + int save_errno = errno; + int fd = _open (executable, _O_RDONLY); + + if (fd >= 0) + { + char buf[MAX_PATH + 5]; + int len = _read (fd, buf, sizeof (buf) - 1); + _close (fd); + if (len > 3) + { + char *eol; + buf[len] = '\0'; + eol = strchr (buf, '\n'); + if (eol && strncmp (buf, "#!", 2) == 0) + { + char *executable1; + const char ** avhere = (const char **) --argv; + do + *eol = '\0'; + while (*--eol == '\r' || *eol == ' ' || *eol == '\t'); + for (executable1 = buf + 2; *executable1 == ' ' || *executable1 == '\t'; executable1++) + continue; + + backslashify (executable1); + *avhere = executable1; +#ifndef USE_MINGW_MSYS + executable = strrchr (executable1, '\\') + 1; + if (!executable) + executable = executable1; + pid = win32_spawn (executable, TRUE, argv, env, + dwCreationFlags, si, pi); +#else + if (strchr (executable1, '\\') == NULL) + pid = win32_spawn (executable1, TRUE, argv, env, + dwCreationFlags, si, pi); + else if (executable1[0] != '\\') + pid = win32_spawn (executable1, FALSE, argv, env, + dwCreationFlags, si, pi); + else + { + const char *newex = mingw_rootify (executable1); + *avhere = newex; + pid = win32_spawn (newex, FALSE, argv, env, + dwCreationFlags, si, pi); + if (executable1 != newex) + free ((char *) newex); + if ((long) pid < 0) + { + newex = msys_rootify (executable1); + if (newex != executable1) + { + *avhere = newex; + pid = win32_spawn (newex, FALSE, argv, env, + dwCreationFlags, si, pi); + free ((char *) newex); + } + } + } +#endif + } + } + } + if ((long) pid < 0) + errno = save_errno; + return pid; +} + +/* Execute a child. */ + +static pid_t +pex_win32_exec_child (struct pex_obj *obj ATTRIBUTE_UNUSED, int flags, + const char *executable, char * const * argv, + char* const* env, + int in, int out, int errdes, + int toclose ATTRIBUTE_UNUSED, + const char **errmsg, + int *err) +{ + pid_t pid; + HANDLE stdin_handle; + HANDLE stdout_handle; + HANDLE stderr_handle; + DWORD dwCreationFlags; + OSVERSIONINFO version_info; + STARTUPINFO si; + PROCESS_INFORMATION pi; + + stdin_handle = INVALID_HANDLE_VALUE; + stdout_handle = INVALID_HANDLE_VALUE; + stderr_handle = INVALID_HANDLE_VALUE; + + stdin_handle = (HANDLE) _get_osfhandle (in); + stdout_handle = (HANDLE) _get_osfhandle (out); + if (!(flags & PEX_STDERR_TO_STDOUT)) + stderr_handle = (HANDLE) _get_osfhandle (errdes); + else + stderr_handle = stdout_handle; + + /* Determine the version of Windows we are running on. */ + version_info.dwOSVersionInfoSize = sizeof (version_info); + GetVersionEx (&version_info); + if (version_info.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) + /* On Windows 95/98/ME the CREATE_NO_WINDOW flag is not + supported, so we cannot avoid creating a console window. */ + dwCreationFlags = 0; + else + { + HANDLE conout_handle; + + /* Determine whether or not we have an associated console. */ + conout_handle = CreateFile("CONOUT$", + GENERIC_WRITE, + FILE_SHARE_WRITE, + /*lpSecurityAttributes=*/NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + /*hTemplateFile=*/NULL); + if (conout_handle == INVALID_HANDLE_VALUE) + /* There is no console associated with this process. Since + the child is a console process, the OS would normally + create a new console Window for the child. Since we'll be + redirecting the child's standard streams, we do not need + the console window. */ + dwCreationFlags = CREATE_NO_WINDOW; + else + { + /* There is a console associated with the process, so the OS + will not create a new console. And, if we use + CREATE_NO_WINDOW in this situation, the child will have + no associated console. Therefore, if the child's + standard streams are connected to the console, the output + will be discarded. */ + CloseHandle(conout_handle); + dwCreationFlags = 0; + } + } + + /* Since the child will be a console process, it will, by default, + connect standard input/output to its console. However, we want + the child to use the handles specifically designated above. In + addition, if there is no console (such as when we are running in + a Cygwin X window), then we must redirect the child's + input/output, as there is no console for the child to use. */ + memset (&si, 0, sizeof (si)); + si.cb = sizeof (si); + si.dwFlags = STARTF_USESTDHANDLES; + si.hStdInput = stdin_handle; + si.hStdOutput = stdout_handle; + si.hStdError = stderr_handle; + + /* Create the child process. */ + pid = win32_spawn (executable, (flags & PEX_SEARCH) != 0, + argv, env, dwCreationFlags, &si, &pi); + if (pid == (pid_t) -1) + pid = spawn_script (executable, argv, env, dwCreationFlags, + &si, &pi); + if (pid == (pid_t) -1) + { + *err = ENOENT; + *errmsg = "CreateProcess"; + } + + /* Close the standard output and standard error handles in the + parent. */ + if (out != STDOUT_FILENO) + obj->funcs->close (obj, out); + if (errdes != STDERR_FILENO) + obj->funcs->close (obj, errdes); + + return pid; +} + +/* Wait for a child process to complete. MS CRTDLL doesn't return + enough information in status to decide if the child exited due to a + signal or not, rather it simply returns an integer with the exit + code of the child; eg., if the child exited with an abort() call + and didn't have a handler for SIGABRT, it simply returns with + status == 3. We fix the status code to conform to the usual WIF* + macros. Note that WIFSIGNALED will never be true under CRTDLL. */ + +static int +pex_win32_wait (struct pex_obj *obj ATTRIBUTE_UNUSED, pid_t pid, + int *status, struct pex_time *time, int done ATTRIBUTE_UNUSED, + const char **errmsg, int *err) +{ + DWORD termstat; + HANDLE h; + + if (time != NULL) + memset (time, 0, sizeof *time); + + h = (HANDLE) pid; + + /* FIXME: If done is non-zero, we should probably try to kill the + process. */ + if (WaitForSingleObject (h, INFINITE) != WAIT_OBJECT_0) + { + CloseHandle (h); + *err = ECHILD; + *errmsg = "WaitForSingleObject"; + return -1; + } + + GetExitCodeProcess (h, &termstat); + CloseHandle (h); + + /* A value of 3 indicates that the child caught a signal, but not + which one. Since only SIGABRT, SIGFPE and SIGINT do anything, we + report SIGABRT. */ + if (termstat == 3) + *status = SIGABRT; + else + *status = (termstat & 0xff) << 8; + + return 0; +} + +/* Create a pipe. */ + +static int +pex_win32_pipe (struct pex_obj *obj ATTRIBUTE_UNUSED, int *p, + int binary) +{ + return _pipe (p, 256, binary ? _O_BINARY : _O_TEXT); +} + +/* Get a FILE pointer to read from a file descriptor. */ + +static FILE * +pex_win32_fdopenr (struct pex_obj *obj ATTRIBUTE_UNUSED, int fd, + int binary) +{ + return fdopen (fd, binary ? "rb" : "r"); +} + +static FILE * +pex_win32_fdopenw (struct pex_obj *obj ATTRIBUTE_UNUSED, int fd, + int binary) +{ + HANDLE h = (HANDLE) _get_osfhandle (fd); + if (h == INVALID_HANDLE_VALUE) + return NULL; + if (! SetHandleInformation (h, HANDLE_FLAG_INHERIT, 0)) + return NULL; + return fdopen (fd, binary ? "wb" : "w"); +} + +#ifdef MAIN +#include + +int +main (int argc ATTRIBUTE_UNUSED, char **argv) +{ + char const *errmsg; + int err; + argv++; + printf ("%ld\n", (long) pex_win32_exec_child (NULL, PEX_SEARCH, argv[0], argv, NULL, 0, 0, 1, 2, &errmsg, &err)); + exit (0); +} +#endif diff --git a/libiberty/pexecute.c b/libiberty/pexecute.c new file mode 100644 index 0000000..97f1574 --- /dev/null +++ b/libiberty/pexecute.c @@ -0,0 +1,124 @@ +/* Utilities to execute a program in a subprocess (possibly linked by pipes + with other subprocesses), and wait for it. + Copyright (C) 2004 Free Software Foundation, Inc. + +This file is part of the libiberty library. +Libiberty is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +Libiberty 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with libiberty; see the file COPYING.LIB. If not, +write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +/* pexecute is an old routine. This implementation uses the newer + pex_init/pex_run/pex_get_status/pex_free routines. Don't use + pexecute in new code. Use the newer routines instead. */ + +#include "config.h" +#include "libiberty.h" + +#ifdef HAVE_STDLIB_H +#include +#endif + +/* We only permit a single pexecute chain to execute at a time. This + was always true anyhow, though it wasn't documented. */ + +static struct pex_obj *pex; +static int idx; + +int +pexecute (const char *program, char * const *argv, const char *pname, + const char *temp_base, char **errmsg_fmt, char **errmsg_arg, + int flags) +{ + const char *errmsg; + int err; + + if ((flags & PEXECUTE_FIRST) != 0) + { + if (pex != NULL) + { + *errmsg_fmt = (char *) "pexecute already in progress"; + *errmsg_arg = NULL; + return -1; + } + pex = pex_init (PEX_USE_PIPES, pname, temp_base); + idx = 0; + } + else + { + if (pex == NULL) + { + *errmsg_fmt = (char *) "pexecute not in progress"; + *errmsg_arg = NULL; + return -1; + } + } + + errmsg = pex_run (pex, + (((flags & PEXECUTE_LAST) != 0 ? PEX_LAST : 0) + | ((flags & PEXECUTE_SEARCH) != 0 ? PEX_SEARCH : 0)), + program, argv, NULL, NULL, &err); + if (errmsg != NULL) + { + *errmsg_fmt = (char *) errmsg; + *errmsg_arg = NULL; + return -1; + } + + /* Instead of a PID, we just return a one-based index into the + status values. We avoid zero just because the old pexecute would + never return it. */ + return ++idx; +} + +int +pwait (int pid, int *status, int flags ATTRIBUTE_UNUSED) +{ + /* The PID returned by pexecute is one-based. */ + --pid; + + if (pex == NULL || pid < 0 || pid >= idx) + return -1; + + if (pid == 0 && idx == 1) + { + if (!pex_get_status (pex, 1, status)) + return -1; + } + else + { + int *vector; + + vector = XNEWVEC (int, idx); + if (!pex_get_status (pex, idx, vector)) + { + free (vector); + return -1; + } + *status = vector[pid]; + free (vector); + } + + /* Assume that we are done after the caller has retrieved the last + exit status. The original implementation did not require that + the exit statuses be retrieved in order, but this implementation + does. */ + if (pid + 1 == idx) + { + pex_free (pex); + pex = NULL; + idx = 0; + } + + return pid + 1; +} diff --git a/libiberty/pexecute.txh b/libiberty/pexecute.txh new file mode 100644 index 0000000..8baf9a0 --- /dev/null +++ b/libiberty/pexecute.txh @@ -0,0 +1,298 @@ +@c -*- mode: texinfo -*- +@deftypefn Extension {struct pex_obj *} pex_init (int @var{flags}, const char *@var{pname}, const char *@var{tempbase}) + +Prepare to execute one or more programs, with standard output of each +program fed to standard input of the next. This is a system +independent interface to execute a pipeline. + +@var{flags} is a bitwise combination of the following: + +@table @code + +@vindex PEX_RECORD_TIMES +@item PEX_RECORD_TIMES +Record subprocess times if possible. + +@vindex PEX_USE_PIPES +@item PEX_USE_PIPES +Use pipes for communication between processes, if possible. + +@vindex PEX_SAVE_TEMPS +@item PEX_SAVE_TEMPS +Don't delete temporary files used for communication between +processes. + +@end table + +@var{pname} is the name of program to be executed, used in error +messages. @var{tempbase} is a base name to use for any required +temporary files; it may be @code{NULL} to use a randomly chosen name. + +@end deftypefn + +@deftypefn Extension {const char *} pex_run (struct pex_obj *@var{obj}, int @var{flags}, const char *@var{executable}, char * const *@var{argv}, const char *@var{outname}, const char *@var{errname}, int *@var{err}) + +Execute one program in a pipeline. On success this returns +@code{NULL}. On failure it returns an error message, a statically +allocated string. + +@var{obj} is returned by a previous call to @code{pex_init}. + +@var{flags} is a bitwise combination of the following: + +@table @code + +@vindex PEX_LAST +@item PEX_LAST +This must be set on the last program in the pipeline. In particular, +it should be set when executing a single program. The standard output +of the program will be sent to @var{outname}, or, if @var{outname} is +@code{NULL}, to the standard output of the calling program. Do @emph{not} +set this bit if you want to call @code{pex_read_output} +(described below). After a call to @code{pex_run} with this bit set, +@var{pex_run} may no longer be called with the same @var{obj}. + +@vindex PEX_SEARCH +@item PEX_SEARCH +Search for the program using the user's executable search path. + +@vindex PEX_SUFFIX +@item PEX_SUFFIX +@var{outname} is a suffix. See the description of @var{outname}, +below. + +@vindex PEX_STDERR_TO_STDOUT +@item PEX_STDERR_TO_STDOUT +Send the program's standard error to standard output, if possible. + +@vindex PEX_BINARY_INPUT +@vindex PEX_BINARY_OUTPUT +@vindex PEX_BINARY_ERROR +@item PEX_BINARY_INPUT +@itemx PEX_BINARY_OUTPUT +@itemx PEX_BINARY_ERROR +The standard input (output or error) of the program should be read (written) in +binary mode rather than text mode. These flags are ignored on systems +which do not distinguish binary mode and text mode, such as Unix. For +proper behavior these flags should match appropriately---a call to +@code{pex_run} using @code{PEX_BINARY_OUTPUT} should be followed by a +call using @code{PEX_BINARY_INPUT}. + +@vindex PEX_STDERR_TO_PIPE +@item PEX_STDERR_TO_PIPE +Send the program's standard error to a pipe, if possible. This flag +cannot be specified together with @code{PEX_STDERR_TO_STDOUT}. This +flag can be specified only on the last program in pipeline. + +@end table + +@var{executable} is the program to execute. @var{argv} is the set of +arguments to pass to the program; normally @code{@var{argv}[0]} will +be a copy of @var{executable}. + +@var{outname} is used to set the name of the file to use for standard +output. There are two cases in which no output file will be used: + +@enumerate +@item +if @code{PEX_LAST} is not set in @var{flags}, and @code{PEX_USE_PIPES} +was set in the call to @code{pex_init}, and the system supports pipes + +@item +if @code{PEX_LAST} is set in @var{flags}, and @var{outname} is +@code{NULL} +@end enumerate + +@noindent +Otherwise the code will use a file to hold standard +output. If @code{PEX_LAST} is not set, this file is considered to be +a temporary file, and it will be removed when no longer needed, unless +@code{PEX_SAVE_TEMPS} was set in the call to @code{pex_init}. + +There are two cases to consider when setting the name of the file to +hold standard output. + +@enumerate +@item +@code{PEX_SUFFIX} is set in @var{flags}. In this case +@var{outname} may not be @code{NULL}. If the @var{tempbase} parameter +to @code{pex_init} was not @code{NULL}, then the output file name is +the concatenation of @var{tempbase} and @var{outname}. If +@var{tempbase} was @code{NULL}, then the output file name is a random +file name ending in @var{outname}. + +@item +@code{PEX_SUFFIX} was not set in @var{flags}. In this +case, if @var{outname} is not @code{NULL}, it is used as the output +file name. If @var{outname} is @code{NULL}, and @var{tempbase} was +not NULL, the output file name is randomly chosen using +@var{tempbase}. Otherwise the output file name is chosen completely +at random. +@end enumerate + +@var{errname} is the file name to use for standard error output. If +it is @code{NULL}, standard error is the same as the caller's. +Otherwise, standard error is written to the named file. + +On an error return, the code sets @code{*@var{err}} to an @code{errno} +value, or to 0 if there is no relevant @code{errno}. + +@end deftypefn + +@deftypefn Extension {const char *} pex_run_in_environment (struct pex_obj *@var{obj}, int @var{flags}, const char *@var{executable}, char * const *@var{argv}, char * const *@var{env}, int @var{env_size}, const char *@var{outname}, const char *@var{errname}, int *@var{err}) + +Execute one program in a pipeline, permitting the environment for the +program to be specified. Behaviour and parameters not listed below are +as for @code{pex_run}. + +@var{env} is the environment for the child process, specified as an array of +character pointers. Each element of the array should point to a string of the +form @code{VAR=VALUE}, with the exception of the last element that must be +@code{NULL}. + +@end deftypefn + +@deftypefn Extension {FILE *} pex_input_file (struct pex_obj *@var{obj}, int @var{flags}, const char *@var{in_name}) + +Return a stream for a temporary file to pass to the first program in +the pipeline as input. + +The name of the input file is chosen according to the same rules +@code{pex_run} uses to choose output file names, based on +@var{in_name}, @var{obj} and the @code{PEX_SUFFIX} bit in @var{flags}. + +Don't call @code{fclose} on the returned stream; the first call to +@code{pex_run} closes it automatically. + +If @var{flags} includes @code{PEX_BINARY_OUTPUT}, open the stream in +binary mode; otherwise, open it in the default mode. Including +@code{PEX_BINARY_OUTPUT} in @var{flags} has no effect on Unix. +@end deftypefn + +@deftypefn Extension {FILE *} pex_input_pipe (struct pex_obj *@var{obj}, int @var{binary}) + +Return a stream @var{fp} for a pipe connected to the standard input of +the first program in the pipeline; @var{fp} is opened for writing. +You must have passed @code{PEX_USE_PIPES} to the @code{pex_init} call +that returned @var{obj}. + +You must close @var{fp} using @code{fclose} yourself when you have +finished writing data to the pipeline. + +The file descriptor underlying @var{fp} is marked not to be inherited +by child processes. + +On systems that do not support pipes, this function returns +@code{NULL}, and sets @code{errno} to @code{EINVAL}. If you would +like to write code that is portable to all systems the @code{pex} +functions support, consider using @code{pex_input_file} instead. + +There are two opportunities for deadlock using +@code{pex_input_pipe}: + +@itemize @bullet +@item +Most systems' pipes can buffer only a fixed amount of data; a process +that writes to a full pipe blocks. Thus, if you write to @file{fp} +before starting the first process, you run the risk of blocking when +there is no child process yet to read the data and allow you to +continue. @code{pex_input_pipe} makes no promises about the +size of the pipe's buffer, so if you need to write any data at all +before starting the first process in the pipeline, consider using +@code{pex_input_file} instead. + +@item +Using @code{pex_input_pipe} and @code{pex_read_output} together +may also cause deadlock. If the output pipe fills up, so that each +program in the pipeline is waiting for the next to read more data, and +you fill the input pipe by writing more data to @var{fp}, then there +is no way to make progress: the only process that could read data from +the output pipe is you, but you are blocked on the input pipe. + +@end itemize + +@end deftypefn + +@deftypefn Extension {FILE *} pex_read_output (struct pex_obj *@var{obj}, int @var{binary}) + +Returns a @code{FILE} pointer which may be used to read the standard +output of the last program in the pipeline. When this is used, +@code{PEX_LAST} should not be used in a call to @code{pex_run}. After +this is called, @code{pex_run} may no longer be called with the same +@var{obj}. @var{binary} should be non-zero if the file should be +opened in binary mode. Don't call @code{fclose} on the returned file; +it will be closed by @code{pex_free}. + +@end deftypefn + +@deftypefn Extension {FILE *} pex_read_err (struct pex_obj *@var{obj}, int @var{binary}) + +Returns a @code{FILE} pointer which may be used to read the standard +error of the last program in the pipeline. When this is used, +@code{PEX_LAST} should not be used in a call to @code{pex_run}. After +this is called, @code{pex_run} may no longer be called with the same +@var{obj}. @var{binary} should be non-zero if the file should be +opened in binary mode. Don't call @code{fclose} on the returned file; +it will be closed by @code{pex_free}. + +@end deftypefn + + +@deftypefn Extension int pex_get_status (struct pex_obj *@var{obj}, int @var{count}, int *@var{vector}) + +Returns the exit status of all programs run using @var{obj}. +@var{count} is the number of results expected. The results will be +placed into @var{vector}. The results are in the order of the calls +to @code{pex_run}. Returns 0 on error, 1 on success. + +@end deftypefn + +@deftypefn Extension int pex_get_times (struct pex_obj *@var{obj}, int @var{count}, struct pex_time *@var{vector}) + +Returns the process execution times of all programs run using +@var{obj}. @var{count} is the number of results expected. The +results will be placed into @var{vector}. The results are in the +order of the calls to @code{pex_run}. Returns 0 on error, 1 on +success. + +@code{struct pex_time} has the following fields of the type +@code{unsigned long}: @code{user_seconds}, +@code{user_microseconds}, @code{system_seconds}, +@code{system_microseconds}. On systems which do not support reporting +process times, all the fields will be set to @code{0}. + +@end deftypefn + +@deftypefn Extension void pex_free (struct pex_obj @var{obj}) + +Clean up and free all data associated with @var{obj}. If you have not +yet called @code{pex_get_times} or @code{pex_get_status}, this will +try to kill the subprocesses. + +@end deftypefn + +@deftypefn Extension {const char *} pex_one (int @var{flags}, const char *@var{executable}, char * const *@var{argv}, const char *@var{pname}, const char *@var{outname}, const char *@var{errname}, int *@var{status}, int *@var{err}) + +An interface to permit the easy execution of a +single program. The return value and most of the parameters are as +for a call to @code{pex_run}. @var{flags} is restricted to a +combination of @code{PEX_SEARCH}, @code{PEX_STDERR_TO_STDOUT}, and +@code{PEX_BINARY_OUTPUT}. @var{outname} is interpreted as if +@code{PEX_LAST} were set. On a successful return, @code{*@var{status}} will +be set to the exit status of the program. + +@end deftypefn + +@deftypefn Extension int pexecute (const char *@var{program}, char * const *@var{argv}, const char *@var{this_pname}, const char *@var{temp_base}, char **@var{errmsg_fmt}, char **@var{errmsg_arg}, int @var{flags}) + +This is the old interface to execute one or more programs. It is +still supported for compatibility purposes, but is no longer +documented. + +@end deftypefn + +@deftypefn Extension int pwait (int @var{pid}, int *@var{status}, int @var{flags}) + +Another part of the old execution interface. + +@end deftypefn diff --git a/libiberty/physmem.c b/libiberty/physmem.c new file mode 100644 index 0000000..09fbf3f --- /dev/null +++ b/libiberty/physmem.c @@ -0,0 +1,305 @@ +/* Calculate the size of physical memory. + Copyright 2000, 2001, 2003, 2004, 2005 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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* Written by Paul Eggert. */ + +#if HAVE_CONFIG_H +# include +#endif + +#if HAVE_UNISTD_H +# include +#endif + +#if HAVE_SYS_PSTAT_H +# include +#endif + +#if HAVE_SYS_SYSMP_H +# include +#endif + +#if HAVE_SYS_SYSINFO_H && HAVE_MACHINE_HAL_SYSINFO_H +# include +# include +#endif + +#if HAVE_SYS_TABLE_H +# include +#endif + +#include + +#if HAVE_SYS_PARAM_H +# include +#endif + +#if HAVE_SYS_SYSCTL_H +# include +#endif + +#if HAVE_SYS_SYSTEMCFG_H +# include +#endif + +#ifdef _WIN32 +# define WIN32_LEAN_AND_MEAN +# include +/* MEMORYSTATUSEX is missing from older windows headers, so define + a local replacement. */ +typedef struct +{ + DWORD dwLength; + DWORD dwMemoryLoad; + DWORDLONG ullTotalPhys; + DWORDLONG ullAvailPhys; + DWORDLONG ullTotalPageFile; + DWORDLONG ullAvailPageFile; + DWORDLONG ullTotalVirtual; + DWORDLONG ullAvailVirtual; + DWORDLONG ullAvailExtendedVirtual; +} lMEMORYSTATUSEX; +typedef WINBOOL (WINAPI *PFN_MS_EX) (lMEMORYSTATUSEX*); +#endif + +#include "libiberty.h" + +/* Return the total amount of physical memory. */ +double +physmem_total (void) +{ +#if defined _SC_PHYS_PAGES && defined _SC_PAGESIZE + { /* This works on linux-gnu, solaris2 and cygwin. */ + double pages = sysconf (_SC_PHYS_PAGES); + double pagesize = sysconf (_SC_PAGESIZE); + if (0 <= pages && 0 <= pagesize) + return pages * pagesize; + } +#endif + +#if HAVE_PSTAT_GETSTATIC + { /* This works on hpux11. */ + struct pst_static pss; + if (0 <= pstat_getstatic (&pss, sizeof pss, 1, 0)) + { + double pages = pss.physical_memory; + double pagesize = pss.page_size; + if (0 <= pages && 0 <= pagesize) + return pages * pagesize; + } + } +#endif + +#if HAVE_SYSMP && defined MP_SAGET && defined MPSA_RMINFO && defined _SC_PAGESIZE + { /* This works on irix6. */ + struct rminfo realmem; + if (sysmp (MP_SAGET, MPSA_RMINFO, &realmem, sizeof realmem) == 0) + { + double pagesize = sysconf (_SC_PAGESIZE); + double pages = realmem.physmem; + if (0 <= pages && 0 <= pagesize) + return pages * pagesize; + } + } +#endif + +#if HAVE_GETSYSINFO && defined GSI_PHYSMEM + { /* This works on Tru64 UNIX V4/5. */ + int physmem; + + if (getsysinfo (GSI_PHYSMEM, (caddr_t) &physmem, sizeof (physmem), + NULL, NULL, NULL) == 1) + { + double kbytes = physmem; + + if (0 <= kbytes) + return kbytes * 1024.0; + } + } +#endif + +#if HAVE_SYSCTL && defined HW_PHYSMEM + { /* This works on *bsd and darwin. */ + unsigned int physmem; + size_t len = sizeof physmem; + static int mib[2] = { CTL_HW, HW_PHYSMEM }; + + if (sysctl (mib, ARRAY_SIZE (mib), &physmem, &len, NULL, 0) == 0 + && len == sizeof (physmem)) + return (double) physmem; + } +#endif + +#if HAVE__SYSTEM_CONFIGURATION + /* This works on AIX 4.3.3+. */ + return _system_configuration.physmem; +#endif + +#if defined _WIN32 + { /* this works on windows */ + PFN_MS_EX pfnex; + HMODULE h = GetModuleHandle ("kernel32.dll"); + + if (!h) + return 0.0; + + /* Use GlobalMemoryStatusEx if available. */ + if ((pfnex = (PFN_MS_EX) GetProcAddress (h, "GlobalMemoryStatusEx"))) + { + lMEMORYSTATUSEX lms_ex; + lms_ex.dwLength = sizeof lms_ex; + if (!pfnex (&lms_ex)) + return 0.0; + return (double) lms_ex.ullTotalPhys; + } + + /* Fall back to GlobalMemoryStatus which is always available. + but returns wrong results for physical memory > 4GB. */ + else + { + MEMORYSTATUS ms; + GlobalMemoryStatus (&ms); + return (double) ms.dwTotalPhys; + } + } +#endif + + /* Return 0 if we can't determine the value. */ + return 0; +} + +/* Return the amount of physical memory available. */ +double +physmem_available (void) +{ +#if defined _SC_AVPHYS_PAGES && defined _SC_PAGESIZE + { /* This works on linux-gnu, solaris2 and cygwin. */ + double pages = sysconf (_SC_AVPHYS_PAGES); + double pagesize = sysconf (_SC_PAGESIZE); + if (0 <= pages && 0 <= pagesize) + return pages * pagesize; + } +#endif + +#if HAVE_PSTAT_GETSTATIC && HAVE_PSTAT_GETDYNAMIC + { /* This works on hpux11. */ + struct pst_static pss; + struct pst_dynamic psd; + if (0 <= pstat_getstatic (&pss, sizeof pss, 1, 0) + && 0 <= pstat_getdynamic (&psd, sizeof psd, 1, 0)) + { + double pages = psd.psd_free; + double pagesize = pss.page_size; + if (0 <= pages && 0 <= pagesize) + return pages * pagesize; + } + } +#endif + +#if HAVE_SYSMP && defined MP_SAGET && defined MPSA_RMINFO && defined _SC_PAGESIZE + { /* This works on irix6. */ + struct rminfo realmem; + if (sysmp (MP_SAGET, MPSA_RMINFO, &realmem, sizeof realmem) == 0) + { + double pagesize = sysconf (_SC_PAGESIZE); + double pages = realmem.availrmem; + if (0 <= pages && 0 <= pagesize) + return pages * pagesize; + } + } +#endif + +#if HAVE_TABLE && defined TBL_VMSTATS + { /* This works on Tru64 UNIX V4/5. */ + struct tbl_vmstats vmstats; + + if (table (TBL_VMSTATS, 0, &vmstats, 1, sizeof (vmstats)) == 1) + { + double pages = vmstats.free_count; + double pagesize = vmstats.pagesize; + + if (0 <= pages && 0 <= pagesize) + return pages * pagesize; + } + } +#endif + +#if HAVE_SYSCTL && defined HW_USERMEM + { /* This works on *bsd and darwin. */ + unsigned int usermem; + size_t len = sizeof usermem; + static int mib[2] = { CTL_HW, HW_USERMEM }; + + if (sysctl (mib, ARRAY_SIZE (mib), &usermem, &len, NULL, 0) == 0 + && len == sizeof (usermem)) + return (double) usermem; + } +#endif + +#if defined _WIN32 + { /* this works on windows */ + PFN_MS_EX pfnex; + HMODULE h = GetModuleHandle ("kernel32.dll"); + + if (!h) + return 0.0; + + /* Use GlobalMemoryStatusEx if available. */ + if ((pfnex = (PFN_MS_EX) GetProcAddress (h, "GlobalMemoryStatusEx"))) + { + lMEMORYSTATUSEX lms_ex; + lms_ex.dwLength = sizeof lms_ex; + if (!pfnex (&lms_ex)) + return 0.0; + return (double) lms_ex.ullAvailPhys; + } + + /* Fall back to GlobalMemoryStatus which is always available. + but returns wrong results for physical memory > 4GB */ + else + { + MEMORYSTATUS ms; + GlobalMemoryStatus (&ms); + return (double) ms.dwAvailPhys; + } + } +#endif + + /* Guess 25% of physical memory. */ + return physmem_total () / 4; +} + + +#if DEBUG + +# include +# include + +int +main (void) +{ + printf ("%12.f %12.f\n", physmem_total (), physmem_available ()); + exit (0); +} + +#endif /* DEBUG */ + +/* +Local Variables: +compile-command: "gcc -DDEBUG -DHAVE_CONFIG_H -I.. -g -O -Wall -W physmem.c" +End: +*/ diff --git a/libiberty/putenv.c b/libiberty/putenv.c new file mode 100644 index 0000000..248f50e --- /dev/null +++ b/libiberty/putenv.c @@ -0,0 +1,84 @@ +/* Copyright (C) 1991, 1994, 1995, 1996, 2002 Free Software Foundation, Inc. + This file based on putenv.c in the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, + Boston, MA 02110-1301, USA. */ + +/* + +@deftypefn Supplemental int putenv (const char *@var{string}) + +Uses @code{setenv} or @code{unsetenv} to put @var{string} into +the environment or remove it. If @var{string} is of the form +@samp{name=value} the string is added; if no @samp{=} is present the +name is unset/removed. + +@end deftypefn + +*/ + +#if defined (_AIX) && !defined (__GNUC__) + #pragma alloca +#endif + +#if HAVE_CONFIG_H +# include +#endif + +#include "ansidecl.h" + +#define putenv libiberty_putenv + +#if HAVE_STDLIB_H +# include +#endif +#if HAVE_STRING_H +# include +#endif + +#ifdef HAVE_ALLOCA_H +# include +#else +# ifndef alloca +# ifdef __GNUC__ +# define alloca __builtin_alloca +# else +extern char *alloca (); +# endif /* __GNUC__ */ +# endif /* alloca */ +#endif /* HAVE_ALLOCA_H */ + +#undef putenv + +/* Below this point, it's verbatim code from the glibc-2.0 implementation */ + + +/* Put STRING, which is of the form "NAME=VALUE", in the environment. */ +int +putenv (const char *string) +{ + const char *const name_end = strchr (string, '='); + + if (name_end) + { + char *name = (char *) alloca (name_end - string + 1); + memcpy (name, string, name_end - string); + name[name_end - string] = '\0'; + return setenv (name, name_end + 1, 1); + } + + unsetenv (string); + return 0; +} diff --git a/libiberty/random.c b/libiberty/random.c new file mode 100644 index 0000000..c306698 --- /dev/null +++ b/libiberty/random.c @@ -0,0 +1,403 @@ +/* + * Copyright (c) 1983 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. [rescinded 22 July 1999] + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + * This is derived from the Berkeley source: + * @(#)random.c 5.5 (Berkeley) 7/6/88 + * It was reworked for the GNU C Library by Roland McGrath. + */ + +/* + +@deftypefn Supplement {long int} random (void) +@deftypefnx Supplement void srandom (unsigned int @var{seed}) +@deftypefnx Supplement void* initstate (unsigned int @var{seed}, void *@var{arg_state}, unsigned long @var{n}) +@deftypefnx Supplement void* setstate (void *@var{arg_state}) + +Random number functions. @code{random} returns a random number in the +range 0 to @code{LONG_MAX}. @code{srandom} initializes the random +number generator to some starting point determined by @var{seed} +(else, the values returned by @code{random} are always the same for each +run of the program). @code{initstate} and @code{setstate} allow fine-grained +control over the state of the random number generator. + +@end deftypefn + +*/ + +#include + +#if 0 + +#include +#include +#include +#include + +#else + +#define ULONG_MAX ((unsigned long)(~0L)) /* 0xFFFFFFFF for 32-bits */ +#define LONG_MAX ((long)(ULONG_MAX >> 1)) /* 0x7FFFFFFF for 32-bits*/ + +#ifdef __STDC__ +# define PTR void * +# ifndef NULL +# define NULL (void *) 0 +# endif +#else +# define PTR char * +# ifndef NULL +# define NULL (void *) 0 +# endif +#endif + +#endif + +long int random (void); + +/* An improved random number generation package. In addition to the standard + rand()/srand() like interface, this package also has a special state info + interface. The initstate() routine is called with a seed, an array of + bytes, and a count of how many bytes are being passed in; this array is + then initialized to contain information for random number generation with + that much state information. Good sizes for the amount of state + information are 32, 64, 128, and 256 bytes. The state can be switched by + calling the setstate() function with the same array as was initiallized + with initstate(). By default, the package runs with 128 bytes of state + information and generates far better random numbers than a linear + congruential generator. If the amount of state information is less than + 32 bytes, a simple linear congruential R.N.G. is used. Internally, the + state information is treated as an array of longs; the zeroeth element of + the array is the type of R.N.G. being used (small integer); the remainder + of the array is the state information for the R.N.G. Thus, 32 bytes of + state information will give 7 longs worth of state information, which will + allow a degree seven polynomial. (Note: The zeroeth word of state + information also has some other information stored in it; see setstate + for details). The random number generation technique is a linear feedback + shift register approach, employing trinomials (since there are fewer terms + to sum up that way). In this approach, the least significant bit of all + the numbers in the state table will act as a linear feedback shift register, + and will have period 2^deg - 1 (where deg is the degree of the polynomial + being used, assuming that the polynomial is irreducible and primitive). + The higher order bits will have longer periods, since their values are + also influenced by pseudo-random carries out of the lower bits. The + total period of the generator is approximately deg*(2**deg - 1); thus + doubling the amount of state information has a vast influence on the + period of the generator. Note: The deg*(2**deg - 1) is an approximation + only good for large deg, when the period of the shift register is the + dominant factor. With deg equal to seven, the period is actually much + longer than the 7*(2**7 - 1) predicted by this formula. */ + + + +/* For each of the currently supported random number generators, we have a + break value on the amount of state information (you need at least thi + bytes of state info to support this random number generator), a degree for + the polynomial (actually a trinomial) that the R.N.G. is based on, and + separation between the two lower order coefficients of the trinomial. */ + +/* Linear congruential. */ +#define TYPE_0 0 +#define BREAK_0 8 +#define DEG_0 0 +#define SEP_0 0 + +/* x**7 + x**3 + 1. */ +#define TYPE_1 1 +#define BREAK_1 32 +#define DEG_1 7 +#define SEP_1 3 + +/* x**15 + x + 1. */ +#define TYPE_2 2 +#define BREAK_2 64 +#define DEG_2 15 +#define SEP_2 1 + +/* x**31 + x**3 + 1. */ +#define TYPE_3 3 +#define BREAK_3 128 +#define DEG_3 31 +#define SEP_3 3 + +/* x**63 + x + 1. */ +#define TYPE_4 4 +#define BREAK_4 256 +#define DEG_4 63 +#define SEP_4 1 + + +/* Array versions of the above information to make code run faster. + Relies on fact that TYPE_i == i. */ + +#define MAX_TYPES 5 /* Max number of types above. */ + +static int degrees[MAX_TYPES] = { DEG_0, DEG_1, DEG_2, DEG_3, DEG_4 }; +static int seps[MAX_TYPES] = { SEP_0, SEP_1, SEP_2, SEP_3, SEP_4 }; + + + +/* Initially, everything is set up as if from: + initstate(1, randtbl, 128); + Note that this initialization takes advantage of the fact that srandom + advances the front and rear pointers 10*rand_deg times, and hence the + rear pointer which starts at 0 will also end up at zero; thus the zeroeth + element of the state information, which contains info about the current + position of the rear pointer is just + (MAX_TYPES * (rptr - state)) + TYPE_3 == TYPE_3. */ + +static long int randtbl[DEG_3 + 1] = + { TYPE_3, + 0x9a319039, 0x32d9c024, 0x9b663182, 0x5da1f342, + 0xde3b81e0, 0xdf0a6fb5, 0xf103bc02, 0x48f340fb, + 0x7449e56b, 0xbeb1dbb0, 0xab5c5918, 0x946554fd, + 0x8c2e680f, 0xeb3d799f, 0xb11ee0b7, 0x2d436b86, + 0xda672e2a, 0x1588ca88, 0xe369735d, 0x904f35f7, + 0xd7158fd6, 0x6fa6f051, 0x616e6b96, 0xac94efdc, + 0x36413f93, 0xc622c298, 0xf5a42ab8, 0x8a88d77b, + 0xf5ad9d0e, 0x8999220b, 0x27fb47b9 + }; + +/* FPTR and RPTR are two pointers into the state info, a front and a rear + pointer. These two pointers are always rand_sep places aparts, as they + cycle through the state information. (Yes, this does mean we could get + away with just one pointer, but the code for random is more efficient + this way). The pointers are left positioned as they would be from the call: + initstate(1, randtbl, 128); + (The position of the rear pointer, rptr, is really 0 (as explained above + in the initialization of randtbl) because the state table pointer is set + to point to randtbl[1] (as explained below).) */ + +static long int *fptr = &randtbl[SEP_3 + 1]; +static long int *rptr = &randtbl[1]; + + + +/* The following things are the pointer to the state information table, + the type of the current generator, the degree of the current polynomial + being used, and the separation between the two pointers. + Note that for efficiency of random, we remember the first location of + the state information, not the zeroeth. Hence it is valid to access + state[-1], which is used to store the type of the R.N.G. + Also, we remember the last location, since this is more efficient than + indexing every time to find the address of the last element to see if + the front and rear pointers have wrapped. */ + +static long int *state = &randtbl[1]; + +static int rand_type = TYPE_3; +static int rand_deg = DEG_3; +static int rand_sep = SEP_3; + +static long int *end_ptr = &randtbl[sizeof(randtbl) / sizeof(randtbl[0])]; + +/* Initialize the random number generator based on the given seed. If the + type is the trivial no-state-information type, just remember the seed. + Otherwise, initializes state[] based on the given "seed" via a linear + congruential generator. Then, the pointers are set to known locations + that are exactly rand_sep places apart. Lastly, it cycles the state + information a given number of times to get rid of any initial dependencies + introduced by the L.C.R.N.G. Note that the initialization of randtbl[] + for default usage relies on values produced by this routine. */ +void +srandom (unsigned int x) +{ + state[0] = x; + if (rand_type != TYPE_0) + { + register long int i; + for (i = 1; i < rand_deg; ++i) + state[i] = (1103515145 * state[i - 1]) + 12345; + fptr = &state[rand_sep]; + rptr = &state[0]; + for (i = 0; i < 10 * rand_deg; ++i) + random(); + } +} + +/* Initialize the state information in the given array of N bytes for + future random number generation. Based on the number of bytes we + are given, and the break values for the different R.N.G.'s, we choose + the best (largest) one we can and set things up for it. srandom is + then called to initialize the state information. Note that on return + from srandom, we set state[-1] to be the type multiplexed with the current + value of the rear pointer; this is so successive calls to initstate won't + lose this information and will be able to restart with setstate. + Note: The first thing we do is save the current state, if any, just like + setstate so that it doesn't matter when initstate is called. + Returns a pointer to the old state. */ +PTR +initstate (unsigned int seed, PTR arg_state, unsigned long n) +{ + PTR ostate = (PTR) &state[-1]; + + if (rand_type == TYPE_0) + state[-1] = rand_type; + else + state[-1] = (MAX_TYPES * (rptr - state)) + rand_type; + if (n < BREAK_1) + { + if (n < BREAK_0) + { + errno = EINVAL; + return NULL; + } + rand_type = TYPE_0; + rand_deg = DEG_0; + rand_sep = SEP_0; + } + else if (n < BREAK_2) + { + rand_type = TYPE_1; + rand_deg = DEG_1; + rand_sep = SEP_1; + } + else if (n < BREAK_3) + { + rand_type = TYPE_2; + rand_deg = DEG_2; + rand_sep = SEP_2; + } + else if (n < BREAK_4) + { + rand_type = TYPE_3; + rand_deg = DEG_3; + rand_sep = SEP_3; + } + else + { + rand_type = TYPE_4; + rand_deg = DEG_4; + rand_sep = SEP_4; + } + + state = &((long int *) arg_state)[1]; /* First location. */ + /* Must set END_PTR before srandom. */ + end_ptr = &state[rand_deg]; + srandom(seed); + if (rand_type == TYPE_0) + state[-1] = rand_type; + else + state[-1] = (MAX_TYPES * (rptr - state)) + rand_type; + + return ostate; +} + +/* Restore the state from the given state array. + Note: It is important that we also remember the locations of the pointers + in the current state information, and restore the locations of the pointers + from the old state information. This is done by multiplexing the pointer + location into the zeroeth word of the state information. Note that due + to the order in which things are done, it is OK to call setstate with the + same state as the current state + Returns a pointer to the old state information. */ + +PTR +setstate (PTR arg_state) +{ + register long int *new_state = (long int *) arg_state; + register int type = new_state[0] % MAX_TYPES; + register int rear = new_state[0] / MAX_TYPES; + PTR ostate = (PTR) &state[-1]; + + if (rand_type == TYPE_0) + state[-1] = rand_type; + else + state[-1] = (MAX_TYPES * (rptr - state)) + rand_type; + + switch (type) + { + case TYPE_0: + case TYPE_1: + case TYPE_2: + case TYPE_3: + case TYPE_4: + rand_type = type; + rand_deg = degrees[type]; + rand_sep = seps[type]; + break; + default: + /* State info munged. */ + errno = EINVAL; + return NULL; + } + + state = &new_state[1]; + if (rand_type != TYPE_0) + { + rptr = &state[rear]; + fptr = &state[(rear + rand_sep) % rand_deg]; + } + /* Set end_ptr too. */ + end_ptr = &state[rand_deg]; + + return ostate; +} + +/* If we are using the trivial TYPE_0 R.N.G., just do the old linear + congruential bit. Otherwise, we do our fancy trinomial stuff, which is the + same in all ther other cases due to all the global variables that have been + set up. The basic operation is to add the number at the rear pointer into + the one at the front pointer. Then both pointers are advanced to the next + location cyclically in the table. The value returned is the sum generated, + reduced to 31 bits by throwing away the "least random" low bit. + Note: The code takes advantage of the fact that both the front and + rear pointers can't wrap on the same call by not testing the rear + pointer if the front one has wrapped. Returns a 31-bit random number. */ + +long int +random (void) +{ + if (rand_type == TYPE_0) + { + state[0] = ((state[0] * 1103515245) + 12345) & LONG_MAX; + return state[0]; + } + else + { + long int i; + *fptr += *rptr; + /* Chucking least random bit. */ + i = (*fptr >> 1) & LONG_MAX; + ++fptr; + if (fptr >= end_ptr) + { + fptr = state; + ++rptr; + } + else + { + ++rptr; + if (rptr >= end_ptr) + rptr = state; + } + return i; + } +} diff --git a/libiberty/regex.c b/libiberty/regex.c new file mode 100644 index 0000000..fa1df19 --- /dev/null +++ b/libiberty/regex.c @@ -0,0 +1,8202 @@ +/* Extended regular expression matching and search library, + version 0.12. + (Implements POSIX draft P1003.2/D11.2, except for some of the + internationalization features.) + + Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, + 2002, 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA. */ + +/* This file has been modified for usage in libiberty. It includes "xregex.h" + instead of . The "xregex.h" header file renames all external + routines with an "x" prefix so they do not collide with the native regex + routines or with other components regex routines. */ +/* AIX requires this to be the first thing in the file. */ +#if defined _AIX && !defined __GNUC__ && !defined REGEX_MALLOC + #pragma alloca +#endif + +#undef _GNU_SOURCE +#define _GNU_SOURCE + +#ifndef INSIDE_RECURSION +# ifdef HAVE_CONFIG_H +# include +# endif +#endif + +#include + +#ifndef INSIDE_RECURSION + +# if defined STDC_HEADERS && !defined emacs +# include +# else +/* We need this for `regex.h', and perhaps for the Emacs include files. */ +# include +# endif + +# define WIDE_CHAR_SUPPORT (HAVE_WCTYPE_H && HAVE_WCHAR_H && HAVE_BTOWC) + +/* For platform which support the ISO C amendement 1 functionality we + support user defined character classes. */ +# if defined _LIBC || WIDE_CHAR_SUPPORT +/* Solaris 2.5 has a bug: must be included before . */ +# include +# include +# endif + +# ifdef _LIBC +/* We have to keep the namespace clean. */ +# define regfree(preg) __regfree (preg) +# define regexec(pr, st, nm, pm, ef) __regexec (pr, st, nm, pm, ef) +# define regcomp(preg, pattern, cflags) __regcomp (preg, pattern, cflags) +# define regerror(errcode, preg, errbuf, errbuf_size) \ + __regerror(errcode, preg, errbuf, errbuf_size) +# define re_set_registers(bu, re, nu, st, en) \ + __re_set_registers (bu, re, nu, st, en) +# define re_match_2(bufp, string1, size1, string2, size2, pos, regs, stop) \ + __re_match_2 (bufp, string1, size1, string2, size2, pos, regs, stop) +# define re_match(bufp, string, size, pos, regs) \ + __re_match (bufp, string, size, pos, regs) +# define re_search(bufp, string, size, startpos, range, regs) \ + __re_search (bufp, string, size, startpos, range, regs) +# define re_compile_pattern(pattern, length, bufp) \ + __re_compile_pattern (pattern, length, bufp) +# define re_set_syntax(syntax) __re_set_syntax (syntax) +# define re_search_2(bufp, st1, s1, st2, s2, startpos, range, regs, stop) \ + __re_search_2 (bufp, st1, s1, st2, s2, startpos, range, regs, stop) +# define re_compile_fastmap(bufp) __re_compile_fastmap (bufp) + +# define btowc __btowc + +/* We are also using some library internals. */ +# include +# include +# include +# include +# endif + +/* This is for other GNU distributions with internationalized messages. */ +# if (HAVE_LIBINTL_H && ENABLE_NLS) || defined _LIBC +# include +# ifdef _LIBC +# undef gettext +# define gettext(msgid) __dcgettext ("libc", msgid, LC_MESSAGES) +# endif +# else +# define gettext(msgid) (msgid) +# endif + +# ifndef gettext_noop +/* This define is so xgettext can find the internationalizable + strings. */ +# define gettext_noop(String) String +# endif + +/* The `emacs' switch turns on certain matching commands + that make sense only in Emacs. */ +# ifdef emacs + +# include "lisp.h" +# include "buffer.h" +# include "syntax.h" + +# else /* not emacs */ + +/* If we are not linking with Emacs proper, + we can't use the relocating allocator + even if config.h says that we can. */ +# undef REL_ALLOC + +# if defined STDC_HEADERS || defined _LIBC +# include +# else +char *malloc (); +char *realloc (); +# endif + +/* When used in Emacs's lib-src, we need to get bzero and bcopy somehow. + If nothing else has been done, use the method below. */ +# ifdef INHIBIT_STRING_HEADER +# if !(defined HAVE_BZERO && defined HAVE_BCOPY) +# if !defined bzero && !defined bcopy +# undef INHIBIT_STRING_HEADER +# endif +# endif +# endif + +/* This is the normal way of making sure we have a bcopy and a bzero. + This is used in most programs--a few other programs avoid this + by defining INHIBIT_STRING_HEADER. */ +# ifndef INHIBIT_STRING_HEADER +# if defined HAVE_STRING_H || defined STDC_HEADERS || defined _LIBC +# include +# ifndef bzero +# ifndef _LIBC +# define bzero(s, n) (memset (s, '\0', n), (s)) +# else +# define bzero(s, n) __bzero (s, n) +# endif +# endif +# else +# include +# ifndef memcmp +# define memcmp(s1, s2, n) bcmp (s1, s2, n) +# endif +# ifndef memcpy +# define memcpy(d, s, n) (bcopy (s, d, n), (d)) +# endif +# endif +# endif + +/* Define the syntax stuff for \<, \>, etc. */ + +/* This must be nonzero for the wordchar and notwordchar pattern + commands in re_match_2. */ +# ifndef Sword +# define Sword 1 +# endif + +# ifdef SWITCH_ENUM_BUG +# define SWITCH_ENUM_CAST(x) ((int)(x)) +# else +# define SWITCH_ENUM_CAST(x) (x) +# endif + +# endif /* not emacs */ + +# if defined _LIBC || HAVE_LIMITS_H +# include +# endif + +# ifndef MB_LEN_MAX +# define MB_LEN_MAX 1 +# endif + +/* Get the interface, including the syntax bits. */ +# include "xregex.h" /* change for libiberty */ + +/* isalpha etc. are used for the character classes. */ +# include + +/* Jim Meyering writes: + + "... Some ctype macros are valid only for character codes that + isascii says are ASCII (SGI's IRIX-4.0.5 is one such system --when + using /bin/cc or gcc but without giving an ansi option). So, all + ctype uses should be through macros like ISPRINT... If + STDC_HEADERS is defined, then autoconf has verified that the ctype + macros don't need to be guarded with references to isascii. ... + Defining isascii to 1 should let any compiler worth its salt + eliminate the && through constant folding." + Solaris defines some of these symbols so we must undefine them first. */ + +# undef ISASCII +# if defined STDC_HEADERS || (!defined isascii && !defined HAVE_ISASCII) +# define ISASCII(c) 1 +# else +# define ISASCII(c) isascii(c) +# endif + +# ifdef isblank +# define ISBLANK(c) (ISASCII (c) && isblank (c)) +# else +# define ISBLANK(c) ((c) == ' ' || (c) == '\t') +# endif +# ifdef isgraph +# define ISGRAPH(c) (ISASCII (c) && isgraph (c)) +# else +# define ISGRAPH(c) (ISASCII (c) && isprint (c) && !isspace (c)) +# endif + +# undef ISPRINT +# define ISPRINT(c) (ISASCII (c) && isprint (c)) +# define ISDIGIT(c) (ISASCII (c) && isdigit (c)) +# define ISALNUM(c) (ISASCII (c) && isalnum (c)) +# define ISALPHA(c) (ISASCII (c) && isalpha (c)) +# define ISCNTRL(c) (ISASCII (c) && iscntrl (c)) +# define ISLOWER(c) (ISASCII (c) && islower (c)) +# define ISPUNCT(c) (ISASCII (c) && ispunct (c)) +# define ISSPACE(c) (ISASCII (c) && isspace (c)) +# define ISUPPER(c) (ISASCII (c) && isupper (c)) +# define ISXDIGIT(c) (ISASCII (c) && isxdigit (c)) + +# ifdef _tolower +# define TOLOWER(c) _tolower(c) +# else +# define TOLOWER(c) tolower(c) +# endif + +# ifndef NULL +# define NULL (void *)0 +# endif + +/* We remove any previous definition of `SIGN_EXTEND_CHAR', + since ours (we hope) works properly with all combinations of + machines, compilers, `char' and `unsigned char' argument types. + (Per Bothner suggested the basic approach.) */ +# undef SIGN_EXTEND_CHAR +# if __STDC__ +# define SIGN_EXTEND_CHAR(c) ((signed char) (c)) +# else /* not __STDC__ */ +/* As in Harbison and Steele. */ +# define SIGN_EXTEND_CHAR(c) ((((unsigned char) (c)) ^ 128) - 128) +# endif + +# ifndef emacs +/* How many characters in the character set. */ +# define CHAR_SET_SIZE 256 + +# ifdef SYNTAX_TABLE + +extern char *re_syntax_table; + +# else /* not SYNTAX_TABLE */ + +static char re_syntax_table[CHAR_SET_SIZE]; + +static void init_syntax_once (void); + +static void +init_syntax_once (void) +{ + register int c; + static int done = 0; + + if (done) + return; + bzero (re_syntax_table, sizeof re_syntax_table); + + for (c = 0; c < CHAR_SET_SIZE; ++c) + if (ISALNUM (c)) + re_syntax_table[c] = Sword; + + re_syntax_table['_'] = Sword; + + done = 1; +} + +# endif /* not SYNTAX_TABLE */ + +# define SYNTAX(c) re_syntax_table[(unsigned char) (c)] + +# endif /* emacs */ + +/* Integer type for pointers. */ +# if !defined _LIBC && !defined HAVE_UINTPTR_T +typedef unsigned long int uintptr_t; +# endif + +/* Should we use malloc or alloca? If REGEX_MALLOC is not defined, we + use `alloca' instead of `malloc'. This is because using malloc in + re_search* or re_match* could cause memory leaks when C-g is used in + Emacs; also, malloc is slower and causes storage fragmentation. On + the other hand, malloc is more portable, and easier to debug. + + Because we sometimes use alloca, some routines have to be macros, + not functions -- `alloca'-allocated space disappears at the end of the + function it is called in. */ + +# ifdef REGEX_MALLOC + +# define REGEX_ALLOCATE malloc +# define REGEX_REALLOCATE(source, osize, nsize) realloc (source, nsize) +# define REGEX_FREE free + +# else /* not REGEX_MALLOC */ + +/* Emacs already defines alloca, sometimes. */ +# ifndef alloca + +/* Make alloca work the best possible way. */ +# ifdef __GNUC__ +# define alloca __builtin_alloca +# else /* not __GNUC__ */ +# if HAVE_ALLOCA_H +# include +# endif /* HAVE_ALLOCA_H */ +# endif /* not __GNUC__ */ + +# endif /* not alloca */ + +# define REGEX_ALLOCATE alloca + +/* Assumes a `char *destination' variable. */ +# define REGEX_REALLOCATE(source, osize, nsize) \ + (destination = (char *) alloca (nsize), \ + memcpy (destination, source, osize)) + +/* No need to do anything to free, after alloca. */ +# define REGEX_FREE(arg) ((void)0) /* Do nothing! But inhibit gcc warning. */ + +# endif /* not REGEX_MALLOC */ + +/* Define how to allocate the failure stack. */ + +# if defined REL_ALLOC && defined REGEX_MALLOC + +# define REGEX_ALLOCATE_STACK(size) \ + r_alloc (&failure_stack_ptr, (size)) +# define REGEX_REALLOCATE_STACK(source, osize, nsize) \ + r_re_alloc (&failure_stack_ptr, (nsize)) +# define REGEX_FREE_STACK(ptr) \ + r_alloc_free (&failure_stack_ptr) + +# else /* not using relocating allocator */ + +# ifdef REGEX_MALLOC + +# define REGEX_ALLOCATE_STACK malloc +# define REGEX_REALLOCATE_STACK(source, osize, nsize) realloc (source, nsize) +# define REGEX_FREE_STACK free + +# else /* not REGEX_MALLOC */ + +# define REGEX_ALLOCATE_STACK alloca + +# define REGEX_REALLOCATE_STACK(source, osize, nsize) \ + REGEX_REALLOCATE (source, osize, nsize) +/* No need to explicitly free anything. */ +# define REGEX_FREE_STACK(arg) + +# endif /* not REGEX_MALLOC */ +# endif /* not using relocating allocator */ + + +/* True if `size1' is non-NULL and PTR is pointing anywhere inside + `string1' or just past its end. This works if PTR is NULL, which is + a good thing. */ +# define FIRST_STRING_P(ptr) \ + (size1 && string1 <= (ptr) && (ptr) <= string1 + size1) + +/* (Re)Allocate N items of type T using malloc, or fail. */ +# define TALLOC(n, t) ((t *) malloc ((n) * sizeof (t))) +# define RETALLOC(addr, n, t) ((addr) = (t *) realloc (addr, (n) * sizeof (t))) +# define RETALLOC_IF(addr, n, t) \ + if (addr) RETALLOC((addr), (n), t); else (addr) = TALLOC ((n), t) +# define REGEX_TALLOC(n, t) ((t *) REGEX_ALLOCATE ((n) * sizeof (t))) + +# define BYTEWIDTH 8 /* In bits. */ + +# define STREQ(s1, s2) ((strcmp (s1, s2) == 0)) + +# undef MAX +# undef MIN +# define MAX(a, b) ((a) > (b) ? (a) : (b)) +# define MIN(a, b) ((a) < (b) ? (a) : (b)) + +typedef char boolean; +# define false 0 +# define true 1 + +static reg_errcode_t byte_regex_compile (const char *pattern, size_t size, + reg_syntax_t syntax, + struct re_pattern_buffer *bufp); + +static int byte_re_match_2_internal (struct re_pattern_buffer *bufp, + const char *string1, int size1, + const char *string2, int size2, + int pos, + struct re_registers *regs, + int stop); +static int byte_re_search_2 (struct re_pattern_buffer *bufp, + const char *string1, int size1, + const char *string2, int size2, + int startpos, int range, + struct re_registers *regs, int stop); +static int byte_re_compile_fastmap (struct re_pattern_buffer *bufp); + +#ifdef MBS_SUPPORT +static reg_errcode_t wcs_regex_compile (const char *pattern, size_t size, + reg_syntax_t syntax, + struct re_pattern_buffer *bufp); + + +static int wcs_re_match_2_internal (struct re_pattern_buffer *bufp, + const char *cstring1, int csize1, + const char *cstring2, int csize2, + int pos, + struct re_registers *regs, + int stop, + wchar_t *string1, int size1, + wchar_t *string2, int size2, + int *mbs_offset1, int *mbs_offset2); +static int wcs_re_search_2 (struct re_pattern_buffer *bufp, + const char *string1, int size1, + const char *string2, int size2, + int startpos, int range, + struct re_registers *regs, int stop); +static int wcs_re_compile_fastmap (struct re_pattern_buffer *bufp); +#endif + +/* These are the command codes that appear in compiled regular + expressions. Some opcodes are followed by argument bytes. A + command code can specify any interpretation whatsoever for its + arguments. Zero bytes may appear in the compiled regular expression. */ + +typedef enum +{ + no_op = 0, + + /* Succeed right away--no more backtracking. */ + succeed, + + /* Followed by one byte giving n, then by n literal bytes. */ + exactn, + +# ifdef MBS_SUPPORT + /* Same as exactn, but contains binary data. */ + exactn_bin, +# endif + + /* Matches any (more or less) character. */ + anychar, + + /* Matches any one char belonging to specified set. First + following byte is number of bitmap bytes. Then come bytes + for a bitmap saying which chars are in. Bits in each byte + are ordered low-bit-first. A character is in the set if its + bit is 1. A character too large to have a bit in the map is + automatically not in the set. */ + /* ifdef MBS_SUPPORT, following element is length of character + classes, length of collating symbols, length of equivalence + classes, length of character ranges, and length of characters. + Next, character class element, collating symbols elements, + equivalence class elements, range elements, and character + elements follow. + See regex_compile function. */ + charset, + + /* Same parameters as charset, but match any character that is + not one of those specified. */ + charset_not, + + /* Start remembering the text that is matched, for storing in a + register. Followed by one byte with the register number, in + the range 0 to one less than the pattern buffer's re_nsub + field. Then followed by one byte with the number of groups + inner to this one. (This last has to be part of the + start_memory only because we need it in the on_failure_jump + of re_match_2.) */ + start_memory, + + /* Stop remembering the text that is matched and store it in a + memory register. Followed by one byte with the register + number, in the range 0 to one less than `re_nsub' in the + pattern buffer, and one byte with the number of inner groups, + just like `start_memory'. (We need the number of inner + groups here because we don't have any easy way of finding the + corresponding start_memory when we're at a stop_memory.) */ + stop_memory, + + /* Match a duplicate of something remembered. Followed by one + byte containing the register number. */ + duplicate, + + /* Fail unless at beginning of line. */ + begline, + + /* Fail unless at end of line. */ + endline, + + /* Succeeds if at beginning of buffer (if emacs) or at beginning + of string to be matched (if not). */ + begbuf, + + /* Analogously, for end of buffer/string. */ + endbuf, + + /* Followed by two byte relative address to which to jump. */ + jump, + + /* Same as jump, but marks the end of an alternative. */ + jump_past_alt, + + /* Followed by two-byte relative address of place to resume at + in case of failure. */ + /* ifdef MBS_SUPPORT, the size of address is 1. */ + on_failure_jump, + + /* Like on_failure_jump, but pushes a placeholder instead of the + current string position when executed. */ + on_failure_keep_string_jump, + + /* Throw away latest failure point and then jump to following + two-byte relative address. */ + /* ifdef MBS_SUPPORT, the size of address is 1. */ + pop_failure_jump, + + /* Change to pop_failure_jump if know won't have to backtrack to + match; otherwise change to jump. This is used to jump + back to the beginning of a repeat. If what follows this jump + clearly won't match what the repeat does, such that we can be + sure that there is no use backtracking out of repetitions + already matched, then we change it to a pop_failure_jump. + Followed by two-byte address. */ + /* ifdef MBS_SUPPORT, the size of address is 1. */ + maybe_pop_jump, + + /* Jump to following two-byte address, and push a dummy failure + point. This failure point will be thrown away if an attempt + is made to use it for a failure. A `+' construct makes this + before the first repeat. Also used as an intermediary kind + of jump when compiling an alternative. */ + /* ifdef MBS_SUPPORT, the size of address is 1. */ + dummy_failure_jump, + + /* Push a dummy failure point and continue. Used at the end of + alternatives. */ + push_dummy_failure, + + /* Followed by two-byte relative address and two-byte number n. + After matching N times, jump to the address upon failure. */ + /* ifdef MBS_SUPPORT, the size of address is 1. */ + succeed_n, + + /* Followed by two-byte relative address, and two-byte number n. + Jump to the address N times, then fail. */ + /* ifdef MBS_SUPPORT, the size of address is 1. */ + jump_n, + + /* Set the following two-byte relative address to the + subsequent two-byte number. The address *includes* the two + bytes of number. */ + /* ifdef MBS_SUPPORT, the size of address is 1. */ + set_number_at, + + wordchar, /* Matches any word-constituent character. */ + notwordchar, /* Matches any char that is not a word-constituent. */ + + wordbeg, /* Succeeds if at word beginning. */ + wordend, /* Succeeds if at word end. */ + + wordbound, /* Succeeds if at a word boundary. */ + notwordbound /* Succeeds if not at a word boundary. */ + +# ifdef emacs + ,before_dot, /* Succeeds if before point. */ + at_dot, /* Succeeds if at point. */ + after_dot, /* Succeeds if after point. */ + + /* Matches any character whose syntax is specified. Followed by + a byte which contains a syntax code, e.g., Sword. */ + syntaxspec, + + /* Matches any character whose syntax is not that specified. */ + notsyntaxspec +# endif /* emacs */ +} re_opcode_t; +#endif /* not INSIDE_RECURSION */ + + +#ifdef BYTE +# define CHAR_T char +# define UCHAR_T unsigned char +# define COMPILED_BUFFER_VAR bufp->buffer +# define OFFSET_ADDRESS_SIZE 2 +# define PREFIX(name) byte_##name +# define ARG_PREFIX(name) name +# define PUT_CHAR(c) putchar (c) +#else +# ifdef WCHAR +# define CHAR_T wchar_t +# define UCHAR_T wchar_t +# define COMPILED_BUFFER_VAR wc_buffer +# define OFFSET_ADDRESS_SIZE 1 /* the size which STORE_NUMBER macro use */ +# define CHAR_CLASS_SIZE ((__alignof__(wctype_t)+sizeof(wctype_t))/sizeof(CHAR_T)+1) +# define PREFIX(name) wcs_##name +# define ARG_PREFIX(name) c##name +/* Should we use wide stream?? */ +# define PUT_CHAR(c) printf ("%C", c); +# define TRUE 1 +# define FALSE 0 +# else +# ifdef MBS_SUPPORT +# define WCHAR +# define INSIDE_RECURSION +# include "regex.c" +# undef INSIDE_RECURSION +# endif +# define BYTE +# define INSIDE_RECURSION +# include "regex.c" +# undef INSIDE_RECURSION +# endif +#endif + +#ifdef INSIDE_RECURSION +/* Common operations on the compiled pattern. */ + +/* Store NUMBER in two contiguous bytes starting at DESTINATION. */ +/* ifdef MBS_SUPPORT, we store NUMBER in 1 element. */ + +# ifdef WCHAR +# define STORE_NUMBER(destination, number) \ + do { \ + *(destination) = (UCHAR_T)(number); \ + } while (0) +# else /* BYTE */ +# define STORE_NUMBER(destination, number) \ + do { \ + (destination)[0] = (number) & 0377; \ + (destination)[1] = (number) >> 8; \ + } while (0) +# endif /* WCHAR */ + +/* Same as STORE_NUMBER, except increment DESTINATION to + the byte after where the number is stored. Therefore, DESTINATION + must be an lvalue. */ +/* ifdef MBS_SUPPORT, we store NUMBER in 1 element. */ + +# define STORE_NUMBER_AND_INCR(destination, number) \ + do { \ + STORE_NUMBER (destination, number); \ + (destination) += OFFSET_ADDRESS_SIZE; \ + } while (0) + +/* Put into DESTINATION a number stored in two contiguous bytes starting + at SOURCE. */ +/* ifdef MBS_SUPPORT, we store NUMBER in 1 element. */ + +# ifdef WCHAR +# define EXTRACT_NUMBER(destination, source) \ + do { \ + (destination) = *(source); \ + } while (0) +# else /* BYTE */ +# define EXTRACT_NUMBER(destination, source) \ + do { \ + (destination) = *(source) & 0377; \ + (destination) += SIGN_EXTEND_CHAR (*((source) + 1)) << 8; \ + } while (0) +# endif + +# ifdef DEBUG +static void PREFIX(extract_number) (int *dest, UCHAR_T *source); +static void +PREFIX(extract_number) (int *dest, UCHAR_T *source) +{ +# ifdef WCHAR + *dest = *source; +# else /* BYTE */ + int temp = SIGN_EXTEND_CHAR (*(source + 1)); + *dest = *source & 0377; + *dest += temp << 8; +# endif +} + +# ifndef EXTRACT_MACROS /* To debug the macros. */ +# undef EXTRACT_NUMBER +# define EXTRACT_NUMBER(dest, src) PREFIX(extract_number) (&dest, src) +# endif /* not EXTRACT_MACROS */ + +# endif /* DEBUG */ + +/* Same as EXTRACT_NUMBER, except increment SOURCE to after the number. + SOURCE must be an lvalue. */ + +# define EXTRACT_NUMBER_AND_INCR(destination, source) \ + do { \ + EXTRACT_NUMBER (destination, source); \ + (source) += OFFSET_ADDRESS_SIZE; \ + } while (0) + +# ifdef DEBUG +static void PREFIX(extract_number_and_incr) (int *destination, + UCHAR_T **source); +static void +PREFIX(extract_number_and_incr) (int *destination, UCHAR_T **source) +{ + PREFIX(extract_number) (destination, *source); + *source += OFFSET_ADDRESS_SIZE; +} + +# ifndef EXTRACT_MACROS +# undef EXTRACT_NUMBER_AND_INCR +# define EXTRACT_NUMBER_AND_INCR(dest, src) \ + PREFIX(extract_number_and_incr) (&dest, &src) +# endif /* not EXTRACT_MACROS */ + +# endif /* DEBUG */ + + + +/* If DEBUG is defined, Regex prints many voluminous messages about what + it is doing (if the variable `debug' is nonzero). If linked with the + main program in `iregex.c', you can enter patterns and strings + interactively. And if linked with the main program in `main.c' and + the other test files, you can run the already-written tests. */ + +# ifdef DEBUG + +# ifndef DEFINED_ONCE + +/* We use standard I/O for debugging. */ +# include + +/* It is useful to test things that ``must'' be true when debugging. */ +# include + +static int debug; + +# define DEBUG_STATEMENT(e) e +# define DEBUG_PRINT1(x) if (debug) printf (x) +# define DEBUG_PRINT2(x1, x2) if (debug) printf (x1, x2) +# define DEBUG_PRINT3(x1, x2, x3) if (debug) printf (x1, x2, x3) +# define DEBUG_PRINT4(x1, x2, x3, x4) if (debug) printf (x1, x2, x3, x4) +# endif /* not DEFINED_ONCE */ + +# define DEBUG_PRINT_COMPILED_PATTERN(p, s, e) \ + if (debug) PREFIX(print_partial_compiled_pattern) (s, e) +# define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2) \ + if (debug) PREFIX(print_double_string) (w, s1, sz1, s2, sz2) + + +/* Print the fastmap in human-readable form. */ + +# ifndef DEFINED_ONCE +void +print_fastmap (char *fastmap) +{ + unsigned was_a_range = 0; + unsigned i = 0; + + while (i < (1 << BYTEWIDTH)) + { + if (fastmap[i++]) + { + was_a_range = 0; + putchar (i - 1); + while (i < (1 << BYTEWIDTH) && fastmap[i]) + { + was_a_range = 1; + i++; + } + if (was_a_range) + { + printf ("-"); + putchar (i - 1); + } + } + } + putchar ('\n'); +} +# endif /* not DEFINED_ONCE */ + + +/* Print a compiled pattern string in human-readable form, starting at + the START pointer into it and ending just before the pointer END. */ + +void +PREFIX(print_partial_compiled_pattern) (UCHAR_T *start, UCHAR_T *end) +{ + int mcnt, mcnt2; + UCHAR_T *p1; + UCHAR_T *p = start; + UCHAR_T *pend = end; + + if (start == NULL) + { + printf ("(null)\n"); + return; + } + + /* Loop over pattern commands. */ + while (p < pend) + { +# ifdef _LIBC + printf ("%td:\t", p - start); +# else + printf ("%ld:\t", (long int) (p - start)); +# endif + + switch ((re_opcode_t) *p++) + { + case no_op: + printf ("/no_op"); + break; + + case exactn: + mcnt = *p++; + printf ("/exactn/%d", mcnt); + do + { + putchar ('/'); + PUT_CHAR (*p++); + } + while (--mcnt); + break; + +# ifdef MBS_SUPPORT + case exactn_bin: + mcnt = *p++; + printf ("/exactn_bin/%d", mcnt); + do + { + printf("/%lx", (long int) *p++); + } + while (--mcnt); + break; +# endif /* MBS_SUPPORT */ + + case start_memory: + mcnt = *p++; + printf ("/start_memory/%d/%ld", mcnt, (long int) *p++); + break; + + case stop_memory: + mcnt = *p++; + printf ("/stop_memory/%d/%ld", mcnt, (long int) *p++); + break; + + case duplicate: + printf ("/duplicate/%ld", (long int) *p++); + break; + + case anychar: + printf ("/anychar"); + break; + + case charset: + case charset_not: + { +# ifdef WCHAR + int i, length; + wchar_t *workp = p; + printf ("/charset [%s", + (re_opcode_t) *(workp - 1) == charset_not ? "^" : ""); + p += 5; + length = *workp++; /* the length of char_classes */ + for (i=0 ; ibuffer; + + PREFIX(print_partial_compiled_pattern) (buffer, buffer + + bufp->used / sizeof(UCHAR_T)); + printf ("%ld bytes used/%ld bytes allocated.\n", + bufp->used, bufp->allocated); + + if (bufp->fastmap_accurate && bufp->fastmap) + { + printf ("fastmap: "); + print_fastmap (bufp->fastmap); + } + +# ifdef _LIBC + printf ("re_nsub: %Zd\t", bufp->re_nsub); +# else + printf ("re_nsub: %ld\t", (long int) bufp->re_nsub); +# endif + printf ("regs_alloc: %d\t", bufp->regs_allocated); + printf ("can_be_null: %d\t", bufp->can_be_null); + printf ("newline_anchor: %d\n", bufp->newline_anchor); + printf ("no_sub: %d\t", bufp->no_sub); + printf ("not_bol: %d\t", bufp->not_bol); + printf ("not_eol: %d\t", bufp->not_eol); + printf ("syntax: %lx\n", bufp->syntax); + /* Perhaps we should print the translate table? */ +} + + +void +PREFIX(print_double_string) (const CHAR_T *where, const CHAR_T *string1, + int size1, const CHAR_T *string2, int size2) +{ + int this_char; + + if (where == NULL) + printf ("(null)"); + else + { + int cnt; + + if (FIRST_STRING_P (where)) + { + for (this_char = where - string1; this_char < size1; this_char++) + PUT_CHAR (string1[this_char]); + + where = string2; + } + + cnt = 0; + for (this_char = where - string2; this_char < size2; this_char++) + { + PUT_CHAR (string2[this_char]); + if (++cnt > 100) + { + fputs ("...", stdout); + break; + } + } + } +} + +# ifndef DEFINED_ONCE +void +printchar (int c) +{ + putc (c, stderr); +} +# endif + +# else /* not DEBUG */ + +# ifndef DEFINED_ONCE +# undef assert +# define assert(e) + +# define DEBUG_STATEMENT(e) +# define DEBUG_PRINT1(x) +# define DEBUG_PRINT2(x1, x2) +# define DEBUG_PRINT3(x1, x2, x3) +# define DEBUG_PRINT4(x1, x2, x3, x4) +# endif /* not DEFINED_ONCE */ +# define DEBUG_PRINT_COMPILED_PATTERN(p, s, e) +# define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2) + +# endif /* not DEBUG */ + + + +# ifdef WCHAR +/* This convert a multibyte string to a wide character string. + And write their correspondances to offset_buffer(see below) + and write whether each wchar_t is binary data to is_binary. + This assume invalid multibyte sequences as binary data. + We assume offset_buffer and is_binary is already allocated + enough space. */ + +static size_t convert_mbs_to_wcs (CHAR_T *dest, const unsigned char* src, + size_t len, int *offset_buffer, + char *is_binary); +static size_t +convert_mbs_to_wcs (CHAR_T *dest, const unsigned char*src, size_t len, + int *offset_buffer, char *is_binary) + /* It hold correspondances between src(char string) and + dest(wchar_t string) for optimization. + e.g. src = "xxxyzz" + dest = {'X', 'Y', 'Z'} + (each "xxx", "y" and "zz" represent one multibyte character + corresponding to 'X', 'Y' and 'Z'.) + offset_buffer = {0, 0+3("xxx"), 0+3+1("y"), 0+3+1+2("zz")} + = {0, 3, 4, 6} + */ +{ + wchar_t *pdest = dest; + const unsigned char *psrc = src; + size_t wc_count = 0; + + mbstate_t mbs; + int i, consumed; + size_t mb_remain = len; + size_t mb_count = 0; + + /* Initialize the conversion state. */ + memset (&mbs, 0, sizeof (mbstate_t)); + + offset_buffer[0] = 0; + for( ; mb_remain > 0 ; ++wc_count, ++pdest, mb_remain -= consumed, + psrc += consumed) + { +#ifdef _LIBC + consumed = __mbrtowc (pdest, psrc, mb_remain, &mbs); +#else + consumed = mbrtowc (pdest, psrc, mb_remain, &mbs); +#endif + + if (consumed <= 0) + /* failed to convert. maybe src contains binary data. + So we consume 1 byte manualy. */ + { + *pdest = *psrc; + consumed = 1; + is_binary[wc_count] = TRUE; + } + else + is_binary[wc_count] = FALSE; + /* In sjis encoding, we use yen sign as escape character in + place of reverse solidus. So we convert 0x5c(yen sign in + sjis) to not 0xa5(yen sign in UCS2) but 0x5c(reverse + solidus in UCS2). */ + if (consumed == 1 && (int) *psrc == 0x5c && (int) *pdest == 0xa5) + *pdest = (wchar_t) *psrc; + + offset_buffer[wc_count + 1] = mb_count += consumed; + } + + /* Fill remain of the buffer with sentinel. */ + for (i = wc_count + 1 ; i <= len ; i++) + offset_buffer[i] = mb_count + 1; + + return wc_count; +} + +# endif /* WCHAR */ + +#else /* not INSIDE_RECURSION */ + +/* Set by `re_set_syntax' to the current regexp syntax to recognize. Can + also be assigned to arbitrarily: each pattern buffer stores its own + syntax, so it can be changed between regex compilations. */ +/* This has no initializer because initialized variables in Emacs + become read-only after dumping. */ +reg_syntax_t re_syntax_options; + + +/* Specify the precise syntax of regexps for compilation. This provides + for compatibility for various utilities which historically have + different, incompatible syntaxes. + + The argument SYNTAX is a bit mask comprised of the various bits + defined in regex.h. We return the old syntax. */ + +reg_syntax_t +re_set_syntax (reg_syntax_t syntax) +{ + reg_syntax_t ret = re_syntax_options; + + re_syntax_options = syntax; +# ifdef DEBUG + if (syntax & RE_DEBUG) + debug = 1; + else if (debug) /* was on but now is not */ + debug = 0; +# endif /* DEBUG */ + return ret; +} +# ifdef _LIBC +weak_alias (__re_set_syntax, re_set_syntax) +# endif + +/* This table gives an error message for each of the error codes listed + in regex.h. Obviously the order here has to be same as there. + POSIX doesn't require that we do anything for REG_NOERROR, + but why not be nice? */ + +static const char *re_error_msgid[] = + { + gettext_noop ("Success"), /* REG_NOERROR */ + gettext_noop ("No match"), /* REG_NOMATCH */ + gettext_noop ("Invalid regular expression"), /* REG_BADPAT */ + gettext_noop ("Invalid collation character"), /* REG_ECOLLATE */ + gettext_noop ("Invalid character class name"), /* REG_ECTYPE */ + gettext_noop ("Trailing backslash"), /* REG_EESCAPE */ + gettext_noop ("Invalid back reference"), /* REG_ESUBREG */ + gettext_noop ("Unmatched [ or [^"), /* REG_EBRACK */ + gettext_noop ("Unmatched ( or \\("), /* REG_EPAREN */ + gettext_noop ("Unmatched \\{"), /* REG_EBRACE */ + gettext_noop ("Invalid content of \\{\\}"), /* REG_BADBR */ + gettext_noop ("Invalid range end"), /* REG_ERANGE */ + gettext_noop ("Memory exhausted"), /* REG_ESPACE */ + gettext_noop ("Invalid preceding regular expression"), /* REG_BADRPT */ + gettext_noop ("Premature end of regular expression"), /* REG_EEND */ + gettext_noop ("Regular expression too big"), /* REG_ESIZE */ + gettext_noop ("Unmatched ) or \\)") /* REG_ERPAREN */ + }; + +#endif /* INSIDE_RECURSION */ + +#ifndef DEFINED_ONCE +/* Avoiding alloca during matching, to placate r_alloc. */ + +/* Define MATCH_MAY_ALLOCATE unless we need to make sure that the + searching and matching functions should not call alloca. On some + systems, alloca is implemented in terms of malloc, and if we're + using the relocating allocator routines, then malloc could cause a + relocation, which might (if the strings being searched are in the + ralloc heap) shift the data out from underneath the regexp + routines. + + Here's another reason to avoid allocation: Emacs + processes input from X in a signal handler; processing X input may + call malloc; if input arrives while a matching routine is calling + malloc, then we're scrod. But Emacs can't just block input while + calling matching routines; then we don't notice interrupts when + they come in. So, Emacs blocks input around all regexp calls + except the matching calls, which it leaves unprotected, in the + faith that they will not malloc. */ + +/* Normally, this is fine. */ +# define MATCH_MAY_ALLOCATE + +/* When using GNU C, we are not REALLY using the C alloca, no matter + what config.h may say. So don't take precautions for it. */ +# ifdef __GNUC__ +# undef C_ALLOCA +# endif + +/* The match routines may not allocate if (1) they would do it with malloc + and (2) it's not safe for them to use malloc. + Note that if REL_ALLOC is defined, matching would not use malloc for the + failure stack, but we would still use it for the register vectors; + so REL_ALLOC should not affect this. */ +# if (defined C_ALLOCA || defined REGEX_MALLOC) && defined emacs +# undef MATCH_MAY_ALLOCATE +# endif +#endif /* not DEFINED_ONCE */ + +#ifdef INSIDE_RECURSION +/* Failure stack declarations and macros; both re_compile_fastmap and + re_match_2 use a failure stack. These have to be macros because of + REGEX_ALLOCATE_STACK. */ + + +/* Number of failure points for which to initially allocate space + when matching. If this number is exceeded, we allocate more + space, so it is not a hard limit. */ +# ifndef INIT_FAILURE_ALLOC +# define INIT_FAILURE_ALLOC 5 +# endif + +/* Roughly the maximum number of failure points on the stack. Would be + exactly that if always used MAX_FAILURE_ITEMS items each time we failed. + This is a variable only so users of regex can assign to it; we never + change it ourselves. */ + +# ifdef INT_IS_16BIT + +# ifndef DEFINED_ONCE +# if defined MATCH_MAY_ALLOCATE +/* 4400 was enough to cause a crash on Alpha OSF/1, + whose default stack limit is 2mb. */ +long int re_max_failures = 4000; +# else +long int re_max_failures = 2000; +# endif +# endif + +union PREFIX(fail_stack_elt) +{ + UCHAR_T *pointer; + long int integer; +}; + +typedef union PREFIX(fail_stack_elt) PREFIX(fail_stack_elt_t); + +typedef struct +{ + PREFIX(fail_stack_elt_t) *stack; + unsigned long int size; + unsigned long int avail; /* Offset of next open position. */ +} PREFIX(fail_stack_type); + +# else /* not INT_IS_16BIT */ + +# ifndef DEFINED_ONCE +# if defined MATCH_MAY_ALLOCATE +/* 4400 was enough to cause a crash on Alpha OSF/1, + whose default stack limit is 2mb. */ +int re_max_failures = 4000; +# else +int re_max_failures = 2000; +# endif +# endif + +union PREFIX(fail_stack_elt) +{ + UCHAR_T *pointer; + int integer; +}; + +typedef union PREFIX(fail_stack_elt) PREFIX(fail_stack_elt_t); + +typedef struct +{ + PREFIX(fail_stack_elt_t) *stack; + unsigned size; + unsigned avail; /* Offset of next open position. */ +} PREFIX(fail_stack_type); + +# endif /* INT_IS_16BIT */ + +# ifndef DEFINED_ONCE +# define FAIL_STACK_EMPTY() (fail_stack.avail == 0) +# define FAIL_STACK_PTR_EMPTY() (fail_stack_ptr->avail == 0) +# define FAIL_STACK_FULL() (fail_stack.avail == fail_stack.size) +# endif + + +/* Define macros to initialize and free the failure stack. + Do `return -2' if the alloc fails. */ + +# ifdef MATCH_MAY_ALLOCATE +# define INIT_FAIL_STACK() \ + do { \ + fail_stack.stack = (PREFIX(fail_stack_elt_t) *) \ + REGEX_ALLOCATE_STACK (INIT_FAILURE_ALLOC * sizeof (PREFIX(fail_stack_elt_t))); \ + \ + if (fail_stack.stack == NULL) \ + return -2; \ + \ + fail_stack.size = INIT_FAILURE_ALLOC; \ + fail_stack.avail = 0; \ + } while (0) + +# define RESET_FAIL_STACK() REGEX_FREE_STACK (fail_stack.stack) +# else +# define INIT_FAIL_STACK() \ + do { \ + fail_stack.avail = 0; \ + } while (0) + +# define RESET_FAIL_STACK() +# endif + + +/* Double the size of FAIL_STACK, up to approximately `re_max_failures' items. + + Return 1 if succeeds, and 0 if either ran out of memory + allocating space for it or it was already too large. + + REGEX_REALLOCATE_STACK requires `destination' be declared. */ + +# define DOUBLE_FAIL_STACK(fail_stack) \ + ((fail_stack).size > (unsigned) (re_max_failures * MAX_FAILURE_ITEMS) \ + ? 0 \ + : ((fail_stack).stack = (PREFIX(fail_stack_elt_t) *) \ + REGEX_REALLOCATE_STACK ((fail_stack).stack, \ + (fail_stack).size * sizeof (PREFIX(fail_stack_elt_t)), \ + ((fail_stack).size << 1) * sizeof (PREFIX(fail_stack_elt_t))),\ + \ + (fail_stack).stack == NULL \ + ? 0 \ + : ((fail_stack).size <<= 1, \ + 1))) + + +/* Push pointer POINTER on FAIL_STACK. + Return 1 if was able to do so and 0 if ran out of memory allocating + space to do so. */ +# define PUSH_PATTERN_OP(POINTER, FAIL_STACK) \ + ((FAIL_STACK_FULL () \ + && !DOUBLE_FAIL_STACK (FAIL_STACK)) \ + ? 0 \ + : ((FAIL_STACK).stack[(FAIL_STACK).avail++].pointer = POINTER, \ + 1)) + +/* Push a pointer value onto the failure stack. + Assumes the variable `fail_stack'. Probably should only + be called from within `PUSH_FAILURE_POINT'. */ +# define PUSH_FAILURE_POINTER(item) \ + fail_stack.stack[fail_stack.avail++].pointer = (UCHAR_T *) (item) + +/* This pushes an integer-valued item onto the failure stack. + Assumes the variable `fail_stack'. Probably should only + be called from within `PUSH_FAILURE_POINT'. */ +# define PUSH_FAILURE_INT(item) \ + fail_stack.stack[fail_stack.avail++].integer = (item) + +/* Push a fail_stack_elt_t value onto the failure stack. + Assumes the variable `fail_stack'. Probably should only + be called from within `PUSH_FAILURE_POINT'. */ +# define PUSH_FAILURE_ELT(item) \ + fail_stack.stack[fail_stack.avail++] = (item) + +/* These three POP... operations complement the three PUSH... operations. + All assume that `fail_stack' is nonempty. */ +# define POP_FAILURE_POINTER() fail_stack.stack[--fail_stack.avail].pointer +# define POP_FAILURE_INT() fail_stack.stack[--fail_stack.avail].integer +# define POP_FAILURE_ELT() fail_stack.stack[--fail_stack.avail] + +/* Used to omit pushing failure point id's when we're not debugging. */ +# ifdef DEBUG +# define DEBUG_PUSH PUSH_FAILURE_INT +# define DEBUG_POP(item_addr) *(item_addr) = POP_FAILURE_INT () +# else +# define DEBUG_PUSH(item) +# define DEBUG_POP(item_addr) +# endif + + +/* Push the information about the state we will need + if we ever fail back to it. + + Requires variables fail_stack, regstart, regend, reg_info, and + num_regs_pushed be declared. DOUBLE_FAIL_STACK requires `destination' + be declared. + + Does `return FAILURE_CODE' if runs out of memory. */ + +# define PUSH_FAILURE_POINT(pattern_place, string_place, failure_code) \ + do { \ + char *destination; \ + /* Must be int, so when we don't save any registers, the arithmetic \ + of 0 + -1 isn't done as unsigned. */ \ + /* Can't be int, since there is not a shred of a guarantee that int \ + is wide enough to hold a value of something to which pointer can \ + be assigned */ \ + active_reg_t this_reg; \ + \ + DEBUG_STATEMENT (failure_id++); \ + DEBUG_STATEMENT (nfailure_points_pushed++); \ + DEBUG_PRINT2 ("\nPUSH_FAILURE_POINT #%u:\n", failure_id); \ + DEBUG_PRINT2 (" Before push, next avail: %d\n", (fail_stack).avail);\ + DEBUG_PRINT2 (" size: %d\n", (fail_stack).size);\ + \ + DEBUG_PRINT2 (" slots needed: %ld\n", NUM_FAILURE_ITEMS); \ + DEBUG_PRINT2 (" available: %d\n", REMAINING_AVAIL_SLOTS); \ + \ + /* Ensure we have enough space allocated for what we will push. */ \ + while (REMAINING_AVAIL_SLOTS < NUM_FAILURE_ITEMS) \ + { \ + if (!DOUBLE_FAIL_STACK (fail_stack)) \ + return failure_code; \ + \ + DEBUG_PRINT2 ("\n Doubled stack; size now: %d\n", \ + (fail_stack).size); \ + DEBUG_PRINT2 (" slots available: %d\n", REMAINING_AVAIL_SLOTS);\ + } \ + \ + /* Push the info, starting with the registers. */ \ + DEBUG_PRINT1 ("\n"); \ + \ + if (1) \ + for (this_reg = lowest_active_reg; this_reg <= highest_active_reg; \ + this_reg++) \ + { \ + DEBUG_PRINT2 (" Pushing reg: %lu\n", this_reg); \ + DEBUG_STATEMENT (num_regs_pushed++); \ + \ + DEBUG_PRINT2 (" start: %p\n", regstart[this_reg]); \ + PUSH_FAILURE_POINTER (regstart[this_reg]); \ + \ + DEBUG_PRINT2 (" end: %p\n", regend[this_reg]); \ + PUSH_FAILURE_POINTER (regend[this_reg]); \ + \ + DEBUG_PRINT2 (" info: %p\n ", \ + reg_info[this_reg].word.pointer); \ + DEBUG_PRINT2 (" match_null=%d", \ + REG_MATCH_NULL_STRING_P (reg_info[this_reg])); \ + DEBUG_PRINT2 (" active=%d", IS_ACTIVE (reg_info[this_reg])); \ + DEBUG_PRINT2 (" matched_something=%d", \ + MATCHED_SOMETHING (reg_info[this_reg])); \ + DEBUG_PRINT2 (" ever_matched=%d", \ + EVER_MATCHED_SOMETHING (reg_info[this_reg])); \ + DEBUG_PRINT1 ("\n"); \ + PUSH_FAILURE_ELT (reg_info[this_reg].word); \ + } \ + \ + DEBUG_PRINT2 (" Pushing low active reg: %ld\n", lowest_active_reg);\ + PUSH_FAILURE_INT (lowest_active_reg); \ + \ + DEBUG_PRINT2 (" Pushing high active reg: %ld\n", highest_active_reg);\ + PUSH_FAILURE_INT (highest_active_reg); \ + \ + DEBUG_PRINT2 (" Pushing pattern %p:\n", pattern_place); \ + DEBUG_PRINT_COMPILED_PATTERN (bufp, pattern_place, pend); \ + PUSH_FAILURE_POINTER (pattern_place); \ + \ + DEBUG_PRINT2 (" Pushing string %p: `", string_place); \ + DEBUG_PRINT_DOUBLE_STRING (string_place, string1, size1, string2, \ + size2); \ + DEBUG_PRINT1 ("'\n"); \ + PUSH_FAILURE_POINTER (string_place); \ + \ + DEBUG_PRINT2 (" Pushing failure id: %u\n", failure_id); \ + DEBUG_PUSH (failure_id); \ + } while (0) + +# ifndef DEFINED_ONCE +/* This is the number of items that are pushed and popped on the stack + for each register. */ +# define NUM_REG_ITEMS 3 + +/* Individual items aside from the registers. */ +# ifdef DEBUG +# define NUM_NONREG_ITEMS 5 /* Includes failure point id. */ +# else +# define NUM_NONREG_ITEMS 4 +# endif + +/* We push at most this many items on the stack. */ +/* We used to use (num_regs - 1), which is the number of registers + this regexp will save; but that was changed to 5 + to avoid stack overflow for a regexp with lots of parens. */ +# define MAX_FAILURE_ITEMS (5 * NUM_REG_ITEMS + NUM_NONREG_ITEMS) + +/* We actually push this many items. */ +# define NUM_FAILURE_ITEMS \ + (((0 \ + ? 0 : highest_active_reg - lowest_active_reg + 1) \ + * NUM_REG_ITEMS) \ + + NUM_NONREG_ITEMS) + +/* How many items can still be added to the stack without overflowing it. */ +# define REMAINING_AVAIL_SLOTS ((fail_stack).size - (fail_stack).avail) +# endif /* not DEFINED_ONCE */ + + +/* Pops what PUSH_FAIL_STACK pushes. + + We restore into the parameters, all of which should be lvalues: + STR -- the saved data position. + PAT -- the saved pattern position. + LOW_REG, HIGH_REG -- the highest and lowest active registers. + REGSTART, REGEND -- arrays of string positions. + REG_INFO -- array of information about each subexpression. + + Also assumes the variables `fail_stack' and (if debugging), `bufp', + `pend', `string1', `size1', `string2', and `size2'. */ +# define POP_FAILURE_POINT(str, pat, low_reg, high_reg, regstart, regend, reg_info)\ +{ \ + DEBUG_STATEMENT (unsigned failure_id;) \ + active_reg_t this_reg; \ + const UCHAR_T *string_temp; \ + \ + assert (!FAIL_STACK_EMPTY ()); \ + \ + /* Remove failure points and point to how many regs pushed. */ \ + DEBUG_PRINT1 ("POP_FAILURE_POINT:\n"); \ + DEBUG_PRINT2 (" Before pop, next avail: %d\n", fail_stack.avail); \ + DEBUG_PRINT2 (" size: %d\n", fail_stack.size); \ + \ + assert (fail_stack.avail >= NUM_NONREG_ITEMS); \ + \ + DEBUG_POP (&failure_id); \ + DEBUG_PRINT2 (" Popping failure id: %u\n", failure_id); \ + \ + /* If the saved string location is NULL, it came from an \ + on_failure_keep_string_jump opcode, and we want to throw away the \ + saved NULL, thus retaining our current position in the string. */ \ + string_temp = POP_FAILURE_POINTER (); \ + if (string_temp != NULL) \ + str = (const CHAR_T *) string_temp; \ + \ + DEBUG_PRINT2 (" Popping string %p: `", str); \ + DEBUG_PRINT_DOUBLE_STRING (str, string1, size1, string2, size2); \ + DEBUG_PRINT1 ("'\n"); \ + \ + pat = (UCHAR_T *) POP_FAILURE_POINTER (); \ + DEBUG_PRINT2 (" Popping pattern %p:\n", pat); \ + DEBUG_PRINT_COMPILED_PATTERN (bufp, pat, pend); \ + \ + /* Restore register info. */ \ + high_reg = (active_reg_t) POP_FAILURE_INT (); \ + DEBUG_PRINT2 (" Popping high active reg: %ld\n", high_reg); \ + \ + low_reg = (active_reg_t) POP_FAILURE_INT (); \ + DEBUG_PRINT2 (" Popping low active reg: %ld\n", low_reg); \ + \ + if (1) \ + for (this_reg = high_reg; this_reg >= low_reg; this_reg--) \ + { \ + DEBUG_PRINT2 (" Popping reg: %ld\n", this_reg); \ + \ + reg_info[this_reg].word = POP_FAILURE_ELT (); \ + DEBUG_PRINT2 (" info: %p\n", \ + reg_info[this_reg].word.pointer); \ + \ + regend[this_reg] = (const CHAR_T *) POP_FAILURE_POINTER (); \ + DEBUG_PRINT2 (" end: %p\n", regend[this_reg]); \ + \ + regstart[this_reg] = (const CHAR_T *) POP_FAILURE_POINTER (); \ + DEBUG_PRINT2 (" start: %p\n", regstart[this_reg]); \ + } \ + else \ + { \ + for (this_reg = highest_active_reg; this_reg > high_reg; this_reg--) \ + { \ + reg_info[this_reg].word.integer = 0; \ + regend[this_reg] = 0; \ + regstart[this_reg] = 0; \ + } \ + highest_active_reg = high_reg; \ + } \ + \ + set_regs_matched_done = 0; \ + DEBUG_STATEMENT (nfailure_points_popped++); \ +} /* POP_FAILURE_POINT */ + +/* Structure for per-register (a.k.a. per-group) information. + Other register information, such as the + starting and ending positions (which are addresses), and the list of + inner groups (which is a bits list) are maintained in separate + variables. + + We are making a (strictly speaking) nonportable assumption here: that + the compiler will pack our bit fields into something that fits into + the type of `word', i.e., is something that fits into one item on the + failure stack. */ + + +/* Declarations and macros for re_match_2. */ + +typedef union +{ + PREFIX(fail_stack_elt_t) word; + struct + { + /* This field is one if this group can match the empty string, + zero if not. If not yet determined, `MATCH_NULL_UNSET_VALUE'. */ +# define MATCH_NULL_UNSET_VALUE 3 + unsigned match_null_string_p : 2; + unsigned is_active : 1; + unsigned matched_something : 1; + unsigned ever_matched_something : 1; + } bits; +} PREFIX(register_info_type); + +# ifndef DEFINED_ONCE +# define REG_MATCH_NULL_STRING_P(R) ((R).bits.match_null_string_p) +# define IS_ACTIVE(R) ((R).bits.is_active) +# define MATCHED_SOMETHING(R) ((R).bits.matched_something) +# define EVER_MATCHED_SOMETHING(R) ((R).bits.ever_matched_something) + + +/* Call this when have matched a real character; it sets `matched' flags + for the subexpressions which we are currently inside. Also records + that those subexprs have matched. */ +# define SET_REGS_MATCHED() \ + do \ + { \ + if (!set_regs_matched_done) \ + { \ + active_reg_t r; \ + set_regs_matched_done = 1; \ + for (r = lowest_active_reg; r <= highest_active_reg; r++) \ + { \ + MATCHED_SOMETHING (reg_info[r]) \ + = EVER_MATCHED_SOMETHING (reg_info[r]) \ + = 1; \ + } \ + } \ + } \ + while (0) +# endif /* not DEFINED_ONCE */ + +/* Registers are set to a sentinel when they haven't yet matched. */ +static CHAR_T PREFIX(reg_unset_dummy); +# define REG_UNSET_VALUE (&PREFIX(reg_unset_dummy)) +# define REG_UNSET(e) ((e) == REG_UNSET_VALUE) + +/* Subroutine declarations and macros for regex_compile. */ +static void PREFIX(store_op1) (re_opcode_t op, UCHAR_T *loc, int arg); +static void PREFIX(store_op2) (re_opcode_t op, UCHAR_T *loc, + int arg1, int arg2); +static void PREFIX(insert_op1) (re_opcode_t op, UCHAR_T *loc, + int arg, UCHAR_T *end); +static void PREFIX(insert_op2) (re_opcode_t op, UCHAR_T *loc, + int arg1, int arg2, UCHAR_T *end); +static boolean PREFIX(at_begline_loc_p) (const CHAR_T *pattern, + const CHAR_T *p, + reg_syntax_t syntax); +static boolean PREFIX(at_endline_loc_p) (const CHAR_T *p, + const CHAR_T *pend, + reg_syntax_t syntax); +# ifdef WCHAR +static reg_errcode_t wcs_compile_range (CHAR_T range_start, + const CHAR_T **p_ptr, + const CHAR_T *pend, + char *translate, + reg_syntax_t syntax, + UCHAR_T *b, + CHAR_T *char_set); +static void insert_space (int num, CHAR_T *loc, CHAR_T *end); +# else /* BYTE */ +static reg_errcode_t byte_compile_range (unsigned int range_start, + const char **p_ptr, + const char *pend, + char *translate, + reg_syntax_t syntax, + unsigned char *b); +# endif /* WCHAR */ + +/* Fetch the next character in the uncompiled pattern---translating it + if necessary. Also cast from a signed character in the constant + string passed to us by the user to an unsigned char that we can use + as an array index (in, e.g., `translate'). */ +/* ifdef MBS_SUPPORT, we translate only if character <= 0xff, + because it is impossible to allocate 4GB array for some encodings + which have 4 byte character_set like UCS4. */ +# ifndef PATFETCH +# ifdef WCHAR +# define PATFETCH(c) \ + do {if (p == pend) return REG_EEND; \ + c = (UCHAR_T) *p++; \ + if (translate && (c <= 0xff)) c = (UCHAR_T) translate[c]; \ + } while (0) +# else /* BYTE */ +# define PATFETCH(c) \ + do {if (p == pend) return REG_EEND; \ + c = (unsigned char) *p++; \ + if (translate) c = (unsigned char) translate[c]; \ + } while (0) +# endif /* WCHAR */ +# endif + +/* Fetch the next character in the uncompiled pattern, with no + translation. */ +# define PATFETCH_RAW(c) \ + do {if (p == pend) return REG_EEND; \ + c = (UCHAR_T) *p++; \ + } while (0) + +/* Go backwards one character in the pattern. */ +# define PATUNFETCH p-- + + +/* If `translate' is non-null, return translate[D], else just D. We + cast the subscript to translate because some data is declared as + `char *', to avoid warnings when a string constant is passed. But + when we use a character as a subscript we must make it unsigned. */ +/* ifdef MBS_SUPPORT, we translate only if character <= 0xff, + because it is impossible to allocate 4GB array for some encodings + which have 4 byte character_set like UCS4. */ + +# ifndef TRANSLATE +# ifdef WCHAR +# define TRANSLATE(d) \ + ((translate && ((UCHAR_T) (d)) <= 0xff) \ + ? (char) translate[(unsigned char) (d)] : (d)) +# else /* BYTE */ +# define TRANSLATE(d) \ + (translate ? (char) translate[(unsigned char) (d)] : (char) (d)) +# endif /* WCHAR */ +# endif + + +/* Macros for outputting the compiled pattern into `buffer'. */ + +/* If the buffer isn't allocated when it comes in, use this. */ +# define INIT_BUF_SIZE (32 * sizeof(UCHAR_T)) + +/* Make sure we have at least N more bytes of space in buffer. */ +# ifdef WCHAR +# define GET_BUFFER_SPACE(n) \ + while (((unsigned long)b - (unsigned long)COMPILED_BUFFER_VAR \ + + (n)*sizeof(CHAR_T)) > bufp->allocated) \ + EXTEND_BUFFER () +# else /* BYTE */ +# define GET_BUFFER_SPACE(n) \ + while ((unsigned long) (b - bufp->buffer + (n)) > bufp->allocated) \ + EXTEND_BUFFER () +# endif /* WCHAR */ + +/* Make sure we have one more byte of buffer space and then add C to it. */ +# define BUF_PUSH(c) \ + do { \ + GET_BUFFER_SPACE (1); \ + *b++ = (UCHAR_T) (c); \ + } while (0) + + +/* Ensure we have two more bytes of buffer space and then append C1 and C2. */ +# define BUF_PUSH_2(c1, c2) \ + do { \ + GET_BUFFER_SPACE (2); \ + *b++ = (UCHAR_T) (c1); \ + *b++ = (UCHAR_T) (c2); \ + } while (0) + + +/* As with BUF_PUSH_2, except for three bytes. */ +# define BUF_PUSH_3(c1, c2, c3) \ + do { \ + GET_BUFFER_SPACE (3); \ + *b++ = (UCHAR_T) (c1); \ + *b++ = (UCHAR_T) (c2); \ + *b++ = (UCHAR_T) (c3); \ + } while (0) + +/* Store a jump with opcode OP at LOC to location TO. We store a + relative address offset by the three bytes the jump itself occupies. */ +# define STORE_JUMP(op, loc, to) \ + PREFIX(store_op1) (op, loc, (int) ((to) - (loc) - (1 + OFFSET_ADDRESS_SIZE))) + +/* Likewise, for a two-argument jump. */ +# define STORE_JUMP2(op, loc, to, arg) \ + PREFIX(store_op2) (op, loc, (int) ((to) - (loc) - (1 + OFFSET_ADDRESS_SIZE)), arg) + +/* Like `STORE_JUMP', but for inserting. Assume `b' is the buffer end. */ +# define INSERT_JUMP(op, loc, to) \ + PREFIX(insert_op1) (op, loc, (int) ((to) - (loc) - (1 + OFFSET_ADDRESS_SIZE)), b) + +/* Like `STORE_JUMP2', but for inserting. Assume `b' is the buffer end. */ +# define INSERT_JUMP2(op, loc, to, arg) \ + PREFIX(insert_op2) (op, loc, (int) ((to) - (loc) - (1 + OFFSET_ADDRESS_SIZE)),\ + arg, b) + +/* This is not an arbitrary limit: the arguments which represent offsets + into the pattern are two bytes long. So if 2^16 bytes turns out to + be too small, many things would have to change. */ +/* Any other compiler which, like MSC, has allocation limit below 2^16 + bytes will have to use approach similar to what was done below for + MSC and drop MAX_BUF_SIZE a bit. Otherwise you may end up + reallocating to 0 bytes. Such thing is not going to work too well. + You have been warned!! */ +# ifndef DEFINED_ONCE +# if defined _MSC_VER && !defined WIN32 +/* Microsoft C 16-bit versions limit malloc to approx 65512 bytes. + The REALLOC define eliminates a flurry of conversion warnings, + but is not required. */ +# define MAX_BUF_SIZE 65500L +# define REALLOC(p,s) realloc ((p), (size_t) (s)) +# else +# define MAX_BUF_SIZE (1L << 16) +# define REALLOC(p,s) realloc ((p), (s)) +# endif + +/* Extend the buffer by twice its current size via realloc and + reset the pointers that pointed into the old block to point to the + correct places in the new one. If extending the buffer results in it + being larger than MAX_BUF_SIZE, then flag memory exhausted. */ +# if __BOUNDED_POINTERS__ +# define SET_HIGH_BOUND(P) (__ptrhigh (P) = __ptrlow (P) + bufp->allocated) +# define MOVE_BUFFER_POINTER(P) \ + (__ptrlow (P) += incr, SET_HIGH_BOUND (P), __ptrvalue (P) += incr) +# define ELSE_EXTEND_BUFFER_HIGH_BOUND \ + else \ + { \ + SET_HIGH_BOUND (b); \ + SET_HIGH_BOUND (begalt); \ + if (fixup_alt_jump) \ + SET_HIGH_BOUND (fixup_alt_jump); \ + if (laststart) \ + SET_HIGH_BOUND (laststart); \ + if (pending_exact) \ + SET_HIGH_BOUND (pending_exact); \ + } +# else +# define MOVE_BUFFER_POINTER(P) (P) += incr +# define ELSE_EXTEND_BUFFER_HIGH_BOUND +# endif +# endif /* not DEFINED_ONCE */ + +# ifdef WCHAR +# define EXTEND_BUFFER() \ + do { \ + UCHAR_T *old_buffer = COMPILED_BUFFER_VAR; \ + int wchar_count; \ + if (bufp->allocated + sizeof(UCHAR_T) > MAX_BUF_SIZE) \ + return REG_ESIZE; \ + bufp->allocated <<= 1; \ + if (bufp->allocated > MAX_BUF_SIZE) \ + bufp->allocated = MAX_BUF_SIZE; \ + /* How many characters the new buffer can have? */ \ + wchar_count = bufp->allocated / sizeof(UCHAR_T); \ + if (wchar_count == 0) wchar_count = 1; \ + /* Truncate the buffer to CHAR_T align. */ \ + bufp->allocated = wchar_count * sizeof(UCHAR_T); \ + RETALLOC (COMPILED_BUFFER_VAR, wchar_count, UCHAR_T); \ + bufp->buffer = (char*)COMPILED_BUFFER_VAR; \ + if (COMPILED_BUFFER_VAR == NULL) \ + return REG_ESPACE; \ + /* If the buffer moved, move all the pointers into it. */ \ + if (old_buffer != COMPILED_BUFFER_VAR) \ + { \ + int incr = COMPILED_BUFFER_VAR - old_buffer; \ + MOVE_BUFFER_POINTER (b); \ + MOVE_BUFFER_POINTER (begalt); \ + if (fixup_alt_jump) \ + MOVE_BUFFER_POINTER (fixup_alt_jump); \ + if (laststart) \ + MOVE_BUFFER_POINTER (laststart); \ + if (pending_exact) \ + MOVE_BUFFER_POINTER (pending_exact); \ + } \ + ELSE_EXTEND_BUFFER_HIGH_BOUND \ + } while (0) +# else /* BYTE */ +# define EXTEND_BUFFER() \ + do { \ + UCHAR_T *old_buffer = COMPILED_BUFFER_VAR; \ + if (bufp->allocated == MAX_BUF_SIZE) \ + return REG_ESIZE; \ + bufp->allocated <<= 1; \ + if (bufp->allocated > MAX_BUF_SIZE) \ + bufp->allocated = MAX_BUF_SIZE; \ + bufp->buffer = (UCHAR_T *) REALLOC (COMPILED_BUFFER_VAR, \ + bufp->allocated); \ + if (COMPILED_BUFFER_VAR == NULL) \ + return REG_ESPACE; \ + /* If the buffer moved, move all the pointers into it. */ \ + if (old_buffer != COMPILED_BUFFER_VAR) \ + { \ + int incr = COMPILED_BUFFER_VAR - old_buffer; \ + MOVE_BUFFER_POINTER (b); \ + MOVE_BUFFER_POINTER (begalt); \ + if (fixup_alt_jump) \ + MOVE_BUFFER_POINTER (fixup_alt_jump); \ + if (laststart) \ + MOVE_BUFFER_POINTER (laststart); \ + if (pending_exact) \ + MOVE_BUFFER_POINTER (pending_exact); \ + } \ + ELSE_EXTEND_BUFFER_HIGH_BOUND \ + } while (0) +# endif /* WCHAR */ + +# ifndef DEFINED_ONCE +/* Since we have one byte reserved for the register number argument to + {start,stop}_memory, the maximum number of groups we can report + things about is what fits in that byte. */ +# define MAX_REGNUM 255 + +/* But patterns can have more than `MAX_REGNUM' registers. We just + ignore the excess. */ +typedef unsigned regnum_t; + + +/* Macros for the compile stack. */ + +/* Since offsets can go either forwards or backwards, this type needs to + be able to hold values from -(MAX_BUF_SIZE - 1) to MAX_BUF_SIZE - 1. */ +/* int may be not enough when sizeof(int) == 2. */ +typedef long pattern_offset_t; + +typedef struct +{ + pattern_offset_t begalt_offset; + pattern_offset_t fixup_alt_jump; + pattern_offset_t inner_group_offset; + pattern_offset_t laststart_offset; + regnum_t regnum; +} compile_stack_elt_t; + + +typedef struct +{ + compile_stack_elt_t *stack; + unsigned size; + unsigned avail; /* Offset of next open position. */ +} compile_stack_type; + + +# define INIT_COMPILE_STACK_SIZE 32 + +# define COMPILE_STACK_EMPTY (compile_stack.avail == 0) +# define COMPILE_STACK_FULL (compile_stack.avail == compile_stack.size) + +/* The next available element. */ +# define COMPILE_STACK_TOP (compile_stack.stack[compile_stack.avail]) + +# endif /* not DEFINED_ONCE */ + +/* Set the bit for character C in a list. */ +# ifndef DEFINED_ONCE +# define SET_LIST_BIT(c) \ + (b[((unsigned char) (c)) / BYTEWIDTH] \ + |= 1 << (((unsigned char) c) % BYTEWIDTH)) +# endif /* DEFINED_ONCE */ + +/* Get the next unsigned number in the uncompiled pattern. */ +# define GET_UNSIGNED_NUMBER(num) \ + { \ + while (p != pend) \ + { \ + PATFETCH (c); \ + if (c < '0' || c > '9') \ + break; \ + if (num <= RE_DUP_MAX) \ + { \ + if (num < 0) \ + num = 0; \ + num = num * 10 + c - '0'; \ + } \ + } \ + } + +# ifndef DEFINED_ONCE +# if defined _LIBC || WIDE_CHAR_SUPPORT +/* The GNU C library provides support for user-defined character classes + and the functions from ISO C amendement 1. */ +# ifdef CHARCLASS_NAME_MAX +# define CHAR_CLASS_MAX_LENGTH CHARCLASS_NAME_MAX +# else +/* This shouldn't happen but some implementation might still have this + problem. Use a reasonable default value. */ +# define CHAR_CLASS_MAX_LENGTH 256 +# endif + +# ifdef _LIBC +# define IS_CHAR_CLASS(string) __wctype (string) +# else +# define IS_CHAR_CLASS(string) wctype (string) +# endif +# else +# define CHAR_CLASS_MAX_LENGTH 6 /* Namely, `xdigit'. */ + +# define IS_CHAR_CLASS(string) \ + (STREQ (string, "alpha") || STREQ (string, "upper") \ + || STREQ (string, "lower") || STREQ (string, "digit") \ + || STREQ (string, "alnum") || STREQ (string, "xdigit") \ + || STREQ (string, "space") || STREQ (string, "print") \ + || STREQ (string, "punct") || STREQ (string, "graph") \ + || STREQ (string, "cntrl") || STREQ (string, "blank")) +# endif +# endif /* DEFINED_ONCE */ + +# ifndef MATCH_MAY_ALLOCATE + +/* If we cannot allocate large objects within re_match_2_internal, + we make the fail stack and register vectors global. + The fail stack, we grow to the maximum size when a regexp + is compiled. + The register vectors, we adjust in size each time we + compile a regexp, according to the number of registers it needs. */ + +static PREFIX(fail_stack_type) fail_stack; + +/* Size with which the following vectors are currently allocated. + That is so we can make them bigger as needed, + but never make them smaller. */ +# ifdef DEFINED_ONCE +static int regs_allocated_size; + +static const char ** regstart, ** regend; +static const char ** old_regstart, ** old_regend; +static const char **best_regstart, **best_regend; +static const char **reg_dummy; +# endif /* DEFINED_ONCE */ + +static PREFIX(register_info_type) *PREFIX(reg_info); +static PREFIX(register_info_type) *PREFIX(reg_info_dummy); + +/* Make the register vectors big enough for NUM_REGS registers, + but don't make them smaller. */ + +static void +PREFIX(regex_grow_registers) (int num_regs) +{ + if (num_regs > regs_allocated_size) + { + RETALLOC_IF (regstart, num_regs, const char *); + RETALLOC_IF (regend, num_regs, const char *); + RETALLOC_IF (old_regstart, num_regs, const char *); + RETALLOC_IF (old_regend, num_regs, const char *); + RETALLOC_IF (best_regstart, num_regs, const char *); + RETALLOC_IF (best_regend, num_regs, const char *); + RETALLOC_IF (PREFIX(reg_info), num_regs, PREFIX(register_info_type)); + RETALLOC_IF (reg_dummy, num_regs, const char *); + RETALLOC_IF (PREFIX(reg_info_dummy), num_regs, PREFIX(register_info_type)); + + regs_allocated_size = num_regs; + } +} + +# endif /* not MATCH_MAY_ALLOCATE */ + +# ifndef DEFINED_ONCE +static boolean group_in_compile_stack (compile_stack_type compile_stack, + regnum_t regnum); +# endif /* not DEFINED_ONCE */ + +/* `regex_compile' compiles PATTERN (of length SIZE) according to SYNTAX. + Returns one of error codes defined in `regex.h', or zero for success. + + Assumes the `allocated' (and perhaps `buffer') and `translate' + fields are set in BUFP on entry. + + If it succeeds, results are put in BUFP (if it returns an error, the + contents of BUFP are undefined): + `buffer' is the compiled pattern; + `syntax' is set to SYNTAX; + `used' is set to the length of the compiled pattern; + `fastmap_accurate' is zero; + `re_nsub' is the number of subexpressions in PATTERN; + `not_bol' and `not_eol' are zero; + + The `fastmap' and `newline_anchor' fields are neither + examined nor set. */ + +/* Return, freeing storage we allocated. */ +# ifdef WCHAR +# define FREE_STACK_RETURN(value) \ + return (free(pattern), free(mbs_offset), free(is_binary), free (compile_stack.stack), value) +# else +# define FREE_STACK_RETURN(value) \ + return (free (compile_stack.stack), value) +# endif /* WCHAR */ + +static reg_errcode_t +PREFIX(regex_compile) (const char *ARG_PREFIX(pattern), + size_t ARG_PREFIX(size), reg_syntax_t syntax, + struct re_pattern_buffer *bufp) +{ + /* We fetch characters from PATTERN here. Even though PATTERN is + `char *' (i.e., signed), we declare these variables as unsigned, so + they can be reliably used as array indices. */ + register UCHAR_T c, c1; + +#ifdef WCHAR + /* A temporary space to keep wchar_t pattern and compiled pattern. */ + CHAR_T *pattern, *COMPILED_BUFFER_VAR; + size_t size; + /* offset buffer for optimization. See convert_mbs_to_wc. */ + int *mbs_offset = NULL; + /* It hold whether each wchar_t is binary data or not. */ + char *is_binary = NULL; + /* A flag whether exactn is handling binary data or not. */ + char is_exactn_bin = FALSE; +#endif /* WCHAR */ + + /* A random temporary spot in PATTERN. */ + const CHAR_T *p1; + + /* Points to the end of the buffer, where we should append. */ + register UCHAR_T *b; + + /* Keeps track of unclosed groups. */ + compile_stack_type compile_stack; + + /* Points to the current (ending) position in the pattern. */ +#ifdef WCHAR + const CHAR_T *p; + const CHAR_T *pend; +#else /* BYTE */ + const CHAR_T *p = pattern; + const CHAR_T *pend = pattern + size; +#endif /* WCHAR */ + + /* How to translate the characters in the pattern. */ + RE_TRANSLATE_TYPE translate = bufp->translate; + + /* Address of the count-byte of the most recently inserted `exactn' + command. This makes it possible to tell if a new exact-match + character can be added to that command or if the character requires + a new `exactn' command. */ + UCHAR_T *pending_exact = 0; + + /* Address of start of the most recently finished expression. + This tells, e.g., postfix * where to find the start of its + operand. Reset at the beginning of groups and alternatives. */ + UCHAR_T *laststart = 0; + + /* Address of beginning of regexp, or inside of last group. */ + UCHAR_T *begalt; + + /* Address of the place where a forward jump should go to the end of + the containing expression. Each alternative of an `or' -- except the + last -- ends with a forward jump of this sort. */ + UCHAR_T *fixup_alt_jump = 0; + + /* Counts open-groups as they are encountered. Remembered for the + matching close-group on the compile stack, so the same register + number is put in the stop_memory as the start_memory. */ + regnum_t regnum = 0; + +#ifdef WCHAR + /* Initialize the wchar_t PATTERN and offset_buffer. */ + p = pend = pattern = TALLOC(csize + 1, CHAR_T); + mbs_offset = TALLOC(csize + 1, int); + is_binary = TALLOC(csize + 1, char); + if (pattern == NULL || mbs_offset == NULL || is_binary == NULL) + { + free(pattern); + free(mbs_offset); + free(is_binary); + return REG_ESPACE; + } + pattern[csize] = L'\0'; /* sentinel */ + size = convert_mbs_to_wcs(pattern, cpattern, csize, mbs_offset, is_binary); + pend = p + size; + if (size < 0) + { + free(pattern); + free(mbs_offset); + free(is_binary); + return REG_BADPAT; + } +#endif + +#ifdef DEBUG + DEBUG_PRINT1 ("\nCompiling pattern: "); + if (debug) + { + unsigned debug_count; + + for (debug_count = 0; debug_count < size; debug_count++) + PUT_CHAR (pattern[debug_count]); + putchar ('\n'); + } +#endif /* DEBUG */ + + /* Initialize the compile stack. */ + compile_stack.stack = TALLOC (INIT_COMPILE_STACK_SIZE, compile_stack_elt_t); + if (compile_stack.stack == NULL) + { +#ifdef WCHAR + free(pattern); + free(mbs_offset); + free(is_binary); +#endif + return REG_ESPACE; + } + + compile_stack.size = INIT_COMPILE_STACK_SIZE; + compile_stack.avail = 0; + + /* Initialize the pattern buffer. */ + bufp->syntax = syntax; + bufp->fastmap_accurate = 0; + bufp->not_bol = bufp->not_eol = 0; + + /* Set `used' to zero, so that if we return an error, the pattern + printer (for debugging) will think there's no pattern. We reset it + at the end. */ + bufp->used = 0; + + /* Always count groups, whether or not bufp->no_sub is set. */ + bufp->re_nsub = 0; + +#if !defined emacs && !defined SYNTAX_TABLE + /* Initialize the syntax table. */ + init_syntax_once (); +#endif + + if (bufp->allocated == 0) + { + if (bufp->buffer) + { /* If zero allocated, but buffer is non-null, try to realloc + enough space. This loses if buffer's address is bogus, but + that is the user's responsibility. */ +#ifdef WCHAR + /* Free bufp->buffer and allocate an array for wchar_t pattern + buffer. */ + free(bufp->buffer); + COMPILED_BUFFER_VAR = TALLOC (INIT_BUF_SIZE/sizeof(UCHAR_T), + UCHAR_T); +#else + RETALLOC (COMPILED_BUFFER_VAR, INIT_BUF_SIZE, UCHAR_T); +#endif /* WCHAR */ + } + else + { /* Caller did not allocate a buffer. Do it for them. */ + COMPILED_BUFFER_VAR = TALLOC (INIT_BUF_SIZE / sizeof(UCHAR_T), + UCHAR_T); + } + + if (!COMPILED_BUFFER_VAR) FREE_STACK_RETURN (REG_ESPACE); +#ifdef WCHAR + bufp->buffer = (char*)COMPILED_BUFFER_VAR; +#endif /* WCHAR */ + bufp->allocated = INIT_BUF_SIZE; + } +#ifdef WCHAR + else + COMPILED_BUFFER_VAR = (UCHAR_T*) bufp->buffer; +#endif + + begalt = b = COMPILED_BUFFER_VAR; + + /* Loop through the uncompiled pattern until we're at the end. */ + while (p != pend) + { + PATFETCH (c); + + switch (c) + { + case '^': + { + if ( /* If at start of pattern, it's an operator. */ + p == pattern + 1 + /* If context independent, it's an operator. */ + || syntax & RE_CONTEXT_INDEP_ANCHORS + /* Otherwise, depends on what's come before. */ + || PREFIX(at_begline_loc_p) (pattern, p, syntax)) + BUF_PUSH (begline); + else + goto normal_char; + } + break; + + + case '$': + { + if ( /* If at end of pattern, it's an operator. */ + p == pend + /* If context independent, it's an operator. */ + || syntax & RE_CONTEXT_INDEP_ANCHORS + /* Otherwise, depends on what's next. */ + || PREFIX(at_endline_loc_p) (p, pend, syntax)) + BUF_PUSH (endline); + else + goto normal_char; + } + break; + + + case '+': + case '?': + if ((syntax & RE_BK_PLUS_QM) + || (syntax & RE_LIMITED_OPS)) + goto normal_char; + handle_plus: + case '*': + /* If there is no previous pattern... */ + if (!laststart) + { + if (syntax & RE_CONTEXT_INVALID_OPS) + FREE_STACK_RETURN (REG_BADRPT); + else if (!(syntax & RE_CONTEXT_INDEP_OPS)) + goto normal_char; + } + + { + /* Are we optimizing this jump? */ + boolean keep_string_p = false; + + /* 1 means zero (many) matches is allowed. */ + char zero_times_ok = 0, many_times_ok = 0; + + /* If there is a sequence of repetition chars, collapse it + down to just one (the right one). We can't combine + interval operators with these because of, e.g., `a{2}*', + which should only match an even number of `a's. */ + + for (;;) + { + zero_times_ok |= c != '+'; + many_times_ok |= c != '?'; + + if (p == pend) + break; + + PATFETCH (c); + + if (c == '*' + || (!(syntax & RE_BK_PLUS_QM) && (c == '+' || c == '?'))) + ; + + else if (syntax & RE_BK_PLUS_QM && c == '\\') + { + if (p == pend) FREE_STACK_RETURN (REG_EESCAPE); + + PATFETCH (c1); + if (!(c1 == '+' || c1 == '?')) + { + PATUNFETCH; + PATUNFETCH; + break; + } + + c = c1; + } + else + { + PATUNFETCH; + break; + } + + /* If we get here, we found another repeat character. */ + } + + /* Star, etc. applied to an empty pattern is equivalent + to an empty pattern. */ + if (!laststart) + break; + + /* Now we know whether or not zero matches is allowed + and also whether or not two or more matches is allowed. */ + if (many_times_ok) + { /* More than one repetition is allowed, so put in at the + end a backward relative jump from `b' to before the next + jump we're going to put in below (which jumps from + laststart to after this jump). + + But if we are at the `*' in the exact sequence `.*\n', + insert an unconditional jump backwards to the ., + instead of the beginning of the loop. This way we only + push a failure point once, instead of every time + through the loop. */ + assert (p - 1 > pattern); + + /* Allocate the space for the jump. */ + GET_BUFFER_SPACE (1 + OFFSET_ADDRESS_SIZE); + + /* We know we are not at the first character of the pattern, + because laststart was nonzero. And we've already + incremented `p', by the way, to be the character after + the `*'. Do we have to do something analogous here + for null bytes, because of RE_DOT_NOT_NULL? */ + if (TRANSLATE (*(p - 2)) == TRANSLATE ('.') + && zero_times_ok + && p < pend && TRANSLATE (*p) == TRANSLATE ('\n') + && !(syntax & RE_DOT_NEWLINE)) + { /* We have .*\n. */ + STORE_JUMP (jump, b, laststart); + keep_string_p = true; + } + else + /* Anything else. */ + STORE_JUMP (maybe_pop_jump, b, laststart - + (1 + OFFSET_ADDRESS_SIZE)); + + /* We've added more stuff to the buffer. */ + b += 1 + OFFSET_ADDRESS_SIZE; + } + + /* On failure, jump from laststart to b + 3, which will be the + end of the buffer after this jump is inserted. */ + /* ifdef WCHAR, 'b + 1 + OFFSET_ADDRESS_SIZE' instead of + 'b + 3'. */ + GET_BUFFER_SPACE (1 + OFFSET_ADDRESS_SIZE); + INSERT_JUMP (keep_string_p ? on_failure_keep_string_jump + : on_failure_jump, + laststart, b + 1 + OFFSET_ADDRESS_SIZE); + pending_exact = 0; + b += 1 + OFFSET_ADDRESS_SIZE; + + if (!zero_times_ok) + { + /* At least one repetition is required, so insert a + `dummy_failure_jump' before the initial + `on_failure_jump' instruction of the loop. This + effects a skip over that instruction the first time + we hit that loop. */ + GET_BUFFER_SPACE (1 + OFFSET_ADDRESS_SIZE); + INSERT_JUMP (dummy_failure_jump, laststart, laststart + + 2 + 2 * OFFSET_ADDRESS_SIZE); + b += 1 + OFFSET_ADDRESS_SIZE; + } + } + break; + + + case '.': + laststart = b; + BUF_PUSH (anychar); + break; + + + case '[': + { + boolean had_char_class = false; +#ifdef WCHAR + CHAR_T range_start = 0xffffffff; +#else + unsigned int range_start = 0xffffffff; +#endif + if (p == pend) FREE_STACK_RETURN (REG_EBRACK); + +#ifdef WCHAR + /* We assume a charset(_not) structure as a wchar_t array. + charset[0] = (re_opcode_t) charset(_not) + charset[1] = l (= length of char_classes) + charset[2] = m (= length of collating_symbols) + charset[3] = n (= length of equivalence_classes) + charset[4] = o (= length of char_ranges) + charset[5] = p (= length of chars) + + charset[6] = char_class (wctype_t) + charset[6+CHAR_CLASS_SIZE] = char_class (wctype_t) + ... + charset[l+5] = char_class (wctype_t) + + charset[l+6] = collating_symbol (wchar_t) + ... + charset[l+m+5] = collating_symbol (wchar_t) + ifdef _LIBC we use the index if + _NL_COLLATE_SYMB_EXTRAMB instead of + wchar_t string. + + charset[l+m+6] = equivalence_classes (wchar_t) + ... + charset[l+m+n+5] = equivalence_classes (wchar_t) + ifdef _LIBC we use the index in + _NL_COLLATE_WEIGHT instead of + wchar_t string. + + charset[l+m+n+6] = range_start + charset[l+m+n+7] = range_end + ... + charset[l+m+n+2o+4] = range_start + charset[l+m+n+2o+5] = range_end + ifdef _LIBC we use the value looked up + in _NL_COLLATE_COLLSEQ instead of + wchar_t character. + + charset[l+m+n+2o+6] = char + ... + charset[l+m+n+2o+p+5] = char + + */ + + /* We need at least 6 spaces: the opcode, the length of + char_classes, the length of collating_symbols, the length of + equivalence_classes, the length of char_ranges, the length of + chars. */ + GET_BUFFER_SPACE (6); + + /* Save b as laststart. And We use laststart as the pointer + to the first element of the charset here. + In other words, laststart[i] indicates charset[i]. */ + laststart = b; + + /* We test `*p == '^' twice, instead of using an if + statement, so we only need one BUF_PUSH. */ + BUF_PUSH (*p == '^' ? charset_not : charset); + if (*p == '^') + p++; + + /* Push the length of char_classes, the length of + collating_symbols, the length of equivalence_classes, the + length of char_ranges and the length of chars. */ + BUF_PUSH_3 (0, 0, 0); + BUF_PUSH_2 (0, 0); + + /* Remember the first position in the bracket expression. */ + p1 = p; + + /* charset_not matches newline according to a syntax bit. */ + if ((re_opcode_t) b[-6] == charset_not + && (syntax & RE_HAT_LISTS_NOT_NEWLINE)) + { + BUF_PUSH('\n'); + laststart[5]++; /* Update the length of characters */ + } + + /* Read in characters and ranges, setting map bits. */ + for (;;) + { + if (p == pend) FREE_STACK_RETURN (REG_EBRACK); + + PATFETCH (c); + + /* \ might escape characters inside [...] and [^...]. */ + if ((syntax & RE_BACKSLASH_ESCAPE_IN_LISTS) && c == '\\') + { + if (p == pend) FREE_STACK_RETURN (REG_EESCAPE); + + PATFETCH (c1); + BUF_PUSH(c1); + laststart[5]++; /* Update the length of chars */ + range_start = c1; + continue; + } + + /* Could be the end of the bracket expression. If it's + not (i.e., when the bracket expression is `[]' so + far), the ']' character bit gets set way below. */ + if (c == ']' && p != p1 + 1) + break; + + /* Look ahead to see if it's a range when the last thing + was a character class. */ + if (had_char_class && c == '-' && *p != ']') + FREE_STACK_RETURN (REG_ERANGE); + + /* Look ahead to see if it's a range when the last thing + was a character: if this is a hyphen not at the + beginning or the end of a list, then it's the range + operator. */ + if (c == '-' + && !(p - 2 >= pattern && p[-2] == '[') + && !(p - 3 >= pattern && p[-3] == '[' && p[-2] == '^') + && *p != ']') + { + reg_errcode_t ret; + /* Allocate the space for range_start and range_end. */ + GET_BUFFER_SPACE (2); + /* Update the pointer to indicate end of buffer. */ + b += 2; + ret = wcs_compile_range (range_start, &p, pend, translate, + syntax, b, laststart); + if (ret != REG_NOERROR) FREE_STACK_RETURN (ret); + range_start = 0xffffffff; + } + else if (p[0] == '-' && p[1] != ']') + { /* This handles ranges made up of characters only. */ + reg_errcode_t ret; + + /* Move past the `-'. */ + PATFETCH (c1); + /* Allocate the space for range_start and range_end. */ + GET_BUFFER_SPACE (2); + /* Update the pointer to indicate end of buffer. */ + b += 2; + ret = wcs_compile_range (c, &p, pend, translate, syntax, b, + laststart); + if (ret != REG_NOERROR) FREE_STACK_RETURN (ret); + range_start = 0xffffffff; + } + + /* See if we're at the beginning of a possible character + class. */ + else if (syntax & RE_CHAR_CLASSES && c == '[' && *p == ':') + { /* Leave room for the null. */ + char str[CHAR_CLASS_MAX_LENGTH + 1]; + + PATFETCH (c); + c1 = 0; + + /* If pattern is `[[:'. */ + if (p == pend) FREE_STACK_RETURN (REG_EBRACK); + + for (;;) + { + PATFETCH (c); + if ((c == ':' && *p == ']') || p == pend) + break; + if (c1 < CHAR_CLASS_MAX_LENGTH) + str[c1++] = c; + else + /* This is in any case an invalid class name. */ + str[0] = '\0'; + } + str[c1] = '\0'; + + /* If isn't a word bracketed by `[:' and `:]': + undo the ending character, the letters, and leave + the leading `:' and `[' (but store them as character). */ + if (c == ':' && *p == ']') + { + wctype_t wt; + uintptr_t alignedp; + + /* Query the character class as wctype_t. */ + wt = IS_CHAR_CLASS (str); + if (wt == 0) + FREE_STACK_RETURN (REG_ECTYPE); + + /* Throw away the ] at the end of the character + class. */ + PATFETCH (c); + + if (p == pend) FREE_STACK_RETURN (REG_EBRACK); + + /* Allocate the space for character class. */ + GET_BUFFER_SPACE(CHAR_CLASS_SIZE); + /* Update the pointer to indicate end of buffer. */ + b += CHAR_CLASS_SIZE; + /* Move data which follow character classes + not to violate the data. */ + insert_space(CHAR_CLASS_SIZE, + laststart + 6 + laststart[1], + b - 1); + alignedp = ((uintptr_t)(laststart + 6 + laststart[1]) + + __alignof__(wctype_t) - 1) + & ~(uintptr_t)(__alignof__(wctype_t) - 1); + /* Store the character class. */ + *((wctype_t*)alignedp) = wt; + /* Update length of char_classes */ + laststart[1] += CHAR_CLASS_SIZE; + + had_char_class = true; + } + else + { + c1++; + while (c1--) + PATUNFETCH; + BUF_PUSH ('['); + BUF_PUSH (':'); + laststart[5] += 2; /* Update the length of characters */ + range_start = ':'; + had_char_class = false; + } + } + else if (syntax & RE_CHAR_CLASSES && c == '[' && (*p == '=' + || *p == '.')) + { + CHAR_T str[128]; /* Should be large enough. */ + CHAR_T delim = *p; /* '=' or '.' */ +# ifdef _LIBC + uint32_t nrules = + _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES); +# endif + PATFETCH (c); + c1 = 0; + + /* If pattern is `[[=' or '[[.'. */ + if (p == pend) FREE_STACK_RETURN (REG_EBRACK); + + for (;;) + { + PATFETCH (c); + if ((c == delim && *p == ']') || p == pend) + break; + if (c1 < sizeof (str) - 1) + str[c1++] = c; + else + /* This is in any case an invalid class name. */ + str[0] = '\0'; + } + str[c1] = '\0'; + + if (c == delim && *p == ']' && str[0] != '\0') + { + unsigned int i, offset; + /* If we have no collation data we use the default + collation in which each character is in a class + by itself. It also means that ASCII is the + character set and therefore we cannot have character + with more than one byte in the multibyte + representation. */ + + /* If not defined _LIBC, we push the name and + `\0' for the sake of matching performance. */ + int datasize = c1 + 1; + +# ifdef _LIBC + int32_t idx = 0; + if (nrules == 0) +# endif + { + if (c1 != 1) + FREE_STACK_RETURN (REG_ECOLLATE); + } +# ifdef _LIBC + else + { + const int32_t *table; + const int32_t *weights; + const int32_t *extra; + const int32_t *indirect; + wint_t *cp; + + /* This #include defines a local function! */ +# include + + if(delim == '=') + { + /* We push the index for equivalence class. */ + cp = (wint_t*)str; + + table = (const int32_t *) + _NL_CURRENT (LC_COLLATE, + _NL_COLLATE_TABLEWC); + weights = (const int32_t *) + _NL_CURRENT (LC_COLLATE, + _NL_COLLATE_WEIGHTWC); + extra = (const int32_t *) + _NL_CURRENT (LC_COLLATE, + _NL_COLLATE_EXTRAWC); + indirect = (const int32_t *) + _NL_CURRENT (LC_COLLATE, + _NL_COLLATE_INDIRECTWC); + + idx = findidx ((const wint_t**)&cp); + if (idx == 0 || cp < (wint_t*) str + c1) + /* This is no valid character. */ + FREE_STACK_RETURN (REG_ECOLLATE); + + str[0] = (wchar_t)idx; + } + else /* delim == '.' */ + { + /* We push collation sequence value + for collating symbol. */ + int32_t table_size; + const int32_t *symb_table; + const unsigned char *extra; + int32_t idx; + int32_t elem; + int32_t second; + int32_t hash; + char char_str[c1]; + + /* We have to convert the name to a single-byte + string. This is possible since the names + consist of ASCII characters and the internal + representation is UCS4. */ + for (i = 0; i < c1; ++i) + char_str[i] = str[i]; + + table_size = + _NL_CURRENT_WORD (LC_COLLATE, + _NL_COLLATE_SYMB_HASH_SIZEMB); + symb_table = (const int32_t *) + _NL_CURRENT (LC_COLLATE, + _NL_COLLATE_SYMB_TABLEMB); + extra = (const unsigned char *) + _NL_CURRENT (LC_COLLATE, + _NL_COLLATE_SYMB_EXTRAMB); + + /* Locate the character in the hashing table. */ + hash = elem_hash (char_str, c1); + + idx = 0; + elem = hash % table_size; + second = hash % (table_size - 2); + while (symb_table[2 * elem] != 0) + { + /* First compare the hashing value. */ + if (symb_table[2 * elem] == hash + && c1 == extra[symb_table[2 * elem + 1]] + && memcmp (char_str, + &extra[symb_table[2 * elem + 1] + + 1], c1) == 0) + { + /* Yep, this is the entry. */ + idx = symb_table[2 * elem + 1]; + idx += 1 + extra[idx]; + break; + } + + /* Next entry. */ + elem += second; + } + + if (symb_table[2 * elem] != 0) + { + /* Compute the index of the byte sequence + in the table. */ + idx += 1 + extra[idx]; + /* Adjust for the alignment. */ + idx = (idx + 3) & ~3; + + str[0] = (wchar_t) idx + 4; + } + else if (symb_table[2 * elem] == 0 && c1 == 1) + { + /* No valid character. Match it as a + single byte character. */ + had_char_class = false; + BUF_PUSH(str[0]); + /* Update the length of characters */ + laststart[5]++; + range_start = str[0]; + + /* Throw away the ] at the end of the + collating symbol. */ + PATFETCH (c); + /* exit from the switch block. */ + continue; + } + else + FREE_STACK_RETURN (REG_ECOLLATE); + } + datasize = 1; + } +# endif + /* Throw away the ] at the end of the equivalence + class (or collating symbol). */ + PATFETCH (c); + + /* Allocate the space for the equivalence class + (or collating symbol) (and '\0' if needed). */ + GET_BUFFER_SPACE(datasize); + /* Update the pointer to indicate end of buffer. */ + b += datasize; + + if (delim == '=') + { /* equivalence class */ + /* Calculate the offset of char_ranges, + which is next to equivalence_classes. */ + offset = laststart[1] + laststart[2] + + laststart[3] +6; + /* Insert space. */ + insert_space(datasize, laststart + offset, b - 1); + + /* Write the equivalence_class and \0. */ + for (i = 0 ; i < datasize ; i++) + laststart[offset + i] = str[i]; + + /* Update the length of equivalence_classes. */ + laststart[3] += datasize; + had_char_class = true; + } + else /* delim == '.' */ + { /* collating symbol */ + /* Calculate the offset of the equivalence_classes, + which is next to collating_symbols. */ + offset = laststart[1] + laststart[2] + 6; + /* Insert space and write the collationg_symbol + and \0. */ + insert_space(datasize, laststart + offset, b-1); + for (i = 0 ; i < datasize ; i++) + laststart[offset + i] = str[i]; + + /* In re_match_2_internal if range_start < -1, we + assume -range_start is the offset of the + collating symbol which is specified as + the character of the range start. So we assign + -(laststart[1] + laststart[2] + 6) to + range_start. */ + range_start = -(laststart[1] + laststart[2] + 6); + /* Update the length of collating_symbol. */ + laststart[2] += datasize; + had_char_class = false; + } + } + else + { + c1++; + while (c1--) + PATUNFETCH; + BUF_PUSH ('['); + BUF_PUSH (delim); + laststart[5] += 2; /* Update the length of characters */ + range_start = delim; + had_char_class = false; + } + } + else + { + had_char_class = false; + BUF_PUSH(c); + laststart[5]++; /* Update the length of characters */ + range_start = c; + } + } + +#else /* BYTE */ + /* Ensure that we have enough space to push a charset: the + opcode, the length count, and the bitset; 34 bytes in all. */ + GET_BUFFER_SPACE (34); + + laststart = b; + + /* We test `*p == '^' twice, instead of using an if + statement, so we only need one BUF_PUSH. */ + BUF_PUSH (*p == '^' ? charset_not : charset); + if (*p == '^') + p++; + + /* Remember the first position in the bracket expression. */ + p1 = p; + + /* Push the number of bytes in the bitmap. */ + BUF_PUSH ((1 << BYTEWIDTH) / BYTEWIDTH); + + /* Clear the whole map. */ + bzero (b, (1 << BYTEWIDTH) / BYTEWIDTH); + + /* charset_not matches newline according to a syntax bit. */ + if ((re_opcode_t) b[-2] == charset_not + && (syntax & RE_HAT_LISTS_NOT_NEWLINE)) + SET_LIST_BIT ('\n'); + + /* Read in characters and ranges, setting map bits. */ + for (;;) + { + if (p == pend) FREE_STACK_RETURN (REG_EBRACK); + + PATFETCH (c); + + /* \ might escape characters inside [...] and [^...]. */ + if ((syntax & RE_BACKSLASH_ESCAPE_IN_LISTS) && c == '\\') + { + if (p == pend) FREE_STACK_RETURN (REG_EESCAPE); + + PATFETCH (c1); + SET_LIST_BIT (c1); + range_start = c1; + continue; + } + + /* Could be the end of the bracket expression. If it's + not (i.e., when the bracket expression is `[]' so + far), the ']' character bit gets set way below. */ + if (c == ']' && p != p1 + 1) + break; + + /* Look ahead to see if it's a range when the last thing + was a character class. */ + if (had_char_class && c == '-' && *p != ']') + FREE_STACK_RETURN (REG_ERANGE); + + /* Look ahead to see if it's a range when the last thing + was a character: if this is a hyphen not at the + beginning or the end of a list, then it's the range + operator. */ + if (c == '-' + && !(p - 2 >= pattern && p[-2] == '[') + && !(p - 3 >= pattern && p[-3] == '[' && p[-2] == '^') + && *p != ']') + { + reg_errcode_t ret + = byte_compile_range (range_start, &p, pend, translate, + syntax, b); + if (ret != REG_NOERROR) FREE_STACK_RETURN (ret); + range_start = 0xffffffff; + } + + else if (p[0] == '-' && p[1] != ']') + { /* This handles ranges made up of characters only. */ + reg_errcode_t ret; + + /* Move past the `-'. */ + PATFETCH (c1); + + ret = byte_compile_range (c, &p, pend, translate, syntax, b); + if (ret != REG_NOERROR) FREE_STACK_RETURN (ret); + range_start = 0xffffffff; + } + + /* See if we're at the beginning of a possible character + class. */ + + else if (syntax & RE_CHAR_CLASSES && c == '[' && *p == ':') + { /* Leave room for the null. */ + char str[CHAR_CLASS_MAX_LENGTH + 1]; + + PATFETCH (c); + c1 = 0; + + /* If pattern is `[[:'. */ + if (p == pend) FREE_STACK_RETURN (REG_EBRACK); + + for (;;) + { + PATFETCH (c); + if ((c == ':' && *p == ']') || p == pend) + break; + if (c1 < CHAR_CLASS_MAX_LENGTH) + str[c1++] = c; + else + /* This is in any case an invalid class name. */ + str[0] = '\0'; + } + str[c1] = '\0'; + + /* If isn't a word bracketed by `[:' and `:]': + undo the ending character, the letters, and leave + the leading `:' and `[' (but set bits for them). */ + if (c == ':' && *p == ']') + { +# if defined _LIBC || WIDE_CHAR_SUPPORT + boolean is_lower = STREQ (str, "lower"); + boolean is_upper = STREQ (str, "upper"); + wctype_t wt; + int ch; + + wt = IS_CHAR_CLASS (str); + if (wt == 0) + FREE_STACK_RETURN (REG_ECTYPE); + + /* Throw away the ] at the end of the character + class. */ + PATFETCH (c); + + if (p == pend) FREE_STACK_RETURN (REG_EBRACK); + + for (ch = 0; ch < 1 << BYTEWIDTH; ++ch) + { +# ifdef _LIBC + if (__iswctype (__btowc (ch), wt)) + SET_LIST_BIT (ch); +# else + if (iswctype (btowc (ch), wt)) + SET_LIST_BIT (ch); +# endif + + if (translate && (is_upper || is_lower) + && (ISUPPER (ch) || ISLOWER (ch))) + SET_LIST_BIT (ch); + } + + had_char_class = true; +# else + int ch; + boolean is_alnum = STREQ (str, "alnum"); + boolean is_alpha = STREQ (str, "alpha"); + boolean is_blank = STREQ (str, "blank"); + boolean is_cntrl = STREQ (str, "cntrl"); + boolean is_digit = STREQ (str, "digit"); + boolean is_graph = STREQ (str, "graph"); + boolean is_lower = STREQ (str, "lower"); + boolean is_print = STREQ (str, "print"); + boolean is_punct = STREQ (str, "punct"); + boolean is_space = STREQ (str, "space"); + boolean is_upper = STREQ (str, "upper"); + boolean is_xdigit = STREQ (str, "xdigit"); + + if (!IS_CHAR_CLASS (str)) + FREE_STACK_RETURN (REG_ECTYPE); + + /* Throw away the ] at the end of the character + class. */ + PATFETCH (c); + + if (p == pend) FREE_STACK_RETURN (REG_EBRACK); + + for (ch = 0; ch < 1 << BYTEWIDTH; ch++) + { + /* This was split into 3 if's to + avoid an arbitrary limit in some compiler. */ + if ( (is_alnum && ISALNUM (ch)) + || (is_alpha && ISALPHA (ch)) + || (is_blank && ISBLANK (ch)) + || (is_cntrl && ISCNTRL (ch))) + SET_LIST_BIT (ch); + if ( (is_digit && ISDIGIT (ch)) + || (is_graph && ISGRAPH (ch)) + || (is_lower && ISLOWER (ch)) + || (is_print && ISPRINT (ch))) + SET_LIST_BIT (ch); + if ( (is_punct && ISPUNCT (ch)) + || (is_space && ISSPACE (ch)) + || (is_upper && ISUPPER (ch)) + || (is_xdigit && ISXDIGIT (ch))) + SET_LIST_BIT (ch); + if ( translate && (is_upper || is_lower) + && (ISUPPER (ch) || ISLOWER (ch))) + SET_LIST_BIT (ch); + } + had_char_class = true; +# endif /* libc || wctype.h */ + } + else + { + c1++; + while (c1--) + PATUNFETCH; + SET_LIST_BIT ('['); + SET_LIST_BIT (':'); + range_start = ':'; + had_char_class = false; + } + } + else if (syntax & RE_CHAR_CLASSES && c == '[' && *p == '=') + { + unsigned char str[MB_LEN_MAX + 1]; +# ifdef _LIBC + uint32_t nrules = + _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES); +# endif + + PATFETCH (c); + c1 = 0; + + /* If pattern is `[[='. */ + if (p == pend) FREE_STACK_RETURN (REG_EBRACK); + + for (;;) + { + PATFETCH (c); + if ((c == '=' && *p == ']') || p == pend) + break; + if (c1 < MB_LEN_MAX) + str[c1++] = c; + else + /* This is in any case an invalid class name. */ + str[0] = '\0'; + } + str[c1] = '\0'; + + if (c == '=' && *p == ']' && str[0] != '\0') + { + /* If we have no collation data we use the default + collation in which each character is in a class + by itself. It also means that ASCII is the + character set and therefore we cannot have character + with more than one byte in the multibyte + representation. */ +# ifdef _LIBC + if (nrules == 0) +# endif + { + if (c1 != 1) + FREE_STACK_RETURN (REG_ECOLLATE); + + /* Throw away the ] at the end of the equivalence + class. */ + PATFETCH (c); + + /* Set the bit for the character. */ + SET_LIST_BIT (str[0]); + } +# ifdef _LIBC + else + { + /* Try to match the byte sequence in `str' against + those known to the collate implementation. + First find out whether the bytes in `str' are + actually from exactly one character. */ + const int32_t *table; + const unsigned char *weights; + const unsigned char *extra; + const int32_t *indirect; + int32_t idx; + const unsigned char *cp = str; + int ch; + + /* This #include defines a local function! */ +# include + + table = (const int32_t *) + _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB); + weights = (const unsigned char *) + _NL_CURRENT (LC_COLLATE, _NL_COLLATE_WEIGHTMB); + extra = (const unsigned char *) + _NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAMB); + indirect = (const int32_t *) + _NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTMB); + + idx = findidx (&cp); + if (idx == 0 || cp < str + c1) + /* This is no valid character. */ + FREE_STACK_RETURN (REG_ECOLLATE); + + /* Throw away the ] at the end of the equivalence + class. */ + PATFETCH (c); + + /* Now we have to go throught the whole table + and find all characters which have the same + first level weight. + + XXX Note that this is not entirely correct. + we would have to match multibyte sequences + but this is not possible with the current + implementation. */ + for (ch = 1; ch < 256; ++ch) + /* XXX This test would have to be changed if we + would allow matching multibyte sequences. */ + if (table[ch] > 0) + { + int32_t idx2 = table[ch]; + size_t len = weights[idx2]; + + /* Test whether the lenghts match. */ + if (weights[idx] == len) + { + /* They do. New compare the bytes of + the weight. */ + size_t cnt = 0; + + while (cnt < len + && (weights[idx + 1 + cnt] + == weights[idx2 + 1 + cnt])) + ++cnt; + + if (cnt == len) + /* They match. Mark the character as + acceptable. */ + SET_LIST_BIT (ch); + } + } + } +# endif + had_char_class = true; + } + else + { + c1++; + while (c1--) + PATUNFETCH; + SET_LIST_BIT ('['); + SET_LIST_BIT ('='); + range_start = '='; + had_char_class = false; + } + } + else if (syntax & RE_CHAR_CLASSES && c == '[' && *p == '.') + { + unsigned char str[128]; /* Should be large enough. */ +# ifdef _LIBC + uint32_t nrules = + _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES); +# endif + + PATFETCH (c); + c1 = 0; + + /* If pattern is `[[.'. */ + if (p == pend) FREE_STACK_RETURN (REG_EBRACK); + + for (;;) + { + PATFETCH (c); + if ((c == '.' && *p == ']') || p == pend) + break; + if (c1 < sizeof (str)) + str[c1++] = c; + else + /* This is in any case an invalid class name. */ + str[0] = '\0'; + } + str[c1] = '\0'; + + if (c == '.' && *p == ']' && str[0] != '\0') + { + /* If we have no collation data we use the default + collation in which each character is the name + for its own class which contains only the one + character. It also means that ASCII is the + character set and therefore we cannot have character + with more than one byte in the multibyte + representation. */ +# ifdef _LIBC + if (nrules == 0) +# endif + { + if (c1 != 1) + FREE_STACK_RETURN (REG_ECOLLATE); + + /* Throw away the ] at the end of the equivalence + class. */ + PATFETCH (c); + + /* Set the bit for the character. */ + SET_LIST_BIT (str[0]); + range_start = ((const unsigned char *) str)[0]; + } +# ifdef _LIBC + else + { + /* Try to match the byte sequence in `str' against + those known to the collate implementation. + First find out whether the bytes in `str' are + actually from exactly one character. */ + int32_t table_size; + const int32_t *symb_table; + const unsigned char *extra; + int32_t idx; + int32_t elem; + int32_t second; + int32_t hash; + + table_size = + _NL_CURRENT_WORD (LC_COLLATE, + _NL_COLLATE_SYMB_HASH_SIZEMB); + symb_table = (const int32_t *) + _NL_CURRENT (LC_COLLATE, + _NL_COLLATE_SYMB_TABLEMB); + extra = (const unsigned char *) + _NL_CURRENT (LC_COLLATE, + _NL_COLLATE_SYMB_EXTRAMB); + + /* Locate the character in the hashing table. */ + hash = elem_hash (str, c1); + + idx = 0; + elem = hash % table_size; + second = hash % (table_size - 2); + while (symb_table[2 * elem] != 0) + { + /* First compare the hashing value. */ + if (symb_table[2 * elem] == hash + && c1 == extra[symb_table[2 * elem + 1]] + && memcmp (str, + &extra[symb_table[2 * elem + 1] + + 1], + c1) == 0) + { + /* Yep, this is the entry. */ + idx = symb_table[2 * elem + 1]; + idx += 1 + extra[idx]; + break; + } + + /* Next entry. */ + elem += second; + } + + if (symb_table[2 * elem] == 0) + /* This is no valid character. */ + FREE_STACK_RETURN (REG_ECOLLATE); + + /* Throw away the ] at the end of the equivalence + class. */ + PATFETCH (c); + + /* Now add the multibyte character(s) we found + to the accept list. + + XXX Note that this is not entirely correct. + we would have to match multibyte sequences + but this is not possible with the current + implementation. Also, we have to match + collating symbols, which expand to more than + one file, as a whole and not allow the + individual bytes. */ + c1 = extra[idx++]; + if (c1 == 1) + range_start = extra[idx]; + while (c1-- > 0) + { + SET_LIST_BIT (extra[idx]); + ++idx; + } + } +# endif + had_char_class = false; + } + else + { + c1++; + while (c1--) + PATUNFETCH; + SET_LIST_BIT ('['); + SET_LIST_BIT ('.'); + range_start = '.'; + had_char_class = false; + } + } + else + { + had_char_class = false; + SET_LIST_BIT (c); + range_start = c; + } + } + + /* Discard any (non)matching list bytes that are all 0 at the + end of the map. Decrease the map-length byte too. */ + while ((int) b[-1] > 0 && b[b[-1] - 1] == 0) + b[-1]--; + b += b[-1]; +#endif /* WCHAR */ + } + break; + + + case '(': + if (syntax & RE_NO_BK_PARENS) + goto handle_open; + else + goto normal_char; + + + case ')': + if (syntax & RE_NO_BK_PARENS) + goto handle_close; + else + goto normal_char; + + + case '\n': + if (syntax & RE_NEWLINE_ALT) + goto handle_alt; + else + goto normal_char; + + + case '|': + if (syntax & RE_NO_BK_VBAR) + goto handle_alt; + else + goto normal_char; + + + case '{': + if (syntax & RE_INTERVALS && syntax & RE_NO_BK_BRACES) + goto handle_interval; + else + goto normal_char; + + + case '\\': + if (p == pend) FREE_STACK_RETURN (REG_EESCAPE); + + /* Do not translate the character after the \, so that we can + distinguish, e.g., \B from \b, even if we normally would + translate, e.g., B to b. */ + PATFETCH_RAW (c); + + switch (c) + { + case '(': + if (syntax & RE_NO_BK_PARENS) + goto normal_backslash; + + handle_open: + bufp->re_nsub++; + regnum++; + + if (COMPILE_STACK_FULL) + { + RETALLOC (compile_stack.stack, compile_stack.size << 1, + compile_stack_elt_t); + if (compile_stack.stack == NULL) return REG_ESPACE; + + compile_stack.size <<= 1; + } + + /* These are the values to restore when we hit end of this + group. They are all relative offsets, so that if the + whole pattern moves because of realloc, they will still + be valid. */ + COMPILE_STACK_TOP.begalt_offset = begalt - COMPILED_BUFFER_VAR; + COMPILE_STACK_TOP.fixup_alt_jump + = fixup_alt_jump ? fixup_alt_jump - COMPILED_BUFFER_VAR + 1 : 0; + COMPILE_STACK_TOP.laststart_offset = b - COMPILED_BUFFER_VAR; + COMPILE_STACK_TOP.regnum = regnum; + + /* We will eventually replace the 0 with the number of + groups inner to this one. But do not push a + start_memory for groups beyond the last one we can + represent in the compiled pattern. */ + if (regnum <= MAX_REGNUM) + { + COMPILE_STACK_TOP.inner_group_offset = b + - COMPILED_BUFFER_VAR + 2; + BUF_PUSH_3 (start_memory, regnum, 0); + } + + compile_stack.avail++; + + fixup_alt_jump = 0; + laststart = 0; + begalt = b; + /* If we've reached MAX_REGNUM groups, then this open + won't actually generate any code, so we'll have to + clear pending_exact explicitly. */ + pending_exact = 0; + break; + + + case ')': + if (syntax & RE_NO_BK_PARENS) goto normal_backslash; + + if (COMPILE_STACK_EMPTY) + { + if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD) + goto normal_backslash; + else + FREE_STACK_RETURN (REG_ERPAREN); + } + + handle_close: + if (fixup_alt_jump) + { /* Push a dummy failure point at the end of the + alternative for a possible future + `pop_failure_jump' to pop. See comments at + `push_dummy_failure' in `re_match_2'. */ + BUF_PUSH (push_dummy_failure); + + /* We allocated space for this jump when we assigned + to `fixup_alt_jump', in the `handle_alt' case below. */ + STORE_JUMP (jump_past_alt, fixup_alt_jump, b - 1); + } + + /* See similar code for backslashed left paren above. */ + if (COMPILE_STACK_EMPTY) + { + if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD) + goto normal_char; + else + FREE_STACK_RETURN (REG_ERPAREN); + } + + /* Since we just checked for an empty stack above, this + ``can't happen''. */ + assert (compile_stack.avail != 0); + { + /* We don't just want to restore into `regnum', because + later groups should continue to be numbered higher, + as in `(ab)c(de)' -- the second group is #2. */ + regnum_t this_group_regnum; + + compile_stack.avail--; + begalt = COMPILED_BUFFER_VAR + COMPILE_STACK_TOP.begalt_offset; + fixup_alt_jump + = COMPILE_STACK_TOP.fixup_alt_jump + ? COMPILED_BUFFER_VAR + COMPILE_STACK_TOP.fixup_alt_jump - 1 + : 0; + laststart = COMPILED_BUFFER_VAR + COMPILE_STACK_TOP.laststart_offset; + this_group_regnum = COMPILE_STACK_TOP.regnum; + /* If we've reached MAX_REGNUM groups, then this open + won't actually generate any code, so we'll have to + clear pending_exact explicitly. */ + pending_exact = 0; + + /* We're at the end of the group, so now we know how many + groups were inside this one. */ + if (this_group_regnum <= MAX_REGNUM) + { + UCHAR_T *inner_group_loc + = COMPILED_BUFFER_VAR + COMPILE_STACK_TOP.inner_group_offset; + + *inner_group_loc = regnum - this_group_regnum; + BUF_PUSH_3 (stop_memory, this_group_regnum, + regnum - this_group_regnum); + } + } + break; + + + case '|': /* `\|'. */ + if (syntax & RE_LIMITED_OPS || syntax & RE_NO_BK_VBAR) + goto normal_backslash; + handle_alt: + if (syntax & RE_LIMITED_OPS) + goto normal_char; + + /* Insert before the previous alternative a jump which + jumps to this alternative if the former fails. */ + GET_BUFFER_SPACE (1 + OFFSET_ADDRESS_SIZE); + INSERT_JUMP (on_failure_jump, begalt, + b + 2 + 2 * OFFSET_ADDRESS_SIZE); + pending_exact = 0; + b += 1 + OFFSET_ADDRESS_SIZE; + + /* The alternative before this one has a jump after it + which gets executed if it gets matched. Adjust that + jump so it will jump to this alternative's analogous + jump (put in below, which in turn will jump to the next + (if any) alternative's such jump, etc.). The last such + jump jumps to the correct final destination. A picture: + _____ _____ + | | | | + | v | v + a | b | c + + If we are at `b', then fixup_alt_jump right now points to a + three-byte space after `a'. We'll put in the jump, set + fixup_alt_jump to right after `b', and leave behind three + bytes which we'll fill in when we get to after `c'. */ + + if (fixup_alt_jump) + STORE_JUMP (jump_past_alt, fixup_alt_jump, b); + + /* Mark and leave space for a jump after this alternative, + to be filled in later either by next alternative or + when know we're at the end of a series of alternatives. */ + fixup_alt_jump = b; + GET_BUFFER_SPACE (1 + OFFSET_ADDRESS_SIZE); + b += 1 + OFFSET_ADDRESS_SIZE; + + laststart = 0; + begalt = b; + break; + + + case '{': + /* If \{ is a literal. */ + if (!(syntax & RE_INTERVALS) + /* If we're at `\{' and it's not the open-interval + operator. */ + || (syntax & RE_NO_BK_BRACES)) + goto normal_backslash; + + handle_interval: + { + /* If got here, then the syntax allows intervals. */ + + /* At least (most) this many matches must be made. */ + int lower_bound = -1, upper_bound = -1; + + /* Place in the uncompiled pattern (i.e., just after + the '{') to go back to if the interval is invalid. */ + const CHAR_T *beg_interval = p; + + if (p == pend) + goto invalid_interval; + + GET_UNSIGNED_NUMBER (lower_bound); + + if (c == ',') + { + GET_UNSIGNED_NUMBER (upper_bound); + if (upper_bound < 0) + upper_bound = RE_DUP_MAX; + } + else + /* Interval such as `{1}' => match exactly once. */ + upper_bound = lower_bound; + + if (! (0 <= lower_bound && lower_bound <= upper_bound)) + goto invalid_interval; + + if (!(syntax & RE_NO_BK_BRACES)) + { + if (c != '\\' || p == pend) + goto invalid_interval; + PATFETCH (c); + } + + if (c != '}') + goto invalid_interval; + + /* If it's invalid to have no preceding re. */ + if (!laststart) + { + if (syntax & RE_CONTEXT_INVALID_OPS + && !(syntax & RE_INVALID_INTERVAL_ORD)) + FREE_STACK_RETURN (REG_BADRPT); + else if (syntax & RE_CONTEXT_INDEP_OPS) + laststart = b; + else + goto unfetch_interval; + } + + /* We just parsed a valid interval. */ + + if (RE_DUP_MAX < upper_bound) + FREE_STACK_RETURN (REG_BADBR); + + /* If the upper bound is zero, don't want to succeed at + all; jump from `laststart' to `b + 3', which will be + the end of the buffer after we insert the jump. */ + /* ifdef WCHAR, 'b + 1 + OFFSET_ADDRESS_SIZE' + instead of 'b + 3'. */ + if (upper_bound == 0) + { + GET_BUFFER_SPACE (1 + OFFSET_ADDRESS_SIZE); + INSERT_JUMP (jump, laststart, b + 1 + + OFFSET_ADDRESS_SIZE); + b += 1 + OFFSET_ADDRESS_SIZE; + } + + /* Otherwise, we have a nontrivial interval. When + we're all done, the pattern will look like: + set_number_at + set_number_at + succeed_n + + jump_n + (The upper bound and `jump_n' are omitted if + `upper_bound' is 1, though.) */ + else + { /* If the upper bound is > 1, we need to insert + more at the end of the loop. */ + unsigned nbytes = 2 + 4 * OFFSET_ADDRESS_SIZE + + (upper_bound > 1) * (2 + 4 * OFFSET_ADDRESS_SIZE); + + GET_BUFFER_SPACE (nbytes); + + /* Initialize lower bound of the `succeed_n', even + though it will be set during matching by its + attendant `set_number_at' (inserted next), + because `re_compile_fastmap' needs to know. + Jump to the `jump_n' we might insert below. */ + INSERT_JUMP2 (succeed_n, laststart, + b + 1 + 2 * OFFSET_ADDRESS_SIZE + + (upper_bound > 1) * (1 + 2 * OFFSET_ADDRESS_SIZE) + , lower_bound); + b += 1 + 2 * OFFSET_ADDRESS_SIZE; + + /* Code to initialize the lower bound. Insert + before the `succeed_n'. The `5' is the last two + bytes of this `set_number_at', plus 3 bytes of + the following `succeed_n'. */ + /* ifdef WCHAR, The '1+2*OFFSET_ADDRESS_SIZE' + is the 'set_number_at', plus '1+OFFSET_ADDRESS_SIZE' + of the following `succeed_n'. */ + PREFIX(insert_op2) (set_number_at, laststart, 1 + + 2 * OFFSET_ADDRESS_SIZE, lower_bound, b); + b += 1 + 2 * OFFSET_ADDRESS_SIZE; + + if (upper_bound > 1) + { /* More than one repetition is allowed, so + append a backward jump to the `succeed_n' + that starts this interval. + + When we've reached this during matching, + we'll have matched the interval once, so + jump back only `upper_bound - 1' times. */ + STORE_JUMP2 (jump_n, b, laststart + + 2 * OFFSET_ADDRESS_SIZE + 1, + upper_bound - 1); + b += 1 + 2 * OFFSET_ADDRESS_SIZE; + + /* The location we want to set is the second + parameter of the `jump_n'; that is `b-2' as + an absolute address. `laststart' will be + the `set_number_at' we're about to insert; + `laststart+3' the number to set, the source + for the relative address. But we are + inserting into the middle of the pattern -- + so everything is getting moved up by 5. + Conclusion: (b - 2) - (laststart + 3) + 5, + i.e., b - laststart. + + We insert this at the beginning of the loop + so that if we fail during matching, we'll + reinitialize the bounds. */ + PREFIX(insert_op2) (set_number_at, laststart, + b - laststart, + upper_bound - 1, b); + b += 1 + 2 * OFFSET_ADDRESS_SIZE; + } + } + pending_exact = 0; + break; + + invalid_interval: + if (!(syntax & RE_INVALID_INTERVAL_ORD)) + FREE_STACK_RETURN (p == pend ? REG_EBRACE : REG_BADBR); + unfetch_interval: + /* Match the characters as literals. */ + p = beg_interval; + c = '{'; + if (syntax & RE_NO_BK_BRACES) + goto normal_char; + else + goto normal_backslash; + } + +#ifdef emacs + /* There is no way to specify the before_dot and after_dot + operators. rms says this is ok. --karl */ + case '=': + BUF_PUSH (at_dot); + break; + + case 's': + laststart = b; + PATFETCH (c); + BUF_PUSH_2 (syntaxspec, syntax_spec_code[c]); + break; + + case 'S': + laststart = b; + PATFETCH (c); + BUF_PUSH_2 (notsyntaxspec, syntax_spec_code[c]); + break; +#endif /* emacs */ + + + case 'w': + if (syntax & RE_NO_GNU_OPS) + goto normal_char; + laststart = b; + BUF_PUSH (wordchar); + break; + + + case 'W': + if (syntax & RE_NO_GNU_OPS) + goto normal_char; + laststart = b; + BUF_PUSH (notwordchar); + break; + + + case '<': + if (syntax & RE_NO_GNU_OPS) + goto normal_char; + BUF_PUSH (wordbeg); + break; + + case '>': + if (syntax & RE_NO_GNU_OPS) + goto normal_char; + BUF_PUSH (wordend); + break; + + case 'b': + if (syntax & RE_NO_GNU_OPS) + goto normal_char; + BUF_PUSH (wordbound); + break; + + case 'B': + if (syntax & RE_NO_GNU_OPS) + goto normal_char; + BUF_PUSH (notwordbound); + break; + + case '`': + if (syntax & RE_NO_GNU_OPS) + goto normal_char; + BUF_PUSH (begbuf); + break; + + case '\'': + if (syntax & RE_NO_GNU_OPS) + goto normal_char; + BUF_PUSH (endbuf); + break; + + case '1': case '2': case '3': case '4': case '5': + case '6': case '7': case '8': case '9': + if (syntax & RE_NO_BK_REFS) + goto normal_char; + + c1 = c - '0'; + + if (c1 > regnum) + FREE_STACK_RETURN (REG_ESUBREG); + + /* Can't back reference to a subexpression if inside of it. */ + if (group_in_compile_stack (compile_stack, (regnum_t) c1)) + goto normal_char; + + laststart = b; + BUF_PUSH_2 (duplicate, c1); + break; + + + case '+': + case '?': + if (syntax & RE_BK_PLUS_QM) + goto handle_plus; + else + goto normal_backslash; + + default: + normal_backslash: + /* You might think it would be useful for \ to mean + not to translate; but if we don't translate it + it will never match anything. */ + c = TRANSLATE (c); + goto normal_char; + } + break; + + + default: + /* Expects the character in `c'. */ + normal_char: + /* If no exactn currently being built. */ + if (!pending_exact +#ifdef WCHAR + /* If last exactn handle binary(or character) and + new exactn handle character(or binary). */ + || is_exactn_bin != is_binary[p - 1 - pattern] +#endif /* WCHAR */ + + /* If last exactn not at current position. */ + || pending_exact + *pending_exact + 1 != b + + /* We have only one byte following the exactn for the count. */ + || *pending_exact == (1 << BYTEWIDTH) - 1 + + /* If followed by a repetition operator. */ + || *p == '*' || *p == '^' + || ((syntax & RE_BK_PLUS_QM) + ? *p == '\\' && (p[1] == '+' || p[1] == '?') + : (*p == '+' || *p == '?')) + || ((syntax & RE_INTERVALS) + && ((syntax & RE_NO_BK_BRACES) + ? *p == '{' + : (p[0] == '\\' && p[1] == '{')))) + { + /* Start building a new exactn. */ + + laststart = b; + +#ifdef WCHAR + /* Is this exactn binary data or character? */ + is_exactn_bin = is_binary[p - 1 - pattern]; + if (is_exactn_bin) + BUF_PUSH_2 (exactn_bin, 0); + else + BUF_PUSH_2 (exactn, 0); +#else + BUF_PUSH_2 (exactn, 0); +#endif /* WCHAR */ + pending_exact = b - 1; + } + + BUF_PUSH (c); + (*pending_exact)++; + break; + } /* switch (c) */ + } /* while p != pend */ + + + /* Through the pattern now. */ + + if (fixup_alt_jump) + STORE_JUMP (jump_past_alt, fixup_alt_jump, b); + + if (!COMPILE_STACK_EMPTY) + FREE_STACK_RETURN (REG_EPAREN); + + /* If we don't want backtracking, force success + the first time we reach the end of the compiled pattern. */ + if (syntax & RE_NO_POSIX_BACKTRACKING) + BUF_PUSH (succeed); + +#ifdef WCHAR + free (pattern); + free (mbs_offset); + free (is_binary); +#endif + free (compile_stack.stack); + + /* We have succeeded; set the length of the buffer. */ +#ifdef WCHAR + bufp->used = (uintptr_t) b - (uintptr_t) COMPILED_BUFFER_VAR; +#else + bufp->used = b - bufp->buffer; +#endif + +#ifdef DEBUG + if (debug) + { + DEBUG_PRINT1 ("\nCompiled pattern: \n"); + PREFIX(print_compiled_pattern) (bufp); + } +#endif /* DEBUG */ + +#ifndef MATCH_MAY_ALLOCATE + /* Initialize the failure stack to the largest possible stack. This + isn't necessary unless we're trying to avoid calling alloca in + the search and match routines. */ + { + int num_regs = bufp->re_nsub + 1; + + /* Since DOUBLE_FAIL_STACK refuses to double only if the current size + is strictly greater than re_max_failures, the largest possible stack + is 2 * re_max_failures failure points. */ + if (fail_stack.size < (2 * re_max_failures * MAX_FAILURE_ITEMS)) + { + fail_stack.size = (2 * re_max_failures * MAX_FAILURE_ITEMS); + +# ifdef emacs + if (! fail_stack.stack) + fail_stack.stack + = (PREFIX(fail_stack_elt_t) *) xmalloc (fail_stack.size + * sizeof (PREFIX(fail_stack_elt_t))); + else + fail_stack.stack + = (PREFIX(fail_stack_elt_t) *) xrealloc (fail_stack.stack, + (fail_stack.size + * sizeof (PREFIX(fail_stack_elt_t)))); +# else /* not emacs */ + if (! fail_stack.stack) + fail_stack.stack + = (PREFIX(fail_stack_elt_t) *) malloc (fail_stack.size + * sizeof (PREFIX(fail_stack_elt_t))); + else + fail_stack.stack + = (PREFIX(fail_stack_elt_t) *) realloc (fail_stack.stack, + (fail_stack.size + * sizeof (PREFIX(fail_stack_elt_t)))); +# endif /* not emacs */ + } + + PREFIX(regex_grow_registers) (num_regs); + } +#endif /* not MATCH_MAY_ALLOCATE */ + + return REG_NOERROR; +} /* regex_compile */ + +/* Subroutines for `regex_compile'. */ + +/* Store OP at LOC followed by two-byte integer parameter ARG. */ +/* ifdef WCHAR, integer parameter is 1 wchar_t. */ + +static void +PREFIX(store_op1) (re_opcode_t op, UCHAR_T *loc, int arg) +{ + *loc = (UCHAR_T) op; + STORE_NUMBER (loc + 1, arg); +} + + +/* Like `store_op1', but for two two-byte parameters ARG1 and ARG2. */ +/* ifdef WCHAR, integer parameter is 1 wchar_t. */ + +static void +PREFIX(store_op2) (re_opcode_t op, UCHAR_T *loc, int arg1, int arg2) +{ + *loc = (UCHAR_T) op; + STORE_NUMBER (loc + 1, arg1); + STORE_NUMBER (loc + 1 + OFFSET_ADDRESS_SIZE, arg2); +} + + +/* Copy the bytes from LOC to END to open up three bytes of space at LOC + for OP followed by two-byte integer parameter ARG. */ +/* ifdef WCHAR, integer parameter is 1 wchar_t. */ + +static void +PREFIX(insert_op1) (re_opcode_t op, UCHAR_T *loc, int arg, UCHAR_T *end) +{ + register UCHAR_T *pfrom = end; + register UCHAR_T *pto = end + 1 + OFFSET_ADDRESS_SIZE; + + while (pfrom != loc) + *--pto = *--pfrom; + + PREFIX(store_op1) (op, loc, arg); +} + + +/* Like `insert_op1', but for two two-byte parameters ARG1 and ARG2. */ +/* ifdef WCHAR, integer parameter is 1 wchar_t. */ + +static void +PREFIX(insert_op2) (re_opcode_t op, UCHAR_T *loc, int arg1, + int arg2, UCHAR_T *end) +{ + register UCHAR_T *pfrom = end; + register UCHAR_T *pto = end + 1 + 2 * OFFSET_ADDRESS_SIZE; + + while (pfrom != loc) + *--pto = *--pfrom; + + PREFIX(store_op2) (op, loc, arg1, arg2); +} + + +/* P points to just after a ^ in PATTERN. Return true if that ^ comes + after an alternative or a begin-subexpression. We assume there is at + least one character before the ^. */ + +static boolean +PREFIX(at_begline_loc_p) (const CHAR_T *pattern, const CHAR_T *p, + reg_syntax_t syntax) +{ + const CHAR_T *prev = p - 2; + boolean prev_prev_backslash = prev > pattern && prev[-1] == '\\'; + + return + /* After a subexpression? */ + (*prev == '(' && (syntax & RE_NO_BK_PARENS || prev_prev_backslash)) + /* After an alternative? */ + || (*prev == '|' && (syntax & RE_NO_BK_VBAR || prev_prev_backslash)); +} + + +/* The dual of at_begline_loc_p. This one is for $. We assume there is + at least one character after the $, i.e., `P < PEND'. */ + +static boolean +PREFIX(at_endline_loc_p) (const CHAR_T *p, const CHAR_T *pend, + reg_syntax_t syntax) +{ + const CHAR_T *next = p; + boolean next_backslash = *next == '\\'; + const CHAR_T *next_next = p + 1 < pend ? p + 1 : 0; + + return + /* Before a subexpression? */ + (syntax & RE_NO_BK_PARENS ? *next == ')' + : next_backslash && next_next && *next_next == ')') + /* Before an alternative? */ + || (syntax & RE_NO_BK_VBAR ? *next == '|' + : next_backslash && next_next && *next_next == '|'); +} + +#else /* not INSIDE_RECURSION */ + +/* Returns true if REGNUM is in one of COMPILE_STACK's elements and + false if it's not. */ + +static boolean +group_in_compile_stack (compile_stack_type compile_stack, regnum_t regnum) +{ + int this_element; + + for (this_element = compile_stack.avail - 1; + this_element >= 0; + this_element--) + if (compile_stack.stack[this_element].regnum == regnum) + return true; + + return false; +} +#endif /* not INSIDE_RECURSION */ + +#ifdef INSIDE_RECURSION + +#ifdef WCHAR +/* This insert space, which size is "num", into the pattern at "loc". + "end" must point the end of the allocated buffer. */ +static void +insert_space (int num, CHAR_T *loc, CHAR_T *end) +{ + register CHAR_T *pto = end; + register CHAR_T *pfrom = end - num; + + while (pfrom >= loc) + *pto-- = *pfrom--; +} +#endif /* WCHAR */ + +#ifdef WCHAR +static reg_errcode_t +wcs_compile_range (CHAR_T range_start_char, const CHAR_T **p_ptr, + const CHAR_T *pend, RE_TRANSLATE_TYPE translate, + reg_syntax_t syntax, CHAR_T *b, CHAR_T *char_set) +{ + const CHAR_T *p = *p_ptr; + CHAR_T range_start, range_end; + reg_errcode_t ret; +# ifdef _LIBC + uint32_t nrules; + uint32_t start_val, end_val; +# endif + if (p == pend) + return REG_ERANGE; + +# ifdef _LIBC + nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES); + if (nrules != 0) + { + const char *collseq = (const char *) _NL_CURRENT(LC_COLLATE, + _NL_COLLATE_COLLSEQWC); + const unsigned char *extra = (const unsigned char *) + _NL_CURRENT (LC_COLLATE, _NL_COLLATE_SYMB_EXTRAMB); + + if (range_start_char < -1) + { + /* range_start is a collating symbol. */ + int32_t *wextra; + /* Retreive the index and get collation sequence value. */ + wextra = (int32_t*)(extra + char_set[-range_start_char]); + start_val = wextra[1 + *wextra]; + } + else + start_val = collseq_table_lookup(collseq, TRANSLATE(range_start_char)); + + end_val = collseq_table_lookup (collseq, TRANSLATE (p[0])); + + /* Report an error if the range is empty and the syntax prohibits + this. */ + ret = ((syntax & RE_NO_EMPTY_RANGES) + && (start_val > end_val))? REG_ERANGE : REG_NOERROR; + + /* Insert space to the end of the char_ranges. */ + insert_space(2, b - char_set[5] - 2, b - 1); + *(b - char_set[5] - 2) = (wchar_t)start_val; + *(b - char_set[5] - 1) = (wchar_t)end_val; + char_set[4]++; /* ranges_index */ + } + else +# endif + { + range_start = (range_start_char >= 0)? TRANSLATE (range_start_char): + range_start_char; + range_end = TRANSLATE (p[0]); + /* Report an error if the range is empty and the syntax prohibits + this. */ + ret = ((syntax & RE_NO_EMPTY_RANGES) + && (range_start > range_end))? REG_ERANGE : REG_NOERROR; + + /* Insert space to the end of the char_ranges. */ + insert_space(2, b - char_set[5] - 2, b - 1); + *(b - char_set[5] - 2) = range_start; + *(b - char_set[5] - 1) = range_end; + char_set[4]++; /* ranges_index */ + } + /* Have to increment the pointer into the pattern string, so the + caller isn't still at the ending character. */ + (*p_ptr)++; + + return ret; +} +#else /* BYTE */ +/* Read the ending character of a range (in a bracket expression) from the + uncompiled pattern *P_PTR (which ends at PEND). We assume the + starting character is in `P[-2]'. (`P[-1]' is the character `-'.) + Then we set the translation of all bits between the starting and + ending characters (inclusive) in the compiled pattern B. + + Return an error code. + + We use these short variable names so we can use the same macros as + `regex_compile' itself. */ + +static reg_errcode_t +byte_compile_range (unsigned int range_start_char, const char **p_ptr, + const char *pend, RE_TRANSLATE_TYPE translate, + reg_syntax_t syntax, unsigned char *b) +{ + unsigned this_char; + const char *p = *p_ptr; + reg_errcode_t ret; +# if _LIBC + const unsigned char *collseq; + unsigned int start_colseq; + unsigned int end_colseq; +# else + unsigned end_char; +# endif + + if (p == pend) + return REG_ERANGE; + + /* Have to increment the pointer into the pattern string, so the + caller isn't still at the ending character. */ + (*p_ptr)++; + + /* Report an error if the range is empty and the syntax prohibits this. */ + ret = syntax & RE_NO_EMPTY_RANGES ? REG_ERANGE : REG_NOERROR; + +# if _LIBC + collseq = (const unsigned char *) _NL_CURRENT (LC_COLLATE, + _NL_COLLATE_COLLSEQMB); + + start_colseq = collseq[(unsigned char) TRANSLATE (range_start_char)]; + end_colseq = collseq[(unsigned char) TRANSLATE (p[0])]; + for (this_char = 0; this_char <= (unsigned char) -1; ++this_char) + { + unsigned int this_colseq = collseq[(unsigned char) TRANSLATE (this_char)]; + + if (start_colseq <= this_colseq && this_colseq <= end_colseq) + { + SET_LIST_BIT (TRANSLATE (this_char)); + ret = REG_NOERROR; + } + } +# else + /* Here we see why `this_char' has to be larger than an `unsigned + char' -- we would otherwise go into an infinite loop, since all + characters <= 0xff. */ + range_start_char = TRANSLATE (range_start_char); + /* TRANSLATE(p[0]) is casted to char (not unsigned char) in TRANSLATE, + and some compilers cast it to int implicitly, so following for_loop + may fall to (almost) infinite loop. + e.g. If translate[p[0]] = 0xff, end_char may equals to 0xffffffff. + To avoid this, we cast p[0] to unsigned int and truncate it. */ + end_char = ((unsigned)TRANSLATE(p[0]) & ((1 << BYTEWIDTH) - 1)); + + for (this_char = range_start_char; this_char <= end_char; ++this_char) + { + SET_LIST_BIT (TRANSLATE (this_char)); + ret = REG_NOERROR; + } +# endif + + return ret; +} +#endif /* WCHAR */ + +/* re_compile_fastmap computes a ``fastmap'' for the compiled pattern in + BUFP. A fastmap records which of the (1 << BYTEWIDTH) possible + characters can start a string that matches the pattern. This fastmap + is used by re_search to skip quickly over impossible starting points. + + The caller must supply the address of a (1 << BYTEWIDTH)-byte data + area as BUFP->fastmap. + + We set the `fastmap', `fastmap_accurate', and `can_be_null' fields in + the pattern buffer. + + Returns 0 if we succeed, -2 if an internal error. */ + +#ifdef WCHAR +/* local function for re_compile_fastmap. + truncate wchar_t character to char. */ +static unsigned char truncate_wchar (CHAR_T c); + +static unsigned char +truncate_wchar (CHAR_T c) +{ + unsigned char buf[MB_CUR_MAX]; + mbstate_t state; + int retval; + memset (&state, '\0', sizeof (state)); +# ifdef _LIBC + retval = __wcrtomb (buf, c, &state); +# else + retval = wcrtomb (buf, c, &state); +# endif + return retval > 0 ? buf[0] : (unsigned char) c; +} +#endif /* WCHAR */ + +static int +PREFIX(re_compile_fastmap) (struct re_pattern_buffer *bufp) +{ + int j, k; +#ifdef MATCH_MAY_ALLOCATE + PREFIX(fail_stack_type) fail_stack; +#endif +#ifndef REGEX_MALLOC + char *destination; +#endif + + register char *fastmap = bufp->fastmap; + +#ifdef WCHAR + /* We need to cast pattern to (wchar_t*), because we casted this compiled + pattern to (char*) in regex_compile. */ + UCHAR_T *pattern = (UCHAR_T*)bufp->buffer; + register UCHAR_T *pend = (UCHAR_T*) (bufp->buffer + bufp->used); +#else /* BYTE */ + UCHAR_T *pattern = bufp->buffer; + register UCHAR_T *pend = pattern + bufp->used; +#endif /* WCHAR */ + UCHAR_T *p = pattern; + +#ifdef REL_ALLOC + /* This holds the pointer to the failure stack, when + it is allocated relocatably. */ + fail_stack_elt_t *failure_stack_ptr; +#endif + + /* Assume that each path through the pattern can be null until + proven otherwise. We set this false at the bottom of switch + statement, to which we get only if a particular path doesn't + match the empty string. */ + boolean path_can_be_null = true; + + /* We aren't doing a `succeed_n' to begin with. */ + boolean succeed_n_p = false; + + assert (fastmap != NULL && p != NULL); + + INIT_FAIL_STACK (); + bzero (fastmap, 1 << BYTEWIDTH); /* Assume nothing's valid. */ + bufp->fastmap_accurate = 1; /* It will be when we're done. */ + bufp->can_be_null = 0; + + while (1) + { + if (p == pend || *p == (UCHAR_T) succeed) + { + /* We have reached the (effective) end of pattern. */ + if (!FAIL_STACK_EMPTY ()) + { + bufp->can_be_null |= path_can_be_null; + + /* Reset for next path. */ + path_can_be_null = true; + + p = fail_stack.stack[--fail_stack.avail].pointer; + + continue; + } + else + break; + } + + /* We should never be about to go beyond the end of the pattern. */ + assert (p < pend); + + switch (SWITCH_ENUM_CAST ((re_opcode_t) *p++)) + { + + /* I guess the idea here is to simply not bother with a fastmap + if a backreference is used, since it's too hard to figure out + the fastmap for the corresponding group. Setting + `can_be_null' stops `re_search_2' from using the fastmap, so + that is all we do. */ + case duplicate: + bufp->can_be_null = 1; + goto done; + + + /* Following are the cases which match a character. These end + with `break'. */ + +#ifdef WCHAR + case exactn: + fastmap[truncate_wchar(p[1])] = 1; + break; +#else /* BYTE */ + case exactn: + fastmap[p[1]] = 1; + break; +#endif /* WCHAR */ +#ifdef MBS_SUPPORT + case exactn_bin: + fastmap[p[1]] = 1; + break; +#endif + +#ifdef WCHAR + /* It is hard to distinguish fastmap from (multi byte) characters + which depends on current locale. */ + case charset: + case charset_not: + case wordchar: + case notwordchar: + bufp->can_be_null = 1; + goto done; +#else /* BYTE */ + case charset: + for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--) + if (p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH))) + fastmap[j] = 1; + break; + + + case charset_not: + /* Chars beyond end of map must be allowed. */ + for (j = *p * BYTEWIDTH; j < (1 << BYTEWIDTH); j++) + fastmap[j] = 1; + + for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--) + if (!(p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH)))) + fastmap[j] = 1; + break; + + + case wordchar: + for (j = 0; j < (1 << BYTEWIDTH); j++) + if (SYNTAX (j) == Sword) + fastmap[j] = 1; + break; + + + case notwordchar: + for (j = 0; j < (1 << BYTEWIDTH); j++) + if (SYNTAX (j) != Sword) + fastmap[j] = 1; + break; +#endif /* WCHAR */ + + case anychar: + { + int fastmap_newline = fastmap['\n']; + + /* `.' matches anything ... */ + for (j = 0; j < (1 << BYTEWIDTH); j++) + fastmap[j] = 1; + + /* ... except perhaps newline. */ + if (!(bufp->syntax & RE_DOT_NEWLINE)) + fastmap['\n'] = fastmap_newline; + + /* Return if we have already set `can_be_null'; if we have, + then the fastmap is irrelevant. Something's wrong here. */ + else if (bufp->can_be_null) + goto done; + + /* Otherwise, have to check alternative paths. */ + break; + } + +#ifdef emacs + case syntaxspec: + k = *p++; + for (j = 0; j < (1 << BYTEWIDTH); j++) + if (SYNTAX (j) == (enum syntaxcode) k) + fastmap[j] = 1; + break; + + + case notsyntaxspec: + k = *p++; + for (j = 0; j < (1 << BYTEWIDTH); j++) + if (SYNTAX (j) != (enum syntaxcode) k) + fastmap[j] = 1; + break; + + + /* All cases after this match the empty string. These end with + `continue'. */ + + + case before_dot: + case at_dot: + case after_dot: + continue; +#endif /* emacs */ + + + case no_op: + case begline: + case endline: + case begbuf: + case endbuf: + case wordbound: + case notwordbound: + case wordbeg: + case wordend: + case push_dummy_failure: + continue; + + + case jump_n: + case pop_failure_jump: + case maybe_pop_jump: + case jump: + case jump_past_alt: + case dummy_failure_jump: + EXTRACT_NUMBER_AND_INCR (j, p); + p += j; + if (j > 0) + continue; + + /* Jump backward implies we just went through the body of a + loop and matched nothing. Opcode jumped to should be + `on_failure_jump' or `succeed_n'. Just treat it like an + ordinary jump. For a * loop, it has pushed its failure + point already; if so, discard that as redundant. */ + if ((re_opcode_t) *p != on_failure_jump + && (re_opcode_t) *p != succeed_n) + continue; + + p++; + EXTRACT_NUMBER_AND_INCR (j, p); + p += j; + + /* If what's on the stack is where we are now, pop it. */ + if (!FAIL_STACK_EMPTY () + && fail_stack.stack[fail_stack.avail - 1].pointer == p) + fail_stack.avail--; + + continue; + + + case on_failure_jump: + case on_failure_keep_string_jump: + handle_on_failure_jump: + EXTRACT_NUMBER_AND_INCR (j, p); + + /* For some patterns, e.g., `(a?)?', `p+j' here points to the + end of the pattern. We don't want to push such a point, + since when we restore it above, entering the switch will + increment `p' past the end of the pattern. We don't need + to push such a point since we obviously won't find any more + fastmap entries beyond `pend'. Such a pattern can match + the null string, though. */ + if (p + j < pend) + { + if (!PUSH_PATTERN_OP (p + j, fail_stack)) + { + RESET_FAIL_STACK (); + return -2; + } + } + else + bufp->can_be_null = 1; + + if (succeed_n_p) + { + EXTRACT_NUMBER_AND_INCR (k, p); /* Skip the n. */ + succeed_n_p = false; + } + + continue; + + + case succeed_n: + /* Get to the number of times to succeed. */ + p += OFFSET_ADDRESS_SIZE; + + /* Increment p past the n for when k != 0. */ + EXTRACT_NUMBER_AND_INCR (k, p); + if (k == 0) + { + p -= 2 * OFFSET_ADDRESS_SIZE; + succeed_n_p = true; /* Spaghetti code alert. */ + goto handle_on_failure_jump; + } + continue; + + + case set_number_at: + p += 2 * OFFSET_ADDRESS_SIZE; + continue; + + + case start_memory: + case stop_memory: + p += 2; + continue; + + + default: + abort (); /* We have listed all the cases. */ + } /* switch *p++ */ + + /* Getting here means we have found the possible starting + characters for one path of the pattern -- and that the empty + string does not match. We need not follow this path further. + Instead, look at the next alternative (remembered on the + stack), or quit if no more. The test at the top of the loop + does these things. */ + path_can_be_null = false; + p = pend; + } /* while p */ + + /* Set `can_be_null' for the last path (also the first path, if the + pattern is empty). */ + bufp->can_be_null |= path_can_be_null; + + done: + RESET_FAIL_STACK (); + return 0; +} + +#else /* not INSIDE_RECURSION */ + +int +re_compile_fastmap (struct re_pattern_buffer *bufp) +{ +# ifdef MBS_SUPPORT + if (MB_CUR_MAX != 1) + return wcs_re_compile_fastmap(bufp); + else +# endif + return byte_re_compile_fastmap(bufp); +} /* re_compile_fastmap */ +#ifdef _LIBC +weak_alias (__re_compile_fastmap, re_compile_fastmap) +#endif + + +/* Set REGS to hold NUM_REGS registers, storing them in STARTS and + ENDS. Subsequent matches using PATTERN_BUFFER and REGS will use + this memory for recording register information. STARTS and ENDS + must be allocated using the malloc library routine, and must each + be at least NUM_REGS * sizeof (regoff_t) bytes long. + + If NUM_REGS == 0, then subsequent matches should allocate their own + register data. + + Unless this function is called, the first search or match using + PATTERN_BUFFER will allocate its own register data, without + freeing the old data. */ + +void +re_set_registers (struct re_pattern_buffer *bufp, + struct re_registers *regs, unsigned num_regs, + regoff_t *starts, regoff_t *ends) +{ + if (num_regs) + { + bufp->regs_allocated = REGS_REALLOCATE; + regs->num_regs = num_regs; + regs->start = starts; + regs->end = ends; + } + else + { + bufp->regs_allocated = REGS_UNALLOCATED; + regs->num_regs = 0; + regs->start = regs->end = (regoff_t *) 0; + } +} +#ifdef _LIBC +weak_alias (__re_set_registers, re_set_registers) +#endif + +/* Searching routines. */ + +/* Like re_search_2, below, but only one string is specified, and + doesn't let you say where to stop matching. */ + +int +re_search (struct re_pattern_buffer *bufp, const char *string, int size, + int startpos, int range, struct re_registers *regs) +{ + return re_search_2 (bufp, NULL, 0, string, size, startpos, range, + regs, size); +} +#ifdef _LIBC +weak_alias (__re_search, re_search) +#endif + + +/* Using the compiled pattern in BUFP->buffer, first tries to match the + virtual concatenation of STRING1 and STRING2, starting first at index + STARTPOS, then at STARTPOS + 1, and so on. + + STRING1 and STRING2 have length SIZE1 and SIZE2, respectively. + + RANGE is how far to scan while trying to match. RANGE = 0 means try + only at STARTPOS; in general, the last start tried is STARTPOS + + RANGE. + + In REGS, return the indices of the virtual concatenation of STRING1 + and STRING2 that matched the entire BUFP->buffer and its contained + subexpressions. + + Do not consider matching one past the index STOP in the virtual + concatenation of STRING1 and STRING2. + + We return either the position in the strings at which the match was + found, -1 if no match, or -2 if error (such as failure + stack overflow). */ + +int +re_search_2 (struct re_pattern_buffer *bufp, const char *string1, int size1, + const char *string2, int size2, int startpos, int range, + struct re_registers *regs, int stop) +{ +# ifdef MBS_SUPPORT + if (MB_CUR_MAX != 1) + return wcs_re_search_2 (bufp, string1, size1, string2, size2, startpos, + range, regs, stop); + else +# endif + return byte_re_search_2 (bufp, string1, size1, string2, size2, startpos, + range, regs, stop); +} /* re_search_2 */ +#ifdef _LIBC +weak_alias (__re_search_2, re_search_2) +#endif + +#endif /* not INSIDE_RECURSION */ + +#ifdef INSIDE_RECURSION + +#ifdef MATCH_MAY_ALLOCATE +# define FREE_VAR(var) if (var) REGEX_FREE (var); var = NULL +#else +# define FREE_VAR(var) if (var) free (var); var = NULL +#endif + +#ifdef WCHAR +# define MAX_ALLOCA_SIZE 2000 + +# define FREE_WCS_BUFFERS() \ + do { \ + if (size1 > MAX_ALLOCA_SIZE) \ + { \ + free (wcs_string1); \ + free (mbs_offset1); \ + } \ + else \ + { \ + FREE_VAR (wcs_string1); \ + FREE_VAR (mbs_offset1); \ + } \ + if (size2 > MAX_ALLOCA_SIZE) \ + { \ + free (wcs_string2); \ + free (mbs_offset2); \ + } \ + else \ + { \ + FREE_VAR (wcs_string2); \ + FREE_VAR (mbs_offset2); \ + } \ + } while (0) + +#endif + + +static int +PREFIX(re_search_2) (struct re_pattern_buffer *bufp, const char *string1, + int size1, const char *string2, int size2, + int startpos, int range, + struct re_registers *regs, int stop) +{ + int val; + register char *fastmap = bufp->fastmap; + register RE_TRANSLATE_TYPE translate = bufp->translate; + int total_size = size1 + size2; + int endpos = startpos + range; +#ifdef WCHAR + /* We need wchar_t* buffers correspond to cstring1, cstring2. */ + wchar_t *wcs_string1 = NULL, *wcs_string2 = NULL; + /* We need the size of wchar_t buffers correspond to csize1, csize2. */ + int wcs_size1 = 0, wcs_size2 = 0; + /* offset buffer for optimizatoin. See convert_mbs_to_wc. */ + int *mbs_offset1 = NULL, *mbs_offset2 = NULL; + /* They hold whether each wchar_t is binary data or not. */ + char *is_binary = NULL; +#endif /* WCHAR */ + + /* Check for out-of-range STARTPOS. */ + if (startpos < 0 || startpos > total_size) + return -1; + + /* Fix up RANGE if it might eventually take us outside + the virtual concatenation of STRING1 and STRING2. + Make sure we won't move STARTPOS below 0 or above TOTAL_SIZE. */ + if (endpos < 0) + range = 0 - startpos; + else if (endpos > total_size) + range = total_size - startpos; + + /* If the search isn't to be a backwards one, don't waste time in a + search for a pattern that must be anchored. */ + if (bufp->used > 0 && range > 0 + && ((re_opcode_t) bufp->buffer[0] == begbuf + /* `begline' is like `begbuf' if it cannot match at newlines. */ + || ((re_opcode_t) bufp->buffer[0] == begline + && !bufp->newline_anchor))) + { + if (startpos > 0) + return -1; + else + range = 1; + } + +#ifdef emacs + /* In a forward search for something that starts with \=. + don't keep searching past point. */ + if (bufp->used > 0 && (re_opcode_t) bufp->buffer[0] == at_dot && range > 0) + { + range = PT - startpos; + if (range <= 0) + return -1; + } +#endif /* emacs */ + + /* Update the fastmap now if not correct already. */ + if (fastmap && !bufp->fastmap_accurate) + if (re_compile_fastmap (bufp) == -2) + return -2; + +#ifdef WCHAR + /* Allocate wchar_t array for wcs_string1 and wcs_string2 and + fill them with converted string. */ + if (size1 != 0) + { + if (size1 > MAX_ALLOCA_SIZE) + { + wcs_string1 = TALLOC (size1 + 1, CHAR_T); + mbs_offset1 = TALLOC (size1 + 1, int); + is_binary = TALLOC (size1 + 1, char); + } + else + { + wcs_string1 = REGEX_TALLOC (size1 + 1, CHAR_T); + mbs_offset1 = REGEX_TALLOC (size1 + 1, int); + is_binary = REGEX_TALLOC (size1 + 1, char); + } + if (!wcs_string1 || !mbs_offset1 || !is_binary) + { + if (size1 > MAX_ALLOCA_SIZE) + { + free (wcs_string1); + free (mbs_offset1); + free (is_binary); + } + else + { + FREE_VAR (wcs_string1); + FREE_VAR (mbs_offset1); + FREE_VAR (is_binary); + } + return -2; + } + wcs_size1 = convert_mbs_to_wcs(wcs_string1, string1, size1, + mbs_offset1, is_binary); + wcs_string1[wcs_size1] = L'\0'; /* for a sentinel */ + if (size1 > MAX_ALLOCA_SIZE) + free (is_binary); + else + FREE_VAR (is_binary); + } + if (size2 != 0) + { + if (size2 > MAX_ALLOCA_SIZE) + { + wcs_string2 = TALLOC (size2 + 1, CHAR_T); + mbs_offset2 = TALLOC (size2 + 1, int); + is_binary = TALLOC (size2 + 1, char); + } + else + { + wcs_string2 = REGEX_TALLOC (size2 + 1, CHAR_T); + mbs_offset2 = REGEX_TALLOC (size2 + 1, int); + is_binary = REGEX_TALLOC (size2 + 1, char); + } + if (!wcs_string2 || !mbs_offset2 || !is_binary) + { + FREE_WCS_BUFFERS (); + if (size2 > MAX_ALLOCA_SIZE) + free (is_binary); + else + FREE_VAR (is_binary); + return -2; + } + wcs_size2 = convert_mbs_to_wcs(wcs_string2, string2, size2, + mbs_offset2, is_binary); + wcs_string2[wcs_size2] = L'\0'; /* for a sentinel */ + if (size2 > MAX_ALLOCA_SIZE) + free (is_binary); + else + FREE_VAR (is_binary); + } +#endif /* WCHAR */ + + + /* Loop through the string, looking for a place to start matching. */ + for (;;) + { + /* If a fastmap is supplied, skip quickly over characters that + cannot be the start of a match. If the pattern can match the + null string, however, we don't need to skip characters; we want + the first null string. */ + if (fastmap && startpos < total_size && !bufp->can_be_null) + { + if (range > 0) /* Searching forwards. */ + { + register const char *d; + register int lim = 0; + int irange = range; + + if (startpos < size1 && startpos + range >= size1) + lim = range - (size1 - startpos); + + d = (startpos >= size1 ? string2 - size1 : string1) + startpos; + + /* Written out as an if-else to avoid testing `translate' + inside the loop. */ + if (translate) + while (range > lim + && !fastmap[(unsigned char) + translate[(unsigned char) *d++]]) + range--; + else + while (range > lim && !fastmap[(unsigned char) *d++]) + range--; + + startpos += irange - range; + } + else /* Searching backwards. */ + { + register CHAR_T c = (size1 == 0 || startpos >= size1 + ? string2[startpos - size1] + : string1[startpos]); + + if (!fastmap[(unsigned char) TRANSLATE (c)]) + goto advance; + } + } + + /* If can't match the null string, and that's all we have left, fail. */ + if (range >= 0 && startpos == total_size && fastmap + && !bufp->can_be_null) + { +#ifdef WCHAR + FREE_WCS_BUFFERS (); +#endif + return -1; + } + +#ifdef WCHAR + val = wcs_re_match_2_internal (bufp, string1, size1, string2, + size2, startpos, regs, stop, + wcs_string1, wcs_size1, + wcs_string2, wcs_size2, + mbs_offset1, mbs_offset2); +#else /* BYTE */ + val = byte_re_match_2_internal (bufp, string1, size1, string2, + size2, startpos, regs, stop); +#endif /* BYTE */ + +#ifndef REGEX_MALLOC +# ifdef C_ALLOCA + alloca (0); +# endif +#endif + + if (val >= 0) + { +#ifdef WCHAR + FREE_WCS_BUFFERS (); +#endif + return startpos; + } + + if (val == -2) + { +#ifdef WCHAR + FREE_WCS_BUFFERS (); +#endif + return -2; + } + + advance: + if (!range) + break; + else if (range > 0) + { + range--; + startpos++; + } + else + { + range++; + startpos--; + } + } +#ifdef WCHAR + FREE_WCS_BUFFERS (); +#endif + return -1; +} + +#ifdef WCHAR +/* This converts PTR, a pointer into one of the search wchar_t strings + `string1' and `string2' into an multibyte string offset from the + beginning of that string. We use mbs_offset to optimize. + See convert_mbs_to_wcs. */ +# define POINTER_TO_OFFSET(ptr) \ + (FIRST_STRING_P (ptr) \ + ? ((regoff_t)(mbs_offset1 != NULL? mbs_offset1[(ptr)-string1] : 0)) \ + : ((regoff_t)((mbs_offset2 != NULL? mbs_offset2[(ptr)-string2] : 0) \ + + csize1))) +#else /* BYTE */ +/* This converts PTR, a pointer into one of the search strings `string1' + and `string2' into an offset from the beginning of that string. */ +# define POINTER_TO_OFFSET(ptr) \ + (FIRST_STRING_P (ptr) \ + ? ((regoff_t) ((ptr) - string1)) \ + : ((regoff_t) ((ptr) - string2 + size1))) +#endif /* WCHAR */ + +/* Macros for dealing with the split strings in re_match_2. */ + +#define MATCHING_IN_FIRST_STRING (dend == end_match_1) + +/* Call before fetching a character with *d. This switches over to + string2 if necessary. */ +#define PREFETCH() \ + while (d == dend) \ + { \ + /* End of string2 => fail. */ \ + if (dend == end_match_2) \ + goto fail; \ + /* End of string1 => advance to string2. */ \ + d = string2; \ + dend = end_match_2; \ + } + +/* Test if at very beginning or at very end of the virtual concatenation + of `string1' and `string2'. If only one string, it's `string2'. */ +#define AT_STRINGS_BEG(d) ((d) == (size1 ? string1 : string2) || !size2) +#define AT_STRINGS_END(d) ((d) == end2) + + +/* Test if D points to a character which is word-constituent. We have + two special cases to check for: if past the end of string1, look at + the first character in string2; and if before the beginning of + string2, look at the last character in string1. */ +#ifdef WCHAR +/* Use internationalized API instead of SYNTAX. */ +# define WORDCHAR_P(d) \ + (iswalnum ((wint_t)((d) == end1 ? *string2 \ + : (d) == string2 - 1 ? *(end1 - 1) : *(d))) != 0 \ + || ((d) == end1 ? *string2 \ + : (d) == string2 - 1 ? *(end1 - 1) : *(d)) == L'_') +#else /* BYTE */ +# define WORDCHAR_P(d) \ + (SYNTAX ((d) == end1 ? *string2 \ + : (d) == string2 - 1 ? *(end1 - 1) : *(d)) \ + == Sword) +#endif /* WCHAR */ + +/* Disabled due to a compiler bug -- see comment at case wordbound */ +#if 0 +/* Test if the character before D and the one at D differ with respect + to being word-constituent. */ +#define AT_WORD_BOUNDARY(d) \ + (AT_STRINGS_BEG (d) || AT_STRINGS_END (d) \ + || WORDCHAR_P (d - 1) != WORDCHAR_P (d)) +#endif + +/* Free everything we malloc. */ +#ifdef MATCH_MAY_ALLOCATE +# ifdef WCHAR +# define FREE_VARIABLES() \ + do { \ + REGEX_FREE_STACK (fail_stack.stack); \ + FREE_VAR (regstart); \ + FREE_VAR (regend); \ + FREE_VAR (old_regstart); \ + FREE_VAR (old_regend); \ + FREE_VAR (best_regstart); \ + FREE_VAR (best_regend); \ + FREE_VAR (reg_info); \ + FREE_VAR (reg_dummy); \ + FREE_VAR (reg_info_dummy); \ + if (!cant_free_wcs_buf) \ + { \ + FREE_VAR (string1); \ + FREE_VAR (string2); \ + FREE_VAR (mbs_offset1); \ + FREE_VAR (mbs_offset2); \ + } \ + } while (0) +# else /* BYTE */ +# define FREE_VARIABLES() \ + do { \ + REGEX_FREE_STACK (fail_stack.stack); \ + FREE_VAR (regstart); \ + FREE_VAR (regend); \ + FREE_VAR (old_regstart); \ + FREE_VAR (old_regend); \ + FREE_VAR (best_regstart); \ + FREE_VAR (best_regend); \ + FREE_VAR (reg_info); \ + FREE_VAR (reg_dummy); \ + FREE_VAR (reg_info_dummy); \ + } while (0) +# endif /* WCHAR */ +#else +# ifdef WCHAR +# define FREE_VARIABLES() \ + do { \ + if (!cant_free_wcs_buf) \ + { \ + FREE_VAR (string1); \ + FREE_VAR (string2); \ + FREE_VAR (mbs_offset1); \ + FREE_VAR (mbs_offset2); \ + } \ + } while (0) +# else /* BYTE */ +# define FREE_VARIABLES() ((void)0) /* Do nothing! But inhibit gcc warning. */ +# endif /* WCHAR */ +#endif /* not MATCH_MAY_ALLOCATE */ + +/* These values must meet several constraints. They must not be valid + register values; since we have a limit of 255 registers (because + we use only one byte in the pattern for the register number), we can + use numbers larger than 255. They must differ by 1, because of + NUM_FAILURE_ITEMS above. And the value for the lowest register must + be larger than the value for the highest register, so we do not try + to actually save any registers when none are active. */ +#define NO_HIGHEST_ACTIVE_REG (1 << BYTEWIDTH) +#define NO_LOWEST_ACTIVE_REG (NO_HIGHEST_ACTIVE_REG + 1) + +#else /* not INSIDE_RECURSION */ +/* Matching routines. */ + +#ifndef emacs /* Emacs never uses this. */ +/* re_match is like re_match_2 except it takes only a single string. */ + +int +re_match (struct re_pattern_buffer *bufp, const char *string, + int size, int pos, struct re_registers *regs) +{ + int result; +# ifdef MBS_SUPPORT + if (MB_CUR_MAX != 1) + result = wcs_re_match_2_internal (bufp, NULL, 0, string, size, + pos, regs, size, + NULL, 0, NULL, 0, NULL, NULL); + else +# endif + result = byte_re_match_2_internal (bufp, NULL, 0, string, size, + pos, regs, size); +# ifndef REGEX_MALLOC +# ifdef C_ALLOCA + alloca (0); +# endif +# endif + return result; +} +# ifdef _LIBC +weak_alias (__re_match, re_match) +# endif +#endif /* not emacs */ + +#endif /* not INSIDE_RECURSION */ + +#ifdef INSIDE_RECURSION +static boolean PREFIX(group_match_null_string_p) (UCHAR_T **p, + UCHAR_T *end, + PREFIX(register_info_type) *reg_info); +static boolean PREFIX(alt_match_null_string_p) (UCHAR_T *p, + UCHAR_T *end, + PREFIX(register_info_type) *reg_info); +static boolean PREFIX(common_op_match_null_string_p) (UCHAR_T **p, + UCHAR_T *end, + PREFIX(register_info_type) *reg_info); +static int PREFIX(bcmp_translate) (const CHAR_T *s1, const CHAR_T *s2, + int len, char *translate); +#else /* not INSIDE_RECURSION */ + +/* re_match_2 matches the compiled pattern in BUFP against the + the (virtual) concatenation of STRING1 and STRING2 (of length SIZE1 + and SIZE2, respectively). We start matching at POS, and stop + matching at STOP. + + If REGS is non-null and the `no_sub' field of BUFP is nonzero, we + store offsets for the substring each group matched in REGS. See the + documentation for exactly how many groups we fill. + + We return -1 if no match, -2 if an internal error (such as the + failure stack overflowing). Otherwise, we return the length of the + matched substring. */ + +int +re_match_2 (struct re_pattern_buffer *bufp, const char *string1, int size1, + const char *string2, int size2, int pos, + struct re_registers *regs, int stop) +{ + int result; +# ifdef MBS_SUPPORT + if (MB_CUR_MAX != 1) + result = wcs_re_match_2_internal (bufp, string1, size1, string2, size2, + pos, regs, stop, + NULL, 0, NULL, 0, NULL, NULL); + else +# endif + result = byte_re_match_2_internal (bufp, string1, size1, string2, size2, + pos, regs, stop); + +#ifndef REGEX_MALLOC +# ifdef C_ALLOCA + alloca (0); +# endif +#endif + return result; +} +#ifdef _LIBC +weak_alias (__re_match_2, re_match_2) +#endif + +#endif /* not INSIDE_RECURSION */ + +#ifdef INSIDE_RECURSION + +#ifdef WCHAR +static int count_mbs_length (int *, int); + +/* This check the substring (from 0, to length) of the multibyte string, + to which offset_buffer correspond. And count how many wchar_t_characters + the substring occupy. We use offset_buffer to optimization. + See convert_mbs_to_wcs. */ + +static int +count_mbs_length(int *offset_buffer, int length) +{ + int upper, lower; + + /* Check whether the size is valid. */ + if (length < 0) + return -1; + + if (offset_buffer == NULL) + return 0; + + /* If there are no multibyte character, offset_buffer[i] == i. + Optmize for this case. */ + if (offset_buffer[length] == length) + return length; + + /* Set up upper with length. (because for all i, offset_buffer[i] >= i) */ + upper = length; + lower = 0; + + while (true) + { + int middle = (lower + upper) / 2; + if (middle == lower || middle == upper) + break; + if (offset_buffer[middle] > length) + upper = middle; + else if (offset_buffer[middle] < length) + lower = middle; + else + return middle; + } + + return -1; +} +#endif /* WCHAR */ + +/* This is a separate function so that we can force an alloca cleanup + afterwards. */ +#ifdef WCHAR +static int +wcs_re_match_2_internal (struct re_pattern_buffer *bufp, + const char *cstring1, int csize1, + const char *cstring2, int csize2, + int pos, + struct re_registers *regs, + int stop, + /* string1 == string2 == NULL means string1/2, size1/2 and + mbs_offset1/2 need seting up in this function. */ + /* We need wchar_t* buffers correspond to cstring1, cstring2. */ + wchar_t *string1, int size1, + wchar_t *string2, int size2, + /* offset buffer for optimizatoin. See convert_mbs_to_wc. */ + int *mbs_offset1, int *mbs_offset2) +#else /* BYTE */ +static int +byte_re_match_2_internal (struct re_pattern_buffer *bufp, + const char *string1, int size1, + const char *string2, int size2, + int pos, + struct re_registers *regs, int stop) +#endif /* BYTE */ +{ + /* General temporaries. */ + int mcnt; + UCHAR_T *p1; +#ifdef WCHAR + /* They hold whether each wchar_t is binary data or not. */ + char *is_binary = NULL; + /* If true, we can't free string1/2, mbs_offset1/2. */ + int cant_free_wcs_buf = 1; +#endif /* WCHAR */ + + /* Just past the end of the corresponding string. */ + const CHAR_T *end1, *end2; + + /* Pointers into string1 and string2, just past the last characters in + each to consider matching. */ + const CHAR_T *end_match_1, *end_match_2; + + /* Where we are in the data, and the end of the current string. */ + const CHAR_T *d, *dend; + + /* Where we are in the pattern, and the end of the pattern. */ +#ifdef WCHAR + UCHAR_T *pattern, *p; + register UCHAR_T *pend; +#else /* BYTE */ + UCHAR_T *p = bufp->buffer; + register UCHAR_T *pend = p + bufp->used; +#endif /* WCHAR */ + + /* Mark the opcode just after a start_memory, so we can test for an + empty subpattern when we get to the stop_memory. */ + UCHAR_T *just_past_start_mem = 0; + + /* We use this to map every character in the string. */ + RE_TRANSLATE_TYPE translate = bufp->translate; + + /* Failure point stack. Each place that can handle a failure further + down the line pushes a failure point on this stack. It consists of + restart, regend, and reg_info for all registers corresponding to + the subexpressions we're currently inside, plus the number of such + registers, and, finally, two char *'s. The first char * is where + to resume scanning the pattern; the second one is where to resume + scanning the strings. If the latter is zero, the failure point is + a ``dummy''; if a failure happens and the failure point is a dummy, + it gets discarded and the next next one is tried. */ +#ifdef MATCH_MAY_ALLOCATE /* otherwise, this is global. */ + PREFIX(fail_stack_type) fail_stack; +#endif +#ifdef DEBUG + static unsigned failure_id; + unsigned nfailure_points_pushed = 0, nfailure_points_popped = 0; +#endif + +#ifdef REL_ALLOC + /* This holds the pointer to the failure stack, when + it is allocated relocatably. */ + fail_stack_elt_t *failure_stack_ptr; +#endif + + /* We fill all the registers internally, independent of what we + return, for use in backreferences. The number here includes + an element for register zero. */ + size_t num_regs = bufp->re_nsub + 1; + + /* The currently active registers. */ + active_reg_t lowest_active_reg = NO_LOWEST_ACTIVE_REG; + active_reg_t highest_active_reg = NO_HIGHEST_ACTIVE_REG; + + /* Information on the contents of registers. These are pointers into + the input strings; they record just what was matched (on this + attempt) by a subexpression part of the pattern, that is, the + regnum-th regstart pointer points to where in the pattern we began + matching and the regnum-th regend points to right after where we + stopped matching the regnum-th subexpression. (The zeroth register + keeps track of what the whole pattern matches.) */ +#ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global. */ + const CHAR_T **regstart, **regend; +#endif + + /* If a group that's operated upon by a repetition operator fails to + match anything, then the register for its start will need to be + restored because it will have been set to wherever in the string we + are when we last see its open-group operator. Similarly for a + register's end. */ +#ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global. */ + const CHAR_T **old_regstart, **old_regend; +#endif + + /* The is_active field of reg_info helps us keep track of which (possibly + nested) subexpressions we are currently in. The matched_something + field of reg_info[reg_num] helps us tell whether or not we have + matched any of the pattern so far this time through the reg_num-th + subexpression. These two fields get reset each time through any + loop their register is in. */ +#ifdef MATCH_MAY_ALLOCATE /* otherwise, this is global. */ + PREFIX(register_info_type) *reg_info; +#endif + + /* The following record the register info as found in the above + variables when we find a match better than any we've seen before. + This happens as we backtrack through the failure points, which in + turn happens only if we have not yet matched the entire string. */ + unsigned best_regs_set = false; +#ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global. */ + const CHAR_T **best_regstart, **best_regend; +#endif + + /* Logically, this is `best_regend[0]'. But we don't want to have to + allocate space for that if we're not allocating space for anything + else (see below). Also, we never need info about register 0 for + any of the other register vectors, and it seems rather a kludge to + treat `best_regend' differently than the rest. So we keep track of + the end of the best match so far in a separate variable. We + initialize this to NULL so that when we backtrack the first time + and need to test it, it's not garbage. */ + const CHAR_T *match_end = NULL; + + /* This helps SET_REGS_MATCHED avoid doing redundant work. */ + int set_regs_matched_done = 0; + + /* Used when we pop values we don't care about. */ +#ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global. */ + const CHAR_T **reg_dummy; + PREFIX(register_info_type) *reg_info_dummy; +#endif + +#ifdef DEBUG + /* Counts the total number of registers pushed. */ + unsigned num_regs_pushed = 0; +#endif + + DEBUG_PRINT1 ("\n\nEntering re_match_2.\n"); + + INIT_FAIL_STACK (); + +#ifdef MATCH_MAY_ALLOCATE + /* Do not bother to initialize all the register variables if there are + no groups in the pattern, as it takes a fair amount of time. If + there are groups, we include space for register 0 (the whole + pattern), even though we never use it, since it simplifies the + array indexing. We should fix this. */ + if (bufp->re_nsub) + { + regstart = REGEX_TALLOC (num_regs, const CHAR_T *); + regend = REGEX_TALLOC (num_regs, const CHAR_T *); + old_regstart = REGEX_TALLOC (num_regs, const CHAR_T *); + old_regend = REGEX_TALLOC (num_regs, const CHAR_T *); + best_regstart = REGEX_TALLOC (num_regs, const CHAR_T *); + best_regend = REGEX_TALLOC (num_regs, const CHAR_T *); + reg_info = REGEX_TALLOC (num_regs, PREFIX(register_info_type)); + reg_dummy = REGEX_TALLOC (num_regs, const CHAR_T *); + reg_info_dummy = REGEX_TALLOC (num_regs, PREFIX(register_info_type)); + + if (!(regstart && regend && old_regstart && old_regend && reg_info + && best_regstart && best_regend && reg_dummy && reg_info_dummy)) + { + FREE_VARIABLES (); + return -2; + } + } + else + { + /* We must initialize all our variables to NULL, so that + `FREE_VARIABLES' doesn't try to free them. */ + regstart = regend = old_regstart = old_regend = best_regstart + = best_regend = reg_dummy = NULL; + reg_info = reg_info_dummy = (PREFIX(register_info_type) *) NULL; + } +#endif /* MATCH_MAY_ALLOCATE */ + + /* The starting position is bogus. */ +#ifdef WCHAR + if (pos < 0 || pos > csize1 + csize2) +#else /* BYTE */ + if (pos < 0 || pos > size1 + size2) +#endif + { + FREE_VARIABLES (); + return -1; + } + +#ifdef WCHAR + /* Allocate wchar_t array for string1 and string2 and + fill them with converted string. */ + if (string1 == NULL && string2 == NULL) + { + /* We need seting up buffers here. */ + + /* We must free wcs buffers in this function. */ + cant_free_wcs_buf = 0; + + if (csize1 != 0) + { + string1 = REGEX_TALLOC (csize1 + 1, CHAR_T); + mbs_offset1 = REGEX_TALLOC (csize1 + 1, int); + is_binary = REGEX_TALLOC (csize1 + 1, char); + if (!string1 || !mbs_offset1 || !is_binary) + { + FREE_VAR (string1); + FREE_VAR (mbs_offset1); + FREE_VAR (is_binary); + return -2; + } + } + if (csize2 != 0) + { + string2 = REGEX_TALLOC (csize2 + 1, CHAR_T); + mbs_offset2 = REGEX_TALLOC (csize2 + 1, int); + is_binary = REGEX_TALLOC (csize2 + 1, char); + if (!string2 || !mbs_offset2 || !is_binary) + { + FREE_VAR (string1); + FREE_VAR (mbs_offset1); + FREE_VAR (string2); + FREE_VAR (mbs_offset2); + FREE_VAR (is_binary); + return -2; + } + size2 = convert_mbs_to_wcs(string2, cstring2, csize2, + mbs_offset2, is_binary); + string2[size2] = L'\0'; /* for a sentinel */ + FREE_VAR (is_binary); + } + } + + /* We need to cast pattern to (wchar_t*), because we casted this compiled + pattern to (char*) in regex_compile. */ + p = pattern = (CHAR_T*)bufp->buffer; + pend = (CHAR_T*)(bufp->buffer + bufp->used); + +#endif /* WCHAR */ + + /* Initialize subexpression text positions to -1 to mark ones that no + start_memory/stop_memory has been seen for. Also initialize the + register information struct. */ + for (mcnt = 1; (unsigned) mcnt < num_regs; mcnt++) + { + regstart[mcnt] = regend[mcnt] + = old_regstart[mcnt] = old_regend[mcnt] = REG_UNSET_VALUE; + + REG_MATCH_NULL_STRING_P (reg_info[mcnt]) = MATCH_NULL_UNSET_VALUE; + IS_ACTIVE (reg_info[mcnt]) = 0; + MATCHED_SOMETHING (reg_info[mcnt]) = 0; + EVER_MATCHED_SOMETHING (reg_info[mcnt]) = 0; + } + + /* We move `string1' into `string2' if the latter's empty -- but not if + `string1' is null. */ + if (size2 == 0 && string1 != NULL) + { + string2 = string1; + size2 = size1; + string1 = 0; + size1 = 0; +#ifdef WCHAR + mbs_offset2 = mbs_offset1; + csize2 = csize1; + mbs_offset1 = NULL; + csize1 = 0; +#endif + } + end1 = string1 + size1; + end2 = string2 + size2; + + /* Compute where to stop matching, within the two strings. */ +#ifdef WCHAR + if (stop <= csize1) + { + mcnt = count_mbs_length(mbs_offset1, stop); + end_match_1 = string1 + mcnt; + end_match_2 = string2; + } + else + { + if (stop > csize1 + csize2) + stop = csize1 + csize2; + end_match_1 = end1; + mcnt = count_mbs_length(mbs_offset2, stop-csize1); + end_match_2 = string2 + mcnt; + } + if (mcnt < 0) + { /* count_mbs_length return error. */ + FREE_VARIABLES (); + return -1; + } +#else + if (stop <= size1) + { + end_match_1 = string1 + stop; + end_match_2 = string2; + } + else + { + end_match_1 = end1; + end_match_2 = string2 + stop - size1; + } +#endif /* WCHAR */ + + /* `p' scans through the pattern as `d' scans through the data. + `dend' is the end of the input string that `d' points within. `d' + is advanced into the following input string whenever necessary, but + this happens before fetching; therefore, at the beginning of the + loop, `d' can be pointing at the end of a string, but it cannot + equal `string2'. */ +#ifdef WCHAR + if (size1 > 0 && pos <= csize1) + { + mcnt = count_mbs_length(mbs_offset1, pos); + d = string1 + mcnt; + dend = end_match_1; + } + else + { + mcnt = count_mbs_length(mbs_offset2, pos-csize1); + d = string2 + mcnt; + dend = end_match_2; + } + + if (mcnt < 0) + { /* count_mbs_length return error. */ + FREE_VARIABLES (); + return -1; + } +#else + if (size1 > 0 && pos <= size1) + { + d = string1 + pos; + dend = end_match_1; + } + else + { + d = string2 + pos - size1; + dend = end_match_2; + } +#endif /* WCHAR */ + + DEBUG_PRINT1 ("The compiled pattern is:\n"); + DEBUG_PRINT_COMPILED_PATTERN (bufp, p, pend); + DEBUG_PRINT1 ("The string to match is: `"); + DEBUG_PRINT_DOUBLE_STRING (d, string1, size1, string2, size2); + DEBUG_PRINT1 ("'\n"); + + /* This loops over pattern commands. It exits by returning from the + function if the match is complete, or it drops through if the match + fails at this starting point in the input data. */ + for (;;) + { +#ifdef _LIBC + DEBUG_PRINT2 ("\n%p: ", p); +#else + DEBUG_PRINT2 ("\n0x%x: ", p); +#endif + + if (p == pend) + { /* End of pattern means we might have succeeded. */ + DEBUG_PRINT1 ("end of pattern ... "); + + /* If we haven't matched the entire string, and we want the + longest match, try backtracking. */ + if (d != end_match_2) + { + /* 1 if this match ends in the same string (string1 or string2) + as the best previous match. */ + boolean same_str_p = (FIRST_STRING_P (match_end) + == MATCHING_IN_FIRST_STRING); + /* 1 if this match is the best seen so far. */ + boolean best_match_p; + + /* AIX compiler got confused when this was combined + with the previous declaration. */ + if (same_str_p) + best_match_p = d > match_end; + else + best_match_p = !MATCHING_IN_FIRST_STRING; + + DEBUG_PRINT1 ("backtracking.\n"); + + if (!FAIL_STACK_EMPTY ()) + { /* More failure points to try. */ + + /* If exceeds best match so far, save it. */ + if (!best_regs_set || best_match_p) + { + best_regs_set = true; + match_end = d; + + DEBUG_PRINT1 ("\nSAVING match as best so far.\n"); + + for (mcnt = 1; (unsigned) mcnt < num_regs; mcnt++) + { + best_regstart[mcnt] = regstart[mcnt]; + best_regend[mcnt] = regend[mcnt]; + } + } + goto fail; + } + + /* If no failure points, don't restore garbage. And if + last match is real best match, don't restore second + best one. */ + else if (best_regs_set && !best_match_p) + { + restore_best_regs: + /* Restore best match. It may happen that `dend == + end_match_1' while the restored d is in string2. + For example, the pattern `x.*y.*z' against the + strings `x-' and `y-z-', if the two strings are + not consecutive in memory. */ + DEBUG_PRINT1 ("Restoring best registers.\n"); + + d = match_end; + dend = ((d >= string1 && d <= end1) + ? end_match_1 : end_match_2); + + for (mcnt = 1; (unsigned) mcnt < num_regs; mcnt++) + { + regstart[mcnt] = best_regstart[mcnt]; + regend[mcnt] = best_regend[mcnt]; + } + } + } /* d != end_match_2 */ + + succeed_label: + DEBUG_PRINT1 ("Accepting match.\n"); + /* If caller wants register contents data back, do it. */ + if (regs && !bufp->no_sub) + { + /* Have the register data arrays been allocated? */ + if (bufp->regs_allocated == REGS_UNALLOCATED) + { /* No. So allocate them with malloc. We need one + extra element beyond `num_regs' for the `-1' marker + GNU code uses. */ + regs->num_regs = MAX (RE_NREGS, num_regs + 1); + regs->start = TALLOC (regs->num_regs, regoff_t); + regs->end = TALLOC (regs->num_regs, regoff_t); + if (regs->start == NULL || regs->end == NULL) + { + FREE_VARIABLES (); + return -2; + } + bufp->regs_allocated = REGS_REALLOCATE; + } + else if (bufp->regs_allocated == REGS_REALLOCATE) + { /* Yes. If we need more elements than were already + allocated, reallocate them. If we need fewer, just + leave it alone. */ + if (regs->num_regs < num_regs + 1) + { + regs->num_regs = num_regs + 1; + RETALLOC (regs->start, regs->num_regs, regoff_t); + RETALLOC (regs->end, regs->num_regs, regoff_t); + if (regs->start == NULL || regs->end == NULL) + { + FREE_VARIABLES (); + return -2; + } + } + } + else + { + /* These braces fend off a "empty body in an else-statement" + warning under GCC when assert expands to nothing. */ + assert (bufp->regs_allocated == REGS_FIXED); + } + + /* Convert the pointer data in `regstart' and `regend' to + indices. Register zero has to be set differently, + since we haven't kept track of any info for it. */ + if (regs->num_regs > 0) + { + regs->start[0] = pos; +#ifdef WCHAR + if (MATCHING_IN_FIRST_STRING) + regs->end[0] = mbs_offset1 != NULL ? + mbs_offset1[d-string1] : 0; + else + regs->end[0] = csize1 + (mbs_offset2 != NULL ? + mbs_offset2[d-string2] : 0); +#else + regs->end[0] = (MATCHING_IN_FIRST_STRING + ? ((regoff_t) (d - string1)) + : ((regoff_t) (d - string2 + size1))); +#endif /* WCHAR */ + } + + /* Go through the first `min (num_regs, regs->num_regs)' + registers, since that is all we initialized. */ + for (mcnt = 1; (unsigned) mcnt < MIN (num_regs, regs->num_regs); + mcnt++) + { + if (REG_UNSET (regstart[mcnt]) || REG_UNSET (regend[mcnt])) + regs->start[mcnt] = regs->end[mcnt] = -1; + else + { + regs->start[mcnt] + = (regoff_t) POINTER_TO_OFFSET (regstart[mcnt]); + regs->end[mcnt] + = (regoff_t) POINTER_TO_OFFSET (regend[mcnt]); + } + } + + /* If the regs structure we return has more elements than + were in the pattern, set the extra elements to -1. If + we (re)allocated the registers, this is the case, + because we always allocate enough to have at least one + -1 at the end. */ + for (mcnt = num_regs; (unsigned) mcnt < regs->num_regs; mcnt++) + regs->start[mcnt] = regs->end[mcnt] = -1; + } /* regs && !bufp->no_sub */ + + DEBUG_PRINT4 ("%u failure points pushed, %u popped (%u remain).\n", + nfailure_points_pushed, nfailure_points_popped, + nfailure_points_pushed - nfailure_points_popped); + DEBUG_PRINT2 ("%u registers pushed.\n", num_regs_pushed); + +#ifdef WCHAR + if (MATCHING_IN_FIRST_STRING) + mcnt = mbs_offset1 != NULL ? mbs_offset1[d-string1] : 0; + else + mcnt = (mbs_offset2 != NULL ? mbs_offset2[d-string2] : 0) + + csize1; + mcnt -= pos; +#else + mcnt = d - pos - (MATCHING_IN_FIRST_STRING + ? string1 + : string2 - size1); +#endif /* WCHAR */ + + DEBUG_PRINT2 ("Returning %d from re_match_2.\n", mcnt); + + FREE_VARIABLES (); + return mcnt; + } + + /* Otherwise match next pattern command. */ + switch (SWITCH_ENUM_CAST ((re_opcode_t) *p++)) + { + /* Ignore these. Used to ignore the n of succeed_n's which + currently have n == 0. */ + case no_op: + DEBUG_PRINT1 ("EXECUTING no_op.\n"); + break; + + case succeed: + DEBUG_PRINT1 ("EXECUTING succeed.\n"); + goto succeed_label; + + /* Match the next n pattern characters exactly. The following + byte in the pattern defines n, and the n bytes after that + are the characters to match. */ + case exactn: +#ifdef MBS_SUPPORT + case exactn_bin: +#endif + mcnt = *p++; + DEBUG_PRINT2 ("EXECUTING exactn %d.\n", mcnt); + + /* This is written out as an if-else so we don't waste time + testing `translate' inside the loop. */ + if (translate) + { + do + { + PREFETCH (); +#ifdef WCHAR + if (*d <= 0xff) + { + if ((UCHAR_T) translate[(unsigned char) *d++] + != (UCHAR_T) *p++) + goto fail; + } + else + { + if (*d++ != (CHAR_T) *p++) + goto fail; + } +#else + if ((UCHAR_T) translate[(unsigned char) *d++] + != (UCHAR_T) *p++) + goto fail; +#endif /* WCHAR */ + } + while (--mcnt); + } + else + { + do + { + PREFETCH (); + if (*d++ != (CHAR_T) *p++) goto fail; + } + while (--mcnt); + } + SET_REGS_MATCHED (); + break; + + + /* Match any character except possibly a newline or a null. */ + case anychar: + DEBUG_PRINT1 ("EXECUTING anychar.\n"); + + PREFETCH (); + + if ((!(bufp->syntax & RE_DOT_NEWLINE) && TRANSLATE (*d) == '\n') + || (bufp->syntax & RE_DOT_NOT_NULL && TRANSLATE (*d) == '\000')) + goto fail; + + SET_REGS_MATCHED (); + DEBUG_PRINT2 (" Matched `%ld'.\n", (long int) *d); + d++; + break; + + + case charset: + case charset_not: + { + register UCHAR_T c; +#ifdef WCHAR + unsigned int i, char_class_length, coll_symbol_length, + equiv_class_length, ranges_length, chars_length, length; + CHAR_T *workp, *workp2, *charset_top; +#define WORK_BUFFER_SIZE 128 + CHAR_T str_buf[WORK_BUFFER_SIZE]; +# ifdef _LIBC + uint32_t nrules; +# endif /* _LIBC */ +#endif /* WCHAR */ + boolean negate = (re_opcode_t) *(p - 1) == charset_not; + + DEBUG_PRINT2 ("EXECUTING charset%s.\n", negate ? "_not" : ""); + PREFETCH (); + c = TRANSLATE (*d); /* The character to match. */ +#ifdef WCHAR +# ifdef _LIBC + nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES); +# endif /* _LIBC */ + charset_top = p - 1; + char_class_length = *p++; + coll_symbol_length = *p++; + equiv_class_length = *p++; + ranges_length = *p++; + chars_length = *p++; + /* p points charset[6], so the address of the next instruction + (charset[l+m+n+2o+k+p']) equals p[l+m+n+2*o+p'], + where l=length of char_classes, m=length of collating_symbol, + n=equivalence_class, o=length of char_range, + p'=length of character. */ + workp = p; + /* Update p to indicate the next instruction. */ + p += char_class_length + coll_symbol_length+ equiv_class_length + + 2*ranges_length + chars_length; + + /* match with char_class? */ + for (i = 0; i < char_class_length ; i += CHAR_CLASS_SIZE) + { + wctype_t wctype; + uintptr_t alignedp = ((uintptr_t)workp + + __alignof__(wctype_t) - 1) + & ~(uintptr_t)(__alignof__(wctype_t) - 1); + wctype = *((wctype_t*)alignedp); + workp += CHAR_CLASS_SIZE; +# ifdef _LIBC + if (__iswctype((wint_t)c, wctype)) + goto char_set_matched; +# else + if (iswctype((wint_t)c, wctype)) + goto char_set_matched; +# endif + } + + /* match with collating_symbol? */ +# ifdef _LIBC + if (nrules != 0) + { + const unsigned char *extra = (const unsigned char *) + _NL_CURRENT (LC_COLLATE, _NL_COLLATE_SYMB_EXTRAMB); + + for (workp2 = workp + coll_symbol_length ; workp < workp2 ; + workp++) + { + int32_t *wextra; + wextra = (int32_t*)(extra + *workp++); + for (i = 0; i < *wextra; ++i) + if (TRANSLATE(d[i]) != wextra[1 + i]) + break; + + if (i == *wextra) + { + /* Update d, however d will be incremented at + char_set_matched:, we decrement d here. */ + d += i - 1; + goto char_set_matched; + } + } + } + else /* (nrules == 0) */ +# endif + /* If we can't look up collation data, we use wcscoll + instead. */ + { + for (workp2 = workp + coll_symbol_length ; workp < workp2 ;) + { + const CHAR_T *backup_d = d, *backup_dend = dend; +# ifdef _LIBC + length = __wcslen (workp); +# else + length = wcslen (workp); +# endif + + /* If wcscoll(the collating symbol, whole string) > 0, + any substring of the string never match with the + collating symbol. */ +# ifdef _LIBC + if (__wcscoll (workp, d) > 0) +# else + if (wcscoll (workp, d) > 0) +# endif + { + workp += length + 1; + continue; + } + + /* First, we compare the collating symbol with + the first character of the string. + If it don't match, we add the next character to + the compare buffer in turn. */ + for (i = 0 ; i < WORK_BUFFER_SIZE-1 ; i++, d++) + { + int match; + if (d == dend) + { + if (dend == end_match_2) + break; + d = string2; + dend = end_match_2; + } + + /* add next character to the compare buffer. */ + str_buf[i] = TRANSLATE(*d); + str_buf[i+1] = '\0'; + +# ifdef _LIBC + match = __wcscoll (workp, str_buf); +# else + match = wcscoll (workp, str_buf); +# endif + if (match == 0) + goto char_set_matched; + + if (match < 0) + /* (str_buf > workp) indicate (str_buf + X > workp), + because for all X (str_buf + X > str_buf). + So we don't need continue this loop. */ + break; + + /* Otherwise(str_buf < workp), + (str_buf+next_character) may equals (workp). + So we continue this loop. */ + } + /* not matched */ + d = backup_d; + dend = backup_dend; + workp += length + 1; + } + } + /* match with equivalence_class? */ +# ifdef _LIBC + if (nrules != 0) + { + const CHAR_T *backup_d = d, *backup_dend = dend; + /* Try to match the equivalence class against + those known to the collate implementation. */ + const int32_t *table; + const int32_t *weights; + const int32_t *extra; + const int32_t *indirect; + int32_t idx, idx2; + wint_t *cp; + size_t len; + + /* This #include defines a local function! */ +# include + + table = (const int32_t *) + _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEWC); + weights = (const wint_t *) + _NL_CURRENT (LC_COLLATE, _NL_COLLATE_WEIGHTWC); + extra = (const wint_t *) + _NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAWC); + indirect = (const int32_t *) + _NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTWC); + + /* Write 1 collating element to str_buf, and + get its index. */ + idx2 = 0; + + for (i = 0 ; idx2 == 0 && i < WORK_BUFFER_SIZE - 1; i++) + { + cp = (wint_t*)str_buf; + if (d == dend) + { + if (dend == end_match_2) + break; + d = string2; + dend = end_match_2; + } + str_buf[i] = TRANSLATE(*(d+i)); + str_buf[i+1] = '\0'; /* sentinel */ + idx2 = findidx ((const wint_t**)&cp); + } + + /* Update d, however d will be incremented at + char_set_matched:, we decrement d here. */ + d = backup_d + ((wchar_t*)cp - (wchar_t*)str_buf - 1); + if (d >= dend) + { + if (dend == end_match_2) + d = dend; + else + { + d = string2; + dend = end_match_2; + } + } + + len = weights[idx2]; + + for (workp2 = workp + equiv_class_length ; workp < workp2 ; + workp++) + { + idx = (int32_t)*workp; + /* We already checked idx != 0 in regex_compile. */ + + if (idx2 != 0 && len == weights[idx]) + { + int cnt = 0; + while (cnt < len && (weights[idx + 1 + cnt] + == weights[idx2 + 1 + cnt])) + ++cnt; + + if (cnt == len) + goto char_set_matched; + } + } + /* not matched */ + d = backup_d; + dend = backup_dend; + } + else /* (nrules == 0) */ +# endif + /* If we can't look up collation data, we use wcscoll + instead. */ + { + for (workp2 = workp + equiv_class_length ; workp < workp2 ;) + { + const CHAR_T *backup_d = d, *backup_dend = dend; +# ifdef _LIBC + length = __wcslen (workp); +# else + length = wcslen (workp); +# endif + + /* If wcscoll(the collating symbol, whole string) > 0, + any substring of the string never match with the + collating symbol. */ +# ifdef _LIBC + if (__wcscoll (workp, d) > 0) +# else + if (wcscoll (workp, d) > 0) +# endif + { + workp += length + 1; + break; + } + + /* First, we compare the equivalence class with + the first character of the string. + If it don't match, we add the next character to + the compare buffer in turn. */ + for (i = 0 ; i < WORK_BUFFER_SIZE - 1 ; i++, d++) + { + int match; + if (d == dend) + { + if (dend == end_match_2) + break; + d = string2; + dend = end_match_2; + } + + /* add next character to the compare buffer. */ + str_buf[i] = TRANSLATE(*d); + str_buf[i+1] = '\0'; + +# ifdef _LIBC + match = __wcscoll (workp, str_buf); +# else + match = wcscoll (workp, str_buf); +# endif + + if (match == 0) + goto char_set_matched; + + if (match < 0) + /* (str_buf > workp) indicate (str_buf + X > workp), + because for all X (str_buf + X > str_buf). + So we don't need continue this loop. */ + break; + + /* Otherwise(str_buf < workp), + (str_buf+next_character) may equals (workp). + So we continue this loop. */ + } + /* not matched */ + d = backup_d; + dend = backup_dend; + workp += length + 1; + } + } + + /* match with char_range? */ +# ifdef _LIBC + if (nrules != 0) + { + uint32_t collseqval; + const char *collseq = (const char *) + _NL_CURRENT(LC_COLLATE, _NL_COLLATE_COLLSEQWC); + + collseqval = collseq_table_lookup (collseq, c); + + for (; workp < p - chars_length ;) + { + uint32_t start_val, end_val; + + /* We already compute the collation sequence value + of the characters (or collating symbols). */ + start_val = (uint32_t) *workp++; /* range_start */ + end_val = (uint32_t) *workp++; /* range_end */ + + if (start_val <= collseqval && collseqval <= end_val) + goto char_set_matched; + } + } + else +# endif + { + /* We set range_start_char at str_buf[0], range_end_char + at str_buf[4], and compared char at str_buf[2]. */ + str_buf[1] = 0; + str_buf[2] = c; + str_buf[3] = 0; + str_buf[5] = 0; + for (; workp < p - chars_length ;) + { + wchar_t *range_start_char, *range_end_char; + + /* match if (range_start_char <= c <= range_end_char). */ + + /* If range_start(or end) < 0, we assume -range_start(end) + is the offset of the collating symbol which is specified + as the character of the range start(end). */ + + /* range_start */ + if (*workp < 0) + range_start_char = charset_top - (*workp++); + else + { + str_buf[0] = *workp++; + range_start_char = str_buf; + } + + /* range_end */ + if (*workp < 0) + range_end_char = charset_top - (*workp++); + else + { + str_buf[4] = *workp++; + range_end_char = str_buf + 4; + } + +# ifdef _LIBC + if (__wcscoll (range_start_char, str_buf+2) <= 0 + && __wcscoll (str_buf+2, range_end_char) <= 0) +# else + if (wcscoll (range_start_char, str_buf+2) <= 0 + && wcscoll (str_buf+2, range_end_char) <= 0) +# endif + goto char_set_matched; + } + } + + /* match with char? */ + for (; workp < p ; workp++) + if (c == *workp) + goto char_set_matched; + + negate = !negate; + + char_set_matched: + if (negate) goto fail; +#else + /* Cast to `unsigned' instead of `unsigned char' in case the + bit list is a full 32 bytes long. */ + if (c < (unsigned) (*p * BYTEWIDTH) + && p[1 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH))) + negate = !negate; + + p += 1 + *p; + + if (!negate) goto fail; +#undef WORK_BUFFER_SIZE +#endif /* WCHAR */ + SET_REGS_MATCHED (); + d++; + break; + } + + + /* The beginning of a group is represented by start_memory. + The arguments are the register number in the next byte, and the + number of groups inner to this one in the next. The text + matched within the group is recorded (in the internal + registers data structure) under the register number. */ + case start_memory: + DEBUG_PRINT3 ("EXECUTING start_memory %ld (%ld):\n", + (long int) *p, (long int) p[1]); + + /* Find out if this group can match the empty string. */ + p1 = p; /* To send to group_match_null_string_p. */ + + if (REG_MATCH_NULL_STRING_P (reg_info[*p]) == MATCH_NULL_UNSET_VALUE) + REG_MATCH_NULL_STRING_P (reg_info[*p]) + = PREFIX(group_match_null_string_p) (&p1, pend, reg_info); + + /* Save the position in the string where we were the last time + we were at this open-group operator in case the group is + operated upon by a repetition operator, e.g., with `(a*)*b' + against `ab'; then we want to ignore where we are now in + the string in case this attempt to match fails. */ + old_regstart[*p] = REG_MATCH_NULL_STRING_P (reg_info[*p]) + ? REG_UNSET (regstart[*p]) ? d : regstart[*p] + : regstart[*p]; + DEBUG_PRINT2 (" old_regstart: %d\n", + POINTER_TO_OFFSET (old_regstart[*p])); + + regstart[*p] = d; + DEBUG_PRINT2 (" regstart: %d\n", POINTER_TO_OFFSET (regstart[*p])); + + IS_ACTIVE (reg_info[*p]) = 1; + MATCHED_SOMETHING (reg_info[*p]) = 0; + + /* Clear this whenever we change the register activity status. */ + set_regs_matched_done = 0; + + /* This is the new highest active register. */ + highest_active_reg = *p; + + /* If nothing was active before, this is the new lowest active + register. */ + if (lowest_active_reg == NO_LOWEST_ACTIVE_REG) + lowest_active_reg = *p; + + /* Move past the register number and inner group count. */ + p += 2; + just_past_start_mem = p; + + break; + + + /* The stop_memory opcode represents the end of a group. Its + arguments are the same as start_memory's: the register + number, and the number of inner groups. */ + case stop_memory: + DEBUG_PRINT3 ("EXECUTING stop_memory %ld (%ld):\n", + (long int) *p, (long int) p[1]); + + /* We need to save the string position the last time we were at + this close-group operator in case the group is operated + upon by a repetition operator, e.g., with `((a*)*(b*)*)*' + against `aba'; then we want to ignore where we are now in + the string in case this attempt to match fails. */ + old_regend[*p] = REG_MATCH_NULL_STRING_P (reg_info[*p]) + ? REG_UNSET (regend[*p]) ? d : regend[*p] + : regend[*p]; + DEBUG_PRINT2 (" old_regend: %d\n", + POINTER_TO_OFFSET (old_regend[*p])); + + regend[*p] = d; + DEBUG_PRINT2 (" regend: %d\n", POINTER_TO_OFFSET (regend[*p])); + + /* This register isn't active anymore. */ + IS_ACTIVE (reg_info[*p]) = 0; + + /* Clear this whenever we change the register activity status. */ + set_regs_matched_done = 0; + + /* If this was the only register active, nothing is active + anymore. */ + if (lowest_active_reg == highest_active_reg) + { + lowest_active_reg = NO_LOWEST_ACTIVE_REG; + highest_active_reg = NO_HIGHEST_ACTIVE_REG; + } + else + { /* We must scan for the new highest active register, since + it isn't necessarily one less than now: consider + (a(b)c(d(e)f)g). When group 3 ends, after the f), the + new highest active register is 1. */ + UCHAR_T r = *p - 1; + while (r > 0 && !IS_ACTIVE (reg_info[r])) + r--; + + /* If we end up at register zero, that means that we saved + the registers as the result of an `on_failure_jump', not + a `start_memory', and we jumped to past the innermost + `stop_memory'. For example, in ((.)*) we save + registers 1 and 2 as a result of the *, but when we pop + back to the second ), we are at the stop_memory 1. + Thus, nothing is active. */ + if (r == 0) + { + lowest_active_reg = NO_LOWEST_ACTIVE_REG; + highest_active_reg = NO_HIGHEST_ACTIVE_REG; + } + else + highest_active_reg = r; + } + + /* If just failed to match something this time around with a + group that's operated on by a repetition operator, try to + force exit from the ``loop'', and restore the register + information for this group that we had before trying this + last match. */ + if ((!MATCHED_SOMETHING (reg_info[*p]) + || just_past_start_mem == p - 1) + && (p + 2) < pend) + { + boolean is_a_jump_n = false; + + p1 = p + 2; + mcnt = 0; + switch ((re_opcode_t) *p1++) + { + case jump_n: + is_a_jump_n = true; + case pop_failure_jump: + case maybe_pop_jump: + case jump: + case dummy_failure_jump: + EXTRACT_NUMBER_AND_INCR (mcnt, p1); + if (is_a_jump_n) + p1 += OFFSET_ADDRESS_SIZE; + break; + + default: + /* do nothing */ ; + } + p1 += mcnt; + + /* If the next operation is a jump backwards in the pattern + to an on_failure_jump right before the start_memory + corresponding to this stop_memory, exit from the loop + by forcing a failure after pushing on the stack the + on_failure_jump's jump in the pattern, and d. */ + if (mcnt < 0 && (re_opcode_t) *p1 == on_failure_jump + && (re_opcode_t) p1[1+OFFSET_ADDRESS_SIZE] == start_memory + && p1[2+OFFSET_ADDRESS_SIZE] == *p) + { + /* If this group ever matched anything, then restore + what its registers were before trying this last + failed match, e.g., with `(a*)*b' against `ab' for + regstart[1], and, e.g., with `((a*)*(b*)*)*' + against `aba' for regend[3]. + + Also restore the registers for inner groups for, + e.g., `((a*)(b*))*' against `aba' (register 3 would + otherwise get trashed). */ + + if (EVER_MATCHED_SOMETHING (reg_info[*p])) + { + unsigned r; + + EVER_MATCHED_SOMETHING (reg_info[*p]) = 0; + + /* Restore this and inner groups' (if any) registers. */ + for (r = *p; r < (unsigned) *p + (unsigned) *(p + 1); + r++) + { + regstart[r] = old_regstart[r]; + + /* xx why this test? */ + if (old_regend[r] >= regstart[r]) + regend[r] = old_regend[r]; + } + } + p1++; + EXTRACT_NUMBER_AND_INCR (mcnt, p1); + PUSH_FAILURE_POINT (p1 + mcnt, d, -2); + + goto fail; + } + } + + /* Move past the register number and the inner group count. */ + p += 2; + break; + + + /* \ has been turned into a `duplicate' command which is + followed by the numeric value of as the register number. */ + case duplicate: + { + register const CHAR_T *d2, *dend2; + int regno = *p++; /* Get which register to match against. */ + DEBUG_PRINT2 ("EXECUTING duplicate %d.\n", regno); + + /* Can't back reference a group which we've never matched. */ + if (REG_UNSET (regstart[regno]) || REG_UNSET (regend[regno])) + goto fail; + + /* Where in input to try to start matching. */ + d2 = regstart[regno]; + + /* Where to stop matching; if both the place to start and + the place to stop matching are in the same string, then + set to the place to stop, otherwise, for now have to use + the end of the first string. */ + + dend2 = ((FIRST_STRING_P (regstart[regno]) + == FIRST_STRING_P (regend[regno])) + ? regend[regno] : end_match_1); + for (;;) + { + /* If necessary, advance to next segment in register + contents. */ + while (d2 == dend2) + { + if (dend2 == end_match_2) break; + if (dend2 == regend[regno]) break; + + /* End of string1 => advance to string2. */ + d2 = string2; + dend2 = regend[regno]; + } + /* At end of register contents => success */ + if (d2 == dend2) break; + + /* If necessary, advance to next segment in data. */ + PREFETCH (); + + /* How many characters left in this segment to match. */ + mcnt = dend - d; + + /* Want how many consecutive characters we can match in + one shot, so, if necessary, adjust the count. */ + if (mcnt > dend2 - d2) + mcnt = dend2 - d2; + + /* Compare that many; failure if mismatch, else move + past them. */ + if (translate + ? PREFIX(bcmp_translate) (d, d2, mcnt, translate) + : memcmp (d, d2, mcnt*sizeof(UCHAR_T))) + goto fail; + d += mcnt, d2 += mcnt; + + /* Do this because we've match some characters. */ + SET_REGS_MATCHED (); + } + } + break; + + + /* begline matches the empty string at the beginning of the string + (unless `not_bol' is set in `bufp'), and, if + `newline_anchor' is set, after newlines. */ + case begline: + DEBUG_PRINT1 ("EXECUTING begline.\n"); + + if (AT_STRINGS_BEG (d)) + { + if (!bufp->not_bol) break; + } + else if (d[-1] == '\n' && bufp->newline_anchor) + { + break; + } + /* In all other cases, we fail. */ + goto fail; + + + /* endline is the dual of begline. */ + case endline: + DEBUG_PRINT1 ("EXECUTING endline.\n"); + + if (AT_STRINGS_END (d)) + { + if (!bufp->not_eol) break; + } + + /* We have to ``prefetch'' the next character. */ + else if ((d == end1 ? *string2 : *d) == '\n' + && bufp->newline_anchor) + { + break; + } + goto fail; + + + /* Match at the very beginning of the data. */ + case begbuf: + DEBUG_PRINT1 ("EXECUTING begbuf.\n"); + if (AT_STRINGS_BEG (d)) + break; + goto fail; + + + /* Match at the very end of the data. */ + case endbuf: + DEBUG_PRINT1 ("EXECUTING endbuf.\n"); + if (AT_STRINGS_END (d)) + break; + goto fail; + + + /* on_failure_keep_string_jump is used to optimize `.*\n'. It + pushes NULL as the value for the string on the stack. Then + `pop_failure_point' will keep the current value for the + string, instead of restoring it. To see why, consider + matching `foo\nbar' against `.*\n'. The .* matches the foo; + then the . fails against the \n. But the next thing we want + to do is match the \n against the \n; if we restored the + string value, we would be back at the foo. + + Because this is used only in specific cases, we don't need to + check all the things that `on_failure_jump' does, to make + sure the right things get saved on the stack. Hence we don't + share its code. The only reason to push anything on the + stack at all is that otherwise we would have to change + `anychar's code to do something besides goto fail in this + case; that seems worse than this. */ + case on_failure_keep_string_jump: + DEBUG_PRINT1 ("EXECUTING on_failure_keep_string_jump"); + + EXTRACT_NUMBER_AND_INCR (mcnt, p); +#ifdef _LIBC + DEBUG_PRINT3 (" %d (to %p):\n", mcnt, p + mcnt); +#else + DEBUG_PRINT3 (" %d (to 0x%x):\n", mcnt, p + mcnt); +#endif + + PUSH_FAILURE_POINT (p + mcnt, NULL, -2); + break; + + + /* Uses of on_failure_jump: + + Each alternative starts with an on_failure_jump that points + to the beginning of the next alternative. Each alternative + except the last ends with a jump that in effect jumps past + the rest of the alternatives. (They really jump to the + ending jump of the following alternative, because tensioning + these jumps is a hassle.) + + Repeats start with an on_failure_jump that points past both + the repetition text and either the following jump or + pop_failure_jump back to this on_failure_jump. */ + case on_failure_jump: + on_failure: + DEBUG_PRINT1 ("EXECUTING on_failure_jump"); + + EXTRACT_NUMBER_AND_INCR (mcnt, p); +#ifdef _LIBC + DEBUG_PRINT3 (" %d (to %p)", mcnt, p + mcnt); +#else + DEBUG_PRINT3 (" %d (to 0x%x)", mcnt, p + mcnt); +#endif + + /* If this on_failure_jump comes right before a group (i.e., + the original * applied to a group), save the information + for that group and all inner ones, so that if we fail back + to this point, the group's information will be correct. + For example, in \(a*\)*\1, we need the preceding group, + and in \(zz\(a*\)b*\)\2, we need the inner group. */ + + /* We can't use `p' to check ahead because we push + a failure point to `p + mcnt' after we do this. */ + p1 = p; + + /* We need to skip no_op's before we look for the + start_memory in case this on_failure_jump is happening as + the result of a completed succeed_n, as in \(a\)\{1,3\}b\1 + against aba. */ + while (p1 < pend && (re_opcode_t) *p1 == no_op) + p1++; + + if (p1 < pend && (re_opcode_t) *p1 == start_memory) + { + /* We have a new highest active register now. This will + get reset at the start_memory we are about to get to, + but we will have saved all the registers relevant to + this repetition op, as described above. */ + highest_active_reg = *(p1 + 1) + *(p1 + 2); + if (lowest_active_reg == NO_LOWEST_ACTIVE_REG) + lowest_active_reg = *(p1 + 1); + } + + DEBUG_PRINT1 (":\n"); + PUSH_FAILURE_POINT (p + mcnt, d, -2); + break; + + + /* A smart repeat ends with `maybe_pop_jump'. + We change it to either `pop_failure_jump' or `jump'. */ + case maybe_pop_jump: + EXTRACT_NUMBER_AND_INCR (mcnt, p); + DEBUG_PRINT2 ("EXECUTING maybe_pop_jump %d.\n", mcnt); + { + register UCHAR_T *p2 = p; + + /* Compare the beginning of the repeat with what in the + pattern follows its end. If we can establish that there + is nothing that they would both match, i.e., that we + would have to backtrack because of (as in, e.g., `a*a') + then we can change to pop_failure_jump, because we'll + never have to backtrack. + + This is not true in the case of alternatives: in + `(a|ab)*' we do need to backtrack to the `ab' alternative + (e.g., if the string was `ab'). But instead of trying to + detect that here, the alternative has put on a dummy + failure point which is what we will end up popping. */ + + /* Skip over open/close-group commands. + If what follows this loop is a ...+ construct, + look at what begins its body, since we will have to + match at least one of that. */ + while (1) + { + if (p2 + 2 < pend + && ((re_opcode_t) *p2 == stop_memory + || (re_opcode_t) *p2 == start_memory)) + p2 += 3; + else if (p2 + 2 + 2 * OFFSET_ADDRESS_SIZE < pend + && (re_opcode_t) *p2 == dummy_failure_jump) + p2 += 2 + 2 * OFFSET_ADDRESS_SIZE; + else + break; + } + + p1 = p + mcnt; + /* p1[0] ... p1[2] are the `on_failure_jump' corresponding + to the `maybe_finalize_jump' of this case. Examine what + follows. */ + + /* If we're at the end of the pattern, we can change. */ + if (p2 == pend) + { + /* Consider what happens when matching ":\(.*\)" + against ":/". I don't really understand this code + yet. */ + p[-(1+OFFSET_ADDRESS_SIZE)] = (UCHAR_T) + pop_failure_jump; + DEBUG_PRINT1 + (" End of pattern: change to `pop_failure_jump'.\n"); + } + + else if ((re_opcode_t) *p2 == exactn +#ifdef MBS_SUPPORT + || (re_opcode_t) *p2 == exactn_bin +#endif + || (bufp->newline_anchor && (re_opcode_t) *p2 == endline)) + { + register UCHAR_T c + = *p2 == (UCHAR_T) endline ? '\n' : p2[2]; + + if (((re_opcode_t) p1[1+OFFSET_ADDRESS_SIZE] == exactn +#ifdef MBS_SUPPORT + || (re_opcode_t) p1[1+OFFSET_ADDRESS_SIZE] == exactn_bin +#endif + ) && p1[3+OFFSET_ADDRESS_SIZE] != c) + { + p[-(1+OFFSET_ADDRESS_SIZE)] = (UCHAR_T) + pop_failure_jump; +#ifdef WCHAR + DEBUG_PRINT3 (" %C != %C => pop_failure_jump.\n", + (wint_t) c, + (wint_t) p1[3+OFFSET_ADDRESS_SIZE]); +#else + DEBUG_PRINT3 (" %c != %c => pop_failure_jump.\n", + (char) c, + (char) p1[3+OFFSET_ADDRESS_SIZE]); +#endif + } + +#ifndef WCHAR + else if ((re_opcode_t) p1[3] == charset + || (re_opcode_t) p1[3] == charset_not) + { + int negate = (re_opcode_t) p1[3] == charset_not; + + if (c < (unsigned) (p1[4] * BYTEWIDTH) + && p1[5 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH))) + negate = !negate; + + /* `negate' is equal to 1 if c would match, which means + that we can't change to pop_failure_jump. */ + if (!negate) + { + p[-3] = (unsigned char) pop_failure_jump; + DEBUG_PRINT1 (" No match => pop_failure_jump.\n"); + } + } +#endif /* not WCHAR */ + } +#ifndef WCHAR + else if ((re_opcode_t) *p2 == charset) + { + /* We win if the first character of the loop is not part + of the charset. */ + if ((re_opcode_t) p1[3] == exactn + && ! ((int) p2[1] * BYTEWIDTH > (int) p1[5] + && (p2[2 + p1[5] / BYTEWIDTH] + & (1 << (p1[5] % BYTEWIDTH))))) + { + p[-3] = (unsigned char) pop_failure_jump; + DEBUG_PRINT1 (" No match => pop_failure_jump.\n"); + } + + else if ((re_opcode_t) p1[3] == charset_not) + { + int idx; + /* We win if the charset_not inside the loop + lists every character listed in the charset after. */ + for (idx = 0; idx < (int) p2[1]; idx++) + if (! (p2[2 + idx] == 0 + || (idx < (int) p1[4] + && ((p2[2 + idx] & ~ p1[5 + idx]) == 0)))) + break; + + if (idx == p2[1]) + { + p[-3] = (unsigned char) pop_failure_jump; + DEBUG_PRINT1 (" No match => pop_failure_jump.\n"); + } + } + else if ((re_opcode_t) p1[3] == charset) + { + int idx; + /* We win if the charset inside the loop + has no overlap with the one after the loop. */ + for (idx = 0; + idx < (int) p2[1] && idx < (int) p1[4]; + idx++) + if ((p2[2 + idx] & p1[5 + idx]) != 0) + break; + + if (idx == p2[1] || idx == p1[4]) + { + p[-3] = (unsigned char) pop_failure_jump; + DEBUG_PRINT1 (" No match => pop_failure_jump.\n"); + } + } + } +#endif /* not WCHAR */ + } + p -= OFFSET_ADDRESS_SIZE; /* Point at relative address again. */ + if ((re_opcode_t) p[-1] != pop_failure_jump) + { + p[-1] = (UCHAR_T) jump; + DEBUG_PRINT1 (" Match => jump.\n"); + goto unconditional_jump; + } + /* Note fall through. */ + + + /* The end of a simple repeat has a pop_failure_jump back to + its matching on_failure_jump, where the latter will push a + failure point. The pop_failure_jump takes off failure + points put on by this pop_failure_jump's matching + on_failure_jump; we got through the pattern to here from the + matching on_failure_jump, so didn't fail. */ + case pop_failure_jump: + { + /* We need to pass separate storage for the lowest and + highest registers, even though we don't care about the + actual values. Otherwise, we will restore only one + register from the stack, since lowest will == highest in + `pop_failure_point'. */ + active_reg_t dummy_low_reg, dummy_high_reg; + UCHAR_T *pdummy = NULL; + const CHAR_T *sdummy = NULL; + + DEBUG_PRINT1 ("EXECUTING pop_failure_jump.\n"); + POP_FAILURE_POINT (sdummy, pdummy, + dummy_low_reg, dummy_high_reg, + reg_dummy, reg_dummy, reg_info_dummy); + } + /* Note fall through. */ + + unconditional_jump: +#ifdef _LIBC + DEBUG_PRINT2 ("\n%p: ", p); +#else + DEBUG_PRINT2 ("\n0x%x: ", p); +#endif + /* Note fall through. */ + + /* Unconditionally jump (without popping any failure points). */ + case jump: + EXTRACT_NUMBER_AND_INCR (mcnt, p); /* Get the amount to jump. */ + DEBUG_PRINT2 ("EXECUTING jump %d ", mcnt); + p += mcnt; /* Do the jump. */ +#ifdef _LIBC + DEBUG_PRINT2 ("(to %p).\n", p); +#else + DEBUG_PRINT2 ("(to 0x%x).\n", p); +#endif + break; + + + /* We need this opcode so we can detect where alternatives end + in `group_match_null_string_p' et al. */ + case jump_past_alt: + DEBUG_PRINT1 ("EXECUTING jump_past_alt.\n"); + goto unconditional_jump; + + + /* Normally, the on_failure_jump pushes a failure point, which + then gets popped at pop_failure_jump. We will end up at + pop_failure_jump, also, and with a pattern of, say, `a+', we + are skipping over the on_failure_jump, so we have to push + something meaningless for pop_failure_jump to pop. */ + case dummy_failure_jump: + DEBUG_PRINT1 ("EXECUTING dummy_failure_jump.\n"); + /* It doesn't matter what we push for the string here. What + the code at `fail' tests is the value for the pattern. */ + PUSH_FAILURE_POINT (NULL, NULL, -2); + goto unconditional_jump; + + + /* At the end of an alternative, we need to push a dummy failure + point in case we are followed by a `pop_failure_jump', because + we don't want the failure point for the alternative to be + popped. For example, matching `(a|ab)*' against `aab' + requires that we match the `ab' alternative. */ + case push_dummy_failure: + DEBUG_PRINT1 ("EXECUTING push_dummy_failure.\n"); + /* See comments just above at `dummy_failure_jump' about the + two zeroes. */ + PUSH_FAILURE_POINT (NULL, NULL, -2); + break; + + /* Have to succeed matching what follows at least n times. + After that, handle like `on_failure_jump'. */ + case succeed_n: + EXTRACT_NUMBER (mcnt, p + OFFSET_ADDRESS_SIZE); + DEBUG_PRINT2 ("EXECUTING succeed_n %d.\n", mcnt); + + assert (mcnt >= 0); + /* Originally, this is how many times we HAVE to succeed. */ + if (mcnt > 0) + { + mcnt--; + p += OFFSET_ADDRESS_SIZE; + STORE_NUMBER_AND_INCR (p, mcnt); +#ifdef _LIBC + DEBUG_PRINT3 (" Setting %p to %d.\n", p - OFFSET_ADDRESS_SIZE + , mcnt); +#else + DEBUG_PRINT3 (" Setting 0x%x to %d.\n", p - OFFSET_ADDRESS_SIZE + , mcnt); +#endif + } + else if (mcnt == 0) + { +#ifdef _LIBC + DEBUG_PRINT2 (" Setting two bytes from %p to no_op.\n", + p + OFFSET_ADDRESS_SIZE); +#else + DEBUG_PRINT2 (" Setting two bytes from 0x%x to no_op.\n", + p + OFFSET_ADDRESS_SIZE); +#endif /* _LIBC */ + +#ifdef WCHAR + p[1] = (UCHAR_T) no_op; +#else + p[2] = (UCHAR_T) no_op; + p[3] = (UCHAR_T) no_op; +#endif /* WCHAR */ + goto on_failure; + } + break; + + case jump_n: + EXTRACT_NUMBER (mcnt, p + OFFSET_ADDRESS_SIZE); + DEBUG_PRINT2 ("EXECUTING jump_n %d.\n", mcnt); + + /* Originally, this is how many times we CAN jump. */ + if (mcnt) + { + mcnt--; + STORE_NUMBER (p + OFFSET_ADDRESS_SIZE, mcnt); + +#ifdef _LIBC + DEBUG_PRINT3 (" Setting %p to %d.\n", p + OFFSET_ADDRESS_SIZE, + mcnt); +#else + DEBUG_PRINT3 (" Setting 0x%x to %d.\n", p + OFFSET_ADDRESS_SIZE, + mcnt); +#endif /* _LIBC */ + goto unconditional_jump; + } + /* If don't have to jump any more, skip over the rest of command. */ + else + p += 2 * OFFSET_ADDRESS_SIZE; + break; + + case set_number_at: + { + DEBUG_PRINT1 ("EXECUTING set_number_at.\n"); + + EXTRACT_NUMBER_AND_INCR (mcnt, p); + p1 = p + mcnt; + EXTRACT_NUMBER_AND_INCR (mcnt, p); +#ifdef _LIBC + DEBUG_PRINT3 (" Setting %p to %d.\n", p1, mcnt); +#else + DEBUG_PRINT3 (" Setting 0x%x to %d.\n", p1, mcnt); +#endif + STORE_NUMBER (p1, mcnt); + break; + } + +#if 0 + /* The DEC Alpha C compiler 3.x generates incorrect code for the + test WORDCHAR_P (d - 1) != WORDCHAR_P (d) in the expansion of + AT_WORD_BOUNDARY, so this code is disabled. Expanding the + macro and introducing temporary variables works around the bug. */ + + case wordbound: + DEBUG_PRINT1 ("EXECUTING wordbound.\n"); + if (AT_WORD_BOUNDARY (d)) + break; + goto fail; + + case notwordbound: + DEBUG_PRINT1 ("EXECUTING notwordbound.\n"); + if (AT_WORD_BOUNDARY (d)) + goto fail; + break; +#else + case wordbound: + { + boolean prevchar, thischar; + + DEBUG_PRINT1 ("EXECUTING wordbound.\n"); + if (AT_STRINGS_BEG (d) || AT_STRINGS_END (d)) + break; + + prevchar = WORDCHAR_P (d - 1); + thischar = WORDCHAR_P (d); + if (prevchar != thischar) + break; + goto fail; + } + + case notwordbound: + { + boolean prevchar, thischar; + + DEBUG_PRINT1 ("EXECUTING notwordbound.\n"); + if (AT_STRINGS_BEG (d) || AT_STRINGS_END (d)) + goto fail; + + prevchar = WORDCHAR_P (d - 1); + thischar = WORDCHAR_P (d); + if (prevchar != thischar) + goto fail; + break; + } +#endif + + case wordbeg: + DEBUG_PRINT1 ("EXECUTING wordbeg.\n"); + if (!AT_STRINGS_END (d) && WORDCHAR_P (d) + && (AT_STRINGS_BEG (d) || !WORDCHAR_P (d - 1))) + break; + goto fail; + + case wordend: + DEBUG_PRINT1 ("EXECUTING wordend.\n"); + if (!AT_STRINGS_BEG (d) && WORDCHAR_P (d - 1) + && (AT_STRINGS_END (d) || !WORDCHAR_P (d))) + break; + goto fail; + +#ifdef emacs + case before_dot: + DEBUG_PRINT1 ("EXECUTING before_dot.\n"); + if (PTR_CHAR_POS ((unsigned char *) d) >= point) + goto fail; + break; + + case at_dot: + DEBUG_PRINT1 ("EXECUTING at_dot.\n"); + if (PTR_CHAR_POS ((unsigned char *) d) != point) + goto fail; + break; + + case after_dot: + DEBUG_PRINT1 ("EXECUTING after_dot.\n"); + if (PTR_CHAR_POS ((unsigned char *) d) <= point) + goto fail; + break; + + case syntaxspec: + DEBUG_PRINT2 ("EXECUTING syntaxspec %d.\n", mcnt); + mcnt = *p++; + goto matchsyntax; + + case wordchar: + DEBUG_PRINT1 ("EXECUTING Emacs wordchar.\n"); + mcnt = (int) Sword; + matchsyntax: + PREFETCH (); + /* Can't use *d++ here; SYNTAX may be an unsafe macro. */ + d++; + if (SYNTAX (d[-1]) != (enum syntaxcode) mcnt) + goto fail; + SET_REGS_MATCHED (); + break; + + case notsyntaxspec: + DEBUG_PRINT2 ("EXECUTING notsyntaxspec %d.\n", mcnt); + mcnt = *p++; + goto matchnotsyntax; + + case notwordchar: + DEBUG_PRINT1 ("EXECUTING Emacs notwordchar.\n"); + mcnt = (int) Sword; + matchnotsyntax: + PREFETCH (); + /* Can't use *d++ here; SYNTAX may be an unsafe macro. */ + d++; + if (SYNTAX (d[-1]) == (enum syntaxcode) mcnt) + goto fail; + SET_REGS_MATCHED (); + break; + +#else /* not emacs */ + case wordchar: + DEBUG_PRINT1 ("EXECUTING non-Emacs wordchar.\n"); + PREFETCH (); + if (!WORDCHAR_P (d)) + goto fail; + SET_REGS_MATCHED (); + d++; + break; + + case notwordchar: + DEBUG_PRINT1 ("EXECUTING non-Emacs notwordchar.\n"); + PREFETCH (); + if (WORDCHAR_P (d)) + goto fail; + SET_REGS_MATCHED (); + d++; + break; +#endif /* not emacs */ + + default: + abort (); + } + continue; /* Successfully executed one pattern command; keep going. */ + + + /* We goto here if a matching operation fails. */ + fail: + if (!FAIL_STACK_EMPTY ()) + { /* A restart point is known. Restore to that state. */ + DEBUG_PRINT1 ("\nFAIL:\n"); + POP_FAILURE_POINT (d, p, + lowest_active_reg, highest_active_reg, + regstart, regend, reg_info); + + /* If this failure point is a dummy, try the next one. */ + if (!p) + goto fail; + + /* If we failed to the end of the pattern, don't examine *p. */ + assert (p <= pend); + if (p < pend) + { + boolean is_a_jump_n = false; + + /* If failed to a backwards jump that's part of a repetition + loop, need to pop this failure point and use the next one. */ + switch ((re_opcode_t) *p) + { + case jump_n: + is_a_jump_n = true; + case maybe_pop_jump: + case pop_failure_jump: + case jump: + p1 = p + 1; + EXTRACT_NUMBER_AND_INCR (mcnt, p1); + p1 += mcnt; + + if ((is_a_jump_n && (re_opcode_t) *p1 == succeed_n) + || (!is_a_jump_n + && (re_opcode_t) *p1 == on_failure_jump)) + goto fail; + break; + default: + /* do nothing */ ; + } + } + + if (d >= string1 && d <= end1) + dend = end_match_1; + } + else + break; /* Matching at this starting point really fails. */ + } /* for (;;) */ + + if (best_regs_set) + goto restore_best_regs; + + FREE_VARIABLES (); + + return -1; /* Failure to match. */ +} /* re_match_2 */ + +/* Subroutine definitions for re_match_2. */ + + +/* We are passed P pointing to a register number after a start_memory. + + Return true if the pattern up to the corresponding stop_memory can + match the empty string, and false otherwise. + + If we find the matching stop_memory, sets P to point to one past its number. + Otherwise, sets P to an undefined byte less than or equal to END. + + We don't handle duplicates properly (yet). */ + +static boolean +PREFIX(group_match_null_string_p) (UCHAR_T **p, UCHAR_T *end, + PREFIX(register_info_type) *reg_info) +{ + int mcnt; + /* Point to after the args to the start_memory. */ + UCHAR_T *p1 = *p + 2; + + while (p1 < end) + { + /* Skip over opcodes that can match nothing, and return true or + false, as appropriate, when we get to one that can't, or to the + matching stop_memory. */ + + switch ((re_opcode_t) *p1) + { + /* Could be either a loop or a series of alternatives. */ + case on_failure_jump: + p1++; + EXTRACT_NUMBER_AND_INCR (mcnt, p1); + + /* If the next operation is not a jump backwards in the + pattern. */ + + if (mcnt >= 0) + { + /* Go through the on_failure_jumps of the alternatives, + seeing if any of the alternatives cannot match nothing. + The last alternative starts with only a jump, + whereas the rest start with on_failure_jump and end + with a jump, e.g., here is the pattern for `a|b|c': + + /on_failure_jump/0/6/exactn/1/a/jump_past_alt/0/6 + /on_failure_jump/0/6/exactn/1/b/jump_past_alt/0/3 + /exactn/1/c + + So, we have to first go through the first (n-1) + alternatives and then deal with the last one separately. */ + + + /* Deal with the first (n-1) alternatives, which start + with an on_failure_jump (see above) that jumps to right + past a jump_past_alt. */ + + while ((re_opcode_t) p1[mcnt-(1+OFFSET_ADDRESS_SIZE)] == + jump_past_alt) + { + /* `mcnt' holds how many bytes long the alternative + is, including the ending `jump_past_alt' and + its number. */ + + if (!PREFIX(alt_match_null_string_p) (p1, p1 + mcnt - + (1 + OFFSET_ADDRESS_SIZE), + reg_info)) + return false; + + /* Move to right after this alternative, including the + jump_past_alt. */ + p1 += mcnt; + + /* Break if it's the beginning of an n-th alternative + that doesn't begin with an on_failure_jump. */ + if ((re_opcode_t) *p1 != on_failure_jump) + break; + + /* Still have to check that it's not an n-th + alternative that starts with an on_failure_jump. */ + p1++; + EXTRACT_NUMBER_AND_INCR (mcnt, p1); + if ((re_opcode_t) p1[mcnt-(1+OFFSET_ADDRESS_SIZE)] != + jump_past_alt) + { + /* Get to the beginning of the n-th alternative. */ + p1 -= 1 + OFFSET_ADDRESS_SIZE; + break; + } + } + + /* Deal with the last alternative: go back and get number + of the `jump_past_alt' just before it. `mcnt' contains + the length of the alternative. */ + EXTRACT_NUMBER (mcnt, p1 - OFFSET_ADDRESS_SIZE); + + if (!PREFIX(alt_match_null_string_p) (p1, p1 + mcnt, reg_info)) + return false; + + p1 += mcnt; /* Get past the n-th alternative. */ + } /* if mcnt > 0 */ + break; + + + case stop_memory: + assert (p1[1] == **p); + *p = p1 + 2; + return true; + + + default: + if (!PREFIX(common_op_match_null_string_p) (&p1, end, reg_info)) + return false; + } + } /* while p1 < end */ + + return false; +} /* group_match_null_string_p */ + + +/* Similar to group_match_null_string_p, but doesn't deal with alternatives: + It expects P to be the first byte of a single alternative and END one + byte past the last. The alternative can contain groups. */ + +static boolean +PREFIX(alt_match_null_string_p) (UCHAR_T *p, UCHAR_T *end, + PREFIX(register_info_type) *reg_info) +{ + int mcnt; + UCHAR_T *p1 = p; + + while (p1 < end) + { + /* Skip over opcodes that can match nothing, and break when we get + to one that can't. */ + + switch ((re_opcode_t) *p1) + { + /* It's a loop. */ + case on_failure_jump: + p1++; + EXTRACT_NUMBER_AND_INCR (mcnt, p1); + p1 += mcnt; + break; + + default: + if (!PREFIX(common_op_match_null_string_p) (&p1, end, reg_info)) + return false; + } + } /* while p1 < end */ + + return true; +} /* alt_match_null_string_p */ + + +/* Deals with the ops common to group_match_null_string_p and + alt_match_null_string_p. + + Sets P to one after the op and its arguments, if any. */ + +static boolean +PREFIX(common_op_match_null_string_p) (UCHAR_T **p, UCHAR_T *end, + PREFIX(register_info_type) *reg_info) +{ + int mcnt; + boolean ret; + int reg_no; + UCHAR_T *p1 = *p; + + switch ((re_opcode_t) *p1++) + { + case no_op: + case begline: + case endline: + case begbuf: + case endbuf: + case wordbeg: + case wordend: + case wordbound: + case notwordbound: +#ifdef emacs + case before_dot: + case at_dot: + case after_dot: +#endif + break; + + case start_memory: + reg_no = *p1; + assert (reg_no > 0 && reg_no <= MAX_REGNUM); + ret = PREFIX(group_match_null_string_p) (&p1, end, reg_info); + + /* Have to set this here in case we're checking a group which + contains a group and a back reference to it. */ + + if (REG_MATCH_NULL_STRING_P (reg_info[reg_no]) == MATCH_NULL_UNSET_VALUE) + REG_MATCH_NULL_STRING_P (reg_info[reg_no]) = ret; + + if (!ret) + return false; + break; + + /* If this is an optimized succeed_n for zero times, make the jump. */ + case jump: + EXTRACT_NUMBER_AND_INCR (mcnt, p1); + if (mcnt >= 0) + p1 += mcnt; + else + return false; + break; + + case succeed_n: + /* Get to the number of times to succeed. */ + p1 += OFFSET_ADDRESS_SIZE; + EXTRACT_NUMBER_AND_INCR (mcnt, p1); + + if (mcnt == 0) + { + p1 -= 2 * OFFSET_ADDRESS_SIZE; + EXTRACT_NUMBER_AND_INCR (mcnt, p1); + p1 += mcnt; + } + else + return false; + break; + + case duplicate: + if (!REG_MATCH_NULL_STRING_P (reg_info[*p1])) + return false; + break; + + case set_number_at: + p1 += 2 * OFFSET_ADDRESS_SIZE; + + default: + /* All other opcodes mean we cannot match the empty string. */ + return false; + } + + *p = p1; + return true; +} /* common_op_match_null_string_p */ + + +/* Return zero if TRANSLATE[S1] and TRANSLATE[S2] are identical for LEN + bytes; nonzero otherwise. */ + +static int +PREFIX(bcmp_translate) (const CHAR_T *s1, const CHAR_T *s2, register int len, + RE_TRANSLATE_TYPE translate) +{ + register const UCHAR_T *p1 = (const UCHAR_T *) s1; + register const UCHAR_T *p2 = (const UCHAR_T *) s2; + while (len) + { +#ifdef WCHAR + if (((*p1<=0xff)?translate[*p1++]:*p1++) + != ((*p2<=0xff)?translate[*p2++]:*p2++)) + return 1; +#else /* BYTE */ + if (translate[*p1++] != translate[*p2++]) return 1; +#endif /* WCHAR */ + len--; + } + return 0; +} + + +#else /* not INSIDE_RECURSION */ + +/* Entry points for GNU code. */ + +/* re_compile_pattern is the GNU regular expression compiler: it + compiles PATTERN (of length SIZE) and puts the result in BUFP. + Returns 0 if the pattern was valid, otherwise an error string. + + Assumes the `allocated' (and perhaps `buffer') and `translate' fields + are set in BUFP on entry. + + We call regex_compile to do the actual compilation. */ + +const char * +re_compile_pattern (const char *pattern, size_t length, + struct re_pattern_buffer *bufp) +{ + reg_errcode_t ret; + + /* GNU code is written to assume at least RE_NREGS registers will be set + (and at least one extra will be -1). */ + bufp->regs_allocated = REGS_UNALLOCATED; + + /* And GNU code determines whether or not to get register information + by passing null for the REGS argument to re_match, etc., not by + setting no_sub. */ + bufp->no_sub = 0; + + /* Match anchors at newline. */ + bufp->newline_anchor = 1; + +# ifdef MBS_SUPPORT + if (MB_CUR_MAX != 1) + ret = wcs_regex_compile (pattern, length, re_syntax_options, bufp); + else +# endif + ret = byte_regex_compile (pattern, length, re_syntax_options, bufp); + + if (!ret) + return NULL; + return gettext (re_error_msgid[(int) ret]); +} +#ifdef _LIBC +weak_alias (__re_compile_pattern, re_compile_pattern) +#endif + +/* Entry points compatible with 4.2 BSD regex library. We don't define + them unless specifically requested. */ + +#if defined _REGEX_RE_COMP || defined _LIBC + +/* BSD has one and only one pattern buffer. */ +static struct re_pattern_buffer re_comp_buf; + +char * +#ifdef _LIBC +/* Make these definitions weak in libc, so POSIX programs can redefine + these names if they don't use our functions, and still use + regcomp/regexec below without link errors. */ +weak_function +#endif +re_comp (const char *s) +{ + reg_errcode_t ret; + + if (!s) + { + if (!re_comp_buf.buffer) + return (char *) gettext ("No previous regular expression"); + return 0; + } + + if (!re_comp_buf.buffer) + { + re_comp_buf.buffer = (unsigned char *) malloc (200); + if (re_comp_buf.buffer == NULL) + return (char *) gettext (re_error_msgid[(int) REG_ESPACE]); + re_comp_buf.allocated = 200; + + re_comp_buf.fastmap = (char *) malloc (1 << BYTEWIDTH); + if (re_comp_buf.fastmap == NULL) + return (char *) gettext (re_error_msgid[(int) REG_ESPACE]); + } + + /* Since `re_exec' always passes NULL for the `regs' argument, we + don't need to initialize the pattern buffer fields which affect it. */ + + /* Match anchors at newlines. */ + re_comp_buf.newline_anchor = 1; + +# ifdef MBS_SUPPORT + if (MB_CUR_MAX != 1) + ret = wcs_regex_compile (s, strlen (s), re_syntax_options, &re_comp_buf); + else +# endif + ret = byte_regex_compile (s, strlen (s), re_syntax_options, &re_comp_buf); + + if (!ret) + return NULL; + + /* Yes, we're discarding `const' here if !HAVE_LIBINTL. */ + return (char *) gettext (re_error_msgid[(int) ret]); +} + + +int +#ifdef _LIBC +weak_function +#endif +re_exec (const char *s) +{ + const int len = strlen (s); + return + 0 <= re_search (&re_comp_buf, s, len, 0, len, (struct re_registers *) 0); +} + +#endif /* _REGEX_RE_COMP */ + +/* POSIX.2 functions. Don't define these for Emacs. */ + +#ifndef emacs + +/* regcomp takes a regular expression as a string and compiles it. + + PREG is a regex_t *. We do not expect any fields to be initialized, + since POSIX says we shouldn't. Thus, we set + + `buffer' to the compiled pattern; + `used' to the length of the compiled pattern; + `syntax' to RE_SYNTAX_POSIX_EXTENDED if the + REG_EXTENDED bit in CFLAGS is set; otherwise, to + RE_SYNTAX_POSIX_BASIC; + `newline_anchor' to REG_NEWLINE being set in CFLAGS; + `fastmap' to an allocated space for the fastmap; + `fastmap_accurate' to zero; + `re_nsub' to the number of subexpressions in PATTERN. + + PATTERN is the address of the pattern string. + + CFLAGS is a series of bits which affect compilation. + + If REG_EXTENDED is set, we use POSIX extended syntax; otherwise, we + use POSIX basic syntax. + + If REG_NEWLINE is set, then . and [^...] don't match newline. + Also, regexec will try a match beginning after every newline. + + If REG_ICASE is set, then we considers upper- and lowercase + versions of letters to be equivalent when matching. + + If REG_NOSUB is set, then when PREG is passed to regexec, that + routine will report only success or failure, and nothing about the + registers. + + It returns 0 if it succeeds, nonzero if it doesn't. (See regex.h for + the return codes and their meanings.) */ + +int +regcomp (regex_t *preg, const char *pattern, int cflags) +{ + reg_errcode_t ret; + reg_syntax_t syntax + = (cflags & REG_EXTENDED) ? + RE_SYNTAX_POSIX_EXTENDED : RE_SYNTAX_POSIX_BASIC; + + /* regex_compile will allocate the space for the compiled pattern. */ + preg->buffer = 0; + preg->allocated = 0; + preg->used = 0; + + /* Try to allocate space for the fastmap. */ + preg->fastmap = (char *) malloc (1 << BYTEWIDTH); + + if (cflags & REG_ICASE) + { + int i; + + preg->translate + = (RE_TRANSLATE_TYPE) malloc (CHAR_SET_SIZE + * sizeof (*(RE_TRANSLATE_TYPE)0)); + if (preg->translate == NULL) + return (int) REG_ESPACE; + + /* Map uppercase characters to corresponding lowercase ones. */ + for (i = 0; i < CHAR_SET_SIZE; i++) + preg->translate[i] = ISUPPER (i) ? TOLOWER (i) : i; + } + else + preg->translate = NULL; + + /* If REG_NEWLINE is set, newlines are treated differently. */ + if (cflags & REG_NEWLINE) + { /* REG_NEWLINE implies neither . nor [^...] match newline. */ + syntax &= ~RE_DOT_NEWLINE; + syntax |= RE_HAT_LISTS_NOT_NEWLINE; + /* It also changes the matching behavior. */ + preg->newline_anchor = 1; + } + else + preg->newline_anchor = 0; + + preg->no_sub = !!(cflags & REG_NOSUB); + + /* POSIX says a null character in the pattern terminates it, so we + can use strlen here in compiling the pattern. */ +# ifdef MBS_SUPPORT + if (MB_CUR_MAX != 1) + ret = wcs_regex_compile (pattern, strlen (pattern), syntax, preg); + else +# endif + ret = byte_regex_compile (pattern, strlen (pattern), syntax, preg); + + /* POSIX doesn't distinguish between an unmatched open-group and an + unmatched close-group: both are REG_EPAREN. */ + if (ret == REG_ERPAREN) ret = REG_EPAREN; + + if (ret == REG_NOERROR && preg->fastmap) + { + /* Compute the fastmap now, since regexec cannot modify the pattern + buffer. */ + if (re_compile_fastmap (preg) == -2) + { + /* Some error occurred while computing the fastmap, just forget + about it. */ + free (preg->fastmap); + preg->fastmap = NULL; + } + } + + return (int) ret; +} +#ifdef _LIBC +weak_alias (__regcomp, regcomp) +#endif + + +/* regexec searches for a given pattern, specified by PREG, in the + string STRING. + + If NMATCH is zero or REG_NOSUB was set in the cflags argument to + `regcomp', we ignore PMATCH. Otherwise, we assume PMATCH has at + least NMATCH elements, and we set them to the offsets of the + corresponding matched substrings. + + EFLAGS specifies `execution flags' which affect matching: if + REG_NOTBOL is set, then ^ does not match at the beginning of the + string; if REG_NOTEOL is set, then $ does not match at the end. + + We return 0 if we find a match and REG_NOMATCH if not. */ + +int +regexec (const regex_t *preg, const char *string, size_t nmatch, + regmatch_t pmatch[], int eflags) +{ + int ret; + struct re_registers regs; + regex_t private_preg; + int len = strlen (string); + boolean want_reg_info = !preg->no_sub && nmatch > 0; + + private_preg = *preg; + + private_preg.not_bol = !!(eflags & REG_NOTBOL); + private_preg.not_eol = !!(eflags & REG_NOTEOL); + + /* The user has told us exactly how many registers to return + information about, via `nmatch'. We have to pass that on to the + matching routines. */ + private_preg.regs_allocated = REGS_FIXED; + + if (want_reg_info) + { + regs.num_regs = nmatch; + regs.start = TALLOC (nmatch * 2, regoff_t); + if (regs.start == NULL) + return (int) REG_NOMATCH; + regs.end = regs.start + nmatch; + } + + /* Perform the searching operation. */ + ret = re_search (&private_preg, string, len, + /* start: */ 0, /* range: */ len, + want_reg_info ? ®s : (struct re_registers *) 0); + + /* Copy the register information to the POSIX structure. */ + if (want_reg_info) + { + if (ret >= 0) + { + unsigned r; + + for (r = 0; r < nmatch; r++) + { + pmatch[r].rm_so = regs.start[r]; + pmatch[r].rm_eo = regs.end[r]; + } + } + + /* If we needed the temporary register info, free the space now. */ + free (regs.start); + } + + /* We want zero return to mean success, unlike `re_search'. */ + return ret >= 0 ? (int) REG_NOERROR : (int) REG_NOMATCH; +} +#ifdef _LIBC +weak_alias (__regexec, regexec) +#endif + + +/* Returns a message corresponding to an error code, ERRCODE, returned + from either regcomp or regexec. We don't use PREG here. */ + +size_t +regerror (int errcode, const regex_t *preg ATTRIBUTE_UNUSED, + char *errbuf, size_t errbuf_size) +{ + const char *msg; + size_t msg_size; + + if (errcode < 0 + || errcode >= (int) (sizeof (re_error_msgid) + / sizeof (re_error_msgid[0]))) + /* Only error codes returned by the rest of the code should be passed + to this routine. If we are given anything else, or if other regex + code generates an invalid error code, then the program has a bug. + Dump core so we can fix it. */ + abort (); + + msg = gettext (re_error_msgid[errcode]); + + msg_size = strlen (msg) + 1; /* Includes the null. */ + + if (errbuf_size != 0) + { + if (msg_size > errbuf_size) + { +#if defined HAVE_MEMPCPY || defined _LIBC + *((char *) mempcpy (errbuf, msg, errbuf_size - 1)) = '\0'; +#else + memcpy (errbuf, msg, errbuf_size - 1); + errbuf[errbuf_size - 1] = 0; +#endif + } + else + memcpy (errbuf, msg, msg_size); + } + + return msg_size; +} +#ifdef _LIBC +weak_alias (__regerror, regerror) +#endif + + +/* Free dynamically allocated space used by PREG. */ + +void +regfree (regex_t *preg) +{ + if (preg->buffer != NULL) + free (preg->buffer); + preg->buffer = NULL; + + preg->allocated = 0; + preg->used = 0; + + if (preg->fastmap != NULL) + free (preg->fastmap); + preg->fastmap = NULL; + preg->fastmap_accurate = 0; + + if (preg->translate != NULL) + free (preg->translate); + preg->translate = NULL; +} +#ifdef _LIBC +weak_alias (__regfree, regfree) +#endif + +#endif /* not emacs */ + +#endif /* not INSIDE_RECURSION */ + + +#undef STORE_NUMBER +#undef STORE_NUMBER_AND_INCR +#undef EXTRACT_NUMBER +#undef EXTRACT_NUMBER_AND_INCR + +#undef DEBUG_PRINT_COMPILED_PATTERN +#undef DEBUG_PRINT_DOUBLE_STRING + +#undef INIT_FAIL_STACK +#undef RESET_FAIL_STACK +#undef DOUBLE_FAIL_STACK +#undef PUSH_PATTERN_OP +#undef PUSH_FAILURE_POINTER +#undef PUSH_FAILURE_INT +#undef PUSH_FAILURE_ELT +#undef POP_FAILURE_POINTER +#undef POP_FAILURE_INT +#undef POP_FAILURE_ELT +#undef DEBUG_PUSH +#undef DEBUG_POP +#undef PUSH_FAILURE_POINT +#undef POP_FAILURE_POINT + +#undef REG_UNSET_VALUE +#undef REG_UNSET + +#undef PATFETCH +#undef PATFETCH_RAW +#undef PATUNFETCH +#undef TRANSLATE + +#undef INIT_BUF_SIZE +#undef GET_BUFFER_SPACE +#undef BUF_PUSH +#undef BUF_PUSH_2 +#undef BUF_PUSH_3 +#undef STORE_JUMP +#undef STORE_JUMP2 +#undef INSERT_JUMP +#undef INSERT_JUMP2 +#undef EXTEND_BUFFER +#undef GET_UNSIGNED_NUMBER +#undef FREE_STACK_RETURN + +# undef POINTER_TO_OFFSET +# undef MATCHING_IN_FRST_STRING +# undef PREFETCH +# undef AT_STRINGS_BEG +# undef AT_STRINGS_END +# undef WORDCHAR_P +# undef FREE_VAR +# undef FREE_VARIABLES +# undef NO_HIGHEST_ACTIVE_REG +# undef NO_LOWEST_ACTIVE_REG + +# undef CHAR_T +# undef UCHAR_T +# undef COMPILED_BUFFER_VAR +# undef OFFSET_ADDRESS_SIZE +# undef CHAR_CLASS_SIZE +# undef PREFIX +# undef ARG_PREFIX +# undef PUT_CHAR +# undef BYTE +# undef WCHAR + +# define DEFINED_ONCE diff --git a/libiberty/rename.c b/libiberty/rename.c new file mode 100644 index 0000000..ad342ff --- /dev/null +++ b/libiberty/rename.c @@ -0,0 +1,36 @@ +/* rename -- rename a file + This function is in the public domain. */ + +/* + +@deftypefn Supplemental int rename (const char *@var{old}, const char *@var{new}) + +Renames a file from @var{old} to @var{new}. If @var{new} already +exists, it is removed. + +@end deftypefn + +*/ + +#include "ansidecl.h" +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include +#ifdef HAVE_UNISTD_H +#include +#endif + +int +rename (const char *zfrom, const char *zto) +{ + if (link (zfrom, zto) < 0) + { + if (errno != EEXIST) + return -1; + if (unlink (zto) < 0 + || link (zfrom, zto) < 0) + return -1; + } + return unlink (zfrom); +} diff --git a/libiberty/rindex.c b/libiberty/rindex.c new file mode 100644 index 0000000..194ef9f --- /dev/null +++ b/libiberty/rindex.c @@ -0,0 +1,21 @@ +/* Stub implementation of (obsolete) rindex(). */ + +/* + +@deftypefn Supplemental char* rindex (const char *@var{s}, int @var{c}) + +Returns a pointer to the last occurrence of the character @var{c} in +the string @var{s}, or @code{NULL} if not found. The use of @code{rindex} is +deprecated in new programs in favor of @code{strrchr}. + +@end deftypefn + +*/ + +extern char *strrchr (const char *, int); + +char * +rindex (const char *s, int c) +{ + return strrchr (s, c); +} diff --git a/libiberty/safe-ctype.c b/libiberty/safe-ctype.c new file mode 100644 index 0000000..0972b4b --- /dev/null +++ b/libiberty/safe-ctype.c @@ -0,0 +1,255 @@ +/* replacement macros. + + Copyright (C) 2000, 2001, 2002, 2003, 2004, + 2005 Free Software Foundation, Inc. + Contributed by Zack Weinberg . + +This file is part of the libiberty library. +Libiberty is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +Libiberty 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with libiberty; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +/* + +@defvr Extension HOST_CHARSET +This macro indicates the basic character set and encoding used by the +host: more precisely, the encoding used for character constants in +preprocessor @samp{#if} statements (the C "execution character set"). +It is defined by @file{safe-ctype.h}, and will be an integer constant +with one of the following values: + +@ftable @code +@item HOST_CHARSET_UNKNOWN +The host character set is unknown - that is, not one of the next two +possibilities. + +@item HOST_CHARSET_ASCII +The host character set is ASCII. + +@item HOST_CHARSET_EBCDIC +The host character set is some variant of EBCDIC. (Only one of the +nineteen EBCDIC varying characters is tested; exercise caution.) +@end ftable +@end defvr + +@deffn Extension ISALPHA (@var{c}) +@deffnx Extension ISALNUM (@var{c}) +@deffnx Extension ISBLANK (@var{c}) +@deffnx Extension ISCNTRL (@var{c}) +@deffnx Extension ISDIGIT (@var{c}) +@deffnx Extension ISGRAPH (@var{c}) +@deffnx Extension ISLOWER (@var{c}) +@deffnx Extension ISPRINT (@var{c}) +@deffnx Extension ISPUNCT (@var{c}) +@deffnx Extension ISSPACE (@var{c}) +@deffnx Extension ISUPPER (@var{c}) +@deffnx Extension ISXDIGIT (@var{c}) + +These twelve macros are defined by @file{safe-ctype.h}. Each has the +same meaning as the corresponding macro (with name in lowercase) +defined by the standard header @file{ctype.h}. For example, +@code{ISALPHA} returns true for alphabetic characters and false for +others. However, there are two differences between these macros and +those provided by @file{ctype.h}: + +@itemize @bullet +@item These macros are guaranteed to have well-defined behavior for all +values representable by @code{signed char} and @code{unsigned char}, and +for @code{EOF}. + +@item These macros ignore the current locale; they are true for these +fixed sets of characters: +@multitable {@code{XDIGIT}} {yada yada yada yada yada yada yada yada} +@item @code{ALPHA} @tab @kbd{A-Za-z} +@item @code{ALNUM} @tab @kbd{A-Za-z0-9} +@item @code{BLANK} @tab @kbd{space tab} +@item @code{CNTRL} @tab @code{!PRINT} +@item @code{DIGIT} @tab @kbd{0-9} +@item @code{GRAPH} @tab @code{ALNUM || PUNCT} +@item @code{LOWER} @tab @kbd{a-z} +@item @code{PRINT} @tab @code{GRAPH ||} @kbd{space} +@item @code{PUNCT} @tab @kbd{`~!@@#$%^&*()_-=+[@{]@}\|;:'",<.>/?} +@item @code{SPACE} @tab @kbd{space tab \n \r \f \v} +@item @code{UPPER} @tab @kbd{A-Z} +@item @code{XDIGIT} @tab @kbd{0-9A-Fa-f} +@end multitable + +Note that, if the host character set is ASCII or a superset thereof, +all these macros will return false for all values of @code{char} outside +the range of 7-bit ASCII. In particular, both ISPRINT and ISCNTRL return +false for characters with numeric values from 128 to 255. +@end itemize +@end deffn + +@deffn Extension ISIDNUM (@var{c}) +@deffnx Extension ISIDST (@var{c}) +@deffnx Extension IS_VSPACE (@var{c}) +@deffnx Extension IS_NVSPACE (@var{c}) +@deffnx Extension IS_SPACE_OR_NUL (@var{c}) +@deffnx Extension IS_ISOBASIC (@var{c}) +These six macros are defined by @file{safe-ctype.h} and provide +additional character classes which are useful when doing lexical +analysis of C or similar languages. They are true for the following +sets of characters: + +@multitable {@code{SPACE_OR_NUL}} {yada yada yada yada yada yada yada yada} +@item @code{IDNUM} @tab @kbd{A-Za-z0-9_} +@item @code{IDST} @tab @kbd{A-Za-z_} +@item @code{VSPACE} @tab @kbd{\r \n} +@item @code{NVSPACE} @tab @kbd{space tab \f \v \0} +@item @code{SPACE_OR_NUL} @tab @code{VSPACE || NVSPACE} +@item @code{ISOBASIC} @tab @code{VSPACE || NVSPACE || PRINT} +@end multitable +@end deffn + +*/ + +#include "ansidecl.h" +#include +#include /* for EOF */ + +#if EOF != -1 + #error " requires EOF == -1" +#endif + +/* Shorthand */ +#define bl _sch_isblank +#define cn _sch_iscntrl +#define di _sch_isdigit +#define is _sch_isidst +#define lo _sch_islower +#define nv _sch_isnvsp +#define pn _sch_ispunct +#define pr _sch_isprint +#define sp _sch_isspace +#define up _sch_isupper +#define vs _sch_isvsp +#define xd _sch_isxdigit + +/* Masks. */ +#define L (const unsigned short) (lo|is |pr) /* lower case letter */ +#define XL (const unsigned short) (lo|is|xd|pr) /* lowercase hex digit */ +#define U (const unsigned short) (up|is |pr) /* upper case letter */ +#define XU (const unsigned short) (up|is|xd|pr) /* uppercase hex digit */ +#define D (const unsigned short) (di |xd|pr) /* decimal digit */ +#define P (const unsigned short) (pn |pr) /* punctuation */ +#define _ (const unsigned short) (pn|is |pr) /* underscore */ + +#define C (const unsigned short) ( cn) /* control character */ +#define Z (const unsigned short) (nv |cn) /* NUL */ +#define M (const unsigned short) (nv|sp |cn) /* cursor movement: \f \v */ +#define V (const unsigned short) (vs|sp |cn) /* vertical space: \r \n */ +#define T (const unsigned short) (nv|sp|bl|cn) /* tab */ +#define S (const unsigned short) (nv|sp|bl|pr) /* space */ + +/* Are we ASCII? */ +#if HOST_CHARSET == HOST_CHARSET_ASCII + +const unsigned short _sch_istable[256] = +{ + Z, C, C, C, C, C, C, C, /* NUL SOH STX ETX EOT ENQ ACK BEL */ + C, T, V, M, M, V, C, C, /* BS HT LF VT FF CR SO SI */ + C, C, C, C, C, C, C, C, /* DLE DC1 DC2 DC3 DC4 NAK SYN ETB */ + C, C, C, C, C, C, C, C, /* CAN EM SUB ESC FS GS RS US */ + S, P, P, P, P, P, P, P, /* SP ! " # $ % & ' */ + P, P, P, P, P, P, P, P, /* ( ) * + , - . / */ + D, D, D, D, D, D, D, D, /* 0 1 2 3 4 5 6 7 */ + D, D, P, P, P, P, P, P, /* 8 9 : ; < = > ? */ + P, XU, XU, XU, XU, XU, XU, U, /* @ A B C D E F G */ + U, U, U, U, U, U, U, U, /* H I J K L M N O */ + U, U, U, U, U, U, U, U, /* P Q R S T U V W */ + U, U, U, P, P, P, P, _, /* X Y Z [ \ ] ^ _ */ + P, XL, XL, XL, XL, XL, XL, L, /* ` a b c d e f g */ + L, L, L, L, L, L, L, L, /* h i j k l m n o */ + L, L, L, L, L, L, L, L, /* p q r s t u v w */ + L, L, L, P, P, P, P, C, /* x y z { | } ~ DEL */ + + /* high half of unsigned char is locale-specific, so all tests are + false in "C" locale */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +}; + +const unsigned char _sch_tolower[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, + + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', + 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', + + 91, 92, 93, 94, 95, 96, + + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', + 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', + + 123,124,125,126,127, + + 128,129,130,131, 132,133,134,135, 136,137,138,139, 140,141,142,143, + 144,145,146,147, 148,149,150,151, 152,153,154,155, 156,157,158,159, + 160,161,162,163, 164,165,166,167, 168,169,170,171, 172,173,174,175, + 176,177,178,179, 180,181,182,183, 184,185,186,187, 188,189,190,191, + + 192,193,194,195, 196,197,198,199, 200,201,202,203, 204,205,206,207, + 208,209,210,211, 212,213,214,215, 216,217,218,219, 220,221,222,223, + 224,225,226,227, 228,229,230,231, 232,233,234,235, 236,237,238,239, + 240,241,242,243, 244,245,246,247, 248,249,250,251, 252,253,254,255, +}; + +const unsigned char _sch_toupper[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, + + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', + 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', + + 91, 92, 93, 94, 95, 96, + + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', + 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', + + 123,124,125,126,127, + + 128,129,130,131, 132,133,134,135, 136,137,138,139, 140,141,142,143, + 144,145,146,147, 148,149,150,151, 152,153,154,155, 156,157,158,159, + 160,161,162,163, 164,165,166,167, 168,169,170,171, 172,173,174,175, + 176,177,178,179, 180,181,182,183, 184,185,186,187, 188,189,190,191, + + 192,193,194,195, 196,197,198,199, 200,201,202,203, 204,205,206,207, + 208,209,210,211, 212,213,214,215, 216,217,218,219, 220,221,222,223, + 224,225,226,227, 228,229,230,231, 232,233,234,235, 236,237,238,239, + 240,241,242,243, 244,245,246,247, 248,249,250,251, 252,253,254,255, +}; + +#else +# if HOST_CHARSET == HOST_CHARSET_EBCDIC + #error "FIXME: write tables for EBCDIC" +# else + #error "Unrecognized host character set" +# endif +#endif diff --git a/libiberty/setenv.c b/libiberty/setenv.c new file mode 100644 index 0000000..355af5a --- /dev/null +++ b/libiberty/setenv.c @@ -0,0 +1,183 @@ +/* Copyright (C) 1992, 1995, 1996, 1997, 2002 Free Software Foundation, Inc. + This file based on setenv.c in the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, + Boston, MA 02110-1301, USA. */ + + +/* + +@deftypefn Supplemental int setenv (const char *@var{name}, const char *@var{value}, int @var{overwrite}) +@deftypefnx Supplemental void unsetenv (const char *@var{name}) + +@code{setenv} adds @var{name} to the environment with value +@var{value}. If the name was already present in the environment, +the new value will be stored only if @var{overwrite} is nonzero. +The companion @code{unsetenv} function removes @var{name} from the +environment. This implementation is not safe for multithreaded code. + +@end deftypefn + +*/ + +#if HAVE_CONFIG_H +# include +#endif + +#define setenv libiberty_setenv +#define unsetenv libiberty_unsetenv + +#include "ansidecl.h" +#include /* For `size_t' */ +#include /* For `NULL' */ + +#include +#if !defined(errno) && !defined(HAVE_ERRNO_DECL) +extern int errno; +#endif +#define __set_errno(ev) ((errno) = (ev)) + +#if HAVE_STDLIB_H +# include +#endif +#if HAVE_STRING_H +# include +#endif +#if HAVE_UNISTD_H +# include +#endif + +#define __environ environ +#ifndef HAVE_ENVIRON_DECL +extern char **environ; +#endif + +#undef setenv +#undef unsetenv + +/* LOCK and UNLOCK are defined as no-ops. This makes the libiberty + * implementation MT-Unsafe. */ +#define LOCK +#define UNLOCK + +/* Below this point, it's verbatim code from the glibc-2.0 implementation */ + +/* If this variable is not a null pointer we allocated the current + environment. */ +static char **last_environ; + + +int +setenv (const char *name, const char *value, int replace) +{ + register char **ep = 0; + register size_t size; + const size_t namelen = strlen (name); + const size_t vallen = strlen (value) + 1; + + LOCK; + + size = 0; + if (__environ != NULL) + { + for (ep = __environ; *ep != NULL; ++ep) + if (!strncmp (*ep, name, namelen) && (*ep)[namelen] == '=') + break; + else + ++size; + } + + if (__environ == NULL || *ep == NULL) + { + char **new_environ; + if (__environ == last_environ && __environ != NULL) + /* We allocated this space; we can extend it. */ + new_environ = (char **) realloc (last_environ, + (size + 2) * sizeof (char *)); + else + new_environ = (char **) malloc ((size + 2) * sizeof (char *)); + + if (new_environ == NULL) + { + UNLOCK; + return -1; + } + + new_environ[size] = (char *) malloc (namelen + 1 + vallen); + if (new_environ[size] == NULL) + { + free ((char *) new_environ); + __set_errno (ENOMEM); + UNLOCK; + return -1; + } + + if (__environ != last_environ) + memcpy ((char *) new_environ, (char *) __environ, + size * sizeof (char *)); + + memcpy (new_environ[size], name, namelen); + new_environ[size][namelen] = '='; + memcpy (&new_environ[size][namelen + 1], value, vallen); + + new_environ[size + 1] = NULL; + + last_environ = __environ = new_environ; + } + else if (replace) + { + size_t len = strlen (*ep); + if (len + 1 < namelen + 1 + vallen) + { + /* The existing string is too short; malloc a new one. */ + char *new_string = (char *) malloc (namelen + 1 + vallen); + if (new_string == NULL) + { + UNLOCK; + return -1; + } + *ep = new_string; + } + memcpy (*ep, name, namelen); + (*ep)[namelen] = '='; + memcpy (&(*ep)[namelen + 1], value, vallen); + } + + UNLOCK; + + return 0; +} + +void +unsetenv (const char *name) +{ + const size_t len = strlen (name); + char **ep; + + LOCK; + + for (ep = __environ; *ep; ++ep) + if (!strncmp (*ep, name, len) && (*ep)[len] == '=') + { + /* Found it. Remove this pointer by moving later ones back. */ + char **dp = ep; + do + dp[0] = dp[1]; + while (*dp++); + /* Continue the loop in case NAME appears again. */ + } + + UNLOCK; +} diff --git a/libiberty/sigsetmask.c b/libiberty/sigsetmask.c new file mode 100644 index 0000000..3b708b1 --- /dev/null +++ b/libiberty/sigsetmask.c @@ -0,0 +1,40 @@ +/* Version of sigsetmask.c + Written by Steve Chamberlain (sac@cygnus.com). + Contributed by Cygnus Support. + This file is in the public doamin. */ + +/* + +@deftypefn Supplemental int sigsetmask (int @var{set}) + +Sets the signal mask to the one provided in @var{set} and returns +the old mask (which, for libiberty's implementation, will always +be the value @code{1}). + +@end deftypefn + +*/ + +#define _POSIX_SOURCE +#include +/* Including seems to be needed by ISC. */ +#include +#include + +extern void abort (void) ATTRIBUTE_NORETURN; + +#ifdef SIG_SETMASK +int +sigsetmask (int set) +{ + sigset_t new_sig; + sigset_t old_sig; + + sigemptyset (&new_sig); + if (set != 0) { + abort(); /* FIXME, we don't know how to translate old mask to new */ + } + sigprocmask(SIG_SETMASK, &new_sig, &old_sig); + return 1; /* FIXME, we always return 1 as old value. */ +} +#endif diff --git a/libiberty/snprintf.c b/libiberty/snprintf.c new file mode 100644 index 0000000..f1ba49f --- /dev/null +++ b/libiberty/snprintf.c @@ -0,0 +1,60 @@ +/* Implement the snprintf function. + Copyright (C) 2003 Free Software Foundation, Inc. + Written by Kaveh R. Ghazi . + +This file is part of the libiberty library. This library 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 library 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 GNU CC; see the file COPYING. If not, write to +the Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + +As a special exception, if you link this library with files +compiled with a GNU compiler to produce an executable, this does not cause +the resulting executable to be covered by the GNU General Public License. +This exception does not however invalidate any other reasons why +the executable file might be covered by the GNU General Public License. */ + +/* + +@deftypefn Supplemental int snprintf (char *@var{buf}, size_t @var{n}, const char *@var{format}, ...) + +This function is similar to sprintf, but it will print at most @var{n} +characters. On error the return value is -1, otherwise it returns the +number of characters that would have been printed had @var{n} been +sufficiently large, regardless of the actual value of @var{n}. Note +some pre-C99 system libraries do not implement this correctly so users +cannot generally rely on the return value if the system version of +this function is used. + +@end deftypefn + +*/ + +#include "ansidecl.h" + +#include +#include + +int vsnprintf (char *, size_t, const char *, va_list); + +int +snprintf (char *s, size_t n, const char *format, ...) +{ + int result; + VA_OPEN (ap, format); + VA_FIXEDARG (ap, char *, s); + VA_FIXEDARG (ap, size_t, n); + VA_FIXEDARG (ap, const char *, format); + result = vsnprintf (s, n, format, ap); + VA_CLOSE (ap); + return result; +} diff --git a/libiberty/sort.c b/libiberty/sort.c new file mode 100644 index 0000000..3738dd7 --- /dev/null +++ b/libiberty/sort.c @@ -0,0 +1,186 @@ +/* Sorting algorithms. + Copyright (C) 2000 Free Software Foundation, Inc. + Contributed by Mark Mitchell . + +This file is part of GNU CC. + +GNU CC 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. + +GNU CC 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 GNU CC; see the file COPYING. If not, write to +the Free Software Foundation, 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include "libiberty.h" +#include "sort.h" +#ifdef HAVE_LIMITS_H +#include +#endif +#ifdef HAVE_SYS_PARAM_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif + +#ifndef UCHAR_MAX +#define UCHAR_MAX ((unsigned char)(-1)) +#endif + +/* POINTERS and WORK are both arrays of N pointers. When this + function returns POINTERS will be sorted in ascending order. */ + +void sort_pointers (size_t n, void **pointers, void **work) +{ + /* The type of a single digit. This can be any unsigned integral + type. When changing this, DIGIT_MAX should be changed as + well. */ + typedef unsigned char digit_t; + + /* The maximum value a single digit can have. */ +#define DIGIT_MAX (UCHAR_MAX + 1) + + /* The Ith entry is the number of elements in *POINTERSP that have I + in the digit on which we are currently sorting. */ + unsigned int count[DIGIT_MAX]; + /* Nonzero if we are running on a big-endian machine. */ + int big_endian_p; + size_t i; + size_t j; + + /* The algorithm used here is radix sort which takes time linear in + the number of elements in the array. */ + + /* The algorithm here depends on being able to swap the two arrays + an even number of times. */ + if ((sizeof (void *) / sizeof (digit_t)) % 2 != 0) + abort (); + + /* Figure out the endianness of the machine. */ + for (i = 0, j = 0; i < sizeof (size_t); ++i) + { + j *= (UCHAR_MAX + 1); + j += i; + } + big_endian_p = (((char *)&j)[0] == 0); + + /* Move through the pointer values from least significant to most + significant digits. */ + for (i = 0; i < sizeof (void *) / sizeof (digit_t); ++i) + { + digit_t *digit; + digit_t *bias; + digit_t *top; + unsigned int *countp; + void **pointerp; + + /* The offset from the start of the pointer will depend on the + endianness of the machine. */ + if (big_endian_p) + j = sizeof (void *) / sizeof (digit_t) - i; + else + j = i; + + /* Now, perform a stable sort on this digit. We use counting + sort. */ + memset (count, 0, DIGIT_MAX * sizeof (unsigned int)); + + /* Compute the address of the appropriate digit in the first and + one-past-the-end elements of the array. On a little-endian + machine, the least-significant digit is closest to the front. */ + bias = ((digit_t *) pointers) + j; + top = ((digit_t *) (pointers + n)) + j; + + /* Count how many there are of each value. At the end of this + loop, COUNT[K] will contain the number of pointers whose Ith + digit is K. */ + for (digit = bias; + digit < top; + digit += sizeof (void *) / sizeof (digit_t)) + ++count[*digit]; + + /* Now, make COUNT[K] contain the number of pointers whose Ith + digit is less than or equal to K. */ + for (countp = count + 1; countp < count + DIGIT_MAX; ++countp) + *countp += countp[-1]; + + /* Now, drop the pointers into their correct locations. */ + for (pointerp = pointers + n - 1; pointerp >= pointers; --pointerp) + work[--count[((digit_t *) pointerp)[j]]] = *pointerp; + + /* Swap WORK and POINTERS so that POINTERS contains the sorted + array. */ + pointerp = pointers; + pointers = work; + work = pointerp; + } +} + +/* Everything below here is a unit test for the routines in this + file. */ + +#ifdef UNIT_TEST + +#include + +void *xmalloc (size_t n) +{ + return malloc (n); +} + +int main (int argc, char **argv) +{ + int k; + int result; + size_t i; + void **pointers; + void **work; + + if (argc > 1) + k = atoi (argv[1]); + else + k = 10; + + pointers = XNEWVEC (void*, k); + work = XNEWVEC (void*, k); + + for (i = 0; i < k; ++i) + { + pointers[i] = (void *) random (); + printf ("%x\n", pointers[i]); + } + + sort_pointers (k, pointers, work); + + printf ("\nSorted\n\n"); + + result = 0; + + for (i = 0; i < k; ++i) + { + printf ("%x\n", pointers[i]); + if (i > 0 && (char*) pointers[i] < (char*) pointers[i - 1]) + result = 1; + } + + free (pointers); + free (work); + + return result; +} + +#endif diff --git a/libiberty/spaces.c b/libiberty/spaces.c new file mode 100644 index 0000000..67481c9 --- /dev/null +++ b/libiberty/spaces.c @@ -0,0 +1,72 @@ +/* Allocate memory region filled with spaces. + Copyright (C) 1991 Free Software Foundation, Inc. + +This file is part of the libiberty library. +Libiberty is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +Libiberty 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with libiberty; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +/* + +@deftypefn Extension char* spaces (int @var{count}) + +Returns a pointer to a memory region filled with the specified +number of spaces and null terminated. The returned pointer is +valid until at least the next call. + +@end deftypefn + +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include "ansidecl.h" +#include "libiberty.h" + +#if VMS +#include +#include +#else +/* For systems with larger pointers than ints, these must be declared. */ +extern PTR malloc (size_t); +extern void free (PTR); +#endif + +const char * +spaces (int count) +{ + register char *t; + static char *buf; + static int maxsize; + + if (count > maxsize) + { + if (buf) + { + free (buf); + } + buf = (char *) malloc (count + 1); + if (buf == (char *) 0) + return 0; + for (t = buf + count ; t != buf ; ) + { + *--t = ' '; + } + maxsize = count; + buf[count] = '\0'; + } + return (const char *) (buf + maxsize - count); +} + diff --git a/libiberty/splay-tree.c b/libiberty/splay-tree.c new file mode 100644 index 0000000..060f900 --- /dev/null +++ b/libiberty/splay-tree.c @@ -0,0 +1,526 @@ +/* A splay-tree datatype. + Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. + Contributed by Mark Mitchell (mark@markmitchell.com). + +This file is part of GNU CC. + +GNU CC 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. + +GNU CC 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 GNU CC; see the file COPYING. If not, write to +the Free Software Foundation, 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +/* For an easily readable description of splay-trees, see: + + Lewis, Harry R. and Denenberg, Larry. Data Structures and Their + Algorithms. Harper-Collins, Inc. 1991. */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef HAVE_STDLIB_H +#include +#endif + +#include + +#include "libiberty.h" +#include "splay-tree.h" + +static void splay_tree_delete_helper (splay_tree, splay_tree_node); +static inline void rotate_left (splay_tree_node *, + splay_tree_node, splay_tree_node); +static inline void rotate_right (splay_tree_node *, + splay_tree_node, splay_tree_node); +static void splay_tree_splay (splay_tree, splay_tree_key); +static int splay_tree_foreach_helper (splay_tree, splay_tree_node, + splay_tree_foreach_fn, void*); + +/* Deallocate NODE (a member of SP), and all its sub-trees. */ + +static void +splay_tree_delete_helper (splay_tree sp, splay_tree_node node) +{ + splay_tree_node pending = 0; + splay_tree_node active = 0; + + if (!node) + return; + +#define KDEL(x) if (sp->delete_key) (*sp->delete_key)(x); +#define VDEL(x) if (sp->delete_value) (*sp->delete_value)(x); + + KDEL (node->key); + VDEL (node->value); + + /* We use the "key" field to hold the "next" pointer. */ + node->key = (splay_tree_key)pending; + pending = (splay_tree_node)node; + + /* Now, keep processing the pending list until there aren't any + more. This is a little more complicated than just recursing, but + it doesn't toast the stack for large trees. */ + + while (pending) + { + active = pending; + pending = 0; + while (active) + { + splay_tree_node temp; + + /* active points to a node which has its key and value + deallocated, we just need to process left and right. */ + + if (active->left) + { + KDEL (active->left->key); + VDEL (active->left->value); + active->left->key = (splay_tree_key)pending; + pending = (splay_tree_node)(active->left); + } + if (active->right) + { + KDEL (active->right->key); + VDEL (active->right->value); + active->right->key = (splay_tree_key)pending; + pending = (splay_tree_node)(active->right); + } + + temp = active; + active = (splay_tree_node)(temp->key); + (*sp->deallocate) ((char*) temp, sp->allocate_data); + } + } +#undef KDEL +#undef VDEL +} + +/* Rotate the edge joining the left child N with its parent P. PP is the + grandparents pointer to P. */ + +static inline void +rotate_left (splay_tree_node *pp, splay_tree_node p, splay_tree_node n) +{ + splay_tree_node tmp; + tmp = n->right; + n->right = p; + p->left = tmp; + *pp = n; +} + +/* Rotate the edge joining the right child N with its parent P. PP is the + grandparents pointer to P. */ + +static inline void +rotate_right (splay_tree_node *pp, splay_tree_node p, splay_tree_node n) +{ + splay_tree_node tmp; + tmp = n->left; + n->left = p; + p->right = tmp; + *pp = n; +} + +/* Bottom up splay of key. */ + +static void +splay_tree_splay (splay_tree sp, splay_tree_key key) +{ + if (sp->root == 0) + return; + + do { + int cmp1, cmp2; + splay_tree_node n, c; + + n = sp->root; + cmp1 = (*sp->comp) (key, n->key); + + /* Found. */ + if (cmp1 == 0) + return; + + /* Left or right? If no child, then we're done. */ + if (cmp1 < 0) + c = n->left; + else + c = n->right; + if (!c) + return; + + /* Next one left or right? If found or no child, we're done + after one rotation. */ + cmp2 = (*sp->comp) (key, c->key); + if (cmp2 == 0 + || (cmp2 < 0 && !c->left) + || (cmp2 > 0 && !c->right)) + { + if (cmp1 < 0) + rotate_left (&sp->root, n, c); + else + rotate_right (&sp->root, n, c); + return; + } + + /* Now we have the four cases of double-rotation. */ + if (cmp1 < 0 && cmp2 < 0) + { + rotate_left (&n->left, c, c->left); + rotate_left (&sp->root, n, n->left); + } + else if (cmp1 > 0 && cmp2 > 0) + { + rotate_right (&n->right, c, c->right); + rotate_right (&sp->root, n, n->right); + } + else if (cmp1 < 0 && cmp2 > 0) + { + rotate_right (&n->left, c, c->right); + rotate_left (&sp->root, n, n->left); + } + else if (cmp1 > 0 && cmp2 < 0) + { + rotate_left (&n->right, c, c->left); + rotate_right (&sp->root, n, n->right); + } + } while (1); +} + +/* Call FN, passing it the DATA, for every node below NODE, all of + which are from SP, following an in-order traversal. If FN every + returns a non-zero value, the iteration ceases immediately, and the + value is returned. Otherwise, this function returns 0. */ + +static int +splay_tree_foreach_helper (splay_tree sp, splay_tree_node node, + splay_tree_foreach_fn fn, void *data) +{ + int val; + + if (!node) + return 0; + + val = splay_tree_foreach_helper (sp, node->left, fn, data); + if (val) + return val; + + val = (*fn)(node, data); + if (val) + return val; + + return splay_tree_foreach_helper (sp, node->right, fn, data); +} + + +/* An allocator and deallocator based on xmalloc. */ +static void * +splay_tree_xmalloc_allocate (int size, void *data ATTRIBUTE_UNUSED) +{ + return (void *) xmalloc (size); +} + +static void +splay_tree_xmalloc_deallocate (void *object, void *data ATTRIBUTE_UNUSED) +{ + free (object); +} + + +/* Allocate a new splay tree, using COMPARE_FN to compare nodes, + DELETE_KEY_FN to deallocate keys, and DELETE_VALUE_FN to deallocate + values. Use xmalloc to allocate the splay tree structure, and any + nodes added. */ + +splay_tree +splay_tree_new (splay_tree_compare_fn compare_fn, + splay_tree_delete_key_fn delete_key_fn, + splay_tree_delete_value_fn delete_value_fn) +{ + return (splay_tree_new_with_allocator + (compare_fn, delete_key_fn, delete_value_fn, + splay_tree_xmalloc_allocate, splay_tree_xmalloc_deallocate, 0)); +} + + +/* Allocate a new splay tree, using COMPARE_FN to compare nodes, + DELETE_KEY_FN to deallocate keys, and DELETE_VALUE_FN to deallocate + values. */ + +splay_tree +splay_tree_new_with_allocator (splay_tree_compare_fn compare_fn, + splay_tree_delete_key_fn delete_key_fn, + splay_tree_delete_value_fn delete_value_fn, + splay_tree_allocate_fn allocate_fn, + splay_tree_deallocate_fn deallocate_fn, + void *allocate_data) +{ + splay_tree sp = (splay_tree) (*allocate_fn) (sizeof (struct splay_tree_s), + allocate_data); + sp->root = 0; + sp->comp = compare_fn; + sp->delete_key = delete_key_fn; + sp->delete_value = delete_value_fn; + sp->allocate = allocate_fn; + sp->deallocate = deallocate_fn; + sp->allocate_data = allocate_data; + + return sp; +} + +/* Deallocate SP. */ + +void +splay_tree_delete (splay_tree sp) +{ + splay_tree_delete_helper (sp, sp->root); + (*sp->deallocate) ((char*) sp, sp->allocate_data); +} + +/* Insert a new node (associating KEY with DATA) into SP. If a + previous node with the indicated KEY exists, its data is replaced + with the new value. Returns the new node. */ + +splay_tree_node +splay_tree_insert (splay_tree sp, splay_tree_key key, splay_tree_value value) +{ + int comparison = 0; + + splay_tree_splay (sp, key); + + if (sp->root) + comparison = (*sp->comp)(sp->root->key, key); + + if (sp->root && comparison == 0) + { + /* If the root of the tree already has the indicated KEY, just + replace the value with VALUE. */ + if (sp->delete_value) + (*sp->delete_value)(sp->root->value); + sp->root->value = value; + } + else + { + /* Create a new node, and insert it at the root. */ + splay_tree_node node; + + node = ((splay_tree_node) + (*sp->allocate) (sizeof (struct splay_tree_node_s), + sp->allocate_data)); + node->key = key; + node->value = value; + + if (!sp->root) + node->left = node->right = 0; + else if (comparison < 0) + { + node->left = sp->root; + node->right = node->left->right; + node->left->right = 0; + } + else + { + node->right = sp->root; + node->left = node->right->left; + node->right->left = 0; + } + + sp->root = node; + } + + return sp->root; +} + +/* Remove KEY from SP. It is not an error if it did not exist. */ + +void +splay_tree_remove (splay_tree sp, splay_tree_key key) +{ + splay_tree_splay (sp, key); + + if (sp->root && (*sp->comp) (sp->root->key, key) == 0) + { + splay_tree_node left, right; + + left = sp->root->left; + right = sp->root->right; + + /* Delete the root node itself. */ + if (sp->delete_value) + (*sp->delete_value) (sp->root->value); + (*sp->deallocate) (sp->root, sp->allocate_data); + + /* One of the children is now the root. Doesn't matter much + which, so long as we preserve the properties of the tree. */ + if (left) + { + sp->root = left; + + /* If there was a right child as well, hang it off the + right-most leaf of the left child. */ + if (right) + { + while (left->right) + left = left->right; + left->right = right; + } + } + else + sp->root = right; + } +} + +/* Lookup KEY in SP, returning VALUE if present, and NULL + otherwise. */ + +splay_tree_node +splay_tree_lookup (splay_tree sp, splay_tree_key key) +{ + splay_tree_splay (sp, key); + + if (sp->root && (*sp->comp)(sp->root->key, key) == 0) + return sp->root; + else + return 0; +} + +/* Return the node in SP with the greatest key. */ + +splay_tree_node +splay_tree_max (splay_tree sp) +{ + splay_tree_node n = sp->root; + + if (!n) + return NULL; + + while (n->right) + n = n->right; + + return n; +} + +/* Return the node in SP with the smallest key. */ + +splay_tree_node +splay_tree_min (splay_tree sp) +{ + splay_tree_node n = sp->root; + + if (!n) + return NULL; + + while (n->left) + n = n->left; + + return n; +} + +/* Return the immediate predecessor KEY, or NULL if there is no + predecessor. KEY need not be present in the tree. */ + +splay_tree_node +splay_tree_predecessor (splay_tree sp, splay_tree_key key) +{ + int comparison; + splay_tree_node node; + + /* If the tree is empty, there is certainly no predecessor. */ + if (!sp->root) + return NULL; + + /* Splay the tree around KEY. That will leave either the KEY + itself, its predecessor, or its successor at the root. */ + splay_tree_splay (sp, key); + comparison = (*sp->comp)(sp->root->key, key); + + /* If the predecessor is at the root, just return it. */ + if (comparison < 0) + return sp->root; + + /* Otherwise, find the rightmost element of the left subtree. */ + node = sp->root->left; + if (node) + while (node->right) + node = node->right; + + return node; +} + +/* Return the immediate successor KEY, or NULL if there is no + successor. KEY need not be present in the tree. */ + +splay_tree_node +splay_tree_successor (splay_tree sp, splay_tree_key key) +{ + int comparison; + splay_tree_node node; + + /* If the tree is empty, there is certainly no successor. */ + if (!sp->root) + return NULL; + + /* Splay the tree around KEY. That will leave either the KEY + itself, its predecessor, or its successor at the root. */ + splay_tree_splay (sp, key); + comparison = (*sp->comp)(sp->root->key, key); + + /* If the successor is at the root, just return it. */ + if (comparison > 0) + return sp->root; + + /* Otherwise, find the leftmost element of the right subtree. */ + node = sp->root->right; + if (node) + while (node->left) + node = node->left; + + return node; +} + +/* Call FN, passing it the DATA, for every node in SP, following an + in-order traversal. If FN every returns a non-zero value, the + iteration ceases immediately, and the value is returned. + Otherwise, this function returns 0. */ + +int +splay_tree_foreach (splay_tree sp, splay_tree_foreach_fn fn, void *data) +{ + return splay_tree_foreach_helper (sp, sp->root, fn, data); +} + +/* Splay-tree comparison function, treating the keys as ints. */ + +int +splay_tree_compare_ints (splay_tree_key k1, splay_tree_key k2) +{ + if ((int) k1 < (int) k2) + return -1; + else if ((int) k1 > (int) k2) + return 1; + else + return 0; +} + +/* Splay-tree comparison function, treating the keys as pointers. */ + +int +splay_tree_compare_pointers (splay_tree_key k1, splay_tree_key k2) +{ + if ((char*) k1 < (char*) k2) + return -1; + else if ((char*) k1 > (char*) k2) + return 1; + else + return 0; +} diff --git a/libiberty/stpcpy.c b/libiberty/stpcpy.c new file mode 100644 index 0000000..57b32d1 --- /dev/null +++ b/libiberty/stpcpy.c @@ -0,0 +1,43 @@ +/* Implement the stpcpy function. + Copyright (C) 2003 Free Software Foundation, Inc. + Written by Kaveh R. Ghazi . + +This file is part of the libiberty library. +Libiberty is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +Libiberty 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with libiberty; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +/* + +@deftypefn Supplemental char* stpcpy (char *@var{dst}, const char *@var{src}) + +Copies the string @var{src} into @var{dst}. Returns a pointer to +@var{dst} + strlen(@var{src}). + +@end deftypefn + +*/ + +#include +#include + +extern size_t strlen (const char *); +extern PTR memcpy (PTR, const PTR, size_t); + +char * +stpcpy (char *dst, const char *src) +{ + const size_t len = strlen (src); + return (char *) memcpy (dst, src, len + 1) + len; +} diff --git a/libiberty/stpncpy.c b/libiberty/stpncpy.c new file mode 100644 index 0000000..f97206a --- /dev/null +++ b/libiberty/stpncpy.c @@ -0,0 +1,47 @@ +/* Implement the stpncpy function. + Copyright (C) 2003 Free Software Foundation, Inc. + Written by Kaveh R. Ghazi . + +This file is part of the libiberty library. +Libiberty is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +Libiberty 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with libiberty; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +/* + +@deftypefn Supplemental char* stpncpy (char *@var{dst}, const char *@var{src}, size_t @var{len}) + +Copies the string @var{src} into @var{dst}, copying exactly @var{len} +and padding with zeros if necessary. If @var{len} < strlen(@var{src}) +then return @var{dst} + @var{len}, otherwise returns @var{dst} + +strlen(@var{src}). + +@end deftypefn + +*/ + +#include +#include + +extern size_t strlen (const char *); +extern char *strncpy (char *, const char *, size_t); + +char * +stpncpy (char *dst, const char *src, size_t len) +{ + size_t n = strlen (src); + if (n > len) + n = len; + return strncpy (dst, src, len) + n; +} diff --git a/libiberty/strcasecmp.c b/libiberty/strcasecmp.c new file mode 100644 index 0000000..131d81c --- /dev/null +++ b/libiberty/strcasecmp.c @@ -0,0 +1,87 @@ +/* + * Copyright (c) 1987 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that this notice is preserved and that due credit is given + * to the University of California at Berkeley. The name of the University + * may not be used to endorse or promote products derived from this + * software without specific written prior permission. This software + * is provided ``as is'' without express or implied warranty. + */ + +/* + +@deftypefn Supplemental int strcasecmp (const char *@var{s1}, const char *@var{s2}) + +A case-insensitive @code{strcmp}. + +@end deftypefn + +*/ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)strcasecmp.c 5.5 (Berkeley) 11/24/87"; +#endif /* LIBC_SCCS and not lint */ + +#include +#include + +/* + * This array is designed for mapping upper and lower case letter + * together for a case independent comparison. The mappings are + * based upon ascii character sequences. + */ +typedef unsigned char uc; +static const unsigned char charmap[] = { + (uc)'\000',(uc)'\001',(uc)'\002',(uc)'\003',(uc)'\004',(uc)'\005',(uc)'\006',(uc)'\007', + (uc)'\010',(uc)'\011',(uc)'\012',(uc)'\013',(uc)'\014',(uc)'\015',(uc)'\016',(uc)'\017', + (uc)'\020',(uc)'\021',(uc)'\022',(uc)'\023',(uc)'\024',(uc)'\025',(uc)'\026',(uc)'\027', + (uc)'\030',(uc)'\031',(uc)'\032',(uc)'\033',(uc)'\034',(uc)'\035',(uc)'\036',(uc)'\037', + (uc)'\040',(uc)'\041',(uc)'\042',(uc)'\043',(uc)'\044',(uc)'\045',(uc)'\046',(uc)'\047', + (uc)'\050',(uc)'\051',(uc)'\052',(uc)'\053',(uc)'\054',(uc)'\055',(uc)'\056',(uc)'\057', + (uc)'\060',(uc)'\061',(uc)'\062',(uc)'\063',(uc)'\064',(uc)'\065',(uc)'\066',(uc)'\067', + (uc)'\070',(uc)'\071',(uc)'\072',(uc)'\073',(uc)'\074',(uc)'\075',(uc)'\076',(uc)'\077', + (uc)'\100',(uc)'\141',(uc)'\142',(uc)'\143',(uc)'\144',(uc)'\145',(uc)'\146',(uc)'\147', + (uc)'\150',(uc)'\151',(uc)'\152',(uc)'\153',(uc)'\154',(uc)'\155',(uc)'\156',(uc)'\157', + (uc)'\160',(uc)'\161',(uc)'\162',(uc)'\163',(uc)'\164',(uc)'\165',(uc)'\166',(uc)'\167', + (uc)'\170',(uc)'\171',(uc)'\172',(uc)'\133',(uc)'\134',(uc)'\135',(uc)'\136',(uc)'\137', + (uc)'\140',(uc)'\141',(uc)'\142',(uc)'\143',(uc)'\144',(uc)'\145',(uc)'\146',(uc)'\147', + (uc)'\150',(uc)'\151',(uc)'\152',(uc)'\153',(uc)'\154',(uc)'\155',(uc)'\156',(uc)'\157', + (uc)'\160',(uc)'\161',(uc)'\162',(uc)'\163',(uc)'\164',(uc)'\165',(uc)'\166',(uc)'\167', + (uc)'\170',(uc)'\171',(uc)'\172',(uc)'\173',(uc)'\174',(uc)'\175',(uc)'\176',(uc)'\177', + (uc)'\200',(uc)'\201',(uc)'\202',(uc)'\203',(uc)'\204',(uc)'\205',(uc)'\206',(uc)'\207', + (uc)'\210',(uc)'\211',(uc)'\212',(uc)'\213',(uc)'\214',(uc)'\215',(uc)'\216',(uc)'\217', + (uc)'\220',(uc)'\221',(uc)'\222',(uc)'\223',(uc)'\224',(uc)'\225',(uc)'\226',(uc)'\227', + (uc)'\230',(uc)'\231',(uc)'\232',(uc)'\233',(uc)'\234',(uc)'\235',(uc)'\236',(uc)'\237', + (uc)'\240',(uc)'\241',(uc)'\242',(uc)'\243',(uc)'\244',(uc)'\245',(uc)'\246',(uc)'\247', + (uc)'\250',(uc)'\251',(uc)'\252',(uc)'\253',(uc)'\254',(uc)'\255',(uc)'\256',(uc)'\257', + (uc)'\260',(uc)'\261',(uc)'\262',(uc)'\263',(uc)'\264',(uc)'\265',(uc)'\266',(uc)'\267', + (uc)'\270',(uc)'\271',(uc)'\272',(uc)'\273',(uc)'\274',(uc)'\275',(uc)'\276',(uc)'\277', + (uc)'\300',(uc)'\341',(uc)'\342',(uc)'\343',(uc)'\344',(uc)'\345',(uc)'\346',(uc)'\347', + (uc)'\350',(uc)'\351',(uc)'\352',(uc)'\353',(uc)'\354',(uc)'\355',(uc)'\356',(uc)'\357', + (uc)'\360',(uc)'\361',(uc)'\362',(uc)'\363',(uc)'\364',(uc)'\365',(uc)'\366',(uc)'\367', + (uc)'\370',(uc)'\371',(uc)'\372',(uc)'\333',(uc)'\334',(uc)'\335',(uc)'\336',(uc)'\337', + (uc)'\340',(uc)'\341',(uc)'\342',(uc)'\343',(uc)'\344',(uc)'\345',(uc)'\346',(uc)'\347', + (uc)'\350',(uc)'\351',(uc)'\352',(uc)'\353',(uc)'\354',(uc)'\355',(uc)'\356',(uc)'\357', + (uc)'\360',(uc)'\361',(uc)'\362',(uc)'\363',(uc)'\364',(uc)'\365',(uc)'\366',(uc)'\367', + (uc)'\370',(uc)'\371',(uc)'\372',(uc)'\373',(uc)'\374',(uc)'\375',(uc)'\376',(uc)'\377', +}; + +int +strcasecmp(const char *s1, const char *s2) +{ + register unsigned char u1, u2; + + for (;;) { + u1 = (unsigned char) *s1++; + u2 = (unsigned char) *s2++; + if (charmap[u1] != charmap[u2]) { + return charmap[u1] - charmap[u2]; + } + if (u1 == '\0') { + return 0; + } + } +} + diff --git a/libiberty/strchr.c b/libiberty/strchr.c new file mode 100644 index 0000000..935805e --- /dev/null +++ b/libiberty/strchr.c @@ -0,0 +1,28 @@ +/* Portable version of strchr() + This function is in the public domain. */ + +/* + +@deftypefn Supplemental char* strchr (const char *@var{s}, int @var{c}) + +Returns a pointer to the first occurrence of the character @var{c} in +the string @var{s}, or @code{NULL} if not found. If @var{c} is itself the +null character, the results are undefined. + +@end deftypefn + +*/ + +#include + +char * +strchr (register const char *s, int c) +{ + do { + if (*s == c) + { + return (char*)s; + } + } while (*s++); + return (0); +} diff --git a/libiberty/strdup.c b/libiberty/strdup.c new file mode 100644 index 0000000..78c2093 --- /dev/null +++ b/libiberty/strdup.c @@ -0,0 +1,27 @@ +/* + +@deftypefn Supplemental char* strdup (const char *@var{s}) + +Returns a pointer to a copy of @var{s} in memory obtained from +@code{malloc}, or @code{NULL} if insufficient memory was available. + +@end deftypefn + +*/ + +#include +#include + +extern size_t strlen (const char*); +extern PTR malloc (size_t); +extern PTR memcpy (PTR, const PTR, size_t); + +char * +strdup(const char *s) +{ + size_t len = strlen (s) + 1; + char *result = (char*) malloc (len); + if (result == (char*) 0) + return (char*) 0; + return (char*) memcpy (result, s, len); +} diff --git a/libiberty/strerror.c b/libiberty/strerror.c new file mode 100644 index 0000000..0efadc3 --- /dev/null +++ b/libiberty/strerror.c @@ -0,0 +1,809 @@ +/* Extended support for using errno values. + Written by Fred Fish. fnf@cygnus.com + This file is in the public domain. --Per Bothner. */ + +#include "config.h" + +#ifdef HAVE_SYS_ERRLIST +/* Note that errno.h (not sure what OS) or stdio.h (BSD 4.4, at least) + might declare sys_errlist in a way that the compiler might consider + incompatible with our later declaration, perhaps by using const + attributes. So we hide the declaration in errno.h (if any) using a + macro. */ +#define sys_nerr sys_nerr__ +#define sys_errlist sys_errlist__ +#endif + +#include "ansidecl.h" +#include "libiberty.h" + +#include +#include + +#ifdef HAVE_SYS_ERRLIST +#undef sys_nerr +#undef sys_errlist +#endif + +/* Routines imported from standard C runtime libraries. */ + +#ifdef HAVE_STDLIB_H +#include +#else +extern PTR malloc (); +#endif + +#ifdef HAVE_STRING_H +#include +#else +extern PTR memset (); +#endif + +#ifndef MAX +# define MAX(a,b) ((a) > (b) ? (a) : (b)) +#endif + +static void init_error_tables (void); + +/* Translation table for errno values. See intro(2) in most UNIX systems + Programmers Reference Manuals. + + Note that this table is generally only accessed when it is used at runtime + to initialize errno name and message tables that are indexed by errno + value. + + Not all of these errnos will exist on all systems. This table is the only + thing that should have to be updated as new error numbers are introduced. + It's sort of ugly, but at least its portable. */ + +struct error_info +{ + const int value; /* The numeric value from */ + const char *const name; /* The equivalent symbolic value */ +#ifndef HAVE_SYS_ERRLIST + const char *const msg; /* Short message about this value */ +#endif +}; + +#ifndef HAVE_SYS_ERRLIST +# define ENTRY(value, name, msg) {value, name, msg} +#else +# define ENTRY(value, name, msg) {value, name} +#endif + +static const struct error_info error_table[] = +{ +#if defined (EPERM) + ENTRY(EPERM, "EPERM", "Not owner"), +#endif +#if defined (ENOENT) + ENTRY(ENOENT, "ENOENT", "No such file or directory"), +#endif +#if defined (ESRCH) + ENTRY(ESRCH, "ESRCH", "No such process"), +#endif +#if defined (EINTR) + ENTRY(EINTR, "EINTR", "Interrupted system call"), +#endif +#if defined (EIO) + ENTRY(EIO, "EIO", "I/O error"), +#endif +#if defined (ENXIO) + ENTRY(ENXIO, "ENXIO", "No such device or address"), +#endif +#if defined (E2BIG) + ENTRY(E2BIG, "E2BIG", "Arg list too long"), +#endif +#if defined (ENOEXEC) + ENTRY(ENOEXEC, "ENOEXEC", "Exec format error"), +#endif +#if defined (EBADF) + ENTRY(EBADF, "EBADF", "Bad file number"), +#endif +#if defined (ECHILD) + ENTRY(ECHILD, "ECHILD", "No child processes"), +#endif +#if defined (EWOULDBLOCK) /* Put before EAGAIN, sometimes aliased */ + ENTRY(EWOULDBLOCK, "EWOULDBLOCK", "Operation would block"), +#endif +#if defined (EAGAIN) + ENTRY(EAGAIN, "EAGAIN", "No more processes"), +#endif +#if defined (ENOMEM) + ENTRY(ENOMEM, "ENOMEM", "Not enough space"), +#endif +#if defined (EACCES) + ENTRY(EACCES, "EACCES", "Permission denied"), +#endif +#if defined (EFAULT) + ENTRY(EFAULT, "EFAULT", "Bad address"), +#endif +#if defined (ENOTBLK) + ENTRY(ENOTBLK, "ENOTBLK", "Block device required"), +#endif +#if defined (EBUSY) + ENTRY(EBUSY, "EBUSY", "Device busy"), +#endif +#if defined (EEXIST) + ENTRY(EEXIST, "EEXIST", "File exists"), +#endif +#if defined (EXDEV) + ENTRY(EXDEV, "EXDEV", "Cross-device link"), +#endif +#if defined (ENODEV) + ENTRY(ENODEV, "ENODEV", "No such device"), +#endif +#if defined (ENOTDIR) + ENTRY(ENOTDIR, "ENOTDIR", "Not a directory"), +#endif +#if defined (EISDIR) + ENTRY(EISDIR, "EISDIR", "Is a directory"), +#endif +#if defined (EINVAL) + ENTRY(EINVAL, "EINVAL", "Invalid argument"), +#endif +#if defined (ENFILE) + ENTRY(ENFILE, "ENFILE", "File table overflow"), +#endif +#if defined (EMFILE) + ENTRY(EMFILE, "EMFILE", "Too many open files"), +#endif +#if defined (ENOTTY) + ENTRY(ENOTTY, "ENOTTY", "Not a typewriter"), +#endif +#if defined (ETXTBSY) + ENTRY(ETXTBSY, "ETXTBSY", "Text file busy"), +#endif +#if defined (EFBIG) + ENTRY(EFBIG, "EFBIG", "File too large"), +#endif +#if defined (ENOSPC) + ENTRY(ENOSPC, "ENOSPC", "No space left on device"), +#endif +#if defined (ESPIPE) + ENTRY(ESPIPE, "ESPIPE", "Illegal seek"), +#endif +#if defined (EROFS) + ENTRY(EROFS, "EROFS", "Read-only file system"), +#endif +#if defined (EMLINK) + ENTRY(EMLINK, "EMLINK", "Too many links"), +#endif +#if defined (EPIPE) + ENTRY(EPIPE, "EPIPE", "Broken pipe"), +#endif +#if defined (EDOM) + ENTRY(EDOM, "EDOM", "Math argument out of domain of func"), +#endif +#if defined (ERANGE) + ENTRY(ERANGE, "ERANGE", "Math result not representable"), +#endif +#if defined (ENOMSG) + ENTRY(ENOMSG, "ENOMSG", "No message of desired type"), +#endif +#if defined (EIDRM) + ENTRY(EIDRM, "EIDRM", "Identifier removed"), +#endif +#if defined (ECHRNG) + ENTRY(ECHRNG, "ECHRNG", "Channel number out of range"), +#endif +#if defined (EL2NSYNC) + ENTRY(EL2NSYNC, "EL2NSYNC", "Level 2 not synchronized"), +#endif +#if defined (EL3HLT) + ENTRY(EL3HLT, "EL3HLT", "Level 3 halted"), +#endif +#if defined (EL3RST) + ENTRY(EL3RST, "EL3RST", "Level 3 reset"), +#endif +#if defined (ELNRNG) + ENTRY(ELNRNG, "ELNRNG", "Link number out of range"), +#endif +#if defined (EUNATCH) + ENTRY(EUNATCH, "EUNATCH", "Protocol driver not attached"), +#endif +#if defined (ENOCSI) + ENTRY(ENOCSI, "ENOCSI", "No CSI structure available"), +#endif +#if defined (EL2HLT) + ENTRY(EL2HLT, "EL2HLT", "Level 2 halted"), +#endif +#if defined (EDEADLK) + ENTRY(EDEADLK, "EDEADLK", "Deadlock condition"), +#endif +#if defined (ENOLCK) + ENTRY(ENOLCK, "ENOLCK", "No record locks available"), +#endif +#if defined (EBADE) + ENTRY(EBADE, "EBADE", "Invalid exchange"), +#endif +#if defined (EBADR) + ENTRY(EBADR, "EBADR", "Invalid request descriptor"), +#endif +#if defined (EXFULL) + ENTRY(EXFULL, "EXFULL", "Exchange full"), +#endif +#if defined (ENOANO) + ENTRY(ENOANO, "ENOANO", "No anode"), +#endif +#if defined (EBADRQC) + ENTRY(EBADRQC, "EBADRQC", "Invalid request code"), +#endif +#if defined (EBADSLT) + ENTRY(EBADSLT, "EBADSLT", "Invalid slot"), +#endif +#if defined (EDEADLOCK) + ENTRY(EDEADLOCK, "EDEADLOCK", "File locking deadlock error"), +#endif +#if defined (EBFONT) + ENTRY(EBFONT, "EBFONT", "Bad font file format"), +#endif +#if defined (ENOSTR) + ENTRY(ENOSTR, "ENOSTR", "Device not a stream"), +#endif +#if defined (ENODATA) + ENTRY(ENODATA, "ENODATA", "No data available"), +#endif +#if defined (ETIME) + ENTRY(ETIME, "ETIME", "Timer expired"), +#endif +#if defined (ENOSR) + ENTRY(ENOSR, "ENOSR", "Out of streams resources"), +#endif +#if defined (ENONET) + ENTRY(ENONET, "ENONET", "Machine is not on the network"), +#endif +#if defined (ENOPKG) + ENTRY(ENOPKG, "ENOPKG", "Package not installed"), +#endif +#if defined (EREMOTE) + ENTRY(EREMOTE, "EREMOTE", "Object is remote"), +#endif +#if defined (ENOLINK) + ENTRY(ENOLINK, "ENOLINK", "Link has been severed"), +#endif +#if defined (EADV) + ENTRY(EADV, "EADV", "Advertise error"), +#endif +#if defined (ESRMNT) + ENTRY(ESRMNT, "ESRMNT", "Srmount error"), +#endif +#if defined (ECOMM) + ENTRY(ECOMM, "ECOMM", "Communication error on send"), +#endif +#if defined (EPROTO) + ENTRY(EPROTO, "EPROTO", "Protocol error"), +#endif +#if defined (EMULTIHOP) + ENTRY(EMULTIHOP, "EMULTIHOP", "Multihop attempted"), +#endif +#if defined (EDOTDOT) + ENTRY(EDOTDOT, "EDOTDOT", "RFS specific error"), +#endif +#if defined (EBADMSG) + ENTRY(EBADMSG, "EBADMSG", "Not a data message"), +#endif +#if defined (ENAMETOOLONG) + ENTRY(ENAMETOOLONG, "ENAMETOOLONG", "File name too long"), +#endif +#if defined (EOVERFLOW) + ENTRY(EOVERFLOW, "EOVERFLOW", "Value too large for defined data type"), +#endif +#if defined (ENOTUNIQ) + ENTRY(ENOTUNIQ, "ENOTUNIQ", "Name not unique on network"), +#endif +#if defined (EBADFD) + ENTRY(EBADFD, "EBADFD", "File descriptor in bad state"), +#endif +#if defined (EREMCHG) + ENTRY(EREMCHG, "EREMCHG", "Remote address changed"), +#endif +#if defined (ELIBACC) + ENTRY(ELIBACC, "ELIBACC", "Can not access a needed shared library"), +#endif +#if defined (ELIBBAD) + ENTRY(ELIBBAD, "ELIBBAD", "Accessing a corrupted shared library"), +#endif +#if defined (ELIBSCN) + ENTRY(ELIBSCN, "ELIBSCN", ".lib section in a.out corrupted"), +#endif +#if defined (ELIBMAX) + ENTRY(ELIBMAX, "ELIBMAX", "Attempting to link in too many shared libraries"), +#endif +#if defined (ELIBEXEC) + ENTRY(ELIBEXEC, "ELIBEXEC", "Cannot exec a shared library directly"), +#endif +#if defined (EILSEQ) + ENTRY(EILSEQ, "EILSEQ", "Illegal byte sequence"), +#endif +#if defined (ENOSYS) + ENTRY(ENOSYS, "ENOSYS", "Operation not applicable"), +#endif +#if defined (ELOOP) + ENTRY(ELOOP, "ELOOP", "Too many symbolic links encountered"), +#endif +#if defined (ERESTART) + ENTRY(ERESTART, "ERESTART", "Interrupted system call should be restarted"), +#endif +#if defined (ESTRPIPE) + ENTRY(ESTRPIPE, "ESTRPIPE", "Streams pipe error"), +#endif +#if defined (ENOTEMPTY) + ENTRY(ENOTEMPTY, "ENOTEMPTY", "Directory not empty"), +#endif +#if defined (EUSERS) + ENTRY(EUSERS, "EUSERS", "Too many users"), +#endif +#if defined (ENOTSOCK) + ENTRY(ENOTSOCK, "ENOTSOCK", "Socket operation on non-socket"), +#endif +#if defined (EDESTADDRREQ) + ENTRY(EDESTADDRREQ, "EDESTADDRREQ", "Destination address required"), +#endif +#if defined (EMSGSIZE) + ENTRY(EMSGSIZE, "EMSGSIZE", "Message too long"), +#endif +#if defined (EPROTOTYPE) + ENTRY(EPROTOTYPE, "EPROTOTYPE", "Protocol wrong type for socket"), +#endif +#if defined (ENOPROTOOPT) + ENTRY(ENOPROTOOPT, "ENOPROTOOPT", "Protocol not available"), +#endif +#if defined (EPROTONOSUPPORT) + ENTRY(EPROTONOSUPPORT, "EPROTONOSUPPORT", "Protocol not supported"), +#endif +#if defined (ESOCKTNOSUPPORT) + ENTRY(ESOCKTNOSUPPORT, "ESOCKTNOSUPPORT", "Socket type not supported"), +#endif +#if defined (EOPNOTSUPP) + ENTRY(EOPNOTSUPP, "EOPNOTSUPP", "Operation not supported on transport endpoint"), +#endif +#if defined (EPFNOSUPPORT) + ENTRY(EPFNOSUPPORT, "EPFNOSUPPORT", "Protocol family not supported"), +#endif +#if defined (EAFNOSUPPORT) + ENTRY(EAFNOSUPPORT, "EAFNOSUPPORT", "Address family not supported by protocol"), +#endif +#if defined (EADDRINUSE) + ENTRY(EADDRINUSE, "EADDRINUSE", "Address already in use"), +#endif +#if defined (EADDRNOTAVAIL) + ENTRY(EADDRNOTAVAIL, "EADDRNOTAVAIL","Cannot assign requested address"), +#endif +#if defined (ENETDOWN) + ENTRY(ENETDOWN, "ENETDOWN", "Network is down"), +#endif +#if defined (ENETUNREACH) + ENTRY(ENETUNREACH, "ENETUNREACH", "Network is unreachable"), +#endif +#if defined (ENETRESET) + ENTRY(ENETRESET, "ENETRESET", "Network dropped connection because of reset"), +#endif +#if defined (ECONNABORTED) + ENTRY(ECONNABORTED, "ECONNABORTED", "Software caused connection abort"), +#endif +#if defined (ECONNRESET) + ENTRY(ECONNRESET, "ECONNRESET", "Connection reset by peer"), +#endif +#if defined (ENOBUFS) + ENTRY(ENOBUFS, "ENOBUFS", "No buffer space available"), +#endif +#if defined (EISCONN) + ENTRY(EISCONN, "EISCONN", "Transport endpoint is already connected"), +#endif +#if defined (ENOTCONN) + ENTRY(ENOTCONN, "ENOTCONN", "Transport endpoint is not connected"), +#endif +#if defined (ESHUTDOWN) + ENTRY(ESHUTDOWN, "ESHUTDOWN", "Cannot send after transport endpoint shutdown"), +#endif +#if defined (ETOOMANYREFS) + ENTRY(ETOOMANYREFS, "ETOOMANYREFS", "Too many references: cannot splice"), +#endif +#if defined (ETIMEDOUT) + ENTRY(ETIMEDOUT, "ETIMEDOUT", "Connection timed out"), +#endif +#if defined (ECONNREFUSED) + ENTRY(ECONNREFUSED, "ECONNREFUSED", "Connection refused"), +#endif +#if defined (EHOSTDOWN) + ENTRY(EHOSTDOWN, "EHOSTDOWN", "Host is down"), +#endif +#if defined (EHOSTUNREACH) + ENTRY(EHOSTUNREACH, "EHOSTUNREACH", "No route to host"), +#endif +#if defined (EALREADY) + ENTRY(EALREADY, "EALREADY", "Operation already in progress"), +#endif +#if defined (EINPROGRESS) + ENTRY(EINPROGRESS, "EINPROGRESS", "Operation now in progress"), +#endif +#if defined (ESTALE) + ENTRY(ESTALE, "ESTALE", "Stale NFS file handle"), +#endif +#if defined (EUCLEAN) + ENTRY(EUCLEAN, "EUCLEAN", "Structure needs cleaning"), +#endif +#if defined (ENOTNAM) + ENTRY(ENOTNAM, "ENOTNAM", "Not a XENIX named type file"), +#endif +#if defined (ENAVAIL) + ENTRY(ENAVAIL, "ENAVAIL", "No XENIX semaphores available"), +#endif +#if defined (EISNAM) + ENTRY(EISNAM, "EISNAM", "Is a named type file"), +#endif +#if defined (EREMOTEIO) + ENTRY(EREMOTEIO, "EREMOTEIO", "Remote I/O error"), +#endif + ENTRY(0, NULL, NULL) +}; + +#ifdef EVMSERR +/* This is not in the table, because the numeric value of EVMSERR (32767) + lies outside the range of sys_errlist[]. */ +static struct { int value; const char *name, *msg; } + evmserr = { EVMSERR, "EVMSERR", "VMS-specific error" }; +#endif + +/* Translation table allocated and initialized at runtime. Indexed by the + errno value to find the equivalent symbolic value. */ + +static const char **error_names; +static int num_error_names = 0; + +/* Translation table allocated and initialized at runtime, if it does not + already exist in the host environment. Indexed by the errno value to find + the descriptive string. + + We don't export it for use in other modules because even though it has the + same name, it differs from other implementations in that it is dynamically + initialized rather than statically initialized. */ + +#ifndef HAVE_SYS_ERRLIST + +#define sys_nerr sys_nerr__ +#define sys_errlist sys_errlist__ +static int sys_nerr; +static const char **sys_errlist; + +#else + +extern int sys_nerr; +extern char *sys_errlist[]; + +#endif + +/* + +NAME + + init_error_tables -- initialize the name and message tables + +SYNOPSIS + + static void init_error_tables (); + +DESCRIPTION + + Using the error_table, which is initialized at compile time, generate + the error_names and the sys_errlist (if needed) tables, which are + indexed at runtime by a specific errno value. + +BUGS + + The initialization of the tables may fail under low memory conditions, + in which case we don't do anything particularly useful, but we don't + bomb either. Who knows, it might succeed at a later point if we free + some memory in the meantime. In any case, the other routines know + how to deal with lack of a table after trying to initialize it. This + may or may not be considered to be a bug, that we don't specifically + warn about this particular failure mode. + +*/ + +static void +init_error_tables (void) +{ + const struct error_info *eip; + int nbytes; + + /* If we haven't already scanned the error_table once to find the maximum + errno value, then go find it now. */ + + if (num_error_names == 0) + { + for (eip = error_table; eip -> name != NULL; eip++) + { + if (eip -> value >= num_error_names) + { + num_error_names = eip -> value + 1; + } + } + } + + /* Now attempt to allocate the error_names table, zero it out, and then + initialize it from the statically initialized error_table. */ + + if (error_names == NULL) + { + nbytes = num_error_names * sizeof (char *); + if ((error_names = (const char **) malloc (nbytes)) != NULL) + { + memset (error_names, 0, nbytes); + for (eip = error_table; eip -> name != NULL; eip++) + { + error_names[eip -> value] = eip -> name; + } + } + } + +#ifndef HAVE_SYS_ERRLIST + + /* Now attempt to allocate the sys_errlist table, zero it out, and then + initialize it from the statically initialized error_table. */ + + if (sys_errlist == NULL) + { + nbytes = num_error_names * sizeof (char *); + if ((sys_errlist = (const char **) malloc (nbytes)) != NULL) + { + memset (sys_errlist, 0, nbytes); + sys_nerr = num_error_names; + for (eip = error_table; eip -> name != NULL; eip++) + { + sys_errlist[eip -> value] = eip -> msg; + } + } + } + +#endif + +} + +/* + + +@deftypefn Extension int errno_max (void) + +Returns the maximum @code{errno} value for which a corresponding +symbolic name or message is available. Note that in the case where we +use the @code{sys_errlist} supplied by the system, it is possible for +there to be more symbolic names than messages, or vice versa. In +fact, the manual page for @code{perror(3C)} explicitly warns that one +should check the size of the table (@code{sys_nerr}) before indexing +it, since new error codes may be added to the system before they are +added to the table. Thus @code{sys_nerr} might be smaller than value +implied by the largest @code{errno} value defined in @code{}. + +We return the maximum value that can be used to obtain a meaningful +symbolic name or message. + +@end deftypefn + +*/ + +int +errno_max (void) +{ + int maxsize; + + if (error_names == NULL) + { + init_error_tables (); + } + maxsize = MAX (sys_nerr, num_error_names); + return (maxsize - 1); +} + +#ifndef HAVE_STRERROR + +/* + +@deftypefn Supplemental char* strerror (int @var{errnoval}) + +Maps an @code{errno} number to an error message string, the contents +of which are implementation defined. On systems which have the +external variables @code{sys_nerr} and @code{sys_errlist}, these +strings will be the same as the ones used by @code{perror}. + +If the supplied error number is within the valid range of indices for +the @code{sys_errlist}, but no message is available for the particular +error number, then returns the string @samp{Error @var{num}}, where +@var{num} is the error number. + +If the supplied error number is not a valid index into +@code{sys_errlist}, returns @code{NULL}. + +The returned string is only guaranteed to be valid only until the +next call to @code{strerror}. + +@end deftypefn + +*/ + +char * +strerror (int errnoval) +{ + const char *msg; + static char buf[32]; + +#ifndef HAVE_SYS_ERRLIST + + if (error_names == NULL) + { + init_error_tables (); + } + +#endif + + if ((errnoval < 0) || (errnoval >= sys_nerr)) + { +#ifdef EVMSERR + if (errnoval == evmserr.value) + msg = evmserr.msg; + else +#endif + /* Out of range, just return NULL */ + msg = NULL; + } + else if ((sys_errlist == NULL) || (sys_errlist[errnoval] == NULL)) + { + /* In range, but no sys_errlist or no entry at this index. */ + sprintf (buf, "Error %d", errnoval); + msg = buf; + } + else + { + /* In range, and a valid message. Just return the message. */ + msg = (char *) sys_errlist[errnoval]; + } + + return (msg); +} + +#endif /* ! HAVE_STRERROR */ + + +/* + +@deftypefn Replacement {const char*} strerrno (int @var{errnum}) + +Given an error number returned from a system call (typically returned +in @code{errno}), returns a pointer to a string containing the +symbolic name of that error number, as found in @code{}. + +If the supplied error number is within the valid range of indices for +symbolic names, but no name is available for the particular error +number, then returns the string @samp{Error @var{num}}, where @var{num} +is the error number. + +If the supplied error number is not within the range of valid +indices, then returns @code{NULL}. + +The contents of the location pointed to are only guaranteed to be +valid until the next call to @code{strerrno}. + +@end deftypefn + +*/ + +const char * +strerrno (int errnoval) +{ + const char *name; + static char buf[32]; + + if (error_names == NULL) + { + init_error_tables (); + } + + if ((errnoval < 0) || (errnoval >= num_error_names)) + { +#ifdef EVMSERR + if (errnoval == evmserr.value) + name = evmserr.name; + else +#endif + /* Out of range, just return NULL */ + name = NULL; + } + else if ((error_names == NULL) || (error_names[errnoval] == NULL)) + { + /* In range, but no error_names or no entry at this index. */ + sprintf (buf, "Error %d", errnoval); + name = (const char *) buf; + } + else + { + /* In range, and a valid name. Just return the name. */ + name = error_names[errnoval]; + } + + return (name); +} + +/* + +@deftypefn Extension int strtoerrno (const char *@var{name}) + +Given the symbolic name of a error number (e.g., @code{EACCES}), map it +to an errno value. If no translation is found, returns 0. + +@end deftypefn + +*/ + +int +strtoerrno (const char *name) +{ + int errnoval = 0; + + if (name != NULL) + { + if (error_names == NULL) + { + init_error_tables (); + } + for (errnoval = 0; errnoval < num_error_names; errnoval++) + { + if ((error_names[errnoval] != NULL) && + (strcmp (name, error_names[errnoval]) == 0)) + { + break; + } + } + if (errnoval == num_error_names) + { +#ifdef EVMSERR + if (strcmp (name, evmserr.name) == 0) + errnoval = evmserr.value; + else +#endif + errnoval = 0; + } + } + return (errnoval); +} + + +/* A simple little main that does nothing but print all the errno translations + if MAIN is defined and this file is compiled and linked. */ + +#ifdef MAIN + +#include + +int +main (void) +{ + int errn; + int errnmax; + const char *name; + const char *msg; + char *strerror (); + + errnmax = errno_max (); + printf ("%d entries in names table.\n", num_error_names); + printf ("%d entries in messages table.\n", sys_nerr); + printf ("%d is max useful index.\n", errnmax); + + /* Keep printing values until we get to the end of *both* tables, not + *either* table. Note that knowing the maximum useful index does *not* + relieve us of the responsibility of testing the return pointer for + NULL. */ + + for (errn = 0; errn <= errnmax; errn++) + { + name = strerrno (errn); + name = (name == NULL) ? "" : name; + msg = strerror (errn); + msg = (msg == NULL) ? "" : msg; + printf ("%-4d%-18s%s\n", errn, name, msg); + } + + return 0; +} + +#endif diff --git a/libiberty/strncasecmp.c b/libiberty/strncasecmp.c new file mode 100644 index 0000000..47700dd --- /dev/null +++ b/libiberty/strncasecmp.c @@ -0,0 +1,86 @@ +/* + * Copyright (c) 1987 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that this notice is preserved and that due credit is given + * to the University of California at Berkeley. The name of the University + * may not be used to endorse or promote products derived from this + * software without specific written prior permission. This software + * is provided ``as is'' without express or implied warranty. + */ + +/* + +@deftypefn Supplemental int strncasecmp (const char *@var{s1}, const char *@var{s2}) + +A case-insensitive @code{strncmp}. + +@end deftypefn + +*/ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)strcasecmp.c 5.5 (Berkeley) 11/24/87"; +#endif /* LIBC_SCCS and not lint */ + +#include +#include + +/* + * This array is designed for mapping upper and lower case letter + * together for a case independent comparison. The mappings are + * based upon ascii character sequences. + */ +static const unsigned char charmap[] = { + '\000', '\001', '\002', '\003', '\004', '\005', '\006', '\007', + '\010', '\011', '\012', '\013', '\014', '\015', '\016', '\017', + '\020', '\021', '\022', '\023', '\024', '\025', '\026', '\027', + '\030', '\031', '\032', '\033', '\034', '\035', '\036', '\037', + '\040', '\041', '\042', '\043', '\044', '\045', '\046', '\047', + '\050', '\051', '\052', '\053', '\054', '\055', '\056', '\057', + '\060', '\061', '\062', '\063', '\064', '\065', '\066', '\067', + '\070', '\071', '\072', '\073', '\074', '\075', '\076', '\077', + '\100', '\141', '\142', '\143', '\144', '\145', '\146', '\147', + '\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157', + '\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167', + '\170', '\171', '\172', '\133', '\134', '\135', '\136', '\137', + '\140', '\141', '\142', '\143', '\144', '\145', '\146', '\147', + '\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157', + '\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167', + '\170', '\171', '\172', '\173', '\174', '\175', '\176', '\177', + '\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207', + '\210', '\211', '\212', '\213', '\214', '\215', '\216', '\217', + '\220', '\221', '\222', '\223', '\224', '\225', '\226', '\227', + '\230', '\231', '\232', '\233', '\234', '\235', '\236', '\237', + '\240', '\241', '\242', '\243', '\244', '\245', '\246', '\247', + '\250', '\251', '\252', '\253', '\254', '\255', '\256', '\257', + '\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267', + '\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277', + '\300', '\341', '\342', '\343', '\344', '\345', '\346', '\347', + '\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357', + '\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367', + '\370', '\371', '\372', '\333', '\334', '\335', '\336', '\337', + '\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347', + '\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357', + '\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367', + '\370', '\371', '\372', '\373', '\374', '\375', '\376', '\377', +}; + +int +strncasecmp(const char *s1, const char *s2, register size_t n) +{ + register unsigned char u1, u2; + + for (; n != 0; --n) { + u1 = (unsigned char) *s1++; + u2 = (unsigned char) *s2++; + if (charmap[u1] != charmap[u2]) { + return charmap[u1] - charmap[u2]; + } + if (u1 == '\0') { + return 0; + } + } + return 0; +} diff --git a/libiberty/strncmp.c b/libiberty/strncmp.c new file mode 100644 index 0000000..916c2f0 --- /dev/null +++ b/libiberty/strncmp.c @@ -0,0 +1,33 @@ +/* strncmp -- compare two strings, stop after n bytes. + This function is in the public domain. */ + +/* + +@deftypefn Supplemental int strncmp (const char *@var{s1}, const char *@var{s2}, size_t @var{n}) + +Compares the first @var{n} bytes of two strings, returning a value as +@code{strcmp}. + +@end deftypefn + +*/ + +#include +#include + +int +strncmp(const char *s1, const char *s2, register size_t n) +{ + register unsigned char u1, u2; + + while (n-- > 0) + { + u1 = (unsigned char) *s1++; + u2 = (unsigned char) *s2++; + if (u1 != u2) + return u1 - u2; + if (u1 == '\0') + return 0; + } + return 0; +} diff --git a/libiberty/strndup.c b/libiberty/strndup.c new file mode 100644 index 0000000..9e9b4e2 --- /dev/null +++ b/libiberty/strndup.c @@ -0,0 +1,55 @@ +/* Implement the strndup function. + Copyright (C) 2005 Free Software Foundation, Inc. + Written by Kaveh R. Ghazi . + +This file is part of the libiberty library. +Libiberty is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +Libiberty 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with libiberty; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +/* + +@deftypefn Extension char* strndup (const char *@var{s}, size_t @var{n}) + +Returns a pointer to a copy of @var{s} with at most @var{n} characters +in memory obtained from @code{malloc}, or @code{NULL} if insufficient +memory was available. The result is always NUL terminated. + +@end deftypefn + +*/ + +#include "ansidecl.h" +#include + +extern size_t strlen (const char*); +extern PTR malloc (size_t); +extern PTR memcpy (PTR, const PTR, size_t); + +char * +strndup (const char *s, size_t n) +{ + char *result; + size_t len = strlen (s); + + if (n < len) + len = n; + + result = (char *) malloc (len + 1); + if (!result) + return 0; + + result[len] = '\0'; + return (char *) memcpy (result, s, len); +} diff --git a/libiberty/strrchr.c b/libiberty/strrchr.c new file mode 100644 index 0000000..5cf7c14 --- /dev/null +++ b/libiberty/strrchr.c @@ -0,0 +1,28 @@ +/* Portable version of strrchr(). + This function is in the public domain. */ + +/* + +@deftypefn Supplemental char* strrchr (const char *@var{s}, int @var{c}) + +Returns a pointer to the last occurrence of the character @var{c} in +the string @var{s}, or @code{NULL} if not found. If @var{c} is itself the +null character, the results are undefined. + +@end deftypefn + +*/ + +#include + +char * +strrchr (register const char *s, int c) +{ + char *rtnval = 0; + + do { + if (*s == c) + rtnval = (char*) s; + } while (*s++); + return (rtnval); +} diff --git a/libiberty/strsignal.c b/libiberty/strsignal.c new file mode 100644 index 0000000..4ca9e21 --- /dev/null +++ b/libiberty/strsignal.c @@ -0,0 +1,608 @@ +/* Extended support for using signal values. + Written by Fred Fish. fnf@cygnus.com + This file is in the public domain. */ + +#include "config.h" +#include "ansidecl.h" +#include "libiberty.h" + +/* We need to declare sys_siglist, because even if the system provides + it we can't assume that it is declared in (for example, + SunOS provides sys_siglist, but it does not declare it in any + header file). However, we can't declare sys_siglist portably, + because on some systems it is declared with const and on some + systems it is declared without const. If we were using autoconf, + we could work out the right declaration. Until, then we just + ignore any declaration in the system header files, and always + declare it ourselves. With luck, this will always work. */ +#define sys_siglist no_such_symbol +#define sys_nsig sys_nsig__no_such_symbol + +#include +#include + +/* Routines imported from standard C runtime libraries. */ + +#ifdef HAVE_STDLIB_H +#include +#else +extern PTR malloc (); +#endif + +#ifdef HAVE_STRING_H +#include +#else +extern PTR memset (); +#endif + +/* Undefine the macro we used to hide the definition of sys_siglist + found in the system header files. */ +#undef sys_siglist +#undef sys_nsig + +#ifndef NULL +# define NULL (void *) 0 +#endif + +#ifndef MAX +# define MAX(a,b) ((a) > (b) ? (a) : (b)) +#endif + +static void init_signal_tables (void); + +/* Translation table for signal values. + + Note that this table is generally only accessed when it is used at runtime + to initialize signal name and message tables that are indexed by signal + value. + + Not all of these signals will exist on all systems. This table is the only + thing that should have to be updated as new signal numbers are introduced. + It's sort of ugly, but at least its portable. */ + +struct signal_info +{ + const int value; /* The numeric value from */ + const char *const name; /* The equivalent symbolic value */ +#ifndef HAVE_SYS_SIGLIST + const char *const msg; /* Short message about this value */ +#endif +}; + +#ifndef HAVE_SYS_SIGLIST +# define ENTRY(value, name, msg) {value, name, msg} +#else +# define ENTRY(value, name, msg) {value, name} +#endif + +static const struct signal_info signal_table[] = +{ +#if defined (SIGHUP) + ENTRY(SIGHUP, "SIGHUP", "Hangup"), +#endif +#if defined (SIGINT) + ENTRY(SIGINT, "SIGINT", "Interrupt"), +#endif +#if defined (SIGQUIT) + ENTRY(SIGQUIT, "SIGQUIT", "Quit"), +#endif +#if defined (SIGILL) + ENTRY(SIGILL, "SIGILL", "Illegal instruction"), +#endif +#if defined (SIGTRAP) + ENTRY(SIGTRAP, "SIGTRAP", "Trace/breakpoint trap"), +#endif +/* Put SIGIOT before SIGABRT, so that if SIGIOT==SIGABRT then SIGABRT + overrides SIGIOT. SIGABRT is in ANSI and POSIX.1, and SIGIOT isn't. */ +#if defined (SIGIOT) + ENTRY(SIGIOT, "SIGIOT", "IOT trap"), +#endif +#if defined (SIGABRT) + ENTRY(SIGABRT, "SIGABRT", "Aborted"), +#endif +#if defined (SIGEMT) + ENTRY(SIGEMT, "SIGEMT", "Emulation trap"), +#endif +#if defined (SIGFPE) + ENTRY(SIGFPE, "SIGFPE", "Arithmetic exception"), +#endif +#if defined (SIGKILL) + ENTRY(SIGKILL, "SIGKILL", "Killed"), +#endif +#if defined (SIGBUS) + ENTRY(SIGBUS, "SIGBUS", "Bus error"), +#endif +#if defined (SIGSEGV) + ENTRY(SIGSEGV, "SIGSEGV", "Segmentation fault"), +#endif +#if defined (SIGSYS) + ENTRY(SIGSYS, "SIGSYS", "Bad system call"), +#endif +#if defined (SIGPIPE) + ENTRY(SIGPIPE, "SIGPIPE", "Broken pipe"), +#endif +#if defined (SIGALRM) + ENTRY(SIGALRM, "SIGALRM", "Alarm clock"), +#endif +#if defined (SIGTERM) + ENTRY(SIGTERM, "SIGTERM", "Terminated"), +#endif +#if defined (SIGUSR1) + ENTRY(SIGUSR1, "SIGUSR1", "User defined signal 1"), +#endif +#if defined (SIGUSR2) + ENTRY(SIGUSR2, "SIGUSR2", "User defined signal 2"), +#endif +/* Put SIGCLD before SIGCHLD, so that if SIGCLD==SIGCHLD then SIGCHLD + overrides SIGCLD. SIGCHLD is in POXIX.1 */ +#if defined (SIGCLD) + ENTRY(SIGCLD, "SIGCLD", "Child status changed"), +#endif +#if defined (SIGCHLD) + ENTRY(SIGCHLD, "SIGCHLD", "Child status changed"), +#endif +#if defined (SIGPWR) + ENTRY(SIGPWR, "SIGPWR", "Power fail/restart"), +#endif +#if defined (SIGWINCH) + ENTRY(SIGWINCH, "SIGWINCH", "Window size changed"), +#endif +#if defined (SIGURG) + ENTRY(SIGURG, "SIGURG", "Urgent I/O condition"), +#endif +#if defined (SIGIO) + /* "I/O pending" has also been suggested, but is misleading since the + signal only happens when the process has asked for it, not everytime + I/O is pending. */ + ENTRY(SIGIO, "SIGIO", "I/O possible"), +#endif +#if defined (SIGPOLL) + ENTRY(SIGPOLL, "SIGPOLL", "Pollable event occurred"), +#endif +#if defined (SIGSTOP) + ENTRY(SIGSTOP, "SIGSTOP", "Stopped (signal)"), +#endif +#if defined (SIGTSTP) + ENTRY(SIGTSTP, "SIGTSTP", "Stopped (user)"), +#endif +#if defined (SIGCONT) + ENTRY(SIGCONT, "SIGCONT", "Continued"), +#endif +#if defined (SIGTTIN) + ENTRY(SIGTTIN, "SIGTTIN", "Stopped (tty input)"), +#endif +#if defined (SIGTTOU) + ENTRY(SIGTTOU, "SIGTTOU", "Stopped (tty output)"), +#endif +#if defined (SIGVTALRM) + ENTRY(SIGVTALRM, "SIGVTALRM", "Virtual timer expired"), +#endif +#if defined (SIGPROF) + ENTRY(SIGPROF, "SIGPROF", "Profiling timer expired"), +#endif +#if defined (SIGXCPU) + ENTRY(SIGXCPU, "SIGXCPU", "CPU time limit exceeded"), +#endif +#if defined (SIGXFSZ) + ENTRY(SIGXFSZ, "SIGXFSZ", "File size limit exceeded"), +#endif +#if defined (SIGWIND) + ENTRY(SIGWIND, "SIGWIND", "SIGWIND"), +#endif +#if defined (SIGPHONE) + ENTRY(SIGPHONE, "SIGPHONE", "SIGPHONE"), +#endif +#if defined (SIGLOST) + ENTRY(SIGLOST, "SIGLOST", "Resource lost"), +#endif +#if defined (SIGWAITING) + ENTRY(SIGWAITING, "SIGWAITING", "Process's LWPs are blocked"), +#endif +#if defined (SIGLWP) + ENTRY(SIGLWP, "SIGLWP", "Signal LWP"), +#endif +#if defined (SIGDANGER) + ENTRY(SIGDANGER, "SIGDANGER", "Swap space dangerously low"), +#endif +#if defined (SIGGRANT) + ENTRY(SIGGRANT, "SIGGRANT", "Monitor mode granted"), +#endif +#if defined (SIGRETRACT) + ENTRY(SIGRETRACT, "SIGRETRACT", "Need to relinguish monitor mode"), +#endif +#if defined (SIGMSG) + ENTRY(SIGMSG, "SIGMSG", "Monitor mode data available"), +#endif +#if defined (SIGSOUND) + ENTRY(SIGSOUND, "SIGSOUND", "Sound completed"), +#endif +#if defined (SIGSAK) + ENTRY(SIGSAK, "SIGSAK", "Secure attention"), +#endif + ENTRY(0, NULL, NULL) +}; + +/* Translation table allocated and initialized at runtime. Indexed by the + signal value to find the equivalent symbolic value. */ + +static const char **signal_names; +static int num_signal_names = 0; + +/* Translation table allocated and initialized at runtime, if it does not + already exist in the host environment. Indexed by the signal value to find + the descriptive string. + + We don't export it for use in other modules because even though it has the + same name, it differs from other implementations in that it is dynamically + initialized rather than statically initialized. */ + +#ifndef HAVE_SYS_SIGLIST + +static int sys_nsig; +static const char **sys_siglist; + +#else + +#ifdef NSIG +static int sys_nsig = NSIG; +#else +#ifdef _NSIG +static int sys_nsig = _NSIG; +#endif +#endif +extern const char * const sys_siglist[]; + +#endif + + +/* + +NAME + + init_signal_tables -- initialize the name and message tables + +SYNOPSIS + + static void init_signal_tables (); + +DESCRIPTION + + Using the signal_table, which is initialized at compile time, generate + the signal_names and the sys_siglist (if needed) tables, which are + indexed at runtime by a specific signal value. + +BUGS + + The initialization of the tables may fail under low memory conditions, + in which case we don't do anything particularly useful, but we don't + bomb either. Who knows, it might succeed at a later point if we free + some memory in the meantime. In any case, the other routines know + how to deal with lack of a table after trying to initialize it. This + may or may not be considered to be a bug, that we don't specifically + warn about this particular failure mode. + +*/ + +static void +init_signal_tables (void) +{ + const struct signal_info *eip; + int nbytes; + + /* If we haven't already scanned the signal_table once to find the maximum + signal value, then go find it now. */ + + if (num_signal_names == 0) + { + for (eip = signal_table; eip -> name != NULL; eip++) + { + if (eip -> value >= num_signal_names) + { + num_signal_names = eip -> value + 1; + } + } + } + + /* Now attempt to allocate the signal_names table, zero it out, and then + initialize it from the statically initialized signal_table. */ + + if (signal_names == NULL) + { + nbytes = num_signal_names * sizeof (char *); + if ((signal_names = (const char **) malloc (nbytes)) != NULL) + { + memset (signal_names, 0, nbytes); + for (eip = signal_table; eip -> name != NULL; eip++) + { + signal_names[eip -> value] = eip -> name; + } + } + } + +#ifndef HAVE_SYS_SIGLIST + + /* Now attempt to allocate the sys_siglist table, zero it out, and then + initialize it from the statically initialized signal_table. */ + + if (sys_siglist == NULL) + { + nbytes = num_signal_names * sizeof (char *); + if ((sys_siglist = (const char **) malloc (nbytes)) != NULL) + { + memset (sys_siglist, 0, nbytes); + sys_nsig = num_signal_names; + for (eip = signal_table; eip -> name != NULL; eip++) + { + sys_siglist[eip -> value] = eip -> msg; + } + } + } + +#endif + +} + + +/* + +@deftypefn Extension int signo_max (void) + +Returns the maximum signal value for which a corresponding symbolic +name or message is available. Note that in the case where we use the +@code{sys_siglist} supplied by the system, it is possible for there to +be more symbolic names than messages, or vice versa. In fact, the +manual page for @code{psignal(3b)} explicitly warns that one should +check the size of the table (@code{NSIG}) before indexing it, since +new signal codes may be added to the system before they are added to +the table. Thus @code{NSIG} might be smaller than value implied by +the largest signo value defined in @code{}. + +We return the maximum value that can be used to obtain a meaningful +symbolic name or message. + +@end deftypefn + +*/ + +int +signo_max (void) +{ + int maxsize; + + if (signal_names == NULL) + { + init_signal_tables (); + } + maxsize = MAX (sys_nsig, num_signal_names); + return (maxsize - 1); +} + + +/* + +@deftypefn Supplemental {const char *} strsignal (int @var{signo}) + +Maps an signal number to an signal message string, the contents of +which are implementation defined. On systems which have the external +variable @code{sys_siglist}, these strings will be the same as the +ones used by @code{psignal()}. + +If the supplied signal number is within the valid range of indices for +the @code{sys_siglist}, but no message is available for the particular +signal number, then returns the string @samp{Signal @var{num}}, where +@var{num} is the signal number. + +If the supplied signal number is not a valid index into +@code{sys_siglist}, returns @code{NULL}. + +The returned string is only guaranteed to be valid only until the next +call to @code{strsignal}. + +@end deftypefn + +*/ + +#ifndef HAVE_STRSIGNAL + +const char * +strsignal (int signo) +{ + const char *msg; + static char buf[32]; + +#ifndef HAVE_SYS_SIGLIST + + if (signal_names == NULL) + { + init_signal_tables (); + } + +#endif + + if ((signo < 0) || (signo >= sys_nsig)) + { + /* Out of range, just return NULL */ + msg = NULL; + } + else if ((sys_siglist == NULL) || (sys_siglist[signo] == NULL)) + { + /* In range, but no sys_siglist or no entry at this index. */ + sprintf (buf, "Signal %d", signo); + msg = (const char *) buf; + } + else + { + /* In range, and a valid message. Just return the message. */ + msg = (const char *) sys_siglist[signo]; + } + + return (msg); +} + +#endif /* ! HAVE_STRSIGNAL */ + +/* + +@deftypefn Extension {const char*} strsigno (int @var{signo}) + +Given an signal number, returns a pointer to a string containing the +symbolic name of that signal number, as found in @code{}. + +If the supplied signal number is within the valid range of indices for +symbolic names, but no name is available for the particular signal +number, then returns the string @samp{Signal @var{num}}, where +@var{num} is the signal number. + +If the supplied signal number is not within the range of valid +indices, then returns @code{NULL}. + +The contents of the location pointed to are only guaranteed to be +valid until the next call to @code{strsigno}. + +@end deftypefn + +*/ + +const char * +strsigno (int signo) +{ + const char *name; + static char buf[32]; + + if (signal_names == NULL) + { + init_signal_tables (); + } + + if ((signo < 0) || (signo >= num_signal_names)) + { + /* Out of range, just return NULL */ + name = NULL; + } + else if ((signal_names == NULL) || (signal_names[signo] == NULL)) + { + /* In range, but no signal_names or no entry at this index. */ + sprintf (buf, "Signal %d", signo); + name = (const char *) buf; + } + else + { + /* In range, and a valid name. Just return the name. */ + name = signal_names[signo]; + } + + return (name); +} + + +/* + +@deftypefn Extension int strtosigno (const char *@var{name}) + +Given the symbolic name of a signal, map it to a signal number. If no +translation is found, returns 0. + +@end deftypefn + +*/ + +int +strtosigno (const char *name) +{ + int signo = 0; + + if (name != NULL) + { + if (signal_names == NULL) + { + init_signal_tables (); + } + for (signo = 0; signo < num_signal_names; signo++) + { + if ((signal_names[signo] != NULL) && + (strcmp (name, signal_names[signo]) == 0)) + { + break; + } + } + if (signo == num_signal_names) + { + signo = 0; + } + } + return (signo); +} + + +/* + +@deftypefn Supplemental void psignal (int @var{signo}, char *@var{message}) + +Print @var{message} to the standard error, followed by a colon, +followed by the description of the signal specified by @var{signo}, +followed by a newline. + +@end deftypefn + +*/ + +#ifndef HAVE_PSIGNAL + +void +psignal (int signo, char *message) +{ + if (signal_names == NULL) + { + init_signal_tables (); + } + if ((signo <= 0) || (signo >= sys_nsig)) + { + fprintf (stderr, "%s: unknown signal\n", message); + } + else + { + fprintf (stderr, "%s: %s\n", message, sys_siglist[signo]); + } +} + +#endif /* ! HAVE_PSIGNAL */ + + +/* A simple little main that does nothing but print all the signal translations + if MAIN is defined and this file is compiled and linked. */ + +#ifdef MAIN + +#include + +int +main (void) +{ + int signo; + int maxsigno; + const char *name; + const char *msg; + + maxsigno = signo_max (); + printf ("%d entries in names table.\n", num_signal_names); + printf ("%d entries in messages table.\n", sys_nsig); + printf ("%d is max useful index.\n", maxsigno); + + /* Keep printing values until we get to the end of *both* tables, not + *either* table. Note that knowing the maximum useful index does *not* + relieve us of the responsibility of testing the return pointer for + NULL. */ + + for (signo = 0; signo <= maxsigno; signo++) + { + name = strsigno (signo); + name = (name == NULL) ? "" : name; + msg = strsignal (signo); + msg = (msg == NULL) ? "" : msg; + printf ("%-4d%-18s%s\n", signo, name, msg); + } + + return 0; +} + +#endif diff --git a/libiberty/strstr.c b/libiberty/strstr.c new file mode 100644 index 0000000..60902ea --- /dev/null +++ b/libiberty/strstr.c @@ -0,0 +1,41 @@ +/* Simple implementation of strstr for systems without it. + This function is in the public domain. */ + +/* + +@deftypefn Supplemental char* strstr (const char *@var{string}, const char *@var{sub}) + +This function searches for the substring @var{sub} in the string +@var{string}, not including the terminating null characters. A pointer +to the first occurrence of @var{sub} is returned, or @code{NULL} if the +substring is absent. If @var{sub} points to a string with zero +length, the function returns @var{string}. + +@end deftypefn + + +*/ + + +/* FIXME: The above description is ANSI compiliant. This routine has not + been validated to comply with it. -fnf */ + +#include + +extern char *strchr (const char *, int); +extern int strncmp (const void *, const void *, size_t); +extern size_t strlen (const char *); + +char * +strstr (const char *s1, const char *s2) +{ + const char *p = s1; + const size_t len = strlen (s2); + + for (; (p = strchr (p, *s2)) != 0; p++) + { + if (strncmp (p, s2, len) == 0) + return (char *)p; + } + return (0); +} diff --git a/libiberty/strtod.c b/libiberty/strtod.c new file mode 100644 index 0000000..adbc33b --- /dev/null +++ b/libiberty/strtod.c @@ -0,0 +1,136 @@ +/* Implementation of strtod for systems with atof. + Copyright (C) 1991, 1995, 2002 Free Software Foundation, Inc. + +This file is part of the libiberty library. This library 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 library 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 GNU CC; see the file COPYING. If not, write to +the Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + +As a special exception, if you link this library with files +compiled with a GNU compiler to produce an executable, this does not cause +the resulting executable to be covered by the GNU General Public License. +This exception does not however invalidate any other reasons why +the executable file might be covered by the GNU General Public License. */ + +/* + +@deftypefn Supplemental double strtod (const char *@var{string}, char **@var{endptr}) + +This ISO C function converts the initial portion of @var{string} to a +@code{double}. If @var{endptr} is not @code{NULL}, a pointer to the +character after the last character used in the conversion is stored in +the location referenced by @var{endptr}. If no conversion is +performed, zero is returned and the value of @var{string} is stored in +the location referenced by @var{endptr}. + +@end deftypefn + +*/ + +#include "ansidecl.h" +#include "safe-ctype.h" + +extern double atof (const char *); + +/* Disclaimer: this is currently just used by CHILL in GDB and therefore + has not been tested well. It may have been tested for nothing except + that it compiles. */ + +double +strtod (char *str, char **ptr) +{ + char *p; + + if (ptr == (char **)0) + return atof (str); + + p = str; + + while (ISSPACE (*p)) + ++p; + + if (*p == '+' || *p == '-') + ++p; + + /* INF or INFINITY. */ + if ((p[0] == 'i' || p[0] == 'I') + && (p[1] == 'n' || p[1] == 'N') + && (p[2] == 'f' || p[2] == 'F')) + { + if ((p[3] == 'i' || p[3] == 'I') + && (p[4] == 'n' || p[4] == 'N') + && (p[5] == 'i' || p[5] == 'I') + && (p[6] == 't' || p[6] == 'T') + && (p[7] == 'y' || p[7] == 'Y')) + { + *ptr = p + 8; + return atof (str); + } + else + { + *ptr = p + 3; + return atof (str); + } + } + + /* NAN or NAN(foo). */ + if ((p[0] == 'n' || p[0] == 'N') + && (p[1] == 'a' || p[1] == 'A') + && (p[2] == 'n' || p[2] == 'N')) + { + p += 3; + if (*p == '(') + { + ++p; + while (*p != '\0' && *p != ')') + ++p; + if (*p == ')') + ++p; + } + *ptr = p; + return atof (str); + } + + /* digits, with 0 or 1 periods in it. */ + if (ISDIGIT (*p) || *p == '.') + { + int got_dot = 0; + while (ISDIGIT (*p) || (!got_dot && *p == '.')) + { + if (*p == '.') + got_dot = 1; + ++p; + } + + /* Exponent. */ + if (*p == 'e' || *p == 'E') + { + int i; + i = 1; + if (p[i] == '+' || p[i] == '-') + ++i; + if (ISDIGIT (p[i])) + { + while (ISDIGIT (p[i])) + ++i; + *ptr = p + i; + return atof (str); + } + } + *ptr = p; + return atof (str); + } + /* Didn't find any digits. Doesn't look like a number. */ + *ptr = str; + return 0.0; +} diff --git a/libiberty/strtol.c b/libiberty/strtol.c new file mode 100644 index 0000000..acc7882 --- /dev/null +++ b/libiberty/strtol.c @@ -0,0 +1,163 @@ +/*- + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. [rescinded 22 July 1999] + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + +@deftypefn Supplemental {long int} strtol (const char *@var{string}, char **@var{endptr}, int @var{base}) +@deftypefnx Supplemental {unsigned long int} strtoul (const char *@var{string}, char **@var{endptr}, int @var{base}) + +The @code{strtol} function converts the string in @var{string} to a +long integer value according to the given @var{base}, which must be +between 2 and 36 inclusive, or be the special value 0. If @var{base} +is 0, @code{strtol} will look for the prefixes @code{0} and @code{0x} +to indicate bases 8 and 16, respectively, else default to base 10. +When the base is 16 (either explicitly or implicitly), a prefix of +@code{0x} is allowed. The handling of @var{endptr} is as that of +@code{strtod} above. The @code{strtoul} function is the same, except +that the converted value is unsigned. + +@end deftypefn + +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#ifdef HAVE_LIMITS_H +#include +#endif +#ifdef HAVE_SYS_PARAM_H +#include +#endif +#include +#ifdef NEED_DECLARATION_ERRNO +extern int errno; +#endif +#include "safe-ctype.h" + +/* FIXME: It'd be nice to configure around these, but the include files are too + painful. These macros should at least be more portable than hardwired hex + constants. */ + +#ifndef ULONG_MAX +#define ULONG_MAX ((unsigned long)(~0L)) /* 0xFFFFFFFF */ +#endif + +#ifndef LONG_MAX +#define LONG_MAX ((long)(ULONG_MAX >> 1)) /* 0x7FFFFFFF */ +#endif + +#ifndef LONG_MIN +#define LONG_MIN ((long)(~LONG_MAX)) /* 0x80000000 */ +#endif + +/* + * Convert a string to a long integer. + * + * Ignores `locale' stuff. Assumes that the upper and lower case + * alphabets and digits are each contiguous. + */ +long +strtol(const char *nptr, char **endptr, register int base) +{ + register const char *s = nptr; + register unsigned long acc; + register int c; + register unsigned long cutoff; + register int neg = 0, any, cutlim; + + /* + * Skip white space and pick up leading +/- sign if any. + * If base is 0, allow 0x for hex and 0 for octal, else + * assume decimal; if base is already 16, allow 0x. + */ + do { + c = *s++; + } while (ISSPACE(c)); + if (c == '-') { + neg = 1; + c = *s++; + } else if (c == '+') + c = *s++; + if ((base == 0 || base == 16) && + c == '0' && (*s == 'x' || *s == 'X')) { + c = s[1]; + s += 2; + base = 16; + } + if (base == 0) + base = c == '0' ? 8 : 10; + + /* + * Compute the cutoff value between legal numbers and illegal + * numbers. That is the largest legal value, divided by the + * base. An input number that is greater than this value, if + * followed by a legal input character, is too big. One that + * is equal to this value may be valid or not; the limit + * between valid and invalid numbers is then based on the last + * digit. For instance, if the range for longs is + * [-2147483648..2147483647] and the input base is 10, + * cutoff will be set to 214748364 and cutlim to either + * 7 (neg==0) or 8 (neg==1), meaning that if we have accumulated + * a value > 214748364, or equal but the next digit is > 7 (or 8), + * the number is too big, and we will return a range error. + * + * Set any if any `digits' consumed; make it negative to indicate + * overflow. + */ + cutoff = neg ? -(unsigned long)LONG_MIN : LONG_MAX; + cutlim = cutoff % (unsigned long)base; + cutoff /= (unsigned long)base; + for (acc = 0, any = 0;; c = *s++) { + if (ISDIGIT(c)) + c -= '0'; + else if (ISALPHA(c)) + c -= ISUPPER(c) ? 'A' - 10 : 'a' - 10; + else + break; + if (c >= base) + break; + if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim)) + any = -1; + else { + any = 1; + acc *= base; + acc += c; + } + } + if (any < 0) { + acc = neg ? LONG_MIN : LONG_MAX; + errno = ERANGE; + } else if (neg) + acc = -acc; + if (endptr != 0) + *endptr = (char *) (any ? s - 1 : nptr); + return (acc); +} diff --git a/libiberty/strtoul.c b/libiberty/strtoul.c new file mode 100644 index 0000000..ba80063 --- /dev/null +++ b/libiberty/strtoul.c @@ -0,0 +1,115 @@ +/* + * Copyright (c) 1990 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. [rescinded 22 July 1999] + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#ifdef HAVE_LIMITS_H +#include +#endif +#ifdef HAVE_SYS_PARAM_H +#include +#endif +#include +#ifdef NEED_DECLARATION_ERRNO +extern int errno; +#endif +#if 0 +#include +#endif +#include "ansidecl.h" +#include "safe-ctype.h" + +#ifndef ULONG_MAX +#define ULONG_MAX ((unsigned long)(~0L)) /* 0xFFFFFFFF */ +#endif + +/* + * Convert a string to an unsigned long integer. + * + * Ignores `locale' stuff. Assumes that the upper and lower case + * alphabets and digits are each contiguous. + */ +unsigned long +strtoul(const char *nptr, char **endptr, register int base) +{ + register const char *s = nptr; + register unsigned long acc; + register int c; + register unsigned long cutoff; + register int neg = 0, any, cutlim; + + /* + * See strtol for comments as to the logic used. + */ + do { + c = *s++; + } while (ISSPACE(c)); + if (c == '-') { + neg = 1; + c = *s++; + } else if (c == '+') + c = *s++; + if ((base == 0 || base == 16) && + c == '0' && (*s == 'x' || *s == 'X')) { + c = s[1]; + s += 2; + base = 16; + } + if (base == 0) + base = c == '0' ? 8 : 10; + cutoff = (unsigned long)ULONG_MAX / (unsigned long)base; + cutlim = (unsigned long)ULONG_MAX % (unsigned long)base; + for (acc = 0, any = 0;; c = *s++) { + if (ISDIGIT(c)) + c -= '0'; + else if (ISALPHA(c)) + c -= ISUPPER(c) ? 'A' - 10 : 'a' - 10; + else + break; + if (c >= base) + break; + if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim)) + any = -1; + else { + any = 1; + acc *= base; + acc += c; + } + } + if (any < 0) { + acc = ULONG_MAX; + errno = ERANGE; + } else if (neg) + acc = -acc; + if (endptr != 0) + *endptr = (char *) (any ? s - 1 : nptr); + return (acc); +} diff --git a/libiberty/strverscmp.c b/libiberty/strverscmp.c new file mode 100644 index 0000000..04e1e4a --- /dev/null +++ b/libiberty/strverscmp.c @@ -0,0 +1,157 @@ +/* Compare strings while treating digits characters numerically. + Copyright (C) 1997, 2002, 2005 Free Software Foundation, Inc. + This file is part of the libiberty library. + Contributed by Jean-François Bignolles , 1997. + + Libiberty is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + Libiberty 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA. */ + +#include "libiberty.h" +#include "safe-ctype.h" + +/* +@deftypefun int strverscmp (const char *@var{s1}, const char *@var{s2}) +The @code{strverscmp} function compares the string @var{s1} against +@var{s2}, considering them as holding indices/version numbers. Return +value follows the same conventions as found in the @code{strverscmp} +function. In fact, if @var{s1} and @var{s2} contain no digits, +@code{strverscmp} behaves like @code{strcmp}. + +Basically, we compare strings normally (character by character), until +we find a digit in each string - then we enter a special comparison +mode, where each sequence of digits is taken as a whole. If we reach the +end of these two parts without noticing a difference, we return to the +standard comparison mode. There are two types of numeric parts: +"integral" and "fractional" (those begin with a '0'). The types +of the numeric parts affect the way we sort them: + +@itemize @bullet +@item +integral/integral: we compare values as you would expect. + +@item +fractional/integral: the fractional part is less than the integral one. +Again, no surprise. + +@item +fractional/fractional: the things become a bit more complex. +If the common prefix contains only leading zeroes, the longest part is less +than the other one; else the comparison behaves normally. +@end itemize + +@smallexample +strverscmp ("no digit", "no digit") + @result{} 0 // @r{same behavior as strcmp.} +strverscmp ("item#99", "item#100") + @result{} <0 // @r{same prefix, but 99 < 100.} +strverscmp ("alpha1", "alpha001") + @result{} >0 // @r{fractional part inferior to integral one.} +strverscmp ("part1_f012", "part1_f01") + @result{} >0 // @r{two fractional parts.} +strverscmp ("foo.009", "foo.0") + @result{} <0 // @r{idem, but with leading zeroes only.} +@end smallexample + +This function is especially useful when dealing with filename sorting, +because filenames frequently hold indices/version numbers. +@end deftypefun + +*/ + +/* states: S_N: normal, S_I: comparing integral part, S_F: comparing + fractional parts, S_Z: idem but with leading Zeroes only */ +#define S_N 0x0 +#define S_I 0x4 +#define S_F 0x8 +#define S_Z 0xC + +/* result_type: CMP: return diff; LEN: compare using len_diff/diff */ +#define CMP 2 +#define LEN 3 + + +/* Compare S1 and S2 as strings holding indices/version numbers, + returning less than, equal to or greater than zero if S1 is less than, + equal to or greater than S2 (for more info, see the Glibc texinfo doc). */ + +int +strverscmp (const char *s1, const char *s2) +{ + const unsigned char *p1 = (const unsigned char *) s1; + const unsigned char *p2 = (const unsigned char *) s2; + unsigned char c1, c2; + int state; + int diff; + + /* Symbol(s) 0 [1-9] others (padding) + Transition (10) 0 (01) d (00) x (11) - */ + static const unsigned int next_state[] = + { + /* state x d 0 - */ + /* S_N */ S_N, S_I, S_Z, S_N, + /* S_I */ S_N, S_I, S_I, S_I, + /* S_F */ S_N, S_F, S_F, S_F, + /* S_Z */ S_N, S_F, S_Z, S_Z + }; + + static const int result_type[] = + { + /* state x/x x/d x/0 x/- d/x d/d d/0 d/- + 0/x 0/d 0/0 0/- -/x -/d -/0 -/- */ + + /* S_N */ CMP, CMP, CMP, CMP, CMP, LEN, CMP, CMP, + CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP, + /* S_I */ CMP, -1, -1, CMP, +1, LEN, LEN, CMP, + +1, LEN, LEN, CMP, CMP, CMP, CMP, CMP, + /* S_F */ CMP, CMP, CMP, CMP, CMP, LEN, CMP, CMP, + CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP, + /* S_Z */ CMP, +1, +1, CMP, -1, CMP, CMP, CMP, + -1, CMP, CMP, CMP + }; + + if (p1 == p2) + return 0; + + c1 = *p1++; + c2 = *p2++; + /* Hint: '0' is a digit too. */ + state = S_N | ((c1 == '0') + (ISDIGIT (c1) != 0)); + + while ((diff = c1 - c2) == 0 && c1 != '\0') + { + state = next_state[state]; + c1 = *p1++; + c2 = *p2++; + state |= (c1 == '0') + (ISDIGIT (c1) != 0); + } + + state = result_type[state << 2 | (((c2 == '0') + (ISDIGIT (c2) != 0)))]; + + switch (state) + { + case CMP: + return diff; + + case LEN: + while (ISDIGIT (*p1++)) + if (!ISDIGIT (*p2++)) + return 1; + + return ISDIGIT (*p2) ? -1 : diff; + + default: + return state; + } +} diff --git a/libiberty/tmpnam.c b/libiberty/tmpnam.c new file mode 100644 index 0000000..cc34333 --- /dev/null +++ b/libiberty/tmpnam.c @@ -0,0 +1,52 @@ +/* + +@deftypefn Supplemental char* tmpnam (char *@var{s}) + +This function attempts to create a name for a temporary file, which +will be a valid file name yet not exist when @code{tmpnam} checks for +it. @var{s} must point to a buffer of at least @code{L_tmpnam} bytes, +or be @code{NULL}. Use of this function creates a security risk, and it must +not be used in new projects. Use @code{mkstemp} instead. + +@end deftypefn + +*/ + +#include + +#ifndef L_tmpnam +#define L_tmpnam 100 +#endif +#ifndef P_tmpdir +#define P_tmpdir "/usr/tmp" +#endif + +static char tmpnam_buffer[L_tmpnam]; +static int tmpnam_counter; + +extern int getpid (void); + +char * +tmpnam (char *s) +{ + int pid = getpid (); + + if (s == NULL) + s = tmpnam_buffer; + + /* Generate the filename and make sure that there isn't one called + it already. */ + + while (1) + { + FILE *f; + sprintf (s, "%s/%s%x.%x", P_tmpdir, "t", pid, tmpnam_counter); + f = fopen (s, "r"); + if (f == NULL) + break; + tmpnam_counter++; + fclose (f); + } + + return s; +} diff --git a/libiberty/unlink-if-ordinary.c b/libiberty/unlink-if-ordinary.c new file mode 100644 index 0000000..c03b4dd --- /dev/null +++ b/libiberty/unlink-if-ordinary.c @@ -0,0 +1,72 @@ +/* unlink-if-ordinary.c - remove link to a file unless it is special + Copyright (C) 2004, 2005 Free Software Foundation, Inc. + +This file is part of the libiberty library. This library 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 library 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 GNU CC; see the file COPYING. If not, write to +the Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + +As a special exception, if you link this library with files +compiled with a GNU compiler to produce an executable, this does not cause +the resulting executable to be covered by the GNU General Public License. +This exception does not however invalidate any other reasons why +the executable file might be covered by the GNU General Public License. */ + +/* + +@deftypefn Supplemental int unlink_if_ordinary (const char*) + +Unlinks the named file, unless it is special (e.g. a device file). +Returns 0 when the file was unlinked, a negative value (and errno set) when +there was an error deleting the file, and a positive value if no attempt +was made to unlink the file because it is special. + +@end deftypefn + +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#ifdef HAVE_UNISTD_H +#include +#endif +#if HAVE_SYS_STAT_H +#include +#endif + +#include "libiberty.h" + +#ifndef S_ISLNK +#ifdef S_IFLNK +#define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK) +#else +#define S_ISLNK(m) 0 +#define lstat stat +#endif +#endif + +int +unlink_if_ordinary (const char *name) +{ + struct stat st; + + if (lstat (name, &st) == 0 + && (S_ISREG (st.st_mode) || S_ISLNK (st.st_mode))) + return unlink (name); + + return 1; +} diff --git a/libiberty/vasprintf.c b/libiberty/vasprintf.c new file mode 100644 index 0000000..b6cb94e --- /dev/null +++ b/libiberty/vasprintf.c @@ -0,0 +1,196 @@ +/* Like vsprintf but provides a pointer to malloc'd storage, which must + be freed by the caller. + Copyright (C) 1994, 2003 Free Software Foundation, Inc. + +This file is part of the libiberty library. +Libiberty is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +Libiberty 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with libiberty; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include +#include +#if !defined (va_copy) && defined (__va_copy) +# define va_copy(d,s) __va_copy((d),(s)) +#endif +#include +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#else +extern unsigned long strtoul (); +extern PTR malloc (); +#endif +#include "libiberty.h" + +#ifdef TEST +int global_total_width; +#endif + +/* + +@deftypefn Extension int vasprintf (char **@var{resptr}, const char *@var{format}, va_list @var{args}) + +Like @code{vsprintf}, but instead of passing a pointer to a buffer, +you pass a pointer to a pointer. This function will compute the size +of the buffer needed, allocate memory with @code{malloc}, and store a +pointer to the allocated memory in @code{*@var{resptr}}. The value +returned is the same as @code{vsprintf} would return. If memory could +not be allocated, minus one is returned and @code{NULL} is stored in +@code{*@var{resptr}}. + +@end deftypefn + +*/ + +static int int_vasprintf (char **, const char *, va_list); + +static int +int_vasprintf (char **result, const char *format, va_list args) +{ + const char *p = format; + /* Add one to make sure that it is never zero, which might cause malloc + to return NULL. */ + int total_width = strlen (format) + 1; + va_list ap; + +#ifdef va_copy + va_copy (ap, args); +#else + memcpy ((PTR) &ap, (PTR) &args, sizeof (va_list)); +#endif + + while (*p != '\0') + { + if (*p++ == '%') + { + while (strchr ("-+ #0", *p)) + ++p; + if (*p == '*') + { + ++p; + total_width += abs (va_arg (ap, int)); + } + else + total_width += strtoul (p, (char **) &p, 10); + if (*p == '.') + { + ++p; + if (*p == '*') + { + ++p; + total_width += abs (va_arg (ap, int)); + } + else + total_width += strtoul (p, (char **) &p, 10); + } + while (strchr ("hlL", *p)) + ++p; + /* Should be big enough for any format specifier except %s and floats. */ + total_width += 30; + switch (*p) + { + case 'd': + case 'i': + case 'o': + case 'u': + case 'x': + case 'X': + case 'c': + (void) va_arg (ap, int); + break; + case 'f': + case 'e': + case 'E': + case 'g': + case 'G': + (void) va_arg (ap, double); + /* Since an ieee double can have an exponent of 307, we'll + make the buffer wide enough to cover the gross case. */ + total_width += 307; + break; + case 's': + total_width += strlen (va_arg (ap, char *)); + break; + case 'p': + case 'n': + (void) va_arg (ap, char *); + break; + } + p++; + } + } +#ifdef va_copy + va_end (ap); +#endif +#ifdef TEST + global_total_width = total_width; +#endif + *result = (char *) malloc (total_width); + if (*result != NULL) + return vsprintf (*result, format, args); + else + return -1; +} + +int +vasprintf (char **result, const char *format, +#if defined (_BSD_VA_LIST_) && defined (__FreeBSD__) + _BSD_VA_LIST_ args) +#else + va_list args) +#endif +{ + return int_vasprintf (result, format, args); +} + +#ifdef TEST +static void ATTRIBUTE_PRINTF_1 +checkit (const char *format, ...) +{ + char *result; + VA_OPEN (args, format); + VA_FIXEDARG (args, const char *, format); + vasprintf (&result, format, args); + VA_CLOSE (args); + + if (strlen (result) < (size_t) global_total_width) + printf ("PASS: "); + else + printf ("FAIL: "); + printf ("%d %s\n", global_total_width, result); + + free (result); +} + +extern int main (void); + +int +main (void) +{ + checkit ("%d", 0x12345678); + checkit ("%200d", 5); + checkit ("%.300d", 6); + checkit ("%100.150d", 7); + checkit ("%s", "jjjjjjjjjiiiiiiiiiiiiiiioooooooooooooooooppppppppppppaa\n\ +777777777777777777333333333333366666666666622222222222777777777777733333"); + checkit ("%f%s%d%s", 1.0, "foo", 77, "asdjffffffffffffffiiiiiiiiiiixxxxx"); + + return 0; +} +#endif /* TEST */ diff --git a/libiberty/vfork.c b/libiberty/vfork.c new file mode 100644 index 0000000..eb4ff62 --- /dev/null +++ b/libiberty/vfork.c @@ -0,0 +1,22 @@ +/* Emulate vfork using just plain fork, for systems without a real vfork. + This function is in the public domain. */ + +/* + +@deftypefn Supplemental int vfork (void) + +Emulates @code{vfork} by calling @code{fork} and returning its value. + +@end deftypefn + +*/ + +#include "ansidecl.h" + +extern int fork (void); + +int +vfork (void) +{ + return (fork ()); +} diff --git a/libiberty/vfprintf.c b/libiberty/vfprintf.c new file mode 100644 index 0000000..9bd3ed5 --- /dev/null +++ b/libiberty/vfprintf.c @@ -0,0 +1,15 @@ +/* Provide a version vfprintf in terms of _doprnt. + By Kaveh Ghazi (ghazi@caip.rutgers.edu) 3/29/98 + Copyright (C) 1998 Free Software Foundation, Inc. + */ + +#include "ansidecl.h" +#include +#include +#undef vfprintf + +int +vfprintf (FILE *stream, const char *format, va_list ap) +{ + return _doprnt (format, ap, stream); +} diff --git a/libiberty/vmsbuild.com b/libiberty/vmsbuild.com new file mode 100644 index 0000000..497ea89 --- /dev/null +++ b/libiberty/vmsbuild.com @@ -0,0 +1,165 @@ +$! libiberty/vmsbuild.com -- build liberty.olb for VMS host, VMS target +$! +$ CC = "gcc /noVerbose/Debug/Incl=([],[-.include])" +$ LIBR = "library /Obj" +$ LINK = "link" +$ DELETE= "delete /noConfirm" +$ SEARCH= "search /Exact" +$ ECHO = "write sys$output" +$ ABORT = "exit %x002C" +$! +$ LIB_NAME = "liberty.olb" !this is what we're going to construct +$ WORK_LIB = "new-lib.olb" !used to guard against an incomplete build +$ +$! manually copied from Makefile.in +$ REQUIRED_OFILES = "argv.o basename.o choose-temp.o concat.o cplus-dem.o "- + + "fdmatch.o fnmatch.o getopt.o getopt1.o getruntime.o hex.o "- + + "floatformat.o objalloc.o obstack.o spaces.o strerror.o strsignal.o "- + + "xatexit.o xexit.o xmalloc.o xmemdup.o xstrdup.o xstrerror.o" +$! anything not caught by link+search of dummy.* should be added here +$ EXTRA_OFILES = "" +$! +$! move to the directory which contains this command procedure +$ old_dir = f$environ("DEFAULT") +$ new_dir = f$parse("_._;",f$environ("PROCEDURE")) - "_._;" +$ set default 'new_dir' +$ +$ ECHO "Starting libiberty build..." +$ create config.h +/* libiberty config.h for VMS */ +#define NEED_sys_siglist +#define NEED_strsignal +#define NEED_psignal +#define NEED_basename +$ LIBR 'WORK_LIB' /Create +$ +$! first pass: compile "required" modules +$ ofiles = REQUIRED_OFILES + " " + EXTRA_OFILES +$ pass = 1 +$ gosub do_ofiles +$ +$! second pass: process dummy.c, using the first pass' results +$ ECHO " now checking run-time library for missing functionality" +$ if f$search("dummy.obj").nes."" then DELETE dummy.obj;* +$ define/noLog sys$error _NL: !can't use /User_Mode here due to gcc +$ define/noLog sys$output _NL: ! driver's use of multiple image activation +$ on error then continue +$ 'CC' dummy.c +$ deassign sys$error !restore, more or less +$ deassign sys$output +$ if f$search("dummy.obj").eqs."" then goto pass2_failure1 +$! link dummy.obj, capturing full linker feedback in dummy.map +$ oldmsg = f$environ("MESSAGE") +$ set message /Facility/Severity/Identification/Text +$ define/User sys$output _NL: +$ define/User sys$error _NL: +$ LINK/Map=dummy.map/noExe dummy.obj,'WORK_LIB'/Libr,- + gnu_cc:[000000]gcclib.olb/Libr,sys$library:vaxcrtl.olb/Libr +$ set message 'oldmsg' +$ if f$search("dummy.map").eqs."" then goto pass2_failure2 +$ DELETE dummy.obj;* +$ SEARCH dummy.map "%LINK-I-UDFSYM" /Output=dummy.list +$ DELETE dummy.map;* +$ ECHO " check completed" +$! we now have a file with one entry per line of unresolvable symbols +$ ofiles = "" +$ if f$trnlnm("IFILE$").nes."" then close/noLog ifile$ +$ open/Read ifile$ dummy.list +$iloop: read/End=idone ifile$ iline +$ iline = f$edit(iline,"COMPRESS,TRIM,LOWERCASE") +$ ofiles = ofiles + " " + f$element(1," ",iline) + ".o" +$ goto iloop +$idone: close ifile$ +$ DELETE dummy.list;* +$ on error then ABORT +$ +$! third pass: compile "missing" modules collected in pass 2 +$ pass = 3 +$ gosub do_ofiles +$ +$! finish up +$ LIBR 'WORK_LIB' /Compress /Output='LIB_NAME' !new-lib.olb -> liberty.olb +$ DELETE 'WORK_LIB';* +$ +$! all done +$ ECHO "Completed libiberty build." +$ type sys$input: + + You many wish to do + $ COPY LIBERTY.OLB GNU_CC:[000000] + so that this run-time library resides in the same location as gcc's + support library. When building gas, be sure to leave the original + copy of liberty.olb here so that gas's build procedure can find it. + +$ set default 'old_dir' +$ exit +$ +$! +$! compile each element of the space-delimited list 'ofiles' +$! +$do_ofiles: +$ ofiles = f$edit(ofiles,"COMPRESS,TRIM") +$ i = 0 +$oloop: +$ f = f$element(i," ",ofiles) +$ if f.eqs." " then goto odone +$ f = f - ".o" !strip dummy suffix +$ ECHO " ''f'" +$ skip_f = 0 +$ if pass.eq.3 .and. f$search("''f'.c").eqs."" then gosub chk_deffunc +$ if .not.skip_f +$ then +$ 'CC' 'f'.c +$ LIBR 'WORK_LIB' 'f'.obj /Insert +$ DELETE 'f'.obj;* +$ endif +$ i = i + 1 +$ goto oloop +$odone: +$ return +$ +$! +$! check functions.def for a DEFFUNC() entry corresponding to missing file 'f'.c +$! +$chk_deffunc: +$ define/User sys$output _NL: +$ define/User sys$error _NL: +$ SEARCH functions.def "DEFFUNC","''f'" /Match=AND +$ if (($status.and.%x7FFFFFFF) .eq. 1) +$ then +$ skip_f = 1 +$ open/Append config_h config.h +$ write config_h "#define NEED_''f'" +$ close config_h +$ endif +$ return +$ +$! +$pass2_failure1: +$! if we reach here, dummy.c failed to compile and we're really stuck +$ type sys$input: + + Cannot compile the library contents checker (dummy.c + functions.def), + so cannot continue! + +$! attempt the compile again, without suppressing diagnostic messages this time +$ on error then ABORT +0*f$verify(v) +$ v = f$verify(1) +$ 'CC' dummy.c +$ ABORT +0*f$verify(v) !'f$verify(0)' +$! +$pass2_failure2: +$! should never reach here.. +$ type sys$input: + + Cannot link the library contents checker (dummy.obj), so cannot continue! + +$! attempt the link again, without suppressing diagnostic messages this time +$ on error then ABORT +0*f$verify(v) +$ v = f$verify(1) +$ LINK/Map=dummy.map/noExe dummy.obj,'WORK_LIB'/Libr,- + gnu_cc:[000000]gcclib.olb/Libr,sys$library:vaxcrtl.olb/Libr +$ ABORT +0*f$verify(v) !'f$verify(0)' +$ +$! not reached +$ exit diff --git a/libiberty/vprintf.c b/libiberty/vprintf.c new file mode 100644 index 0000000..c255316 --- /dev/null +++ b/libiberty/vprintf.c @@ -0,0 +1,26 @@ +/* + +@deftypefn Supplemental int vprintf (const char *@var{format}, va_list @var{ap}) +@deftypefnx Supplemental int vfprintf (FILE *@var{stream}, const char *@var{format}, va_list @var{ap}) +@deftypefnx Supplemental int vsprintf (char *@var{str}, const char *@var{format}, va_list @var{ap}) + +These functions are the same as @code{printf}, @code{fprintf}, and +@code{sprintf}, respectively, except that they are called with a +@code{va_list} instead of a variable number of arguments. Note that +they do not call @code{va_end}; this is the application's +responsibility. In @libib{} they are implemented in terms of the +nonstandard but common function @code{_doprnt}. + +@end deftypefn + +*/ + +#include +#include +#include +#undef vprintf +int +vprintf (const char *format, va_list ap) +{ + return vfprintf (stdout, format, ap); +} diff --git a/libiberty/vsnprintf.c b/libiberty/vsnprintf.c new file mode 100644 index 0000000..7df5bd8 --- /dev/null +++ b/libiberty/vsnprintf.c @@ -0,0 +1,145 @@ +/* Implement the vsnprintf function. + Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc. + Written by Kaveh R. Ghazi . + +This file is part of the libiberty library. This library 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 library 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 GNU CC; see the file COPYING. If not, write to +the Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + +As a special exception, if you link this library with files +compiled with a GNU compiler to produce an executable, this does not cause +the resulting executable to be covered by the GNU General Public License. +This exception does not however invalidate any other reasons why +the executable file might be covered by the GNU General Public License. */ + +/* + +@deftypefn Supplemental int vsnprintf (char *@var{buf}, size_t @var{n}, const char *@var{format}, va_list @var{ap}) + +This function is similar to vsprintf, but it will print at most +@var{n} characters. On error the return value is -1, otherwise it +returns the number of characters that would have been printed had +@var{n} been sufficiently large, regardless of the actual value of +@var{n}. Note some pre-C99 system libraries do not implement this +correctly so users cannot generally rely on the return value if the +system version of this function is used. + +@end deftypefn + +*/ + +#include "config.h" +#include "ansidecl.h" + +#include +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif + +#include "libiberty.h" + +/* This implementation relies on a working vasprintf. */ +int +vsnprintf (char *s, size_t n, const char *format, va_list ap) +{ + char *buf = 0; + int result = vasprintf (&buf, format, ap); + + if (!buf) + return -1; + if (result < 0) + { + free (buf); + return -1; + } + + result = strlen (buf); + if (n > 0) + { + if ((long) n > result) + memcpy (s, buf, result+1); + else + { + memcpy (s, buf, n-1); + s[n - 1] = 0; + } + } + free (buf); + return result; +} + +#ifdef TEST +/* Set the buffer to a known state. */ +#define CLEAR(BUF) do { memset ((BUF), 'X', sizeof (BUF)); (BUF)[14] = '\0'; } while (0) +/* For assertions. */ +#define VERIFY(P) do { if (!(P)) abort(); } while (0) + +static int ATTRIBUTE_PRINTF_3 +checkit (char *s, size_t n, const char *format, ...) +{ + int result; + VA_OPEN (ap, format); + VA_FIXEDARG (ap, char *, s); + VA_FIXEDARG (ap, size_t, n); + VA_FIXEDARG (ap, const char *, format); + result = vsnprintf (s, n, format, ap); + VA_CLOSE (ap); + return result; +} + +extern int main (void); +int +main (void) +{ + char buf[128]; + int status; + + CLEAR (buf); + status = checkit (buf, 10, "%s:%d", "foobar", 9); + VERIFY (status==8 && memcmp (buf, "foobar:9\0XXXXX\0", 15) == 0); + + CLEAR (buf); + status = checkit (buf, 9, "%s:%d", "foobar", 9); + VERIFY (status==8 && memcmp (buf, "foobar:9\0XXXXX\0", 15) == 0); + + CLEAR (buf); + status = checkit (buf, 8, "%s:%d", "foobar", 9); + VERIFY (status==8 && memcmp (buf, "foobar:\0XXXXXX\0", 15) == 0); + + CLEAR (buf); + status = checkit (buf, 7, "%s:%d", "foobar", 9); + VERIFY (status==8 && memcmp (buf, "foobar\0XXXXXXX\0", 15) == 0); + + CLEAR (buf); + status = checkit (buf, 6, "%s:%d", "foobar", 9); + VERIFY (status==8 && memcmp (buf, "fooba\0XXXXXXXX\0", 15) == 0); + + CLEAR (buf); + status = checkit (buf, 2, "%s:%d", "foobar", 9); + VERIFY (status==8 && memcmp (buf, "f\0XXXXXXXXXXXX\0", 15) == 0); + + CLEAR (buf); + status = checkit (buf, 1, "%s:%d", "foobar", 9); + VERIFY (status==8 && memcmp (buf, "\0XXXXXXXXXXXXX\0", 15) == 0); + + CLEAR (buf); + status = checkit (buf, 0, "%s:%d", "foobar", 9); + VERIFY (status==8 && memcmp (buf, "XXXXXXXXXXXXXX\0", 15) == 0); + + return 0; +} +#endif /* TEST */ diff --git a/libiberty/vsprintf.c b/libiberty/vsprintf.c new file mode 100644 index 0000000..99e7044 --- /dev/null +++ b/libiberty/vsprintf.c @@ -0,0 +1,56 @@ +/* Simple implementation of vsprintf for systems without it. + Highly system-dependent, but should work on most "traditional" + implementations of stdio; newer ones should already have vsprintf. + Written by Per Bothner of Cygnus Support. + Based on libg++'s "form" (written by Doug Lea; dl@rocky.oswego.edu). + Copyright (C) 1991, 1995, 2002 Free Software Foundation, Inc. + +This file is part of the libiberty library. This library 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 library 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 GNU CC; see the file COPYING. If not, write to +the Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + +As a special exception, if you link this library with files +compiled with a GNU compiler to produce an executable, this does not cause +the resulting executable to be covered by the GNU General Public License. +This exception does not however invalidate any other reasons why +the executable file might be covered by the GNU General Public License. */ + +#include +#include +#include +#undef vsprintf + +#if defined _IOSTRG && defined _IOWRT + +int +vsprintf (char *buf, const char *format, va_list ap) +{ + FILE b; + int ret; +#ifdef VMS + b->_flag = _IOWRT|_IOSTRG; + b->_ptr = buf; + b->_cnt = 12000; +#else + b._flag = _IOWRT|_IOSTRG; + b._ptr = buf; + b._cnt = 12000; +#endif + ret = _doprnt(format, ap, &b); + putc('\0', &b); + return ret; + +} + +#endif diff --git a/libiberty/waitpid.c b/libiberty/waitpid.c new file mode 100644 index 0000000..fd519d7 --- /dev/null +++ b/libiberty/waitpid.c @@ -0,0 +1,35 @@ +/* + +@deftypefn Supplemental int waitpid (int @var{pid}, int *@var{status}, int) + +This is a wrapper around the @code{wait} function. Any ``special'' +values of @var{pid} depend on your implementation of @code{wait}, as +does the return value. The third argument is unused in @libib{}. + +@end deftypefn + +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include "ansidecl.h" + +/* On some systems (such as WindISS), you must include + to get the definition of "pid_t" before you include . */ +#include + +#ifdef HAVE_SYS_WAIT_H +#include +#endif + +pid_t +waitpid (pid_t pid, int *stat_loc, int options ATTRIBUTE_UNUSED) +{ + for (;;) + { + int wpid = wait(stat_loc); + if (wpid == pid || wpid == -1) + return wpid; + } +} diff --git a/libiberty/xatexit.c b/libiberty/xatexit.c new file mode 100644 index 0000000..6fdad9e --- /dev/null +++ b/libiberty/xatexit.c @@ -0,0 +1,99 @@ +/* + * Copyright (c) 1990 Regents of the University of California. + * All rights reserved. + * + * %sccs.include.redist.c% + */ + + +/* + +@deftypefun int xatexit (void (*@var{fn}) (void)) + +Behaves as the standard @code{atexit} function, but with no limit on +the number of registered functions. Returns 0 on success, or @minus{}1 on +failure. If you use @code{xatexit} to register functions, you must use +@code{xexit} to terminate your program. + +@end deftypefun + +*/ + +/* Adapted from newlib/libc/stdlib/{,at}exit.[ch]. + If you use xatexit, you must call xexit instead of exit. */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include "ansidecl.h" +#include "libiberty.h" + +#include + +#include + +#if VMS +#include +#include +#else +/* For systems with larger pointers than ints, this must be declared. */ +PTR malloc (size_t); +#endif + +static void xatexit_cleanup (void); + +/* Pointer to function run by xexit. */ +extern void (*_xexit_cleanup) (void); + +#define XATEXIT_SIZE 32 + +struct xatexit { + struct xatexit *next; /* next in list */ + int ind; /* next index in this table */ + void (*fns[XATEXIT_SIZE]) (void); /* the table itself */ +}; + +/* Allocate one struct statically to guarantee that we can register + at least a few handlers. */ +static struct xatexit xatexit_first; + +/* Points to head of LIFO stack. */ +static struct xatexit *xatexit_head = &xatexit_first; + +/* Register function FN to be run by xexit. + Return 0 if successful, -1 if not. */ + +int +xatexit (void (*fn) (void)) +{ + register struct xatexit *p; + + /* Tell xexit to call xatexit_cleanup. */ + if (!_xexit_cleanup) + _xexit_cleanup = xatexit_cleanup; + + p = xatexit_head; + if (p->ind >= XATEXIT_SIZE) + { + if ((p = (struct xatexit *) malloc (sizeof *p)) == NULL) + return -1; + p->ind = 0; + p->next = xatexit_head; + xatexit_head = p; + } + p->fns[p->ind++] = fn; + return 0; +} + +/* Call any cleanup functions. */ + +static void +xatexit_cleanup (void) +{ + register struct xatexit *p; + register int n; + + for (p = xatexit_head; p; p = p->next) + for (n = p->ind; --n >= 0;) + (*p->fns[n]) (); +} diff --git a/libiberty/xexit.c b/libiberty/xexit.c new file mode 100644 index 0000000..421e5e2 --- /dev/null +++ b/libiberty/xexit.c @@ -0,0 +1,52 @@ +/* xexit.c -- Run any exit handlers, then exit. + Copyright (C) 1994, 95, 1997 Free Software Foundation, Inc. + +This file is part of the libiberty library. +Libiberty is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +Libiberty 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with libiberty; see the file COPYING.LIB. If not, write +to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +/* + +@deftypefn Replacement void xexit (int @var{code}) + +Terminates the program. If any functions have been registered with +the @code{xatexit} replacement function, they will be called first. +Termination is handled via the system's normal @code{exit} call. + +@end deftypefn + +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include +#ifdef HAVE_STDLIB_H +#include +#endif +#include "libiberty.h" + + +/* This variable is set by xatexit if it is called. This way, xmalloc + doesn't drag xatexit into the link. */ +void (*_xexit_cleanup) (void); + +void +xexit (int code) +{ + if (_xexit_cleanup != NULL) + (*_xexit_cleanup) (); + exit (code); +} diff --git a/libiberty/xmalloc.c b/libiberty/xmalloc.c new file mode 100644 index 0000000..3e97aab --- /dev/null +++ b/libiberty/xmalloc.c @@ -0,0 +1,184 @@ +/* memory allocation routines with error checking. + Copyright 1989, 90, 91, 92, 93, 94 Free Software Foundation, Inc. + +This file is part of the libiberty library. +Libiberty is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +Libiberty 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with libiberty; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +/* + +@deftypefn Replacement void* xmalloc (size_t) + +Allocate memory without fail. If @code{malloc} fails, this will print +a message to @code{stderr} (using the name set by +@code{xmalloc_set_program_name}, +if any) and then call @code{xexit}. Note that it is therefore safe for +a program to contain @code{#define malloc xmalloc} in its source. + +@end deftypefn + +@deftypefn Replacement void* xrealloc (void *@var{ptr}, size_t @var{size}) +Reallocate memory without fail. This routine functions like @code{realloc}, +but will behave the same as @code{xmalloc} if memory cannot be found. + +@end deftypefn + +@deftypefn Replacement void* xcalloc (size_t @var{nelem}, size_t @var{elsize}) + +Allocate memory without fail, and set it to zero. This routine functions +like @code{calloc}, but will behave the same as @code{xmalloc} if memory +cannot be found. + +@end deftypefn + +@deftypefn Replacement void xmalloc_set_program_name (const char *@var{name}) + +You can use this to set the name of the program used by +@code{xmalloc_failed} when printing a failure message. + +@end deftypefn + +@deftypefn Replacement void xmalloc_failed (size_t) + +This function is not meant to be called by client code, and is listed +here for completeness only. If any of the allocation routines fail, this +function will be called to print an error message and terminate execution. + +@end deftypefn + +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include "ansidecl.h" +#include "libiberty.h" + +#include + +#include + +#if VMS +#include +#include +#else +/* For systems with larger pointers than ints, these must be declared. */ +# if HAVE_STDLIB_H && HAVE_UNISTD_H && HAVE_DECL_MALLOC \ + && HAVE_DECL_REALLOC && HAVE_DECL_CALLOC && HAVE_DECL_SBRK +# include +# include +# else +# ifdef __cplusplus +extern "C" { +# endif /* __cplusplus */ +void *malloc (size_t); +void *realloc (void *, size_t); +void *calloc (size_t, size_t); +void *sbrk (ptrdiff_t); +# ifdef __cplusplus +} +# endif /* __cplusplus */ +# endif /* HAVE_STDLIB_H ... */ +#endif /* VMS */ + +/* The program name if set. */ +static const char *name = ""; + +#ifdef HAVE_SBRK +/* The initial sbrk, set when the program name is set. Not used for win32 + ports other than cygwin32. */ +static char *first_break = NULL; +#endif /* HAVE_SBRK */ + +void +xmalloc_set_program_name (const char *s) +{ + name = s; +#ifdef HAVE_SBRK + /* Win32 ports other than cygwin32 don't have brk() */ + if (first_break == NULL) + first_break = (char *) sbrk (0); +#endif /* HAVE_SBRK */ +} + +void +xmalloc_failed (size_t size) +{ +#ifdef HAVE_SBRK + extern char **environ; + size_t allocated; + + if (first_break != NULL) + allocated = (char *) sbrk (0) - first_break; + else + allocated = (char *) sbrk (0) - (char *) &environ; + fprintf (stderr, + "\n%s%sout of memory allocating %lu bytes after a total of %lu bytes\n", + name, *name ? ": " : "", + (unsigned long) size, (unsigned long) allocated); +#else /* HAVE_SBRK */ + fprintf (stderr, + "\n%s%sout of memory allocating %lu bytes\n", + name, *name ? ": " : "", + (unsigned long) size); +#endif /* HAVE_SBRK */ + xexit (1); +} + +PTR +xmalloc (size_t size) +{ + PTR newmem; + + if (size == 0) + size = 1; + newmem = malloc (size); + if (!newmem) + xmalloc_failed (size); + + return (newmem); +} + +PTR +xcalloc (size_t nelem, size_t elsize) +{ + PTR newmem; + + if (nelem == 0 || elsize == 0) + nelem = elsize = 1; + + newmem = calloc (nelem, elsize); + if (!newmem) + xmalloc_failed (nelem * elsize); + + return (newmem); +} + +PTR +xrealloc (PTR oldmem, size_t size) +{ + PTR newmem; + + if (size == 0) + size = 1; + if (!oldmem) + newmem = malloc (size); + else + newmem = realloc (oldmem, size); + if (!newmem) + xmalloc_failed (size); + + return (newmem); +} diff --git a/libiberty/xmemdup.c b/libiberty/xmemdup.c new file mode 100644 index 0000000..d483116 --- /dev/null +++ b/libiberty/xmemdup.c @@ -0,0 +1,38 @@ +/* xmemdup.c -- Duplicate a memory buffer, using xcalloc. + This trivial function is in the public domain. + Jeff Garzik, September 1999. */ + +/* + +@deftypefn Replacement void* xmemdup (void *@var{input}, size_t @var{copy_size}, size_t @var{alloc_size}) + +Duplicates a region of memory without fail. First, @var{alloc_size} bytes +are allocated, then @var{copy_size} bytes from @var{input} are copied into +it, and the new memory is returned. If fewer bytes are copied than were +allocated, the remaining memory is zeroed. + +@end deftypefn + +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include "ansidecl.h" +#include "libiberty.h" + +#include /* For size_t. */ +#ifdef HAVE_STRING_H +#include +#else +# ifdef HAVE_STRINGS_H +# include +# endif +#endif + +PTR +xmemdup (const PTR input, size_t copy_size, size_t alloc_size) +{ + PTR output = xcalloc (1, alloc_size); + return (PTR) memcpy (output, input, copy_size); +} diff --git a/libiberty/xstrdup.c b/libiberty/xstrdup.c new file mode 100644 index 0000000..9ac2ea0 --- /dev/null +++ b/libiberty/xstrdup.c @@ -0,0 +1,36 @@ +/* xstrdup.c -- Duplicate a string in memory, using xmalloc. + This trivial function is in the public domain. + Ian Lance Taylor, Cygnus Support, December 1995. */ + +/* + +@deftypefn Replacement char* xstrdup (const char *@var{s}) + +Duplicates a character string without fail, using @code{xmalloc} to +obtain memory. + +@end deftypefn + +*/ + +#include +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#ifdef HAVE_STRING_H +#include +#else +# ifdef HAVE_STRINGS_H +# include +# endif +#endif +#include "ansidecl.h" +#include "libiberty.h" + +char * +xstrdup (const char *s) +{ + register size_t len = strlen (s) + 1; + register char *ret = XNEWVEC (char, len); + return (char *) memcpy (ret, s, len); +} diff --git a/libiberty/xstrerror.c b/libiberty/xstrerror.c new file mode 100644 index 0000000..2ea2200 --- /dev/null +++ b/libiberty/xstrerror.c @@ -0,0 +1,79 @@ +/* xstrerror.c -- jacket routine for more robust strerror() usage. + Fri Jun 16 18:30:00 1995 Pat Rankin + This code is in the public domain. */ + +/* + +@deftypefn Replacement char* xstrerror (int @var{errnum}) + +Behaves exactly like the standard @code{strerror} function, but +will never return a @code{NULL} pointer. + +@end deftypefn + +*/ + +#include + +#include "config.h" +#include "libiberty.h" + +#ifdef VMS +# include +# if !defined (__STRICT_ANSI__) && !defined (__HIDE_FORBIDDEN_NAMES) +# ifdef __cplusplus +extern "C" { +# endif /* __cplusplus */ +extern char *strerror (int,...); +# define DONT_DECLARE_STRERROR +# ifdef __cplusplus +} +# endif /* __cplusplus */ +# endif +#endif /* VMS */ + + +#ifndef DONT_DECLARE_STRERROR +# ifdef __cplusplus +extern "C" { +# endif /* __cplusplus */ +extern char *strerror (int); +# ifdef __cplusplus +} +# endif /* __cplusplus */ +#endif + +/* If strerror returns NULL, we'll format the number into a static buffer. */ + +#define ERRSTR_FMT "undocumented error #%d" +static char xstrerror_buf[sizeof ERRSTR_FMT + 20]; + +/* Like strerror, but result is never a null pointer. */ + +char * +xstrerror (int errnum) +{ + char *errstr; +#ifdef VMS + char *(*vmslib_strerror) (int,...); + + /* Override any possibly-conflicting declaration from system header. */ + vmslib_strerror = (char *(*) (int,...)) strerror; + /* Second argument matters iff first is EVMSERR, but it's simpler to + pass it unconditionally. `vaxc$errno' is declared in + and maintained by the run-time library in parallel to `errno'. + We assume that `errnum' corresponds to the last value assigned to + errno by the run-time library, hence vaxc$errno will be relevant. */ + errstr = (*vmslib_strerror) (errnum, vaxc$errno); +#else + errstr = strerror (errnum); +#endif + + /* If `errnum' is out of range, result might be NULL. We'll fix that. */ + if (!errstr) + { + sprintf (xstrerror_buf, ERRSTR_FMT, errnum); + errstr = xstrerror_buf; + } + return errstr; +} diff --git a/libiberty/xstrndup.c b/libiberty/xstrndup.c new file mode 100644 index 0000000..0a41f60 --- /dev/null +++ b/libiberty/xstrndup.c @@ -0,0 +1,60 @@ +/* Implement the xstrndup function. + Copyright (C) 2005 Free Software Foundation, Inc. + Written by Kaveh R. Ghazi . + +This file is part of the libiberty library. +Libiberty is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +Libiberty 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with libiberty; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +/* + +@deftypefn Replacement char* xstrndup (const char *@var{s}, size_t @var{n}) + +Returns a pointer to a copy of @var{s} with at most @var{n} characters +without fail, using @code{xmalloc} to obtain memory. The result is +always NUL terminated. + +@end deftypefn + +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include +#ifdef HAVE_STRING_H +#include +#else +# ifdef HAVE_STRINGS_H +# include +# endif +#endif +#include "ansidecl.h" +#include "libiberty.h" + +char * +xstrndup (const char *s, size_t n) +{ + char *result; + size_t len = strlen (s); + + if (n < len) + len = n; + + result = XNEWVEC (char, len + 1); + + result[len] = '\0'; + return (char *) memcpy (result, s, len); +} diff --git a/src/.gdbinit b/src/.gdbinit new file mode 100644 index 0000000..74807fc --- /dev/null +++ b/src/.gdbinit @@ -0,0 +1,25 @@ +define pname + if $arg0->container + printf "%s$", $arg0->container->name + end + if $arg0->interface + printf "%s$", $arg0->interface->name + end + printf "%s\n", $arg0->name +end + +define regress + cd ../nregress/$arg0 +end + +define app + cd /home/dgay/motes/tinyos-1.x/apps/$arg0 +end + +define app2 + cd /home/dgay/motes/2.x/apps/$arg0 +end + +define mrun + run -_fnesc-include=tos -_fnesc-target=avr -_fnesc-no-debug -mmcu=atmega103 -DPLATFORM_MICA -DNESC=110 -I\/home/dgay/motes/tinyos-1.x/tos/platform/mica -I\/home/dgay/motes/tinyos-1.x/tos/platform/avrmote -I\/home/dgay/motes/tinyos-1.x/tos/interfaces -I\/home/dgay/motes/tinyos-1.x/tos/types -I\/home/dgay/motes/tinyos-1.x/tos/system -v $arg0 +end diff --git a/src/AST.c b/src/AST.c new file mode 100644 index 0000000..3a6800d --- /dev/null +++ b/src/AST.c @@ -0,0 +1,249 @@ +/* This file is part of the nesC compiler. + +This file is derived from the RC Compiler. It is thus + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include "parser.h" +#include "semantics.h" + +#include "AST_types.c" +#include "AST_list_node.c" + +void insert_before(node sameregion *list, node before, node n) +{ + while (*list != before) + list = &(*list)->next; + *list = n; + n->next = before; +} + + +unary newkind_unary(region r, AST_kind kind, location location, expression arg1) +{ + unary obj = new_unary(r, location, arg1); + + obj->kind = kind; + + return obj; +} + +binary newkind_binary(region r, AST_kind kind, location location, + expression arg1, expression arg2) +{ + binary obj; + + if (kind >= kind_assignment && kind <= postkind_assignment) /* XXX: Yuck */ + obj = CAST(binary, new_assign(r, location, arg1, arg2)); + else + obj = new_binary(r, location, arg1, arg2); + + obj->kind = kind; + + return obj; +} + +tag_ref newkind_tag_ref(region r, AST_kind kind, location location, word word1, attribute attributes, declaration fields, bool defined) +{ + tag_ref obj = new_tag_ref(r, location, word1, attributes, fields, defined); + + obj->kind = kind; + + return obj; +} + +/* The separate static version of AST_set_parent allows the qualifier + check optimiser to figure out a useful signature for this function */ +static void AST_set_parent(node sameregion *nptr, node parent) +{ + (*nptr)->parent = parent; + (*nptr)->parent_ptr = nptr; +} + +void set_parent(node sameregion *nptr, node parent) +{ + (*nptr)->parent = parent; + (*nptr)->parent_ptr = nptr; +} + +void set_parent_list(node sameregion *list, node parent) +{ + while (*list) + { + set_parent(list, parent); + list = &(*list)->next; + } +} + +static void AST_set_parent_list(void *vnptr, node parent); + +static void AST_set_parent1(node sameregion *nptr, node parent) +{ + node n = *nptr; + + if (parent) + AST_set_parent(nptr, parent); + + switch (n->kind) + { +/* Template: + case kind_foo: { + foo x = CAST(foo, n); + + AST_set_parent_list(&x->field1, n); + AST_set_parent_list(&x->field2, n); + break; + } +*/ +#include "AST_parent.c" + default: + assert(0); + } +} + +static void AST_set_parent_list(void *vnptr, node parent) +{ + node sameregion *nptr = CASTSRPTR(node, vnptr); + + while (*nptr) + { + AST_set_parent1(nptr, parent); + nptr = &(*nptr)->next; + } +} + +void AST_set_parents(node n) +{ + + AST_set_parent_list(&n, NULL); +} + +node AST_clone(region r, node n) +{ + int k = n->kind - kind_node; + node copy; + + /* Copy all of n's field except parent, parent_ptr */ + copy = typed_ralloc(r, AST_sizeof[k], AST_typeof[k]); + typed_rarraycopy(copy, n, 1, AST_sizeof[k], AST_typeof[k]); + copy->parent = NULL; + copy->parent_ptr = NULL; + + return copy; +} + +static void AST_print_list(int indent, void *vn); + +static void pindent(int by) +{ + int i; + + for (i = 0; i < by; i++) + putchar(' '); +} + +static void AST_print1(int indent, node n) +{ + pindent(indent); + indent += 1; + + /* Special cases */ + switch (n->kind) + { + case kind_identifier: { + identifier x = CAST(identifier, n); + + printf("identifier %s\n", x->ddecl->name); + return; + } + case kind_lexical_cst: { + lexical_cst x = CAST(lexical_cst, n); + + printf("lexical_cst %s\n", x->cstring.data); + return; + } + case kind_string_cst: { + string_cst x = CAST(string_cst, n); + + printf("string_cst %s\n", x->cstring.data); + return; + } + case kind_id_label: { + id_label x = CAST(id_label, n); + + printf("id_label %s\n", x->cstring.data); + return; + } + case kind_identifier_declarator: { + identifier_declarator x = CAST(identifier_declarator, n); + + printf("identifier_declarator %s\n", x->cstring.data); + return; + } + case kind_word: { + word x = CAST(word, n); + + printf("word %s\n", x->cstring.data); + return; + } + case kind_rid: { + rid x = CAST(rid, n); + + printf("rid %s\n", rid_name(x)); + return; + } + default: + break; + } + + switch (n->kind) + { +/* Template: + case kind_foo: { + foo x = CAST(foo, n); + + puts("foo\n"); + pindent(indent); puts("field1:\n"); AST_print_list(indent, x->field1); + pindent(indent); puts("field2:\n"); AST_print_list(indent, x->field2); + break; + } +*/ +#include "AST_print.c" + default: + assert(0); + } +} + +static void AST_print_list(int indent, void *vn) +{ + node n = CAST(node, vn); + + while (n) + { + AST_print1(indent, n); + n = n->next; + } +} + +void AST_print(node n) +{ + fflush(stdout); + AST_print_list(0, n); + fflush(stdout); +} + diff --git a/src/AST.h b/src/AST.h new file mode 100644 index 0000000..af74c06 --- /dev/null +++ b/src/AST.h @@ -0,0 +1,96 @@ +/* This file is part of the nesC compiler. + +This file is derived from the RC Compiler. It is thus + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef AST_H +#define AST_H + +typedef int id_declaration_list; +typedef struct typelist *typelist; +typedef struct type *type; +typedef struct known_cst *known_cst; +typedef struct ivalue *ivalue; +typedef struct edge *edge; + +#ifdef NODEREFINT +typedef unsigned short noderef; +#else +struct node; +typedef struct AST_node *noderef; +#endif + +#include "sd_list.h" +#include "dd_list.h" +#include "graph.h" +#include "dhash.h" + +#include "c-lex.h" +#include "nesc-ndoc.h" +#include "AST_types.h" +#include "AST_list_node.h" +#include "decls.h" +#include "env.h" +#include "types.h" +#include "cval.h" +#include "utils.h" + +enum { struct_type, union_type, enum_type }; + +typedef enum { command_call, event_signal, post_task, normal_call } nesc_call_kind; + +typedef enum { + ATOMIC_ANY, /* atomic come what may */ + ATOMIC_SINGLE, /* atomic as long as the only such operation */ + NOT_ATOMIC +} atomic_t; + +#include "AST_defs.h" + +#define CAST AST_CAST +#define CASTPTR AST_CASTPTR +#define CASTSRPTR AST_CASTSRPTR + +unary newkind_unary(region r, AST_kind kind, location location, expression arg1); +binary newkind_binary(region r, AST_kind kind, location location, + expression arg1, expression arg2); +tag_ref newkind_tag_ref(region r, AST_kind kind, location location, word word1, attribute attributes, declaration fields, bool defined); +void insert_before(node sameregion *list, node before, node n); + +void AST_set_parents(node n); +void set_parent(node sameregion *nptr, node parent); +void set_parent_list(node sameregion *list, node parent); + +node AST_clone(region r, node n); + +void AST_print(node n); + +#define AST_SET(parent, ptr, value) \ + (*(ptr) = (value), (value) ? (set_parent(CASTSRPTR(node, (ptr)), CAST(node, (parent))), 0) : 0) + +#define AST_SET_FIELD(parent, field, value) \ + AST_SET((parent), &(parent)->field, (value)) + +#define AST_SET_NEXT(previous, value) \ + AST_SET((previous)->parent, &(previous)->next, (value)) + +#define AST_REPLACE(n, value) \ + AST_SET((n)->parent_ptr, (n)->parent, (value)) + +#endif diff --git a/src/AST_defs.h b/src/AST_defs.h new file mode 100644 index 0000000..1d8daad --- /dev/null +++ b/src/AST_defs.h @@ -0,0 +1,1910 @@ +/* Automatically generated from nodetypes.def, do not edit. */ + +/* See the copyright notice in nodetypes.def */ +/* The common supertype of all AST nodes */ +struct AST_node { /* extends nil */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; +}; + +/* The common type of all definitions */ +struct AST_declaration { /* extends node */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; +}; + +/* The common type of all statements +PARENT_LOOP: + - for break and continue: the containing for/while/do-while/switch + statement they escape from + - for for/while/do-while: the containing for/while/do-while/switch + statement +CONTAINING_ATOMIC + - for return statement: their containing atomic statement + - for labels and looping statements, their containing atomic statement +(or NULL for none). Used to check that break, continue and goto do not +break in or out of an atomic statement. +(Note: for nested atomic statements, CONTAINING_ATOMIC will point to a +dangling node as we drop these nested statements from the AST) +ISATOMIC is + ATOMIC_ANY if the statement does not involve any shared variable accesses + ATOMIC_SINGLE if the statement involves a single access to a shared + variable, and that access is guaranteed to be atomic (e.g., a single byte) + NOT_ATOMIC otherwise */ +struct AST_statement { /* extends node */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + statement parent_loop; + atomic_stmt containing_atomic; + atomic_t isatomic; +}; + +/* Expression nodes are subtypes of this type. +LVALUE is true if this expression can be used in a context requiring an lvalue. +BITFIELD is true if this lvalue is a bitfield. +ISREGISTER is true if this lvalue is (declared to be) in a register. +SIDE_EFFECTS is true if the expression has side effects. +CST is non-null (and points to an appropriate constant) if this expression is +constant. +STATIC_ADDRESS is true for lvalues whose address is a constant expression +CONVERTED_TO_POINTER is true for expressions which default_conversion +indicates need converting to pointer type (note that these nodes did not have +their type changed) +CST_CHECKED is set to true once we've successfully checked this expression's +constantness, and associated constant value (used to avoid duplicate error +messages in repeated constant folding passes) +SPELLING saves the `spelling' (a user-friendly name) of expressions used +in initialisers. +PARENS is TRUE if the expression is in parentheses +IVALUE is a pointer to an ivalue (see init.h) holding the value of an + initialiser expression. On an init_list or in an expression used as + a simple initialiser (e.g., '3 + 2' in 'int x = 3 + 2'), this is the + value of the initialiser. Inside these initialisers, ivalue points into + the ivalue structure of the containing initialiser. +CONTEXT is the usage context for this expression (see nesc-uses.h) +ISATOMIC is + ATOMIC_ANY if the statement does not involve any shared variable accesses + ATOMIC_SINGLE if the statement involves a single access to a shared + variable, and that access is guaranteed to be atomic (e.g., a single byte) + NOT_ATOMIC otherwise */ +struct AST_expression { /* extends node */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + bool lvalue; + bool side_effects; + known_cst cst; + bool bitfield; + bool isregister; + type type; + known_cst static_address; + bool converted_to_pointer; + bool cst_checked; + const char * spelling; + bool parens; + ivalue ivalue; + context context; + atomic_t isatomic; +}; + +/* A common super-type for all type-building elements (qualifiers, etc) */ +struct AST_type_element { /* extends node */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; +}; + +/* A common super-type for all declarator elements */ +struct AST_declarator { /* extends node */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; +}; + +/* A common super-type for all labels. +NEXT_LABEL points to the next case or default label of a switch +(for case or default labels only) */ +struct AST_label { /* extends node */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + label next_label; +}; + +/* Asm statement STMT at the top level of a file (GCC) */ +struct AST_asm_decl { /* extends declaration */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + asm_stmt sameregion asm_stmt; +}; + +/* The declaration MODIFIERS DECLS; +DECLS is a list */ +struct AST_data_decl { /* extends declaration */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + type_element sameregion modifiers; + declaration sameregion decls; +}; + +/* __extension__ DECL; (GCC) */ +struct AST_extension_decl { /* extends declaration */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + declaration sameregion decl; +}; + +/* A pseudo-declaration to represent ... in a function argument list */ +struct AST_ellipsis_decl { /* extends declaration */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; +}; + +/* The enumeration element CSTRING = ARG1. CSTRING is optional */ +struct AST_enumerator { /* extends declaration */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + cstring cstring; + expression sameregion arg1; + data_declaration ddecl; +}; + +/* CSTRING in an old-style parameter list */ +struct AST_oldidentifier_decl { /* extends declaration */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + cstring cstring; + data_declaration ddecl; +}; + +/* A function declaration with body STMT +OLD_PARMS is the old-style parameter declaration list. */ +struct AST_function_decl { /* extends declaration */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + declarator sameregion declarator; + type_element sameregion modifiers; + attribute sameregion attributes; + declaration old_parms; + statement sameregion stmt; + function_decl parent_function; + data_declaration ddecl; + function_declarator fdeclarator; + type declared_type; + env undeclared_variables; + env base_labels; + env scoped_labels; + statement current_loop; + int nlocals; +}; + +/* Used as the AST node for implicit declarations. IDENT points to the +identifier node that implicitly declared the function */ +struct AST_implicit_decl { /* extends declaration */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + identifier ident; +}; + +/* Declaration of DECLARATOR ASM_STMT ATTRIBUTES = ARG1. +ATTRIBUTES is a list. ASM_STMT is optional (GCC specific). +ARG1 is an optional initialiser. +DDECL points to the declaration for this item. +DECLARED_TYPE is the type in this declaration (which may be different than that +in DDECL->TYPE) +FORWARD is true for parameters that are forward declarations */ +struct AST_variable_decl { /* extends declaration */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + declarator sameregion declarator; + attribute sameregion attributes; + expression sameregion arg1; + asm_stmt sameregion asm_stmt; + data_declaration ddecl; + type declared_type; + bool forward; +}; + +/* Declaration of field DECLARATOR ATTRIBUTES : ARG1. +QUALIFIERS and ATTRIBUTEES are lists. ARG1 is an optional bitfield specifier +TYPE_CHECKED is set to true once it has been checked that this field is of + network type (inside network structures) +FDECL is this field's declaration */ +struct AST_field_decl { /* extends declaration */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + declarator sameregion declarator; + attribute sameregion attributes; + expression sameregion arg1; + bool type_checked; + field_declaration fdecl; +}; + +/* The source-level type QUALIFIERS DECLARATOR */ +struct AST_asttype { /* extends node */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + declarator sameregion declarator; + type_element sameregion qualifiers; + type type; +}; + +/* typedef-type with declaration DDECL. The name is ddecl->name */ +struct AST_typename { /* extends type_element */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + data_declaration ddecl; +}; + +/* typeof ARG1 */ +struct AST_typeof_expr { /* extends type_element */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + expression sameregion arg1; +}; + +/* typeof(ASTTYPE) */ +struct AST_typeof_type { /* extends type_element */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + asttype sameregion asttype; +}; + +/* base type for gcc and nesc attributes */ +struct AST_attribute { /* extends type_element */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + word sameregion word1; +}; + +/* The (gcc) attribute WORD1(ARGS). args can be empty, and may not be +semantically valid */ +struct AST_gcc_attribute { /* extends attribute */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + word sameregion word1; + expression sameregion args; +}; + +/* Storage class specifier, type specifier or type qualifier ID (see RID_xxx) */ +struct AST_rid { /* extends type_element */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + enum rid id; +}; + +/* Type or function qualifier ID (see qualifiers.h and type_quals in types.h) */ +struct AST_qualifier { /* extends type_element */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + enum rid id; +}; + +/* struct/union/enum WORD1 { FIELDS; } ATTRIBUTES +ATTRIBUTES and FIELDS are lists. +ATTRIBUTES is GCC specific. WORD1 is optional. +DEFINED is TRUE if this declaration defines the struct/union/enum. +DEFINED == FALSE => FIELDS == NULL + +TDECL points to the internal declaration node for this type */ +struct AST_tag_ref { /* extends type_element */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + word sameregion word1; + attribute sameregion attributes; + declaration sameregion fields; + bool defined; + tag_declaration tdecl; +}; + +/* A struct */ +struct AST_struct_ref { /* extends tag_ref */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + word sameregion word1; + attribute sameregion attributes; + declaration sameregion fields; + bool defined; + tag_declaration tdecl; +}; + +/* A union */ +struct AST_union_ref { /* extends tag_ref */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + word sameregion word1; + attribute sameregion attributes; + declaration sameregion fields; + bool defined; + tag_declaration tdecl; +}; + +/* A common supertype for function/pointer/array declarator which includes +the nested DECLARATOR */ +struct AST_nested_declarator { /* extends declarator */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + declarator sameregion declarator; +}; + +/* Function declarator DECLARATOR(PARMS). PARMS is a list of declarations. +ENV is the environment for parms +GPARMS is the list of declarations of generic parameters (commands, events only) +RETURN_TYPE (optional) contains an overridden return type from nesdoc */ +struct AST_function_declarator { /* extends nested_declarator */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + declarator sameregion declarator; + declaration sameregion parms; + declaration sameregion gparms; + type_element sameregion qualifiers; + environment env; + asttype sameregion return_type; +}; + +/* Pointer declarator *DECLARATOR */ +struct AST_pointer_declarator { /* extends nested_declarator */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + declarator sameregion declarator; +}; + +/* Declarator MODIFIERS DECLARATOR. The MODIFIERS are qualifiers +or attributes. +Note: MODIFIERS is never NULL */ +struct AST_qualified_declarator { /* extends nested_declarator */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + declarator sameregion declarator; + type_element sameregion modifiers; +}; + +/* Array declarator DECLARATOR[ARG1]. ARG1 is optional */ +struct AST_array_declarator { /* extends nested_declarator */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + declarator sameregion declarator; + expression sameregion arg1; +}; + +/* Declaration of CSTRING */ +struct AST_identifier_declarator { /* extends declarator */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + cstring cstring; +}; + +/* The statement asm QUALIFIERS (ARG1 : ASM_OPERANDS1 : ASM_OPERANDS2 : ASM_CLOBBERS) +where ASM_OPERANDS1, ASM_OPERANDS2, QUALIFIERS are optional, ASM_CLOBBERS is a list (GCC) */ +struct AST_asm_stmt { /* extends statement */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + statement parent_loop; + atomic_stmt containing_atomic; + atomic_t isatomic; + expression sameregion arg1; + asm_operand sameregion asm_operands1; + asm_operand sameregion asm_operands2; + string sameregion asm_clobbers; + type_element sameregion qualifiers; +}; + +/* { ID_LABELS DECLS STMTS }. The ID_LABELS are GCC-specific. ID_LABELS, DECLS, +STMTS are lists +ENV is the environment for the block */ +struct AST_compound_stmt { /* extends statement */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + statement parent_loop; + atomic_stmt containing_atomic; + atomic_t isatomic; + id_label sameregion id_labels; + declaration sameregion decls; + statement sameregion stmts; + environment env; +}; + +/* IF (CONDITION) STMT1 ELSE STMT2. STMT2 is optional */ +struct AST_if_stmt { /* extends statement */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + statement parent_loop; + atomic_stmt containing_atomic; + atomic_t isatomic; + expression sameregion condition; + statement sameregion stmt1; + statement sameregion stmt2; +}; + +/* LABEL: STMT */ +struct AST_labeled_stmt { /* extends statement */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + statement parent_loop; + atomic_stmt containing_atomic; + atomic_t isatomic; + label sameregion label; + statement sameregion stmt; +}; + +/* EXPR; */ +struct AST_expression_stmt { /* extends statement */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + statement parent_loop; + atomic_stmt containing_atomic; + atomic_t isatomic; + expression sameregion arg1; +}; + +/* Basic type for all conditional statements */ +struct AST_conditional_stmt { /* extends statement */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + statement parent_loop; + atomic_stmt containing_atomic; + atomic_t isatomic; + expression sameregion condition; + statement sameregion stmt; +}; + +/* SWITCH (CONDITION) STMT. +NEXT_LABEL points to the switches first label */ +struct AST_switch_stmt { /* extends conditional_stmt */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + statement parent_loop; + atomic_stmt containing_atomic; + atomic_t isatomic; + expression sameregion condition; + statement sameregion stmt; + label next_label; +}; + +/* FOR (ARG1; ARG2; ARG3) STMT. ARG1, ARG2, ARG3 are optional */ +struct AST_for_stmt { /* extends statement */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + statement parent_loop; + atomic_stmt containing_atomic; + atomic_t isatomic; + expression sameregion arg1; + expression sameregion arg2; + expression sameregion arg3; + statement sameregion stmt; +}; + +/* BREAK; */ +struct AST_break_stmt { /* extends statement */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + statement parent_loop; + atomic_stmt containing_atomic; + atomic_t isatomic; +}; + +/* CONTINUE; */ +struct AST_continue_stmt { /* extends statement */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + statement parent_loop; + atomic_stmt containing_atomic; + atomic_t isatomic; +}; + +/* RETURN ARG1. ARG1 is optional */ +struct AST_return_stmt { /* extends statement */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + statement parent_loop; + atomic_stmt containing_atomic; + atomic_t isatomic; + expression sameregion arg1; +}; + +/* GOTO ID_LABEL */ +struct AST_goto_stmt { /* extends statement */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + statement parent_loop; + atomic_stmt containing_atomic; + atomic_t isatomic; + id_label sameregion id_label; +}; + +/* GOTO *ARG1 (GCC) */ +struct AST_computed_goto_stmt { /* extends statement */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + statement parent_loop; + atomic_stmt containing_atomic; + atomic_t isatomic; + expression sameregion arg1; +}; + +/* ; */ +struct AST_empty_stmt { /* extends statement */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + statement parent_loop; + atomic_stmt containing_atomic; + atomic_t isatomic; +}; + +/* Unary expression nodes, kind defines operator */ +struct AST_unary { /* extends expression */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + bool lvalue; + bool side_effects; + known_cst cst; + bool bitfield; + bool isregister; + type type; + known_cst static_address; + bool converted_to_pointer; + bool cst_checked; + const char * spelling; + bool parens; + ivalue ivalue; + context context; + atomic_t isatomic; + expression sameregion arg1; +}; + +/* Binary expression nodes, kind defines operator */ +struct AST_binary { /* extends expression */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + bool lvalue; + bool side_effects; + known_cst cst; + bool bitfield; + bool isregister; + type type; + known_cst static_address; + bool converted_to_pointer; + bool cst_checked; + const char * spelling; + bool parens; + ivalue ivalue; + context context; + atomic_t isatomic; + expression sameregion arg1; + expression sameregion arg2; +}; + +/* A comma separated list of expressions ARG1 */ +struct AST_comma { /* extends expression */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + bool lvalue; + bool side_effects; + known_cst cst; + bool bitfield; + bool isregister; + type type; + known_cst static_address; + bool converted_to_pointer; + bool cst_checked; + const char * spelling; + bool parens; + ivalue ivalue; + context context; + atomic_t isatomic; + expression sameregion arg1; +}; + +/* sizeof (ASTTYPE) */ +struct AST_sizeof_type { /* extends expression */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + bool lvalue; + bool side_effects; + known_cst cst; + bool bitfield; + bool isregister; + type type; + known_cst static_address; + bool converted_to_pointer; + bool cst_checked; + const char * spelling; + bool parens; + ivalue ivalue; + context context; + atomic_t isatomic; + asttype sameregion asttype; +}; + +/* __alignof (ASTTYPE) (GCC) */ +struct AST_alignof_type { /* extends expression */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + bool lvalue; + bool side_effects; + known_cst cst; + bool bitfield; + bool isregister; + type type; + known_cst static_address; + bool converted_to_pointer; + bool cst_checked; + const char * spelling; + bool parens; + ivalue ivalue; + context context; + atomic_t isatomic; + asttype sameregion asttype; +}; + +/* &&ID_LABEL (GCC) */ +struct AST_label_address { /* extends expression */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + bool lvalue; + bool side_effects; + known_cst cst; + bool bitfield; + bool isregister; + type type; + known_cst static_address; + bool converted_to_pointer; + bool cst_checked; + const char * spelling; + bool parens; + ivalue ivalue; + context context; + atomic_t isatomic; + id_label sameregion id_label; +}; + +/* (ASTTYPE)ARG1 */ +struct AST_cast { /* extends unary */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + bool lvalue; + bool side_effects; + known_cst cst; + bool bitfield; + bool isregister; + type type; + known_cst static_address; + bool converted_to_pointer; + bool cst_checked; + const char * spelling; + bool parens; + ivalue ivalue; + context context; + atomic_t isatomic; + expression sameregion arg1; + asttype sameregion asttype; +}; + +/* (ASTTYPE){INIT_EXPR} (GCC) */ +struct AST_cast_list { /* extends expression */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + bool lvalue; + bool side_effects; + known_cst cst; + bool bitfield; + bool isregister; + type type; + known_cst static_address; + bool converted_to_pointer; + bool cst_checked; + const char * spelling; + bool parens; + ivalue ivalue; + context context; + atomic_t isatomic; + asttype sameregion asttype; + expression sameregion init_expr; +}; + +/* CONDITION ? ARG1 : ARG2 + GCC specific: ARG1 is optional */ +struct AST_conditional { /* extends expression */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + bool lvalue; + bool side_effects; + known_cst cst; + bool bitfield; + bool isregister; + type type; + known_cst static_address; + bool converted_to_pointer; + bool cst_checked; + const char * spelling; + bool parens; + ivalue ivalue; + context context; + atomic_t isatomic; + expression sameregion condition; + expression sameregion arg1; + expression sameregion arg2; +}; + +/* The identrifier CSTRING +DEAD_USE is true for identifiers used as the target of a regular assignment */ +struct AST_identifier { /* extends expression */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + bool lvalue; + bool side_effects; + known_cst cst; + bool bitfield; + bool isregister; + type type; + known_cst static_address; + bool converted_to_pointer; + bool cst_checked; + const char * spelling; + bool parens; + ivalue ivalue; + context context; + atomic_t isatomic; + cstring cstring; + data_declaration ddecl; +}; + +/* ({stmt}) (GCC) */ +struct AST_compound_expr { /* extends expression */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + bool lvalue; + bool side_effects; + known_cst cst; + bool bitfield; + bool isregister; + type type; + known_cst static_address; + bool converted_to_pointer; + bool cst_checked; + const char * spelling; + bool parens; + ivalue ivalue; + context context; + atomic_t isatomic; + statement sameregion stmt; +}; + +/* ARG1(ARGS). ARGS is a list of expressions +If VA_ARG_CALL is non-null, this is actually a call to the pseudo-function +__builtin_va_arg(args, va_arg_call) (where va_arg_call is a type). In +this case arg1 is a dummy identifier. +CALL_KIND is one of normal_call, post_task, command_call or event_signal. */ +struct AST_function_call { /* extends expression */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + bool lvalue; + bool side_effects; + known_cst cst; + bool bitfield; + bool isregister; + type type; + known_cst static_address; + bool converted_to_pointer; + bool cst_checked; + const char * spelling; + bool parens; + ivalue ivalue; + context context; + atomic_t isatomic; + expression sameregion arg1; + expression sameregion args; + asttype va_arg_call; + nesc_call_kind call_kind; +}; + +/* ARG1.CSTRING +The field_declaration is saved in FDECL */ +struct AST_field_ref { /* extends unary */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + bool lvalue; + bool side_effects; + known_cst cst; + bool bitfield; + bool isregister; + type type; + known_cst static_address; + bool converted_to_pointer; + bool cst_checked; + const char * spelling; + bool parens; + ivalue ivalue; + context context; + atomic_t isatomic; + expression sameregion arg1; + cstring cstring; + field_declaration fdecl; +}; + +/* parent for increment nodes */ +struct AST_increment { /* extends unary */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + bool lvalue; + bool side_effects; + known_cst cst; + bool bitfield; + bool isregister; + type type; + known_cst static_address; + bool converted_to_pointer; + bool cst_checked; + const char * spelling; + bool parens; + ivalue ivalue; + context context; + atomic_t isatomic; + expression sameregion arg1; + data_declaration temp1; + data_declaration temp2; +}; + +/* binary comparison ops */ +struct AST_comparison { /* extends binary */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + bool lvalue; + bool side_effects; + known_cst cst; + bool bitfield; + bool isregister; + type type; + known_cst static_address; + bool converted_to_pointer; + bool cst_checked; + const char * spelling; + bool parens; + ivalue ivalue; + context context; + atomic_t isatomic; + expression sameregion arg1; + expression sameregion arg2; +}; + +/* ARG1 ARG2 */ +struct AST_assignment { /* extends binary */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + bool lvalue; + bool side_effects; + known_cst cst; + bool bitfield; + bool isregister; + type type; + known_cst static_address; + bool converted_to_pointer; + bool cst_checked; + const char * spelling; + bool parens; + ivalue ivalue; + context context; + atomic_t isatomic; + expression sameregion arg1; + expression sameregion arg2; + data_declaration temp1; +}; + +/* { ARGS }. ARGS is a list of expressions +The type of the init_list is the type of the initialised entity. +If this entity is an incomplete array type, the type of the init_list +is the actual array size deduced from the initialiser. */ +struct AST_init_list { /* extends expression */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + bool lvalue; + bool side_effects; + known_cst cst; + bool bitfield; + bool isregister; + type type; + known_cst static_address; + bool converted_to_pointer; + bool cst_checked; + const char * spelling; + bool parens; + ivalue ivalue; + context context; + atomic_t isatomic; + expression sameregion args; +}; + +/* DESIGNATOR = INIT_EXPR in an init_list. +DESIGNATOR is a list +The type is not set in init_specific nodes */ +struct AST_init_specific { /* extends expression */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + bool lvalue; + bool side_effects; + known_cst cst; + bool bitfield; + bool isregister; + type type; + known_cst static_address; + bool converted_to_pointer; + bool cst_checked; + const char * spelling; + bool parens; + ivalue ivalue; + context context; + atomic_t isatomic; + designator sameregion designator; + expression sameregion init_expr; +}; + +/* Base type for designators */ +struct AST_designator { /* extends node */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; +}; + +/* . CSTRING in an initialisation designator */ +struct AST_designate_field { /* extends designator */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + cstring cstring; +}; + +/* [ARG1] or [ARG1 ... ARG2] in a designator. ARG2 is optional. +ARG2 is a GCC extension */ +struct AST_designate_index { /* extends designator */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + expression sameregion arg1; + expression sameregion arg2; +}; + +/* A constant represented as in its unparsed lexical form CSTRING. These +appear in the AST. */ +struct AST_lexical_cst { /* extends expression */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + bool lvalue; + bool side_effects; + known_cst cst; + bool bitfield; + bool isregister; + type type; + known_cst static_address; + bool converted_to_pointer; + bool cst_checked; + const char * spelling; + bool parens; + ivalue ivalue; + context context; + atomic_t isatomic; + cstring cstring; +}; + +/* A single lexical string - a sequence of these gets concatenated to +form a string. The source form of the constant can be found in +CSTRING. */ +struct AST_string_cst { /* extends lexical_cst */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + bool lvalue; + bool side_effects; + known_cst cst; + bool bitfield; + bool isregister; + type type; + known_cst static_address; + bool converted_to_pointer; + bool cst_checked; + const char * spelling; + bool parens; + ivalue ivalue; + context context; + atomic_t isatomic; + cstring cstring; +}; + +/* A list of STRINGS forming a single string constant. +DDECL is the magic_string declaration for this string. */ +struct AST_string { /* extends expression */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + bool lvalue; + bool side_effects; + known_cst cst; + bool bitfield; + bool isregister; + type type; + known_cst static_address; + bool converted_to_pointer; + bool cst_checked; + const char * spelling; + bool parens; + ivalue ivalue; + context context; + atomic_t isatomic; + string_cst sameregion strings; + data_declaration ddecl; +}; + +/* The label CSTRING: */ +struct AST_id_label { /* extends label */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + label next_label; + cstring cstring; + label_declaration ldecl; +}; + +/* CASE ARG1 ... ARG2: ARG2 is optional, it's presence is GCC-specific */ +struct AST_case_label { /* extends label */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + label next_label; + expression sameregion arg1; + expression sameregion arg2; +}; + +/* DEFAULT: */ +struct AST_default_label { /* extends label */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + label next_label; +}; + +/* The identifier CSTRING used uninterpreted */ +struct AST_word { /* extends node */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + cstring cstring; +}; + +/* STRING(EXPR) or [WORD1] STRING(EXPR) (GCC) */ +struct AST_asm_operand { /* extends node */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + word sameregion word1; + string sameregion string; + expression sameregion arg1; +}; + +/* a supertype for interface/component declarations of WORD1 +CDECL is the declaration for this interface/component +ATTRIBUTES are its attributes */ +struct AST_nesc_decl { /* extends declaration */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + word sameregion word1; + attribute sameregion attributes; + nesc_declaration cdecl; +}; + +/* interface WORD1 { DECLS } */ +struct AST_interface { /* extends nesc_decl */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + word sameregion word1; + attribute sameregion attributes; + nesc_declaration cdecl; + declaration sameregion decls; +}; + +/* ABSTRACT configuration/module WORD1 PARMS { DECLS } IMPLEMENTATION +If ABSTRACT is true, this is a generic component, and PARMS is its +parameters. */ +struct AST_component { /* extends nesc_decl */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + word sameregion word1; + attribute sameregion attributes; + nesc_declaration cdecl; + bool abstract; + declaration sameregion parms; + declaration sameregion decls; + implementation sameregion implementation; +}; + +/* a base type for module and configuration implementations +IENV is the implementation's environment +CDECL is the declaration for this component */ +struct AST_implementation { /* extends node */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + environment ienv; + nesc_declaration cdecl; +}; + +/* configuration implementation { DECLS } +where DECLS include regular declarations, component_refs and connections */ +struct AST_configuration { /* extends implementation */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + environment ienv; + nesc_declaration cdecl; + declaration sameregion decls; +}; + +/* module implementation { DECLS }' */ +struct AST_module { /* extends implementation */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + environment ienv; + nesc_declaration cdecl; + declaration sameregion decls; +}; + +/* binary component implementation placeholder */ +struct AST_binary_component { /* extends implementation */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + environment ienv; + nesc_declaration cdecl; +}; + +/* a required or provided function or interface declaration (DECL is +either a data_decl or an interface_ref). REQUIRED is true for 'requires', +false for 'provides' clauses */ +struct AST_rp_interface { /* extends declaration */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + bool required; + declaration sameregion decls; +}; + +/* an interface which is required or provided by a component: +interface WORD1 < ARGS > WORD2 [ GPARMS ] ATTRIBUTES +ARGS is a list of type_arguments for template interfaces +WORD2 is optional, GPARMS, ARGS, ATTRIBUTES are optional */ +struct AST_interface_ref { /* extends declaration */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + word sameregion word1; + expression sameregion args; + word sameregion word2; + declaration sameregion gparms; + attribute sameregion attributes; + data_declaration ddecl; +}; + +/* a reference to component WORD1 'as' WORD2 +WORD2 is optional +ABSTRACT is true for abstract component instantiations, false otherwise +ARGS is the argument list for abstract component instantiations +CDECL is filled in to point to the loaded component */ +struct AST_component_ref { /* extends declaration */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + word sameregion word1; + word sameregion word2; + bool abstract; + expression sameregion args; + nesc_declaration cdecl; +}; + +/* A connection between interfaces EP1 and EP2 */ +struct AST_connection { /* extends declaration */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + endpoint sameregion ep1; + endpoint sameregion ep2; +}; + +/* a list of parameterised_identifier in IDS */ +struct AST_endpoint { /* extends node */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + parameterised_identifier sameregion ids; +}; + +/* WORD1[ARGS] if ARGS != null, just WORD1 otherwise */ +struct AST_parameterised_identifier { /* extends node */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + word sameregion word1; + expression sameregion args; +}; + +/* parameterised declaration DECLARATOR [ PARMS ] */ +struct AST_generic_declarator { /* extends declarator */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + declarator sameregion declarator; + declaration sameregion parms; +}; + +/* ARG1[ARGS]. ARGS is a list of expressions, ARG1 is a generic function */ +struct AST_generic_call { /* extends expression */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + bool lvalue; + bool side_effects; + known_cst cst; + bool bitfield; + bool isregister; + type type; + known_cst static_address; + bool converted_to_pointer; + bool cst_checked; + const char * spelling; + bool parens; + ivalue ivalue; + context context; + atomic_t isatomic; + expression sameregion arg1; + expression sameregion args; +}; + +/* WORD1 . DECLARATOR in a declarator (for defining commands, events in component +implementations +For now at least, DECLARATOR is always an identifier_declarator */ +struct AST_interface_ref_declarator { /* extends nested_declarator */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + declarator sameregion declarator; + word sameregion word1; +}; + +/* ARG1.CSTRING where ARG1 is an interface_ref. +DDECL is the command or event's declaration */ +struct AST_interface_deref { /* extends unary */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + bool lvalue; + bool side_effects; + known_cst cst; + bool bitfield; + bool isregister; + type type; + known_cst static_address; + bool converted_to_pointer; + bool cst_checked; + const char * spelling; + bool parens; + ivalue ivalue; + context context; + atomic_t isatomic; + expression sameregion arg1; + cstring cstring; + data_declaration ddecl; +}; + +/* ARG1.CSTRING where ARG1 is a component_ref. +component_deref is *not* used for references to typedefed types in components. +DDECL is the specification element's declaration */ +struct AST_component_deref { /* extends unary */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + bool lvalue; + bool side_effects; + known_cst cst; + bool bitfield; + bool isregister; + type type; + known_cst static_address; + bool converted_to_pointer; + bool cst_checked; + const char * spelling; + bool parens; + ivalue ivalue; + context context; + atomic_t isatomic; + expression sameregion arg1; + cstring cstring; + data_declaration ddecl; +}; + +/* CSTRING . typedef-name, a typedef-from-component-type +with declaration DDECL. The typedef-name is in ddecl->name */ +struct AST_component_typeref { /* extends typename */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + data_declaration ddecl; + cstring cstring; +}; + +/* ATOMIC stmt +An atomic_stmt is not made for lexically nested atomic statements */ +struct AST_atomic_stmt { /* extends statement */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + statement parent_loop; + atomic_stmt containing_atomic; + atomic_t isatomic; + statement sameregion stmt; +}; + +/* @WORD1(ARG1), a nesC attribute. ARG1 is an init_list. +TDECL is the reference to the declaration of attribute WORD1 */ +struct AST_nesc_attribute { /* extends attribute */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + word sameregion word1; + expression sameregion arg1; + tag_declaration tdecl; +}; + +/* A declaration of type parameter CSTRING */ +struct AST_type_parm_decl { /* extends declaration */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + cstring cstring; + data_declaration ddecl; +}; + +/* ASTTYPE used as a template argument */ +struct AST_type_argument { /* extends expression */ + AST_kind kind; + location location; + node sameregion next; + node sameregion parent; + node sameregion *sameregion parent_ptr; + node instantiation; + bool lvalue; + bool side_effects; + known_cst cst; + bool bitfield; + bool isregister; + type type; + known_cst static_address; + bool converted_to_pointer; + bool cst_checked; + const char * spelling; + bool parens; + ivalue ivalue; + context context; + atomic_t isatomic; + asttype sameregion asttype; +}; + + + +node new_node(region r, location location); +declaration new_declaration(region r, location location); +statement new_statement(region r, location location); +expression new_expression(region r, location location); +type_element new_type_element(region r, location location); +declarator new_declarator(region r, location location); +label new_label(region r, location location); +asm_decl new_asm_decl(region r, location location, asm_stmt asm_stmt); +data_decl new_data_decl(region r, location location, type_element modifiers, declaration decls); +extension_decl new_extension_decl(region r, location location, declaration decl); +ellipsis_decl new_ellipsis_decl(region r, location location); +enumerator new_enumerator(region r, location location, cstring cstring, expression arg1, data_declaration ddecl); +oldidentifier_decl new_oldidentifier_decl(region r, location location, cstring cstring, data_declaration ddecl); +function_decl new_function_decl(region r, location location, declarator declarator, type_element modifiers, attribute attributes, declaration old_parms, statement stmt, function_decl parent_function, data_declaration ddecl); +implicit_decl new_implicit_decl(region r, location location, identifier ident); +variable_decl new_variable_decl(region r, location location, declarator declarator, attribute attributes, expression arg1, asm_stmt asm_stmt, data_declaration ddecl); +field_decl new_field_decl(region r, location location, declarator declarator, attribute attributes, expression arg1); +asttype new_asttype(region r, location location, declarator declarator, type_element qualifiers); +typename new_typename(region r, location location, data_declaration ddecl); +typeof_expr new_typeof_expr(region r, location location, expression arg1); +typeof_type new_typeof_type(region r, location location, asttype asttype); +attribute new_attribute(region r, location location, word word1); +gcc_attribute new_gcc_attribute(region r, location location, word word1, expression args); +rid new_rid(region r, location location, enum rid id); +qualifier new_qualifier(region r, location location, enum rid id); +tag_ref new_tag_ref(region r, location location, word word1, attribute attributes, declaration fields, bool defined); +struct_ref new_struct_ref(region r, location location, word word1, attribute attributes, declaration fields, bool defined); +union_ref new_union_ref(region r, location location, word word1, attribute attributes, declaration fields, bool defined); +nested_declarator new_nested_declarator(region r, location location, declarator declarator); +function_declarator new_function_declarator(region r, location location, declarator declarator, declaration parms, declaration gparms, type_element qualifiers, environment env); +pointer_declarator new_pointer_declarator(region r, location location, declarator declarator); +qualified_declarator new_qualified_declarator(region r, location location, declarator declarator, type_element modifiers); +array_declarator new_array_declarator(region r, location location, declarator declarator, expression arg1); +identifier_declarator new_identifier_declarator(region r, location location, cstring cstring); +asm_stmt new_asm_stmt(region r, location location, expression arg1, asm_operand asm_operands1, asm_operand asm_operands2, string asm_clobbers, type_element qualifiers); +compound_stmt new_compound_stmt(region r, location location, id_label id_labels, declaration decls, statement stmts, environment env); +if_stmt new_if_stmt(region r, location location, expression condition, statement stmt1, statement stmt2); +labeled_stmt new_labeled_stmt(region r, location location, label label, statement stmt); +expression_stmt new_expression_stmt(region r, location location, expression arg1); +conditional_stmt new_conditional_stmt(region r, location location, expression condition, statement stmt); +switch_stmt new_switch_stmt(region r, location location, expression condition, statement stmt); +for_stmt new_for_stmt(region r, location location, expression arg1, expression arg2, expression arg3, statement stmt); +break_stmt new_break_stmt(region r, location location); +continue_stmt new_continue_stmt(region r, location location); +return_stmt new_return_stmt(region r, location location, expression arg1); +goto_stmt new_goto_stmt(region r, location location, id_label id_label); +computed_goto_stmt new_computed_goto_stmt(region r, location location, expression arg1); +empty_stmt new_empty_stmt(region r, location location); +unary new_unary(region r, location location, expression arg1); +binary new_binary(region r, location location, expression arg1, expression arg2); +comma new_comma(region r, location location, expression arg1); +sizeof_type new_sizeof_type(region r, location location, asttype asttype); +alignof_type new_alignof_type(region r, location location, asttype asttype); +label_address new_label_address(region r, location location, id_label id_label); +cast new_cast(region r, location location, expression arg1, asttype asttype); +cast_list new_cast_list(region r, location location, asttype asttype, expression init_expr); +conditional new_conditional(region r, location location, expression condition, expression arg1, expression arg2); +identifier new_identifier(region r, location location, cstring cstring, data_declaration ddecl); +compound_expr new_compound_expr(region r, location location, statement stmt); +function_call new_function_call(region r, location location, expression arg1, expression args, asttype va_arg_call, nesc_call_kind call_kind); +field_ref new_field_ref(region r, location location, expression arg1, cstring cstring); +increment new_increment(region r, location location, expression arg1); +comparison new_comparison(region r, location location, expression arg1, expression arg2); +assignment new_assignment(region r, location location, expression arg1, expression arg2); +init_list new_init_list(region r, location location, expression args); +init_specific new_init_specific(region r, location location, designator designator, expression init_expr); +designator new_designator(region r, location location); +designate_field new_designate_field(region r, location location, cstring cstring); +designate_index new_designate_index(region r, location location, expression arg1, expression arg2); +lexical_cst new_lexical_cst(region r, location location, cstring cstring); +string_cst new_string_cst(region r, location location, cstring cstring); +string new_string(region r, location location, string_cst strings, data_declaration ddecl); +id_label new_id_label(region r, location location, cstring cstring); +case_label new_case_label(region r, location location, expression arg1, expression arg2); +default_label new_default_label(region r, location location); +word new_word(region r, location location, cstring cstring); +asm_operand new_asm_operand(region r, location location, word word1, string string, expression arg1); +nesc_decl new_nesc_decl(region r, location location, word word1, attribute attributes); +interface new_interface(region r, location location, word word1, attribute attributes, declaration decls); +component new_component(region r, location location, word word1, attribute attributes, bool abstract, declaration parms, declaration decls, implementation implementation); +implementation new_implementation(region r, location location, environment ienv); +configuration new_configuration(region r, location location, environment ienv, declaration decls); +module new_module(region r, location location, environment ienv, declaration decls); +binary_component new_binary_component(region r, location location, environment ienv); +rp_interface new_rp_interface(region r, location location, bool required, declaration decls); +interface_ref new_interface_ref(region r, location location, word word1, expression args, word word2, declaration gparms, attribute attributes, data_declaration ddecl); +component_ref new_component_ref(region r, location location, word word1, word word2, bool abstract, expression args); +connection new_connection(region r, location location, endpoint ep1, endpoint ep2); +endpoint new_endpoint(region r, location location, parameterised_identifier ids); +parameterised_identifier new_parameterised_identifier(region r, location location, word word1, expression args); +generic_declarator new_generic_declarator(region r, location location, declarator declarator, declaration parms); +generic_call new_generic_call(region r, location location, expression arg1, expression args); +interface_ref_declarator new_interface_ref_declarator(region r, location location, declarator declarator, word word1); +interface_deref new_interface_deref(region r, location location, expression arg1, cstring cstring, data_declaration ddecl); +component_deref new_component_deref(region r, location location, expression arg1, cstring cstring, data_declaration ddecl); +component_typeref new_component_typeref(region r, location location, data_declaration ddecl, cstring cstring); +atomic_stmt new_atomic_stmt(region r, location location, statement stmt); +nesc_attribute new_nesc_attribute(region r, location location, word word1, expression arg1); +type_parm_decl new_type_parm_decl(region r, location location, cstring cstring, data_declaration ddecl); +type_argument new_type_argument(region r, location location, asttype asttype); +error_decl new_error_decl(region r, location location); +attribute_ref new_attribute_ref(region r, location location, word word1, attribute attributes, declaration fields, bool defined); +enum_ref new_enum_ref(region r, location location, word word1, attribute attributes, declaration fields, bool defined); +error_stmt new_error_stmt(region r, location location); +while_stmt new_while_stmt(region r, location location, expression condition, statement stmt); +dowhile_stmt new_dowhile_stmt(region r, location location, expression condition, statement stmt); +error_expr new_error_expr(region r, location location); +array_ref new_array_ref(region r, location location, expression arg1, expression arg2); +dereference new_dereference(region r, location location, expression arg1); +extension_expr new_extension_expr(region r, location location, expression arg1); +sizeof_expr new_sizeof_expr(region r, location location, expression arg1); +alignof_expr new_alignof_expr(region r, location location, expression arg1); +realpart new_realpart(region r, location location, expression arg1); +imagpart new_imagpart(region r, location location, expression arg1); +address_of new_address_of(region r, location location, expression arg1); +unary_minus new_unary_minus(region r, location location, expression arg1); +unary_plus new_unary_plus(region r, location location, expression arg1); +conjugate new_conjugate(region r, location location, expression arg1); +bitnot new_bitnot(region r, location location, expression arg1); +not new_not(region r, location location, expression arg1); +preincrement new_preincrement(region r, location location, expression arg1); +predecrement new_predecrement(region r, location location, expression arg1); +postincrement new_postincrement(region r, location location, expression arg1); +postdecrement new_postdecrement(region r, location location, expression arg1); +plus new_plus(region r, location location, expression arg1, expression arg2); +minus new_minus(region r, location location, expression arg1, expression arg2); +times new_times(region r, location location, expression arg1, expression arg2); +divide new_divide(region r, location location, expression arg1, expression arg2); +modulo new_modulo(region r, location location, expression arg1, expression arg2); +lshift new_lshift(region r, location location, expression arg1, expression arg2); +rshift new_rshift(region r, location location, expression arg1, expression arg2); +leq new_leq(region r, location location, expression arg1, expression arg2); +geq new_geq(region r, location location, expression arg1, expression arg2); +lt new_lt(region r, location location, expression arg1, expression arg2); +gt new_gt(region r, location location, expression arg1, expression arg2); +eq new_eq(region r, location location, expression arg1, expression arg2); +ne new_ne(region r, location location, expression arg1, expression arg2); +bitand new_bitand(region r, location location, expression arg1, expression arg2); +bitor new_bitor(region r, location location, expression arg1, expression arg2); +bitxor new_bitxor(region r, location location, expression arg1, expression arg2); +andand new_andand(region r, location location, expression arg1, expression arg2); +oror new_oror(region r, location location, expression arg1, expression arg2); +assign new_assign(region r, location location, expression arg1, expression arg2); +plus_assign new_plus_assign(region r, location location, expression arg1, expression arg2); +minus_assign new_minus_assign(region r, location location, expression arg1, expression arg2); +times_assign new_times_assign(region r, location location, expression arg1, expression arg2); +divide_assign new_divide_assign(region r, location location, expression arg1, expression arg2); +modulo_assign new_modulo_assign(region r, location location, expression arg1, expression arg2); +lshift_assign new_lshift_assign(region r, location location, expression arg1, expression arg2); +rshift_assign new_rshift_assign(region r, location location, expression arg1, expression arg2); +bitand_assign new_bitand_assign(region r, location location, expression arg1, expression arg2); +bitor_assign new_bitor_assign(region r, location location, expression arg1, expression arg2); +bitxor_assign new_bitxor_assign(region r, location location, expression arg1, expression arg2); +rp_connection new_rp_connection(region r, location location, endpoint ep1, endpoint ep2); +eq_connection new_eq_connection(region r, location location, endpoint ep1, endpoint ep2); +nx_struct_ref new_nx_struct_ref(region r, location location, word word1, attribute attributes, declaration fields, bool defined); +nx_union_ref new_nx_union_ref(region r, location location, word word1, attribute attributes, declaration fields, bool defined); diff --git a/src/AST_list_node.c b/src/AST_list_node.c new file mode 100644 index 0000000..4c26b41 --- /dev/null +++ b/src/AST_list_node.c @@ -0,0 +1,511 @@ +/* Automatically generated from nodetypes.def, do not edit. */ + +/* See the copyright notice in nodetypes.def */ +node AST_node_last(node l){ + if (!l) return NULL; + while (l->next) l = l->next; + return l; +} + +node AST_node_chain(node l1, node l2){ + if (!l1) return l2; + AST_node_last(l1)->next = l2; + return l1; +} + +int AST_node_length(node l){ + int len = 0; + + while (l) + { + l = l->next; + len++; + } + return len; +} + +node AST_node_reverse(node l){ + node last = NULL, next; + + for (;;) + { + if (!l) + return last; + next = l->next; + l->next = last; + last = l; + l = next; + } +} + +node node_chain(node l1, node l2) +{ return CAST(node, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +declaration declaration_chain(declaration l1, declaration l2) +{ return CAST(declaration, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +statement statement_chain(statement l1, statement l2) +{ return CAST(statement, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +expression expression_chain(expression l1, expression l2) +{ return CAST(expression, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +type_element type_element_chain(type_element l1, type_element l2) +{ return CAST(type_element, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +declarator declarator_chain(declarator l1, declarator l2) +{ return CAST(declarator, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +label label_chain(label l1, label l2) +{ return CAST(label, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +asm_decl asm_decl_chain(asm_decl l1, asm_decl l2) +{ return CAST(asm_decl, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +data_decl data_decl_chain(data_decl l1, data_decl l2) +{ return CAST(data_decl, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +extension_decl extension_decl_chain(extension_decl l1, extension_decl l2) +{ return CAST(extension_decl, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +ellipsis_decl ellipsis_decl_chain(ellipsis_decl l1, ellipsis_decl l2) +{ return CAST(ellipsis_decl, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +enumerator enumerator_chain(enumerator l1, enumerator l2) +{ return CAST(enumerator, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +oldidentifier_decl oldidentifier_decl_chain(oldidentifier_decl l1, oldidentifier_decl l2) +{ return CAST(oldidentifier_decl, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +function_decl function_decl_chain(function_decl l1, function_decl l2) +{ return CAST(function_decl, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +implicit_decl implicit_decl_chain(implicit_decl l1, implicit_decl l2) +{ return CAST(implicit_decl, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +variable_decl variable_decl_chain(variable_decl l1, variable_decl l2) +{ return CAST(variable_decl, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +field_decl field_decl_chain(field_decl l1, field_decl l2) +{ return CAST(field_decl, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +asttype asttype_chain(asttype l1, asttype l2) +{ return CAST(asttype, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +typename typename_chain(typename l1, typename l2) +{ return CAST(typename, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +typeof_expr typeof_expr_chain(typeof_expr l1, typeof_expr l2) +{ return CAST(typeof_expr, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +typeof_type typeof_type_chain(typeof_type l1, typeof_type l2) +{ return CAST(typeof_type, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +attribute attribute_chain(attribute l1, attribute l2) +{ return CAST(attribute, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +gcc_attribute gcc_attribute_chain(gcc_attribute l1, gcc_attribute l2) +{ return CAST(gcc_attribute, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +rid rid_chain(rid l1, rid l2) +{ return CAST(rid, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +qualifier qualifier_chain(qualifier l1, qualifier l2) +{ return CAST(qualifier, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +tag_ref tag_ref_chain(tag_ref l1, tag_ref l2) +{ return CAST(tag_ref, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +struct_ref struct_ref_chain(struct_ref l1, struct_ref l2) +{ return CAST(struct_ref, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +union_ref union_ref_chain(union_ref l1, union_ref l2) +{ return CAST(union_ref, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +nested_declarator nested_declarator_chain(nested_declarator l1, nested_declarator l2) +{ return CAST(nested_declarator, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +function_declarator function_declarator_chain(function_declarator l1, function_declarator l2) +{ return CAST(function_declarator, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +pointer_declarator pointer_declarator_chain(pointer_declarator l1, pointer_declarator l2) +{ return CAST(pointer_declarator, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +qualified_declarator qualified_declarator_chain(qualified_declarator l1, qualified_declarator l2) +{ return CAST(qualified_declarator, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +array_declarator array_declarator_chain(array_declarator l1, array_declarator l2) +{ return CAST(array_declarator, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +identifier_declarator identifier_declarator_chain(identifier_declarator l1, identifier_declarator l2) +{ return CAST(identifier_declarator, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +asm_stmt asm_stmt_chain(asm_stmt l1, asm_stmt l2) +{ return CAST(asm_stmt, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +compound_stmt compound_stmt_chain(compound_stmt l1, compound_stmt l2) +{ return CAST(compound_stmt, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +if_stmt if_stmt_chain(if_stmt l1, if_stmt l2) +{ return CAST(if_stmt, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +labeled_stmt labeled_stmt_chain(labeled_stmt l1, labeled_stmt l2) +{ return CAST(labeled_stmt, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +expression_stmt expression_stmt_chain(expression_stmt l1, expression_stmt l2) +{ return CAST(expression_stmt, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +conditional_stmt conditional_stmt_chain(conditional_stmt l1, conditional_stmt l2) +{ return CAST(conditional_stmt, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +switch_stmt switch_stmt_chain(switch_stmt l1, switch_stmt l2) +{ return CAST(switch_stmt, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +for_stmt for_stmt_chain(for_stmt l1, for_stmt l2) +{ return CAST(for_stmt, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +break_stmt break_stmt_chain(break_stmt l1, break_stmt l2) +{ return CAST(break_stmt, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +continue_stmt continue_stmt_chain(continue_stmt l1, continue_stmt l2) +{ return CAST(continue_stmt, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +return_stmt return_stmt_chain(return_stmt l1, return_stmt l2) +{ return CAST(return_stmt, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +goto_stmt goto_stmt_chain(goto_stmt l1, goto_stmt l2) +{ return CAST(goto_stmt, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +computed_goto_stmt computed_goto_stmt_chain(computed_goto_stmt l1, computed_goto_stmt l2) +{ return CAST(computed_goto_stmt, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +empty_stmt empty_stmt_chain(empty_stmt l1, empty_stmt l2) +{ return CAST(empty_stmt, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +unary unary_chain(unary l1, unary l2) +{ return CAST(unary, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +binary binary_chain(binary l1, binary l2) +{ return CAST(binary, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +comma comma_chain(comma l1, comma l2) +{ return CAST(comma, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +sizeof_type sizeof_type_chain(sizeof_type l1, sizeof_type l2) +{ return CAST(sizeof_type, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +alignof_type alignof_type_chain(alignof_type l1, alignof_type l2) +{ return CAST(alignof_type, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +label_address label_address_chain(label_address l1, label_address l2) +{ return CAST(label_address, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +cast cast_chain(cast l1, cast l2) +{ return CAST(cast, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +cast_list cast_list_chain(cast_list l1, cast_list l2) +{ return CAST(cast_list, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +conditional conditional_chain(conditional l1, conditional l2) +{ return CAST(conditional, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +identifier identifier_chain(identifier l1, identifier l2) +{ return CAST(identifier, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +compound_expr compound_expr_chain(compound_expr l1, compound_expr l2) +{ return CAST(compound_expr, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +function_call function_call_chain(function_call l1, function_call l2) +{ return CAST(function_call, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +field_ref field_ref_chain(field_ref l1, field_ref l2) +{ return CAST(field_ref, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +increment increment_chain(increment l1, increment l2) +{ return CAST(increment, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +comparison comparison_chain(comparison l1, comparison l2) +{ return CAST(comparison, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +assignment assignment_chain(assignment l1, assignment l2) +{ return CAST(assignment, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +init_list init_list_chain(init_list l1, init_list l2) +{ return CAST(init_list, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +init_specific init_specific_chain(init_specific l1, init_specific l2) +{ return CAST(init_specific, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +designator designator_chain(designator l1, designator l2) +{ return CAST(designator, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +designate_field designate_field_chain(designate_field l1, designate_field l2) +{ return CAST(designate_field, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +designate_index designate_index_chain(designate_index l1, designate_index l2) +{ return CAST(designate_index, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +lexical_cst lexical_cst_chain(lexical_cst l1, lexical_cst l2) +{ return CAST(lexical_cst, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +string_cst string_cst_chain(string_cst l1, string_cst l2) +{ return CAST(string_cst, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +string string_chain(string l1, string l2) +{ return CAST(string, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +id_label id_label_chain(id_label l1, id_label l2) +{ return CAST(id_label, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +case_label case_label_chain(case_label l1, case_label l2) +{ return CAST(case_label, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +default_label default_label_chain(default_label l1, default_label l2) +{ return CAST(default_label, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +word word_chain(word l1, word l2) +{ return CAST(word, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +asm_operand asm_operand_chain(asm_operand l1, asm_operand l2) +{ return CAST(asm_operand, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +nesc_decl nesc_decl_chain(nesc_decl l1, nesc_decl l2) +{ return CAST(nesc_decl, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +interface interface_chain(interface l1, interface l2) +{ return CAST(interface, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +component component_chain(component l1, component l2) +{ return CAST(component, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +implementation implementation_chain(implementation l1, implementation l2) +{ return CAST(implementation, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +configuration configuration_chain(configuration l1, configuration l2) +{ return CAST(configuration, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +module module_chain(module l1, module l2) +{ return CAST(module, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +binary_component binary_component_chain(binary_component l1, binary_component l2) +{ return CAST(binary_component, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +rp_interface rp_interface_chain(rp_interface l1, rp_interface l2) +{ return CAST(rp_interface, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +interface_ref interface_ref_chain(interface_ref l1, interface_ref l2) +{ return CAST(interface_ref, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +component_ref component_ref_chain(component_ref l1, component_ref l2) +{ return CAST(component_ref, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +connection connection_chain(connection l1, connection l2) +{ return CAST(connection, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +endpoint endpoint_chain(endpoint l1, endpoint l2) +{ return CAST(endpoint, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +parameterised_identifier parameterised_identifier_chain(parameterised_identifier l1, parameterised_identifier l2) +{ return CAST(parameterised_identifier, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +generic_declarator generic_declarator_chain(generic_declarator l1, generic_declarator l2) +{ return CAST(generic_declarator, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +generic_call generic_call_chain(generic_call l1, generic_call l2) +{ return CAST(generic_call, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +interface_ref_declarator interface_ref_declarator_chain(interface_ref_declarator l1, interface_ref_declarator l2) +{ return CAST(interface_ref_declarator, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +interface_deref interface_deref_chain(interface_deref l1, interface_deref l2) +{ return CAST(interface_deref, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +component_deref component_deref_chain(component_deref l1, component_deref l2) +{ return CAST(component_deref, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +component_typeref component_typeref_chain(component_typeref l1, component_typeref l2) +{ return CAST(component_typeref, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +atomic_stmt atomic_stmt_chain(atomic_stmt l1, atomic_stmt l2) +{ return CAST(atomic_stmt, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +nesc_attribute nesc_attribute_chain(nesc_attribute l1, nesc_attribute l2) +{ return CAST(nesc_attribute, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +type_parm_decl type_parm_decl_chain(type_parm_decl l1, type_parm_decl l2) +{ return CAST(type_parm_decl, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +type_argument type_argument_chain(type_argument l1, type_argument l2) +{ return CAST(type_argument, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +error_decl error_decl_chain(error_decl l1, error_decl l2) +{ return CAST(error_decl, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +attribute_ref attribute_ref_chain(attribute_ref l1, attribute_ref l2) +{ return CAST(attribute_ref, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +enum_ref enum_ref_chain(enum_ref l1, enum_ref l2) +{ return CAST(enum_ref, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +error_stmt error_stmt_chain(error_stmt l1, error_stmt l2) +{ return CAST(error_stmt, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +while_stmt while_stmt_chain(while_stmt l1, while_stmt l2) +{ return CAST(while_stmt, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +dowhile_stmt dowhile_stmt_chain(dowhile_stmt l1, dowhile_stmt l2) +{ return CAST(dowhile_stmt, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +error_expr error_expr_chain(error_expr l1, error_expr l2) +{ return CAST(error_expr, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +array_ref array_ref_chain(array_ref l1, array_ref l2) +{ return CAST(array_ref, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +dereference dereference_chain(dereference l1, dereference l2) +{ return CAST(dereference, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +extension_expr extension_expr_chain(extension_expr l1, extension_expr l2) +{ return CAST(extension_expr, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +sizeof_expr sizeof_expr_chain(sizeof_expr l1, sizeof_expr l2) +{ return CAST(sizeof_expr, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +alignof_expr alignof_expr_chain(alignof_expr l1, alignof_expr l2) +{ return CAST(alignof_expr, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +realpart realpart_chain(realpart l1, realpart l2) +{ return CAST(realpart, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +imagpart imagpart_chain(imagpart l1, imagpart l2) +{ return CAST(imagpart, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +address_of address_of_chain(address_of l1, address_of l2) +{ return CAST(address_of, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +unary_minus unary_minus_chain(unary_minus l1, unary_minus l2) +{ return CAST(unary_minus, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +unary_plus unary_plus_chain(unary_plus l1, unary_plus l2) +{ return CAST(unary_plus, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +conjugate conjugate_chain(conjugate l1, conjugate l2) +{ return CAST(conjugate, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +bitnot bitnot_chain(bitnot l1, bitnot l2) +{ return CAST(bitnot, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +not not_chain(not l1, not l2) +{ return CAST(not, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +preincrement preincrement_chain(preincrement l1, preincrement l2) +{ return CAST(preincrement, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +predecrement predecrement_chain(predecrement l1, predecrement l2) +{ return CAST(predecrement, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +postincrement postincrement_chain(postincrement l1, postincrement l2) +{ return CAST(postincrement, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +postdecrement postdecrement_chain(postdecrement l1, postdecrement l2) +{ return CAST(postdecrement, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +plus plus_chain(plus l1, plus l2) +{ return CAST(plus, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +minus minus_chain(minus l1, minus l2) +{ return CAST(minus, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +times times_chain(times l1, times l2) +{ return CAST(times, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +divide divide_chain(divide l1, divide l2) +{ return CAST(divide, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +modulo modulo_chain(modulo l1, modulo l2) +{ return CAST(modulo, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +lshift lshift_chain(lshift l1, lshift l2) +{ return CAST(lshift, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +rshift rshift_chain(rshift l1, rshift l2) +{ return CAST(rshift, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +leq leq_chain(leq l1, leq l2) +{ return CAST(leq, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +geq geq_chain(geq l1, geq l2) +{ return CAST(geq, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +lt lt_chain(lt l1, lt l2) +{ return CAST(lt, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +gt gt_chain(gt l1, gt l2) +{ return CAST(gt, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +eq eq_chain(eq l1, eq l2) +{ return CAST(eq, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +ne ne_chain(ne l1, ne l2) +{ return CAST(ne, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +bitand bitand_chain(bitand l1, bitand l2) +{ return CAST(bitand, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +bitor bitor_chain(bitor l1, bitor l2) +{ return CAST(bitor, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +bitxor bitxor_chain(bitxor l1, bitxor l2) +{ return CAST(bitxor, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +andand andand_chain(andand l1, andand l2) +{ return CAST(andand, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +oror oror_chain(oror l1, oror l2) +{ return CAST(oror, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +assign assign_chain(assign l1, assign l2) +{ return CAST(assign, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +plus_assign plus_assign_chain(plus_assign l1, plus_assign l2) +{ return CAST(plus_assign, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +minus_assign minus_assign_chain(minus_assign l1, minus_assign l2) +{ return CAST(minus_assign, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +times_assign times_assign_chain(times_assign l1, times_assign l2) +{ return CAST(times_assign, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +divide_assign divide_assign_chain(divide_assign l1, divide_assign l2) +{ return CAST(divide_assign, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +modulo_assign modulo_assign_chain(modulo_assign l1, modulo_assign l2) +{ return CAST(modulo_assign, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +lshift_assign lshift_assign_chain(lshift_assign l1, lshift_assign l2) +{ return CAST(lshift_assign, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +rshift_assign rshift_assign_chain(rshift_assign l1, rshift_assign l2) +{ return CAST(rshift_assign, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +bitand_assign bitand_assign_chain(bitand_assign l1, bitand_assign l2) +{ return CAST(bitand_assign, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +bitor_assign bitor_assign_chain(bitor_assign l1, bitor_assign l2) +{ return CAST(bitor_assign, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +bitxor_assign bitxor_assign_chain(bitxor_assign l1, bitxor_assign l2) +{ return CAST(bitxor_assign, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +rp_connection rp_connection_chain(rp_connection l1, rp_connection l2) +{ return CAST(rp_connection, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +eq_connection eq_connection_chain(eq_connection l1, eq_connection l2) +{ return CAST(eq_connection, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +nx_struct_ref nx_struct_ref_chain(nx_struct_ref l1, nx_struct_ref l2) +{ return CAST(nx_struct_ref, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + +nx_union_ref nx_union_ref_chain(nx_union_ref l1, nx_union_ref l2) +{ return CAST(nx_union_ref, AST_node_chain(CAST(node, l1), CAST(node, l2))); } + diff --git a/src/AST_list_node.h b/src/AST_list_node.h new file mode 100644 index 0000000..bcf6b9b --- /dev/null +++ b/src/AST_list_node.h @@ -0,0 +1,792 @@ +/* Automatically generated from nodetypes.def, do not edit. */ + +/* See the copyright notice in nodetypes.def */ +node AST_node_last(node l); +node AST_node_chain(node l1, node l2); +int AST_node_length(node l); +node AST_node_reverse(node l); +#define node_reverse(x) CAST(node, AST_node_reverse(CAST(node, (x)))) +#define node_length(x) AST_node_length(CAST(node, (x))) +#define last_node(x) CAST(node, AST_node_last(CAST(node, (x)))) +#define scan_node(var, list) for (var = (list); var; var = CAST(node, var->next)) +#define declaration_reverse(x) CAST(declaration, AST_node_reverse(CAST(node, (x)))) +#define declaration_length(x) AST_node_length(CAST(node, (x))) +#define last_declaration(x) CAST(declaration, AST_node_last(CAST(node, (x)))) +#define scan_declaration(var, list) for (var = (list); var; var = CAST(declaration, var->next)) +#define statement_reverse(x) CAST(statement, AST_node_reverse(CAST(node, (x)))) +#define statement_length(x) AST_node_length(CAST(node, (x))) +#define last_statement(x) CAST(statement, AST_node_last(CAST(node, (x)))) +#define scan_statement(var, list) for (var = (list); var; var = CAST(statement, var->next)) +#define expression_reverse(x) CAST(expression, AST_node_reverse(CAST(node, (x)))) +#define expression_length(x) AST_node_length(CAST(node, (x))) +#define last_expression(x) CAST(expression, AST_node_last(CAST(node, (x)))) +#define scan_expression(var, list) for (var = (list); var; var = CAST(expression, var->next)) +#define type_element_reverse(x) CAST(type_element, AST_node_reverse(CAST(node, (x)))) +#define type_element_length(x) AST_node_length(CAST(node, (x))) +#define last_type_element(x) CAST(type_element, AST_node_last(CAST(node, (x)))) +#define scan_type_element(var, list) for (var = (list); var; var = CAST(type_element, var->next)) +#define declarator_reverse(x) CAST(declarator, AST_node_reverse(CAST(node, (x)))) +#define declarator_length(x) AST_node_length(CAST(node, (x))) +#define last_declarator(x) CAST(declarator, AST_node_last(CAST(node, (x)))) +#define scan_declarator(var, list) for (var = (list); var; var = CAST(declarator, var->next)) +#define label_reverse(x) CAST(label, AST_node_reverse(CAST(node, (x)))) +#define label_length(x) AST_node_length(CAST(node, (x))) +#define last_label(x) CAST(label, AST_node_last(CAST(node, (x)))) +#define scan_label(var, list) for (var = (list); var; var = CAST(label, var->next)) +#define asm_decl_reverse(x) CAST(asm_decl, AST_node_reverse(CAST(node, (x)))) +#define asm_decl_length(x) AST_node_length(CAST(node, (x))) +#define last_asm_decl(x) CAST(asm_decl, AST_node_last(CAST(node, (x)))) +#define scan_asm_decl(var, list) for (var = (list); var; var = CAST(asm_decl, var->next)) +#define data_decl_reverse(x) CAST(data_decl, AST_node_reverse(CAST(node, (x)))) +#define data_decl_length(x) AST_node_length(CAST(node, (x))) +#define last_data_decl(x) CAST(data_decl, AST_node_last(CAST(node, (x)))) +#define scan_data_decl(var, list) for (var = (list); var; var = CAST(data_decl, var->next)) +#define extension_decl_reverse(x) CAST(extension_decl, AST_node_reverse(CAST(node, (x)))) +#define extension_decl_length(x) AST_node_length(CAST(node, (x))) +#define last_extension_decl(x) CAST(extension_decl, AST_node_last(CAST(node, (x)))) +#define scan_extension_decl(var, list) for (var = (list); var; var = CAST(extension_decl, var->next)) +#define ellipsis_decl_reverse(x) CAST(ellipsis_decl, AST_node_reverse(CAST(node, (x)))) +#define ellipsis_decl_length(x) AST_node_length(CAST(node, (x))) +#define last_ellipsis_decl(x) CAST(ellipsis_decl, AST_node_last(CAST(node, (x)))) +#define scan_ellipsis_decl(var, list) for (var = (list); var; var = CAST(ellipsis_decl, var->next)) +#define enumerator_reverse(x) CAST(enumerator, AST_node_reverse(CAST(node, (x)))) +#define enumerator_length(x) AST_node_length(CAST(node, (x))) +#define last_enumerator(x) CAST(enumerator, AST_node_last(CAST(node, (x)))) +#define scan_enumerator(var, list) for (var = (list); var; var = CAST(enumerator, var->next)) +#define oldidentifier_decl_reverse(x) CAST(oldidentifier_decl, AST_node_reverse(CAST(node, (x)))) +#define oldidentifier_decl_length(x) AST_node_length(CAST(node, (x))) +#define last_oldidentifier_decl(x) CAST(oldidentifier_decl, AST_node_last(CAST(node, (x)))) +#define scan_oldidentifier_decl(var, list) for (var = (list); var; var = CAST(oldidentifier_decl, var->next)) +#define function_decl_reverse(x) CAST(function_decl, AST_node_reverse(CAST(node, (x)))) +#define function_decl_length(x) AST_node_length(CAST(node, (x))) +#define last_function_decl(x) CAST(function_decl, AST_node_last(CAST(node, (x)))) +#define scan_function_decl(var, list) for (var = (list); var; var = CAST(function_decl, var->next)) +#define implicit_decl_reverse(x) CAST(implicit_decl, AST_node_reverse(CAST(node, (x)))) +#define implicit_decl_length(x) AST_node_length(CAST(node, (x))) +#define last_implicit_decl(x) CAST(implicit_decl, AST_node_last(CAST(node, (x)))) +#define scan_implicit_decl(var, list) for (var = (list); var; var = CAST(implicit_decl, var->next)) +#define variable_decl_reverse(x) CAST(variable_decl, AST_node_reverse(CAST(node, (x)))) +#define variable_decl_length(x) AST_node_length(CAST(node, (x))) +#define last_variable_decl(x) CAST(variable_decl, AST_node_last(CAST(node, (x)))) +#define scan_variable_decl(var, list) for (var = (list); var; var = CAST(variable_decl, var->next)) +#define field_decl_reverse(x) CAST(field_decl, AST_node_reverse(CAST(node, (x)))) +#define field_decl_length(x) AST_node_length(CAST(node, (x))) +#define last_field_decl(x) CAST(field_decl, AST_node_last(CAST(node, (x)))) +#define scan_field_decl(var, list) for (var = (list); var; var = CAST(field_decl, var->next)) +#define asttype_reverse(x) CAST(asttype, AST_node_reverse(CAST(node, (x)))) +#define asttype_length(x) AST_node_length(CAST(node, (x))) +#define last_asttype(x) CAST(asttype, AST_node_last(CAST(node, (x)))) +#define scan_asttype(var, list) for (var = (list); var; var = CAST(asttype, var->next)) +#define typename_reverse(x) CAST(typename, AST_node_reverse(CAST(node, (x)))) +#define typename_length(x) AST_node_length(CAST(node, (x))) +#define last_typename(x) CAST(typename, AST_node_last(CAST(node, (x)))) +#define scan_typename(var, list) for (var = (list); var; var = CAST(typename, var->next)) +#define typeof_expr_reverse(x) CAST(typeof_expr, AST_node_reverse(CAST(node, (x)))) +#define typeof_expr_length(x) AST_node_length(CAST(node, (x))) +#define last_typeof_expr(x) CAST(typeof_expr, AST_node_last(CAST(node, (x)))) +#define scan_typeof_expr(var, list) for (var = (list); var; var = CAST(typeof_expr, var->next)) +#define typeof_type_reverse(x) CAST(typeof_type, AST_node_reverse(CAST(node, (x)))) +#define typeof_type_length(x) AST_node_length(CAST(node, (x))) +#define last_typeof_type(x) CAST(typeof_type, AST_node_last(CAST(node, (x)))) +#define scan_typeof_type(var, list) for (var = (list); var; var = CAST(typeof_type, var->next)) +#define attribute_reverse(x) CAST(attribute, AST_node_reverse(CAST(node, (x)))) +#define attribute_length(x) AST_node_length(CAST(node, (x))) +#define last_attribute(x) CAST(attribute, AST_node_last(CAST(node, (x)))) +#define scan_attribute(var, list) for (var = (list); var; var = CAST(attribute, var->next)) +#define gcc_attribute_reverse(x) CAST(gcc_attribute, AST_node_reverse(CAST(node, (x)))) +#define gcc_attribute_length(x) AST_node_length(CAST(node, (x))) +#define last_gcc_attribute(x) CAST(gcc_attribute, AST_node_last(CAST(node, (x)))) +#define scan_gcc_attribute(var, list) for (var = (list); var; var = CAST(gcc_attribute, var->next)) +#define rid_reverse(x) CAST(rid, AST_node_reverse(CAST(node, (x)))) +#define rid_length(x) AST_node_length(CAST(node, (x))) +#define last_rid(x) CAST(rid, AST_node_last(CAST(node, (x)))) +#define scan_rid(var, list) for (var = (list); var; var = CAST(rid, var->next)) +#define qualifier_reverse(x) CAST(qualifier, AST_node_reverse(CAST(node, (x)))) +#define qualifier_length(x) AST_node_length(CAST(node, (x))) +#define last_qualifier(x) CAST(qualifier, AST_node_last(CAST(node, (x)))) +#define scan_qualifier(var, list) for (var = (list); var; var = CAST(qualifier, var->next)) +#define tag_ref_reverse(x) CAST(tag_ref, AST_node_reverse(CAST(node, (x)))) +#define tag_ref_length(x) AST_node_length(CAST(node, (x))) +#define last_tag_ref(x) CAST(tag_ref, AST_node_last(CAST(node, (x)))) +#define scan_tag_ref(var, list) for (var = (list); var; var = CAST(tag_ref, var->next)) +#define struct_ref_reverse(x) CAST(struct_ref, AST_node_reverse(CAST(node, (x)))) +#define struct_ref_length(x) AST_node_length(CAST(node, (x))) +#define last_struct_ref(x) CAST(struct_ref, AST_node_last(CAST(node, (x)))) +#define scan_struct_ref(var, list) for (var = (list); var; var = CAST(struct_ref, var->next)) +#define union_ref_reverse(x) CAST(union_ref, AST_node_reverse(CAST(node, (x)))) +#define union_ref_length(x) AST_node_length(CAST(node, (x))) +#define last_union_ref(x) CAST(union_ref, AST_node_last(CAST(node, (x)))) +#define scan_union_ref(var, list) for (var = (list); var; var = CAST(union_ref, var->next)) +#define nested_declarator_reverse(x) CAST(nested_declarator, AST_node_reverse(CAST(node, (x)))) +#define nested_declarator_length(x) AST_node_length(CAST(node, (x))) +#define last_nested_declarator(x) CAST(nested_declarator, AST_node_last(CAST(node, (x)))) +#define scan_nested_declarator(var, list) for (var = (list); var; var = CAST(nested_declarator, var->next)) +#define function_declarator_reverse(x) CAST(function_declarator, AST_node_reverse(CAST(node, (x)))) +#define function_declarator_length(x) AST_node_length(CAST(node, (x))) +#define last_function_declarator(x) CAST(function_declarator, AST_node_last(CAST(node, (x)))) +#define scan_function_declarator(var, list) for (var = (list); var; var = CAST(function_declarator, var->next)) +#define pointer_declarator_reverse(x) CAST(pointer_declarator, AST_node_reverse(CAST(node, (x)))) +#define pointer_declarator_length(x) AST_node_length(CAST(node, (x))) +#define last_pointer_declarator(x) CAST(pointer_declarator, AST_node_last(CAST(node, (x)))) +#define scan_pointer_declarator(var, list) for (var = (list); var; var = CAST(pointer_declarator, var->next)) +#define qualified_declarator_reverse(x) CAST(qualified_declarator, AST_node_reverse(CAST(node, (x)))) +#define qualified_declarator_length(x) AST_node_length(CAST(node, (x))) +#define last_qualified_declarator(x) CAST(qualified_declarator, AST_node_last(CAST(node, (x)))) +#define scan_qualified_declarator(var, list) for (var = (list); var; var = CAST(qualified_declarator, var->next)) +#define array_declarator_reverse(x) CAST(array_declarator, AST_node_reverse(CAST(node, (x)))) +#define array_declarator_length(x) AST_node_length(CAST(node, (x))) +#define last_array_declarator(x) CAST(array_declarator, AST_node_last(CAST(node, (x)))) +#define scan_array_declarator(var, list) for (var = (list); var; var = CAST(array_declarator, var->next)) +#define identifier_declarator_reverse(x) CAST(identifier_declarator, AST_node_reverse(CAST(node, (x)))) +#define identifier_declarator_length(x) AST_node_length(CAST(node, (x))) +#define last_identifier_declarator(x) CAST(identifier_declarator, AST_node_last(CAST(node, (x)))) +#define scan_identifier_declarator(var, list) for (var = (list); var; var = CAST(identifier_declarator, var->next)) +#define asm_stmt_reverse(x) CAST(asm_stmt, AST_node_reverse(CAST(node, (x)))) +#define asm_stmt_length(x) AST_node_length(CAST(node, (x))) +#define last_asm_stmt(x) CAST(asm_stmt, AST_node_last(CAST(node, (x)))) +#define scan_asm_stmt(var, list) for (var = (list); var; var = CAST(asm_stmt, var->next)) +#define compound_stmt_reverse(x) CAST(compound_stmt, AST_node_reverse(CAST(node, (x)))) +#define compound_stmt_length(x) AST_node_length(CAST(node, (x))) +#define last_compound_stmt(x) CAST(compound_stmt, AST_node_last(CAST(node, (x)))) +#define scan_compound_stmt(var, list) for (var = (list); var; var = CAST(compound_stmt, var->next)) +#define if_stmt_reverse(x) CAST(if_stmt, AST_node_reverse(CAST(node, (x)))) +#define if_stmt_length(x) AST_node_length(CAST(node, (x))) +#define last_if_stmt(x) CAST(if_stmt, AST_node_last(CAST(node, (x)))) +#define scan_if_stmt(var, list) for (var = (list); var; var = CAST(if_stmt, var->next)) +#define labeled_stmt_reverse(x) CAST(labeled_stmt, AST_node_reverse(CAST(node, (x)))) +#define labeled_stmt_length(x) AST_node_length(CAST(node, (x))) +#define last_labeled_stmt(x) CAST(labeled_stmt, AST_node_last(CAST(node, (x)))) +#define scan_labeled_stmt(var, list) for (var = (list); var; var = CAST(labeled_stmt, var->next)) +#define expression_stmt_reverse(x) CAST(expression_stmt, AST_node_reverse(CAST(node, (x)))) +#define expression_stmt_length(x) AST_node_length(CAST(node, (x))) +#define last_expression_stmt(x) CAST(expression_stmt, AST_node_last(CAST(node, (x)))) +#define scan_expression_stmt(var, list) for (var = (list); var; var = CAST(expression_stmt, var->next)) +#define conditional_stmt_reverse(x) CAST(conditional_stmt, AST_node_reverse(CAST(node, (x)))) +#define conditional_stmt_length(x) AST_node_length(CAST(node, (x))) +#define last_conditional_stmt(x) CAST(conditional_stmt, AST_node_last(CAST(node, (x)))) +#define scan_conditional_stmt(var, list) for (var = (list); var; var = CAST(conditional_stmt, var->next)) +#define switch_stmt_reverse(x) CAST(switch_stmt, AST_node_reverse(CAST(node, (x)))) +#define switch_stmt_length(x) AST_node_length(CAST(node, (x))) +#define last_switch_stmt(x) CAST(switch_stmt, AST_node_last(CAST(node, (x)))) +#define scan_switch_stmt(var, list) for (var = (list); var; var = CAST(switch_stmt, var->next)) +#define for_stmt_reverse(x) CAST(for_stmt, AST_node_reverse(CAST(node, (x)))) +#define for_stmt_length(x) AST_node_length(CAST(node, (x))) +#define last_for_stmt(x) CAST(for_stmt, AST_node_last(CAST(node, (x)))) +#define scan_for_stmt(var, list) for (var = (list); var; var = CAST(for_stmt, var->next)) +#define break_stmt_reverse(x) CAST(break_stmt, AST_node_reverse(CAST(node, (x)))) +#define break_stmt_length(x) AST_node_length(CAST(node, (x))) +#define last_break_stmt(x) CAST(break_stmt, AST_node_last(CAST(node, (x)))) +#define scan_break_stmt(var, list) for (var = (list); var; var = CAST(break_stmt, var->next)) +#define continue_stmt_reverse(x) CAST(continue_stmt, AST_node_reverse(CAST(node, (x)))) +#define continue_stmt_length(x) AST_node_length(CAST(node, (x))) +#define last_continue_stmt(x) CAST(continue_stmt, AST_node_last(CAST(node, (x)))) +#define scan_continue_stmt(var, list) for (var = (list); var; var = CAST(continue_stmt, var->next)) +#define return_stmt_reverse(x) CAST(return_stmt, AST_node_reverse(CAST(node, (x)))) +#define return_stmt_length(x) AST_node_length(CAST(node, (x))) +#define last_return_stmt(x) CAST(return_stmt, AST_node_last(CAST(node, (x)))) +#define scan_return_stmt(var, list) for (var = (list); var; var = CAST(return_stmt, var->next)) +#define goto_stmt_reverse(x) CAST(goto_stmt, AST_node_reverse(CAST(node, (x)))) +#define goto_stmt_length(x) AST_node_length(CAST(node, (x))) +#define last_goto_stmt(x) CAST(goto_stmt, AST_node_last(CAST(node, (x)))) +#define scan_goto_stmt(var, list) for (var = (list); var; var = CAST(goto_stmt, var->next)) +#define computed_goto_stmt_reverse(x) CAST(computed_goto_stmt, AST_node_reverse(CAST(node, (x)))) +#define computed_goto_stmt_length(x) AST_node_length(CAST(node, (x))) +#define last_computed_goto_stmt(x) CAST(computed_goto_stmt, AST_node_last(CAST(node, (x)))) +#define scan_computed_goto_stmt(var, list) for (var = (list); var; var = CAST(computed_goto_stmt, var->next)) +#define empty_stmt_reverse(x) CAST(empty_stmt, AST_node_reverse(CAST(node, (x)))) +#define empty_stmt_length(x) AST_node_length(CAST(node, (x))) +#define last_empty_stmt(x) CAST(empty_stmt, AST_node_last(CAST(node, (x)))) +#define scan_empty_stmt(var, list) for (var = (list); var; var = CAST(empty_stmt, var->next)) +#define unary_reverse(x) CAST(unary, AST_node_reverse(CAST(node, (x)))) +#define unary_length(x) AST_node_length(CAST(node, (x))) +#define last_unary(x) CAST(unary, AST_node_last(CAST(node, (x)))) +#define scan_unary(var, list) for (var = (list); var; var = CAST(unary, var->next)) +#define binary_reverse(x) CAST(binary, AST_node_reverse(CAST(node, (x)))) +#define binary_length(x) AST_node_length(CAST(node, (x))) +#define last_binary(x) CAST(binary, AST_node_last(CAST(node, (x)))) +#define scan_binary(var, list) for (var = (list); var; var = CAST(binary, var->next)) +#define comma_reverse(x) CAST(comma, AST_node_reverse(CAST(node, (x)))) +#define comma_length(x) AST_node_length(CAST(node, (x))) +#define last_comma(x) CAST(comma, AST_node_last(CAST(node, (x)))) +#define scan_comma(var, list) for (var = (list); var; var = CAST(comma, var->next)) +#define sizeof_type_reverse(x) CAST(sizeof_type, AST_node_reverse(CAST(node, (x)))) +#define sizeof_type_length(x) AST_node_length(CAST(node, (x))) +#define last_sizeof_type(x) CAST(sizeof_type, AST_node_last(CAST(node, (x)))) +#define scan_sizeof_type(var, list) for (var = (list); var; var = CAST(sizeof_type, var->next)) +#define alignof_type_reverse(x) CAST(alignof_type, AST_node_reverse(CAST(node, (x)))) +#define alignof_type_length(x) AST_node_length(CAST(node, (x))) +#define last_alignof_type(x) CAST(alignof_type, AST_node_last(CAST(node, (x)))) +#define scan_alignof_type(var, list) for (var = (list); var; var = CAST(alignof_type, var->next)) +#define label_address_reverse(x) CAST(label_address, AST_node_reverse(CAST(node, (x)))) +#define label_address_length(x) AST_node_length(CAST(node, (x))) +#define last_label_address(x) CAST(label_address, AST_node_last(CAST(node, (x)))) +#define scan_label_address(var, list) for (var = (list); var; var = CAST(label_address, var->next)) +#define cast_reverse(x) CAST(cast, AST_node_reverse(CAST(node, (x)))) +#define cast_length(x) AST_node_length(CAST(node, (x))) +#define last_cast(x) CAST(cast, AST_node_last(CAST(node, (x)))) +#define scan_cast(var, list) for (var = (list); var; var = CAST(cast, var->next)) +#define cast_list_reverse(x) CAST(cast_list, AST_node_reverse(CAST(node, (x)))) +#define cast_list_length(x) AST_node_length(CAST(node, (x))) +#define last_cast_list(x) CAST(cast_list, AST_node_last(CAST(node, (x)))) +#define scan_cast_list(var, list) for (var = (list); var; var = CAST(cast_list, var->next)) +#define conditional_reverse(x) CAST(conditional, AST_node_reverse(CAST(node, (x)))) +#define conditional_length(x) AST_node_length(CAST(node, (x))) +#define last_conditional(x) CAST(conditional, AST_node_last(CAST(node, (x)))) +#define scan_conditional(var, list) for (var = (list); var; var = CAST(conditional, var->next)) +#define identifier_reverse(x) CAST(identifier, AST_node_reverse(CAST(node, (x)))) +#define identifier_length(x) AST_node_length(CAST(node, (x))) +#define last_identifier(x) CAST(identifier, AST_node_last(CAST(node, (x)))) +#define scan_identifier(var, list) for (var = (list); var; var = CAST(identifier, var->next)) +#define compound_expr_reverse(x) CAST(compound_expr, AST_node_reverse(CAST(node, (x)))) +#define compound_expr_length(x) AST_node_length(CAST(node, (x))) +#define last_compound_expr(x) CAST(compound_expr, AST_node_last(CAST(node, (x)))) +#define scan_compound_expr(var, list) for (var = (list); var; var = CAST(compound_expr, var->next)) +#define function_call_reverse(x) CAST(function_call, AST_node_reverse(CAST(node, (x)))) +#define function_call_length(x) AST_node_length(CAST(node, (x))) +#define last_function_call(x) CAST(function_call, AST_node_last(CAST(node, (x)))) +#define scan_function_call(var, list) for (var = (list); var; var = CAST(function_call, var->next)) +#define field_ref_reverse(x) CAST(field_ref, AST_node_reverse(CAST(node, (x)))) +#define field_ref_length(x) AST_node_length(CAST(node, (x))) +#define last_field_ref(x) CAST(field_ref, AST_node_last(CAST(node, (x)))) +#define scan_field_ref(var, list) for (var = (list); var; var = CAST(field_ref, var->next)) +#define increment_reverse(x) CAST(increment, AST_node_reverse(CAST(node, (x)))) +#define increment_length(x) AST_node_length(CAST(node, (x))) +#define last_increment(x) CAST(increment, AST_node_last(CAST(node, (x)))) +#define scan_increment(var, list) for (var = (list); var; var = CAST(increment, var->next)) +#define comparison_reverse(x) CAST(comparison, AST_node_reverse(CAST(node, (x)))) +#define comparison_length(x) AST_node_length(CAST(node, (x))) +#define last_comparison(x) CAST(comparison, AST_node_last(CAST(node, (x)))) +#define scan_comparison(var, list) for (var = (list); var; var = CAST(comparison, var->next)) +#define assignment_reverse(x) CAST(assignment, AST_node_reverse(CAST(node, (x)))) +#define assignment_length(x) AST_node_length(CAST(node, (x))) +#define last_assignment(x) CAST(assignment, AST_node_last(CAST(node, (x)))) +#define scan_assignment(var, list) for (var = (list); var; var = CAST(assignment, var->next)) +#define init_list_reverse(x) CAST(init_list, AST_node_reverse(CAST(node, (x)))) +#define init_list_length(x) AST_node_length(CAST(node, (x))) +#define last_init_list(x) CAST(init_list, AST_node_last(CAST(node, (x)))) +#define scan_init_list(var, list) for (var = (list); var; var = CAST(init_list, var->next)) +#define init_specific_reverse(x) CAST(init_specific, AST_node_reverse(CAST(node, (x)))) +#define init_specific_length(x) AST_node_length(CAST(node, (x))) +#define last_init_specific(x) CAST(init_specific, AST_node_last(CAST(node, (x)))) +#define scan_init_specific(var, list) for (var = (list); var; var = CAST(init_specific, var->next)) +#define designator_reverse(x) CAST(designator, AST_node_reverse(CAST(node, (x)))) +#define designator_length(x) AST_node_length(CAST(node, (x))) +#define last_designator(x) CAST(designator, AST_node_last(CAST(node, (x)))) +#define scan_designator(var, list) for (var = (list); var; var = CAST(designator, var->next)) +#define designate_field_reverse(x) CAST(designate_field, AST_node_reverse(CAST(node, (x)))) +#define designate_field_length(x) AST_node_length(CAST(node, (x))) +#define last_designate_field(x) CAST(designate_field, AST_node_last(CAST(node, (x)))) +#define scan_designate_field(var, list) for (var = (list); var; var = CAST(designate_field, var->next)) +#define designate_index_reverse(x) CAST(designate_index, AST_node_reverse(CAST(node, (x)))) +#define designate_index_length(x) AST_node_length(CAST(node, (x))) +#define last_designate_index(x) CAST(designate_index, AST_node_last(CAST(node, (x)))) +#define scan_designate_index(var, list) for (var = (list); var; var = CAST(designate_index, var->next)) +#define lexical_cst_reverse(x) CAST(lexical_cst, AST_node_reverse(CAST(node, (x)))) +#define lexical_cst_length(x) AST_node_length(CAST(node, (x))) +#define last_lexical_cst(x) CAST(lexical_cst, AST_node_last(CAST(node, (x)))) +#define scan_lexical_cst(var, list) for (var = (list); var; var = CAST(lexical_cst, var->next)) +#define string_cst_reverse(x) CAST(string_cst, AST_node_reverse(CAST(node, (x)))) +#define string_cst_length(x) AST_node_length(CAST(node, (x))) +#define last_string_cst(x) CAST(string_cst, AST_node_last(CAST(node, (x)))) +#define scan_string_cst(var, list) for (var = (list); var; var = CAST(string_cst, var->next)) +#define string_reverse(x) CAST(string, AST_node_reverse(CAST(node, (x)))) +#define string_length(x) AST_node_length(CAST(node, (x))) +#define last_string(x) CAST(string, AST_node_last(CAST(node, (x)))) +#define scan_string(var, list) for (var = (list); var; var = CAST(string, var->next)) +#define id_label_reverse(x) CAST(id_label, AST_node_reverse(CAST(node, (x)))) +#define id_label_length(x) AST_node_length(CAST(node, (x))) +#define last_id_label(x) CAST(id_label, AST_node_last(CAST(node, (x)))) +#define scan_id_label(var, list) for (var = (list); var; var = CAST(id_label, var->next)) +#define case_label_reverse(x) CAST(case_label, AST_node_reverse(CAST(node, (x)))) +#define case_label_length(x) AST_node_length(CAST(node, (x))) +#define last_case_label(x) CAST(case_label, AST_node_last(CAST(node, (x)))) +#define scan_case_label(var, list) for (var = (list); var; var = CAST(case_label, var->next)) +#define default_label_reverse(x) CAST(default_label, AST_node_reverse(CAST(node, (x)))) +#define default_label_length(x) AST_node_length(CAST(node, (x))) +#define last_default_label(x) CAST(default_label, AST_node_last(CAST(node, (x)))) +#define scan_default_label(var, list) for (var = (list); var; var = CAST(default_label, var->next)) +#define word_reverse(x) CAST(word, AST_node_reverse(CAST(node, (x)))) +#define word_length(x) AST_node_length(CAST(node, (x))) +#define last_word(x) CAST(word, AST_node_last(CAST(node, (x)))) +#define scan_word(var, list) for (var = (list); var; var = CAST(word, var->next)) +#define asm_operand_reverse(x) CAST(asm_operand, AST_node_reverse(CAST(node, (x)))) +#define asm_operand_length(x) AST_node_length(CAST(node, (x))) +#define last_asm_operand(x) CAST(asm_operand, AST_node_last(CAST(node, (x)))) +#define scan_asm_operand(var, list) for (var = (list); var; var = CAST(asm_operand, var->next)) +#define nesc_decl_reverse(x) CAST(nesc_decl, AST_node_reverse(CAST(node, (x)))) +#define nesc_decl_length(x) AST_node_length(CAST(node, (x))) +#define last_nesc_decl(x) CAST(nesc_decl, AST_node_last(CAST(node, (x)))) +#define scan_nesc_decl(var, list) for (var = (list); var; var = CAST(nesc_decl, var->next)) +#define interface_reverse(x) CAST(interface, AST_node_reverse(CAST(node, (x)))) +#define interface_length(x) AST_node_length(CAST(node, (x))) +#define last_interface(x) CAST(interface, AST_node_last(CAST(node, (x)))) +#define scan_interface(var, list) for (var = (list); var; var = CAST(interface, var->next)) +#define component_reverse(x) CAST(component, AST_node_reverse(CAST(node, (x)))) +#define component_length(x) AST_node_length(CAST(node, (x))) +#define last_component(x) CAST(component, AST_node_last(CAST(node, (x)))) +#define scan_component(var, list) for (var = (list); var; var = CAST(component, var->next)) +#define implementation_reverse(x) CAST(implementation, AST_node_reverse(CAST(node, (x)))) +#define implementation_length(x) AST_node_length(CAST(node, (x))) +#define last_implementation(x) CAST(implementation, AST_node_last(CAST(node, (x)))) +#define scan_implementation(var, list) for (var = (list); var; var = CAST(implementation, var->next)) +#define configuration_reverse(x) CAST(configuration, AST_node_reverse(CAST(node, (x)))) +#define configuration_length(x) AST_node_length(CAST(node, (x))) +#define last_configuration(x) CAST(configuration, AST_node_last(CAST(node, (x)))) +#define scan_configuration(var, list) for (var = (list); var; var = CAST(configuration, var->next)) +#define module_reverse(x) CAST(module, AST_node_reverse(CAST(node, (x)))) +#define module_length(x) AST_node_length(CAST(node, (x))) +#define last_module(x) CAST(module, AST_node_last(CAST(node, (x)))) +#define scan_module(var, list) for (var = (list); var; var = CAST(module, var->next)) +#define binary_component_reverse(x) CAST(binary_component, AST_node_reverse(CAST(node, (x)))) +#define binary_component_length(x) AST_node_length(CAST(node, (x))) +#define last_binary_component(x) CAST(binary_component, AST_node_last(CAST(node, (x)))) +#define scan_binary_component(var, list) for (var = (list); var; var = CAST(binary_component, var->next)) +#define rp_interface_reverse(x) CAST(rp_interface, AST_node_reverse(CAST(node, (x)))) +#define rp_interface_length(x) AST_node_length(CAST(node, (x))) +#define last_rp_interface(x) CAST(rp_interface, AST_node_last(CAST(node, (x)))) +#define scan_rp_interface(var, list) for (var = (list); var; var = CAST(rp_interface, var->next)) +#define interface_ref_reverse(x) CAST(interface_ref, AST_node_reverse(CAST(node, (x)))) +#define interface_ref_length(x) AST_node_length(CAST(node, (x))) +#define last_interface_ref(x) CAST(interface_ref, AST_node_last(CAST(node, (x)))) +#define scan_interface_ref(var, list) for (var = (list); var; var = CAST(interface_ref, var->next)) +#define component_ref_reverse(x) CAST(component_ref, AST_node_reverse(CAST(node, (x)))) +#define component_ref_length(x) AST_node_length(CAST(node, (x))) +#define last_component_ref(x) CAST(component_ref, AST_node_last(CAST(node, (x)))) +#define scan_component_ref(var, list) for (var = (list); var; var = CAST(component_ref, var->next)) +#define connection_reverse(x) CAST(connection, AST_node_reverse(CAST(node, (x)))) +#define connection_length(x) AST_node_length(CAST(node, (x))) +#define last_connection(x) CAST(connection, AST_node_last(CAST(node, (x)))) +#define scan_connection(var, list) for (var = (list); var; var = CAST(connection, var->next)) +#define endpoint_reverse(x) CAST(endpoint, AST_node_reverse(CAST(node, (x)))) +#define endpoint_length(x) AST_node_length(CAST(node, (x))) +#define last_endpoint(x) CAST(endpoint, AST_node_last(CAST(node, (x)))) +#define scan_endpoint(var, list) for (var = (list); var; var = CAST(endpoint, var->next)) +#define parameterised_identifier_reverse(x) CAST(parameterised_identifier, AST_node_reverse(CAST(node, (x)))) +#define parameterised_identifier_length(x) AST_node_length(CAST(node, (x))) +#define last_parameterised_identifier(x) CAST(parameterised_identifier, AST_node_last(CAST(node, (x)))) +#define scan_parameterised_identifier(var, list) for (var = (list); var; var = CAST(parameterised_identifier, var->next)) +#define generic_declarator_reverse(x) CAST(generic_declarator, AST_node_reverse(CAST(node, (x)))) +#define generic_declarator_length(x) AST_node_length(CAST(node, (x))) +#define last_generic_declarator(x) CAST(generic_declarator, AST_node_last(CAST(node, (x)))) +#define scan_generic_declarator(var, list) for (var = (list); var; var = CAST(generic_declarator, var->next)) +#define generic_call_reverse(x) CAST(generic_call, AST_node_reverse(CAST(node, (x)))) +#define generic_call_length(x) AST_node_length(CAST(node, (x))) +#define last_generic_call(x) CAST(generic_call, AST_node_last(CAST(node, (x)))) +#define scan_generic_call(var, list) for (var = (list); var; var = CAST(generic_call, var->next)) +#define interface_ref_declarator_reverse(x) CAST(interface_ref_declarator, AST_node_reverse(CAST(node, (x)))) +#define interface_ref_declarator_length(x) AST_node_length(CAST(node, (x))) +#define last_interface_ref_declarator(x) CAST(interface_ref_declarator, AST_node_last(CAST(node, (x)))) +#define scan_interface_ref_declarator(var, list) for (var = (list); var; var = CAST(interface_ref_declarator, var->next)) +#define interface_deref_reverse(x) CAST(interface_deref, AST_node_reverse(CAST(node, (x)))) +#define interface_deref_length(x) AST_node_length(CAST(node, (x))) +#define last_interface_deref(x) CAST(interface_deref, AST_node_last(CAST(node, (x)))) +#define scan_interface_deref(var, list) for (var = (list); var; var = CAST(interface_deref, var->next)) +#define component_deref_reverse(x) CAST(component_deref, AST_node_reverse(CAST(node, (x)))) +#define component_deref_length(x) AST_node_length(CAST(node, (x))) +#define last_component_deref(x) CAST(component_deref, AST_node_last(CAST(node, (x)))) +#define scan_component_deref(var, list) for (var = (list); var; var = CAST(component_deref, var->next)) +#define component_typeref_reverse(x) CAST(component_typeref, AST_node_reverse(CAST(node, (x)))) +#define component_typeref_length(x) AST_node_length(CAST(node, (x))) +#define last_component_typeref(x) CAST(component_typeref, AST_node_last(CAST(node, (x)))) +#define scan_component_typeref(var, list) for (var = (list); var; var = CAST(component_typeref, var->next)) +#define atomic_stmt_reverse(x) CAST(atomic_stmt, AST_node_reverse(CAST(node, (x)))) +#define atomic_stmt_length(x) AST_node_length(CAST(node, (x))) +#define last_atomic_stmt(x) CAST(atomic_stmt, AST_node_last(CAST(node, (x)))) +#define scan_atomic_stmt(var, list) for (var = (list); var; var = CAST(atomic_stmt, var->next)) +#define nesc_attribute_reverse(x) CAST(nesc_attribute, AST_node_reverse(CAST(node, (x)))) +#define nesc_attribute_length(x) AST_node_length(CAST(node, (x))) +#define last_nesc_attribute(x) CAST(nesc_attribute, AST_node_last(CAST(node, (x)))) +#define scan_nesc_attribute(var, list) for (var = (list); var; var = CAST(nesc_attribute, var->next)) +#define type_parm_decl_reverse(x) CAST(type_parm_decl, AST_node_reverse(CAST(node, (x)))) +#define type_parm_decl_length(x) AST_node_length(CAST(node, (x))) +#define last_type_parm_decl(x) CAST(type_parm_decl, AST_node_last(CAST(node, (x)))) +#define scan_type_parm_decl(var, list) for (var = (list); var; var = CAST(type_parm_decl, var->next)) +#define type_argument_reverse(x) CAST(type_argument, AST_node_reverse(CAST(node, (x)))) +#define type_argument_length(x) AST_node_length(CAST(node, (x))) +#define last_type_argument(x) CAST(type_argument, AST_node_last(CAST(node, (x)))) +#define scan_type_argument(var, list) for (var = (list); var; var = CAST(type_argument, var->next)) +#define error_decl_reverse(x) CAST(error_decl, AST_node_reverse(CAST(node, (x)))) +#define error_decl_length(x) AST_node_length(CAST(node, (x))) +#define last_error_decl(x) CAST(error_decl, AST_node_last(CAST(node, (x)))) +#define scan_error_decl(var, list) for (var = (list); var; var = CAST(error_decl, var->next)) +#define attribute_ref_reverse(x) CAST(attribute_ref, AST_node_reverse(CAST(node, (x)))) +#define attribute_ref_length(x) AST_node_length(CAST(node, (x))) +#define last_attribute_ref(x) CAST(attribute_ref, AST_node_last(CAST(node, (x)))) +#define scan_attribute_ref(var, list) for (var = (list); var; var = CAST(attribute_ref, var->next)) +#define enum_ref_reverse(x) CAST(enum_ref, AST_node_reverse(CAST(node, (x)))) +#define enum_ref_length(x) AST_node_length(CAST(node, (x))) +#define last_enum_ref(x) CAST(enum_ref, AST_node_last(CAST(node, (x)))) +#define scan_enum_ref(var, list) for (var = (list); var; var = CAST(enum_ref, var->next)) +#define error_stmt_reverse(x) CAST(error_stmt, AST_node_reverse(CAST(node, (x)))) +#define error_stmt_length(x) AST_node_length(CAST(node, (x))) +#define last_error_stmt(x) CAST(error_stmt, AST_node_last(CAST(node, (x)))) +#define scan_error_stmt(var, list) for (var = (list); var; var = CAST(error_stmt, var->next)) +#define while_stmt_reverse(x) CAST(while_stmt, AST_node_reverse(CAST(node, (x)))) +#define while_stmt_length(x) AST_node_length(CAST(node, (x))) +#define last_while_stmt(x) CAST(while_stmt, AST_node_last(CAST(node, (x)))) +#define scan_while_stmt(var, list) for (var = (list); var; var = CAST(while_stmt, var->next)) +#define dowhile_stmt_reverse(x) CAST(dowhile_stmt, AST_node_reverse(CAST(node, (x)))) +#define dowhile_stmt_length(x) AST_node_length(CAST(node, (x))) +#define last_dowhile_stmt(x) CAST(dowhile_stmt, AST_node_last(CAST(node, (x)))) +#define scan_dowhile_stmt(var, list) for (var = (list); var; var = CAST(dowhile_stmt, var->next)) +#define error_expr_reverse(x) CAST(error_expr, AST_node_reverse(CAST(node, (x)))) +#define error_expr_length(x) AST_node_length(CAST(node, (x))) +#define last_error_expr(x) CAST(error_expr, AST_node_last(CAST(node, (x)))) +#define scan_error_expr(var, list) for (var = (list); var; var = CAST(error_expr, var->next)) +#define array_ref_reverse(x) CAST(array_ref, AST_node_reverse(CAST(node, (x)))) +#define array_ref_length(x) AST_node_length(CAST(node, (x))) +#define last_array_ref(x) CAST(array_ref, AST_node_last(CAST(node, (x)))) +#define scan_array_ref(var, list) for (var = (list); var; var = CAST(array_ref, var->next)) +#define dereference_reverse(x) CAST(dereference, AST_node_reverse(CAST(node, (x)))) +#define dereference_length(x) AST_node_length(CAST(node, (x))) +#define last_dereference(x) CAST(dereference, AST_node_last(CAST(node, (x)))) +#define scan_dereference(var, list) for (var = (list); var; var = CAST(dereference, var->next)) +#define extension_expr_reverse(x) CAST(extension_expr, AST_node_reverse(CAST(node, (x)))) +#define extension_expr_length(x) AST_node_length(CAST(node, (x))) +#define last_extension_expr(x) CAST(extension_expr, AST_node_last(CAST(node, (x)))) +#define scan_extension_expr(var, list) for (var = (list); var; var = CAST(extension_expr, var->next)) +#define sizeof_expr_reverse(x) CAST(sizeof_expr, AST_node_reverse(CAST(node, (x)))) +#define sizeof_expr_length(x) AST_node_length(CAST(node, (x))) +#define last_sizeof_expr(x) CAST(sizeof_expr, AST_node_last(CAST(node, (x)))) +#define scan_sizeof_expr(var, list) for (var = (list); var; var = CAST(sizeof_expr, var->next)) +#define alignof_expr_reverse(x) CAST(alignof_expr, AST_node_reverse(CAST(node, (x)))) +#define alignof_expr_length(x) AST_node_length(CAST(node, (x))) +#define last_alignof_expr(x) CAST(alignof_expr, AST_node_last(CAST(node, (x)))) +#define scan_alignof_expr(var, list) for (var = (list); var; var = CAST(alignof_expr, var->next)) +#define realpart_reverse(x) CAST(realpart, AST_node_reverse(CAST(node, (x)))) +#define realpart_length(x) AST_node_length(CAST(node, (x))) +#define last_realpart(x) CAST(realpart, AST_node_last(CAST(node, (x)))) +#define scan_realpart(var, list) for (var = (list); var; var = CAST(realpart, var->next)) +#define imagpart_reverse(x) CAST(imagpart, AST_node_reverse(CAST(node, (x)))) +#define imagpart_length(x) AST_node_length(CAST(node, (x))) +#define last_imagpart(x) CAST(imagpart, AST_node_last(CAST(node, (x)))) +#define scan_imagpart(var, list) for (var = (list); var; var = CAST(imagpart, var->next)) +#define address_of_reverse(x) CAST(address_of, AST_node_reverse(CAST(node, (x)))) +#define address_of_length(x) AST_node_length(CAST(node, (x))) +#define last_address_of(x) CAST(address_of, AST_node_last(CAST(node, (x)))) +#define scan_address_of(var, list) for (var = (list); var; var = CAST(address_of, var->next)) +#define unary_minus_reverse(x) CAST(unary_minus, AST_node_reverse(CAST(node, (x)))) +#define unary_minus_length(x) AST_node_length(CAST(node, (x))) +#define last_unary_minus(x) CAST(unary_minus, AST_node_last(CAST(node, (x)))) +#define scan_unary_minus(var, list) for (var = (list); var; var = CAST(unary_minus, var->next)) +#define unary_plus_reverse(x) CAST(unary_plus, AST_node_reverse(CAST(node, (x)))) +#define unary_plus_length(x) AST_node_length(CAST(node, (x))) +#define last_unary_plus(x) CAST(unary_plus, AST_node_last(CAST(node, (x)))) +#define scan_unary_plus(var, list) for (var = (list); var; var = CAST(unary_plus, var->next)) +#define conjugate_reverse(x) CAST(conjugate, AST_node_reverse(CAST(node, (x)))) +#define conjugate_length(x) AST_node_length(CAST(node, (x))) +#define last_conjugate(x) CAST(conjugate, AST_node_last(CAST(node, (x)))) +#define scan_conjugate(var, list) for (var = (list); var; var = CAST(conjugate, var->next)) +#define bitnot_reverse(x) CAST(bitnot, AST_node_reverse(CAST(node, (x)))) +#define bitnot_length(x) AST_node_length(CAST(node, (x))) +#define last_bitnot(x) CAST(bitnot, AST_node_last(CAST(node, (x)))) +#define scan_bitnot(var, list) for (var = (list); var; var = CAST(bitnot, var->next)) +#define not_reverse(x) CAST(not, AST_node_reverse(CAST(node, (x)))) +#define not_length(x) AST_node_length(CAST(node, (x))) +#define last_not(x) CAST(not, AST_node_last(CAST(node, (x)))) +#define scan_not(var, list) for (var = (list); var; var = CAST(not, var->next)) +#define preincrement_reverse(x) CAST(preincrement, AST_node_reverse(CAST(node, (x)))) +#define preincrement_length(x) AST_node_length(CAST(node, (x))) +#define last_preincrement(x) CAST(preincrement, AST_node_last(CAST(node, (x)))) +#define scan_preincrement(var, list) for (var = (list); var; var = CAST(preincrement, var->next)) +#define predecrement_reverse(x) CAST(predecrement, AST_node_reverse(CAST(node, (x)))) +#define predecrement_length(x) AST_node_length(CAST(node, (x))) +#define last_predecrement(x) CAST(predecrement, AST_node_last(CAST(node, (x)))) +#define scan_predecrement(var, list) for (var = (list); var; var = CAST(predecrement, var->next)) +#define postincrement_reverse(x) CAST(postincrement, AST_node_reverse(CAST(node, (x)))) +#define postincrement_length(x) AST_node_length(CAST(node, (x))) +#define last_postincrement(x) CAST(postincrement, AST_node_last(CAST(node, (x)))) +#define scan_postincrement(var, list) for (var = (list); var; var = CAST(postincrement, var->next)) +#define postdecrement_reverse(x) CAST(postdecrement, AST_node_reverse(CAST(node, (x)))) +#define postdecrement_length(x) AST_node_length(CAST(node, (x))) +#define last_postdecrement(x) CAST(postdecrement, AST_node_last(CAST(node, (x)))) +#define scan_postdecrement(var, list) for (var = (list); var; var = CAST(postdecrement, var->next)) +#define plus_reverse(x) CAST(plus, AST_node_reverse(CAST(node, (x)))) +#define plus_length(x) AST_node_length(CAST(node, (x))) +#define last_plus(x) CAST(plus, AST_node_last(CAST(node, (x)))) +#define scan_plus(var, list) for (var = (list); var; var = CAST(plus, var->next)) +#define minus_reverse(x) CAST(minus, AST_node_reverse(CAST(node, (x)))) +#define minus_length(x) AST_node_length(CAST(node, (x))) +#define last_minus(x) CAST(minus, AST_node_last(CAST(node, (x)))) +#define scan_minus(var, list) for (var = (list); var; var = CAST(minus, var->next)) +#define times_reverse(x) CAST(times, AST_node_reverse(CAST(node, (x)))) +#define times_length(x) AST_node_length(CAST(node, (x))) +#define last_times(x) CAST(times, AST_node_last(CAST(node, (x)))) +#define scan_times(var, list) for (var = (list); var; var = CAST(times, var->next)) +#define divide_reverse(x) CAST(divide, AST_node_reverse(CAST(node, (x)))) +#define divide_length(x) AST_node_length(CAST(node, (x))) +#define last_divide(x) CAST(divide, AST_node_last(CAST(node, (x)))) +#define scan_divide(var, list) for (var = (list); var; var = CAST(divide, var->next)) +#define modulo_reverse(x) CAST(modulo, AST_node_reverse(CAST(node, (x)))) +#define modulo_length(x) AST_node_length(CAST(node, (x))) +#define last_modulo(x) CAST(modulo, AST_node_last(CAST(node, (x)))) +#define scan_modulo(var, list) for (var = (list); var; var = CAST(modulo, var->next)) +#define lshift_reverse(x) CAST(lshift, AST_node_reverse(CAST(node, (x)))) +#define lshift_length(x) AST_node_length(CAST(node, (x))) +#define last_lshift(x) CAST(lshift, AST_node_last(CAST(node, (x)))) +#define scan_lshift(var, list) for (var = (list); var; var = CAST(lshift, var->next)) +#define rshift_reverse(x) CAST(rshift, AST_node_reverse(CAST(node, (x)))) +#define rshift_length(x) AST_node_length(CAST(node, (x))) +#define last_rshift(x) CAST(rshift, AST_node_last(CAST(node, (x)))) +#define scan_rshift(var, list) for (var = (list); var; var = CAST(rshift, var->next)) +#define leq_reverse(x) CAST(leq, AST_node_reverse(CAST(node, (x)))) +#define leq_length(x) AST_node_length(CAST(node, (x))) +#define last_leq(x) CAST(leq, AST_node_last(CAST(node, (x)))) +#define scan_leq(var, list) for (var = (list); var; var = CAST(leq, var->next)) +#define geq_reverse(x) CAST(geq, AST_node_reverse(CAST(node, (x)))) +#define geq_length(x) AST_node_length(CAST(node, (x))) +#define last_geq(x) CAST(geq, AST_node_last(CAST(node, (x)))) +#define scan_geq(var, list) for (var = (list); var; var = CAST(geq, var->next)) +#define lt_reverse(x) CAST(lt, AST_node_reverse(CAST(node, (x)))) +#define lt_length(x) AST_node_length(CAST(node, (x))) +#define last_lt(x) CAST(lt, AST_node_last(CAST(node, (x)))) +#define scan_lt(var, list) for (var = (list); var; var = CAST(lt, var->next)) +#define gt_reverse(x) CAST(gt, AST_node_reverse(CAST(node, (x)))) +#define gt_length(x) AST_node_length(CAST(node, (x))) +#define last_gt(x) CAST(gt, AST_node_last(CAST(node, (x)))) +#define scan_gt(var, list) for (var = (list); var; var = CAST(gt, var->next)) +#define eq_reverse(x) CAST(eq, AST_node_reverse(CAST(node, (x)))) +#define eq_length(x) AST_node_length(CAST(node, (x))) +#define last_eq(x) CAST(eq, AST_node_last(CAST(node, (x)))) +#define scan_eq(var, list) for (var = (list); var; var = CAST(eq, var->next)) +#define ne_reverse(x) CAST(ne, AST_node_reverse(CAST(node, (x)))) +#define ne_length(x) AST_node_length(CAST(node, (x))) +#define last_ne(x) CAST(ne, AST_node_last(CAST(node, (x)))) +#define scan_ne(var, list) for (var = (list); var; var = CAST(ne, var->next)) +#define bitand_reverse(x) CAST(bitand, AST_node_reverse(CAST(node, (x)))) +#define bitand_length(x) AST_node_length(CAST(node, (x))) +#define last_bitand(x) CAST(bitand, AST_node_last(CAST(node, (x)))) +#define scan_bitand(var, list) for (var = (list); var; var = CAST(bitand, var->next)) +#define bitor_reverse(x) CAST(bitor, AST_node_reverse(CAST(node, (x)))) +#define bitor_length(x) AST_node_length(CAST(node, (x))) +#define last_bitor(x) CAST(bitor, AST_node_last(CAST(node, (x)))) +#define scan_bitor(var, list) for (var = (list); var; var = CAST(bitor, var->next)) +#define bitxor_reverse(x) CAST(bitxor, AST_node_reverse(CAST(node, (x)))) +#define bitxor_length(x) AST_node_length(CAST(node, (x))) +#define last_bitxor(x) CAST(bitxor, AST_node_last(CAST(node, (x)))) +#define scan_bitxor(var, list) for (var = (list); var; var = CAST(bitxor, var->next)) +#define andand_reverse(x) CAST(andand, AST_node_reverse(CAST(node, (x)))) +#define andand_length(x) AST_node_length(CAST(node, (x))) +#define last_andand(x) CAST(andand, AST_node_last(CAST(node, (x)))) +#define scan_andand(var, list) for (var = (list); var; var = CAST(andand, var->next)) +#define oror_reverse(x) CAST(oror, AST_node_reverse(CAST(node, (x)))) +#define oror_length(x) AST_node_length(CAST(node, (x))) +#define last_oror(x) CAST(oror, AST_node_last(CAST(node, (x)))) +#define scan_oror(var, list) for (var = (list); var; var = CAST(oror, var->next)) +#define assign_reverse(x) CAST(assign, AST_node_reverse(CAST(node, (x)))) +#define assign_length(x) AST_node_length(CAST(node, (x))) +#define last_assign(x) CAST(assign, AST_node_last(CAST(node, (x)))) +#define scan_assign(var, list) for (var = (list); var; var = CAST(assign, var->next)) +#define plus_assign_reverse(x) CAST(plus_assign, AST_node_reverse(CAST(node, (x)))) +#define plus_assign_length(x) AST_node_length(CAST(node, (x))) +#define last_plus_assign(x) CAST(plus_assign, AST_node_last(CAST(node, (x)))) +#define scan_plus_assign(var, list) for (var = (list); var; var = CAST(plus_assign, var->next)) +#define minus_assign_reverse(x) CAST(minus_assign, AST_node_reverse(CAST(node, (x)))) +#define minus_assign_length(x) AST_node_length(CAST(node, (x))) +#define last_minus_assign(x) CAST(minus_assign, AST_node_last(CAST(node, (x)))) +#define scan_minus_assign(var, list) for (var = (list); var; var = CAST(minus_assign, var->next)) +#define times_assign_reverse(x) CAST(times_assign, AST_node_reverse(CAST(node, (x)))) +#define times_assign_length(x) AST_node_length(CAST(node, (x))) +#define last_times_assign(x) CAST(times_assign, AST_node_last(CAST(node, (x)))) +#define scan_times_assign(var, list) for (var = (list); var; var = CAST(times_assign, var->next)) +#define divide_assign_reverse(x) CAST(divide_assign, AST_node_reverse(CAST(node, (x)))) +#define divide_assign_length(x) AST_node_length(CAST(node, (x))) +#define last_divide_assign(x) CAST(divide_assign, AST_node_last(CAST(node, (x)))) +#define scan_divide_assign(var, list) for (var = (list); var; var = CAST(divide_assign, var->next)) +#define modulo_assign_reverse(x) CAST(modulo_assign, AST_node_reverse(CAST(node, (x)))) +#define modulo_assign_length(x) AST_node_length(CAST(node, (x))) +#define last_modulo_assign(x) CAST(modulo_assign, AST_node_last(CAST(node, (x)))) +#define scan_modulo_assign(var, list) for (var = (list); var; var = CAST(modulo_assign, var->next)) +#define lshift_assign_reverse(x) CAST(lshift_assign, AST_node_reverse(CAST(node, (x)))) +#define lshift_assign_length(x) AST_node_length(CAST(node, (x))) +#define last_lshift_assign(x) CAST(lshift_assign, AST_node_last(CAST(node, (x)))) +#define scan_lshift_assign(var, list) for (var = (list); var; var = CAST(lshift_assign, var->next)) +#define rshift_assign_reverse(x) CAST(rshift_assign, AST_node_reverse(CAST(node, (x)))) +#define rshift_assign_length(x) AST_node_length(CAST(node, (x))) +#define last_rshift_assign(x) CAST(rshift_assign, AST_node_last(CAST(node, (x)))) +#define scan_rshift_assign(var, list) for (var = (list); var; var = CAST(rshift_assign, var->next)) +#define bitand_assign_reverse(x) CAST(bitand_assign, AST_node_reverse(CAST(node, (x)))) +#define bitand_assign_length(x) AST_node_length(CAST(node, (x))) +#define last_bitand_assign(x) CAST(bitand_assign, AST_node_last(CAST(node, (x)))) +#define scan_bitand_assign(var, list) for (var = (list); var; var = CAST(bitand_assign, var->next)) +#define bitor_assign_reverse(x) CAST(bitor_assign, AST_node_reverse(CAST(node, (x)))) +#define bitor_assign_length(x) AST_node_length(CAST(node, (x))) +#define last_bitor_assign(x) CAST(bitor_assign, AST_node_last(CAST(node, (x)))) +#define scan_bitor_assign(var, list) for (var = (list); var; var = CAST(bitor_assign, var->next)) +#define bitxor_assign_reverse(x) CAST(bitxor_assign, AST_node_reverse(CAST(node, (x)))) +#define bitxor_assign_length(x) AST_node_length(CAST(node, (x))) +#define last_bitxor_assign(x) CAST(bitxor_assign, AST_node_last(CAST(node, (x)))) +#define scan_bitxor_assign(var, list) for (var = (list); var; var = CAST(bitxor_assign, var->next)) +#define rp_connection_reverse(x) CAST(rp_connection, AST_node_reverse(CAST(node, (x)))) +#define rp_connection_length(x) AST_node_length(CAST(node, (x))) +#define last_rp_connection(x) CAST(rp_connection, AST_node_last(CAST(node, (x)))) +#define scan_rp_connection(var, list) for (var = (list); var; var = CAST(rp_connection, var->next)) +#define eq_connection_reverse(x) CAST(eq_connection, AST_node_reverse(CAST(node, (x)))) +#define eq_connection_length(x) AST_node_length(CAST(node, (x))) +#define last_eq_connection(x) CAST(eq_connection, AST_node_last(CAST(node, (x)))) +#define scan_eq_connection(var, list) for (var = (list); var; var = CAST(eq_connection, var->next)) +#define nx_struct_ref_reverse(x) CAST(nx_struct_ref, AST_node_reverse(CAST(node, (x)))) +#define nx_struct_ref_length(x) AST_node_length(CAST(node, (x))) +#define last_nx_struct_ref(x) CAST(nx_struct_ref, AST_node_last(CAST(node, (x)))) +#define scan_nx_struct_ref(var, list) for (var = (list); var; var = CAST(nx_struct_ref, var->next)) +#define nx_union_ref_reverse(x) CAST(nx_union_ref, AST_node_reverse(CAST(node, (x)))) +#define nx_union_ref_length(x) AST_node_length(CAST(node, (x))) +#define last_nx_union_ref(x) CAST(nx_union_ref, AST_node_last(CAST(node, (x)))) +#define scan_nx_union_ref(var, list) for (var = (list); var; var = CAST(nx_union_ref, var->next)) +node node_chain(node l1, node l2); +declaration declaration_chain(declaration l1, declaration l2); +statement statement_chain(statement l1, statement l2); +expression expression_chain(expression l1, expression l2); +type_element type_element_chain(type_element l1, type_element l2); +declarator declarator_chain(declarator l1, declarator l2); +label label_chain(label l1, label l2); +asm_decl asm_decl_chain(asm_decl l1, asm_decl l2); +data_decl data_decl_chain(data_decl l1, data_decl l2); +extension_decl extension_decl_chain(extension_decl l1, extension_decl l2); +ellipsis_decl ellipsis_decl_chain(ellipsis_decl l1, ellipsis_decl l2); +enumerator enumerator_chain(enumerator l1, enumerator l2); +oldidentifier_decl oldidentifier_decl_chain(oldidentifier_decl l1, oldidentifier_decl l2); +function_decl function_decl_chain(function_decl l1, function_decl l2); +implicit_decl implicit_decl_chain(implicit_decl l1, implicit_decl l2); +variable_decl variable_decl_chain(variable_decl l1, variable_decl l2); +field_decl field_decl_chain(field_decl l1, field_decl l2); +asttype asttype_chain(asttype l1, asttype l2); +typename typename_chain(typename l1, typename l2); +typeof_expr typeof_expr_chain(typeof_expr l1, typeof_expr l2); +typeof_type typeof_type_chain(typeof_type l1, typeof_type l2); +attribute attribute_chain(attribute l1, attribute l2); +gcc_attribute gcc_attribute_chain(gcc_attribute l1, gcc_attribute l2); +rid rid_chain(rid l1, rid l2); +qualifier qualifier_chain(qualifier l1, qualifier l2); +tag_ref tag_ref_chain(tag_ref l1, tag_ref l2); +struct_ref struct_ref_chain(struct_ref l1, struct_ref l2); +union_ref union_ref_chain(union_ref l1, union_ref l2); +nested_declarator nested_declarator_chain(nested_declarator l1, nested_declarator l2); +function_declarator function_declarator_chain(function_declarator l1, function_declarator l2); +pointer_declarator pointer_declarator_chain(pointer_declarator l1, pointer_declarator l2); +qualified_declarator qualified_declarator_chain(qualified_declarator l1, qualified_declarator l2); +array_declarator array_declarator_chain(array_declarator l1, array_declarator l2); +identifier_declarator identifier_declarator_chain(identifier_declarator l1, identifier_declarator l2); +asm_stmt asm_stmt_chain(asm_stmt l1, asm_stmt l2); +compound_stmt compound_stmt_chain(compound_stmt l1, compound_stmt l2); +if_stmt if_stmt_chain(if_stmt l1, if_stmt l2); +labeled_stmt labeled_stmt_chain(labeled_stmt l1, labeled_stmt l2); +expression_stmt expression_stmt_chain(expression_stmt l1, expression_stmt l2); +conditional_stmt conditional_stmt_chain(conditional_stmt l1, conditional_stmt l2); +switch_stmt switch_stmt_chain(switch_stmt l1, switch_stmt l2); +for_stmt for_stmt_chain(for_stmt l1, for_stmt l2); +break_stmt break_stmt_chain(break_stmt l1, break_stmt l2); +continue_stmt continue_stmt_chain(continue_stmt l1, continue_stmt l2); +return_stmt return_stmt_chain(return_stmt l1, return_stmt l2); +goto_stmt goto_stmt_chain(goto_stmt l1, goto_stmt l2); +computed_goto_stmt computed_goto_stmt_chain(computed_goto_stmt l1, computed_goto_stmt l2); +empty_stmt empty_stmt_chain(empty_stmt l1, empty_stmt l2); +unary unary_chain(unary l1, unary l2); +binary binary_chain(binary l1, binary l2); +comma comma_chain(comma l1, comma l2); +sizeof_type sizeof_type_chain(sizeof_type l1, sizeof_type l2); +alignof_type alignof_type_chain(alignof_type l1, alignof_type l2); +label_address label_address_chain(label_address l1, label_address l2); +cast cast_chain(cast l1, cast l2); +cast_list cast_list_chain(cast_list l1, cast_list l2); +conditional conditional_chain(conditional l1, conditional l2); +identifier identifier_chain(identifier l1, identifier l2); +compound_expr compound_expr_chain(compound_expr l1, compound_expr l2); +function_call function_call_chain(function_call l1, function_call l2); +field_ref field_ref_chain(field_ref l1, field_ref l2); +increment increment_chain(increment l1, increment l2); +comparison comparison_chain(comparison l1, comparison l2); +assignment assignment_chain(assignment l1, assignment l2); +init_list init_list_chain(init_list l1, init_list l2); +init_specific init_specific_chain(init_specific l1, init_specific l2); +designator designator_chain(designator l1, designator l2); +designate_field designate_field_chain(designate_field l1, designate_field l2); +designate_index designate_index_chain(designate_index l1, designate_index l2); +lexical_cst lexical_cst_chain(lexical_cst l1, lexical_cst l2); +string_cst string_cst_chain(string_cst l1, string_cst l2); +string string_chain(string l1, string l2); +id_label id_label_chain(id_label l1, id_label l2); +case_label case_label_chain(case_label l1, case_label l2); +default_label default_label_chain(default_label l1, default_label l2); +word word_chain(word l1, word l2); +asm_operand asm_operand_chain(asm_operand l1, asm_operand l2); +nesc_decl nesc_decl_chain(nesc_decl l1, nesc_decl l2); +interface interface_chain(interface l1, interface l2); +component component_chain(component l1, component l2); +implementation implementation_chain(implementation l1, implementation l2); +configuration configuration_chain(configuration l1, configuration l2); +module module_chain(module l1, module l2); +binary_component binary_component_chain(binary_component l1, binary_component l2); +rp_interface rp_interface_chain(rp_interface l1, rp_interface l2); +interface_ref interface_ref_chain(interface_ref l1, interface_ref l2); +component_ref component_ref_chain(component_ref l1, component_ref l2); +connection connection_chain(connection l1, connection l2); +endpoint endpoint_chain(endpoint l1, endpoint l2); +parameterised_identifier parameterised_identifier_chain(parameterised_identifier l1, parameterised_identifier l2); +generic_declarator generic_declarator_chain(generic_declarator l1, generic_declarator l2); +generic_call generic_call_chain(generic_call l1, generic_call l2); +interface_ref_declarator interface_ref_declarator_chain(interface_ref_declarator l1, interface_ref_declarator l2); +interface_deref interface_deref_chain(interface_deref l1, interface_deref l2); +component_deref component_deref_chain(component_deref l1, component_deref l2); +component_typeref component_typeref_chain(component_typeref l1, component_typeref l2); +atomic_stmt atomic_stmt_chain(atomic_stmt l1, atomic_stmt l2); +nesc_attribute nesc_attribute_chain(nesc_attribute l1, nesc_attribute l2); +type_parm_decl type_parm_decl_chain(type_parm_decl l1, type_parm_decl l2); +type_argument type_argument_chain(type_argument l1, type_argument l2); +error_decl error_decl_chain(error_decl l1, error_decl l2); +attribute_ref attribute_ref_chain(attribute_ref l1, attribute_ref l2); +enum_ref enum_ref_chain(enum_ref l1, enum_ref l2); +error_stmt error_stmt_chain(error_stmt l1, error_stmt l2); +while_stmt while_stmt_chain(while_stmt l1, while_stmt l2); +dowhile_stmt dowhile_stmt_chain(dowhile_stmt l1, dowhile_stmt l2); +error_expr error_expr_chain(error_expr l1, error_expr l2); +array_ref array_ref_chain(array_ref l1, array_ref l2); +dereference dereference_chain(dereference l1, dereference l2); +extension_expr extension_expr_chain(extension_expr l1, extension_expr l2); +sizeof_expr sizeof_expr_chain(sizeof_expr l1, sizeof_expr l2); +alignof_expr alignof_expr_chain(alignof_expr l1, alignof_expr l2); +realpart realpart_chain(realpart l1, realpart l2); +imagpart imagpart_chain(imagpart l1, imagpart l2); +address_of address_of_chain(address_of l1, address_of l2); +unary_minus unary_minus_chain(unary_minus l1, unary_minus l2); +unary_plus unary_plus_chain(unary_plus l1, unary_plus l2); +conjugate conjugate_chain(conjugate l1, conjugate l2); +bitnot bitnot_chain(bitnot l1, bitnot l2); +not not_chain(not l1, not l2); +preincrement preincrement_chain(preincrement l1, preincrement l2); +predecrement predecrement_chain(predecrement l1, predecrement l2); +postincrement postincrement_chain(postincrement l1, postincrement l2); +postdecrement postdecrement_chain(postdecrement l1, postdecrement l2); +plus plus_chain(plus l1, plus l2); +minus minus_chain(minus l1, minus l2); +times times_chain(times l1, times l2); +divide divide_chain(divide l1, divide l2); +modulo modulo_chain(modulo l1, modulo l2); +lshift lshift_chain(lshift l1, lshift l2); +rshift rshift_chain(rshift l1, rshift l2); +leq leq_chain(leq l1, leq l2); +geq geq_chain(geq l1, geq l2); +lt lt_chain(lt l1, lt l2); +gt gt_chain(gt l1, gt l2); +eq eq_chain(eq l1, eq l2); +ne ne_chain(ne l1, ne l2); +bitand bitand_chain(bitand l1, bitand l2); +bitor bitor_chain(bitor l1, bitor l2); +bitxor bitxor_chain(bitxor l1, bitxor l2); +andand andand_chain(andand l1, andand l2); +oror oror_chain(oror l1, oror l2); +assign assign_chain(assign l1, assign l2); +plus_assign plus_assign_chain(plus_assign l1, plus_assign l2); +minus_assign minus_assign_chain(minus_assign l1, minus_assign l2); +times_assign times_assign_chain(times_assign l1, times_assign l2); +divide_assign divide_assign_chain(divide_assign l1, divide_assign l2); +modulo_assign modulo_assign_chain(modulo_assign l1, modulo_assign l2); +lshift_assign lshift_assign_chain(lshift_assign l1, lshift_assign l2); +rshift_assign rshift_assign_chain(rshift_assign l1, rshift_assign l2); +bitand_assign bitand_assign_chain(bitand_assign l1, bitand_assign l2); +bitor_assign bitor_assign_chain(bitor_assign l1, bitor_assign l2); +bitxor_assign bitxor_assign_chain(bitxor_assign l1, bitxor_assign l2); +rp_connection rp_connection_chain(rp_connection l1, rp_connection l2); +eq_connection eq_connection_chain(eq_connection l1, eq_connection l2); +nx_struct_ref nx_struct_ref_chain(nx_struct_ref l1, nx_struct_ref l2); +nx_union_ref nx_union_ref_chain(nx_union_ref l1, nx_union_ref l2); diff --git a/src/AST_parent.c b/src/AST_parent.c new file mode 100644 index 0000000..63c7cc5 --- /dev/null +++ b/src/AST_parent.c @@ -0,0 +1,527 @@ +/* Automatically generated from nodetypes.def, do not edit. */ + +/* See the copyright notice in nodetypes.def */ +case kind_node: break; +case kind_declaration: case kind_error_decl: break; +case kind_statement: case kind_error_stmt: break; +case kind_expression: case kind_error_expr: break; +case kind_type_element: break; +case kind_declarator: break; +case kind_label: break; +case kind_asm_decl: { + asm_decl x = CAST(asm_decl, n); + + AST_set_parent_list(&x->asm_stmt, n); + break; +} +case kind_data_decl: { + data_decl x = CAST(data_decl, n); + + AST_set_parent_list(&x->modifiers, n); + AST_set_parent_list(&x->decls, n); + break; +} +case kind_extension_decl: { + extension_decl x = CAST(extension_decl, n); + + AST_set_parent_list(&x->decl, n); + break; +} +case kind_ellipsis_decl: break; +case kind_enumerator: { + enumerator x = CAST(enumerator, n); + + AST_set_parent_list(&x->arg1, n); + break; +} +case kind_oldidentifier_decl: break; +case kind_function_decl: { + function_decl x = CAST(function_decl, n); + + AST_set_parent_list(&x->declarator, n); + AST_set_parent_list(&x->modifiers, n); + AST_set_parent_list(&x->attributes, n); + AST_set_parent_list(&x->stmt, n); + break; +} +case kind_implicit_decl: break; +case kind_variable_decl: { + variable_decl x = CAST(variable_decl, n); + + AST_set_parent_list(&x->declarator, n); + AST_set_parent_list(&x->attributes, n); + AST_set_parent_list(&x->arg1, n); + AST_set_parent_list(&x->asm_stmt, n); + break; +} +case kind_field_decl: { + field_decl x = CAST(field_decl, n); + + AST_set_parent_list(&x->declarator, n); + AST_set_parent_list(&x->attributes, n); + AST_set_parent_list(&x->arg1, n); + break; +} +case kind_asttype: { + asttype x = CAST(asttype, n); + + AST_set_parent_list(&x->declarator, n); + AST_set_parent_list(&x->qualifiers, n); + break; +} +case kind_typename: break; +case kind_typeof_expr: { + typeof_expr x = CAST(typeof_expr, n); + + AST_set_parent_list(&x->arg1, n); + break; +} +case kind_typeof_type: { + typeof_type x = CAST(typeof_type, n); + + AST_set_parent_list(&x->asttype, n); + break; +} +case kind_attribute: { + attribute x = CAST(attribute, n); + + AST_set_parent_list(&x->word1, n); + break; +} +case kind_gcc_attribute: { + gcc_attribute x = CAST(gcc_attribute, n); + + AST_set_parent_list(&x->word1, n); + AST_set_parent_list(&x->args, n); + break; +} +case kind_rid: break; +case kind_qualifier: break; +case kind_tag_ref: case kind_enum_ref: case kind_attribute_ref: { + tag_ref x = CAST(tag_ref, n); + + AST_set_parent_list(&x->word1, n); + AST_set_parent_list(&x->attributes, n); + AST_set_parent_list(&x->fields, n); + break; +} +case kind_struct_ref: case kind_nx_struct_ref: { + struct_ref x = CAST(struct_ref, n); + + AST_set_parent_list(&x->word1, n); + AST_set_parent_list(&x->attributes, n); + AST_set_parent_list(&x->fields, n); + break; +} +case kind_union_ref: case kind_nx_union_ref: { + union_ref x = CAST(union_ref, n); + + AST_set_parent_list(&x->word1, n); + AST_set_parent_list(&x->attributes, n); + AST_set_parent_list(&x->fields, n); + break; +} +case kind_nested_declarator: { + nested_declarator x = CAST(nested_declarator, n); + + AST_set_parent_list(&x->declarator, n); + break; +} +case kind_function_declarator: { + function_declarator x = CAST(function_declarator, n); + + AST_set_parent_list(&x->declarator, n); + AST_set_parent_list(&x->parms, n); + AST_set_parent_list(&x->gparms, n); + AST_set_parent_list(&x->qualifiers, n); + AST_set_parent_list(&x->return_type, n); + break; +} +case kind_pointer_declarator: { + pointer_declarator x = CAST(pointer_declarator, n); + + AST_set_parent_list(&x->declarator, n); + break; +} +case kind_qualified_declarator: { + qualified_declarator x = CAST(qualified_declarator, n); + + AST_set_parent_list(&x->declarator, n); + AST_set_parent_list(&x->modifiers, n); + break; +} +case kind_array_declarator: { + array_declarator x = CAST(array_declarator, n); + + AST_set_parent_list(&x->declarator, n); + AST_set_parent_list(&x->arg1, n); + break; +} +case kind_identifier_declarator: break; +case kind_asm_stmt: { + asm_stmt x = CAST(asm_stmt, n); + + AST_set_parent_list(&x->arg1, n); + AST_set_parent_list(&x->asm_operands1, n); + AST_set_parent_list(&x->asm_operands2, n); + AST_set_parent_list(&x->asm_clobbers, n); + AST_set_parent_list(&x->qualifiers, n); + break; +} +case kind_compound_stmt: { + compound_stmt x = CAST(compound_stmt, n); + + AST_set_parent_list(&x->id_labels, n); + AST_set_parent_list(&x->decls, n); + AST_set_parent_list(&x->stmts, n); + break; +} +case kind_if_stmt: { + if_stmt x = CAST(if_stmt, n); + + AST_set_parent_list(&x->condition, n); + AST_set_parent_list(&x->stmt1, n); + AST_set_parent_list(&x->stmt2, n); + break; +} +case kind_labeled_stmt: { + labeled_stmt x = CAST(labeled_stmt, n); + + AST_set_parent_list(&x->label, n); + AST_set_parent_list(&x->stmt, n); + break; +} +case kind_expression_stmt: { + expression_stmt x = CAST(expression_stmt, n); + + AST_set_parent_list(&x->arg1, n); + break; +} +case kind_conditional_stmt: case kind_dowhile_stmt: case kind_while_stmt: { + conditional_stmt x = CAST(conditional_stmt, n); + + AST_set_parent_list(&x->condition, n); + AST_set_parent_list(&x->stmt, n); + break; +} +case kind_switch_stmt: { + switch_stmt x = CAST(switch_stmt, n); + + AST_set_parent_list(&x->condition, n); + AST_set_parent_list(&x->stmt, n); + break; +} +case kind_for_stmt: { + for_stmt x = CAST(for_stmt, n); + + AST_set_parent_list(&x->arg1, n); + AST_set_parent_list(&x->arg2, n); + AST_set_parent_list(&x->arg3, n); + AST_set_parent_list(&x->stmt, n); + break; +} +case kind_break_stmt: break; +case kind_continue_stmt: break; +case kind_return_stmt: { + return_stmt x = CAST(return_stmt, n); + + AST_set_parent_list(&x->arg1, n); + break; +} +case kind_goto_stmt: { + goto_stmt x = CAST(goto_stmt, n); + + AST_set_parent_list(&x->id_label, n); + break; +} +case kind_computed_goto_stmt: { + computed_goto_stmt x = CAST(computed_goto_stmt, n); + + AST_set_parent_list(&x->arg1, n); + break; +} +case kind_empty_stmt: break; +case kind_unary: case kind_not: case kind_bitnot: case kind_conjugate: case kind_unary_plus: case kind_unary_minus: case kind_address_of: case kind_imagpart: case kind_realpart: case kind_alignof_expr: case kind_sizeof_expr: case kind_extension_expr: case kind_dereference: { + unary x = CAST(unary, n); + + AST_set_parent_list(&x->arg1, n); + break; +} +case kind_binary: case kind_oror: case kind_andand: case kind_bitxor: case kind_bitor: case kind_bitand: case kind_rshift: case kind_lshift: case kind_modulo: case kind_divide: case kind_times: case kind_minus: case kind_plus: case kind_array_ref: { + binary x = CAST(binary, n); + + AST_set_parent_list(&x->arg1, n); + AST_set_parent_list(&x->arg2, n); + break; +} +case kind_comma: { + comma x = CAST(comma, n); + + AST_set_parent_list(&x->arg1, n); + break; +} +case kind_sizeof_type: { + sizeof_type x = CAST(sizeof_type, n); + + AST_set_parent_list(&x->asttype, n); + break; +} +case kind_alignof_type: { + alignof_type x = CAST(alignof_type, n); + + AST_set_parent_list(&x->asttype, n); + break; +} +case kind_label_address: { + label_address x = CAST(label_address, n); + + AST_set_parent_list(&x->id_label, n); + break; +} +case kind_cast: { + cast x = CAST(cast, n); + + AST_set_parent_list(&x->arg1, n); + AST_set_parent_list(&x->asttype, n); + break; +} +case kind_cast_list: { + cast_list x = CAST(cast_list, n); + + AST_set_parent_list(&x->asttype, n); + AST_set_parent_list(&x->init_expr, n); + break; +} +case kind_conditional: { + conditional x = CAST(conditional, n); + + AST_set_parent_list(&x->condition, n); + AST_set_parent_list(&x->arg1, n); + AST_set_parent_list(&x->arg2, n); + break; +} +case kind_identifier: break; +case kind_compound_expr: { + compound_expr x = CAST(compound_expr, n); + + AST_set_parent_list(&x->stmt, n); + break; +} +case kind_function_call: { + function_call x = CAST(function_call, n); + + AST_set_parent_list(&x->arg1, n); + AST_set_parent_list(&x->args, n); + break; +} +case kind_field_ref: { + field_ref x = CAST(field_ref, n); + + AST_set_parent_list(&x->arg1, n); + break; +} +case kind_increment: case kind_postdecrement: case kind_postincrement: case kind_predecrement: case kind_preincrement: { + increment x = CAST(increment, n); + + AST_set_parent_list(&x->arg1, n); + break; +} +case kind_comparison: case kind_ne: case kind_eq: case kind_gt: case kind_lt: case kind_geq: case kind_leq: { + comparison x = CAST(comparison, n); + + AST_set_parent_list(&x->arg1, n); + AST_set_parent_list(&x->arg2, n); + break; +} +case kind_assignment: case kind_bitxor_assign: case kind_bitor_assign: case kind_bitand_assign: case kind_rshift_assign: case kind_lshift_assign: case kind_modulo_assign: case kind_divide_assign: case kind_times_assign: case kind_minus_assign: case kind_plus_assign: case kind_assign: { + assignment x = CAST(assignment, n); + + AST_set_parent_list(&x->arg1, n); + AST_set_parent_list(&x->arg2, n); + break; +} +case kind_init_list: { + init_list x = CAST(init_list, n); + + AST_set_parent_list(&x->args, n); + break; +} +case kind_init_specific: { + init_specific x = CAST(init_specific, n); + + AST_set_parent_list(&x->designator, n); + AST_set_parent_list(&x->init_expr, n); + break; +} +case kind_designator: break; +case kind_designate_field: break; +case kind_designate_index: { + designate_index x = CAST(designate_index, n); + + AST_set_parent_list(&x->arg1, n); + AST_set_parent_list(&x->arg2, n); + break; +} +case kind_lexical_cst: break; +case kind_string_cst: break; +case kind_string: { + string x = CAST(string, n); + + AST_set_parent_list(&x->strings, n); + break; +} +case kind_id_label: break; +case kind_case_label: { + case_label x = CAST(case_label, n); + + AST_set_parent_list(&x->arg1, n); + AST_set_parent_list(&x->arg2, n); + break; +} +case kind_default_label: break; +case kind_word: break; +case kind_asm_operand: { + asm_operand x = CAST(asm_operand, n); + + AST_set_parent_list(&x->word1, n); + AST_set_parent_list(&x->string, n); + AST_set_parent_list(&x->arg1, n); + break; +} +case kind_nesc_decl: { + nesc_decl x = CAST(nesc_decl, n); + + AST_set_parent_list(&x->word1, n); + AST_set_parent_list(&x->attributes, n); + break; +} +case kind_interface: { + interface x = CAST(interface, n); + + AST_set_parent_list(&x->word1, n); + AST_set_parent_list(&x->attributes, n); + AST_set_parent_list(&x->decls, n); + break; +} +case kind_component: { + component x = CAST(component, n); + + AST_set_parent_list(&x->word1, n); + AST_set_parent_list(&x->attributes, n); + AST_set_parent_list(&x->parms, n); + AST_set_parent_list(&x->decls, n); + AST_set_parent_list(&x->implementation, n); + break; +} +case kind_implementation: break; +case kind_configuration: { + configuration x = CAST(configuration, n); + + AST_set_parent_list(&x->decls, n); + break; +} +case kind_module: { + module x = CAST(module, n); + + AST_set_parent_list(&x->decls, n); + break; +} +case kind_binary_component: break; +case kind_rp_interface: { + rp_interface x = CAST(rp_interface, n); + + AST_set_parent_list(&x->decls, n); + break; +} +case kind_interface_ref: { + interface_ref x = CAST(interface_ref, n); + + AST_set_parent_list(&x->word1, n); + AST_set_parent_list(&x->args, n); + AST_set_parent_list(&x->word2, n); + AST_set_parent_list(&x->gparms, n); + AST_set_parent_list(&x->attributes, n); + break; +} +case kind_component_ref: { + component_ref x = CAST(component_ref, n); + + AST_set_parent_list(&x->word1, n); + AST_set_parent_list(&x->word2, n); + AST_set_parent_list(&x->args, n); + break; +} +case kind_connection: case kind_eq_connection: case kind_rp_connection: { + connection x = CAST(connection, n); + + AST_set_parent_list(&x->ep1, n); + AST_set_parent_list(&x->ep2, n); + break; +} +case kind_endpoint: { + endpoint x = CAST(endpoint, n); + + AST_set_parent_list(&x->ids, n); + break; +} +case kind_parameterised_identifier: { + parameterised_identifier x = CAST(parameterised_identifier, n); + + AST_set_parent_list(&x->word1, n); + AST_set_parent_list(&x->args, n); + break; +} +case kind_generic_declarator: { + generic_declarator x = CAST(generic_declarator, n); + + AST_set_parent_list(&x->declarator, n); + AST_set_parent_list(&x->parms, n); + break; +} +case kind_generic_call: { + generic_call x = CAST(generic_call, n); + + AST_set_parent_list(&x->arg1, n); + AST_set_parent_list(&x->args, n); + break; +} +case kind_interface_ref_declarator: { + interface_ref_declarator x = CAST(interface_ref_declarator, n); + + AST_set_parent_list(&x->declarator, n); + AST_set_parent_list(&x->word1, n); + break; +} +case kind_interface_deref: { + interface_deref x = CAST(interface_deref, n); + + AST_set_parent_list(&x->arg1, n); + break; +} +case kind_component_deref: { + component_deref x = CAST(component_deref, n); + + AST_set_parent_list(&x->arg1, n); + break; +} +case kind_component_typeref: break; +case kind_atomic_stmt: { + atomic_stmt x = CAST(atomic_stmt, n); + + AST_set_parent_list(&x->stmt, n); + break; +} +case kind_nesc_attribute: { + nesc_attribute x = CAST(nesc_attribute, n); + + AST_set_parent_list(&x->word1, n); + AST_set_parent_list(&x->arg1, n); + break; +} +case kind_type_parm_decl: break; +case kind_type_argument: { + type_argument x = CAST(type_argument, n); + + AST_set_parent_list(&x->asttype, n); + break; +} diff --git a/src/AST_print.c b/src/AST_print.c new file mode 100644 index 0000000..9ef73b0 --- /dev/null +++ b/src/AST_print.c @@ -0,0 +1,1021 @@ +/* Automatically generated from nodetypes.def, do not edit. */ + +/* See the copyright notice in nodetypes.def */ +case kind_node: puts("node"); break; +case kind_declaration: puts("declaration"); break; +case kind_statement: puts("statement"); break; +case kind_expression: puts("expression"); break; +case kind_type_element: puts("type_element"); break; +case kind_declarator: puts("declarator"); break; +case kind_label: puts("label"); break; +case kind_asm_decl: { + asm_decl x = CAST(asm_decl, n); + + puts("asm_decl"); + pindent(indent); puts("asm_stmt:"); AST_print_list(indent + 1, x->asm_stmt); + break; +} +case kind_data_decl: { + data_decl x = CAST(data_decl, n); + + puts("data_decl"); + pindent(indent); puts("modifiers:"); AST_print_list(indent + 1, x->modifiers); + pindent(indent); puts("decls:"); AST_print_list(indent + 1, x->decls); + break; +} +case kind_extension_decl: { + extension_decl x = CAST(extension_decl, n); + + puts("extension_decl"); + pindent(indent); puts("decl:"); AST_print_list(indent + 1, x->decl); + break; +} +case kind_ellipsis_decl: puts("ellipsis_decl"); break; +case kind_enumerator: { + enumerator x = CAST(enumerator, n); + + puts("enumerator"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + break; +} +case kind_oldidentifier_decl: puts("oldidentifier_decl"); break; +case kind_function_decl: { + function_decl x = CAST(function_decl, n); + + puts("function_decl"); + pindent(indent); puts("declarator:"); AST_print_list(indent + 1, x->declarator); + pindent(indent); puts("modifiers:"); AST_print_list(indent + 1, x->modifiers); + pindent(indent); puts("attributes:"); AST_print_list(indent + 1, x->attributes); + pindent(indent); puts("stmt:"); AST_print_list(indent + 1, x->stmt); + break; +} +case kind_implicit_decl: puts("implicit_decl"); break; +case kind_variable_decl: { + variable_decl x = CAST(variable_decl, n); + + puts("variable_decl"); + pindent(indent); puts("declarator:"); AST_print_list(indent + 1, x->declarator); + pindent(indent); puts("attributes:"); AST_print_list(indent + 1, x->attributes); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + pindent(indent); puts("asm_stmt:"); AST_print_list(indent + 1, x->asm_stmt); + break; +} +case kind_field_decl: { + field_decl x = CAST(field_decl, n); + + puts("field_decl"); + pindent(indent); puts("declarator:"); AST_print_list(indent + 1, x->declarator); + pindent(indent); puts("attributes:"); AST_print_list(indent + 1, x->attributes); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + break; +} +case kind_asttype: { + asttype x = CAST(asttype, n); + + puts("asttype"); + pindent(indent); puts("declarator:"); AST_print_list(indent + 1, x->declarator); + pindent(indent); puts("qualifiers:"); AST_print_list(indent + 1, x->qualifiers); + break; +} +case kind_typename: puts("typename"); break; +case kind_typeof_expr: { + typeof_expr x = CAST(typeof_expr, n); + + puts("typeof_expr"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + break; +} +case kind_typeof_type: { + typeof_type x = CAST(typeof_type, n); + + puts("typeof_type"); + pindent(indent); puts("asttype:"); AST_print_list(indent + 1, x->asttype); + break; +} +case kind_attribute: { + attribute x = CAST(attribute, n); + + puts("attribute"); + pindent(indent); puts("word1:"); AST_print_list(indent + 1, x->word1); + break; +} +case kind_gcc_attribute: { + gcc_attribute x = CAST(gcc_attribute, n); + + puts("gcc_attribute"); + pindent(indent); puts("word1:"); AST_print_list(indent + 1, x->word1); + pindent(indent); puts("args:"); AST_print_list(indent + 1, x->args); + break; +} +case kind_rid: puts("rid"); break; +case kind_qualifier: puts("qualifier"); break; +case kind_tag_ref: { + tag_ref x = CAST(tag_ref, n); + + puts("tag_ref"); + pindent(indent); puts("word1:"); AST_print_list(indent + 1, x->word1); + pindent(indent); puts("attributes:"); AST_print_list(indent + 1, x->attributes); + pindent(indent); puts("fields:"); AST_print_list(indent + 1, x->fields); + break; +} +case kind_struct_ref: { + struct_ref x = CAST(struct_ref, n); + + puts("struct_ref"); + pindent(indent); puts("word1:"); AST_print_list(indent + 1, x->word1); + pindent(indent); puts("attributes:"); AST_print_list(indent + 1, x->attributes); + pindent(indent); puts("fields:"); AST_print_list(indent + 1, x->fields); + break; +} +case kind_union_ref: { + union_ref x = CAST(union_ref, n); + + puts("union_ref"); + pindent(indent); puts("word1:"); AST_print_list(indent + 1, x->word1); + pindent(indent); puts("attributes:"); AST_print_list(indent + 1, x->attributes); + pindent(indent); puts("fields:"); AST_print_list(indent + 1, x->fields); + break; +} +case kind_nested_declarator: { + nested_declarator x = CAST(nested_declarator, n); + + puts("nested_declarator"); + pindent(indent); puts("declarator:"); AST_print_list(indent + 1, x->declarator); + break; +} +case kind_function_declarator: { + function_declarator x = CAST(function_declarator, n); + + puts("function_declarator"); + pindent(indent); puts("declarator:"); AST_print_list(indent + 1, x->declarator); + pindent(indent); puts("parms:"); AST_print_list(indent + 1, x->parms); + pindent(indent); puts("gparms:"); AST_print_list(indent + 1, x->gparms); + pindent(indent); puts("qualifiers:"); AST_print_list(indent + 1, x->qualifiers); + pindent(indent); puts("return_type:"); AST_print_list(indent + 1, x->return_type); + break; +} +case kind_pointer_declarator: { + pointer_declarator x = CAST(pointer_declarator, n); + + puts("pointer_declarator"); + pindent(indent); puts("declarator:"); AST_print_list(indent + 1, x->declarator); + break; +} +case kind_qualified_declarator: { + qualified_declarator x = CAST(qualified_declarator, n); + + puts("qualified_declarator"); + pindent(indent); puts("declarator:"); AST_print_list(indent + 1, x->declarator); + pindent(indent); puts("modifiers:"); AST_print_list(indent + 1, x->modifiers); + break; +} +case kind_array_declarator: { + array_declarator x = CAST(array_declarator, n); + + puts("array_declarator"); + pindent(indent); puts("declarator:"); AST_print_list(indent + 1, x->declarator); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + break; +} +case kind_identifier_declarator: puts("identifier_declarator"); break; +case kind_asm_stmt: { + asm_stmt x = CAST(asm_stmt, n); + + puts("asm_stmt"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + pindent(indent); puts("asm_operands1:"); AST_print_list(indent + 1, x->asm_operands1); + pindent(indent); puts("asm_operands2:"); AST_print_list(indent + 1, x->asm_operands2); + pindent(indent); puts("asm_clobbers:"); AST_print_list(indent + 1, x->asm_clobbers); + pindent(indent); puts("qualifiers:"); AST_print_list(indent + 1, x->qualifiers); + break; +} +case kind_compound_stmt: { + compound_stmt x = CAST(compound_stmt, n); + + puts("compound_stmt"); + pindent(indent); puts("id_labels:"); AST_print_list(indent + 1, x->id_labels); + pindent(indent); puts("decls:"); AST_print_list(indent + 1, x->decls); + pindent(indent); puts("stmts:"); AST_print_list(indent + 1, x->stmts); + break; +} +case kind_if_stmt: { + if_stmt x = CAST(if_stmt, n); + + puts("if_stmt"); + pindent(indent); puts("condition:"); AST_print_list(indent + 1, x->condition); + pindent(indent); puts("stmt1:"); AST_print_list(indent + 1, x->stmt1); + pindent(indent); puts("stmt2:"); AST_print_list(indent + 1, x->stmt2); + break; +} +case kind_labeled_stmt: { + labeled_stmt x = CAST(labeled_stmt, n); + + puts("labeled_stmt"); + pindent(indent); puts("label:"); AST_print_list(indent + 1, x->label); + pindent(indent); puts("stmt:"); AST_print_list(indent + 1, x->stmt); + break; +} +case kind_expression_stmt: { + expression_stmt x = CAST(expression_stmt, n); + + puts("expression_stmt"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + break; +} +case kind_conditional_stmt: { + conditional_stmt x = CAST(conditional_stmt, n); + + puts("conditional_stmt"); + pindent(indent); puts("condition:"); AST_print_list(indent + 1, x->condition); + pindent(indent); puts("stmt:"); AST_print_list(indent + 1, x->stmt); + break; +} +case kind_switch_stmt: { + switch_stmt x = CAST(switch_stmt, n); + + puts("switch_stmt"); + pindent(indent); puts("condition:"); AST_print_list(indent + 1, x->condition); + pindent(indent); puts("stmt:"); AST_print_list(indent + 1, x->stmt); + break; +} +case kind_for_stmt: { + for_stmt x = CAST(for_stmt, n); + + puts("for_stmt"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + pindent(indent); puts("arg2:"); AST_print_list(indent + 1, x->arg2); + pindent(indent); puts("arg3:"); AST_print_list(indent + 1, x->arg3); + pindent(indent); puts("stmt:"); AST_print_list(indent + 1, x->stmt); + break; +} +case kind_break_stmt: puts("break_stmt"); break; +case kind_continue_stmt: puts("continue_stmt"); break; +case kind_return_stmt: { + return_stmt x = CAST(return_stmt, n); + + puts("return_stmt"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + break; +} +case kind_goto_stmt: { + goto_stmt x = CAST(goto_stmt, n); + + puts("goto_stmt"); + pindent(indent); puts("id_label:"); AST_print_list(indent + 1, x->id_label); + break; +} +case kind_computed_goto_stmt: { + computed_goto_stmt x = CAST(computed_goto_stmt, n); + + puts("computed_goto_stmt"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + break; +} +case kind_empty_stmt: puts("empty_stmt"); break; +case kind_unary: { + unary x = CAST(unary, n); + + puts("unary"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + break; +} +case kind_binary: { + binary x = CAST(binary, n); + + puts("binary"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + pindent(indent); puts("arg2:"); AST_print_list(indent + 1, x->arg2); + break; +} +case kind_comma: { + comma x = CAST(comma, n); + + puts("comma"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + break; +} +case kind_sizeof_type: { + sizeof_type x = CAST(sizeof_type, n); + + puts("sizeof_type"); + pindent(indent); puts("asttype:"); AST_print_list(indent + 1, x->asttype); + break; +} +case kind_alignof_type: { + alignof_type x = CAST(alignof_type, n); + + puts("alignof_type"); + pindent(indent); puts("asttype:"); AST_print_list(indent + 1, x->asttype); + break; +} +case kind_label_address: { + label_address x = CAST(label_address, n); + + puts("label_address"); + pindent(indent); puts("id_label:"); AST_print_list(indent + 1, x->id_label); + break; +} +case kind_cast: { + cast x = CAST(cast, n); + + puts("cast"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + pindent(indent); puts("asttype:"); AST_print_list(indent + 1, x->asttype); + break; +} +case kind_cast_list: { + cast_list x = CAST(cast_list, n); + + puts("cast_list"); + pindent(indent); puts("asttype:"); AST_print_list(indent + 1, x->asttype); + pindent(indent); puts("init_expr:"); AST_print_list(indent + 1, x->init_expr); + break; +} +case kind_conditional: { + conditional x = CAST(conditional, n); + + puts("conditional"); + pindent(indent); puts("condition:"); AST_print_list(indent + 1, x->condition); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + pindent(indent); puts("arg2:"); AST_print_list(indent + 1, x->arg2); + break; +} +case kind_identifier: puts("identifier"); break; +case kind_compound_expr: { + compound_expr x = CAST(compound_expr, n); + + puts("compound_expr"); + pindent(indent); puts("stmt:"); AST_print_list(indent + 1, x->stmt); + break; +} +case kind_function_call: { + function_call x = CAST(function_call, n); + + puts("function_call"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + pindent(indent); puts("args:"); AST_print_list(indent + 1, x->args); + break; +} +case kind_field_ref: { + field_ref x = CAST(field_ref, n); + + puts("field_ref"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + break; +} +case kind_increment: { + increment x = CAST(increment, n); + + puts("increment"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + break; +} +case kind_comparison: { + comparison x = CAST(comparison, n); + + puts("comparison"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + pindent(indent); puts("arg2:"); AST_print_list(indent + 1, x->arg2); + break; +} +case kind_assignment: { + assignment x = CAST(assignment, n); + + puts("assignment"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + pindent(indent); puts("arg2:"); AST_print_list(indent + 1, x->arg2); + break; +} +case kind_init_list: { + init_list x = CAST(init_list, n); + + puts("init_list"); + pindent(indent); puts("args:"); AST_print_list(indent + 1, x->args); + break; +} +case kind_init_specific: { + init_specific x = CAST(init_specific, n); + + puts("init_specific"); + pindent(indent); puts("designator:"); AST_print_list(indent + 1, x->designator); + pindent(indent); puts("init_expr:"); AST_print_list(indent + 1, x->init_expr); + break; +} +case kind_designator: puts("designator"); break; +case kind_designate_field: puts("designate_field"); break; +case kind_designate_index: { + designate_index x = CAST(designate_index, n); + + puts("designate_index"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + pindent(indent); puts("arg2:"); AST_print_list(indent + 1, x->arg2); + break; +} +case kind_lexical_cst: puts("lexical_cst"); break; +case kind_string_cst: puts("string_cst"); break; +case kind_string: { + string x = CAST(string, n); + + puts("string"); + pindent(indent); puts("strings:"); AST_print_list(indent + 1, x->strings); + break; +} +case kind_id_label: puts("id_label"); break; +case kind_case_label: { + case_label x = CAST(case_label, n); + + puts("case_label"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + pindent(indent); puts("arg2:"); AST_print_list(indent + 1, x->arg2); + break; +} +case kind_default_label: puts("default_label"); break; +case kind_word: puts("word"); break; +case kind_asm_operand: { + asm_operand x = CAST(asm_operand, n); + + puts("asm_operand"); + pindent(indent); puts("word1:"); AST_print_list(indent + 1, x->word1); + pindent(indent); puts("string:"); AST_print_list(indent + 1, x->string); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + break; +} +case kind_nesc_decl: { + nesc_decl x = CAST(nesc_decl, n); + + puts("nesc_decl"); + pindent(indent); puts("word1:"); AST_print_list(indent + 1, x->word1); + pindent(indent); puts("attributes:"); AST_print_list(indent + 1, x->attributes); + break; +} +case kind_interface: { + interface x = CAST(interface, n); + + puts("interface"); + pindent(indent); puts("word1:"); AST_print_list(indent + 1, x->word1); + pindent(indent); puts("attributes:"); AST_print_list(indent + 1, x->attributes); + pindent(indent); puts("decls:"); AST_print_list(indent + 1, x->decls); + break; +} +case kind_component: { + component x = CAST(component, n); + + puts("component"); + pindent(indent); puts("word1:"); AST_print_list(indent + 1, x->word1); + pindent(indent); puts("attributes:"); AST_print_list(indent + 1, x->attributes); + pindent(indent); puts("parms:"); AST_print_list(indent + 1, x->parms); + pindent(indent); puts("decls:"); AST_print_list(indent + 1, x->decls); + pindent(indent); puts("implementation:"); AST_print_list(indent + 1, x->implementation); + break; +} +case kind_implementation: puts("implementation"); break; +case kind_configuration: { + configuration x = CAST(configuration, n); + + puts("configuration"); + pindent(indent); puts("decls:"); AST_print_list(indent + 1, x->decls); + break; +} +case kind_module: { + module x = CAST(module, n); + + puts("module"); + pindent(indent); puts("decls:"); AST_print_list(indent + 1, x->decls); + break; +} +case kind_binary_component: puts("binary_component"); break; +case kind_rp_interface: { + rp_interface x = CAST(rp_interface, n); + + puts("rp_interface"); + pindent(indent); puts("decls:"); AST_print_list(indent + 1, x->decls); + break; +} +case kind_interface_ref: { + interface_ref x = CAST(interface_ref, n); + + puts("interface_ref"); + pindent(indent); puts("word1:"); AST_print_list(indent + 1, x->word1); + pindent(indent); puts("args:"); AST_print_list(indent + 1, x->args); + pindent(indent); puts("word2:"); AST_print_list(indent + 1, x->word2); + pindent(indent); puts("gparms:"); AST_print_list(indent + 1, x->gparms); + pindent(indent); puts("attributes:"); AST_print_list(indent + 1, x->attributes); + break; +} +case kind_component_ref: { + component_ref x = CAST(component_ref, n); + + puts("component_ref"); + pindent(indent); puts("word1:"); AST_print_list(indent + 1, x->word1); + pindent(indent); puts("word2:"); AST_print_list(indent + 1, x->word2); + pindent(indent); puts("args:"); AST_print_list(indent + 1, x->args); + break; +} +case kind_connection: { + connection x = CAST(connection, n); + + puts("connection"); + pindent(indent); puts("ep1:"); AST_print_list(indent + 1, x->ep1); + pindent(indent); puts("ep2:"); AST_print_list(indent + 1, x->ep2); + break; +} +case kind_endpoint: { + endpoint x = CAST(endpoint, n); + + puts("endpoint"); + pindent(indent); puts("ids:"); AST_print_list(indent + 1, x->ids); + break; +} +case kind_parameterised_identifier: { + parameterised_identifier x = CAST(parameterised_identifier, n); + + puts("parameterised_identifier"); + pindent(indent); puts("word1:"); AST_print_list(indent + 1, x->word1); + pindent(indent); puts("args:"); AST_print_list(indent + 1, x->args); + break; +} +case kind_generic_declarator: { + generic_declarator x = CAST(generic_declarator, n); + + puts("generic_declarator"); + pindent(indent); puts("declarator:"); AST_print_list(indent + 1, x->declarator); + pindent(indent); puts("parms:"); AST_print_list(indent + 1, x->parms); + break; +} +case kind_generic_call: { + generic_call x = CAST(generic_call, n); + + puts("generic_call"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + pindent(indent); puts("args:"); AST_print_list(indent + 1, x->args); + break; +} +case kind_interface_ref_declarator: { + interface_ref_declarator x = CAST(interface_ref_declarator, n); + + puts("interface_ref_declarator"); + pindent(indent); puts("declarator:"); AST_print_list(indent + 1, x->declarator); + pindent(indent); puts("word1:"); AST_print_list(indent + 1, x->word1); + break; +} +case kind_interface_deref: { + interface_deref x = CAST(interface_deref, n); + + puts("interface_deref"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + break; +} +case kind_component_deref: { + component_deref x = CAST(component_deref, n); + + puts("component_deref"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + break; +} +case kind_component_typeref: puts("component_typeref"); break; +case kind_atomic_stmt: { + atomic_stmt x = CAST(atomic_stmt, n); + + puts("atomic_stmt"); + pindent(indent); puts("stmt:"); AST_print_list(indent + 1, x->stmt); + break; +} +case kind_nesc_attribute: { + nesc_attribute x = CAST(nesc_attribute, n); + + puts("nesc_attribute"); + pindent(indent); puts("word1:"); AST_print_list(indent + 1, x->word1); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + break; +} +case kind_type_parm_decl: puts("type_parm_decl"); break; +case kind_type_argument: { + type_argument x = CAST(type_argument, n); + + puts("type_argument"); + pindent(indent); puts("asttype:"); AST_print_list(indent + 1, x->asttype); + break; +} +case kind_error_decl: puts("error_decl"); break; +case kind_attribute_ref: { + attribute_ref x = CAST(attribute_ref, n); + + puts("attribute_ref"); + pindent(indent); puts("word1:"); AST_print_list(indent + 1, x->word1); + pindent(indent); puts("attributes:"); AST_print_list(indent + 1, x->attributes); + pindent(indent); puts("fields:"); AST_print_list(indent + 1, x->fields); + break; +} +case kind_enum_ref: { + enum_ref x = CAST(enum_ref, n); + + puts("enum_ref"); + pindent(indent); puts("word1:"); AST_print_list(indent + 1, x->word1); + pindent(indent); puts("attributes:"); AST_print_list(indent + 1, x->attributes); + pindent(indent); puts("fields:"); AST_print_list(indent + 1, x->fields); + break; +} +case kind_error_stmt: puts("error_stmt"); break; +case kind_while_stmt: { + while_stmt x = CAST(while_stmt, n); + + puts("while_stmt"); + pindent(indent); puts("condition:"); AST_print_list(indent + 1, x->condition); + pindent(indent); puts("stmt:"); AST_print_list(indent + 1, x->stmt); + break; +} +case kind_dowhile_stmt: { + dowhile_stmt x = CAST(dowhile_stmt, n); + + puts("dowhile_stmt"); + pindent(indent); puts("condition:"); AST_print_list(indent + 1, x->condition); + pindent(indent); puts("stmt:"); AST_print_list(indent + 1, x->stmt); + break; +} +case kind_error_expr: puts("error_expr"); break; +case kind_array_ref: { + array_ref x = CAST(array_ref, n); + + puts("array_ref"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + pindent(indent); puts("arg2:"); AST_print_list(indent + 1, x->arg2); + break; +} +case kind_dereference: { + dereference x = CAST(dereference, n); + + puts("dereference"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + break; +} +case kind_extension_expr: { + extension_expr x = CAST(extension_expr, n); + + puts("extension_expr"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + break; +} +case kind_sizeof_expr: { + sizeof_expr x = CAST(sizeof_expr, n); + + puts("sizeof_expr"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + break; +} +case kind_alignof_expr: { + alignof_expr x = CAST(alignof_expr, n); + + puts("alignof_expr"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + break; +} +case kind_realpart: { + realpart x = CAST(realpart, n); + + puts("realpart"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + break; +} +case kind_imagpart: { + imagpart x = CAST(imagpart, n); + + puts("imagpart"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + break; +} +case kind_address_of: { + address_of x = CAST(address_of, n); + + puts("address_of"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + break; +} +case kind_unary_minus: { + unary_minus x = CAST(unary_minus, n); + + puts("unary_minus"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + break; +} +case kind_unary_plus: { + unary_plus x = CAST(unary_plus, n); + + puts("unary_plus"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + break; +} +case kind_conjugate: { + conjugate x = CAST(conjugate, n); + + puts("conjugate"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + break; +} +case kind_bitnot: { + bitnot x = CAST(bitnot, n); + + puts("bitnot"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + break; +} +case kind_not: { + not x = CAST(not, n); + + puts("not"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + break; +} +case kind_preincrement: { + preincrement x = CAST(preincrement, n); + + puts("preincrement"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + break; +} +case kind_predecrement: { + predecrement x = CAST(predecrement, n); + + puts("predecrement"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + break; +} +case kind_postincrement: { + postincrement x = CAST(postincrement, n); + + puts("postincrement"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + break; +} +case kind_postdecrement: { + postdecrement x = CAST(postdecrement, n); + + puts("postdecrement"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + break; +} +case kind_plus: { + plus x = CAST(plus, n); + + puts("plus"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + pindent(indent); puts("arg2:"); AST_print_list(indent + 1, x->arg2); + break; +} +case kind_minus: { + minus x = CAST(minus, n); + + puts("minus"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + pindent(indent); puts("arg2:"); AST_print_list(indent + 1, x->arg2); + break; +} +case kind_times: { + times x = CAST(times, n); + + puts("times"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + pindent(indent); puts("arg2:"); AST_print_list(indent + 1, x->arg2); + break; +} +case kind_divide: { + divide x = CAST(divide, n); + + puts("divide"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + pindent(indent); puts("arg2:"); AST_print_list(indent + 1, x->arg2); + break; +} +case kind_modulo: { + modulo x = CAST(modulo, n); + + puts("modulo"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + pindent(indent); puts("arg2:"); AST_print_list(indent + 1, x->arg2); + break; +} +case kind_lshift: { + lshift x = CAST(lshift, n); + + puts("lshift"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + pindent(indent); puts("arg2:"); AST_print_list(indent + 1, x->arg2); + break; +} +case kind_rshift: { + rshift x = CAST(rshift, n); + + puts("rshift"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + pindent(indent); puts("arg2:"); AST_print_list(indent + 1, x->arg2); + break; +} +case kind_leq: { + leq x = CAST(leq, n); + + puts("leq"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + pindent(indent); puts("arg2:"); AST_print_list(indent + 1, x->arg2); + break; +} +case kind_geq: { + geq x = CAST(geq, n); + + puts("geq"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + pindent(indent); puts("arg2:"); AST_print_list(indent + 1, x->arg2); + break; +} +case kind_lt: { + lt x = CAST(lt, n); + + puts("lt"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + pindent(indent); puts("arg2:"); AST_print_list(indent + 1, x->arg2); + break; +} +case kind_gt: { + gt x = CAST(gt, n); + + puts("gt"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + pindent(indent); puts("arg2:"); AST_print_list(indent + 1, x->arg2); + break; +} +case kind_eq: { + eq x = CAST(eq, n); + + puts("eq"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + pindent(indent); puts("arg2:"); AST_print_list(indent + 1, x->arg2); + break; +} +case kind_ne: { + ne x = CAST(ne, n); + + puts("ne"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + pindent(indent); puts("arg2:"); AST_print_list(indent + 1, x->arg2); + break; +} +case kind_bitand: { + bitand x = CAST(bitand, n); + + puts("bitand"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + pindent(indent); puts("arg2:"); AST_print_list(indent + 1, x->arg2); + break; +} +case kind_bitor: { + bitor x = CAST(bitor, n); + + puts("bitor"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + pindent(indent); puts("arg2:"); AST_print_list(indent + 1, x->arg2); + break; +} +case kind_bitxor: { + bitxor x = CAST(bitxor, n); + + puts("bitxor"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + pindent(indent); puts("arg2:"); AST_print_list(indent + 1, x->arg2); + break; +} +case kind_andand: { + andand x = CAST(andand, n); + + puts("andand"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + pindent(indent); puts("arg2:"); AST_print_list(indent + 1, x->arg2); + break; +} +case kind_oror: { + oror x = CAST(oror, n); + + puts("oror"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + pindent(indent); puts("arg2:"); AST_print_list(indent + 1, x->arg2); + break; +} +case kind_assign: { + assign x = CAST(assign, n); + + puts("assign"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + pindent(indent); puts("arg2:"); AST_print_list(indent + 1, x->arg2); + break; +} +case kind_plus_assign: { + plus_assign x = CAST(plus_assign, n); + + puts("plus_assign"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + pindent(indent); puts("arg2:"); AST_print_list(indent + 1, x->arg2); + break; +} +case kind_minus_assign: { + minus_assign x = CAST(minus_assign, n); + + puts("minus_assign"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + pindent(indent); puts("arg2:"); AST_print_list(indent + 1, x->arg2); + break; +} +case kind_times_assign: { + times_assign x = CAST(times_assign, n); + + puts("times_assign"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + pindent(indent); puts("arg2:"); AST_print_list(indent + 1, x->arg2); + break; +} +case kind_divide_assign: { + divide_assign x = CAST(divide_assign, n); + + puts("divide_assign"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + pindent(indent); puts("arg2:"); AST_print_list(indent + 1, x->arg2); + break; +} +case kind_modulo_assign: { + modulo_assign x = CAST(modulo_assign, n); + + puts("modulo_assign"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + pindent(indent); puts("arg2:"); AST_print_list(indent + 1, x->arg2); + break; +} +case kind_lshift_assign: { + lshift_assign x = CAST(lshift_assign, n); + + puts("lshift_assign"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + pindent(indent); puts("arg2:"); AST_print_list(indent + 1, x->arg2); + break; +} +case kind_rshift_assign: { + rshift_assign x = CAST(rshift_assign, n); + + puts("rshift_assign"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + pindent(indent); puts("arg2:"); AST_print_list(indent + 1, x->arg2); + break; +} +case kind_bitand_assign: { + bitand_assign x = CAST(bitand_assign, n); + + puts("bitand_assign"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + pindent(indent); puts("arg2:"); AST_print_list(indent + 1, x->arg2); + break; +} +case kind_bitor_assign: { + bitor_assign x = CAST(bitor_assign, n); + + puts("bitor_assign"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + pindent(indent); puts("arg2:"); AST_print_list(indent + 1, x->arg2); + break; +} +case kind_bitxor_assign: { + bitxor_assign x = CAST(bitxor_assign, n); + + puts("bitxor_assign"); + pindent(indent); puts("arg1:"); AST_print_list(indent + 1, x->arg1); + pindent(indent); puts("arg2:"); AST_print_list(indent + 1, x->arg2); + break; +} +case kind_rp_connection: { + rp_connection x = CAST(rp_connection, n); + + puts("rp_connection"); + pindent(indent); puts("ep1:"); AST_print_list(indent + 1, x->ep1); + pindent(indent); puts("ep2:"); AST_print_list(indent + 1, x->ep2); + break; +} +case kind_eq_connection: { + eq_connection x = CAST(eq_connection, n); + + puts("eq_connection"); + pindent(indent); puts("ep1:"); AST_print_list(indent + 1, x->ep1); + pindent(indent); puts("ep2:"); AST_print_list(indent + 1, x->ep2); + break; +} +case kind_nx_struct_ref: { + nx_struct_ref x = CAST(nx_struct_ref, n); + + puts("nx_struct_ref"); + pindent(indent); puts("word1:"); AST_print_list(indent + 1, x->word1); + pindent(indent); puts("attributes:"); AST_print_list(indent + 1, x->attributes); + pindent(indent); puts("fields:"); AST_print_list(indent + 1, x->fields); + break; +} +case kind_nx_union_ref: { + nx_union_ref x = CAST(nx_union_ref, n); + + puts("nx_union_ref"); + pindent(indent); puts("word1:"); AST_print_list(indent + 1, x->word1); + pindent(indent); puts("attributes:"); AST_print_list(indent + 1, x->attributes); + pindent(indent); puts("fields:"); AST_print_list(indent + 1, x->fields); + break; +} diff --git a/src/AST_types.c b/src/AST_types.c new file mode 100644 index 0000000..1e07059 --- /dev/null +++ b/src/AST_types.c @@ -0,0 +1,2591 @@ +/* Automatically generated from nodetypes.def, do not edit. */ + +/* See the copyright notice in nodetypes.def */ +node new_node(region r, location location) +{ + node obj = ralloc(r, struct AST_node); + + obj->kind = kind_node; + obj->location = location; + + return obj; +} + +declaration new_declaration(region r, location location) +{ + declaration obj = ralloc(r, struct AST_declaration); + + obj->kind = kind_declaration; + obj->location = location; + + return obj; +} + +statement new_statement(region r, location location) +{ + statement obj = ralloc(r, struct AST_statement); + + obj->kind = kind_statement; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + + return obj; +} + +expression new_expression(region r, location location) +{ + expression obj = ralloc(r, struct AST_expression); + + obj->kind = kind_expression; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + + return obj; +} + +type_element new_type_element(region r, location location) +{ + type_element obj = ralloc(r, struct AST_type_element); + + obj->kind = kind_type_element; + obj->location = location; + + return obj; +} + +declarator new_declarator(region r, location location) +{ + declarator obj = ralloc(r, struct AST_declarator); + + obj->kind = kind_declarator; + obj->location = location; + + return obj; +} + +label new_label(region r, location location) +{ + label obj = ralloc(r, struct AST_label); + + obj->kind = kind_label; + obj->location = location; + + return obj; +} + +asm_decl new_asm_decl(region r, location location, asm_stmt asm_stmt) +{ + asm_decl obj = ralloc(r, struct AST_asm_decl); + + obj->kind = kind_asm_decl; + obj->location = location; + obj->asm_stmt = asm_stmt; + + return obj; +} + +data_decl new_data_decl(region r, location location, type_element modifiers, declaration decls) +{ + data_decl obj = ralloc(r, struct AST_data_decl); + + obj->kind = kind_data_decl; + obj->location = location; + obj->modifiers = modifiers; + obj->decls = decls; + + return obj; +} + +extension_decl new_extension_decl(region r, location location, declaration decl) +{ + extension_decl obj = ralloc(r, struct AST_extension_decl); + + obj->kind = kind_extension_decl; + obj->location = location; + obj->decl = decl; + + return obj; +} + +ellipsis_decl new_ellipsis_decl(region r, location location) +{ + ellipsis_decl obj = ralloc(r, struct AST_ellipsis_decl); + + obj->kind = kind_ellipsis_decl; + obj->location = location; + + return obj; +} + +enumerator new_enumerator(region r, location location, cstring cstring, expression arg1, data_declaration ddecl) +{ + enumerator obj = ralloc(r, struct AST_enumerator); + + obj->kind = kind_enumerator; + obj->location = location; + obj->cstring = cstring; + obj->arg1 = arg1; + obj->ddecl = ddecl; + + return obj; +} + +oldidentifier_decl new_oldidentifier_decl(region r, location location, cstring cstring, data_declaration ddecl) +{ + oldidentifier_decl obj = ralloc(r, struct AST_oldidentifier_decl); + + obj->kind = kind_oldidentifier_decl; + obj->location = location; + obj->cstring = cstring; + obj->ddecl = ddecl; + + return obj; +} + +function_decl new_function_decl(region r, location location, declarator declarator, type_element modifiers, attribute attributes, declaration old_parms, statement stmt, function_decl parent_function, data_declaration ddecl) +{ + function_decl obj = ralloc(r, struct AST_function_decl); + + obj->kind = kind_function_decl; + obj->location = location; + obj->declarator = declarator; + obj->modifiers = modifiers; + obj->attributes = attributes; + obj->old_parms = old_parms; + obj->stmt = stmt; + obj->parent_function = parent_function; + obj->ddecl = ddecl; + + return obj; +} + +implicit_decl new_implicit_decl(region r, location location, identifier ident) +{ + implicit_decl obj = ralloc(r, struct AST_implicit_decl); + + obj->kind = kind_implicit_decl; + obj->location = location; + obj->ident = ident; + + return obj; +} + +variable_decl new_variable_decl(region r, location location, declarator declarator, attribute attributes, expression arg1, asm_stmt asm_stmt, data_declaration ddecl) +{ + variable_decl obj = ralloc(r, struct AST_variable_decl); + + obj->kind = kind_variable_decl; + obj->location = location; + obj->declarator = declarator; + obj->attributes = attributes; + obj->arg1 = arg1; + obj->asm_stmt = asm_stmt; + obj->ddecl = ddecl; + + return obj; +} + +field_decl new_field_decl(region r, location location, declarator declarator, attribute attributes, expression arg1) +{ + field_decl obj = ralloc(r, struct AST_field_decl); + + obj->kind = kind_field_decl; + obj->location = location; + obj->declarator = declarator; + obj->attributes = attributes; + obj->arg1 = arg1; + + return obj; +} + +asttype new_asttype(region r, location location, declarator declarator, type_element qualifiers) +{ + asttype obj = ralloc(r, struct AST_asttype); + + obj->kind = kind_asttype; + obj->location = location; + obj->declarator = declarator; + obj->qualifiers = qualifiers; + + return obj; +} + +typename new_typename(region r, location location, data_declaration ddecl) +{ + typename obj = ralloc(r, struct AST_typename); + + obj->kind = kind_typename; + obj->location = location; + obj->ddecl = ddecl; + + return obj; +} + +typeof_expr new_typeof_expr(region r, location location, expression arg1) +{ + typeof_expr obj = ralloc(r, struct AST_typeof_expr); + + obj->kind = kind_typeof_expr; + obj->location = location; + obj->arg1 = arg1; + + return obj; +} + +typeof_type new_typeof_type(region r, location location, asttype asttype) +{ + typeof_type obj = ralloc(r, struct AST_typeof_type); + + obj->kind = kind_typeof_type; + obj->location = location; + obj->asttype = asttype; + + return obj; +} + +attribute new_attribute(region r, location location, word word1) +{ + attribute obj = ralloc(r, struct AST_attribute); + + obj->kind = kind_attribute; + obj->location = location; + obj->word1 = word1; + + return obj; +} + +gcc_attribute new_gcc_attribute(region r, location location, word word1, expression args) +{ + gcc_attribute obj = ralloc(r, struct AST_gcc_attribute); + + obj->kind = kind_gcc_attribute; + obj->location = location; + obj->word1 = word1; + obj->args = args; + + return obj; +} + +rid new_rid(region r, location location, enum rid id) +{ + rid obj = ralloc(r, struct AST_rid); + + obj->kind = kind_rid; + obj->location = location; + obj->id = id; + + return obj; +} + +qualifier new_qualifier(region r, location location, enum rid id) +{ + qualifier obj = ralloc(r, struct AST_qualifier); + + obj->kind = kind_qualifier; + obj->location = location; + obj->id = id; + + return obj; +} + +tag_ref new_tag_ref(region r, location location, word word1, attribute attributes, declaration fields, bool defined) +{ + tag_ref obj = ralloc(r, struct AST_tag_ref); + + obj->kind = kind_tag_ref; + obj->location = location; + obj->word1 = word1; + obj->attributes = attributes; + obj->fields = fields; + obj->defined = defined; + + return obj; +} + +struct_ref new_struct_ref(region r, location location, word word1, attribute attributes, declaration fields, bool defined) +{ + struct_ref obj = ralloc(r, struct AST_struct_ref); + + obj->kind = kind_struct_ref; + obj->location = location; + obj->word1 = word1; + obj->attributes = attributes; + obj->fields = fields; + obj->defined = defined; + + return obj; +} + +union_ref new_union_ref(region r, location location, word word1, attribute attributes, declaration fields, bool defined) +{ + union_ref obj = ralloc(r, struct AST_union_ref); + + obj->kind = kind_union_ref; + obj->location = location; + obj->word1 = word1; + obj->attributes = attributes; + obj->fields = fields; + obj->defined = defined; + + return obj; +} + +nested_declarator new_nested_declarator(region r, location location, declarator declarator) +{ + nested_declarator obj = ralloc(r, struct AST_nested_declarator); + + obj->kind = kind_nested_declarator; + obj->location = location; + obj->declarator = declarator; + + return obj; +} + +function_declarator new_function_declarator(region r, location location, declarator declarator, declaration parms, declaration gparms, type_element qualifiers, environment env) +{ + function_declarator obj = ralloc(r, struct AST_function_declarator); + + obj->kind = kind_function_declarator; + obj->location = location; + obj->declarator = declarator; + obj->parms = parms; + obj->gparms = gparms; + obj->qualifiers = qualifiers; + obj->env = env; + + return obj; +} + +pointer_declarator new_pointer_declarator(region r, location location, declarator declarator) +{ + pointer_declarator obj = ralloc(r, struct AST_pointer_declarator); + + obj->kind = kind_pointer_declarator; + obj->location = location; + obj->declarator = declarator; + + return obj; +} + +qualified_declarator new_qualified_declarator(region r, location location, declarator declarator, type_element modifiers) +{ + qualified_declarator obj = ralloc(r, struct AST_qualified_declarator); + + obj->kind = kind_qualified_declarator; + obj->location = location; + obj->declarator = declarator; + obj->modifiers = modifiers; + + return obj; +} + +array_declarator new_array_declarator(region r, location location, declarator declarator, expression arg1) +{ + array_declarator obj = ralloc(r, struct AST_array_declarator); + + obj->kind = kind_array_declarator; + obj->location = location; + obj->declarator = declarator; + obj->arg1 = arg1; + + return obj; +} + +identifier_declarator new_identifier_declarator(region r, location location, cstring cstring) +{ + identifier_declarator obj = ralloc(r, struct AST_identifier_declarator); + + obj->kind = kind_identifier_declarator; + obj->location = location; + obj->cstring = cstring; + + return obj; +} + +asm_stmt new_asm_stmt(region r, location location, expression arg1, asm_operand asm_operands1, asm_operand asm_operands2, string asm_clobbers, type_element qualifiers) +{ + asm_stmt obj = ralloc(r, struct AST_asm_stmt); + + obj->kind = kind_asm_stmt; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + obj->asm_operands1 = asm_operands1; + obj->asm_operands2 = asm_operands2; + obj->asm_clobbers = asm_clobbers; + obj->qualifiers = qualifiers; + + return obj; +} + +compound_stmt new_compound_stmt(region r, location location, id_label id_labels, declaration decls, statement stmts, environment env) +{ + compound_stmt obj = ralloc(r, struct AST_compound_stmt); + + obj->kind = kind_compound_stmt; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->id_labels = id_labels; + obj->decls = decls; + obj->stmts = stmts; + obj->env = env; + + return obj; +} + +if_stmt new_if_stmt(region r, location location, expression condition, statement stmt1, statement stmt2) +{ + if_stmt obj = ralloc(r, struct AST_if_stmt); + + obj->kind = kind_if_stmt; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->condition = condition; + obj->stmt1 = stmt1; + obj->stmt2 = stmt2; + + return obj; +} + +labeled_stmt new_labeled_stmt(region r, location location, label label, statement stmt) +{ + labeled_stmt obj = ralloc(r, struct AST_labeled_stmt); + + obj->kind = kind_labeled_stmt; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->label = label; + obj->stmt = stmt; + + return obj; +} + +expression_stmt new_expression_stmt(region r, location location, expression arg1) +{ + expression_stmt obj = ralloc(r, struct AST_expression_stmt); + + obj->kind = kind_expression_stmt; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + + return obj; +} + +conditional_stmt new_conditional_stmt(region r, location location, expression condition, statement stmt) +{ + conditional_stmt obj = ralloc(r, struct AST_conditional_stmt); + + obj->kind = kind_conditional_stmt; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->condition = condition; + obj->stmt = stmt; + + return obj; +} + +switch_stmt new_switch_stmt(region r, location location, expression condition, statement stmt) +{ + switch_stmt obj = ralloc(r, struct AST_switch_stmt); + + obj->kind = kind_switch_stmt; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->condition = condition; + obj->stmt = stmt; + + return obj; +} + +for_stmt new_for_stmt(region r, location location, expression arg1, expression arg2, expression arg3, statement stmt) +{ + for_stmt obj = ralloc(r, struct AST_for_stmt); + + obj->kind = kind_for_stmt; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + obj->arg2 = arg2; + obj->arg3 = arg3; + obj->stmt = stmt; + + return obj; +} + +break_stmt new_break_stmt(region r, location location) +{ + break_stmt obj = ralloc(r, struct AST_break_stmt); + + obj->kind = kind_break_stmt; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + + return obj; +} + +continue_stmt new_continue_stmt(region r, location location) +{ + continue_stmt obj = ralloc(r, struct AST_continue_stmt); + + obj->kind = kind_continue_stmt; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + + return obj; +} + +return_stmt new_return_stmt(region r, location location, expression arg1) +{ + return_stmt obj = ralloc(r, struct AST_return_stmt); + + obj->kind = kind_return_stmt; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + + return obj; +} + +goto_stmt new_goto_stmt(region r, location location, id_label id_label) +{ + goto_stmt obj = ralloc(r, struct AST_goto_stmt); + + obj->kind = kind_goto_stmt; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->id_label = id_label; + + return obj; +} + +computed_goto_stmt new_computed_goto_stmt(region r, location location, expression arg1) +{ + computed_goto_stmt obj = ralloc(r, struct AST_computed_goto_stmt); + + obj->kind = kind_computed_goto_stmt; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + + return obj; +} + +empty_stmt new_empty_stmt(region r, location location) +{ + empty_stmt obj = ralloc(r, struct AST_empty_stmt); + + obj->kind = kind_empty_stmt; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + + return obj; +} + +unary new_unary(region r, location location, expression arg1) +{ + unary obj = ralloc(r, struct AST_unary); + + obj->kind = kind_unary; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + + return obj; +} + +binary new_binary(region r, location location, expression arg1, expression arg2) +{ + binary obj = ralloc(r, struct AST_binary); + + obj->kind = kind_binary; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + obj->arg2 = arg2; + + return obj; +} + +comma new_comma(region r, location location, expression arg1) +{ + comma obj = ralloc(r, struct AST_comma); + + obj->kind = kind_comma; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + + return obj; +} + +sizeof_type new_sizeof_type(region r, location location, asttype asttype) +{ + sizeof_type obj = ralloc(r, struct AST_sizeof_type); + + obj->kind = kind_sizeof_type; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->asttype = asttype; + + return obj; +} + +alignof_type new_alignof_type(region r, location location, asttype asttype) +{ + alignof_type obj = ralloc(r, struct AST_alignof_type); + + obj->kind = kind_alignof_type; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->asttype = asttype; + + return obj; +} + +label_address new_label_address(region r, location location, id_label id_label) +{ + label_address obj = ralloc(r, struct AST_label_address); + + obj->kind = kind_label_address; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->id_label = id_label; + + return obj; +} + +cast new_cast(region r, location location, expression arg1, asttype asttype) +{ + cast obj = ralloc(r, struct AST_cast); + + obj->kind = kind_cast; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + obj->asttype = asttype; + + return obj; +} + +cast_list new_cast_list(region r, location location, asttype asttype, expression init_expr) +{ + cast_list obj = ralloc(r, struct AST_cast_list); + + obj->kind = kind_cast_list; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->asttype = asttype; + obj->init_expr = init_expr; + + return obj; +} + +conditional new_conditional(region r, location location, expression condition, expression arg1, expression arg2) +{ + conditional obj = ralloc(r, struct AST_conditional); + + obj->kind = kind_conditional; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->condition = condition; + obj->arg1 = arg1; + obj->arg2 = arg2; + + return obj; +} + +identifier new_identifier(region r, location location, cstring cstring, data_declaration ddecl) +{ + identifier obj = ralloc(r, struct AST_identifier); + + obj->kind = kind_identifier; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->cstring = cstring; + obj->ddecl = ddecl; + + return obj; +} + +compound_expr new_compound_expr(region r, location location, statement stmt) +{ + compound_expr obj = ralloc(r, struct AST_compound_expr); + + obj->kind = kind_compound_expr; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->stmt = stmt; + + return obj; +} + +function_call new_function_call(region r, location location, expression arg1, expression args, asttype va_arg_call, nesc_call_kind call_kind) +{ + function_call obj = ralloc(r, struct AST_function_call); + + obj->kind = kind_function_call; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + obj->args = args; + obj->va_arg_call = va_arg_call; + obj->call_kind = call_kind; + + return obj; +} + +field_ref new_field_ref(region r, location location, expression arg1, cstring cstring) +{ + field_ref obj = ralloc(r, struct AST_field_ref); + + obj->kind = kind_field_ref; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + obj->cstring = cstring; + + return obj; +} + +increment new_increment(region r, location location, expression arg1) +{ + increment obj = ralloc(r, struct AST_increment); + + obj->kind = kind_increment; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + + return obj; +} + +comparison new_comparison(region r, location location, expression arg1, expression arg2) +{ + comparison obj = ralloc(r, struct AST_comparison); + + obj->kind = kind_comparison; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + obj->arg2 = arg2; + + return obj; +} + +assignment new_assignment(region r, location location, expression arg1, expression arg2) +{ + assignment obj = ralloc(r, struct AST_assignment); + + obj->kind = kind_assignment; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + obj->arg2 = arg2; + + return obj; +} + +init_list new_init_list(region r, location location, expression args) +{ + init_list obj = ralloc(r, struct AST_init_list); + + obj->kind = kind_init_list; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->args = args; + + return obj; +} + +init_specific new_init_specific(region r, location location, designator designator, expression init_expr) +{ + init_specific obj = ralloc(r, struct AST_init_specific); + + obj->kind = kind_init_specific; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->designator = designator; + obj->init_expr = init_expr; + + return obj; +} + +designator new_designator(region r, location location) +{ + designator obj = ralloc(r, struct AST_designator); + + obj->kind = kind_designator; + obj->location = location; + + return obj; +} + +designate_field new_designate_field(region r, location location, cstring cstring) +{ + designate_field obj = ralloc(r, struct AST_designate_field); + + obj->kind = kind_designate_field; + obj->location = location; + obj->cstring = cstring; + + return obj; +} + +designate_index new_designate_index(region r, location location, expression arg1, expression arg2) +{ + designate_index obj = ralloc(r, struct AST_designate_index); + + obj->kind = kind_designate_index; + obj->location = location; + obj->arg1 = arg1; + obj->arg2 = arg2; + + return obj; +} + +lexical_cst new_lexical_cst(region r, location location, cstring cstring) +{ + lexical_cst obj = ralloc(r, struct AST_lexical_cst); + + obj->kind = kind_lexical_cst; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->cstring = cstring; + + return obj; +} + +string_cst new_string_cst(region r, location location, cstring cstring) +{ + string_cst obj = ralloc(r, struct AST_string_cst); + + obj->kind = kind_string_cst; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->cstring = cstring; + + return obj; +} + +string new_string(region r, location location, string_cst strings, data_declaration ddecl) +{ + string obj = ralloc(r, struct AST_string); + + obj->kind = kind_string; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->strings = strings; + obj->ddecl = ddecl; + + return obj; +} + +id_label new_id_label(region r, location location, cstring cstring) +{ + id_label obj = ralloc(r, struct AST_id_label); + + obj->kind = kind_id_label; + obj->location = location; + obj->cstring = cstring; + + return obj; +} + +case_label new_case_label(region r, location location, expression arg1, expression arg2) +{ + case_label obj = ralloc(r, struct AST_case_label); + + obj->kind = kind_case_label; + obj->location = location; + obj->arg1 = arg1; + obj->arg2 = arg2; + + return obj; +} + +default_label new_default_label(region r, location location) +{ + default_label obj = ralloc(r, struct AST_default_label); + + obj->kind = kind_default_label; + obj->location = location; + + return obj; +} + +word new_word(region r, location location, cstring cstring) +{ + word obj = ralloc(r, struct AST_word); + + obj->kind = kind_word; + obj->location = location; + obj->cstring = cstring; + + return obj; +} + +asm_operand new_asm_operand(region r, location location, word word1, string string, expression arg1) +{ + asm_operand obj = ralloc(r, struct AST_asm_operand); + + obj->kind = kind_asm_operand; + obj->location = location; + obj->word1 = word1; + obj->string = string; + obj->arg1 = arg1; + + return obj; +} + +nesc_decl new_nesc_decl(region r, location location, word word1, attribute attributes) +{ + nesc_decl obj = ralloc(r, struct AST_nesc_decl); + + obj->kind = kind_nesc_decl; + obj->location = location; + obj->word1 = word1; + obj->attributes = attributes; + + return obj; +} + +interface new_interface(region r, location location, word word1, attribute attributes, declaration decls) +{ + interface obj = ralloc(r, struct AST_interface); + + obj->kind = kind_interface; + obj->location = location; + obj->word1 = word1; + obj->attributes = attributes; + obj->decls = decls; + + return obj; +} + +component new_component(region r, location location, word word1, attribute attributes, bool abstract, declaration parms, declaration decls, implementation implementation) +{ + component obj = ralloc(r, struct AST_component); + + obj->kind = kind_component; + obj->location = location; + obj->word1 = word1; + obj->attributes = attributes; + obj->abstract = abstract; + obj->parms = parms; + obj->decls = decls; + obj->implementation = implementation; + + return obj; +} + +implementation new_implementation(region r, location location, environment ienv) +{ + implementation obj = ralloc(r, struct AST_implementation); + + obj->kind = kind_implementation; + obj->location = location; + obj->ienv = ienv; + + return obj; +} + +configuration new_configuration(region r, location location, environment ienv, declaration decls) +{ + configuration obj = ralloc(r, struct AST_configuration); + + obj->kind = kind_configuration; + obj->location = location; + obj->ienv = ienv; + obj->decls = decls; + + return obj; +} + +module new_module(region r, location location, environment ienv, declaration decls) +{ + module obj = ralloc(r, struct AST_module); + + obj->kind = kind_module; + obj->location = location; + obj->ienv = ienv; + obj->decls = decls; + + return obj; +} + +binary_component new_binary_component(region r, location location, environment ienv) +{ + binary_component obj = ralloc(r, struct AST_binary_component); + + obj->kind = kind_binary_component; + obj->location = location; + obj->ienv = ienv; + + return obj; +} + +rp_interface new_rp_interface(region r, location location, bool required, declaration decls) +{ + rp_interface obj = ralloc(r, struct AST_rp_interface); + + obj->kind = kind_rp_interface; + obj->location = location; + obj->required = required; + obj->decls = decls; + + return obj; +} + +interface_ref new_interface_ref(region r, location location, word word1, expression args, word word2, declaration gparms, attribute attributes, data_declaration ddecl) +{ + interface_ref obj = ralloc(r, struct AST_interface_ref); + + obj->kind = kind_interface_ref; + obj->location = location; + obj->word1 = word1; + obj->args = args; + obj->word2 = word2; + obj->gparms = gparms; + obj->attributes = attributes; + obj->ddecl = ddecl; + + return obj; +} + +component_ref new_component_ref(region r, location location, word word1, word word2, bool abstract, expression args) +{ + component_ref obj = ralloc(r, struct AST_component_ref); + + obj->kind = kind_component_ref; + obj->location = location; + obj->word1 = word1; + obj->word2 = word2; + obj->abstract = abstract; + obj->args = args; + + return obj; +} + +connection new_connection(region r, location location, endpoint ep1, endpoint ep2) +{ + connection obj = ralloc(r, struct AST_connection); + + obj->kind = kind_connection; + obj->location = location; + obj->ep1 = ep1; + obj->ep2 = ep2; + + return obj; +} + +endpoint new_endpoint(region r, location location, parameterised_identifier ids) +{ + endpoint obj = ralloc(r, struct AST_endpoint); + + obj->kind = kind_endpoint; + obj->location = location; + obj->ids = ids; + + return obj; +} + +parameterised_identifier new_parameterised_identifier(region r, location location, word word1, expression args) +{ + parameterised_identifier obj = ralloc(r, struct AST_parameterised_identifier); + + obj->kind = kind_parameterised_identifier; + obj->location = location; + obj->word1 = word1; + obj->args = args; + + return obj; +} + +generic_declarator new_generic_declarator(region r, location location, declarator declarator, declaration parms) +{ + generic_declarator obj = ralloc(r, struct AST_generic_declarator); + + obj->kind = kind_generic_declarator; + obj->location = location; + obj->declarator = declarator; + obj->parms = parms; + + return obj; +} + +generic_call new_generic_call(region r, location location, expression arg1, expression args) +{ + generic_call obj = ralloc(r, struct AST_generic_call); + + obj->kind = kind_generic_call; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + obj->args = args; + + return obj; +} + +interface_ref_declarator new_interface_ref_declarator(region r, location location, declarator declarator, word word1) +{ + interface_ref_declarator obj = ralloc(r, struct AST_interface_ref_declarator); + + obj->kind = kind_interface_ref_declarator; + obj->location = location; + obj->declarator = declarator; + obj->word1 = word1; + + return obj; +} + +interface_deref new_interface_deref(region r, location location, expression arg1, cstring cstring, data_declaration ddecl) +{ + interface_deref obj = ralloc(r, struct AST_interface_deref); + + obj->kind = kind_interface_deref; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + obj->cstring = cstring; + obj->ddecl = ddecl; + + return obj; +} + +component_deref new_component_deref(region r, location location, expression arg1, cstring cstring, data_declaration ddecl) +{ + component_deref obj = ralloc(r, struct AST_component_deref); + + obj->kind = kind_component_deref; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + obj->cstring = cstring; + obj->ddecl = ddecl; + + return obj; +} + +component_typeref new_component_typeref(region r, location location, data_declaration ddecl, cstring cstring) +{ + component_typeref obj = ralloc(r, struct AST_component_typeref); + + obj->kind = kind_component_typeref; + obj->location = location; + obj->ddecl = ddecl; + obj->cstring = cstring; + + return obj; +} + +atomic_stmt new_atomic_stmt(region r, location location, statement stmt) +{ + atomic_stmt obj = ralloc(r, struct AST_atomic_stmt); + + obj->kind = kind_atomic_stmt; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->stmt = stmt; + + return obj; +} + +nesc_attribute new_nesc_attribute(region r, location location, word word1, expression arg1) +{ + nesc_attribute obj = ralloc(r, struct AST_nesc_attribute); + + obj->kind = kind_nesc_attribute; + obj->location = location; + obj->word1 = word1; + obj->arg1 = arg1; + + return obj; +} + +type_parm_decl new_type_parm_decl(region r, location location, cstring cstring, data_declaration ddecl) +{ + type_parm_decl obj = ralloc(r, struct AST_type_parm_decl); + + obj->kind = kind_type_parm_decl; + obj->location = location; + obj->cstring = cstring; + obj->ddecl = ddecl; + + return obj; +} + +type_argument new_type_argument(region r, location location, asttype asttype) +{ + type_argument obj = ralloc(r, struct AST_type_argument); + + obj->kind = kind_type_argument; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->asttype = asttype; + + return obj; +} + +error_decl new_error_decl(region r, location location) +{ + error_decl obj = ralloc(r, struct AST_declaration); + + obj->kind = kind_error_decl; + obj->location = location; + + return obj; +} + +attribute_ref new_attribute_ref(region r, location location, word word1, attribute attributes, declaration fields, bool defined) +{ + attribute_ref obj = ralloc(r, struct AST_tag_ref); + + obj->kind = kind_attribute_ref; + obj->location = location; + obj->word1 = word1; + obj->attributes = attributes; + obj->fields = fields; + obj->defined = defined; + + return obj; +} + +enum_ref new_enum_ref(region r, location location, word word1, attribute attributes, declaration fields, bool defined) +{ + enum_ref obj = ralloc(r, struct AST_tag_ref); + + obj->kind = kind_enum_ref; + obj->location = location; + obj->word1 = word1; + obj->attributes = attributes; + obj->fields = fields; + obj->defined = defined; + + return obj; +} + +error_stmt new_error_stmt(region r, location location) +{ + error_stmt obj = ralloc(r, struct AST_statement); + + obj->kind = kind_error_stmt; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + + return obj; +} + +while_stmt new_while_stmt(region r, location location, expression condition, statement stmt) +{ + while_stmt obj = ralloc(r, struct AST_conditional_stmt); + + obj->kind = kind_while_stmt; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->condition = condition; + obj->stmt = stmt; + + return obj; +} + +dowhile_stmt new_dowhile_stmt(region r, location location, expression condition, statement stmt) +{ + dowhile_stmt obj = ralloc(r, struct AST_conditional_stmt); + + obj->kind = kind_dowhile_stmt; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->condition = condition; + obj->stmt = stmt; + + return obj; +} + +error_expr new_error_expr(region r, location location) +{ + error_expr obj = ralloc(r, struct AST_expression); + + obj->kind = kind_error_expr; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + + return obj; +} + +array_ref new_array_ref(region r, location location, expression arg1, expression arg2) +{ + array_ref obj = ralloc(r, struct AST_binary); + + obj->kind = kind_array_ref; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + obj->arg2 = arg2; + + return obj; +} + +dereference new_dereference(region r, location location, expression arg1) +{ + dereference obj = ralloc(r, struct AST_unary); + + obj->kind = kind_dereference; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + + return obj; +} + +extension_expr new_extension_expr(region r, location location, expression arg1) +{ + extension_expr obj = ralloc(r, struct AST_unary); + + obj->kind = kind_extension_expr; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + + return obj; +} + +sizeof_expr new_sizeof_expr(region r, location location, expression arg1) +{ + sizeof_expr obj = ralloc(r, struct AST_unary); + + obj->kind = kind_sizeof_expr; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + + return obj; +} + +alignof_expr new_alignof_expr(region r, location location, expression arg1) +{ + alignof_expr obj = ralloc(r, struct AST_unary); + + obj->kind = kind_alignof_expr; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + + return obj; +} + +realpart new_realpart(region r, location location, expression arg1) +{ + realpart obj = ralloc(r, struct AST_unary); + + obj->kind = kind_realpart; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + + return obj; +} + +imagpart new_imagpart(region r, location location, expression arg1) +{ + imagpart obj = ralloc(r, struct AST_unary); + + obj->kind = kind_imagpart; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + + return obj; +} + +address_of new_address_of(region r, location location, expression arg1) +{ + address_of obj = ralloc(r, struct AST_unary); + + obj->kind = kind_address_of; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + + return obj; +} + +unary_minus new_unary_minus(region r, location location, expression arg1) +{ + unary_minus obj = ralloc(r, struct AST_unary); + + obj->kind = kind_unary_minus; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + + return obj; +} + +unary_plus new_unary_plus(region r, location location, expression arg1) +{ + unary_plus obj = ralloc(r, struct AST_unary); + + obj->kind = kind_unary_plus; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + + return obj; +} + +conjugate new_conjugate(region r, location location, expression arg1) +{ + conjugate obj = ralloc(r, struct AST_unary); + + obj->kind = kind_conjugate; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + + return obj; +} + +bitnot new_bitnot(region r, location location, expression arg1) +{ + bitnot obj = ralloc(r, struct AST_unary); + + obj->kind = kind_bitnot; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + + return obj; +} + +not new_not(region r, location location, expression arg1) +{ + not obj = ralloc(r, struct AST_unary); + + obj->kind = kind_not; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + + return obj; +} + +preincrement new_preincrement(region r, location location, expression arg1) +{ + preincrement obj = ralloc(r, struct AST_increment); + + obj->kind = kind_preincrement; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + + return obj; +} + +predecrement new_predecrement(region r, location location, expression arg1) +{ + predecrement obj = ralloc(r, struct AST_increment); + + obj->kind = kind_predecrement; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + + return obj; +} + +postincrement new_postincrement(region r, location location, expression arg1) +{ + postincrement obj = ralloc(r, struct AST_increment); + + obj->kind = kind_postincrement; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + + return obj; +} + +postdecrement new_postdecrement(region r, location location, expression arg1) +{ + postdecrement obj = ralloc(r, struct AST_increment); + + obj->kind = kind_postdecrement; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + + return obj; +} + +plus new_plus(region r, location location, expression arg1, expression arg2) +{ + plus obj = ralloc(r, struct AST_binary); + + obj->kind = kind_plus; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + obj->arg2 = arg2; + + return obj; +} + +minus new_minus(region r, location location, expression arg1, expression arg2) +{ + minus obj = ralloc(r, struct AST_binary); + + obj->kind = kind_minus; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + obj->arg2 = arg2; + + return obj; +} + +times new_times(region r, location location, expression arg1, expression arg2) +{ + times obj = ralloc(r, struct AST_binary); + + obj->kind = kind_times; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + obj->arg2 = arg2; + + return obj; +} + +divide new_divide(region r, location location, expression arg1, expression arg2) +{ + divide obj = ralloc(r, struct AST_binary); + + obj->kind = kind_divide; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + obj->arg2 = arg2; + + return obj; +} + +modulo new_modulo(region r, location location, expression arg1, expression arg2) +{ + modulo obj = ralloc(r, struct AST_binary); + + obj->kind = kind_modulo; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + obj->arg2 = arg2; + + return obj; +} + +lshift new_lshift(region r, location location, expression arg1, expression arg2) +{ + lshift obj = ralloc(r, struct AST_binary); + + obj->kind = kind_lshift; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + obj->arg2 = arg2; + + return obj; +} + +rshift new_rshift(region r, location location, expression arg1, expression arg2) +{ + rshift obj = ralloc(r, struct AST_binary); + + obj->kind = kind_rshift; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + obj->arg2 = arg2; + + return obj; +} + +leq new_leq(region r, location location, expression arg1, expression arg2) +{ + leq obj = ralloc(r, struct AST_comparison); + + obj->kind = kind_leq; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + obj->arg2 = arg2; + + return obj; +} + +geq new_geq(region r, location location, expression arg1, expression arg2) +{ + geq obj = ralloc(r, struct AST_comparison); + + obj->kind = kind_geq; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + obj->arg2 = arg2; + + return obj; +} + +lt new_lt(region r, location location, expression arg1, expression arg2) +{ + lt obj = ralloc(r, struct AST_comparison); + + obj->kind = kind_lt; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + obj->arg2 = arg2; + + return obj; +} + +gt new_gt(region r, location location, expression arg1, expression arg2) +{ + gt obj = ralloc(r, struct AST_comparison); + + obj->kind = kind_gt; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + obj->arg2 = arg2; + + return obj; +} + +eq new_eq(region r, location location, expression arg1, expression arg2) +{ + eq obj = ralloc(r, struct AST_comparison); + + obj->kind = kind_eq; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + obj->arg2 = arg2; + + return obj; +} + +ne new_ne(region r, location location, expression arg1, expression arg2) +{ + ne obj = ralloc(r, struct AST_comparison); + + obj->kind = kind_ne; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + obj->arg2 = arg2; + + return obj; +} + +bitand new_bitand(region r, location location, expression arg1, expression arg2) +{ + bitand obj = ralloc(r, struct AST_binary); + + obj->kind = kind_bitand; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + obj->arg2 = arg2; + + return obj; +} + +bitor new_bitor(region r, location location, expression arg1, expression arg2) +{ + bitor obj = ralloc(r, struct AST_binary); + + obj->kind = kind_bitor; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + obj->arg2 = arg2; + + return obj; +} + +bitxor new_bitxor(region r, location location, expression arg1, expression arg2) +{ + bitxor obj = ralloc(r, struct AST_binary); + + obj->kind = kind_bitxor; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + obj->arg2 = arg2; + + return obj; +} + +andand new_andand(region r, location location, expression arg1, expression arg2) +{ + andand obj = ralloc(r, struct AST_binary); + + obj->kind = kind_andand; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + obj->arg2 = arg2; + + return obj; +} + +oror new_oror(region r, location location, expression arg1, expression arg2) +{ + oror obj = ralloc(r, struct AST_binary); + + obj->kind = kind_oror; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + obj->arg2 = arg2; + + return obj; +} + +assign new_assign(region r, location location, expression arg1, expression arg2) +{ + assign obj = ralloc(r, struct AST_assignment); + + obj->kind = kind_assign; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + obj->arg2 = arg2; + + return obj; +} + +plus_assign new_plus_assign(region r, location location, expression arg1, expression arg2) +{ + plus_assign obj = ralloc(r, struct AST_assignment); + + obj->kind = kind_plus_assign; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + obj->arg2 = arg2; + + return obj; +} + +minus_assign new_minus_assign(region r, location location, expression arg1, expression arg2) +{ + minus_assign obj = ralloc(r, struct AST_assignment); + + obj->kind = kind_minus_assign; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + obj->arg2 = arg2; + + return obj; +} + +times_assign new_times_assign(region r, location location, expression arg1, expression arg2) +{ + times_assign obj = ralloc(r, struct AST_assignment); + + obj->kind = kind_times_assign; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + obj->arg2 = arg2; + + return obj; +} + +divide_assign new_divide_assign(region r, location location, expression arg1, expression arg2) +{ + divide_assign obj = ralloc(r, struct AST_assignment); + + obj->kind = kind_divide_assign; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + obj->arg2 = arg2; + + return obj; +} + +modulo_assign new_modulo_assign(region r, location location, expression arg1, expression arg2) +{ + modulo_assign obj = ralloc(r, struct AST_assignment); + + obj->kind = kind_modulo_assign; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + obj->arg2 = arg2; + + return obj; +} + +lshift_assign new_lshift_assign(region r, location location, expression arg1, expression arg2) +{ + lshift_assign obj = ralloc(r, struct AST_assignment); + + obj->kind = kind_lshift_assign; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + obj->arg2 = arg2; + + return obj; +} + +rshift_assign new_rshift_assign(region r, location location, expression arg1, expression arg2) +{ + rshift_assign obj = ralloc(r, struct AST_assignment); + + obj->kind = kind_rshift_assign; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + obj->arg2 = arg2; + + return obj; +} + +bitand_assign new_bitand_assign(region r, location location, expression arg1, expression arg2) +{ + bitand_assign obj = ralloc(r, struct AST_assignment); + + obj->kind = kind_bitand_assign; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + obj->arg2 = arg2; + + return obj; +} + +bitor_assign new_bitor_assign(region r, location location, expression arg1, expression arg2) +{ + bitor_assign obj = ralloc(r, struct AST_assignment); + + obj->kind = kind_bitor_assign; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + obj->arg2 = arg2; + + return obj; +} + +bitxor_assign new_bitxor_assign(region r, location location, expression arg1, expression arg2) +{ + bitxor_assign obj = ralloc(r, struct AST_assignment); + + obj->kind = kind_bitxor_assign; + obj->location = location; + obj->isatomic = NOT_ATOMIC; + obj->arg1 = arg1; + obj->arg2 = arg2; + + return obj; +} + +rp_connection new_rp_connection(region r, location location, endpoint ep1, endpoint ep2) +{ + rp_connection obj = ralloc(r, struct AST_connection); + + obj->kind = kind_rp_connection; + obj->location = location; + obj->ep1 = ep1; + obj->ep2 = ep2; + + return obj; +} + +eq_connection new_eq_connection(region r, location location, endpoint ep1, endpoint ep2) +{ + eq_connection obj = ralloc(r, struct AST_connection); + + obj->kind = kind_eq_connection; + obj->location = location; + obj->ep1 = ep1; + obj->ep2 = ep2; + + return obj; +} + +nx_struct_ref new_nx_struct_ref(region r, location location, word word1, attribute attributes, declaration fields, bool defined) +{ + nx_struct_ref obj = ralloc(r, struct AST_struct_ref); + + obj->kind = kind_nx_struct_ref; + obj->location = location; + obj->word1 = word1; + obj->attributes = attributes; + obj->fields = fields; + obj->defined = defined; + + return obj; +} + +nx_union_ref new_nx_union_ref(region r, location location, word word1, attribute attributes, declaration fields, bool defined) +{ + nx_union_ref obj = ralloc(r, struct AST_union_ref); + + obj->kind = kind_nx_union_ref; + obj->location = location; + obj->word1 = word1; + obj->attributes = attributes; + obj->fields = fields; + obj->defined = defined; + + return obj; +} + + + +AST_kind AST_parent_kind[] = { + 0, + kind_node, + kind_declaration, + kind_declaration, + kind_declaration, + kind_declaration, + kind_declaration, + kind_declaration, + kind_declaration, + kind_declaration, + kind_declaration, + kind_declaration, + kind_declaration, + kind_nesc_decl, + kind_nesc_decl, + kind_declaration, + kind_declaration, + kind_declaration, + kind_declaration, + kind_connection, + kind_connection, + kind_declaration, + kind_declaration, + kind_node, + kind_statement, + kind_statement, + kind_statement, + kind_statement, + kind_statement, + kind_statement, + kind_conditional_stmt, + kind_conditional_stmt, + kind_conditional_stmt, + kind_statement, + kind_statement, + kind_statement, + kind_statement, + kind_statement, + kind_statement, + kind_statement, + kind_statement, + kind_statement, + kind_node, + kind_expression, + kind_unary, + kind_unary, + kind_unary, + kind_increment, + kind_increment, + kind_increment, + kind_increment, + kind_unary, + kind_unary, + kind_unary, + kind_unary, + kind_unary, + kind_unary, + kind_unary, + kind_unary, + kind_unary, + kind_unary, + kind_unary, + kind_unary, + kind_unary, + kind_unary, + kind_expression, + kind_binary, + kind_comparison, + kind_comparison, + kind_comparison, + kind_comparison, + kind_comparison, + kind_comparison, + kind_binary, + kind_assignment, + kind_assignment, + kind_assignment, + kind_assignment, + kind_assignment, + kind_assignment, + kind_assignment, + kind_assignment, + kind_assignment, + kind_assignment, + kind_assignment, + kind_binary, + kind_binary, + kind_binary, + kind_binary, + kind_binary, + kind_binary, + kind_binary, + kind_binary, + kind_binary, + kind_binary, + kind_binary, + kind_binary, + kind_binary, + kind_expression, + kind_expression, + kind_expression, + kind_expression, + kind_expression, + kind_expression, + kind_expression, + kind_expression, + kind_expression, + kind_expression, + kind_expression, + kind_expression, + kind_lexical_cst, + kind_expression, + kind_expression, + kind_expression, + kind_expression, + kind_node, + kind_type_element, + kind_typename, + kind_type_element, + kind_type_element, + kind_type_element, + kind_attribute, + kind_attribute, + kind_type_element, + kind_type_element, + kind_type_element, + kind_tag_ref, + kind_struct_ref, + kind_tag_ref, + kind_union_ref, + kind_tag_ref, + kind_tag_ref, + kind_node, + kind_declarator, + kind_nested_declarator, + kind_nested_declarator, + kind_nested_declarator, + kind_nested_declarator, + kind_nested_declarator, + kind_declarator, + kind_declarator, + kind_node, + kind_label, + kind_label, + kind_label, + kind_node, + kind_node, + kind_designator, + kind_designator, + kind_node, + kind_node, + kind_node, + kind_implementation, + kind_implementation, + kind_implementation, + kind_node, + kind_node, +}; + +AST_kind AST_post_kind[] = { + postkind_node, + postkind_declaration, + postkind_asm_decl, + postkind_data_decl, + postkind_extension_decl, + postkind_ellipsis_decl, + postkind_enumerator, + postkind_oldidentifier_decl, + postkind_function_decl, + postkind_implicit_decl, + postkind_variable_decl, + postkind_field_decl, + postkind_nesc_decl, + postkind_interface, + postkind_component, + postkind_rp_interface, + postkind_interface_ref, + postkind_component_ref, + postkind_connection, + postkind_rp_connection, + postkind_eq_connection, + postkind_type_parm_decl, + postkind_error_decl, + postkind_statement, + postkind_asm_stmt, + postkind_compound_stmt, + postkind_if_stmt, + postkind_labeled_stmt, + postkind_expression_stmt, + postkind_conditional_stmt, + postkind_switch_stmt, + postkind_while_stmt, + postkind_dowhile_stmt, + postkind_for_stmt, + postkind_break_stmt, + postkind_continue_stmt, + postkind_return_stmt, + postkind_goto_stmt, + postkind_computed_goto_stmt, + postkind_empty_stmt, + postkind_atomic_stmt, + postkind_error_stmt, + postkind_expression, + postkind_unary, + postkind_cast, + postkind_field_ref, + postkind_increment, + postkind_preincrement, + postkind_predecrement, + postkind_postincrement, + postkind_postdecrement, + postkind_interface_deref, + postkind_component_deref, + postkind_dereference, + postkind_extension_expr, + postkind_sizeof_expr, + postkind_alignof_expr, + postkind_realpart, + postkind_imagpart, + postkind_address_of, + postkind_unary_minus, + postkind_unary_plus, + postkind_conjugate, + postkind_bitnot, + postkind_not, + postkind_binary, + postkind_comparison, + postkind_leq, + postkind_geq, + postkind_lt, + postkind_gt, + postkind_eq, + postkind_ne, + postkind_assignment, + postkind_assign, + postkind_plus_assign, + postkind_minus_assign, + postkind_times_assign, + postkind_divide_assign, + postkind_modulo_assign, + postkind_lshift_assign, + postkind_rshift_assign, + postkind_bitand_assign, + postkind_bitor_assign, + postkind_bitxor_assign, + postkind_array_ref, + postkind_plus, + postkind_minus, + postkind_times, + postkind_divide, + postkind_modulo, + postkind_lshift, + postkind_rshift, + postkind_bitand, + postkind_bitor, + postkind_bitxor, + postkind_andand, + postkind_oror, + postkind_comma, + postkind_sizeof_type, + postkind_alignof_type, + postkind_label_address, + postkind_cast_list, + postkind_conditional, + postkind_identifier, + postkind_compound_expr, + postkind_function_call, + postkind_init_list, + postkind_init_specific, + postkind_lexical_cst, + postkind_string_cst, + postkind_string, + postkind_generic_call, + postkind_type_argument, + postkind_error_expr, + postkind_type_element, + postkind_typename, + postkind_component_typeref, + postkind_typeof_expr, + postkind_typeof_type, + postkind_attribute, + postkind_gcc_attribute, + postkind_nesc_attribute, + postkind_rid, + postkind_qualifier, + postkind_tag_ref, + postkind_struct_ref, + postkind_nx_struct_ref, + postkind_union_ref, + postkind_nx_union_ref, + postkind_attribute_ref, + postkind_enum_ref, + postkind_declarator, + postkind_nested_declarator, + postkind_function_declarator, + postkind_pointer_declarator, + postkind_qualified_declarator, + postkind_array_declarator, + postkind_interface_ref_declarator, + postkind_identifier_declarator, + postkind_generic_declarator, + postkind_label, + postkind_id_label, + postkind_case_label, + postkind_default_label, + postkind_asttype, + postkind_designator, + postkind_designate_field, + postkind_designate_index, + postkind_word, + postkind_asm_operand, + postkind_implementation, + postkind_configuration, + postkind_module, + postkind_binary_component, + postkind_endpoint, + postkind_parameterised_identifier, +}; + +size_t AST_sizeof[] = { + sizeof(struct AST_node), + sizeof(struct AST_declaration), + sizeof(struct AST_asm_decl), + sizeof(struct AST_data_decl), + sizeof(struct AST_extension_decl), + sizeof(struct AST_ellipsis_decl), + sizeof(struct AST_enumerator), + sizeof(struct AST_oldidentifier_decl), + sizeof(struct AST_function_decl), + sizeof(struct AST_implicit_decl), + sizeof(struct AST_variable_decl), + sizeof(struct AST_field_decl), + sizeof(struct AST_nesc_decl), + sizeof(struct AST_interface), + sizeof(struct AST_component), + sizeof(struct AST_rp_interface), + sizeof(struct AST_interface_ref), + sizeof(struct AST_component_ref), + sizeof(struct AST_connection), + sizeof(struct AST_connection), + sizeof(struct AST_connection), + sizeof(struct AST_type_parm_decl), + sizeof(struct AST_declaration), + sizeof(struct AST_statement), + sizeof(struct AST_asm_stmt), + sizeof(struct AST_compound_stmt), + sizeof(struct AST_if_stmt), + sizeof(struct AST_labeled_stmt), + sizeof(struct AST_expression_stmt), + sizeof(struct AST_conditional_stmt), + sizeof(struct AST_switch_stmt), + sizeof(struct AST_conditional_stmt), + sizeof(struct AST_conditional_stmt), + sizeof(struct AST_for_stmt), + sizeof(struct AST_break_stmt), + sizeof(struct AST_continue_stmt), + sizeof(struct AST_return_stmt), + sizeof(struct AST_goto_stmt), + sizeof(struct AST_computed_goto_stmt), + sizeof(struct AST_empty_stmt), + sizeof(struct AST_atomic_stmt), + sizeof(struct AST_statement), + sizeof(struct AST_expression), + sizeof(struct AST_unary), + sizeof(struct AST_cast), + sizeof(struct AST_field_ref), + sizeof(struct AST_increment), + sizeof(struct AST_increment), + sizeof(struct AST_increment), + sizeof(struct AST_increment), + sizeof(struct AST_increment), + sizeof(struct AST_interface_deref), + sizeof(struct AST_component_deref), + sizeof(struct AST_unary), + sizeof(struct AST_unary), + sizeof(struct AST_unary), + sizeof(struct AST_unary), + sizeof(struct AST_unary), + sizeof(struct AST_unary), + sizeof(struct AST_unary), + sizeof(struct AST_unary), + sizeof(struct AST_unary), + sizeof(struct AST_unary), + sizeof(struct AST_unary), + sizeof(struct AST_unary), + sizeof(struct AST_binary), + sizeof(struct AST_comparison), + sizeof(struct AST_comparison), + sizeof(struct AST_comparison), + sizeof(struct AST_comparison), + sizeof(struct AST_comparison), + sizeof(struct AST_comparison), + sizeof(struct AST_comparison), + sizeof(struct AST_assignment), + sizeof(struct AST_assignment), + sizeof(struct AST_assignment), + sizeof(struct AST_assignment), + sizeof(struct AST_assignment), + sizeof(struct AST_assignment), + sizeof(struct AST_assignment), + sizeof(struct AST_assignment), + sizeof(struct AST_assignment), + sizeof(struct AST_assignment), + sizeof(struct AST_assignment), + sizeof(struct AST_assignment), + sizeof(struct AST_binary), + sizeof(struct AST_binary), + sizeof(struct AST_binary), + sizeof(struct AST_binary), + sizeof(struct AST_binary), + sizeof(struct AST_binary), + sizeof(struct AST_binary), + sizeof(struct AST_binary), + sizeof(struct AST_binary), + sizeof(struct AST_binary), + sizeof(struct AST_binary), + sizeof(struct AST_binary), + sizeof(struct AST_binary), + sizeof(struct AST_comma), + sizeof(struct AST_sizeof_type), + sizeof(struct AST_alignof_type), + sizeof(struct AST_label_address), + sizeof(struct AST_cast_list), + sizeof(struct AST_conditional), + sizeof(struct AST_identifier), + sizeof(struct AST_compound_expr), + sizeof(struct AST_function_call), + sizeof(struct AST_init_list), + sizeof(struct AST_init_specific), + sizeof(struct AST_lexical_cst), + sizeof(struct AST_string_cst), + sizeof(struct AST_string), + sizeof(struct AST_generic_call), + sizeof(struct AST_type_argument), + sizeof(struct AST_expression), + sizeof(struct AST_type_element), + sizeof(struct AST_typename), + sizeof(struct AST_component_typeref), + sizeof(struct AST_typeof_expr), + sizeof(struct AST_typeof_type), + sizeof(struct AST_attribute), + sizeof(struct AST_gcc_attribute), + sizeof(struct AST_nesc_attribute), + sizeof(struct AST_rid), + sizeof(struct AST_qualifier), + sizeof(struct AST_tag_ref), + sizeof(struct AST_struct_ref), + sizeof(struct AST_struct_ref), + sizeof(struct AST_union_ref), + sizeof(struct AST_union_ref), + sizeof(struct AST_tag_ref), + sizeof(struct AST_tag_ref), + sizeof(struct AST_declarator), + sizeof(struct AST_nested_declarator), + sizeof(struct AST_function_declarator), + sizeof(struct AST_pointer_declarator), + sizeof(struct AST_qualified_declarator), + sizeof(struct AST_array_declarator), + sizeof(struct AST_interface_ref_declarator), + sizeof(struct AST_identifier_declarator), + sizeof(struct AST_generic_declarator), + sizeof(struct AST_label), + sizeof(struct AST_id_label), + sizeof(struct AST_case_label), + sizeof(struct AST_default_label), + sizeof(struct AST_asttype), + sizeof(struct AST_designator), + sizeof(struct AST_designate_field), + sizeof(struct AST_designate_index), + sizeof(struct AST_word), + sizeof(struct AST_asm_operand), + sizeof(struct AST_implementation), + sizeof(struct AST_configuration), + sizeof(struct AST_module), + sizeof(struct AST_binary_component), + sizeof(struct AST_endpoint), + sizeof(struct AST_parameterised_identifier), +}; + +type_t AST_typeof[] = { + rctypeof(struct AST_node), + rctypeof(struct AST_declaration), + rctypeof(struct AST_asm_decl), + rctypeof(struct AST_data_decl), + rctypeof(struct AST_extension_decl), + rctypeof(struct AST_ellipsis_decl), + rctypeof(struct AST_enumerator), + rctypeof(struct AST_oldidentifier_decl), + rctypeof(struct AST_function_decl), + rctypeof(struct AST_implicit_decl), + rctypeof(struct AST_variable_decl), + rctypeof(struct AST_field_decl), + rctypeof(struct AST_nesc_decl), + rctypeof(struct AST_interface), + rctypeof(struct AST_component), + rctypeof(struct AST_rp_interface), + rctypeof(struct AST_interface_ref), + rctypeof(struct AST_component_ref), + rctypeof(struct AST_connection), + rctypeof(struct AST_connection), + rctypeof(struct AST_connection), + rctypeof(struct AST_type_parm_decl), + rctypeof(struct AST_declaration), + rctypeof(struct AST_statement), + rctypeof(struct AST_asm_stmt), + rctypeof(struct AST_compound_stmt), + rctypeof(struct AST_if_stmt), + rctypeof(struct AST_labeled_stmt), + rctypeof(struct AST_expression_stmt), + rctypeof(struct AST_conditional_stmt), + rctypeof(struct AST_switch_stmt), + rctypeof(struct AST_conditional_stmt), + rctypeof(struct AST_conditional_stmt), + rctypeof(struct AST_for_stmt), + rctypeof(struct AST_break_stmt), + rctypeof(struct AST_continue_stmt), + rctypeof(struct AST_return_stmt), + rctypeof(struct AST_goto_stmt), + rctypeof(struct AST_computed_goto_stmt), + rctypeof(struct AST_empty_stmt), + rctypeof(struct AST_atomic_stmt), + rctypeof(struct AST_statement), + rctypeof(struct AST_expression), + rctypeof(struct AST_unary), + rctypeof(struct AST_cast), + rctypeof(struct AST_field_ref), + rctypeof(struct AST_increment), + rctypeof(struct AST_increment), + rctypeof(struct AST_increment), + rctypeof(struct AST_increment), + rctypeof(struct AST_increment), + rctypeof(struct AST_interface_deref), + rctypeof(struct AST_component_deref), + rctypeof(struct AST_unary), + rctypeof(struct AST_unary), + rctypeof(struct AST_unary), + rctypeof(struct AST_unary), + rctypeof(struct AST_unary), + rctypeof(struct AST_unary), + rctypeof(struct AST_unary), + rctypeof(struct AST_unary), + rctypeof(struct AST_unary), + rctypeof(struct AST_unary), + rctypeof(struct AST_unary), + rctypeof(struct AST_unary), + rctypeof(struct AST_binary), + rctypeof(struct AST_comparison), + rctypeof(struct AST_comparison), + rctypeof(struct AST_comparison), + rctypeof(struct AST_comparison), + rctypeof(struct AST_comparison), + rctypeof(struct AST_comparison), + rctypeof(struct AST_comparison), + rctypeof(struct AST_assignment), + rctypeof(struct AST_assignment), + rctypeof(struct AST_assignment), + rctypeof(struct AST_assignment), + rctypeof(struct AST_assignment), + rctypeof(struct AST_assignment), + rctypeof(struct AST_assignment), + rctypeof(struct AST_assignment), + rctypeof(struct AST_assignment), + rctypeof(struct AST_assignment), + rctypeof(struct AST_assignment), + rctypeof(struct AST_assignment), + rctypeof(struct AST_binary), + rctypeof(struct AST_binary), + rctypeof(struct AST_binary), + rctypeof(struct AST_binary), + rctypeof(struct AST_binary), + rctypeof(struct AST_binary), + rctypeof(struct AST_binary), + rctypeof(struct AST_binary), + rctypeof(struct AST_binary), + rctypeof(struct AST_binary), + rctypeof(struct AST_binary), + rctypeof(struct AST_binary), + rctypeof(struct AST_binary), + rctypeof(struct AST_comma), + rctypeof(struct AST_sizeof_type), + rctypeof(struct AST_alignof_type), + rctypeof(struct AST_label_address), + rctypeof(struct AST_cast_list), + rctypeof(struct AST_conditional), + rctypeof(struct AST_identifier), + rctypeof(struct AST_compound_expr), + rctypeof(struct AST_function_call), + rctypeof(struct AST_init_list), + rctypeof(struct AST_init_specific), + rctypeof(struct AST_lexical_cst), + rctypeof(struct AST_string_cst), + rctypeof(struct AST_string), + rctypeof(struct AST_generic_call), + rctypeof(struct AST_type_argument), + rctypeof(struct AST_expression), + rctypeof(struct AST_type_element), + rctypeof(struct AST_typename), + rctypeof(struct AST_component_typeref), + rctypeof(struct AST_typeof_expr), + rctypeof(struct AST_typeof_type), + rctypeof(struct AST_attribute), + rctypeof(struct AST_gcc_attribute), + rctypeof(struct AST_nesc_attribute), + rctypeof(struct AST_rid), + rctypeof(struct AST_qualifier), + rctypeof(struct AST_tag_ref), + rctypeof(struct AST_struct_ref), + rctypeof(struct AST_struct_ref), + rctypeof(struct AST_union_ref), + rctypeof(struct AST_union_ref), + rctypeof(struct AST_tag_ref), + rctypeof(struct AST_tag_ref), + rctypeof(struct AST_declarator), + rctypeof(struct AST_nested_declarator), + rctypeof(struct AST_function_declarator), + rctypeof(struct AST_pointer_declarator), + rctypeof(struct AST_qualified_declarator), + rctypeof(struct AST_array_declarator), + rctypeof(struct AST_interface_ref_declarator), + rctypeof(struct AST_identifier_declarator), + rctypeof(struct AST_generic_declarator), + rctypeof(struct AST_label), + rctypeof(struct AST_id_label), + rctypeof(struct AST_case_label), + rctypeof(struct AST_default_label), + rctypeof(struct AST_asttype), + rctypeof(struct AST_designator), + rctypeof(struct AST_designate_field), + rctypeof(struct AST_designate_index), + rctypeof(struct AST_word), + rctypeof(struct AST_asm_operand), + rctypeof(struct AST_implementation), + rctypeof(struct AST_configuration), + rctypeof(struct AST_module), + rctypeof(struct AST_binary_component), + rctypeof(struct AST_endpoint), + rctypeof(struct AST_parameterised_identifier), +}; + diff --git a/src/AST_types.h b/src/AST_types.h new file mode 100644 index 0000000..6e0c7c0 --- /dev/null +++ b/src/AST_types.h @@ -0,0 +1,656 @@ +/* Automatically generated from nodetypes.def, do not edit. */ + +/* See the copyright notice in nodetypes.def */ +typedef struct AST_node *node; +typedef struct AST_declaration *declaration; +typedef struct AST_statement *statement; +typedef struct AST_expression *expression; +typedef struct AST_type_element *type_element; +typedef struct AST_declarator *declarator; +typedef struct AST_label *label; +typedef struct AST_asm_decl *asm_decl; +typedef struct AST_data_decl *data_decl; +typedef struct AST_extension_decl *extension_decl; +typedef struct AST_ellipsis_decl *ellipsis_decl; +typedef struct AST_enumerator *enumerator; +typedef struct AST_oldidentifier_decl *oldidentifier_decl; +typedef struct AST_function_decl *function_decl; +typedef struct AST_implicit_decl *implicit_decl; +typedef struct AST_variable_decl *variable_decl; +typedef struct AST_field_decl *field_decl; +typedef struct AST_asttype *asttype; +typedef struct AST_typename *typename; +typedef struct AST_typeof_expr *typeof_expr; +typedef struct AST_typeof_type *typeof_type; +typedef struct AST_attribute *attribute; +typedef struct AST_gcc_attribute *gcc_attribute; +typedef struct AST_rid *rid; +typedef struct AST_qualifier *qualifier; +typedef struct AST_tag_ref *tag_ref; +typedef struct AST_struct_ref *struct_ref; +typedef struct AST_union_ref *union_ref; +typedef struct AST_nested_declarator *nested_declarator; +typedef struct AST_function_declarator *function_declarator; +typedef struct AST_pointer_declarator *pointer_declarator; +typedef struct AST_qualified_declarator *qualified_declarator; +typedef struct AST_array_declarator *array_declarator; +typedef struct AST_identifier_declarator *identifier_declarator; +typedef struct AST_asm_stmt *asm_stmt; +typedef struct AST_compound_stmt *compound_stmt; +typedef struct AST_if_stmt *if_stmt; +typedef struct AST_labeled_stmt *labeled_stmt; +typedef struct AST_expression_stmt *expression_stmt; +typedef struct AST_conditional_stmt *conditional_stmt; +typedef struct AST_switch_stmt *switch_stmt; +typedef struct AST_for_stmt *for_stmt; +typedef struct AST_break_stmt *break_stmt; +typedef struct AST_continue_stmt *continue_stmt; +typedef struct AST_return_stmt *return_stmt; +typedef struct AST_goto_stmt *goto_stmt; +typedef struct AST_computed_goto_stmt *computed_goto_stmt; +typedef struct AST_empty_stmt *empty_stmt; +typedef struct AST_unary *unary; +typedef struct AST_binary *binary; +typedef struct AST_comma *comma; +typedef struct AST_sizeof_type *sizeof_type; +typedef struct AST_alignof_type *alignof_type; +typedef struct AST_label_address *label_address; +typedef struct AST_cast *cast; +typedef struct AST_cast_list *cast_list; +typedef struct AST_conditional *conditional; +typedef struct AST_identifier *identifier; +typedef struct AST_compound_expr *compound_expr; +typedef struct AST_function_call *function_call; +typedef struct AST_field_ref *field_ref; +typedef struct AST_increment *increment; +typedef struct AST_comparison *comparison; +typedef struct AST_assignment *assignment; +typedef struct AST_init_list *init_list; +typedef struct AST_init_specific *init_specific; +typedef struct AST_designator *designator; +typedef struct AST_designate_field *designate_field; +typedef struct AST_designate_index *designate_index; +typedef struct AST_lexical_cst *lexical_cst; +typedef struct AST_string_cst *string_cst; +typedef struct AST_string *string; +typedef struct AST_id_label *id_label; +typedef struct AST_case_label *case_label; +typedef struct AST_default_label *default_label; +typedef struct AST_word *word; +typedef struct AST_asm_operand *asm_operand; +typedef struct AST_nesc_decl *nesc_decl; +typedef struct AST_interface *interface; +typedef struct AST_component *component; +typedef struct AST_implementation *implementation; +typedef struct AST_configuration *configuration; +typedef struct AST_module *module; +typedef struct AST_binary_component *binary_component; +typedef struct AST_rp_interface *rp_interface; +typedef struct AST_interface_ref *interface_ref; +typedef struct AST_component_ref *component_ref; +typedef struct AST_connection *connection; +typedef struct AST_endpoint *endpoint; +typedef struct AST_parameterised_identifier *parameterised_identifier; +typedef struct AST_generic_declarator *generic_declarator; +typedef struct AST_generic_call *generic_call; +typedef struct AST_interface_ref_declarator *interface_ref_declarator; +typedef struct AST_interface_deref *interface_deref; +typedef struct AST_component_deref *component_deref; +typedef struct AST_component_typeref *component_typeref; +typedef struct AST_atomic_stmt *atomic_stmt; +typedef struct AST_nesc_attribute *nesc_attribute; +typedef struct AST_type_parm_decl *type_parm_decl; +typedef struct AST_type_argument *type_argument; +typedef struct AST_declaration *error_decl; +typedef struct AST_tag_ref *attribute_ref; +typedef struct AST_tag_ref *enum_ref; +typedef struct AST_statement *error_stmt; +typedef struct AST_conditional_stmt *while_stmt; +typedef struct AST_conditional_stmt *dowhile_stmt; +typedef struct AST_expression *error_expr; +typedef struct AST_binary *array_ref; +typedef struct AST_unary *dereference; +typedef struct AST_unary *extension_expr; +typedef struct AST_unary *sizeof_expr; +typedef struct AST_unary *alignof_expr; +typedef struct AST_unary *realpart; +typedef struct AST_unary *imagpart; +typedef struct AST_unary *address_of; +typedef struct AST_unary *unary_minus; +typedef struct AST_unary *unary_plus; +typedef struct AST_unary *conjugate; +typedef struct AST_unary *bitnot; +typedef struct AST_unary *not; +typedef struct AST_increment *preincrement; +typedef struct AST_increment *predecrement; +typedef struct AST_increment *postincrement; +typedef struct AST_increment *postdecrement; +typedef struct AST_binary *plus; +typedef struct AST_binary *minus; +typedef struct AST_binary *times; +typedef struct AST_binary *divide; +typedef struct AST_binary *modulo; +typedef struct AST_binary *lshift; +typedef struct AST_binary *rshift; +typedef struct AST_comparison *leq; +typedef struct AST_comparison *geq; +typedef struct AST_comparison *lt; +typedef struct AST_comparison *gt; +typedef struct AST_comparison *eq; +typedef struct AST_comparison *ne; +typedef struct AST_binary *bitand; +typedef struct AST_binary *bitor; +typedef struct AST_binary *bitxor; +typedef struct AST_binary *andand; +typedef struct AST_binary *oror; +typedef struct AST_assignment *assign; +typedef struct AST_assignment *plus_assign; +typedef struct AST_assignment *minus_assign; +typedef struct AST_assignment *times_assign; +typedef struct AST_assignment *divide_assign; +typedef struct AST_assignment *modulo_assign; +typedef struct AST_assignment *lshift_assign; +typedef struct AST_assignment *rshift_assign; +typedef struct AST_assignment *bitand_assign; +typedef struct AST_assignment *bitor_assign; +typedef struct AST_assignment *bitxor_assign; +typedef struct AST_connection *rp_connection; +typedef struct AST_connection *eq_connection; +typedef struct AST_struct_ref *nx_struct_ref; +typedef struct AST_union_ref *nx_union_ref; +typedef enum { + kind_node = 42, + postkind_node = 198, + kind_declaration = 43, + postkind_declaration = 64, + kind_statement = 65, + postkind_statement = 83, + kind_expression = 84, + postkind_expression = 156, + kind_type_element = 157, + postkind_type_element = 173, + kind_declarator = 174, + postkind_declarator = 182, + kind_label = 183, + postkind_label = 186, + kind_asm_decl = 44, + postkind_asm_decl = 44, + kind_data_decl = 45, + postkind_data_decl = 45, + kind_extension_decl = 46, + postkind_extension_decl = 46, + kind_ellipsis_decl = 47, + postkind_ellipsis_decl = 47, + kind_enumerator = 48, + postkind_enumerator = 48, + kind_oldidentifier_decl = 49, + postkind_oldidentifier_decl = 49, + kind_function_decl = 50, + postkind_function_decl = 50, + kind_implicit_decl = 51, + postkind_implicit_decl = 51, + kind_variable_decl = 52, + postkind_variable_decl = 52, + kind_field_decl = 53, + postkind_field_decl = 53, + kind_asttype = 187, + postkind_asttype = 187, + kind_typename = 158, + postkind_typename = 159, + kind_typeof_expr = 160, + postkind_typeof_expr = 160, + kind_typeof_type = 161, + postkind_typeof_type = 161, + kind_attribute = 162, + postkind_attribute = 164, + kind_gcc_attribute = 163, + postkind_gcc_attribute = 163, + kind_rid = 165, + postkind_rid = 165, + kind_qualifier = 166, + postkind_qualifier = 166, + kind_tag_ref = 167, + postkind_tag_ref = 173, + kind_struct_ref = 168, + postkind_struct_ref = 169, + kind_union_ref = 170, + postkind_union_ref = 171, + kind_nested_declarator = 175, + postkind_nested_declarator = 180, + kind_function_declarator = 176, + postkind_function_declarator = 176, + kind_pointer_declarator = 177, + postkind_pointer_declarator = 177, + kind_qualified_declarator = 178, + postkind_qualified_declarator = 178, + kind_array_declarator = 179, + postkind_array_declarator = 179, + kind_identifier_declarator = 181, + postkind_identifier_declarator = 181, + kind_asm_stmt = 66, + postkind_asm_stmt = 66, + kind_compound_stmt = 67, + postkind_compound_stmt = 67, + kind_if_stmt = 68, + postkind_if_stmt = 68, + kind_labeled_stmt = 69, + postkind_labeled_stmt = 69, + kind_expression_stmt = 70, + postkind_expression_stmt = 70, + kind_conditional_stmt = 71, + postkind_conditional_stmt = 74, + kind_switch_stmt = 72, + postkind_switch_stmt = 72, + kind_for_stmt = 75, + postkind_for_stmt = 75, + kind_break_stmt = 76, + postkind_break_stmt = 76, + kind_continue_stmt = 77, + postkind_continue_stmt = 77, + kind_return_stmt = 78, + postkind_return_stmt = 78, + kind_goto_stmt = 79, + postkind_goto_stmt = 79, + kind_computed_goto_stmt = 80, + postkind_computed_goto_stmt = 80, + kind_empty_stmt = 81, + postkind_empty_stmt = 81, + kind_unary = 85, + postkind_unary = 106, + kind_binary = 107, + postkind_binary = 139, + kind_comma = 140, + postkind_comma = 140, + kind_sizeof_type = 141, + postkind_sizeof_type = 141, + kind_alignof_type = 142, + postkind_alignof_type = 142, + kind_label_address = 143, + postkind_label_address = 143, + kind_cast = 86, + postkind_cast = 86, + kind_cast_list = 144, + postkind_cast_list = 144, + kind_conditional = 145, + postkind_conditional = 145, + kind_identifier = 146, + postkind_identifier = 146, + kind_compound_expr = 147, + postkind_compound_expr = 147, + kind_function_call = 148, + postkind_function_call = 148, + kind_field_ref = 87, + postkind_field_ref = 87, + kind_increment = 88, + postkind_increment = 92, + kind_comparison = 108, + postkind_comparison = 114, + kind_assignment = 115, + postkind_assignment = 126, + kind_init_list = 149, + postkind_init_list = 149, + kind_init_specific = 150, + postkind_init_specific = 150, + kind_designator = 188, + postkind_designator = 190, + kind_designate_field = 189, + postkind_designate_field = 189, + kind_designate_index = 190, + postkind_designate_index = 190, + kind_lexical_cst = 151, + postkind_lexical_cst = 152, + kind_string_cst = 152, + postkind_string_cst = 152, + kind_string = 153, + postkind_string = 153, + kind_id_label = 184, + postkind_id_label = 184, + kind_case_label = 185, + postkind_case_label = 185, + kind_default_label = 186, + postkind_default_label = 186, + kind_word = 191, + postkind_word = 191, + kind_asm_operand = 192, + postkind_asm_operand = 192, + kind_nesc_decl = 54, + postkind_nesc_decl = 56, + kind_interface = 55, + postkind_interface = 55, + kind_component = 56, + postkind_component = 56, + kind_implementation = 193, + postkind_implementation = 196, + kind_configuration = 194, + postkind_configuration = 194, + kind_module = 195, + postkind_module = 195, + kind_binary_component = 196, + postkind_binary_component = 196, + kind_rp_interface = 57, + postkind_rp_interface = 57, + kind_interface_ref = 58, + postkind_interface_ref = 58, + kind_component_ref = 59, + postkind_component_ref = 59, + kind_connection = 60, + postkind_connection = 62, + kind_endpoint = 197, + postkind_endpoint = 197, + kind_parameterised_identifier = 198, + postkind_parameterised_identifier = 198, + kind_generic_declarator = 182, + postkind_generic_declarator = 182, + kind_generic_call = 154, + postkind_generic_call = 154, + kind_interface_ref_declarator = 180, + postkind_interface_ref_declarator = 180, + kind_interface_deref = 93, + postkind_interface_deref = 93, + kind_component_deref = 94, + postkind_component_deref = 94, + kind_component_typeref = 159, + postkind_component_typeref = 159, + kind_atomic_stmt = 82, + postkind_atomic_stmt = 82, + kind_nesc_attribute = 164, + postkind_nesc_attribute = 164, + kind_type_parm_decl = 63, + postkind_type_parm_decl = 63, + kind_type_argument = 155, + postkind_type_argument = 155, + kind_error_decl = 64, + postkind_error_decl = 64, + kind_attribute_ref = 172, + postkind_attribute_ref = 172, + kind_enum_ref = 173, + postkind_enum_ref = 173, + kind_error_stmt = 83, + postkind_error_stmt = 83, + kind_while_stmt = 73, + postkind_while_stmt = 73, + kind_dowhile_stmt = 74, + postkind_dowhile_stmt = 74, + kind_error_expr = 156, + postkind_error_expr = 156, + kind_array_ref = 127, + postkind_array_ref = 127, + kind_dereference = 95, + postkind_dereference = 95, + kind_extension_expr = 96, + postkind_extension_expr = 96, + kind_sizeof_expr = 97, + postkind_sizeof_expr = 97, + kind_alignof_expr = 98, + postkind_alignof_expr = 98, + kind_realpart = 99, + postkind_realpart = 99, + kind_imagpart = 100, + postkind_imagpart = 100, + kind_address_of = 101, + postkind_address_of = 101, + kind_unary_minus = 102, + postkind_unary_minus = 102, + kind_unary_plus = 103, + postkind_unary_plus = 103, + kind_conjugate = 104, + postkind_conjugate = 104, + kind_bitnot = 105, + postkind_bitnot = 105, + kind_not = 106, + postkind_not = 106, + kind_preincrement = 89, + postkind_preincrement = 89, + kind_predecrement = 90, + postkind_predecrement = 90, + kind_postincrement = 91, + postkind_postincrement = 91, + kind_postdecrement = 92, + postkind_postdecrement = 92, + kind_plus = 128, + postkind_plus = 128, + kind_minus = 129, + postkind_minus = 129, + kind_times = 130, + postkind_times = 130, + kind_divide = 131, + postkind_divide = 131, + kind_modulo = 132, + postkind_modulo = 132, + kind_lshift = 133, + postkind_lshift = 133, + kind_rshift = 134, + postkind_rshift = 134, + kind_leq = 109, + postkind_leq = 109, + kind_geq = 110, + postkind_geq = 110, + kind_lt = 111, + postkind_lt = 111, + kind_gt = 112, + postkind_gt = 112, + kind_eq = 113, + postkind_eq = 113, + kind_ne = 114, + postkind_ne = 114, + kind_bitand = 135, + postkind_bitand = 135, + kind_bitor = 136, + postkind_bitor = 136, + kind_bitxor = 137, + postkind_bitxor = 137, + kind_andand = 138, + postkind_andand = 138, + kind_oror = 139, + postkind_oror = 139, + kind_assign = 116, + postkind_assign = 116, + kind_plus_assign = 117, + postkind_plus_assign = 117, + kind_minus_assign = 118, + postkind_minus_assign = 118, + kind_times_assign = 119, + postkind_times_assign = 119, + kind_divide_assign = 120, + postkind_divide_assign = 120, + kind_modulo_assign = 121, + postkind_modulo_assign = 121, + kind_lshift_assign = 122, + postkind_lshift_assign = 122, + kind_rshift_assign = 123, + postkind_rshift_assign = 123, + kind_bitand_assign = 124, + postkind_bitand_assign = 124, + kind_bitor_assign = 125, + postkind_bitor_assign = 125, + kind_bitxor_assign = 126, + postkind_bitxor_assign = 126, + kind_rp_connection = 61, + postkind_rp_connection = 61, + kind_eq_connection = 62, + postkind_eq_connection = 62, + kind_nx_struct_ref = 169, + postkind_nx_struct_ref = 169, + kind_nx_union_ref = 171, + postkind_nx_union_ref = 171 +} AST_kind; + +extern AST_kind AST_parent_kind[]; /* indexed by kind - kind_node */ + +extern AST_kind AST_post_kind[]; /* indexed by kind - kind_node */ + +extern size_t AST_sizeof[]; /* indexed by kind - kind_node */ + +extern type_t AST_typeof[]; /* indexed by kind - kind_node */ +#define is_node(x) ((x)->kind >= kind_node && (x)->kind <= postkind_node) +#define is_declaration(x) ((x)->kind >= kind_declaration && (x)->kind <= postkind_declaration) +#define is_statement(x) ((x)->kind >= kind_statement && (x)->kind <= postkind_statement) +#define is_expression(x) ((x)->kind >= kind_expression && (x)->kind <= postkind_expression) +#define is_type_element(x) ((x)->kind >= kind_type_element && (x)->kind <= postkind_type_element) +#define is_declarator(x) ((x)->kind >= kind_declarator && (x)->kind <= postkind_declarator) +#define is_label(x) ((x)->kind >= kind_label && (x)->kind <= postkind_label) +#define is_asm_decl(x) ((x)->kind >= kind_asm_decl && (x)->kind <= postkind_asm_decl) +#define is_data_decl(x) ((x)->kind >= kind_data_decl && (x)->kind <= postkind_data_decl) +#define is_extension_decl(x) ((x)->kind >= kind_extension_decl && (x)->kind <= postkind_extension_decl) +#define is_ellipsis_decl(x) ((x)->kind >= kind_ellipsis_decl && (x)->kind <= postkind_ellipsis_decl) +#define is_enumerator(x) ((x)->kind >= kind_enumerator && (x)->kind <= postkind_enumerator) +#define is_oldidentifier_decl(x) ((x)->kind >= kind_oldidentifier_decl && (x)->kind <= postkind_oldidentifier_decl) +#define is_function_decl(x) ((x)->kind >= kind_function_decl && (x)->kind <= postkind_function_decl) +#define is_implicit_decl(x) ((x)->kind >= kind_implicit_decl && (x)->kind <= postkind_implicit_decl) +#define is_variable_decl(x) ((x)->kind >= kind_variable_decl && (x)->kind <= postkind_variable_decl) +#define is_field_decl(x) ((x)->kind >= kind_field_decl && (x)->kind <= postkind_field_decl) +#define is_asttype(x) ((x)->kind >= kind_asttype && (x)->kind <= postkind_asttype) +#define is_typename(x) ((x)->kind >= kind_typename && (x)->kind <= postkind_typename) +#define is_typeof_expr(x) ((x)->kind >= kind_typeof_expr && (x)->kind <= postkind_typeof_expr) +#define is_typeof_type(x) ((x)->kind >= kind_typeof_type && (x)->kind <= postkind_typeof_type) +#define is_attribute(x) ((x)->kind >= kind_attribute && (x)->kind <= postkind_attribute) +#define is_gcc_attribute(x) ((x)->kind >= kind_gcc_attribute && (x)->kind <= postkind_gcc_attribute) +#define is_rid(x) ((x)->kind >= kind_rid && (x)->kind <= postkind_rid) +#define is_qualifier(x) ((x)->kind >= kind_qualifier && (x)->kind <= postkind_qualifier) +#define is_tag_ref(x) ((x)->kind >= kind_tag_ref && (x)->kind <= postkind_tag_ref) +#define is_struct_ref(x) ((x)->kind >= kind_struct_ref && (x)->kind <= postkind_struct_ref) +#define is_union_ref(x) ((x)->kind >= kind_union_ref && (x)->kind <= postkind_union_ref) +#define is_nested_declarator(x) ((x)->kind >= kind_nested_declarator && (x)->kind <= postkind_nested_declarator) +#define is_function_declarator(x) ((x)->kind >= kind_function_declarator && (x)->kind <= postkind_function_declarator) +#define is_pointer_declarator(x) ((x)->kind >= kind_pointer_declarator && (x)->kind <= postkind_pointer_declarator) +#define is_qualified_declarator(x) ((x)->kind >= kind_qualified_declarator && (x)->kind <= postkind_qualified_declarator) +#define is_array_declarator(x) ((x)->kind >= kind_array_declarator && (x)->kind <= postkind_array_declarator) +#define is_identifier_declarator(x) ((x)->kind >= kind_identifier_declarator && (x)->kind <= postkind_identifier_declarator) +#define is_asm_stmt(x) ((x)->kind >= kind_asm_stmt && (x)->kind <= postkind_asm_stmt) +#define is_compound_stmt(x) ((x)->kind >= kind_compound_stmt && (x)->kind <= postkind_compound_stmt) +#define is_if_stmt(x) ((x)->kind >= kind_if_stmt && (x)->kind <= postkind_if_stmt) +#define is_labeled_stmt(x) ((x)->kind >= kind_labeled_stmt && (x)->kind <= postkind_labeled_stmt) +#define is_expression_stmt(x) ((x)->kind >= kind_expression_stmt && (x)->kind <= postkind_expression_stmt) +#define is_conditional_stmt(x) ((x)->kind >= kind_conditional_stmt && (x)->kind <= postkind_conditional_stmt) +#define is_switch_stmt(x) ((x)->kind >= kind_switch_stmt && (x)->kind <= postkind_switch_stmt) +#define is_for_stmt(x) ((x)->kind >= kind_for_stmt && (x)->kind <= postkind_for_stmt) +#define is_break_stmt(x) ((x)->kind >= kind_break_stmt && (x)->kind <= postkind_break_stmt) +#define is_continue_stmt(x) ((x)->kind >= kind_continue_stmt && (x)->kind <= postkind_continue_stmt) +#define is_return_stmt(x) ((x)->kind >= kind_return_stmt && (x)->kind <= postkind_return_stmt) +#define is_goto_stmt(x) ((x)->kind >= kind_goto_stmt && (x)->kind <= postkind_goto_stmt) +#define is_computed_goto_stmt(x) ((x)->kind >= kind_computed_goto_stmt && (x)->kind <= postkind_computed_goto_stmt) +#define is_empty_stmt(x) ((x)->kind >= kind_empty_stmt && (x)->kind <= postkind_empty_stmt) +#define is_unary(x) ((x)->kind >= kind_unary && (x)->kind <= postkind_unary) +#define is_binary(x) ((x)->kind >= kind_binary && (x)->kind <= postkind_binary) +#define is_comma(x) ((x)->kind >= kind_comma && (x)->kind <= postkind_comma) +#define is_sizeof_type(x) ((x)->kind >= kind_sizeof_type && (x)->kind <= postkind_sizeof_type) +#define is_alignof_type(x) ((x)->kind >= kind_alignof_type && (x)->kind <= postkind_alignof_type) +#define is_label_address(x) ((x)->kind >= kind_label_address && (x)->kind <= postkind_label_address) +#define is_cast(x) ((x)->kind >= kind_cast && (x)->kind <= postkind_cast) +#define is_cast_list(x) ((x)->kind >= kind_cast_list && (x)->kind <= postkind_cast_list) +#define is_conditional(x) ((x)->kind >= kind_conditional && (x)->kind <= postkind_conditional) +#define is_identifier(x) ((x)->kind >= kind_identifier && (x)->kind <= postkind_identifier) +#define is_compound_expr(x) ((x)->kind >= kind_compound_expr && (x)->kind <= postkind_compound_expr) +#define is_function_call(x) ((x)->kind >= kind_function_call && (x)->kind <= postkind_function_call) +#define is_field_ref(x) ((x)->kind >= kind_field_ref && (x)->kind <= postkind_field_ref) +#define is_increment(x) ((x)->kind >= kind_increment && (x)->kind <= postkind_increment) +#define is_comparison(x) ((x)->kind >= kind_comparison && (x)->kind <= postkind_comparison) +#define is_assignment(x) ((x)->kind >= kind_assignment && (x)->kind <= postkind_assignment) +#define is_init_list(x) ((x)->kind >= kind_init_list && (x)->kind <= postkind_init_list) +#define is_init_specific(x) ((x)->kind >= kind_init_specific && (x)->kind <= postkind_init_specific) +#define is_designator(x) ((x)->kind >= kind_designator && (x)->kind <= postkind_designator) +#define is_designate_field(x) ((x)->kind >= kind_designate_field && (x)->kind <= postkind_designate_field) +#define is_designate_index(x) ((x)->kind >= kind_designate_index && (x)->kind <= postkind_designate_index) +#define is_lexical_cst(x) ((x)->kind >= kind_lexical_cst && (x)->kind <= postkind_lexical_cst) +#define is_string_cst(x) ((x)->kind >= kind_string_cst && (x)->kind <= postkind_string_cst) +#define is_string(x) ((x)->kind >= kind_string && (x)->kind <= postkind_string) +#define is_id_label(x) ((x)->kind >= kind_id_label && (x)->kind <= postkind_id_label) +#define is_case_label(x) ((x)->kind >= kind_case_label && (x)->kind <= postkind_case_label) +#define is_default_label(x) ((x)->kind >= kind_default_label && (x)->kind <= postkind_default_label) +#define is_word(x) ((x)->kind >= kind_word && (x)->kind <= postkind_word) +#define is_asm_operand(x) ((x)->kind >= kind_asm_operand && (x)->kind <= postkind_asm_operand) +#define is_nesc_decl(x) ((x)->kind >= kind_nesc_decl && (x)->kind <= postkind_nesc_decl) +#define is_interface(x) ((x)->kind >= kind_interface && (x)->kind <= postkind_interface) +#define is_component(x) ((x)->kind >= kind_component && (x)->kind <= postkind_component) +#define is_implementation(x) ((x)->kind >= kind_implementation && (x)->kind <= postkind_implementation) +#define is_configuration(x) ((x)->kind >= kind_configuration && (x)->kind <= postkind_configuration) +#define is_module(x) ((x)->kind >= kind_module && (x)->kind <= postkind_module) +#define is_binary_component(x) ((x)->kind >= kind_binary_component && (x)->kind <= postkind_binary_component) +#define is_rp_interface(x) ((x)->kind >= kind_rp_interface && (x)->kind <= postkind_rp_interface) +#define is_interface_ref(x) ((x)->kind >= kind_interface_ref && (x)->kind <= postkind_interface_ref) +#define is_component_ref(x) ((x)->kind >= kind_component_ref && (x)->kind <= postkind_component_ref) +#define is_connection(x) ((x)->kind >= kind_connection && (x)->kind <= postkind_connection) +#define is_endpoint(x) ((x)->kind >= kind_endpoint && (x)->kind <= postkind_endpoint) +#define is_parameterised_identifier(x) ((x)->kind >= kind_parameterised_identifier && (x)->kind <= postkind_parameterised_identifier) +#define is_generic_declarator(x) ((x)->kind >= kind_generic_declarator && (x)->kind <= postkind_generic_declarator) +#define is_generic_call(x) ((x)->kind >= kind_generic_call && (x)->kind <= postkind_generic_call) +#define is_interface_ref_declarator(x) ((x)->kind >= kind_interface_ref_declarator && (x)->kind <= postkind_interface_ref_declarator) +#define is_interface_deref(x) ((x)->kind >= kind_interface_deref && (x)->kind <= postkind_interface_deref) +#define is_component_deref(x) ((x)->kind >= kind_component_deref && (x)->kind <= postkind_component_deref) +#define is_component_typeref(x) ((x)->kind >= kind_component_typeref && (x)->kind <= postkind_component_typeref) +#define is_atomic_stmt(x) ((x)->kind >= kind_atomic_stmt && (x)->kind <= postkind_atomic_stmt) +#define is_nesc_attribute(x) ((x)->kind >= kind_nesc_attribute && (x)->kind <= postkind_nesc_attribute) +#define is_type_parm_decl(x) ((x)->kind >= kind_type_parm_decl && (x)->kind <= postkind_type_parm_decl) +#define is_type_argument(x) ((x)->kind >= kind_type_argument && (x)->kind <= postkind_type_argument) +#define is_error_decl(x) ((x)->kind >= kind_error_decl && (x)->kind <= postkind_error_decl) +#define is_attribute_ref(x) ((x)->kind >= kind_attribute_ref && (x)->kind <= postkind_attribute_ref) +#define is_enum_ref(x) ((x)->kind >= kind_enum_ref && (x)->kind <= postkind_enum_ref) +#define is_error_stmt(x) ((x)->kind >= kind_error_stmt && (x)->kind <= postkind_error_stmt) +#define is_while_stmt(x) ((x)->kind >= kind_while_stmt && (x)->kind <= postkind_while_stmt) +#define is_dowhile_stmt(x) ((x)->kind >= kind_dowhile_stmt && (x)->kind <= postkind_dowhile_stmt) +#define is_error_expr(x) ((x)->kind >= kind_error_expr && (x)->kind <= postkind_error_expr) +#define is_array_ref(x) ((x)->kind >= kind_array_ref && (x)->kind <= postkind_array_ref) +#define is_dereference(x) ((x)->kind >= kind_dereference && (x)->kind <= postkind_dereference) +#define is_extension_expr(x) ((x)->kind >= kind_extension_expr && (x)->kind <= postkind_extension_expr) +#define is_sizeof_expr(x) ((x)->kind >= kind_sizeof_expr && (x)->kind <= postkind_sizeof_expr) +#define is_alignof_expr(x) ((x)->kind >= kind_alignof_expr && (x)->kind <= postkind_alignof_expr) +#define is_realpart(x) ((x)->kind >= kind_realpart && (x)->kind <= postkind_realpart) +#define is_imagpart(x) ((x)->kind >= kind_imagpart && (x)->kind <= postkind_imagpart) +#define is_address_of(x) ((x)->kind >= kind_address_of && (x)->kind <= postkind_address_of) +#define is_unary_minus(x) ((x)->kind >= kind_unary_minus && (x)->kind <= postkind_unary_minus) +#define is_unary_plus(x) ((x)->kind >= kind_unary_plus && (x)->kind <= postkind_unary_plus) +#define is_conjugate(x) ((x)->kind >= kind_conjugate && (x)->kind <= postkind_conjugate) +#define is_bitnot(x) ((x)->kind >= kind_bitnot && (x)->kind <= postkind_bitnot) +#define is_not(x) ((x)->kind >= kind_not && (x)->kind <= postkind_not) +#define is_preincrement(x) ((x)->kind >= kind_preincrement && (x)->kind <= postkind_preincrement) +#define is_predecrement(x) ((x)->kind >= kind_predecrement && (x)->kind <= postkind_predecrement) +#define is_postincrement(x) ((x)->kind >= kind_postincrement && (x)->kind <= postkind_postincrement) +#define is_postdecrement(x) ((x)->kind >= kind_postdecrement && (x)->kind <= postkind_postdecrement) +#define is_plus(x) ((x)->kind >= kind_plus && (x)->kind <= postkind_plus) +#define is_minus(x) ((x)->kind >= kind_minus && (x)->kind <= postkind_minus) +#define is_times(x) ((x)->kind >= kind_times && (x)->kind <= postkind_times) +#define is_divide(x) ((x)->kind >= kind_divide && (x)->kind <= postkind_divide) +#define is_modulo(x) ((x)->kind >= kind_modulo && (x)->kind <= postkind_modulo) +#define is_lshift(x) ((x)->kind >= kind_lshift && (x)->kind <= postkind_lshift) +#define is_rshift(x) ((x)->kind >= kind_rshift && (x)->kind <= postkind_rshift) +#define is_leq(x) ((x)->kind >= kind_leq && (x)->kind <= postkind_leq) +#define is_geq(x) ((x)->kind >= kind_geq && (x)->kind <= postkind_geq) +#define is_lt(x) ((x)->kind >= kind_lt && (x)->kind <= postkind_lt) +#define is_gt(x) ((x)->kind >= kind_gt && (x)->kind <= postkind_gt) +#define is_eq(x) ((x)->kind >= kind_eq && (x)->kind <= postkind_eq) +#define is_ne(x) ((x)->kind >= kind_ne && (x)->kind <= postkind_ne) +#define is_bitand(x) ((x)->kind >= kind_bitand && (x)->kind <= postkind_bitand) +#define is_bitor(x) ((x)->kind >= kind_bitor && (x)->kind <= postkind_bitor) +#define is_bitxor(x) ((x)->kind >= kind_bitxor && (x)->kind <= postkind_bitxor) +#define is_andand(x) ((x)->kind >= kind_andand && (x)->kind <= postkind_andand) +#define is_oror(x) ((x)->kind >= kind_oror && (x)->kind <= postkind_oror) +#define is_assign(x) ((x)->kind >= kind_assign && (x)->kind <= postkind_assign) +#define is_plus_assign(x) ((x)->kind >= kind_plus_assign && (x)->kind <= postkind_plus_assign) +#define is_minus_assign(x) ((x)->kind >= kind_minus_assign && (x)->kind <= postkind_minus_assign) +#define is_times_assign(x) ((x)->kind >= kind_times_assign && (x)->kind <= postkind_times_assign) +#define is_divide_assign(x) ((x)->kind >= kind_divide_assign && (x)->kind <= postkind_divide_assign) +#define is_modulo_assign(x) ((x)->kind >= kind_modulo_assign && (x)->kind <= postkind_modulo_assign) +#define is_lshift_assign(x) ((x)->kind >= kind_lshift_assign && (x)->kind <= postkind_lshift_assign) +#define is_rshift_assign(x) ((x)->kind >= kind_rshift_assign && (x)->kind <= postkind_rshift_assign) +#define is_bitand_assign(x) ((x)->kind >= kind_bitand_assign && (x)->kind <= postkind_bitand_assign) +#define is_bitor_assign(x) ((x)->kind >= kind_bitor_assign && (x)->kind <= postkind_bitor_assign) +#define is_bitxor_assign(x) ((x)->kind >= kind_bitxor_assign && (x)->kind <= postkind_bitxor_assign) +#define is_rp_connection(x) ((x)->kind >= kind_rp_connection && (x)->kind <= postkind_rp_connection) +#define is_eq_connection(x) ((x)->kind >= kind_eq_connection && (x)->kind <= postkind_eq_connection) +#define is_nx_struct_ref(x) ((x)->kind >= kind_nx_struct_ref && (x)->kind <= postkind_nx_struct_ref) +#define is_nx_union_ref(x) ((x)->kind >= kind_nx_union_ref && (x)->kind <= postkind_nx_union_ref) +typedef struct +{ + AST_kind kind; +} *AST_generic; + +#ifdef __GNUC__ +#define AST_CAST(type, x) ({AST_generic tEmPcast = (AST_generic)(x); if (tEmPcast) assert(is_ ## type(tEmPcast)); (type)(tEmPcast); }) +#define AST_CASTPTR(type, x) ({AST_generic *tEmPcast = (AST_generic *)(x); if (tEmPcast && *tEmPcast) assert(is_ ## type(*tEmPcast)); (type *)(tEmPcast); }) +#define AST_CASTSRPTR(type, x) ({AST_generic *tEmPcast = (AST_generic *)(x); if (tEmPcast && *tEmPcast) assert(is_ ## type(*tEmPcast)); (type sameregion *)(tEmPcast); }) +#else +/* Could also generate some code to make this safe */ +#define AST_CAST(type, x) ((type)(x)) +#define AST_CASTPTR(type, x) ((type *)(x)) +#define AST_CASTSRPTR(type, x) ((type sameregion *)(x)) +#endif diff --git a/src/AST_utils.c b/src/AST_utils.c new file mode 100644 index 0000000..320c3fb --- /dev/null +++ b/src/AST_utils.c @@ -0,0 +1,373 @@ +/* This file is part of the nesC compiler. + +This file is derived from the RC Compiler. It is thus + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include "parser.h" +#include "AST_utils.h" +#include "constants.h" + +bool oldstyle_function(function_decl fn) +{ + return !fn->fdeclarator->parms || is_oldidentifier_decl(fn->fdeclarator->parms); +} + +/* True if the parameters is just the parameter list '(void)' */ +bool is_void_parms(declaration parms) +{ + data_decl dd; + variable_decl vd; + + if (!parms || parms->next || !is_data_decl(parms)) + return FALSE; + + dd = CAST(data_decl, parms); + vd = CAST(variable_decl, dd->decls); + assert(!vd->next); + + return !vd->declarator && dd->modifiers && !dd->modifiers->next && + is_rid(dd->modifiers) && CAST(rid, dd->modifiers)->id == RID_VOID; +} + +function_declarator get_fdeclarator(declarator d) +{ + function_declarator fd = NULL; + + while (d) + switch (d->kind) + { + case kind_identifier_declarator: + return fd; + case kind_function_declarator: + fd = CAST(function_declarator, d); + /* fallthrough */ + default: + d = CAST(nested_declarator, d)->declarator; + break; + } + + return fd; +} + +data_declaration get_parameter(declaration d) +{ + switch (d->kind) + { + case kind_ellipsis_decl: + return NULL; + case kind_oldidentifier_decl: + return CAST(oldidentifier_decl, d)->ddecl; + case kind_data_decl: + return CAST(variable_decl, CAST(data_decl, d)->decls)->ddecl; + default: + assert(0); return NULL; + } +} + +data_declaration base_identifier(data_declaration d) +{ + while (d->isfilescoperef && d->shadowed) + d = d->shadowed; + + return d; +} + +bool same_function(data_declaration d1, data_declaration d2) +{ + d1 = base_identifier(d1); + d2 = base_identifier(d2); + return d1->kind == decl_function && d1 == d2; +} + +bool call_to(data_declaration fnd, function_call fce) +{ + return is_identifier(fce->arg1) && + fnd && same_function(CAST(identifier, fce->arg1)->ddecl, fnd); +} + +bool is_localvar(expression e) +{ + data_declaration decl; + + if (!is_identifier(e)) + return FALSE; + + decl = CAST(identifier, e)->ddecl; + return decl->kind == decl_variable && decl->islocal; +} + +compound_stmt parent_block(node n) +{ + /* Don't consider statement expressions as parent blocks - the last statement + is special (value of the block) which confuses code that assumes arbitrary + statements can be added to the end of a block */ + while (!is_compound_stmt(n) || is_compound_expr(n->parent)) + n = n->parent; + + return CAST(compound_stmt, n); +} + +function_decl parent_function(node n) +{ + while (!is_function_decl(n)) + n = n->parent; + + return CAST(function_decl, n); +} + +expression ignore_fields(expression e) +{ + while (e->kind == kind_field_ref) + e = CAST(field_ref, e)->arg1; + + return e; +} + +expression expression_of_stmt(compound_expr ce) +{ + compound_stmt blk = CAST(compound_stmt, ce->stmt); + statement last_stmt = last_statement(blk->stmts); + + if (last_stmt && is_expression_stmt(last_stmt)) + { + expression_stmt es = CAST(expression_stmt, last_stmt); + + return es->arg1; + } + return NULL; +} + +bool expression_used(expression e) +{ + node p1 = e->parent, n1 = e->next; + + /* Figure out if result of assignment is used. Logic: + used(e): case parent(e) of + expression_stmt: false + comma: false if e not last, used(parent(e)) otherwise + everything else: true */ + for (;;) + { + if (is_expression_stmt(p1)) + return FALSE; + if (!is_comma(p1)) + return TRUE; + if (n1) + return FALSE; /* Not last in a comma */ + n1 = p1->next; + p1 = p1->parent; + } +} + +bool zero_expression(expression e) +{ + /* a = 0 is not a constant expression but it's value is known to be 0, + and other similar cases */ + for (;;) + { + if (is_assign(e)) + { + e = CAST(assign, e)->arg2; + continue; + } + if (is_cast(e)) + { + e = CAST(cast, e)->arg1; + continue; + } + if (is_comma(e)) + { + e = CAST(expression, last_node(CAST(node, CAST(comma, e)->arg1))); + continue; + } + break; + } + + return definite_zero(e); +} + +expression build_int_constant(region r, location loc, type t, largest_int c) +{ + char cstbuf[64]; + cstring csts; + lexical_cst cst; + + snprintf(cstbuf, sizeof cstbuf, "%lld", c); + csts.data = rstrdup(r, cstbuf); + csts.length = strlen(cstbuf); + cst = new_lexical_cst(r, loc, csts); + cst->type = t; + cst->cst = make_cst(make_cval_signed(c, t), t); + + return CAST(expression, cst); +} + +expression build_uint_constant(region r, location loc, type t, largest_uint c) +{ + char cstbuf[64]; + cstring csts; + lexical_cst cst; + + snprintf(cstbuf, sizeof cstbuf, "%llu", c); + csts.data = rstrdup(r, cstbuf); + csts.length = strlen(cstbuf); + cst = new_lexical_cst(r, loc, csts); + cst->type = t; + cst->cst = make_cst(make_cval_unsigned(c, t), t); + + return CAST(expression, cst); +} + +cval value_of_enumerator(enumerator e) +{ + return e->ddecl->value->cval; +} + +expression build_identifier(region r, location loc, data_declaration id) +{ + identifier e = new_identifier(r, loc, str2cstring(r, id->name), id); + + assert(id->kind == decl_variable || id->kind == decl_function || + id->kind == decl_constant || id->kind == decl_magic_function); + e->type = id->type; + e->cst = fold_identifier(CAST(expression, e), id, 0); + + return CAST(expression, e); +} + +int asm_rwmode(string s) +{ + if (s->ddecl->schars.length > 0) + return s->ddecl->schars.data[0]; + else + return -1; +} + +declaration ignore_extensions(declaration d) +{ + while (is_extension_decl(d)) + d = CAST(extension_decl, d)->decl; + + return d; +} + +tag_declaration get_unnamed_tag_decl(data_decl decl) +{ + /* decl has no actual declarations. Check to see if it is a struct or + union, and if so return that struct or union's declaration */ + type_element elem; + + scan_type_element (elem, decl->modifiers) + if (is_struct_ref(elem) || is_union_ref(elem)) + return CAST(tag_ref, elem)->tdecl; + + return NULL; +} + +const char *nice_field_name(const char *s) +/* Returns: "(anonymous)" if s == NULL, s otherwise + This helps printing the name of potentially unnamed entities + */ +{ + if (s) + return s; + return "(anonymous)"; +} + +const char *tagkind_name(int tagkind) +{ + switch (tagkind) + { + case kind_attribute_ref: return "attribute"; + case kind_struct_ref: return "struct"; + case kind_union_ref: return "union"; + case kind_nx_struct_ref: return "nx_struct"; + case kind_nx_union_ref: return "nx_union"; + case kind_enum_ref: return "enum"; + default: assert(0); return NULL; + } +} + +conditional conditional_lvalue(expression e) +{ + /* a = 0 is not a constant expression but it's value is known to be 0, + and other similar cases */ + for (;;) + { + if (is_cast(e)) + { + e = CAST(cast, e)->arg1; + continue; + } + if (is_comma(e)) + { + e = CAST(expression, last_node(CAST(node, CAST(comma, e)->arg1))); + continue; + } + break; + } + + if (is_conditional(e)) + return CAST(conditional, e); + else + return NULL; +} + +data_declaration string_ddecl(expression s) +{ + if (s->cst && constant_address(s->cst)) + { + data_declaration sdecl = cval_ddecl(s->cst->cval); + + /* Must be an offsetless string */ + if (sdecl && sdecl->kind == decl_magic_string && + cval_knownbool(s->cst->cval)) + return sdecl; + } + return NULL; +} + +char *ddecl2str(region r, data_declaration ddecl) +/* Returns: a newly allocated string (in region r) for the string + specified by ddecl, or NULL if str contains wide characters + Requires: ddecl->kind == decl_magic_string +*/ +{ + assert(ddecl->kind == decl_magic_string); + + if (!type_char(type_array_of(ddecl->type))) + return NULL; /* Wide string */ + else + return cstring2str(r, ddecl->schars); +} + +/* True if arg is name or __name__ */ +bool is_attr_name(const char *arg, const char *name) +{ + int l; + + if (!strcmp(arg, name)) + return TRUE; + + if (strncmp(arg, "__", 2)) + return FALSE; + + l = strlen(name); + return !strncmp(arg + 2, name, l) && !strcmp(arg + 2 + l, "__"); +} diff --git a/src/AST_utils.h b/src/AST_utils.h new file mode 100644 index 0000000..7bf4fe2 --- /dev/null +++ b/src/AST_utils.h @@ -0,0 +1,88 @@ +/* This file is part of the nesC compiler. + +This file is derived from the RC Compiler. It is thus + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef AST_UTILS_H +#define AST_UTILS_H + +#define IS_A(n, k) \ + ((n)->kind >= (k) && (n)->kind <= AST_post_kind[(k) - kind_node]) + +data_declaration get_parameter(declaration d); +function_declarator get_fdeclarator(declarator d); +bool oldstyle_function(function_decl fn); +bool is_void_parms(declaration parms); +bool is_localvar(expression e); +compound_stmt parent_block(node n); +function_decl parent_function(node n); +expression expression_of_stmt(compound_expr ce); /* Return expression which is value of compound statement expression, or NULL of node ("void" compound expression) */ +bool expression_used(expression e); + +data_declaration base_identifier(data_declaration d); +bool same_function(data_declaration d1, data_declaration d2); +bool call_to(data_declaration fnd, function_call fce); +expression ignore_fields(expression e); + +/* True for expressions whose value is known to be 0 (but which + may not be constant expressions) */ +bool zero_expression(expression e); + +expression build_int_constant(region r, location loc, type t, largest_int c); +expression build_uint_constant(region r, location loc, type t, largest_uint c); +#define build_zero(r, loc) build_int_constant(r, loc, int_type, 0) + +expression build_identifier(region r, location loc, data_declaration id); + +cval value_of_enumerator(enumerator e); + +int asm_rwmode(string s); +/* Return: The first char of asm operand mode specifier s, this indicates + the r/w mode for the operand (see gcc docs) + The result is -1 if s is the empty string. +*/ + +declaration ignore_extensions(declaration d); +/* Ignore extension_decls at d, returning the "real" declaration */ + +tag_declaration get_unnamed_tag_decl(data_decl decl); +/* Returns:. Check to see if it is a struct or + union, and if so return that struct or union's declaration */ + +const char *nice_field_name(const char *s); +/* Returns: "(anonymous)" if s == NULL, s otherwise + This helps printing the name of potentially unnamed entities + */ + +const char *tagkind_name(int tagkind); + +conditional conditional_lvalue(expression e); + +data_declaration string_ddecl(expression s); + +char *ddecl2str(region r, data_declaration str); +/* Returns: a newly allocated string (in region r) for the string + specified by str, or NULL if str contains wide characters + Requires: str->kind == decl_magic_string +*/ + +bool is_attr_name(const char *arg, const char *name); +/* Returns: True if arg is name or __name__ */ + +#endif diff --git a/src/AST_walk.c b/src/AST_walk.c new file mode 100644 index 0000000..9af490e --- /dev/null +++ b/src/AST_walk.c @@ -0,0 +1,102 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include "parser.h" +#include "AST_walk.h" +#include "AST_utils.h" + +struct AST_walker +{ + AST_walker_fn walkers[postkind_node + 1 - kind_node]; +}; + +static AST_walker_result default_walker(AST_walker spec, void *data, + node *n) +{ + return aw_walk; +} + +AST_walker new_AST_walker(region r) +/* Effcts: creates a new AST walker in region r. Default behaviour + is to assert(0); */ +{ + AST_walker walker = ralloc(r, struct AST_walker); + + AST_walker_handle(walker, kind_node, default_walker); + + return walker; +} + +void AST_walker_handle(AST_walker spec, AST_kind kind, AST_walker_fn fn) +/* Effects: Sets walker function for node kind and all its children to + fn +*/ +{ + AST_kind k; + + assert(kind >= kind_node && kind <= postkind_node); + for (k = kind; k <= AST_post_kind[kind - kind_node]; k++) + spec->walkers[k - kind_node] = fn; +} + +/* Just execute the walker function for node-type 'kind' */ +AST_walker_result AST_walker_call(AST_walker spec, AST_kind kind, void *data, node *n) +{ + assert(kind >= kind_node && kind <= postkind_node && IS_A(*n, kind)); + return spec->walkers[kind - kind_node](spec, data, n); +} + +void AST_walk_list(AST_walker s, void *d, node *n) +{ + while (*n) + { + AST_walk(s, d, n); + n = &(*n)->next; + } +} + +void AST_walk_children(AST_walker s, void *d, node n) +{ + switch (n->kind) + { +#include "AST_walk_children.c" + default: + break; + } +} + +/* Recursive walk from n */ +void AST_walk(AST_walker spec, void *data, node *n) +{ + for (;;) + { + AST_kind k = (*n)->kind; + + switch (AST_walker_call(spec, k, data, n)) + { + case aw_done: return; + case aw_call_parent: + k = AST_parent_kind[k - kind_node]; + if (!k) + return; + break; + case aw_walk: + AST_walk_children(spec, data, *n); + return; + } + } +} diff --git a/src/AST_walk.h b/src/AST_walk.h new file mode 100644 index 0000000..9b4df38 --- /dev/null +++ b/src/AST_walk.h @@ -0,0 +1,69 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef AST_WALK_H +#define AST_WALK_H + +/* A generic, OO-ish AST walker. + This is probably a visitor, for those into that kind of thing. + The walker functions receive a node * rather than a node, + so can modify the tree during the walk. This allows, e.g., + cloning the AST. +*/ + +/* Untyped to make declaration easier. Actual signature is + AST_walker_result AST_walker_fn(AST_walker spec, void *data, + *n); + Note: the aw_walk and aw_call_parent results will be applied to + *n after the walker function returns, not to the orignal node. +*/ +typedef enum { + aw_walk, /* walk children */ + aw_call_parent, /* call parent function */ + aw_done /* don't walk children */ +} AST_walker_result; + +typedef AST_walker_result (*AST_walker_fn)(); +typedef struct AST_walker *AST_walker; + +AST_walker new_AST_walker(region r); +/* Effcts: creates a new AST walker in region r. Default behaviour + is to just walk through the children (i.e., a function returning + aw_walk) */ + +void AST_walker_handle(AST_walker spec, AST_kind kind, AST_walker_fn fn); +/* Effects: Sets walker function for node kind and all its children to + fn +*/ + +/* Recursive walk from n */ +void AST_walk(AST_walker spec, void *data, node *n); + +void AST_walk_list(AST_walker spec, void *data, node *n); +/* Effects: Walks through the list starting at *n + The walkers "divert" AST_walk_list if they modify the + node or node pointer they receive. +*/ + +/* Walk children of n */ +void AST_walk_children(AST_walker spec, void *data, node n); + +/* Just execute the walker function for node-type 'kind' */ +AST_walker_result AST_walker_call(AST_walker spec, AST_kind kind, + void *data, node *n); + +#endif diff --git a/src/AST_walk_children.c b/src/AST_walk_children.c new file mode 100644 index 0000000..8e86b80 --- /dev/null +++ b/src/AST_walk_children.c @@ -0,0 +1,864 @@ +/* Automatically generated from nodetypes.def, do not edit. */ + +/* See the copyright notice in nodetypes.def */ +case kind_asm_decl: { + asm_decl x = CAST(asm_decl, n); + + AST_walk_list(s, d, (node *)&x->asm_stmt); + break; +} +case kind_data_decl: { + data_decl x = CAST(data_decl, n); + + AST_walk_list(s, d, (node *)&x->modifiers); + AST_walk_list(s, d, (node *)&x->decls); + break; +} +case kind_extension_decl: { + extension_decl x = CAST(extension_decl, n); + + AST_walk_list(s, d, (node *)&x->decl); + break; +} +case kind_enumerator: { + enumerator x = CAST(enumerator, n); + + AST_walk_list(s, d, (node *)&x->arg1); + break; +} +case kind_function_decl: { + function_decl x = CAST(function_decl, n); + + AST_walk_list(s, d, (node *)&x->declarator); + AST_walk_list(s, d, (node *)&x->modifiers); + AST_walk_list(s, d, (node *)&x->attributes); + AST_walk_list(s, d, (node *)&x->stmt); + break; +} +case kind_variable_decl: { + variable_decl x = CAST(variable_decl, n); + + AST_walk_list(s, d, (node *)&x->declarator); + AST_walk_list(s, d, (node *)&x->attributes); + AST_walk_list(s, d, (node *)&x->arg1); + AST_walk_list(s, d, (node *)&x->asm_stmt); + break; +} +case kind_field_decl: { + field_decl x = CAST(field_decl, n); + + AST_walk_list(s, d, (node *)&x->declarator); + AST_walk_list(s, d, (node *)&x->attributes); + AST_walk_list(s, d, (node *)&x->arg1); + break; +} +case kind_asttype: { + asttype x = CAST(asttype, n); + + AST_walk_list(s, d, (node *)&x->declarator); + AST_walk_list(s, d, (node *)&x->qualifiers); + break; +} +case kind_typeof_expr: { + typeof_expr x = CAST(typeof_expr, n); + + AST_walk_list(s, d, (node *)&x->arg1); + break; +} +case kind_typeof_type: { + typeof_type x = CAST(typeof_type, n); + + AST_walk_list(s, d, (node *)&x->asttype); + break; +} +case kind_attribute: { + attribute x = CAST(attribute, n); + + AST_walk_list(s, d, (node *)&x->word1); + break; +} +case kind_gcc_attribute: { + gcc_attribute x = CAST(gcc_attribute, n); + + AST_walk_list(s, d, (node *)&x->word1); + AST_walk_list(s, d, (node *)&x->args); + break; +} +case kind_tag_ref: { + tag_ref x = CAST(tag_ref, n); + + AST_walk_list(s, d, (node *)&x->word1); + AST_walk_list(s, d, (node *)&x->attributes); + AST_walk_list(s, d, (node *)&x->fields); + break; +} +case kind_struct_ref: { + struct_ref x = CAST(struct_ref, n); + + AST_walk_list(s, d, (node *)&x->word1); + AST_walk_list(s, d, (node *)&x->attributes); + AST_walk_list(s, d, (node *)&x->fields); + break; +} +case kind_union_ref: { + union_ref x = CAST(union_ref, n); + + AST_walk_list(s, d, (node *)&x->word1); + AST_walk_list(s, d, (node *)&x->attributes); + AST_walk_list(s, d, (node *)&x->fields); + break; +} +case kind_nested_declarator: { + nested_declarator x = CAST(nested_declarator, n); + + AST_walk_list(s, d, (node *)&x->declarator); + break; +} +case kind_function_declarator: { + function_declarator x = CAST(function_declarator, n); + + AST_walk_list(s, d, (node *)&x->declarator); + AST_walk_list(s, d, (node *)&x->parms); + AST_walk_list(s, d, (node *)&x->gparms); + AST_walk_list(s, d, (node *)&x->qualifiers); + AST_walk_list(s, d, (node *)&x->return_type); + break; +} +case kind_pointer_declarator: { + pointer_declarator x = CAST(pointer_declarator, n); + + AST_walk_list(s, d, (node *)&x->declarator); + break; +} +case kind_qualified_declarator: { + qualified_declarator x = CAST(qualified_declarator, n); + + AST_walk_list(s, d, (node *)&x->declarator); + AST_walk_list(s, d, (node *)&x->modifiers); + break; +} +case kind_array_declarator: { + array_declarator x = CAST(array_declarator, n); + + AST_walk_list(s, d, (node *)&x->declarator); + AST_walk_list(s, d, (node *)&x->arg1); + break; +} +case kind_asm_stmt: { + asm_stmt x = CAST(asm_stmt, n); + + AST_walk_list(s, d, (node *)&x->arg1); + AST_walk_list(s, d, (node *)&x->asm_operands1); + AST_walk_list(s, d, (node *)&x->asm_operands2); + AST_walk_list(s, d, (node *)&x->asm_clobbers); + AST_walk_list(s, d, (node *)&x->qualifiers); + break; +} +case kind_compound_stmt: { + compound_stmt x = CAST(compound_stmt, n); + + AST_walk_list(s, d, (node *)&x->id_labels); + AST_walk_list(s, d, (node *)&x->decls); + AST_walk_list(s, d, (node *)&x->stmts); + break; +} +case kind_if_stmt: { + if_stmt x = CAST(if_stmt, n); + + AST_walk_list(s, d, (node *)&x->condition); + AST_walk_list(s, d, (node *)&x->stmt1); + AST_walk_list(s, d, (node *)&x->stmt2); + break; +} +case kind_labeled_stmt: { + labeled_stmt x = CAST(labeled_stmt, n); + + AST_walk_list(s, d, (node *)&x->label); + AST_walk_list(s, d, (node *)&x->stmt); + break; +} +case kind_expression_stmt: { + expression_stmt x = CAST(expression_stmt, n); + + AST_walk_list(s, d, (node *)&x->arg1); + break; +} +case kind_conditional_stmt: { + conditional_stmt x = CAST(conditional_stmt, n); + + AST_walk_list(s, d, (node *)&x->condition); + AST_walk_list(s, d, (node *)&x->stmt); + break; +} +case kind_switch_stmt: { + switch_stmt x = CAST(switch_stmt, n); + + AST_walk_list(s, d, (node *)&x->condition); + AST_walk_list(s, d, (node *)&x->stmt); + break; +} +case kind_for_stmt: { + for_stmt x = CAST(for_stmt, n); + + AST_walk_list(s, d, (node *)&x->arg1); + AST_walk_list(s, d, (node *)&x->arg2); + AST_walk_list(s, d, (node *)&x->arg3); + AST_walk_list(s, d, (node *)&x->stmt); + break; +} +case kind_return_stmt: { + return_stmt x = CAST(return_stmt, n); + + AST_walk_list(s, d, (node *)&x->arg1); + break; +} +case kind_goto_stmt: { + goto_stmt x = CAST(goto_stmt, n); + + AST_walk_list(s, d, (node *)&x->id_label); + break; +} +case kind_computed_goto_stmt: { + computed_goto_stmt x = CAST(computed_goto_stmt, n); + + AST_walk_list(s, d, (node *)&x->arg1); + break; +} +case kind_unary: { + unary x = CAST(unary, n); + + AST_walk_list(s, d, (node *)&x->arg1); + break; +} +case kind_binary: { + binary x = CAST(binary, n); + + AST_walk_list(s, d, (node *)&x->arg1); + AST_walk_list(s, d, (node *)&x->arg2); + break; +} +case kind_comma: { + comma x = CAST(comma, n); + + AST_walk_list(s, d, (node *)&x->arg1); + break; +} +case kind_sizeof_type: { + sizeof_type x = CAST(sizeof_type, n); + + AST_walk_list(s, d, (node *)&x->asttype); + break; +} +case kind_alignof_type: { + alignof_type x = CAST(alignof_type, n); + + AST_walk_list(s, d, (node *)&x->asttype); + break; +} +case kind_label_address: { + label_address x = CAST(label_address, n); + + AST_walk_list(s, d, (node *)&x->id_label); + break; +} +case kind_cast: { + cast x = CAST(cast, n); + + AST_walk_list(s, d, (node *)&x->arg1); + AST_walk_list(s, d, (node *)&x->asttype); + break; +} +case kind_cast_list: { + cast_list x = CAST(cast_list, n); + + AST_walk_list(s, d, (node *)&x->asttype); + AST_walk_list(s, d, (node *)&x->init_expr); + break; +} +case kind_conditional: { + conditional x = CAST(conditional, n); + + AST_walk_list(s, d, (node *)&x->condition); + AST_walk_list(s, d, (node *)&x->arg1); + AST_walk_list(s, d, (node *)&x->arg2); + break; +} +case kind_compound_expr: { + compound_expr x = CAST(compound_expr, n); + + AST_walk_list(s, d, (node *)&x->stmt); + break; +} +case kind_function_call: { + function_call x = CAST(function_call, n); + + AST_walk_list(s, d, (node *)&x->arg1); + AST_walk_list(s, d, (node *)&x->args); + break; +} +case kind_field_ref: { + field_ref x = CAST(field_ref, n); + + AST_walk_list(s, d, (node *)&x->arg1); + break; +} +case kind_increment: { + increment x = CAST(increment, n); + + AST_walk_list(s, d, (node *)&x->arg1); + break; +} +case kind_comparison: { + comparison x = CAST(comparison, n); + + AST_walk_list(s, d, (node *)&x->arg1); + AST_walk_list(s, d, (node *)&x->arg2); + break; +} +case kind_assignment: { + assignment x = CAST(assignment, n); + + AST_walk_list(s, d, (node *)&x->arg1); + AST_walk_list(s, d, (node *)&x->arg2); + break; +} +case kind_init_list: { + init_list x = CAST(init_list, n); + + AST_walk_list(s, d, (node *)&x->args); + break; +} +case kind_init_specific: { + init_specific x = CAST(init_specific, n); + + AST_walk_list(s, d, (node *)&x->designator); + AST_walk_list(s, d, (node *)&x->init_expr); + break; +} +case kind_designate_index: { + designate_index x = CAST(designate_index, n); + + AST_walk_list(s, d, (node *)&x->arg1); + AST_walk_list(s, d, (node *)&x->arg2); + break; +} +case kind_string: { + string x = CAST(string, n); + + AST_walk_list(s, d, (node *)&x->strings); + break; +} +case kind_case_label: { + case_label x = CAST(case_label, n); + + AST_walk_list(s, d, (node *)&x->arg1); + AST_walk_list(s, d, (node *)&x->arg2); + break; +} +case kind_asm_operand: { + asm_operand x = CAST(asm_operand, n); + + AST_walk_list(s, d, (node *)&x->word1); + AST_walk_list(s, d, (node *)&x->string); + AST_walk_list(s, d, (node *)&x->arg1); + break; +} +case kind_nesc_decl: { + nesc_decl x = CAST(nesc_decl, n); + + AST_walk_list(s, d, (node *)&x->word1); + AST_walk_list(s, d, (node *)&x->attributes); + break; +} +case kind_interface: { + interface x = CAST(interface, n); + + AST_walk_list(s, d, (node *)&x->word1); + AST_walk_list(s, d, (node *)&x->attributes); + AST_walk_list(s, d, (node *)&x->decls); + break; +} +case kind_component: { + component x = CAST(component, n); + + AST_walk_list(s, d, (node *)&x->word1); + AST_walk_list(s, d, (node *)&x->attributes); + AST_walk_list(s, d, (node *)&x->parms); + AST_walk_list(s, d, (node *)&x->decls); + AST_walk_list(s, d, (node *)&x->implementation); + break; +} +case kind_configuration: { + configuration x = CAST(configuration, n); + + AST_walk_list(s, d, (node *)&x->decls); + break; +} +case kind_module: { + module x = CAST(module, n); + + AST_walk_list(s, d, (node *)&x->decls); + break; +} +case kind_rp_interface: { + rp_interface x = CAST(rp_interface, n); + + AST_walk_list(s, d, (node *)&x->decls); + break; +} +case kind_interface_ref: { + interface_ref x = CAST(interface_ref, n); + + AST_walk_list(s, d, (node *)&x->word1); + AST_walk_list(s, d, (node *)&x->args); + AST_walk_list(s, d, (node *)&x->word2); + AST_walk_list(s, d, (node *)&x->gparms); + AST_walk_list(s, d, (node *)&x->attributes); + break; +} +case kind_component_ref: { + component_ref x = CAST(component_ref, n); + + AST_walk_list(s, d, (node *)&x->word1); + AST_walk_list(s, d, (node *)&x->word2); + AST_walk_list(s, d, (node *)&x->args); + break; +} +case kind_connection: { + connection x = CAST(connection, n); + + AST_walk_list(s, d, (node *)&x->ep1); + AST_walk_list(s, d, (node *)&x->ep2); + break; +} +case kind_endpoint: { + endpoint x = CAST(endpoint, n); + + AST_walk_list(s, d, (node *)&x->ids); + break; +} +case kind_parameterised_identifier: { + parameterised_identifier x = CAST(parameterised_identifier, n); + + AST_walk_list(s, d, (node *)&x->word1); + AST_walk_list(s, d, (node *)&x->args); + break; +} +case kind_generic_declarator: { + generic_declarator x = CAST(generic_declarator, n); + + AST_walk_list(s, d, (node *)&x->declarator); + AST_walk_list(s, d, (node *)&x->parms); + break; +} +case kind_generic_call: { + generic_call x = CAST(generic_call, n); + + AST_walk_list(s, d, (node *)&x->arg1); + AST_walk_list(s, d, (node *)&x->args); + break; +} +case kind_interface_ref_declarator: { + interface_ref_declarator x = CAST(interface_ref_declarator, n); + + AST_walk_list(s, d, (node *)&x->declarator); + AST_walk_list(s, d, (node *)&x->word1); + break; +} +case kind_interface_deref: { + interface_deref x = CAST(interface_deref, n); + + AST_walk_list(s, d, (node *)&x->arg1); + break; +} +case kind_component_deref: { + component_deref x = CAST(component_deref, n); + + AST_walk_list(s, d, (node *)&x->arg1); + break; +} +case kind_atomic_stmt: { + atomic_stmt x = CAST(atomic_stmt, n); + + AST_walk_list(s, d, (node *)&x->stmt); + break; +} +case kind_nesc_attribute: { + nesc_attribute x = CAST(nesc_attribute, n); + + AST_walk_list(s, d, (node *)&x->word1); + AST_walk_list(s, d, (node *)&x->arg1); + break; +} +case kind_type_argument: { + type_argument x = CAST(type_argument, n); + + AST_walk_list(s, d, (node *)&x->asttype); + break; +} +case kind_attribute_ref: { + attribute_ref x = CAST(attribute_ref, n); + + AST_walk_list(s, d, (node *)&x->word1); + AST_walk_list(s, d, (node *)&x->attributes); + AST_walk_list(s, d, (node *)&x->fields); + break; +} +case kind_enum_ref: { + enum_ref x = CAST(enum_ref, n); + + AST_walk_list(s, d, (node *)&x->word1); + AST_walk_list(s, d, (node *)&x->attributes); + AST_walk_list(s, d, (node *)&x->fields); + break; +} +case kind_while_stmt: { + while_stmt x = CAST(while_stmt, n); + + AST_walk_list(s, d, (node *)&x->condition); + AST_walk_list(s, d, (node *)&x->stmt); + break; +} +case kind_dowhile_stmt: { + dowhile_stmt x = CAST(dowhile_stmt, n); + + AST_walk_list(s, d, (node *)&x->condition); + AST_walk_list(s, d, (node *)&x->stmt); + break; +} +case kind_array_ref: { + array_ref x = CAST(array_ref, n); + + AST_walk_list(s, d, (node *)&x->arg1); + AST_walk_list(s, d, (node *)&x->arg2); + break; +} +case kind_dereference: { + dereference x = CAST(dereference, n); + + AST_walk_list(s, d, (node *)&x->arg1); + break; +} +case kind_extension_expr: { + extension_expr x = CAST(extension_expr, n); + + AST_walk_list(s, d, (node *)&x->arg1); + break; +} +case kind_sizeof_expr: { + sizeof_expr x = CAST(sizeof_expr, n); + + AST_walk_list(s, d, (node *)&x->arg1); + break; +} +case kind_alignof_expr: { + alignof_expr x = CAST(alignof_expr, n); + + AST_walk_list(s, d, (node *)&x->arg1); + break; +} +case kind_realpart: { + realpart x = CAST(realpart, n); + + AST_walk_list(s, d, (node *)&x->arg1); + break; +} +case kind_imagpart: { + imagpart x = CAST(imagpart, n); + + AST_walk_list(s, d, (node *)&x->arg1); + break; +} +case kind_address_of: { + address_of x = CAST(address_of, n); + + AST_walk_list(s, d, (node *)&x->arg1); + break; +} +case kind_unary_minus: { + unary_minus x = CAST(unary_minus, n); + + AST_walk_list(s, d, (node *)&x->arg1); + break; +} +case kind_unary_plus: { + unary_plus x = CAST(unary_plus, n); + + AST_walk_list(s, d, (node *)&x->arg1); + break; +} +case kind_conjugate: { + conjugate x = CAST(conjugate, n); + + AST_walk_list(s, d, (node *)&x->arg1); + break; +} +case kind_bitnot: { + bitnot x = CAST(bitnot, n); + + AST_walk_list(s, d, (node *)&x->arg1); + break; +} +case kind_not: { + not x = CAST(not, n); + + AST_walk_list(s, d, (node *)&x->arg1); + break; +} +case kind_preincrement: { + preincrement x = CAST(preincrement, n); + + AST_walk_list(s, d, (node *)&x->arg1); + break; +} +case kind_predecrement: { + predecrement x = CAST(predecrement, n); + + AST_walk_list(s, d, (node *)&x->arg1); + break; +} +case kind_postincrement: { + postincrement x = CAST(postincrement, n); + + AST_walk_list(s, d, (node *)&x->arg1); + break; +} +case kind_postdecrement: { + postdecrement x = CAST(postdecrement, n); + + AST_walk_list(s, d, (node *)&x->arg1); + break; +} +case kind_plus: { + plus x = CAST(plus, n); + + AST_walk_list(s, d, (node *)&x->arg1); + AST_walk_list(s, d, (node *)&x->arg2); + break; +} +case kind_minus: { + minus x = CAST(minus, n); + + AST_walk_list(s, d, (node *)&x->arg1); + AST_walk_list(s, d, (node *)&x->arg2); + break; +} +case kind_times: { + times x = CAST(times, n); + + AST_walk_list(s, d, (node *)&x->arg1); + AST_walk_list(s, d, (node *)&x->arg2); + break; +} +case kind_divide: { + divide x = CAST(divide, n); + + AST_walk_list(s, d, (node *)&x->arg1); + AST_walk_list(s, d, (node *)&x->arg2); + break; +} +case kind_modulo: { + modulo x = CAST(modulo, n); + + AST_walk_list(s, d, (node *)&x->arg1); + AST_walk_list(s, d, (node *)&x->arg2); + break; +} +case kind_lshift: { + lshift x = CAST(lshift, n); + + AST_walk_list(s, d, (node *)&x->arg1); + AST_walk_list(s, d, (node *)&x->arg2); + break; +} +case kind_rshift: { + rshift x = CAST(rshift, n); + + AST_walk_list(s, d, (node *)&x->arg1); + AST_walk_list(s, d, (node *)&x->arg2); + break; +} +case kind_leq: { + leq x = CAST(leq, n); + + AST_walk_list(s, d, (node *)&x->arg1); + AST_walk_list(s, d, (node *)&x->arg2); + break; +} +case kind_geq: { + geq x = CAST(geq, n); + + AST_walk_list(s, d, (node *)&x->arg1); + AST_walk_list(s, d, (node *)&x->arg2); + break; +} +case kind_lt: { + lt x = CAST(lt, n); + + AST_walk_list(s, d, (node *)&x->arg1); + AST_walk_list(s, d, (node *)&x->arg2); + break; +} +case kind_gt: { + gt x = CAST(gt, n); + + AST_walk_list(s, d, (node *)&x->arg1); + AST_walk_list(s, d, (node *)&x->arg2); + break; +} +case kind_eq: { + eq x = CAST(eq, n); + + AST_walk_list(s, d, (node *)&x->arg1); + AST_walk_list(s, d, (node *)&x->arg2); + break; +} +case kind_ne: { + ne x = CAST(ne, n); + + AST_walk_list(s, d, (node *)&x->arg1); + AST_walk_list(s, d, (node *)&x->arg2); + break; +} +case kind_bitand: { + bitand x = CAST(bitand, n); + + AST_walk_list(s, d, (node *)&x->arg1); + AST_walk_list(s, d, (node *)&x->arg2); + break; +} +case kind_bitor: { + bitor x = CAST(bitor, n); + + AST_walk_list(s, d, (node *)&x->arg1); + AST_walk_list(s, d, (node *)&x->arg2); + break; +} +case kind_bitxor: { + bitxor x = CAST(bitxor, n); + + AST_walk_list(s, d, (node *)&x->arg1); + AST_walk_list(s, d, (node *)&x->arg2); + break; +} +case kind_andand: { + andand x = CAST(andand, n); + + AST_walk_list(s, d, (node *)&x->arg1); + AST_walk_list(s, d, (node *)&x->arg2); + break; +} +case kind_oror: { + oror x = CAST(oror, n); + + AST_walk_list(s, d, (node *)&x->arg1); + AST_walk_list(s, d, (node *)&x->arg2); + break; +} +case kind_assign: { + assign x = CAST(assign, n); + + AST_walk_list(s, d, (node *)&x->arg1); + AST_walk_list(s, d, (node *)&x->arg2); + break; +} +case kind_plus_assign: { + plus_assign x = CAST(plus_assign, n); + + AST_walk_list(s, d, (node *)&x->arg1); + AST_walk_list(s, d, (node *)&x->arg2); + break; +} +case kind_minus_assign: { + minus_assign x = CAST(minus_assign, n); + + AST_walk_list(s, d, (node *)&x->arg1); + AST_walk_list(s, d, (node *)&x->arg2); + break; +} +case kind_times_assign: { + times_assign x = CAST(times_assign, n); + + AST_walk_list(s, d, (node *)&x->arg1); + AST_walk_list(s, d, (node *)&x->arg2); + break; +} +case kind_divide_assign: { + divide_assign x = CAST(divide_assign, n); + + AST_walk_list(s, d, (node *)&x->arg1); + AST_walk_list(s, d, (node *)&x->arg2); + break; +} +case kind_modulo_assign: { + modulo_assign x = CAST(modulo_assign, n); + + AST_walk_list(s, d, (node *)&x->arg1); + AST_walk_list(s, d, (node *)&x->arg2); + break; +} +case kind_lshift_assign: { + lshift_assign x = CAST(lshift_assign, n); + + AST_walk_list(s, d, (node *)&x->arg1); + AST_walk_list(s, d, (node *)&x->arg2); + break; +} +case kind_rshift_assign: { + rshift_assign x = CAST(rshift_assign, n); + + AST_walk_list(s, d, (node *)&x->arg1); + AST_walk_list(s, d, (node *)&x->arg2); + break; +} +case kind_bitand_assign: { + bitand_assign x = CAST(bitand_assign, n); + + AST_walk_list(s, d, (node *)&x->arg1); + AST_walk_list(s, d, (node *)&x->arg2); + break; +} +case kind_bitor_assign: { + bitor_assign x = CAST(bitor_assign, n); + + AST_walk_list(s, d, (node *)&x->arg1); + AST_walk_list(s, d, (node *)&x->arg2); + break; +} +case kind_bitxor_assign: { + bitxor_assign x = CAST(bitxor_assign, n); + + AST_walk_list(s, d, (node *)&x->arg1); + AST_walk_list(s, d, (node *)&x->arg2); + break; +} +case kind_rp_connection: { + rp_connection x = CAST(rp_connection, n); + + AST_walk_list(s, d, (node *)&x->ep1); + AST_walk_list(s, d, (node *)&x->ep2); + break; +} +case kind_eq_connection: { + eq_connection x = CAST(eq_connection, n); + + AST_walk_list(s, d, (node *)&x->ep1); + AST_walk_list(s, d, (node *)&x->ep2); + break; +} +case kind_nx_struct_ref: { + nx_struct_ref x = CAST(nx_struct_ref, n); + + AST_walk_list(s, d, (node *)&x->word1); + AST_walk_list(s, d, (node *)&x->attributes); + AST_walk_list(s, d, (node *)&x->fields); + break; +} +case kind_nx_union_ref: { + nx_union_ref x = CAST(nx_union_ref, n); + + AST_walk_list(s, d, (node *)&x->word1); + AST_walk_list(s, d, (node *)&x->attributes); + AST_walk_list(s, d, (node *)&x->fields); + break; +} diff --git a/src/COPYING b/src/COPYING new file mode 100644 index 0000000..60549be --- /dev/null +++ b/src/COPYING @@ -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. + + + Copyright (C) 19yy + + 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. + + , 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. diff --git a/src/COPYRIGHT b/src/COPYRIGHT new file mode 100644 index 0000000..27d2aa0 --- /dev/null +++ b/src/COPYRIGHT @@ -0,0 +1,18 @@ +The nesC compiler is derived from RC and the GNU C Compiler. It is thus + Copyright (C) 1987, 88, 89, 92-7, 1998 Free Software Foundation, Inc. + Copyright (C) 2000-2001 The Regents of the University of California. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. diff --git a/src/Makefile.am b/src/Makefile.am new file mode 100644 index 0000000..34b4281 --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,318 @@ +## Process this file with automake to produce Makefile.in -*- makefile -*- + +# This file is part of the nesC compiler. +# +# This file is derived from the RC Compiler. It is thus +# Copyright (C) 2000-2001 The Regents of the University of California. +# Changes for nesC are +# Copyright (C) 2002 Intel Corporation +# +# The attached "nesC" software is provided to you under the terms and +# conditions of the GNU General Public License Version 2 as published by the +# Free Software Foundation. +# +# nesC 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 nesC; see the file COPYING. If not, write to +# the Free Software Foundation, 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + + +AUTOMAKE_OPTIONS = foreign + +if USING_RCC +regiondir = lib +else +SUBDIRS = libcompat +regiondir = libcompat +endif + +extra_inc := + +if NEED_REGEX +extra_inc += -Ilibcompat/regex +endif + +if NEED_FNMATCH +extra_inc += -Ilibcompat/fnmatch +endif + +ncclibdir=$(libdir)/ncc + +INCLUDES = $(regionflags) -I$(srcdir)/$(regiondir) -I$(srcdir)/../libcpp/include -I$(srcdir)/../libcpp -I$(srcdir)/../include $(extra_inc) + +noinst_LIBRARIES = libparser.a +ncclib_PROGRAMS = nesc1 +ncclib_DATA = tdspecs +ncclib_SCRIPTS = nesc-compile + +libregions = $(regiondir)/libregions.a + +libparser_a_SOURCES = \ + AST.c \ + AST.h \ + AST_list_node.h \ + AST_types.h \ + AST_utils.c \ + AST_utils.h \ + AST_walk.c \ + AST_walk.h \ + ND_list_nd_arg.h \ + ND_types.h \ + array.h \ + array.c \ + attributes.h \ + attributes.c \ + c-gperf.h \ + c-lex.c \ + c-lex.h \ + c-lex-int.h \ + c-lex-state.h \ + c-parse.h \ + c-parse.tab.h \ + c-parse.tab.c \ + constants.c \ + constants.h \ + cstring.h \ + cval.h \ + cval.c \ + decls.h \ + dd_list.c \ + dd_list.h \ + dhash.c \ + dhash.h \ + edit.c \ + edit.h \ + env.c \ + env.h \ + errors.c \ + errors.h \ + expr.c \ + expr.h \ + flags.c \ + flags.h \ + gcc-cpp.h \ + graph.c \ + graph.h \ + init.c \ + init.h \ + lex.nd.c \ + machine.c \ + machine.h \ + nconfig.h \ + nesc-abstract.c \ + nesc-abstract.h \ + nesc-atomic.c \ + nesc-atomic.h \ + nesc-attributes.c \ + nesc-attributes.h \ + nesc-c.c \ + nesc-c.h \ + nesc-cg.c \ + nesc-cg.h \ + nesc-component.c \ + nesc-component.h \ + nesc-concurrency.c \ + nesc-concurrency.h \ + nesc-configuration.c \ + nesc-configuration.h \ + nesc-constants.c \ + nesc-constants.h \ + nesc-cpp.c \ + nesc-cpp.h \ + nesc-decls.h \ + nesc-deputy.c \ + nesc-deputy.h \ + nesc-dfilter.c \ + nesc-dfilter.h \ + nesc-doc.c \ + nesc-doc.h \ + nesc-dspec.h \ + nesc-dspec-int.h \ + nesc-dspec.tab.c \ + nesc-dspec.tab.h \ + nesc-dump.c \ + nesc-dump.h \ + nesc-env.c \ + nesc-env.h \ + nesc-gcc.c \ + nesc-gcc.h \ + nesc-generate.c \ + nesc-generate.h \ + nesc-inline.c \ + nesc-inline.h \ + nesc-interface.c \ + nesc-interface.h \ + nesc-keywords.h \ + nesc-magic.c \ + nesc-magic.h \ + nesc-main.c \ + nesc-main.h \ + nesc-module.c \ + nesc-module.h \ + nesc-msg.c \ + nesc-msg.h \ + nesc-ndoc.c \ + nesc-ndoc.h \ + nesc-network.c \ + nesc-network.h \ + nesc-paths.c \ + nesc-paths.h \ + nesc-semantics.c \ + nesc-semantics.h \ + nesc-task.c \ + nesc-task.h \ + nesc-uses.c \ + nesc-uses.h \ + nesc-xml.c \ + nesc-xml.h \ + parser.h \ + qualifiers.h \ + sd_list.c \ + sd_list.h \ + semantics.c \ + semantics.h \ + stmt.c \ + stmt.h \ + types.c \ + types.h \ + unparse.c \ + unparse.h \ + utils.c \ + utils.h \ + machine/keil-gperf.h \ + machine/sdcc-gperf.h + +# Character encoding conversion library. +LIBICONV = @LIBICONV@ +LIBICONV_DEP = @LIBICONV_DEP@ + +nesc1_SOURCES = toplev.c +nesc1_LDADD = libparser.a \ + $(libregions) \ + ../libcpp/libcpp.a \ + ../libiberty/libiberty.a \ + -lm \ + $(LIBICONV) + +BUILT_SOURCES = \ + AST_defs.h \ + AST_list_node.c \ + AST_list_node.h \ + AST_parent.c \ + AST_print.c \ + AST_types.c \ + AST_types.h \ + AST_walk_children.c \ + ND_defs.h \ + ND_list_nd_arg.c \ + ND_list_nd_arg.h \ + ND_types.c \ + ND_types.h \ + c-gperf.h \ + c-parse.tab.c \ + c-parse.tab.h \ + lex.nd.c \ + nesc-dspec.tab.c \ + nesc-dspec.tab.h \ + machine/keil-gperf.h \ + machine/sdcc-gperf.h + +EXTRA_DIST = \ + build-basics.el \ + build-list.el \ + build-parent.el \ + build-print.el \ + build-types.el \ + build-walk.el \ + c-parse.gperf \ + c-parse.y \ + cg_help.c \ + cg_help.fig \ + nodetypes.def \ + AST_defs.h \ + AST_list_node.c \ + AST_parent.c \ + AST_print.c \ + AST_types.c \ + AST_walk_children.c \ + ND_defs.h \ + ND_list_nd_arg.c \ + ND_types.c \ + machine/self.c \ + machine/avr.c \ + machine/env_machine.c \ + machine/msp430.c \ + machine/keil.c \ + machine/keil.gperf \ + machine/sdcc.c \ + machine/sdcc.gperf \ + nesc-dspec.def \ + nesc-dspec.l \ + nesc-dspec.y \ + tdspecs \ + nesc-compile \ + COPYING \ + COPYRIGHT \ + .gdbinit + +BISON = bison +FLEX = flex +EMACS = emacs +M4 = m4 +GPERF = gperf + +$(srcdir)/c-parse.tab.c $(srcdir)/c-parse.tab.h: c-parse.y + $(BISON) $(BISONFLAGS) -dv $< + +$(srcdir)/nesc-dspec.tab.c $(srcdir)/nesc-dspec.tab.h: nesc-dspec.y + $(BISON) $(BISONFLAGS) -p nd -dv $< + +$(srcdir)/lex.nd.c: nesc-dspec.l + $(FLEX) -Pnd -s $< + +$(srcdir)/ND_types.c $(srcdir)/ND_types.h $(srcdir)/ND_defs.h: build-types.el nesc-dspec.def build-basics.el + cd $(srcdir) && $(EMACS) $(EMACSFLAGS) -batch -load build-types.el ND nesc-dspec.def 10000 + +$(srcdir)/ND_list_nd_arg.c $(srcdir)/ND_list_nd_arg.h: build-list.el nesc-dspec.def build-basics.el + cd $(srcdir) && $(EMACS) $(EMACSFLAGS) -batch -load build-list.el ND nesc-dspec.def nd_arg + +$(srcdir)/AST_types.c $(srcdir)/AST_types.h $(srcdir)/AST_defs.h: build-types.el nodetypes.def build-basics.el + cd $(srcdir) && $(EMACS) $(EMACSFLAGS) -batch -load build-types.el AST nodetypes.def 42 + +$(srcdir)/AST_list_node.c $(srcdir)/AST_list_node.h: build-list.el nodetypes.def build-basics.el + cd $(srcdir) && $(EMACS) $(EMACSFLAGS) -batch -load build-list.el AST nodetypes.def node + +$(srcdir)/AST_parent.c: build-parent.el nodetypes.def build-basics.el + cd $(srcdir) && $(EMACS) $(EMACSFLAGS) -batch -load build-parent.el AST nodetypes.def + +$(srcdir)/AST_print.c: build-print.el nodetypes.def build-basics.el + cd $(srcdir) && $(EMACS) $(EMACSFLAGS) -batch -load build-print.el AST nodetypes.def + +$(srcdir)/AST_walk_children.c: build-walk.el nodetypes.def build-basics.el + cd $(srcdir) && $(EMACS) $(EMACSFLAGS) -batch -load build-walk.el AST nodetypes.def + +$(srcdir)/c-gperf.h: c-parse.gperf qualifiers.h nesc-keywords.h + cd $(srcdir) && $(M4) $(M4FLAGS) c-parse.gperf | grep -v '^$$' | \ + $(GPERF) $(GPERFFLAGS) -p -j1 -i 1 -g -o -t -G -N is_reserved_word -k1,3,8,$$ >$@- + mv $@- $@ + +$(srcdir)/machine/sdcc-gperf.h: machine/sdcc.gperf + $(GPERF) $(GPERFFLAGS) -j1 -t -E -H sdcc_hash -N is_sdcc_word -k1,3 machine/sdcc.gperf >$@- + mv $@- $@ + +$(srcdir)/machine/keil-gperf.h: machine/keil.gperf + $(GPERF) $(GPERFFLAGS) -j1 -t -E -H keil_hash -N is_keil_word -k1,3,$$ machine/keil.gperf >$@- + mv $@- $@ + +# Regression testing stuff + +testdoc: nesc-ndoc.c nesc-ndoc.h dd_list.c $(libregions) + $(COMPILE) -o $@ -DTESTING nesc-ndoc.c dd_list.c $(libregions) + +regress: nesc1 testdoc + (cd ../nregress && ./runtest) diff --git a/src/Makefile.in b/src/Makefile.in new file mode 100644 index 0000000..be8f38e --- /dev/null +++ b/src/Makefile.in @@ -0,0 +1,1135 @@ +# Makefile.in generated by automake 1.10 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# This file is part of the nesC compiler. +# +# This file is derived from the RC Compiler. It is thus +# Copyright (C) 2000-2001 The Regents of the University of California. +# Changes for nesC are +# Copyright (C) 2002 Intel Corporation +# +# The attached "nesC" software is provided to you under the terms and +# conditions of the GNU General Public License Version 2 as published by the +# Free Software Foundation. +# +# nesC 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 nesC; see the file COPYING. If not, write to +# the Free Software Foundation, 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + + + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +@NEED_REGEX_TRUE@am__append_1 = -Ilibcompat/regex +@NEED_FNMATCH_TRUE@am__append_2 = -Ilibcompat/fnmatch +ncclib_PROGRAMS = nesc1$(EXEEXT) +subdir = . +DIST_COMMON = $(am__configure_deps) \ + $(srcdir)/../config-aux/config.guess \ + $(srcdir)/../config-aux/config.rpath \ + $(srcdir)/../config-aux/config.sub \ + $(srcdir)/../config-aux/depcomp \ + $(srcdir)/../config-aux/install-sh \ + $(srcdir)/../config-aux/missing \ + $(srcdir)/../config-aux/mkinstalldirs $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(srcdir)/autoconf.h.in \ + $(top_srcdir)/configure ../config-aux/config.guess \ + ../config-aux/config.rpath ../config-aux/config.sub \ + ../config-aux/depcomp ../config-aux/install-sh \ + ../config-aux/missing ../config-aux/mkinstalldirs COPYING +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(SHELL) $(top_srcdir)/../config-aux/mkinstalldirs +CONFIG_HEADER = autoconf.h +CONFIG_CLEAN_FILES = +LIBRARIES = $(noinst_LIBRARIES) +AR = ar +ARFLAGS = cru +libparser_a_AR = $(AR) $(ARFLAGS) +libparser_a_LIBADD = +am_libparser_a_OBJECTS = AST.$(OBJEXT) AST_utils.$(OBJEXT) \ + AST_walk.$(OBJEXT) array.$(OBJEXT) attributes.$(OBJEXT) \ + c-lex.$(OBJEXT) c-parse.tab.$(OBJEXT) constants.$(OBJEXT) \ + cval.$(OBJEXT) dd_list.$(OBJEXT) dhash.$(OBJEXT) \ + edit.$(OBJEXT) env.$(OBJEXT) errors.$(OBJEXT) expr.$(OBJEXT) \ + flags.$(OBJEXT) graph.$(OBJEXT) init.$(OBJEXT) \ + lex.nd.$(OBJEXT) machine.$(OBJEXT) nesc-abstract.$(OBJEXT) \ + nesc-atomic.$(OBJEXT) nesc-attributes.$(OBJEXT) \ + nesc-c.$(OBJEXT) nesc-cg.$(OBJEXT) nesc-component.$(OBJEXT) \ + nesc-concurrency.$(OBJEXT) nesc-configuration.$(OBJEXT) \ + nesc-constants.$(OBJEXT) nesc-cpp.$(OBJEXT) \ + nesc-deputy.$(OBJEXT) nesc-dfilter.$(OBJEXT) \ + nesc-doc.$(OBJEXT) nesc-dspec.tab.$(OBJEXT) \ + nesc-dump.$(OBJEXT) nesc-env.$(OBJEXT) nesc-gcc.$(OBJEXT) \ + nesc-generate.$(OBJEXT) nesc-inline.$(OBJEXT) \ + nesc-interface.$(OBJEXT) nesc-magic.$(OBJEXT) \ + nesc-main.$(OBJEXT) nesc-module.$(OBJEXT) nesc-msg.$(OBJEXT) \ + nesc-ndoc.$(OBJEXT) nesc-network.$(OBJEXT) \ + nesc-paths.$(OBJEXT) nesc-semantics.$(OBJEXT) \ + nesc-task.$(OBJEXT) nesc-uses.$(OBJEXT) nesc-xml.$(OBJEXT) \ + sd_list.$(OBJEXT) semantics.$(OBJEXT) stmt.$(OBJEXT) \ + types.$(OBJEXT) unparse.$(OBJEXT) utils.$(OBJEXT) +libparser_a_OBJECTS = $(am_libparser_a_OBJECTS) +am__installdirs = "$(DESTDIR)$(ncclibdir)" "$(DESTDIR)$(ncclibdir)" \ + "$(DESTDIR)$(ncclibdir)" +ncclibPROGRAMS_INSTALL = $(INSTALL_PROGRAM) +PROGRAMS = $(ncclib_PROGRAMS) +am_nesc1_OBJECTS = toplev.$(OBJEXT) +nesc1_OBJECTS = $(am_nesc1_OBJECTS) +am__DEPENDENCIES_1 = +nesc1_DEPENDENCIES = libparser.a $(libregions) ../libcpp/libcpp.a \ + ../libiberty/libiberty.a $(am__DEPENDENCIES_1) +ncclibSCRIPT_INSTALL = $(INSTALL_SCRIPT) +SCRIPTS = $(ncclib_SCRIPTS) +DEFAULT_INCLUDES = -I.@am__isrc@ +depcomp = $(SHELL) $(top_srcdir)/../config-aux/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(libparser_a_SOURCES) $(nesc1_SOURCES) +DIST_SOURCES = $(libparser_a_SOURCES) $(nesc1_SOURCES) +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +ncclibDATA_INSTALL = $(INSTALL_DATA) +DATA = $(ncclib_DATA) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = libcompat +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + { test ! -d $(distdir) \ + || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -fr $(distdir); }; } +DIST_ARCHIVES = $(distdir).tar.gz +GZIP_ENV = --best +distuninstallcheck_listfiles = find . -type f -print +distcleancheck_listfiles = find . -type f -print +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ + +# Character encoding conversion library. +LIBICONV = @LIBICONV@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = foreign +@USING_RCC_FALSE@regiondir = libcompat +@USING_RCC_TRUE@regiondir = lib +@USING_RCC_FALSE@SUBDIRS = libcompat +extra_inc := $(am__append_1) $(am__append_2) +ncclibdir = $(libdir)/ncc +INCLUDES = $(regionflags) -I$(srcdir)/$(regiondir) -I$(srcdir)/../libcpp/include -I$(srcdir)/../libcpp -I$(srcdir)/../include $(extra_inc) +noinst_LIBRARIES = libparser.a +ncclib_DATA = tdspecs +ncclib_SCRIPTS = nesc-compile +libregions = $(regiondir)/libregions.a +libparser_a_SOURCES = \ + AST.c \ + AST.h \ + AST_list_node.h \ + AST_types.h \ + AST_utils.c \ + AST_utils.h \ + AST_walk.c \ + AST_walk.h \ + ND_list_nd_arg.h \ + ND_types.h \ + array.h \ + array.c \ + attributes.h \ + attributes.c \ + c-gperf.h \ + c-lex.c \ + c-lex.h \ + c-lex-int.h \ + c-lex-state.h \ + c-parse.h \ + c-parse.tab.h \ + c-parse.tab.c \ + constants.c \ + constants.h \ + cstring.h \ + cval.h \ + cval.c \ + decls.h \ + dd_list.c \ + dd_list.h \ + dhash.c \ + dhash.h \ + edit.c \ + edit.h \ + env.c \ + env.h \ + errors.c \ + errors.h \ + expr.c \ + expr.h \ + flags.c \ + flags.h \ + gcc-cpp.h \ + graph.c \ + graph.h \ + init.c \ + init.h \ + lex.nd.c \ + machine.c \ + machine.h \ + nconfig.h \ + nesc-abstract.c \ + nesc-abstract.h \ + nesc-atomic.c \ + nesc-atomic.h \ + nesc-attributes.c \ + nesc-attributes.h \ + nesc-c.c \ + nesc-c.h \ + nesc-cg.c \ + nesc-cg.h \ + nesc-component.c \ + nesc-component.h \ + nesc-concurrency.c \ + nesc-concurrency.h \ + nesc-configuration.c \ + nesc-configuration.h \ + nesc-constants.c \ + nesc-constants.h \ + nesc-cpp.c \ + nesc-cpp.h \ + nesc-decls.h \ + nesc-deputy.c \ + nesc-deputy.h \ + nesc-dfilter.c \ + nesc-dfilter.h \ + nesc-doc.c \ + nesc-doc.h \ + nesc-dspec.h \ + nesc-dspec-int.h \ + nesc-dspec.tab.c \ + nesc-dspec.tab.h \ + nesc-dump.c \ + nesc-dump.h \ + nesc-env.c \ + nesc-env.h \ + nesc-gcc.c \ + nesc-gcc.h \ + nesc-generate.c \ + nesc-generate.h \ + nesc-inline.c \ + nesc-inline.h \ + nesc-interface.c \ + nesc-interface.h \ + nesc-keywords.h \ + nesc-magic.c \ + nesc-magic.h \ + nesc-main.c \ + nesc-main.h \ + nesc-module.c \ + nesc-module.h \ + nesc-msg.c \ + nesc-msg.h \ + nesc-ndoc.c \ + nesc-ndoc.h \ + nesc-network.c \ + nesc-network.h \ + nesc-paths.c \ + nesc-paths.h \ + nesc-semantics.c \ + nesc-semantics.h \ + nesc-task.c \ + nesc-task.h \ + nesc-uses.c \ + nesc-uses.h \ + nesc-xml.c \ + nesc-xml.h \ + parser.h \ + qualifiers.h \ + sd_list.c \ + sd_list.h \ + semantics.c \ + semantics.h \ + stmt.c \ + stmt.h \ + types.c \ + types.h \ + unparse.c \ + unparse.h \ + utils.c \ + utils.h \ + machine/keil-gperf.h \ + machine/sdcc-gperf.h + +LIBICONV_DEP = @LIBICONV_DEP@ +nesc1_SOURCES = toplev.c +nesc1_LDADD = libparser.a \ + $(libregions) \ + ../libcpp/libcpp.a \ + ../libiberty/libiberty.a \ + -lm \ + $(LIBICONV) + +BUILT_SOURCES = \ + AST_defs.h \ + AST_list_node.c \ + AST_list_node.h \ + AST_parent.c \ + AST_print.c \ + AST_types.c \ + AST_types.h \ + AST_walk_children.c \ + ND_defs.h \ + ND_list_nd_arg.c \ + ND_list_nd_arg.h \ + ND_types.c \ + ND_types.h \ + c-gperf.h \ + c-parse.tab.c \ + c-parse.tab.h \ + lex.nd.c \ + nesc-dspec.tab.c \ + nesc-dspec.tab.h \ + machine/keil-gperf.h \ + machine/sdcc-gperf.h + +EXTRA_DIST = \ + build-basics.el \ + build-list.el \ + build-parent.el \ + build-print.el \ + build-types.el \ + build-walk.el \ + c-parse.gperf \ + c-parse.y \ + cg_help.c \ + cg_help.fig \ + nodetypes.def \ + AST_defs.h \ + AST_list_node.c \ + AST_parent.c \ + AST_print.c \ + AST_types.c \ + AST_walk_children.c \ + ND_defs.h \ + ND_list_nd_arg.c \ + ND_types.c \ + machine/self.c \ + machine/avr.c \ + machine/env_machine.c \ + machine/msp430.c \ + machine/keil.c \ + machine/keil.gperf \ + machine/sdcc.c \ + machine/sdcc.gperf \ + nesc-dspec.def \ + nesc-dspec.l \ + nesc-dspec.y \ + tdspecs \ + nesc-compile \ + COPYING \ + COPYRIGHT \ + .gdbinit + +BISON = bison +FLEX = flex +EMACS = emacs +M4 = m4 +GPERF = gperf +all: $(BUILT_SOURCES) autoconf.h + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.SUFFIXES: +.SUFFIXES: .c .o .obj +am--refresh: + @: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \ + cd $(srcdir) && $(AUTOMAKE) --foreign \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) + +autoconf.h: stamp-h1 + @if test ! -f $@; then \ + rm -f stamp-h1; \ + $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \ + else :; fi + +stamp-h1: $(srcdir)/autoconf.h.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status autoconf.h +$(srcdir)/autoconf.h.in: $(am__configure_deps) + cd $(top_srcdir) && $(AUTOHEADER) + rm -f stamp-h1 + touch $@ + +distclean-hdr: + -rm -f autoconf.h stamp-h1 + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) +libparser.a: $(libparser_a_OBJECTS) $(libparser_a_DEPENDENCIES) + -rm -f libparser.a + $(libparser_a_AR) libparser.a $(libparser_a_OBJECTS) $(libparser_a_LIBADD) + $(RANLIB) libparser.a +install-ncclibPROGRAMS: $(ncclib_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(ncclibdir)" || $(MKDIR_P) "$(DESTDIR)$(ncclibdir)" + @list='$(ncclib_PROGRAMS)'; for p in $$list; do \ + p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + if test -f $$p \ + ; then \ + f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " $(INSTALL_PROGRAM_ENV) $(ncclibPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(ncclibdir)/$$f'"; \ + $(INSTALL_PROGRAM_ENV) $(ncclibPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(ncclibdir)/$$f" || exit 1; \ + else :; fi; \ + done + +uninstall-ncclibPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(ncclib_PROGRAMS)'; for p in $$list; do \ + f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " rm -f '$(DESTDIR)$(ncclibdir)/$$f'"; \ + rm -f "$(DESTDIR)$(ncclibdir)/$$f"; \ + done + +clean-ncclibPROGRAMS: + -test -z "$(ncclib_PROGRAMS)" || rm -f $(ncclib_PROGRAMS) +nesc1$(EXEEXT): $(nesc1_OBJECTS) $(nesc1_DEPENDENCIES) + @rm -f nesc1$(EXEEXT) + $(LINK) $(nesc1_OBJECTS) $(nesc1_LDADD) $(LIBS) +install-ncclibSCRIPTS: $(ncclib_SCRIPTS) + @$(NORMAL_INSTALL) + test -z "$(ncclibdir)" || $(MKDIR_P) "$(DESTDIR)$(ncclibdir)" + @list='$(ncclib_SCRIPTS)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + if test -f $$d$$p; then \ + f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ + echo " $(ncclibSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(ncclibdir)/$$f'"; \ + $(ncclibSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(ncclibdir)/$$f"; \ + else :; fi; \ + done + +uninstall-ncclibSCRIPTS: + @$(NORMAL_UNINSTALL) + @list='$(ncclib_SCRIPTS)'; for p in $$list; do \ + f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ + echo " rm -f '$(DESTDIR)$(ncclibdir)/$$f'"; \ + rm -f "$(DESTDIR)$(ncclibdir)/$$f"; \ + done + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AST.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AST_utils.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AST_walk.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/array.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/attributes.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/c-lex.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/c-parse.tab.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/constants.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cval.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dd_list.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dhash.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/edit.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/env.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/errors.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/expr.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flags.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/graph.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lex.nd.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/machine.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nesc-abstract.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nesc-atomic.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nesc-attributes.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nesc-c.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nesc-cg.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nesc-component.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nesc-concurrency.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nesc-configuration.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nesc-constants.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nesc-cpp.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nesc-deputy.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nesc-dfilter.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nesc-doc.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nesc-dspec.tab.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nesc-dump.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nesc-env.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nesc-gcc.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nesc-generate.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nesc-inline.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nesc-interface.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nesc-magic.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nesc-main.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nesc-module.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nesc-msg.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nesc-ndoc.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nesc-network.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nesc-paths.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nesc-semantics.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nesc-task.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nesc-uses.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nesc-xml.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sd_list.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/semantics.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stmt.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/toplev.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/types.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unparse.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utils.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +install-ncclibDATA: $(ncclib_DATA) + @$(NORMAL_INSTALL) + test -z "$(ncclibdir)" || $(MKDIR_P) "$(DESTDIR)$(ncclibdir)" + @list='$(ncclib_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(ncclibDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(ncclibdir)/$$f'"; \ + $(ncclibDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(ncclibdir)/$$f"; \ + done + +uninstall-ncclibDATA: + @$(NORMAL_UNINSTALL) + @list='$(ncclib_DATA)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(ncclibdir)/$$f'"; \ + rm -f "$(DESTDIR)$(ncclibdir)/$$f"; \ + done + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) autoconf.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) autoconf.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) autoconf.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) autoconf.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + $(am__remove_distdir) + test -d $(distdir) || mkdir $(distdir) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + distdir=`$(am__cd) $(distdir) && pwd`; \ + top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$top_distdir" \ + distdir="$$distdir/$$subdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + distdir) \ + || exit 1; \ + fi; \ + done + -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r $(distdir) +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) + +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 + $(am__remove_distdir) + +dist-tarZ: distdir + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__remove_distdir) + +dist-shar: distdir + shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz + $(am__remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__remove_distdir) + +dist dist-all: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir); chmod a+w $(distdir) + mkdir $(distdir)/_build + mkdir $(distdir)/_inst + chmod a-w $(distdir) + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && cd $(distdir)/_build \ + && ../configure --srcdir=.. --prefix="$$dc_install_base" \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck + $(am__remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' +distuninstallcheck: + @cd $(distuninstallcheck_dir) \ + && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-recursive +all-am: Makefile $(LIBRARIES) $(PROGRAMS) $(SCRIPTS) $(DATA) \ + autoconf.h +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(ncclibdir)" "$(DESTDIR)$(ncclibdir)" "$(DESTDIR)$(ncclibdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-recursive + +clean-am: clean-generic clean-ncclibPROGRAMS clean-noinstLIBRARIES \ + mostlyclean-am + +distclean: distclean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-hdr distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +info: info-recursive + +info-am: + +install-data-am: install-ncclibDATA install-ncclibPROGRAMS \ + install-ncclibSCRIPTS + +install-dvi: install-dvi-recursive + +install-exec-am: + +install-html: install-html-recursive + +install-info: install-info-recursive + +install-man: + +install-pdf: install-pdf-recursive + +install-ps: install-ps-recursive + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-ncclibDATA uninstall-ncclibPROGRAMS \ + uninstall-ncclibSCRIPTS + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ + install-strip + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am am--refresh check check-am clean clean-generic \ + clean-ncclibPROGRAMS clean-noinstLIBRARIES ctags \ + ctags-recursive dist dist-all dist-bzip2 dist-gzip dist-shar \ + dist-tarZ dist-zip distcheck distclean distclean-compile \ + distclean-generic distclean-hdr distclean-tags distcleancheck \ + distdir distuninstallcheck dvi dvi-am html html-am info \ + info-am install install-am install-data install-data-am \ + install-dvi install-dvi-am install-exec install-exec-am \ + install-html install-html-am install-info install-info-am \ + install-man install-ncclibDATA install-ncclibPROGRAMS \ + install-ncclibSCRIPTS install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am uninstall-ncclibDATA \ + uninstall-ncclibPROGRAMS uninstall-ncclibSCRIPTS + + +$(srcdir)/c-parse.tab.c $(srcdir)/c-parse.tab.h: c-parse.y + $(BISON) $(BISONFLAGS) -dv $< + +$(srcdir)/nesc-dspec.tab.c $(srcdir)/nesc-dspec.tab.h: nesc-dspec.y + $(BISON) $(BISONFLAGS) -p nd -dv $< + +$(srcdir)/lex.nd.c: nesc-dspec.l + $(FLEX) -Pnd -s $< + +$(srcdir)/ND_types.c $(srcdir)/ND_types.h $(srcdir)/ND_defs.h: build-types.el nesc-dspec.def build-basics.el + cd $(srcdir) && $(EMACS) $(EMACSFLAGS) -batch -load build-types.el ND nesc-dspec.def 10000 + +$(srcdir)/ND_list_nd_arg.c $(srcdir)/ND_list_nd_arg.h: build-list.el nesc-dspec.def build-basics.el + cd $(srcdir) && $(EMACS) $(EMACSFLAGS) -batch -load build-list.el ND nesc-dspec.def nd_arg + +$(srcdir)/AST_types.c $(srcdir)/AST_types.h $(srcdir)/AST_defs.h: build-types.el nodetypes.def build-basics.el + cd $(srcdir) && $(EMACS) $(EMACSFLAGS) -batch -load build-types.el AST nodetypes.def 42 + +$(srcdir)/AST_list_node.c $(srcdir)/AST_list_node.h: build-list.el nodetypes.def build-basics.el + cd $(srcdir) && $(EMACS) $(EMACSFLAGS) -batch -load build-list.el AST nodetypes.def node + +$(srcdir)/AST_parent.c: build-parent.el nodetypes.def build-basics.el + cd $(srcdir) && $(EMACS) $(EMACSFLAGS) -batch -load build-parent.el AST nodetypes.def + +$(srcdir)/AST_print.c: build-print.el nodetypes.def build-basics.el + cd $(srcdir) && $(EMACS) $(EMACSFLAGS) -batch -load build-print.el AST nodetypes.def + +$(srcdir)/AST_walk_children.c: build-walk.el nodetypes.def build-basics.el + cd $(srcdir) && $(EMACS) $(EMACSFLAGS) -batch -load build-walk.el AST nodetypes.def + +$(srcdir)/c-gperf.h: c-parse.gperf qualifiers.h nesc-keywords.h + cd $(srcdir) && $(M4) $(M4FLAGS) c-parse.gperf | grep -v '^$$' | \ + $(GPERF) $(GPERFFLAGS) -p -j1 -i 1 -g -o -t -G -N is_reserved_word -k1,3,8,$$ >$@- + mv $@- $@ + +$(srcdir)/machine/sdcc-gperf.h: machine/sdcc.gperf + $(GPERF) $(GPERFFLAGS) -j1 -t -E -H sdcc_hash -N is_sdcc_word -k1,3 machine/sdcc.gperf >$@- + mv $@- $@ + +$(srcdir)/machine/keil-gperf.h: machine/keil.gperf + $(GPERF) $(GPERFFLAGS) -j1 -t -E -H keil_hash -N is_keil_word -k1,3,$$ machine/keil.gperf >$@- + mv $@- $@ + +# Regression testing stuff + +testdoc: nesc-ndoc.c nesc-ndoc.h dd_list.c $(libregions) + $(COMPILE) -o $@ -DTESTING nesc-ndoc.c dd_list.c $(libregions) + +regress: nesc1 testdoc + (cd ../nregress && ./runtest) +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/ND_defs.h b/src/ND_defs.h new file mode 100644 index 0000000..b170945 --- /dev/null +++ b/src/ND_defs.h @@ -0,0 +1,86 @@ +/* Automatically generated from nesc-dspec.def, do not edit. */ + +/* See the copyright notice in nesc-dspec.def */ +/* the dump option NAME(ARGS). +ARGS may be NULL +COUNT is the number of elements in ARGS */ +struct ND_nd_option { /* extends nil */ + ND_kind kind; + const char * name; + nd_arg sameregion args; + int count; +}; + +/* supertype for arguments */ +struct ND_nd_arg { /* extends nil */ + ND_kind kind; + nd_arg next; +}; + +/* an integer argument VAL */ +struct ND_nd_int { /* extends nd_arg */ + ND_kind kind; + nd_arg next; + largest_int val; +}; + +/* some token argument STR */ +struct ND_nd_token { /* extends nd_arg */ + ND_kind kind; + nd_arg next; + const char * str; +}; + +/* a filter */ +struct ND_nd_filter { /* extends nd_arg */ + ND_kind kind; + nd_arg next; +}; + +/* FILTER1 & FILTER2 */ +struct ND_ndf_and { /* extends nd_filter */ + ND_kind kind; + nd_arg next; + nd_filter sameregion filter1; + nd_filter sameregion filter2; +}; + +/* FILTER1 | FILTER2 */ +struct ND_ndf_or { /* extends nd_filter */ + ND_kind kind; + nd_arg next; + nd_filter sameregion filter1; + nd_filter sameregion filter2; +}; + +/* !FILTER1 */ +struct ND_ndf_not { /* extends nd_filter */ + ND_kind kind; + nd_arg next; + nd_filter sameregion filter1; +}; + +/* the basic filter NAME(ARGS). +COUNT is the number of elements in ARGS (>= 1) +INFO can be used to save extra information (e.g., compiled regexp info) */ +struct ND_ndf_op { /* extends nd_filter */ + ND_kind kind; + nd_arg next; + const char * name; + nd_arg sameregion args; + int count; + void * info; + int filter_index; +}; + + + +nd_option new_nd_option(region r, const char * name, nd_arg args, int count); +nd_arg new_nd_arg(region r); +nd_int new_nd_int(region r, largest_int val); +nd_token new_nd_token(region r, const char * str); +nd_filter new_nd_filter(region r); +ndf_and new_ndf_and(region r, nd_filter filter1, nd_filter filter2); +ndf_or new_ndf_or(region r, nd_filter filter1, nd_filter filter2); +ndf_not new_ndf_not(region r, nd_filter filter1); +ndf_op new_ndf_op(region r, const char * name, nd_arg args, int count); diff --git a/src/ND_list_nd_arg.c b/src/ND_list_nd_arg.c new file mode 100644 index 0000000..e8ca998 --- /dev/null +++ b/src/ND_list_nd_arg.c @@ -0,0 +1,67 @@ +/* Automatically generated from nesc-dspec.def, do not edit. */ + +/* See the copyright notice in nesc-dspec.def */ +nd_arg ND_nd_arg_last(nd_arg l){ + if (!l) return NULL; + while (l->next) l = l->next; + return l; +} + +nd_arg ND_nd_arg_chain(nd_arg l1, nd_arg l2){ + if (!l1) return l2; + ND_nd_arg_last(l1)->next = l2; + return l1; +} + +int ND_nd_arg_length(nd_arg l){ + int len = 0; + + while (l) + { + l = l->next; + len++; + } + return len; +} + +nd_arg ND_nd_arg_reverse(nd_arg l){ + nd_arg last = NULL, next; + + for (;;) + { + if (!l) + return last; + next = l->next; + l->next = last; + last = l; + l = next; + } +} + +nd_option nd_option_chain(nd_option l1, nd_option l2) +{ return CAST(nd_option, ND_nd_arg_chain(CAST(nd_arg, l1), CAST(nd_arg, l2))); } + +nd_arg nd_arg_chain(nd_arg l1, nd_arg l2) +{ return CAST(nd_arg, ND_nd_arg_chain(CAST(nd_arg, l1), CAST(nd_arg, l2))); } + +nd_int nd_int_chain(nd_int l1, nd_int l2) +{ return CAST(nd_int, ND_nd_arg_chain(CAST(nd_arg, l1), CAST(nd_arg, l2))); } + +nd_token nd_token_chain(nd_token l1, nd_token l2) +{ return CAST(nd_token, ND_nd_arg_chain(CAST(nd_arg, l1), CAST(nd_arg, l2))); } + +nd_filter nd_filter_chain(nd_filter l1, nd_filter l2) +{ return CAST(nd_filter, ND_nd_arg_chain(CAST(nd_arg, l1), CAST(nd_arg, l2))); } + +ndf_and ndf_and_chain(ndf_and l1, ndf_and l2) +{ return CAST(ndf_and, ND_nd_arg_chain(CAST(nd_arg, l1), CAST(nd_arg, l2))); } + +ndf_or ndf_or_chain(ndf_or l1, ndf_or l2) +{ return CAST(ndf_or, ND_nd_arg_chain(CAST(nd_arg, l1), CAST(nd_arg, l2))); } + +ndf_not ndf_not_chain(ndf_not l1, ndf_not l2) +{ return CAST(ndf_not, ND_nd_arg_chain(CAST(nd_arg, l1), CAST(nd_arg, l2))); } + +ndf_op ndf_op_chain(ndf_op l1, ndf_op l2) +{ return CAST(ndf_op, ND_nd_arg_chain(CAST(nd_arg, l1), CAST(nd_arg, l2))); } + diff --git a/src/ND_list_nd_arg.h b/src/ND_list_nd_arg.h new file mode 100644 index 0000000..6f731d5 --- /dev/null +++ b/src/ND_list_nd_arg.h @@ -0,0 +1,52 @@ +/* Automatically generated from nesc-dspec.def, do not edit. */ + +/* See the copyright notice in nesc-dspec.def */ +nd_arg ND_nd_arg_last(nd_arg l); +nd_arg ND_nd_arg_chain(nd_arg l1, nd_arg l2); +int ND_nd_arg_length(nd_arg l); +nd_arg ND_nd_arg_reverse(nd_arg l); +#define nd_option_reverse(x) CAST(nd_option, ND_nd_arg_reverse(CAST(nd_arg, (x)))) +#define nd_option_length(x) ND_nd_arg_length(CAST(nd_arg, (x))) +#define last_nd_option(x) CAST(nd_option, ND_nd_arg_last(CAST(nd_arg, (x)))) +#define scan_nd_option(var, list) for (var = (list); var; var = CAST(nd_option, var->next)) +#define nd_arg_reverse(x) CAST(nd_arg, ND_nd_arg_reverse(CAST(nd_arg, (x)))) +#define nd_arg_length(x) ND_nd_arg_length(CAST(nd_arg, (x))) +#define last_nd_arg(x) CAST(nd_arg, ND_nd_arg_last(CAST(nd_arg, (x)))) +#define scan_nd_arg(var, list) for (var = (list); var; var = CAST(nd_arg, var->next)) +#define nd_int_reverse(x) CAST(nd_int, ND_nd_arg_reverse(CAST(nd_arg, (x)))) +#define nd_int_length(x) ND_nd_arg_length(CAST(nd_arg, (x))) +#define last_nd_int(x) CAST(nd_int, ND_nd_arg_last(CAST(nd_arg, (x)))) +#define scan_nd_int(var, list) for (var = (list); var; var = CAST(nd_int, var->next)) +#define nd_token_reverse(x) CAST(nd_token, ND_nd_arg_reverse(CAST(nd_arg, (x)))) +#define nd_token_length(x) ND_nd_arg_length(CAST(nd_arg, (x))) +#define last_nd_token(x) CAST(nd_token, ND_nd_arg_last(CAST(nd_arg, (x)))) +#define scan_nd_token(var, list) for (var = (list); var; var = CAST(nd_token, var->next)) +#define nd_filter_reverse(x) CAST(nd_filter, ND_nd_arg_reverse(CAST(nd_arg, (x)))) +#define nd_filter_length(x) ND_nd_arg_length(CAST(nd_arg, (x))) +#define last_nd_filter(x) CAST(nd_filter, ND_nd_arg_last(CAST(nd_arg, (x)))) +#define scan_nd_filter(var, list) for (var = (list); var; var = CAST(nd_filter, var->next)) +#define ndf_and_reverse(x) CAST(ndf_and, ND_nd_arg_reverse(CAST(nd_arg, (x)))) +#define ndf_and_length(x) ND_nd_arg_length(CAST(nd_arg, (x))) +#define last_ndf_and(x) CAST(ndf_and, ND_nd_arg_last(CAST(nd_arg, (x)))) +#define scan_ndf_and(var, list) for (var = (list); var; var = CAST(ndf_and, var->next)) +#define ndf_or_reverse(x) CAST(ndf_or, ND_nd_arg_reverse(CAST(nd_arg, (x)))) +#define ndf_or_length(x) ND_nd_arg_length(CAST(nd_arg, (x))) +#define last_ndf_or(x) CAST(ndf_or, ND_nd_arg_last(CAST(nd_arg, (x)))) +#define scan_ndf_or(var, list) for (var = (list); var; var = CAST(ndf_or, var->next)) +#define ndf_not_reverse(x) CAST(ndf_not, ND_nd_arg_reverse(CAST(nd_arg, (x)))) +#define ndf_not_length(x) ND_nd_arg_length(CAST(nd_arg, (x))) +#define last_ndf_not(x) CAST(ndf_not, ND_nd_arg_last(CAST(nd_arg, (x)))) +#define scan_ndf_not(var, list) for (var = (list); var; var = CAST(ndf_not, var->next)) +#define ndf_op_reverse(x) CAST(ndf_op, ND_nd_arg_reverse(CAST(nd_arg, (x)))) +#define ndf_op_length(x) ND_nd_arg_length(CAST(nd_arg, (x))) +#define last_ndf_op(x) CAST(ndf_op, ND_nd_arg_last(CAST(nd_arg, (x)))) +#define scan_ndf_op(var, list) for (var = (list); var; var = CAST(ndf_op, var->next)) +nd_option nd_option_chain(nd_option l1, nd_option l2); +nd_arg nd_arg_chain(nd_arg l1, nd_arg l2); +nd_int nd_int_chain(nd_int l1, nd_int l2); +nd_token nd_token_chain(nd_token l1, nd_token l2); +nd_filter nd_filter_chain(nd_filter l1, nd_filter l2); +ndf_and ndf_and_chain(ndf_and l1, ndf_and l2); +ndf_or ndf_or_chain(ndf_or l1, ndf_or l2); +ndf_not ndf_not_chain(ndf_not l1, ndf_not l2); +ndf_op ndf_op_chain(ndf_op l1, ndf_op l2); diff --git a/src/ND_types.c b/src/ND_types.c new file mode 100644 index 0000000..102c173 --- /dev/null +++ b/src/ND_types.c @@ -0,0 +1,147 @@ +/* Automatically generated from nesc-dspec.def, do not edit. */ + +/* See the copyright notice in nesc-dspec.def */ +nd_option new_nd_option(region r, const char * name, nd_arg args, int count) +{ + nd_option obj = ralloc(r, struct ND_nd_option); + + obj->kind = kind_nd_option; + obj->name = name; + obj->args = args; + obj->count = count; + + return obj; +} + +nd_arg new_nd_arg(region r) +{ + nd_arg obj = ralloc(r, struct ND_nd_arg); + + obj->kind = kind_nd_arg; + + return obj; +} + +nd_int new_nd_int(region r, largest_int val) +{ + nd_int obj = ralloc(r, struct ND_nd_int); + + obj->kind = kind_nd_int; + obj->val = val; + + return obj; +} + +nd_token new_nd_token(region r, const char * str) +{ + nd_token obj = ralloc(r, struct ND_nd_token); + + obj->kind = kind_nd_token; + obj->str = str; + + return obj; +} + +nd_filter new_nd_filter(region r) +{ + nd_filter obj = ralloc(r, struct ND_nd_filter); + + obj->kind = kind_nd_filter; + + return obj; +} + +ndf_and new_ndf_and(region r, nd_filter filter1, nd_filter filter2) +{ + ndf_and obj = ralloc(r, struct ND_ndf_and); + + obj->kind = kind_ndf_and; + obj->filter1 = filter1; + obj->filter2 = filter2; + + return obj; +} + +ndf_or new_ndf_or(region r, nd_filter filter1, nd_filter filter2) +{ + ndf_or obj = ralloc(r, struct ND_ndf_or); + + obj->kind = kind_ndf_or; + obj->filter1 = filter1; + obj->filter2 = filter2; + + return obj; +} + +ndf_not new_ndf_not(region r, nd_filter filter1) +{ + ndf_not obj = ralloc(r, struct ND_ndf_not); + + obj->kind = kind_ndf_not; + obj->filter1 = filter1; + + return obj; +} + +ndf_op new_ndf_op(region r, const char * name, nd_arg args, int count) +{ + ndf_op obj = ralloc(r, struct ND_ndf_op); + + obj->kind = kind_ndf_op; + obj->name = name; + obj->args = args; + obj->count = count; + + return obj; +} + + + +ND_kind ND_parent_kind[] = { + 0, + 0, + kind_nd_arg, + kind_nd_arg, + kind_nd_arg, + kind_nd_filter, + kind_nd_filter, + kind_nd_filter, + kind_nd_filter, +}; + +ND_kind ND_post_kind[] = { + postkind_nd_option, + postkind_nd_arg, + postkind_nd_int, + postkind_nd_token, + postkind_nd_filter, + postkind_ndf_and, + postkind_ndf_or, + postkind_ndf_not, + postkind_ndf_op, +}; + +size_t ND_sizeof[] = { + sizeof(struct ND_nd_option), + sizeof(struct ND_nd_arg), + sizeof(struct ND_nd_int), + sizeof(struct ND_nd_token), + sizeof(struct ND_nd_filter), + sizeof(struct ND_ndf_and), + sizeof(struct ND_ndf_or), + sizeof(struct ND_ndf_not), + sizeof(struct ND_ndf_op), +}; + +type_t ND_typeof[] = { + rctypeof(struct ND_nd_option), + rctypeof(struct ND_nd_arg), + rctypeof(struct ND_nd_int), + rctypeof(struct ND_nd_token), + rctypeof(struct ND_nd_filter), + rctypeof(struct ND_ndf_and), + rctypeof(struct ND_ndf_or), + rctypeof(struct ND_ndf_not), + rctypeof(struct ND_ndf_op), +}; + diff --git a/src/ND_types.h b/src/ND_types.h new file mode 100644 index 0000000..2c2c5b4 --- /dev/null +++ b/src/ND_types.h @@ -0,0 +1,64 @@ +/* Automatically generated from nesc-dspec.def, do not edit. */ + +/* See the copyright notice in nesc-dspec.def */ +typedef struct ND_nd_option *nd_option; +typedef struct ND_nd_arg *nd_arg; +typedef struct ND_nd_int *nd_int; +typedef struct ND_nd_token *nd_token; +typedef struct ND_nd_filter *nd_filter; +typedef struct ND_ndf_and *ndf_and; +typedef struct ND_ndf_or *ndf_or; +typedef struct ND_ndf_not *ndf_not; +typedef struct ND_ndf_op *ndf_op; +typedef enum { + kind_nd_option = 10000, + postkind_nd_option = 10000, + kind_nd_arg = 10001, + postkind_nd_arg = 10008, + kind_nd_int = 10002, + postkind_nd_int = 10002, + kind_nd_token = 10003, + postkind_nd_token = 10003, + kind_nd_filter = 10004, + postkind_nd_filter = 10008, + kind_ndf_and = 10005, + postkind_ndf_and = 10005, + kind_ndf_or = 10006, + postkind_ndf_or = 10006, + kind_ndf_not = 10007, + postkind_ndf_not = 10007, + kind_ndf_op = 10008, + postkind_ndf_op = 10008 +} ND_kind; + +extern ND_kind ND_parent_kind[]; /* indexed by kind - kind_node */ + +extern ND_kind ND_post_kind[]; /* indexed by kind - kind_node */ + +extern size_t ND_sizeof[]; /* indexed by kind - kind_node */ + +extern type_t ND_typeof[]; /* indexed by kind - kind_node */ +#define is_nd_option(x) ((x)->kind >= kind_nd_option && (x)->kind <= postkind_nd_option) +#define is_nd_arg(x) ((x)->kind >= kind_nd_arg && (x)->kind <= postkind_nd_arg) +#define is_nd_int(x) ((x)->kind >= kind_nd_int && (x)->kind <= postkind_nd_int) +#define is_nd_token(x) ((x)->kind >= kind_nd_token && (x)->kind <= postkind_nd_token) +#define is_nd_filter(x) ((x)->kind >= kind_nd_filter && (x)->kind <= postkind_nd_filter) +#define is_ndf_and(x) ((x)->kind >= kind_ndf_and && (x)->kind <= postkind_ndf_and) +#define is_ndf_or(x) ((x)->kind >= kind_ndf_or && (x)->kind <= postkind_ndf_or) +#define is_ndf_not(x) ((x)->kind >= kind_ndf_not && (x)->kind <= postkind_ndf_not) +#define is_ndf_op(x) ((x)->kind >= kind_ndf_op && (x)->kind <= postkind_ndf_op) +typedef struct +{ + AST_kind kind; +} *ND_generic; + +#ifdef __GNUC__ +#define ND_CAST(type, x) ({ND_generic tEmPcast = (ND_generic)(x); if (tEmPcast) assert(is_ ## type(tEmPcast)); (type)(tEmPcast); }) +#define ND_CASTPTR(type, x) ({ND_generic *tEmPcast = (ND_generic *)(x); if (tEmPcast && *tEmPcast) assert(is_ ## type(*tEmPcast)); (type *)(tEmPcast); }) +#define ND_CASTSRPTR(type, x) ({ND_generic *tEmPcast = (ND_generic *)(x); if (tEmPcast && *tEmPcast) assert(is_ ## type(*tEmPcast)); (type sameregion *)(tEmPcast); }) +#else +/* Could also generate some code to make this safe */ +#define ND_CAST(type, x) ((type)(x)) +#define ND_CASTPTR(type, x) ((type *)(x)) +#define ND_CASTSRPTR(type, x) ((type sameregion *)(x)) +#endif diff --git a/src/acinclude.m4 b/src/acinclude.m4 new file mode 100644 index 0000000..828b732 --- /dev/null +++ b/src/acinclude.m4 @@ -0,0 +1,80 @@ +dnl CPARSE_TRY_CFLAGS(FLAGS) +dnl +dnl Try running the C compiler with FLAGS appended to $CFLAGS. If +dnl it completes without error, retain the additional flags. +dnl +AC_DEFUN([CPARSE_TRY_CFLAGS],[ +AC_REQUIRE([AC_PROG_CC]) +AC_MSG_CHECKING(whether ${CC-cc} accepts $1) +save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS $1" +AC_LANG_SAVE +AC_LANG_C +AC_TRY_COMPILE([], [], + AC_MSG_RESULT(yes), + AC_MSG_RESULT(no) + CFLAGS="$save_CFLAGS")]) + + +dnl CPARSE_GCCDIR +dnl +dnl If the C compiler is gcc, set $GCCDIR to the directory +dnl containing gcc's suite of supporting files and also define +dnl GCCDIR macro to a string representation of the same. +dnl +AC_DEFUN([CPARSE_GCCDIR],[ +AC_REQUIRE([AC_PROG_CC]) +AC_MSG_CHECKING(for gcc support directory) +if test "$GCC" = yes; then + GCCDIR="`$CC -v 2>&1 | sed -n 's:^Reading specs from \(.*\)/specs$:\1:p'`" + if test -z "$GCCDIR"; then + AC_MSG_ERROR(cannot find gcc support directory) + else + AC_MSG_RESULT($GCCDIR) + fi + AC_DEFINE_UNQUOTED(GCCDIR, "$GCCDIR", directory containing gcc support files) +else + AC_MSG_RESULT(no) +fi +]) + +dnl RC_TRY_CPPFLAGS(FLAGS) +dnl +dnl Try running the C preprocessor with FLAGS appended to $CPPFLAGS. +dnl If it completes without error, retain the additional flags. +dnl +AC_DEFUN([RC_TRY_CPPFLAGS],[ +AC_REQUIRE([AC_PROG_CPP]) +AC_MSG_CHECKING(whether $CPP accepts $1) +save_CPPFLAGS="$CPPFLAGS" +CPPFLAGS="$CPPFLAGS $1" +AC_TRY_CPP([], + AC_MSG_RESULT(yes) +, + CPPFLAGS="$save_CPPFLAGS" + AC_MSG_RESULT(no))]) + + +dnl RC_CHECK_DECL(FUNCTION, HEADER-FILE) +dnl +dnl Search for a declaration of FUNCTION in HEADER-FILE, and define +dnl HAVE_FUNCTION_DECLARED if found. +dnl +AC_DEFUN([RC_CHECK_DECL],[ +AC_CACHE_CHECK(for $1 declaration in <$2>, rc_cv_$1_declared, [ + AC_EGREP_HEADER(\<$1\>, $2, rc_cv_$1_declared=yes, rc_cv_$1_declared=no)]) +if test "$rc_cv_$1_declared" = yes; then + AC_DEFINE(HAVE_[]translit($1, a-z, A-Z)_DECLARED, 1, $1 is declared in <$2>) +fi]) + + +dnl RC_FIX_EXEC(FILE) +dnl +dnl If FILE is on the list of generated config files, turn on its +dnl user execute bit. Intended for use in the EXTRA-CMDS argument +dnl to AC_OUTPUT or AC_OUTPUT_COMMANDS. +dnl +AC_DEFUN([RC_FIX_EXEC],[[ +case "$CONFIG_FILES" in + *$1*) chmod +x $1 ;; +esac]]) diff --git a/src/aclocal.m4 b/src/aclocal.m4 new file mode 100644 index 0000000..d8739ed --- /dev/null +++ b/src/aclocal.m4 @@ -0,0 +1,1919 @@ +# generated automatically by aclocal 1.10 -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006 Free Software Foundation, Inc. +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +m4_if(m4_PACKAGE_VERSION, [2.61],, +[m4_fatal([this file was generated for autoconf 2.61. +You have another version of autoconf. If you want to use that, +you should regenerate the build system entirely.], [63])]) + +# iconv.m4 serial AM4 (gettext-0.11.3) +dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. + +AC_DEFUN([AM_ICONV_LINKFLAGS_BODY], +[ + dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + + dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV + dnl accordingly. + AC_LIB_LINKFLAGS_BODY([iconv]) +]) + +AC_DEFUN([AM_ICONV_LINK], +[ + dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and + dnl those with the standalone portable GNU libiconv installed). + + dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV + dnl accordingly. + AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) + + dnl Add $INCICONV to CPPFLAGS before performing the following checks, + dnl because if the user has installed libiconv and not disabled its use + dnl via --without-libiconv-prefix, he wants to use it. The first + dnl AC_TRY_LINK will then fail, the second AC_TRY_LINK will succeed. + am_save_CPPFLAGS="$CPPFLAGS" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV]) + + AC_CACHE_CHECK(for iconv, am_cv_func_iconv, [ + am_cv_func_iconv="no, consider installing GNU libiconv" + am_cv_lib_iconv=no + AC_TRY_LINK([#include +#include ], + [iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd);], + am_cv_func_iconv=yes) + if test "$am_cv_func_iconv" != yes; then + am_save_LIBS="$LIBS" + LIBS="$LIBS $LIBICONV" + AC_TRY_LINK([#include +#include ], + [iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd);], + am_cv_lib_iconv=yes + am_cv_func_iconv=yes) + LIBS="$am_save_LIBS" + fi + ]) + if test "$am_cv_func_iconv" = yes; then + AC_DEFINE(HAVE_ICONV, 1, [Define if you have the iconv() function.]) + fi + if test "$am_cv_lib_iconv" = yes; then + AC_MSG_CHECKING([how to link with libiconv]) + AC_MSG_RESULT([$LIBICONV]) + else + dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV + dnl either. + CPPFLAGS="$am_save_CPPFLAGS" + LIBICONV= + LTLIBICONV= + fi + AC_SUBST(LIBICONV) + AC_SUBST(LTLIBICONV) +]) + +AC_DEFUN([AM_ICONV], +[ + AM_ICONV_LINK + if test "$am_cv_func_iconv" = yes; then + AC_MSG_CHECKING([for iconv declaration]) + AC_CACHE_VAL(am_cv_proto_iconv, [ + AC_TRY_COMPILE([ +#include +#include +extern +#ifdef __cplusplus +"C" +#endif +#if defined(__STDC__) || defined(__cplusplus) +size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); +#else +size_t iconv(); +#endif +], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const") + am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"]) + am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` + AC_MSG_RESULT([$]{ac_t:- + }[$]am_cv_proto_iconv) + AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1, + [Define as const if the declaration of iconv() needs const.]) + fi +]) + +# lib-ld.m4 serial 3 (gettext-0.13) +dnl Copyright (C) 1996-2003 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl Subroutines of libtool.m4, +dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision +dnl with libtool.m4. + +dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no. +AC_DEFUN([AC_LIB_PROG_LD_GNU], +[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld, +[# I'd rather use --version here, but apparently some GNU ld's only accept -v. +case `$LD -v 2>&1 conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by GCC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]* | [A-Za-z]:[\\/]*)] + [re_direlt='/[^/][^/]*/\.\./'] + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(acl_cv_path_LD, +[if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + acl_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in + *GNU* | *'with BFD'*) + test "$with_gnu_ld" != no && break ;; + *) + test "$with_gnu_ld" != yes && break ;; + esac + fi + done + IFS="$ac_save_ifs" +else + acl_cv_path_LD="$LD" # Let the user override the test with a path. +fi]) +LD="$acl_cv_path_LD" +if test -n "$LD"; then + AC_MSG_RESULT($LD) +else + AC_MSG_RESULT(no) +fi +test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) +AC_LIB_PROG_LD_GNU +]) + +# lib-link.m4 serial 9 (gettext-0.16) +dnl Copyright (C) 2001-2006 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. + +AC_PREREQ(2.50) + +dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and +dnl the libraries corresponding to explicit and implicit dependencies. +dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and +dnl augments the CPPFLAGS variable. +AC_DEFUN([AC_LIB_LINKFLAGS], +[ + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + define([Name],[translit([$1],[./-], [___])]) + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [ + AC_LIB_LINKFLAGS_BODY([$1], [$2]) + ac_cv_lib[]Name[]_libs="$LIB[]NAME" + ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME" + ac_cv_lib[]Name[]_cppflags="$INC[]NAME" + ]) + LIB[]NAME="$ac_cv_lib[]Name[]_libs" + LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs" + INC[]NAME="$ac_cv_lib[]Name[]_cppflags" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) + AC_SUBST([LIB]NAME) + AC_SUBST([LTLIB]NAME) + dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the + dnl results of this search when this library appears as a dependency. + HAVE_LIB[]NAME=yes + undefine([Name]) + undefine([NAME]) +]) + +dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode) +dnl searches for libname and the libraries corresponding to explicit and +dnl implicit dependencies, together with the specified include files and +dnl the ability to compile and link the specified testcode. If found, it +dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and +dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and +dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs +dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty. +AC_DEFUN([AC_LIB_HAVE_LINKFLAGS], +[ + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + define([Name],[translit([$1],[./-], [___])]) + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + + dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME + dnl accordingly. + AC_LIB_LINKFLAGS_BODY([$1], [$2]) + + dnl Add $INC[]NAME to CPPFLAGS before performing the following checks, + dnl because if the user has installed lib[]Name and not disabled its use + dnl via --without-lib[]Name-prefix, he wants to use it. + ac_save_CPPFLAGS="$CPPFLAGS" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) + + AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [ + ac_save_LIBS="$LIBS" + LIBS="$LIBS $LIB[]NAME" + AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no]) + LIBS="$ac_save_LIBS" + ]) + if test "$ac_cv_lib[]Name" = yes; then + HAVE_LIB[]NAME=yes + AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.]) + AC_MSG_CHECKING([how to link with lib[]$1]) + AC_MSG_RESULT([$LIB[]NAME]) + else + HAVE_LIB[]NAME=no + dnl If $LIB[]NAME didn't lead to a usable library, we don't need + dnl $INC[]NAME either. + CPPFLAGS="$ac_save_CPPFLAGS" + LIB[]NAME= + LTLIB[]NAME= + fi + AC_SUBST([HAVE_LIB]NAME) + AC_SUBST([LIB]NAME) + AC_SUBST([LTLIB]NAME) + undefine([Name]) + undefine([NAME]) +]) + +dnl Determine the platform dependent parameters needed to use rpath: +dnl libext, shlibext, hardcode_libdir_flag_spec, hardcode_libdir_separator, +dnl hardcode_direct, hardcode_minus_L. +AC_DEFUN([AC_LIB_RPATH], +[ + dnl Tell automake >= 1.10 to complain if config.rpath is missing. + m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])]) + AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS + AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld + AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host + AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir + AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [ + CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ + ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh + . ./conftest.sh + rm -f ./conftest.sh + acl_cv_rpath=done + ]) + wl="$acl_cv_wl" + libext="$acl_cv_libext" + shlibext="$acl_cv_shlibext" + hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" + hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" + hardcode_direct="$acl_cv_hardcode_direct" + hardcode_minus_L="$acl_cv_hardcode_minus_L" + dnl Determine whether the user wants rpath handling at all. + AC_ARG_ENABLE(rpath, + [ --disable-rpath do not hardcode runtime library paths], + :, enable_rpath=yes) +]) + +dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and +dnl the libraries corresponding to explicit and implicit dependencies. +dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables. +AC_DEFUN([AC_LIB_LINKFLAGS_BODY], +[ + AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + dnl By default, look in $includedir and $libdir. + use_additional=yes + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + AC_LIB_ARG_WITH([lib$1-prefix], +[ --with-lib$1-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib + --without-lib$1-prefix don't search for lib$1 in includedir and libdir], +[ + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + else + additional_includedir="$withval/include" + additional_libdir="$withval/$acl_libdirstem" + fi + fi +]) + dnl Search the library and its dependencies in $additional_libdir and + dnl $LDFLAGS. Using breadth-first-seach. + LIB[]NAME= + LTLIB[]NAME= + INC[]NAME= + rpathdirs= + ltrpathdirs= + names_already_handled= + names_next_round='$1 $2' + while test -n "$names_next_round"; do + names_this_round="$names_next_round" + names_next_round= + for name in $names_this_round; do + already_handled= + for n in $names_already_handled; do + if test "$n" = "$name"; then + already_handled=yes + break + fi + done + if test -z "$already_handled"; then + names_already_handled="$names_already_handled $name" + dnl See if it was already located by an earlier AC_LIB_LINKFLAGS + dnl or AC_LIB_HAVE_LINKFLAGS call. + uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` + eval value=\"\$HAVE_LIB$uppername\" + if test -n "$value"; then + if test "$value" = yes; then + eval value=\"\$LIB$uppername\" + test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value" + eval value=\"\$LTLIB$uppername\" + test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value" + else + dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined + dnl that this library doesn't exist. So just drop it. + : + fi + else + dnl Search the library lib$name in $additional_libdir and $LDFLAGS + dnl and the already constructed $LIBNAME/$LTLIBNAME. + found_dir= + found_la= + found_so= + found_a= + if test $use_additional = yes; then + if test -n "$shlibext" \ + && { test -f "$additional_libdir/lib$name.$shlibext" \ + || { test "$shlibext" = dll \ + && test -f "$additional_libdir/lib$name.dll.a"; }; }; then + found_dir="$additional_libdir" + if test -f "$additional_libdir/lib$name.$shlibext"; then + found_so="$additional_libdir/lib$name.$shlibext" + else + found_so="$additional_libdir/lib$name.dll.a" + fi + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + else + if test -f "$additional_libdir/lib$name.$libext"; then + found_dir="$additional_libdir" + found_a="$additional_libdir/lib$name.$libext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + fi + fi + fi + if test "X$found_dir" = "X"; then + for x in $LDFLAGS $LTLIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + case "$x" in + -L*) + dir=`echo "X$x" | sed -e 's/^X-L//'` + if test -n "$shlibext" \ + && { test -f "$dir/lib$name.$shlibext" \ + || { test "$shlibext" = dll \ + && test -f "$dir/lib$name.dll.a"; }; }; then + found_dir="$dir" + if test -f "$dir/lib$name.$shlibext"; then + found_so="$dir/lib$name.$shlibext" + else + found_so="$dir/lib$name.dll.a" + fi + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + else + if test -f "$dir/lib$name.$libext"; then + found_dir="$dir" + found_a="$dir/lib$name.$libext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + fi + fi + ;; + esac + if test "X$found_dir" != "X"; then + break + fi + done + fi + if test "X$found_dir" != "X"; then + dnl Found the library. + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name" + if test "X$found_so" != "X"; then + dnl Linking with a shared library. We attempt to hardcode its + dnl directory into the executable's runpath, unless it's the + dnl standard /usr/lib. + if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then + dnl No hardcoding is needed. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + dnl Use an explicit option to hardcode DIR into the resulting + dnl binary. + dnl Potentially add DIR to ltrpathdirs. + dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $found_dir" + fi + dnl The hardcoding into $LIBNAME is system dependent. + if test "$hardcode_direct" = yes; then + dnl Using DIR/libNAME.so during linking hardcodes DIR into the + dnl resulting binary. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then + dnl Use an explicit option to hardcode DIR into the resulting + dnl binary. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + dnl Potentially add DIR to rpathdirs. + dnl The rpathdirs will be appended to $LIBNAME at the end. + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $found_dir" + fi + else + dnl Rely on "-L$found_dir". + dnl But don't add it if it's already contained in the LDFLAGS + dnl or the already constructed $LIBNAME + haveit= + for x in $LDFLAGS $LIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir" + fi + if test "$hardcode_minus_L" != no; then + dnl FIXME: Not sure whether we should use + dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" + dnl here. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + dnl We cannot use $hardcode_runpath_var and LD_RUN_PATH + dnl here, because this doesn't fit in flags passed to the + dnl compiler. So give up. No hardcoding. This affects only + dnl very old systems. + dnl FIXME: Not sure whether we should use + dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" + dnl here. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" + fi + fi + fi + fi + else + if test "X$found_a" != "X"; then + dnl Linking with a static library. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a" + else + dnl We shouldn't come here, but anyway it's good to have a + dnl fallback. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name" + fi + fi + dnl Assume the include files are nearby. + additional_includedir= + case "$found_dir" in + */$acl_libdirstem | */$acl_libdirstem/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` + additional_includedir="$basedir/include" + ;; + esac + if test "X$additional_includedir" != "X"; then + dnl Potentially add $additional_includedir to $INCNAME. + dnl But don't add it + dnl 1. if it's the standard /usr/include, + dnl 2. if it's /usr/local/include and we are using GCC on Linux, + dnl 3. if it's already present in $CPPFLAGS or the already + dnl constructed $INCNAME, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + for x in $CPPFLAGS $INC[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + dnl Really add $additional_includedir to $INCNAME. + INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir" + fi + fi + fi + fi + fi + dnl Look for dependencies. + if test -n "$found_la"; then + dnl Read the .la file. It defines the variables + dnl dlname, library_names, old_library, dependency_libs, current, + dnl age, revision, installed, dlopen, dlpreopen, libdir. + save_libdir="$libdir" + case "$found_la" in + */* | *\\*) . "$found_la" ;; + *) . "./$found_la" ;; + esac + libdir="$save_libdir" + dnl We use only dependency_libs. + for dep in $dependency_libs; do + case "$dep" in + -L*) + additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` + dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME. + dnl But don't add it + dnl 1. if it's the standard /usr/lib, + dnl 2. if it's /usr/local/lib and we are using GCC on Linux, + dnl 3. if it's already present in $LDFLAGS or the already + dnl constructed $LIBNAME, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + haveit= + for x in $LDFLAGS $LIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LIBNAME. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir" + fi + fi + haveit= + for x in $LDFLAGS $LTLIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LTLIBNAME. + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir" + fi + fi + fi + fi + ;; + -R*) + dir=`echo "X$dep" | sed -e 's/^X-R//'` + if test "$enable_rpath" != no; then + dnl Potentially add DIR to rpathdirs. + dnl The rpathdirs will be appended to $LIBNAME at the end. + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $dir" + fi + dnl Potentially add DIR to ltrpathdirs. + dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $dir" + fi + fi + ;; + -l*) + dnl Handle this in the next round. + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` + ;; + *.la) + dnl Handle this in the next round. Throw away the .la's + dnl directory; it is already contained in a preceding -L + dnl option. + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` + ;; + *) + dnl Most likely an immediate library name. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep" + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep" + ;; + esac + done + fi + else + dnl Didn't find the library; assume it is in the system directories + dnl known to the linker and runtime loader. (All the system + dnl directories known to the linker should also be known to the + dnl runtime loader, otherwise the system is severely misconfigured.) + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name" + fi + fi + fi + done + done + if test "X$rpathdirs" != "X"; then + if test -n "$hardcode_libdir_separator"; then + dnl Weird platform: only the last -rpath option counts, the user must + dnl pass all path elements in one option. We can arrange that for a + dnl single library, but not when more than one $LIBNAMEs are used. + alldirs= + for found_dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" + done + dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl. + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" + else + dnl The -rpath options are cumulative. + for found_dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$found_dir" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" + done + fi + fi + if test "X$ltrpathdirs" != "X"; then + dnl When using libtool, the option that works for both libraries and + dnl executables is -R. The -R options are cumulative. + for found_dir in $ltrpathdirs; do + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir" + done + fi +]) + +dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, +dnl unless already present in VAR. +dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes +dnl contains two or three consecutive elements that belong together. +AC_DEFUN([AC_LIB_APPENDTOVAR], +[ + for element in [$2]; do + haveit= + for x in $[$1]; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X$element"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + [$1]="${[$1]}${[$1]:+ }$element" + fi + done +]) + +dnl For those cases where a variable contains several -L and -l options +dnl referring to unknown libraries and directories, this macro determines the +dnl necessary additional linker options for the runtime path. +dnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL]) +dnl sets LDADDVAR to linker options needed together with LIBSVALUE. +dnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed, +dnl otherwise linking without libtool is assumed. +AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS], +[ + AC_REQUIRE([AC_LIB_RPATH]) + AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) + $1= + if test "$enable_rpath" != no; then + if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then + dnl Use an explicit option to hardcode directories into the resulting + dnl binary. + rpathdirs= + next= + for opt in $2; do + if test -n "$next"; then + dir="$next" + dnl No need to hardcode the standard /usr/lib. + if test "X$dir" != "X/usr/$acl_libdirstem"; then + rpathdirs="$rpathdirs $dir" + fi + next= + else + case $opt in + -L) next=yes ;; + -L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'` + dnl No need to hardcode the standard /usr/lib. + if test "X$dir" != "X/usr/$acl_libdirstem"; then + rpathdirs="$rpathdirs $dir" + fi + next= ;; + *) next= ;; + esac + fi + done + if test "X$rpathdirs" != "X"; then + if test -n ""$3""; then + dnl libtool is used for linking. Use -R options. + for dir in $rpathdirs; do + $1="${$1}${$1:+ }-R$dir" + done + else + dnl The linker is used for linking directly. + if test -n "$hardcode_libdir_separator"; then + dnl Weird platform: only the last -rpath option counts, the user + dnl must pass all path elements in one option. + alldirs= + for dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$dir" + done + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + $1="$flag" + else + dnl The -rpath options are cumulative. + for dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$dir" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + $1="${$1}${$1:+ }$flag" + done + fi + fi + fi + fi + fi + AC_SUBST([$1]) +]) + +# lib-prefix.m4 serial 5 (gettext-0.15) +dnl Copyright (C) 2001-2005 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. + +dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and +dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't +dnl require excessive bracketing. +ifdef([AC_HELP_STRING], +[AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])], +[AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])]) + +dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed +dnl to access previously installed libraries. The basic assumption is that +dnl a user will want packages to use other packages he previously installed +dnl with the same --prefix option. +dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate +dnl libraries, but is otherwise very convenient. +AC_DEFUN([AC_LIB_PREFIX], +[ + AC_BEFORE([$0], [AC_LIB_LINKFLAGS]) + AC_REQUIRE([AC_PROG_CC]) + AC_REQUIRE([AC_CANONICAL_HOST]) + AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + dnl By default, look in $includedir and $libdir. + use_additional=yes + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + AC_LIB_ARG_WITH([lib-prefix], +[ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib + --without-lib-prefix don't search for libraries in includedir and libdir], +[ + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + else + additional_includedir="$withval/include" + additional_libdir="$withval/$acl_libdirstem" + fi + fi +]) + if test $use_additional = yes; then + dnl Potentially add $additional_includedir to $CPPFLAGS. + dnl But don't add it + dnl 1. if it's the standard /usr/include, + dnl 2. if it's already present in $CPPFLAGS, + dnl 3. if it's /usr/local/include and we are using GCC on Linux, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + for x in $CPPFLAGS; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + dnl Really add $additional_includedir to $CPPFLAGS. + CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir" + fi + fi + fi + fi + dnl Potentially add $additional_libdir to $LDFLAGS. + dnl But don't add it + dnl 1. if it's the standard /usr/lib, + dnl 2. if it's already present in $LDFLAGS, + dnl 3. if it's /usr/local/lib and we are using GCC on Linux, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then + haveit= + for x in $LDFLAGS; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LDFLAGS. + LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir" + fi + fi + fi + fi + fi +]) + +dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix, +dnl acl_final_exec_prefix, containing the values to which $prefix and +dnl $exec_prefix will expand at the end of the configure script. +AC_DEFUN([AC_LIB_PREPARE_PREFIX], +[ + dnl Unfortunately, prefix and exec_prefix get only finally determined + dnl at the end of configure. + if test "X$prefix" = "XNONE"; then + acl_final_prefix="$ac_default_prefix" + else + acl_final_prefix="$prefix" + fi + if test "X$exec_prefix" = "XNONE"; then + acl_final_exec_prefix='${prefix}' + else + acl_final_exec_prefix="$exec_prefix" + fi + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" + prefix="$acl_save_prefix" +]) + +dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the +dnl variables prefix and exec_prefix bound to the values they will have +dnl at the end of the configure script. +AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX], +[ + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + $1 + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" +]) + +dnl AC_LIB_PREPARE_MULTILIB creates a variable acl_libdirstem, containing +dnl the basename of the libdir, either "lib" or "lib64". +AC_DEFUN([AC_LIB_PREPARE_MULTILIB], +[ + dnl There is no formal standard regarding lib and lib64. The current + dnl practice is that on a system supporting 32-bit and 64-bit instruction + dnl sets or ABIs, 64-bit libraries go under $prefix/lib64 and 32-bit + dnl libraries go under $prefix/lib. We determine the compiler's default + dnl mode by looking at the compiler's library search path. If at least + dnl of its elements ends in /lib64 or points to a directory whose absolute + dnl pathname ends in /lib64, we assume a 64-bit ABI. Otherwise we use the + dnl default, namely "lib". + acl_libdirstem=lib + searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` + if test -n "$searchpath"; then + acl_save_IFS="${IFS= }"; IFS=":" + for searchdir in $searchpath; do + if test -d "$searchdir"; then + case "$searchdir" in + */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; + *) searchdir=`cd "$searchdir" && pwd` + case "$searchdir" in + */lib64 ) acl_libdirstem=lib64 ;; + esac ;; + esac + fi + done + IFS="$acl_save_IFS" + fi +]) + +# Copyright (C) 2002, 2003, 2005, 2006 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.10' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.10], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. +# This function is AC_REQUIREd by AC_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +[AM_AUTOMAKE_VERSION([1.10])dnl +_AM_AUTOCONF_VERSION(m4_PACKAGE_VERSION)]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to +# `$srcdir', `$srcdir/..', or `$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is `.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[dnl Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50])dnl +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 8 + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ(2.52)dnl + ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 9 + +# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "GCJ", or "OBJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +ifelse([$1], CC, [depcc="$CC" am_compiler_list=], + [$1], CXX, [depcc="$CXX" am_compiler_list=], + [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], UPC, [depcc="$UPC" am_compiler_list=], + [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE(dependency-tracking, +[ --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +#serial 3 + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[for mf in $CONFIG_FILES; do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed 10q "$mf" | grep '^#.*generated by automake' > /dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done +done +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each `.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + +# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 8 + +# AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS. +AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 12 + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.60])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) + AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) +AM_MISSING_PROG(AUTOCONF, autoconf) +AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) +AM_MISSING_PROG(AUTOHEADER, autoheader) +AM_MISSING_PROG(MAKEINFO, makeinfo) +AM_PROG_INSTALL_SH +AM_PROG_INSTALL_STRIP +AC_REQUIRE([AM_PROG_MKDIR_P])dnl +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_CC], + defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_CXX], + defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES(OBJC)], + [define([AC_PROG_OBJC], + defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl +]) +]) + + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $1 | $1:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) + +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"} +AC_SUBST(install_sh)]) + +# Copyright (C) 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 3 + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo done +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# We grep out `Entering directory' and `Leaving directory' +# messages which can occur if `w' ends up in MAKEFLAGS. +# In particular we don't look at `^make:' because GNU make might +# be invoked under some other name (usually "gmake"), in which +# case it prints its new name instead of `make'. +if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then + am__include=include + am__quote= + _am_result=GNU +fi +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then + am__include=.include + am__quote="\"" + _am_result=BSD + fi +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 5 + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it supports --run. +# If it does, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + AC_MSG_WARN([`missing' script is too old or missing]) +fi +]) + +# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_MKDIR_P +# --------------- +# Check for `mkdir -p'. +AC_DEFUN([AM_PROG_MKDIR_P], +[AC_PREREQ([2.60])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, +dnl while keeping a definition of mkdir_p for backward compatibility. +dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. +dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of +dnl Makefile.ins that do not define MKDIR_P, so we do our own +dnl adjustment using top_builddir (which is defined more often than +dnl MKDIR_P). +AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl +case $mkdir_p in + [[\\/$]]* | ?:[[\\/]]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 3 + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# ------------------------------ +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) + +# _AM_SET_OPTIONS(OPTIONS) +# ---------------------------------- +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 4 + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftest.file +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftest.file` + fi + rm -f conftest.file + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi + + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT(yes)]) + +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor `install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in `make install-strip', and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be `maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Copyright (C) 2006 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputing VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of `v7', `ustar', or `pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. +AM_MISSING_PROG([AMTAR], [tar]) +m4_if([$1], [v7], + [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], + [m4_case([$1], [ustar],, [pax],, + [m4_fatal([Unknown tar format])]) +AC_MSG_CHECKING([how to create a $1 tar archive]) +# Loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' +_am_tools=${am_cv_prog_tar_$1-$_am_tools} +# Do not fold the above two line into one, because Tru64 sh and +# Solaris sh will not grok spaces in the rhs of `-'. +for _am_tool in $_am_tools +do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; + do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi +done +rm -rf conftest.dir + +AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) +AC_MSG_RESULT([$am_cv_prog_tar_$1])]) +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + +m4_include([acinclude.m4]) diff --git a/src/array.c b/src/array.c new file mode 100644 index 0000000..e0f2f77 --- /dev/null +++ b/src/array.c @@ -0,0 +1,87 @@ +/* This file is part of the nesC compiler. + +This file is derived from the RC Compiler. It is thus + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include +#include +#include +#include "array.h" + +struct array { + region sameregion r; + void *sameregion data; + size_t elemsize; + type_t elemtype; + size_t nelems, nalloc; +}; + +struct array *new_array(region r, size_t initialsize, + size_t typesize, type_t typeinfo) +{ + struct array *a = ralloc(r, struct array); + + a->r = r; + a->data = typed_rarrayalloc(r, initialsize, typesize, typeinfo); + a->elemsize = typesize; + a->elemtype = typeinfo; + a->nelems = 0; + a->nalloc = initialsize; + + return a; +} + +void *array_extend(struct array *a, int by) +{ + size_t oldelems = a->nelems; + + if (by < 0) + assert(-by <= a->nelems && by != INT_MIN); + else if (a->nelems + by > a->nalloc) + { + size_t newsize = a->nalloc * 2 + by; + void *newdata = typed_rarrayalloc(a->r, newsize, a->elemsize, a->elemtype); + + /* XXX: could work harder to support really large array sizes + (this code will fail for a->nalloc >= (max(size_t)-by)/2) */ + assert(newsize > a->nalloc); /* die when we get really big */ + typed_rarraycopy(newdata, a->data, a->nelems, a->elemsize, a->elemtype); + a->data = newdata; + a->nalloc = newsize; + } + a->nelems += by; + + return (char *)a->data + a->elemsize * oldelems; +} + +void array_reset(struct array *a) +{ + a->nelems = 0; +} + +size_t array_length(struct array *a) +{ + return a->nelems; +} + +void *array_data(struct array *a) +{ + return a->data; +} + diff --git a/src/array.h b/src/array.h new file mode 100644 index 0000000..b849f51 --- /dev/null +++ b/src/array.h @@ -0,0 +1,69 @@ +/* This file is part of the nesC compiler. + +This file is derived from the RC Compiler. It is thus + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef ARRAY_H +#define ARRAY_H + +/* A region-based growable array type */ + +#include + +struct array; + +struct array *new_array(region r, size_t initialsize, + size_t typesize, type_t typeinfo); +void *array_extend(struct array *a, int by); +void array_reset(struct array *a); +size_t array_length(struct array *a); +void *array_data(struct array *a); + + +#define DECLARE_ARRAY(name, type) \ +typedef struct name ## _a *name; \ +name new_ ## name(region r, size_t initialsize); \ +type *name ## _extend(name a, int by); \ +void name ## _reset(name a); \ +size_t name ## _length(name a); \ +type *name ## _data(name a); + +#define DEFINE_ARRAY(name, type) \ +name new_ ## name(region r, size_t initialsize) \ +{ \ + return (name)new_array(r, initialsize, sizeof(type), rctypeof(type)); \ +} \ +type *name ## _extend(name a, int by) \ +{ \ + return array_extend((struct array *)a, by); \ +} \ +void name ## _reset(name a) \ +{ \ + return array_reset((struct array *)a); \ +} \ +size_t name ## _length(name a) \ +{ \ + return array_length((struct array *)a); \ +} \ +type *name ## _data(name a) \ +{ \ + return array_data((struct array *)a); \ +} + +#endif diff --git a/src/attributes.c b/src/attributes.c new file mode 100644 index 0000000..c00199c --- /dev/null +++ b/src/attributes.c @@ -0,0 +1,396 @@ +#include "parser.h" +#include "attributes.h" +#include "semantics.h" +#include "nesc-semantics.h" +#include "nesc-attributes.h" +#include "machine.h" +#include "c-parse.h" +#include "constants.h" +#include "AST_utils.h" + +/* Provide warnings about ignored attributes and attribute lists */ + +void ignored_attribute(attribute attr) +{ + warning_with_location(attr->location, "`%s' attribute directive ignored", + attr->word1->cstring.data); +} + +void ignored_gcc_attribute(gcc_attribute attr) +{ + ignored_attribute(CAST(attribute, attr)); +} + +void ignored_nesc_attribute(nesc_attribute attr) +{ + ignored_attribute(CAST(attribute, attr)); +} + +void ignored_attributes(attribute alist) +{ + scan_attribute (alist, alist) + ignored_attribute(alist); +} + +void ignored_dd_attributes(dd_list alist) +{ + dd_list_pos attr; + + if (alist) + dd_scan (attr, alist) + ignored_attribute(DD_GET(attribute, attr)); +} + +cval gcc_attr_get_constant(gcc_attribute attr) +{ + if (!attr->args || attr->args->next || !attr->args->cst) + return cval_top; + else + return attr->args->cst->cval; +} + +const char *gcc_attr_get_word(gcc_attribute attr) +{ + if (attr->args && !attr->args->next && is_identifier(attr->args)) + return CAST(identifier, attr->args)->cstring.data; + + error_with_location(attr->location, "wrong number of arguments specified for `%s' attribute", + attr->word1->cstring.data); + + return NULL; +} + +static size_t max_useful_alignment(void) +{ + size_t max_align = 0; + + /* Of current machine. Returns max of long double, long long, int8 and ptr + alignment (ok, this is a slight hack, but it seems unlikely that other + smaller types will have worse restrictions) */ +#define IMAX(a) if (max_align < a) max_align = a + IMAX(target->int8_align); + IMAX(target->tptr.align); + IMAX(target->tlong_double.align); + IMAX(target->tlong_long.align); +#undef IMAX + + return max_align; +} + +static cval get_alignment(gcc_attribute attr) +{ + cval arg; + + if (!attr->args) + return make_cval_unsigned(max_useful_alignment(), size_t_type); + + arg = gcc_attr_get_constant(attr); + if (cval_isinteger(arg)) + if (ilog2(cval_uint_value(arg)) != -1) + return cval_cast(arg, size_t_type); + else + error("requested alignment is not a power of 2"); + else + error("requested alignment is not a constant"); + + return cval_top; +} + +/* handle_X_attribute(attr, obj): + Attempt to apply attribute attr to obj of kind X (decl, field, tag, type), + modifying obj. + + For decls, fields, tags: + If attr is not applicable: issue a warning with ignored_attributes + For types: + Return TRUE if applicable, FALSE if not + (this difference is due to the funky rules of attributes used as type qualifiers) +*/ + +static void transparent_union_argument(data_declaration ddecl) +{ + ddecl->type = make_qualified_type + (ddecl->type, type_qualifiers(ddecl->type) | transparent_qualifier); +} + +static bool require_function(gcc_attribute attr, data_declaration ddecl) +{ + if (ddecl->kind == decl_function && ddecl->ftype == function_normal) + return TRUE; + + error_with_location(attr->location, "`%s' attribute is for external functions only", attr->word1->cstring.data); + return FALSE; +} + +bool handle_gcc_type_attribute(gcc_attribute attr, type *t) +{ + const char *name = attr->word1->cstring.data; + + if (is_attr_name(name, "combine")) + { + const char *word = gcc_attr_get_word(attr); + + if (word) + handle_combine_attribute(attr->location, word, t); + return TRUE; + } + else if (is_attr_name(name, "aligned")) + { + cval arg = get_alignment(attr); + + if (cval_isinteger(arg)) + *t = align_type(*t, arg); + return TRUE; + } + else + return target->type_attribute && target->type_attribute(attr, t); +} + +void handle_gcc_decl_attribute(gcc_attribute attr, data_declaration ddecl) +{ + const char *name = attr->word1->cstring.data; + + if (is_attr_name(name, "transparent_union")) + { + if (attr->args) + error_with_location(attr->location, "wrong number of arguments specified for `transparent_union' attribute"); + + if (ddecl->kind == decl_variable && ddecl->isparameter && + type_union(ddecl->type)) + transparent_union_argument(ddecl); + else if (ddecl->kind == decl_typedef && type_union(ddecl->type)) + transparent_union_argument(ddecl); + else + ignored_gcc_attribute(attr); + } + else if (is_attr_name(name, "aligned")) + { + cval arg = get_alignment(attr); + + if (cval_isinteger(arg)) + { + if (ddecl->kind == decl_variable || ddecl->kind == decl_typedef) + ddecl->type = align_type(ddecl->type, arg); + else + ignored_gcc_attribute(attr); + } + } + else if (is_attr_name(name, "mode")) + { + const char *word = gcc_attr_get_word(attr); + + if (word) + if (!handle_mode_attribute(attr->location, ddecl, word)) + ignored_gcc_attribute(attr); + } + else if (is_attr_name(name, "C")) + { + if (!ddecl->isexternalscope) + error_with_location(attr->location, "`C' attribute is for symbols with external scope only"); + else + ddecl->Cname = TRUE; + } + else if (is_attr_name(name, "spontaneous")) + { + if (require_function(attr, ddecl)) + { + /* The test avoids overriding the effect of atomic_hwevent */ + if (!ddecl->spontaneous) + ddecl->spontaneous = c_call_nonatomic; + } + } + else if (is_attr_name(name, "atomic_hwevent")) + { + if (require_function(attr, ddecl)) + { + ddecl->async = TRUE; + ddecl->spontaneous = c_call_atomic; + } + } + else if (is_attr_name(name, "hwevent")) + { + if (require_function(attr, ddecl)) + { + ddecl->async = TRUE; + ddecl->spontaneous = c_call_nonatomic; + } + } + else if (is_attr_name(name, "noinline")) + { + ddecl->noinlinep = TRUE; + } + else if (is_attr_name(name, "nx_base_le") || is_attr_name(name, "nx_base_be") || is_attr_name(name, "nx_base")) + { + const char *word = gcc_attr_get_word(attr); + + if (ddecl->kind != decl_typedef) + error_with_location(attr->location, "`%s' attribute can only be applied to typedefs", name); + else if (word) + handle_nxbase_attribute(attr->location, is_attr_name(name, "nx_base_be"), TRUE, word, ddecl); + } + else if (!(target->decl_attribute && + target->decl_attribute(attr, ddecl)) && + !handle_gcc_type_attribute(attr, &ddecl->type)) + /*ignored_gcc_attribute(attr)*/; +} + +/* Note: fdecl->bitwidth is not yet set when this is called */ +void handle_gcc_field_attribute(gcc_attribute attr, field_declaration fdecl) +{ + const char *name = attr->word1->cstring.data; + + if (is_attr_name(name, "packed")) + fdecl->packed = TRUE; + else if (is_attr_name(name, "aligned")) + { + cval arg = get_alignment(attr); + + if (cval_isinteger(arg)) + fdecl->type = align_type(fdecl->type, arg); + } + else if (!(target->field_attribute && + target->field_attribute(attr, fdecl))) + /*ignored_gcc_attribute(attr)*/; +} + +void handle_gcc_tag_attribute(gcc_attribute attr, tag_declaration tdecl) +{ + const char *name = attr->word1->cstring.data; + + if (is_attr_name(name, "transparent_union")) + { + if (attr->args) + error_with_location(attr->location, "wrong number of arguments specified for `transparent_union' attribute"); + + if (tdecl->kind == kind_union_ref) + { + tdecl->transparent_union = TRUE; + /* XXX: Missing validity checks (need cst folding I think) */ + } + else + ignored_gcc_attribute(attr); + } + else if (is_attr_name(name, "packed")) + tdecl->packed = TRUE; + else if (is_attr_name(name, "aligned")) + { + cval arg = get_alignment(attr); + + if (cval_isinteger(arg)) + tdecl->user_alignment = arg; + } + else if (is_attr_name(name, "C")) + { + if (tdecl->container_function) + error_with_location(attr->location, "`C' attribute is for symbols with external scope only"); + else + tdecl->Cname = TRUE; + } + else if (!(target->tag_attribute && + target->tag_attribute(attr, tdecl))) + /*ignored_gcc_attribute(attr)*/; +} + +void handle_nescdecl_attribute(attribute attr, nesc_declaration ndecl) +{ + handle_nesc_nescdecl_attribute(CAST(nesc_attribute, attr), ndecl); +} + +void handle_decl_attribute(attribute attr, data_declaration ddecl) +{ + if (is_gcc_attribute(attr)) + handle_gcc_decl_attribute(CAST(gcc_attribute, attr), ddecl); + else + handle_nesc_decl_attribute(CAST(nesc_attribute, attr), ddecl); +} + +void handle_field_attribute(attribute attr, field_declaration fdecl) +{ + if (is_gcc_attribute(attr)) + handle_gcc_field_attribute(CAST(gcc_attribute, attr), fdecl); + else + handle_nesc_field_attribute(CAST(nesc_attribute, attr), fdecl); +} + +void handle_tag_attribute(attribute attr, tag_declaration tdecl) +{ + if (is_gcc_attribute(attr)) + handle_gcc_tag_attribute(CAST(gcc_attribute, attr), tdecl); + else + handle_nesc_tag_attribute(CAST(nesc_attribute, attr), tdecl); +} + +bool handle_type_attribute(attribute attr, type *t) +{ + if (is_gcc_attribute(attr)) + return handle_gcc_type_attribute(CAST(gcc_attribute, attr), t); + else + { + /* nesC attributes don't have a broken syntax, so don't need + to flow up to the declaration */ + handle_nesc_type_attribute(CAST(nesc_attribute, attr), t); + return TRUE; + } +} + +/* Functions to handle regular and dd list of attributes */ + +void handle_nescdecl_attributes(attribute alist, nesc_declaration ndecl) +{ + scan_attribute (alist, alist) + handle_nescdecl_attribute(alist, ndecl); +} + +void handle_decl_attributes(attribute alist, data_declaration ddecl) +{ + scan_attribute (alist, alist) + handle_decl_attribute(alist, ddecl); +} + +void handle_field_attributes(attribute alist, field_declaration fdecl) +{ + scan_attribute (alist, alist) + handle_field_attribute(alist, fdecl); +} + +void handle_tag_attributes(attribute alist, tag_declaration tdecl) +{ + scan_attribute (alist, alist) + handle_tag_attribute(alist, tdecl); +} + +void handle_nescdecl_dd_attributes(dd_list alist, nesc_declaration ndecl) +{ + dd_list_pos attr; + + if (alist) + dd_scan (attr, alist) + handle_nescdecl_attribute(DD_GET(attribute, attr), ndecl); +} + +void handle_decl_dd_attributes(dd_list alist, data_declaration ddecl) +{ + dd_list_pos attr; + + if (alist) + dd_scan (attr, alist) + handle_decl_attribute(DD_GET(attribute, attr), ddecl); +} + +void handle_field_dd_attributes(dd_list alist, field_declaration fdecl) +{ + dd_list_pos attr; + + if (alist) + dd_scan (attr, alist) + handle_field_attribute(DD_GET(attribute, attr), fdecl); +} + +void handle_tag_dd_attributes(dd_list alist, tag_declaration tdecl) +{ + dd_list_pos attr; + + if (alist) + dd_scan (attr, alist) + handle_tag_attribute(DD_GET(attribute, attr), tdecl); +} diff --git a/src/attributes.h b/src/attributes.h new file mode 100644 index 0000000..944efc8 --- /dev/null +++ b/src/attributes.h @@ -0,0 +1,39 @@ +#ifndef ATTRIBUTES_H +#define ATTRIBUTES_H + +/* Provide warnings about ignored attributes and attribute lists */ + +void ignored_attribute(attribute attr); +void ignored_attributes(attribute alist); +void ignored_dd_attributes(dd_list alist); +void ignored_gcc_attribute(gcc_attribute attr); +void ignored_nesc_attribute(nesc_attribute attr); + +/* handle_X_attribute(attr, obj): + Attempt to apply attribute attr to obj of kind X (decl, field, tag, type), + modifying obj. + + For decls, fields, tags: + If attr is not applicable: issue a warning with ignored_attributes + For types: + Return TRUE if applicable, FALSE if not + (this difference is due to the funky rules of attributes used as type qualifiers) +*/ + +void handle_nescdecl_attribute(attribute attr, nesc_declaration ndecl); +void handle_decl_attribute(attribute attr, data_declaration ddecl); +void handle_field_attribute(attribute attr, field_declaration fdecl); +void handle_tag_attribute(attribute attr, tag_declaration tdecl); +bool handle_type_attribute(attribute attr, type *t); + +/* Functions to handle regular and dd list of attributes */ +void handle_nescdecl_attributes(attribute alist, nesc_declaration ndecl); +void handle_decl_attributes(attribute alist, data_declaration ddecl); +void handle_field_attributes(attribute alist, field_declaration fdecl); +void handle_tag_attributes(attribute alist, tag_declaration tdecl); +void handle_nescdecl_dd_attributes(dd_list alist, nesc_declaration ndecl); +void handle_decl_dd_attributes(dd_list alist, data_declaration ddecl); +void handle_field_dd_attributes(dd_list alist, field_declaration fdecl); +void handle_tag_dd_attributes(dd_list alist, tag_declaration tdecl); + +#endif diff --git a/src/autoconf.h.in b/src/autoconf.h.in new file mode 100644 index 0000000..e06784d --- /dev/null +++ b/src/autoconf.h.in @@ -0,0 +1,108 @@ +/* autoconf.h.in. Generated from configure.in by autoheader. */ + +/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP + systems. This function is required for `alloca.c' support on those systems. + */ +#undef CRAY_STACKSEG_END + +/* Define to 1 if using `alloca.c'. */ +#undef C_ALLOCA + +/* Define to 1 if you have `alloca', as a function or macro. */ +#undef HAVE_ALLOCA + +/* Define to 1 if you have and it should be used (not on Ultrix). + */ +#undef HAVE_ALLOCA_H + +/* Define to 1 if you have the `fnmatch' function. */ +#undef HAVE_FNMATCH + +/* Define if you have the iconv() function. */ +#undef HAVE_ICONV + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the `mmap' function. */ +#undef HAVE_MMAP + +/* Define to 1 if you have the `poll' function. */ +#undef HAVE_POLL + +/* Define to 1 if you have the `realpath' function. */ +#undef HAVE_REALPATH + +/* Define to 1 if you have the `regcomp' function. */ +#undef HAVE_REGCOMP + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the `strtold' function. */ +#undef HAVE_STRTOLD + +/* strtold is declared in */ +#undef HAVE_STRTOLD_DECLARED + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define as const if the declaration of iconv() needs const. */ +#undef ICONV_CONST + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* The size of `long long', as computed by sizeof. */ +#undef SIZEOF_LONG_LONG + +/* The size of `void *', as computed by sizeof. */ +#undef SIZEOF_VOID_P + +/* If using the C implementation of alloca, define if you know the + direction of stack growth for your system; otherwise it will be + automatically deduced at runtime. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ +#undef STACK_DIRECTION + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Version number of package */ +#undef VERSION diff --git a/src/build-basics.el b/src/build-basics.el new file mode 100644 index 0000000..9ef1c01 --- /dev/null +++ b/src/build-basics.el @@ -0,0 +1,153 @@ +; This file is part of the nesC compiler. +; +; This file is derived from the RC Compiler. It is thus +; Copyright (C) 2000-2001 The Regents of the University of California. +; Changes for nesC are +; Copyright (C) 2002 Intel Corporation +; +; The attached "nesC" software is provided to you under the terms and +; conditions of the GNU General Public License Version 2 as published by the +; Free Software Foundation. +; +; nesC 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 nesC; see the file COPYING. If not, write to +; the Free Software Foundation, 59 Temple Place - Suite 330, +; Boston, MA 02111-1307, USA. + +; Utility functions +(defun ins (&rest args) + (insert (apply #'format args))) + +(setq basename (car command-line-args-left)) +(setq nodedefs (cadr command-line-args-left)) +(setq command-line-args-left (cddr command-line-args-left)) + +(defmacro deffield (field-name c-type attributes) + `(deffield* ',field-name ',c-type ',attributes)) + +(defmacro deftype (type-name super-type fields documentation) + `(deftype* ',type-name ',super-type ',fields ',documentation)) + +(defmacro defnode (node-name type-name documentation) + `(defnode* ',node-name ',type-name ',documentation)) + + + +(setq fields nil) +(setq types nil) +(setq nodes nil) + +(defun deffield* (field-name c-type attributes) + (setq attributes (attributes-ok field-name attributes)) + (if (assoc field-name fields) + (message (format "Field %s already defined" field-name)) + (setq fields (cons (list field-name c-type attributes) fields)))) + +(defun deftype* (type-name super-type fields documentation) + (if (or (assoc type-name types) (assoc type-name nodes)) + (message (format "Name %s already used for a type or node" type-name)) + (setq types (cons (list type-name super-type fields documentation) types)))) + + +(defun defnode* (node-name type-name documentation) + (if (or (assoc node-name types) (assoc node-name nodes)) + (message (format "Name %s already used for a type or node" node-name)) + (setq nodes (cons (list node-name type-name documentation) nodes)))) + + +(setq legal-attributes '(init tree nodump noprint default dump-special print-special format)) + +(defun attributes-ok (field-name attrs) + (mapcar '(lambda (attr) + (let* ((realattr (if (listp attr) attr (list attr))) + (aname (car realattr))) + (if (not (member aname legal-attributes)) + (message (format "Unknown attribute %s in field %s" + aname field-name))) + realattr)) attrs)) + +(defun check-defs () + (setq types (reverse types)) + (setq nodes (reverse nodes)) + (check-types) + (check-nodes)) + +(defun check-types () + (mapcar #'check-type types)) + +(defun check-type (type) + (mapcar '(lambda (field-name) + (if (not (assoc field-name fields)) + (message (format "Unknown field %s in %s" field-name (car type))))) + (type-fields type)) + (if (and (type-super-type type) + (not (assoc (type-super-type type) types))) + (message (format "Unknown super-type %s in %s" + (type-super-type type) (type-name type))))) + + +(defun check-nodes () + (mapcar #'check-node nodes)) + +(defun check-node (node) + (if (not (assoc (node-type node) types)) + (message (format "Unknown type %s in node %s" + (node-type node) (node-name node))))) + +(defun build-file (name) + (setq name (concat basename "_" name)) + (let ((buffer (create-file-buffer name)) + (debug-on-error (or debug-on-error + (interactive-p)))) + (if debug-on-error + (switch-to-buffer buffer) + (set-buffer buffer)) + (fill-buffer) + (write-file name) + (unless debug-on-error + (kill-buffer buffer)))) + + +(require 'cl) + +(defun nodes-of (typename) + (reduce #'(lambda (l x) + (if (equal (node-type x) typename) + (cons (node-name x) l) + l)) + nodes :initial-value nil)) + +(defun all-type-fields (type) + (if (type-super-type type) + (append (all-type-fields (assoc (type-super-type type) types)) + (type-fields type)) + (type-fields type))) + +(defun caddr (x) (car (cddr x))) +(defun cadddr (x) (car (cddr (cdr x)))) + +(defalias 'type-name #'car) +(defalias 'type-super-type #'cadr) +(defalias 'type-fields #'caddr) +(defalias 'type-documentation #'cadddr) + +(defalias 'field-name #'car) +(defalias 'field-c-type #'cadr) +(defalias 'field-attributes #'caddr) + +(defalias 'node-name #'car) +(defalias 'node-type #'cadr) +(defalias 'node-documentation #'caddr) + +(defun copyright-notice () + (insert "/* Automatically generated from " nodedefs ", do not edit. */\n\n") + (insert "/* See the copyright notice in " nodedefs " */\n")) + +;; go ahead and check defs +(load-file nodedefs) +(check-defs) diff --git a/src/build-list.el b/src/build-list.el new file mode 100644 index 0000000..f8b22e8 --- /dev/null +++ b/src/build-list.el @@ -0,0 +1,114 @@ +; This file is part of the nesC compiler. +; +; This file is derived from the RC Compiler. It is thus +; Copyright (C) 2000-2001 The Regents of the University of California. +; Changes for nesC are +; Copyright (C) 2002 Intel Corporation +; +; The attached "nesC" software is provided to you under the terms and +; conditions of the GNU General Public License Version 2 as published by the +; Free Software Foundation. +; +; nesC 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 nesC; see the file COPYING. If not, write to +; the Free Software Foundation, 59 Temple Place - Suite 330, +; Boston, MA 02111-1307, USA. + +(load-file "build-basics.el") + +(setq list-base-type (car command-line-args-left)) + +(setq all-type-names (append (mapcar #'type-name types) + (mapcar #'node-name nodes))) +(defun fill-buffer () + (copyright-notice) + (write-base-function-headers) + (mapc #'write-macros all-type-names) + (mapc #'write-function-headers all-type-names) + ) + +(defun write-base1 (fname result) + (ins "%s %s_%s_%s(%s l)" + result basename list-base-type fname + list-base-type)) + +(defun write-base2 (fname result) + (ins "%s %s_%s_%s(%s l1, %s l2)" + result basename list-base-type fname + list-base-type list-base-type)) + +(defun write-base-function-headers () + (write-base1 "last" list-base-type) (ins ";\n") + (write-base2 "chain" list-base-type) (ins ";\n") + (write-base1 "length" "int") (ins ";\n") + (write-base1 "reverse" list-base-type) (ins ";\n")) + +(defun write-macros (name) + (ins "#define %s_reverse(x) CAST(%s, %s_%s_reverse(CAST(%s, (x))))\n" + name name basename list-base-type list-base-type) + (ins "#define %s_length(x) %s_%s_length(CAST(%s, (x)))\n" + name basename list-base-type list-base-type) + (ins "#define last_%s(x) CAST(%s, %s_%s_last(CAST(%s, (x))))\n" + name name basename list-base-type list-base-type) + (ins "#define scan_%s(var, list) for (var = (list); var; var = CAST(%s, var->next))\n" name name)) + +(defun write-function-headers (name) + (ins "%s %s_chain(%s l1, %s l2);\n" name name name name)) + +(build-file (format "list_%s.h" list-base-type)) + +(defun fill-buffer () + (copyright-notice) + (write-base-function-source) + (mapc #'write-function-source all-type-names)) + +(defun write-base-function-source () + (write-base1 "last" list-base-type) + (ins "{\n") + (ins " if (!l) return NULL;\n") + (ins " while (l->next) l = l->next;\n") + (ins " return l;\n") + (ins "}\n\n") + + (write-base2 "chain" list-base-type) + (ins "{\n") + (ins " if (!l1) return l2;\n") + (ins " %s_%s_last(l1)->next = l2;\n" basename list-base-type) + (ins " return l1;\n") + (ins "}\n\n") + + (write-base1 "length" "int") + (ins "{\n") + (ins " int len = 0;\n\n") + (ins " while (l) \n") + (ins " {\n") + (ins " l = l->next;\n") + (ins " len++;\n") + (ins " }\n") + (ins " return len;\n") + (ins "}\n\n") + + (write-base1 "reverse" list-base-type) + (ins "{\n") + (ins " %s last = NULL, next;\n\n" list-base-type) + (ins " for (;;)\n") + (ins " {\n") + (ins " if (!l)\n") + (ins " return last;\n") + (ins " next = l->next;\n") + (ins " l->next = last;\n") + (ins " last = l;\n") + (ins " l = next;\n") + (ins " }\n") + (ins "}\n\n")) + +(defun write-function-source (name) + (ins "%s %s_chain(%s l1, %s l2)\n" name name name name) + (ins "{ return CAST(%s, %s_%s_chain(CAST(%s, l1), CAST(%s, l2))); }\n\n" name basename list-base-type list-base-type list-base-type)) + +(build-file (format "list_%s.c" list-base-type)) diff --git a/src/build-parent.el b/src/build-parent.el new file mode 100644 index 0000000..85ec050 --- /dev/null +++ b/src/build-parent.el @@ -0,0 +1,52 @@ +; This file is part of the nesC compiler. +; +; This file is derived from the RC Compiler. It is thus +; Copyright (C) 2000-2001 The Regents of the University of California. +; Changes for nesC are +; Copyright (C) 2002 Intel Corporation +; +; The attached "nesC" software is provided to you under the terms and +; conditions of the GNU General Public License Version 2 as published by the +; Free Software Foundation. +; +; nesC 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 nesC; see the file COPYING. If not, write to +; the Free Software Foundation, 59 Temple Place - Suite 330, +; Boston, MA 02111-1307, USA. + +;; Build a function to set the parent and parent_ptr nodes in a tree + +(load-file "build-basics.el") + +(defun fill-buffer () + (copyright-notice) + (mapcar #'write-parent-type types)) + +(defun write-parent-type (type) + (let* ((name (type-name type)) + (synonyms (nodes-of name))) + (mapcar #'write-parent-case (cons name synonyms)) + (let ((tree-fields + (remove-if-not + #'(lambda (field) + (assoc 'tree (field-attributes (assoc field fields)))) + (all-type-fields type)))) + (if tree-fields + (progn + (insert (format "{\n %s x = CAST(%s, n);\n\n" name name)) + (mapcar #'write-parent-field tree-fields) + (insert " break;\n}\n")) + (insert "break;\n"))))) + +(defun write-parent-case (name) + (insert (format "case kind_%s: " name))) + +(defun write-parent-field (field) + (insert (format " AST_set_parent_list(&x->%s, n);\n" field))) + +(build-file "parent.c") diff --git a/src/build-print.el b/src/build-print.el new file mode 100644 index 0000000..48c6138 --- /dev/null +++ b/src/build-print.el @@ -0,0 +1,53 @@ +; This file is part of the nesC compiler. +; +; This file is derived from the RC Compiler. It is thus +; Copyright (C) 2000-2001 The Regents of the University of California. +; Changes for nesC are +; Copyright (C) 2002 Intel Corporation +; +; The attached "nesC" software is provided to you under the terms and +; conditions of the GNU General Public License Version 2 as published by the +; Free Software Foundation. +; +; nesC 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 nesC; see the file COPYING. If not, write to +; the Free Software Foundation, 59 Temple Place - Suite 330, +; Boston, MA 02111-1307, USA. + +;; Build a function to set the parent and parent_ptr nodes in a tree + +(load-file "build-basics.el") + +(defun fill-buffer () + (copyright-notice) + (mapc #'(lambda (type) (write-print (type-name type) type)) types) + (mapc #'(lambda (node) (write-print (node-name node) + (assoc (node-type node) types))) nodes)) + +(defun write-print (name type) + (write-print-case name) + (let ((tree-fields + (remove-if-not + #'(lambda (field) + (assoc 'tree (field-attributes (assoc field fields)))) + (all-type-fields type)))) + (if tree-fields + (progn + (insert (format "{\n %s x = CAST(%s, n);\n\n" name name)) + (insert (format " puts(\"%s\");\n" name)) + (mapcar #'write-print-field tree-fields) + (insert " break;\n}\n")) + (insert (format "puts(\"%s\"); break;\n" name))))) + +(defun write-print-case (name) + (insert (format "case kind_%s: " name))) + +(defun write-print-field (field) + (insert (format " pindent(indent); puts(\"%s:\"); AST_print_list(indent + 1, x->%s);\n" field field))) + +(build-file "print.c") diff --git a/src/build-types.el b/src/build-types.el new file mode 100644 index 0000000..8bf1ff9 --- /dev/null +++ b/src/build-types.el @@ -0,0 +1,242 @@ + ; This file is part of the nesC compiler. + ; + ; This file is derived from the RC Compiler. It is thus + ; Copyright (C) 2000-2001 The Regents of the University of California. + ; Changes for nesC are + ; Copyright (C) 2002 Intel Corporation + ; + ; The attached "nesC" software is provided to you under the terms and + ; conditions of the GNU General Public License Version 2 as published by the + ; Free Software Foundation. + ; + ; nesC 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 nesC; see the file COPYING. If not, write to + ; the Free Software Foundation, 59 Temple Place - Suite 330, + ; Boston, MA 02111-1307, USA. + +(load-file "build-basics.el") + +(setq kind_type (concat basename "_kind")) + +(setq all-type-names (append (mapcar #'type-name types) + (mapcar #'node-name nodes))) +(setq parent-types + (append + (mapcar #'(lambda (type) (cons (type-name type) (type-super-type type))) + types) + (mapcar #'(lambda (node) (cons (node-name node) (node-type node))) + nodes))) + +(defun parentof (name) + (cdr (assoc name parent-types))) + +(setq dfsnumbering nil) + + ; This is not winning any complexity prizes +(defun dfsnumber (name nextid) + (let ((myid nextid)) + (mapc #'(lambda (child) + (if (equal (parentof child) name) + (setq nextid (dfsnumber child (1+ nextid))))) + all-type-names) + (setq dfsnumbering (acons name (cons myid nextid) dfsnumbering)) + nextid)) + +(reduce + #'(lambda (nextid type) + (if (eq (type-super-type type) '()) + (1+ (dfsnumber (type-name type) nextid)) + nextid)) + types :initial-value (string-to-number (car command-line-args-left))) + +(setq dfsnumbering (sort dfsnumbering #'(lambda (entry1 entry2) (< (cadr entry1) (cadr entry2))))) + +(defun fill-buffer () + (copyright-notice) + (mapc #'write-typedefs types) + (mapc #'write-node-typedefs nodes) + (ins "typedef enum {\n") ; + (mapc #'write-kinds all-type-names) + (backward-delete-char 2) + (ins "\n} %s;\n" kind_type) + (ins "\nextern %s %s_parent_kind[]; /* indexed by kind - kind_node */\n" + kind_type basename) + (ins "\nextern %s %s_post_kind[]; /* indexed by kind - kind_node */\n" + kind_type basename) + (ins "\nextern size_t %s_sizeof[]; /* indexed by kind - kind_node */\n" + basename) + (ins "\nextern type_t %s_typeof[]; /* indexed by kind - kind_node */\n" + basename) + (mapc #'write-is-test all-type-names) + (write-cast)) + +(defun write-typedefs (type) + (ins "typedef struct %s_%s *%s;\n" + basename (type-name type) (type-name type))) + +(defun write-node-typedefs (node) + (ins "typedef struct %s_%s *%s;\n" + basename (node-type node) (node-name node))) + +(defun write-kinds (name) + (ins " kind_%s = %s,\n" name (cadr (assoc name dfsnumbering))) + (ins " postkind_%s = %s,\n" name (cddr (assoc name dfsnumbering)))) + + ; We should use this one, but I don't feel like changing every is_xxx just now. +(defun write-is-test2 (name) + (ins "#define IS_%s(x) ((x)->kind >= kind_%s && (x)->kind <= postkind_%s)\n" + (upcase (format "%s" name)) name name)) + +(defun write-is-test (name) + (ins "#define is_%s(x) ((x)->kind >= kind_%s && (x)->kind <= postkind_%s)\n" + name name name)) + +(defun write-cast () + (ins "typedef struct\n") + (ins "{\n") + (ins " AST_kind kind;\n") + (ins "} *%s_generic;\n\n" basename) + (ins "#ifdef __GNUC__\n") + (ins "#define %s_CAST(type, x) ({%s_generic tEmPcast = (%s_generic)(x); if (tEmPcast) assert(is_ ## type(tEmPcast)); (type)(tEmPcast); })\n" basename basename basename) + (ins "#define %s_CASTPTR(type, x) ({%s_generic *tEmPcast = (%s_generic *)(x); if (tEmPcast && *tEmPcast) assert(is_ ## type(*tEmPcast)); (type *)(tEmPcast); })\n" basename basename basename) + (ins "#define %s_CASTSRPTR(type, x) ({%s_generic *tEmPcast = (%s_generic *)(x); if (tEmPcast && *tEmPcast) assert(is_ ## type(*tEmPcast)); (type sameregion *)(tEmPcast); })\n" basename basename basename) + (ins "#else\n") + (ins "/* Could also generate some code to make this safe */\n") + (ins "#define %s_CAST(type, x) ((type)(x))\n" basename) + (ins "#define %s_CASTPTR(type, x) ((type *)(x))\n" basename) + (ins "#define %s_CASTSRPTR(type, x) ((type sameregion *)(x))\n" basename) + (ins "#endif\n")) + +(build-file "types.h") + +(defun fill-buffer () + (copyright-notice) + (mapc #'write-type types) + (ins "\n\n") + (mapc #'(lambda (type) (write-creator (type-name type) type)) types) + (mapc #'(lambda (node) (write-creator (node-name node) (assoc (node-type node) types))) nodes)) + +(defun write-type (type) + (ins "/* %s */\n" (type-documentation type)) + (ins "struct %s_%s { /* extends %s */\n" + basename (type-name type) (type-super-type type)) + (write-fields type) + (ins "};\n\n")) + +(defun write-fields (type) + (if (type-super-type type) + (write-fields (assoc (type-super-type type) types)) + (ins " %s kind;\n" kind_type)) + (mapc '(lambda (field-name) + (let ((field (assoc field-name fields))) + (insert " " + (if (assoc 'format (field-attributes field)) + (format (field-c-type field) field-name) + (format "%s %s%s" (field-c-type field) + (if (assoc 'tree (field-attributes field)) + "sameregion " "") + field-name)) + ";\n"))) + (type-fields type))) + +(defun write-creator (name type) + (write-creator-header name type) + (ins ";\n")) + +(defun write-creator-header (name type) + (ins "%s new_%s(region r" name name) + (let ((write-creator-fields + #'(lambda (type) + (if (type-super-type type) + (funcall write-creator-fields + (assoc (type-super-type type) types))) + (mapcar #'(lambda (field-name) + (let ((field (assoc field-name fields))) + (if (assoc 'init (field-attributes field)) + (ins ", %s %s" + (field-c-type field) + field-name)))) + (type-fields type))))) + (funcall write-creator-fields type)) + (ins ")")) + +(build-file "defs.h") + +(defun fill-buffer () + (copyright-notice) + (mapc #'(lambda (type) (write-creator-source (type-name type) type)) types) + (mapc #'(lambda (node) (write-creator-source (node-name node) (assoc (node-type node) types))) nodes) + (ins "\n\n") + (write-parent-kinds) + (write-post-kinds) + (write-sizes) + (write-types)) + +(defun write-creator-source (name type) + (write-creator-header name type) + (ins "\n{\n") + (ins " %s obj = ralloc(r, struct %s_%s);\n\n" + name basename (type-name type)) + (ins " obj->kind = kind_%s;\n" name) + (let ((write-creator-fields + #'(lambda (type) + (if (type-super-type type) + (funcall write-creator-fields + (assoc (type-super-type type) types))) + (mapcar #'(lambda (field-name) + (let ((field (assoc field-name fields))) + (cond ((assoc 'init (field-attributes field)) + (ins " obj->%s = %s;\n" field-name field-name)) + ((assoc 'default (field-attributes field)) + (ins " obj->%s = %s;\n" + field-name + (cadr (assoc 'default (field-attributes field)))))))) + (type-fields type))))) + (funcall write-creator-fields type)) + (ins "\n return obj;\n}\n\n")) + +(defun write-parent-kinds () + (ins "%s %s_parent_kind[] = {\n" kind_type basename) + (mapc #'(lambda (dfs_entry) + (let ((parent (parentof (car dfs_entry)))) + (if parent + (ins " kind_%s,\n" parent) + (ins " 0,\n")))) + dfsnumbering) + (ins "};\n\n")) + +(defun write-post-kinds () + (ins "%s %s_post_kind[] = {\n" kind_type basename) + (mapc #'(lambda (dfs_entry) + (ins " postkind_%s,\n" (car dfs_entry))) + dfsnumbering) + (ins "};\n\n")) + +(defun struct-name (name) + (let ((node-entry (assoc name nodes))) + (if node-entry (node-type node-entry) + name))) + +(defun write-sizes () + (ins "size_t %s_sizeof[] = {\n" basename) + (mapc #'(lambda (dfs_entry) + (ins " sizeof(struct %s_%s),\n" + basename (struct-name (car dfs_entry)))) + dfsnumbering) + (ins "};\n\n")) + +(defun write-types () + (ins "type_t %s_typeof[] = {\n" basename) + (mapc #'(lambda (dfs_entry) + (ins " rctypeof(struct %s_%s),\n" + basename (struct-name (car dfs_entry)))) + dfsnumbering) + (ins "};\n\n")) + +(build-file "types.c") + diff --git a/src/build-walk.el b/src/build-walk.el new file mode 100644 index 0000000..dca5a89 --- /dev/null +++ b/src/build-walk.el @@ -0,0 +1,51 @@ +; This file is part of the nesC compiler. +; +; This file is derived from the RC Compiler. It is thus +; Copyright (C) 2000-2001 The Regents of the University of California. +; Changes for nesC are +; Copyright (C) 2002 Intel Corporation +; +; The attached "nesC" software is provided to you under the terms and +; conditions of the GNU General Public License Version 2 as published by the +; Free Software Foundation. +; +; nesC 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 nesC; see the file COPYING. If not, write to +; the Free Software Foundation, 59 Temple Place - Suite 330, +; Boston, MA 02111-1307, USA. + +;; Build a function to set the parent and parent_ptr nodes in a tree + +(load-file "build-basics.el") + +(defun fill-buffer () + (copyright-notice) + (mapc #'(lambda (type) (write-walk (type-name type) type)) types) + (mapc #'(lambda (node) (write-walk (node-name node) + (assoc (node-type node) types))) nodes)) + +(defun write-walk (name type) + (let ((tree-fields + (remove-if-not + #'(lambda (field) + (assoc 'tree (field-attributes (assoc field fields)))) + (all-type-fields type)))) + (if tree-fields + (progn + (write-walk-case name) + (insert (format "{\n %s x = CAST(%s, n);\n\n" name name)) + (mapcar #'write-walk-field tree-fields) + (insert " break;\n}\n"))))) + +(defun write-walk-case (name) + (insert (format "case kind_%s: " name))) + +(defun write-walk-field (field) + (insert (format " AST_walk_list(s, d, (node *)&x->%s);\n" field field))) + +(build-file "walk_children.c") diff --git a/src/c-gperf.h b/src/c-gperf.h new file mode 100644 index 0000000..5728730 --- /dev/null +++ b/src/c-gperf.h @@ -0,0 +1,258 @@ +/* C code produced by gperf version 3.0.1 */ +/* Command-line: gperf -p -j1 -i 1 -g -o -t -G -N is_reserved_word -k'1,3,8,$' */ + +#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ + && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ + && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ + && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ + && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ + && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ + && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ + && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ + && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ + && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ + && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ + && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ + && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ + && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ + && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ + && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ + && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ + && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ + && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ + && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ + && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ + && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ + && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) +/* The character set is not based on ISO-646. */ +error "gperf generated tables don't work with this execution character set. Please report a bug to ." +#endif + + +/* This file is part of the nesC compiler. +This file is derived from the RC and the GNU C Compiler. It is thus + Copyright (C) 1987, 88, 89, 92-7, 1998 Free Software Foundation, Inc. + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ +/* Command-line: gperf -p -j1 -i 1 -g -o -t -N is_reserved_word -k1,3,$ c-parse.gperf */ +struct resword { char *name; short token; enum rid rid; }; + +#define TOTAL_KEYWORDS 88 +#define MIN_WORD_LENGTH 2 +#define MAX_WORD_LENGTH 18 +#define MIN_HASH_VALUE 10 +#define MAX_HASH_VALUE 151 +/* maximum key range = 142, duplicates = 0 */ + +#ifdef __GNUC__ +__inline +#else +#ifdef __cplusplus +inline +#endif +#endif +static unsigned int +hash (str, len) + register const char *str; + register unsigned int len; +{ + static unsigned char asso_values[] = + { + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 152, 152, 1, 152, 34, 53, 5, + 34, 2, 19, 41, 2, 16, 152, 54, 50, 23, + 2, 31, 66, 152, 25, 14, 1, 61, 50, 22, + 6, 8, 2, 152, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 152, 152, 152 + }; + register int hval = len; + + switch (hval) + { + default: + hval += asso_values[(unsigned char)str[7]]; + /*FALLTHROUGH*/ + case 7: + case 6: + case 5: + case 4: + case 3: + hval += asso_values[(unsigned char)str[2]]; + /*FALLTHROUGH*/ + case 2: + case 1: + hval += asso_values[(unsigned char)str[0]]; + break; + } + return hval + asso_values[(unsigned char)str[len - 1]]; +} + +static struct resword wordlist[] = + { + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"event", SCSPEC, RID_EVENT | RID_NESC}, + {"extern", SCSPEC, RID_EXTERN}, + {""}, + {"const", TYPE_QUAL, const_qualifier}, + {"__const", TYPE_QUAL, const_qualifier}, + {"nx_union", NX_UNION, NORID}, + {""}, + {"__const__", TYPE_QUAL, const_qualifier}, + {"nx_struct", NX_STRUCT, NORID}, + {"continue", CONTINUE, NORID}, + {"__complex__", TYPESPEC, RID_COMPLEX}, + {"int", TYPESPEC, RID_INT}, + {"else", ELSE, NORID}, + {"__complex", TYPESPEC, RID_COMPLEX}, + {"extends", EXTENDS, RID_NESC}, + {"case", CASE, NORID}, + {""}, + {"__imag__", IMAGPART, NORID}, + {""}, + {"__inline", SCSPEC, RID_INLINE}, + {"__inline__", SCSPEC, RID_INLINE}, + {"__extension__", EXTENSION, NORID}, + {"__typeof__", TYPEOF, NORID}, + {"interface", INTERFACE, NORID}, + {"return", RETURN, NORID}, + {"norace", SCSPEC, RID_NORACE}, + {"__real__", REALPART, NORID}, + {"if", IF, NORID}, + {"switch", SWITCH, NORID}, + {""}, + {"component", COMPONENT, NORID}, + {"sizeof", SIZEOF, NORID}, + {""}, + {"__asm__", ASM_KEYWORD, NORID}, + {""}, + {"while", WHILE, NORID}, + {"struct", STRUCT, NORID}, + {"configuration", CONFIGURATION, NORID}, + {"__typeof", TYPEOF, NORID}, + {"new", NEW, RID_NESC}, + {"as", AS, RID_NESC}, + {"short", TYPESPEC, RID_SHORT}, + {"async", SCSPEC, RID_ASYNC | RID_NESC}, + {"__restrict", TYPE_QUAL, restrict_qualifier}, + {"components", COMPONENTS, RID_NESC}, + {"generic", GENERIC, NORID}, + {"float", TYPESPEC, RID_FLOAT}, + {"includes", INCLUDES, NORID}, + {"abstract", ABSTRACT, RID_NESC}, + {"static", SCSPEC, RID_STATIC}, + {"__signed__", TYPESPEC, RID_SIGNED}, + {"default", DEFAULT, NORID}, + {"__label__", LABEL, NORID}, + {"__asm", ASM_KEYWORD, NORID}, + {"__imag", IMAGPART, NORID}, + {"module", MODULE, NORID}, + {""}, + {"do", DO, NORID}, + {"char", TYPESPEC, RID_CHAR}, + {"command", SCSPEC, RID_COMMAND | RID_NESC}, + {"auto", SCSPEC, RID_AUTO}, + {""}, + {"for", FOR, NORID}, + {"task", SCSPEC, RID_TASK | RID_NESC}, + {"inline", SCSPEC, RID_INLINE}, + {""}, + {"atomic", ATOMIC, NORID}, + {"goto", GOTO, NORID}, + {"__alignof__", ALIGNOF, NORID}, + {"__volatile", TYPE_QUAL, volatile_qualifier}, + {"__volatile__", TYPE_QUAL, volatile_qualifier}, + {"uses", USES, RID_NESC}, + {"__real", REALPART, NORID}, + {"asm", ASM_KEYWORD, NORID}, + {"union", UNION, NORID}, + {"post", POST, RID_NESC}, + {""}, {""}, {""}, {""}, + {"enum", ENUM, NORID}, + {"__signed", TYPESPEC, RID_SIGNED}, + {"typeof", TYPEOF, NORID}, + {"typedef", SCSPEC, RID_TYPEDEF}, + {"__alignof", ALIGNOF, NORID}, + {"signed", TYPESPEC, RID_SIGNED}, + {"offsetof", OFFSETOF, NORID}, + {"long", TYPESPEC, RID_LONG}, + {""}, {""}, + {"implementation", IMPLEMENTATION, RID_NESC}, + {"__attribute", ATTRIBUTE, NORID}, + {"__attribute__", ATTRIBUTE, NORID}, + {"double", TYPESPEC, RID_DOUBLE}, + {"void", TYPESPEC, RID_VOID}, + {""}, {""}, + {"__builtin_offsetof", OFFSETOF, NORID}, + {""}, + {"call", CALL, RID_NESC}, + {""}, + {"signal", SIGNAL, RID_NESC}, + {"volatile", TYPE_QUAL, volatile_qualifier}, + {""}, + {"break", BREAK, NORID}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"register", SCSPEC, RID_REGISTER}, + {""}, {""}, + {"__builtin_va_arg", VA_ARG, NORID}, + {""}, {""}, {""}, {""}, {""}, + {"provides", PROVIDES, RID_NESC}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"unsigned", TYPESPEC, RID_UNSIGNED} + }; + +#ifdef __GNUC__ +__inline +#endif +struct resword * +is_reserved_word (str, len) + register const char *str; + register unsigned int len; +{ + if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) + { + register int key = hash (str, len); + + if (key <= MAX_HASH_VALUE && key >= 0) + { + register const char *s = wordlist[key].name; + + if (*str == *s && !strcmp (str + 1, s + 1)) + return &wordlist[key]; + } + } + return 0; +} diff --git a/src/c-lex-int.h b/src/c-lex-int.h new file mode 100644 index 0000000..b2d345a --- /dev/null +++ b/src/c-lex-int.h @@ -0,0 +1,31 @@ +/* This file is part of the nesC compiler. + +This file is derived from RC and the GNU C Compiler. It is thus + Copyright (C) 1987, 88, 89, 92-7, 1998 Free Software Foundation, Inc. + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef C_LEX_INT_H +#define C_LEX_INT_H + +/* Private parser-lexer interface */ + +struct yystype; +int yylex(struct yystype *lvalp); + +#endif diff --git a/src/c-lex-state.h b/src/c-lex-state.h new file mode 100644 index 0000000..2ffa8ee --- /dev/null +++ b/src/c-lex-state.h @@ -0,0 +1,36 @@ +#ifndef C_LEX_STATE_H +#define C_LEX_STATE_H + +#include "c-parse.h" + +extern int input_file_stack_tick; + +struct file_stack +{ + struct file_stack *next; + struct location l; +}; + +struct cpp_print +{ + FILE *outf; /* Stream to write to. */ + const struct cpp_token *prev; /* Previous token. */ + const struct cpp_token *source; /* Source token for spacing. */ + int src_line; /* Line number currently being written. */ + unsigned char printed; /* Nonzero if something output at line. */ + bool first_time; /* pp_file_change hasn't been called yet. */ + bool avoid_paste; +}; + +struct lex_state +{ + struct cpp_reader *finput; + struct line_maps *line_map; + struct file_stack *input; + int token_s1, token_s2; + struct yystype token_l1, token_l2; + struct cpp_print pp; +}; + + +#endif diff --git a/src/c-lex.c b/src/c-lex.c new file mode 100644 index 0000000..5ed5150 --- /dev/null +++ b/src/c-lex.c @@ -0,0 +1,840 @@ +/* This file is part of the nesC compiler. + +This file is derived from RC and the GNU C Compiler. It is thus + Copyright (C) 1987, 88, 89, 92-7, 1998 Free Software Foundation, Inc. + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include "parser.h" +#include +#include + +#include "c-lex.h" +#include "c-lex-int.h" +#include "c-parse.h" +#include "c-parse.tab.h" +#include "semantics.h" +#include "constants.h" +#include "nesc-cpp.h" +#include "machine.h" +#include "nesc-paths.h" + +#include "gcc-cpp.h" + + +static char_array doc_string; +static location doc_location; + +DECLARE_ARRAY(string_array, cpp_string) +DEFINE_ARRAY(string_array, cpp_string) +static string_array string_sequence; + +/* Last token read. Used in syntax error reports. */ +static const cpp_token *last_token; + +location dummy_location, toplevel_location; + +int input_file_stack_tick; + +/* Location cache handling */ +static location last_allocated_location; + +location make_location(struct location l) +{ + if (l.lineno == last_allocated_location->lineno && + l.filename == last_allocated_location->filename && + l.container == last_allocated_location->container && + l.in_system_header == last_allocated_location->in_system_header) + return last_allocated_location; + + last_allocated_location = ralloc(parse_region, struct location); + *last_allocated_location = l; + + return last_allocated_location; +} + +location new_location(const char *filename, int lineno) +{ + location l = ralloc(parse_region, struct location); + + l->filename = filename; + l->lineno = lineno; + l->in_system_header = FALSE; + + return l; +} + +void set_lex_location(location loc) +{ + const struct line_map *new_line; + + new_line = linemap_add(current.lex.line_map, LC_RENAME, 0, + loc->filename, loc->lineno); + current.lex.input->l = *loc; +} + +static location last_location(void) +{ + return make_location(current.lex.input->l); +} + + +static void push_input(void) +{ + /* Pushing to a new file. */ + struct file_stack *p = ralloc(current.fileregion, struct file_stack); + + p->next = current.lex.input; + p->l.filename = NULL; + p->l.lineno = 0; + p->l.in_system_header = FALSE; + p->l.container = NULL; + current.lex.input = p; + + input_file_stack_tick++; +} + +static void pop_input(void) +{ + current.lex.input = current.lex.input->next; + input_file_stack_tick++; +} + +static void cb_file_change(cpp_reader *reader, const struct line_map *new_map) +{ + if (new_map == NULL) + return; + + if (new_map->reason == LC_ENTER) + { + if (!MAIN_FILE_P(new_map)) + { + int included_at = LAST_SOURCE_LINE(new_map - 1); + current.lex.input->l.lineno = included_at; + } + push_input(); + } + else if (new_map->reason == LC_LEAVE) + pop_input(); + + current.lex.input->l.in_system_header = new_map->sysp != 0; + /* The filename must last till the end of compilation */ + current.lex.input->l.filename = rstrdup(permanent, new_map->to_file); + current.lex.input->l.lineno = new_map->to_line; +} + +static void cb_line_change(cpp_reader *reader, const cpp_token *token, + int parsing_args) +{ + if (token->type != CPP_EOF && !parsing_args) + { + source_location loc = token->src_loc; + const struct line_map *map = linemap_lookup(current.lex.line_map, loc); + + current.lex.input->l.lineno = SOURCE_LINE(map, loc); + + save_pp_line_change(reader, token); + } +} + +/* Do not insert generated code into the source, instead, include it. + This allows us to build gcc automatically even for targets that + need to add or modify the reserved keyword lists. */ +#include "c-gperf.h" + +void init_lex(void) +{ + static struct location dummy, toplevel; + + dummy.lineno = 0; + dummy.filename = ""; + dummy.in_system_header = FALSE; + dummy_location = last_allocated_location = &dummy; + + toplevel.filename = ""; + toplevel.lineno = 0; + toplevel.in_system_header = FALSE; + toplevel_location = &toplevel; + + string_sequence = new_string_array(parse_region, 16); + doc_string = new_char_array(parse_region, 2048); +} + +static cpp_reader *current_reader(void) +{ + return current.lex.finput; +} + +static void start_lex_common(source_language l) +{ + cpp_options *cpp_opts; + cpp_callbacks *cpp_cbacks; + + switch (l) + { + case l_interface: case l_component: + current.lex.token_s1 = DISPATCH_NESC; + break; + case l_c: + current.lex.token_s1 = DISPATCH_C; + break; + case l_parameter: + current.lex.token_s1 = DISPATCH_PARM; + break; + case l_type: + current.lex.token_s1 = DISPATCH_TYPE; + break; + default: + assert(0); + break; + } + current.lex.token_s2 = -1; + + current.lex.line_map = ralloc(current.fileregion, struct line_maps); + linemap_init(current.lex.line_map); + current.lex.finput = cpp_create_reader(CLK_GNUC89, NULL, current.lex.line_map); + current.lex.pp.outf = NULL; + cpp_opts = cpp_get_options(current_reader()); + cpp_opts->discard_comments = 0; + cpp_opts->dollars_in_ident = 0; + cpp_opts->warn_long_long = 0; + cpp_opts->wchar_precision = CHAR_BIT * target->wchar_t_size; + cpp_opts->int_precision = CHAR_BIT * target->tint.size; + cpp_opts->precision = CHAR_BIT * target->tlong_long.size; + cpp_opts->unsigned_char = !flag_signed_char; + cpp_opts->unsigned_wchar = !target->wchar_t_signed; + cpp_opts->cplusplus_comments = 1; + cpp_opts->bytes_big_endian = target->big_endian; + + cpp_opts->warnings_are_errors = warnings_are_errors; + cpp_opts->inhibit_warnings = inhibit_warnings; + cpp_opts->trigraphs = flag_trigraphs; + cpp_opts->warn_comments = warn_comments; + cpp_opts->warn_trigraphs = warn_trigraphs; + cpp_opts->warn_unused_macros = warn_unused_macros; + cpp_opts->warn_endif_labels = warn_endif_labels || pedantic; + cpp_opts->warn_system_headers = warn_system_headers; + cpp_opts->warn_undef = warn_undef; + cpp_opts->warn_missing_include_dirs = warn_missing_include_dirs; + cpp_opts->warn_multichar = warn_multichar; + cpp_opts->warn_traditional = warn_traditional; + cpp_opts->pedantic_errors = flag_pedantic_errors; + cpp_opts->pedantic = pedantic; + + cpp_init_iconv(current_reader()); + cpp_init_special_builtins(current_reader()); + + cpp_cbacks = cpp_get_callbacks(current_reader()); + cpp_cbacks->file_change = cb_file_change; + cpp_cbacks->line_change = cb_line_change; + + set_cpp_include_path(); +} + +static void setup_macros(void) +{ + cb_file_change(current_reader(), + linemap_add(current.lex.line_map, LC_ENTER, 0, "", 0)); + + start_macro_saving(); + cb_file_change(current_reader(), + linemap_add(current.lex.line_map, LC_LEAVE, 0, NULL, 0)); +} + +bool start_lex(source_language l, const char *path) +{ + start_lex_common(l); + path = cpp_read_main_file(current_reader(), path); + setup_macros(); + + return path != NULL; +} + +void start_lex_string(source_language l, const char *string) +{ + int slen = strlen(string); + char *scopy = rstralloc(current.fileregion, slen + 2); + + /* lex input must be \n terminated */ + memcpy(scopy, string, slen); + scopy[slen] = '\n'; + scopy[slen + 1] = '\0'; + + start_lex_common(l); + cpp_push_buffer(current_reader(), (const unsigned char *)scopy, slen + 1, TRUE); + + setup_macros(); +} + +void end_lex(void) +{ + errorcount += cpp_finish(current_reader(), NULL); + cpp_destroy(current_reader()); + current.lex.finput = NULL; +} + +static cstring make_token_cstring(const cpp_token *token) +{ + unsigned int len = cpp_token_len(token) + 1; + cstring tokcs = alloc_cstring(parse_region, len); + unsigned char *end; + + end = cpp_spell_token(current_reader(), token, + (unsigned char *)tokcs.data, FALSE); + end[0] = '\0'; + tokcs.length = (char *)end - tokcs.data; + + return tokcs; +} + +static void handle_comment(const cpp_token *token) +{ + const cpp_string *comment = &token->val.str; + bool new_docstring = FALSE; + + if (!strncmp((char *)comment->text, "/**", 3)) + new_docstring = TRUE; + else if (!strncmp((char *)comment->text, "///", 3)) + { + if (doc_location && last_location()->filename == doc_location->filename && + last_location()->lineno + 1 == doc_location->lineno) + memcpy(char_array_extend(doc_string, comment->len), comment->text, + comment->len); + else + new_docstring = TRUE; + } + + if (new_docstring) + { + if (warn_unexpected_docstring && char_array_length(doc_string)) + warning_with_location(doc_location, "discarding unexpected docstring"); + + char_array_reset(doc_string); + memcpy(char_array_extend(doc_string, comment->len), comment->text, + comment->len); + doc_location = last_location(); + } +} + +bool get_raw_docstring(const char **docs, location *docl) +{ + if (char_array_length(doc_string)) + { + *char_array_extend(doc_string, 1) = '\0'; + *docs = char_array_data(doc_string); + *docl = doc_location; + char_array_reset(doc_string); + + return TRUE; + } + else + return FALSE; +} + +/* Convert a series of STRING and/or WSTRING tokens into a string, + performing string constant concatenation. TOK is the first of + these. VALP is the location to write the string into. + + This is unfortunately more work than it should be. If any of the + strings in the series has an L prefix, the result is a wide string + (6.4.5p4). Whether or not the result is a wide string affects the + meaning of octal and hexadecimal escapes (6.4.4.4p6,9). But escape + sequences do not continue across the boundary between two strings in + a series (6.4.5p7), so we must not lose the boundaries. Therefore + cpp_interpret_string takes a vector of cpp_string structures, which + we must arrange to provide. */ + +static void lex_string(const cpp_token *tok, struct yystype *lvalp) +{ + const cpp_token *first = tok; + bool wide = FALSE; + location first_loc = last_location(); + cpp_string istr; + cstring cstr; + string_cst string_components = NULL, *next_sc = &string_components; + + /* Collect all consecutive string tokens */ + string_array_reset(string_sequence); + do + { + string_cst one_string = + new_string_cst(parse_region, last_location(), make_token_cstring(tok)); + + *next_sc = one_string; + next_sc = CASTPTR(string_cst, &one_string->next); + + *string_array_extend(string_sequence, 1) = tok->val.str; + + if (tok->type == CPP_WSTRING) + wide = true; + + retry: + if (tok != first) + save_pp_token(tok); + tok = cpp_get_token(current_reader()); + if (tok->type == CPP_PADDING) + goto retry; + if (tok->type == CPP_COMMENT) + { + handle_comment(tok); + goto retry; + } + } + while (tok->type == CPP_STRING || tok->type == CPP_WSTRING); + + /* We have read one more token than we want. */ + _cpp_backup_tokens(current_reader(), 1); + + if (cpp_interpret_string(current_reader(), + string_array_data(string_sequence), + string_array_length(string_sequence), + &istr, wide)) + { + cstr = make_cstring(parse_region, (char *)istr.text, istr.len - 1); + free((char *)istr.text); + } + else + { + /* Use empty string as the value in case of error. Assumes the + widest supported wchar_t is 32 bits */ + cstr = make_cstring(parse_region, "\0\0\0", + wide ? type_size_int(wchar_type) : 1); + } + + lvalp->u.string = fold_lexical_string(first_loc, string_components, cstr, wide); +} + +static void lex_charconst(const cpp_token *token, struct yystype *lvalp) +{ + cppchar_t result; + unsigned int chars_seen; + int unsignedp; + + result = cpp_interpret_charconst(current_reader(), token, + &chars_seen, &unsignedp); + lvalp->u.constant = fold_lexical_char(last_location(), make_token_cstring(token), + token->type == CPP_WCHAR, result); +} + +/* Interpret TOKEN, an integer with FLAGS as classified by cpplib. */ +static lexical_cst interpret_integer(const cpp_token *token, unsigned int flags) +{ + type t; + cpp_num integer; + cpp_options *options = cpp_get_options(current_reader()); + + integer = cpp_interpret_integer(current_reader(), token, flags); + integer = cpp_num_sign_extend(integer, options->precision); + + if (flags & CPP_N_UNSIGNED || + /* what earlier nesC versions did, not correct as per C89/C99: + In both C89 and C99, octal and hex constants may be signed or + unsigned, whichever fits tighter. */ + (flags & CPP_N_RADIX) != CPP_N_DECIMAL) + if ((flags & CPP_N_WIDTH) == CPP_N_SMALL) + t = unsigned_int_type; + else if ((flags & CPP_N_WIDTH) == CPP_N_MEDIUM) + t = unsigned_long_type; + else + t = unsigned_long_long_type; + else + if ((flags & CPP_N_WIDTH) == CPP_N_SMALL) + t = int_type; + else if ((flags & CPP_N_WIDTH) == CPP_N_MEDIUM) + t = long_type; + else + t = long_long_type; + + /* We're assuming that the our largest int type is the same as cpp's + HOST_WIDE_INT, and then ignoring the high field as we only handle + values that fit in largest_uint anyway */ + assert(sizeof(HOST_WIDE_INT) == sizeof(largest_uint)); + return fold_lexical_int(t, last_location(), make_token_cstring(token), + (flags & CPP_N_IMAGINARY) != 0, + integer.low, + integer.overflow); +} + +/* Interpret TOKEN, a floating point number with FLAGS as classified + by cpplib. This is a very hacky, partial implementation. */ +static lexical_cst interpret_float(const cpp_token *token, unsigned int flags) +{ + type t; + + /* Give up on _Fract and _Accum. */ + if (flags & CPP_N_FRACT || flags & CPP_N_ACCUM) + return NULL; + /* Give up on decimal and machine dependent values */ + if (flags & CPP_N_DFLOAT || flags & CPP_N_WIDTH_MD) + return NULL; + + /* Decode type based on width and properties. */ + if ((flags & CPP_N_WIDTH) == CPP_N_LARGE) + t = long_double_type; + else if ((flags & CPP_N_WIDTH) == CPP_N_SMALL/* || flag_single_precision_constant*/) + t = float_type; + else + t = double_type; + + if (flags & CPP_N_IMAGINARY) + t = make_complex_type(t); + + return fold_lexical_real(t, last_location(), make_token_cstring(token)); +} + +static bool is_nesc_keyword(struct resword *word) +{ + return word->token != TYPE_QUAL && (word->rid & RID_NESC); +} + +static int interpret_name(const cpp_token *token, struct yystype *lvalp) +{ + ht_identifier *id = HT_NODE(token->val.node); + struct resword *ptr; + data_declaration decl; + int kind = IDENTIFIER; + + /* Try to recognize a keyword. Uses minimum-perfect hash function */ + if ((ptr = is_reserved_word(id->str, id->len)) && + !(is_nesc_keyword(ptr) && current.language == l_c)) + { + if (ptr->token == TYPE_QUAL) + lvalp->u.itoken.i = ptr->rid; + else + lvalp->u.itoken.i = ptr->rid & ~RID_NESC; + + /* Even if we decided to recognize asm, still perhaps warn. */ + if (pedantic && + (ptr->token == ASM_KEYWORD || ptr->token == TYPEOF || + ptr->rid == RID_INLINE) && + id->str[0] != '_') + pedwarn ("ANSI does not permit the keyword `%s'", id->str); + + return ptr->token; + } + + /* If we did not find a keyword, look for a typename */ + if (target->token) + kind = target->token((char *)id->str, id->len, lvalp); + + if (kind == IDENTIFIER) + { + lvalp->idtoken.location = last_location(); + lvalp->idtoken.id = make_token_cstring(token); + decl = lookup_id(lvalp->idtoken.id.data, FALSE); + lvalp->idtoken.decl = decl; + + if (decl) + switch (decl->kind) + { + case decl_typedef: kind = TYPENAME; break; + case decl_magic_string: kind = MAGIC_STRING; break; + case decl_component_ref: kind = COMPONENTREF; break; + default: break; + } + } + return kind; +} + +static int lex_token(struct yystype *lvalp) +{ + const cpp_token *tok; + enum cpp_ttype type; + + retry: + last_token = tok = cpp_get_token(current_reader()); + save_pp_token(tok); + type = tok->type; + lvalp->u.itoken.location = last_location(); + lvalp->u.itoken.i = 0; + + switch (type) + { + case CPP_EOF: + return -1; + + case CPP_PADDING: + goto retry; + + case CPP_COMMENT: + handle_comment(tok); + goto retry; + + case CPP_NAME: + return interpret_name(tok, lvalp); + + case CPP_NUMBER: + { + unsigned int flags = cpp_classify_number(current_reader(), tok); + lexical_cst num = NULL; + + switch (flags & CPP_N_CATEGORY) + { + case CPP_N_INTEGER: + num = interpret_integer(tok, flags); + break; + case CPP_N_FLOATING: + num = interpret_float (tok, flags); + break; + } + /* cpplib has issued an error or we ran into something we don't + support (e.g. fixed point), pretend the constant was 0 */ + if (num == NULL) + num = fold_lexical_int(int_type, last_location(), + make_token_cstring(tok), + FALSE, 0, FALSE); + + lvalp->u.constant = num; + return CONSTANT; + } + + case CPP_HASH: + case CPP_PASTE: + case CPP_SCOPE: + case CPP_DEREF_STAR: + case CPP_DOT_STAR: + { + unsigned char name[4]; + + *cpp_spell_token(current_reader(), tok, name, true) = 0; + + error("stray %qs in program", name); + } + goto retry; + + case CPP_OTHER: + { + cppchar_t c = tok->val.str.text[0]; + + if (c == '"' || c == '\'') + error("missing terminating %c character", (int) c); + else if (ISGRAPH (c)) + error("stray %qc in program", (int) c); + else + error("stray %<\\%o%> in program", (int) c); + } + goto retry; + + case CPP_CHAR: + case CPP_WCHAR: + lex_charconst(tok, lvalp); + return CONSTANT; + + case CPP_STRING: + case CPP_WSTRING: + lex_string(tok, lvalp); + return STRING; + + case CPP_PRAGMA: + goto retry; + + /* Translate to the parser's symbols - somewhat of a legacy effect, + but having the characters does make the parser more readable... */ + case CPP_EQ: return '='; + case CPP_NOT: return '!'; + case CPP_GREATER: return '>'; + case CPP_LESS: return '<'; + case CPP_PLUS: return '+'; + case CPP_MINUS: return '-'; + case CPP_MULT: return '*'; + case CPP_DIV: return '/'; + case CPP_MOD: return '%'; + case CPP_AND: return '&'; + case CPP_OR: return '|'; + case CPP_XOR: return '^'; + case CPP_RSHIFT: return RSHIFT; + case CPP_LSHIFT: return LSHIFT; + case CPP_COMPL: return '~'; + case CPP_AND_AND: return ANDAND; + case CPP_OR_OR: return OROR; + case CPP_QUERY: return '?'; + case CPP_COLON: return ':'; + case CPP_COMMA: return ','; + case CPP_OPEN_PAREN: return '('; + case CPP_CLOSE_PAREN: return ')'; + case CPP_EQ_EQ: lvalp->u.itoken.i = kind_eq; return EQCOMPARE; + case CPP_NOT_EQ: lvalp->u.itoken.i = kind_ne; return EQCOMPARE; + case CPP_GREATER_EQ: lvalp->u.itoken.i = kind_geq; return ARITHCOMPARE; + case CPP_LESS_EQ: lvalp->u.itoken.i = kind_leq; return ARITHCOMPARE; + case CPP_PLUS_EQ: lvalp->u.itoken.i = kind_plus_assign; return ASSIGN; + case CPP_MINUS_EQ: lvalp->u.itoken.i = kind_minus_assign; return ASSIGN; + case CPP_MULT_EQ: lvalp->u.itoken.i = kind_times_assign; return ASSIGN; + case CPP_DIV_EQ: lvalp->u.itoken.i = kind_divide_assign; return ASSIGN; + case CPP_MOD_EQ: lvalp->u.itoken.i = kind_modulo_assign; return ASSIGN; + case CPP_AND_EQ: lvalp->u.itoken.i = kind_bitand_assign; return ASSIGN; + case CPP_OR_EQ: lvalp->u.itoken.i = kind_bitor_assign; return ASSIGN; + case CPP_XOR_EQ: lvalp->u.itoken.i = kind_bitxor_assign; return ASSIGN; + case CPP_RSHIFT_EQ: lvalp->u.itoken.i = kind_rshift_assign; return ASSIGN; + case CPP_LSHIFT_EQ: lvalp->u.itoken.i = kind_lshift_assign; return ASSIGN; + case CPP_OPEN_SQUARE: return '['; + case CPP_CLOSE_SQUARE: return ']'; + case CPP_OPEN_BRACE: return '{'; + case CPP_CLOSE_BRACE: return '}'; + case CPP_SEMICOLON: return ';'; + case CPP_ELLIPSIS: return ELLIPSIS; + case CPP_PLUS_PLUS: return PLUSPLUS; + case CPP_MINUS_MINUS: return MINUSMINUS; + case CPP_DEREF: return POINTSAT; + case CPP_FERED: return TASTNIOP; + case CPP_DOT: return '.'; + case CPP_ATSIGN: return '@'; + + /* These tokens should not be visible outside cpplib. */ + case CPP_HEADER_NAME: + case CPP_MACRO_ARG: + default: + assert(0); + } +} + +/* We keep a 2-element queue of pre-read tokens to deal with the + lookahead of checking for typedef references in components, + stored in token_s1/l1, token_s2/l2. + - gettoken returns the next token from the queue, or reads the + next token if the queue is empty. + - pushtoken pushes a token onto the queue + - yylex does the special component.typedef processing. + + This code could be optimised to use token_[sl][12] directly in + yylex, but then it would be even more confusing. + + It would be nicer to just use _cpp_backup_tokens, but the comments + about pushing back more than one token when a macro is involed, + and the corresponding abort in the implementation are too worrying... +*/ + +static int poptoken(struct yystype *lvalp) +{ + /* Check the queue first */ + if (current.lex.token_s1 != -1) + { + int token = current.lex.token_s1; + *lvalp = current.lex.token_l1; + + current.lex.token_s1 = current.lex.token_s2; + current.lex.token_l1 = current.lex.token_l2; + current.lex.token_s2 = -1; + + return token; + } + else + return lex_token(lvalp); +} + +static void pushtoken(int t, struct yystype *lvalp) +{ + /* Save token on our 2-element queue */ + if (current.lex.token_s1 == -1) + { + current.lex.token_s1 = t; + current.lex.token_l1 = *lvalp; + } + else + { + current.lex.token_s2 = t; + current.lex.token_l2 = *lvalp; + } +} + +int +yylex(struct yystype *lvalp) +{ + int token = poptoken(lvalp); + + /* Detect component-ref '.' identifier, where the + identifier denotes a typedef in the referenced component -- + we can't do this in the parser as the resulting grammer is not + context-free. So instead we detect it here, and mark the + component-ref as special. */ + if (token == COMPONENTREF) + { + struct yystype val1; + int token1 = poptoken(&val1); + + token = IDENTIFIER; /* default to regular identifier */ + if (token1 == '.') + { + struct yystype val2; + int token2 = poptoken(&val2); + + if (token2 == IDENTIFIER || token2 == TYPENAME || + token2 == MAGIC_STRING) + { + data_declaration cref = lvalp->idtoken.decl; + data_declaration fdecl = env_lookup(cref->ctype->env->id_env, val2.idtoken.id.data, TRUE); + + if (fdecl && fdecl->kind == decl_typedef) + { + /* The special typedef reference case. Fix the tokens */ + token = COMPONENTREF; + token2 = IDENTIFIER; + val2.idtoken.decl = fdecl; + } + } + pushtoken(token1, &val1); + pushtoken(token2, &val2); + } + else + pushtoken(token1, &val1); + } + + return token; +} + +void yyerror(char *string) +{ + char buf[200]; + enum cpp_ttype ttype; + unsigned char *ttext; + + if (!last_token) + { + error(string); + return; + } + + ttype = last_token->type; + if (ttype != CPP_EOF) + ttext = cpp_token_as_text(current_reader(), last_token); + + strcpy (buf, string); + + if ((ttype = last_token->type) == CPP_EOF) + strcat(buf, " at end of input"); + else if (ttype == CPP_STRING || ttype == CPP_WSTRING) + strcat(buf, " before string constant"); + else if (ttype == CPP_CHAR || ttype == CPP_WCHAR) + strcat(buf, " before character constant"); + else if (ttext[0] < 040 || ttext[0] >= 0177) + sprintf(buf + strlen (buf), " before character 0%o", ttext[0]); + else + strcat (buf, " before `%s'"); + + error(buf, ttext); +} + +/* Function used when yydebug is set, to print a token in more detail. */ +void yyprint (FILE *file, int yychar, YYSTYPE yylval) +{ + switch (yychar) + { + case IDENTIFIER: + fprintf(file, " '%s'", yylval.idtoken.id.data); + break; + } +} diff --git a/src/c-lex.h b/src/c-lex.h new file mode 100644 index 0000000..df97e97 --- /dev/null +++ b/src/c-lex.h @@ -0,0 +1,96 @@ +/* This file is part of the nesC compiler. + +This file is derived from RC and the GNU C Compiler. It is thus + Copyright (C) 1987, 88, 89, 92-7, 1998 Free Software Foundation, Inc. + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef C_LEX_H +#define C_LEX_H + +typedef enum { l_c, l_interface, l_component, l_implementation, + l_parameter, l_type, l_any } source_language; + +typedef struct location +{ + const char *filename; + struct nesc_declaration *container; /* for instantiated code only */ + unsigned long lineno; + bool in_system_header; +} *location; + +extern location dummy_location, toplevel_location; + +location new_location(const char *filename, int lineno); +location make_location(struct location l); +void set_lex_location(location l); + +enum rid +{ + RID_UNUSED, + + RID_INT, + RID_CHAR, + RID_FLOAT, + RID_DOUBLE, + RID_VOID, + + RID_UNSIGNED, + RID_SHORT, + RID_LONG, + RID_SIGNED, + RID_COMPLEX, + RID_LASTTYPE, + + RID_INLINE = RID_LASTTYPE, + RID_DEFAULT, + RID_NORACE, + + RID_AUTO, + RID_STATIC, + RID_EXTERN, + RID_REGISTER, + RID_TYPEDEF, + RID_COMMAND, + RID_EVENT, + RID_TASK, + RID_ASYNC, + + RID_MAX, + + RID_NESC = 256 +}; + +#define NORID RID_UNUSED + +void init_lex(void); +bool start_lex(source_language l, const char *path); +void start_lex_string(source_language l, const char *string); +void end_lex(void); +int lex_getc(void); +void lex_ungetc(int c); +void skip_c_comment(void); +void skip_cpp_comment(void); + +/** + * Retrieve the latest code documentation string. This is used to + * place the documentation into the appropriate data_declaration. + **/ +bool get_raw_docstring(const char **docs, location *docl); + +#endif diff --git a/src/c-parse.gperf b/src/c-parse.gperf new file mode 100644 index 0000000..8a8a69f --- /dev/null +++ b/src/c-parse.gperf @@ -0,0 +1,95 @@ +%{ +/* This file is part of the nesC compiler. + +This file is derived from the RC and the GNU C Compiler. It is thus + Copyright (C) 1987, 88, 89, 92-7, 1998 Free Software Foundation, Inc. + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +/* Command-line: gperf -p -j1 -i 1 -g -o -t -N is_reserved_word -k1,3,$ c-parse.gperf */ +%} +struct resword { char *name; short token; enum rid rid; }; +%% +__alignof, ALIGNOF, NORID +__alignof__, ALIGNOF, NORID +__asm, ASM_KEYWORD, NORID +__asm__, ASM_KEYWORD, NORID +__attribute, ATTRIBUTE, NORID +__attribute__, ATTRIBUTE, NORID +__complex, TYPESPEC, RID_COMPLEX +__complex__, TYPESPEC, RID_COMPLEX +__const, TYPE_QUAL, const_qualifier +__const__, TYPE_QUAL, const_qualifier +__extension__, EXTENSION, NORID +__imag, IMAGPART, NORID +__imag__, IMAGPART, NORID +__inline, SCSPEC, RID_INLINE +__inline__, SCSPEC, RID_INLINE +__label__, LABEL, NORID +__real, REALPART, NORID +__real__, REALPART, NORID +__signed, TYPESPEC, RID_SIGNED +__signed__, TYPESPEC, RID_SIGNED +__typeof, TYPEOF, NORID +__typeof__, TYPEOF, NORID +__volatile, TYPE_QUAL, volatile_qualifier +__volatile__, TYPE_QUAL, volatile_qualifier +__builtin_va_arg, VA_ARG, NORID +asm, ASM_KEYWORD, NORID +auto, SCSPEC, RID_AUTO +break, BREAK, NORID +case, CASE, NORID +char, TYPESPEC, RID_CHAR +continue, CONTINUE, NORID +default, DEFAULT, NORID +do, DO, NORID +double, TYPESPEC, RID_DOUBLE +else, ELSE, NORID +enum, ENUM, NORID +extern, SCSPEC, RID_EXTERN +float, TYPESPEC, RID_FLOAT +for, FOR, NORID +goto, GOTO, NORID +if, IF, NORID +inline, SCSPEC, RID_INLINE +int, TYPESPEC, RID_INT +long, TYPESPEC, RID_LONG +offsetof, OFFSETOF, NORID +__builtin_offsetof, OFFSETOF, NORID +register, SCSPEC, RID_REGISTER +return, RETURN, NORID +short, TYPESPEC, RID_SHORT +signed, TYPESPEC, RID_SIGNED +sizeof, SIZEOF, NORID +static, SCSPEC, RID_STATIC +struct, STRUCT, NORID +switch, SWITCH, NORID +typedef, SCSPEC, RID_TYPEDEF +typeof, TYPEOF, NORID +union, UNION, NORID +unsigned, TYPESPEC, RID_UNSIGNED +void, TYPESPEC, RID_VOID +while, WHILE, NORID +nx_union, NX_UNION, NORID +nx_struct, NX_STRUCT, NORID + +define(K, `$1, $2, $3') +include(nesc-keywords.h) + +define(Q, `$1, $2, $3') +include(qualifiers.h) diff --git a/src/c-parse.h b/src/c-parse.h new file mode 100644 index 0000000..68dbfd7 --- /dev/null +++ b/src/c-parse.h @@ -0,0 +1,107 @@ +/* This file is part of the nesC compiler. + +This file is derived from the RC Compiler. It is thus + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef C_PARSE_H +#define C_PARSE_H + +#include "AST.h" + +struct yystype { + union { + void *ptr; + asm_operand asm_operand; + asm_stmt asm_stmt; + attribute attribute; + gcc_attribute gcc_attribute; + nesc_attribute nesc_attribute; + lexical_cst constant; + declaration decl; + declarator declarator; + nested_declarator nested; + expression expr; + id_label id_label; + label label; + node node; + statement stmt; + conditional_stmt cstmt; + for_stmt for_stmt; + string string; + type_element telement; + asttype type; + word word; + designator designator; + interface_ref iref; + component_ref cref; + connection conn; + endpoint ep; + parameterised_identifier pid; + implementation impl; + environment env; + dd_list fields; + char *docstring; + tag_declaration tdecl; + + struct { + location location; + int i; + } itoken; + + struct { + expression expr; + int i; + } iexpr; + + struct { + statement stmt; + int i; + } istmt; + } u; + + struct { + location location; + cstring id; + data_declaration decl; + } idtoken; + + bool abstract; +}; + +#define YYSTYPE struct yystype + +/* Region in which to allocate parse structures. Idea: the AST user can set + this to different regions at appropriate junctures depending on what's + being done with the AST */ +extern region parse_region; + +/* TRUE if currently parsing an expression that will not be evaluated (argument + to alignof, sizeof. Currently not typeof though that could be considered + a bug) */ +bool unevaluated_expression(void); + +node parse(void) deletes; +/* Effects: parses the file set up via set_input/start_lex + Returns: the file's parse tree (may be NULL in some error cases) +*/ + +declaration make_error_decl(void); +declarator make_identifier_declarator(location l, cstring id); + +#endif diff --git a/src/c-parse.tab.c b/src/c-parse.tab.c new file mode 100644 index 0000000..5475b3d --- /dev/null +++ b/src/c-parse.tab.c @@ -0,0 +1,6634 @@ +/* A Bison parser, made by GNU Bison 2.3. */ + +/* Skeleton implementation for Bison's Yacc-like parsers in C + + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 + 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., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ + +/* As a special exception, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + +/* C LALR(1) parser skeleton written by Richard Stallman, by + simplifying the original so-called "semantic" parser. */ + +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +/* Identify Bison output. */ +#define YYBISON 1 + +/* Bison version. */ +#define YYBISON_VERSION "2.3" + +/* Skeleton name. */ +#define YYSKELETON_NAME "yacc.c" + +/* Pure parsers. */ +#define YYPURE 1 + +/* Using locations. */ +#define YYLSP_NEEDED 0 + + + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + IDENTIFIER = 258, + TYPENAME = 259, + COMPONENTREF = 260, + SCSPEC = 261, + TYPESPEC = 262, + TYPE_QUAL = 263, + FN_QUAL = 264, + CONSTANT = 265, + STRING = 266, + MAGIC_STRING = 267, + ELLIPSIS = 268, + SIZEOF = 269, + ENUM = 270, + STRUCT = 271, + UNION = 272, + IF = 273, + ELSE = 274, + WHILE = 275, + DO = 276, + FOR = 277, + SWITCH = 278, + CASE = 279, + DEFAULT = 280, + BREAK = 281, + CONTINUE = 282, + RETURN = 283, + GOTO = 284, + ASM_KEYWORD = 285, + TYPEOF = 286, + ALIGNOF = 287, + ATTRIBUTE = 288, + EXTENSION = 289, + LABEL = 290, + REALPART = 291, + IMAGPART = 292, + VA_ARG = 293, + OFFSETOF = 294, + ASSIGN = 295, + OROR = 296, + ANDAND = 297, + EQCOMPARE = 298, + ARITHCOMPARE = 299, + RSHIFT = 300, + LSHIFT = 301, + MINUSMINUS = 302, + PLUSPLUS = 303, + POINTSAT = 304, + DISPATCH_C = 305, + DISPATCH_NESC = 306, + DISPATCH_PARM = 307, + DISPATCH_TYPE = 308, + ATOMIC = 309, + USES = 310, + INTERFACE = 311, + COMPONENTS = 312, + PROVIDES = 313, + MODULE = 314, + INCLUDES = 315, + CONFIGURATION = 316, + AS = 317, + TASTNIOP = 318, + IMPLEMENTATION = 319, + CALL = 320, + SIGNAL = 321, + POST = 322, + GENERIC = 323, + NEW = 324, + NX_STRUCT = 325, + NX_UNION = 326, + ABSTRACT = 327, + COMPONENT = 328, + EXTENDS = 329, + TARGET_ATTRIBUTE0 = 330, + TARGET_ATTRIBUTE1 = 331, + TARGET_DEF = 332 + }; +#endif +/* Tokens. */ +#define IDENTIFIER 258 +#define TYPENAME 259 +#define COMPONENTREF 260 +#define SCSPEC 261 +#define TYPESPEC 262 +#define TYPE_QUAL 263 +#define FN_QUAL 264 +#define CONSTANT 265 +#define STRING 266 +#define MAGIC_STRING 267 +#define ELLIPSIS 268 +#define SIZEOF 269 +#define ENUM 270 +#define STRUCT 271 +#define UNION 272 +#define IF 273 +#define ELSE 274 +#define WHILE 275 +#define DO 276 +#define FOR 277 +#define SWITCH 278 +#define CASE 279 +#define DEFAULT 280 +#define BREAK 281 +#define CONTINUE 282 +#define RETURN 283 +#define GOTO 284 +#define ASM_KEYWORD 285 +#define TYPEOF 286 +#define ALIGNOF 287 +#define ATTRIBUTE 288 +#define EXTENSION 289 +#define LABEL 290 +#define REALPART 291 +#define IMAGPART 292 +#define VA_ARG 293 +#define OFFSETOF 294 +#define ASSIGN 295 +#define OROR 296 +#define ANDAND 297 +#define EQCOMPARE 298 +#define ARITHCOMPARE 299 +#define RSHIFT 300 +#define LSHIFT 301 +#define MINUSMINUS 302 +#define PLUSPLUS 303 +#define POINTSAT 304 +#define DISPATCH_C 305 +#define DISPATCH_NESC 306 +#define DISPATCH_PARM 307 +#define DISPATCH_TYPE 308 +#define ATOMIC 309 +#define USES 310 +#define INTERFACE 311 +#define COMPONENTS 312 +#define PROVIDES 313 +#define MODULE 314 +#define INCLUDES 315 +#define CONFIGURATION 316 +#define AS 317 +#define TASTNIOP 318 +#define IMPLEMENTATION 319 +#define CALL 320 +#define SIGNAL 321 +#define POST 322 +#define GENERIC 323 +#define NEW 324 +#define NX_STRUCT 325 +#define NX_UNION 326 +#define ABSTRACT 327 +#define COMPONENT 328 +#define EXTENDS 329 +#define TARGET_ATTRIBUTE0 330 +#define TARGET_ATTRIBUTE1 331 +#define TARGET_DEF 332 + + + + +/* Copy the first part of user declarations. */ +#line 33 "c-parse.y" + +#include +#include +#include + +#include "parser.h" +#include "c-parse.h" +#include "c-lex.h" +#include "c-lex-int.h" +#include "semantics.h" +#include "expr.h" +#include "stmt.h" +#include "init.h" +#include "nesc-semantics.h" +#include "nesc-interface.h" +#include "nesc-component.h" +#include "nesc-configuration.h" +#include "nesc-module.h" +#include "nesc-env.h" +#include "nesc-c.h" +#include "nesc-attributes.h" +#include "nesc-task.h" +#include "nesc-cpp.h" +#include "attributes.h" +#include "machine.h" + +int yyparse(void) deletes; + +void yyerror(); + +/* Like YYERROR but do call yyerror. */ +#define YYERROR1 { yyerror ("syntax error"); YYERROR; } + +/* Cause the `yydebug' variable to be defined. */ +#define YYDEBUG 1 +#line 248 "c-parse.y" + +/* Region in which to allocate parse structures. Idea: the AST user can set + this to different regions at appropriate junctures depending on what's + being done with the AST */ +region parse_region; +/* We'll see this a LOT below */ +#define pr parse_region + +/* Number of statements (loosely speaking) and compound statements + seen so far. */ +static int stmt_count; +static int compstmt_count; + +#ifdef RC_ADJUST +static size_t rc_adjust_yystype(void *x, int by) +{ + struct yystype *p = x; + RC_ADJUST_PREAMBLE; + + RC_ADJUST(p->u.ptr, by); + RC_ADJUST(p->idtoken.location.filename, by); + RC_ADJUST(p->idtoken.id.data, by); + RC_ADJUST(p->idtoken.decl, by); + + return sizeof *p; +} + +static void rc_update_yystype(struct yystype *old, struct yystype *new) +{ + regionid base = regionidof(old); + + RC_UPDATE(base, old->u.ptr, new->u.ptr); + RC_UPDATE(base, old->idtoken.location.filename, new->idtoken.location.filename); + RC_UPDATE(base, old->idtoken.id.data, new->idtoken.id.data); + RC_UPDATE(base, old->idtoken.decl, new->idtoken.decl); +} +#endif + +/* A stack of declspecs and attributes for use during parsing */ +typedef struct spec_stack *spec_stack; +struct spec_stack { + type_element parentptr declspecs; + attribute parentptr attributes; + spec_stack sameregion next; +}; + +struct parse_state +{ + /* Stack of saved values of current_declspecs and prefix_attributes. */ + /* In an ideal world, we would be able to eliminate most rc ops for + declspec_stack and ds_region assignments. Seems tricky though. */ + spec_stack declspec_stack; + region ds_region; + + /* List of types and structure classes of the current declaration. */ + type_element declspecs; + attribute attributes; + + /* >0 if currently parsing an expression that will not be evaluated (argument + to alignof, sizeof. Currently not typeof though that could be considered + a bug) */ + int unevaluated_expression; +} pstate; + +bool unevaluated_expression(void) +{ + return pstate.unevaluated_expression != 0; +} + +/* Pop top entry of declspec_stack back into current_declspecs, + prefix_attributes */ +static void pop_declspec_stack(void) deletes +{ + pstate.declspecs = pstate.declspec_stack->declspecs; + pstate.attributes = pstate.declspec_stack->attributes; + pstate.declspec_stack = pstate.declspec_stack->next; +} + +static void push_declspec_stack(void) +{ + spec_stack news; + + news = ralloc(pstate.ds_region, struct spec_stack); + news->declspecs = pstate.declspecs; + news->attributes = pstate.attributes; + news->next = pstate.declspec_stack; + pstate.declspec_stack = news; +} + +static node parse_tree; + +node parse(void) deletes +{ + int result, old_errorcount = errorcount; + struct parse_state old_pstate = pstate; + + pstate.declspecs = NULL; + pstate.attributes = NULL; + pstate.unevaluated_expression = 0; + pstate.declspec_stack = NULL; + pstate.ds_region = newsubregion(parse_region); + parse_tree = NULL; + result = yyparse(); + if (result) + parse_tree = NULL; + deleteregion_ptr(&pstate.ds_region); + + if (result != 0 && errorcount == old_errorcount) + fprintf(stderr, "Errors detected in input file (your bison.simple is out of date)"); + + pstate = old_pstate; + + return parse_tree; +} + +static void set_nesc_ast(void *tree) +{ + nesc_declaration cdecl = current.container; + nesc_decl nd = CAST(nesc_decl, tree); + + nd->cdecl = cdecl; + cdecl->ast = nd; +} + +static void set_nesc_parse_tree(void *tree) +{ + set_nesc_ast(tree); + parse_tree = CAST(node, tree); +} + +static void set_nesc_impl(implementation impl) +{ + nesc_declaration cdecl = current.container; + + CAST(component, cdecl->ast)->implementation = impl; + parse_tree = CAST(node, cdecl->ast); +} + +void refuse_asm(asm_stmt s) +{ + if (s) + error_with_location(s->location, "unexpected asm statement"); +} + +/* Merge the attributes in front of a declaration (but which aren't part + of the declspecs) with the attributes after the declaration. + We're pretending they all came after */ +attribute prefix_attr(attribute post_attr) +{ + return attribute_chain(pstate.attributes, post_attr); +} + +/* Simple build functions */ +declaration make_data_decl(type_element modifiers, declaration decls) +{ + location l = modifiers ? modifiers->location : decls->location; + + data_decl dd = new_data_decl(parse_region, l, modifiers, decls); + + pop_declspec_stack(); + + if (decls == NULL && current.spec_section != spec_normal) + error("provides/uses must be followed by a command, event or interface"); + + return CAST(declaration, dd); +} + +declaration make_error_decl(void) +{ + return new_error_decl(pr, dummy_location); +} + +declaration make_extension_decl(int old_pedantic, location l, declaration d) +{ + pedantic = old_pedantic; + return CAST(declaration, new_extension_decl(pr, l, d)); +} + +word make_cword(location l, const char *s) +{ + return new_word(pr, l, str2cstring(pr, s)); +} + +declarator make_qualified_declarator(location l, declarator d, type_element quals) +{ + if (quals) + return CAST(declarator, new_qualified_declarator(pr, l, d, quals)); + else + return d; +} + +declarator make_pointer_declarator(location l, declarator d, type_element quals) +{ + d = make_qualified_declarator(l, d, quals); + + return CAST(declarator, new_pointer_declarator(pr, l, d)); +} + +declarator make_identifier_declarator(location l, cstring id) +{ + return CAST(declarator, new_identifier_declarator(pr, l, id)); +} + +statement make_error_stmt(void) +{ + return new_error_stmt(pr, dummy_location); +} + +/* Tell yyparse how to print a token's value, if yydebug is set. */ + +#define YYPRINT(FILE,YYCHAR,YYLVAL) yyprint(FILE,YYCHAR,YYLVAL) +void yyprint(); + + +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE 0 +#endif + +/* Enabling the token table. */ +#ifndef YYTOKEN_TABLE +# define YYTOKEN_TABLE 0 +#endif + +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +typedef int YYSTYPE; +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 +#endif + + + +/* Copy the second part of user declarations. */ + + +/* Line 216 of yacc.c. */ +#line 510 "c-parse.tab.c" + +#ifdef short +# undef short +#endif + +#ifdef YYTYPE_UINT8 +typedef YYTYPE_UINT8 yytype_uint8; +#else +typedef unsigned char yytype_uint8; +#endif + +#ifdef YYTYPE_INT8 +typedef YYTYPE_INT8 yytype_int8; +#elif (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +typedef signed char yytype_int8; +#else +typedef short int yytype_int8; +#endif + +#ifdef YYTYPE_UINT16 +typedef YYTYPE_UINT16 yytype_uint16; +#else +typedef unsigned short int yytype_uint16; +#endif + +#ifdef YYTYPE_INT16 +typedef YYTYPE_INT16 yytype_int16; +#else +typedef short int yytype_int16; +#endif + +#ifndef YYSIZE_T +# ifdef __SIZE_TYPE__ +# define YYSIZE_T __SIZE_TYPE__ +# elif defined size_t +# define YYSIZE_T size_t +# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# else +# define YYSIZE_T unsigned int +# endif +#endif + +#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) + +#ifndef YY_ +# if YYENABLE_NLS +# if ENABLE_NLS +# include /* INFRINGES ON USER NAME SPACE */ +# define YY_(msgid) dgettext ("bison-runtime", msgid) +# endif +# endif +# ifndef YY_ +# define YY_(msgid) msgid +# endif +#endif + +/* Suppress unused-variable warnings by "using" E. */ +#if ! defined lint || defined __GNUC__ +# define YYUSE(e) ((void) (e)) +#else +# define YYUSE(e) /* empty */ +#endif + +/* Identity function, used to suppress warnings about constant conditions. */ +#ifndef lint +# define YYID(n) (n) +#else +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static int +YYID (int i) +#else +static int +YYID (i) + int i; +#endif +{ + return i; +} +#endif + +#if ! defined yyoverflow || YYERROR_VERBOSE + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# ifdef YYSTACK_USE_ALLOCA +# if YYSTACK_USE_ALLOCA +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# elif defined __BUILTIN_VA_ARG_INCR +# include /* INFRINGES ON USER NAME SPACE */ +# elif defined _AIX +# define YYSTACK_ALLOC __alloca +# elif defined _MSC_VER +# include /* INFRINGES ON USER NAME SPACE */ +# define alloca _alloca +# else +# define YYSTACK_ALLOC alloca +# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +# include /* INFRINGES ON USER NAME SPACE */ +# ifndef _STDLIB_H +# define _STDLIB_H 1 +# endif +# endif +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's `empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) +# ifndef YYSTACK_ALLOC_MAXIMUM + /* The OS might guarantee only one guard page at the bottom of the stack, + and a page size can be as small as 4096 bytes. So we cannot safely + invoke alloca (N) if N exceeds 4096. Use a slightly smaller number + to allow for a few compiler-allocated temporary stack slots. */ +# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ +# endif +# else +# define YYSTACK_ALLOC YYMALLOC +# define YYSTACK_FREE YYFREE +# ifndef YYSTACK_ALLOC_MAXIMUM +# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM +# endif +# if (defined __cplusplus && ! defined _STDLIB_H \ + && ! ((defined YYMALLOC || defined malloc) \ + && (defined YYFREE || defined free))) +# include /* INFRINGES ON USER NAME SPACE */ +# ifndef _STDLIB_H +# define _STDLIB_H 1 +# endif +# endif +# ifndef YYMALLOC +# define YYMALLOC malloc +# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# ifndef YYFREE +# define YYFREE free +# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +void free (void *); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# endif +#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ + + +#if (! defined yyoverflow \ + && (! defined __cplusplus \ + || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + yytype_int16 yyss; + YYSTYPE yyvs; + }; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + + YYSTACK_GAP_MAXIMUM) + +/* Copy COUNT objects from FROM to TO. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined __GNUC__ && 1 < __GNUC__ +# define YYCOPY(To, From, Count) \ + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +# else +# define YYCOPY(To, From, Count) \ + do \ + { \ + YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (To)[yyi] = (From)[yyi]; \ + } \ + while (YYID (0)) +# endif +# endif + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack, Stack, yysize); \ + Stack = &yyptr->Stack; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (YYID (0)) + +#endif + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 78 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 4209 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 103 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 262 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 633 +/* YYNRULES -- Number of states. */ +#define YYNSTATES 1038 + +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +#define YYUNDEFTOK 2 +#define YYMAXUTOK 332 + +#define YYTRANSLATE(YYX) \ + ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + +/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +static const yytype_uint8 yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 67, 2, 2, 2, 59, 48, 2, + 63, 101, 57, 55, 98, 56, 62, 58, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 43, 69, + 50, 40, 51, 42, 102, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 64, 2, 100, 47, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 68, 46, 99, 66, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 41, 44, 45, 49, 52, + 53, 54, 60, 61, 65, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97 +}; + +#if YYDEBUG +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +static const yytype_uint16 yyprhs[] = +{ + 0, 0, 3, 6, 9, 12, 14, 17, 20, 23, + 26, 27, 30, 32, 35, 36, 40, 42, 46, 47, + 48, 59, 60, 64, 66, 70, 73, 75, 78, 80, + 81, 85, 88, 91, 94, 97, 100, 101, 102, 114, + 115, 116, 117, 130, 131, 132, 141, 143, 144, 145, + 149, 150, 152, 154, 158, 163, 168, 173, 176, 178, + 181, 182, 184, 186, 187, 190, 191, 195, 196, 200, + 202, 206, 209, 211, 213, 217, 222, 224, 228, 231, + 232, 239, 241, 245, 246, 252, 256, 260, 262, 264, + 268, 270, 276, 277, 279, 281, 285, 287, 289, 291, + 294, 295, 297, 299, 301, 306, 311, 316, 320, 322, + 324, 329, 330, 336, 337, 340, 341, 345, 347, 349, + 355, 358, 362, 364, 369, 374, 378, 381, 384, 386, + 388, 394, 399, 404, 408, 409, 410, 417, 419, 421, + 423, 425, 427, 429, 431, 433, 435, 437, 439, 441, + 443, 445, 446, 448, 450, 452, 456, 458, 460, 462, + 464, 467, 470, 473, 476, 479, 482, 487, 490, 495, + 497, 499, 501, 506, 507, 515, 517, 521, 525, 529, + 533, 537, 541, 545, 549, 553, 557, 561, 565, 569, + 573, 577, 581, 587, 588, 594, 598, 602, 604, 606, + 608, 612, 616, 617, 622, 624, 631, 638, 643, 647, + 651, 654, 657, 659, 663, 668, 670, 672, 673, 675, + 678, 680, 683, 688, 693, 697, 700, 702, 704, 707, + 710, 711, 713, 718, 723, 727, 731, 735, 738, 740, + 743, 746, 749, 752, 755, 757, 760, 762, 765, 768, + 771, 774, 777, 780, 782, 785, 788, 791, 794, 797, + 800, 803, 806, 809, 812, 815, 818, 821, 824, 827, + 830, 832, 835, 838, 841, 844, 847, 850, 853, 856, + 859, 862, 865, 868, 871, 874, 877, 880, 883, 886, + 889, 892, 895, 898, 901, 904, 907, 910, 913, 916, + 919, 922, 925, 928, 931, 934, 937, 940, 943, 946, + 949, 952, 955, 958, 961, 964, 966, 968, 970, 972, + 974, 976, 978, 980, 982, 984, 986, 988, 990, 992, + 994, 996, 998, 1000, 1002, 1004, 1006, 1008, 1010, 1012, + 1014, 1016, 1018, 1020, 1022, 1024, 1026, 1028, 1030, 1032, + 1034, 1036, 1037, 1039, 1041, 1043, 1045, 1047, 1049, 1051, + 1053, 1057, 1062, 1067, 1069, 1071, 1073, 1078, 1080, 1085, + 1086, 1091, 1092, 1099, 1103, 1104, 1111, 1115, 1116, 1118, + 1120, 1121, 1124, 1126, 1129, 1136, 1138, 1140, 1142, 1145, + 1148, 1150, 1152, 1156, 1158, 1162, 1163, 1165, 1170, 1177, + 1182, 1188, 1193, 1195, 1197, 1199, 1201, 1203, 1205, 1207, + 1208, 1213, 1215, 1216, 1219, 1221, 1225, 1229, 1232, 1233, + 1238, 1240, 1241, 1246, 1248, 1250, 1252, 1255, 1258, 1264, + 1268, 1269, 1270, 1278, 1279, 1280, 1288, 1290, 1292, 1295, + 1299, 1304, 1306, 1310, 1313, 1317, 1319, 1322, 1326, 1331, + 1333, 1337, 1339, 1343, 1347, 1348, 1357, 1358, 1368, 1374, + 1375, 1385, 1386, 1394, 1396, 1398, 1400, 1402, 1403, 1405, + 1406, 1408, 1410, 1413, 1414, 1418, 1421, 1425, 1428, 1432, + 1435, 1437, 1440, 1442, 1447, 1449, 1454, 1457, 1462, 1466, + 1469, 1474, 1478, 1480, 1484, 1486, 1488, 1492, 1493, 1497, + 1498, 1500, 1502, 1504, 1506, 1510, 1513, 1517, 1522, 1525, + 1527, 1529, 1531, 1533, 1535, 1540, 1544, 1548, 1552, 1555, + 1557, 1559, 1562, 1565, 1566, 1568, 1571, 1572, 1573, 1575, + 1577, 1580, 1584, 1586, 1589, 1591, 1595, 1602, 1608, 1614, + 1617, 1620, 1625, 1626, 1631, 1633, 1636, 1638, 1640, 1641, + 1645, 1647, 1649, 1651, 1654, 1655, 1660, 1662, 1666, 1667, + 1668, 1676, 1682, 1685, 1686, 1687, 1688, 1701, 1702, 1709, + 1712, 1715, 1718, 1722, 1729, 1738, 1749, 1762, 1766, 1771, + 1773, 1775, 1779, 1785, 1788, 1791, 1792, 1794, 1795, 1797, + 1798, 1800, 1802, 1806, 1811, 1819, 1821, 1825, 1826, 1829, + 1832, 1833, 1838, 1841, 1842, 1844, 1846, 1850, 1852, 1856, + 1861, 1866, 1870, 1875, 1880, 1884, 1889, 1890, 1891, 1894, + 1896, 1899, 1901, 1905, 1907, 1909, 1913, 1914, 1916, 1918, + 1920, 1922, 1924, 1926 +}; + +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const yytype_int16 yyrhs[] = +{ + 104, 0, -1, 71, 110, -1, 71, 121, -1, 70, + 169, -1, 70, -1, 72, 351, -1, 72, 1, -1, + 73, 298, -1, 73, 1, -1, -1, 106, 107, -1, + 169, -1, 107, 108, -1, -1, 80, 109, 69, -1, + 180, -1, 109, 98, 180, -1, -1, -1, 105, 76, + 182, 111, 113, 249, 112, 68, 117, 99, -1, -1, + 50, 114, 51, -1, 115, -1, 114, 98, 115, -1, + 116, 249, -1, 3, -1, 117, 174, -1, 174, -1, + -1, 64, 119, 120, -1, 350, 100, -1, 1, 100, + -1, 105, 122, -1, 105, 125, -1, 105, 129, -1, + -1, -1, 132, 79, 182, 123, 133, 249, 124, 68, + 137, 99, 167, -1, -1, -1, -1, 132, 81, 182, + 126, 133, 249, 127, 68, 137, 99, 128, 152, -1, + -1, -1, 93, 182, 130, 249, 131, 68, 137, 99, + -1, 88, -1, -1, -1, 63, 134, 101, -1, -1, + 135, -1, 136, -1, 135, 98, 136, -1, 224, 352, + 276, 247, -1, 224, 352, 278, 247, -1, 225, 352, + 278, 247, -1, 224, 352, -1, 138, -1, 138, 139, + -1, -1, 141, -1, 143, -1, -1, 140, 174, -1, + -1, 75, 142, 145, -1, -1, 78, 144, 145, -1, + 147, -1, 68, 146, 99, -1, 146, 147, -1, 147, + -1, 174, -1, 148, 249, 69, -1, 148, 118, 249, + 69, -1, 149, -1, 149, 82, 182, -1, 76, 182, + -1, -1, 76, 182, 150, 50, 151, 51, -1, 161, + -1, 151, 98, 161, -1, -1, 84, 153, 68, 162, + 99, -1, 77, 155, 69, -1, 155, 98, 156, -1, + 156, -1, 157, -1, 157, 82, 182, -1, 182, -1, + 89, 182, 63, 158, 101, -1, -1, 159, -1, 160, + -1, 159, 98, 160, -1, 194, -1, 161, -1, 298, + -1, 162, 163, -1, -1, 164, -1, 174, -1, 154, + -1, 165, 40, 165, 69, -1, 165, 65, 165, 69, + -1, 165, 83, 165, 69, -1, 165, 62, 166, -1, + 166, -1, 182, -1, 182, 64, 186, 100, -1, -1, + 84, 168, 68, 169, 99, -1, -1, 170, 172, -1, + -1, 169, 171, 172, -1, 176, -1, 173, -1, 30, + 63, 184, 101, 69, -1, 360, 172, -1, 205, 239, + 69, -1, 174, -1, 225, 205, 239, 69, -1, 224, + 205, 238, 69, -1, 231, 205, 69, -1, 1, 69, + -1, 1, 99, -1, 69, -1, 175, -1, 97, 180, + 40, 184, 69, -1, 224, 205, 275, 177, -1, 225, + 205, 278, 177, -1, 205, 278, 177, -1, -1, -1, + 242, 247, 178, 201, 179, 318, -1, 3, -1, 4, + -1, 180, -1, 180, -1, 48, -1, 56, -1, 55, + -1, 61, -1, 60, -1, 66, -1, 67, -1, 36, + -1, 37, -1, 186, -1, -1, 186, -1, 187, -1, + 194, -1, 187, 98, 194, -1, 85, -1, 86, -1, + 87, -1, 196, -1, 188, 199, -1, 57, 192, -1, + 360, 192, -1, 183, 192, -1, 45, 181, -1, 190, + 189, -1, 190, 63, 298, 101, -1, 191, 189, -1, + 191, 63, 298, 101, -1, 14, -1, 32, -1, 189, + -1, 63, 298, 101, 192, -1, -1, 63, 298, 101, + 68, 193, 261, 99, -1, 192, -1, 194, 55, 194, + -1, 194, 56, 194, -1, 194, 57, 194, -1, 194, + 58, 194, -1, 194, 59, 194, -1, 194, 54, 194, + -1, 194, 53, 194, -1, 194, 52, 194, -1, 194, + 50, 194, -1, 194, 51, 194, -1, 194, 49, 194, + -1, 194, 48, 194, -1, 194, 46, 194, -1, 194, + 47, 194, -1, 194, 45, 194, -1, 194, 44, 194, + -1, 194, 42, 184, 43, 194, -1, -1, 194, 42, + 195, 43, 194, -1, 194, 40, 194, -1, 194, 41, + 194, -1, 3, -1, 10, -1, 200, -1, 63, 184, + 101, -1, 63, 1, 101, -1, -1, 63, 197, 320, + 101, -1, 199, -1, 38, 63, 194, 98, 298, 101, + -1, 39, 63, 298, 98, 198, 101, -1, 196, 64, + 186, 100, -1, 196, 62, 180, -1, 196, 65, 180, + -1, 196, 61, -1, 196, 60, -1, 180, -1, 198, + 62, 180, -1, 196, 63, 185, 101, -1, 11, -1, + 12, -1, -1, 202, -1, 202, 13, -1, 203, -1, + 202, 203, -1, 226, 205, 238, 69, -1, 227, 205, + 239, 69, -1, 226, 205, 69, -1, 227, 69, -1, + 207, -1, 313, -1, 204, 207, -1, 207, 313, -1, + -1, 247, -1, 224, 205, 238, 69, -1, 225, 205, + 239, 69, -1, 224, 205, 269, -1, 225, 205, 272, + -1, 231, 205, 69, -1, 360, 207, -1, 362, -1, + 208, 362, -1, 209, 362, -1, 208, 248, -1, 210, + 362, -1, 211, 362, -1, 248, -1, 210, 248, -1, + 233, -1, 212, 362, -1, 213, 362, -1, 212, 235, + -1, 213, 235, -1, 208, 233, -1, 209, 233, -1, + 234, -1, 212, 248, -1, 212, 236, -1, 213, 236, + -1, 208, 234, -1, 209, 234, -1, 214, 362, -1, + 215, 362, -1, 214, 235, -1, 215, 235, -1, 210, + 233, -1, 211, 233, -1, 214, 248, -1, 214, 236, + -1, 215, 236, -1, 210, 234, -1, 211, 234, -1, + 361, -1, 216, 362, -1, 217, 362, -1, 208, 361, + -1, 209, 361, -1, 216, 361, -1, 217, 361, -1, + 216, 248, -1, 218, 362, -1, 219, 362, -1, 210, + 361, -1, 211, 361, -1, 218, 361, -1, 219, 361, + -1, 218, 248, -1, 220, 362, -1, 221, 362, -1, + 220, 235, -1, 221, 235, -1, 216, 233, -1, 217, + 233, -1, 212, 361, -1, 213, 361, -1, 220, 361, + -1, 221, 361, -1, 220, 248, -1, 220, 236, -1, + 221, 236, -1, 216, 234, -1, 217, 234, -1, 222, + 362, -1, 223, 362, -1, 222, 235, -1, 223, 235, + -1, 218, 233, -1, 219, 233, -1, 214, 361, -1, + 215, 361, -1, 222, 361, -1, 223, 361, -1, 222, + 248, -1, 222, 236, -1, 223, 236, -1, 218, 234, + -1, 219, 234, -1, 212, -1, 213, -1, 214, -1, + 215, -1, 220, -1, 221, -1, 222, -1, 223, -1, + 208, -1, 209, -1, 210, -1, 211, -1, 216, -1, + 217, -1, 218, -1, 219, -1, 212, -1, 213, -1, + 220, -1, 221, -1, 208, -1, 209, -1, 216, -1, + 217, -1, 212, -1, 213, -1, 214, -1, 215, -1, + 208, -1, 209, -1, 210, -1, 211, -1, 228, -1, + 229, -1, 224, -1, 225, -1, -1, 229, -1, 235, + -1, 237, -1, 236, -1, 364, -1, 280, -1, 281, + -1, 4, -1, 5, 62, 180, -1, 31, 63, 184, + 101, -1, 31, 63, 298, 101, -1, 240, -1, 241, + -1, 243, -1, 240, 98, 206, 243, -1, 245, -1, + 241, 98, 206, 243, -1, -1, 30, 63, 11, 101, + -1, -1, 275, 242, 247, 40, 244, 259, -1, 275, + 242, 247, -1, -1, 278, 242, 247, 40, 246, 259, + -1, 278, 242, 247, -1, -1, 250, -1, 250, -1, + -1, 249, 256, -1, 251, -1, 250, 251, -1, 33, + 63, 63, 254, 101, 101, -1, 252, -1, 256, -1, + 95, -1, 96, 253, -1, 102, 253, -1, 10, -1, + 200, -1, 63, 184, 101, -1, 255, -1, 254, 98, + 255, -1, -1, 258, -1, 258, 63, 3, 101, -1, + 258, 63, 3, 98, 186, 101, -1, 258, 63, 185, + 101, -1, 102, 257, 63, 261, 101, -1, 102, 257, + 1, 101, -1, 182, -1, 182, -1, 361, -1, 364, + -1, 362, -1, 86, -1, 194, -1, -1, 68, 260, + 261, 99, -1, 1, -1, -1, 262, 287, -1, 263, + -1, 262, 98, 263, -1, 267, 40, 265, -1, 268, + 265, -1, -1, 180, 43, 264, 265, -1, 265, -1, + -1, 68, 266, 261, 99, -1, 194, -1, 1, -1, + 268, -1, 267, 268, -1, 62, 180, -1, 64, 194, + 13, 194, 100, -1, 64, 194, 100, -1, -1, -1, + 275, 242, 247, 270, 201, 271, 320, -1, -1, -1, + 278, 242, 247, 273, 201, 274, 320, -1, 276, -1, + 278, -1, 276, 305, -1, 57, 232, 276, -1, 63, + 247, 276, 101, -1, 4, -1, 4, 62, 180, -1, + 277, 305, -1, 57, 232, 277, -1, 4, -1, 278, + 305, -1, 57, 232, 278, -1, 63, 247, 278, 101, + -1, 3, -1, 3, 62, 180, -1, 180, -1, 286, + 279, 249, -1, 15, 279, 249, -1, -1, 286, 279, + 249, 68, 282, 289, 99, 247, -1, -1, 16, 102, + 279, 249, 68, 283, 289, 99, 247, -1, 286, 68, + 289, 99, 247, -1, -1, 15, 279, 249, 68, 284, + 296, 288, 99, 247, -1, -1, 15, 68, 285, 296, + 288, 99, 247, -1, 16, -1, 17, -1, 90, -1, + 91, -1, -1, 98, -1, -1, 98, -1, 290, -1, + 290, 291, -1, -1, 290, 291, 69, -1, 290, 69, + -1, 228, 205, 292, -1, 228, 205, -1, 229, 205, + 293, -1, 229, 205, -1, 1, -1, 360, 291, -1, + 294, -1, 292, 98, 206, 294, -1, 295, -1, 293, + 98, 206, 295, -1, 275, 247, -1, 275, 43, 194, + 247, -1, 43, 194, 247, -1, 278, 247, -1, 278, + 43, 194, 247, -1, 43, 194, 247, -1, 297, -1, + 296, 98, 297, -1, 1, -1, 180, -1, 180, 40, + 194, -1, -1, 230, 299, 300, -1, -1, 301, -1, + 303, -1, 302, -1, 304, -1, 57, 232, 302, -1, + 57, 232, -1, 57, 232, 303, -1, 63, 247, 301, + 101, -1, 304, 306, -1, 306, -1, 307, -1, 309, + -1, 308, -1, 309, -1, 118, 63, 355, 359, -1, + 63, 353, 359, -1, 63, 345, 359, -1, 64, 184, + 100, -1, 64, 100, -1, 311, -1, 326, -1, 311, + 326, -1, 311, 313, -1, -1, 310, -1, 1, 69, + -1, -1, -1, 316, -1, 317, -1, 316, 317, -1, + 35, 358, 69, -1, 320, -1, 1, 320, -1, 68, + -1, 319, 314, 99, -1, 319, 314, 315, 204, 312, + 99, -1, 319, 314, 315, 1, 99, -1, 319, 314, + 315, 310, 99, -1, 322, 325, -1, 322, 1, -1, + 18, 63, 184, 101, -1, -1, 21, 324, 325, 20, + -1, 330, -1, 338, 325, -1, 330, -1, 338, -1, + -1, 74, 328, 329, -1, 330, -1, 1, -1, 320, + -1, 184, 69, -1, -1, 321, 19, 331, 325, -1, + 321, -1, 321, 19, 1, -1, -1, -1, 20, 332, + 63, 184, 101, 333, 325, -1, 323, 63, 184, 101, + 69, -1, 323, 1, -1, -1, -1, -1, 22, 63, + 340, 69, 334, 340, 69, 335, 340, 101, 336, 325, + -1, -1, 23, 63, 184, 101, 337, 325, -1, 26, + 69, -1, 27, 69, -1, 28, 69, -1, 28, 184, + 69, -1, 30, 339, 63, 184, 101, 69, -1, 30, + 339, 63, 184, 43, 341, 101, 69, -1, 30, 339, + 63, 184, 43, 341, 43, 341, 101, 69, -1, 30, + 339, 63, 184, 43, 341, 43, 341, 43, 344, 101, + 69, -1, 29, 181, 69, -1, 29, 57, 184, 69, + -1, 327, -1, 69, -1, 24, 194, 43, -1, 24, + 194, 13, 194, 43, -1, 25, 43, -1, 181, 43, + -1, -1, 362, -1, -1, 184, -1, -1, 342, -1, + 343, -1, 342, 98, 343, -1, 11, 63, 184, 101, + -1, 64, 182, 100, 11, 63, 184, 101, -1, 11, + -1, 344, 98, 11, -1, -1, 346, 347, -1, 349, + 101, -1, -1, 350, 69, 348, 347, -1, 1, 101, + -1, -1, 13, -1, 350, -1, 350, 98, 13, -1, + 351, -1, 350, 98, 351, -1, 224, 352, 277, 247, + -1, 224, 352, 278, 247, -1, 224, 352, 300, -1, + 224, 352, 302, 250, -1, 225, 352, 278, 247, -1, + 225, 352, 300, -1, 225, 352, 302, 250, -1, -1, + -1, 354, 355, -1, 347, -1, 356, 101, -1, 357, + -1, 356, 98, 357, -1, 3, -1, 181, -1, 358, + 98, 181, -1, -1, 363, -1, 34, -1, 6, -1, + 25, -1, 8, -1, 9, -1, 7, -1 +}; + +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +static const yytype_uint16 yyrline[] = +{ + 0, 465, 465, 466, 467, 470, 471, 472, 473, 474, + 478, 478, 479, 487, 488, 492, 496, 498, 505, 509, + 503, 524, 525, 543, 544, 549, 554, 558, 559, 562, + 562, 566, 571, 575, 576, 577, 582, 587, 581, 601, + 607, 611, 600, 622, 626, 621, 637, 638, 643, 651, + 670, 671, 675, 676, 685, 687, 689, 691, 696, 701, + 703, 707, 708, 709, 709, 713, 713, 718, 718, 723, + 724, 728, 730, 734, 735, 740, 750, 751, 755, 761, + 760, 769, 770, 774, 774, 782, 786, 787, 791, 792, + 796, 798, 804, 805, 809, 810, 814, 816, 820, 824, + 825, 829, 830, 831, 835, 837, 839, 844, 848, 853, + 855, 859, 859, 869, 869, 870, 870, 875, 876, 877, + 882, 887, 894, 898, 900, 902, 905, 906, 907, 911, + 915, 920, 921, 922, 926, 937, 925, 944, 945, 949, + 953, 956, 958, 960, 962, 964, 966, 968, 970, 972, + 976, 985, 986, 990, 995, 997, 1002, 1003, 1004, 1008, + 1009, 1041, 1044, 1047, 1054, 1059, 1069, 1072, 1075, 1081, + 1085, 1089, 1090, 1093, 1092, 1111, 1112, 1114, 1116, 1118, + 1120, 1122, 1124, 1126, 1128, 1130, 1132, 1134, 1136, 1138, + 1140, 1142, 1144, 1147, 1146, 1152, 1154, 1159, 1165, 1166, + 1167, 1169, 1172, 1171, 1186, 1204, 1206, 1208, 1210, 1212, + 1215, 1217, 1222, 1223, 1227, 1231, 1232, 1236, 1237, 1238, + 1250, 1251, 1259, 1261, 1263, 1267, 1277, 1278, 1279, 1280, + 1288, 1299, 1304, 1306, 1308, 1311, 1314, 1317, 1373, 1374, + 1376, 1381, 1386, 1388, 1393, 1394, 1398, 1399, 1401, 1403, + 1405, 1407, 1409, 1414, 1415, 1417, 1419, 1421, 1423, 1428, + 1430, 1432, 1434, 1436, 1438, 1443, 1445, 1447, 1449, 1451, + 1456, 1457, 1459, 1461, 1463, 1465, 1467, 1472, 1477, 1479, + 1481, 1483, 1485, 1487, 1492, 1497, 1499, 1501, 1503, 1505, + 1507, 1509, 1511, 1513, 1515, 1520, 1522, 1524, 1526, 1528, + 1533, 1535, 1537, 1539, 1541, 1543, 1545, 1547, 1549, 1551, + 1556, 1558, 1560, 1562, 1564, 1570, 1571, 1572, 1573, 1574, + 1575, 1576, 1577, 1581, 1582, 1583, 1584, 1585, 1586, 1587, + 1588, 1592, 1593, 1594, 1595, 1599, 1600, 1601, 1602, 1606, + 1607, 1608, 1609, 1613, 1614, 1615, 1616, 1620, 1621, 1625, + 1626, 1632, 1633, 1658, 1659, 1663, 1667, 1668, 1672, 1676, + 1680, 1685, 1687, 1693, 1697, 1701, 1702, 1707, 1708, 1714, + 1715, 1722, 1721, 1729, 1737, 1736, 1744, 1752, 1753, 1758, + 1762, 1763, 1768, 1770, 1775, 1777, 1778, 1782, 1785, 1788, + 1794, 1795, 1796, 1800, 1802, 1808, 1809, 1811, 1814, 1818, + 1824, 1826, 1831, 1839, 1840, 1842, 1844, 1846, 1853, 1855, + 1854, 1858, 1865, 1868, 1872, 1873, 1879, 1883, 1888, 1887, + 1893, 1898, 1897, 1902, 1904, 1908, 1909, 1913, 1918, 1922, + 1928, 1938, 1927, 1951, 1961, 1950, 1976, 1977, 1983, 1985, + 1987, 1989, 1990, 2001, 2003, 2005, 2014, 2016, 2018, 2020, + 2022, 2029, 2033, 2036, 2043, 2042, 2049, 2048, 2054, 2059, + 2058, 2063, 2062, 2069, 2070, 2071, 2072, 2075, 2077, 2080, + 2082, 2087, 2089, 2096, 2097, 2099, 2115, 2117, 2122, 2124, + 2129, 2131, 2136, 2137, 2144, 2145, 2150, 2153, 2156, 2162, + 2165, 2168, 2174, 2175, 2177, 2183, 2185, 2191, 2190, 2198, + 2199, 2203, 2204, 2208, 2209, 2214, 2216, 2221, 2223, 2225, + 2230, 2231, 2235, 2236, 2240, 2243, 2249, 2255, 2257, 2266, + 2282, 2283, 2285, 2290, 2291, 2294, 2299, 2305, 2306, 2313, + 2314, 2318, 2325, 2326, 2330, 2334, 2336, 2339, 2342, 2348, + 2351, 2355, 2366, 2365, 2377, 2379, 2384, 2386, 2391, 2391, + 2411, 2412, 2417, 2419, 2423, 2422, 2431, 2440, 2443, 2445, + 2442, 2454, 2461, 2464, 2465, 2467, 2464, 2474, 2473, 2482, + 2487, 2492, 2495, 2498, 2503, 2508, 2512, 2516, 2521, 2528, + 2529, 2536, 2539, 2542, 2545, 2554, 2555, 2560, 2561, 2568, + 2569, 2573, 2574, 2579, 2581, 2586, 2588, 2595, 2595, 2603, + 2605, 2604, 2611, 2618, 2619, 2629, 2631, 2636, 2637, 2644, + 2646, 2648, 2650, 2652, 2654, 2656, 2660, 2666, 2666, 2673, + 2674, 2679, 2681, 2686, 2691, 2692, 2699, 2700, 2704, 2711, + 2713, 2718, 2723, 2728 +}; +#endif + +#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE +/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "$end", "error", "$undefined", "IDENTIFIER", "TYPENAME", "COMPONENTREF", + "SCSPEC", "TYPESPEC", "TYPE_QUAL", "FN_QUAL", "CONSTANT", "STRING", + "MAGIC_STRING", "ELLIPSIS", "SIZEOF", "ENUM", "STRUCT", "UNION", "IF", + "ELSE", "WHILE", "DO", "FOR", "SWITCH", "CASE", "DEFAULT", "BREAK", + "CONTINUE", "RETURN", "GOTO", "ASM_KEYWORD", "TYPEOF", "ALIGNOF", + "ATTRIBUTE", "EXTENSION", "LABEL", "REALPART", "IMAGPART", "VA_ARG", + "OFFSETOF", "'='", "ASSIGN", "'?'", "':'", "OROR", "ANDAND", "'|'", + "'^'", "'&'", "EQCOMPARE", "'<'", "'>'", "ARITHCOMPARE", "RSHIFT", + "LSHIFT", "'+'", "'-'", "'*'", "'/'", "'%'", "MINUSMINUS", "PLUSPLUS", + "'.'", "'('", "'['", "POINTSAT", "'~'", "'!'", "'{'", "';'", + "DISPATCH_C", "DISPATCH_NESC", "DISPATCH_PARM", "DISPATCH_TYPE", + "ATOMIC", "USES", "INTERFACE", "COMPONENTS", "PROVIDES", "MODULE", + "INCLUDES", "CONFIGURATION", "AS", "TASTNIOP", "IMPLEMENTATION", "CALL", + "SIGNAL", "POST", "GENERIC", "NEW", "NX_STRUCT", "NX_UNION", "ABSTRACT", + "COMPONENT", "EXTENDS", "TARGET_ATTRIBUTE0", "TARGET_ATTRIBUTE1", + "TARGET_DEF", "','", "'}'", "']'", "')'", "'@'", "$accept", "dispatch", + "ncheader", "@1", "includes_list", "includes", "include_list", + "interface", "@2", "@3", "interface_parms", "interface_parm_list", + "interface_parm", "type_parm", "datadef_list", "parameters", "@4", + "parameters1", "component", "module", "@5", "@6", "configuration", "@7", + "@8", "@9", "binary_component", "@10", "@11", "generic", + "component_parms", "template_parms", "template_parmlist", + "template_parm", "requires_or_provides_list", + "requires_or_provides_list_", "requires_or_provides", "@12", "requires", + "@13", "provides", "@14", "parameterised_interface_list", + "parameterised_interfaces", "parameterised_interface", "interface_ref", + "interface_type", "@15", "typelist", "iconfiguration", "@16", "cuses", + "component_list", "component_ref", "component_ref2", "generic_args", + "generic_arglist", "generic_arg", "generic_type", "configuration_decls", + "configuration_decl", "connection", "endpoint", + "parameterised_identifier", "imodule", "@17", "extdefs", "@18", "@19", + "extdef", "datadef", "just_datadef", "target_def", "fndef", "fndef2", + "@20", "@21", "identifier", "id_label", "idword", "unop", "expr", + "exprlist", "nonnull_exprlist", "nonnull_exprlist_", "callkind", + "unary_expr", "sizeof", "alignof", "cast_expr", "@22", "expr_no_commas", + "@23", "primary", "@24", "fieldlist", "function_call", "string", + "old_style_parm_decls", "datadecls", "datadecl", "decls", "setspecs", + "maybe_resetattrs", "decl", "declspecs_nosc_nots_nosa_noea", + "declspecs_nosc_nots_nosa_ea", "declspecs_nosc_nots_sa_noea", + "declspecs_nosc_nots_sa_ea", "declspecs_nosc_ts_nosa_noea", + "declspecs_nosc_ts_nosa_ea", "declspecs_nosc_ts_sa_noea", + "declspecs_nosc_ts_sa_ea", "declspecs_sc_nots_nosa_noea", + "declspecs_sc_nots_nosa_ea", "declspecs_sc_nots_sa_noea", + "declspecs_sc_nots_sa_ea", "declspecs_sc_ts_nosa_noea", + "declspecs_sc_ts_nosa_ea", "declspecs_sc_ts_sa_noea", + "declspecs_sc_ts_sa_ea", "declspecs_ts", "declspecs_nots", + "declspecs_ts_nosa", "declspecs_nots_nosa", "declspecs_nosc_ts", + "declspecs_nosc_nots", "declspecs_nosc", "declspecs", + "maybe_type_quals_attrs", "type_spec_nonattr", "type_spec_attr", + "type_spec_reserved_nonattr", "type_spec_reserved_attr", + "type_spec_nonreserved_nonattr", "initdecls", "notype_initdecls", + "initdecls_", "notype_initdecls_", "maybeasm", "initdcl", "@25", + "notype_initdcl", "@26", "maybe_attribute", "eattributes", + "nesc_attributes", "attributes", "attribute", "target_attribute", + "restricted_expr", "attribute_list", "attrib", "nattrib", "nastart", + "any_word", "init", "@27", "initlist_maybe_comma", "initlist1", + "initelt", "@28", "initval", "@29", "designator_list", "designator", + "nested_function", "@30", "@31", "notype_nested_function", "@32", "@33", + "declarator", "after_type_declarator", "parm_declarator", + "notype_declarator", "tag", "structuse", "structdef", "@34", "@35", + "@36", "@37", "structkind", "maybecomma", "maybecomma_warn", + "component_decl_list", "component_decl_list2", "component_decl", + "components", "components_notype", "component_declarator", + "component_notype_declarator", "enumlist", "enumerator", "typename", + "@38", "absdcl", "absdcl1", "absdcl1_noea", "absdcl1_ea", + "direct_absdcl1", "array_or_fn_declarator", "array_or_absfn_declarator", + "fn_declarator", "absfn_declarator", "array_declarator", "stmts", + "stmt_or_labels", "xstmts", "errstmt", "pushlevel", "maybe_label_decls", + "label_decls", "label_decl", "compstmt_or_error", "compstmt_start", + "compstmt", "simple_if", "if_prefix", "do_stmt_start", "@39", + "labeled_stmt", "stmt_or_label", "atomic_stmt", "@40", "stmt_or_error", + "stmt", "@41", "@42", "@43", "@44", "@45", "@46", "@47", "label", + "maybe_type_qual", "xexpr", "asm_operands", "nonnull_asm_operands", + "asm_operand", "asm_clobbers", "parmlist", "@48", "parmlist_1", "@49", + "parmlist_2", "parms", "parm", "xreferror", "parmlist_or_identifiers", + "@50", "parmlist_or_identifiers_1", "identifiers", "old_parameter", + "identifiers_or_typenames", "fn_quals", "extension", "scspec", + "type_qual", "fn_qual", "type_spec", 0 +}; +#endif + +# ifdef YYPRINT +/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to + token YYLEX-NUM. */ +static const yytype_uint16 yytoknum[] = +{ + 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 61, 295, 63, 58, 296, 297, 124, 94, 38, 298, + 60, 62, 299, 300, 301, 43, 45, 42, 47, 37, + 302, 303, 46, 40, 91, 304, 126, 33, 123, 59, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 44, 125, + 93, 41, 64 +}; +# endif + +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const yytype_uint16 yyr1[] = +{ + 0, 103, 104, 104, 104, 104, 104, 104, 104, 104, + 106, 105, 105, 107, 107, 108, 109, 109, 111, 112, + 110, 113, 113, 114, 114, 115, 116, 117, 117, 119, + 118, 120, 120, 121, 121, 121, 123, 124, 122, 126, + 127, 128, 125, 130, 131, 129, 132, 132, 133, 133, + 134, 134, 135, 135, 136, 136, 136, 136, 137, 138, + 138, 139, 139, 140, 139, 142, 141, 144, 143, 145, + 145, 146, 146, 147, 147, 147, 148, 148, 149, 150, + 149, 151, 151, 153, 152, 154, 155, 155, 156, 156, + 157, 157, 158, 158, 159, 159, 160, 160, 161, 162, + 162, 163, 163, 163, 164, 164, 164, 165, 165, 166, + 166, 168, 167, 170, 169, 171, 169, 172, 172, 172, + 172, 173, 173, 174, 174, 174, 174, 174, 174, 174, + 175, 176, 176, 176, 178, 179, 177, 180, 180, 181, + 182, 183, 183, 183, 183, 183, 183, 183, 183, 183, + 184, 185, 185, 186, 187, 187, 188, 188, 188, 189, + 189, 189, 189, 189, 189, 189, 189, 189, 189, 190, + 191, 192, 192, 193, 192, 194, 194, 194, 194, 194, + 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, + 194, 194, 194, 195, 194, 194, 194, 196, 196, 196, + 196, 196, 197, 196, 196, 196, 196, 196, 196, 196, + 196, 196, 198, 198, 199, 200, 200, 201, 201, 201, + 202, 202, 203, 203, 203, 203, 204, 204, 204, 204, + 205, 206, 207, 207, 207, 207, 207, 207, 208, 208, + 208, 209, 210, 210, 211, 211, 212, 212, 212, 212, + 212, 212, 212, 213, 213, 213, 213, 213, 213, 214, + 214, 214, 214, 214, 214, 215, 215, 215, 215, 215, + 216, 216, 216, 216, 216, 216, 216, 217, 218, 218, + 218, 218, 218, 218, 219, 220, 220, 220, 220, 220, + 220, 220, 220, 220, 220, 221, 221, 221, 221, 221, + 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, + 223, 223, 223, 223, 223, 224, 224, 224, 224, 224, + 224, 224, 224, 225, 225, 225, 225, 225, 225, 225, + 225, 226, 226, 226, 226, 227, 227, 227, 227, 228, + 228, 228, 228, 229, 229, 229, 229, 230, 230, 231, + 231, 232, 232, 233, 233, 234, 235, 235, 236, 237, + 237, 237, 237, 238, 239, 240, 240, 241, 241, 242, + 242, 244, 243, 243, 246, 245, 245, 247, 247, 248, + 249, 249, 250, 250, 251, 251, 251, 252, 252, 252, + 253, 253, 253, 254, 254, 255, 255, 255, 255, 255, + 256, 256, 257, 258, 258, 258, 258, 258, 259, 260, + 259, 259, 261, 261, 262, 262, 263, 263, 264, 263, + 263, 266, 265, 265, 265, 267, 267, 268, 268, 268, + 270, 271, 269, 273, 274, 272, 275, 275, 276, 276, + 276, 276, 276, 277, 277, 277, 278, 278, 278, 278, + 278, 279, 280, 280, 282, 281, 283, 281, 281, 284, + 281, 285, 281, 286, 286, 286, 286, 287, 287, 288, + 288, 289, 289, 290, 290, 290, 291, 291, 291, 291, + 291, 291, 292, 292, 293, 293, 294, 294, 294, 295, + 295, 295, 296, 296, 296, 297, 297, 299, 298, 300, + 300, 301, 301, 302, 302, 303, 303, 304, 304, 304, + 305, 305, 306, 306, 307, 307, 308, 309, 309, 310, + 311, 311, 311, 312, 312, 313, 314, 315, 315, 316, + 316, 317, 318, 318, 319, 320, 320, 320, 320, 321, + 321, 322, 324, 323, 325, 325, 326, 326, 328, 327, + 329, 329, 330, 330, 331, 330, 330, 330, 332, 333, + 330, 330, 330, 334, 335, 336, 330, 337, 330, 330, + 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, + 330, 338, 338, 338, 338, 339, 339, 340, 340, 341, + 341, 342, 342, 343, 343, 344, 344, 346, 345, 347, + 348, 347, 347, 349, 349, 349, 349, 350, 350, 351, + 351, 351, 351, 351, 351, 351, 352, 354, 353, 355, + 355, 356, 356, 357, 358, 358, 359, 359, 360, 361, + 361, 362, 363, 364 +}; + +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +static const yytype_uint8 yyr2[] = +{ + 0, 2, 2, 2, 2, 1, 2, 2, 2, 2, + 0, 2, 1, 2, 0, 3, 1, 3, 0, 0, + 10, 0, 3, 1, 3, 2, 1, 2, 1, 0, + 3, 2, 2, 2, 2, 2, 0, 0, 11, 0, + 0, 0, 12, 0, 0, 8, 1, 0, 0, 3, + 0, 1, 1, 3, 4, 4, 4, 2, 1, 2, + 0, 1, 1, 0, 2, 0, 3, 0, 3, 1, + 3, 2, 1, 1, 3, 4, 1, 3, 2, 0, + 6, 1, 3, 0, 5, 3, 3, 1, 1, 3, + 1, 5, 0, 1, 1, 3, 1, 1, 1, 2, + 0, 1, 1, 1, 4, 4, 4, 3, 1, 1, + 4, 0, 5, 0, 2, 0, 3, 1, 1, 5, + 2, 3, 1, 4, 4, 3, 2, 2, 1, 1, + 5, 4, 4, 3, 0, 0, 6, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 3, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 4, 2, 4, 1, + 1, 1, 4, 0, 7, 1, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 5, 0, 5, 3, 3, 1, 1, 1, + 3, 3, 0, 4, 1, 6, 6, 4, 3, 3, + 2, 2, 1, 3, 4, 1, 1, 0, 1, 2, + 1, 2, 4, 4, 3, 2, 1, 1, 2, 2, + 0, 1, 4, 4, 3, 3, 3, 2, 1, 2, + 2, 2, 2, 2, 1, 2, 1, 2, 2, 2, + 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 3, 4, 4, 1, 1, 1, 4, 1, 4, 0, + 4, 0, 6, 3, 0, 6, 3, 0, 1, 1, + 0, 2, 1, 2, 6, 1, 1, 1, 2, 2, + 1, 1, 3, 1, 3, 0, 1, 4, 6, 4, + 5, 4, 1, 1, 1, 1, 1, 1, 1, 0, + 4, 1, 0, 2, 1, 3, 3, 2, 0, 4, + 1, 0, 4, 1, 1, 1, 2, 2, 5, 3, + 0, 0, 7, 0, 0, 7, 1, 1, 2, 3, + 4, 1, 3, 2, 3, 1, 2, 3, 4, 1, + 3, 1, 3, 3, 0, 8, 0, 9, 5, 0, + 9, 0, 7, 1, 1, 1, 1, 0, 1, 0, + 1, 1, 2, 0, 3, 2, 3, 2, 3, 2, + 1, 2, 1, 4, 1, 4, 2, 4, 3, 2, + 4, 3, 1, 3, 1, 1, 3, 0, 3, 0, + 1, 1, 1, 1, 3, 2, 3, 4, 2, 1, + 1, 1, 1, 1, 4, 3, 3, 3, 2, 1, + 1, 2, 2, 0, 1, 2, 0, 0, 1, 1, + 2, 3, 1, 2, 1, 3, 6, 5, 5, 2, + 2, 4, 0, 4, 1, 2, 1, 1, 0, 3, + 1, 1, 1, 2, 0, 4, 1, 3, 0, 0, + 7, 5, 2, 0, 0, 0, 12, 0, 6, 2, + 2, 2, 3, 6, 8, 10, 12, 3, 4, 1, + 1, 3, 5, 2, 2, 0, 1, 0, 1, 0, + 1, 1, 3, 4, 7, 1, 3, 0, 2, 2, + 0, 4, 2, 0, 1, 1, 3, 1, 3, 4, + 4, 3, 4, 4, 3, 4, 0, 0, 2, 1, + 2, 1, 3, 1, 1, 3, 0, 1, 1, 1, + 1, 1, 1, 1 +}; + +/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state + STATE-NUM when YYTABLE doesn't specify something else to do. Zero + means the default is an error. */ +static const yytype_uint16 yydefact[] = +{ + 0, 113, 113, 0, 0, 0, 115, 0, 47, 14, + 2, 3, 115, 7, 359, 0, 629, 633, 631, 0, + 463, 464, 630, 0, 0, 465, 466, 387, 0, 0, + 323, 324, 325, 326, 315, 316, 317, 318, 327, 328, + 329, 330, 319, 320, 321, 322, 616, 616, 246, 253, + 353, 355, 354, 244, 379, 382, 385, 386, 357, 358, + 0, 6, 270, 238, 356, 9, 343, 344, 345, 346, + 339, 340, 341, 342, 347, 348, 497, 8, 1, 0, + 0, 0, 628, 128, 0, 114, 118, 122, 129, 117, + 0, 230, 230, 230, 0, 0, 46, 0, 33, 34, + 35, 0, 11, 0, 137, 138, 461, 451, 380, 0, + 0, 0, 390, 215, 216, 0, 391, 388, 140, 402, + 389, 0, 251, 257, 241, 273, 239, 252, 258, 274, + 240, 263, 268, 245, 280, 242, 264, 269, 281, 243, + 249, 255, 254, 291, 247, 250, 256, 292, 248, 261, + 266, 265, 306, 259, 262, 267, 307, 260, 289, 298, + 277, 275, 271, 290, 299, 276, 272, 304, 313, 284, + 282, 278, 305, 314, 283, 279, 287, 296, 295, 293, + 285, 288, 297, 294, 286, 302, 311, 310, 308, 300, + 303, 312, 309, 301, 499, 499, 383, 473, 380, 499, + 116, 126, 127, 0, 0, 449, 351, 377, 0, 364, + 367, 369, 0, 0, 0, 120, 18, 43, 0, 0, + 0, 13, 360, 0, 453, 380, 197, 198, 169, 170, + 148, 149, 0, 0, 0, 141, 143, 142, 0, 145, + 144, 0, 146, 147, 156, 157, 158, 0, 0, 150, + 153, 0, 171, 0, 0, 175, 154, 159, 204, 199, + 0, 0, 395, 0, 0, 0, 445, 351, 597, 0, + 377, 377, 611, 500, 502, 501, 503, 509, 512, 513, + 351, 377, 614, 502, 0, 0, 452, 351, 597, 498, + 502, 0, 0, 0, 343, 344, 345, 346, 352, 0, + 0, 378, 121, 377, 0, 617, 29, 0, 133, 377, + 446, 510, 511, 441, 351, 377, 0, 363, 365, 369, + 436, 437, 0, 369, 125, 21, 380, 36, 39, 0, + 16, 494, 495, 469, 492, 459, 0, 381, 0, 0, + 0, 139, 164, 161, 0, 0, 0, 0, 163, 361, + 0, 0, 0, 160, 0, 165, 0, 167, 0, 0, + 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 211, 210, 0, + 151, 0, 0, 362, 162, 407, 403, 0, 393, 396, + 404, 406, 405, 392, 401, 424, 197, 0, 0, 421, + 0, 423, 0, 467, 414, 420, 0, 0, 505, 0, + 626, 0, 518, 0, 609, 443, 610, 612, 597, 508, + 505, 613, 615, 377, 480, 475, 230, 230, 472, 0, + 454, 505, 0, 0, 0, 450, 447, 0, 0, 231, + 0, 626, 0, 0, 0, 134, 0, 0, 0, 124, + 377, 131, 377, 438, 123, 132, 0, 380, 44, 48, + 48, 15, 0, 0, 470, 0, 0, 456, 0, 0, + 201, 200, 534, 526, 0, 0, 155, 0, 0, 195, + 196, 0, 0, 191, 190, 188, 189, 187, 186, 184, + 185, 183, 182, 181, 176, 177, 178, 179, 180, 208, + 0, 152, 0, 209, 395, 0, 151, 427, 0, 0, + 418, 400, 0, 413, 0, 426, 417, 444, 504, 506, + 0, 632, 516, 627, 0, 604, 598, 0, 605, 607, + 517, 458, 477, 479, 474, 481, 473, 119, 130, 448, + 368, 369, 0, 515, 623, 619, 618, 0, 621, 0, + 30, 0, 626, 374, 217, 442, 439, 0, 0, 134, + 26, 0, 23, 380, 19, 0, 50, 380, 380, 17, + 496, 493, 377, 469, 473, 0, 0, 527, 203, 173, + 172, 166, 168, 0, 0, 214, 207, 394, 384, 197, + 0, 0, 429, 0, 0, 415, 416, 507, 602, 599, + 600, 0, 0, 377, 476, 482, 0, 377, 478, 484, + 0, 377, 370, 0, 620, 32, 0, 31, 514, 0, + 135, 218, 220, 335, 336, 331, 332, 337, 338, 333, + 334, 230, 230, 440, 366, 371, 22, 0, 25, 0, + 60, 0, 51, 52, 616, 616, 37, 40, 462, 0, + 0, 0, 212, 0, 0, 535, 0, 528, 529, 0, + 192, 194, 0, 397, 399, 0, 422, 419, 0, 606, + 608, 377, 0, 486, 377, 377, 0, 489, 377, 377, + 373, 622, 411, 409, 408, 375, 0, 219, 221, 0, + 225, 0, 0, 24, 0, 0, 63, 49, 0, 57, + 0, 0, 0, 377, 377, 205, 0, 206, 624, 0, + 0, 359, 0, 558, 542, 0, 0, 0, 630, 0, + 0, 0, 0, 585, 580, 548, 0, 0, 523, 0, + 230, 230, 230, 0, 0, 227, 552, 556, 0, 0, + 520, 579, 546, 547, 0, 530, 0, 0, 428, 601, + 488, 377, 0, 491, 377, 0, 455, 0, 0, 136, + 532, 224, 0, 0, 369, 372, 0, 28, 230, 230, + 45, 65, 67, 59, 0, 61, 62, 53, 377, 377, + 377, 60, 60, 460, 457, 213, 531, 0, 525, 537, + 0, 0, 0, 587, 0, 0, 583, 569, 570, 571, + 0, 0, 0, 0, 586, 0, 584, 553, 228, 524, + 0, 0, 229, 0, 0, 0, 538, 0, 522, 521, + 0, 540, 539, 544, 0, 562, 0, 237, 174, 398, + 487, 483, 490, 485, 0, 533, 222, 223, 377, 20, + 27, 0, 0, 0, 0, 64, 54, 55, 56, 0, + 0, 625, 0, 0, 0, 588, 0, 0, 0, 581, + 572, 0, 577, 0, 551, 549, 550, 536, 0, 234, + 369, 0, 235, 369, 236, 557, 0, 545, 0, 410, + 376, 0, 0, 66, 69, 380, 76, 73, 68, 0, + 41, 541, 0, 543, 563, 567, 0, 578, 0, 232, + 377, 233, 377, 555, 0, 0, 72, 78, 29, 380, + 0, 0, 111, 38, 0, 559, 587, 0, 582, 589, + 0, 430, 433, 561, 70, 71, 0, 0, 74, 77, + 0, 83, 42, 0, 0, 568, 0, 0, 0, 590, + 591, 573, 217, 217, 0, 75, 113, 0, 560, 564, + 0, 0, 589, 0, 0, 431, 434, 0, 81, 98, + 115, 100, 587, 0, 0, 0, 574, 592, 0, 0, + 80, 0, 112, 0, 0, 593, 0, 0, 0, 432, + 435, 82, 0, 84, 103, 99, 101, 0, 108, 102, + 109, 565, 0, 595, 0, 575, 0, 0, 87, 88, + 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 85, 0, 0, 0, 107, 0, 0, 0, 566, + 594, 596, 576, 92, 86, 89, 104, 105, 106, 110, + 0, 93, 94, 97, 96, 91, 0, 95 +}; + +/* YYDEFGOTO[NTERM-NUM]. */ +static const yytype_int16 yydefgoto[] = +{ + -1, 5, 8, 9, 102, 221, 329, 10, 325, 639, + 457, 561, 562, 563, 766, 307, 443, 550, 11, 98, + 459, 701, 99, 460, 702, 914, 100, 326, 565, 101, + 567, 641, 642, 643, 695, 696, 773, 774, 775, 843, + 776, 844, 883, 905, 884, 885, 886, 926, 957, 932, + 947, 984, 997, 998, 999, 1030, 1031, 1032, 1033, 973, + 985, 986, 987, 988, 913, 930, 6, 7, 79, 85, + 86, 887, 88, 89, 308, 554, 686, 118, 726, 990, + 247, 727, 500, 249, 250, 251, 252, 253, 254, 255, + 659, 256, 482, 257, 346, 653, 258, 259, 620, 621, + 622, 728, 90, 438, 729, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 631, 632, 74, 75, 76, 93, 299, + 48, 49, 50, 51, 52, 316, 322, 317, 209, 309, + 318, 692, 210, 619, 439, 53, 224, 54, 55, 56, + 117, 387, 388, 57, 121, 389, 685, 757, 402, 403, + 404, 594, 405, 509, 406, 407, 869, 942, 968, 872, + 943, 969, 541, 320, 270, 321, 108, 58, 59, 536, + 574, 466, 223, 60, 513, 465, 284, 285, 428, 604, + 608, 605, 609, 333, 334, 959, 199, 272, 273, 290, + 275, 276, 310, 277, 311, 278, 312, 733, 734, 810, + 735, 577, 656, 657, 658, 759, 473, 736, 737, 738, + 739, 792, 822, 740, 741, 805, 865, 823, 876, 791, + 933, 916, 962, 1006, 917, 824, 803, 856, 938, 939, + 940, 994, 410, 411, 545, 668, 527, 528, 529, 194, + 441, 442, 546, 547, 548, 709, 522, 261, 62, 63, + 523, 64 +}; + +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF -729 +static const yytype_int16 yypact[] = +{ + 560, 204, 583, 2204, 2276, 251, 311, 1317, 536, -729, + -729, -729, 534, -729, -729, 273, -729, -729, -729, 76, + 215, -729, -729, 52, 367, -729, -729, -729, 322, 544, + 2947, 630, 2947, 630, 1209, 760, 1209, 760, 2947, 630, + 2947, 630, 1209, 760, 1209, 760, -729, -729, -729, -729, + -729, -729, -729, -729, 115, -729, -729, -729, -729, -729, + 168, -729, -729, -729, -729, -729, 2966, 731, 2966, 731, + 1093, 386, 1093, 386, -729, -729, -729, -729, -729, 1317, + 323, 407, -729, -729, 605, -729, -729, -729, -729, -729, + 343, 352, 389, -729, 1317, 605, -729, 605, -729, -729, + -729, 441, 421, 605, -729, -729, -729, -729, -729, 605, + 2695, 468, -729, -729, -729, 3807, -729, -729, -729, -729, + -729, 69, -729, -729, -729, -729, -729, -729, -729, -729, + -729, -729, -729, -729, -729, -729, -729, -729, -729, -729, + -729, -729, -729, -729, -729, -729, -729, -729, -729, -729, + -729, -729, -729, -729, -729, -729, -729, -729, -729, -729, + -729, -729, -729, -729, -729, -729, -729, -729, -729, -729, + -729, -729, -729, -729, -729, -729, -729, -729, -729, -729, + -729, -729, -729, -729, -729, -729, -729, -729, -729, -729, + -729, -729, -729, -729, 317, 402, -729, -729, -729, 446, + -729, -729, -729, 3807, 499, 514, 83, 115, 480, 491, + -729, 160, 334, 343, 529, -729, -729, -729, 605, 605, + 605, -729, -729, 565, 123, -729, -729, -729, -729, -729, + -729, -729, 538, 586, 605, -729, -729, -729, 3807, -729, + -729, 1439, -729, -729, -729, -729, -729, 3807, 552, -729, + 569, 469, -729, 3866, 3925, -729, 1498, 848, -729, -729, + 573, 3807, 589, 576, 579, 2440, -729, 83, 410, 3041, + 741, 741, -729, -729, 115, -729, 9, -729, -729, -729, + 83, 741, -729, 115, 607, 482, 129, 83, 615, -729, + -729, 608, 3807, 605, 83, 705, 83, 705, -729, 343, + 343, 115, -729, 115, 655, -729, 3041, 659, -729, 115, + -729, -729, -729, 664, 83, 115, 658, 632, -729, 698, + 578, 578, 674, 160, -729, 694, -729, -729, -729, 117, + -729, -729, 693, 651, -729, -729, 605, -729, 145, 3807, + 2966, -729, -729, -729, 656, 662, 684, 663, -729, -729, + 3807, 3434, 848, 939, 1439, -729, 1439, -729, 3807, 3807, + 3807, 3807, 3807, 3807, 3807, 3807, 3807, 3807, 3807, 3807, + 3807, 3807, 3807, 3807, 3807, 3807, 3807, -729, -729, 605, + 3807, 3807, 605, -729, -729, -729, -729, 395, -729, 696, + -729, -729, -729, -729, -729, -729, 713, 605, 3807, -729, + 717, 1498, 669, 675, -729, -729, 350, 3366, 317, 402, + 763, 1569, -729, 678, -729, -729, -729, 115, -729, -729, + 402, -729, 115, 115, -729, -729, -729, -729, 720, 2256, + -729, 446, 446, 721, 723, -729, 578, 278, 334, -729, + 771, 763, 1999, 2237, 1999, 2, 605, 334, 334, -729, + 115, -729, 115, -729, -729, -729, 783, -729, 691, 733, + 733, -729, 605, 3807, 605, 695, 565, -729, 4091, 699, + -729, -729, -729, -729, 702, 3687, 1498, 706, 707, 1498, + 1498, 772, 775, 2026, 2264, 1149, 1460, 1863, 1380, 878, + 878, 878, 797, 797, 599, 599, -729, -729, -729, -729, + 722, -729, 724, -729, 589, 726, 3984, -729, 3098, 2860, + -729, -729, 2372, -729, 3495, -729, -729, 578, -729, -729, + 729, -729, -729, -729, 730, -729, -729, 743, 349, -729, + -729, -729, 844, 98, -729, -729, -729, -729, -729, -729, + -729, 698, 744, -729, -729, -729, -729, 445, -729, 725, + -729, 523, 763, -729, 630, -729, 578, 399, 334, 384, + -729, 1, -729, -729, 691, 774, 2947, -729, -729, -729, + 1498, -729, 115, 651, -729, 2966, 605, 85, -729, -729, + -729, -729, -729, 3807, 3807, -729, -729, -729, -729, 459, + 748, 3807, -729, 761, 3495, -729, -729, -729, -729, -729, + -729, 2925, 3807, 137, 765, -729, 3807, 738, 766, -729, + 767, 115, -729, 868, -729, -729, 2947, -729, -729, 3556, + -729, 118, -729, 2947, 630, 1209, 760, 2947, 630, 1209, + 760, -729, 790, -729, -729, -729, -729, 783, 691, 804, + -729, 773, 777, -729, -729, -729, 691, 691, -729, 780, + 781, 782, -729, 244, 605, -729, 1734, 841, -729, 2860, + 1201, 1201, 3807, -729, -729, 4052, -729, -729, 1569, -729, + -729, 4032, 3807, -729, 115, 4032, 3807, -729, 115, 115, + 845, -729, -729, -729, 1498, -729, 34, -729, -729, 240, + -729, 343, 3556, -729, 2137, 794, 393, -729, 2947, 334, + 343, 813, 821, 115, 115, -729, 605, -729, -729, 358, + 346, 755, 834, -729, -729, 836, 840, 3807, 861, 846, + 847, 3746, 325, 705, -729, -729, 862, 849, 2528, 1606, + 352, 389, -729, 822, 2791, -729, -729, 901, 3157, 87, + -729, -729, -729, -729, 2628, -729, 824, 826, -729, -729, + -729, 4032, 844, -729, 4032, 98, -729, 2860, 684, -729, + -729, -729, 860, 876, 160, -729, 2035, -729, 352, 389, + -729, -729, -729, -729, 2137, -729, -729, -729, 741, 741, + 741, -729, -729, -729, -729, -729, -729, 605, -729, -729, + 3807, 897, 3626, 3807, 3807, 4113, -729, -729, -729, -729, + 892, 3807, 899, 903, -729, 3305, -729, -729, -729, -729, + 870, 904, -729, 334, 343, 905, -729, 861, -729, -729, + 3235, -729, -729, -729, 3626, -729, 3807, -729, -729, -729, + -729, -729, -729, -729, 873, -729, -729, -729, 115, -729, + -729, 334, 343, 1869, 1869, -729, -729, -729, -729, 881, + 884, -729, 883, 3807, 957, -729, 916, 887, 3807, -729, + -729, 922, -729, 3807, -729, -729, -729, -729, 925, -729, + 698, 927, -729, 160, -729, -729, 3626, -729, 896, -729, + 885, 2102, 605, -729, -729, 941, 924, -729, -729, 923, + -729, -729, 908, -729, -729, -729, 4150, -729, 149, -729, + 115, -729, 115, -729, 943, 1968, -729, 963, -729, -729, + 114, 605, -729, -729, 930, -729, 3807, 3626, -729, 49, + 946, 384, 2, -729, -729, -729, 967, 255, -729, -729, + 950, -729, -729, 3626, 951, -729, 958, 605, 157, 926, + -729, -729, 630, 630, 2966, -729, -729, 960, -729, -729, + 3807, 929, 49, 964, 49, -729, -729, 124, -729, -729, + 938, -729, 3807, 937, 1030, 169, -729, -729, 684, 684, + -729, 2966, -729, 1834, 944, -729, 983, 1037, 980, -729, + -729, -729, 58, -729, -729, -729, -729, 369, -729, -729, + 987, -729, 3807, -729, 487, -729, 605, 366, -729, 970, + -729, 605, 605, 605, 605, 3807, 3626, 952, 1043, 988, + 993, -729, 58, 605, 246, -729, 416, 426, 977, -729, + -729, -729, -729, 2695, -729, -729, -729, -729, -729, -729, + 959, 982, -729, -729, 1498, -729, 2695, -729 +}; + +/* YYPGOTO[NTERM-NUM]. */ +static const yytype_int16 yypgoto[] = +{ + -729, -729, -729, -729, -729, -729, -729, -729, -729, -729, + -729, -729, 444, -729, -729, 193, -729, -729, -729, -729, + -729, -729, -729, -729, -729, -729, -729, -729, -729, -729, + 622, -729, -729, 385, -116, -729, -729, -729, -729, -729, + -729, -729, 241, -729, -646, -729, -729, -729, -729, -729, + -729, -729, -729, 75, -729, -729, -729, 54, -644, -729, + -729, -729, -385, 91, -729, -729, 12, -729, -729, 344, + -729, 13, -729, -729, 53, -729, -729, 78, -228, -20, + -729, 163, 588, -355, -729, -729, 447, -729, -729, -211, + -729, 700, -729, 851, -729, -729, 853, 670, -227, -729, + 474, -729, -28, -413, -641, -4, -1, 0, 8, 4, + 7, 11, 19, -547, -535, -729, -729, -532, -523, -729, + -729, 14, 25, -729, -729, -275, -111, -729, -616, 224, + 16, 127, 184, 492, -729, -636, -89, -729, -729, -303, + -405, -729, -729, -729, 818, 856, -180, 558, 22, -729, + 1067, -729, 593, -196, -729, -729, 413, -729, -458, -729, + 600, -729, -341, -729, -729, 710, -729, -729, -729, -729, + -729, -729, -207, -409, 703, -31, 18, -729, -729, -729, + -729, -729, -729, -729, -729, 546, -493, -729, 728, -729, + -729, 368, 373, 657, 660, 30, -729, 326, -83, -126, + 110, -729, -226, 855, -729, -729, 683, 401, -729, -729, + -280, -729, -729, -729, 475, -729, -729, -317, -729, -729, + -729, -729, -687, 417, -729, -729, -729, -598, -729, -729, + -729, -729, -729, -729, -729, -589, -729, -728, 201, -729, + 200, -729, -729, -729, -394, -729, -729, 715, 10, -45, + -729, -729, 716, -729, 549, -729, -400, 17, 652, 1104, + -729, -232 +}; + +/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule which + number is the opposite. If zero, do what YYDEFACT says. + If YYTABLE_NINF, syntax error. */ +#define YYTABLE_NINF -604 +static const yytype_int16 yytable[] = +{ + 66, 208, 195, 67, 68, 319, 342, 627, 70, 119, + 426, 71, 69, 61, 12, 72, 452, 526, 286, 628, + 87, 91, 629, 73, 94, 501, 502, 343, 337, 474, + 392, 630, 92, 540, 77, 758, 348, 558, 556, 557, + 732, 543, 553, 610, 415, 338, 122, 127, 131, 136, + 384, 593, 636, 762, 158, 163, 167, 172, 742, 211, + 936, 104, 105, 212, 213, 214, 516, 743, 274, 283, + 264, -376, 418, 269, 627, 216, 196, 217, 198, 104, + 105, 650, 122, 127, 131, 136, 628, 808, 825, 629, + 337, 18, 87, 91, 453, 298, 94, 107, 630, 637, + -376, 205, 472, 827, 92, 854, 66, 87, 91, 67, + 68, 94, 732, 937, 70, 110, 24, 71, 69, 92, + 654, 72, 14, 15, 16, 17, 18, 225, 732, 73, + 742, 687, 265, 19, 20, 21, 742, 877, 107, 743, + 260, 606, 337, 22, 106, 743, 458, 996, 24, 23, + 826, 501, 618, 634, 426, 206, 298, 123, 128, 132, + 137, 207, 204, 271, 281, 159, 164, 168, 173, 298, + 24, 104, 105, 596, 427, 970, 298, 868, 27, 28, + 672, 222, 323, 928, 655, 29, 461, 107, 934, 903, + 304, 335, 919, 123, 128, 132, 137, 430, 327, 328, + 952, 746, 294, 298, -5, 295, 296, 866, 25, 26, + 27, 28, 977, 467, 297, 462, 336, 29, 140, 145, + 149, 154, 971, 305, 306, 336, 176, 181, 185, 190, + 935, 336, 27, 28, 974, 906, 197, 66, 611, 29, + 67, 68, 386, 205, 313, 70, 948, 336, 71, 69, + 920, 78, 72, 667, 140, 145, 149, 154, 953, 925, + 73, 752, 337, 294, 580, 755, 295, 296, 436, 437, + 978, 347, 392, 248, 749, 297, 294, 564, 263, 295, + 296, 66, 518, 294, 67, 68, 295, 296, 297, 70, + 778, 415, 71, 69, 518, 297, 72, 314, 330, 834, + 958, 332, 429, 315, 73, 518, 706, 747, 1002, 761, + 294, -4, 341, 295, 296, 1026, 119, 109, 427, 1019, + 205, 266, 297, 196, 945, 603, 520, 981, 104, 105, + 453, 453, 112, 113, 114, 103, 66, 205, 313, 67, + 68, 305, 306, 400, 70, 707, 205, 71, 69, 520, + 66, 72, 66, 67, 68, 67, 68, 336, 70, 73, + 70, 71, 69, 71, 69, 72, 291, 72, 337, 760, + 469, 435, 451, 73, 267, 73, 455, 436, 437, 539, + 268, 269, 801, 638, 477, 115, 478, 646, 647, 436, + 514, 314, 201, 17, 18, 627, 627, 315, 532, 533, + 206, 19, 20, 21, 345, 205, 207, 628, 628, 1001, + 629, 629, 397, -377, 398, 788, 436, 437, 600, 630, + 630, -349, 202, 200, 635, 66, 708, 786, 67, 68, + 111, 1002, 413, 70, 1003, 1011, 71, 69, 215, 196, + 72, 835, 337, 24, 196, 789, 429, 601, 73, 812, + 337, 337, 1004, -373, 818, 434, 787, 499, -350, 280, + 503, 838, 305, 306, 1012, 268, 269, -377, 771, 413, + 203, 772, 226, -377, -377, 507, 25, 26, 1002, 227, + 113, 114, -373, 424, 386, 1027, 14, 15, 1002, 17, + 18, 408, -58, 504, 802, 1028, 505, 19, 20, 21, + 633, 220, 607, 287, 420, 27, 28, 232, 233, 288, + 269, 431, 29, 23, 345, 24, 82, 345, 519, 345, + 218, 282, 219, 481, 555, 289, 141, 146, 150, 155, + 519, 262, 351, 384, 177, 182, 186, 191, 447, 292, + 569, 519, 332, 613, 332, 603, 614, 104, 105, 302, + 623, 425, 453, 624, 112, 113, 114, 662, 625, 851, + 663, 626, 141, 146, 150, 155, 331, 900, 104, 105, + 902, 66, 25, 26, 67, 68, 293, 27, 28, 70, + 644, -471, 71, 69, 29, 1008, 72, 400, 1009, 303, + 400, 645, 104, 105, 73, 16, 17, 18, 324, 699, + 700, 339, 763, 689, 691, 651, 870, 115, 104, 105, + -12, 670, 95, -12, 22, -12, 1014, 623, 1016, 1017, + 624, 616, -12, 617, 96, 625, 670, -12, 626, 97, + 1, 2, 3, 4, 14, 15, 16, 17, 18, 122, + 127, 305, 306, 158, 163, 19, 20, 21, 24, 340, + 1018, 979, 980, 349, 652, 22, 374, 375, 376, -10, + 764, 23, -10, -10, -10, 849, 850, 350, 779, 780, + 730, -10, -377, 744, 383, 385, -10, 393, -377, -377, + 394, 731, 125, 129, 134, 138, 143, 147, 152, 156, + 161, 165, 170, 174, 179, 183, 188, 192, 116, 116, + 355, 357, 813, 814, 815, 910, 423, 767, 768, 433, + 27, 28, 644, 18, 337, 955, 956, 29, 440, 769, + 25, 26, 444, 645, 607, 871, 446, 449, 304, 927, + 450, 337, 341, 463, 341, 14, 15, 400, 17, 18, + 841, 842, 730, 454, 456, 744, 19, 20, 21, 464, + 123, 128, 472, 731, 159, 164, -137, 470, 730, 506, + 510, 744, 23, 471, 475, 301, 16, 17, 18, 731, + 511, 24, 521, 512, 24, 19, 20, 21, 530, 840, + 768, 676, 542, 873, 785, 22, 560, 845, 768, 534, + 537, 769, 538, 336, 572, -138, 566, 576, -138, 769, + 341, 305, 306, 578, 305, 306, 341, 581, 582, 140, + 145, 764, 341, 176, 181, 583, 341, -138, 584, -138, + -138, 25, 26, 585, 586, 615, 301, 588, 301, 301, + 597, 598, 417, 27, 28, 400, 27, 28, -138, 301, + 29, 422, 640, 29, 599, 612, 301, 205, 313, 664, + 25, 26, 372, 373, 374, 375, 376, 768, 768, 690, + 666, 301, 907, 674, 678, 341, 679, 301, 769, 769, + 341, 544, 694, 301, 697, 698, 654, 279, 279, 703, + 704, 781, 279, 705, 800, 635, 124, 602, 133, 782, + 142, 929, 151, 770, 160, 768, 169, 790, 178, 793, + 187, 314, 341, 794, 796, 806, 769, 315, 377, 378, + 379, 380, 381, 382, 390, 797, 798, 951, 807, 768, + 820, 816, 124, 828, 133, 553, 142, 829, 151, 836, + 769, 370, 371, 372, 373, 374, 375, 376, 623, 623, + 66, 624, 624, 67, 68, 837, 625, 625, 70, 626, + 626, 71, 69, 852, 341, 72, 855, 857, 960, 279, + 853, 860, 1000, 73, 861, 401, 863, 66, 862, 867, + 67, 68, 879, 788, 874, 70, 1010, 893, 71, 69, + 889, 301, 72, 890, 891, 894, 989, 768, 895, 878, + 73, 897, 1000, 1025, 899, 341, 901, 904, 769, -204, + -204, -204, -204, -204, -204, 908, 911, 912, 301, 915, + 301, 341, 923, -79, 931, 941, 892, 944, 946, 66, + 949, 950, 67, 68, 954, 300, 898, 70, 961, 964, + 71, 69, 66, 966, 72, 67, 68, 972, 975, 468, + 70, 976, 73, 71, 69, 991, 992, 72, 993, 995, + 476, 1005, 1013, 1020, 1021, 73, 1023, 1022, 479, 480, + 1035, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 1029, 909, 855, + 1036, 693, 568, 777, 341, 888, 409, 1024, 414, 416, + 1037, 279, 279, 1015, 590, 688, 120, 587, 508, 421, + 17, 18, 352, 279, 353, 765, 432, 401, 19, 20, + 21, 517, 595, 963, 279, 279, 515, 141, 146, 649, + 831, 177, 182, 573, 571, 855, 24, 445, 833, 809, + 301, 419, 745, 448, 126, 130, 135, 139, 144, 148, + 153, 157, 162, 166, 171, 175, 180, 184, 189, 193, + 124, 819, 133, 965, 967, 1007, 390, 535, 551, 0, + 552, 301, 681, 570, 0, 301, 0, 0, 0, 301, + 126, 130, 135, 139, 144, 148, 153, 157, 0, 0, + 0, 0, 0, 25, 26, 0, 0, 0, 27, 28, + 0, 0, 0, 0, 0, 29, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 401, + 0, 0, 401, 0, 401, 16, 17, 18, 0, 0, + 0, 0, 0, 0, 19, 20, 21, 0, 0, 301, + 0, 0, 301, 301, 22, 0, 301, 301, 0, 0, + 0, 531, 24, 360, 0, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 301, 301, 0, 0, 0, 0, 0, 0, 0, + 559, 0, 0, 0, 0, 125, 129, 143, 147, 161, + 165, 179, 183, 660, 661, 0, 0, 0, 0, 0, + 0, 665, 0, 0, 401, 0, 0, 0, 0, 25, + 26, 0, 671, 0, 27, 28, 675, 0, 0, 301, + 0, 29, 301, 0, 0, 0, 0, 0, 80, 684, + -230, 14, 15, 16, 17, 18, 0, 0, 0, 0, + 0, 0, 19, 20, 21, 0, 301, 301, 301, 0, + 0, 0, 22, 0, 0, 0, 0, 81, 23, 0, + 24, 82, 0, 0, 0, 0, 0, 0, 0, 401, + 0, 0, 0, 0, 0, 0, 391, 0, 0, 0, + 0, 0, 751, 0, -230, 0, 754, 0, 0, 0, + -230, 0, 0, 0, 0, 0, 83, 0, 0, 0, + 648, 0, 684, 0, 0, 0, 301, 0, 126, 130, + 135, 139, 0, 0, 0, 0, 0, 25, 26, 0, + 0, 0, 27, 28, 84, 0, 0, 795, 0, 29, + 0, 673, 0, 0, 0, 677, 0, 0, 0, 680, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 344, 0, 226, 14, 15, 0, 17, 18, 0, 227, + 113, 114, 0, 228, 19, 20, 21, 401, 301, 0, + 301, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 23, 229, 24, 82, 0, 230, 231, 232, 233, 124, + 0, 142, 0, 160, 234, 178, 0, 235, 0, 750, + 0, 0, 0, 753, 236, 237, 238, 756, 0, 239, + 240, 0, 241, 0, 0, 242, 243, -202, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 0, 783, 784, 0, 244, 245, 246, 0, 0, 25, + 26, 0, 0, 0, 27, 28, 0, 0, 358, 359, + 360, 29, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 896, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 830, + 524, 0, 832, 14, 15, 16, 17, 18, 0, 0, + 0, 0, 525, 0, 19, 20, 21, 0, 0, 0, + 0, 0, 0, 0, 22, 0, 846, 847, 848, 0, + 23, 0, 24, 0, 0, 0, 0, 811, 391, -226, + -226, -226, -226, -226, -226, 0, -226, -226, -226, 0, + -226, -226, -226, -226, -226, 0, -226, -226, -226, -226, + -226, -226, -226, -226, -226, -226, -226, -226, -226, -226, + -226, 0, -226, -226, -226, -226, 0, 0, 0, 0, + 0, -226, 0, 0, -226, 0, 880, 0, 0, 25, + 26, -226, -226, -226, 27, 28, -226, -226, 0, -226, + -603, 29, -226, -226, -226, -226, 0, 0, 0, 0, + -226, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -226, -226, -226, 0, 0, -226, -226, 0, 0, + 0, -226, -226, 0, 0, -226, 0, 0, -226, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 921, 0, + 922, 0, 0, 1034, 0, 0, 0, 126, 130, 144, + 148, 162, 166, 180, 184, 710, 1034, 396, 711, 15, + 16, 17, 18, 0, 227, 113, 114, 0, 228, 19, + 20, 21, 712, 0, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 23, 229, 24, 82, 0, + 230, 231, 232, 233, 0, 0, 0, 0, 0, 234, + 0, 0, 235, 0, 0, 0, 0, 0, 0, 236, + 237, 238, 0, 0, 239, 240, 0, 241, 0, 0, + 242, 243, 472, 724, 0, 0, 0, 0, 725, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, + 245, 246, 0, 0, 25, 26, 0, 804, 0, 27, + 28, 0, 0, 0, 0, 80, 29, 104, 711, 15, + 16, 17, 18, 0, 0, 0, 0, 0, 0, 19, + 20, 21, 0, 0, 0, 0, 0, 0, 0, 22, + 0, 0, 0, 0, 0, 23, 0, 24, 0, 0, + 80, 0, 0, 14, 15, 16, 17, 18, 0, 0, + 0, 0, 0, 0, 19, 20, 21, 0, 0, 0, + 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, + 23, 0, 24, 83, 0, 0, 0, 0, 0, 0, + 0, 982, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 0, 25, 26, 0, 0, 0, 27, + 28, 84, 0, 983, 0, 0, 29, 881, 83, 0, + 0, 0, 0, 0, 0, 882, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, + 26, 0, 0, 0, 27, 28, 84, 0, 0, 80, + 0, 29, 14, 15, 16, 17, 18, 0, 0, 0, + 0, 0, 0, 19, 20, 21, 0, 0, 0, 0, + 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, + 524, 24, 544, 14, 15, 16, 17, 18, 0, 0, + 0, 0, 525, 0, 19, 20, 21, 0, 0, 0, + 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, + 23, 0, 24, 0, 0, 0, 80, 83, 0, 14, + 15, 16, 17, 18, 882, 0, 0, 0, 0, 0, + 19, 20, 21, 0, 0, 0, 0, 0, 25, 26, + 22, 0, 0, 27, 28, 84, 23, 924, 24, 0, + 29, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 0, 0, 0, 25, + 26, 0, 0, 0, 27, 28, 0, 0, 0, 0, + -603, 29, 0, 80, 83, 0, 14, 15, 16, 17, + 18, 0, 0, 0, 0, 0, 0, 19, 20, 21, + 0, 0, 0, 0, 0, 25, 26, 22, 0, 0, + 27, 28, 84, 23, 839, 24, 0, 29, 80, 0, + 0, 14, 15, 16, 17, 18, 0, 0, 0, 0, + 0, 0, 19, 20, 21, 0, 0, 0, 0, 0, + 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, + 24, 83, 0, 0, 0, 0, 0, 0, 882, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 25, 26, 0, 0, 0, 27, 28, 84, + 0, 0, 0, 0, 29, 13, 83, 0, 14, 15, + 16, 17, 18, 0, 0, 0, 0, 0, 0, 19, + 20, 21, 0, 0, 0, 0, 0, 25, 26, 22, + 0, 0, 27, 28, 84, 23, 0, 24, 549, 29, + 0, 14, 15, 16, 17, 18, 0, 0, 0, 0, + 0, 0, 19, 20, 21, 0, 0, 424, 0, 0, + 14, 15, 22, 17, 18, 0, 0, 0, 23, 0, + 24, 19, 20, 21, 0, 0, 0, 65, 0, 0, + 14, 15, 0, 17, 18, 0, 0, 23, 0, 24, + 82, 19, 20, 21, 25, 26, 0, 0, 0, 27, + 28, 0, 0, 0, 0, 0, 29, 23, 0, 24, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 0, 0, 0, 25, 26, 0, + 0, 0, 27, 28, 0, 0, 0, 0, 0, 29, + 0, 0, 0, 0, 0, 0, 25, 26, 0, 0, + 0, 27, 28, 0, 0, 0, 0, 0, 29, 0, + 0, 0, 0, 0, 0, 0, 25, 26, 0, 0, + 0, 27, 28, 395, 0, 396, 105, 0, 29, 0, + 0, 0, 227, 113, 114, 0, 228, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 229, 0, 82, 0, 230, 231, + 232, 233, 0, 0, 0, 0, 0, 234, 0, 0, + 235, 0, 0, 0, 0, 0, 0, 236, 237, 238, + 0, 0, 239, 240, 397, 241, 398, 0, 242, 243, + 399, 395, 0, 396, 105, 0, 0, 0, 0, 0, + 227, 113, 114, 0, 228, 0, 0, 244, 245, 246, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -468, 229, -468, 82, 0, 230, 231, 232, 233, + 0, 0, 0, 0, 0, 234, 0, 0, 235, 0, + 0, 0, 0, 0, 0, 236, 237, 238, 0, 0, + 239, 240, 397, 241, 398, 0, 242, 243, 399, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 244, 245, 246, 0, 0, + 0, 396, 711, 15, 16, 17, 18, 0, 227, 113, + 114, -412, 228, 19, 20, 21, 712, 0, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 23, + 229, 24, 82, 0, 230, 231, 232, 233, 0, 0, + 0, 0, 0, 234, 0, 0, 235, 0, 0, 0, + 0, 0, 0, 236, 237, 238, 0, 0, 239, 240, + 0, 241, 0, 0, 242, 243, 472, 724, 0, 0, + 0, 0, 725, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 244, 245, 246, 0, 0, 25, 26, + 0, 0, 0, 27, 28, 0, 0, 0, 0, 0, + 29, 226, 14, 15, 16, 17, 18, 0, 227, 113, + 114, 0, 228, 19, 20, 21, 0, 0, 0, 0, + 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, + 229, 24, 82, 0, 230, 231, 232, 233, 0, 0, + 0, 0, 0, 234, 0, 0, 235, 0, 0, 0, + 0, 0, 0, 236, 237, 238, 0, 0, 239, 240, + 0, 241, 0, 0, 242, 243, 0, 0, 226, 14, + 15, 0, 17, 18, 0, 227, 113, 114, 0, 228, + 19, 20, 21, 244, 245, 246, 0, 0, 25, 26, + 0, 0, 0, 27, 28, 0, 23, 229, 24, 82, + 29, 230, 231, 232, 233, 0, 0, 0, 0, 0, + 234, 0, 0, 235, 0, 0, 0, 0, 0, 0, + 236, 237, 238, 0, 0, 239, 240, 0, 241, 0, + 0, 242, 243, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 244, 245, 246, 0, 0, 25, 26, 0, 0, 0, + 27, 28, 811, 0, 396, 105, 0, 29, 0, 0, + 0, 227, 113, 114, 0, 228, 0, 0, 0, 712, + 0, 713, 714, 715, 716, 717, 817, 719, 720, 721, + 722, 723, 0, 229, 0, 82, 0, 230, 231, 232, + 233, 0, 0, 0, 0, 0, 234, 0, 0, 235, + 0, 0, 0, 0, 0, 0, 236, 237, 238, 0, + 0, 239, 240, 0, 241, 0, 0, 242, 243, 472, + 724, 395, 0, 396, 105, 725, 0, 0, 0, 0, + 227, 113, 114, 0, 228, 0, 244, 245, 246, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -519, 0, 229, 0, 82, 0, 230, 231, 232, 233, + 0, 0, 0, 0, 0, 234, 0, 0, 235, 0, + 0, 0, 0, 0, 0, 236, 237, 238, 0, 0, + 239, 240, 397, 241, 398, 0, 242, 243, 399, 14, + 15, 16, 17, 18, 0, 0, 0, 0, 669, 0, + 19, 20, 21, 0, 0, 244, 245, 246, 0, 0, + 22, 14, 15, 16, 17, 18, 23, 0, 24, -412, + 0, 0, 19, 20, 21, 0, 0, 0, 0, 0, + 14, 15, 22, 17, 18, 0, 0, 0, 23, 0, + 24, 19, 20, 21, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 23, 0, 24, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 25, 26, 0, 0, 0, + 27, 28, 0, 0, 0, 0, 0, 29, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 25, 26, 0, + 0, 0, 27, 28, 226, 0, 0, 0, 0, 29, + 0, 227, 113, 114, 0, 228, 25, 26, 0, 0, + 0, 27, 28, 0, 0, 0, 0, 0, 29, 0, + 0, 0, 0, 229, 0, 82, 0, 230, 231, 232, + 233, 0, 0, 0, 0, 0, 234, 0, 0, 235, + 0, 0, 0, 0, 0, 0, 236, 237, 238, 0, + 0, 239, 240, 0, 241, 0, 0, 242, 243, 0, + 0, 591, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 244, 245, 246, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 358, 359, + 360, 412, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 821, 0, + 396, 105, 0, 0, 0, 0, 0, 227, 113, 114, + 0, 228, 0, 0, 0, 712, 0, 713, 714, 715, + 716, 717, 817, 719, 720, 721, 722, 723, 0, 229, + 0, 82, 0, 230, 231, 232, 233, 0, 592, 0, + 0, 0, 234, 0, 0, 235, 0, 0, 0, 0, + 0, 0, 236, 237, 238, 0, 0, 239, 240, 0, + 241, 0, 0, 242, 243, 472, 724, 0, 0, 0, + 0, 725, 0, 0, 0, 0, 875, 0, -554, -554, + 0, 0, 244, 245, 246, -554, -554, -554, 0, -554, + 0, 0, 0, -554, 0, -554, -554, -554, -554, -554, + -554, -554, -554, -554, -554, -554, 0, -554, 0, -554, + 0, -554, -554, -554, -554, 0, 0, 0, 0, 0, + -554, 0, 0, -554, 0, 0, 0, 0, 0, 0, + -554, -554, -554, 0, 0, -554, -554, 0, -554, 0, + 0, -554, -554, -554, -554, 0, 864, 0, 226, -554, + 0, 0, 0, 0, 0, 227, 113, 114, 0, 228, + -554, -554, -554, 712, 0, 713, 714, 715, 716, 0, + 0, 719, 720, 721, 722, 723, 0, 229, 0, 82, + 0, 230, 231, 232, 233, 0, 0, 0, 0, 0, + 234, 0, 0, 235, 0, 0, 0, 0, 0, 0, + 236, 237, 238, 0, 0, 239, 240, 395, 241, 226, + 0, 242, 243, 472, 724, 0, 227, 113, 114, 725, + 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 244, 245, 246, 0, 0, 0, 0, 0, 229, 0, + 82, 0, 230, 231, 232, 233, -425, 0, 0, 0, + 0, 234, 0, 0, 235, 0, 0, 0, 0, 0, + 0, 236, 237, 238, 0, 0, 239, 240, -425, 241, + -425, 0, 242, 243, 399, 344, 0, 226, 0, 0, + 0, 0, 0, 0, 227, 113, 114, 0, 228, 0, + 0, 244, 245, 246, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 229, 0, 82, 0, + 230, 231, 232, 233, 0, 0, 0, 0, 0, 234, + 0, 0, 235, 0, 0, 0, 0, 0, 0, 236, + 237, 238, 0, 0, 239, 240, 395, 241, 226, 0, + 242, 243, -202, 0, 0, 227, 113, 114, 0, 228, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, + 245, 246, 0, 0, 0, 0, 0, 229, 0, 82, + 0, 230, 231, 232, 233, 0, 0, 0, 0, 0, + 234, 0, 0, 235, 0, 0, 0, 0, 0, 0, + 236, 237, 238, 0, 0, 239, 240, 682, 241, 226, + 0, 242, 243, 399, 0, 0, 227, 113, 114, 0, + 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 244, 245, 246, 0, 0, 0, 0, 0, 229, 0, + 82, 0, 230, 231, 232, 233, 0, 0, 0, 0, + 0, 234, 0, 0, 235, 0, 0, 0, 0, 0, + 0, 236, 237, 238, 0, 0, 239, 240, 0, 241, + 0, 0, 242, 243, 683, 0, 0, 0, 0, 396, + 105, 0, 0, 0, 0, 0, 227, 113, 114, 0, + 228, 244, 245, 246, 712, 0, 713, 714, 715, 716, + 717, 817, 719, 720, 721, 722, 723, 0, 229, 0, + 82, 0, 230, 231, 232, 233, 0, 0, 0, 0, + 0, 234, 0, 0, 235, 0, 0, 0, 0, 0, + 0, 236, 237, 238, 0, 0, 239, 240, 0, 241, + 226, 0, 242, 243, 472, 724, 0, 227, 113, 114, + 725, 228, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 244, 245, 246, 0, 0, 0, 0, 0, 229, + 0, 82, 0, 230, 231, 232, 233, 0, 0, 0, + 0, 0, 234, 0, 0, 235, 0, 0, 0, 0, + 0, 0, 236, 237, 238, 0, 0, 239, 240, 226, + 241, 0, 0, 242, 243, 579, 227, 113, 114, 0, + 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 244, 245, 246, 0, 0, 0, 229, 0, + 82, 0, 230, 231, 232, 233, 0, 0, 0, 0, + 0, 234, 0, 0, 235, 0, 0, 0, 0, 0, + 0, 236, 237, 238, 0, 0, 239, 240, 0, 241, + 226, 0, 242, 243, 0, 799, 0, 227, 113, 114, + 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 244, 245, 246, 0, 0, 0, 0, 0, 229, + 0, 82, 0, 230, 231, 232, 233, 0, 0, 0, + 0, 0, 234, 0, 0, 235, 0, 0, 0, 0, + 0, 0, 236, 237, 238, 0, 0, 239, 240, 226, + 241, 0, 0, 242, 243, 0, 227, 113, 114, 0, + 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 244, 245, 246, 0, 0, 0, 229, 0, + 82, 0, 230, 231, 232, 233, 0, 0, 0, 0, + 0, 234, 0, 0, 235, 0, 0, 0, 0, 0, + 0, 236, 237, 238, 0, 0, 239, 240, 226, 354, + 0, 0, 242, 243, 0, 227, 113, 114, 0, 228, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 244, 245, 246, 0, 0, 0, 229, 0, 82, + 0, 230, 231, 232, 233, 0, 0, 0, 0, 0, + 234, 0, 0, 235, 0, 0, 0, 0, 0, 0, + 236, 237, 238, 0, 0, 239, 240, 589, 356, 0, + 0, 242, 243, 0, 227, 113, 114, 0, 228, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 244, 245, 246, 0, 0, 0, 229, 0, 82, 0, + 230, 231, 232, 233, 0, 0, 0, 0, 0, 234, + 0, 0, 235, 0, 0, 0, 0, 0, 0, 236, + 237, 238, 0, 0, 239, 240, 0, 241, 0, 0, + 242, 243, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 24, 0, 0, 0, 244, + 245, 246, 358, 359, 360, 0, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 358, 359, 360, 0, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 858, 27, 28, 0, + 0, 358, 359, 360, 29, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 0, 748, 358, 359, 360, 859, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 575, + 358, 359, 360, 918, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376 +}; + +static const yytype_int16 yycheck[] = +{ + 4, 90, 47, 4, 4, 212, 234, 554, 4, 29, + 285, 4, 4, 3, 2, 4, 319, 411, 198, 554, + 7, 7, 554, 4, 7, 380, 381, 238, 224, 346, + 262, 554, 7, 438, 4, 1, 247, 450, 447, 448, + 656, 441, 40, 536, 270, 225, 30, 31, 32, 33, + 261, 509, 51, 689, 38, 39, 40, 41, 656, 90, + 11, 3, 4, 91, 92, 93, 407, 656, 194, 195, + 1, 69, 63, 64, 621, 95, 54, 97, 60, 3, + 4, 574, 66, 67, 68, 69, 621, 728, 1, 621, + 286, 8, 79, 79, 320, 206, 79, 19, 621, 98, + 98, 3, 68, 744, 79, 792, 110, 94, 94, 110, + 110, 94, 728, 64, 110, 63, 33, 110, 110, 94, + 35, 110, 4, 5, 6, 7, 8, 109, 744, 110, + 728, 13, 63, 15, 16, 17, 734, 824, 60, 728, + 110, 43, 338, 25, 68, 734, 326, 89, 33, 31, + 63, 506, 552, 558, 429, 57, 267, 30, 31, 32, + 33, 63, 84, 194, 195, 38, 39, 40, 41, 280, + 33, 3, 4, 514, 285, 51, 287, 813, 95, 96, + 43, 103, 213, 69, 99, 102, 69, 109, 916, 876, + 30, 68, 43, 66, 67, 68, 69, 68, 218, 219, + 43, 659, 206, 314, 0, 206, 206, 805, 90, 91, + 95, 96, 43, 68, 206, 98, 102, 102, 34, 35, + 36, 37, 98, 63, 64, 102, 42, 43, 44, 45, + 917, 102, 95, 96, 962, 881, 68, 241, 541, 102, + 241, 241, 262, 3, 4, 241, 933, 102, 241, 241, + 101, 0, 241, 594, 70, 71, 72, 73, 101, 905, + 241, 674, 458, 267, 475, 678, 267, 267, 299, 300, + 101, 241, 504, 110, 668, 267, 280, 457, 115, 280, + 280, 285, 408, 287, 285, 285, 287, 287, 280, 285, + 699, 517, 285, 285, 420, 287, 285, 57, 220, 757, + 944, 223, 285, 63, 285, 431, 62, 662, 62, 69, + 314, 0, 234, 314, 314, 69, 336, 102, 429, 1006, + 3, 4, 314, 301, 69, 532, 409, 971, 3, 4, + 556, 557, 10, 11, 12, 62, 340, 3, 4, 340, + 340, 63, 64, 265, 340, 101, 3, 340, 340, 432, + 354, 340, 356, 354, 354, 356, 356, 102, 354, 340, + 356, 354, 354, 356, 356, 354, 203, 356, 564, 686, + 340, 293, 319, 354, 57, 356, 323, 408, 409, 101, + 63, 64, 57, 563, 354, 63, 356, 567, 568, 420, + 40, 57, 69, 7, 8, 942, 943, 63, 426, 427, + 57, 15, 16, 17, 241, 3, 63, 942, 943, 40, + 942, 943, 62, 3, 64, 69, 447, 448, 69, 942, + 943, 69, 99, 79, 40, 429, 654, 69, 429, 429, + 63, 62, 269, 429, 65, 69, 429, 429, 94, 417, + 429, 758, 638, 33, 422, 99, 429, 98, 429, 729, + 646, 647, 83, 69, 734, 292, 98, 379, 69, 57, + 382, 764, 63, 64, 98, 63, 64, 57, 75, 306, + 63, 78, 3, 63, 64, 397, 90, 91, 62, 10, + 11, 12, 98, 1, 504, 69, 4, 5, 62, 7, + 8, 267, 99, 98, 722, 69, 101, 15, 16, 17, + 101, 80, 533, 57, 280, 95, 96, 38, 39, 63, + 64, 287, 102, 31, 351, 33, 34, 354, 408, 356, + 79, 195, 81, 360, 446, 199, 34, 35, 36, 37, + 420, 63, 63, 744, 42, 43, 44, 45, 314, 40, + 462, 431, 464, 98, 466, 752, 101, 3, 4, 69, + 554, 69, 778, 554, 10, 11, 12, 98, 554, 787, + 101, 554, 70, 71, 72, 73, 1, 870, 3, 4, + 873, 575, 90, 91, 575, 575, 62, 95, 96, 575, + 566, 99, 575, 575, 102, 98, 575, 509, 101, 98, + 512, 566, 3, 4, 575, 6, 7, 8, 69, 644, + 645, 63, 691, 631, 632, 575, 813, 63, 3, 4, + 76, 601, 76, 79, 25, 81, 1001, 621, 1003, 1004, + 621, 98, 88, 100, 88, 621, 616, 93, 621, 93, + 70, 71, 72, 73, 4, 5, 6, 7, 8, 623, + 624, 63, 64, 627, 628, 15, 16, 17, 33, 63, + 1005, 968, 969, 101, 576, 25, 57, 58, 59, 76, + 691, 31, 79, 80, 81, 781, 782, 98, 699, 700, + 656, 88, 57, 656, 101, 86, 93, 101, 63, 64, + 101, 656, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 28, 29, + 253, 254, 730, 731, 732, 885, 99, 694, 694, 101, + 95, 96, 698, 8, 910, 942, 943, 102, 63, 694, + 90, 91, 63, 698, 755, 814, 62, 69, 30, 909, + 98, 927, 654, 40, 656, 4, 5, 659, 7, 8, + 768, 769, 728, 69, 50, 728, 15, 16, 17, 98, + 623, 624, 68, 728, 627, 628, 43, 101, 744, 63, + 43, 744, 31, 101, 101, 207, 6, 7, 8, 744, + 101, 33, 9, 98, 33, 15, 16, 17, 100, 766, + 766, 43, 11, 814, 706, 25, 3, 774, 774, 69, + 69, 766, 69, 102, 99, 40, 63, 98, 43, 774, + 722, 63, 64, 101, 63, 64, 728, 101, 101, 625, + 626, 842, 734, 629, 630, 43, 738, 62, 43, 64, + 65, 90, 91, 101, 100, 100, 268, 101, 270, 271, + 101, 101, 274, 95, 96, 757, 95, 96, 83, 281, + 102, 283, 68, 102, 101, 101, 288, 3, 4, 101, + 90, 91, 55, 56, 57, 58, 59, 843, 844, 69, + 99, 303, 882, 98, 98, 787, 99, 309, 843, 844, + 792, 3, 68, 315, 101, 98, 35, 194, 195, 99, + 99, 68, 199, 101, 721, 40, 30, 43, 32, 68, + 34, 911, 36, 99, 38, 881, 40, 63, 42, 63, + 44, 57, 824, 63, 43, 43, 881, 63, 60, 61, + 62, 63, 64, 65, 262, 69, 69, 937, 69, 905, + 19, 99, 66, 99, 68, 40, 70, 101, 72, 69, + 905, 53, 54, 55, 56, 57, 58, 59, 942, 943, + 944, 942, 943, 944, 944, 69, 942, 943, 944, 942, + 943, 944, 944, 790, 876, 944, 793, 794, 946, 276, + 63, 69, 982, 944, 801, 265, 63, 971, 69, 99, + 971, 971, 99, 69, 69, 971, 996, 20, 971, 971, + 99, 423, 971, 99, 101, 69, 973, 973, 101, 826, + 971, 69, 1012, 1013, 69, 917, 69, 101, 973, 60, + 61, 62, 63, 64, 65, 64, 82, 84, 450, 101, + 452, 933, 69, 50, 84, 69, 853, 50, 68, 1023, + 69, 63, 1023, 1023, 98, 207, 863, 1023, 68, 100, + 1023, 1023, 1036, 69, 1023, 1036, 1036, 99, 101, 339, + 1036, 11, 1023, 1036, 1036, 101, 63, 1036, 11, 69, + 350, 64, 82, 101, 11, 1036, 63, 69, 358, 359, + 101, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 100, 885, 916, + 98, 637, 460, 698, 1006, 844, 268, 1012, 270, 271, + 1036, 408, 409, 1002, 506, 621, 29, 504, 398, 281, + 7, 8, 251, 420, 251, 692, 288, 407, 15, 16, + 17, 408, 512, 950, 431, 432, 406, 625, 626, 573, + 752, 629, 630, 466, 464, 962, 33, 309, 755, 728, + 572, 276, 657, 315, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 294, 734, 296, 952, 954, 992, 504, 429, 443, -1, + 444, 603, 613, 463, -1, 607, -1, -1, -1, 611, + 66, 67, 68, 69, 70, 71, 72, 73, -1, -1, + -1, -1, -1, 90, 91, -1, -1, -1, 95, 96, + -1, -1, -1, -1, -1, 102, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 509, + -1, -1, 512, -1, 514, 6, 7, 8, -1, -1, + -1, -1, -1, -1, 15, 16, 17, -1, -1, 671, + -1, -1, 674, 675, 25, -1, 678, 679, -1, -1, + -1, 423, 33, 42, -1, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 703, 704, -1, -1, -1, -1, -1, -1, -1, + 452, -1, -1, -1, -1, 623, 624, 625, 626, 627, + 628, 629, 630, 583, 584, -1, -1, -1, -1, -1, + -1, 591, -1, -1, 594, -1, -1, -1, -1, 90, + 91, -1, 602, -1, 95, 96, 606, -1, -1, 751, + -1, 102, 754, -1, -1, -1, -1, -1, 1, 619, + 3, 4, 5, 6, 7, 8, -1, -1, -1, -1, + -1, -1, 15, 16, 17, -1, 778, 779, 780, -1, + -1, -1, 25, -1, -1, -1, -1, 30, 31, -1, + 33, 34, -1, -1, -1, -1, -1, -1, -1, 659, + -1, -1, -1, -1, -1, -1, 262, -1, -1, -1, + -1, -1, 672, -1, 57, -1, 676, -1, -1, -1, + 63, -1, -1, -1, -1, -1, 69, -1, -1, -1, + 572, -1, 692, -1, -1, -1, 838, -1, 294, 295, + 296, 297, -1, -1, -1, -1, -1, 90, 91, -1, + -1, -1, 95, 96, 97, -1, -1, 717, -1, 102, + -1, 603, -1, -1, -1, 607, -1, -1, -1, 611, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 1, -1, 3, 4, 5, -1, 7, 8, -1, 10, + 11, 12, -1, 14, 15, 16, 17, 757, 900, -1, + 902, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 31, 32, 33, 34, -1, 36, 37, 38, 39, 623, + -1, 625, -1, 627, 45, 629, -1, 48, -1, 671, + -1, -1, -1, 675, 55, 56, 57, 679, -1, 60, + 61, -1, 63, -1, -1, 66, 67, 68, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + -1, 703, 704, -1, 85, 86, 87, -1, -1, 90, + 91, -1, -1, -1, 95, 96, -1, -1, 40, 41, + 42, 102, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 858, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 751, + 1, -1, 754, 4, 5, 6, 7, 8, -1, -1, + -1, -1, 13, -1, 15, 16, 17, -1, -1, -1, + -1, -1, -1, -1, 25, -1, 778, 779, 780, -1, + 31, -1, 33, -1, -1, -1, -1, 1, 504, 3, + 4, 5, 6, 7, 8, -1, 10, 11, 12, -1, + 14, 15, 16, 17, 18, -1, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, -1, 36, 37, 38, 39, -1, -1, -1, -1, + -1, 45, -1, -1, 48, -1, 838, -1, -1, 90, + 91, 55, 56, 57, 95, 96, 60, 61, -1, 63, + 101, 102, 66, 67, 68, 69, -1, -1, -1, -1, + 74, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 85, 86, 87, -1, -1, 90, 91, -1, -1, + -1, 95, 96, -1, -1, 99, -1, -1, 102, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 900, -1, + 902, -1, -1, 1023, -1, -1, -1, 623, 624, 625, + 626, 627, 628, 629, 630, 1, 1036, 3, 4, 5, + 6, 7, 8, -1, 10, 11, 12, -1, 14, 15, + 16, 17, 18, -1, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, -1, + 36, 37, 38, 39, -1, -1, -1, -1, -1, 45, + -1, -1, 48, -1, -1, -1, -1, -1, -1, 55, + 56, 57, -1, -1, 60, 61, -1, 63, -1, -1, + 66, 67, 68, 69, -1, -1, -1, -1, 74, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 85, + 86, 87, -1, -1, 90, 91, -1, 723, -1, 95, + 96, -1, -1, -1, -1, 1, 102, 3, 4, 5, + 6, 7, 8, -1, -1, -1, -1, -1, -1, 15, + 16, 17, -1, -1, -1, -1, -1, -1, -1, 25, + -1, -1, -1, -1, -1, 31, -1, 33, -1, -1, + 1, -1, -1, 4, 5, 6, 7, 8, -1, -1, + -1, -1, -1, -1, 15, 16, 17, -1, -1, -1, + -1, -1, -1, -1, 25, -1, -1, -1, -1, -1, + 31, -1, 33, 69, -1, -1, -1, -1, -1, -1, + -1, 77, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, -1, 90, 91, -1, -1, -1, 95, + 96, 97, -1, 99, -1, -1, 102, 68, 69, -1, + -1, -1, -1, -1, -1, 76, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 90, + 91, -1, -1, -1, 95, 96, 97, -1, -1, 1, + -1, 102, 4, 5, 6, 7, 8, -1, -1, -1, + -1, -1, -1, 15, 16, 17, -1, -1, -1, -1, + -1, -1, -1, 25, -1, -1, -1, -1, -1, 31, + 1, 33, 3, 4, 5, 6, 7, 8, -1, -1, + -1, -1, 13, -1, 15, 16, 17, -1, -1, -1, + -1, -1, -1, -1, 25, -1, -1, -1, -1, -1, + 31, -1, 33, -1, -1, -1, 1, 69, -1, 4, + 5, 6, 7, 8, 76, -1, -1, -1, -1, -1, + 15, 16, 17, -1, -1, -1, -1, -1, 90, 91, + 25, -1, -1, 95, 96, 97, 31, 99, 33, -1, + 102, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, -1, -1, -1, 90, + 91, -1, -1, -1, 95, 96, -1, -1, -1, -1, + 101, 102, -1, 1, 69, -1, 4, 5, 6, 7, + 8, -1, -1, -1, -1, -1, -1, 15, 16, 17, + -1, -1, -1, -1, -1, 90, 91, 25, -1, -1, + 95, 96, 97, 31, 99, 33, -1, 102, 1, -1, + -1, 4, 5, 6, 7, 8, -1, -1, -1, -1, + -1, -1, 15, 16, 17, -1, -1, -1, -1, -1, + -1, -1, 25, -1, -1, -1, -1, -1, 31, -1, + 33, 69, -1, -1, -1, -1, -1, -1, 76, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 90, 91, -1, -1, -1, 95, 96, 97, + -1, -1, -1, -1, 102, 1, 69, -1, 4, 5, + 6, 7, 8, -1, -1, -1, -1, -1, -1, 15, + 16, 17, -1, -1, -1, -1, -1, 90, 91, 25, + -1, -1, 95, 96, 97, 31, -1, 33, 1, 102, + -1, 4, 5, 6, 7, 8, -1, -1, -1, -1, + -1, -1, 15, 16, 17, -1, -1, 1, -1, -1, + 4, 5, 25, 7, 8, -1, -1, -1, 31, -1, + 33, 15, 16, 17, -1, -1, -1, 1, -1, -1, + 4, 5, -1, 7, 8, -1, -1, 31, -1, 33, + 34, 15, 16, 17, 90, 91, -1, -1, -1, 95, + 96, -1, -1, -1, -1, -1, 102, 31, -1, 33, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, -1, -1, -1, 90, 91, -1, + -1, -1, 95, 96, -1, -1, -1, -1, -1, 102, + -1, -1, -1, -1, -1, -1, 90, 91, -1, -1, + -1, 95, 96, -1, -1, -1, -1, -1, 102, -1, + -1, -1, -1, -1, -1, -1, 90, 91, -1, -1, + -1, 95, 96, 1, -1, 3, 4, -1, 102, -1, + -1, -1, 10, 11, 12, -1, 14, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 32, -1, 34, -1, 36, 37, + 38, 39, -1, -1, -1, -1, -1, 45, -1, -1, + 48, -1, -1, -1, -1, -1, -1, 55, 56, 57, + -1, -1, 60, 61, 62, 63, 64, -1, 66, 67, + 68, 1, -1, 3, 4, -1, -1, -1, -1, -1, + 10, 11, 12, -1, 14, -1, -1, 85, 86, 87, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 99, 32, 101, 34, -1, 36, 37, 38, 39, + -1, -1, -1, -1, -1, 45, -1, -1, 48, -1, + -1, -1, -1, -1, -1, 55, 56, 57, -1, -1, + 60, 61, 62, 63, 64, -1, 66, 67, 68, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 85, 86, 87, -1, -1, + -1, 3, 4, 5, 6, 7, 8, -1, 10, 11, + 12, 101, 14, 15, 16, 17, 18, -1, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, -1, 36, 37, 38, 39, -1, -1, + -1, -1, -1, 45, -1, -1, 48, -1, -1, -1, + -1, -1, -1, 55, 56, 57, -1, -1, 60, 61, + -1, 63, -1, -1, 66, 67, 68, 69, -1, -1, + -1, -1, 74, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 85, 86, 87, -1, -1, 90, 91, + -1, -1, -1, 95, 96, -1, -1, -1, -1, -1, + 102, 3, 4, 5, 6, 7, 8, -1, 10, 11, + 12, -1, 14, 15, 16, 17, -1, -1, -1, -1, + -1, -1, -1, 25, -1, -1, -1, -1, -1, 31, + 32, 33, 34, -1, 36, 37, 38, 39, -1, -1, + -1, -1, -1, 45, -1, -1, 48, -1, -1, -1, + -1, -1, -1, 55, 56, 57, -1, -1, 60, 61, + -1, 63, -1, -1, 66, 67, -1, -1, 3, 4, + 5, -1, 7, 8, -1, 10, 11, 12, -1, 14, + 15, 16, 17, 85, 86, 87, -1, -1, 90, 91, + -1, -1, -1, 95, 96, -1, 31, 32, 33, 34, + 102, 36, 37, 38, 39, -1, -1, -1, -1, -1, + 45, -1, -1, 48, -1, -1, -1, -1, -1, -1, + 55, 56, 57, -1, -1, 60, 61, -1, 63, -1, + -1, 66, 67, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 85, 86, 87, -1, -1, 90, 91, -1, -1, -1, + 95, 96, 1, -1, 3, 4, -1, 102, -1, -1, + -1, 10, 11, 12, -1, 14, -1, -1, -1, 18, + -1, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 29, 30, -1, 32, -1, 34, -1, 36, 37, 38, + 39, -1, -1, -1, -1, -1, 45, -1, -1, 48, + -1, -1, -1, -1, -1, -1, 55, 56, 57, -1, + -1, 60, 61, -1, 63, -1, -1, 66, 67, 68, + 69, 1, -1, 3, 4, 74, -1, -1, -1, -1, + 10, 11, 12, -1, 14, -1, 85, 86, 87, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 99, -1, 32, -1, 34, -1, 36, 37, 38, 39, + -1, -1, -1, -1, -1, 45, -1, -1, 48, -1, + -1, -1, -1, -1, -1, 55, 56, 57, -1, -1, + 60, 61, 62, 63, 64, -1, 66, 67, 68, 4, + 5, 6, 7, 8, -1, -1, -1, -1, 13, -1, + 15, 16, 17, -1, -1, 85, 86, 87, -1, -1, + 25, 4, 5, 6, 7, 8, 31, -1, 33, 99, + -1, -1, 15, 16, 17, -1, -1, -1, -1, -1, + 4, 5, 25, 7, 8, -1, -1, -1, 31, -1, + 33, 15, 16, 17, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 31, -1, 33, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 90, 91, -1, -1, -1, + 95, 96, -1, -1, -1, -1, -1, 102, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 90, 91, -1, + -1, -1, 95, 96, 3, -1, -1, -1, -1, 102, + -1, 10, 11, 12, -1, 14, 90, 91, -1, -1, + -1, 95, 96, -1, -1, -1, -1, -1, 102, -1, + -1, -1, -1, 32, -1, 34, -1, 36, 37, 38, + 39, -1, -1, -1, -1, -1, 45, -1, -1, 48, + -1, -1, -1, -1, -1, -1, 55, 56, 57, -1, + -1, 60, 61, -1, 63, -1, -1, 66, 67, -1, + -1, 13, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 85, 86, 87, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 40, 41, + 42, 100, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 1, -1, + 3, 4, -1, -1, -1, -1, -1, 10, 11, 12, + -1, 14, -1, -1, -1, 18, -1, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, -1, 32, + -1, 34, -1, 36, 37, 38, 39, -1, 100, -1, + -1, -1, 45, -1, -1, 48, -1, -1, -1, -1, + -1, -1, 55, 56, 57, -1, -1, 60, 61, -1, + 63, -1, -1, 66, 67, 68, 69, -1, -1, -1, + -1, 74, -1, -1, -1, -1, 1, -1, 3, 4, + -1, -1, 85, 86, 87, 10, 11, 12, -1, 14, + -1, -1, -1, 18, -1, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, -1, 32, -1, 34, + -1, 36, 37, 38, 39, -1, -1, -1, -1, -1, + 45, -1, -1, 48, -1, -1, -1, -1, -1, -1, + 55, 56, 57, -1, -1, 60, 61, -1, 63, -1, + -1, 66, 67, 68, 69, -1, 1, -1, 3, 74, + -1, -1, -1, -1, -1, 10, 11, 12, -1, 14, + 85, 86, 87, 18, -1, 20, 21, 22, 23, -1, + -1, 26, 27, 28, 29, 30, -1, 32, -1, 34, + -1, 36, 37, 38, 39, -1, -1, -1, -1, -1, + 45, -1, -1, 48, -1, -1, -1, -1, -1, -1, + 55, 56, 57, -1, -1, 60, 61, 1, 63, 3, + -1, 66, 67, 68, 69, -1, 10, 11, 12, 74, + 14, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 85, 86, 87, -1, -1, -1, -1, -1, 32, -1, + 34, -1, 36, 37, 38, 39, 40, -1, -1, -1, + -1, 45, -1, -1, 48, -1, -1, -1, -1, -1, + -1, 55, 56, 57, -1, -1, 60, 61, 62, 63, + 64, -1, 66, 67, 68, 1, -1, 3, -1, -1, + -1, -1, -1, -1, 10, 11, 12, -1, 14, -1, + -1, 85, 86, 87, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 32, -1, 34, -1, + 36, 37, 38, 39, -1, -1, -1, -1, -1, 45, + -1, -1, 48, -1, -1, -1, -1, -1, -1, 55, + 56, 57, -1, -1, 60, 61, 1, 63, 3, -1, + 66, 67, 68, -1, -1, 10, 11, 12, -1, 14, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 85, + 86, 87, -1, -1, -1, -1, -1, 32, -1, 34, + -1, 36, 37, 38, 39, -1, -1, -1, -1, -1, + 45, -1, -1, 48, -1, -1, -1, -1, -1, -1, + 55, 56, 57, -1, -1, 60, 61, 1, 63, 3, + -1, 66, 67, 68, -1, -1, 10, 11, 12, -1, + 14, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 85, 86, 87, -1, -1, -1, -1, -1, 32, -1, + 34, -1, 36, 37, 38, 39, -1, -1, -1, -1, + -1, 45, -1, -1, 48, -1, -1, -1, -1, -1, + -1, 55, 56, 57, -1, -1, 60, 61, -1, 63, + -1, -1, 66, 67, 68, -1, -1, -1, -1, 3, + 4, -1, -1, -1, -1, -1, 10, 11, 12, -1, + 14, 85, 86, 87, 18, -1, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, -1, 32, -1, + 34, -1, 36, 37, 38, 39, -1, -1, -1, -1, + -1, 45, -1, -1, 48, -1, -1, -1, -1, -1, + -1, 55, 56, 57, -1, -1, 60, 61, -1, 63, + 3, -1, 66, 67, 68, 69, -1, 10, 11, 12, + 74, 14, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 85, 86, 87, -1, -1, -1, -1, -1, 32, + -1, 34, -1, 36, 37, 38, 39, -1, -1, -1, + -1, -1, 45, -1, -1, 48, -1, -1, -1, -1, + -1, -1, 55, 56, 57, -1, -1, 60, 61, 3, + 63, -1, -1, 66, 67, 68, 10, 11, 12, -1, + 14, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 85, 86, 87, -1, -1, -1, 32, -1, + 34, -1, 36, 37, 38, 39, -1, -1, -1, -1, + -1, 45, -1, -1, 48, -1, -1, -1, -1, -1, + -1, 55, 56, 57, -1, -1, 60, 61, -1, 63, + 3, -1, 66, 67, -1, 69, -1, 10, 11, 12, + -1, 14, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 85, 86, 87, -1, -1, -1, -1, -1, 32, + -1, 34, -1, 36, 37, 38, 39, -1, -1, -1, + -1, -1, 45, -1, -1, 48, -1, -1, -1, -1, + -1, -1, 55, 56, 57, -1, -1, 60, 61, 3, + 63, -1, -1, 66, 67, -1, 10, 11, 12, -1, + 14, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 85, 86, 87, -1, -1, -1, 32, -1, + 34, -1, 36, 37, 38, 39, -1, -1, -1, -1, + -1, 45, -1, -1, 48, -1, -1, -1, -1, -1, + -1, 55, 56, 57, -1, -1, 60, 61, 3, 63, + -1, -1, 66, 67, -1, 10, 11, 12, -1, 14, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 85, 86, 87, -1, -1, -1, 32, -1, 34, + -1, 36, 37, 38, 39, -1, -1, -1, -1, -1, + 45, -1, -1, 48, -1, -1, -1, -1, -1, -1, + 55, 56, 57, -1, -1, 60, 61, 3, 63, -1, + -1, 66, 67, -1, 10, 11, 12, -1, 14, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 85, 86, 87, -1, -1, -1, 32, -1, 34, -1, + 36, 37, 38, 39, -1, -1, -1, -1, -1, 45, + -1, -1, 48, -1, -1, -1, -1, -1, -1, 55, + 56, 57, -1, -1, 60, 61, -1, 63, -1, -1, + 66, 67, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 33, -1, -1, -1, 85, + 86, 87, 40, 41, 42, -1, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 40, 41, 42, -1, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 13, 95, 96, -1, + -1, 40, 41, 42, 102, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, -1, 100, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 98, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59 +}; + +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const yytype_uint16 yystos[] = +{ + 0, 70, 71, 72, 73, 104, 169, 170, 105, 106, + 110, 121, 169, 1, 4, 5, 6, 7, 8, 15, + 16, 17, 25, 31, 33, 90, 91, 95, 96, 102, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 233, 234, + 235, 236, 237, 248, 250, 251, 252, 256, 280, 281, + 286, 351, 361, 362, 364, 1, 208, 209, 210, 211, + 212, 213, 214, 215, 228, 229, 230, 298, 0, 171, + 1, 30, 34, 69, 97, 172, 173, 174, 175, 176, + 205, 224, 225, 231, 360, 76, 88, 93, 122, 125, + 129, 132, 107, 62, 3, 4, 68, 180, 279, 102, + 63, 63, 10, 11, 12, 63, 200, 253, 180, 182, + 253, 257, 233, 234, 248, 361, 362, 233, 234, 361, + 362, 233, 234, 248, 361, 362, 233, 234, 361, 362, + 235, 236, 248, 361, 362, 235, 236, 361, 362, 235, + 236, 248, 361, 362, 235, 236, 361, 362, 233, 234, + 248, 361, 362, 233, 234, 361, 362, 233, 234, 248, + 361, 362, 233, 234, 361, 362, 235, 236, 248, 361, + 362, 235, 236, 361, 362, 235, 236, 248, 361, 362, + 235, 236, 361, 362, 352, 352, 251, 68, 279, 299, + 172, 69, 99, 63, 180, 3, 57, 63, 239, 241, + 245, 278, 205, 205, 205, 172, 182, 182, 79, 81, + 80, 108, 180, 285, 249, 279, 3, 10, 14, 32, + 36, 37, 38, 39, 45, 48, 55, 56, 57, 60, + 61, 63, 66, 67, 85, 86, 87, 183, 184, 186, + 187, 188, 189, 190, 191, 192, 194, 196, 199, 200, + 298, 360, 63, 184, 1, 63, 4, 57, 63, 64, + 277, 278, 300, 301, 302, 303, 304, 306, 308, 309, + 57, 278, 300, 302, 289, 290, 249, 57, 63, 300, + 302, 184, 40, 62, 208, 209, 210, 211, 229, 232, + 247, 250, 69, 98, 30, 63, 64, 118, 177, 242, + 305, 307, 309, 4, 57, 63, 238, 240, 243, 275, + 276, 278, 239, 278, 69, 111, 130, 182, 182, 109, + 180, 1, 180, 296, 297, 68, 102, 256, 249, 63, + 63, 180, 181, 192, 1, 184, 197, 298, 192, 101, + 98, 63, 196, 199, 63, 189, 63, 189, 40, 41, + 42, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 101, 192, 86, 182, 254, 255, 258, + 361, 362, 364, 101, 101, 1, 3, 62, 64, 68, + 180, 194, 261, 262, 263, 265, 267, 268, 232, 247, + 345, 346, 100, 184, 247, 305, 247, 250, 63, 306, + 232, 247, 250, 99, 1, 69, 228, 229, 291, 360, + 68, 232, 247, 101, 184, 180, 278, 278, 206, 247, + 63, 353, 354, 119, 63, 247, 62, 232, 247, 69, + 98, 177, 242, 305, 69, 177, 50, 113, 249, 123, + 126, 69, 98, 40, 98, 288, 284, 68, 194, 298, + 101, 101, 68, 319, 320, 101, 194, 298, 298, 194, + 194, 184, 195, 194, 194, 194, 194, 194, 194, 194, + 194, 194, 194, 194, 194, 194, 194, 194, 194, 180, + 185, 186, 186, 180, 98, 101, 63, 180, 194, 266, + 43, 101, 98, 287, 40, 268, 265, 277, 302, 303, + 301, 9, 359, 363, 1, 13, 347, 349, 350, 351, + 100, 247, 205, 205, 69, 291, 282, 69, 69, 101, + 243, 275, 11, 359, 3, 347, 355, 356, 357, 1, + 120, 350, 355, 40, 178, 180, 276, 276, 206, 247, + 3, 114, 115, 116, 249, 131, 63, 133, 133, 180, + 194, 297, 99, 296, 283, 98, 98, 314, 101, 68, + 192, 101, 101, 43, 43, 101, 100, 255, 101, 3, + 185, 13, 100, 261, 264, 263, 265, 101, 101, 101, + 69, 98, 43, 275, 292, 294, 43, 278, 293, 295, + 289, 242, 101, 98, 101, 100, 98, 100, 359, 246, + 201, 202, 203, 208, 209, 212, 213, 216, 217, 220, + 221, 226, 227, 101, 243, 40, 51, 98, 249, 112, + 68, 134, 135, 136, 224, 225, 249, 249, 247, 288, + 289, 298, 180, 198, 35, 99, 315, 316, 317, 193, + 194, 194, 98, 101, 101, 194, 99, 265, 348, 13, + 351, 194, 43, 247, 98, 194, 43, 247, 98, 99, + 247, 357, 1, 68, 194, 259, 179, 13, 203, 205, + 69, 205, 244, 115, 68, 137, 138, 101, 98, 352, + 352, 124, 127, 99, 99, 101, 62, 101, 181, 358, + 1, 4, 18, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 69, 74, 181, 184, 204, 207, + 224, 225, 231, 310, 311, 313, 320, 321, 322, 323, + 326, 327, 330, 338, 360, 317, 261, 186, 100, 347, + 247, 194, 206, 247, 194, 206, 247, 260, 1, 318, + 320, 69, 238, 239, 278, 259, 117, 174, 224, 225, + 99, 75, 78, 139, 140, 141, 143, 136, 276, 278, + 278, 68, 68, 247, 247, 180, 69, 98, 69, 99, + 63, 332, 324, 63, 63, 194, 43, 69, 69, 69, + 184, 57, 181, 339, 362, 328, 43, 69, 207, 310, + 312, 1, 313, 205, 205, 205, 99, 25, 313, 326, + 19, 1, 325, 330, 338, 1, 63, 207, 99, 101, + 247, 294, 247, 295, 261, 320, 69, 69, 242, 99, + 174, 205, 205, 142, 144, 174, 247, 247, 247, 137, + 137, 181, 184, 63, 325, 184, 340, 184, 13, 43, + 69, 184, 69, 63, 1, 329, 330, 99, 238, 269, + 275, 239, 272, 278, 69, 1, 331, 325, 184, 99, + 247, 68, 76, 145, 147, 148, 149, 174, 145, 99, + 99, 101, 184, 20, 69, 101, 194, 69, 184, 69, + 242, 69, 242, 325, 101, 146, 147, 182, 64, 118, + 249, 82, 84, 167, 128, 101, 334, 337, 43, 43, + 101, 247, 247, 69, 99, 147, 150, 249, 69, 182, + 168, 84, 152, 333, 340, 325, 11, 64, 341, 342, + 343, 69, 270, 273, 50, 69, 68, 153, 325, 69, + 63, 182, 43, 101, 98, 201, 201, 151, 161, 298, + 169, 68, 335, 184, 100, 341, 69, 343, 271, 274, + 51, 98, 99, 162, 340, 101, 11, 43, 101, 320, + 320, 161, 77, 99, 154, 163, 164, 165, 166, 174, + 182, 101, 63, 11, 344, 69, 89, 155, 156, 157, + 182, 40, 62, 65, 83, 64, 336, 184, 98, 101, + 182, 69, 98, 82, 165, 166, 165, 165, 186, 325, + 101, 11, 69, 63, 156, 182, 69, 69, 69, 100, + 158, 159, 160, 161, 194, 101, 98, 160 +}; + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY (-2) +#define YYEOF 0 + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab + + +/* Like YYERROR except do call yyerror. This remains here temporarily + to ease the transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. */ + +#define YYFAIL goto yyerrlab + +#define YYRECOVERING() (!!yyerrstatus) + +#define YYBACKUP(Token, Value) \ +do \ + if (yychar == YYEMPTY && yylen == 1) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + yytoken = YYTRANSLATE (yychar); \ + YYPOPSTACK (1); \ + goto yybackup; \ + } \ + else \ + { \ + yyerror (YY_("syntax error: cannot back up")); \ + YYERROR; \ + } \ +while (YYID (0)) + + +#define YYTERROR 1 +#define YYERRCODE 256 + + +/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. + If N is 0, then set CURRENT to the empty location which ends + the previous symbol: RHS[0] (always defined). */ + +#define YYRHSLOC(Rhs, K) ((Rhs)[K]) +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + do \ + if (YYID (N)) \ + { \ + (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ + (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ + (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ + (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ + } \ + else \ + { \ + (Current).first_line = (Current).last_line = \ + YYRHSLOC (Rhs, 0).last_line; \ + (Current).first_column = (Current).last_column = \ + YYRHSLOC (Rhs, 0).last_column; \ + } \ + while (YYID (0)) +#endif + + +/* YY_LOCATION_PRINT -- Print the location on the stream. + This macro was not mandated originally: define only if we know + we won't break user code: when these are the locations we know. */ + +#ifndef YY_LOCATION_PRINT +# if YYLTYPE_IS_TRIVIAL +# define YY_LOCATION_PRINT(File, Loc) \ + fprintf (File, "%d.%d-%d.%d", \ + (Loc).first_line, (Loc).first_column, \ + (Loc).last_line, (Loc).last_column) +# else +# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +# endif +#endif + + +/* YYLEX -- calling `yylex' with the right arguments. */ + +#ifdef YYLEX_PARAM +# define YYLEX yylex (&yylval, YYLEX_PARAM) +#else +# define YYLEX yylex (&yylval) +#endif + +/* Enable debugging if requested. */ +#if YYDEBUG + +# ifndef YYFPRINTF +# include /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (YYID (0)) + +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yy_symbol_print (stderr, \ + Type, Value); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (YYID (0)) + + +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +/*ARGSUSED*/ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) +#else +static void +yy_symbol_value_print (yyoutput, yytype, yyvaluep) + FILE *yyoutput; + int yytype; + YYSTYPE const * const yyvaluep; +#endif +{ + if (!yyvaluep) + return; +# ifdef YYPRINT + if (yytype < YYNTOKENS) + YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +# else + YYUSE (yyoutput); +# endif + switch (yytype) + { + default: + break; + } +} + + +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) +#else +static void +yy_symbol_print (yyoutput, yytype, yyvaluep) + FILE *yyoutput; + int yytype; + YYSTYPE const * const yyvaluep; +#endif +{ + if (yytype < YYNTOKENS) + YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); + else + YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); + + yy_symbol_value_print (yyoutput, yytype, yyvaluep); + YYFPRINTF (yyoutput, ")"); +} + +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (included). | +`------------------------------------------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) +#else +static void +yy_stack_print (bottom, top) + yytype_int16 *bottom; + yytype_int16 *top; +#endif +{ + YYFPRINTF (stderr, "Stack now"); + for (; bottom <= top; ++bottom) + YYFPRINTF (stderr, " %d", *bottom); + YYFPRINTF (stderr, "\n"); +} + +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (YYID (0)) + + +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_reduce_print (YYSTYPE *yyvsp, int yyrule) +#else +static void +yy_reduce_print (yyvsp, yyrule) + YYSTYPE *yyvsp; + int yyrule; +#endif +{ + int yynrhs = yyr2[yyrule]; + int yyi; + unsigned long int yylno = yyrline[yyrule]; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", + yyrule - 1, yylno); + /* The symbols being reduced. */ + for (yyi = 0; yyi < yynrhs; yyi++) + { + fprintf (stderr, " $%d = ", yyi + 1); + yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], + &(yyvsp[(yyi + 1) - (yynrhs)]) + ); + fprintf (stderr, "\n"); + } +} + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (yyvsp, Rule); \ +} while (YYID (0)) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !YYDEBUG */ + + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ + +#ifndef YYMAXDEPTH +# define YYMAXDEPTH 10000 +#endif + + + +#if YYERROR_VERBOSE + +# ifndef yystrlen +# if defined __GLIBC__ && defined _STRING_H +# define yystrlen strlen +# else +/* Return the length of YYSTR. */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static YYSIZE_T +yystrlen (const char *yystr) +#else +static YYSIZE_T +yystrlen (yystr) + const char *yystr; +#endif +{ + YYSIZE_T yylen; + for (yylen = 0; yystr[yylen]; yylen++) + continue; + return yylen; +} +# endif +# endif + +# ifndef yystpcpy +# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static char * +yystpcpy (char *yydest, const char *yysrc) +#else +static char * +yystpcpy (yydest, yysrc) + char *yydest; + const char *yysrc; +#endif +{ + char *yyd = yydest; + const char *yys = yysrc; + + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; +} +# endif +# endif + +# ifndef yytnamerr +/* Copy to YYRES the contents of YYSTR after stripping away unnecessary + quotes and backslashes, so that it's suitable for yyerror. The + heuristic is that double-quoting is unnecessary unless the string + contains an apostrophe, a comma, or backslash (other than + backslash-backslash). YYSTR is taken from yytname. If YYRES is + null, do not copy; instead, return the length of what the result + would have been. */ +static YYSIZE_T +yytnamerr (char *yyres, const char *yystr) +{ + if (*yystr == '"') + { + YYSIZE_T yyn = 0; + char const *yyp = yystr; + + for (;;) + switch (*++yyp) + { + case '\'': + case ',': + goto do_not_strip_quotes; + + case '\\': + if (*++yyp != '\\') + goto do_not_strip_quotes; + /* Fall through. */ + default: + if (yyres) + yyres[yyn] = *yyp; + yyn++; + break; + + case '"': + if (yyres) + yyres[yyn] = '\0'; + return yyn; + } + do_not_strip_quotes: ; + } + + if (! yyres) + return yystrlen (yystr); + + return yystpcpy (yyres, yystr) - yyres; +} +# endif + +/* Copy into YYRESULT an error message about the unexpected token + YYCHAR while in state YYSTATE. Return the number of bytes copied, + including the terminating null byte. If YYRESULT is null, do not + copy anything; just return the number of bytes that would be + copied. As a special case, return 0 if an ordinary "syntax error" + message will do. Return YYSIZE_MAXIMUM if overflow occurs during + size calculation. */ +static YYSIZE_T +yysyntax_error (char *yyresult, int yystate, int yychar) +{ + int yyn = yypact[yystate]; + + if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) + return 0; + else + { + int yytype = YYTRANSLATE (yychar); + YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); + YYSIZE_T yysize = yysize0; + YYSIZE_T yysize1; + int yysize_overflow = 0; + enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; + char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; + int yyx; + +# if 0 + /* This is so xgettext sees the translatable formats that are + constructed on the fly. */ + YY_("syntax error, unexpected %s"); + YY_("syntax error, unexpected %s, expecting %s"); + YY_("syntax error, unexpected %s, expecting %s or %s"); + YY_("syntax error, unexpected %s, expecting %s or %s or %s"); + YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); +# endif + char *yyfmt; + char const *yyf; + static char const yyunexpected[] = "syntax error, unexpected %s"; + static char const yyexpecting[] = ", expecting %s"; + static char const yyor[] = " or %s"; + char yyformat[sizeof yyunexpected + + sizeof yyexpecting - 1 + + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) + * (sizeof yyor - 1))]; + char const *yyprefix = yyexpecting; + + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = YYLAST - yyn + 1; + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; + int yycount = 1; + + yyarg[0] = yytname[yytype]; + yyfmt = yystpcpy (yyformat, yyunexpected); + + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) + { + yycount = 1; + yysize = yysize0; + yyformat[sizeof yyunexpected - 1] = '\0'; + break; + } + yyarg[yycount++] = yytname[yyx]; + yysize1 = yysize + yytnamerr (0, yytname[yyx]); + yysize_overflow |= (yysize1 < yysize); + yysize = yysize1; + yyfmt = yystpcpy (yyfmt, yyprefix); + yyprefix = yyor; + } + + yyf = YY_(yyformat); + yysize1 = yysize + yystrlen (yyf); + yysize_overflow |= (yysize1 < yysize); + yysize = yysize1; + + if (yysize_overflow) + return YYSIZE_MAXIMUM; + + if (yyresult) + { + /* Avoid sprintf, as that infringes on the user's name space. + Don't have undefined behavior even if the translation + produced a string with the wrong number of "%s"s. */ + char *yyp = yyresult; + int yyi = 0; + while ((*yyp = *yyf) != '\0') + { + if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) + { + yyp += yytnamerr (yyp, yyarg[yyi++]); + yyf += 2; + } + else + { + yyp++; + yyf++; + } + } + } + return yysize; + } +} +#endif /* YYERROR_VERBOSE */ + + +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +/*ARGSUSED*/ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) +#else +static void +yydestruct (yymsg, yytype, yyvaluep) + const char *yymsg; + int yytype; + YYSTYPE *yyvaluep; +#endif +{ + YYUSE (yyvaluep); + + if (!yymsg) + yymsg = "Deleting"; + YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); + + switch (yytype) + { + + default: + break; + } +} + + +/* Prevent warnings from -Wmissing-prototypes. */ + +#ifdef YYPARSE_PARAM +#if defined __STDC__ || defined __cplusplus +int yyparse (void *YYPARSE_PARAM); +#else +int yyparse (); +#endif +#else /* ! YYPARSE_PARAM */ +#if defined __STDC__ || defined __cplusplus +int yyparse (void); +#else +int yyparse (); +#endif +#endif /* ! YYPARSE_PARAM */ + + + + + + +/*----------. +| yyparse. | +`----------*/ + +#ifdef YYPARSE_PARAM +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +int +yyparse (void *YYPARSE_PARAM) +#else +int +yyparse (YYPARSE_PARAM) + void *YYPARSE_PARAM; +#endif +#else /* ! YYPARSE_PARAM */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +int +yyparse (void) +#else +int +yyparse () + +#endif +#endif +{ + /* The look-ahead symbol. */ +int yychar; + +/* The semantic value of the look-ahead symbol. */ +YYSTYPE yylval; + +/* Number of syntax errors so far. */ +int yynerrs; + + int yystate; + int yyn; + int yyresult; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + /* Look-ahead token as an internal (translated) token number. */ + int yytoken = 0; +#if YYERROR_VERBOSE + /* Buffer for error messages, and its allocated size. */ + char yymsgbuf[128]; + char *yymsg = yymsgbuf; + YYSIZE_T yymsg_alloc = sizeof yymsgbuf; +#endif + + /* Three stacks and their tools: + `yyss': related to states, + `yyvs': related to semantic values, + `yyls': related to locations. + + Refer to the stacks thru separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + yytype_int16 yyssa[YYINITDEPTH]; + yytype_int16 *yyss = yyssa; + yytype_int16 *yyssp; + + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs = yyvsa; + YYSTYPE *yyvsp; + + + +#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) + + YYSIZE_T yystacksize = YYINITDEPTH; + + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + + + /* The number of symbols on the RHS of the reduced rule. + Keep to zero when no symbol should be popped. */ + int yylen = 0; + + YYDPRINTF ((stderr, "Starting parse\n")); + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + + /* Initialize stack pointers. + Waste one element of value and location stack + so that they stay on the same level as the state stack. + The wasted elements are never initialized. */ + + yyssp = yyss; + yyvsp = yyvs; + + goto yysetstate; + +/*------------------------------------------------------------. +| yynewstate -- Push a new state, which is found in yystate. | +`------------------------------------------------------------*/ + yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. So pushing a state here evens the stacks. */ + yyssp++; + + yysetstate: + *yyssp = yystate; + + if (yyss + yystacksize - 1 <= yyssp) + { + /* Get the current used size of the three stacks, in elements. */ + YYSIZE_T yysize = yyssp - yyss + 1; + +#ifdef yyoverflow + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + yytype_int16 *yyss1 = yyss; + + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow (YY_("memory exhausted"), + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), + + &yystacksize); + + yyss = yyss1; + yyvs = yyvs1; + } +#else /* no yyoverflow */ +# ifndef YYSTACK_RELOCATE + goto yyexhaustedlab; +# else + /* Extend the stack our own way. */ + if (YYMAXDEPTH <= yystacksize) + goto yyexhaustedlab; + yystacksize *= 2; + if (YYMAXDEPTH < yystacksize) + yystacksize = YYMAXDEPTH; + + { + yytype_int16 *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyexhaustedlab; + YYSTACK_RELOCATE (yyss); + YYSTACK_RELOCATE (yyvs); + +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif +#endif /* no yyoverflow */ + + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; + + + YYDPRINTF ((stderr, "Stack size increased to %lu\n", + (unsigned long int) yystacksize)); + + if (yyss + yystacksize - 1 <= yyssp) + YYABORT; + } + + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + + goto yybackup; + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: + + /* Do appropriate processing given the current state. Read a + look-ahead token if we need one and don't already have one. */ + + /* First try to decide what to do without reference to look-ahead token. */ + yyn = yypact[yystate]; + if (yyn == YYPACT_NINF) + goto yydefault; + + /* Not known => get a look-ahead token if don't already have one. */ + + /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ + if (yychar == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token: ")); + yychar = YYLEX; + } + + if (yychar <= YYEOF) + { + yychar = yytoken = YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else + { + yytoken = YYTRANSLATE (yychar); + YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); + } + + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) + goto yydefault; + yyn = yytable[yyn]; + if (yyn <= 0) + { + if (yyn == 0 || yyn == YYTABLE_NINF) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + + if (yyn == YYFINAL) + YYACCEPT; + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + /* Shift the look-ahead token. */ + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); + + /* Discard the shifted token unless it is eof. */ + if (yychar != YYEOF) + yychar = YYEMPTY; + + yystate = yyn; + *++yyvsp = yylval; + + goto yynewstate; + + +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; + + +/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/ +yyreduce: + /* yyn is the number of a rule to reduce with. */ + yylen = yyr2[yyn]; + + /* If YYLEN is nonzero, implement the default value of the action: + `$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + + + YY_REDUCE_PRINT (yyn); + switch (yyn) + { + case 2: +#line 465 "c-parse.y" + { ;} + break; + + case 3: +#line 466 "c-parse.y" + { ;} + break; + + case 4: +#line 467 "c-parse.y" + { + declaration cdecls = declaration_reverse((yyvsp[(2) - (2)].u.decl)); + parse_tree = CAST(node, cdecls); ;} + break; + + case 5: +#line 470 "c-parse.y" + { parse_tree = NULL; ;} + break; + + case 6: +#line 471 "c-parse.y" + { parse_tree = CAST(node, (yyvsp[(2) - (2)].u.decl)); ;} + break; + + case 7: +#line 472 "c-parse.y" + { parse_tree = CAST(node, make_error_decl()); ;} + break; + + case 8: +#line 473 "c-parse.y" + { parse_tree = CAST(node, (yyvsp[(2) - (2)].u.type)); ;} + break; + + case 9: +#line 474 "c-parse.y" + { parse_tree = NULL; ;} + break; + + case 10: +#line 478 "c-parse.y" + { end_macro_saving(); ;} + break; + + case 12: +#line 480 "c-parse.y" + { + end_macro_saving(); + add_cdecls(declaration_reverse((yyvsp[(1) - (1)].u.decl))); + ;} + break; + + case 15: +#line 492 "c-parse.y" + { ;} + break; + + case 16: +#line 497 "c-parse.y" + { require_c((yyvsp[(1) - (1)].idtoken).location, (yyvsp[(1) - (1)].idtoken).id.data); ;} + break; + + case 17: +#line 499 "c-parse.y" + { require_c((yyvsp[(3) - (3)].idtoken).location, (yyvsp[(3) - (3)].idtoken).id.data); ;} + break; + + case 18: +#line 505 "c-parse.y" + { + start_nesc_entity(l_interface, (yyvsp[(3) - (3)].u.word)); + ;} + break; + + case 19: +#line 509 "c-parse.y" + { + handle_nescdecl_attributes((yyvsp[(6) - (6)].u.attribute), current.container); + ;} + break; + + case 20: +#line 513 "c-parse.y" + { + interface intf = new_interface(pr, (yyvsp[(2) - (10)].u.itoken).location, (yyvsp[(3) - (10)].u.word), (yyvsp[(6) - (10)].u.attribute), declaration_reverse((yyvsp[(9) - (10)].u.decl))); + + set_nesc_parse_tree(intf); + + if (intf->cdecl->abstract) + poplevel(); + ;} + break; + + case 21: +#line 524 "c-parse.y" + { (yyval.u.decl) = NULL; ;} + break; + + case 22: +#line 526 "c-parse.y" + { + nesc_declaration intf = current.container; + + intf->parameters = (yyvsp[(2) - (3)].u.decl); + intf->parameter_env = current.env; + (yyval.u.decl) = (yyvsp[(2) - (3)].u.decl); + + /* Template intfs need a new level for the actual intf */ + pushlevel(FALSE); + /* The interface env counts as global */ + current.env->global_level = TRUE; + intf->env = current.env; + intf->abstract = TRUE; + ;} + break; + + case 24: +#line 545 "c-parse.y" + { (yyval.u.decl) = declaration_chain((yyvsp[(1) - (3)].u.decl), (yyvsp[(3) - (3)].u.decl)); ;} + break; + + case 25: +#line 550 "c-parse.y" + { (yyval.u.decl) = declare_type_parameter((yyvsp[(1) - (2)].idtoken).location, (yyvsp[(1) - (2)].idtoken).id, (yyvsp[(2) - (2)].u.attribute), NULL); ;} + break; + + case 26: +#line 554 "c-parse.y" + { (yyval.idtoken) = (yyvsp[(1) - (1)].idtoken); ;} + break; + + case 27: +#line 558 "c-parse.y" + { (yyval.u.decl) = declaration_chain((yyvsp[(2) - (2)].u.decl), (yyvsp[(1) - (2)].u.decl)); ;} + break; + + case 29: +#line 562 "c-parse.y" + { pushlevel(TRUE); ;} + break; + + case 30: +#line 563 "c-parse.y" + { /* poplevel done in users of parameters */ (yyval.u.decl) = (yyvsp[(3) - (3)].u.decl); ;} + break; + + case 31: +#line 567 "c-parse.y" + { + (yyval.u.decl) = declaration_reverse((yyvsp[(1) - (2)].u.decl)); + check_interface_parameter_types((yyval.u.decl)); + ;} + break; + + case 32: +#line 571 "c-parse.y" + { (yyval.u.decl) = make_error_decl(); ;} + break; + + case 36: +#line 582 "c-parse.y" + { + start_nesc_entity(l_component, (yyvsp[(3) - (3)].u.word)); + current.container->abstract = (yyvsp[(1) - (3)].abstract); + ;} + break; + + case 37: +#line 587 "c-parse.y" + { + handle_nescdecl_attributes((yyvsp[(6) - (6)].u.attribute), current.container); + ;} + break; + + case 38: +#line 592 "c-parse.y" + { + declaration intfs = + declaration_chain(declaration_reverse((yyvsp[(9) - (11)].u.decl)), all_tasks); + set_nesc_parse_tree(new_component(pr, (yyvsp[(2) - (11)].u.itoken).location, (yyvsp[(3) - (11)].u.word), (yyvsp[(6) - (11)].u.attribute), (yyvsp[(1) - (11)].abstract), (yyvsp[(5) - (11)].u.decl), intfs, (yyvsp[(11) - (11)].u.impl))); + ;} + break; + + case 39: +#line 601 "c-parse.y" + { + start_nesc_entity(l_component, (yyvsp[(3) - (3)].u.word)); + current.container->abstract = (yyvsp[(1) - (3)].abstract); + current.container->configuration = TRUE; + ;} + break; + + case 40: +#line 607 "c-parse.y" + { + handle_nescdecl_attributes((yyvsp[(6) - (6)].u.attribute), current.container); + ;} + break; + + case 41: +#line 611 "c-parse.y" + { + set_nesc_ast(new_component(pr, (yyvsp[(2) - (10)].u.itoken).location, (yyvsp[(3) - (10)].u.word), (yyvsp[(6) - (10)].u.attribute), (yyvsp[(1) - (10)].abstract), (yyvsp[(5) - (10)].u.decl), declaration_reverse((yyvsp[(9) - (10)].u.decl)), NULL)); + ;} + break; + + case 42: +#line 615 "c-parse.y" + { + set_nesc_impl((yyvsp[(12) - (12)].u.impl)); + ;} + break; + + case 43: +#line 622 "c-parse.y" + { + start_nesc_entity(l_component, (yyvsp[(2) - (2)].u.word)); + ;} + break; + + case 44: +#line 626 "c-parse.y" + { + handle_nescdecl_attributes((yyvsp[(4) - (4)].u.attribute), current.container); + ;} + break; + + case 45: +#line 630 "c-parse.y" + { + binary_component dummy = new_binary_component(pr, (yyvsp[(1) - (8)].u.itoken).location, start_implementation()); + component c = new_component(pr, (yyvsp[(1) - (8)].u.itoken).location, (yyvsp[(2) - (8)].u.word), (yyvsp[(4) - (8)].u.attribute), FALSE, NULL, declaration_reverse((yyvsp[(7) - (8)].u.decl)), CAST(implementation, dummy)); + set_nesc_parse_tree(c); + ;} + break; + + case 46: +#line 637 "c-parse.y" + { (yyval.abstract) = TRUE; ;} + break; + + case 47: +#line 638 "c-parse.y" + { (yyval.abstract) = FALSE; ;} + break; + + case 48: +#line 643 "c-parse.y" + { + if (current.container->abstract) + error("generic components require a parameter list"); + /* We don't create the extra environment level for this + generic component as nothing actually requires its + existence */ + (yyval.u.decl) = NULL; + ;} + break; + + case 49: +#line 652 "c-parse.y" + { + nesc_declaration comp = current.container; + + if (!comp->abstract) + error("only generic components can have a parameter list"); + comp->parameters = (yyvsp[(2) - (3)].u.decl); + comp->parameter_env = current.env; + (yyval.u.decl) = (yyvsp[(2) - (3)].u.decl); + + /* generic components need a new level for the + specification */ + pushlevel(FALSE); + current.env->global_level = TRUE; + comp->env = current.env; + ;} + break; + + case 50: +#line 670 "c-parse.y" + { (yyval.u.decl) = NULL; ;} + break; + + case 53: +#line 677 "c-parse.y" + { (yyval.u.decl) = declaration_chain((yyvsp[(1) - (3)].u.decl), (yyvsp[(3) - (3)].u.decl)); ;} + break; + + case 54: +#line 686 "c-parse.y" + { (yyval.u.decl) = declare_template_parameter((yyvsp[(3) - (4)].u.declarator), (yyvsp[(1) - (4)].u.telement), (yyvsp[(4) - (4)].u.attribute)); ;} + break; + + case 55: +#line 688 "c-parse.y" + { (yyval.u.decl) = declare_template_parameter((yyvsp[(3) - (4)].u.declarator), (yyvsp[(1) - (4)].u.telement), (yyvsp[(4) - (4)].u.attribute)); ;} + break; + + case 56: +#line 690 "c-parse.y" + { (yyval.u.decl) = declare_template_parameter((yyvsp[(3) - (4)].u.declarator), (yyvsp[(1) - (4)].u.telement), (yyvsp[(4) - (4)].u.attribute)); ;} + break; + + case 57: +#line 692 "c-parse.y" + { (yyval.u.decl) = declare_template_parameter(NULL, (yyvsp[(1) - (2)].u.telement), NULL); ;} + break; + + case 58: +#line 697 "c-parse.y" + { current.spec_section = spec_normal; ;} + break; + + case 59: +#line 702 "c-parse.y" + { (yyval.u.decl) = declaration_chain((yyvsp[(2) - (2)].u.decl), (yyvsp[(1) - (2)].u.decl)); ;} + break; + + case 60: +#line 703 "c-parse.y" + { (yyval.u.decl) = NULL; ;} + break; + + case 63: +#line 709 "c-parse.y" + { current.spec_section = spec_normal; ;} + break; + + case 64: +#line 709 "c-parse.y" + { (yyval.u.decl) = (yyvsp[(2) - (2)].u.decl); ;} + break; + + case 65: +#line 713 "c-parse.y" + { current.spec_section = spec_uses; ;} + break; + + case 66: +#line 715 "c-parse.y" + { (yyval.u.decl) = CAST(declaration, new_rp_interface(pr, (yyvsp[(1) - (3)].u.itoken).location, TRUE, declaration_reverse((yyvsp[(3) - (3)].u.decl)))); ;} + break; + + case 67: +#line 718 "c-parse.y" + { current.spec_section = spec_provides; ;} + break; + + case 68: +#line 720 "c-parse.y" + { (yyval.u.decl) = CAST(declaration, new_rp_interface(pr, (yyvsp[(1) - (3)].u.itoken).location, FALSE, declaration_reverse((yyvsp[(3) - (3)].u.decl)))); ;} + break; + + case 70: +#line 724 "c-parse.y" + { (yyval.u.decl) = (yyvsp[(2) - (3)].u.decl); ;} + break; + + case 71: +#line 729 "c-parse.y" + { (yyval.u.decl) = declaration_chain((yyvsp[(2) - (2)].u.decl), (yyvsp[(1) - (2)].u.decl)); ;} + break; + + case 74: +#line 736 "c-parse.y" + { + declare_interface_ref((yyvsp[(1) - (3)].u.iref), NULL, current.env, (yyvsp[(2) - (3)].u.attribute)); + (yyval.u.decl) = CAST(declaration, (yyvsp[(1) - (3)].u.iref)); + ;} + break; + + case 75: +#line 741 "c-parse.y" + { + (yyvsp[(1) - (4)].u.iref)->gparms = (yyvsp[(2) - (4)].u.decl); + poplevel(); + declare_interface_ref((yyvsp[(1) - (4)].u.iref), (yyvsp[(2) - (4)].u.decl), current.env, (yyvsp[(3) - (4)].u.attribute)); + (yyval.u.decl) = CAST(declaration, (yyvsp[(1) - (4)].u.iref)); + ;} + break; + + case 77: +#line 751 "c-parse.y" + { (yyval.u.iref) = (yyvsp[(1) - (3)].u.iref); (yyval.u.iref)->word2 = (yyvsp[(3) - (3)].u.word); ;} + break; + + case 78: +#line 756 "c-parse.y" + { + preload(l_interface, (yyvsp[(1) - (2)].u.itoken).location, (yyvsp[(2) - (2)].u.word)->cstring.data); + (yyval.u.iref) = new_interface_ref(pr, (yyvsp[(1) - (2)].u.itoken).location, (yyvsp[(2) - (2)].u.word), NULL, NULL, NULL, NULL, NULL); + ;} + break; + + case 79: +#line 761 "c-parse.y" + { + preload(l_interface, (yyvsp[(1) - (2)].u.itoken).location, (yyvsp[(2) - (2)].u.word)->cstring.data); + ;} + break; + + case 80: +#line 765 "c-parse.y" + { (yyval.u.iref) = new_interface_ref(pr, (yyvsp[(1) - (6)].u.itoken).location, (yyvsp[(2) - (6)].u.word), (yyvsp[(5) - (6)].u.expr), NULL, NULL, NULL, NULL); ;} + break; + + case 82: +#line 770 "c-parse.y" + { (yyval.u.expr) = expression_chain((yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); ;} + break; + + case 83: +#line 774 "c-parse.y" + { (yyval.u.env) = start_implementation(); ;} + break; + + case 84: +#line 778 "c-parse.y" + { (yyval.u.impl) = CAST(implementation, new_configuration(pr, (yyvsp[(1) - (5)].u.itoken).location, (yyvsp[(2) - (5)].u.env), declaration_reverse((yyvsp[(4) - (5)].u.decl)))); + ;} + break; + + case 85: +#line 782 "c-parse.y" + { (yyval.u.cref) = (yyvsp[(2) - (3)].u.cref); ;} + break; + + case 86: +#line 786 "c-parse.y" + { (yyval.u.cref) = component_ref_chain((yyvsp[(3) - (3)].u.cref), (yyvsp[(1) - (3)].u.cref)); ;} + break; + + case 88: +#line 791 "c-parse.y" + { (yyval.u.cref) = require_component((yyvsp[(1) - (1)].u.cref), NULL); ;} + break; + + case 89: +#line 792 "c-parse.y" + { (yyval.u.cref) = require_component((yyvsp[(1) - (3)].u.cref), (yyvsp[(3) - (3)].u.word)); ;} + break; + + case 90: +#line 796 "c-parse.y" + { (yyval.u.cref) = new_component_ref(pr, (yyvsp[(1) - (1)].u.word)->location, (yyvsp[(1) - (1)].u.word), NULL, + FALSE, NULL); ;} + break; + + case 91: +#line 799 "c-parse.y" + { (yyval.u.cref) = new_component_ref(pr, (yyvsp[(1) - (5)].u.itoken).location, (yyvsp[(2) - (5)].u.word), NULL, + TRUE, (yyvsp[(4) - (5)].u.expr)); ;} + break; + + case 92: +#line 804 "c-parse.y" + { (yyval.u.expr) = NULL; ;} + break; + + case 95: +#line 810 "c-parse.y" + { (yyval.u.expr) = expression_chain((yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); ;} + break; + + case 96: +#line 815 "c-parse.y" + { (yyval.u.expr) = (yyvsp[(1) - (1)].u.expr); (yyval.u.expr)->type = default_conversion_for_assignment((yyval.u.expr)); ;} + break; + + case 98: +#line 820 "c-parse.y" + { (yyval.u.expr) = make_type_argument((yyvsp[(1) - (1)].u.type)); ;} + break; + + case 99: +#line 824 "c-parse.y" + { (yyval.u.decl) = declaration_chain((yyvsp[(2) - (2)].u.decl), (yyvsp[(1) - (2)].u.decl)); ;} + break; + + case 100: +#line 825 "c-parse.y" + { (yyval.u.decl) = NULL; ;} + break; + + case 101: +#line 829 "c-parse.y" + { (yyval.u.decl) = CAST(declaration, (yyvsp[(1) - (1)].u.conn)); ;} + break; + + case 103: +#line 831 "c-parse.y" + { (yyval.u.decl) = CAST(declaration, (yyvsp[(1) - (1)].u.cref)); ;} + break; + + case 104: +#line 836 "c-parse.y" + { (yyval.u.conn) = CAST(connection, new_eq_connection(pr, (yyvsp[(2) - (4)].u.itoken).location, (yyvsp[(1) - (4)].u.ep), (yyvsp[(3) - (4)].u.ep))); ;} + break; + + case 105: +#line 838 "c-parse.y" + { (yyval.u.conn) = CAST(connection, new_rp_connection(pr, (yyvsp[(2) - (4)].u.itoken).location, (yyvsp[(3) - (4)].u.ep), (yyvsp[(1) - (4)].u.ep))); ;} + break; + + case 106: +#line 840 "c-parse.y" + { (yyval.u.conn) = CAST(connection, new_rp_connection(pr, (yyvsp[(2) - (4)].u.itoken).location, (yyvsp[(1) - (4)].u.ep), (yyvsp[(3) - (4)].u.ep))); ;} + break; + + case 107: +#line 845 "c-parse.y" + { (yyval.u.ep) = (yyvsp[(1) - (3)].u.ep); + (yyval.u.ep)->ids = parameterised_identifier_chain((yyval.u.ep)->ids, (yyvsp[(3) - (3)].u.pid)); + ;} + break; + + case 108: +#line 849 "c-parse.y" + { (yyval.u.ep) = new_endpoint(parse_region, (yyvsp[(1) - (1)].u.pid)->location, (yyvsp[(1) - (1)].u.pid)); ;} + break; + + case 109: +#line 854 "c-parse.y" + { (yyval.u.pid) = new_parameterised_identifier(pr, (yyvsp[(1) - (1)].u.word)->location, (yyvsp[(1) - (1)].u.word), NULL); ;} + break; + + case 110: +#line 856 "c-parse.y" + { (yyval.u.pid) = new_parameterised_identifier(pr, (yyvsp[(1) - (4)].u.word)->location, (yyvsp[(1) - (4)].u.word), (yyvsp[(3) - (4)].u.expr)); ;} + break; + + case 111: +#line 859 "c-parse.y" + { (yyval.u.env) = start_implementation(); all_tasks = NULL; ;} + break; + + case 112: +#line 860 "c-parse.y" + { + (yyval.u.impl) = CAST(implementation, new_module(pr, (yyvsp[(1) - (5)].u.itoken).location, (yyvsp[(2) - (5)].u.env), declaration_reverse((yyvsp[(4) - (5)].u.decl)))); + ;} + break; + + case 113: +#line 869 "c-parse.y" + { (yyval.u.telement) = NULL; ;} + break; + + case 114: +#line 869 "c-parse.y" + { (yyval.u.decl) = (yyvsp[(2) - (2)].u.decl); ;} + break; + + case 115: +#line 870 "c-parse.y" + { (yyval.u.telement) = NULL; ;} + break; + + case 116: +#line 871 "c-parse.y" + { (yyval.u.decl) = declaration_chain((yyvsp[(3) - (3)].u.decl), (yyvsp[(1) - (3)].u.decl)); ;} + break; + + case 119: +#line 878 "c-parse.y" + { + (yyval.u.decl) = CAST(declaration, new_asm_decl + (pr, (yyvsp[(1) - (5)].u.itoken).location, + new_asm_stmt(pr, (yyvsp[(1) - (5)].u.itoken).location, (yyvsp[(3) - (5)].u.expr), NULL, NULL, NULL, NULL))); ;} + break; + + case 120: +#line 883 "c-parse.y" + { (yyval.u.decl) = make_extension_decl((yyvsp[(1) - (2)].u.itoken).i, (yyvsp[(1) - (2)].u.itoken).location, (yyvsp[(2) - (2)].u.decl)); ;} + break; + + case 121: +#line 888 "c-parse.y" + { if (pedantic) + error("ANSI C forbids data definition with no type or storage class"); + else if (!flag_traditional) + warning("data definition has no type or storage class"); + + (yyval.u.decl) = make_data_decl(NULL, (yyvsp[(2) - (3)].u.decl)); ;} + break; + + case 123: +#line 899 "c-parse.y" + { (yyval.u.decl) = make_data_decl((yyvsp[(1) - (4)].u.telement), (yyvsp[(3) - (4)].u.decl)); ;} + break; + + case 124: +#line 901 "c-parse.y" + { (yyval.u.decl) = make_data_decl((yyvsp[(1) - (4)].u.telement), (yyvsp[(3) - (4)].u.decl)); ;} + break; + + case 125: +#line 903 "c-parse.y" + { shadow_tag((yyvsp[(1) - (3)].u.telement)); + (yyval.u.decl) = make_data_decl((yyvsp[(1) - (3)].u.telement), NULL); ;} + break; + + case 126: +#line 905 "c-parse.y" + { (yyval.u.decl) = make_error_decl(); ;} + break; + + case 127: +#line 906 "c-parse.y" + { (yyval.u.decl) = make_error_decl(); ;} + break; + + case 128: +#line 908 "c-parse.y" + { if (pedantic) + pedwarn("ANSI C does not allow extra `;' outside of a function"); + (yyval.u.decl) = NULL; ;} + break; + + case 130: +#line 916 "c-parse.y" + { (yyval.u.decl) = target->keilc_definition((yyvsp[(1) - (5)].idtoken).location, (yyvsp[(1) - (5)].idtoken).id, (yyvsp[(2) - (5)].idtoken).id, (yyvsp[(4) - (5)].u.expr)); ;} + break; + + case 131: +#line 920 "c-parse.y" + { (yyval.u.decl) = (yyvsp[(4) - (4)].u.decl); ;} + break; + + case 132: +#line 921 "c-parse.y" + { (yyval.u.decl) = (yyvsp[(4) - (4)].u.decl); ;} + break; + + case 133: +#line 922 "c-parse.y" + { (yyval.u.decl) = (yyvsp[(3) - (3)].u.decl); ;} + break; + + case 134: +#line 926 "c-parse.y" + { + /* maybeasm is only here to avoid a s/r conflict */ + refuse_asm((yyvsp[(1) - (2)].u.asm_stmt)); + + /* $0 refers to the declarator that precedes fndef2 + in fndef (we can't just save it in an action, as that + causes s/r and r/r conflicts) */ + if (!start_function(pstate.declspecs, (yyvsp[(0) - (2)].u.declarator), (yyvsp[(2) - (2)].u.attribute), 0)) + YYERROR1; + ;} + break; + + case 135: +#line 937 "c-parse.y" + { store_parm_decls(declaration_reverse((yyvsp[(4) - (4)].u.decl))); ;} + break; + + case 136: +#line 939 "c-parse.y" + { (yyval.u.decl) = finish_function((yyvsp[(6) - (6)].u.stmt)); + pop_declspec_stack(); ;} + break; + + case 139: +#line 949 "c-parse.y" + { (yyval.u.id_label) = new_id_label(pr, (yyvsp[(1) - (1)].idtoken).location, (yyvsp[(1) - (1)].idtoken).id); ;} + break; + + case 140: +#line 953 "c-parse.y" + { (yyval.u.word) = new_word(pr, (yyvsp[(1) - (1)].idtoken).location, (yyvsp[(1) - (1)].idtoken).id); ;} + break; + + case 141: +#line 957 "c-parse.y" + { (yyval.u.itoken) = (yyvsp[(1) - (1)].u.itoken); (yyval.u.itoken).i = kind_address_of; ;} + break; + + case 142: +#line 959 "c-parse.y" + { (yyval.u.itoken) = (yyvsp[(1) - (1)].u.itoken); (yyval.u.itoken).i = kind_unary_minus; ;} + break; + + case 143: +#line 961 "c-parse.y" + { (yyval.u.itoken) = (yyvsp[(1) - (1)].u.itoken); (yyval.u.itoken).i = kind_unary_plus; ;} + break; + + case 144: +#line 963 "c-parse.y" + { (yyval.u.itoken) = (yyvsp[(1) - (1)].u.itoken); (yyval.u.itoken).i = kind_preincrement; ;} + break; + + case 145: +#line 965 "c-parse.y" + { (yyval.u.itoken) = (yyvsp[(1) - (1)].u.itoken); (yyval.u.itoken).i = kind_predecrement; ;} + break; + + case 146: +#line 967 "c-parse.y" + { (yyval.u.itoken) = (yyvsp[(1) - (1)].u.itoken); (yyval.u.itoken).i = kind_bitnot; ;} + break; + + case 147: +#line 969 "c-parse.y" + { (yyval.u.itoken) = (yyvsp[(1) - (1)].u.itoken); (yyval.u.itoken).i = kind_not; ;} + break; + + case 148: +#line 971 "c-parse.y" + { (yyval.u.itoken) = (yyvsp[(1) - (1)].u.itoken); (yyval.u.itoken).i = kind_realpart; ;} + break; + + case 149: +#line 973 "c-parse.y" + { (yyval.u.itoken) = (yyvsp[(1) - (1)].u.itoken); (yyval.u.itoken).i = kind_imagpart; ;} + break; + + case 150: +#line 977 "c-parse.y" + { if ((yyvsp[(1) - (1)].u.expr)->next) + (yyval.u.expr) = make_comma((yyvsp[(1) - (1)].u.expr)->location, (yyvsp[(1) - (1)].u.expr)); + else + (yyval.u.expr) = (yyvsp[(1) - (1)].u.expr); ;} + break; + + case 151: +#line 985 "c-parse.y" + { (yyval.u.expr) = NULL; ;} + break; + + case 153: +#line 991 "c-parse.y" + { (yyval.u.expr) = expression_reverse((yyvsp[(1) - (1)].u.expr)); ;} + break; + + case 154: +#line 996 "c-parse.y" + { (yyval.u.expr) = (yyvsp[(1) - (1)].u.expr); ;} + break; + + case 155: +#line 998 "c-parse.y" + { (yyval.u.expr) = expression_chain((yyvsp[(3) - (3)].u.expr), (yyvsp[(1) - (3)].u.expr)); ;} + break; + + case 156: +#line 1002 "c-parse.y" + { (yyval.u.itoken).i = command_call; ;} + break; + + case 157: +#line 1003 "c-parse.y" + { (yyval.u.itoken).i = event_signal; ;} + break; + + case 158: +#line 1004 "c-parse.y" + { (yyval.u.itoken).i = post_task; ;} + break; + + case 160: +#line 1010 "c-parse.y" + { + function_call fc = CAST(function_call, (yyvsp[(2) - (2)].u.expr)); + type calltype = fc->arg1->type; + bool noerror = fc->type != error_type; + + (yyval.u.expr) = (yyvsp[(2) - (2)].u.expr); + fc->call_kind = (yyvsp[(1) - (2)].u.itoken).i; + switch ((yyvsp[(1) - (2)].u.itoken).i) + { + case command_call: + if (noerror && !type_command(calltype)) + error("only commands can be called"); + break; + case event_signal: + if (noerror && !type_event(calltype)) + error("only events can be signaled"); + break; + case post_task: + fc->type = unsigned_char_type; + if (noerror) + { + if (!type_task(calltype)) + error("only tasks can be posted"); + else if (flag_use_scheduler) + /* If requested, replace post/task by references to + an interface */ + handle_post(fc); + } + break; + } + ;} + break; + + case 161: +#line 1042 "c-parse.y" + { (yyval.u.expr) = make_dereference((yyvsp[(1) - (2)].u.itoken).location, (yyvsp[(2) - (2)].u.expr)); ;} + break; + + case 162: +#line 1045 "c-parse.y" + { (yyval.u.expr) = make_extension_expr((yyvsp[(1) - (2)].u.itoken).location, (yyvsp[(2) - (2)].u.expr)); + pedantic = (yyvsp[(1) - (2)].u.itoken).i; ;} + break; + + case 163: +#line 1048 "c-parse.y" + { (yyval.u.expr) = make_unary((yyvsp[(1) - (2)].u.itoken).location, (yyvsp[(1) - (2)].u.itoken).i, (yyvsp[(2) - (2)].u.expr)); +#if 0 + overflow_warning((yyval.u.expr)); +#endif + ;} + break; + + case 164: +#line 1055 "c-parse.y" + { + (yyval.u.expr) = CAST(expression, make_label_address((yyvsp[(1) - (2)].u.itoken).location, (yyvsp[(2) - (2)].u.id_label))); + use_label((yyvsp[(2) - (2)].u.id_label)); + ;} + break; + + case 165: +#line 1060 "c-parse.y" + { +#if 0 + if (TREE_CODE ((yyvsp[(2) - (2)].u.expr)) == COMPONENT_REF + && DECL_C_BIT_FIELD (TREE_OPERAND ((yyvsp[(2) - (2)].u.expr), 1))) + error("`sizeof' applied to a bit-field"); + (yyval.u.expr) = c_sizeof (TREE_TYPE ((yyvsp[(2) - (2)].u.expr))); +#endif + (yyval.u.expr) = make_sizeof_expr((yyvsp[(1) - (2)].u.itoken).location, (yyvsp[(2) - (2)].u.expr)); + pstate.unevaluated_expression--; ;} + break; + + case 166: +#line 1070 "c-parse.y" + { (yyval.u.expr) = make_sizeof_type((yyvsp[(1) - (4)].u.itoken).location, (yyvsp[(3) - (4)].u.type)); + pstate.unevaluated_expression--; ;} + break; + + case 167: +#line 1073 "c-parse.y" + { (yyval.u.expr) = make_alignof_expr((yyvsp[(1) - (2)].u.itoken).location, (yyvsp[(2) - (2)].u.expr)); + pstate.unevaluated_expression--; ;} + break; + + case 168: +#line 1076 "c-parse.y" + { (yyval.u.expr) = make_alignof_type((yyvsp[(1) - (4)].u.itoken).location, (yyvsp[(3) - (4)].u.type)); + pstate.unevaluated_expression--; ;} + break; + + case 169: +#line 1081 "c-parse.y" + { pstate.unevaluated_expression++; (yyval.u.itoken) = (yyvsp[(1) - (1)].u.itoken); ;} + break; + + case 170: +#line 1085 "c-parse.y" + { pstate.unevaluated_expression++; (yyval.u.itoken) = (yyvsp[(1) - (1)].u.itoken); ;} + break; + + case 172: +#line 1091 "c-parse.y" + { (yyval.u.expr) = make_cast((yyvsp[(1) - (4)].u.itoken).location, (yyvsp[(2) - (4)].u.type), (yyvsp[(4) - (4)].u.expr)); ;} + break; + + case 173: +#line 1093 "c-parse.y" + { + start_init(NULL, NULL); + really_start_incremental_init((yyvsp[(2) - (4)].u.type)->type); + ;} + break; + + case 174: +#line 1098 "c-parse.y" + { + expression constructor = make_init_list((yyvsp[(4) - (7)].u.itoken).location, (yyvsp[(6) - (7)].u.expr)); + + finish_init(); + + if (pedantic) + pedwarn("ANSI C forbids constructor expressions"); + + (yyval.u.expr) = make_cast_list((yyvsp[(1) - (7)].u.itoken).location, (yyvsp[(2) - (7)].u.type), constructor); + ;} + break; + + case 176: +#line 1113 "c-parse.y" + { (yyval.u.expr) = make_binary((yyvsp[(2) - (3)].u.itoken).location, kind_plus, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); ;} + break; + + case 177: +#line 1115 "c-parse.y" + { (yyval.u.expr) = make_binary((yyvsp[(2) - (3)].u.itoken).location, kind_minus, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); ;} + break; + + case 178: +#line 1117 "c-parse.y" + { (yyval.u.expr) = make_binary((yyvsp[(2) - (3)].u.itoken).location, kind_times, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); ;} + break; + + case 179: +#line 1119 "c-parse.y" + { (yyval.u.expr) = make_binary((yyvsp[(2) - (3)].u.itoken).location, kind_divide, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); ;} + break; + + case 180: +#line 1121 "c-parse.y" + { (yyval.u.expr) = make_binary((yyvsp[(2) - (3)].u.itoken).location, kind_modulo, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); ;} + break; + + case 181: +#line 1123 "c-parse.y" + { (yyval.u.expr) = make_binary((yyvsp[(2) - (3)].u.itoken).location, kind_lshift, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); ;} + break; + + case 182: +#line 1125 "c-parse.y" + { (yyval.u.expr) = make_binary((yyvsp[(2) - (3)].u.itoken).location, kind_rshift, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); ;} + break; + + case 183: +#line 1127 "c-parse.y" + { (yyval.u.expr) = make_binary((yyvsp[(2) - (3)].u.itoken).location, (yyvsp[(2) - (3)].u.itoken).i, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); ;} + break; + + case 184: +#line 1129 "c-parse.y" + { (yyval.u.expr) = make_binary((yyvsp[(2) - (3)].u.itoken).location, kind_lt, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); ;} + break; + + case 185: +#line 1131 "c-parse.y" + { (yyval.u.expr) = make_binary((yyvsp[(2) - (3)].u.itoken).location, kind_gt, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); ;} + break; + + case 186: +#line 1133 "c-parse.y" + { (yyval.u.expr) = make_binary((yyvsp[(2) - (3)].u.itoken).location, (yyvsp[(2) - (3)].u.itoken).i, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); ;} + break; + + case 187: +#line 1135 "c-parse.y" + { (yyval.u.expr) = make_binary((yyvsp[(2) - (3)].u.itoken).location, kind_bitand, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); ;} + break; + + case 188: +#line 1137 "c-parse.y" + { (yyval.u.expr) = make_binary((yyvsp[(2) - (3)].u.itoken).location, kind_bitor, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); ;} + break; + + case 189: +#line 1139 "c-parse.y" + { (yyval.u.expr) = make_binary((yyvsp[(2) - (3)].u.itoken).location, kind_bitxor, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); ;} + break; + + case 190: +#line 1141 "c-parse.y" + { (yyval.u.expr) = make_binary((yyvsp[(2) - (3)].u.itoken).location, kind_andand, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); ;} + break; + + case 191: +#line 1143 "c-parse.y" + { (yyval.u.expr) = make_binary((yyvsp[(2) - (3)].u.itoken).location, kind_oror, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); ;} + break; + + case 192: +#line 1145 "c-parse.y" + { (yyval.u.expr) = make_conditional((yyvsp[(2) - (5)].u.itoken).location, (yyvsp[(1) - (5)].u.expr), (yyvsp[(3) - (5)].u.expr), (yyvsp[(5) - (5)].u.expr)); ;} + break; + + case 193: +#line 1147 "c-parse.y" + { if (pedantic) + pedwarn("ANSI C forbids omitting the middle term of a ?: expression"); + ;} + break; + + case 194: +#line 1151 "c-parse.y" + { (yyval.u.expr) = make_conditional((yyvsp[(2) - (5)].u.itoken).location, (yyvsp[(1) - (5)].u.expr), NULL, (yyvsp[(5) - (5)].u.expr)); ;} + break; + + case 195: +#line 1153 "c-parse.y" + { (yyval.u.expr) = make_assign((yyvsp[(2) - (3)].u.itoken).location, kind_assign, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); ;} + break; + + case 196: +#line 1155 "c-parse.y" + { (yyval.u.expr) = make_assign((yyvsp[(2) - (3)].u.itoken).location, (yyvsp[(2) - (3)].u.itoken).i, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); ;} + break; + + case 197: +#line 1160 "c-parse.y" + { + if (yychar == YYEMPTY) + yychar = YYLEX; + (yyval.u.expr) = make_identifier((yyvsp[(1) - (1)].idtoken).location, (yyvsp[(1) - (1)].idtoken).id, yychar == '('); + ;} + break; + + case 198: +#line 1165 "c-parse.y" + { (yyval.u.expr) = CAST(expression, (yyvsp[(1) - (1)].u.constant)); ;} + break; + + case 199: +#line 1166 "c-parse.y" + { (yyval.u.expr) = (yyvsp[(1) - (1)].u.expr); ;} + break; + + case 200: +#line 1168 "c-parse.y" + { (yyval.u.expr) = (yyvsp[(2) - (3)].u.expr); (yyval.u.expr)->parens = TRUE; ;} + break; + + case 201: +#line 1170 "c-parse.y" + { (yyval.u.expr) = make_error_expr(); ;} + break; + + case 202: +#line 1172 "c-parse.y" + { if (current.function_decl == 0) + { + error("braced-group within expression allowed only inside a function"); + YYERROR; + } + push_label_level(); + ;} + break; + + case 203: +#line 1180 "c-parse.y" + { + pop_label_level(); + if (pedantic) + pedwarn("ANSI C forbids braced-groups within expressions"); + (yyval.u.expr) = make_compound_expr((yyvsp[(1) - (4)].u.itoken).location, (yyvsp[(3) - (4)].u.stmt)); + ;} + break; + + case 204: +#line 1187 "c-parse.y" + { + /* Magic functions may rewrite this to something else */ + if (is_function_call((yyvsp[(1) - (1)].u.expr))) + { + function_call fc = CAST(function_call, (yyvsp[(1) - (1)].u.expr)); + type calltype = fc->arg1->type; + + if (type_command(calltype)) + error("commands must be called with call"); + else if (type_event(calltype)) + error("events must be signaled with signal"); + else if (type_task(calltype)) + error("tasks must be posted with post"); + } + + (yyval.u.expr) = (yyvsp[(1) - (1)].u.expr); + ;} + break; + + case 205: +#line 1205 "c-parse.y" + { (yyval.u.expr) = make_va_arg((yyvsp[(1) - (6)].u.itoken).location, (yyvsp[(3) - (6)].u.expr), (yyvsp[(5) - (6)].u.type)); ;} + break; + + case 206: +#line 1207 "c-parse.y" + { (yyval.u.expr) = make_offsetof((yyvsp[(1) - (6)].u.itoken).location, (yyvsp[(3) - (6)].u.type), (yyvsp[(5) - (6)].u.fields)); ;} + break; + + case 207: +#line 1209 "c-parse.y" + { (yyval.u.expr) = make_array_ref((yyvsp[(2) - (4)].u.itoken).location, (yyvsp[(1) - (4)].u.expr), (yyvsp[(3) - (4)].u.expr)); ;} + break; + + case 208: +#line 1211 "c-parse.y" + { (yyval.u.expr) = make_field_ref((yyvsp[(2) - (3)].u.itoken).location, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].idtoken).id); ;} + break; + + case 209: +#line 1213 "c-parse.y" + { (yyval.u.expr) = make_field_ref((yyvsp[(2) - (3)].u.itoken).location, make_dereference((yyvsp[(2) - (3)].u.itoken).location, (yyvsp[(1) - (3)].u.expr)), + (yyvsp[(3) - (3)].idtoken).id); ;} + break; + + case 210: +#line 1216 "c-parse.y" + { (yyval.u.expr) = make_postincrement((yyvsp[(2) - (2)].u.itoken).location, (yyvsp[(1) - (2)].u.expr)); ;} + break; + + case 211: +#line 1218 "c-parse.y" + { (yyval.u.expr) = make_postdecrement((yyvsp[(2) - (2)].u.itoken).location, (yyvsp[(1) - (2)].u.expr)); ;} + break; + + case 212: +#line 1222 "c-parse.y" + { (yyval.u.fields) = dd_new_list(pr); dd_add_last(pr, (yyval.u.fields), (yyvsp[(1) - (1)].idtoken).id.data); ;} + break; + + case 213: +#line 1223 "c-parse.y" + { (yyval.u.fields) = (yyvsp[(1) - (3)].u.fields); dd_add_last(pr, (yyval.u.fields), (yyvsp[(3) - (3)].idtoken).id.data); ;} + break; + + case 214: +#line 1228 "c-parse.y" + { (yyval.u.expr) = make_function_call((yyvsp[(2) - (4)].u.itoken).location, (yyvsp[(1) - (4)].u.expr), (yyvsp[(3) - (4)].u.expr)); ;} + break; + + case 215: +#line 1231 "c-parse.y" + { (yyval.u.expr) = CAST(expression, (yyvsp[(1) - (1)].u.string)); ;} + break; + + case 216: +#line 1232 "c-parse.y" + { (yyval.u.expr) = make_identifier((yyvsp[(1) - (1)].idtoken).location, (yyvsp[(1) - (1)].idtoken).id, FALSE); ;} + break; + + case 217: +#line 1236 "c-parse.y" + { (yyval.u.decl) = NULL; ;} + break; + + case 219: +#line 1240 "c-parse.y" + { if (pedantic) + pedwarn("ANSI C does not permit use of `varargs.h'"); + (yyval.u.decl) = declaration_chain(CAST(declaration, new_ellipsis_decl(pr, (yyvsp[(2) - (2)].u.itoken).location)), (yyvsp[(1) - (2)].u.decl)); + ;} + break; + + case 221: +#line 1251 "c-parse.y" + { (yyval.u.decl) = declaration_chain((yyvsp[(2) - (2)].u.decl), (yyvsp[(1) - (2)].u.decl)); ;} + break; + + case 222: +#line 1260 "c-parse.y" + { (yyval.u.decl) = make_data_decl((yyvsp[(1) - (4)].u.telement), (yyvsp[(3) - (4)].u.decl)); ;} + break; + + case 223: +#line 1262 "c-parse.y" + { (yyval.u.decl) = make_data_decl((yyvsp[(1) - (4)].u.telement), (yyvsp[(3) - (4)].u.decl)); ;} + break; + + case 224: +#line 1264 "c-parse.y" + { shadow_tag_warned((yyvsp[(1) - (3)].u.telement), 1); + (yyval.u.decl) = make_data_decl((yyvsp[(1) - (3)].u.telement), NULL); + pedwarn("empty declaration"); ;} + break; + + case 225: +#line 1268 "c-parse.y" + { pedwarn("empty declaration"); + (yyval.u.decl) = NULL; ;} + break; + + case 227: +#line 1278 "c-parse.y" + { (yyval.u.decl) = make_error_decl(); ;} + break; + + case 228: +#line 1279 "c-parse.y" + { (yyval.u.decl) = declaration_chain((yyvsp[(2) - (2)].u.decl), (yyvsp[(1) - (2)].u.decl)); ;} + break; + + case 229: +#line 1280 "c-parse.y" + { (yyval.u.decl) = make_error_decl(); ;} + break; + + case 230: +#line 1288 "c-parse.y" + { + push_declspec_stack(); + pending_xref_error(); + pstate.declspecs = (yyvsp[(0) - (0)].u.telement); + pstate.attributes = NULL; + ;} + break; + + case 231: +#line 1300 "c-parse.y" + { pstate.attributes = (yyvsp[(1) - (1)].u.attribute); ;} + break; + + case 232: +#line 1305 "c-parse.y" + { (yyval.u.decl) = make_data_decl((yyvsp[(1) - (4)].u.telement), (yyvsp[(3) - (4)].u.decl)); ;} + break; + + case 233: +#line 1307 "c-parse.y" + { (yyval.u.decl) = make_data_decl((yyvsp[(1) - (4)].u.telement), (yyvsp[(3) - (4)].u.decl)); ;} + break; + + case 234: +#line 1309 "c-parse.y" + { (yyval.u.decl) = (yyvsp[(3) - (3)].u.decl); + pop_declspec_stack(); ;} + break; + + case 235: +#line 1312 "c-parse.y" + { (yyval.u.decl) = (yyvsp[(3) - (3)].u.decl); + pop_declspec_stack(); ;} + break; + + case 236: +#line 1315 "c-parse.y" + { shadow_tag((yyvsp[(1) - (3)].u.telement)); + (yyval.u.decl) = make_data_decl((yyvsp[(1) - (3)].u.telement), NULL); ;} + break; + + case 237: +#line 1318 "c-parse.y" + { (yyval.u.decl) = make_extension_decl((yyvsp[(1) - (2)].u.itoken).i, (yyvsp[(1) - (2)].u.itoken).location, (yyvsp[(2) - (2)].u.decl)); ;} + break; + + case 239: +#line 1375 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 240: +#line 1377 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 241: +#line 1382 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 242: +#line 1387 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 243: +#line 1389 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 247: +#line 1400 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 248: +#line 1402 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 249: +#line 1404 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 250: +#line 1406 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 251: +#line 1408 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 252: +#line 1410 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 254: +#line 1416 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 255: +#line 1418 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 256: +#line 1420 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 257: +#line 1422 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 258: +#line 1424 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 259: +#line 1429 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 260: +#line 1431 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 261: +#line 1433 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 262: +#line 1435 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 263: +#line 1437 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 264: +#line 1439 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 265: +#line 1444 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 266: +#line 1446 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 267: +#line 1448 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 268: +#line 1450 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 269: +#line 1452 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 271: +#line 1458 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 272: +#line 1460 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 273: +#line 1462 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 274: +#line 1464 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 275: +#line 1466 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 276: +#line 1468 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 277: +#line 1473 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 278: +#line 1478 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 279: +#line 1480 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 280: +#line 1482 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 281: +#line 1484 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 282: +#line 1486 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 283: +#line 1488 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 284: +#line 1493 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 285: +#line 1498 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 286: +#line 1500 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 287: +#line 1502 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 288: +#line 1504 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 289: +#line 1506 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 290: +#line 1508 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 291: +#line 1510 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 292: +#line 1512 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 293: +#line 1514 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 294: +#line 1516 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 295: +#line 1521 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 296: +#line 1523 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 297: +#line 1525 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 298: +#line 1527 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 299: +#line 1529 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 300: +#line 1534 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 301: +#line 1536 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 302: +#line 1538 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 303: +#line 1540 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 304: +#line 1542 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 305: +#line 1544 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 306: +#line 1546 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 307: +#line 1548 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 308: +#line 1550 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 309: +#line 1552 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 310: +#line 1557 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 311: +#line 1559 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 312: +#line 1561 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 313: +#line 1563 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 314: +#line 1565 "c-parse.y" + { (yyval.u.telement) = type_element_chain((yyvsp[(1) - (2)].u.telement), (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 351: +#line 1632 "c-parse.y" + { (yyval.u.telement) = NULL; ;} + break; + + case 359: +#line 1677 "c-parse.y" + { /* For a typedef name, record the meaning, not the name. + In case of `foo foo, bar;'. */ + (yyval.u.telement) = CAST(type_element, new_typename(pr, (yyvsp[(1) - (1)].idtoken).location, (yyvsp[(1) - (1)].idtoken).decl)); ;} + break; + + case 360: +#line 1681 "c-parse.y" + { + /* reference to a typedef from a component. */ + (yyval.u.telement) = CAST(type_element, new_component_typeref(pr, (yyvsp[(1) - (3)].idtoken).location, (yyvsp[(3) - (3)].idtoken).decl, (yyvsp[(1) - (3)].idtoken).id)); + ;} + break; + + case 361: +#line 1686 "c-parse.y" + { (yyval.u.telement) = CAST(type_element, new_typeof_expr(pr, (yyvsp[(1) - (4)].u.itoken).location, (yyvsp[(3) - (4)].u.expr))); ;} + break; + + case 362: +#line 1688 "c-parse.y" + { (yyval.u.telement) = CAST(type_element, new_typeof_type(pr, (yyvsp[(1) - (4)].u.itoken).location, (yyvsp[(3) - (4)].u.type))); ;} + break; + + case 363: +#line 1693 "c-parse.y" + { (yyval.u.decl) = declaration_reverse((yyvsp[(1) - (1)].u.decl)); ;} + break; + + case 364: +#line 1697 "c-parse.y" + { (yyval.u.decl) = declaration_reverse((yyvsp[(1) - (1)].u.decl)); ;} + break; + + case 366: +#line 1703 "c-parse.y" + { (yyval.u.decl) = declaration_chain((yyvsp[(4) - (4)].u.decl), (yyvsp[(1) - (4)].u.decl)); ;} + break; + + case 367: +#line 1707 "c-parse.y" + { (yyval.u.decl) = (yyvsp[(1) - (1)].u.decl); ;} + break; + + case 368: +#line 1709 "c-parse.y" + { (yyval.u.decl) = declaration_chain((yyvsp[(4) - (4)].u.decl), (yyvsp[(1) - (4)].u.decl)); ;} + break; + + case 369: +#line 1714 "c-parse.y" + { (yyval.u.asm_stmt) = NULL; ;} + break; + + case 370: +#line 1716 "c-parse.y" + { (yyval.u.asm_stmt) = new_asm_stmt(pr, (yyvsp[(1) - (4)].u.itoken).location, CAST(expression, (yyvsp[(3) - (4)].u.string)), + NULL, NULL, NULL, NULL); ;} + break; + + case 371: +#line 1722 "c-parse.y" + { (yyval.u.decl) = start_decl((yyvsp[(1) - (4)].u.declarator), (yyvsp[(2) - (4)].u.asm_stmt), pstate.declspecs, 1, + prefix_attr((yyvsp[(3) - (4)].u.attribute))); + start_init((yyval.u.decl), NULL); ;} + break; + + case 372: +#line 1727 "c-parse.y" + { finish_init(); + (yyval.u.decl) = finish_decl((yyvsp[(5) - (6)].u.decl), (yyvsp[(6) - (6)].u.expr)); ;} + break; + + case 373: +#line 1730 "c-parse.y" + { declaration d = start_decl((yyvsp[(1) - (3)].u.declarator), (yyvsp[(2) - (3)].u.asm_stmt), pstate.declspecs, 0, + prefix_attr((yyvsp[(3) - (3)].u.attribute))); + (yyval.u.decl) = finish_decl(d, NULL); ;} + break; + + case 374: +#line 1737 "c-parse.y" + { (yyval.u.decl) = start_decl((yyvsp[(1) - (4)].u.declarator), (yyvsp[(2) - (4)].u.asm_stmt), pstate.declspecs, 1, + prefix_attr((yyvsp[(3) - (4)].u.attribute))); + start_init((yyval.u.decl), NULL); ;} + break; + + case 375: +#line 1742 "c-parse.y" + { finish_init(); + (yyval.u.decl) = finish_decl((yyvsp[(5) - (6)].u.decl), (yyvsp[(6) - (6)].u.expr)); ;} + break; + + case 376: +#line 1745 "c-parse.y" + { declaration d = start_decl((yyvsp[(1) - (3)].u.declarator), (yyvsp[(2) - (3)].u.asm_stmt), pstate.declspecs, 0, + prefix_attr((yyvsp[(3) - (3)].u.attribute))); + (yyval.u.decl) = finish_decl(d, NULL); ;} + break; + + case 377: +#line 1752 "c-parse.y" + { (yyval.u.attribute) = NULL; ;} + break; + + case 378: +#line 1754 "c-parse.y" + { (yyval.u.attribute) = attribute_reverse((yyvsp[(1) - (1)].u.attribute)); ;} + break; + + case 379: +#line 1758 "c-parse.y" + { (yyval.u.telement) = CAST(type_element, (yyvsp[(1) - (1)].u.attribute)); ;} + break; + + case 380: +#line 1762 "c-parse.y" + { (yyval.u.attribute) = NULL; ;} + break; + + case 381: +#line 1764 "c-parse.y" + { (yyval.u.attribute) = attribute_chain((yyvsp[(2) - (2)].u.attribute), (yyvsp[(1) - (2)].u.attribute)); ;} + break; + + case 382: +#line 1769 "c-parse.y" + { (yyval.u.attribute) = (yyvsp[(1) - (1)].u.attribute); ;} + break; + + case 383: +#line 1771 "c-parse.y" + { (yyval.u.attribute) = attribute_chain((yyvsp[(2) - (2)].u.attribute), (yyvsp[(1) - (2)].u.attribute)); ;} + break; + + case 384: +#line 1776 "c-parse.y" + { (yyval.u.attribute) = (yyvsp[(4) - (6)].u.attribute); ;} + break; + + case 385: +#line 1777 "c-parse.y" + { (yyval.u.attribute) = CAST(attribute, (yyvsp[(1) - (1)].u.gcc_attribute)); ;} + break; + + case 387: +#line 1783 "c-parse.y" + { word w = new_word(pr, (yyvsp[(1) - (1)].idtoken).location, (yyvsp[(1) - (1)].idtoken).id); + (yyval.u.gcc_attribute) = new_gcc_attribute(pr, (yyvsp[(1) - (1)].idtoken).location, w, NULL); ;} + break; + + case 388: +#line 1786 "c-parse.y" + { word w = new_word(pr, (yyvsp[(1) - (2)].idtoken).location, (yyvsp[(1) - (2)].idtoken).id); + (yyval.u.gcc_attribute) = new_gcc_attribute(pr, (yyvsp[(1) - (2)].idtoken).location, w, (yyvsp[(2) - (2)].u.expr)); ;} + break; + + case 389: +#line 1789 "c-parse.y" + { word w = new_word(pr, (yyvsp[(2) - (2)].u.expr)->location, str2cstring(pr, "iar_at")); + (yyval.u.gcc_attribute) = new_gcc_attribute(pr, (yyvsp[(2) - (2)].u.expr)->location, w, (yyvsp[(2) - (2)].u.expr)); ;} + break; + + case 390: +#line 1794 "c-parse.y" + { (yyval.u.expr) = CAST(expression, (yyvsp[(1) - (1)].u.constant)); ;} + break; + + case 391: +#line 1795 "c-parse.y" + { (yyval.u.expr) = (yyvsp[(1) - (1)].u.expr); ;} + break; + + case 392: +#line 1796 "c-parse.y" + { (yyval.u.expr) = (yyvsp[(2) - (3)].u.expr); ;} + break; + + case 393: +#line 1801 "c-parse.y" + { (yyval.u.attribute) = CAST(attribute, (yyvsp[(1) - (1)].u.gcc_attribute)); ;} + break; + + case 394: +#line 1803 "c-parse.y" + { (yyval.u.attribute) = attribute_chain((yyvsp[(1) - (3)].u.attribute), CAST(attribute, (yyvsp[(3) - (3)].u.gcc_attribute))); ;} + break; + + case 395: +#line 1808 "c-parse.y" + { (yyval.u.gcc_attribute) = NULL; ;} + break; + + case 396: +#line 1810 "c-parse.y" + { (yyval.u.gcc_attribute) = new_gcc_attribute(pr, (yyvsp[(1) - (1)].u.word)->location, (yyvsp[(1) - (1)].u.word), NULL); ;} + break; + + case 397: +#line 1812 "c-parse.y" + { (yyval.u.gcc_attribute) = new_gcc_attribute + (pr, (yyvsp[(1) - (4)].u.word)->location, (yyvsp[(1) - (4)].u.word), make_attr_args((yyvsp[(3) - (4)].idtoken).location, (yyvsp[(3) - (4)].idtoken).id, NULL)); ;} + break; + + case 398: +#line 1815 "c-parse.y" + { (yyval.u.gcc_attribute) = new_gcc_attribute + (pr, (yyvsp[(2) - (6)].u.itoken).location, (yyvsp[(1) - (6)].u.word), make_attr_args((yyvsp[(3) - (6)].idtoken).location, (yyvsp[(3) - (6)].idtoken).id, (yyvsp[(5) - (6)].u.expr))); + ;} + break; + + case 399: +#line 1819 "c-parse.y" + { (yyval.u.gcc_attribute) = new_gcc_attribute(pr, (yyvsp[(2) - (4)].u.itoken).location, (yyvsp[(1) - (4)].u.word), (yyvsp[(3) - (4)].u.expr)); + ;} + break; + + case 400: +#line 1825 "c-parse.y" + { (yyval.u.attribute) = finish_attribute_use((yyvsp[(2) - (5)].u.nesc_attribute), (yyvsp[(4) - (5)].u.expr)); ;} + break; + + case 401: +#line 1827 "c-parse.y" + { (yyval.u.attribute) = finish_attribute_use((yyvsp[(2) - (4)].u.nesc_attribute), make_error_expr()); ;} + break; + + case 402: +#line 1832 "c-parse.y" + { (yyval.u.nesc_attribute) = start_attribute_use((yyvsp[(1) - (1)].u.word)); ;} + break; + + case 404: +#line 1841 "c-parse.y" + { (yyval.u.word) = make_cword((yyvsp[(1) - (1)].u.telement)->location, rid_name(CAST(rid, (yyvsp[(1) - (1)].u.telement)))); ;} + break; + + case 405: +#line 1843 "c-parse.y" + { (yyval.u.word) = make_cword((yyvsp[(1) - (1)].u.telement)->location, rid_name(CAST(rid, (yyvsp[(1) - (1)].u.telement)))); ;} + break; + + case 406: +#line 1845 "c-parse.y" + { (yyval.u.word) = make_cword((yyvsp[(1) - (1)].u.telement)->location, qualifier_name(CAST(qualifier, (yyvsp[(1) - (1)].u.telement))->id)); ;} + break; + + case 407: +#line 1847 "c-parse.y" + { (yyval.u.word) = make_cword((yyvsp[(1) - (1)].u.itoken).location, "signal"); ;} + break; + + case 408: +#line 1853 "c-parse.y" + { (yyval.u.expr) = (yyvsp[(1) - (1)].u.expr); simple_init((yyval.u.expr)); ;} + break; + + case 409: +#line 1855 "c-parse.y" + { really_start_incremental_init(NULL); ;} + break; + + case 410: +#line 1857 "c-parse.y" + { (yyval.u.expr) = make_init_list((yyvsp[(1) - (4)].u.itoken).location, (yyvsp[(3) - (4)].u.expr)); ;} + break; + + case 411: +#line 1859 "c-parse.y" + { (yyval.u.expr) = make_error_expr(); ;} + break; + + case 412: +#line 1865 "c-parse.y" + { if (pedantic) + pedwarn("ANSI C forbids empty initializer braces"); + (yyval.u.expr) = NULL; ;} + break; + + case 413: +#line 1868 "c-parse.y" + { (yyval.u.expr) = expression_reverse((yyvsp[(1) - (2)].u.expr)); ;} + break; + + case 415: +#line 1873 "c-parse.y" + { (yyval.u.expr) = expression_chain((yyvsp[(3) - (3)].u.expr), (yyvsp[(1) - (3)].u.expr)); ;} + break; + + case 416: +#line 1880 "c-parse.y" + { if (pedantic) + pedwarn("ANSI C forbids specifying subobject to initialize"); + (yyval.u.expr) = make_init_specific((yyvsp[(1) - (3)].u.designator), (yyvsp[(3) - (3)].u.expr)); ;} + break; + + case 417: +#line 1884 "c-parse.y" + { if (pedantic) + pedwarn("obsolete use of designated initializer without `='"); + (yyval.u.expr) = make_init_specific((yyvsp[(1) - (2)].u.designator), (yyvsp[(2) - (2)].u.expr)); ;} + break; + + case 418: +#line 1888 "c-parse.y" + { (yyval.u.designator) = set_init_label((yyvsp[(1) - (2)].idtoken).location, (yyvsp[(1) - (2)].idtoken).id); + if (pedantic) + pedwarn("obsolete use of designated initializer with `:'"); ;} + break; + + case 419: +#line 1892 "c-parse.y" + { (yyval.u.expr) = make_init_specific((yyvsp[(3) - (4)].u.designator), (yyvsp[(4) - (4)].u.expr)); ;} + break; + + case 421: +#line 1898 "c-parse.y" + { push_init_level (0); ;} + break; + + case 422: +#line 1900 "c-parse.y" + { (yyval.u.expr) = make_init_list((yyvsp[(1) - (4)].u.itoken).location, (yyvsp[(3) - (4)].u.expr)); + process_init_element(NULL); ;} + break; + + case 423: +#line 1903 "c-parse.y" + { process_init_element((yyvsp[(1) - (1)].u.expr)); (yyval.u.expr) = (yyvsp[(1) - (1)].u.expr); ;} + break; + + case 424: +#line 1904 "c-parse.y" + { (yyval.u.expr) = make_error_expr(); ;} + break; + + case 426: +#line 1909 "c-parse.y" + { (yyval.u.designator) = designator_chain((yyvsp[(1) - (2)].u.designator), (yyvsp[(2) - (2)].u.designator)); ;} + break; + + case 427: +#line 1914 "c-parse.y" + { (yyval.u.designator) = set_init_label((yyvsp[(2) - (2)].idtoken).location, (yyvsp[(2) - (2)].idtoken).id); ;} + break; + + case 428: +#line 1919 "c-parse.y" + { (yyval.u.designator) = set_init_index((yyvsp[(1) - (5)].u.itoken).location, (yyvsp[(2) - (5)].u.expr), (yyvsp[(4) - (5)].u.expr)); + if (pedantic) + pedwarn ("ISO C forbids specifying range of elements to initialize"); ;} + break; + + case 429: +#line 1923 "c-parse.y" + { (yyval.u.designator) = set_init_index((yyvsp[(1) - (3)].u.itoken).location, (yyvsp[(2) - (3)].u.expr), NULL); ;} + break; + + case 430: +#line 1928 "c-parse.y" + { + /* maybeasm is only here to avoid a s/r conflict */ + refuse_asm((yyvsp[(2) - (3)].u.asm_stmt)); + + if (!start_function(pstate.declspecs, (yyvsp[(1) - (3)].u.declarator), (yyvsp[(3) - (3)].u.attribute), 1)) + { + YYERROR1; + } + ;} + break; + + case 431: +#line 1938 "c-parse.y" + { store_parm_decls(declaration_reverse((yyvsp[(3) - (5)].u.attribute))); ;} + break; + + case 432: +#line 1946 "c-parse.y" + { (yyval.u.decl) = finish_function((yyvsp[(7) - (7)].u.stmt)); ;} + break; + + case 433: +#line 1951 "c-parse.y" + { + /* maybeasm is only here to avoid a s/r conflict */ + refuse_asm((yyvsp[(2) - (3)].u.asm_stmt)); + + if (!start_function(pstate.declspecs, (yyvsp[(1) - (3)].u.declarator), (yyvsp[(3) - (3)].u.attribute), 1)) + { + YYERROR1; + } + ;} + break; + + case 434: +#line 1961 "c-parse.y" + { store_parm_decls(declaration_reverse((yyvsp[(3) - (5)].u.attribute))); ;} + break; + + case 435: +#line 1969 "c-parse.y" + { (yyval.u.decl) = finish_function((yyvsp[(7) - (7)].u.stmt)); ;} + break; + + case 438: +#line 1984 "c-parse.y" + { (yyval.u.declarator) = finish_array_or_fn_declarator((yyvsp[(1) - (2)].u.declarator), (yyvsp[(2) - (2)].u.nested)); ;} + break; + + case 439: +#line 1986 "c-parse.y" + { (yyval.u.declarator) = make_pointer_declarator((yyvsp[(1) - (3)].u.itoken).location, (yyvsp[(3) - (3)].u.declarator), (yyvsp[(2) - (3)].u.telement)); ;} + break; + + case 440: +#line 1988 "c-parse.y" + { (yyval.u.declarator) = make_qualified_declarator((yyvsp[(1) - (4)].u.itoken).location, (yyvsp[(3) - (4)].u.declarator), CAST(type_element, (yyvsp[(2) - (4)].u.attribute))); ;} + break; + + case 441: +#line 1989 "c-parse.y" + { (yyval.u.declarator) = make_identifier_declarator((yyvsp[(1) - (1)].idtoken).location, (yyvsp[(1) - (1)].idtoken).id); ;} + break; + + case 442: +#line 1991 "c-parse.y" + { + (yyval.u.declarator) = make_interface_ref_declarator((yyvsp[(1) - (3)].idtoken).location, (yyvsp[(1) - (3)].idtoken).id, (yyvsp[(3) - (3)].idtoken).id); + ;} + break; + + case 443: +#line 2002 "c-parse.y" + { (yyval.u.declarator) = finish_array_or_fn_declarator((yyvsp[(1) - (2)].u.declarator), (yyvsp[(2) - (2)].u.nested)); ;} + break; + + case 444: +#line 2004 "c-parse.y" + { (yyval.u.declarator) = make_pointer_declarator((yyvsp[(1) - (3)].u.itoken).location, (yyvsp[(3) - (3)].u.declarator), (yyvsp[(2) - (3)].u.telement)); ;} + break; + + case 445: +#line 2006 "c-parse.y" + { (yyval.u.declarator) = make_identifier_declarator((yyvsp[(1) - (1)].idtoken).location, (yyvsp[(1) - (1)].idtoken).id); ;} + break; + + case 446: +#line 2015 "c-parse.y" + { (yyval.u.declarator) = finish_array_or_fn_declarator((yyvsp[(1) - (2)].u.declarator), (yyvsp[(2) - (2)].u.nested)); ;} + break; + + case 447: +#line 2017 "c-parse.y" + { (yyval.u.declarator) = make_pointer_declarator((yyvsp[(1) - (3)].u.itoken).location, (yyvsp[(3) - (3)].u.declarator), (yyvsp[(2) - (3)].u.telement)); ;} + break; + + case 448: +#line 2019 "c-parse.y" + { (yyval.u.declarator) = make_qualified_declarator((yyvsp[(1) - (4)].u.itoken).location, (yyvsp[(3) - (4)].u.declarator), CAST(type_element, (yyvsp[(2) - (4)].u.attribute))); ;} + break; + + case 449: +#line 2021 "c-parse.y" + { (yyval.u.declarator) = make_identifier_declarator((yyvsp[(1) - (1)].idtoken).location, (yyvsp[(1) - (1)].idtoken).id); ;} + break; + + case 450: +#line 2023 "c-parse.y" + { + (yyval.u.declarator) = make_interface_ref_declarator((yyvsp[(1) - (3)].idtoken).location, (yyvsp[(1) - (3)].idtoken).id, (yyvsp[(3) - (3)].idtoken).id); + ;} + break; + + case 451: +#line 2029 "c-parse.y" + { (yyval.u.word) = new_word(pr, (yyvsp[(1) - (1)].idtoken).location, (yyvsp[(1) - (1)].idtoken).id); ;} + break; + + case 452: +#line 2034 "c-parse.y" + { (yyval.u.telement) = xref_tag((yyvsp[(1) - (3)].u.itoken).location, (yyvsp[(1) - (3)].u.itoken).i, (yyvsp[(2) - (3)].u.word)); + if ((yyvsp[(3) - (3)].u.attribute)) warning("attributes ignored"); ;} + break; + + case 453: +#line 2037 "c-parse.y" + { (yyval.u.telement) = xref_tag((yyvsp[(1) - (3)].u.itoken).location, kind_enum_ref, (yyvsp[(2) - (3)].u.word)); + if ((yyvsp[(3) - (3)].u.attribute)) warning("attributes ignored"); ;} + break; + + case 454: +#line 2043 "c-parse.y" + { (yyval.u.telement) = start_struct((yyvsp[(1) - (4)].u.itoken).location, (yyvsp[(1) - (4)].u.itoken).i, (yyvsp[(2) - (4)].u.word)); + /* Start scope of tag before parsing components. */ + ;} + break; + + case 455: +#line 2047 "c-parse.y" + { (yyval.u.telement) = finish_struct((yyvsp[(5) - (8)].u.telement), (yyvsp[(6) - (8)].u.decl), attribute_chain((yyvsp[(3) - (8)].u.attribute), (yyvsp[(8) - (8)].u.attribute))); ;} + break; + + case 456: +#line 2049 "c-parse.y" + { (yyval.u.telement) = start_struct((yyvsp[(1) - (5)].u.itoken).location, kind_attribute_ref, (yyvsp[(3) - (5)].u.word)); + /* Start scope of tag before parsing components. */ + ;} + break; + + case 457: +#line 2053 "c-parse.y" + { (yyval.u.telement) = finish_struct((yyvsp[(6) - (9)].u.telement), (yyvsp[(7) - (9)].u.decl), attribute_chain((yyvsp[(4) - (9)].u.attribute), (yyvsp[(9) - (9)].u.attribute))); ;} + break; + + case 458: +#line 2055 "c-parse.y" + { (yyval.u.telement) = finish_struct(start_struct((yyvsp[(1) - (5)].u.itoken).location, (yyvsp[(1) - (5)].u.itoken).i, + NULL), (yyvsp[(3) - (5)].u.decl), (yyvsp[(5) - (5)].u.attribute)); + ;} + break; + + case 459: +#line 2059 "c-parse.y" + { (yyval.u.telement) = start_enum((yyvsp[(1) - (4)].u.itoken).location, (yyvsp[(2) - (4)].u.word)); ;} + break; + + case 460: +#line 2061 "c-parse.y" + { (yyval.u.telement) = finish_enum((yyvsp[(5) - (9)].u.telement), declaration_reverse((yyvsp[(6) - (9)].u.decl)), attribute_chain((yyvsp[(3) - (9)].u.attribute), (yyvsp[(9) - (9)].u.attribute))); ;} + break; + + case 461: +#line 2063 "c-parse.y" + { (yyval.u.telement) = start_enum((yyvsp[(1) - (2)].u.itoken).location, NULL); ;} + break; + + case 462: +#line 2065 "c-parse.y" + { (yyval.u.telement) = finish_enum((yyvsp[(3) - (7)].u.telement), declaration_reverse((yyvsp[(4) - (7)].u.decl)), (yyvsp[(7) - (7)].u.attribute)); ;} + break; + + case 463: +#line 2069 "c-parse.y" + { (yyval.u.itoken) = (yyvsp[(1) - (1)].u.itoken); (yyval.u.itoken).i = kind_struct_ref; ;} + break; + + case 464: +#line 2070 "c-parse.y" + { (yyval.u.itoken) = (yyvsp[(1) - (1)].u.itoken); (yyval.u.itoken).i = kind_union_ref; ;} + break; + + case 465: +#line 2071 "c-parse.y" + { (yyval.u.itoken) = (yyvsp[(1) - (1)].u.itoken); (yyval.u.itoken).i = kind_nx_struct_ref; ;} + break; + + case 466: +#line 2072 "c-parse.y" + { (yyval.u.itoken) = (yyvsp[(1) - (1)].u.itoken); (yyval.u.itoken).i = kind_nx_union_ref; ;} + break; + + case 470: +#line 2083 "c-parse.y" + { if (pedantic) pedwarn("comma at end of enumerator list"); ;} + break; + + case 471: +#line 2088 "c-parse.y" + { (yyval.u.decl) = declaration_reverse((yyvsp[(1) - (1)].u.decl)); ;} + break; + + case 472: +#line 2090 "c-parse.y" + { (yyval.u.decl) = declaration_reverse(declaration_chain((yyvsp[(2) - (2)].u.decl), (yyvsp[(1) - (2)].u.decl))); + pedwarn("no semicolon at end of struct or union"); ;} + break; + + case 473: +#line 2096 "c-parse.y" + { (yyval.u.decl) = NULL; ;} + break; + + case 474: +#line 2098 "c-parse.y" + { (yyval.u.decl) = declaration_chain((yyvsp[(2) - (3)].u.decl), (yyvsp[(1) - (3)].u.decl)); ;} + break; + + case 475: +#line 2100 "c-parse.y" + { if (pedantic) + pedwarn("extra semicolon in struct or union specified"); + (yyval.u.decl) = (yyvsp[(1) - (2)].u.decl); ;} + break; + + case 476: +#line 2116 "c-parse.y" + { (yyval.u.decl) = make_data_decl((yyvsp[(1) - (3)].u.telement), declaration_reverse((yyvsp[(3) - (3)].u.decl))); ;} + break; + + case 477: +#line 2118 "c-parse.y" + { if (pedantic) + pedwarn("ISO C doesn't support unnamed structs/unions"); + + (yyval.u.decl) = make_data_decl((yyvsp[(1) - (2)].u.telement), NULL); ;} + break; + + case 478: +#line 2123 "c-parse.y" + { (yyval.u.decl) = make_data_decl((yyvsp[(1) - (3)].u.telement), declaration_reverse((yyvsp[(3) - (3)].u.decl))); ;} + break; + + case 479: +#line 2125 "c-parse.y" + { if (pedantic) + pedwarn("ANSI C forbids member declarations with no members"); + shadow_tag((yyvsp[(1) - (2)].u.telement)); + (yyval.u.decl) = make_data_decl((yyvsp[(1) - (2)].u.telement), NULL); ;} + break; + + case 480: +#line 2130 "c-parse.y" + { (yyval.u.decl) = make_error_decl(); ;} + break; + + case 481: +#line 2132 "c-parse.y" + { (yyval.u.decl) = make_extension_decl((yyvsp[(1) - (2)].u.itoken).i, (yyvsp[(1) - (2)].u.itoken).location, (yyvsp[(2) - (2)].u.decl)); ;} + break; + + case 483: +#line 2138 "c-parse.y" + { (yyval.u.decl) = declaration_chain((yyvsp[(4) - (4)].u.decl), (yyvsp[(1) - (4)].u.decl)); ;} + break; + + case 485: +#line 2146 "c-parse.y" + { (yyval.u.decl) = declaration_chain((yyvsp[(4) - (4)].u.decl), (yyvsp[(1) - (4)].u.decl)); ;} + break; + + case 486: +#line 2151 "c-parse.y" + { (yyval.u.decl) = make_field((yyvsp[(1) - (2)].u.declarator), NULL, pstate.declspecs, + prefix_attr((yyvsp[(2) - (2)].u.attribute))); ;} + break; + + case 487: +#line 2154 "c-parse.y" + { (yyval.u.decl) = make_field((yyvsp[(1) - (4)].u.declarator), (yyvsp[(3) - (4)].u.expr), pstate.declspecs, + prefix_attr((yyvsp[(4) - (4)].u.attribute))); ;} + break; + + case 488: +#line 2157 "c-parse.y" + { (yyval.u.decl) = make_field(NULL, (yyvsp[(2) - (3)].u.expr), pstate.declspecs, + prefix_attr((yyvsp[(3) - (3)].u.attribute))); ;} + break; + + case 489: +#line 2163 "c-parse.y" + { (yyval.u.decl) = make_field((yyvsp[(1) - (2)].u.declarator), NULL, pstate.declspecs, + prefix_attr((yyvsp[(2) - (2)].u.attribute))); ;} + break; + + case 490: +#line 2166 "c-parse.y" + { (yyval.u.decl) = make_field((yyvsp[(1) - (4)].u.declarator), (yyvsp[(3) - (4)].u.expr), pstate.declspecs, + prefix_attr((yyvsp[(4) - (4)].u.attribute))); ;} + break; + + case 491: +#line 2169 "c-parse.y" + { (yyval.u.decl) = make_field(NULL, (yyvsp[(2) - (3)].u.expr), pstate.declspecs, + prefix_attr((yyvsp[(3) - (3)].u.attribute))); ;} + break; + + case 493: +#line 2176 "c-parse.y" + { (yyval.u.decl) = declaration_chain((yyvsp[(3) - (3)].u.decl), (yyvsp[(1) - (3)].u.decl)); ;} + break; + + case 494: +#line 2178 "c-parse.y" + { (yyval.u.decl) = NULL; ;} + break; + + case 495: +#line 2184 "c-parse.y" + { (yyval.u.decl) = make_enumerator((yyvsp[(1) - (1)].idtoken).location, (yyvsp[(1) - (1)].idtoken).id, NULL); ;} + break; + + case 496: +#line 2186 "c-parse.y" + { (yyval.u.decl) = make_enumerator((yyvsp[(1) - (3)].idtoken).location, (yyvsp[(1) - (3)].idtoken).id, (yyvsp[(3) - (3)].u.expr)); ;} + break; + + case 497: +#line 2191 "c-parse.y" + { pending_xref_error(); ;} + break; + + case 498: +#line 2193 "c-parse.y" + { (yyval.u.type) = make_type((yyvsp[(1) - (3)].u.telement), (yyvsp[(3) - (3)].u.declarator)); ;} + break; + + case 499: +#line 2198 "c-parse.y" + { (yyval.u.declarator) = NULL; ;} + break; + + case 504: +#line 2210 "c-parse.y" + { (yyval.u.declarator) = make_pointer_declarator((yyvsp[(1) - (3)].u.itoken).location, (yyvsp[(3) - (3)].u.declarator), (yyvsp[(2) - (3)].u.telement)); ;} + break; + + case 505: +#line 2215 "c-parse.y" + { (yyval.u.declarator) = make_pointer_declarator((yyvsp[(1) - (2)].u.itoken).location, NULL, (yyvsp[(2) - (2)].u.telement)); ;} + break; + + case 506: +#line 2217 "c-parse.y" + { (yyval.u.declarator) = make_pointer_declarator((yyvsp[(1) - (3)].u.itoken).location, (yyvsp[(3) - (3)].u.declarator), (yyvsp[(2) - (3)].u.telement)); ;} + break; + + case 507: +#line 2222 "c-parse.y" + { (yyval.u.declarator) = make_qualified_declarator((yyvsp[(1) - (4)].u.itoken).location, (yyvsp[(3) - (4)].u.declarator), CAST(type_element, (yyvsp[(2) - (4)].u.attribute))); ;} + break; + + case 508: +#line 2224 "c-parse.y" + { (yyval.u.declarator) = finish_array_or_fn_declarator((yyvsp[(1) - (2)].u.declarator), (yyvsp[(2) - (2)].u.nested)); ;} + break; + + case 509: +#line 2226 "c-parse.y" + { (yyval.u.declarator) = finish_array_or_fn_declarator(NULL, (yyvsp[(1) - (1)].u.nested)); ;} + break; + + case 514: +#line 2241 "c-parse.y" + { (yyval.u.nested) = CAST(nested_declarator, + new_function_declarator(pr, (yyvsp[(2) - (4)].u.itoken).location, NULL, (yyvsp[(3) - (4)].u.decl), (yyvsp[(1) - (4)].u.decl), (yyvsp[(4) - (4)].u.telement), NULL)); ;} + break; + + case 515: +#line 2244 "c-parse.y" + { (yyval.u.nested) = CAST(nested_declarator, + new_function_declarator(pr, (yyvsp[(1) - (3)].u.itoken).location, NULL, (yyvsp[(2) - (3)].u.decl), NULL, (yyvsp[(3) - (3)].u.telement), NULL)); ;} + break; + + case 516: +#line 2250 "c-parse.y" + { (yyval.u.nested) = CAST(nested_declarator, + new_function_declarator(pr, (yyvsp[(1) - (3)].u.itoken).location, NULL, (yyvsp[(2) - (3)].u.decl), NULL, (yyvsp[(3) - (3)].u.telement), NULL)); ;} + break; + + case 517: +#line 2256 "c-parse.y" + { (yyval.u.nested) = CAST(nested_declarator, new_array_declarator(pr, (yyvsp[(1) - (3)].u.itoken).location, NULL, (yyvsp[(2) - (3)].u.expr))); ;} + break; + + case 518: +#line 2258 "c-parse.y" + { (yyval.u.nested) = CAST(nested_declarator, new_array_declarator(pr, (yyvsp[(1) - (2)].u.itoken).location, NULL, NULL)); ;} + break; + + case 519: +#line 2267 "c-parse.y" + { + if (pedantic && (yyvsp[(1) - (1)].u.istmt).i) + pedwarn("ANSI C forbids label at end of compound statement"); + /* Add an empty statement to last label if stand-alone */ + if ((yyvsp[(1) - (1)].u.istmt).i) + { + statement last_label = last_statement((yyvsp[(1) - (1)].u.istmt).stmt); + + chain_with_labels(last_label, CAST(statement, new_empty_stmt(pr, last_label->location))); + } + (yyval.u.stmt) = (yyvsp[(1) - (1)].u.istmt).stmt; + ;} + break; + + case 521: +#line 2284 "c-parse.y" + { (yyval.u.istmt).i = (yyvsp[(2) - (2)].u.istmt).i; (yyval.u.istmt).stmt = chain_with_labels((yyvsp[(1) - (2)].u.istmt).stmt, (yyvsp[(2) - (2)].u.istmt).stmt); ;} + break; + + case 522: +#line 2286 "c-parse.y" + { (yyval.u.istmt).i = 0; (yyval.u.istmt).stmt = make_error_stmt(); ;} + break; + + case 523: +#line 2290 "c-parse.y" + { (yyval.u.stmt) = NULL; ;} + break; + + case 526: +#line 2299 "c-parse.y" + { pushlevel(FALSE); ;} + break; + + case 527: +#line 2305 "c-parse.y" + { (yyval.u.id_label) = NULL; ;} + break; + + case 528: +#line 2307 "c-parse.y" + { if (pedantic) + pedwarn("ANSI C forbids label declarations"); + (yyval.u.id_label) = id_label_reverse((yyvsp[(1) - (1)].u.id_label)); ;} + break; + + case 530: +#line 2314 "c-parse.y" + { (yyval.u.id_label) = id_label_chain((yyvsp[(2) - (2)].u.id_label), (yyvsp[(1) - (2)].u.id_label)); ;} + break; + + case 531: +#line 2319 "c-parse.y" + { (yyval.u.id_label) = (yyvsp[(2) - (3)].u.id_label); ;} + break; + + case 533: +#line 2326 "c-parse.y" + { (yyval.u.stmt) = (yyvsp[(2) - (2)].u.stmt); ;} + break; + + case 534: +#line 2330 "c-parse.y" + { (yyval.u.itoken) = (yyvsp[(1) - (1)].u.itoken); compstmt_count++; ;} + break; + + case 535: +#line 2335 "c-parse.y" + { (yyval.u.stmt) = CAST(statement, new_compound_stmt(pr, (yyvsp[(1) - (3)].u.itoken).location, NULL, NULL, NULL, poplevel())); ;} + break; + + case 536: +#line 2337 "c-parse.y" + { (yyval.u.stmt) = CAST(statement, new_compound_stmt(pr, (yyvsp[(1) - (6)].u.itoken).location, (yyvsp[(3) - (6)].u.id_label), + declaration_reverse((yyvsp[(4) - (6)].u.decl)), (yyvsp[(5) - (6)].u.stmt), poplevel())); ;} + break; + + case 537: +#line 2340 "c-parse.y" + { poplevel(); + (yyval.u.stmt) = make_error_stmt(); ;} + break; + + case 538: +#line 2343 "c-parse.y" + { (yyval.u.stmt) = CAST(statement, new_compound_stmt(pr, (yyvsp[(1) - (5)].u.itoken).location, (yyvsp[(3) - (5)].u.id_label), NULL, (yyvsp[(4) - (5)].u.stmt), poplevel())); ;} + break; + + case 539: +#line 2349 "c-parse.y" + { (yyval.u.istmt).stmt = CAST(statement, new_if_stmt(pr, (yyvsp[(1) - (2)].u.iexpr).expr->location, (yyvsp[(1) - (2)].u.iexpr).expr, (yyvsp[(2) - (2)].u.stmt), NULL)); + (yyval.u.istmt).i = (yyvsp[(1) - (2)].u.iexpr).i; ;} + break; + + case 540: +#line 2351 "c-parse.y" + { (yyval.u.istmt).i = (yyvsp[(1) - (2)].u.iexpr).i; (yyval.u.istmt).stmt = make_error_stmt(); ;} + break; + + case 541: +#line 2356 "c-parse.y" + { (yyval.u.iexpr).i = stmt_count; + (yyval.u.iexpr).expr = (yyvsp[(3) - (4)].u.expr); + check_condition("if", (yyvsp[(3) - (4)].u.expr)); ;} + break; + + case 542: +#line 2366 "c-parse.y" + { stmt_count++; + compstmt_count++; + (yyval.u.cstmt) = CAST(conditional_stmt, + new_dowhile_stmt(pr, (yyvsp[(1) - (1)].u.itoken).location, NULL, NULL)); + push_loop(CAST(statement, (yyval.u.cstmt))); ;} + break; + + case 543: +#line 2372 "c-parse.y" + { (yyval.u.cstmt) = (yyvsp[(2) - (4)].u.cstmt); + (yyval.u.cstmt)->stmt = (yyvsp[(3) - (4)].u.stmt); ;} + break; + + case 544: +#line 2378 "c-parse.y" + { (yyval.u.stmt) = (yyvsp[(1) - (1)].u.stmt); ;} + break; + + case 545: +#line 2380 "c-parse.y" + { (yyval.u.stmt) = CAST(statement, new_labeled_stmt(pr, (yyvsp[(1) - (2)].u.label)->location, (yyvsp[(1) - (2)].u.label), (yyvsp[(2) - (2)].u.stmt))); ;} + break; + + case 546: +#line 2385 "c-parse.y" + { (yyval.u.istmt).i = 0; (yyval.u.istmt).stmt = (yyvsp[(1) - (1)].u.stmt); ;} + break; + + case 547: +#line 2387 "c-parse.y" + { (yyval.u.istmt).i = 1; (yyval.u.istmt).stmt = CAST(statement, new_labeled_stmt(pr, (yyvsp[(1) - (1)].u.label)->location, (yyvsp[(1) - (1)].u.label), NULL)); ;} + break; + + case 548: +#line 2391 "c-parse.y" + { + atomic_stmt last_atomic = current.in_atomic; + + current.in_atomic = new_atomic_stmt(pr, (yyvsp[(1) - (1)].u.itoken).location, NULL); + current.in_atomic->containing_atomic = last_atomic; + ;} + break; + + case 549: +#line 2398 "c-parse.y" + { + atomic_stmt this_atomic = current.in_atomic; + + this_atomic->stmt = (yyvsp[(3) - (3)].u.stmt); + current.in_atomic = this_atomic->containing_atomic; + if (current.in_atomic) /* Ignore nested atomics */ + (yyval.u.stmt) = (yyvsp[(3) - (3)].u.stmt); + else + (yyval.u.stmt) = CAST(statement, this_atomic); + ;} + break; + + case 551: +#line 2412 "c-parse.y" + { (yyval.u.stmt) = make_error_stmt(); ;} + break; + + case 552: +#line 2418 "c-parse.y" + { stmt_count++; (yyval.u.stmt) = (yyvsp[(1) - (1)].u.stmt); ;} + break; + + case 553: +#line 2420 "c-parse.y" + { stmt_count++; + (yyval.u.stmt) = CAST(statement, new_expression_stmt(pr, (yyvsp[(1) - (2)].u.expr)->location, (yyvsp[(1) - (2)].u.expr))); ;} + break; + + case 554: +#line 2423 "c-parse.y" + { (yyvsp[(1) - (2)].u.istmt).i = stmt_count; ;} + break; + + case 555: +#line 2425 "c-parse.y" + { if (extra_warnings && stmt_count == (yyvsp[(1) - (4)].u.istmt).i) + warning("empty body in an else-statement"); + (yyval.u.stmt) = (yyvsp[(1) - (4)].u.istmt).stmt; + if (is_if_stmt((yyval.u.stmt))) /* could be an error_stmt */ + CAST(if_stmt, (yyval.u.stmt))->stmt2 = (yyvsp[(4) - (4)].u.stmt); + ;} + break; + + case 556: +#line 2432 "c-parse.y" + { /* This warning is here instead of in simple_if, because we + do not want a warning if an empty if is followed by an + else statement. Increment stmt_count so we don't + give a second error if this is a nested `if'. */ + if (extra_warnings && stmt_count++ == (yyvsp[(1) - (1)].u.istmt).i) + warning_with_location ((yyvsp[(1) - (1)].u.istmt).stmt->location, + "empty body in an if-statement"); + (yyval.u.stmt) = (yyvsp[(1) - (1)].u.istmt).stmt; ;} + break; + + case 557: +#line 2441 "c-parse.y" + { (yyval.u.stmt) = make_error_stmt(); ;} + break; + + case 558: +#line 2443 "c-parse.y" + { stmt_count++; ;} + break; + + case 559: +#line 2445 "c-parse.y" + { check_condition("while", (yyvsp[(4) - (5)].u.expr)); + (yyval.u.cstmt) = CAST(conditional_stmt, + new_while_stmt(pr, (yyvsp[(1) - (5)].u.itoken).location, (yyvsp[(4) - (5)].u.expr), NULL)); + /* The condition is not "in the loop" for break or continue */ + push_loop(CAST(statement, (yyval.u.cstmt))); ;} + break; + + case 560: +#line 2451 "c-parse.y" + { (yyval.u.stmt) = CAST(statement, (yyvsp[(6) - (7)].u.cstmt)); + (yyvsp[(6) - (7)].u.cstmt)->stmt = (yyvsp[(7) - (7)].u.stmt); + pop_loop(); ;} + break; + + case 561: +#line 2455 "c-parse.y" + { (yyval.u.stmt) = CAST(statement, (yyvsp[(1) - (5)].u.cstmt)); + (yyvsp[(1) - (5)].u.cstmt)->condition = (yyvsp[(3) - (5)].u.expr); + check_condition("do-while", (yyvsp[(3) - (5)].u.expr)); + /* Note that pop_loop should be before the expr to be consistent + with while, but GCC is inconsistent. See loop1.c */ + pop_loop(); ;} + break; + + case 562: +#line 2462 "c-parse.y" + { (yyval.u.stmt) = make_error_stmt(); + pop_loop(); ;} + break; + + case 563: +#line 2464 "c-parse.y" + { stmt_count++; ;} + break; + + case 564: +#line 2465 "c-parse.y" + { if ((yyvsp[(6) - (7)].u.expr)) check_condition("for", (yyvsp[(6) - (7)].u.expr)); ;} + break; + + case 565: +#line 2467 "c-parse.y" + { (yyval.u.for_stmt) = new_for_stmt(pr, (yyvsp[(1) - (10)].u.itoken).location, (yyvsp[(3) - (10)].u.expr), (yyvsp[(6) - (10)].u.expr), (yyvsp[(9) - (10)].u.expr), NULL); + push_loop(CAST(statement, (yyval.u.for_stmt))); ;} + break; + + case 566: +#line 2470 "c-parse.y" + { (yyval.u.stmt) = CAST(statement, (yyvsp[(11) - (12)].u.for_stmt)); + (yyvsp[(11) - (12)].u.for_stmt)->stmt = (yyvsp[(12) - (12)].u.stmt); + pop_loop(); ;} + break; + + case 567: +#line 2474 "c-parse.y" + { stmt_count++; check_switch((yyvsp[(3) - (4)].u.expr)); + (yyval.u.cstmt) = CAST(conditional_stmt, + new_switch_stmt(pr, (yyvsp[(1) - (4)].u.itoken).location, (yyvsp[(3) - (4)].u.expr), NULL)); + push_loop(CAST(statement, (yyval.u.cstmt))); ;} + break; + + case 568: +#line 2479 "c-parse.y" + { (yyval.u.stmt) = CAST(statement, (yyvsp[(5) - (6)].u.cstmt)); + (yyvsp[(5) - (6)].u.cstmt)->stmt = (yyvsp[(6) - (6)].u.stmt); + pop_loop(); ;} + break; + + case 569: +#line 2483 "c-parse.y" + { stmt_count++; + (yyval.u.stmt) = CAST(statement, new_break_stmt(pr, (yyvsp[(1) - (2)].u.itoken).location)); + check_break((yyval.u.stmt)); + ;} + break; + + case 570: +#line 2488 "c-parse.y" + { stmt_count++; + (yyval.u.stmt) = CAST(statement, new_continue_stmt(pr, (yyvsp[(1) - (2)].u.itoken).location)); + check_continue((yyval.u.stmt)); + ;} + break; + + case 571: +#line 2493 "c-parse.y" + { stmt_count++; + (yyval.u.stmt) = make_void_return((yyvsp[(1) - (2)].u.itoken).location); ;} + break; + + case 572: +#line 2496 "c-parse.y" + { stmt_count++; + (yyval.u.stmt) = make_return((yyvsp[(1) - (3)].u.itoken).location, (yyvsp[(2) - (3)].u.expr)); ;} + break; + + case 573: +#line 2499 "c-parse.y" + { stmt_count++; + (yyval.u.stmt) = CAST(statement, new_asm_stmt(pr, (yyvsp[(1) - (6)].u.itoken).location, (yyvsp[(4) - (6)].u.expr), NULL, + NULL, NULL, (yyvsp[(2) - (6)].u.telement))); ;} + break; + + case 574: +#line 2504 "c-parse.y" + { stmt_count++; + (yyval.u.stmt) = CAST(statement, new_asm_stmt(pr, (yyvsp[(1) - (8)].u.itoken).location, (yyvsp[(4) - (8)].u.expr), (yyvsp[(6) - (8)].u.asm_operand), NULL, + NULL, (yyvsp[(2) - (8)].u.telement))); ;} + break; + + case 575: +#line 2509 "c-parse.y" + { stmt_count++; + (yyval.u.stmt) = CAST(statement, new_asm_stmt(pr, (yyvsp[(1) - (10)].u.itoken).location, (yyvsp[(4) - (10)].u.expr), (yyvsp[(6) - (10)].u.asm_operand), (yyvsp[(8) - (10)].u.asm_operand), NULL, (yyvsp[(2) - (10)].u.telement))); ;} + break; + + case 576: +#line 2514 "c-parse.y" + { stmt_count++; + (yyval.u.stmt) = CAST(statement, new_asm_stmt(pr, (yyvsp[(1) - (12)].u.itoken).location, (yyvsp[(4) - (12)].u.expr), (yyvsp[(6) - (12)].u.asm_operand), (yyvsp[(8) - (12)].u.asm_operand), (yyvsp[(10) - (12)].u.string), (yyvsp[(2) - (12)].u.telement))); ;} + break; + + case 577: +#line 2517 "c-parse.y" + { stmt_count++; + (yyval.u.stmt) = CAST(statement, new_goto_stmt(pr, (yyvsp[(1) - (3)].u.itoken).location, (yyvsp[(2) - (3)].u.id_label))); + use_label((yyvsp[(2) - (3)].u.id_label)); + ;} + break; + + case 578: +#line 2522 "c-parse.y" + { if (pedantic) + pedwarn("ANSI C forbids `goto *expr;'"); + fail_in_atomic("goto *"); + stmt_count++; + (yyval.u.stmt) = CAST(statement, new_computed_goto_stmt(pr, (yyvsp[(1) - (4)].u.itoken).location, (yyvsp[(3) - (4)].u.expr))); + check_computed_goto((yyvsp[(3) - (4)].u.expr)); ;} + break; + + case 580: +#line 2529 "c-parse.y" + { (yyval.u.stmt) = CAST(statement, new_empty_stmt(pr, (yyvsp[(1) - (1)].u.itoken).location)); ;} + break; + + case 581: +#line 2537 "c-parse.y" + { (yyval.u.label) = CAST(label, new_case_label(pr, (yyvsp[(1) - (3)].u.itoken).location, (yyvsp[(2) - (3)].u.expr), NULL)); + check_case((yyval.u.label)); ;} + break; + + case 582: +#line 2540 "c-parse.y" + { (yyval.u.label) = CAST(label, new_case_label(pr, (yyvsp[(1) - (5)].u.itoken).location, (yyvsp[(2) - (5)].u.expr), (yyvsp[(4) - (5)].u.expr))); + check_case((yyval.u.label)); ;} + break; + + case 583: +#line 2543 "c-parse.y" + { (yyval.u.label) = CAST(label, new_default_label(pr, (yyvsp[(1) - (2)].u.itoken).location)); + check_default((yyval.u.label)); ;} + break; + + case 584: +#line 2546 "c-parse.y" + { (yyval.u.label) = CAST(label, (yyvsp[(1) - (2)].u.id_label)); + define_label((yyvsp[(1) - (2)].u.id_label)); ;} + break; + + case 585: +#line 2554 "c-parse.y" + { (yyval.u.telement) = NULL; ;} + break; + + case 587: +#line 2560 "c-parse.y" + { (yyval.u.expr) = NULL; ;} + break; + + case 589: +#line 2568 "c-parse.y" + { (yyval.u.asm_operand) = NULL; ;} + break; + + case 592: +#line 2575 "c-parse.y" + { (yyval.u.asm_operand) = asm_operand_chain((yyvsp[(1) - (3)].u.asm_operand), (yyvsp[(3) - (3)].u.asm_operand)); ;} + break; + + case 593: +#line 2580 "c-parse.y" + { (yyval.u.asm_operand) = new_asm_operand(pr, (yyvsp[(1) - (4)].u.string)->location, NULL, (yyvsp[(1) - (4)].u.string), (yyvsp[(3) - (4)].u.expr)); ;} + break; + + case 594: +#line 2582 "c-parse.y" + { (yyval.u.asm_operand) = new_asm_operand(pr, (yyvsp[(1) - (7)].u.itoken).location, (yyvsp[(2) - (7)].u.word), (yyvsp[(4) - (7)].u.string), (yyvsp[(6) - (7)].u.expr)); ;} + break; + + case 595: +#line 2587 "c-parse.y" + { (yyval.u.string) = (yyvsp[(1) - (1)].u.string); ;} + break; + + case 596: +#line 2589 "c-parse.y" + { (yyval.u.string) = string_chain((yyvsp[(1) - (3)].u.string), (yyvsp[(3) - (3)].u.string)); ;} + break; + + case 597: +#line 2595 "c-parse.y" + { pushlevel(TRUE); ;} + break; + + case 598: +#line 2597 "c-parse.y" + { (yyval.u.decl) = (yyvsp[(2) - (2)].u.decl); + /* poplevel() is done when building the declarator */ + ;} + break; + + case 599: +#line 2603 "c-parse.y" + { (yyval.u.decl) = (yyvsp[(1) - (2)].u.decl); ;} + break; + + case 600: +#line 2605 "c-parse.y" + { if (pedantic) + pedwarn("ANSI C forbids forward parameter declarations"); + allow_parameter_redeclaration((yyvsp[(1) - (2)].u.decl), TRUE); + ;} + break; + + case 601: +#line 2610 "c-parse.y" + { (yyval.u.decl) = declaration_chain((yyvsp[(1) - (4)].u.decl), (yyvsp[(4) - (4)].u.decl)); ;} + break; + + case 602: +#line 2612 "c-parse.y" + { (yyval.u.decl) = make_error_decl(); ;} + break; + + case 603: +#line 2618 "c-parse.y" + { (yyval.u.decl) = NULL; ;} + break; + + case 604: +#line 2620 "c-parse.y" + { (yyval.u.decl) = make_error_decl(); + /* Gcc used to allow this as an extension. However, it does + not work for all targets, and thus has been disabled. + Also, since func (...) and func () are indistinguishable, + it caused problems with the code in expand_builtin which + tries to verify that BUILT_IN_NEXT_ARG is being used + correctly. */ + error("ANSI C requires a named argument before `...'"); + ;} + break; + + case 605: +#line 2630 "c-parse.y" + { (yyval.u.decl) = (yyvsp[(1) - (1)].u.decl); ;} + break; + + case 606: +#line 2632 "c-parse.y" + { (yyval.u.decl) = declaration_chain((yyvsp[(1) - (3)].u.decl), CAST(declaration, new_ellipsis_decl(pr, (yyvsp[(3) - (3)].u.itoken).location))); ;} + break; + + case 608: +#line 2638 "c-parse.y" + { (yyval.u.decl) = declaration_chain((yyvsp[(1) - (3)].u.decl), (yyvsp[(3) - (3)].u.decl)); ;} + break; + + case 609: +#line 2645 "c-parse.y" + { (yyval.u.decl) = declare_parameter((yyvsp[(3) - (4)].u.declarator), (yyvsp[(1) - (4)].u.telement), (yyvsp[(4) - (4)].u.attribute)); ;} + break; + + case 610: +#line 2647 "c-parse.y" + { (yyval.u.decl) = declare_parameter((yyvsp[(3) - (4)].u.declarator), (yyvsp[(1) - (4)].u.telement), (yyvsp[(4) - (4)].u.attribute)); ;} + break; + + case 611: +#line 2649 "c-parse.y" + { (yyval.u.decl) = declare_parameter((yyvsp[(3) - (3)].u.declarator), (yyvsp[(1) - (3)].u.telement), NULL); ;} + break; + + case 612: +#line 2651 "c-parse.y" + { (yyval.u.decl) = declare_parameter((yyvsp[(3) - (4)].u.declarator), (yyvsp[(1) - (4)].u.telement), (yyvsp[(4) - (4)].u.attribute)); ;} + break; + + case 613: +#line 2653 "c-parse.y" + { (yyval.u.decl) = declare_parameter((yyvsp[(3) - (4)].u.declarator), (yyvsp[(1) - (4)].u.telement), (yyvsp[(4) - (4)].u.attribute)); ;} + break; + + case 614: +#line 2655 "c-parse.y" + { (yyval.u.decl) = declare_parameter((yyvsp[(3) - (3)].u.declarator), (yyvsp[(1) - (3)].u.telement), NULL); ;} + break; + + case 615: +#line 2657 "c-parse.y" + { (yyval.u.decl) = declare_parameter((yyvsp[(3) - (4)].u.declarator), (yyvsp[(1) - (4)].u.telement), (yyvsp[(4) - (4)].u.attribute)); ;} + break; + + case 616: +#line 2660 "c-parse.y" + { pending_xref_error(); ;} + break; + + case 617: +#line 2666 "c-parse.y" + { pushlevel(TRUE); ;} + break; + + case 618: +#line 2668 "c-parse.y" + { (yyval.u.decl) = (yyvsp[(2) - (2)].u.decl); + /* poplevel is done when building the declarator */ ;} + break; + + case 620: +#line 2674 "c-parse.y" + { (yyval.u.decl) = (yyvsp[(1) - (2)].u.decl); ;} + break; + + case 621: +#line 2680 "c-parse.y" + { (yyval.u.decl) = (yyvsp[(1) - (1)].u.decl); ;} + break; + + case 622: +#line 2682 "c-parse.y" + { (yyval.u.decl) = declaration_chain((yyvsp[(1) - (3)].u.decl), (yyvsp[(3) - (3)].u.decl)); ;} + break; + + case 623: +#line 2686 "c-parse.y" + { (yyval.u.decl) = declare_old_parameter((yyvsp[(1) - (1)].idtoken).location, (yyvsp[(1) - (1)].idtoken).id); ;} + break; + + case 624: +#line 2691 "c-parse.y" + { (yyval.u.id_label) = (yyvsp[(1) - (1)].u.id_label); declare_label((yyvsp[(1) - (1)].u.id_label)); ;} + break; + + case 625: +#line 2693 "c-parse.y" + { (yyval.u.id_label) = id_label_chain((yyvsp[(3) - (3)].u.id_label), (yyvsp[(1) - (3)].u.id_label)); + declare_label((yyvsp[(3) - (3)].u.id_label)); ;} + break; + + case 626: +#line 2699 "c-parse.y" + { (yyval.u.telement) = NULL; ;} + break; + + case 627: +#line 2700 "c-parse.y" + { (yyval.u.telement) = (yyvsp[(1) - (1)].u.telement); ;} + break; + + case 628: +#line 2705 "c-parse.y" + { (yyval.u.itoken).location = (yyvsp[(1) - (1)].u.itoken).location; + (yyval.u.itoken).i = pedantic; + pedantic = 0; ;} + break; + + case 629: +#line 2712 "c-parse.y" + { (yyval.u.telement) = CAST(type_element, new_rid(pr, (yyvsp[(1) - (1)].u.itoken).location, (yyvsp[(1) - (1)].u.itoken).i)); ;} + break; + + case 630: +#line 2714 "c-parse.y" + { (yyval.u.telement) = CAST(type_element, new_rid(pr, (yyvsp[(1) - (1)].u.itoken).location, RID_DEFAULT)); ;} + break; + + case 631: +#line 2719 "c-parse.y" + { (yyval.u.telement) = CAST(type_element, new_qualifier(pr, (yyvsp[(1) - (1)].u.itoken).location, (yyvsp[(1) - (1)].u.itoken).i)); ;} + break; + + case 632: +#line 2724 "c-parse.y" + { (yyval.u.telement) = CAST(type_element, new_qualifier(pr, (yyvsp[(1) - (1)].u.itoken).location, (yyvsp[(1) - (1)].u.itoken).i)); ;} + break; + + case 633: +#line 2729 "c-parse.y" + { (yyval.u.telement) = CAST(type_element, new_rid(pr, (yyvsp[(1) - (1)].u.itoken).location, (yyvsp[(1) - (1)].u.itoken).i)); ;} + break; + + +/* Line 1267 of yacc.c. */ +#line 6419 "c-parse.tab.c" + default: break; + } + YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); + + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + + *++yyvsp = yyval; + + + /* Now `shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; + if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTOKENS]; + + goto yynewstate; + + +/*------------------------------------. +| yyerrlab -- here on detecting error | +`------------------------------------*/ +yyerrlab: + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) + { + ++yynerrs; +#if ! YYERROR_VERBOSE + yyerror (YY_("syntax error")); +#else + { + YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); + if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) + { + YYSIZE_T yyalloc = 2 * yysize; + if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) + yyalloc = YYSTACK_ALLOC_MAXIMUM; + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); + yymsg = (char *) YYSTACK_ALLOC (yyalloc); + if (yymsg) + yymsg_alloc = yyalloc; + else + { + yymsg = yymsgbuf; + yymsg_alloc = sizeof yymsgbuf; + } + } + + if (0 < yysize && yysize <= yymsg_alloc) + { + (void) yysyntax_error (yymsg, yystate, yychar); + yyerror (yymsg); + } + else + { + yyerror (YY_("syntax error")); + if (yysize != 0) + goto yyexhaustedlab; + } + } +#endif + } + + + + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse look-ahead token after an + error, discard it. */ + + if (yychar <= YYEOF) + { + /* Return failure if at end of input. */ + if (yychar == YYEOF) + YYABORT; + } + else + { + yydestruct ("Error: discarding", + yytoken, &yylval); + yychar = YYEMPTY; + } + } + + /* Else will try to reuse look-ahead token after shifting the error + token. */ + goto yyerrlab1; + + +/*---------------------------------------------------. +| yyerrorlab -- error raised explicitly by YYERROR. | +`---------------------------------------------------*/ +yyerrorlab: + + /* Pacify compilers like GCC when the user code never invokes + YYERROR and the label yyerrorlab therefore never appears in user + code. */ + if (/*CONSTCOND*/ 0) + goto yyerrorlab; + + /* Do not reclaim the symbols of the rule which action triggered + this YYERROR. */ + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + yystate = *yyssp; + goto yyerrlab1; + + +/*-------------------------------------------------------------. +| yyerrlab1 -- common code for both syntax error and YYERROR. | +`-------------------------------------------------------------*/ +yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ + + for (;;) + { + yyn = yypact[yystate]; + if (yyn != YYPACT_NINF) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; + + + yydestruct ("Error: popping", + yystos[yystate], yyvsp); + YYPOPSTACK (1); + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); + } + + if (yyn == YYFINAL) + YYACCEPT; + + *++yyvsp = yylval; + + + /* Shift the error token. */ + YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); + + yystate = yyn; + goto yynewstate; + + +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturn; + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturn; + +#ifndef yyoverflow +/*-------------------------------------------------. +| yyexhaustedlab -- memory exhaustion comes here. | +`-------------------------------------------------*/ +yyexhaustedlab: + yyerror (YY_("memory exhausted")); + yyresult = 2; + /* Fall through. */ +#endif + +yyreturn: + if (yychar != YYEOF && yychar != YYEMPTY) + yydestruct ("Cleanup: discarding lookahead", + yytoken, &yylval); + /* Do not reclaim the symbols of the rule which action triggered + this YYABORT or YYACCEPT. */ + YYPOPSTACK (yylen); + YY_STACK_PRINT (yyss, yyssp); + while (yyssp != yyss) + { + yydestruct ("Cleanup: popping", + yystos[*yyssp], yyvsp); + YYPOPSTACK (1); + } +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); +#endif +#if YYERROR_VERBOSE + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); +#endif + /* Make sure YYID is used. */ + return YYID (yyresult); +} + + +#line 2733 "c-parse.y" + + diff --git a/src/c-parse.tab.h b/src/c-parse.tab.h new file mode 100644 index 0000000..bb7c3c8 --- /dev/null +++ b/src/c-parse.tab.h @@ -0,0 +1,207 @@ +/* A Bison parser, made by GNU Bison 2.3. */ + +/* Skeleton interface for Bison's Yacc-like parsers in C + + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 + 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., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ + +/* As a special exception, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + IDENTIFIER = 258, + TYPENAME = 259, + COMPONENTREF = 260, + SCSPEC = 261, + TYPESPEC = 262, + TYPE_QUAL = 263, + FN_QUAL = 264, + CONSTANT = 265, + STRING = 266, + MAGIC_STRING = 267, + ELLIPSIS = 268, + SIZEOF = 269, + ENUM = 270, + STRUCT = 271, + UNION = 272, + IF = 273, + ELSE = 274, + WHILE = 275, + DO = 276, + FOR = 277, + SWITCH = 278, + CASE = 279, + DEFAULT = 280, + BREAK = 281, + CONTINUE = 282, + RETURN = 283, + GOTO = 284, + ASM_KEYWORD = 285, + TYPEOF = 286, + ALIGNOF = 287, + ATTRIBUTE = 288, + EXTENSION = 289, + LABEL = 290, + REALPART = 291, + IMAGPART = 292, + VA_ARG = 293, + OFFSETOF = 294, + ASSIGN = 295, + OROR = 296, + ANDAND = 297, + EQCOMPARE = 298, + ARITHCOMPARE = 299, + RSHIFT = 300, + LSHIFT = 301, + MINUSMINUS = 302, + PLUSPLUS = 303, + POINTSAT = 304, + DISPATCH_C = 305, + DISPATCH_NESC = 306, + DISPATCH_PARM = 307, + DISPATCH_TYPE = 308, + ATOMIC = 309, + USES = 310, + INTERFACE = 311, + COMPONENTS = 312, + PROVIDES = 313, + MODULE = 314, + INCLUDES = 315, + CONFIGURATION = 316, + AS = 317, + TASTNIOP = 318, + IMPLEMENTATION = 319, + CALL = 320, + SIGNAL = 321, + POST = 322, + GENERIC = 323, + NEW = 324, + NX_STRUCT = 325, + NX_UNION = 326, + ABSTRACT = 327, + COMPONENT = 328, + EXTENDS = 329, + TARGET_ATTRIBUTE0 = 330, + TARGET_ATTRIBUTE1 = 331, + TARGET_DEF = 332 + }; +#endif +/* Tokens. */ +#define IDENTIFIER 258 +#define TYPENAME 259 +#define COMPONENTREF 260 +#define SCSPEC 261 +#define TYPESPEC 262 +#define TYPE_QUAL 263 +#define FN_QUAL 264 +#define CONSTANT 265 +#define STRING 266 +#define MAGIC_STRING 267 +#define ELLIPSIS 268 +#define SIZEOF 269 +#define ENUM 270 +#define STRUCT 271 +#define UNION 272 +#define IF 273 +#define ELSE 274 +#define WHILE 275 +#define DO 276 +#define FOR 277 +#define SWITCH 278 +#define CASE 279 +#define DEFAULT 280 +#define BREAK 281 +#define CONTINUE 282 +#define RETURN 283 +#define GOTO 284 +#define ASM_KEYWORD 285 +#define TYPEOF 286 +#define ALIGNOF 287 +#define ATTRIBUTE 288 +#define EXTENSION 289 +#define LABEL 290 +#define REALPART 291 +#define IMAGPART 292 +#define VA_ARG 293 +#define OFFSETOF 294 +#define ASSIGN 295 +#define OROR 296 +#define ANDAND 297 +#define EQCOMPARE 298 +#define ARITHCOMPARE 299 +#define RSHIFT 300 +#define LSHIFT 301 +#define MINUSMINUS 302 +#define PLUSPLUS 303 +#define POINTSAT 304 +#define DISPATCH_C 305 +#define DISPATCH_NESC 306 +#define DISPATCH_PARM 307 +#define DISPATCH_TYPE 308 +#define ATOMIC 309 +#define USES 310 +#define INTERFACE 311 +#define COMPONENTS 312 +#define PROVIDES 313 +#define MODULE 314 +#define INCLUDES 315 +#define CONFIGURATION 316 +#define AS 317 +#define TASTNIOP 318 +#define IMPLEMENTATION 319 +#define CALL 320 +#define SIGNAL 321 +#define POST 322 +#define GENERIC 323 +#define NEW 324 +#define NX_STRUCT 325 +#define NX_UNION 326 +#define ABSTRACT 327 +#define COMPONENT 328 +#define EXTENDS 329 +#define TARGET_ATTRIBUTE0 330 +#define TARGET_ATTRIBUTE1 331 +#define TARGET_DEF 332 + + + + +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +typedef int YYSTYPE; +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 +#endif + + + diff --git a/src/c-parse.y b/src/c-parse.y new file mode 100644 index 0000000..febdc40 --- /dev/null +++ b/src/c-parse.y @@ -0,0 +1,2733 @@ +/* This file is part of the nesC compiler. + +This file is derived from the RC and the GNU C Compiler. It is thus + Copyright (C) 1987, 88, 89, 92-7, 1998 Free Software Foundation, Inc. + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +/* This is a version of c-parse.y with two conflicts and supporting the gcc3 + attribute syntax. It is a partial merge of the gcc 3 grammar */ + +/* This file defines the grammar of C */ +/* To whomever it may concern: I have heard that such a thing was once + written by AT&T, but I have never seen it. */ + +%pure_parser +%expect 12 + +%{ +#include +#include +#include + +#include "parser.h" +#include "c-parse.h" +#include "c-lex.h" +#include "c-lex-int.h" +#include "semantics.h" +#include "expr.h" +#include "stmt.h" +#include "init.h" +#include "nesc-semantics.h" +#include "nesc-interface.h" +#include "nesc-component.h" +#include "nesc-configuration.h" +#include "nesc-module.h" +#include "nesc-env.h" +#include "nesc-c.h" +#include "nesc-attributes.h" +#include "nesc-task.h" +#include "nesc-cpp.h" +#include "attributes.h" +#include "machine.h" + +int yyparse(void) deletes; + +void yyerror(); + +/* Like YYERROR but do call yyerror. */ +#define YYERROR1 { yyerror ("syntax error"); YYERROR; } + +/* Cause the `yydebug' variable to be defined. */ +#define YYDEBUG 1 +%} + +%start dispatch + +/* All identifiers that are not reserved words + and are not declared typedefs in the current block */ +%token IDENTIFIER + +/* All identifiers that are declared typedefs in the current block. + In some contexts, they are treated just like IDENTIFIER, + but they can also serve as typespecs in declarations. */ +%token TYPENAME + +/* An identifier that is declared as a component reference in the + current block, and which is going to be used to refer to a typedef + from the component via the component-ref '.' identifier syntax + (detected in the lexer) */ +%token COMPONENTREF + +/* Reserved words that specify storage class. + yylval contains an IDENTIFIER_NODE which indicates which one. */ +%token SCSPEC + +/* Reserved words that specify type. + yylval contains an IDENTIFIER_NODE which indicates which one. */ +%token TYPESPEC + +/* Reserved words that qualify types/functions: "const" or "volatile", + "deletes". + yylval contains an IDENTIFIER_NODE which indicates which one. */ +%token TYPE_QUAL FN_QUAL + +/* Character or numeric constants. + yylval is the node for the constant. */ +%token CONSTANT + +/* String constants in raw form. */ +%token STRING MAGIC_STRING + +/* "...", used for functions with variable arglists. */ +%token ELLIPSIS + +/* the reserved words */ +/* SCO include files test "ASM", so use something else. */ +%token SIZEOF ENUM STRUCT UNION IF ELSE WHILE DO FOR SWITCH CASE DEFAULT +%token BREAK CONTINUE RETURN GOTO ASM_KEYWORD TYPEOF ALIGNOF +%token ATTRIBUTE EXTENSION LABEL +%token REALPART IMAGPART VA_ARG OFFSETOF + +/* Add precedence rules to solve dangling else s/r conflict */ +%nonassoc IF +%nonassoc ELSE + +/* Define the operator tokens and their precedences. + The value is an integer because, if used, it is the tree code + to use in the expression made from the operator. */ + +%right ASSIGN '=' +%right '?' ':' +%left OROR +%left ANDAND +%left '|' +%left '^' +%left '&' +%left EQCOMPARE +%left ARITHCOMPARE '<' '>' +%left LSHIFT RSHIFT +%left '+' '-' +%left '*' '/' '%' +%right PLUSPLUS MINUSMINUS +%left POINTSAT '.' '(' '[' + +%type asm_operand asm_operands nonnull_asm_operands +%type maybeasm +%type maybe_attribute attributes attribute attribute_list +%type nesc_attributes nattrib +%type attrib target_attribute +%type nastart +%type CONSTANT +%type datadecl datadecls datadef decl decls extdef extdefs fndef +%type initdecls initdecls_ notype_initdecls notype_initdecls_ fndef2 +%type nested_function notype_nested_function old_style_parm_decls +%type initdcl component_decl_list component_decl_list2 component_decl +%type components component_declarator enumerator enumlist +%type components_notype component_notype_declarator +%type parmlist parmlist_1 parmlist_2 parms parm +%type parmlist_or_identifiers identifiers notype_initdcl +%type parmlist_or_identifiers_1 old_parameter just_datadef +%type declarator after_type_declarator notype_declarator +%type absdcl absdcl1 absdcl1_noea absdcl1_ea direct_absdcl1 +%type parm_declarator +%type array_declarator fn_declarator array_or_fn_declarator +%type absfn_declarator array_or_absfn_declarator +%type cast_expr expr expr_no_commas exprlist init initlist_maybe_comma +%type initlist1 initelt nonnull_exprlist primary string +%type nonnull_exprlist_ initval restricted_expr +%type designator_list designator +%type unary_expr xexpr function_call +%type generic_type typelist +%type id_label maybe_label_decls label_decls label_decl +%type identifiers_or_typenames +%type identifier type_parm +%type IDENTIFIER TYPENAME MAGIC_STRING COMPONENTREF +%type if_prefix +%type stmt_or_labels simple_if stmt_or_label +%type unop extension '~' '!' compstmt_start '{' ';' +%type sizeof alignof +%type label +%type stmts xstmts compstmt_or_error compstmt +%type labeled_stmt stmt stmt_or_error atomic_stmt +%type do_stmt_start +%type asm_clobbers STRING +%type declspecs_nosc_nots_nosa_noea +%type declspecs_nosc_nots_nosa_ea +%type declspecs_nosc_nots_sa_noea +%type declspecs_nosc_nots_sa_ea +%type declspecs_nosc_ts_nosa_noea +%type declspecs_nosc_ts_nosa_ea +%type declspecs_nosc_ts_sa_noea +%type declspecs_nosc_ts_sa_ea +%type declspecs_sc_nots_nosa_noea +%type declspecs_sc_nots_nosa_ea +%type declspecs_sc_nots_sa_noea +%type declspecs_sc_nots_sa_ea +%type declspecs_sc_ts_nosa_noea +%type declspecs_sc_ts_nosa_ea +%type declspecs_sc_ts_sa_noea +%type declspecs_sc_ts_sa_ea +%type declspecs_ts +%type declspecs_nots +%type declspecs_ts_nosa +%type declspecs_nots_nosa +%type declspecs_nosc_ts +%type declspecs_nosc_nots +%type declspecs_nosc +%type declspecs +%type scspec type_qual type_spec eattributes +%type type_spec_attr type_spec_nonattr +%type type_spec_nonreserved_nonattr type_spec_reserved_attr +%type type_spec_reserved_nonattr +%type structdef structuse +%type maybe_type_qual maybe_type_quals_attrs fn_qual fn_quals +%type typename +%type idword any_word tag +%type fieldlist +%type structkind + +/* the dispatching (fake) tokens */ +%token DISPATCH_C DISPATCH_NESC DISPATCH_PARM DISPATCH_TYPE + +/* nesC reserved words */ +%token ATOMIC USES INTERFACE COMPONENTS PROVIDES MODULE +%token INCLUDES CONFIGURATION AS TASTNIOP IMPLEMENTATION CALL +%token SIGNAL POST GENERIC NEW NX_STRUCT NX_UNION +/* words reserved for nesC's future. Some may never be used... */ +%token ABSTRACT COMPONENT EXTENDS +%token TARGET_ATTRIBUTE0 TARGET_ATTRIBUTE1 TARGET_DEF + +%type callkind +%type datadef_list +%type parameters parameters1 +%type requires provides requires_or_provides requires_or_provides_list +%type requires_or_provides_list_ +%type parameterised_interface_list parameterised_interface +%type parameterised_interfaces +%type interface_parms interface_parm_list interface_parm +%type component_parms +%type template_parms template_parmlist template_parm +%type target_def +%type interface_ref interface_type +%type component_ref component_ref2 component_list cuses +%type connection +%type configuration_decl configuration_decls +%type endpoint +%type parameterised_identifier +%type iconfiguration imodule +%type generic +%type generic_arglist generic_arg generic_args + + +%{ +/* Region in which to allocate parse structures. Idea: the AST user can set + this to different regions at appropriate junctures depending on what's + being done with the AST */ +region parse_region; +/* We'll see this a LOT below */ +#define pr parse_region + +/* Number of statements (loosely speaking) and compound statements + seen so far. */ +static int stmt_count; +static int compstmt_count; + +#ifdef RC_ADJUST +static size_t rc_adjust_yystype(void *x, int by) +{ + struct yystype *p = x; + RC_ADJUST_PREAMBLE; + + RC_ADJUST(p->u.ptr, by); + RC_ADJUST(p->idtoken.location.filename, by); + RC_ADJUST(p->idtoken.id.data, by); + RC_ADJUST(p->idtoken.decl, by); + + return sizeof *p; +} + +static void rc_update_yystype(struct yystype *old, struct yystype *new) +{ + regionid base = regionidof(old); + + RC_UPDATE(base, old->u.ptr, new->u.ptr); + RC_UPDATE(base, old->idtoken.location.filename, new->idtoken.location.filename); + RC_UPDATE(base, old->idtoken.id.data, new->idtoken.id.data); + RC_UPDATE(base, old->idtoken.decl, new->idtoken.decl); +} +#endif + +/* A stack of declspecs and attributes for use during parsing */ +typedef struct spec_stack *spec_stack; +struct spec_stack { + type_element parentptr declspecs; + attribute parentptr attributes; + spec_stack sameregion next; +}; + +struct parse_state +{ + /* Stack of saved values of current_declspecs and prefix_attributes. */ + /* In an ideal world, we would be able to eliminate most rc ops for + declspec_stack and ds_region assignments. Seems tricky though. */ + spec_stack declspec_stack; + region ds_region; + + /* List of types and structure classes of the current declaration. */ + type_element declspecs; + attribute attributes; + + /* >0 if currently parsing an expression that will not be evaluated (argument + to alignof, sizeof. Currently not typeof though that could be considered + a bug) */ + int unevaluated_expression; +} pstate; + +bool unevaluated_expression(void) +{ + return pstate.unevaluated_expression != 0; +} + +/* Pop top entry of declspec_stack back into current_declspecs, + prefix_attributes */ +static void pop_declspec_stack(void) deletes +{ + pstate.declspecs = pstate.declspec_stack->declspecs; + pstate.attributes = pstate.declspec_stack->attributes; + pstate.declspec_stack = pstate.declspec_stack->next; +} + +static void push_declspec_stack(void) +{ + spec_stack news; + + news = ralloc(pstate.ds_region, struct spec_stack); + news->declspecs = pstate.declspecs; + news->attributes = pstate.attributes; + news->next = pstate.declspec_stack; + pstate.declspec_stack = news; +} + +static node parse_tree; + +node parse(void) deletes +{ + int result, old_errorcount = errorcount; + struct parse_state old_pstate = pstate; + + pstate.declspecs = NULL; + pstate.attributes = NULL; + pstate.unevaluated_expression = 0; + pstate.declspec_stack = NULL; + pstate.ds_region = newsubregion(parse_region); + parse_tree = NULL; + result = yyparse(); + if (result) + parse_tree = NULL; + deleteregion_ptr(&pstate.ds_region); + + if (result != 0 && errorcount == old_errorcount) + fprintf(stderr, "Errors detected in input file (your bison.simple is out of date)"); + + pstate = old_pstate; + + return parse_tree; +} + +static void set_nesc_ast(void *tree) +{ + nesc_declaration cdecl = current.container; + nesc_decl nd = CAST(nesc_decl, tree); + + nd->cdecl = cdecl; + cdecl->ast = nd; +} + +static void set_nesc_parse_tree(void *tree) +{ + set_nesc_ast(tree); + parse_tree = CAST(node, tree); +} + +static void set_nesc_impl(implementation impl) +{ + nesc_declaration cdecl = current.container; + + CAST(component, cdecl->ast)->implementation = impl; + parse_tree = CAST(node, cdecl->ast); +} + +void refuse_asm(asm_stmt s) +{ + if (s) + error_with_location(s->location, "unexpected asm statement"); +} + +/* Merge the attributes in front of a declaration (but which aren't part + of the declspecs) with the attributes after the declaration. + We're pretending they all came after */ +attribute prefix_attr(attribute post_attr) +{ + return attribute_chain(pstate.attributes, post_attr); +} + +/* Simple build functions */ +declaration make_data_decl(type_element modifiers, declaration decls) +{ + location l = modifiers ? modifiers->location : decls->location; + + data_decl dd = new_data_decl(parse_region, l, modifiers, decls); + + pop_declspec_stack(); + + if (decls == NULL && current.spec_section != spec_normal) + error("provides/uses must be followed by a command, event or interface"); + + return CAST(declaration, dd); +} + +declaration make_error_decl(void) +{ + return new_error_decl(pr, dummy_location); +} + +declaration make_extension_decl(int old_pedantic, location l, declaration d) +{ + pedantic = old_pedantic; + return CAST(declaration, new_extension_decl(pr, l, d)); +} + +word make_cword(location l, const char *s) +{ + return new_word(pr, l, str2cstring(pr, s)); +} + +declarator make_qualified_declarator(location l, declarator d, type_element quals) +{ + if (quals) + return CAST(declarator, new_qualified_declarator(pr, l, d, quals)); + else + return d; +} + +declarator make_pointer_declarator(location l, declarator d, type_element quals) +{ + d = make_qualified_declarator(l, d, quals); + + return CAST(declarator, new_pointer_declarator(pr, l, d)); +} + +declarator make_identifier_declarator(location l, cstring id) +{ + return CAST(declarator, new_identifier_declarator(pr, l, id)); +} + +statement make_error_stmt(void) +{ + return new_error_stmt(pr, dummy_location); +} + +/* Tell yyparse how to print a token's value, if yydebug is set. */ + +#define YYPRINT(FILE,YYCHAR,YYLVAL) yyprint(FILE,YYCHAR,YYLVAL) +void yyprint(); +%} + +%% + +dispatch: + DISPATCH_NESC interface { } + | DISPATCH_NESC component { } + | DISPATCH_C extdefs { + declaration cdecls = declaration_reverse($2); + parse_tree = CAST(node, cdecls); } + | DISPATCH_C { parse_tree = NULL; } + | DISPATCH_PARM parm { parse_tree = CAST(node, $2); } + | DISPATCH_PARM error { parse_tree = CAST(node, make_error_decl()); } + | DISPATCH_TYPE typename { parse_tree = CAST(node, $2); } + | DISPATCH_TYPE error { parse_tree = NULL; } + ; + +ncheader: + { end_macro_saving(); } includes_list + | extdefs + { + end_macro_saving(); + add_cdecls(declaration_reverse($1)); + } + ; + +includes_list: + includes_list includes + | /* empty */ + ; + +includes: + INCLUDES include_list ';' { } + ; + +include_list: + identifier + { require_c($1.location, $1.id.data); } + | include_list ',' identifier + { require_c($3.location, $3.id.data); } + ; + +interface: + ncheader + INTERFACE idword + { + start_nesc_entity(l_interface, $3); + } + interface_parms nesc_attributes + { + handle_nescdecl_attributes($6, current.container); + } + '{' datadef_list '}' + { + interface intf = new_interface(pr, $2.location, $3, $6, declaration_reverse($9)); + + set_nesc_parse_tree(intf); + + if (intf->cdecl->abstract) + poplevel(); + } + ; + +interface_parms: + /* empty */ { $$ = NULL; } + | '<' interface_parm_list '>' + { + nesc_declaration intf = current.container; + + intf->parameters = $2; + intf->parameter_env = current.env; + $$ = $2; + + /* Template intfs need a new level for the actual intf */ + pushlevel(FALSE); + /* The interface env counts as global */ + current.env->global_level = TRUE; + intf->env = current.env; + intf->abstract = TRUE; + } + ; + +interface_parm_list: + interface_parm + | interface_parm_list ',' interface_parm + { $$ = declaration_chain($1, $3); } + ; + +interface_parm: + type_parm nesc_attributes + { $$ = declare_type_parameter($1.location, $1.id, $2, NULL); } + ; + +type_parm: + IDENTIFIER { $$ = $1; } + ; + +datadef_list: + datadef_list just_datadef { $$ = declaration_chain($2, $1); } + | just_datadef ; + +parameters: + '[' { pushlevel(TRUE); } parameters1 + { /* poplevel done in users of parameters */ $$ = $3; } ; + +parameters1: + parms ']' + { + $$ = declaration_reverse($1); + check_interface_parameter_types($$); + } + | error ']' { $$ = make_error_decl(); } + ; + +component: + ncheader module + | ncheader configuration + | ncheader binary_component + ; + +module: + generic MODULE idword + { + start_nesc_entity(l_component, $3); + current.container->abstract = $1; + } + component_parms nesc_attributes + { + handle_nescdecl_attributes($6, current.container); + } + '{' requires_or_provides_list '}' + imodule + { + declaration intfs = + declaration_chain(declaration_reverse($9), all_tasks); + set_nesc_parse_tree(new_component(pr, $2.location, $3, $6, $1, $5, intfs, $11)); + } + ; + +configuration: + generic CONFIGURATION idword + { + start_nesc_entity(l_component, $3); + current.container->abstract = $1; + current.container->configuration = TRUE; + } + component_parms nesc_attributes + { + handle_nescdecl_attributes($6, current.container); + } + '{' requires_or_provides_list '}' + { + set_nesc_ast(new_component(pr, $2.location, $3, $6, $1, $5, declaration_reverse($9), NULL)); + } + iconfiguration + { + set_nesc_impl($12); + } + ; + +binary_component: + COMPONENT idword + { + start_nesc_entity(l_component, $2); + } + nesc_attributes + { + handle_nescdecl_attributes($4, current.container); + } + '{' requires_or_provides_list '}' + { + binary_component dummy = new_binary_component(pr, $1.location, start_implementation()); + component c = new_component(pr, $1.location, $2, $4, FALSE, NULL, declaration_reverse($7), CAST(implementation, dummy)); + set_nesc_parse_tree(c); + } + ; + +generic: GENERIC { $$ = TRUE; } + | /* empty */ { $$ = FALSE; } + ; + +component_parms: + /* empty */ + { + if (current.container->abstract) + error("generic components require a parameter list"); + /* We don't create the extra environment level for this + generic component as nothing actually requires its + existence */ + $$ = NULL; + } + | '(' template_parms ')' + { + nesc_declaration comp = current.container; + + if (!comp->abstract) + error("only generic components can have a parameter list"); + comp->parameters = $2; + comp->parameter_env = current.env; + $$ = $2; + + /* generic components need a new level for the + specification */ + pushlevel(FALSE); + current.env->global_level = TRUE; + comp->env = current.env; + } + ; + +template_parms: + /* empty */ { $$ = NULL; } + | template_parmlist + ; + +template_parmlist: + template_parm + | template_parmlist ',' template_parm + { $$ = declaration_chain($1, $3); } + ; + +/* A declaration of a template parameter, i.e., a regular + parameter-like declaration (name required). + The 'typedef t' syntax for declaring a type argument is detected + inside declare_template_parameter */ +template_parm: + declspecs_ts xreferror after_type_declarator maybe_attribute + { $$ = declare_template_parameter($3, $1, $4); } + | declspecs_ts xreferror notype_declarator maybe_attribute + { $$ = declare_template_parameter($3, $1, $4); } + | declspecs_nots xreferror notype_declarator maybe_attribute + { $$ = declare_template_parameter($3, $1, $4); } + | declspecs_ts xreferror + { $$ = declare_template_parameter(NULL, $1, NULL); } + ; + +requires_or_provides_list: + requires_or_provides_list_ + { current.spec_section = spec_normal; } + ; + +requires_or_provides_list_: + requires_or_provides_list_ requires_or_provides + { $$ = declaration_chain($2, $1); } + | /* empty */ { $$ = NULL; } + ; + +requires_or_provides: + requires + | provides + | { current.spec_section = spec_normal; } just_datadef { $$ = $2; } + ; + +requires: + USES { current.spec_section = spec_uses; } + parameterised_interface_list + { $$ = CAST(declaration, new_rp_interface(pr, $1.location, TRUE, declaration_reverse($3))); } ; + +provides: + PROVIDES { current.spec_section = spec_provides; } + parameterised_interface_list + { $$ = CAST(declaration, new_rp_interface(pr, $1.location, FALSE, declaration_reverse($3))); } ; + +parameterised_interface_list: + parameterised_interface + | '{' parameterised_interfaces '}' { $$ = $2; } + ; + +parameterised_interfaces: + parameterised_interfaces parameterised_interface + { $$ = declaration_chain($2, $1); } + | parameterised_interface + ; + +parameterised_interface: + just_datadef + | interface_ref nesc_attributes ';' + { + declare_interface_ref($1, NULL, current.env, $2); + $$ = CAST(declaration, $1); + } + | interface_ref parameters nesc_attributes ';' + { + $1->gparms = $2; + poplevel(); + declare_interface_ref($1, $2, current.env, $3); + $$ = CAST(declaration, $1); + } + ; + +interface_ref: + interface_type + | interface_type AS idword { $$ = $1; $$->word2 = $3; } + ; + +interface_type: + INTERFACE idword + { + preload(l_interface, $1.location, $2->cstring.data); + $$ = new_interface_ref(pr, $1.location, $2, NULL, NULL, NULL, NULL, NULL); + } + | INTERFACE idword + { + preload(l_interface, $1.location, $2->cstring.data); + } + '<' typelist '>' + { $$ = new_interface_ref(pr, $1.location, $2, $5, NULL, NULL, NULL, NULL); } + ; + +typelist: + generic_type + | typelist ',' generic_type { $$ = expression_chain($1, $3); } + ; + +iconfiguration: + IMPLEMENTATION { $$ = start_implementation(); } + '{' + configuration_decls + '}' + { $$ = CAST(implementation, new_configuration(pr, $1.location, $2, declaration_reverse($4))); + } + ; + +cuses: COMPONENTS component_list ';' { $$ = $2; } + ; + +component_list: + component_list ',' component_ref { $$ = component_ref_chain($3, $1); } + | component_ref + ; + +component_ref: + component_ref2 { $$ = require_component($1, NULL); } + | component_ref2 AS idword { $$ = require_component($1, $3); } + ; + +component_ref2: + idword { $$ = new_component_ref(pr, $1->location, $1, NULL, + FALSE, NULL); } + | NEW idword '(' generic_args ')' + { $$ = new_component_ref(pr, $1.location, $2, NULL, + TRUE, $4); } + ; + +generic_args: + /* empty */ { $$ = NULL; } + | generic_arglist + ; + +generic_arglist: + generic_arg + | generic_arglist ',' generic_arg { $$ = expression_chain($1, $3); } + ; + +generic_arg: + expr_no_commas + { $$ = $1; $$->type = default_conversion_for_assignment($$); } + | generic_type + ; + +generic_type: + typename { $$ = make_type_argument($1); } + ; + +configuration_decls: + configuration_decls configuration_decl { $$ = declaration_chain($2, $1); } + | /* empty */ { $$ = NULL; } + ; + +configuration_decl: + connection { $$ = CAST(declaration, $1); } + | just_datadef + | cuses { $$ = CAST(declaration, $1); } + ; + +connection: + endpoint '=' endpoint ';' + { $$ = CAST(connection, new_eq_connection(pr, $2.location, $1, $3)); } + | endpoint POINTSAT endpoint ';' + { $$ = CAST(connection, new_rp_connection(pr, $2.location, $3, $1)); } + | endpoint TASTNIOP endpoint ';' + { $$ = CAST(connection, new_rp_connection(pr, $2.location, $1, $3)); } + ; + +endpoint: + endpoint '.' parameterised_identifier + { $$ = $1; + $$->ids = parameterised_identifier_chain($$->ids, $3); + } + | parameterised_identifier + { $$ = new_endpoint(parse_region, $1->location, $1); } + ; + +parameterised_identifier: + idword + { $$ = new_parameterised_identifier(pr, $1->location, $1, NULL); } + | idword '[' nonnull_exprlist ']' + { $$ = new_parameterised_identifier(pr, $1->location, $1, $3); } + ; + +imodule: IMPLEMENTATION { $$ = start_implementation(); all_tasks = NULL; } '{' extdefs '}' + { + $$ = CAST(implementation, new_module(pr, $1.location, $2, declaration_reverse($4))); + } ; + +/* the reason for the strange actions in this rule + is so that notype_initdecls when reached via datadef + can find a valid list of type and sc specs in $0. */ + +extdefs: + { $$ = NULL; } extdef { $$ = $2; } + | extdefs { $$ = NULL; } extdef + { $$ = declaration_chain($3, $1); } + ; + +extdef: + fndef + | datadef + | ASM_KEYWORD '(' expr ')' ';' + { + $$ = CAST(declaration, new_asm_decl + (pr, $1.location, + new_asm_stmt(pr, $1.location, $3, NULL, NULL, NULL, NULL))); } + | extension extdef + { $$ = make_extension_decl($1.i, $1.location, $2); } + ; + +datadef: + setspecs notype_initdecls ';' + { if (pedantic) + error("ANSI C forbids data definition with no type or storage class"); + else if (!flag_traditional) + warning("data definition has no type or storage class"); + + $$ = make_data_decl(NULL, $2); } + | just_datadef + ; + +just_datadef: + declspecs_nots setspecs notype_initdecls ';' + { $$ = make_data_decl($1, $3); } + | declspecs_ts setspecs initdecls ';' + { $$ = make_data_decl($1, $3); } + | declspecs setspecs ';' + { shadow_tag($1); + $$ = make_data_decl($1, NULL); } + | error ';' { $$ = make_error_decl(); } + | error '}' { $$ = make_error_decl(); } + | ';' + { if (pedantic) + pedwarn("ANSI C does not allow extra `;' outside of a function"); + $$ = NULL; } + | target_def + ; + +target_def: + TARGET_DEF identifier '=' expr ';' + { $$ = target->keilc_definition($1.location, $1.id, $2.id, $4); } + ; + +fndef: + declspecs_ts setspecs declarator fndef2 { $$ = $4; } + | declspecs_nots setspecs notype_declarator fndef2 { $$ = $4; } + | setspecs notype_declarator fndef2 { $$ = $3; } + ; + +fndef2: maybeasm maybe_attribute + { + /* maybeasm is only here to avoid a s/r conflict */ + refuse_asm($1); + + /* $0 refers to the declarator that precedes fndef2 + in fndef (we can't just save it in an action, as that + causes s/r and r/r conflicts) */ + if (!start_function(pstate.declspecs, $0, $2, 0)) + YYERROR1; + } + old_style_parm_decls + { store_parm_decls(declaration_reverse($4)); } + compstmt_or_error + { $$ = finish_function($6); + pop_declspec_stack(); } + ; + +identifier: + IDENTIFIER + | TYPENAME + ; + +id_label: + identifier { $$ = new_id_label(pr, $1.location, $1.id); } + ; + +idword: + identifier { $$ = new_word(pr, $1.location, $1.id); } + ; + +unop: '&' + { $$ = $1; $$.i = kind_address_of; } + | '-' + { $$ = $1; $$.i = kind_unary_minus; } + | '+' + { $$ = $1; $$.i = kind_unary_plus; } + | PLUSPLUS + { $$ = $1; $$.i = kind_preincrement; } + | MINUSMINUS + { $$ = $1; $$.i = kind_predecrement; } + | '~' + { $$ = $1; $$.i = kind_bitnot; } + | '!' + { $$ = $1; $$.i = kind_not; } + | REALPART + { $$ = $1; $$.i = kind_realpart; } + | IMAGPART + { $$ = $1; $$.i = kind_imagpart; } + ; + +expr: nonnull_exprlist + { if ($1->next) + $$ = make_comma($1->location, $1); + else + $$ = $1; } + ; + +exprlist: + /* empty */ + { $$ = NULL; } + | nonnull_exprlist + ; + +nonnull_exprlist: + nonnull_exprlist_ + { $$ = expression_reverse($1); } + ; + +nonnull_exprlist_: + expr_no_commas + { $$ = $1; } + | nonnull_exprlist_ ',' expr_no_commas + { $$ = expression_chain($3, $1); } + ; + +callkind: + CALL { $$.i = command_call; } + | SIGNAL { $$.i = event_signal; } + | POST { $$.i = post_task; } + ; + +unary_expr: + primary + | callkind function_call + { + function_call fc = CAST(function_call, $2); + type calltype = fc->arg1->type; + bool noerror = fc->type != error_type; + + $$ = $2; + fc->call_kind = $1.i; + switch ($1.i) + { + case command_call: + if (noerror && !type_command(calltype)) + error("only commands can be called"); + break; + case event_signal: + if (noerror && !type_event(calltype)) + error("only events can be signaled"); + break; + case post_task: + fc->type = unsigned_char_type; + if (noerror) + { + if (!type_task(calltype)) + error("only tasks can be posted"); + else if (flag_use_scheduler) + /* If requested, replace post/task by references to + an interface */ + handle_post(fc); + } + break; + } + } + | '*' cast_expr + { $$ = make_dereference($1.location, $2); } + /* __extension__ turns off -pedantic for following primary. */ + | extension cast_expr + { $$ = make_extension_expr($1.location, $2); + pedantic = $1.i; } + | unop cast_expr + { $$ = make_unary($1.location, $1.i, $2); +#if 0 + overflow_warning($$); +#endif + } + /* Refer to the address of a label as a pointer. */ + | ANDAND id_label + { + $$ = CAST(expression, make_label_address($1.location, $2)); + use_label($2); + } + | sizeof unary_expr + { +#if 0 + if (TREE_CODE ($2) == COMPONENT_REF + && DECL_C_BIT_FIELD (TREE_OPERAND ($2, 1))) + error("`sizeof' applied to a bit-field"); + $$ = c_sizeof (TREE_TYPE ($2)); +#endif + $$ = make_sizeof_expr($1.location, $2); + pstate.unevaluated_expression--; } + | sizeof '(' typename ')' + { $$ = make_sizeof_type($1.location, $3); + pstate.unevaluated_expression--; } + | alignof unary_expr + { $$ = make_alignof_expr($1.location, $2); + pstate.unevaluated_expression--; } + | alignof '(' typename ')' + { $$ = make_alignof_type($1.location, $3); + pstate.unevaluated_expression--; } + ; + +sizeof: + SIZEOF { pstate.unevaluated_expression++; $$ = $1; } + ; + +alignof: + ALIGNOF { pstate.unevaluated_expression++; $$ = $1; } + ; + +cast_expr: + unary_expr + | '(' typename ')' cast_expr + { $$ = make_cast($1.location, $2, $4); } + | '(' typename ')' '{' + { + start_init(NULL, NULL); + really_start_incremental_init($2->type); + } + initlist_maybe_comma '}' + { + expression constructor = make_init_list($4.location, $6); + + finish_init(); + + if (pedantic) + pedwarn("ANSI C forbids constructor expressions"); + + $$ = make_cast_list($1.location, $2, constructor); + } + ; + +expr_no_commas: + cast_expr + | expr_no_commas '+' expr_no_commas + { $$ = make_binary($2.location, kind_plus, $1, $3); } + | expr_no_commas '-' expr_no_commas + { $$ = make_binary($2.location, kind_minus, $1, $3); } + | expr_no_commas '*' expr_no_commas + { $$ = make_binary($2.location, kind_times, $1, $3); } + | expr_no_commas '/' expr_no_commas + { $$ = make_binary($2.location, kind_divide, $1, $3); } + | expr_no_commas '%' expr_no_commas + { $$ = make_binary($2.location, kind_modulo, $1, $3); } + | expr_no_commas LSHIFT expr_no_commas + { $$ = make_binary($2.location, kind_lshift, $1, $3); } + | expr_no_commas RSHIFT expr_no_commas + { $$ = make_binary($2.location, kind_rshift, $1, $3); } + | expr_no_commas ARITHCOMPARE expr_no_commas + { $$ = make_binary($2.location, $2.i, $1, $3); } + | expr_no_commas '<' expr_no_commas + { $$ = make_binary($2.location, kind_lt, $1, $3); } + | expr_no_commas '>' expr_no_commas + { $$ = make_binary($2.location, kind_gt, $1, $3); } + | expr_no_commas EQCOMPARE expr_no_commas + { $$ = make_binary($2.location, $2.i, $1, $3); } + | expr_no_commas '&' expr_no_commas + { $$ = make_binary($2.location, kind_bitand, $1, $3); } + | expr_no_commas '|' expr_no_commas + { $$ = make_binary($2.location, kind_bitor, $1, $3); } + | expr_no_commas '^' expr_no_commas + { $$ = make_binary($2.location, kind_bitxor, $1, $3); } + | expr_no_commas ANDAND expr_no_commas + { $$ = make_binary($2.location, kind_andand, $1, $3); } + | expr_no_commas OROR expr_no_commas + { $$ = make_binary($2.location, kind_oror, $1, $3); } + | expr_no_commas '?' expr ':' expr_no_commas + { $$ = make_conditional($2.location, $1, $3, $5); } + | expr_no_commas '?' + { if (pedantic) + pedwarn("ANSI C forbids omitting the middle term of a ?: expression"); + } + ':' expr_no_commas + { $$ = make_conditional($2.location, $1, NULL, $5); } + | expr_no_commas '=' expr_no_commas + { $$ = make_assign($2.location, kind_assign, $1, $3); } + | expr_no_commas ASSIGN expr_no_commas + { $$ = make_assign($2.location, $2.i, $1, $3); } + ; + +primary: + IDENTIFIER + { + if (yychar == YYEMPTY) + yychar = YYLEX; + $$ = make_identifier($1.location, $1.id, yychar == '('); + } + | CONSTANT { $$ = CAST(expression, $1); } + | string { $$ = $1; } + | '(' expr ')' + { $$ = $2; $$->parens = TRUE; } + | '(' error ')' + { $$ = make_error_expr(); } + | '(' + { if (current.function_decl == 0) + { + error("braced-group within expression allowed only inside a function"); + YYERROR; + } + push_label_level(); + } + compstmt ')' + { + pop_label_level(); + if (pedantic) + pedwarn("ANSI C forbids braced-groups within expressions"); + $$ = make_compound_expr($1.location, $3); + } + | function_call + { + /* Magic functions may rewrite this to something else */ + if (is_function_call($1)) + { + function_call fc = CAST(function_call, $1); + type calltype = fc->arg1->type; + + if (type_command(calltype)) + error("commands must be called with call"); + else if (type_event(calltype)) + error("events must be signaled with signal"); + else if (type_task(calltype)) + error("tasks must be posted with post"); + } + + $$ = $1; + } + | VA_ARG '(' expr_no_commas ',' typename ')' + { $$ = make_va_arg($1.location, $3, $5); } + | OFFSETOF '(' typename ',' fieldlist ')' + { $$ = make_offsetof($1.location, $3, $5); } + | primary '[' nonnull_exprlist ']' + { $$ = make_array_ref($2.location, $1, $3); } + | primary '.' identifier + { $$ = make_field_ref($2.location, $1, $3.id); } + | primary POINTSAT identifier + { $$ = make_field_ref($2.location, make_dereference($2.location, $1), + $3.id); } + | primary PLUSPLUS + { $$ = make_postincrement($2.location, $1); } + | primary MINUSMINUS + { $$ = make_postdecrement($2.location, $1); } + ; + +fieldlist: + identifier { $$ = dd_new_list(pr); dd_add_last(pr, $$, $1.id.data); } + | fieldlist '.' identifier { $$ = $1; dd_add_last(pr, $$, $3.id.data); } + ; + +function_call: + primary '(' exprlist ')' + { $$ = make_function_call($2.location, $1, $3); } + ; + +string: STRING { $$ = CAST(expression, $1); } + | MAGIC_STRING { $$ = make_identifier($1.location, $1.id, FALSE); } + ; + +old_style_parm_decls: + /* empty */ { $$ = NULL; } + | datadecls + | datadecls ELLIPSIS + /* ... is used here to indicate a varargs function. */ + { if (pedantic) + pedwarn("ANSI C does not permit use of `varargs.h'"); + $$ = declaration_chain(CAST(declaration, new_ellipsis_decl(pr, $2.location)), $1); + } + ; + +/* The following are analogous to decls and decl + except that they do not allow nested functions. + They are used for old-style parm decls. */ +datadecls: + datadecl + | datadecls datadecl { $$ = declaration_chain($2, $1); } + ; + +/* We don't allow prefix attributes here because they cause reduce/reduce + conflicts: we can't know whether we're parsing a function decl with + attribute suffix, or function defn with attribute prefix on first old + style parm. */ +datadecl: + declspecs_ts_nosa setspecs initdecls ';' + { $$ = make_data_decl($1, $3); } + | declspecs_nots_nosa setspecs notype_initdecls ';' + { $$ = make_data_decl($1, $3); } + | declspecs_ts_nosa setspecs ';' + { shadow_tag_warned($1, 1); + $$ = make_data_decl($1, NULL); + pedwarn("empty declaration"); } + | declspecs_nots_nosa ';' + { pedwarn("empty declaration"); + $$ = NULL; } + ; + +/* This combination which saves a lineno before a decl + is the normal thing to use, rather than decl itself. + This is to avoid shift/reduce conflicts in contexts + where statement labels are allowed. */ +decls: + decl + | errstmt { $$ = make_error_decl(); } + | decls decl { $$ = declaration_chain($2, $1); } + | decl errstmt { $$ = make_error_decl(); } + ; + +/* records the type and storage class specs to use for processing + the declarators that follow. + Maintains a stack of outer-level values of pstate.declspecs, + for the sake of parm declarations nested in function declarators. */ +setspecs: /* empty */ + { + push_declspec_stack(); + pending_xref_error(); + pstate.declspecs = $0; + pstate.attributes = NULL; + } + ; + +/* Possibly attributes after a comma, which should be saved in + pstate.attributes */ +maybe_resetattrs: + maybe_attribute + { pstate.attributes = $1; } + ; + +decl: + declspecs_ts setspecs initdecls ';' + { $$ = make_data_decl($1, $3); } + | declspecs_nots setspecs notype_initdecls ';' + { $$ = make_data_decl($1, $3); } + | declspecs_ts setspecs nested_function + { $$ = $3; + pop_declspec_stack(); } + | declspecs_nots setspecs notype_nested_function + { $$ = $3; + pop_declspec_stack(); } + | declspecs setspecs ';' + { shadow_tag($1); + $$ = make_data_decl($1, NULL); } + | extension decl + { $$ = make_extension_decl($1.i, $1.location, $2); } + ; + +/* declspecs borrowed from gcc 3. I think it's really ugly, but I guess + they (and therefore I) am stuck with this brokenness. + The only redeeming feature is that it's cleaner than gcc 2 +*/ +/* A list of declaration specifiers. These are: + + - Storage class specifiers (SCSPEC), which for GCC currently include + function specifiers ("inline"). + + - Type specifiers (type_spec_*). + + - Type qualifiers (TYPE_QUAL). + + - Attribute specifier lists (attributes). + + These are stored as a TREE_LIST; the head of the list is the last + item in the specifier list. Each entry in the list has either a + TREE_PURPOSE that is an attribute specifier list, or a TREE_VALUE that + is a single other specifier or qualifier; and a TREE_CHAIN that is the + rest of the list. TREE_STATIC is set on the list if something other + than a storage class specifier or attribute has been seen; this is used + to warn for the obsolescent usage of storage class specifiers other than + at the start of the list. (Doing this properly would require function + specifiers to be handled separately from storage class specifiers.) + + The various cases below are classified according to: + + (a) Whether a storage class specifier is included or not; some + places in the grammar disallow storage class specifiers (_sc or _nosc). + + (b) Whether a type specifier has been seen; after a type specifier, + a typedef name is an identifier to redeclare (_ts or _nots). + + (c) Whether the list starts with an attribute; in certain places, + the grammar requires specifiers that don't start with an attribute + (_sa or _nosa). + + (d) Whether the list ends with an attribute (or a specifier such that + any following attribute would have been parsed as part of that specifier); + this avoids shift-reduce conflicts in the parsing of attributes + (_ea or _noea). + + TODO: + + (i) Distinguish between function specifiers and storage class specifiers, + at least for the purpose of warnings about obsolescent usage. + + (ii) Halve the number of productions here by eliminating the _sc/_nosc + distinction and instead checking where required that storage class + specifiers aren't present. */ + +declspecs_nosc_nots_nosa_noea: + type_qual + | declspecs_nosc_nots_nosa_noea type_qual + { $$ = type_element_chain($1, $2); } + | declspecs_nosc_nots_nosa_ea type_qual + { $$ = type_element_chain($1, $2); } + ; + +declspecs_nosc_nots_nosa_ea: + declspecs_nosc_nots_nosa_noea eattributes + { $$ = type_element_chain($1, $2); } + ; + +declspecs_nosc_nots_sa_noea: + declspecs_nosc_nots_sa_noea type_qual + { $$ = type_element_chain($1, $2); } + | declspecs_nosc_nots_sa_ea type_qual + { $$ = type_element_chain($1, $2); } + ; + +declspecs_nosc_nots_sa_ea: + eattributes + | declspecs_nosc_nots_sa_noea eattributes + ; + +declspecs_nosc_ts_nosa_noea: + type_spec_nonattr + | declspecs_nosc_ts_nosa_noea type_qual + { $$ = type_element_chain($1, $2); } + | declspecs_nosc_ts_nosa_ea type_qual + { $$ = type_element_chain($1, $2); } + | declspecs_nosc_ts_nosa_noea type_spec_reserved_nonattr + { $$ = type_element_chain($1, $2); } + | declspecs_nosc_ts_nosa_ea type_spec_reserved_nonattr + { $$ = type_element_chain($1, $2); } + | declspecs_nosc_nots_nosa_noea type_spec_nonattr + { $$ = type_element_chain($1, $2); } + | declspecs_nosc_nots_nosa_ea type_spec_nonattr + { $$ = type_element_chain($1, $2); } + ; + +declspecs_nosc_ts_nosa_ea: + type_spec_attr + | declspecs_nosc_ts_nosa_noea eattributes + { $$ = type_element_chain($1, $2); } + | declspecs_nosc_ts_nosa_noea type_spec_reserved_attr + { $$ = type_element_chain($1, $2); } + | declspecs_nosc_ts_nosa_ea type_spec_reserved_attr + { $$ = type_element_chain($1, $2); } + | declspecs_nosc_nots_nosa_noea type_spec_attr + { $$ = type_element_chain($1, $2); } + | declspecs_nosc_nots_nosa_ea type_spec_attr + { $$ = type_element_chain($1, $2); } + ; + +declspecs_nosc_ts_sa_noea: + declspecs_nosc_ts_sa_noea type_qual + { $$ = type_element_chain($1, $2); } + | declspecs_nosc_ts_sa_ea type_qual + { $$ = type_element_chain($1, $2); } + | declspecs_nosc_ts_sa_noea type_spec_reserved_nonattr + { $$ = type_element_chain($1, $2); } + | declspecs_nosc_ts_sa_ea type_spec_reserved_nonattr + { $$ = type_element_chain($1, $2); } + | declspecs_nosc_nots_sa_noea type_spec_nonattr + { $$ = type_element_chain($1, $2); } + | declspecs_nosc_nots_sa_ea type_spec_nonattr + { $$ = type_element_chain($1, $2); } + ; + +declspecs_nosc_ts_sa_ea: + declspecs_nosc_ts_sa_noea eattributes + { $$ = type_element_chain($1, $2); } + | declspecs_nosc_ts_sa_noea type_spec_reserved_attr + { $$ = type_element_chain($1, $2); } + | declspecs_nosc_ts_sa_ea type_spec_reserved_attr + { $$ = type_element_chain($1, $2); } + | declspecs_nosc_nots_sa_noea type_spec_attr + { $$ = type_element_chain($1, $2); } + | declspecs_nosc_nots_sa_ea type_spec_attr + { $$ = type_element_chain($1, $2); } + ; + +declspecs_sc_nots_nosa_noea: + scspec + | declspecs_sc_nots_nosa_noea type_qual + { $$ = type_element_chain($1, $2); } + | declspecs_sc_nots_nosa_ea type_qual + { $$ = type_element_chain($1, $2); } + | declspecs_nosc_nots_nosa_noea scspec + { $$ = type_element_chain($1, $2); } + | declspecs_nosc_nots_nosa_ea scspec + { $$ = type_element_chain($1, $2); } + | declspecs_sc_nots_nosa_noea scspec + { $$ = type_element_chain($1, $2); } + | declspecs_sc_nots_nosa_ea scspec + { $$ = type_element_chain($1, $2); } + ; + +declspecs_sc_nots_nosa_ea: + declspecs_sc_nots_nosa_noea eattributes + { $$ = type_element_chain($1, $2); } + ; + +declspecs_sc_nots_sa_noea: + declspecs_sc_nots_sa_noea type_qual + { $$ = type_element_chain($1, $2); } + | declspecs_sc_nots_sa_ea type_qual + { $$ = type_element_chain($1, $2); } + | declspecs_nosc_nots_sa_noea scspec + { $$ = type_element_chain($1, $2); } + | declspecs_nosc_nots_sa_ea scspec + { $$ = type_element_chain($1, $2); } + | declspecs_sc_nots_sa_noea scspec + { $$ = type_element_chain($1, $2); } + | declspecs_sc_nots_sa_ea scspec + { $$ = type_element_chain($1, $2); } + ; + +declspecs_sc_nots_sa_ea: + declspecs_sc_nots_sa_noea eattributes + { $$ = type_element_chain($1, $2); } + ; + +declspecs_sc_ts_nosa_noea: + declspecs_sc_ts_nosa_noea type_qual + { $$ = type_element_chain($1, $2); } + | declspecs_sc_ts_nosa_ea type_qual + { $$ = type_element_chain($1, $2); } + | declspecs_sc_ts_nosa_noea type_spec_reserved_nonattr + { $$ = type_element_chain($1, $2); } + | declspecs_sc_ts_nosa_ea type_spec_reserved_nonattr + { $$ = type_element_chain($1, $2); } + | declspecs_sc_nots_nosa_noea type_spec_nonattr + { $$ = type_element_chain($1, $2); } + | declspecs_sc_nots_nosa_ea type_spec_nonattr + { $$ = type_element_chain($1, $2); } + | declspecs_nosc_ts_nosa_noea scspec + { $$ = type_element_chain($1, $2); } + | declspecs_nosc_ts_nosa_ea scspec + { $$ = type_element_chain($1, $2); } + | declspecs_sc_ts_nosa_noea scspec + { $$ = type_element_chain($1, $2); } + | declspecs_sc_ts_nosa_ea scspec + { $$ = type_element_chain($1, $2); } + ; + +declspecs_sc_ts_nosa_ea: + declspecs_sc_ts_nosa_noea eattributes + { $$ = type_element_chain($1, $2); } + | declspecs_sc_ts_nosa_noea type_spec_reserved_attr + { $$ = type_element_chain($1, $2); } + | declspecs_sc_ts_nosa_ea type_spec_reserved_attr + { $$ = type_element_chain($1, $2); } + | declspecs_sc_nots_nosa_noea type_spec_attr + { $$ = type_element_chain($1, $2); } + | declspecs_sc_nots_nosa_ea type_spec_attr + { $$ = type_element_chain($1, $2); } + ; + +declspecs_sc_ts_sa_noea: + declspecs_sc_ts_sa_noea type_qual + { $$ = type_element_chain($1, $2); } + | declspecs_sc_ts_sa_ea type_qual + { $$ = type_element_chain($1, $2); } + | declspecs_sc_ts_sa_noea type_spec_reserved_nonattr + { $$ = type_element_chain($1, $2); } + | declspecs_sc_ts_sa_ea type_spec_reserved_nonattr + { $$ = type_element_chain($1, $2); } + | declspecs_sc_nots_sa_noea type_spec_nonattr + { $$ = type_element_chain($1, $2); } + | declspecs_sc_nots_sa_ea type_spec_nonattr + { $$ = type_element_chain($1, $2); } + | declspecs_nosc_ts_sa_noea scspec + { $$ = type_element_chain($1, $2); } + | declspecs_nosc_ts_sa_ea scspec + { $$ = type_element_chain($1, $2); } + | declspecs_sc_ts_sa_noea scspec + { $$ = type_element_chain($1, $2); } + | declspecs_sc_ts_sa_ea scspec + { $$ = type_element_chain($1, $2); } + ; + +declspecs_sc_ts_sa_ea: + declspecs_sc_ts_sa_noea eattributes + { $$ = type_element_chain($1, $2); } + | declspecs_sc_ts_sa_noea type_spec_reserved_attr + { $$ = type_element_chain($1, $2); } + | declspecs_sc_ts_sa_ea type_spec_reserved_attr + { $$ = type_element_chain($1, $2); } + | declspecs_sc_nots_sa_noea type_spec_attr + { $$ = type_element_chain($1, $2); } + | declspecs_sc_nots_sa_ea type_spec_attr + { $$ = type_element_chain($1, $2); } + ; + +/* Particular useful classes of declspecs. */ +declspecs_ts: + declspecs_nosc_ts_nosa_noea + | declspecs_nosc_ts_nosa_ea + | declspecs_nosc_ts_sa_noea + | declspecs_nosc_ts_sa_ea + | declspecs_sc_ts_nosa_noea + | declspecs_sc_ts_nosa_ea + | declspecs_sc_ts_sa_noea + | declspecs_sc_ts_sa_ea + ; + +declspecs_nots: + declspecs_nosc_nots_nosa_noea + | declspecs_nosc_nots_nosa_ea + | declspecs_nosc_nots_sa_noea + | declspecs_nosc_nots_sa_ea + | declspecs_sc_nots_nosa_noea + | declspecs_sc_nots_nosa_ea + | declspecs_sc_nots_sa_noea + | declspecs_sc_nots_sa_ea + ; + +declspecs_ts_nosa: + declspecs_nosc_ts_nosa_noea + | declspecs_nosc_ts_nosa_ea + | declspecs_sc_ts_nosa_noea + | declspecs_sc_ts_nosa_ea + ; + +declspecs_nots_nosa: + declspecs_nosc_nots_nosa_noea + | declspecs_nosc_nots_nosa_ea + | declspecs_sc_nots_nosa_noea + | declspecs_sc_nots_nosa_ea + ; + +declspecs_nosc_ts: + declspecs_nosc_ts_nosa_noea + | declspecs_nosc_ts_nosa_ea + | declspecs_nosc_ts_sa_noea + | declspecs_nosc_ts_sa_ea + ; + +declspecs_nosc_nots: + declspecs_nosc_nots_nosa_noea + | declspecs_nosc_nots_nosa_ea + | declspecs_nosc_nots_sa_noea + | declspecs_nosc_nots_sa_ea + ; + +declspecs_nosc: + declspecs_nosc_ts + | declspecs_nosc_nots + ; + +declspecs: + declspecs_ts + | declspecs_nots + ; + +/* A (possibly empty) sequence of type qualifiers and attributes. */ +maybe_type_quals_attrs: + /* empty */ + { $$ = NULL; } + | declspecs_nosc_nots + ; + +/* A type specifier (but not a type qualifier). + Once we have seen one of these in a declaration, + if a typedef name appears then it is being redeclared. + + The _reserved versions start with a reserved word and may appear anywhere + in the declaration specifiers; the _nonreserved versions may only + appear before any other type specifiers, and after that are (if names) + being redeclared. + + FIXME: should the _nonreserved version be restricted to names being + redeclared only? The other entries there relate only the GNU extensions + and Objective C, and are historically parsed thus, and don't make sense + after other type specifiers, but it might be cleaner to count them as + _reserved. + + _attr means: specifiers that either end with attributes, + or are such that any following attributes would + be parsed as part of the specifier. + + _nonattr: specifiers. */ + +type_spec_nonattr: + type_spec_reserved_nonattr + | type_spec_nonreserved_nonattr + ; + +type_spec_attr: + type_spec_reserved_attr + ; + +type_spec_reserved_nonattr: + type_spec + | structuse + ; + +type_spec_reserved_attr: + structdef + ; + +type_spec_nonreserved_nonattr: + TYPENAME + { /* For a typedef name, record the meaning, not the name. + In case of `foo foo, bar;'. */ + $$ = CAST(type_element, new_typename(pr, $1.location, $1.decl)); } + | COMPONENTREF '.' identifier + { + /* reference to a typedef from a component. */ + $$ = CAST(type_element, new_component_typeref(pr, $1.location, $3.decl, $1.id)); + } + | TYPEOF '(' expr ')' + { $$ = CAST(type_element, new_typeof_expr(pr, $1.location, $3)); } + | TYPEOF '(' typename ')' + { $$ = CAST(type_element, new_typeof_type(pr, $1.location, $3)); } + ; +/* type_spec_nonreserved_attr does not exist. */ + +initdecls: + initdecls_ { $$ = declaration_reverse($1); } + ; + +notype_initdecls: + notype_initdecls_ { $$ = declaration_reverse($1); } + ; + +initdecls_: + initdcl + | initdecls_ ',' maybe_resetattrs initdcl + { $$ = declaration_chain($4, $1); } + ; + +notype_initdecls_: + notype_initdcl { $$ = $1; } + | notype_initdecls_ ',' maybe_resetattrs initdcl + { $$ = declaration_chain($4, $1); } + ; + +maybeasm: + /* empty */ + { $$ = NULL; } + | ASM_KEYWORD '(' STRING ')' + { $$ = new_asm_stmt(pr, $1.location, CAST(expression, $3), + NULL, NULL, NULL, NULL); } + ; + +initdcl: + declarator maybeasm maybe_attribute '=' + { $$ = start_decl($1, $2, pstate.declspecs, 1, + prefix_attr($3)); + start_init($$, NULL); } + init +/* Note how the declaration of the variable is in effect while its init is parsed! */ + { finish_init(); + $$ = finish_decl($5, $6); } + | declarator maybeasm maybe_attribute + { declaration d = start_decl($1, $2, pstate.declspecs, 0, + prefix_attr($3)); + $$ = finish_decl(d, NULL); } + ; + +notype_initdcl: + notype_declarator maybeasm maybe_attribute '=' + { $$ = start_decl($1, $2, pstate.declspecs, 1, + prefix_attr($3)); + start_init($$, NULL); } + init +/* Note how the declaration of the variable is in effect while its init is parsed! */ + { finish_init(); + $$ = finish_decl($5, $6); } + | notype_declarator maybeasm maybe_attribute + { declaration d = start_decl($1, $2, pstate.declspecs, 0, + prefix_attr($3)); + $$ = finish_decl(d, NULL); } + ; + +maybe_attribute: + /* empty */ + { $$ = NULL; } + | attributes + { $$ = attribute_reverse($1); } + ; + +eattributes: + attributes { $$ = CAST(type_element, $1); } + ; + +nesc_attributes: + /* empty */ { $$ = NULL; } + | nesc_attributes nattrib + { $$ = attribute_chain($2, $1); } + ; + +attributes: + attribute + { $$ = $1; } + | attributes attribute + { $$ = attribute_chain($2, $1); } + ; + +attribute: + ATTRIBUTE '(' '(' attribute_list ')' ')' + { $$ = $4; } + | target_attribute { $$ = CAST(attribute, $1); } + | nattrib + ; + +target_attribute: + TARGET_ATTRIBUTE0 + { word w = new_word(pr, $1.location, $1.id); + $$ = new_gcc_attribute(pr, $1.location, w, NULL); } + | TARGET_ATTRIBUTE1 restricted_expr + { word w = new_word(pr, $1.location, $1.id); + $$ = new_gcc_attribute(pr, $1.location, w, $2); } + | '@' restricted_expr + { word w = new_word(pr, $2->location, str2cstring(pr, "iar_at")); + $$ = new_gcc_attribute(pr, $2->location, w, $2); } + ; + +restricted_expr: + CONSTANT { $$ = CAST(expression, $1); } + | string { $$ = $1; } + | '(' expr ')' { $$ = $2; } + ; + +attribute_list: + attrib + { $$ = CAST(attribute, $1); } + | attribute_list ',' attrib + { $$ = attribute_chain($1, CAST(attribute, $3)); } + ; + +attrib: + /* empty */ + { $$ = NULL; } + | any_word + { $$ = new_gcc_attribute(pr, $1->location, $1, NULL); } + | any_word '(' IDENTIFIER ')' + { $$ = new_gcc_attribute + (pr, $1->location, $1, make_attr_args($3.location, $3.id, NULL)); } + | any_word '(' IDENTIFIER ',' nonnull_exprlist ')' + { $$ = new_gcc_attribute + (pr, $2.location, $1, make_attr_args($3.location, $3.id, $5)); + } + | any_word '(' exprlist ')' + { $$ = new_gcc_attribute(pr, $2.location, $1, $3); + } + ; + +nattrib: + '@' nastart '(' initlist_maybe_comma ')' + { $$ = finish_attribute_use($2, $4); } + | '@' nastart error ')' + { $$ = finish_attribute_use($2, make_error_expr()); } + ; + +nastart: + idword + { $$ = start_attribute_use($1); } + ; + +/* This still leaves out most reserved keywords, + shouldn't we include them? */ + +any_word: + idword + | scspec + { $$ = make_cword($1->location, rid_name(CAST(rid, $1))); } + | type_spec + { $$ = make_cword($1->location, rid_name(CAST(rid, $1))); } + | type_qual + { $$ = make_cword($1->location, qualifier_name(CAST(qualifier, $1)->id)); } + | SIGNAL + { $$ = make_cword($1.location, "signal"); } + ; + +/* Initializers. `init' is the entry point. */ + +init: + expr_no_commas { $$ = $1; simple_init($$); } + | '{' + { really_start_incremental_init(NULL); } + initlist_maybe_comma '}' + { $$ = make_init_list($1.location, $3); } + | error + { $$ = make_error_expr(); } + ; + +/* `initlist_maybe_comma' is the guts of an initializer in braces. */ +initlist_maybe_comma: + /* empty */ + { if (pedantic) + pedwarn("ANSI C forbids empty initializer braces"); + $$ = NULL; } + | initlist1 maybecomma { $$ = expression_reverse($1); } + ; + +initlist1: + initelt + | initlist1 ',' initelt { $$ = expression_chain($3, $1); } + ; + +/* `initelt' is a single element of an initializer. + It may use braces. */ +initelt: + designator_list '=' initval + { if (pedantic) + pedwarn("ANSI C forbids specifying subobject to initialize"); + $$ = make_init_specific($1, $3); } + | designator initval + { if (pedantic) + pedwarn("obsolete use of designated initializer without `='"); + $$ = make_init_specific($1, $2); } + | identifier ':' + { $$ = set_init_label($1.location, $1.id); + if (pedantic) + pedwarn("obsolete use of designated initializer with `:'"); } + initval + { $$ = make_init_specific($3, $4); } + | initval + ; + +initval: + '{' + { push_init_level (0); } + initlist_maybe_comma '}' + { $$ = make_init_list($1.location, $3); + process_init_element(NULL); } + | expr_no_commas + { process_init_element($1); $$ = $1; } + | error { $$ = make_error_expr(); } + ; + +designator_list: + designator + | designator_list designator { $$ = designator_chain($1, $2); } + ; + +designator: + '.' identifier + { $$ = set_init_label($2.location, $2.id); } + /* These are for labeled elements. The syntax for an array element + initializer conflicts with the syntax for an Objective-C message, + so don't include these productions in the Objective-C grammar. */ + | '[' expr_no_commas ELLIPSIS expr_no_commas ']' + { $$ = set_init_index($1.location, $2, $4); + if (pedantic) + pedwarn ("ISO C forbids specifying range of elements to initialize"); } + | '[' expr_no_commas ']' + { $$ = set_init_index($1.location, $2, NULL); } + ; + +nested_function: + declarator maybeasm maybe_attribute + { + /* maybeasm is only here to avoid a s/r conflict */ + refuse_asm($2); + + if (!start_function(pstate.declspecs, $1, $3, 1)) + { + YYERROR1; + } + } + old_style_parm_decls + { store_parm_decls(declaration_reverse($3)); } +/* This used to use compstmt_or_error. + That caused a bug with input `f(g) int g {}', + where the use of YYERROR1 above caused an error + which then was handled by compstmt_or_error. + There followed a repeated execution of that same rule, + which called YYERROR1 again, and so on. */ + compstmt + { $$ = finish_function($7); } + ; + +notype_nested_function: + notype_declarator maybeasm maybe_attribute + { + /* maybeasm is only here to avoid a s/r conflict */ + refuse_asm($2); + + if (!start_function(pstate.declspecs, $1, $3, 1)) + { + YYERROR1; + } + } + old_style_parm_decls + { store_parm_decls(declaration_reverse($3)); } +/* This used to use compstmt_or_error. + That caused a bug with input `f(g) int g {}', + where the use of YYERROR1 above caused an error + which then was handled by compstmt_or_error. + There followed a repeated execution of that same rule, + which called YYERROR1 again, and so on. */ + compstmt + { $$ = finish_function($7); } + ; + +/* Any kind of declarator (thus, all declarators allowed + after an explicit type_spec). */ + +declarator: + after_type_declarator + | notype_declarator + ; + +/* A declarator that is allowed only after an explicit type_spec. */ + +after_type_declarator: + after_type_declarator array_or_fn_declarator + { $$ = finish_array_or_fn_declarator($1, $2); } + | '*' maybe_type_quals_attrs after_type_declarator + { $$ = make_pointer_declarator($1.location, $3, $2); } + | '(' maybe_attribute after_type_declarator ')' + { $$ = make_qualified_declarator($1.location, $3, CAST(type_element, $2)); } + | TYPENAME { $$ = make_identifier_declarator($1.location, $1.id); } + | TYPENAME '.' identifier + { + $$ = make_interface_ref_declarator($1.location, $1.id, $3.id); + } + ; + +/* Kinds of declarator that can appear in a parameter list + in addition to notype_declarator. This is like after_type_declarator + but does not allow a typedef name in parentheses as an identifier + (because it would conflict with a function with that typedef as arg). */ +parm_declarator: + parm_declarator array_or_fn_declarator + { $$ = finish_array_or_fn_declarator($1, $2); } + | '*' maybe_type_quals_attrs parm_declarator + { $$ = make_pointer_declarator($1.location, $3, $2); } + | TYPENAME + { $$ = make_identifier_declarator($1.location, $1.id); } + ; + + +/* A declarator allowed whether or not there has been + an explicit type_spec. These cannot redeclare a typedef-name. */ + +notype_declarator: + notype_declarator array_or_fn_declarator + { $$ = finish_array_or_fn_declarator($1, $2); } + | '*' maybe_type_quals_attrs notype_declarator + { $$ = make_pointer_declarator($1.location, $3, $2); } + | '(' maybe_attribute notype_declarator ')' + { $$ = make_qualified_declarator($1.location, $3, CAST(type_element, $2)); } + | IDENTIFIER + { $$ = make_identifier_declarator($1.location, $1.id); } + | IDENTIFIER '.' identifier + { + $$ = make_interface_ref_declarator($1.location, $1.id, $3.id); + } + ; + +tag: + identifier { $$ = new_word(pr, $1.location, $1.id); } + ; + +structuse: + structkind tag nesc_attributes + { $$ = xref_tag($1.location, $1.i, $2); + if ($3) warning("attributes ignored"); } + | ENUM tag nesc_attributes + { $$ = xref_tag($1.location, kind_enum_ref, $2); + if ($3) warning("attributes ignored"); } + ; + +structdef: + structkind tag nesc_attributes '{' + { $$ = start_struct($1.location, $1.i, $2); + /* Start scope of tag before parsing components. */ + } + component_decl_list '}' maybe_attribute + { $$ = finish_struct($5, $6, attribute_chain($3, $8)); } + | STRUCT '@' tag nesc_attributes '{' + { $$ = start_struct($1.location, kind_attribute_ref, $3); + /* Start scope of tag before parsing components. */ + } + component_decl_list '}' maybe_attribute + { $$ = finish_struct($6, $7, attribute_chain($4, $9)); } + | structkind '{' component_decl_list '}' maybe_attribute + { $$ = finish_struct(start_struct($1.location, $1.i, + NULL), $3, $5); + } + | ENUM tag nesc_attributes '{' + { $$ = start_enum($1.location, $2); } + enumlist maybecomma_warn '}' maybe_attribute + { $$ = finish_enum($5, declaration_reverse($6), attribute_chain($3, $9)); } + | ENUM '{' + { $$ = start_enum($1.location, NULL); } + enumlist maybecomma_warn '}' maybe_attribute + { $$ = finish_enum($3, declaration_reverse($4), $7); } + ; + +structkind: + STRUCT { $$ = $1; $$.i = kind_struct_ref; } + | UNION { $$ = $1; $$.i = kind_union_ref; } + | NX_STRUCT { $$ = $1; $$.i = kind_nx_struct_ref; } + | NX_UNION { $$ = $1; $$.i = kind_nx_union_ref; } + ; + +maybecomma: + /* empty */ + | ',' + ; + +maybecomma_warn: + /* empty */ + | ',' + { if (pedantic) pedwarn("comma at end of enumerator list"); } + ; + +component_decl_list: + component_decl_list2 + { $$ = declaration_reverse($1); } + | component_decl_list2 component_decl + { $$ = declaration_reverse(declaration_chain($2, $1)); + pedwarn("no semicolon at end of struct or union"); } + ; + +component_decl_list2: + /* empty */ + { $$ = NULL; } + | component_decl_list2 component_decl ';' + { $$ = declaration_chain($2, $1); } + | component_decl_list2 ';' + { if (pedantic) + pedwarn("extra semicolon in struct or union specified"); + $$ = $1; } + ; + +/* There is a shift-reduce conflict here, because `components' may + start with a `typename'. It happens that shifting (the default resolution) + does the right thing, because it treats the `typename' as part of + a `typed_type_specs'. + + It is possible that this same technique would allow the distinction + between `notype_initdecls' and `initdecls' to be eliminated. + But I am being cautious and not trying it. */ + +component_decl: + declspecs_nosc_ts setspecs components + { $$ = make_data_decl($1, declaration_reverse($3)); } + | declspecs_nosc_ts setspecs + { if (pedantic) + pedwarn("ISO C doesn't support unnamed structs/unions"); + + $$ = make_data_decl($1, NULL); } + | declspecs_nosc_nots setspecs components_notype + { $$ = make_data_decl($1, declaration_reverse($3)); } + | declspecs_nosc_nots setspecs + { if (pedantic) + pedwarn("ANSI C forbids member declarations with no members"); + shadow_tag($1); + $$ = make_data_decl($1, NULL); } + | error + { $$ = make_error_decl(); } + | extension component_decl + { $$ = make_extension_decl($1.i, $1.location, $2); } + ; + +components: + component_declarator + | components ',' maybe_resetattrs component_declarator + { $$ = declaration_chain($4, $1); } + ; + +/* It should be possible to use components after the ',', but gcc 3 + isn't doing this */ +components_notype: + component_notype_declarator + | components_notype ',' maybe_resetattrs component_notype_declarator + { $$ = declaration_chain($4, $1); } + ; + +component_declarator: + declarator maybe_attribute + { $$ = make_field($1, NULL, pstate.declspecs, + prefix_attr($2)); } + | declarator ':' expr_no_commas maybe_attribute + { $$ = make_field($1, $3, pstate.declspecs, + prefix_attr($4)); } + | ':' expr_no_commas maybe_attribute + { $$ = make_field(NULL, $2, pstate.declspecs, + prefix_attr($3)); } + ; + +component_notype_declarator: + notype_declarator maybe_attribute + { $$ = make_field($1, NULL, pstate.declspecs, + prefix_attr($2)); } + | notype_declarator ':' expr_no_commas maybe_attribute + { $$ = make_field($1, $3, pstate.declspecs, + prefix_attr($4)); } + | ':' expr_no_commas maybe_attribute + { $$ = make_field(NULL, $2, pstate.declspecs, + prefix_attr($3)); } + ; + +enumlist: + enumerator + | enumlist ',' enumerator + { $$ = declaration_chain($3, $1); } + | error + { $$ = NULL; } + ; + + +enumerator: + identifier + { $$ = make_enumerator($1.location, $1.id, NULL); } + | identifier '=' expr_no_commas + { $$ = make_enumerator($1.location, $1.id, $3); } + ; + +typename: + declspecs_nosc + { pending_xref_error(); } + absdcl + { $$ = make_type($1, $3); } + ; + +absdcl: /* an abstract declarator */ + /* empty */ + { $$ = NULL; } + | absdcl1 + ; + +absdcl1: /* a nonempty absolute declarator */ + absdcl1_ea + | absdcl1_noea + ; + +absdcl1_noea: + direct_absdcl1 + | '*' maybe_type_quals_attrs absdcl1_noea + { $$ = make_pointer_declarator($1.location, $3, $2); } + ; + +absdcl1_ea: + '*' maybe_type_quals_attrs + { $$ = make_pointer_declarator($1.location, NULL, $2); } + | '*' maybe_type_quals_attrs absdcl1_ea + { $$ = make_pointer_declarator($1.location, $3, $2); } + ; + +direct_absdcl1: + '(' maybe_attribute absdcl1 ')' + { $$ = make_qualified_declarator($1.location, $3, CAST(type_element, $2)); } + | direct_absdcl1 array_or_absfn_declarator + { $$ = finish_array_or_fn_declarator($1, $2); } + | array_or_absfn_declarator + { $$ = finish_array_or_fn_declarator(NULL, $1); } + ; + +array_or_fn_declarator: + fn_declarator + | array_declarator + ; + +array_or_absfn_declarator: + absfn_declarator + | array_declarator + ; + +fn_declarator: + parameters '(' parmlist_or_identifiers_1 fn_quals + { $$ = CAST(nested_declarator, + new_function_declarator(pr, $2.location, NULL, $3, $1, $4, NULL)); } + | '(' parmlist_or_identifiers fn_quals + { $$ = CAST(nested_declarator, + new_function_declarator(pr, $1.location, NULL, $2, NULL, $3, NULL)); } + ; + +absfn_declarator: + '(' parmlist fn_quals + { $$ = CAST(nested_declarator, + new_function_declarator(pr, $1.location, NULL, $2, NULL, $3, NULL)); } + ; + +array_declarator: + '[' expr ']' + { $$ = CAST(nested_declarator, new_array_declarator(pr, $1.location, NULL, $2)); } + | '[' ']' + { $$ = CAST(nested_declarator, new_array_declarator(pr, $1.location, NULL, NULL)); } + ; + +/* at least one statement, the first of which parses without error. */ +/* stmts is used only after decls, so an invalid first statement + is actually regarded as an invalid decl and part of the decls. */ + +stmts: + stmt_or_labels + { + if (pedantic && $1.i) + pedwarn("ANSI C forbids label at end of compound statement"); + /* Add an empty statement to last label if stand-alone */ + if ($1.i) + { + statement last_label = last_statement($1.stmt); + + chain_with_labels(last_label, CAST(statement, new_empty_stmt(pr, last_label->location))); + } + $$ = $1.stmt; + } + ; + +stmt_or_labels: + stmt_or_label + | stmt_or_labels stmt_or_label + { $$.i = $2.i; $$.stmt = chain_with_labels($1.stmt, $2.stmt); } + | stmt_or_labels errstmt + { $$.i = 0; $$.stmt = make_error_stmt(); } + ; + +xstmts: + /* empty */ { $$ = NULL; } + | stmts + ; + +errstmt: error ';' + ; + +pushlevel: + /* empty */ + { pushlevel(FALSE); } + ; + +/* Read zero or more forward-declarations for labels + that nested functions can jump to. */ +maybe_label_decls: + /* empty */ { $$ = NULL; } + | label_decls + { if (pedantic) + pedwarn("ANSI C forbids label declarations"); + $$ = id_label_reverse($1); } + ; + +label_decls: + label_decl + | label_decls label_decl { $$ = id_label_chain($2, $1); } + ; + +label_decl: + LABEL identifiers_or_typenames ';' + { $$ = $2; } + ; + +/* This is the body of a function definition. + It causes syntax errors to ignore to the next openbrace. */ +compstmt_or_error: + compstmt + | error compstmt { $$ = $2; } + ; + +compstmt_start: + '{' { $$ = $1; compstmt_count++; } + ; + +compstmt: + compstmt_start pushlevel '}' + { $$ = CAST(statement, new_compound_stmt(pr, $1.location, NULL, NULL, NULL, poplevel())); } + | compstmt_start pushlevel maybe_label_decls decls xstmts '}' + { $$ = CAST(statement, new_compound_stmt(pr, $1.location, $3, + declaration_reverse($4), $5, poplevel())); } + | compstmt_start pushlevel maybe_label_decls error '}' + { poplevel(); + $$ = make_error_stmt(); } + | compstmt_start pushlevel maybe_label_decls stmts '}' + { $$ = CAST(statement, new_compound_stmt(pr, $1.location, $3, NULL, $4, poplevel())); } + ; + +/* Value is number of statements counted as of the closeparen. */ +simple_if: + if_prefix labeled_stmt + { $$.stmt = CAST(statement, new_if_stmt(pr, $1.expr->location, $1.expr, $2, NULL)); + $$.i = $1.i; } + | if_prefix error { $$.i = $1.i; $$.stmt = make_error_stmt(); } + ; + +if_prefix: + IF '(' expr ')' + { $$.i = stmt_count; + $$.expr = $3; + check_condition("if", $3); } + ; + +/* This is a subroutine of stmt. + It is used twice, once for valid DO statements + and once for catching errors in parsing the end test. */ +do_stmt_start: + DO + { stmt_count++; + compstmt_count++; + $$ = CAST(conditional_stmt, + new_dowhile_stmt(pr, $1.location, NULL, NULL)); + push_loop(CAST(statement, $$)); } + labeled_stmt WHILE + { $$ = $2; + $$->stmt = $3; } + ; + +labeled_stmt: + stmt + { $$ = $1; } + | label labeled_stmt + { $$ = CAST(statement, new_labeled_stmt(pr, $1->location, $1, $2)); } + ; + +stmt_or_label: + stmt + { $$.i = 0; $$.stmt = $1; } + | label + { $$.i = 1; $$.stmt = CAST(statement, new_labeled_stmt(pr, $1->location, $1, NULL)); } + ; + +atomic_stmt: + ATOMIC { + atomic_stmt last_atomic = current.in_atomic; + + current.in_atomic = new_atomic_stmt(pr, $1.location, NULL); + current.in_atomic->containing_atomic = last_atomic; + } + stmt_or_error + { + atomic_stmt this_atomic = current.in_atomic; + + this_atomic->stmt = $3; + current.in_atomic = this_atomic->containing_atomic; + if (current.in_atomic) /* Ignore nested atomics */ + $$ = $3; + else + $$ = CAST(statement, this_atomic); + } + ; + +stmt_or_error: + stmt + | error { $$ = make_error_stmt(); } + ; + +/* Parse a single real statement, not including any labels. */ +stmt: + compstmt + { stmt_count++; $$ = $1; } + | expr ';' + { stmt_count++; + $$ = CAST(statement, new_expression_stmt(pr, $1->location, $1)); } + | simple_if ELSE + { $1.i = stmt_count; } + labeled_stmt + { if (extra_warnings && stmt_count == $1.i) + warning("empty body in an else-statement"); + $$ = $1.stmt; + if (is_if_stmt($$)) /* could be an error_stmt */ + CAST(if_stmt, $$)->stmt2 = $4; + } + | simple_if %prec IF + { /* This warning is here instead of in simple_if, because we + do not want a warning if an empty if is followed by an + else statement. Increment stmt_count so we don't + give a second error if this is a nested `if'. */ + if (extra_warnings && stmt_count++ == $1.i) + warning_with_location ($1.stmt->location, + "empty body in an if-statement"); + $$ = $1.stmt; } + | simple_if ELSE error + { $$ = make_error_stmt(); } + | WHILE + { stmt_count++; } + '(' expr ')' + { check_condition("while", $4); + $$ = CAST(conditional_stmt, + new_while_stmt(pr, $1.location, $4, NULL)); + /* The condition is not "in the loop" for break or continue */ + push_loop(CAST(statement, $$)); } + labeled_stmt + { $$ = CAST(statement, $6); + $6->stmt = $7; + pop_loop(); } + | do_stmt_start '(' expr ')' ';' + { $$ = CAST(statement, $1); + $1->condition = $3; + check_condition("do-while", $3); + /* Note that pop_loop should be before the expr to be consistent + with while, but GCC is inconsistent. See loop1.c */ + pop_loop(); } + | do_stmt_start error + { $$ = make_error_stmt(); + pop_loop(); } + | FOR '(' xexpr ';' { stmt_count++; } + xexpr ';' { if ($6) check_condition("for", $6); } + xexpr ')' + { $$ = new_for_stmt(pr, $1.location, $3, $6, $9, NULL); + push_loop(CAST(statement, $$)); } + labeled_stmt + { $$ = CAST(statement, $11); + $11->stmt = $12; + pop_loop(); } + | SWITCH '(' expr ')' + { stmt_count++; check_switch($3); + $$ = CAST(conditional_stmt, + new_switch_stmt(pr, $1.location, $3, NULL)); + push_loop(CAST(statement, $$)); } + labeled_stmt + { $$ = CAST(statement, $5); + $5->stmt = $6; + pop_loop(); } + | BREAK ';' + { stmt_count++; + $$ = CAST(statement, new_break_stmt(pr, $1.location)); + check_break($$); + } + | CONTINUE ';' + { stmt_count++; + $$ = CAST(statement, new_continue_stmt(pr, $1.location)); + check_continue($$); + } + | RETURN ';' + { stmt_count++; + $$ = make_void_return($1.location); } + | RETURN expr ';' + { stmt_count++; + $$ = make_return($1.location, $2); } + | ASM_KEYWORD maybe_type_qual '(' expr ')' ';' + { stmt_count++; + $$ = CAST(statement, new_asm_stmt(pr, $1.location, $4, NULL, + NULL, NULL, $2)); } + /* This is the case with just output operands. */ + | ASM_KEYWORD maybe_type_qual '(' expr ':' asm_operands ')' ';' + { stmt_count++; + $$ = CAST(statement, new_asm_stmt(pr, $1.location, $4, $6, NULL, + NULL, $2)); } + /* This is the case with input operands as well. */ + | ASM_KEYWORD maybe_type_qual '(' expr ':' asm_operands ':' asm_operands ')' ';' + { stmt_count++; + $$ = CAST(statement, new_asm_stmt(pr, $1.location, $4, $6, $8, NULL, $2)); } + /* This is the case with clobbered registers as well. */ + | ASM_KEYWORD maybe_type_qual '(' expr ':' asm_operands ':' + asm_operands ':' asm_clobbers ')' ';' + { stmt_count++; + $$ = CAST(statement, new_asm_stmt(pr, $1.location, $4, $6, $8, $10, $2)); } + | GOTO id_label ';' + { stmt_count++; + $$ = CAST(statement, new_goto_stmt(pr, $1.location, $2)); + use_label($2); + } + | GOTO '*' expr ';' + { if (pedantic) + pedwarn("ANSI C forbids `goto *expr;'"); + fail_in_atomic("goto *"); + stmt_count++; + $$ = CAST(statement, new_computed_goto_stmt(pr, $1.location, $3)); + check_computed_goto($3); } + | atomic_stmt + | ';' { $$ = CAST(statement, new_empty_stmt(pr, $1.location)); } + ; + +/* Any kind of label, including jump labels and case labels. + ANSI C accepts labels only before statements, but we allow them + also at the end of a compound statement. */ + +label: CASE expr_no_commas ':' + { $$ = CAST(label, new_case_label(pr, $1.location, $2, NULL)); + check_case($$); } + | CASE expr_no_commas ELLIPSIS expr_no_commas ':' + { $$ = CAST(label, new_case_label(pr, $1.location, $2, $4)); + check_case($$); } + | DEFAULT ':' + { $$ = CAST(label, new_default_label(pr, $1.location)); + check_default($$); } + | id_label ':' + { $$ = CAST(label, $1); + define_label($1); } + ; + +/* Either a type-qualifier or nothing. First thing in an `asm' statement. */ + +maybe_type_qual: + /* empty */ + { $$ = NULL; } + | type_qual + ; + +xexpr: + /* empty */ + { $$ = NULL; } + | expr + ; + +/* These are the operands other than the first string and colon + in asm ("addextend %2,%1": "=dm" (x), "0" (y), "g" (*x)) */ +asm_operands: + /* empty */ + { $$ = NULL; } + | nonnull_asm_operands + ; + +nonnull_asm_operands: + asm_operand + | nonnull_asm_operands ',' asm_operand + { $$ = asm_operand_chain($1, $3); } + ; + +asm_operand: + STRING '(' expr ')' + { $$ = new_asm_operand(pr, $1->location, NULL, $1, $3); } + | '[' idword ']' STRING '(' expr ')' + { $$ = new_asm_operand(pr, $1.location, $2, $4, $6); } + ; + +asm_clobbers: + STRING + { $$ = $1; } + | asm_clobbers ',' STRING + { $$ = string_chain($1, $3); } + ; + +/* This is what appears inside the parens in a function declarator. + Its value is a list of ..._TYPE nodes. */ +parmlist: + { pushlevel(TRUE); } + parmlist_1 + { $$ = $2; + /* poplevel() is done when building the declarator */ + } + ; + +parmlist_1: + parmlist_2 ')' { $$ = $1; } + | parms ';' + { if (pedantic) + pedwarn("ANSI C forbids forward parameter declarations"); + allow_parameter_redeclaration($1, TRUE); + } + parmlist_1 + { $$ = declaration_chain($1, $4); } + | error ')' + { $$ = make_error_decl(); } + ; + +/* This is what appears inside the parens in a function declarator. + Is value is represented in the format that grokdeclarator expects. */ +parmlist_2: /* empty */ + { $$ = NULL; } + | ELLIPSIS + { $$ = make_error_decl(); + /* Gcc used to allow this as an extension. However, it does + not work for all targets, and thus has been disabled. + Also, since func (...) and func () are indistinguishable, + it caused problems with the code in expand_builtin which + tries to verify that BUILT_IN_NEXT_ARG is being used + correctly. */ + error("ANSI C requires a named argument before `...'"); + } + | parms + { $$ = $1; } + | parms ',' ELLIPSIS + { $$ = declaration_chain($1, CAST(declaration, new_ellipsis_decl(pr, $3.location))); } + ; + +parms: + parm + | parms ',' parm + { $$ = declaration_chain($1, $3); } + ; + +/* A single parameter declaration or parameter type name, + as found in a parmlist. */ +parm: + declspecs_ts xreferror parm_declarator maybe_attribute + { $$ = declare_parameter($3, $1, $4); } + | declspecs_ts xreferror notype_declarator maybe_attribute + { $$ = declare_parameter($3, $1, $4); } + | declspecs_ts xreferror absdcl + { $$ = declare_parameter($3, $1, NULL); } + | declspecs_ts xreferror absdcl1_noea attributes + { $$ = declare_parameter($3, $1, $4); } + | declspecs_nots xreferror notype_declarator maybe_attribute + { $$ = declare_parameter($3, $1, $4); } + | declspecs_nots xreferror absdcl + { $$ = declare_parameter($3, $1, NULL); } + | declspecs_nots xreferror absdcl1_noea attributes + { $$ = declare_parameter($3, $1, $4); } + ; + +xreferror: { pending_xref_error(); } ; + +/* This is used in a function definition + where either a parmlist or an identifier list is ok. + Its value is a list of ..._TYPE nodes or a list of identifiers. */ +parmlist_or_identifiers: + { pushlevel(TRUE); } + parmlist_or_identifiers_1 + { $$ = $2; + /* poplevel is done when building the declarator */ } + ; + +parmlist_or_identifiers_1: + parmlist_1 + | identifiers ')' { $$ = $1; } + ; + +/* A nonempty list of identifiers. */ +identifiers: + old_parameter + { $$ = $1; } + | identifiers ',' old_parameter + { $$ = declaration_chain($1, $3); } + ; + +old_parameter: + IDENTIFIER { $$ = declare_old_parameter($1.location, $1.id); } + ; + +/* A nonempty list of identifiers, including typenames. */ +identifiers_or_typenames: + id_label { $$ = $1; declare_label($1); } + | identifiers_or_typenames ',' id_label + { $$ = id_label_chain($3, $1); + declare_label($3); } + ; + +/* A possibly empty list of function qualifiers (only one exists so far) */ +fn_quals: + /* empty */ { $$ = NULL; } + | fn_qual { $$ = $1; } + ; + +extension: + EXTENSION + { $$.location = $1.location; + $$.i = pedantic; + pedantic = 0; } + ; + +scspec: + SCSPEC + { $$ = CAST(type_element, new_rid(pr, $1.location, $1.i)); } + | DEFAULT + { $$ = CAST(type_element, new_rid(pr, $1.location, RID_DEFAULT)); } + ; + +type_qual: + TYPE_QUAL + { $$ = CAST(type_element, new_qualifier(pr, $1.location, $1.i)); } + ; + +fn_qual: + FN_QUAL + { $$ = CAST(type_element, new_qualifier(pr, $1.location, $1.i)); } + ; + +type_spec: + TYPESPEC + { $$ = CAST(type_element, new_rid(pr, $1.location, $1.i)); } + ; + + +%% diff --git a/src/cg_help.c b/src/cg_help.c new file mode 100644 index 0000000..a104666 --- /dev/null +++ b/src/cg_help.c @@ -0,0 +1,128 @@ + +// The following was generated from cg_help.fig, by exporting as a +// gif, and then running hexdump: +// hexdump -e '5/4 " 0x%08x," "\n"' cg_help.gif + +int cg_help_gif[] = { + 0x38464947, 0x017c6137, 0x00a100de, 0x00000000, 0xdfffffff, + 0x0000dfdf, 0x00002cff, 0x017c0000, 0x020000de, 0xa98f8cfe, + 0xa30fe08b, 0x8bdab463, 0xfbbcdeb3, 0x58e2860f, 0xa6442649, + 0x2e08f9d4, 0x4cf2a93b, 0xcf8df6d7, 0x7b0ae030, 0x86f491de, + 0x022fa2c4, 0xcc972a4c, 0x8c685266, 0x44ce24f6, 0x228d8a44, + 0xf7aedcab, 0xc766bc0b, 0x42135453, 0xe0cd174e, 0x570dfbb6, + 0x63f4d5a0, 0xebaadc2c, 0xffb880ed, 0xb0e7880f, 0x9380f7b7, + 0x18689847, 0xa8e8d8c8, 0x78589881, 0x39291327, 0xb9a8f7d9, + 0x597968f9, 0xf9e236c7, 0x7a69c989, 0x0a4a36da, 0xbaa2094a, + 0x3a899aca, 0xfb082b4b, 0x73cae8b9, 0xfb5adabb, 0xc8321c0b, + 0x31cb9a4b, 0x1b2c5c4c, 0x818cdccc, 0x9c697c9c, 0xbd2d1d01, + 0xb0324cec, 0x560d9dcd, 0x5be8ad6d, 0xecae1bb2, 0xfe8db32d, + 0x384e6e05, 0x8eee52bd, 0xa1febd8b, 0x3ed55f6e, 0xcf2cf93f, + 0x085f2d7f, 0xec97027c, 0x5c67a803, 0xc5087f83, 0x81882bd5, + 0x0d3c4420, 0x68abc5cf, 0xfe06a271, 0x1c6d1a89, 0x6146a8c4, + 0x43208f80, 0x80b8ec3e, 0x0c4aca23, 0x487c264b, 0x911a65d2, + 0xaca80d2b, 0xcca62249, 0xee74be2c, 0xe6b342c4, 0x5ac29c4d, + 0xe72934fe, 0x0ca234a8, 0xe0f53286, 0x4a11a953, 0x39aea551, + 0xd3e9d389, 0x0ead550d, 0x2bd46aa1, 0x0742ac4f, 0x5615156c, + 0x5d3b94ac, 0x17980d09, 0xb3d6a3b4, 0x1bf6d4cf, 0x5bd61699, + 0x72277177, 0x58f746eb, 0x0b7f3dde, 0xa316b5ef, 0x7c6e1ead, + 0x6c7e06c9, 0x6d993141, 0xcb871843, 0xe5949834, 0xa3218ecb, + 0x1a30bbec, 0xa3a32265, 0xb7b77661, 0x81cf6234, 0x3c905ca9, + 0xd90bb546, 0x4b9b4ebc, 0xeb35787d, 0x585630b3, 0xd6fb4da3, + 0x73b8df9c, 0x1bbceb27, 0x99698ee2, 0x2e0f1add, 0xdcaad5fc, + 0x4e8161d0, 0x96f96f6e, 0x1b0d84e6, 0x735d2e3f, 0xb4caeae5, + 0x3e8f3f9b, 0xecf5fabd, 0xef7fbbdb, 0xbf8f789e, 0xf32786e6, + 0xf6171e4e, 0x1bfee7a7, 0x5dff1fc8, 0xf3852374, 0xed4b7e5d, + 0x0b0fd447, 0x8158b770, 0x07d75a01, 0xb8047583, 0x21c83119, + 0xaf098eb8, 0x7006a849, 0x0062f60f, 0x51461d87, 0xe2188421, + 0xa2390f04, 0x88597839, 0x18516622, 0x74662580, 0xc1b07ee2, + 0x92819cf8, 0x58a2f660, 0xd4c8d5d7, 0xf7e0528d, 0xda3c2f61, + 0x189012f5, 0x5b15e8f6, 0xa3f52a4c, 0x093e0992, 0xce486865, + 0x4194a174, 0x2b53f952, 0xa594ee5c, 0x495e5b96, 0x965f9786, + 0x3598a514, 0x3d660909, 0xa694ca6c, 0x89bd2b9a, 0x56674c26, + 0x9f9ca714, 0x4890d9dd, 0xa619f674, 0x3992539e, 0xf27c9f95, + 0x1da0a793, 0x63a3e785, 0xa81a227f, 0x5a1e28a2, 0x568f721f, + 0x9789e92a, 0xa6e96672, 0xe99a45e0, 0xc8a684a4, 0x2670a300, + 0x949cea1a, 0xa9a81746, 0xea9aa120, 0x0796ab9a, 0xc4f4a795, + 0xd7ada52a, 0xae807a80, 0x2b8af0ef, 0x04bebe7f, 0x62c3af6c, + 0xb06cfe59, 0x074ace5b, 0x3b32b5a9, 0x2aca2846, 0xb09e1f69, + 0xa16c782e, 0x5bcb4ec9, 0x1b6d57b6, 0x707cb78f, 0x88b5692b, + 0x1882ab39, 0x2e4b5e9f, 0x0ab2e664, 0x9aae572e, 0xbbbb6ec4, + 0xbc6bbbbd, 0x2dfbcecf, 0xab96f6ba, 0x32feb12e, 0x1ab68301, + 0x5e308bfe, 0x5aec1826, 0x0c25e920, 0x45fdb631, 0x16c5714c, + 0xc6718c5f, 0x71cc6f1a, 0x0c7f1ec7, 0x8f22c872, 0x26c9724c, + 0xca728c9f, 0x72ccaf2a, 0x0cbf2ecb, 0xcf32cc73, 0x36cd734c, + 0xcddebb07, 0x70ece5c9, 0xab4963c0, 0x32f8acb3, 0x435a2fac, + 0xd045bb47, 0xc981411a, 0x4cf837c0, 0xd74ad38f, 0xf5aff472, + 0xd36fc352, 0x35036753, 0xfb4082bc, 0x335bd495, 0x1ed7b552, + 0xd1761b89, 0x76819f63, 0x08bb5719, 0x736bcff6, 0x5785b592, + 0xdce9fdd7, 0x85adb49d, 0x2df2a5d8, 0x0080deb7, 0x78a2540e, + 0xe0b6a637, 0xec4dc539, 0xadf976b3, 0x97840e78, 0xe1e519fe, + 0x528e4100, 0x0e5a9961, 0x5f9c9669, 0x733a36fe, 0xe779f901, + 0x42fa1358, 0x5e8cd9e2, 0x478de4e3, 0xc989b8c6, 0xec64beb1, + 0x3a8ec246, 0x433ba111, 0xcbb68dbb, 0x61ee712e, 0xa0966ecf, + 0xd278efae, 0xd6efc8f1, 0x0bbfcefb, 0xb5f3c728, 0xf34c0ea9, + 0x901f29ac, 0x0f43d215, 0x619ef599, 0xc295bcbf, 0xf79ac54f, + 0x3dcf6eee, 0xedf7e35e, 0xa1adf999, 0xd9f83e9f, 0x5d3ee63f, + 0x3ea81ff2, 0x4699de81, 0x14f829bd, 0x1143a6af, 0xd11648a9, + 0x74668555, 0x45fcadbb, 0x0d52b64f, 0xa2e7f87d, 0x82085115, + 0x8adb3b91, 0x1040808a, 0x4682e80d, 0x2a8ee020, 0x35308fe8, + 0x541e4290, 0x88248844, 0x286e1027, 0x20e1be69, 0x88547469, + 0x84a7de13, 0xec215216, 0xffaa5058, 0x02869060, 0x76422173, + 0xc989b327, 0xe2248670, 0x05562c61, 0x10b1e9c3, 0x983b406e, + 0xb0a896b1, 0x89d14226, 0xfe16944f, 0x8f089915, 0x8b315586, + 0x17228c5a, 0xf54608a7, 0xfc85f0e8, 0x8046211b, 0x6cf53318, + 0x341d8890, 0x574ab362, 0xc3163744, 0x8e58e486, 0x9f38c615, + 0x8d62b224, 0x8b60c8bc, 0x13b7f8e8, 0x648d90b4, 0xa0ace084, + 0x0090c723, 0x334e9032, 0x39130be3, 0x30ce2193, 0xa45c1447, + 0x43e304f6, 0x8e71f801, 0x03e093f9, 0xa2c9692b, 0x7c30d24c, + 0xd8fae089, 0xdc114a17, 0xfcab7b2f, 0x71452a60, 0x3276544a, + 0x257ba996, 0x3c39685a, 0x0cb2e163, 0xfc2554b6, 0x58c92780, + 0xad8e91a2, 0x76f4484c, 0x161b4c39, 0xfbd18df3, 0x47faf225, + 0x4f86674c, 0x664cb47b, 0x9589ab34, 0x97a58e65, 0x4d25392c, + 0x6843f8e0, 0x6b9b5286, 0x99349471, 0x0a6ecdc9, 0xd4e42faf, + 0xd953389d, 0x63fa5cce, 0x657cef54, 0x49808f3c, 0x9b935924, + 0x36938ced, 0x7fce99f7, 0x0098ab02, 0xa12ce74d, 0xd2702c94, + 0x504aa0ca, 0x16fed468, 0x31cc4d27, 0x93ca28b4, 0x54eab868, + 0x133689cf, 0x9b2835a3, 0xd1aa3312, 0xa2cf3e66, 0xd016cb58, + 0x9336ca42, 0xba305492, 0xf54a293a, 0x167750e1, 0x850a2174, + 0xe1d94be2, 0x94cd6451, 0xe2e98a91, 0xb4c0e34d, 0x0bb4ba37, + 0x2083e1cb, 0xf809ba7f, 0x483b4dec, 0x9b108605, 0x4aa8d50a, + 0xad54aa75, 0x8aaf55aa, 0x756aacd5, 0xaaed5cab, 0xd60abf57, + 0xac758ab0, 0x596b2d64, 0x37d66a87, 0xec1bf4ac, 0xd54a6b49, + 0xe98587f8, 0x0d6ead74, 0xba8d4e57, 0xc90abb53, 0xd7dd75a7, + 0x84fa6d5e, 0xaf2ea698, 0x50abbd55, 0xb335da41, 0xd0a4b5f5, + 0xdaba6c02, 0x1aaf5746, 0x9d1da1f6, 0x3ab3645c, 0x4da90859, + 0xac58b1b0, 0x59797ef6, 0xb3cd5ace, 0x2fa32d99, 0xbeb6e9cf, + 0xba21d68a, 0xdcda6d40, 0xc9f9daba, 0x5d32b5cb, 0x084365d4, + 0xf6c44d52, 0xd2bdb356, 0xa3c11b6d, 0x31e8ba86, 0x0dd1a5bb, + 0x5b99fee9, 0xb095e42e, 0x3b1d454b, 0xecb81b69, 0x8eb99724, + 0x712f27b8, 0x3ae4ceb7, 0xa2d73ae1, 0xbba0d92e, 0xcfad154d, + 0x61c392bb, 0x2668b114, 0xaf862436, 0x3666f2b2, 0xe9258bc1, + 0xc3be642e, 0x8c5e2fad, 0xbefcdf85, 0x83c9984f, 0xabe4e52f, + 0x97dafbdf, 0x0788562d, 0x348bfd71, 0xbb53216c, 0x58065d0d, + 0x485ebbf4, 0x08707830, 0x71352ffe, 0x3843de49, 0x0e10c378, + 0x8bf6d62e, 0x182f0bcc, 0x70ee0f1d, 0x6196a57e, 0xbe385438, + 0x3e25dcba, 0x01e251bd, 0x4ebd62cb, 0x56fd9bfa, 0x6260e16c, + 0xe61bc493, 0xbc7f8cd1, 0x78071ac5, 0xb17e2e4c, 0x47a806a7, + 0x69233674, 0x93443028, 0x2742c173, 0x471516fd, 0x0d053246, + 0x58f022c8, 0xbc3bcb15, 0x6cb321f2, 0xb97f2db7, 0xf1d1a6cb, + 0x9fac922d, 0xc455a25e, 0x81f340c4, 0x5766e598, 0x83a8f2da, + 0xcca22424, 0xd4e797ac, 0xba0a9f87, 0x49211e23, 0xe3382ffe, + 0x166a3387, 0xc949a0a2, 0xb2174129, 0xb469f08c, 0xe90d1fa3, + 0xd25a4b48, 0xa54d23fa, 0x389b257c, 0xe89ed8b3, 0xf474f3c1, + 0xff4ae89c, 0xee7dcf90, 0xc741a895, 0xfa0336c7, 0xaf66a41d, + 0xeab335a7, 0x831a287e, 0x9af399ba, 0xb8676c5b, 0x1e13fabc, + 0x833c2502, 0x1f51e630, 0xf244cf34, 0xb8475475, 0xb298dac9, + 0x99a629c8, 0xe38c7375, 0xd9f55e48, 0x7bb61de1, 0x72ed4ab1, + 0x13c30f8a, 0xabb45a9e, 0x6afe6cbd, 0x63e4db35, 0xfb31b5f3, + 0x7b6e596d, 0x1a0ecd7c, 0x4c7b53b9, 0xb8b56f71, 0x7675c6c6, + 0xebee9b25, 0x5fdee45e, 0xfcbfb6cd, 0xd1c16ddd, 0xa6fb981b, + 0xce0758a7, 0xb6fa79db, 0xb8437add, 0x96a9f238, 0xe1d48729, + 0x78360249, 0x8a528e25, 0x1a03e523, 0x3b5a6e8f, 0xca84b85e, + 0x053fe30f, 0x6052b6b9, 0x967ac1f2, 0x9b7aa7a6, 0xd52e49c9, + 0xe291a397, 0x642c2f30, 0x35589e6b, 0xa0dc32cd, 0x41b9d739, + 0x95eb7b38, 0x8e52967f, 0x8b1c30d5, 0x963af42e, 0xed81e90e, + 0x0e92d139, 0x315ec351, 0xfa81ed15, 0x374adad9, 0x609d5b3a, + 0x0141b75a, 0x003b0000 +}; + diff --git a/src/cg_help.fig b/src/cg_help.fig new file mode 100644 index 0000000..0c0eba3 --- /dev/null +++ b/src/cg_help.fig @@ -0,0 +1,34 @@ +#FIG 3.2 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 32 #bebebe +1 2 0 2 0 32 50 0 30 6.000 1 0.0000 1237 3375 563 450 1800 3825 675 2925 +1 2 0 2 0 32 50 0 30 6.000 1 0.0000 1237 2250 563 450 1800 2700 675 1800 +1 2 0 2 0 32 50 0 30 6.000 1 0.0000 1237 1125 563 450 1800 1575 675 675 +1 2 0 2 0 32 50 0 30 6.000 1 0.0000 5512 1125 563 450 6075 1575 4950 675 +1 2 0 2 0 32 50 0 30 6.000 1 0.0000 5512 2250 563 450 6075 2700 4950 1800 +1 2 0 2 0 32 50 0 30 6.000 1 0.0000 5512 3375 563 450 6075 3825 4950 2925 +2 1 1 2 0 7 50 0 -1 6.000 0 0 -1 1 0 2 + 1 1 2.00 120.00 240.00 + 1800 2250 4950 2250 +2 1 0 2 0 7 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 2.00 120.00 240.00 + 1800 1125 4950 1125 +2 1 0 2 0 7 50 0 -1 6.000 0 0 7 1 0 2 + 1 1 2.00 120.00 240.00 + 1800 3375 4950 3375 +4 1 0 50 0 0 20 0.0000 4 195 675 3240 3285 func:f\001 +4 1 1 50 0 0 20 0.0000 4 195 180 1233 3469 E\001 +4 1 1 50 0 0 20 0.0000 4 195 195 1233 2344 C\001 +4 1 1 50 0 0 20 0.0000 4 195 210 1236 1212 A\001 +4 1 1 50 0 0 20 0.0000 4 195 90 3240 1035 I\001 +4 1 1 50 0 0 20 0.0000 4 195 105 3240 2160 J\001 +4 1 1 50 0 0 20 0.0000 4 195 210 5504 2340 D\001 +4 1 1 50 0 0 20 0.0000 4 195 195 5509 1219 B\001 +4 1 1 50 0 0 20 0.0000 4 195 165 5504 3465 F\001 diff --git a/src/configure b/src/configure new file mode 100755 index 0000000..f5c8568 --- /dev/null +++ b/src/configure @@ -0,0 +1,8136 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.61 for nesc 1.3.0. +# +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + + + +# PATH needs CR +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +as_nl=' +' +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + { (exit 1); exit 1; } +fi + +# Work around bugs in pre-3.0 UWIN ksh. +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + + +# Name of the executable. +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# CDPATH. +$as_unset CDPATH + + +if test "x$CONFIG_SHELL" = x; then + if (eval ":") 2>/dev/null; then + as_have_required=yes +else + as_have_required=no +fi + + if test $as_have_required = yes && (eval ": +(as_func_return () { + (exit \$1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = \"\$1\" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test \$exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=\$LINENO + as_lineno_2=\$LINENO + test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && + test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } +") 2> /dev/null; then + : +else + as_candidate_shells= + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + case $as_dir in + /*) + for as_base in sh bash ksh sh5; do + as_candidate_shells="$as_candidate_shells $as_dir/$as_base" + done;; + esac +done +IFS=$as_save_IFS + + + for as_shell in $as_candidate_shells $SHELL; do + # Try only shells that exist, to save several forks. + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { ("$as_shell") 2> /dev/null <<\_ASEOF +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + +: +_ASEOF +}; then + CONFIG_SHELL=$as_shell + as_have_required=yes + if { "$as_shell" 2> /dev/null <<\_ASEOF +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + +: +(as_func_return () { + (exit $1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = "$1" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test $exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } + +_ASEOF +}; then + break +fi + +fi + + done + + if test "x$CONFIG_SHELL" != x; then + for as_var in BASH_ENV ENV + do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var + done + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} +fi + + + if test $as_have_required = no; then + echo This script requires a shell more modern than all the + echo shells that I found on your system. Please install a + echo modern shell, or manually run the script under such a + echo shell if you do have one. + { (exit 1); exit 1; } +fi + + +fi + +fi + + + +(eval "as_func_return () { + (exit \$1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = \"\$1\" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test \$exitcode = 0") || { + echo No shell found that supports shell functions. + echo Please tell autoconf@gnu.org about your system, + echo including any error possibly output before this + echo message +} + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in +-n*) + case `echo 'x\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + *) ECHO_C='\c';; + esac;; +*) + ECHO_N='-n';; +esac + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir +fi +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + + +exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} + +# Identity of this package. +PACKAGE_NAME='nesc' +PACKAGE_TARNAME='nesc' +PACKAGE_VERSION='1.3.0' +PACKAGE_STRING='nesc 1.3.0' +PACKAGE_BUGREPORT='' + +ac_unique_file="c-parse.y" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='SHELL +PATH_SEPARATOR +PACKAGE_NAME +PACKAGE_TARNAME +PACKAGE_VERSION +PACKAGE_STRING +PACKAGE_BUGREPORT +exec_prefix +prefix +program_transform_name +bindir +sbindir +libexecdir +datarootdir +datadir +sysconfdir +sharedstatedir +localstatedir +includedir +oldincludedir +docdir +infodir +htmldir +dvidir +pdfdir +psdir +libdir +localedir +mandir +DEFS +ECHO_C +ECHO_N +ECHO_T +LIBS +build_alias +host_alias +target_alias +INSTALL_PROGRAM +INSTALL_SCRIPT +INSTALL_DATA +am__isrc +CYGPATH_W +PACKAGE +VERSION +ACLOCAL +AUTOCONF +AUTOMAKE +AUTOHEADER +MAKEINFO +install_sh +STRIP +INSTALL_STRIP_PROGRAM +mkdir_p +AWK +SET_MAKE +am__leading_dot +AMTAR +am__tar +am__untar +build +build_cpu +build_vendor +build_os +host +host_cpu +host_vendor +host_os +CPPFLAGS +CFLAGS +CC +LDFLAGS +ac_ct_CC +EXEEXT +OBJEXT +DEPDIR +am__include +am__quote +AMDEP_TRUE +AMDEP_FALSE +AMDEPBACKSLASH +CCDEPMODE +am__fastdepCC_TRUE +am__fastdepCC_FALSE +RANLIB +USING_RCC_TRUE +USING_RCC_FALSE +CPP +GREP +EGREP +ALLOCA +LIBOBJS +NEED_FNMATCH_TRUE +NEED_FNMATCH_FALSE +NEED_REGEX_TRUE +NEED_REGEX_FALSE +LIBICONV +LTLIBICONV +LTLIBOBJS' +ac_subst_files='' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` + eval enable_$ac_feature=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` + eval enable_$ac_feature=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package | sed 's/[-.]/_/g'` + eval with_$ac_package=\$ac_optarg ;; + + -without-* | --without-*) + ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package | sed 's/[-.]/_/g'` + eval with_$ac_package=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) { echo "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + { echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } +fi + +# Be sure to have absolute directory names. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; } +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + { echo "$as_me: error: Working directory cannot be determined" >&2 + { (exit 1); exit 1; }; } +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + { echo "$as_me: error: pwd does not report name of working directory" >&2 + { (exit 1); exit 1; }; } + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$0" || +$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$0" : 'X\(//\)[^/]' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +echo X"$0" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 + { (exit 1); exit 1; }; } +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2 + { (exit 1); exit 1; }; } + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures nesc 1.3.0 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/nesc] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of nesc 1.3.0:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors + --disable-rpath do not hardcode runtime library paths + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-gnu-ld assume the C compiler uses GNU ld default=no + --with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib + --without-libiconv-prefix don't search for libiconv in includedir and libdir + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CPP C preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +nesc configure 1.3.0 +generated by GNU Autoconf 2.61 + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by nesc $as_me 1.3.0, which was +generated by GNU Autoconf 2.61. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + echo "PATH: $as_dir" +done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; + 2) + ac_configure_args1="$ac_configure_args1 '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + ac_configure_args="$ac_configure_args '$ac_arg'" + ;; + esac + done +done +$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } +$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + cat <<\_ASBOX +## ---------------- ## +## Cache variables. ## +## ---------------- ## +_ASBOX + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 +echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + *) $as_unset $ac_var ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + cat <<\_ASBOX +## ----------------- ## +## Output variables. ## +## ----------------- ## +_ASBOX + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + cat <<\_ASBOX +## ------------------- ## +## File substitutions. ## +## ------------------- ## +_ASBOX + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + cat <<\_ASBOX +## ----------- ## +## confdefs.h. ## +## ----------- ## +_ASBOX + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + echo "$as_me: caught signal $ac_signal" + echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer explicitly selected file to automatically selected ones. +if test -n "$CONFIG_SITE"; then + set x "$CONFIG_SITE" +elif test "x$prefix" != xNONE; then + set x "$prefix/share/config.site" "$prefix/etc/config.site" +else + set x "$ac_default_prefix/share/config.site" \ + "$ac_default_prefix/etc/config.site" +fi +shift +for ac_site_file +do + if test -r "$ac_site_file"; then + { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 +echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special + # files actually), so we avoid doing that. + if test -f "$cache_file"; then + { echo "$as_me:$LINENO: loading cache $cache_file" >&5 +echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { echo "$as_me:$LINENO: creating cache $cache_file" >&5 +echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 +echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 +echo "$as_me: former value: $ac_old_val" >&2;} + { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 +echo "$as_me: current value: $ac_new_val" >&2;} + ac_cache_corrupted=: + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 +echo "$as_me: error: changes in the environment can compromise the build" >&2;} + { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } +fi + + + + + + + + + + + + + + + + + + + + + + + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +ac_aux_dir= +for ac_dir in ../config-aux "$srcdir"/../config-aux; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in ../config-aux \"$srcdir\"/../config-aux" >&5 +echo "$as_me: error: cannot find install-sh or install.sh in ../config-aux \"$srcdir\"/../config-aux" >&2;} + { (exit 1); exit 1; }; } +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + + +ac_config_headers="$ac_config_headers autoconf.h" + +am__api_version='1.10' + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +{ echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; } +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in + ./ | .// | /cC/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + done + done + ;; +esac +done +IFS=$as_save_IFS + + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ echo "$as_me:$LINENO: result: $INSTALL" >&5 +echo "${ECHO_T}$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ echo "$as_me:$LINENO: checking whether build environment is sane" >&5 +echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6; } +# Just in case +sleep 1 +echo timestamp > conftest.file +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftest.file` + fi + rm -f conftest.file + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" >&5 +echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" >&2;} + { (exit 1); exit 1; }; } + fi + + test "$2" = conftest.file + ) +then + # Ok. + : +else + { { echo "$as_me:$LINENO: error: newly created file is older than distributed files! +Check your system clock" >&5 +echo "$as_me: error: newly created file is older than distributed files! +Check your system clock" >&2;} + { (exit 1); exit 1; }; } +fi +{ echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. echo might interpret backslashes. +# By default was `s,x,x', remove it if useless. +cat <<\_ACEOF >conftest.sed +s/[\\$]/&&/g;s/;s,x,x,$// +_ACEOF +program_transform_name=`echo $program_transform_name | sed -f conftest.sed` +rm -f conftest.sed + +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` + +test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 +echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} +fi + +{ echo "$as_me:$LINENO: checking for a thread-safe mkdir -p" >&5 +echo $ECHO_N "checking for a thread-safe mkdir -p... $ECHO_C" >&6; } +if test -z "$MKDIR_P"; then + if test "${ac_cv_path_mkdir+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done +done +IFS=$as_save_IFS + +fi + + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + test -d ./--version && rmdir ./--version + MKDIR_P="$ac_install_sh -d" + fi +fi +{ echo "$as_me:$LINENO: result: $MKDIR_P" >&5 +echo "${ECHO_T}$MKDIR_P" >&6; } + +mkdir_p="$MKDIR_P" +case $mkdir_p in + [\\/$]* | ?:[\\/]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_AWK+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AWK="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { echo "$as_me:$LINENO: result: $AWK" >&5 +echo "${ECHO_T}$AWK" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; } +set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } + SET_MAKE= +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 +echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} + { (exit 1); exit 1; }; } + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='nesc' + VERSION='1.3.0' + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"} + +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_STRIP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { echo "$as_me:$LINENO: result: $STRIP" >&5 +echo "${ECHO_T}$STRIP" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_STRIP="strip" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 +echo "${ECHO_T}$ac_ct_STRIP" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +# Always define AMTAR for backward compatibility. + +AMTAR=${AMTAR-"${am_missing_run}tar"} + +am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' + + + + + + +: ${CFLAGS=-g} + +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + { { echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5 +echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;} + { (exit 1); exit 1; }; } + +{ echo "$as_me:$LINENO: checking build system type" >&5 +echo $ECHO_N "checking build system type... $ECHO_C" >&6; } +if test "${ac_cv_build+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 +echo "$as_me: error: cannot guess build type; you must specify one" >&2;} + { (exit 1); exit 1; }; } +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5 +echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_build" >&5 +echo "${ECHO_T}$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) { { echo "$as_me:$LINENO: error: invalid value of canonical build" >&5 +echo "$as_me: error: invalid value of canonical build" >&2;} + { (exit 1); exit 1; }; };; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ echo "$as_me:$LINENO: checking host system type" >&5 +echo $ECHO_N "checking host system type... $ECHO_C" >&6; } +if test "${ac_cv_host+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5 +echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;} + { (exit 1); exit 1; }; } +fi + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_host" >&5 +echo "${ECHO_T}$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) { { echo "$as_me:$LINENO: error: invalid value of canonical host" >&5 +echo "$as_me: error: invalid value of canonical host" >&2;} + { (exit 1); exit 1; }; };; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + +{ echo "$as_me:$LINENO: checking for darwin" >&5 +echo $ECHO_N "checking for darwin... $ECHO_C" >&6; } +case $host in + *-*-darwin*) + CFLAGS="$CFLAGS -Wno-long-double" + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } + ;; + *) + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +esac + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + +# Provide some information about the compiler. +echo "$as_me:$LINENO: checking for C compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (ac_try="$ac_compiler --version >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler --version >&5") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler -v >&5") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler -V >&5") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 +echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; } +ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` +# +# List of possible output files, starting from the most likely. +# The algorithm is not robust to junk in `.', hence go to wildcards (a.*) +# only as a last resort. b.out is created by i960 compilers. +ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out' +# +# The IRIX 6 linker writes into existing files which may not be +# executable, retaining their permissions. Remove them first so a +# subsequent execution test works. +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { (ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi + +{ echo "$as_me:$LINENO: result: $ac_file" >&5 +echo "${ECHO_T}$ac_file" >&6; } +if test -z "$ac_file"; then + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: C compiler cannot create executables +See \`config.log' for more details." >&5 +echo "$as_me: error: C compiler cannot create executables +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; } +fi + +ac_exeext=$ac_cv_exeext + +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ echo "$as_me:$LINENO: checking whether the C compiler works" >&5 +echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; } +# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 +# If not cross compiling, check that we can run a simple program. +if test "$cross_compiling" != yes; then + if { ac_try='./$ac_file' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { echo "$as_me:$LINENO: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + fi + fi +fi +{ echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } + +rm -f a.out a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 +echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; } +{ echo "$as_me:$LINENO: result: $cross_compiling" >&5 +echo "${ECHO_T}$cross_compiling" >&6; } + +{ echo "$as_me:$LINENO: checking for suffix of executables" >&5 +echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; } +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest$ac_cv_exeext +{ echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 +echo "${ECHO_T}$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +{ echo "$as_me:$LINENO: checking for suffix of object files" >&5 +echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; } +if test "${ac_cv_objext+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 +echo "${ECHO_T}$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; } +if test "${ac_cv_c_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_compiler_gnu=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; } +GCC=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; } +if test "${ac_cv_prog_cc_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + CFLAGS="" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 +echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; } +if test "${ac_cv_prog_cc_c89+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_c89=$ac_arg +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { echo "$as_me:$LINENO: result: none needed" >&5 +echo "${ECHO_T}none needed" >&6; } ;; + xno) + { echo "$as_me:$LINENO: result: unsupported" >&5 +echo "${ECHO_T}unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;; +esac + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo done +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 +echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6; } +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# We grep out `Entering directory' and `Leaving directory' +# messages which can occur if `w' ends up in MAKEFLAGS. +# In particular we don't look at `^make:' because GNU make might +# be invoked under some other name (usually "gmake"), in which +# case it prints its new name instead of `make'. +if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then + am__include=include + am__quote= + _am_result=GNU +fi +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then + am__include=.include + am__quote="\"" + _am_result=BSD + fi +fi + + +{ echo "$as_me:$LINENO: result: $_am_result" >&5 +echo "${ECHO_T}$_am_result" >&6; } +rm -f confinc confmf + +# Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + + +depcc="$CC" am_compiler_list= + +{ echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 +echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6; } +if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 +echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_RANLIB+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { echo "$as_me:$LINENO: result: $RANLIB" >&5 +echo "${ECHO_T}$RANLIB" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 +echo "${ECHO_T}$ac_ct_RANLIB" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +{ echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; } +set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } + SET_MAKE= +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + + + + + +{ echo "$as_me:$LINENO: checking whether ${CC-cc} accepts -Wall" >&5 +echo $ECHO_N "checking whether ${CC-cc} accepts -Wall... $ECHO_C" >&6; } +save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS -Wall" + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } + CFLAGS="$save_CFLAGS" +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +{ echo "$as_me:$LINENO: checking whether we are using rcc" >&5 +echo $ECHO_N "checking whether we are using rcc... $ECHO_C" >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +void * traditional pointer; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + RCC=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + RCC=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + if test "$RCC" = yes; then + USING_RCC_TRUE= + USING_RCC_FALSE='#' +else + USING_RCC_TRUE='#' + USING_RCC_FALSE= +fi + +{ echo "$as_me:$LINENO: result: $RCC" >&5 +echo "${ECHO_T}$RCC" >&6; } + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 +echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test "${ac_cv_prog_CPP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi + +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi + +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ echo "$as_me:$LINENO: result: $CPP" >&5 +echo "${ECHO_T}$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi + +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi + +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&5 +echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 +echo $ECHO_N "checking for grep that handles long lines and -e... $ECHO_C" >&6; } +if test "${ac_cv_path_GREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Extract the first word of "grep ggrep" to use in msg output +if test -z "$GREP"; then +set dummy grep ggrep; ac_prog_name=$2 +if test "${ac_cv_path_GREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_path_GREP_found=false +# Loop through the user's path and test for each of PROGNAME-LIST +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue + # Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + ac_count=`expr $ac_count + 1` + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + + $ac_path_GREP_found && break 3 + done +done + +done +IFS=$as_save_IFS + + +fi + +GREP="$ac_cv_path_GREP" +if test -z "$GREP"; then + { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } +fi + +else + ac_cv_path_GREP=$GREP +fi + + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 +echo "${ECHO_T}$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ echo "$as_me:$LINENO: checking for egrep" >&5 +echo $ECHO_N "checking for egrep... $ECHO_C" >&6; } +if test "${ac_cv_path_EGREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + # Extract the first word of "egrep" to use in msg output +if test -z "$EGREP"; then +set dummy egrep; ac_prog_name=$2 +if test "${ac_cv_path_EGREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_path_EGREP_found=false +# Loop through the user's path and test for each of PROGNAME-LIST +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue + # Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + ac_count=`expr $ac_count + 1` + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + + $ac_path_EGREP_found && break 3 + done +done + +done +IFS=$as_save_IFS + + +fi + +EGREP="$ac_cv_path_EGREP" +if test -z "$EGREP"; then + { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } +fi + +else + ac_cv_path_EGREP=$EGREP +fi + + + fi +fi +{ echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 +echo "${ECHO_T}$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; } +if test "${ac_cv_header_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_header_stdc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_header_stdc=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then + : +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +fi +{ echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +echo "${ECHO_T}$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +cat >>confdefs.h <<\_ACEOF +#define STDC_HEADERS 1 +_ACEOF + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. + + + + + + + + + +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_Header=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +{ echo "$as_me:$LINENO: checking for long long" >&5 +echo $ECHO_N "checking for long long... $ECHO_C" >&6; } +if test "${ac_cv_type_long_long+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +typedef long long ac__type_new_; +int +main () +{ +if ((ac__type_new_ *) 0) + return 0; +if (sizeof (ac__type_new_)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_type_long_long=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_type_long_long=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_type_long_long" >&5 +echo "${ECHO_T}$ac_cv_type_long_long" >&6; } + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ echo "$as_me:$LINENO: checking size of long long" >&5 +echo $ECHO_N "checking size of long long... $ECHO_C" >&6; } +if test "${ac_cv_sizeof_long_long+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + typedef long long ac__type_sizeof_; +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=0 ac_mid=0 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + typedef long long ac__type_sizeof_; +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid; break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr $ac_mid + 1` + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + typedef long long ac__type_sizeof_; +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=-1 ac_mid=-1 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + typedef long long ac__type_sizeof_; +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=$ac_mid; break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_hi=`expr '(' $ac_mid ')' - 1` + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo= ac_hi= +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +# Binary search between lo and hi bounds. +while test "x$ac_lo" != "x$ac_hi"; do + ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + typedef long long ac__type_sizeof_; +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr '(' $ac_mid ')' + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in +?*) ac_cv_sizeof_long_long=$ac_lo;; +'') if test "$ac_cv_type_long_long" = yes; then + { { echo "$as_me:$LINENO: error: cannot compute sizeof (long long) +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute sizeof (long long) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; } + else + ac_cv_sizeof_long_long=0 + fi ;; +esac +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + typedef long long ac__type_sizeof_; +static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); } +static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); } +#include +#include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (((long int) (sizeof (ac__type_sizeof_))) < 0) + { + long int i = longval (); + if (i != ((long int) (sizeof (ac__type_sizeof_)))) + return 1; + fprintf (f, "%ld\n", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ((long int) (sizeof (ac__type_sizeof_)))) + return 1; + fprintf (f, "%lu\n", i); + } + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_sizeof_long_long=`cat conftest.val` +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +if test "$ac_cv_type_long_long" = yes; then + { { echo "$as_me:$LINENO: error: cannot compute sizeof (long long) +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute sizeof (long long) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; } + else + ac_cv_sizeof_long_long=0 + fi +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +rm -f conftest.val +fi +{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_long_long" >&5 +echo "${ECHO_T}$ac_cv_sizeof_long_long" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long +_ACEOF + + +{ echo "$as_me:$LINENO: checking for void *" >&5 +echo $ECHO_N "checking for void *... $ECHO_C" >&6; } +if test "${ac_cv_type_void_p+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +typedef void * ac__type_new_; +int +main () +{ +if ((ac__type_new_ *) 0) + return 0; +if (sizeof (ac__type_new_)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_type_void_p=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_type_void_p=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_type_void_p" >&5 +echo "${ECHO_T}$ac_cv_type_void_p" >&6; } + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ echo "$as_me:$LINENO: checking size of void *" >&5 +echo $ECHO_N "checking size of void *... $ECHO_C" >&6; } +if test "${ac_cv_sizeof_void_p+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + typedef void * ac__type_sizeof_; +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=0 ac_mid=0 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + typedef void * ac__type_sizeof_; +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid; break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr $ac_mid + 1` + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + typedef void * ac__type_sizeof_; +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=-1 ac_mid=-1 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + typedef void * ac__type_sizeof_; +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=$ac_mid; break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_hi=`expr '(' $ac_mid ')' - 1` + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo= ac_hi= +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +# Binary search between lo and hi bounds. +while test "x$ac_lo" != "x$ac_hi"; do + ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + typedef void * ac__type_sizeof_; +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr '(' $ac_mid ')' + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in +?*) ac_cv_sizeof_void_p=$ac_lo;; +'') if test "$ac_cv_type_void_p" = yes; then + { { echo "$as_me:$LINENO: error: cannot compute sizeof (void *) +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute sizeof (void *) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; } + else + ac_cv_sizeof_void_p=0 + fi ;; +esac +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + typedef void * ac__type_sizeof_; +static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); } +static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); } +#include +#include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (((long int) (sizeof (ac__type_sizeof_))) < 0) + { + long int i = longval (); + if (i != ((long int) (sizeof (ac__type_sizeof_)))) + return 1; + fprintf (f, "%ld\n", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ((long int) (sizeof (ac__type_sizeof_)))) + return 1; + fprintf (f, "%lu\n", i); + } + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_sizeof_void_p=`cat conftest.val` +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +if test "$ac_cv_type_void_p" = yes; then + { { echo "$as_me:$LINENO: error: cannot compute sizeof (void *) +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute sizeof (void *) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; } + else + ac_cv_sizeof_void_p=0 + fi +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +rm -f conftest.val +fi +{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_void_p" >&5 +echo "${ECHO_T}$ac_cv_sizeof_void_p" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_VOID_P $ac_cv_sizeof_void_p +_ACEOF + + + +# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works +# for constant arguments. Useless! +{ echo "$as_me:$LINENO: checking for working alloca.h" >&5 +echo $ECHO_N "checking for working alloca.h... $ECHO_C" >&6; } +if test "${ac_cv_working_alloca_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +char *p = (char *) alloca (2 * sizeof (int)); + if (p) return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + ac_cv_working_alloca_h=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_working_alloca_h=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_working_alloca_h" >&5 +echo "${ECHO_T}$ac_cv_working_alloca_h" >&6; } +if test $ac_cv_working_alloca_h = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_ALLOCA_H 1 +_ACEOF + +fi + +{ echo "$as_me:$LINENO: checking for alloca" >&5 +echo $ECHO_N "checking for alloca... $ECHO_C" >&6; } +if test "${ac_cv_func_alloca_works+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __GNUC__ +# define alloca __builtin_alloca +#else +# ifdef _MSC_VER +# include +# define alloca _alloca +# else +# ifdef HAVE_ALLOCA_H +# include +# else +# ifdef _AIX + #pragma alloca +# else +# ifndef alloca /* predefined by HP cc +Olibcalls */ +char *alloca (); +# endif +# endif +# endif +# endif +#endif + +int +main () +{ +char *p = (char *) alloca (1); + if (p) return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + ac_cv_func_alloca_works=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_func_alloca_works=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_func_alloca_works" >&5 +echo "${ECHO_T}$ac_cv_func_alloca_works" >&6; } + +if test $ac_cv_func_alloca_works = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_ALLOCA 1 +_ACEOF + +else + # The SVR3 libPW and SVR4 libucb both contain incompatible functions +# that cause trouble. Some versions do not even contain alloca or +# contain a buggy version. If you still want to use their alloca, +# use ar to extract alloca.o from them instead of compiling alloca.c. + +ALLOCA=\${LIBOBJDIR}alloca.$ac_objext + +cat >>confdefs.h <<\_ACEOF +#define C_ALLOCA 1 +_ACEOF + + +{ echo "$as_me:$LINENO: checking whether \`alloca.c' needs Cray hooks" >&5 +echo $ECHO_N "checking whether \`alloca.c' needs Cray hooks... $ECHO_C" >&6; } +if test "${ac_cv_os_cray+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#if defined CRAY && ! defined CRAY2 +webecray +#else +wenotbecray +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "webecray" >/dev/null 2>&1; then + ac_cv_os_cray=yes +else + ac_cv_os_cray=no +fi +rm -f conftest* + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_os_cray" >&5 +echo "${ECHO_T}$ac_cv_os_cray" >&6; } +if test $ac_cv_os_cray = yes; then + for ac_func in _getb67 GETB67 getb67; do + as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_var'}'` = yes; then + +cat >>confdefs.h <<_ACEOF +#define CRAY_STACKSEG_END $ac_func +_ACEOF + + break +fi + + done +fi + +{ echo "$as_me:$LINENO: checking stack direction for C alloca" >&5 +echo $ECHO_N "checking stack direction for C alloca... $ECHO_C" >&6; } +if test "${ac_cv_c_stack_direction+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + ac_cv_c_stack_direction=0 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +find_stack_direction () +{ + static char *addr = 0; + auto char dummy; + if (addr == 0) + { + addr = &dummy; + return find_stack_direction (); + } + else + return (&dummy > addr) ? 1 : -1; +} + +int +main () +{ + return find_stack_direction () < 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_c_stack_direction=1 +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_c_stack_direction=-1 +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_c_stack_direction" >&5 +echo "${ECHO_T}$ac_cv_c_stack_direction" >&6; } + +cat >>confdefs.h <<_ACEOF +#define STACK_DIRECTION $ac_cv_c_stack_direction +_ACEOF + + +fi + + + +for ac_func in strtold +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +else + case " $LIBOBJS " in + *" $ac_func.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS $ac_func.$ac_objext" + ;; +esac + +fi +done + + + + + +for ac_func in poll realpath mmap +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +for ac_func in regcomp +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + REGCOMP=yes +fi +done + + +for ac_func in fnmatch +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + FNMATCH=yes +fi +done + + + if test "$FNMATCH" != yes; then + NEED_FNMATCH_TRUE= + NEED_FNMATCH_FALSE='#' +else + NEED_FNMATCH_TRUE='#' + NEED_FNMATCH_FALSE= +fi + + if test "$REGCOMP" != yes; then + NEED_REGEX_TRUE= + NEED_REGEX_FALSE='#' +else + NEED_REGEX_TRUE='#' + NEED_REGEX_FALSE= +fi + + + + if test "X$prefix" = "XNONE"; then + acl_final_prefix="$ac_default_prefix" + else + acl_final_prefix="$prefix" + fi + if test "X$exec_prefix" = "XNONE"; then + acl_final_exec_prefix='${prefix}' + else + acl_final_exec_prefix="$exec_prefix" + fi + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" + prefix="$acl_save_prefix" + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +# Prepare PATH_SEPARATOR. +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { echo "$as_me:$LINENO: checking for ld used by GCC" >&5 +echo $ECHO_N "checking for ld used by GCC... $ECHO_C" >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | [A-Za-z]:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { echo "$as_me:$LINENO: checking for GNU ld" >&5 +echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6; } +else + { echo "$as_me:$LINENO: checking for non-GNU ld" >&5 +echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6; } +fi +if test "${acl_cv_path_LD+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + acl_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in + *GNU* | *'with BFD'*) + test "$with_gnu_ld" != no && break ;; + *) + test "$with_gnu_ld" != yes && break ;; + esac + fi + done + IFS="$ac_save_ifs" +else + acl_cv_path_LD="$LD" # Let the user override the test with a path. +fi +fi + +LD="$acl_cv_path_LD" +if test -n "$LD"; then + { echo "$as_me:$LINENO: result: $LD" >&5 +echo "${ECHO_T}$LD" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi +test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 +echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} + { (exit 1); exit 1; }; } +{ echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 +echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6; } +if test "${acl_cv_prog_gnu_ld+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # I'd rather use --version here, but apparently some GNU ld's only accept -v. +case `$LD -v 2>&1 &5 +echo "${ECHO_T}$acl_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$acl_cv_prog_gnu_ld + + + + + { echo "$as_me:$LINENO: checking for shared library run path origin" >&5 +echo $ECHO_N "checking for shared library run path origin... $ECHO_C" >&6; } +if test "${acl_cv_rpath+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ + ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh + . ./conftest.sh + rm -f ./conftest.sh + acl_cv_rpath=done + +fi +{ echo "$as_me:$LINENO: result: $acl_cv_rpath" >&5 +echo "${ECHO_T}$acl_cv_rpath" >&6; } + wl="$acl_cv_wl" + libext="$acl_cv_libext" + shlibext="$acl_cv_shlibext" + hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" + hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" + hardcode_direct="$acl_cv_hardcode_direct" + hardcode_minus_L="$acl_cv_hardcode_minus_L" + # Check whether --enable-rpath was given. +if test "${enable_rpath+set}" = set; then + enableval=$enable_rpath; : +else + enable_rpath=yes +fi + + + + acl_libdirstem=lib + searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` + if test -n "$searchpath"; then + acl_save_IFS="${IFS= }"; IFS=":" + for searchdir in $searchpath; do + if test -d "$searchdir"; then + case "$searchdir" in + */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; + *) searchdir=`cd "$searchdir" && pwd` + case "$searchdir" in + */lib64 ) acl_libdirstem=lib64 ;; + esac ;; + esac + fi + done + IFS="$acl_save_IFS" + fi + + + + + + + + + use_additional=yes + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + +# Check whether --with-libiconv-prefix was given. +if test "${with_libiconv_prefix+set}" = set; then + withval=$with_libiconv_prefix; + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + else + additional_includedir="$withval/include" + additional_libdir="$withval/$acl_libdirstem" + fi + fi + +fi + + LIBICONV= + LTLIBICONV= + INCICONV= + rpathdirs= + ltrpathdirs= + names_already_handled= + names_next_round='iconv ' + while test -n "$names_next_round"; do + names_this_round="$names_next_round" + names_next_round= + for name in $names_this_round; do + already_handled= + for n in $names_already_handled; do + if test "$n" = "$name"; then + already_handled=yes + break + fi + done + if test -z "$already_handled"; then + names_already_handled="$names_already_handled $name" + uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` + eval value=\"\$HAVE_LIB$uppername\" + if test -n "$value"; then + if test "$value" = yes; then + eval value=\"\$LIB$uppername\" + test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value" + eval value=\"\$LTLIB$uppername\" + test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value" + else + : + fi + else + found_dir= + found_la= + found_so= + found_a= + if test $use_additional = yes; then + if test -n "$shlibext" \ + && { test -f "$additional_libdir/lib$name.$shlibext" \ + || { test "$shlibext" = dll \ + && test -f "$additional_libdir/lib$name.dll.a"; }; }; then + found_dir="$additional_libdir" + if test -f "$additional_libdir/lib$name.$shlibext"; then + found_so="$additional_libdir/lib$name.$shlibext" + else + found_so="$additional_libdir/lib$name.dll.a" + fi + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + else + if test -f "$additional_libdir/lib$name.$libext"; then + found_dir="$additional_libdir" + found_a="$additional_libdir/lib$name.$libext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + fi + fi + fi + if test "X$found_dir" = "X"; then + for x in $LDFLAGS $LTLIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + case "$x" in + -L*) + dir=`echo "X$x" | sed -e 's/^X-L//'` + if test -n "$shlibext" \ + && { test -f "$dir/lib$name.$shlibext" \ + || { test "$shlibext" = dll \ + && test -f "$dir/lib$name.dll.a"; }; }; then + found_dir="$dir" + if test -f "$dir/lib$name.$shlibext"; then + found_so="$dir/lib$name.$shlibext" + else + found_so="$dir/lib$name.dll.a" + fi + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + else + if test -f "$dir/lib$name.$libext"; then + found_dir="$dir" + found_a="$dir/lib$name.$libext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + fi + fi + ;; + esac + if test "X$found_dir" != "X"; then + break + fi + done + fi + if test "X$found_dir" != "X"; then + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name" + if test "X$found_so" != "X"; then + if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + else + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $found_dir" + fi + if test "$hardcode_direct" = yes; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + else + if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $found_dir" + fi + else + haveit= + for x in $LDFLAGS $LIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir" + fi + if test "$hardcode_minus_L" != no; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + else + LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" + fi + fi + fi + fi + else + if test "X$found_a" != "X"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a" + else + LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name" + fi + fi + additional_includedir= + case "$found_dir" in + */$acl_libdirstem | */$acl_libdirstem/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` + additional_includedir="$basedir/include" + ;; + esac + if test "X$additional_includedir" != "X"; then + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + for x in $CPPFLAGS $INCICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir" + fi + fi + fi + fi + fi + if test -n "$found_la"; then + save_libdir="$libdir" + case "$found_la" in + */* | *\\*) . "$found_la" ;; + *) . "./$found_la" ;; + esac + libdir="$save_libdir" + for dep in $dependency_libs; do + case "$dep" in + -L*) + additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` + if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + haveit= + for x in $LDFLAGS $LIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir" + fi + fi + haveit= + for x in $LDFLAGS $LTLIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir" + fi + fi + fi + fi + ;; + -R*) + dir=`echo "X$dep" | sed -e 's/^X-R//'` + if test "$enable_rpath" != no; then + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $dir" + fi + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $dir" + fi + fi + ;; + -l*) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` + ;; + *.la) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` + ;; + *) + LIBICONV="${LIBICONV}${LIBICONV:+ }$dep" + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep" + ;; + esac + done + fi + else + LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name" + fi + fi + fi + done + done + if test "X$rpathdirs" != "X"; then + if test -n "$hardcode_libdir_separator"; then + alldirs= + for found_dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" + done + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" + else + for found_dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$found_dir" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" + done + fi + fi + if test "X$ltrpathdirs" != "X"; then + for found_dir in $ltrpathdirs; do + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir" + done + fi + + + + + + + + am_save_CPPFLAGS="$CPPFLAGS" + + for element in $INCICONV; do + haveit= + for x in $CPPFLAGS; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X$element"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" + fi + done + + + { echo "$as_me:$LINENO: checking for iconv" >&5 +echo $ECHO_N "checking for iconv... $ECHO_C" >&6; } +if test "${am_cv_func_iconv+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + am_cv_func_iconv="no, consider installing GNU libiconv" + am_cv_lib_iconv=no + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +int +main () +{ +iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + am_cv_func_iconv=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + if test "$am_cv_func_iconv" != yes; then + am_save_LIBS="$LIBS" + LIBS="$LIBS $LIBICONV" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +int +main () +{ +iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + am_cv_lib_iconv=yes + am_cv_func_iconv=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$am_save_LIBS" + fi + +fi +{ echo "$as_me:$LINENO: result: $am_cv_func_iconv" >&5 +echo "${ECHO_T}$am_cv_func_iconv" >&6; } + if test "$am_cv_func_iconv" = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_ICONV 1 +_ACEOF + + fi + if test "$am_cv_lib_iconv" = yes; then + { echo "$as_me:$LINENO: checking how to link with libiconv" >&5 +echo $ECHO_N "checking how to link with libiconv... $ECHO_C" >&6; } + { echo "$as_me:$LINENO: result: $LIBICONV" >&5 +echo "${ECHO_T}$LIBICONV" >&6; } + else + CPPFLAGS="$am_save_CPPFLAGS" + LIBICONV= + LTLIBICONV= + fi + + + + if test "$am_cv_func_iconv" = yes; then + { echo "$as_me:$LINENO: checking for iconv declaration" >&5 +echo $ECHO_N "checking for iconv declaration... $ECHO_C" >&6; } + if test "${am_cv_proto_iconv+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#include +extern +#ifdef __cplusplus +"C" +#endif +#if defined(__STDC__) || defined(__cplusplus) +size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); +#else +size_t iconv(); +#endif + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + am_cv_proto_iconv_arg1="" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + am_cv_proto_iconv_arg1="const" +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);" +fi + + am_cv_proto_iconv=`echo "$am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` + { echo "$as_me:$LINENO: result: ${ac_t:- + }$am_cv_proto_iconv" >&5 +echo "${ECHO_T}${ac_t:- + }$am_cv_proto_iconv" >&6; } + +cat >>confdefs.h <<_ACEOF +#define ICONV_CONST $am_cv_proto_iconv_arg1 +_ACEOF + + fi + + + +{ echo "$as_me:$LINENO: checking for strtold declaration in " >&5 +echo $ECHO_N "checking for strtold declaration in ... $ECHO_C" >&6; } +if test "${rc_cv_strtold_declared+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "\" >/dev/null 2>&1; then + rc_cv_strtold_declared=yes +else + rc_cv_strtold_declared=no +fi +rm -f conftest* + +fi +{ echo "$as_me:$LINENO: result: $rc_cv_strtold_declared" >&5 +echo "${ECHO_T}$rc_cv_strtold_declared" >&6; } +if test "$rc_cv_strtold_declared" = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_STRTOLD_DECLARED 1 +_ACEOF + +fi + +ac_config_files="$ac_config_files Makefile libcompat/Makefile" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 +echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + *) $as_unset $ac_var ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + test "x$cache_file" != "x/dev/null" && + { echo "$as_me:$LINENO: updating cache $cache_file" >&5 +echo "$as_me: updating cache $cache_file" >&6;} + cat confcache >$cache_file + else + { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 +echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${USING_RCC_TRUE}" && test -z "${USING_RCC_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"USING_RCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"USING_RCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${NEED_FNMATCH_TRUE}" && test -z "${NEED_FNMATCH_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"NEED_FNMATCH\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"NEED_FNMATCH\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${NEED_REGEX_TRUE}" && test -z "${NEED_REGEX_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"NEED_REGEX\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"NEED_REGEX\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi + +: ${CONFIG_STATUS=./config.status} +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 +echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >$CONFIG_STATUS <<_ACEOF +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false +SHELL=\${CONFIG_SHELL-$SHELL} +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + + + +# PATH needs CR +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +as_nl=' +' +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + { (exit 1); exit 1; } +fi + +# Work around bugs in pre-3.0 UWIN ksh. +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + + +# Name of the executable. +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# CDPATH. +$as_unset CDPATH + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in +-n*) + case `echo 'x\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + *) ECHO_C='\c';; + esac;; +*) + ECHO_N='-n';; +esac + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir +fi +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 + +# Save the log message, to keep $[0] and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by nesc $as_me 1.3.0, which was +generated by GNU Autoconf 2.61. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTIONS] [FILE]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF +ac_cs_version="\\ +nesc config.status 1.3.0 +configured by $0, generated by GNU Autoconf 2.61, + with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" + +Copyright (C) 2006 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +# If no file are specified by the user, then we need to provide default +# value. By we need to know if files were specified by the user. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + echo "$ac_cs_version"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + CONFIG_FILES="$CONFIG_FILES $ac_optarg" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + { echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) { echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$ac_config_targets $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF +if \$ac_cs_recheck; then + echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 + CONFIG_SHELL=$SHELL + export CONFIG_SHELL + exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "autoconf.h") CONFIG_HEADERS="$CONFIG_HEADERS autoconf.h" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "libcompat/Makefile") CONFIG_FILES="$CONFIG_FILES libcompat/Makefile" ;; + + *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= + trap 'exit_status=$? + { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status +' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || +{ + echo "$me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} + +# +# Set up the sed scripts for CONFIG_FILES section. +# + +# No need to generate the scripts if there are no CONFIG_FILES. +# This happens for instance when ./config.status config.h +if test -n "$CONFIG_FILES"; then + +_ACEOF + + + +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + cat >conf$$subs.sed <<_ACEOF +SHELL!$SHELL$ac_delim +PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim +PACKAGE_NAME!$PACKAGE_NAME$ac_delim +PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim +PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim +PACKAGE_STRING!$PACKAGE_STRING$ac_delim +PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim +exec_prefix!$exec_prefix$ac_delim +prefix!$prefix$ac_delim +program_transform_name!$program_transform_name$ac_delim +bindir!$bindir$ac_delim +sbindir!$sbindir$ac_delim +libexecdir!$libexecdir$ac_delim +datarootdir!$datarootdir$ac_delim +datadir!$datadir$ac_delim +sysconfdir!$sysconfdir$ac_delim +sharedstatedir!$sharedstatedir$ac_delim +localstatedir!$localstatedir$ac_delim +includedir!$includedir$ac_delim +oldincludedir!$oldincludedir$ac_delim +docdir!$docdir$ac_delim +infodir!$infodir$ac_delim +htmldir!$htmldir$ac_delim +dvidir!$dvidir$ac_delim +pdfdir!$pdfdir$ac_delim +psdir!$psdir$ac_delim +libdir!$libdir$ac_delim +localedir!$localedir$ac_delim +mandir!$mandir$ac_delim +DEFS!$DEFS$ac_delim +ECHO_C!$ECHO_C$ac_delim +ECHO_N!$ECHO_N$ac_delim +ECHO_T!$ECHO_T$ac_delim +LIBS!$LIBS$ac_delim +build_alias!$build_alias$ac_delim +host_alias!$host_alias$ac_delim +target_alias!$target_alias$ac_delim +INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim +INSTALL_SCRIPT!$INSTALL_SCRIPT$ac_delim +INSTALL_DATA!$INSTALL_DATA$ac_delim +am__isrc!$am__isrc$ac_delim +CYGPATH_W!$CYGPATH_W$ac_delim +PACKAGE!$PACKAGE$ac_delim +VERSION!$VERSION$ac_delim +ACLOCAL!$ACLOCAL$ac_delim +AUTOCONF!$AUTOCONF$ac_delim +AUTOMAKE!$AUTOMAKE$ac_delim +AUTOHEADER!$AUTOHEADER$ac_delim +MAKEINFO!$MAKEINFO$ac_delim +install_sh!$install_sh$ac_delim +STRIP!$STRIP$ac_delim +INSTALL_STRIP_PROGRAM!$INSTALL_STRIP_PROGRAM$ac_delim +mkdir_p!$mkdir_p$ac_delim +AWK!$AWK$ac_delim +SET_MAKE!$SET_MAKE$ac_delim +am__leading_dot!$am__leading_dot$ac_delim +AMTAR!$AMTAR$ac_delim +am__tar!$am__tar$ac_delim +am__untar!$am__untar$ac_delim +build!$build$ac_delim +build_cpu!$build_cpu$ac_delim +build_vendor!$build_vendor$ac_delim +build_os!$build_os$ac_delim +host!$host$ac_delim +host_cpu!$host_cpu$ac_delim +host_vendor!$host_vendor$ac_delim +host_os!$host_os$ac_delim +CPPFLAGS!$CPPFLAGS$ac_delim +CFLAGS!$CFLAGS$ac_delim +CC!$CC$ac_delim +LDFLAGS!$LDFLAGS$ac_delim +ac_ct_CC!$ac_ct_CC$ac_delim +EXEEXT!$EXEEXT$ac_delim +OBJEXT!$OBJEXT$ac_delim +DEPDIR!$DEPDIR$ac_delim +am__include!$am__include$ac_delim +am__quote!$am__quote$ac_delim +AMDEP_TRUE!$AMDEP_TRUE$ac_delim +AMDEP_FALSE!$AMDEP_FALSE$ac_delim +AMDEPBACKSLASH!$AMDEPBACKSLASH$ac_delim +CCDEPMODE!$CCDEPMODE$ac_delim +am__fastdepCC_TRUE!$am__fastdepCC_TRUE$ac_delim +am__fastdepCC_FALSE!$am__fastdepCC_FALSE$ac_delim +RANLIB!$RANLIB$ac_delim +USING_RCC_TRUE!$USING_RCC_TRUE$ac_delim +USING_RCC_FALSE!$USING_RCC_FALSE$ac_delim +CPP!$CPP$ac_delim +GREP!$GREP$ac_delim +EGREP!$EGREP$ac_delim +ALLOCA!$ALLOCA$ac_delim +LIBOBJS!$LIBOBJS$ac_delim +NEED_FNMATCH_TRUE!$NEED_FNMATCH_TRUE$ac_delim +NEED_FNMATCH_FALSE!$NEED_FNMATCH_FALSE$ac_delim +NEED_REGEX_TRUE!$NEED_REGEX_TRUE$ac_delim +NEED_REGEX_FALSE!$NEED_REGEX_FALSE$ac_delim +LIBICONV!$LIBICONV$ac_delim +LTLIBICONV!$LTLIBICONV$ac_delim +_ACEOF + + if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then + break + elif $ac_last_try; then + { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed` +if test -n "$ac_eof"; then + ac_eof=`echo "$ac_eof" | sort -nru | sed 1q` + ac_eof=`expr $ac_eof + 1` +fi + +cat >>$CONFIG_STATUS <<_ACEOF +cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +_ACEOF +sed ' +s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g +s/^/s,@/; s/!/@,|#_!!_#|/ +:n +t n +s/'"$ac_delim"'$/,g/; t +s/$/\\/; p +N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n +' >>$CONFIG_STATUS >$CONFIG_STATUS <<_ACEOF +CEOF$ac_eof +_ACEOF + + +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + cat >conf$$subs.sed <<_ACEOF +LTLIBOBJS!$LTLIBOBJS$ac_delim +_ACEOF + + if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 1; then + break + elif $ac_last_try; then + { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed` +if test -n "$ac_eof"; then + ac_eof=`echo "$ac_eof" | sort -nru | sed 1q` + ac_eof=`expr $ac_eof + 1` +fi + +cat >>$CONFIG_STATUS <<_ACEOF +cat >"\$tmp/subs-2.sed" <<\CEOF$ac_eof +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b end +_ACEOF +sed ' +s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g +s/^/s,@/; s/!/@,|#_!!_#|/ +:n +t n +s/'"$ac_delim"'$/,g/; t +s/$/\\/; p +N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n +' >>$CONFIG_STATUS >$CONFIG_STATUS <<_ACEOF +:end +s/|#_!!_#|//g +CEOF$ac_eof +_ACEOF + + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/ +s/:*\${srcdir}:*/:/ +s/:*@srcdir@:*/:/ +s/^\([^=]*=[ ]*\):*/\1/ +s/:*$// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF +fi # test -n "$CONFIG_FILES" + + +for ac_tag in :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5 +echo "$as_me: error: Invalid tag $ac_tag." >&2;} + { (exit 1); exit 1; }; };; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 +echo "$as_me: error: cannot find input file: $ac_f" >&2;} + { (exit 1); exit 1; }; };; + esac + ac_file_inputs="$ac_file_inputs $ac_f" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input="Generated from "`IFS=: + echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure." + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + fi + + case $ac_tag in + *:-:* | *:-) cat >"$tmp/stdin";; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + { as_dir="$ac_dir" + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 +echo "$as_me: error: cannot create directory $as_dir" >&2;} + { (exit 1); exit 1; }; }; } + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= + +case `sed -n '/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p +' $ac_file_inputs` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF + sed "$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s&@configure_input@&$configure_input&;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" $ac_file_inputs | sed -f "$tmp/subs-1.sed" | sed -f "$tmp/subs-2.sed" >$tmp/out + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && + { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&5 +echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&2;} + + rm -f "$tmp/stdin" + case $ac_file in + -) cat "$tmp/out"; rm -f "$tmp/out";; + *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;; + esac + ;; + :H) + # + # CONFIG_HEADER + # +_ACEOF + +# Transform confdefs.h into a sed script `conftest.defines', that +# substitutes the proper values into config.h.in to produce config.h. +rm -f conftest.defines conftest.tail +# First, append a space to every undef/define line, to ease matching. +echo 's/$/ /' >conftest.defines +# Then, protect against being on the right side of a sed subst, or in +# an unquoted here document, in config.status. If some macros were +# called several times there might be several #defines for the same +# symbol, which is useless. But do not sort them, since the last +# AC_DEFINE must be honored. +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +# These sed commands are passed to sed as "A NAME B PARAMS C VALUE D", where +# NAME is the cpp macro being defined, VALUE is the value it is being given. +# PARAMS is the parameter list in the macro definition--in most cases, it's +# just an empty string. +ac_dA='s,^\\([ #]*\\)[^ ]*\\([ ]*' +ac_dB='\\)[ (].*,\\1define\\2' +ac_dC=' ' +ac_dD=' ,' + +uniq confdefs.h | + sed -n ' + t rset + :rset + s/^[ ]*#[ ]*define[ ][ ]*// + t ok + d + :ok + s/[\\&,]/\\&/g + s/^\('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/ '"$ac_dA"'\1'"$ac_dB"'\2'"${ac_dC}"'\3'"$ac_dD"'/p + s/^\('"$ac_word_re"'\)[ ]*\(.*\)/'"$ac_dA"'\1'"$ac_dB$ac_dC"'\2'"$ac_dD"'/p + ' >>conftest.defines + +# Remove the space that was appended to ease matching. +# Then replace #undef with comments. This is necessary, for +# example, in the case of _POSIX_SOURCE, which is predefined and required +# on some systems where configure will not decide to define it. +# (The regexp can be short, since the line contains either #define or #undef.) +echo 's/ $// +s,^[ #]*u.*,/* & */,' >>conftest.defines + +# Break up conftest.defines: +ac_max_sed_lines=50 + +# First sed command is: sed -f defines.sed $ac_file_inputs >"$tmp/out1" +# Second one is: sed -f defines.sed "$tmp/out1" >"$tmp/out2" +# Third one will be: sed -f defines.sed "$tmp/out2" >"$tmp/out1" +# et cetera. +ac_in='$ac_file_inputs' +ac_out='"$tmp/out1"' +ac_nxt='"$tmp/out2"' + +while : +do + # Write a here document: + cat >>$CONFIG_STATUS <<_ACEOF + # First, check the format of the line: + cat >"\$tmp/defines.sed" <<\\CEOF +/^[ ]*#[ ]*undef[ ][ ]*$ac_word_re[ ]*\$/b def +/^[ ]*#[ ]*define[ ][ ]*$ac_word_re[( ]/b def +b +:def +_ACEOF + sed ${ac_max_sed_lines}q conftest.defines >>$CONFIG_STATUS + echo 'CEOF + sed -f "$tmp/defines.sed"' "$ac_in >$ac_out" >>$CONFIG_STATUS + ac_in=$ac_out; ac_out=$ac_nxt; ac_nxt=$ac_in + sed 1,${ac_max_sed_lines}d conftest.defines >conftest.tail + grep . conftest.tail >/dev/null || break + rm -f conftest.defines + mv conftest.tail conftest.defines +done +rm -f conftest.defines conftest.tail + +echo "ac_result=$ac_in" >>$CONFIG_STATUS +cat >>$CONFIG_STATUS <<\_ACEOF + if test x"$ac_file" != x-; then + echo "/* $configure_input */" >"$tmp/config.h" + cat "$ac_result" >>"$tmp/config.h" + if diff $ac_file "$tmp/config.h" >/dev/null 2>&1; then + { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 +echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f $ac_file + mv "$tmp/config.h" $ac_file + fi + else + echo "/* $configure_input */" + cat "$ac_result" + fi + rm -f "$tmp/out12" +# Compute $ac_file's index in $config_headers. +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $ac_file | $ac_file:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $ac_file" >`$as_dirname -- $ac_file || +$as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X$ac_file : 'X\(//\)[^/]' \| \ + X$ac_file : 'X\(//\)$' \| \ + X$ac_file : 'X\(/\)' \| . 2>/dev/null || +echo X$ac_file | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { echo "$as_me:$LINENO: executing $ac_file commands" >&5 +echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed 10q "$mf" | grep '^#.*generated by automake' > /dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || +echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + { as_dir=$dirpart/$fdir + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 +echo "$as_me: error: cannot create directory $as_dir" >&2;} + { (exit 1); exit 1; }; }; } + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done +done + ;; + + esac +done # for ac_tag + + +{ (exit 0); exit 0; } +_ACEOF +chmod +x $CONFIG_STATUS +ac_clean_files=$ac_clean_files_save + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || { (exit 1); exit 1; } +fi + diff --git a/src/configure.in b/src/configure.in new file mode 100644 index 0000000..1ab8bed --- /dev/null +++ b/src/configure.in @@ -0,0 +1,79 @@ +# This file is part of the nesC compiler. +# +# This file is derived from the RC Compiler. It is thus +# Copyright (C) 2000-2001 The Regents of the University of California. +# Changes for nesC are +# Copyright (C) 2002 Intel Corporation +# +# The attached "nesC" software is provided to you under the terms and +# conditions of the GNU General Public License Version 2 as published by the +# Free Software Foundation. +# +# nesC 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 nesC; see the file COPYING. If not, write to +# the Free Software Foundation, 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +dnl -*- m4 -*- + +# force autoconf 2.5 on Debian systems +AC_PREREQ(2.50) + +AC_INIT(nesc, 1.3.0) +AC_CONFIG_AUX_DIR(../config-aux) +AC_CONFIG_SRCDIR(c-parse.y) +AM_CONFIG_HEADER(autoconf.h) +AM_INIT_AUTOMAKE + +: ${CFLAGS=-g} + +AC_CANONICAL_HOST +AC_MSG_CHECKING(for darwin) +case $host in + *-*-darwin*) + CFLAGS="$CFLAGS -Wno-long-double" + AC_MSG_RESULT(yes) + ;; + *) + AC_MSG_RESULT(no) +esac +AC_SUBST(CPPFLAGS) +AC_SUBST(CFLAGS) + +AC_PROG_CC +AC_PROG_RANLIB +AC_PROG_MAKE_SET + +CPARSE_TRY_CFLAGS(-Wall) + +AC_MSG_CHECKING(whether we are using rcc) +AC_TRY_COMPILE([], [void * traditional pointer;], RCC=yes, RCC=no) +AM_CONDITIONAL(USING_RCC, test "$RCC" = yes) +AC_MSG_RESULT($RCC) + +AC_CHECK_SIZEOF(long long) +AC_CHECK_SIZEOF(void *) + +AC_FUNC_ALLOCA + +AC_REPLACE_FUNCS(strtold) +AC_CHECK_FUNCS(poll realpath mmap) +AC_CHECK_FUNCS(regcomp, [ REGCOMP=yes ]) +AC_CHECK_FUNCS(fnmatch, [ FNMATCH=yes ]) + +AM_CONDITIONAL(NEED_FNMATCH, test "$FNMATCH" != yes) +AM_CONDITIONAL(NEED_REGEX, test "$REGCOMP" != yes) + +AM_ICONV + +RC_CHECK_DECL(strtold, stdlib.h) + +AC_OUTPUT( + Makefile + libcompat/Makefile + ) diff --git a/src/constants.c b/src/constants.c new file mode 100644 index 0000000..c7fd8f6 --- /dev/null +++ b/src/constants.c @@ -0,0 +1,589 @@ +/* This file is part of the nesC compiler. + +This file is derived from the RC Compiler. It is thus + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +/* ASSUME: (float)(long double)f == f + (double)(long double)d == d +*/ +/* XXX: overflow detection (signed ints only, gcc doesn't do reals) + initialised arrays are missing their size +*/ + +/* Note: legal ops on complex are: + +, -, *, /, ==, !=, &&, ||, __real__, __imag__, ~ (conjugate) +*/ + +#define _ISOC99_SOURCE +#include "parser.h" +#include "constants.h" +#include "c-parse.h" +#include "semantics.h" +#include "cval.h" +#include "nesc-magic.h" +#include +#include "AST_utils.h" + +static known_cst new_known_cst(region r, type t, cval c) +{ + known_cst kc = ralloc(parse_region, struct known_cst); + + kc->type = t; + kc->cval = c; + + return kc; +} + +known_cst make_unknown_cst(cval c, type t) +{ + cval cst; + + if (cval_isaddress(c)) + cst = cval_unknown_address; + else + cst = cval_unknown_number; + + return new_known_cst(parse_region, t, cst); +} + +known_cst make_cst(cval c, type t) +{ + if (cval_istop(c)) + return NULL; + + return new_known_cst(parse_region, t, cval_cast(c, t)); +} + +known_cst make_address_cst(data_declaration ddecl, label_declaration ldecl, + largest_int offset, type t) +{ + return make_cst(make_cval_address(ddecl, ldecl, offset), t); +} + +known_cst make_unsigned_cst(largest_uint x, type t) +{ + return make_cst(make_cval_unsigned(x, t), t); +} + +known_cst make_signed_cst(largest_int x, type t) +{ + return make_cst(make_cval_signed(x, t), t); +} + +known_cst cast_constant(known_cst c, type to) +{ + if (type_equal(c->type, to)) + return c; + + return make_cst(cval_cast(c->cval, to), to); +} + +known_cst fold_label_address(expression e) +{ + return make_address_cst(NULL, CAST(label_address, e)->id_label->ldecl, 0, e->type); +} + +known_cst fold_sizeof(expression e, type stype) +{ + if (type_size_cc(stype)) + return make_cst(type_size(stype), e->type); + else + return NULL; +} + +known_cst fold_alignof(expression e, type atype) +{ + if (type_has_size(atype)) + return make_cst(type_alignment(atype), e->type); + else + /* compile-time error, alignof incomplete type */ + return make_unsigned_cst(1, e->type); +} + +known_cst fold_cast(expression e) +{ + cast cc = CAST(cast, e); + + if (cc->arg1->cst && !type_void(e->type)) + return cast_constant(cc->arg1->cst, e->type); + else + return NULL; +} + +/* +, -, ! and ~ only */ +known_cst fold_unary(expression e) +{ + unary u = CAST(unary, e); + known_cst arg = u->arg1->cst; + type t = u->type; + + if (arg) + { + switch (u->kind) + { + case kind_unary_plus: + /* Note that this allows +(int)&x to be a constant... + This is consistent with gcc */ + return cast_constant(arg, t); /* essentially a no-op */ + + case kind_unary_minus: + return make_cst(cval_negate(cval_cast(arg->cval, t)), t); + + case kind_not: + return make_cst(cval_not(cval_cast(arg->cval, t)), t); + + case kind_bitnot: + return make_cst(cval_bitnot(cval_cast(arg->cval, t)), t); + + case kind_conjugate: + return make_cst(cval_conjugate(cval_cast(arg->cval, t)), t); + + case kind_realpart: + if (!type_complex(u->arg1->type)) + return cast_constant(arg, t); + else + return make_cst(cval_realpart(cval_cast(arg->cval, t)), t); + + case kind_imagpart: + if (!type_complex(u->arg1->type)) + return make_cst(cval_cast(cval_zero, t), t); + else + return make_cst(cval_imagpart(cval_cast(arg->cval, t)), t); + + default: + assert(0); + break; + } + } + return NULL; +} + +/* XXX: overflow */ +static known_cst fold_sub(type restype, known_cst c1, known_cst c2) +{ + type t1 = c1->type, t2 = c2->type, basetype, ct; + cval s = make_cval_unsigned(1, size_t_type), res; + + basetype = type_pointer(t1) ? t1 : type_pointer(t2) ? t2 : NULL; + if (basetype) + { + basetype = type_points_to(basetype); + + if (!type_size_cc(basetype)) + return NULL; + + s = cval_cast(type_size(basetype), size_t_type); + ct = intptr_type; + } + else + ct = restype; + + s = cval_cast(s, ct); + if (type_pointer(t1) && type_pointer(t2)) + res = cval_divide(cval_cast(cval_sub(cval_cast(c1->cval, ct), cval_cast(c2->cval, ct)), ct), + s); + else + res = cval_sub(cval_cast(c1->cval, ct), + cval_divide(cval_cast(c2->cval, ct), s)); + + return make_cst(res, restype); +} + +/* XXX: overflow */ +known_cst fold_add(type restype, known_cst c1, known_cst c2) +{ + type t1 = c1->type, t2 = c2->type, ct; + cval s = make_cval_unsigned(1, size_t_type); + + if (type_pointer(t2)) + { + known_cst ctmp; + type ttmp; + + ctmp = c1; c1 = c2; c2 = ctmp; + ttmp = t1; t1 = t2; t2 = ttmp; + } + + if (type_pointer(t1)) + { + type basetype = type_points_to(t1); + + if (!type_size_cc(basetype)) + return NULL; + + s = cval_cast(type_size(basetype), size_t_type); + ct = intptr_type; + } + else + ct = restype; + + return make_cst(cval_add(cval_cast(c1->cval, ct), + cval_times(cval_cast(c2->cval, ct), cval_cast(s, ct))), + restype); +} + +known_cst fold_binary(type t, expression e) +{ + binary b = CAST(binary, e); + known_cst c1 = b->arg1->cst, c2 = b->arg2->cst; + type t1 = type_default_conversion(b->arg1->type), + t2 = type_default_conversion(b->arg2->type); + + if (b->kind == kind_andand || b->kind == kind_oror) + { + if (c1) + { + if (constant_knownbool(c1)) + { + bool c1val = constant_boolvalue(c1); + + if (b->kind == kind_andand ? !c1val : c1val) + return make_signed_cst(c1val, t); + } + if (constant_unknown_number(c1)) + return make_unknown_cst(cval_unknown_number, t); + } + + if (c1 && c2) + { + if (constant_knownbool(c2)) + { + bool c2val = constant_boolvalue(c2); + if (b->kind == kind_andand ? !c2val : c2val) + return make_signed_cst(c2val, t); + } + + if (constant_unknown_number(c2)) + return make_unknown_cst(cval_unknown_number, t); + } + } + else if (c1 && c2) + { + cval cv1 = c1->cval, cv2 = c2->cval; + + switch (b->kind) + { + case kind_plus: case kind_array_ref: + return fold_add(t, c1, c2); + + case kind_minus: + return fold_sub(t, c1, c2); + + case kind_times: case kind_divide: case kind_modulo: + case kind_lshift: case kind_rshift: + case kind_bitand: case kind_bitor: case kind_bitxor: { + cval res; + + cv1 = cval_cast(cv1, t); + cv2 = cval_cast(cv2, t); + + switch (b->kind) { + case kind_times: res = cval_times(cv1, cv2); break; + case kind_divide: res = cval_divide(cv1, cv2); break; + case kind_modulo: res = cval_modulo(cv1, cv2); break; + case kind_lshift: res = cval_lshift(cv1, cv2); break; + case kind_rshift: res = cval_rshift(cv1, cv2); break; + case kind_bitand: res = cval_bitand(cv1, cv2); break; + case kind_bitor: res = cval_bitor(cv1, cv2); break; + case kind_bitxor: res = cval_bitxor(cv1, cv2); break; + default: abort(); return NULL; + } + return make_cst(res, t); + } + case kind_eq: case kind_ne: + case kind_leq: case kind_geq: case kind_lt: case kind_gt: { + cval res; + type ct; + + /* Pointers win. */ + if (type_pointer(t1) || type_pointer(t2)) + ct = intptr_type; + else + ct = common_type(t1, t2); + + cv1 = cval_cast(cv1, ct); + cv2 = cval_cast(cv2, ct); + + switch (b->kind) { + case kind_eq: res = cval_eq(cv1, cv2); break; + case kind_ne: res = cval_ne(cv1, cv2); break; + case kind_leq: res = cval_leq(cv1, cv2); break; + case kind_geq: res = cval_geq(cv1, cv2); break; + case kind_lt: res = cval_lt(cv1, cv2); break; + case kind_gt: res = cval_gt(cv1, cv2); break; + default: abort(); return NULL; + } + return make_cst(res, t); + } + default: + assert(0); return NULL; + } + } + + return NULL; +} + +known_cst fold_conditional(expression e) +{ + conditional c = CAST(conditional, e); + known_cst cond = c->condition->cst; + + if (cond) + { + expression arg1 = c->arg1 ? c->arg1 : c->condition; + known_cst kc1 = arg1->cst, kc2 = c->arg2->cst; + + if (constant_knownbool(cond)) + { + expression value = constant_boolvalue(cond) ? arg1 : c->arg2; + + e->static_address = value->static_address; + if (value->cst) + return cast_constant(value->cst, e->type); + else + return NULL; + } + else if (constant_unknown_number(cond) && kc1 && kc2) + /* Faced with an unknown condition and two constant arguments, we + return an unknown constant. Unknown number if both arg1 and arg2 + are unknown numbers, an unknown address otherwise */ + return make_unknown_cst(cval_isaddress(kc1->cval) ? + kc1->cval : kc2->cval, e->type); + } + + return NULL; +} + +known_cst fold_function_call(expression e, int pass) +{ + function_call fce = CAST(function_call, e); + + if (call_to(builtin_constant_p, fce) && fce->args) + return make_signed_cst(fce->args->cst != NULL, int_type); + + return fold_magic(fce, pass); +} + +known_cst fold_identifier(expression e, data_declaration decl, int pass) +{ + if (decl->kind == decl_constant) + // We don't know template arg values at parse time + return pass == 0 && decl->substitute ? + make_unknown_cst(type_real(e->type) ? cval_unknown_number : + cval_unknown_address, e->type) : + decl->value; + else + return NULL; +} + +known_cst foldaddress_identifier(expression e, data_declaration decl) +{ + if ((decl->kind == decl_function && decl->ftype != function_nested) || + (decl->kind == decl_variable && !decl->islocal) || + decl->kind == decl_magic_string) + return make_address_cst(decl, NULL, 0, make_pointer_type(e->type)); + else + return NULL; +} + +known_cst foldaddress_string(string s) +{ + return make_address_cst(s->ddecl, NULL, 0, s->type); +} + +known_cst foldaddress_field_ref(expression e) +{ + field_ref fref = CAST(field_ref, e); + field_declaration fdecl = fref->fdecl; + known_cst object = fref->arg1->static_address; + cval field_offset; + type pftype; + + if (!object || cval_istop(fdecl->offset) || !cval_istop(fdecl->bitwidth)) + return NULL; + + if (constant_unknown(object)) + return make_unknown_cst(object->cval, object->type); + + pftype = make_pointer_type(fdecl->type); + field_offset = cval_divide(fdecl->offset, cval_bitsperbyte); + + /* Conceivably, size_t could be smaller than pointers. So we cast + the offset to the pointer-to-field type (we are assuming that is + the same size as the pointer to base-struct type) */ + return make_cst(cval_add(object->cval, cval_cast(field_offset, pftype)), + pftype); +} + +#ifndef HAVE_STRTOLD +#define strtold strtod +#endif + +lexical_cst fold_lexical_real(type realtype, location loc, cstring tok) +{ + lexical_cst c = new_lexical_cst(parse_region, loc, tok); + cval realvalue = make_cval_float(strtold(tok.data, NULL)); + + if (type_complex(realtype)) + realvalue = make_cval_complex(cval_cast(cval_zero, make_base_type(realtype)), realvalue); + c->cst = make_cst(realvalue, realtype); + c->type = realtype; + return c; +} + +lexical_cst fold_lexical_char(location loc, cstring tok, + bool wide_flag, int charvalue) +{ + lexical_cst c = new_lexical_cst(parse_region, loc, tok); + type ctype = wide_flag ? wchar_type : int_type; + + c->type = ctype; + c->cst = make_cst(type_unsigned(ctype) ? + make_cval_unsigned(charvalue, ctype) : + make_cval_signed(charvalue, ctype), + ctype); + return c; +} + +string fold_lexical_string(location loc, string_cst components, cstring value, + bool wide_flag) +{ + data_declaration sdecl = declare_string(NULL, value, wide_flag); + string s = new_string(parse_region, loc, components, sdecl); + + s->type = sdecl->type; + s->static_address = foldaddress_string(s); + s->lvalue = TRUE; + + return s; +} + +lexical_cst fold_lexical_int(type itype, location loc, cstring tok, + bool iscomplex, largest_uint intvalue, bool overflow) +{ + lexical_cst c = new_lexical_cst(parse_region, loc, tok); + cval cv; + + if (overflow) + { + warning_with_location(loc, "integer constant out of range"); + itype = unsigned_long_long_type; + } + else + { + /* Do some range checks */ + if (!uint_inrange(intvalue, itype)) + { + if (uint_inrange(intvalue, unsigned_int_type)) + { + warning_with_location(loc, "decimal constant is so large that it is unsigned"); + itype = unsigned_int_type; + } + /* These other cases cause no warnings */ + else if (uint_inrange(intvalue, long_type)) + itype = long_type; + else if (uint_inrange(intvalue, unsigned_long_type)) + itype = unsigned_long_type; + else if (uint_inrange(intvalue, long_long_type)) + itype = long_long_type; + else if (uint_inrange(intvalue, unsigned_long_long_type)) + itype = unsigned_long_long_type; + } + } + + cv = type_unsigned(itype) ? make_cval_unsigned(intvalue, itype) : + make_cval_signed(intvalue, itype); + if (iscomplex) + { + cv = make_cval_complex(cval_cast(cval_zero, itype), cv); + itype = make_complex_type(itype); + } + + c->type = itype; + c->cst = make_cst(cv, itype); + + return c; +} + + +bool definite_null(expression e) +{ + return + (type_integer(e->type) || + (type_pointer(e->type) && type_void(type_points_to(e->type)))) && + definite_zero(e); +} + +bool definite_zero(expression e) +{ + return e->cst && is_zero_constant(e->cst); +} + +bool is_zero_constant(known_cst c) +{ + return cval_knownbool(c->cval) && !constant_boolvalue(c); +} + +/* Print a warning if a constant expression had overflow in folding. + Invoke this function on every expression that the language + requires to be a constant expression. */ +void constant_overflow_warning(known_cst c) +{ +} + +bool check_constant_once(expression e, cst_kind k) +/* Effects: We want to check whether e is a constant, and possibly for + valid constant values, exactly once (to avoid repeated errors and + warnings) over our multiple constant folding passes. Additionally, + we can't check unknown constants until their value is known. We can + rely on the following: + - a non-constant will not become constant + - we assume, for checking purposes, that a constant's kind (numerical + vs address) will not change (this in some sense untrue, as in: + ? :
+ but we treat that as
for checking purposes) + - a known constant will maintain its value + - an unknown constant will become either non-constant or a known constant + + Additionally, if the constant kind does not match k, we can check it + immediately (presumably to report some error). + + check_constant_once supports this by returning TRUE exactly once, when + its possible to check e's value + + Returns: TRUE the first time !e->cst || e->cst && !constant_unkown(e) || + e->cst && e->cst does not match k +*/ +{ + if (e->cst_checked) + return FALSE; + + if (e->cst && constant_unknown(e->cst)) + /* Unknown constant. We can't check yet it if matches k */ + if (k == cst_any || + (k == cst_numerical && constant_unknown_number(e->cst)) || + (k == cst_address && constant_address(e->cst))) + return FALSE; + + e->cst_checked = TRUE; + + return TRUE; +} + + diff --git a/src/constants.h b/src/constants.h new file mode 100644 index 0000000..fe130cf --- /dev/null +++ b/src/constants.h @@ -0,0 +1,166 @@ +/* This file is part of the nesC compiler. + +This file is derived from the RC Compiler. It is thus + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +/* Constants come in three kinds: + - "unknown": value is completely unknown (constant_unknown) + - "address": value is the address of some global symbol and an offset + (constant_address) + - "value": known value (integer, floating point) +*/ +#ifndef CONSTANTS_H +#define CONSTANTS_H + +struct known_cst { + type type; + cval cval; +}; + +known_cst make_unknown_cst(cval c, type t); +known_cst make_cst(cval c, type t); +known_cst make_address_cst(data_declaration ddecl, label_declaration ldecl, + largest_int offset, type t); +known_cst make_signed_cst(largest_int x, type t); +known_cst make_unsigned_cst(largest_uint x, type t); + +known_cst cast_constant(known_cst c, type to); + +lexical_cst fold_lexical_int(type itype, location loc, cstring tok, + bool iscomplex, largest_uint intvalue, bool overflow); +lexical_cst fold_lexical_real(type realtype, location loc, cstring tok); +/* XXX: What's the right type for charvalue ? (must hold wchar_t or int) */ +lexical_cst fold_lexical_char(location loc, cstring tok, + bool wide_flag, int charvalue); +string fold_lexical_string(location loc, string_cst components, cstring value, + bool wide_flag); + +known_cst fold_label_address(expression e); +known_cst fold_sizeof(expression e, type stype); +known_cst fold_alignof(expression e, type atype); +known_cst fold_cast(expression e); +known_cst fold_unary(expression e); +known_cst fold_binary(type restype, expression e); +known_cst fold_conditional(expression e); +known_cst fold_function_call(expression e, int pass); +known_cst fold_identifier(expression e, data_declaration decl, int pass); + +known_cst fold_add(type restype, known_cst c1, known_cst c2); + +known_cst foldaddress_identifier(expression e, data_declaration decl); +known_cst foldaddress_string(string s); +known_cst foldaddress_field_ref(expression e); + +bool definite_null(expression e); +bool definite_zero(expression e); +bool is_zero_constant(known_cst c); + +/* Print a warning if a constant expression had overflow in folding. + Invoke this function on every expression that the language + requires to be a constant expression. + Note the ANSI C standard says it is erroneous for a + constant expression to overflow. */ +void constant_overflow_warning(known_cst c); + +/*bool constant_address(known_cst c);*/ +#define constant_address(c) cval_isaddress((c)->cval) +/* Returns: TRUE if c is an address constant + */ + +/*bool constant_unknown(known_cst c);*/ +#define constant_unknown(c) cval_isunknown((c)->cval) +/* Returns: TRUE if c is a constant whose value is not yet known + */ + +/*bool constant_unknown_number(known_cst c);*/ +#define constant_unknown_number(c) cval_isunknown_number((c)->cval) +/* Returns: TRUE if c is a numeric constant whose value is not yet known + */ + +/*bool constant_integral(known_cst c);*/ +#define constant_integral(c) cval_isinteger((c)->cval) +/* Returns: TRUE if c is an integer constant (signed or unsigned) +*/ + +/*bool constant_float(known_cst c);*/ +#define constant_float(c) (cval_isfloating((c)->cval)) +/* Returns: TRUE if c is a floating-point constant +*/ + +/*largest_uint constant_uint_value(known_cst c);*/ +#define constant_uint_value(c) cval_uint_value((c)->cval) +/* Returns: Value of c as an unsigned integer. + Requires: see cval_uint_value +*/ + +/*largest_int constant_sint_value(known_cst c);*/ +#define constant_sint_value(c) cval_sint_value((c)->cval) +/* Returns: Value of c as an unsigned integer. + Requires: see cval_sint_value +*/ + +/*long double constant_float_value(known_cst c);*/ +#define constant_float_value(c) cval_float_value((c)->cval) +/* Returns: Value of c as an unsigned integer. + Requires: see cval_float_value +*/ + +/*bool constant_knownbool(known_cst c);*/ +/* Returns: TRUE if the truth-value of c can be determined (use + constant_boolvalue to get that value) +*/ +#define constant_knownbool(c) cval_knownbool((c)->cval) + +/*bool cval_boolvalue(cval c);*/ +/* Returns: TRUE if c is a non-zero constant + Requires: cval_knownbool(c) + */ +#define constant_boolvalue(c) cval_boolvalue((c)->cval) + +typedef enum { + cst_any, + cst_numerical, + cst_address +} cst_kind; + +bool check_constant_once(expression e, cst_kind k); +/* Effects: We want to check whether e is a constant, and possibly for + valid constant values, exactly once (to avoid repeated errors and + warnings) over our multiple constant folding passes. Additionally, + we can't check unknown constants until their value is known. We can + rely on the following: + - a non-constant will not become constant + - we assume, for checking purposes, that a constant's kind (numerical + vs address) will not change (this in some sense untrue, as in: + ? :
+ but we treat that as
for checking purposes) + - a known constant will maintain its value + - an unknown constant will become either non-constant or a known constant + + Additionally, if the constant kind does not match k, we can check it + immediately (presumably to report some error). + + check_constant_once supports this by returning TRUE exactly once, when + its possible to check e's value + + Returns: TRUE the first time !e->cst || e->cst && !constant_unkown(e) || + e->cst && e->cst does not match k +*/ + +#endif diff --git a/src/cstring.h b/src/cstring.h new file mode 100644 index 0000000..67a5f6d --- /dev/null +++ b/src/cstring.h @@ -0,0 +1,49 @@ +/* This file is part of the nesC compiler. + +This file is derived from the RC Compiler. It is thus + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef CSTRING_H +#define CSTRING_H + +#include + +#include "regions.h" + +/* A C string is like a regular C string, but with a length. A null byte is + added AFTER the string for convenience */ +typedef struct { + char *data; + int length; +} cstring; + +/* Make a new cstring with a copy of s, length l */ +cstring make_cstring(region r, const char *s, int l); + +/* Make a new unintialised cstring of length l */ +cstring alloc_cstring(region r, int l); + + +/* Make a new cstring with a copy of regular C string s */ +cstring str2cstring(region r, const char *s); + +/* Make a new C string with a copy of cstring s */ +char *cstring2str(region r, cstring s); + +#endif diff --git a/src/cval.c b/src/cval.c new file mode 100644 index 0000000..784c31a --- /dev/null +++ b/src/cval.c @@ -0,0 +1,1161 @@ +/* This file is part of the nesC compiler. + +This file is derived from the RC Compiler. It is thus + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +/* SAME: There's a lot of assumptions about floating point here, and behaviour + of operations when performed on wider types. I believe them to be valid for + IEEE with round-to-nearest. XXX: check. + XXX: overflow. +*/ +/* Note: this code is not particularly aiming for efficiency (in particular, + complex constants will be inefficient) */ +#include "parser.h" +#include "cval.h" +#include "machine.h" + +cval cval_top; /* The non-constant value */ +cval cval_unknown_number; /* The unknown number value */ +cval cval_unknown_address; /* The unknown address value */ +cval cval_zero; /* A zero value. Use cval_cast to make the desired kind of + constant */ +cval cval_one; /* A one value. Use cval_cast to make the desired kind of + constant */ +cval cval_bitsperbyte; /* BITSPERBYTE, unsigned */ + +/* We use cval_invalid_address to mark those places where a constant + is computed which is "not computable at load time" + (these used to be cval_unknown_number, but we're reusing that for constants + built from abstract component args. Knowing that something is a + constant "not computable at load time" seems to have no use, except + in producing a slightly nicer error message) +*/ +#define cval_invalid_address cval_top + +void cval_init(void) +{ + /* Code will be unhappy if this is not true. */ + assert(sizeof(largest_int) == sizeof(largest_uint)); + /* assert(This is a 2's complement machine); */ + + cval_top.kind = cval_variable; + cval_unknown_number.kind = cval_unk_number; + cval_unknown_address.kind = cval_unk_address; + cval_zero.kind = cval_sint; + cval_zero.si = 0; + cval_zero.isize = target->tint.size; + cval_one.kind = cval_sint; + cval_one.si = 1; + cval_one.isize = target->tint.size; + cval_bitsperbyte.kind = cval_uint; + cval_bitsperbyte.ui = BITSPERBYTE; + cval_bitsperbyte.isize = target->size_t_size; +} + +cval make_cval_unsigned(largest_uint i, type t) +{ + cval c; + + assert(type_integral(t) && type_unsigned(t)); + c.kind = cval_uint; + c.ui = i; + c.isize = type_size_int(t); + return c; +} + +cval make_cval_signed(largest_int i, type t) +{ + cval c; + + assert(type_integral(t) && !type_unsigned(t)); + c.kind = cval_sint; + c.si = i; + c.isize = type_size_int(t); + return c; +} + +cval make_type_cval(size_t s) +/* Effects: Make a cval representing a type size. This is special-cased + because we need to make these for type sizes before any types are + available + Returns: A cval representing s, with size set to the target's size_t size +*/ +{ + cval c; + + c.kind = cval_uint; + c.ui = s; + c.isize = target->size_t_size; + + return c; +} + +cval make_cval_float(long double d) +{ + cval c; + c.kind = cval_float; + c.d = d; + return c; +} + +cval make_cval_complex(cval r, cval i) +{ + assert(r.kind == i.kind); + + switch (r.kind) + { + case cval_float: + r.d_i = i.d; + r.kind = cval_float_complex; + return r; + case cval_uint: + assert(r.isize == i.isize); + r.kind = cval_uint_complex; + r.ui_i = i.ui; + return r; + case cval_sint: + assert(r.isize == i.isize); + r.kind = cval_sint_complex; + r.si_i = i.si; + return r; + + default: abort(); return r; + } +} + +cval make_cval_address(data_declaration ddecl, label_declaration ldecl, + largest_int offset) +{ + cval c = make_cval_signed(offset, ptrdiff_t_type); + + assert(!(ldecl && ddecl)); + c.kind = cval_address; + c.ddecl = ddecl; + c.ldecl = ldecl; + + return c; +} + +cval make_cval_address_unknown_offset(cval c) +/* Requires: cval_isaddress(c) + Returns: a constant identical to c except that the offset is now unknowjn +*/ +{ + assert(cval_isaddress(c)); + if (c.kind == cval_address) + c.kind = cval_address_unk_offset; + + return c; +} + +bool cval_isunknown(cval c) +/* Return: TRUE if c is an unknown constant */ +{ + return c.kind == cval_unk_number || c.kind == cval_unk_address; +} + +bool cval_isaddress(cval c) +{ + return c.kind == cval_unk_address || c.kind == cval_address || + c.kind == cval_address_unk_offset; +} + +bool cval_isinteger(cval c) +{ + return c.kind == cval_sint || c.kind == cval_uint; +} + +bool cval_isunsigned(cval c) +{ + return c.kind == cval_uint; +} + +bool cval_isfloating(cval c) +{ + return c.kind == cval_float; +} + +bool cval_iscomplex(cval c) +{ + return c.kind == cval_sint_complex || c.kind == cval_uint_complex || + c.kind == cval_float_complex; +} + +bool cval_knownbool(cval c) +/* Returns: TRUE if the truth-value of c can be determined (use cval_boolvalue + to get that value) +*/ +{ + switch (c.kind) { + default: case cval_variable: assert(0); + case cval_unk_number: case cval_unk_address: case cval_address_unk_offset: + return FALSE; + case cval_address: return c.si == 0; + case cval_uint: case cval_sint: case cval_float: + case cval_uint_complex: case cval_sint_complex: case cval_float_complex: + return TRUE; + } +} + +bool cval_boolvalue(cval c) +/* Returns: TRUE if c is a non-zero constant + Requires: cval_knownbool(c) + */ +{ + switch (c.kind) { + default: assert(0); + case cval_address: assert(c.si == 0); return TRUE; + case cval_uint: return c.ui != 0; + case cval_sint: return c.si != 0; + case cval_float: return c.d != 0; + case cval_uint_complex: return c.ui && c.ui_i; + case cval_sint_complex: return c.si && c.si_i; + case cval_float_complex: return c.d && c.d_i; + } +} + +bool cval_knownvalue(cval c) +/* Returns: TRUE if the value of c can be determined (this is false for + address constants, while cval_knownbool is true for address constants + with offset 0) +*/ +{ + switch (c.kind) { + default: case cval_variable: assert(0); + case cval_unk_number: case cval_unk_address: case cval_address_unk_offset: + case cval_address: return FALSE; + case cval_uint: case cval_sint: case cval_float: + case cval_uint_complex: case cval_sint_complex: case cval_float_complex: + return TRUE; + } +} + +largest_uint cval_uint_value(cval c) +/* Returns: The value of c as an unsigned int + Requires: cval_knownvalue(c) && !cval_iscomplex(c) +*/ +{ + switch (c.kind) { + default: assert(0); return 0; + case cval_uint: return c.ui; + case cval_sint: return c.si; + case cval_float: return c.d; + } +} + +largest_int cval_sint_value(cval c) +/* Returns: The value of c as a signed int + Requires: cval_knownvalue(c) && !cval_iscomplex(c) +*/ +{ + switch (c.kind) { + default: assert(0); return 0; + case cval_uint: return c.ui; + case cval_sint: return c.si; + case cval_float: return c.d; + } +} + +long double cval_float_value(cval c) +/* Returns: The value of c as a long double + Requires: cval_knownvalue(c) && !cval_iscomplex(c) +*/ +{ + switch (c.kind) { + default: assert(0); return 0; + case cval_uint: return c.ui; + case cval_sint: return c.si; + case cval_float: return c.d; + } +} + +bool cval_isone(cval c) +/* Returns: TRUE if c is 1 (FALSE for unknown constants) + Requires: c not be cval_top + */ +{ + switch (c.kind) { + default: case cval_variable: assert(0); + case cval_unk_number: case cval_unk_address: case cval_address_unk_offset: + case cval_address: return FALSE; + case cval_uint: return c.ui == 1; + case cval_sint: return c.si == 1; + case cval_float: return c.d == 1; + case cval_uint_complex: return c.ui == 1 && c.ui_i == 0; + case cval_sint_complex: return c.si == 1 && c.si_i == 0; + case cval_float_complex: return c.d == 1 && c.d_i == 0; + } +} + +static largest_uint truncate_unsigned(largest_uint x, size_t tsize) +{ + /* The shift is undefined for the size of largest_uint (and the masking is then + a no-op) */ + assert(tsize <= sizeof(largest_uint)); + + if (tsize == sizeof(largest_uint)) + return x; + else + return x & (((largest_uint)1 << BITSPERBYTE * tsize) - 1); +} + +/* SAME: 2's complement */ +static largest_int truncate_signed(largest_int x, size_t tsize) +{ + largest_uint umask, uval; + + assert(tsize <= sizeof(largest_int)); + + if (tsize == sizeof(largest_int)) + return x; + + /* masking */ + umask = (((largest_uint)1 << BITSPERBYTE * tsize) - 1); + uval = x & umask; + /* sign extension */ + if (uval & ((largest_uint)1 << (BITSPERBYTE * tsize - 1))) + return (largest_int)(((largest_uint)-1 & ~umask) | uval); + else + return uval; +} + +/* All of these functions will return cval_top if the result is not a + constant expression */ + +cval cval_cast(cval c, type to) +/* Returns: c cast to type to + Requires: type_scalar(to) +*/ +{ + if (cval_istop(c)) + return cval_top; + + if (cval_isunknown_number(c)) + return cval_unknown_number; + + if (type_complex(to)) + { + type base = make_base_type(to); + + switch (c.kind) + { + case cval_unk_address: case cval_address_unk_offset: case cval_address: + return cval_top; + case cval_sint: case cval_uint: case cval_float: + return make_cval_complex(cval_cast(c, base), + cval_cast(cval_zero, base)); + return c; + case cval_sint_complex: case cval_uint_complex: case cval_float_complex: + return make_cval_complex(cval_cast(cval_realpart(c), base), + cval_cast(cval_imagpart(c), base)); + default:assert(0); return c; + } + } + + if (cval_iscomplex(c)) + return cval_cast(cval_realpart(c), to); + + if (type_floating(to)) + { + switch (c.kind) + { + case cval_unk_address: case cval_address_unk_offset: case cval_address: + return cval_top; /* And not cval_invalid_address for some reason */ + case cval_sint: case cval_uint: + c.kind = cval_float; + /* Note that the cast is necessary otherwise it would cast to the common + type of largest_int/largest_uint (largest_uint), so c.si would be + cast to unsigned. */ + c.d = c.kind == cval_sint ? (long double)c.si : (long double)c.ui; + return c; + case cval_float: + if (type_float(to)) + c.d = (float)c.d; + else if (type_double(to)) + c.d = (double)c.d; + return c; + default:assert(0); return c; + } + } + else + { + cval tosize_cval = type_size(to); + size_t tosize; + + // Cast to int of unknown size produces unknown value + if (cval_isunknown_number(tosize_cval)) + switch (c.kind) + { + case cval_unk_address: case cval_address_unk_offset: + case cval_address: + return cval_unknown_address; + default: + return cval_unknown_number; + } + + tosize = cval_uint_value(tosize_cval); + switch (c.kind) + { + case cval_float: + /* If it's floating, make it an integer */ + /* Note: can't cast floating point number to a pointer */ + assert(!type_pointer(to)); + if (type_unsigned(to)) + { + c.kind = cval_uint; + c.ui = c.d; + c.isize = tosize; + } + else + { + c.kind = cval_sint; + c.si = c.d; + c.isize = tosize; + } + return c; + + case cval_unk_address: case cval_address_unk_offset: case cval_address: + /* Lose value if cast address of symbol to too-narrow a type */ + if (!type_array(to) && tosize < type_size_int(intptr_type)) + return cval_invalid_address; + /* Otherwise nothing happens (the offset is already restricted to + the range of intptr_type). */ + return c; + + case cval_uint: case cval_sint: + c.isize = tosize; + if (type_unsigned(to) || type_pointer(to)) + { + if (c.kind == cval_sint) + c.ui = c.si; + c.ui = truncate_unsigned(c.ui, tosize); + c.kind = cval_uint; + } + else + { + if (c.kind == cval_uint) + c.si = c.ui; + c.si = truncate_signed(c.si, tosize); + c.kind = cval_sint; + } + return c; + + default: assert(0); return c; + } + } +} + +cval cval_not(cval c) +{ + if (cval_istop(c)) + return cval_top; + else if (cval_isunknown(c)) + return cval_unknown_number; + else if (!cval_knownbool(c)) + return cval_invalid_address; + else + return make_cval_signed(!cval_boolvalue(c), int_type); +} + +cval cval_negate(cval c) +{ + switch (c.kind) + { + case cval_variable: return cval_top; + case cval_unk_number: return cval_unknown_number; + case cval_address: case cval_unk_address: case cval_address_unk_offset: + return cval_invalid_address; + case cval_sint: c.si = -c.si; return c; /* XXX: overflow */ + case cval_uint: c.ui = truncate_unsigned(-c.ui, c.isize); return c; + case cval_float: c.d = -c.d; return c; + case cval_sint_complex: + c.si = -c.si; + c.si_i = -c.si_i; + return c; /* XXX: overflow */ + case cval_uint_complex: + c.ui = truncate_unsigned(-c.ui, c.isize); + c.ui_i = truncate_unsigned(-c.ui_i, c.isize); + return c; + case cval_float_complex: c.d = -c.d; c.d_i = -c.d_i; return c; + default: abort(); return cval_top; + } +} + +cval cval_bitnot(cval c) +{ + switch (c.kind) + { + case cval_variable: return cval_top; + case cval_unk_number: return cval_unknown_number; + case cval_address: case cval_unk_address: case cval_address_unk_offset: + return cval_invalid_address; + case cval_sint: c.si = truncate_signed(~c.si, c.isize); return c; + case cval_uint: c.ui = truncate_unsigned(~c.ui, c.isize); return c; + default: abort(); return cval_top; + } +} + +cval cval_conjugate(cval c) +{ + switch (c.kind) + { + case cval_variable: return cval_top; + case cval_unk_number: return cval_unknown_number; + case cval_sint_complex: + c.si_i = -c.si_i; + return c; /* XXX: overflow */ + case cval_uint_complex: + c.ui_i = truncate_unsigned(-c.ui_i, c.isize); + return c; + case cval_float_complex: c.d_i = -c.d_i; return c; + default: abort(); return cval_top; + } +} + +cval cval_realpart(cval c) +{ + switch (c.kind) + { + case cval_variable: return cval_top; + case cval_unk_number: return cval_unknown_number; + case cval_sint_complex: c.kind = cval_sint; return c; + case cval_uint_complex: c.kind = cval_uint; return c; + case cval_float_complex: c.kind = cval_float; return c; + case cval_sint: case cval_uint: case cval_float: return c; + default: abort(); return cval_top; + } +} + +cval cval_imagpart(cval c) +{ + switch (c.kind) + { + case cval_variable: return cval_top; + case cval_unk_number: return cval_unknown_number; + case cval_sint_complex: c.kind = cval_sint; c.si = c.si_i; return c; + case cval_uint_complex: c.kind = cval_uint; c.ui = c.ui_i; return c; + case cval_float_complex: c.kind = cval_float; c.d = c.d_i; return c; + case cval_sint: c.si = 0; return c; + case cval_uint: c.ui = 0; return c; + case cval_float: c.d = 0; return c; + default: abort(); return cval_top; + } +} + +/* The binary operators require that both arguments have been cast to a common + type. */ +cval cval_add(cval c1, cval c2) +{ + if (cval_istop(c1) || cval_istop(c2)) + return cval_top; + + if (cval_isaddress(c2)) + { + cval tmp = c1; c1 = c2; c2 = tmp; + } + + if (cval_isaddress(c1)) + switch (c2.kind) + { + case cval_unk_number: return make_cval_address_unknown_offset(c1); + case cval_address: case cval_unk_address: case cval_address_unk_offset: + return cval_invalid_address; + case cval_sint: c1.si = truncate_signed(c1.si + c2.si, c1.isize); return c1; + case cval_uint: c1.si = truncate_signed(c1.si + c2.ui, c1.isize); return c1; + default: assert(0); return c1; + } + + if (cval_isunknown_number(c1) || cval_isunknown_number(c2)) + return cval_unknown_number; + + switch (c1.kind) + { + case cval_float: + assert(c2.kind == cval_float); + c1.d += c2.d; + return c1; + + case cval_sint: + assert(c2.kind == cval_sint && c1.isize == c2.isize); + c1.si = truncate_signed(c1.si + c2.si, c1.isize); + return c1; + + case cval_uint: + assert(c2.kind == cval_uint && c1.isize == c2.isize); + c1.ui = truncate_unsigned(c1.ui + c2.ui, c1.isize); + return c1; + + case cval_float_complex: + assert(c2.kind == cval_float_complex); + c1.d += c2.d; + c1.d_i += c2.d_i; + return c1; + + case cval_sint_complex: + assert(c2.kind == cval_sint_complex && c1.isize == c2.isize); + c1.si = truncate_signed(c1.si + c2.si, c1.isize); + c1.si_i = truncate_signed(c1.si_i + c2.si_i, c1.isize); + return c1; + + case cval_uint_complex: + assert(c2.kind == cval_uint_complex && c1.isize == c2.isize); + c1.ui = truncate_unsigned(c1.ui + c2.ui, c1.isize); + c1.ui_i = truncate_unsigned(c1.ui_i + c2.ui_i, c1.isize); + return c1; + + default: + assert(0); + return c1; + } +} + +cval cval_sub(cval c1, cval c2) +{ + if (cval_istop(c1) || cval_istop(c2)) + return cval_top; + + // -
is cst iff x is an address from the same symbol + // (in particular, x cannot be unknown) + if (cval_isaddress(c2)) + { + if (cval_isaddress(c1) && + !cval_isunknown_address(c1) && !cval_isunknown_address(c2) && + c1.ddecl == c2.ddecl && c1.ldecl == c2.ldecl) + { + if (c1.kind == cval_address_unk_offset || + c2.kind == cval_address_unk_offset) + return cval_unknown_number; + + c1.kind = cval_sint; + c1.si = truncate_signed(c1.si - c2.si, c1.isize); + return c1; + } + return cval_invalid_address; + } + //
- + if (cval_isaddress(c1)) + switch (c2.kind) + { + case cval_unk_number: return make_cval_address_unknown_offset(c1); + case cval_sint: c1.si = truncate_signed(c1.si - c2.si, c1.isize); return c1; + case cval_uint: c1.si = truncate_signed(c1.si - c2.ui, c1.isize); return c1; + default: assert(0); return c1; + } + + if (cval_isunknown_number(c1) || cval_isunknown_number(c2)) + return cval_unknown_number; + + switch (c1.kind) + { + case cval_float: + assert(c2.kind == cval_float); + c1.d -= c2.d; + return c1; + + case cval_sint: + assert(c2.kind == cval_sint && c1.isize == c2.isize); + c1.si = truncate_signed(c1.si - c2.si, c1.isize); + return c1; + + case cval_uint: + assert(c2.kind == cval_uint && c1.isize == c2.isize); + c1.ui = truncate_unsigned(c1.ui - c2.ui, c1.isize); + return c1; + + case cval_float_complex: + assert(c2.kind == cval_float_complex); + c1.d -= c2.d; + c1.d_i -= c2.d_i; + return c1; + + case cval_sint_complex: + assert(c2.kind == cval_sint_complex && c1.isize == c2.isize); + c1.si = truncate_signed(c1.si - c2.si, c1.isize); + c1.si_i = truncate_signed(c1.si_i - c2.si_i, c1.isize); + return c1; + + case cval_uint_complex: + assert(c2.kind == cval_uint_complex && c1.isize == c2.isize); + c1.ui = truncate_unsigned(c1.ui - c2.ui, c1.isize); + c1.ui_i = truncate_unsigned(c1.ui_i - c2.ui_i, c1.isize); + return c1; + + default: + assert(0); + return c1; + } +} + +cval cval_times(cval c1, cval c2) +{ + if (cval_istop(c1) || cval_istop(c2)) + return cval_top; + + //
* 1 and 1 *
are csts, everything else involving + // addresses isn't + if (cval_isaddress(c1) || cval_isaddress(c2)) + { + if (cval_isone(c1)) + return c2; + if (cval_isone(c2)) + return c1; + return cval_invalid_address; + } + + if (cval_isunknown_number(c1) || cval_isunknown_number(c2)) + return cval_unknown_number; + + if (cval_iscomplex(c1)) + { + cval c1r = cval_realpart(c1), c1i = cval_imagpart(c1), + c2r = cval_realpart(c2), c2i = cval_imagpart(c2); + + assert(cval_iscomplex(c2)); + /* Note: this is what gcc does. The C99 standard appears to + require something rather more complicated (aka "do the right + thing") */ + return make_cval_complex(cval_sub(cval_times(c1r, c2r), + cval_times(c1i, c2i)), + cval_add(cval_times(c1r, c2i), + cval_times(c1i, c2r))); + } + + switch (c1.kind) + { + case cval_float: + assert(c2.kind == cval_float); + c1.d *= c2.d; + return c1; + + case cval_sint: + assert(c2.kind == cval_sint && c1.isize == c2.isize); + c1.si = truncate_signed(c1.si * c2.si, c1.isize); + return c1; + + case cval_uint: + assert(c2.kind == cval_uint && c1.isize == c2.isize); + c1.ui = truncate_unsigned(c1.ui * c2.ui, c1.isize); + return c1; + + default: + assert(0); + return c1; + } +} + +cval cval_divide(cval c1, cval c2) +{ + if (cval_istop(c1) || cval_istop(c2)) + return cval_top; + + //
/ 1 is a cst, everything else involving addresses isn't + if (cval_isaddress(c1) || cval_isaddress(c2)) + return cval_isone(c2) ? c1 : cval_invalid_address; + + if (cval_isunknown_number(c1) || cval_isunknown_number(c2)) + return cval_unknown_number; + + if (cval_iscomplex(c1)) + { + cval c1r = cval_realpart(c1), c1i = cval_imagpart(c1), + c2r = cval_realpart(c2), c2i = cval_imagpart(c2); + cval mag = cval_add(cval_times(c1r, c2r), cval_times(c1i, c2i)); + + assert(cval_iscomplex(c2)); + /* Note: this is what gcc does. The C99 standard appears to + require something rather more complicated (aka "do the right + thing") */ + return make_cval_complex(cval_divide(cval_add(cval_times(c1r, c2r), + cval_times(c1i, c2i)), + mag), + cval_divide(cval_sub(cval_times(c1i, c2r), + cval_times(c1r, c2i)), + mag)); + } + + switch (c1.kind) + { + case cval_float: + assert(c2.kind == cval_float); + c1.d /= c2.d; + return c1; + + case cval_sint: + assert(c2.kind == cval_sint && c1.isize == c2.isize); + if (c2.si == 0) + return cval_top; + /* Note that signed division can overflow (MININT / -1). */ + c1.si = truncate_signed(c1.si / c2.si, c1.isize); + return c1; + + case cval_uint: + assert(c2.kind == cval_uint && c1.isize == c2.isize); + if (c2.ui == 0) + return cval_top; + c1.ui /= c2.ui; + return c1; + + default: + assert(0); + return c1; + } +} + +cval cval_modulo(cval c1, cval c2) +{ + if (cval_istop(c1) || cval_istop(c2)) + return cval_top; + + if (cval_isone(c2)) + return make_cval_signed(0, int_type); + + if (cval_isaddress(c1) || cval_isaddress(c2)) + return cval_invalid_address; + + if (cval_isunknown_number(c1) || cval_isunknown_number(c2)) + return cval_unknown_number; + + switch (c1.kind) + { + case cval_float: + assert(c2.kind == cval_float); + c1.d /= c2.d; + return c1; + + case cval_sint: + assert(c2.kind == cval_sint && c1.isize == c2.isize); + if (c2.si == 0) + return cval_top; + c1.si = truncate_signed(c1.si % c2.si, c1.isize); + return c1; + + case cval_uint: + assert(c2.kind == cval_uint && c1.isize == c2.isize); + if (c2.ui == 0) + return cval_top; + c1.ui %= c2.ui; + return c1; + + default: + assert(0); + return c1; + } +} + +#define CVAL_BITOP(OP) \ +{ \ + if (cval_istop(c1) || cval_istop(c2)) \ + return cval_top; \ + \ + if (cval_isaddress(c1) || cval_isaddress(c2)) \ + return cval_invalid_address; \ + if (cval_isunknown_number(c1) || cval_isunknown_number(c2)) \ + return cval_unknown_number; \ + \ + assert(c1.kind == c2.kind && c1.isize == c2.isize); \ + switch (c1.kind) \ + { \ + case cval_sint: \ + c1.si = truncate_signed(c1.si OP c2.si, c1.isize); \ + return c1; \ + \ + case cval_uint: \ + c1.ui = truncate_signed(c1.ui OP c2.ui, c1.isize); \ + return c1; \ + \ + default: \ + assert(0); \ + return c1; \ + } \ +} + +cval cval_lshift(cval c1, cval c2) CVAL_BITOP(<<) +cval cval_rshift(cval c1, cval c2) CVAL_BITOP(>>) +cval cval_bitand(cval c1, cval c2) CVAL_BITOP(&) +cval cval_bitor(cval c1, cval c2) CVAL_BITOP(|) +cval cval_bitxor(cval c1, cval c2) CVAL_BITOP(^) + +#define CVAL_RELOP(OP) \ +{ \ + bool res; \ + \ + if (cval_istop(c1) || cval_istop(c2)) \ + return cval_top; \ + \ + if (cval_isaddress(c1) || cval_isaddress(c2)) \ + return cval_invalid_address; \ + /* Surprisingly (?) &x == &x is not a constant expression */ \ + if (cval_isunknown_number(c1) || cval_isunknown_number(c2)) \ + return cval_unknown_number; \ + \ + switch (c1.kind) \ + { \ + case cval_float: \ + assert(c2.kind == cval_float); \ + res = c1.d OP c2.d; \ + break; \ + \ + case cval_sint: \ + assert(c2.kind == cval_sint && c1.isize == c2.isize); \ + res = c1.si OP c2.si; \ + break; \ + \ + case cval_uint: \ + assert(c2.kind == cval_uint && c1.isize == c2.isize); \ + res = c1.ui OP c2.ui; \ + break; \ + \ + default: \ + assert(0); \ + res = FALSE; \ + break; \ + } \ + return make_cval_signed(res, int_type); \ +} + +static cval cval_simpleeq(cval c1, cval c2) CVAL_RELOP(==) +cval cval_leq(cval c1, cval c2) CVAL_RELOP(<=) + +cval cval_eq(cval c1, cval c2) +{ + if (cval_iscomplex(c1) && cval_iscomplex(c2)) + { + cval req = cval_simpleeq(cval_realpart(c1), cval_realpart(c2)); + cval ieq = cval_simpleeq(cval_imagpart(c1), cval_imagpart(c2)); + + return make_cval_signed(cval_isone(req) && cval_isone(ieq), int_type); + } + else + return cval_simpleeq(c1, c2); +} + +/* True if x fits in the range of type t */ +bool uint_inrange(largest_uint x, type t) +{ + size_t tsize = type_size_int(t); + largest_uint max; + + assert(tsize <= sizeof(largest_uint)); + + if (tsize == sizeof(largest_uint) && type_unsigned(t)) + return TRUE; + + max = (largest_uint)1 << (BITSPERBYTE * tsize - !type_unsigned(t)); + + return x < max; +} + +bool sint_inrange(largest_int x, type t) +{ + size_t tsize = type_size_int(t); + largest_int max; + + assert(tsize <= sizeof(largest_uint)); + + if (x < 0 && type_unsigned(t)) + return FALSE; + + if (tsize == sizeof(largest_uint)) + return TRUE; + + max = (largest_int)1 << (BITSPERBYTE * tsize - !type_unsigned(t)); + + /* The x<0&&unsigned and largest_int cases have been handled above. */ + return x >= -max && x < max; +} + +bool cval_inrange(cval c, type t) +/* Requires: constant_integral(c) + Returns: TRUE if c is in range of type t. */ +{ + switch (c.kind) + { + case cval_sint: return sint_inrange(c.si, t); + case cval_uint: return uint_inrange(c.ui, t); + default: abort(); return FALSE; + } +} + +largest_int cval_intcompare(cval c1, cval c2) +/* Requires: cval_isinteger(c1) && cval_isinteger(c2) + Returns: x, x<0 if c1 < c2, x = 0 if c1 = c2 and x > 0 if c1 > c2 +*/ +{ + /* beware of overflow of difference w/ respect to largest_int */ + switch (c1.kind) + { + case cval_sint: + switch (c2.kind) + { + case cval_sint: + return c1.si - c2.si; + case cval_uint: + /* can't use c1.si < c2.ui because of implicit conversion */ + if (c1.si < 0 || c1.si < c2.ui) + return -1; + return c1.si - c2.ui; /* common type is largest_uint */ + default: abort(); return 0; + } + case cval_uint: + switch (c2.kind) + { + case cval_sint: + if (c2.si < 0 || c1.ui < c2.si) + return 1; + /* result might overflow so compare with 0 */ + return (c1.ui - c2.si) > 0; /* common type is largest_uint */ + case cval_uint: + /* We do the cases because the result might overflow + largest_int */ + if (c1.ui < c2.ui) + return -1; + if (c1.ui > c2.ui) + return 1; + return 0; + default: abort(); return 0; + } + default: abort(); return 0; + } +} + +void cval_print(FILE *f, cval c) +/* Effects: prints a parsable representable of c to f + */ +{ + switch (c.kind) + { + case cval_float: + case cval_float_complex: + break; + case cval_uint: fprintf(f, "%llu", c.ui); break; + case cval_uint_complex: fprintf(f, "%llu %llu", c.ui, c.ui_i); break; + case cval_sint: fprintf(f, "%lld", c.si); break; + case cval_sint_complex: fprintf(f, "%lld %lld", c.si, c.si_i); break; + default: assert(0); break; + } +} + +void cval_debug(cval c) +/* For use while debugging. gdb doesn't print cvals right */ +{ + switch (c.kind) + { + case cval_variable: printf(""); break; + case cval_unk_number: printf(""); break; + case cval_unk_address: printf("
"); break; + case cval_address: case cval_address_unk_offset: + if (c.ldecl) + printf("
name, c.ldecl); + else + printf("
name, c.ddecl); + if (c.kind == cval_address_unk_offset) + printf(" + "); + else if (c.si > 0) + printf(" + %lld", c.si); + else + printf(" - %lld", -c.si); + printf(">"); + default: + printf("[size: %u]", (unsigned)c.isize); + cval_print(stdout, c); + } + printf("\n"); +} + +cval cval_align_to(cval n, cval alignment) +{ + cval count = cval_divide(cval_sub(cval_add(n, alignment), + make_type_cval(1)), + alignment); + + return cval_times(count, alignment); +} + +cval cval_gcd(cval x, cval y) +{ + cval z; + + if (cval_istop(x) || cval_istop(y)) + return cval_top; + + if (cval_isunknown_number(x) || cval_isunknown_number(y)) + return cval_unknown_number; + + for (;;) + { + if (!cval_boolvalue(y)) /* ie 0 */ + return x; + + z = cval_modulo(x, y); x = y; y = z; + } +} + +cval cval_lcm(cval x, cval y) +{ + /* ignoring risk of overflow (used for alignments which are typically <= 16) */ + return cval_divide(cval_times(x, y), cval_gcd(x, y)); +} + +cval cval_max(cval c1, cval c2) +{ + if (cval_istop(c1) || cval_istop(c2)) + return cval_top; + + if (cval_isunknown_number(c1) || cval_isunknown_number(c2)) + return cval_unknown_number; + + // Not used for anything else yet. Fix later if need to. + assert(cval_isinteger(c1) && cval_isinteger(c2)); + + return cval_intcompare(c1, c2) > 0 ? c1 : c2; +} + +cval cval_min(cval c1, cval c2) +{ + if (cval_istop(c1) || cval_istop(c2)) + return cval_top; + + if (cval_isunknown_number(c1) || cval_isunknown_number(c2)) + return cval_unknown_number; + + // Not used for anything else yet. Fix later if need to. + assert(cval_isinteger(c1) && cval_isinteger(c2)); + + return cval_intcompare(c1, c2) < 0 ? c1 : c2; +} + +data_declaration cval_ddecl(cval c) +/* Returns: c's declaration + Requires: cval_isaddress(c) && !cval_isunknown_address(c) && + c doesn't denote a label +*/ +{ + assert(cval_isaddress(c) && !cval_isunknown_address(c)); + return c.ddecl; +} + +label_declaration cval_ldecl(cval c) +/* Returns: c's declaration, or NULL if c denotes a variable + Requires: cval_isaddress(c) && !cval_isunknown_address(c) +*/ +{ + assert(cval_isaddress(c) && !cval_isunknown_address(c)); + return c.ldecl; +} + diff --git a/src/cval.h b/src/cval.h new file mode 100644 index 0000000..1a97e51 --- /dev/null +++ b/src/cval.h @@ -0,0 +1,238 @@ +/* This file is part of the nesC compiler. + +This file is derived from the RC Compiler. It is thus + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef CVAL_H +#define CVAL_H + +/* Note: legal ops on complex are: + add, sub, times, divide, realpart, imagpart, conjugate +*/ +typedef struct { + enum { + cval_variable, /* not a constant */ + cval_unk_number, /* some unknown number */ + cval_unk_address, /* an unknown symbol with unknown offset */ + cval_address_unk_offset, /* known symbol with unknown offset */ + cval_address, /* symbol with offset */ + cval_float, cval_float_complex, /* a (complex) floating point number */ + cval_uint, cval_uint_complex, /* a (complex) unsigned number */ + cval_sint, cval_sint_complex /* a (complex) signed number */ + } kind; +#ifdef USE_UNNAMED_UNION + union { + struct { + long double d, d_i; /* for cval_float */ + }; + struct { + size_t isize; + union { + largest_int si; + largest_uint ui; + }; + union { + largest_int si_i; + largest_uint ui_i; + struct { /* for cval_address, cval_address_unk_offset */ + struct data_declaration *ddecl; + struct label_declaration *ldecl; + }; + }; + }; + }; +#else + long double d, d_i; /* for cval_float */ + struct data_declaration *ddecl; /* for cval_address */ + struct label_declaration *ldecl; /* for cval_address */ + largest_int si, si_i; + largest_uint ui, ui_i; + size_t isize; +#endif +} cval; + +extern cval cval_top; /* The non-constant value */ +extern cval cval_unknown_number; /* The unknown number value */ +extern cval cval_unknown_address; /* The unknown address value */ +extern cval cval_zero; /* A zero value. Use cval_cast to make the desired + kind of constant */ +extern cval cval_one; /* A one value. Use cval_cast to make the desired + kind of constant */ +extern cval cval_bitsperbyte; /* BITSPERBYTE, unsigned */ + +void cval_init(void); + +cval make_cval_signed(largest_int i, type t); +cval make_cval_unsigned(largest_uint i, type t); + +cval make_type_cval(size_t s); +/* Effects: Make a cval representing a type size. This is special-cased + because we need to make these for type sizes before any types are + available + Returns: A cval representing s, with size set to the target's size_t size +*/ + +cval make_cval_float(long double d); +cval make_cval_complex(cval r, cval i); +cval make_cval_address(data_declaration ddecl, label_declaration ldecl, + largest_int offset); + +cval make_cval_address_unknown_offset(cval c); +/* Requires: cval_isaddress(c) + Returns: a constant identical to c except that the offset is now unknown +*/ + +bool cval_isunknown(cval c); +/* Return: TRUE if c is an unknown constant + (one of unknown_number, unknown_address, address_unknown_offset) */ + +/*bool cval_isunknown_number(cval c);*/ +#define cval_isunknown_number(c) ((c).kind == cval_unk_number) +/* Return: TRUE if c is an unknown constant */ + +/*bool cval_isunknown_address(cval c);*/ +#define cval_isunknown_address(c) ((c).kind == cval_unk_address) +/* Return: TRUE if c is an unknown constant */ + +/*bool cval_istop(cval c);*/ +#define cval_istop(c) ((c).kind == cval_variable) +/* Return: TRUE if c is not a constant */ + +bool cval_isaddress(cval c); +/* Return: TRUE if c is an address constant (known or unknown) */ + +bool cval_isinteger(cval c); +/* Return: TRUE if c is an integer constant */ + +bool cval_isunsigned(cval c); +/* Return: TRUE if c is an unsigned integer constant */ + +bool cval_isfloating(cval c); +/* Return: TRUE if c is a floating-point constant */ + +bool cval_iscomplex(cval c); +/* Return: TRUE if c is a complex constant */ + +bool cval_knownbool(cval c); +/* Returns: TRUE if the truth-value of c can be determined (use cval_boolvalue + to get that value). Note that address values with offset 0 are known to + be true... +*/ + +bool cval_boolvalue(cval c); +/* Returns: TRUE if c is a non-zero constant + Requires: cval_knownbool(c) + */ + +bool cval_knownvalue(cval c); +/* Returns: TRUE if the value of c can be determined (this is false for + address constants, while cval_knownbool is true for address constants + with offset 0) +*/ + +largest_uint cval_uint_value(cval c); +/* Returns: The value of c as an unsigned int + Requires: cval_knownvalue(c) && !cval_iscomplex(c) +*/ + +largest_int cval_sint_value(cval c); +/* Returns: The value of c as a signed int + Requires: cval_knownvalue(c) && !cval_iscomplex(c) +*/ + +long double cval_float_value(cval c); +/* Returns: The value of c as a long double + Requires: cval_knownvalue(c) && !cval_iscomplex(c) +*/ + +bool cval_isone(cval c); +/* Returns: TRUE if c is 1 (FALSE for unknown constants) + Requires: c not be cval_top + */ + +data_declaration cval_ddecl(cval c); +/* Returns: c's declaration, or NULL if c denotes a label + Requires: cval_isaddress(c) && !cval_isunknown_address(c) +*/ + +label_declaration cval_ldecl(cval c); +/* Returns: c's declaration, or NULL if c denotes a variable + Requires: cval_isaddress(c) && !cval_isunknown_address(c) +*/ + +/* All of these functions will return cval_top if the result is not a + constant expression */ + +cval cval_cast(cval c, type to); /* Cast c to type to */ +cval cval_not(cval c); /* !c */ +cval cval_negate(cval c); /* -c */ +cval cval_bitnot(cval c); /* ~c */ +cval cval_conjugate(cval c); /* ~c */ +cval cval_realpart(cval c); /* __real__ c */ +cval cval_imagpart(cval c); /* __imag__ c */ + +/* The binary operators require that both arguments have been cast to a common + type. */ +cval cval_add(cval c1, cval c2); +cval cval_sub(cval c1, cval c2); +cval cval_times(cval c1, cval c2); +cval cval_divide(cval c1, cval c2); +cval cval_modulo(cval c1, cval c2); +cval cval_lshift(cval c1, cval c2); +cval cval_rshift(cval c1, cval c2); +cval cval_bitand(cval c1, cval c2); +cval cval_bitor(cval c1, cval c2); +cval cval_bitxor(cval c1, cval c2); +cval cval_eq(cval c1, cval c2); +/*cval cval_ne(cval c1, cval c2);*/ +cval cval_leq(cval c1, cval c2); +/*cval cval_lt(cval c1, cval c2);*/ +/*cval cval_geq(cval c1, cval c2);*/ +/*cval cval_gt(cval c1, cval c2);*/ +#define cval_gt(c1, c2) (cval_not(cval_leq((c1), (c2)))) +#define cval_lt(c1, c2) (cval_gt((c2), (c1))) +#define cval_geq(c1, c2) (cval_leq((c2), (c1))) +#define cval_ne(c1, c2) (cval_not(cval_eq((c1), (c2)))) + +/* True if x fits in the range of type t */ +bool uint_inrange(largest_uint x, type t); +bool sint_inrange(largest_int x, type t); + +bool cval_inrange(cval c, type t); +/* Requires: constant_integral(c) + Returns: TRUE if c is in range of type t. */ + +largest_int cval_intcompare(cval c1, cval c2); +/* Requires: cval_isinteger(c1) && cval_isinteger(c2) + Returns: x, x<0 if c1 < c2, x = 0 if c1 = c2 and x > 0 if c1 > c2 +*/ + +void cval_print(FILE *f, cval c); +/* Requires: cval_knownvalue(c) + Effects: prints a parsable representable of c to f + */ + +/* Utility functions (used for struct layout) */ +cval cval_lcm(cval x, cval y); +cval cval_gcd(cval x, cval y); +cval cval_align_to(cval n, cval alignment); +cval cval_max(cval c1, cval c2); +cval cval_min(cval c1, cval c2); + +#endif diff --git a/src/dd_list.c b/src/dd_list.c new file mode 100644 index 0000000..9162f28 --- /dev/null +++ b/src/dd_list.c @@ -0,0 +1,207 @@ +/* This file is part of the nesC compiler. + +This file is derived from the RC Compiler. It is thus + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include +#include "dd_list.h" + +/* This is a hack: the list header holds the two pseudo-elements for the + beginning & end of a list: the `beginning' pseudo element has: + next = first element + previous = NULL + data = xxx + the `end' pseudo element has: + next = NULL + previous = last element + data = xxx + + if l is a dd_list, the `beginning' element is (dd_list_pos *)l + and the `end' is (dd_list_pos *)&l->null + + l is initialised to make all this work ... + Source: AmigaOS Exec kernel +*/ +struct dd_list +{ + struct dd_list_pos *first; + struct dd_list_pos *null; + struct dd_list_pos *last; +}; + +static dd_list_pos new_hdr(region r, void *data, dd_list_pos previous, dd_list_pos next) +/* Returns: A new list element containing `data', with previous & next + initialised +*/ +{ + dd_list_pos new = ralloc(r, struct dd_list_pos); + + new->data = data; + new->previous = previous; + new->next = next; + + return new; +} + +dd_list dd_new_list(region r) +/* Returns: A new empty list +*/ +{ + dd_list new = ralloc(r, struct dd_list); + + /* Initialise `beginning' and `end' elements (see comment at top) */ + new->first = (dd_list_pos)&new->null; + new->null = NULL; + new->last = (dd_list_pos)new; + + return new; +} + +void dd_add_first(region r, dd_list l, void *data) +/* Effects: Adds a new element containing `data' to the beginning of l. + Modifies: l +*/ +{ + dd_insert_after(r, (dd_list_pos)l, data); +} + +void dd_add_last(region r, dd_list l, void *data) +{ + dd_insert_before(r, (dd_list_pos)&l->null, data); +} + +void dd_insert_before(region r, dd_list_pos where, void *data) +/* Effects: Adds a new element containg `data' after element `where'. + Modifies: the list containing `where' +*/ +{ + dd_list_pos new = new_hdr(r, data, where->previous, where); + + where->previous->next = new; + where->previous = new; +} + +void dd_insert_after(region r, dd_list_pos where, void *data) +/* Effects: Adds a new element containg `data' before element `where'. + Modifies: the list containing `where' +*/ +{ + dd_list_pos new = new_hdr(r, data, where, where->next); + + where->next->previous = new; + where->next = new; +} + +void dd_remove(dd_list_pos what) +/* Effects: Removes element `what' from its list. + No operations on what are valid after the call to dd_remove. + Modifies: the list containing `what'. +*/ +{ + what->previous->next = what->next; + what->next->previous = what->previous; + + what->next = what->previous = NULL; + what->data = NULL; +} + +dd_list_pos dd_first(dd_list l) +/* Returns: The first element of list l +*/ +{ + return l->first; +} + +dd_list_pos dd_last(dd_list l) +/* Returns: The last element of list l +*/ +{ + return l->last; +} + +unsigned long dd_length(dd_list l) +/* Returns: length of list l +*/ +{ + dd_list_pos scan; + unsigned long len = 0; + + dd_scan (scan, l) len++; + + return len; +} + +void dd_append(dd_list l1, dd_list l2) +/* Effects: Appends list l2 to the end of list l1. + List l2 is destroyed + Modifies: l1, l2 +*/ +{ + l1->last->next = l2->first; + l2->first->previous = l1->last; + l2->last->next = (dd_list_pos)&l1->null; + l1->last = l2->last; + + l2->first = l2->last = NULL; +} + +dd_list dd_copy(region r, dd_list l) +/* Returns: A new list with the same elements as l +*/ +{ + dd_list new = dd_new_list(r); + dd_list_pos scan; + + dd_scan (scan, l) dd_add_last(r, new, scan->data); + + return new; +} + +void dd_free_list(dd_list l, void (*delete)(dd_list_pos p)) +/* Effects: Destroys list l and all its elements. + If delete is not NULL, calls it before deleting each element. +*/ +{ + dd_list_pos scan, next; + + scan = dd_first(l); + while (!dd_is_end(scan)) + { + next = dd_next(scan); + if (delete) delete(next); + + scan->next = scan->previous = NULL; + scan->data = NULL; + + scan = next; + } + l->first = l->last = NULL; +} + +dd_list_pos dd_find(dd_list l, void *find) +/* Returns: The element of l whose data is 'find', or NULL if it isn't found +*/ +{ + dd_list_pos scan; + + dd_scan (scan, l) + if (DD_GET(void *, scan) == find) return scan; + + return NULL; +} diff --git a/src/dd_list.h b/src/dd_list.h new file mode 100644 index 0000000..b045b5c --- /dev/null +++ b/src/dd_list.h @@ -0,0 +1,141 @@ +/* This file is part of the nesC compiler. + +This file is derived from the RC Compiler. It is thus + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef DD_LIST_H +#define DD_LIST_H + +/* + * Doubly-linked list storing arbitrary pointers. + * The lists may homogeneous or heterogeneous at the discretion of + * the user (the list stores no type indications) + * + * dd_list is the type of all lists + * dd_list_pos is the type that represents a particular element of a list + */ + +typedef struct dd_list *dd_list; /* A list */ +typedef struct dd_list_pos /* A position in a list */ +{ + /* PRIVATE! Do not use the fields directly */ + struct dd_list_pos *next; + struct dd_list_pos *previous; + void *data; +} *dd_list_pos; + +dd_list dd_new_list(region r); +/* Returns: A new empty list +*/ + +void dd_add_first(region r, dd_list l, void *data); +/* Effects: Adds a new element containing `data' to the beginning of l. + Modifies: l +*/ +void dd_add_last(region r, dd_list l, void *data); +/* Effects: Adds a new element containing `data' to the end of l. + Modifies: l +*/ +void dd_insert_before(region r, dd_list_pos where, void *data); +/* Effects: Adds a new element containg `data' after element `where'. + Modifies: the list containing `where' +*/ +void dd_insert_after(region r, dd_list_pos where, void *data); +/* Effects: Adds a new element containg `data' before element `where'. + Modifies: the list containing `where' +*/ +void dd_remove(dd_list_pos what); +/* Effects: Removes element `what' from its list. + No operations on what are valid after the call to dd_remove. + Modifies: the list containing `what'. +*/ + +dd_list_pos dd_first(dd_list l); +/* Returns: The first element of list l +*/ +dd_list_pos dd_last(dd_list l); +/* Returns: The last element of list l +*/ +#define dd_is_beginning(l) (!(l)->previous) +/* Returns: TRUE if l is the pseudo-element at the beginning of a list. + Note: dd_is_beginning(dd_previous(dd_first(l))) == TRUE +*/ +#define dd_is_end(l) (!(l)->next) +/* Returns: TRUE if l is the pseudo-element at the end of a list. + Note: dd_is_end(dd_next(dd_last(l))) == TRUE +*/ +#define dd_next(l) ((l)->next) +/* Returns: The element after l, or the pseudo-element indicating the + end of the list if none remain (see dd_is_end) +*/ +#define dd_previous(l) ((l)->previous) +/* Returns: The element before l, or the pseudo-element indicating the + beginning of the list if none remain (see dd_is_beginning) +*/ + +#define dd_is_empty(l) (dd_is_end(dd_first((l)))) +/* Returns: TRUE if l is the empty list +*/ + +#define DD_GET(type, l) ((type)((l)->data)) +/* Returns: The contents of element l, cast to type `type' + This operation is obviously invalid on the pseudo-elements at + the beginning and end of lists +*/ +#define DD_SET(l, to) ((l)->data = (to)) +/* Effects: Sets the contents of element l to `to' + This operation is obviously invalid on the pseudo-elements at + the beginning and end of lists + Modifies: l +*/ + +#define dd_scan(var, list) for (var = dd_first((list)); !dd_is_end(var); var = dd_next(var)) +/* Effects: Iterates variable `scan' over the contents of the list. + Requires: list not ne modified during iteration. + Example: + length = 0; + dd_scan (element, l) + length++; +*/ + +unsigned long dd_length(dd_list l); +/* Returns: length of list l +*/ + +void dd_append(dd_list l1, dd_list l2); +/* Effects: Appends list l2 to the end of list l1. + List l2 is destroyed + Modifies: l1, l2 +*/ + +dd_list dd_copy(region r, dd_list l); +/* Returns: A new list with the same elements as l +*/ + +void dd_free_list(dd_list l, void (*delete)(dd_list_pos p)); +/* Effects: Destroys list l and all its elements. + If delete is not NULL, calls it before deleting each element. + Modifies: l +*/ + +dd_list_pos dd_find(dd_list l, void *find); +/* Returns: The element of l whose data is 'find', or NULL if it isn't found +*/ + +#endif diff --git a/src/decls.h b/src/decls.h new file mode 100644 index 0000000..ebbe94a --- /dev/null +++ b/src/decls.h @@ -0,0 +1,269 @@ +/* This file is part of the nesC compiler. + +This file is derived from the RC Compiler. It is thus + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef DECLS_H +#define DECLS_H + +#include "AST.h" +#include "env.h" +#include "c-lex.h" + +typedef struct environment *environment; +typedef struct data_declaration *data_declaration; +typedef struct label_declaration *label_declaration; + +#include "nesc-decls.h" +#include "nesc-uses.h" +#include "cval.h" + +/* Types representing declarations */ + +typedef struct field_declaration { + struct tag_declaration *containing_tag; + struct field_declaration *next; /* Next field in struct/union */ + const char *name; /* May be NULL for bitfields (if NULL, bitwidth == 0) */ + type type; + + /* All '@'-style attributes attached to this declaration */ + dd_list/*nesc_attribute*/ attributes; + + field_decl ast; /* May be null if copied from anonymous + struct/union */ + cval bitwidth; /* for bitfields, cval_top otherwise */ + cval offset; /* in bits, not bytes. Can be cval_top if + offset is not a compile-time constant */ + bool packed; /* if packed attribute specified */ + + /* In abstract configurations or modules: The latest instantiation + of this declaration */ + struct field_declaration *instantiation; +} *field_declaration; + +/* A struct, union or enum */ +typedef struct tag_declaration { + int kind; /* One of kind_{struct/union/enum/attribute}_ref */ + const char *name; /* NULL for anonynous struct/union/enum */ + type reptype; /* The type used to represent an enum, NULL for struct + and unions */ + /* All '@'-style attributes attached to this declaration */ + dd_list/*nesc_attribute*/ attributes; + + /* fields and fieldlist are only defined for structs/unions */ + env fields; + field_declaration fieldlist; + tag_ref definition; + struct tag_declaration *shadowed; /* Any struct with the same tag defined in enclosing scope */ + bool defined, being_defined; + bool fields_const, fields_volatile; + bool transparent_union; /* transparent_union attribute is present */ + bool collapsed; /* TRUE if this struct/union was collapsed + into its parent. */ + + cval size; /* Can be cval_top if not compile-time constant + (due to variable-size arrays in struct) */ + cval alignment, user_alignment; + bool packed; /* if packed attribute specified */ + bool dumped; /* TRUE if already added to dump list */ + bool Cname; /* TRUE if has @C() attribute */ + + nesc_declaration container; /* as in data_declarations */ + + /* Function this declaration occurs in (NULL if outside a function) */ + struct data_declaration *container_function; + + /* In abstract configurations or modules: The latest instantiation + of this declaration */ + struct tag_declaration *instantiation; + struct tag_declaration *instanceof; /* Inside instantiated components: what this tag is an instance of */ + + /* Name of a macro to use in nesC's output for instances of this attribute - + if this is NULL, attributes are not printed */ + const char *macro_name; + bool deputy_scope; /* TRUE for deputy attributes (@deputy_scope()) */ +} *tag_declaration; + +typedef enum { decl_variable, decl_constant, decl_function, + decl_typedef, decl_error, decl_magic_string, + decl_magic_function, + decl_interface_ref, decl_component_ref } data_kind; + +typedef enum { + c_call_atomic = 1, /* bit set if atomic calls to this fn */ + c_call_nonatomic = 2 /* bit set if non-atomic calls to this fn */ +} call_contexts; + +struct data_declaration { + data_kind kind; + const char *name; + type type; + /* For declaration numbering purposes. At this point, it has: + a per-function numbering for local variables + a per-module numbering for commands/events */ + long id; + context use_summary; + /* All '@'-style attributes attached to this declaration */ + dd_list/*nesc_attribute*/ attributes; + + /* Regular C: For extern's shadowing globals in inner scopes */ + /* nesC commands/events: point to original interface declaration */ + struct data_declaration *shadowed; + + /* In abstract configurations or modules: The latest instantiation + of this declaration */ + struct data_declaration *instantiation; + struct data_declaration *instanceof; /* Inside instantiated components: what this decl is an instance of */ + + /* interface/module/configuration this declaration belongs to. + NULL for declarations from C files */ + nesc_declaration container; + + /* Function this declaration occurs in (NULL if outside a function) */ + struct data_declaration *container_function; + + declaration definition; /* Pointer to actual definition, if any */ + declaration ast; /* Last declaration */ + expression initialiser; /* NULL if none. For type arguments, this gets set + to the argument type (type_argument node) */ + + bool printed; /* symbol info already printed */ + bool dumped; /* TRUE if already added to dump list */ + bool islimbo; /* TRUE if comes from an extern declaration in an inner scope + (also true for implicit function declarations) */ + bool isexternalscope; /* == TREE_PUBLIC */ + bool isfilescoperef; /* == DECL_EXTERNAL */ + bool needsmemory; /* == TREE_STATIC */ + + /* isused is TRUE if declaration used. For parameters, there is a special + use during parameter list declaration to support forward parameters: + - a duplicate parameter declaration is allowed if isused is FALSE + once a duplicate is seen, isused is set to TRUE + - parameters are created with isused == TRUE + - after the forward parameters are seen, they have their isused field + set to FALSE */ + bool isused; + bool in_system_header; + bool Cname; /* name is in C name space (don't rename!) + Set by the `C' attribute. */ + bool safe; /* True if deputy safety checks should + be enabled */ + call_contexts spontaneous; /* Call contexts for environmental calls + (main, interrupt handlers, e.g.). Set by + the `spontaneous', `interrupt' and + `signal' attributes */ + + dd_list/*use*/ nuses; /* List of uses of this identifier */ + + /* For functions */ + enum { function_implicit, function_normal, function_static, function_nested, + function_event, function_command } + ftype; + bool isinline; + bool noinlinep; + bool isexterninline; + bool defined; /* nesC: true if defined, false if used */ + bool suppress_definition; /* Prevent code generation */ + bool uncallable; /* Error if called */ + bool async; /* True if async declared (cmd/event) or + inferred (C function) */ + bool actual_async; /* Inferred value for async */ + /* The call_contexts summarise the runtime contexts in which this fn + might be called. So if all calls to f are in atomic statements, + and f calls g outside an atomic statement, then + g->call_contexts == c_call_atomic + */ + call_contexts call_contexts; + call_contexts extra_contexts; /* Some extra, hidden call contexts (used to + support __nesc_enable_interrupt) */ + bool makeinline; /* Mark this function inline when generating code */ + gnode ig_node; /* inline-graph node for this function */ + struct data_declaration *interface; /* nesC: interface this cmd/event belongs to */ + typelist oldstyle_args; /* Type of arguments from old-style declaration */ + dd_list/*iduse*/ fn_uses; /* list of uses of identifiers in this fn */ + struct connections *connections; /* See nesc-generate.c: what this command + or event is connected to. */ + /* folding function for magic functions. pass is 0 when constant + folding during parsing, and goes from 1 to n for each final + constant folding pass (after all components loaded) */ + known_cst (*magic_fold)(function_call fcall, int pass); + + /* For variables */ + enum { variable_register, variable_static, variable_normal } vtype; + bool islocal; /* True for non-static local vars */ + bool isparameter; /* implies islocal */ + bool async_access; /* Some kind of access in an async context */ + bool async_write; /* A write in async context */ + bool norace; + + /* For constants */ + known_cst value; + bool substitute; /* Substitute value when unparsing */ + + /* For magic_strings */ + cstring schars; + + /* For interface_ref */ + nesc_declaration itype; + environment functions; + bool required; + typelist gparms; + + /* For component_ref */ + nesc_declaration ctype; + + /* For documentation comments */ + struct docstring doc; + + /* For typedefs of network base types */ + data_declaration encoder, decoder; /* encoder and decoder functions */ + data_declaration bf_encoder, bf_decoder; /* bitfield encoder and decoder functions */ + bool isbe; /* TRUE for big-endian types */ + type basetype; /* underlying non-network type (e.g., uint8_t) */ + + /* For type variables (some decl_typedefs). Regular typedefs (not type + variables) have typevar_none here. */ + enum { typevar_none, + typevar_normal, typevar_integer, typevar_number } typevar_kind; +}; + +struct label_declaration { + const char *name; + bool explicitly_declared; + bool used; + id_label firstuse; /* Never NULL */ + id_label definition; /* NULL until actually defined */ + function_decl containing_function; + atomic_stmt containing_atomic; +}; + +struct environment +{ + struct environment *sameregion parent; + function_decl fdecl; + bool parm_level : 1; + bool global_level : 1; /* Both system and component */ + bool deputy_scope : 1; + env sameregion id_env; + env sameregion tag_env; +}; + +extern data_declaration bad_decl; + +#endif diff --git a/src/dhash.c b/src/dhash.c new file mode 100644 index 0000000..1b3c563 --- /dev/null +++ b/src/dhash.c @@ -0,0 +1,215 @@ +/* + * Copyright (c) 1999-2001 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ +/* A (growable) hash table */ + +#include +#include "dhash.h" + +#if HAVE_STDINT_H +#include +typedef uint32_t uint32; +typedef uint64_t uint64; +#else +/* let's be gcc-specific as a fallback */ +#include +typedef unsigned int __attribute__ ((mode(__SI__))) uint32; +typedef unsigned int __attribute__ ((mode(__DI__))) uint64; +#endif + +struct dhash_table +{ + region sameregion r; + void **sameregion elements; + unsigned long size, used, log2size; + int (*compare)(void *key, void *y); + unsigned long (*hash)(void *x); +}; + +dhash_table new_dhash_table(region r, unsigned long initial_size, + int (*compare)(void *key, void *y), + unsigned long (*hash)(void *x)) +{ + dhash_table h = ralloc(r, struct dhash_table); + + h->r = r; + h->elements = rarrayalloc(r, initial_size, void *); + h->size = initial_size; + h->log2size = 0; + while (initial_size > 1) + { + h->log2size++; + initial_size >>= 1; + } + h->used = 0; + h->compare = compare; + h->hash = hash; + + return h; +} + +unsigned long dhash_used(dhash_table h) +{ + return h->used; +} + +#define MAGIC 0.6180339987 + +#define LLMAGIC ((uint64)(MAGIC * ((uint64)1 << 8 * sizeof(uint32)))) + +static unsigned long dhash(dhash_table h, void *x) +{ + uint32 hval = h->hash(x); + uint32 hash = hval * LLMAGIC; + + return hash >> (8 * sizeof(uint32) - h->log2size); +} + +void *dhlookup(dhash_table h, void *x) +{ + unsigned long i = dhash(h, x); + + for (;;) + { + void *bucket = h->elements[i]; + + if (!bucket) + return NULL; + if (h->compare(x, bucket)) + return bucket; + + if (++i >= h->size) + i = 0; + } +} + +void dhadd(dhash_table h, void *x) +{ + unsigned long i; + + h->used++; + if (h->used > 3 * h->size / 4) + { + void **oldelements = h->elements; + unsigned long j, oldsize = h->size; + + /* Grow hashtable */ + h->size *= 2; + h->log2size++; + h->elements = rarrayalloc(h->r, h->size, void *); + + /* Rehash old entries */ + for (j = 0; j < oldsize; j++) + if (oldelements[j]) + { + unsigned long newi = dhash(h, oldelements[j]); + + while (h->elements[newi]) + { + newi++; + if (newi >= h->size) + newi = 0; + } + h->elements[newi] = oldelements[j]; + if (j == i) + i = newi; + } + } + + i = dhash(h, x); + + for (;;) + { + if (!h->elements[i]) + { + h->elements[i] = x; + return; + } + + if (++i >= h->size) + i = 0; + } +} + +void *dhaddif(dhash_table h, void *entry) +{ + void *existing = dhlookup(h, entry); + + if (existing) + return existing; + + dhadd(h, entry); + return NULL; +} + + +dhash_scan dhscan(dhash_table h) +{ + dhash_scan iterator; + + iterator.h = h; + iterator.index = 0; + + return iterator; +} + +void *dhnext(dhash_scan *iterator) +{ + dhash_table h = iterator->h; + + for (;;) + { + void *x; + + if (iterator->index >= h->size) + return NULL; + x = h->elements[iterator->index++]; + if (x) + return x; + } +} + +static int ptr_compare(void *key, void *y) +{ + return key == y; +} + +static unsigned long ptr_hash(void *x) +{ + return (unsigned long)x >> 3; +} + +dhash_table new_dhash_ptr_table(region r, unsigned long initial_size) +{ + return new_dhash_table(r, initial_size, ptr_compare, ptr_hash); +} diff --git a/src/dhash.h b/src/dhash.h new file mode 100644 index 0000000..f352132 --- /dev/null +++ b/src/dhash.h @@ -0,0 +1,93 @@ +/* + * Copyright (c) 1999-2001 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ +#ifndef DHASH_H +#define DHASH_H + +#include "regions.h" + +typedef struct dhash_table *dhash_table; + +dhash_table new_dhash_table(region r, unsigned long initial_size, + int (*compare)(void *entry1, void *entry2), + unsigned long (*hash)(void *entry)); +/* Returns: new hash table created in region r, with specified initial size, + comparison and hashing functions +*/ + +void *dhlookup(dhash_table h, void *entry); +/* Returns: An entry x in hash table h such that compare(x, entry) is true, + or NULL if no entry found. +*/ + +void dhadd(dhash_table h, void *entry); +/* Effects: Unconditionally adds entry to hash table h (may create + duplicates) + Modifies: h +*/ + +void *dhaddif(dhash_table h, void *entry); +/* Effects: Adds entry to hash table h if it's not already there + (as determined by dhlookup) + Returns: dhlookup's result if entry not added, NULL otherwise + Modifies: h +*/ + +unsigned long dhash_used(dhash_table h); +/* Returns: number of elements in hash table h + */ + +typedef struct +{ + dhash_table h; + int index; +} dhash_scan; + +dhash_scan dhscan(dhash_table h); +/* Returns: new iterator for hash table h + */ +void *dhnext(dhash_scan *iterator); +/* Requires: no changes to hash table have been made since dhscan returned + *iterator + Effects: Returns next element of hash table iterated by *iterator, or + NULL if no elements remain + Modifies: iterator +*/ + +/* Some predefined hash tables */ + +dhash_table new_dhash_ptr_table(region r, unsigned long initial_size); +/* Returns: A new hash table which hashes pointers, with specified initial size + */ + +#endif diff --git a/src/edit.c b/src/edit.c new file mode 100644 index 0000000..1552fc1 --- /dev/null +++ b/src/edit.c @@ -0,0 +1,155 @@ +/* This file is part of the nesC compiler. + +This file is derived from the RC Compiler. It is thus + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include "parser.h" +#include "edit.h" +#include "semantics.h" +#include "stmt.h" +#include "constants.h" +#include "AST_utils.h" +#include "unparse.h" + +/* Declare a new temporary that can be assigned a value of type t. + Place the declaration at the start of block. + XXX: See discussion in types.c:tag2ast about the (lack of) correctness of + this approach. + Return it's declaration */ +data_decl build_declaration(region r, struct environment *e, + type t, const char *name, expression init, + data_declaration *oddecl) +{ + struct data_declaration tempdecl; + identifier_declarator id; + variable_decl vd; + data_decl dd; + declarator tdeclarator; + type_element tmodifiers; + + /* Compute real type, name */ + if (type_array(t)) + t = make_pointer_type(type_array_of(t)); + else if (type_function(t)) + t = make_pointer_type(t); + /* Qualifiers must not be present on the temp (the qualifiers of t apply + to the original location we are building a temp) */ + t = make_qualified_type(t, no_qualifiers); + + /* Build AST for the declaration */ + id = new_identifier_declarator(r, dummy_location, str2cstring(r, name)); + type2ast(r, dummy_location, t, CAST(declarator, id), &tdeclarator, &tmodifiers); + vd = new_variable_decl(r, dummy_location, tdeclarator, NULL, init, NULL, NULL); + vd->declared_type = t; + dd = new_data_decl(r, dummy_location, tmodifiers, CAST(declaration, vd)); + + if (e) /* Declare the variable */ + { + init_data_declaration(&tempdecl, CAST(declaration, vd), id->cstring.data, t); + tempdecl.kind = decl_variable; + tempdecl.vtype = variable_normal; + tempdecl.islocal = TRUE; + *oddecl = vd->ddecl = declare(e, &tempdecl, FALSE); + } + + return dd; +} + +#define TEMP_PREFIX "__nesc_temp" + +char *next_temporary(void) +{ + static long nextid = 42; + static char idname[sizeof(TEMP_PREFIX) + 20]; + + sprintf(idname, TEMP_PREFIX "%ld", nextid++); + + return idname; +} + +/* Declare a new temporary that can be assigned a value of type t. + Place the declaration at the start of block. + Return it's declaration */ +data_declaration add_temporary(region r, compound_stmt block, type t) +{ + const char *name = next_temporary(); + data_decl dd = build_declaration(r, NULL, t, name, NULL, NULL); + struct data_declaration tempdecl; + data_declaration ddecl; + + /* Add to the function's declarations */ + dd->next = CAST(node, block->decls); + block->decls = CAST(declaration, dd); + +#if 0 + /* Set parent pointers */ + AST_set_parents(CAST(node, dd)); + dd->parent = CAST(node, block); + dd->parent_ptr = CASTSRPTR(node, &block->decls); + if (dd->next) + dd->next->parent_ptr = &dd->next; +#endif + + /* Declare the variable */ + init_data_declaration(&tempdecl, dd->decls, rstrdup(r, name), t); + tempdecl.kind = decl_variable; + tempdecl.vtype = variable_normal; + tempdecl.islocal = TRUE; + ddecl = declare(block->env, &tempdecl, FALSE); + CAST(variable_decl, dd->decls)->ddecl = ddecl; + + return ddecl; +} + +word build_word(region r, const char *cword) +{ + return new_word(r, dummy_location, str2cstring(r, cword)); +} + +expression build_string(region r, location loc, const char *str) +{ + string_cst elems = new_string_cst(r, loc, str2cstring(r, "oops")); + data_declaration sdecl = declare_string(NULL, str2cstring(r, str), FALSE); + string s = new_string(r, loc, elems, sdecl); + + s->type = sdecl->type; + s->static_address = foldaddress_string(s); + s->lvalue = TRUE; + + return CAST(expression, s); +} + +expression build_function_call(region r, location loc, + expression fn, expression arglist) +{ + expression result = CAST(expression, new_function_call(r, loc, fn, arglist, NULL, normal_call)); + type fntype = type_default_conversion(fn->type), rettype; + + if (type_pointer(fntype)) + /* All function types come this way because default_conversion makes + them into pointers to functions... */ + fntype = type_points_to(fntype); + + rettype = type_function_return_type(fntype); + result->type = rettype; + result->cst = fold_function_call(result, 0); + + return result; +} + diff --git a/src/edit.h b/src/edit.h new file mode 100644 index 0000000..383fa19 --- /dev/null +++ b/src/edit.h @@ -0,0 +1,45 @@ +/* This file is part of the nesC compiler. + +This file is derived from the RC Compiler. It is thus + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef EDIT_H +#define EDIT_H + +/* Declare a new variable that can be assigned a value of type t. + Place the declaration at the start of block. + XXX: See discussion in types.c:tag2ast about the (lack of) correctness of + this approach. + Return it's declaration */ +data_decl build_declaration(region r, struct environment *e, + type t, const char *name, expression init, + data_declaration *oddecl); + +/* Declare a new temporary that can be assigned a value of type t. + Place the declaration at the start of block. + Return it's declaration */ +data_declaration add_temporary(region r, compound_stmt block, type t); + +word build_word(region r, const char *cword); + +expression build_string(region r, location loc, const char *s); +expression build_function_call(region r, location loc, + expression fn, expression arglist); + +#endif diff --git a/src/env.c b/src/env.c new file mode 100644 index 0000000..e2bf9c2 --- /dev/null +++ b/src/env.c @@ -0,0 +1,130 @@ +/* This file is part of the nesC compiler. + +This file is derived from the RC Compiler. It is thus + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include "parser.h" +#include "env.h" +#include "dhash.h" +#include "utils.h" + +#define DEFAULT_ENV_SIZE 16 + +struct entry +{ + const char *name; + void *value; +}; + +struct env +{ + env parent; + region sameregion r; + dhash_table table; +}; + +static int env_compare(void *entry1, void *entry2) +{ + struct entry *e1 = entry1, *e2 = entry2; + + return e1->name && e2->name && strcmp(e1->name, e2->name) == 0; +} + +static unsigned long env_hash(void *entry) +{ + struct entry *e = entry; + + if (e->name) + return hash_str(e->name); + else /* unnamed (distinct from all other entries), hash on address */ + return hash_ptr(e); +} + +/* Create a new, empty environment with ancestor 'parent'. + The environment, and any future contents, are allocated in r */ +env new_env(region r, env parent) +{ + env e = ralloc(r, struct env); + + e->r = r; + e->parent = parent; + e->table = new_dhash_table(r, DEFAULT_ENV_SIZE, env_compare, env_hash); + + return e; +} + +/* Return parent environment of e */ +env env_parent(env e) +{ + return e->parent; +} + +/* Return region of e */ +region env_region(env e) +{ + return e->r; +} + +/* Find entry s in in environment e. If not found, check ancestors + except if this_level_only is true. + Returns entry's value if s is found, NULL otherwise */ +void *env_lookup(env e, const char *s, bool this_level_only) +{ + struct entry lookup, *found; + + lookup.name = s; + for (;;) + { + found = dhlookup(e->table, &lookup); + if (found) + return found->value; + if (this_level_only || !e->parent) + return NULL; + e = e->parent; + } +} + +/* Add an entry for s, with value 'value' to environment e. + Behaviour is undefined if e already contains an entry for s. + Does not copy s. */ +void env_add(env e, const char *s, void *value) +{ + struct entry *newe = ralloc(e->r, struct entry); + + newe->name = s; + newe->value = value; + dhadd(e->table, newe); +} + +void env_scan(env e, env_scanner *scanner) +{ + *scanner = dhscan(e->table); +} + +bool env_next(env_scanner *scanner, const char **name, void **value) +{ + struct entry *next = dhnext(scanner); + if (!next) + return FALSE; + + *name = next->name; + *value = next->value; + + return TRUE; +} diff --git a/src/env.h b/src/env.h new file mode 100644 index 0000000..1449e8e --- /dev/null +++ b/src/env.h @@ -0,0 +1,61 @@ +/* This file is part of the nesC compiler. + +This file is derived from the RC Compiler. It is thus + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef ENV_H +#define ENV_H + +#include "dhash.h" + +#include "regions.h" + +typedef struct env *env; + +/* Create a new, empty environment with ancestor 'parent'. + The environment, and any future contents, are allocated in r */ +env new_env(region r, env parent); + +/* An environment can be deleted by deleting its region */ + +/* Return parent environment of e */ +env env_parent(env e); + +/* Return region of e */ +region env_region(env e); + +/* Find entry s in in environment e. If not found, check ancestors + except if this_level_only is true. + Returns entry's value if s is found, NULL otherwise */ +void *env_lookup(env e, const char *s, bool this_level_only); + +/* Add an entry for s, with value 'value' to environment e. + If e already contains an entry for s, then the old entry is + hidden (but will still be found by env_scan). + s can be NULL (this allows registering of untagged structs/etc + in environments). Such entries cannot be found by env_lookup. + Does not copy s. */ +void env_add(env e, const char *s, void *value); + +/* Scanning */ +typedef dhash_scan env_scanner; +void env_scan(env e, env_scanner *scanner); +bool env_next(env_scanner *scanner, const char **name, void **value); + +#endif diff --git a/src/errors.c b/src/errors.c new file mode 100644 index 0000000..f838a2b --- /dev/null +++ b/src/errors.c @@ -0,0 +1,396 @@ +/* This file is part of the nesC compiler. + +This file is derived from RC and the GNU C Compiler. It is thus + Copyright (C) 1987, 88, 89, 92-7, 1998 Free Software Foundation, Inc. + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include + +#include "parser.h" +#include "errors.h" +#include "semantics.h" +#include "nesc-semantics.h" +#include "flags.h" + +/* Name of program invoked (from argv[0]). */ +const char *progname; + +int errorcount; +int warningcount; + +static location error_location; + +/* Set and clear the error/warning location to use when there is + no input file stack */ +void set_error_location(location l) +{ + error_location = l; +} + +void clear_error_location(void) +{ + error_location = NULL; +} + +location current_location(void) +{ + if (current.lex.input) + return ¤t.lex.input->l; + else if (error_location) + return error_location; + else + return dummy_location; +} + +/* Count an error or warning. Return 1 if the message should be printed. */ +int count_error(int warningp) +{ + if (warningp && inhibit_warnings) + return 0; + + if (warningp && !warnings_are_errors) + warningcount++; + else + { + static int warning_message = 0; + + if (warningp && !warning_message) + { + fprintf (stderr, "%s: warnings being treated as errors\n", progname); + warning_message = 1; + } + errorcount++; + } + + return 1; +} + +/* Function of last error message; + more generally, function such that if next error message is in it + then we don't have to mention the function name. */ +static function_decl last_error_function = NULL; + +/* Used to detect when current.lex.input has changed since last described. */ +static int last_error_tick; + +/* The default function to print out name of current function that caused + an error. */ + +/* Called by report_error_function to print out function name. */ +void print_error_function(const char *file) +{ + if (last_error_function != current.function_decl) + { + if (file) + fprintf (stderr, "%s: ", file); + + if (current.function_decl == NULL) + fprintf (stderr, "At top level:\n"); + else + { + const char *name, *iname; + + declarator_name(current.function_decl->declarator, &name, &iname); + fprintf (stderr, "In function `%s%s%s':\n", + iname ? iname : "", iname ? "." : "", name); + } + + last_error_function = current.function_decl; + } +} + +/* Print the current component if it's changed */ +void print_current_nesc_instance(void) +{ + static nesc_declaration last_container; + + if (last_container != current.container) + { + if (current.container) + fprintf(stderr, "In %s `%s':\n", + language_name(current.container->kind), + current.container->instance_name); + else + fprintf(stderr, "In C file:\n"); + last_container = current.container; + } +} + + +/* Prints out, if necessary, the name of the current function + that caused an error. Called from all error and warning functions. */ + +void report_error_function(const char *file) +{ + struct file_stack *p; + + if (current.lex.input && current.lex.input->next != 0 + && input_file_stack_tick != last_error_tick + && file == current.lex.input->l.filename) + { + fprintf (stderr, "In file included"); + for (p = current.lex.input->next; p; p = p->next) + { + fprintf (stderr, " from %s:%lu", p->l.filename, p->l.lineno); + if (p->next) + fprintf (stderr, ",\n "); + } + fprintf (stderr, ":\n"); + last_error_tick = input_file_stack_tick; + } + print_current_nesc_instance(); + + print_error_function(file); +} + + +static void pfile_and_line(FILE *f, location l) +{ + if (l->container) + fprintf(f, "%s(%s):%lu: ", l->filename, l->container->instance_name, l->lineno); + else if (l->lineno) + fprintf(f, "%s:%lu: ", l->filename, l->lineno); + else + fprintf(f, "%s: ", l->filename); +} + +/* Report error msg at l */ +void verror_with_location(location l, const char *format, va_list args) +{ + count_error(FALSE); + report_error_function(l->filename); + pfile_and_line(stderr, l); + vfprintf(stderr, format, args); + putc('\n', stderr); +} + +/* Report error msg at decl */ +void verror_with_decl(declaration d, const char *format, va_list args) +{ + verror_with_location(d->location, format, args); +} + +/* Report error msg at current filename, lineno */ +void verror(const char *format, va_list args) +{ + if (current.lex.input) + verror_with_location(¤t.lex.input->l, format, args); + else if (error_location) + verror_with_location(error_location, format, args); + else + { + count_error(FALSE); + fprintf(stderr, "%s: ", progname); + vfprintf(stderr, format, args); + putc('\n', stderr); + } +} + +/* Report error msg at current filename, lineno */ +void error(const char *format, ...) +{ + va_list args; + + va_start(args, format); + verror(format, args); + va_end(args); +} + +/* Report error msg at decl */ +void error_with_decl(declaration d, const char *format, ...) +{ + va_list args; + + va_start(args, format); + verror_with_decl(d, format, args); + va_end(args); +} + +/* Report error msg at l */ +void error_with_location(location l, const char *format, ...) +{ + va_list args; + + va_start(args, format); + verror_with_location(l, format, args); + va_end(args); +} + +/* Report a fatal error at the current line number. */ +void vfatal(const char *format, va_list args) +{ + verror(format, args); + exit(FATAL_EXIT_CODE); +} + +void fatal(const char *format, ...) +{ + va_list args; + + va_start(args, format); + vfatal(format, args); + va_end(args); +} + +/* Report warning msg at l */ +void vwarning_with_location(location l, const char *format, va_list args) +{ + if (count_error(TRUE)) + { + report_error_function(l->filename); + pfile_and_line(stderr, l); + fprintf(stderr, "warning: "); + vfprintf(stderr, format, args); + putc('\n', stderr); + } +} + +/* Report warning msg at decl */ +void vwarning_with_decl(declaration d, const char *format, va_list args) +{ + vwarning_with_location(d->location, format, args); +} + +/* Report warning msg at current filename, lineno */ +void vwarning(const char *format, va_list args) +{ + if (current.lex.input) + vwarning_with_location(¤t.lex.input->l, format, args); + else if (error_location) + vwarning_with_location(error_location, format, args); + else if (count_error(TRUE)) + { + fprintf(stderr, "%s: warning: ", progname); + vfprintf(stderr, format, args); + putc('\n', stderr); + } +} + +/* Report warning msg at current filename, lineno */ +void warning(const char *format, ...) +{ + va_list args; + + va_start(args, format); + vwarning(format, args); + va_end(args); +} + + +/* Report warning msg at decl */ +void warning_with_decl(declaration d, const char *format, ...) +{ + va_list args; + + va_start(args, format); + vwarning_with_decl(d, format, args); + va_end(args); +} + +/* Report warning msg at l */ +void warning_with_location(location l, const char *format, ...) +{ + va_list args; + + va_start(args, format); + vwarning_with_location(l, format, args); + va_end(args); +} + +/* Report warning msg at current filename, lineno */ +void warning_or_error(bool iswarning, const char *format, ...) +{ + va_list args; + + va_start(args, format); + if (iswarning) + vwarning(format, args); + else + verror(format, args); + va_end(args); +} + + +/* Report warning msg at decl */ +void warning_or_error_with_decl(bool iswarning, declaration d, + const char *format, ...) +{ + va_list args; + + va_start(args, format); + if (iswarning) + vwarning_with_decl(d, format, args); + else + verror_with_decl(d, format, args); + va_end(args); +} + +/* Report warning msg at l */ +void warning_or_error_with_location(bool iswarning, location l, + const char *format, ...) +{ + va_list args; + + va_start(args, format); + if (iswarning) + vwarning_with_location(l, format, args); + else + verror_with_location(l, format, args); + va_end(args); +} + +/* Report pedantic warning or error msg at current filename, lineno */ +void pedwarn(const char *format, ...) +{ + va_list args; + + va_start(args, format); + if (flag_pedantic_errors) + verror(format, args); + else + vwarning(format, args); + va_end(args); +} + +/* Report pedantic warning or error msg at d */ +void pedwarn_with_decl(declaration d, const char *format, ...) +{ + va_list args; + + va_start(args, format); + if (flag_pedantic_errors) + verror_with_decl(d, format, args); + else + vwarning_with_decl(d, format, args); + va_end(args); +} + +/* Report pedantic warning or error msg at l */ +void pedwarn_with_location(location l, const char *format, ...) +{ + va_list args; + + va_start(args, format); + if (flag_pedantic_errors) + verror_with_location(l, format, args); + else + vwarning_with_location(l, format, args); + va_end(args); +} + diff --git a/src/errors.h b/src/errors.h new file mode 100644 index 0000000..1261edf --- /dev/null +++ b/src/errors.h @@ -0,0 +1,101 @@ +/* This file is part of the nesC compiler. + +This file is derived from RC and the GNU C Compiler. It is thus + Copyright (C) 1987, 88, 89, 92-7, 1998 Free Software Foundation, Inc. + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef ERRORS_H +#define ERRORS_H + +/* Name of program invoked, sans directories. */ +extern const char *progname; + +extern int errorcount; +extern int warningcount; + +/* Set and clear the error/warning location to use when there is + no input file stack */ +void set_error_location(location l); +void clear_error_location(void); + +location current_location(void); + +/* Report error msg at l */ +void verror_with_location(location l, const char *format, va_list args); + +/* Report error msg at decl */ +void verror_with_decl(declaration d, const char *format, va_list args); + +/* Report error msg at current filename, lineno */ +void verror(const char *format, va_list args); + +/* Report error msg at current filename, lineno */ +void error(const char *format, ...); + +/* Report error msg at decl */ +void error_with_decl(declaration d, const char *format, ...); + +/* Report error msg at l */ +void error_with_location(location l, const char *format, ...); + +/* Report a fatal error at the current line number. */ +void vfatal(const char *format, va_list args); + +void fatal(const char *format, ...); + +/* Report warning msg at l */ +void vwarning_with_location(location l, const char *format, va_list args); + +/* Report warning msg at decl */ +void vwarning_with_decl(declaration d, const char *format, va_list args); + +/* Report warning msg at current filename, lineno */ +void vwarning(const char *format, va_list args); + +/* Report warning msg at current filename, lineno */ +void warning(const char *format, ...); + + +/* Report warning msg at decl */ +void warning_with_decl(declaration d, const char *format, ...); + +/* Report warning msg at l */ +void warning_with_location(location l, const char *format, ...); + +/* Report warning msg at current filename, lineno */ +void warning_or_error(bool iswarning, const char *format, ...); + +/* Report warning msg at decl */ +void warning_or_error_with_decl(bool iswarning, declaration d, + const char *format, ...); + +/* Report warning msg at l */ +void warning_or_error_with_location(bool iswarning, location l, + const char *format, ...); + +/* Report pedantic warning or error msg at current filename, lineno */ +void pedwarn(const char *format, ...); + +/* Report pedantic warning or error msg at d */ +void pedwarn_with_decl(declaration d, const char *format, ...); + +/* Report pedantic warning or error msg at l */ +void pedwarn_with_location(location l, const char *format, ...); + +#endif diff --git a/src/expr.c b/src/expr.c new file mode 100644 index 0000000..de94563 --- /dev/null +++ b/src/expr.c @@ -0,0 +1,1723 @@ +/* This file is part of the nesC compiler. + +This file is derived from RC and the GNU C Compiler. It is thus + Copyright (C) 1987, 88, 89, 92-7, 1998 Free Software Foundation, Inc. + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include "parser.h" +#include "expr.h" +#include "types.h" +#include "c-parse.h" +#include "constants.h" +#include "unparse.h" +#include "semantics.h" +#include "stmt.h" +#include "AST_utils.h" +#include "nesc-module.h" +#include "nesc-configuration.h" +#include "nesc-component.h" +#include "nesc-semantics.h" + +/* Return TRUE if TTL and TTR are pointers to types that are equivalent, + ignoring their qualifiers. */ +static bool compatible_pointer_targets(type ttl, type ttr, bool pedantic) +{ + int val; + + val = type_compatible_unqualified(ttl, ttr); + + if (val == 2 && pedantic) + pedwarn("types are not quite compatible"); + return val != 0; +} + +static bool compatible_pointer_types(type tl, type tr) +{ + return compatible_pointer_targets(type_points_to(tl), type_points_to(tr), + pedantic); +} + +/* Function arguments are positive, interface parameters are negative. + Return appropriate string for messages for *parmnum, and set + *parmnum to its absolute value + */ +static const char *argtype(int *parmnum) +{ + if (*parmnum >= 0) + return "argument"; + *parmnum = -*parmnum; + return "parameter"; +} + +static void warn_for_assignment(const char *msg, const char *opname, + data_declaration fdecl, int argnum) +{ + static char argstring[] = "passing %s %d of `%s'"; + static char argnofun[] = "passing %s %d"; + + if (opname == 0) + { + char *tmpname; + const char *argname = argtype(&argnum); + + if (fdecl) + { + const char *function = decl_printname(fdecl); + + /* Function name is known; supply it. */ + tmpname = (char *)alloca(strlen(function) + sizeof(argstring) + 25 /*%d*/ + 1); + sprintf(tmpname, argstring, argname, argnum, function); + } + else + { + /* Function name unknown (call through ptr); just give arg number. */ + tmpname = (char *)alloca(sizeof(argnofun) + 25 /*%d*/ + 1); + sprintf(tmpname, argnofun, argname, argnum); + } + opname = tmpname; + } + pedwarn(msg, opname); +} + +static void incomplete_type_error(expression e, type t) +{ + /* Avoid duplicate error message. */ + if (t == error_type) + return; + + if (e && is_identifier(e)) + error("`%s' has an incomplete type", CAST(identifier, e)->cstring.data); + else + { + while (type_array(t) && type_array_size(t)) + t = type_array_of(t); + + if (type_tagged(t)) + { + tag_declaration tag = type_tag(t); + + error("invalid use of undefined type `%s %s'", + tagkind_name(tag->kind), tag->name); + } + else if (type_void(t)) + error("invalid use of void expression"); + else if (type_array(t)) + error("invalid use of array with unspecified bounds"); + else + assert(0); + /* XXX: Missing special message for typedef's */ + } +} + +static type require_complete_type(expression e, type etype) +{ + if (!type_incomplete(etype)) + return e->type; + + incomplete_type_error(e, etype); + + return error_type; +} + +type default_conversion(expression e) +{ + type from = e->type; + + if (type_enum(from)) + from = type_tag(from)->reptype; + + if (type_smallerthanint(from)) + { + /* Traditionally, unsignedness is preserved in default promotions. */ + if (flag_traditional && type_unsigned(from)) + return unsigned_int_type; + else + return int_type; + } + + if (flag_traditional && !flag_allow_single_precision && type_float(from)) + return double_type; + + if (type_void(from)) + { + error("void value not ignored as it ought to be"); + return error_type; + } + + /* Note that the (future) type variables cannot represent function or + array types, so we need not worry about what default_conversion + does to them for the function and array type cases. */ + + if (type_function(from)) + { + assert(!e->cst); + e->cst = e->static_address; + e->converted_to_pointer = TRUE; + return make_pointer_type(from); + } + + if (type_array(from)) + { + if (!e->lvalue) + { + error("invalid use of non-lvalue array"); + return error_type; + } + assert(!e->cst); + e->cst = e->static_address; + e->converted_to_pointer = TRUE; + /* It's being used as a pointer, so is not an lvalue */ + e->lvalue = FALSE; + return make_pointer_type(type_array_of(from)); + } + + if (type_variable(from)) + { + data_declaration vdecl = type_variable_decl(from); + + switch (vdecl->typevar_kind) + { + case typevar_integer: return unknown_int_type; + case typevar_number: return unknown_number_type; + default: break; + } + } + + return from; +} + +/* called default_function_array_conversion in gcc 3.x */ +type default_conversion_for_assignment(expression e) +{ + if (type_array(e->type) || type_function(e->type)) + return default_conversion(e); + else + return e->type; +} + +static void readonly_warning(expression e, char *context) +{ + char buf[80]; + + strcpy(buf, context); + + if (is_field_ref(e)) + { + field_ref field = CAST(field_ref, e); + + if (type_readonly(field->arg1->type)) + readonly_warning(field->arg1, context); + else + { + strcat(buf, " of read-only member `%s'"); + pedwarn(buf, field->cstring.data); + } + } + else if (is_identifier(e)) + { + strcat(buf, " of read-only variable `%s'"); + pedwarn(buf, CAST(identifier, e)->cstring.data); + } + else + pedwarn ("%s of read-only location", buf); +} + +static bool check_writable_lvalue(expression e, char *context) +{ + if (!e->lvalue || type_array(e->type)) + { + error("invalid lvalue in %s", context); + return FALSE; + } + if (type_readonly(e->type)) + readonly_warning(e, context); + return TRUE; +} + +bool check_conversion(type to, type from) +{ + if (type_equal_unqualified(to, from)) + return TRUE; + + if (to == error_type || from == error_type) + return FALSE; + + if (type_void(from)) + { + error("void value not ignored as it ought to be"); + return FALSE; + } + + if (type_void(to)) + return TRUE; + + if (type_integer(to)) + { + if (!type_scalar(from)) + { + error("aggregate value used where an integer was expected"); + return FALSE; + } + } + else if (type_pointer(to)) + { + if (!(type_integer(from) || type_pointer(from))) + { + error("cannot convert to a pointer type"); + return FALSE; + } + } + else if (type_floating(to)) + { + if (type_pointer(from)) + { + error("pointer value used where a floating point value was expected"); + return FALSE; + } + else if (!type_arithmetic(from)) + { + error("aggregate value used where a float was expected"); + return FALSE; + } + } + else if (type_complex(to)) + { + if (type_pointer(from)) + { + error("pointer value used where a complex was expected"); + return FALSE; + } + else if (!type_arithmetic(from)) + { + error("aggregate value used where a complex was expected"); + return FALSE; + } + } + else + { + error("conversion to non-scalar type requested"); + return FALSE; + } + return TRUE; +} + +static bool assignable_pointer_targets(type tt1, type tt2, bool pedantic) +{ + return type_void(tt1) || type_void(tt2) + || compatible_pointer_targets(tt1, tt2, pedantic); +} + +static void ptrconversion_warnings(type ttl, type ttr, expression rhs, + const char *context, + data_declaration fdecl, int parmnum, + bool pedantic) +{ + if (pedantic + && ((type_void(ttl) && type_function(ttr)) || + (type_function(ttl) && type_void(ttr) && + !(rhs && definite_null(rhs))))) + warn_for_assignment("ANSI forbids %s between function pointer and `void *'", + context, fdecl, parmnum); + + /* Const and volatile mean something different for function + types, so the usual warnings are not appropriate. */ + else if (type_function(ttl) && type_function(ttr)) + { + /* Because const and volatile on functions are + restrictions that say the function will not do + certain things, it is okay to use a const or volatile + function where an ordinary one is wanted, but not + vice-versa. */ + if (type_const(ttl) && !type_const(ttr)) + warn_for_assignment("%s makes `const *' function pointer from non-const", + context, fdecl, parmnum); + if (type_volatile(ttl) && !type_volatile(ttr)) + warn_for_assignment("%s makes `volatile *' function pointer from non-volatile", + context, fdecl, parmnum); + } + else if (!type_function(ttl) && !type_function(ttr)) + { + if (!type_const(ttl) && type_const(ttr)) + warn_for_assignment("%s discards `const' from pointer target type", + context, fdecl, parmnum); + if (!type_volatile(ttl) && type_volatile(ttr)) + warn_for_assignment("%s discards `volatile' from pointer target type", + context, fdecl, parmnum); + + /* If this is not a case of ignoring a mismatch in signedness, + no warning. */ + if (!assignable_pointer_targets(ttl, ttr, FALSE) && pedantic) + warn_for_assignment("pointer targets in %s differ in signedness", + context, fdecl, parmnum); + } +} + +/* Return TRUE if no error and lhstype and rhstype are not error_type */ +bool check_assignment(type lhstype, type rhstype, expression rhs, + const char *context, data_declaration fundecl, + int parmnum) +{ + bool zerorhs = rhs && definite_zero(rhs); + + if (lhstype == error_type || rhstype == error_type) + return FALSE; + + if (type_void(rhstype)) + { + error("void value not ignored as it ought to be"); + return FALSE; + } + + if (type_equal_unqualified(lhstype, rhstype)) + return TRUE; + + if (type_arithmetic(lhstype) && type_arithmetic(rhstype)) + { + if (rhs) + constant_overflow_warning(rhs->cst); + return check_conversion(lhstype, rhstype); + } + if (parmnum && (type_qualifiers(lhstype) & transparent_qualifier)) + { + /* See if we can match any field of lhstype */ + tag_declaration tag = type_tag(lhstype); + field_declaration fields, marginal_field = NULL; + + /* I blame gcc for this horrible mess (and it's minor inconsistencies + with the regular rules) */ + /* pedantic warnings are skipped in here because we're already + issuing a warning for the use of this construct */ + for (fields = tag->fieldlist; fields; fields = fields->next) + { + type ft = fields->type; + + if (type_compatible(ft, rhstype)) + break; + + if (!type_pointer(ft)) + continue; + + if (type_pointer(rhstype)) + { + type ttl = type_points_to(ft), ttr = type_points_to(rhstype); + bool goodmatch = assignable_pointer_targets(ttl, ttr, FALSE); + + /* Any non-function converts to a [const][volatile] void * + and vice versa; otherwise, targets must be the same. + Meanwhile, the lhs target must have all the qualifiers of + the rhs. */ + if (goodmatch) + { + /* If this type won't generate any warnings, use it. */ + if ((type_function(ttr) && type_function(ttl)) + ? ((!type_const(ttl) | type_const(ttr)) + & (!type_volatile(ttl) | type_volatile(ttr))) + : ((type_const(ttl) | !type_const(ttr)) + & (type_volatile(ttl) | !type_volatile(ttr)))) + break; + + /* Keep looking for a better type, but remember this one. */ + if (!marginal_field) + marginal_field = fields; + } + } + + /* Can convert integer zero to any pointer type. */ + /* Note that this allows passing *any* null pointer (gcc bug?) */ + if (zerorhs) + break; + } + + if (fields || marginal_field) + { + if (!fields) + { + /* We have only a marginally acceptable member type; + it needs a warning. */ + type ttl = type_points_to(marginal_field->type), + ttr = type_points_to(rhstype); + + ptrconversion_warnings(ttl, ttr, rhs, context, fundecl, parmnum, + FALSE); + } + + if (pedantic && !(fundecl && fundecl->in_system_header)) + pedwarn("ANSI C prohibits argument conversion to union type"); + + return TRUE; + } + } + + if (type_pointer(lhstype) && type_pointer(rhstype)) + { + type ttl = type_points_to(lhstype), ttr = type_points_to(rhstype); + bool goodmatch = assignable_pointer_targets(ttl, ttr, pedantic); + + /* Any non-function converts to a [const][volatile] void * + and vice versa; otherwise, targets must be the same. + Meanwhile, the lhs target must have all the qualifiers of the rhs. */ + if (goodmatch || (type_equal_unqualified(make_unsigned_type(ttl), + make_unsigned_type(ttr)))) + ptrconversion_warnings(ttl, ttr, rhs, context, fundecl, parmnum, + pedantic); + else + warn_for_assignment("%s from incompatible pointer type", + context, fundecl, parmnum); + + return check_conversion(lhstype, rhstype); + } + /* enum = ptr and ptr = enum counts as an error, so use type_integral */ + else if (type_pointer(lhstype) && type_integral(rhstype)) + { + if (!zerorhs) + warn_for_assignment("%s makes pointer from integer without a cast", + context, fundecl, parmnum); + return check_conversion(lhstype, rhstype); + } + else if (type_integral(lhstype) && type_pointer(rhstype)) + { + warn_for_assignment("%s makes integer from pointer without a cast", + context, fundecl, parmnum); + return check_conversion(lhstype, rhstype); + } + + if (!context) + { + const char *argname = argtype(&parmnum); + + if (fundecl) + error("incompatible type for %s %d of `%s'", argname, parmnum, + decl_printname(fundecl)); + else + error("incompatible type for %s %d of indirect function call", + argname, parmnum); + } + else + error("incompatible types in %s", context); + + return FALSE; +} + +expression make_error_expr(void) +{ + expression result = CAST(expression, new_error_expr(parse_region, dummy_location)); + + result->type = error_type; + + return result; +} + +expression make_comma(location loc, expression elist) +{ + expression result = CAST(expression, new_comma(parse_region, loc, elist)); + expression e; + bool all_cst = TRUE; + + scan_expression (e, elist) + if (e->next) /* Not last */ + { + if (!e->cst) + all_cst = FALSE; +#if 0 + if (!e->side_effects) + { + /* The left-hand operand of a comma expression is like an expression + statement: with -W or -Wunused, we should warn if it doesn't have + any side-effects, unless it was explicitly cast to (void). */ + if ((extra_warnings || warn_unused) + && !(TREE_CODE (TREE_VALUE (list)) == CONVERT_EXPR + && TREE_TYPE (TREE_VALUE (list)) == void_type_node)) + warning ("left-hand operand of comma expression has no effect"); + } + else if (warn_unused) + warn_if_unused_value(e); +#endif + } + else + { + if (type_array(e->type)) + result->type = default_conversion(e); + else + result->type = e->type; + + if (!pedantic) + { + /* (e1, ..., en) is a constant expression if all ei are constant + expressions. Weird? (see cst10.c) */ + if (all_cst) + result->cst = e->cst; + result->lvalue = e->lvalue; + result->isregister = e->isregister; + result->bitfield = e->bitfield; + } + } + + return result; +} + +static void check_dereference(expression result, type dereferenced, + const char *errorstring) +{ + if (type_pointer(dereferenced)) + { + type t = type_points_to(dereferenced); + + result->type = t; +#if 0 + if (TYPE_SIZE (t) == 0 && TREE_CODE (t) != ARRAY_TYPE) + { + error ("dereferencing pointer to incomplete type"); + return error_mark_node; + } +#endif + if (type_void(t) && !unevaluated_expression()) + warning("dereferencing `void *' pointer"); + result->side_effects |= type_volatile(t) /*|| flag_volatile*/; + } + else + { + result->type = error_type; + if (dereferenced != error_type) + error("invalid type argument of `%s'", errorstring); + } + result->lvalue = TRUE; +} + +expression make_dereference(location loc, expression e) +{ + expression result = CAST(expression, new_dereference(parse_region, loc, e)); + + result->side_effects = e->side_effects; + check_dereference(result, default_conversion(e), "unary *"); + result->static_address = e->cst; + + return result; +} + +expression make_extension_expr(location loc, expression e) +{ + expression result = CAST(expression, new_extension_expr(parse_region, loc, e)); + + result->type = e->type; + result->lvalue = e->lvalue; + result->side_effects = e->side_effects; + result->cst = e->cst; + result->bitfield = e->bitfield; + result->isregister = e->isregister; + result->static_address = e->static_address; + + return result; +} + +expression make_address_of(location loc, expression e) +{ + expression result = CAST(expression, new_address_of(parse_region, loc, e)); + + result->type = error_type; + + if (e->type == error_type) + ; + else if (e->bitfield) + error("attempt to take address of a bit-field structure member"); + else + { + if (e->isregister) + pedwarn("address of a register variable requested"); + + if (!(type_function(e->type) || e->lvalue)) + error("invalid lvalue in unary `&'"); + + result->type = make_pointer_type(e->type); + result->cst = e->static_address; + } + return result; +} + +expression make_unary(location loc, int unop, expression e) +{ + switch (unop) + { + case kind_address_of: + return make_address_of(loc, e); + case kind_preincrement: + return make_preincrement(loc, e); + case kind_predecrement: + return make_predecrement(loc, e); + default: + { + expression result = CAST(expression, newkind_unary(parse_region, unop, loc, e)); + type etype = default_conversion(e); + const char *errstring = NULL; + + if (etype == error_type) + result->type = error_type; + else + { + switch (unop) + { + case kind_unary_plus: + if (!type_arithmetic(etype)) + errstring = "wrong type argument to unary plus"; + break; + case kind_unary_minus: + if (!type_arithmetic(etype)) + errstring = "wrong type argument to unary minus"; + break; + case kind_bitnot: + if (type_complex(etype)) + result->kind = kind_conjugate; + else if (!type_integer(etype)) + errstring = "wrong type argument to bit-complement"; + break; + case kind_not: + if (!type_scalar(etype)) + errstring = "wrong type argument to unary exclamation mark"; + else + etype = int_type; + break; + case kind_realpart: case kind_imagpart: + if (!type_arithmetic(etype)) + if (unop == kind_realpart) + errstring = "wrong type argument to __real__"; + else + errstring = "wrong type argument to __imag__"; + else + etype = type_complex(etype) ? make_base_type(etype) : etype; + break; + default: + assert(0); + } + if (errstring) + { + error(errstring); + result->type = error_type; + } + else + { + result->type = etype; + result->cst = fold_unary(result); + } + } + return result; + } + } +} + +expression make_label_address(location loc, id_label label) +{ + expression result = CAST(expression, new_label_address(parse_region, loc, label)); + + use_label(label); + + result->type = ptr_void_type; + result->cst = fold_label_address(result); + + if (pedantic) + pedwarn("ANSI C forbids `&&'"); + + return result; +} + +static void check_sizealign(const char *kind, type stype) +{ + if (type_command(stype) || type_event(stype) || + type_interface(stype) || type_component(stype)) + error("%s applied to a command, event, interface or component", kind); + else if (type_incomplete(stype)) + error("%s applied to an incomplete type", kind); +} + +void check_sizeof(expression result, type stype) +{ + if (type_function(stype)) + { + if (pedantic || warn_pointer_arith) + pedwarn("sizeof applied to a function type"); + } + else if (type_void(stype)) + { + if (pedantic || warn_pointer_arith) + pedwarn("sizeof applied to a void type"); + } + else + check_sizealign("sizeof", stype); + + result->type = size_t_type; + result->cst = fold_sizeof(result, stype); +} + +expression make_sizeof_expr(location loc, expression e) +{ + expression result = CAST(expression, new_sizeof_expr(parse_region, loc, e)); + check_sizeof(result, e->type); + return result; +} + +expression make_sizeof_type(location loc, asttype t) +{ + expression result = CAST(expression, new_sizeof_type(parse_region, loc, t)); + check_sizeof(result, t->type); + return result; +} + +void check_alignof(expression result, type stype) +{ + check_sizealign("__alignof__", stype); + + result->type = size_t_type; + result->cst = fold_sizeof(result, stype); +} + +expression make_alignof_expr(location loc, expression e) +{ + expression result = CAST(expression, new_alignof_expr(parse_region, loc, e)); + check_alignof(result, e->type); + return result; +} + +expression make_alignof_type(location loc, asttype t) +{ + expression result = CAST(expression, new_alignof_type(parse_region, loc, t)); + check_alignof(result, t->type); + return result; +} + +expression make_cast(location loc, asttype t, expression e) +{ + expression result = CAST(expression, new_cast(parse_region, loc, e, t)); + type castto = t->type; + + if (castto == error_type || type_void(castto)) + ; /* Do nothing */ + else if (type_array(castto)) + { + error("cast specifies array type"); + castto = error_type; + } + else if (type_function(castto)) + { + error("cast specifies function type"); + castto = error_type; + } + else if (type_equal_unqualified(castto, e->type)) + { + if (pedantic && type_aggregate(castto)) + pedwarn("ANSI C forbids casting nonscalar to the same type"); + } + else + { + type etype = e->type; + + /* Convert functions and arrays to pointers, + but don't convert any other types. */ + if (type_function(etype) || type_array(etype)) + etype = default_conversion(e); + + if (type_union(castto)) + { + tag_declaration utag = type_tag(castto); + field_declaration ufield; + + /* Look for etype as a field of the union */ + for (ufield = utag->fieldlist; ufield; ufield = ufield->next) + if (ufield->name && type_equal_unqualified(ufield->type, etype)) + { + if (pedantic) + pedwarn("ANSI C forbids casts to union type"); + break; + } + if (!ufield) + error("cast to union type from type not present in union"); + } + else + { + /* Optionally warn about potentially worrisome casts. */ + + if (warn_cast_qual && type_pointer(etype) && type_pointer(castto)) + { + type ep = type_points_to(etype), cp = type_points_to(castto); + + if (type_volatile(ep) && !type_volatile(cp)) + pedwarn("cast discards `volatile' from pointer target type"); + if (type_const(ep) && !type_const(cp)) + pedwarn("cast discards `const' from pointer target type"); + } + + /* This warning is weird */ + if (warn_bad_function_cast && is_function_call(e) && + !type_equal_unqualified(castto, etype)) + warning ("cast does not match function type"); + +#if 0 + /* Warn about possible alignment problems. */ + if (STRICT_ALIGNMENT && warn_cast_align + && TREE_CODE (type) == POINTER_TYPE + && TREE_CODE (otype) == POINTER_TYPE + && TREE_CODE (TREE_TYPE (otype)) != VOID_TYPE + && TREE_CODE (TREE_TYPE (otype)) != FUNCTION_TYPE + /* Don't warn about opaque types, where the actual alignment + restriction is unknown. */ + && !((TREE_CODE (TREE_TYPE (otype)) == UNION_TYPE + || TREE_CODE (TREE_TYPE (otype)) == RECORD_TYPE) + && TYPE_MODE (TREE_TYPE (otype)) == VOIDmode) + && TYPE_ALIGN (TREE_TYPE (type)) > TYPE_ALIGN (TREE_TYPE (otype))) + warning ("cast increases required alignment of target type"); + + if (TREE_CODE (type) == INTEGER_TYPE + && TREE_CODE (otype) == POINTER_TYPE + && TYPE_PRECISION (type) != TYPE_PRECISION (otype) + && !TREE_CONSTANT (value)) + warning ("cast from pointer to integer of different size"); + + if (TREE_CODE (type) == POINTER_TYPE + && TREE_CODE (otype) == INTEGER_TYPE + && TYPE_PRECISION (type) != TYPE_PRECISION (otype) +#if 0 + /* Don't warn about converting 0 to pointer, + provided the 0 was explicit--not cast or made by folding. */ + && !(TREE_CODE (value) == INTEGER_CST && integer_zerop (value)) +#endif + /* Don't warn about converting any constant. */ + && !TREE_CONSTANT (value)) + warning ("cast to pointer from integer of different size"); +#endif + + if (!check_conversion(castto, etype)) + castto = error_type; + } + } + + result->lvalue = !pedantic && e->lvalue; + result->isregister = e->isregister; + result->bitfield = e->bitfield; + result->static_address = e->static_address; + result->type = castto; + if (castto != error_type) + result->cst = fold_cast(result); + + return result; +} + +type pointer_int_sum(type ptype, type itype) +{ + type pointed = type_points_to(ptype); + + if (type_void(pointed)) + { + if (pedantic || warn_pointer_arith) + pedwarn("pointer of type `void *' used in arithmetic"); + } + else if (type_function(pointed)) + { + if (pedantic || warn_pointer_arith) + pedwarn("pointer to a function used in arithmetic"); + } + else if (type_incomplete(pointed)) + error("arithmetic on pointer to an incomplete type"); + + return ptype; +} + +bool valid_compare(type t1, type t2, expression e1) +{ + if (type_void(type_points_to(t1))) + { + if (pedantic && type_function(type_points_to(t2)) && !definite_null(e1)) + pedwarn("ANSI C forbids comparison of `void *' with function pointer"); + return TRUE; + } + return FALSE; +} + +type check_binary(int binop, expression e1, expression e2) +{ + type t1 = default_conversion(e1), t2 = default_conversion(e2); + type rtype = NULL; + bool common = FALSE; + + /* XXX: Misc warnings (see build_binary_op) */ + if (t1 == error_type || t2 == error_type) + rtype = error_type; + else switch(binop) + { + case kind_plus: + if (type_pointer(t1) && type_integer(t2)) + rtype = pointer_int_sum(t1, t2); + else if (type_pointer(t2) && type_integer(t1)) + rtype = pointer_int_sum(t2, t1); + else + common = TRUE; + break; + + case kind_minus: + if (type_pointer(t1) && type_integer(t2)) + rtype = pointer_int_sum(t1, t2); + else if (type_pointer(t1) && type_pointer(t2) && + compatible_pointer_types(t1, t2)) + rtype = ptrdiff_t_type; + else + common = TRUE; + break; + + case kind_plus_assign: case kind_minus_assign: + if (type_pointer(t1) && type_integer(t2)) + rtype = pointer_int_sum(t1, t2); + else + common = TRUE; + break; + + case kind_times: case kind_divide: + case kind_times_assign: case kind_divide_assign: + common = TRUE; + break; + + case kind_modulo: case kind_bitand: case kind_bitor: case kind_bitxor: + case kind_lshift: case kind_rshift: + case kind_modulo_assign: case kind_bitand_assign: case kind_bitor_assign: + case kind_bitxor_assign: case kind_lshift_assign: case kind_rshift_assign: + if (type_integer(t1) && type_integer(t2)) + rtype = common_type(t1, t2); + break; + + case kind_leq: case kind_geq: case kind_lt: case kind_gt: + rtype = int_type; /* Default to assuming success */ + if (type_real(t1) && type_real(t2)) + ; + else if (type_pointer(t1) && type_pointer(t2)) + { + if (compatible_pointer_types(t1, t2)) + { + /* XXX: how can this happen ? */ + if (type_incomplete(t1) != type_incomplete(t2)) + pedwarn("comparison of complete and incomplete pointers"); + else if (pedantic && type_function(type_points_to(t1))) + pedwarn("ANSI C forbids ordered comparisons of pointers to functions"); + } + else + pedwarn("comparison of distinct pointer types lacks a cast"); + } + /* XXX: Use of definite_zero may lead to extra warnings when !extra_warnings */ + else if ((type_pointer(t1) && definite_zero(e2)) || + (type_pointer(t2) && definite_zero(e1))) + { + if (pedantic || extra_warnings) + pedwarn("ordered comparison of pointer with integer zero"); + } + else if ((type_pointer(t1) && type_integer(t2)) || + (type_pointer(t2) && type_integer(t1))) + { + if (!flag_traditional) + pedwarn("comparison between pointer and integer"); + } + else + rtype = NULL; /* Force error */ + break; + + case kind_eq: case kind_ne: + rtype = int_type; /* Default to assuming success */ + if (type_arithmetic(t1) && type_arithmetic(t2)) + ; + else if (type_pointer(t1) && type_pointer(t2)) + { + if (!compatible_pointer_types(t1, t2) && + !valid_compare(t1, t2, e1) && + !valid_compare(t2, t1, e2)) + pedwarn("comparison of distinct pointer types lacks a cast"); + } + else if ((type_pointer(t1) && definite_null(e2)) || + (type_pointer(t2) && definite_null(e1))) + ; + else if ((type_pointer(t1) && type_integer(t2)) || + (type_pointer(t2) && type_integer(t1))) + { + if (!flag_traditional) + pedwarn("comparison between pointer and integer"); + } + else + rtype = NULL; /* Force error */ + break; + + case kind_andand: case kind_oror: + if (type_scalar(t1) && type_scalar(t2)) + rtype = int_type; + break; + + default: assert(0); break; + } + + if (common && type_arithmetic(t1) && type_arithmetic(t2)) + rtype = common_type(t1, t2); + + if (!rtype) + { + error("invalid operands to binary %s", binary_op_name(binop)); + rtype = error_type; + } + + return rtype; +} + +static bool unsafe_comparison(expression e) +{ + return !e->parens && is_comparison(e); +} + +expression make_binary(location loc, int binop, expression e1, expression e2) +{ + expression result = CAST(expression, newkind_binary(parse_region, binop, loc, e1, e2)); + + result->type = check_binary(binop, e1, e2); + if (result->type != error_type) + { + result->cst = fold_binary(result->type, result); + } + + /* Check for cases such as x+y<parens ? 0 : e1->kind, code2 = e2->parens ? 0 : e2->kind; + + if (binop == kind_lshift || binop == kind_rshift) + { + if (code1 == kind_plus || code1 == kind_minus + || code2 == kind_plus || code2 == kind_minus) + warning("suggest parentheses around + or - inside shift"); + } + + if (binop == kind_oror) + { + if (code1 == kind_andand || code2 == kind_andand) + warning("suggest parentheses around && within ||"); + } + + if (binop == kind_bitor) + { + if (code1 == kind_bitand || code1 == kind_bitxor + || code1 == kind_plus || code1 == kind_minus + || code2 == kind_bitand || code2 == kind_bitxor + || code2 == kind_plus || code2 == kind_minus) + warning("suggest parentheses around arithmetic in operand of |"); + /* Check cases like x|y==z */ + if (unsafe_comparison(e1) || unsafe_comparison(e2)) + warning("suggest parentheses around comparison in operand of |"); + } + + if (binop == kind_bitxor) + { + if (code1 == kind_bitand + || code1 == kind_plus || code1 == kind_minus + || code2 == kind_bitand + || code2 == kind_plus || code2 == kind_minus) + warning ("suggest parentheses around arithmetic in operand of ^"); + /* Check cases like x^y==z */ + if (unsafe_comparison(e1) || unsafe_comparison(e2)) + warning("suggest parentheses around comparison in operand of ^"); + } + + if (binop == kind_bitand) + { + if (code1 == kind_plus || code1 == kind_minus + || code2 == kind_plus || code2 == kind_minus) + warning ("suggest parentheses around + or - in operand of &"); + /* Check cases like x&y==z */ + if (unsafe_comparison(e1) || unsafe_comparison(e2)) + warning("suggest parentheses around comparison in operand of &"); + } + } + + /* Similarly, check for cases like 1<=i<=10 that are probably errors. */ + if (unsafe_comparison(result) && extra_warnings + && (unsafe_comparison(e1) || unsafe_comparison(e2))) + warning("comparisons like X<=Y<=Z do not have their mathematical meaning"); + +#if 0 + unsigned_conversion_warning (result, arg1); + unsigned_conversion_warning (result, arg2); + overflow_warning (result); +#endif + + return result; +} + +static bool voidstar_conditional(type t1, type t2) +{ + if (type_void(t1)) + { + if (pedantic && type_function(t2)) + pedwarn("ANSI C forbids conditional expr between `void *' and function pointer"); + return TRUE; + } + return FALSE; +} + +static bool pointerint_conditional(type t1, type t2, expression e2) +{ + if (type_pointer(t1) && type_integer(t2)) + { + if (!definite_zero(e2)) + pedwarn("pointer/integer type mismatch in conditional expression"); + return TRUE; + } + return FALSE; +} + +expression make_conditional(location loc, expression cond, + expression true, expression false) +{ + expression result = + CAST(expression, new_conditional(parse_region, loc, cond, true, false)); + type ctype, ttype, ftype, rtype = NULL; + bool truelvalue = true ? true->lvalue : FALSE; + + ctype = default_conversion(cond); + + if (!true) + { + true = cond; + truelvalue = FALSE; /* Not an lvalue in gcc ! */ + } + + if (type_void(true->type)) + ttype = true->type; + else + ttype = default_conversion(true); + + if (type_void(false->type)) + ftype = false->type; + else + ftype = default_conversion(false); + + if (ctype == error_type || ttype == error_type || ftype == error_type) + rtype = error_type; + else if (type_equal(ttype, ftype)) + rtype = ttype; + else if (type_equal_unqualified(ttype, ftype)) + rtype = make_qualified_type(ttype, no_qualifiers); + else if (type_real(ttype) && type_real(ftype)) + /* This should probably be type_arithmetic. See complex3.c/C9X */ + rtype = common_type(ttype, ftype); + else if (type_void(ttype) || type_void(ftype)) + { + if (pedantic && (!type_void(ttype) || !type_void(ftype))) + pedwarn("ANSI C forbids conditional expr with only one void side"); + rtype = void_type; + } + else if (type_pointer(ttype) && type_pointer(ftype)) + { + type tpointsto = type_points_to(ttype), fpointsto = type_points_to(ftype); + + if (compatible_pointer_types(ttype, ftype)) + rtype = common_type(tpointsto, fpointsto); + else if (definite_null(true) && type_void(tpointsto)) + rtype = fpointsto; + else if (definite_null(false) && type_void(fpointsto)) + rtype = tpointsto; + else if (voidstar_conditional(tpointsto, fpointsto)) + rtype = tpointsto; /* void * result */ + else if (voidstar_conditional(fpointsto, tpointsto)) + rtype = fpointsto; /* void * result */ + else + { + pedwarn("pointer type mismatch in conditional expression"); + /* Slight difference from GCC: I qualify the result type with + the appropriate qualifiers */ + rtype = void_type; + } + + /* Qualifiers depend on both types */ + rtype = make_pointer_type(qualify_type2(rtype, tpointsto, fpointsto)); + } + else if (pointerint_conditional(ttype, ftype, false)) + rtype = ttype; + else if (pointerint_conditional(ftype, ttype, true)) + rtype = ftype; + else if (flag_cond_mismatch) + rtype = void_type; + else + { + error("type mismatch in conditional expression"); + rtype = error_type; + } + + /* Qualifiers depend on both types */ + if (rtype != error_type) + rtype = qualify_type2(rtype, ttype, ftype); + + result->type = rtype; + result->lvalue = !pedantic && truelvalue && false->lvalue; + result->isregister = true->isregister || false->isregister; + result->bitfield = true->bitfield || false->bitfield; + result->cst = fold_conditional(result); + + return result; +} + +expression make_assign(location loc, int binop, expression e1, expression e2) +{ + expression result = CAST(expression, newkind_binary(parse_region, binop, + loc, e1, e2)); + type t1 = require_complete_type(e1, e1->type), t2; + + result->type = error_type; + if (t1 != error_type && e2->type != error_type) + { + expression rhs; + + if (binop == kind_assign) + { + t2 = default_conversion_for_assignment(e2); + rhs = e2; + } + else + { + t2 = check_binary(binop, e1, e2); + rhs = NULL; + } + + if (check_writable_lvalue(e1, "assignment") && + check_assignment(e1->type, t2, rhs, "assignment", NULL, 0)) + result->type = make_qualified_type(e1->type, no_qualifiers); + } + + return result; +} + +expression make_identifier(location loc, cstring id, bool maybe_implicit) +{ + /* XXX: Should pass decl as argument (lexer looked it up already) */ + data_declaration decl = lookup_id(id.data, FALSE); + identifier result = new_identifier(parse_region, loc, id, NULL); + + if (decl && decl->islimbo) /* Limbo declarations don't really exist */ + decl = NULL; + + if (!decl && maybe_implicit) /* An implicit function declaration */ + decl = implicitly_declare(result); + + if (!decl) + { + /* Suppress undeclare identifier errors in deputy scopes - they + will be reprocessed later under deputy scoping rules (see + nesc-deputy.c) */ + if (!current.env->deputy_scope) + { + if (!current.function_decl) + error("`%s' undeclared here (not in a function)", id.data); + else if (!env_lookup(current.function_decl->undeclared_variables, id.data, FALSE)) + { + static bool undeclared_variable_notice; + + error("`%s' undeclared (first use in this function)", id.data); + env_add(current.function_decl->undeclared_variables, id.data, (void *)1); + if (!undeclared_variable_notice) + { + error("(Each undeclared identifier is reported only once"); + error("for each function it appears in.)"); + undeclared_variable_notice = TRUE; + } + } + } + decl = bad_decl; + } + + /* XXX: check for register variables of containing function */ + result->type = decl->type; + result->lvalue = decl->kind == decl_variable || + decl->kind == decl_magic_string; + result->cst = fold_identifier(CAST(expression, result), decl, 0); + result->isregister = decl->kind == decl_variable && + decl->vtype == variable_register; + result->static_address = foldaddress_identifier(CAST(expression, result), decl); + result->ddecl = decl; + + return CAST(expression, result); +} + +expression make_compound_expr(location loc, statement block) +{ + if (is_error_stmt(block)) + return make_error_expr(); + else + { + expression result = CAST(expression, new_compound_expr(parse_region, loc, block)); + compound_stmt bs = CAST(compound_stmt, block); + statement last_stmt = last_statement(bs->stmts); + + if (last_stmt && is_expression_stmt(last_stmt)) + result->type = CAST(expression_stmt, last_stmt)->arg1->type; + else + result->type = void_type; + + return result; + } +} + +bool check_arguments(type fntype, expression arglist, + data_declaration fundecl, bool generic_call) +{ + typelist_scanner parmtypes; + int parmstep = generic_call ? -1 : 1, parmnum = parmstep; + type parmtype; + const char *argname; + int old_errorcount = errorcount; + + if (!type_function_oldstyle(fntype)) + { + typelist_scan(type_function_arguments(fntype), &parmtypes); + + while ((parmtype = typelist_next(&parmtypes)) && arglist) + { + type argtype = arglist->type; + + if (type_incomplete(parmtype)) + error("type of formal parameter %d is incomplete", parmnum); + else + { + if (warn_conversion) + { + if (type_integer(parmtype) && type_floating(argtype)) + warn_for_assignment("%s as integer rather than floating due to prototype", + NULL, fundecl, parmnum); + else if (type_floating(parmtype) && type_integer(argtype)) + warn_for_assignment ("%s as floating rather than integer due to prototype", + NULL, fundecl, parmnum); + else if (type_complex(parmtype) && type_floating(argtype)) + warn_for_assignment ("%s as complex rather than floating due to prototype", + NULL, fundecl, parmnum); + else if (type_floating(parmtype) && type_complex(argtype)) + warn_for_assignment ("%s as floating rather than complex due to prototype", + NULL, fundecl, parmnum); + /* Warn if any argument is passed as `float', + since without a prototype it would be `double'. */ + else if (type_float(parmtype) && type_floating(argtype)) + warn_for_assignment ("%s as `float' rather than `double' due to prototype", + NULL, fundecl, parmnum); +#if 0 + else + { + /* Type that would have been passed w/o proto */ + type type1 = default_conversion(arglist); + + /* No warning if function asks for enum + and the actual arg is that enum type. */ + if (type_enum(parmtype) && type_equal_unqualified(parmtype, argtype)) + ; + /* XXX: else messy stuff that cannot easily be done w/o constant + folding and type size info */ + } +#endif + } + check_assignment(parmtype, default_conversion_for_assignment(arglist), + arglist, NULL, fundecl, parmnum); + } + parmnum += parmstep; + arglist = CAST(expression, arglist->next); + } + argname = argtype(&parmstep); + if (parmtype) + { + if (fundecl) + error("too few %ss to function `%s'", argname, + decl_printname(fundecl)); + else + error("too few %ss to function", argname); + } + else if (arglist && !type_function_varargs(fntype)) + { + if (fundecl) + error("too many %ss to function `%s'", argname, + decl_printname(fundecl)); + else + error("too many %ss to function", argname); + } + } + + /* Checks for arguments with no corresponding argument type */ + while (arglist) + { + require_complete_type(arglist, default_conversion(arglist)); + arglist = CAST(expression, arglist->next); + } + + return errorcount == old_errorcount; +} + +expression make_function_call(location loc, expression fn, expression arglist) +{ + expression result = CAST(expression, new_function_call(parse_region, loc, fn, arglist, NULL, normal_call)); + type fntype = default_conversion(fn), rettype; + bool argumentsok; + + result->type = error_type; + if (fntype == error_type) + return result; + + /* Hack for __nesc_enable_interrupt (see nesc-uses.h) */ + if (is_identifier(fn) && CAST(identifier, fn)->ddecl == enable_interrupt) + { + current.function_decl->ddecl->extra_contexts |= c_call_nonatomic; + if (current.in_atomic) + warning("call to __nesc_enable_interrupt within an atomic statement"); + } + + if (type_pointer(fntype)) + /* All function types come this way because default_conversion makes + them into pointers to functions... */ + fntype = type_points_to(fntype); + + if (!type_functional(fntype)) + { + if (type_generic(fntype)) + error("parameters missing in call to parameterised command or event"); + else + error("called object is not a function, command, event or task"); + return result; + } + + argumentsok = check_arguments(fntype, arglist, get_function_ddecl(fn), FALSE); + + rettype = type_function_return_type(fntype); + result->type = rettype; + if (!type_void(rettype)) + result->type = require_complete_type(result, rettype); + + if (argumentsok) + result->cst = fold_function_call(result, 0); + + return result; +} + +expression make_va_arg(location loc, expression arg, asttype type) +{ + expression va_arg_id = build_identifier(parse_region, loc, builtin_va_arg_decl); + expression result = CAST(expression, new_function_call(parse_region, loc, va_arg_id, arg, type, normal_call)); + + if (!type_equal_unqualified(arg->type, builtin_va_list_type)) + error("first argument to `va_arg' not of type `va_list'"); + + if (!type_self_promoting(type->type)) + { + static bool gave_help; + + error("char, short and float are automatically promoted when passed through `...'"); + if (!gave_help) + { + gave_help = TRUE; + error("(so you should pass `int', `unsigned' or `double' to `va_arg')"); + } + } + result->type = type->type; + + return result; +} + +expression make_offsetof(location loc, asttype t, dd_list fields) +{ + expression zero; + + zero = CAST(expression, + fold_lexical_int(size_t_type, loc, str2cstring(parse_region, "0"), FALSE, 0, FALSE)); + + if (!(t->type == error_type || type_struct(t->type) || type_union(t->type))) + { + error("offsetof is only valid for structs or unions"); + return zero; /* a reasonable value ;-) */ + } + else + { + declarator ptr_to_t_d; + expression cast, fieldref, addrof; + declarator size_t_d; + type_element size_t_m; + asttype size_t_ast; + dd_list_pos field; + + /* Build ((size_t)&((t *)0)->fields) */ + ptr_to_t_d = CAST(declarator, + new_pointer_declarator(parse_region, loc, t->declarator)); + t = make_type(t->qualifiers, ptr_to_t_d); + cast = make_cast(loc, t, zero); + fieldref = make_dereference(loc, cast); + dd_scan (field, fields) + { + cstring f; + + f.data = DD_GET(char *, field); + f.length = strlen(f.data); + fieldref = make_field_ref(loc, fieldref, f); + } + addrof = make_unary(loc, kind_address_of, fieldref); + + type2ast(parse_region, loc, size_t_type, NULL, &size_t_d, &size_t_m); + size_t_ast = make_type(size_t_m, size_t_d); + + return make_cast(loc, size_t_ast, addrof); + } +} + +expression make_array_ref(location loc, expression array, expression index) +{ + expression result = CAST(expression, new_array_ref(parse_region, loc, array, index)); + type atype, itype; + + if (type_generic(array->type)) + return make_generic_call(loc, array, index); + + itype = default_conversion(index); + if (index->next) + index = make_comma(index->location, index); + + if (warn_char_subscripts && type_plain_char(index->type)) + warning("subscript has type `char'"); + + if (type_array(array->type) && !array->lvalue) + { + /* Some special GCC extensions */ + /* XXX: Ignoring the weird register stuff, going for a simple version + which seems essentially identical for our purposes */ + if (pedantic) + pedwarn("ANSI C forbids subscripting non-lvalue array"); + atype = make_pointer_type(type_array_of(array->type)); + + /* this should not be possible (non-lvalue arrays come from + array fields of non-lvalue struct expressions) */ + assert(!array->static_address); + } + else + atype = default_conversion(array); + + /* Put the integer in ITYPE to simplify error checking. */ + if (type_integer(atype)) + { + type temp = atype; + atype = itype; + itype = temp; + } + + if (!type_pointer(atype) || type_function(type_points_to(atype))) + { + error("subscripted value is neither array nor pointer"); + result->type = error_type; + result->lvalue = TRUE; + } + else + { + check_dereference(result, atype, "array indexing"); + result->static_address = fold_binary(atype, result); + } + + if (!type_integer(itype) && itype != error_type) + error("array subscript is not an integer"); + + return result; +} + +expression make_field_ref(location loc, expression object, cstring field) +{ + type otype = object->type; + field_ref result; + + if (type_interface(otype)) + return make_interface_deref(loc, object, field); + if (type_component(otype)) + return make_component_deref(loc, object, field); + + result = new_field_ref(parse_region, loc, object, field); + result->type = error_type; + + if (type_aggregate(otype)) + { + tag_declaration tag = type_tag(otype); + + if (!tag->defined) + incomplete_type_error(NULL, otype); + else + { + field_declaration fdecl = env_lookup(tag->fields, field.data, FALSE); + + if (!fdecl) + error("%s has no member named `%s'", tagkind_name(tag->kind), + field.data); + else + { + result->fdecl = fdecl; + result->type = qualify_type2(fdecl->type, fdecl->type, object->type); + result->bitfield = !cval_istop(fdecl->bitwidth); + result->static_address = foldaddress_field_ref(CAST(expression, result)); + } + } + } + else if (otype != error_type) + error("request for member `%s' in something not a structure or union", + field.data); + + result->lvalue = object->lvalue; + + return CAST(expression, result); +} + +static expression finish_increment(unary result, char *name) +{ + expression e = result->arg1; + type etype = e->type; + + result->type = error_type; + + if (!type_scalar(etype)) + error("wrong type argument to %s", name); + else + { + if (type_incomplete(etype)) + error("%s of pointer to unknown structure or union", name); + else if (type_pointer(etype) && (pedantic || warn_pointer_arith) && + (type_void(type_points_to(etype)) || + type_function(type_points_to(etype)))) + pedwarn("wrong type argument to %s", name); + + if (check_writable_lvalue(e, name)) + result->type = etype; + } + return CAST(expression, result); +} + +expression make_postincrement(location loc, expression e) +{ + return finish_increment(CAST(unary, new_postincrement(parse_region, loc, e)), + "increment"); +} + +expression make_preincrement(location loc, expression e) +{ + return finish_increment(CAST(unary, new_preincrement(parse_region, loc, e)), + "increment"); +} + +expression make_postdecrement(location loc, expression e) +{ + return finish_increment(CAST(unary, new_postdecrement(parse_region, loc, e)), + "decrement"); +} + +expression make_predecrement(location loc, expression e) +{ + return finish_increment(CAST(unary, new_predecrement(parse_region, loc, e)), + "decrement"); +} diff --git a/src/expr.h b/src/expr.h new file mode 100644 index 0000000..940dce1 --- /dev/null +++ b/src/expr.h @@ -0,0 +1,71 @@ +/* This file is part of the nesC compiler. + +This file is derived from RC and the GNU C Compiler. It is thus + Copyright (C) 1987, 88, 89, 92-7, 1998 Free Software Foundation, Inc. + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef EXPR_H +#define EXPR_H + +expression make_error_expr(void); + +expression make_comma(location loc, expression elist); +expression make_dereference(location loc, expression e); +expression make_extension_expr(location loc, expression e); +expression make_unary(location loc, int unop, expression e); +expression make_label_address(location loc, id_label label); +expression make_sizeof_expr(location loc, expression e); +expression make_sizeof_type(location loc, asttype t); +expression make_alignof_expr(location loc, expression e); +expression make_alignof_type(location loc, asttype t); +expression make_cast(location loc, asttype t, expression e); +expression make_binary(location loc, int binop, expression e1, expression e2); +expression make_conditional(location loc, expression cond, + expression true, expression false); +expression make_assign(location loc, int assignop, expression left, expression right); +expression make_identifier(location loc, cstring id, bool maybe_implicit); +expression make_compound_expr(location loc, statement block); +expression make_function_call(location loc, expression fn, expression arglist); +expression make_va_arg(location loc, expression arg, asttype type); +expression make_offsetof(location loc, asttype t, dd_list fields); +expression make_array_ref(location loc, expression array, expression index); +expression make_field_ref(location loc, expression object, cstring field); +expression make_field_indirectref(location loc, expression object, + cstring field); +expression make_postincrement(location loc, expression e); +expression make_preincrement(location loc, expression e); +expression make_postdecrement(location loc, expression e); +expression make_predecrement(location loc, expression e); + +/* Return TRUE if no error and lhstype and rhstype are not error_type */ +bool check_assignment(type lhstype, type rhstype, expression rhs, + const char *context, data_declaration fundecl, + int parmnum); + +bool check_conversion(type to, type from); +bool check_arguments(type fntype, expression arglist, + data_declaration fundecl, bool generic_call); + +type default_conversion(expression e); +type default_function_array_conversion(expression e); + +/* called default_function_array_conversion in gcc 3.x */ +type default_conversion_for_assignment(expression e); + +#endif diff --git a/src/flags.c b/src/flags.c new file mode 100644 index 0000000..03d1ff7 --- /dev/null +++ b/src/flags.c @@ -0,0 +1,308 @@ +/* This file is part of the nesC compiler. + +This file is derived from RC and the GNU C Compiler. It is thus + Copyright (C) 1987, 88, 89, 92-7, 1998 Free Software Foundation, Inc. + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include "parser.h" + +/* -f flags. */ + +/* Nonzero means just do syntax checking; don't output anything. */ +int flag_syntax_only; + +/* Nonzero means change certain warnings into errors. + Usually these are warnings about failure to conform to some standard. */ +int flag_pedantic_errors; + +/* Tag all structures with __attribute__(packed) */ +int flag_pack_struct; + +/* Options controlling warnings */ + +/* Don't print warning messages. -w. */ +int inhibit_warnings; + +/* Print various extra warnings. -W. */ +int extra_warnings; + +/* Treat warnings as errors. -Werror. */ +int warnings_are_errors; + +/* Nonzero to warn about unused local variables. */ +int warn_unused; + +/* Nonzero to warn about variables used before they are initialized. */ +int warn_uninitialized; + +/* Nonzero means warn about all declarations which shadow others. */ +int warn_shadow; +int error_shadow; /* Make shadow an error */ + +/* Warn if a switch on an enum fails to have a case for every enum value. */ +int warn_switch; + +/* Nonzero means warn about function definitions that default the return type + or that use a null return and have a return-type other than void. */ +int warn_return_type; + +/* Nonzero means warn about pointer casts that increase the required + alignment of the target type (and might therefore lead to a crash + due to a misaligned access). */ +int warn_cast_align; + +/* Nonzero means warn about any identifiers that match in the first N + characters. The value N is in `id_clash_len'. */ +int warn_id_clash; +unsigned id_clash_len; + +/* Nonzero means warn about any objects definitions whose size is larger + than N bytes. Also want about function definitions whose returned + values are larger than N bytes. The value N is in `larger_than_size'. */ +int warn_larger_than; +unsigned larger_than_size; + +/* Nonzero means warn if inline function is too large. */ +int warn_inline; + +/* Warn if a function returns an aggregate, + since there are often incompatible calling conventions for doing this. */ +int warn_aggregate_return; + +/* Nonzero means `$' can be in an identifier. */ +int dollars_in_ident; + +/* Nonzero means allow type mismatches in conditional expressions; + just make their values `void'. */ +int flag_cond_mismatch; + +/* Nonzero means don't recognize the keyword `asm'. */ +int flag_no_asm; + +/* Nonzero means environment is hosted (i.e., not freestanding) */ +int flag_hosted; + +/* Nonzero means warn about implicit declarations. */ +int warn_implicit; + +/* Nonzero means give string constants the type `const char *' + to get extra warnings from them. These warnings will be too numerous + to be useful, except in thoroughly ANSIfied programs. */ +int warn_write_strings; + +/* Nonzero means warn about sizeof (function) or addition/subtraction + of function pointers. */ +int warn_pointer_arith; + +/* Nonzero means warn for all old-style non-prototype function decls. */ +int warn_strict_prototypes; + +/* Nonzero means warn about multiple (redundant) decls for the same single + variable or function. */ +int warn_redundant_decls; + +/* Nonzero means warn about extern declarations of objects not at + file-scope level and about *all* declarations of functions (whether + extern or static) not at file-scope level. Note that we exclude + implicit function declarations. To get warnings about those, use + -Wimplicit. */ +int warn_nested_externs; + +/* Nonzero means warn about pointer casts that can drop a type qualifier + from the pointer target type. */ +int warn_cast_qual; + +/* Nonzero means warn when casting a function call to a type that does + not match the return type (e.g. (float)sqrt() or (anything*)malloc() + when there is no previous declaration of sqrt or malloc. */ +int warn_bad_function_cast; + +/* Warn about traditional constructs whose meanings changed in ANSI C. */ +int warn_traditional; + +/* Warn about *printf or *scanf format/argument anomalies. */ +int warn_format; + +/* Warn about a subscript that has type char. */ +int warn_char_subscripts; + +/* Warn if a type conversion is done that might have confusing results. */ +int warn_conversion; + +/* Warn if main is suspicious. */ +int warn_main; + +/* Nonzero means warn about use of multicharacter literals. */ +int warn_multichar = 1; + +/* Nonzero means do some things the same way PCC does. */ +int flag_traditional; + +/* Nonzero means to allow single precision math even if we're generally + being traditional. */ +int flag_allow_single_precision; + +/* Nonzero means warn about suggesting putting in ()'s. */ +int warn_parentheses; + +/* Warn if initializer is not completely bracketed. */ +int warn_missing_braces; + +/* Warn about comparison of signed and unsigned values. */ +int warn_sign_compare; + +/* Nonzero means message about use of implicit function declarations; + 1 means warning; 2 means error. */ +int mesg_implicit_function_declaration; + +/* Report pedantic warnings if true */ +bool pedantic; + +/* Nonzero means warn about use of implicit int. */ +int warn_implicit_int; + +/* Nonzero means warn for any global function def + without separate previous prototype decl. */ +int warn_missing_prototypes; + +/* Nonzero means warn for any global function def + without separate previous decl. */ +int warn_missing_declarations; + +/* Nonzero means `char' should be signed. */ +int flag_signed_char; + +/* Nonzero means give an enum type only as many bytes as it needs. */ +int flag_short_enums; + +/* Nonzero means to treat bitfields as signed unless they say `unsigned'. */ +int flag_signed_bitfields = 1; + +/* Nonzero means don't run real cc1 afterwards */ +int flag_parse_only; + +/* The value of the -nesc-path option */ +char *cmdline_nesc_path; + +/* Nonzero means suppress the dbg and dbg_clear functions (replace them + by macros in output). This is necessary because gcc won't inline + varargs functions */ +int flag_no_debug; + +/* Nonzero to suppress automatic addition of inline keywords + (but the "wiring" functions are still marked inline) */ +int flag_no_inline; + +/* Nonzero means to output macro defs in the generated C file */ +int flag_save_macros; + +/* Nonzero means modify identifier and declaration output during code + generation to accomodate nido */ +bool use_nido; + +/* specifies the maximum number of nodes that can be simulated at one time */ +char* nido_num_nodes = "1000"; + +/* the expression that gives the current mote number */ +char *nido_mote_number = "tos_state.current_node"; + +/* Nonzero for -v */ +int flag_verbose; + +/* Warn if there are unexpected documentation strings in the code */ +int warn_unexpected_docstring; + +/* Warn when function pointers are used */ +int warn_fnptr; + +/* Warn when data races are detected */ +int warn_data_race; + +/* Warn when async keyword is violated */ +int warn_async; + +/* Warn when no combiner function and multiple fns called */ +int warn_no_combiner; + +/* If true, warn_fnptr, warn_data_race, warn_async and warn_no_combiner + are treated as errors */ +int nesc_error; + +/* diff processing enabled if diff_output is not NULL + (diff_input is NULL for orignal program, non-NULL to reduce diff size) */\ +char *diff_input, *diff_output; + +/* If true, rewrite post/task to use interfaces+wiring rather than calls to + a TOS_post function. */ +int flag_use_scheduler; + +/* If true, we're using a mingw based gcc from a cygwin environment. We + should fix filenames before invoking gcc. */ +int flag_mingw_gcc; + +/* If true, check for atomic statements whose body is guaranteed to be + atomic (e.g., one single-byte read) */ +int nesc_optimise_atomic; + +/* Warn about possibly nested block comments, and C++ comments + spanning more than one physical line */ +int warn_comments; + +/* Warn if trigraphs are encountered that might affect the meaning of + the program */ +int warn_trigraphs; + +/* Warn about macros defined in the main file that are not used */ +int warn_unused_macros; + +/* Warn about stray tokens after #elif and #endif */ +int warn_endif_labels; + +/* Do not suppress warnings from system headers */ +int warn_system_headers; + +/* Warn if an undefined macro is used in an #if directive */ +int warn_undef; + +/* Warn about user-specified include directories that do not exist */ +int warn_missing_include_dirs; + +/* Warn about use of multi-character character constants */ +int warn_multichar; + +/* Support ISO C trigraphs */ +int flag_trigraphs; + +/* Do not search standard system include directories */ +int flag_nostdinc; + +/* Do not predefine system-specific and GCC-specific macros */ +int flag_undef; + +/* True if compiling for deputy */ +int flag_deputy; + +/* True if a module lacking a @safe() or @unsafe() attribute defaults + to safe; has no effect if flag_deputy is not true; this default can + be overridden by -fnesc-default-safe or -fnesc-default-unsafe */ +int flag_default_safe; + +/* True if transforming plain C code */ +int flag_c; + diff --git a/src/flags.h b/src/flags.h new file mode 100644 index 0000000..dba1d11 --- /dev/null +++ b/src/flags.h @@ -0,0 +1,306 @@ +/* This file is part of the nesC compiler. + +This file is derived from RC and the GNU C Compiler. It is thus + Copyright (C) 1987, 88, 89, 92-7, 1998 Free Software Foundation, Inc. + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef FLAGS_H +#define FLAGS_H + +/* -f flags. */ + +/* Nonzero means just do syntax checking; don't output anything. */ +extern int flag_syntax_only; + +/* Nonzero means change certain warnings into errors. + Usually these are warnings about failure to conform to some standard. */ +extern int flag_pedantic_errors; + +/* Tag all structures with __attribute__(packed) */ +extern int flag_pack_struct; + +/* Options controlling warnings */ + +/* Don't print warning messages. -w. */ +extern int inhibit_warnings; + +/* Print various extra warnings. -W. */ +extern int extra_warnings; + +/* Treat warnings as errors. -Werror. */ +extern int warnings_are_errors; + +/* Nonzero to warn about unused local variables. */ +extern int warn_unused; + +/* Nonzero to warn about variables used before they are initialized. */ +extern int warn_uninitialized; + +/* Nonzero means warn about all declarations which shadow others. */ +extern int warn_shadow; +extern int error_shadow; /* Make shadow an error */ + +/* Warn if a switch on an enum fails to have a case for every enum value. */ +extern int warn_switch; + +/* Nonzero means warn about function definitions that default the return type + or that use a null return and have a return-type other than void. */ +extern int warn_return_type; + +/* Nonzero means warn about pointer casts that increase the required + alignment of the target type (and might therefore lead to a crash + due to a misaligned access). */ +extern int warn_cast_align; + +/* Nonzero means warn about any identifiers that match in the first N + characters. The value N is in `id_clash_len'. */ +extern int warn_id_clash; +extern unsigned id_clash_len; + +/* Nonzero means warn about any objects definitions whose size is larger + than N bytes. Also want about function definitions whose returned + values are larger than N bytes. The value N is in `larger_than_size'. */ +extern int warn_larger_than; +extern unsigned larger_than_size; + +/* Nonzero means warn if inline function is too large. */ +extern int warn_inline; + +/* Warn if a function returns an aggregate, + since there are often incompatible calling conventions for doing this. */ +extern int warn_aggregate_return; + +/* Nonzero means `$' can be in an identifier. */ +extern int dollars_in_ident; + +/* Nonzero means allow type mismatches in conditional expressions; + just make their values `void'. */ +extern int flag_cond_mismatch; + +/* Nonzero means don't recognize the keyword `asm'. */ +extern int flag_no_asm; + +/* Nonzero means environment is hosted (i.e., not freestanding) */ +extern int flag_hosted; + +/* Nonzero means warn about implicit declarations. */ +extern int warn_implicit; + +/* Nonzero means give string constants the type `const char *' + to get extra warnings from them. These warnings will be too numerous + to be useful, except in thoroughly ANSIfied programs. */ +extern int warn_write_strings; + +/* Nonzero means warn about sizeof (function) or addition/subtraction + of function pointers. */ +extern int warn_pointer_arith; + +/* Nonzero means warn for all old-style non-prototype function decls. */ +extern int warn_strict_prototypes; + +/* Nonzero means warn about multiple (redundant) decls for the same single + variable or function. */ +extern int warn_redundant_decls; + +/* Nonzero means warn about extern declarations of objects not at + file-scope level and about *all* declarations of functions (whether + extern or static) not at file-scope level. Note that we exclude + implicit function declarations. To get warnings about those, use + -Wimplicit. */ +extern int warn_nested_externs; + +/* Nonzero means warn about pointer casts that can drop a type qualifier + from the pointer target type. */ +extern int warn_cast_qual; + +/* Nonzero means warn when casting a function call to a type that does + not match the return type (e.g. (float)sqrt() or (anything*)malloc() + when there is no previous declaration of sqrt or malloc. */ +extern int warn_bad_function_cast; + +/* Warn about traditional constructs whose meanings changed in ANSI C. */ +extern int warn_traditional; + +/* Warn about *printf or *scanf format/argument anomalies. */ +extern int warn_format; + +/* Warn about a subscript that has type char. */ +extern int warn_char_subscripts; + +/* Warn if a type conversion is done that might have confusing results. */ +extern int warn_conversion; + +/* Warn if main is suspicious. */ +extern int warn_main; + +/* Nonzero means warn about use of multicharacter literals. */ +extern int warn_multichar; + +/* Nonzero means do some things the same way PCC does. */ +extern int flag_traditional; + +/* Nonzero means to allow single precision math even if we're generally + being traditional. */ +extern int flag_allow_single_precision; + +/* Nonzero means warn about suggesting putting in ()'s. */ +extern int warn_parentheses; + +/* Warn if initializer is not completely bracketed. */ +extern int warn_missing_braces; + +/* Warn about comparison of signed and unsigned values. */ +extern int warn_sign_compare; + +/* Nonzero means message about use of implicit function declarations; + 1 means warning; 2 means error. */ +extern int mesg_implicit_function_declaration; + +extern bool pedantic; /* Report pedantic warnings if true */ + +/* Nonzero means warn about use of implicit int. */ +extern int warn_implicit_int; + +/* Nonzero means warn for any global function def + without separate previous prototype decl. */ +extern int warn_missing_prototypes; + +/* Nonzero means warn for any global function def + without separate previous decl. */ +extern int warn_missing_declarations; + +/* Nonzero means `char' should be signed. */ +extern int flag_signed_char; + +/* Nonzero means give an enum type only as many bytes as it needs. */ +extern int flag_short_enums; + +/* Nonzero means to treat bitfields as signed unless they say `unsigned'. */ +extern int flag_signed_bitfields; + +/* Nonzero means don't run real cc1 afterwards */ +extern int flag_parse_only; + +/* Nonzero means suppress the dbg and dbg_clear functions (replace them + by macros in output). This is necessary because gcc won't inline + varargs functions */ +extern int flag_no_debug; + +/* Nonzero to suppress automatic addition of inline keywords + (but the "wiring" functions are still marked inline) */ +extern int flag_no_inline; + +/* Nonzero means to output macro defs in the generated C file (a la -dD) */ +extern int flag_save_macros; + +/* Nonzero means modify identifier and declaration output during code + generation to accomodate nido */ +extern bool use_nido; + +/* specifies the maximum number of nodes that can be simulated at one time */ +extern char *nido_num_nodes; + +/* the expression that gives the current mote number */ +extern char *nido_mote_number; + +/* Nonzero for -v */ +extern int flag_verbose; + +/* Warn if there are unexpected documentation strings in the code */ +extern int warn_unexpected_docstring; + +/* Warn when function pointers are used */ +extern int warn_fnptr; + +/* Warn when data races are detected */ +extern int warn_data_race; + +/* Warn when async keyword is violated */ +extern int warn_async; + +/* Warn when no combiner function and multiple fns called */ +extern int warn_no_combiner; + +/* If true, warn_fnptr, warn_data_race, warn_async and warn_no_combiner + are treated as errors */ +extern int nesc_error; + +/* diff processing enabled if diff_output is not NULL + (diff_input is NULL for orignal program, non-NULL to reduce diff size) */\ +extern char *diff_input, *diff_output; + +/* If true, rewrite post/task to use interfaces+wiring rather than calls to + a TOS_post function. */ +extern int flag_use_scheduler; + +/* If true, we're using a mingw based gcc from a cygwin environment. We + should use windows filenames when invoking gcc. */ +extern int flag_mingw_gcc; + +/* If true, check for atomic statements whose body is guaranteed to be + atomic (e.g., one single-byte read) */ +extern int nesc_optimise_atomic; + +/* Warn about possibly nested block comments, and C++ comments + spanning more than one physical line */ +extern int warn_comments; + +/* Warn if trigraphs are encountered that might affect the meaning of + the program */ +extern int warn_trigraphs; + +/* Warn about macros defined in the main file that are not used */ +extern int warn_unused_macros; + +/* Warn about stray tokens after #elif and #endif */ +extern int warn_endif_labels; + +/* Do not suppress warnings from system headers */ +extern int warn_system_headers; + +/* Warn if an undefined macro is used in an #if directive */ +extern int warn_undef; + +/* Warn about user-specified include directories that do not exist */ +extern int warn_missing_include_dirs; + +/* Warn about use of multi-character character constants */ +extern int warn_multichar; + +/* Support ISO C trigraphs */ +extern int flag_trigraphs; + +/* Do not search standard system include directories */ +extern int flag_nostdinc; + +/* Do not predefine system-specific and GCC-specific macros */ +extern int flag_undef; + +/* True if compiling for deputy */ +extern int flag_deputy; + +/* True if a module lacking a @safe() or @unsafe() attribute defaults + to safe; has no effect if flag_deputy is not true; this default can + be overridden by -fnesc-default-safe or -fnesc-default-unsafe */ +extern int flag_default_safe; + +/* True if transforming plain C code */ +extern int flag_c; + +#endif diff --git a/src/gcc-cpp.h b/src/gcc-cpp.h new file mode 100644 index 0000000..f534636 --- /dev/null +++ b/src/gcc-cpp.h @@ -0,0 +1,8 @@ +/* load libcpp */ +#include "system.h" +#include "config.h" +#include "cpplib.h" +#include "line-map.h" +#undef bool +#define TRUE 1 +#define FALSE 0 diff --git a/src/graph.c b/src/graph.c new file mode 100644 index 0000000..3149332 --- /dev/null +++ b/src/graph.c @@ -0,0 +1,475 @@ +/* This file is part of the nesC compiler. + +This file is derived from the RC Compiler. It is thus + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include +#include "parser.h" +#include "graph.h" +#include "dd_list.h" +#include "sd_list.h" + +#undef new + +/* A generic directed graph type, with support for typical graph algos. +*/ + +/* A graph is a mutable data structure composed of nodes linked + by edges. + + Edges can be added and removed between existing nodes, nodes can + be added at will but only removed if they have no ingoing and no + outgoing edges. + + Each edge & node has associated user data (stored as a (void *)) + and a mark. Marks can be cleared individually or over the + whole graph (this last op remains O(1)). + + The order of edges within a node is not preserved. +*/ + +struct ggraph +{ + region sameregion r; + sd_list sameregion nodes; + long mark_count; /* Value used to mark nodes/edges */ +}; + +struct gnode +{ + struct sd_list_pos node; + ggraph sameregion graph; + gedge sameregion in; /* Ingoing edges */ + gedge sameregion out; /* Outgoing edges */ + void *data; + long mark; /* Mark count for this node */ +}; + +struct gedge +{ + gnode sameregion in_node, out_node; /* Extremities */ + gedge sameregion next_in, next_out; /* Edge in in/outgoing lists */ + void *data; + long mark; +}; + +/* Update functions */ +/* ---------------- */ + +ggraph new_graph(region r) +/* Returns: A new empty graph. +*/ +{ + ggraph new = ralloc(r, struct ggraph); + + new->r = r; + new->nodes = sd_new_list(r); + new->mark_count = 1; + + return new; +} + +void delete_graph(ggraph g, + void (*delete_node)(gnode n), + void (*delete_edge)(gedge e)) +/* Effects: Deletes graph g. Calls functions delete_node & delete_edge + on nodes and edges before deleting them. All edges of a node + are deleted before it is. + + If a delete_node/edge function is NULL it is not called. + Modifies: g +*/ +{ + /* Delete all edges */ + sd_list_pos node, next; + + sd_scan (node, g->nodes) + { + gnode n = SD_GET(gnode, node); + gedge e, next; + + for (e = n->in; e; e = next) + { + next = e->next_in; + if (delete_edge) delete_edge(e); + } + } + for (node = sd_first(g->nodes); !sd_is_end(node); node = next) + { + gnode n = SD_GET(gnode, node); + + next = sd_next(node); + if (delete_node) delete_node(n); + } + sd_del_list(g->nodes); +} + +ggraph copy_graph(region r, ggraph g) +/* Effects: Returns a graph that is a copy of g (i.e. with the same + number of nodes, and the same connections between them, the same + marks, the same data, etc). + Modifications to g won't modify the copy, and vice-versa. +*/ +{ + ggraph copy = new_graph(r); + gnode onode, nnode; + gedge oedge, nedge; + + copy->mark_count = g->mark_count; + + /* Make nodes in copy */ + graph_scan_nodes (onode, g) onode->data = graph_add_node(copy, onode->data); + + /* Then make edges */ + graph_scan_nodes (onode, g) + { + nnode = onode->data; + + graph_scan_in (oedge, onode) + { + nedge = graph_add_edge(graph_edge_from(oedge)->data, nnode, oedge->data); + nedge->mark = oedge->mark; + } + } + + /* Finally restore original graph */ + graph_scan_nodes (onode, g) + { + nnode = onode->data; + nnode->mark = onode->mark; + onode->data = nnode->data; + } + + return copy; +} + +gnode graph_add_node(ggraph g, void *data) +/* Effects: Adds a new node to graph g, with user data `data'. + The new node has no edges and is not marked. + Returns: The new node. + Modifies: g +*/ +{ + gnode new = ralloc(g->r, struct gnode); + + new->graph = g; + /*new->in = new->out = NULL;*/ + new->data = data; + new->mark = g->mark_count - 1; /* Unmarked */ + sd_add_last(g->nodes, &new->node); + + return new; +} + +bool graph_remove_node(gnode n) +/* Effects: Removes node n from its graph if it has no in/outgoing edges. + Returns: TRUE if n could be removed. + Modifies: n +*/ +{ + if (n->in || n->out) return FALSE; + sd_remove(&n->node); + + return TRUE; +} + +gedge graph_add_edge(gnode from, gnode to, void *data) +/* Effects: Adds an edge between nodes `from' & `to', with user data + `data'. The new edge is not marked. + Returns: The new edge. + Modifies: from, to +*/ +{ + gedge new = ralloc(from->graph->r, struct gedge); + + new->out_node = from; + new->in_node = to; + new->data = data; + new->mark = from->graph->mark_count - 1; + + /* Add to nodes */ + new->next_out = from->out; + from->out = new; + new->next_in = to->in; + to->in = new; + + return new; +} + +void graph_remove_edge(gedge e) +/* Effects: Removes edge e from its graph. + Modifies: e +*/ +{ + gedge sameregion *scan; + + /* Remove edge from nodes */ + for (scan = &e->in_node->in; *scan != e; scan = &(*scan)->next_in) ; + *scan = e->next_in; + + for (scan = &e->out_node->out; *scan != e; scan = &(*scan)->next_out) ; + *scan = e->next_out; +} + +/* Accessor operations */ +/* ------------------- */ + +dd_list graph_nodes(region r, ggraph g) +/* Returns: A list of all the nodes of g, each element of the list has + type gnode. +*/ +{ + dd_list nodes = dd_new_list(r); + sd_list_pos node; + + sd_scan (node, g->nodes) + dd_add_last(r, nodes, SD_GET(gnode, node)); + + return nodes; +} + +gnode graph_first_node(ggraph g) +/* Returns: The first node of g, or NULL if none + The order of nodes is arbitrary +*/ +{ + sd_list_pos first = sd_first(g->nodes); + + return sd_is_end(first) ? NULL : SD_GET(gnode, first); +} + +gnode graph_next_node(gnode n) +/* Returns: The node after n, or NULL if no more + The order of nodes is arbitrary +*/ +{ + sd_list_pos next = sd_next(&n->node); + + return sd_is_end(next) ? NULL : SD_GET(gnode, next); +} + +ggraph graph_node_graph(gnode n) +/* Returns: The graph n is a node of +*/ +{ + return n->graph; +} + +void *_graph_node_data(gnode n) +/* Returns: the data of node n +*/ +{ + return n->data; +} + +void _graph_node_set(gnode n, void *data) +/* Effects: Sets the data of node n to `data'. + Modifies: n +*/ +{ + n->data = data; +} + +dd_list graph_edges_in(region r, gnode n) +/* Returns: The list of ingoing edges for n. + Each element of the list has type gedge. + It is up to the caller to free the list with + dd_free_list(l, NULL) +*/ +{ + dd_list edges = dd_new_list(r); + gedge in; + + for (in = n->in; in; in = in->next_in) dd_add_last(r, edges, in); + + return edges; +} + +dd_list graph_edges_out(region r, gnode n) +/* Returns: The list of outgoing edges for n. + Each element of the list has type gedge. + It is up to the caller to free the list with + dd_free_list(l, NULL) +*/ +{ + dd_list edges = dd_new_list(r); + gedge out; + + for (out = n->out; out; out = out->next_out) dd_add_last(r, edges, out); + + return edges; +} + +gedge graph_first_edge_in(gnode n) +/* Returns: The first ingoing edge of n, or NULL if none + The order of edges is arbitrary +*/ +{ + return n->in; +} + +gedge graph_next_edge_in(gedge e) +/* Returns: The ingoing edge after e, or NULL if no more + The order of edges is arbitrary +*/ +{ + return e->next_in; +} + +gedge graph_first_edge_out(gnode n) +/* Returns: The first outgoing edge of n, ore NULL if none + The order of edges is arbitrary +*/ +{ + return n->out; +} + +gedge graph_next_edge_out(gedge e) +/* Returns: The outgoing edge after e, or NULL if no more + The order of edges is arbitrary +*/ +{ + return e->next_out; +} + +gnode graph_edge_from(gedge e) +/* Returns: The node this edge comes from. +*/ +{ + return e->out_node; +} + +gnode graph_edge_to(gedge e) +/* Returns: The node this edge goes to. +*/ +{ + return e->in_node; +} + +void *_graph_edge_data(gedge n) +/* Returns: the data of edge n +*/ +{ + return n->data; +} + +void _graph_edge_set(gedge n, void *data) +/* Effects: Sets the data of edge n to `data'. + Modifies: n +*/ +{ + n->data = data; +} + + +/* Marks */ +/* ----- */ + +void graph_clear_all_marks(ggraph g) +/* Effects: Clears all marks on edges and nodes of g. + Modifies: g +*/ +{ + g->mark_count++; + /* A wrap around of this 32 bit counter is rather unlikely. */ + assert(g->mark_count != 0); +} + +void graph_mark_node(gnode n) +/* Effects: Marks node n. + Modifies: n +*/ +{ + n->mark = n->graph->mark_count; +} + +void graph_unmark_node(gnode n) +/* Effects: Removed mark from node n. + Modifies: n +*/ +{ + n->mark = n->graph->mark_count - 1; +} + +bool graph_node_markedp(gnode n) +/* Returns: TRUE if n is marked +*/ +{ + return n->mark == n->graph->mark_count; +} + +void graph_mark_edge(gedge n) +/* Effects: Marks edge n. + Modifies: n +*/ +{ + n->mark = n->in_node->graph->mark_count; +} + +void graph_unmark_edge(gedge n) +/* Effects: Removed mark from edge n. + Modifies: n +*/ +{ + n->mark = n->in_node->graph->mark_count - 1; +} + +bool graph_edge_markedp(gedge n) +/* Returns: TRUE if n is marked +*/ +{ + return n->mark == n->in_node->graph->mark_count; +} + +void dbg_graph(ggraph g, void (*pnode)(gnode g)) deletes +{ + region temp = newregion(); + dd_list allnodes = graph_nodes(temp, g); + dd_list_pos anode; + int i = 0; + + dd_scan (anode, allnodes) + { + gnode node = DD_GET(gnode, anode); + gedge out; + + fprintf(stderr, "%d(0x%p):", i++, node); + + graph_scan_out (out, node) + { + gnode to = graph_edge_to(out); + int j = 0; + dd_list_pos anode2; + + dd_scan (anode2, allnodes) + { + if (DD_GET(gnode, anode2) == to) + { + fprintf(stderr, " %d", j); + break; + } + j++; + } + } + if (pnode) + pnode(node); + fprintf(stderr, "\n"); + } + deleteregion(temp); +} diff --git a/src/graph.h b/src/graph.h new file mode 100644 index 0000000..9769820 --- /dev/null +++ b/src/graph.h @@ -0,0 +1,250 @@ +/* This file is part of the nesC compiler. + +This file is derived from the RC Compiler. It is thus + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef GRAPH_H +#define GRAPH_H + +/* A generic directed graph type, with support for typical graph algos. +*/ + +/* A graph is a mutable data structure composed of nodes linked + by edges. + + Edges can be added and removed between existing nodes, nodes can + be added at will but only removed if they have no ingoing and no + outgoing edges. + + Each edge & node has associated user data (stored as a (void *)) + and a mark. Marks can be cleared individually or over the + whole graph (this last op remains O(1)). + + The order of edges within a node is not preserved. +*/ + +typedef struct ggraph *ggraph; +typedef struct gnode *gnode; +typedef struct gedge *gedge; + +/* Update functions */ +/* ---------------- */ + +ggraph new_graph(region r); +/* Returns: A new empty graph. All allocations are performed in region r. +*/ + +void delete_graph(ggraph g, + void (*delete_node)(gnode n), + void (*delete_edge)(gedge e)); +/* Effects: Deletes graph g. Calls functions delete_node & delete_edge + on nodes and edges before deleting them. All edges of a node + are deleted before it is. + + If a delete_node/edge function is NULL it is not called. + Modifies: g +*/ + +ggraph copy_graph(region r, ggraph g); +/* Effects: Returns a graph that is a copy of g (i.e. with the same + number of nodes, and the same connections between them). + Modifications to g won't modify the copy, and vice-versa. +*/ + +gnode graph_add_node(ggraph g, void *data); +/* Effects: Adds a new node to graph g, with user data `data'. + The new node has no edges and is not marked. + Returns: The new node. + Modifies: g +*/ + +bool graph_remove_node(gnode n); +/* Effects: Removes node n from its graph if it has no in/outgoing edges. + Returns: TRUE if n could be removed. + Modifies: n +*/ + +gedge graph_add_edge(gnode from, gnode to, void *data); +/* Effects: Adds an edge between nodes `from' & `to', with user data + `data'. The new edge is not marked. + Returns: The new edge. + Modifies: from, to +*/ + +void graph_remove_edge(gedge e); +/* Effects: Removes edge e from its graph. + Modifies: e +*/ + +/* Accessor operations */ +/* ------------------- */ + +dd_list graph_nodes(region r, ggraph g); +/* Returns: A list of all the nodes of g, each element of the list has + type gnode. + The list is allocated in region r. +*/ + +gnode graph_first_node(ggraph g); +/* Returns: The first node of g, or NULL if none + The order of nodes is arbitrary +*/ + +gnode graph_next_node(gnode n); +/* Returns: The node after n, or NULL if no more + The order of nodes is arbitrary +*/ + +#define graph_scan_nodes(node, g) \ + for (node = graph_first_node((g)); node; node = graph_next_node(node)) +/* Effects: Iterates variable node over the nodes of graph g + Requires: No nodes are added or removed from the graph during + the iteration. + Example: + count = 0; + graph_scan_nodes (node, g) count++; +*/ + + +ggraph graph_node_graph(gnode n); +/* Returns: The graph n is a node of +*/ + +void *_graph_node_data(gnode n); +#define NODE_GET(type, n) ((type)_graph_node_data((n))) +/* Returns: the data of node n, cast to `type' +*/ + +void _graph_node_set(gnode n, void *data); +#define NODE_SET(n, data) (_graph_node_set((n), (void *)(data))) +/* Effects: Sets the data of node n to `data'. + Modifies: n +*/ + +dd_list graph_edges_in(region r, gnode n); +/* Returns: The list of ingoing edges for n. + Each element of the list has type gedge. + It is up to the caller to free the list with + dd_free_list(l, NULL) +*/ + +dd_list graph_edges_out(region r, gnode n); +/* Returns: The list of outgoing edges for n. + Each element of the list has type gedge. + It is up to the caller to free the list with + dd_free_list(l, NULL) +*/ + +gedge graph_first_edge_in(gnode n); +/* Returns: The first ingoing edge of n, or NULL if none + The order of edges is arbitrary +*/ + +gedge graph_next_edge_in(gedge e); +/* Returns: The ingoing edge after e, or NULL if no more + The order of edges is arbitrary +*/ + +gedge graph_first_edge_out(gnode n); +/* Returns: The first outgoing edge of n, ore NULL if none + The order of edges is arbitrary +*/ + +gedge graph_next_edge_out(gedge e); +/* Returns: The outgoing edge after e, or NULL if no more + The order of edges is arbitrary +*/ + +#define graph_scan_in(edge, n) \ + for (edge = graph_first_edge_in((n)); edge; edge = graph_next_edge_in(edge)) +/* Effects: Iterates variable edge over the ingoing edges of node n + Requires: The node and its ingoing edges not be modified during + the iteration. + Example: + in = 0; + graph_scan_in (e, n) in++; +*/ + +#define graph_scan_out(edge, n) \ + for (edge = graph_first_edge_out((n)); edge; edge = graph_next_edge_out(edge)) +/* Effects: Iterates variable edge over the outgoing edges of node n + Requires: The node and its outgoing edges not be modified during + the iteration. + Example: + out = 0; + graph_scan_out (e, n) out++; +*/ + +gnode graph_edge_from(gedge e); +/* Returns: The node this edge comes from. +*/ + +gnode graph_edge_to(gedge e); +/* Returns: The node this edge goes to. +*/ + +void *_graph_edge_data(gedge n); +#define EDGE_GET(type, n) ((type)_graph_edge_data((n))) +/* Returns: the data of edge n, cast to `type' +*/ + +void _graph_edge_set(gedge n, void *data); +#define EDGE_SET(n, data) (_graph_edge_set((n), (void *)(data))) +/* Effects: Sets the data of edge n to `data'. + Modifies: n +*/ + + +/* Marks */ +/* ----- */ + +void graph_clear_all_marks(ggraph g); +/* Effects: Clears all marks on edges and nodes of g. + Modifies: g +*/ + +void graph_mark_node(gnode n); +/* Effects: Marks node n. + Modifies: n +*/ + +void graph_unmark_node(gnode n); +/* Effects: Removed mark from node n. + Modifies: n +*/ + +bool graph_node_markedp(gnode n); +/* Returns: TRUE if n is marked +*/ + +void graph_mark_edge(gedge n); +/* Effects: Marks edge n. + Modifies: n +*/ + +void graph_unmark_edge(gedge n); +/* Effects: Removed mark from edge n. + Modifies: n +*/ + +bool graph_edge_markedp(gedge n); +/* Returns: TRUE if n is marked +*/ + +#endif diff --git a/src/init.c b/src/init.c new file mode 100644 index 0000000..2bc1871 --- /dev/null +++ b/src/init.c @@ -0,0 +1,1427 @@ +/* XXX: figure out when an init_list is constant (so that we can allow + a cast_list inside an init_list that requires constants) +*/ + +/* Initialiser handling. + This file is part of the nesC compiler. + +This file is derived from the GNU C Compiler. It is thus + Copyright (C) 1987, 1988, 1991, 1992, 1993, 1994, 1995, 1996, 1997, + 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. +Changes for nesC are + Copyright (C) 2002, 2003 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include "parser.h" +#include "c-parse.h" +#include "init.h" +#include "expr.h" +#include "constants.h" +#include "AST_utils.h" +#include "semantics.h" + +static type set_array_length(type t, largest_int length) +{ + return make_array_type(type_array_of(t), + build_uint_constant(parse_region, dummy_location, + size_t_type, length)); +} + +static largest_int string_constant_length(expression e) +{ + return CAST(string, e)->ddecl->schars.length + 1; +} + +/* Make a version of tdecl (an array type) with its length set to the + length of the e (a string constant) */ +static type set_string_length(type tdecl, expression e) +{ + return set_array_length(tdecl, string_constant_length(e)); +} + +field_declaration type_fields(type t) +/* Requires: type_aggregate(t) + Returns: first field_declaration of t +*/ +{ + return type_tag(t)->fieldlist; +} + +field_declaration skip_unnamed_bitfields(field_declaration flist) +/* Returns: return first field which is not an unnamed bit field */ +{ + while (flist && !cval_istop(flist->bitwidth) && !flist->name) + flist = flist->next; + + return flist; +} + + +/* Methods for storing and printing names for error messages. */ + +/* Implement a spelling stack that allows components of a name to be pushed + and popped. Each element on the stack is this structure. */ + +struct spelling +{ + int kind; + union + { + largest_int i; + const char *s; + } u; +}; + +#define SPELLING_STRING 1 +#define SPELLING_MEMBER 2 +#define SPELLING_BOUNDS 3 + +static struct spelling *spelling; /* Next stack element (unused). */ +static struct spelling *spelling_base; /* Spelling stack base. */ +static int spelling_size; /* Size of the spelling stack. */ + +/* Macros to save and restore the spelling stack around push_... functions. + Alternative to SAVE_SPELLING_STACK. */ + +#define SPELLING_DEPTH() (spelling - spelling_base) +#define RESTORE_SPELLING_DEPTH(DEPTH) (spelling = spelling_base + (DEPTH)) + +/* Save and restore the spelling stack around arbitrary C code. */ + +#define SAVE_SPELLING_DEPTH(code) \ +{ \ + int __depth = SPELLING_DEPTH (); \ + code; \ + RESTORE_SPELLING_DEPTH (__depth); \ +} + +/* Push an element on the spelling stack with type KIND and assign VALUE + to MEMBER. */ + +#define PUSH_SPELLING(KIND, VALUE, MEMBER) \ +{ \ + int depth = SPELLING_DEPTH (); \ + \ + if (depth >= spelling_size) \ + { \ + spelling_size += 10; \ + if (spelling_base == 0) \ + spelling_base \ + = (struct spelling *) xmalloc (spelling_size * sizeof (struct spelling)); \ + else \ + spelling_base \ + = (struct spelling *) xrealloc (spelling_base, \ + spelling_size * sizeof (struct spelling)); \ + RESTORE_SPELLING_DEPTH (depth); \ + } \ + \ + spelling->kind = (KIND); \ + spelling->MEMBER = (VALUE); \ + spelling++; \ +} + +/* Push STRING on the stack. Printed literally. */ + +static void push_string(const char *string) +{ + PUSH_SPELLING (SPELLING_STRING, string, u.s); +} + +/* Push a member name on the stack. Printed as '.' STRING. */ +static void push_member_name(field_declaration fdecl) +{ + const char *const string = nice_field_name(fdecl->name); + PUSH_SPELLING (SPELLING_MEMBER, string, u.s); +} + +/* Push an array bounds on the stack. Printed as [BOUNDS]. */ + +static void push_array_bounds (largest_int bounds) +{ + PUSH_SPELLING (SPELLING_BOUNDS, bounds, u.i); +} + +/* Compute the maximum size in bytes of the printed spelling. */ + +static int spelling_length(void) +{ + int size = 0; + struct spelling *p; + + for (p = spelling_base; p < spelling; p++) + { + if (p->kind == SPELLING_BOUNDS) + size += 25; + else + size += strlen (p->u.s) + 1; + } + + return size; +} + +/* Print the spelling to BUFFER and return it. */ + +static char * +print_spelling (buffer) + char *buffer; +{ + char *d = buffer; + struct spelling *p; + + for (p = spelling_base; p < spelling; p++) + if (p->kind == SPELLING_BOUNDS) + { + sprintf (d, "[%ld]", (long)p->u.i); + d += strlen (d); + } + else + { + const char *s; + if (p->kind == SPELLING_MEMBER) + *d++ = '.'; + for (s = p->u.s; (*d = *s++); d++) + ; + } + *d++ = '\0'; + return buffer; +} + +static void save_expression_spelling(expression e) +{ + if (spelling_base) + e->spelling = print_spelling(rstralloc(regionof(e), spelling_length() + 1)); +} + +/* Issue an error message for a bad initializer component. + MSGID identifies the message. + The component name is taken from the spelling stack. */ + +void error_init (const char *msgid) +{ + char *ofwhat; + + error ("%s", msgid); + ofwhat = print_spelling ((char *) alloca (spelling_length () + 1)); + if (*ofwhat) + error ("(near initialization for `%s')", ofwhat); +} + +void error_init_expr(expression e, const char *msgid) +{ + const char *ofwhat; + + error_with_location(e->location, "%s", msgid); + if (e->spelling) + ofwhat = e->spelling; + else + ofwhat = print_spelling ((char *) alloca (spelling_length () + 1)); + if (*ofwhat) + error_with_location(e->location, "(near initialization for `%s')", ofwhat); +} + +/* Issue a pedantic warning for a bad initializer component. + MSGID identifies the message. + The component name is taken from the spelling stack. */ + +void pedwarn_init (const char *msgid) +{ + char *ofwhat; + + pedwarn ("%s", msgid); + ofwhat = print_spelling ((char *) alloca (spelling_length () + 1)); + if (*ofwhat) + pedwarn ("(near initialization for `%s')", ofwhat); +} + +/* Issue a warning for a bad initializer component. + MSGID identifies the message. + The component name is taken from the spelling stack. */ + +static void warning_init (const char *msgid) +{ + char *ofwhat; + + warning ("%s", msgid); + ofwhat = print_spelling ((char *) alloca (spelling_length () + 1)); + if (*ofwhat) + warning ("(near initialization for `%s')", ofwhat); +} + +/* Digest the parser output INIT as an initializer for type TYPE. + Return FALSE if the initialisation is erroneous +*/ +static bool digest_init(type t, expression init) +{ + type itype = init->type; + + if (t == error_type || itype == error_type) + return FALSE; + + /* Initialization of an array of chars from a string constant + optionally enclosed in braces. */ + + if (type_array(t)) + { + type typ1 = type_array_of(t); + + if ((type_char(typ1) || type_equal_unqualified(typ1, wchar_type)) + && is_string(init)) + { + type init_chartype = type_array_of(itype); + cval tcsize; + + if (type_compatible_unqualified(t, itype)) + return TRUE; + + if (!type_char(init_chartype) && type_char(typ1)) + { + error_init ("char-array initialized from wide string"); + return FALSE; + } + if (type_char(init_chartype) && !type_char(typ1)) + { + error_init ("int-array initialized from non-wide string"); + return FALSE; + } + + tcsize = type_array_size_cval(t); + if (!cval_istop(tcsize)) + { + largest_uint tsize = cval_uint_value(tcsize); + data_declaration sdecl = CAST(string, init)->ddecl; + + /* Don't count the null char (char x[1] = "a" is ok) */ + if (tsize && tsize < sdecl->schars.length / type_size_int(type_array_of(sdecl->type))) + pedwarn_init ("initializer-string for array of chars is too long"); + } + + return TRUE; + } + } + + /* Any type can be initialized + from an expression of the same type, optionally with braces. + Initialisations of pointers from arrays and functions allow the + usual default conversions */ + + if (type_compatible_unqualified(itype, t) || + type_compatible(t, type_default_conversion_for_assignment(itype))) + { + if (type_pointer(t)) + itype = default_conversion_for_assignment(init); + +#if 0 + if (require_constant /*&& !flag_isoc99*/ && is_cast_list(init)) + { + /* As an extension, allow initializing objects with static storage + duration with compound literals (which are then treated just as + the brace enclosed list they contain). */ + init = CAST(cast_list, init)->init_expr; + itype = init->type; + } +#endif + + if (type_array(t) && !(is_string(init) || is_init_list(init))) + { + error_init ("array initialized from non-constant array expression"); + return FALSE; + } + + /* Note: gcc allows "static int a = (1,2)" if -pedantic is + specified even though it doesn't allow case (1,2) when + -pedantic is specified. For the sake of consistency, + I'm not allowing either when -pedantic is specified. */ + + return TRUE; + } + + /* Handle scalar types, including conversions. */ + + if (type_scalar(t)) + return check_assignment(t, default_conversion_for_assignment(init), init, "initialization", NULL, 0); + + /* Come here only for records and arrays. */ + + /* Traditionally, you can write struct foo x = 0; + and it initializes the first element of x to 0. */ + if (flag_traditional) + { + bool changed = FALSE; + + while (type_array(t) || type_aggregate(t)) + { + changed = TRUE; + if (type_array(t)) + t = type_array_of(t); + else + { + tag_declaration tdecl = type_tag(t); + + if (tdecl->fieldlist) + t = tdecl->fieldlist->type; + else + { + error_init ("invalid initializer"); + return FALSE; + } + } + } + + if (changed) + return digest_init(t, init); + } + error_init("invalid initializer"); + return FALSE; +} + +/* Handle initializers that use braces. */ + +typedef enum { c_none, c_aggregate, c_array, c_scalar } c_kind; + +/* The kind of object we're constructing at this level of the + initialiser */ +static c_kind constructor_kind; + +/* Type of object we are accumulating a constructor for. + This type is always a type_struct, type_union or type_array */ +static type constructor_type; + +/* For a RECORD_TYPE or UNION_TYPE, this is the chain of fields + left to fill. */ +static field_declaration constructor_fields; + +/* For an ARRAY_TYPE, this is the specified index + at which to store the next element we get. */ +static largest_int constructor_index; + +/* Largest array index seen+1 (used to determine size of int x[] = { ... } */ +static largest_int constructor_array_size; + +/* For an ARRAY_TYPE, this is the maximum index. */ +static largest_int constructor_max_index; + +/* The count of elements specified at this depth */ +static size_t constructor_count; + +/* The SPELLING_DEPTH of this constructor. */ +static int constructor_depth; + +/* The value currently being initialised */ +ivalue constructor_value; + +static int require_constant_value; + +/* DECL node for which an initializer is being read. + 0 means we are reading a constructor expression + such as (struct foo) {...}. */ +static data_declaration constructor_decl; + +/* Nonzero if there were any member designators in this initializer. */ +static int constructor_designated; + +/* Nesting depth of designator list. */ +static int designator_depth; + +/* Nonzero if there were diagnosed errors in this designator list. */ +static int designator_erroneous; + +/* Nonzero if we've already printed a "missing braces around initializer" + message within this initializer. */ +static int missing_braces_mentioned; + + +/* This stack has a level for each implicit or explicit level of + structuring in the initializer, including the outermost one. It + saves the values of most of the variables above. */ + +struct constructor_range_stack; + +struct constructor_stack +{ + struct constructor_stack *next; + c_kind kind; + type type; + field_declaration fields; + largest_int index; + largest_int array_size; + largest_int max_index; + ivalue value; + size_t count; + int offset; + int depth; + struct constructor_range_stack *range_stack; + char constant; + char simple; + char implicit; + char erroneous; + char outer; + char incremental; + char designated; +}; + +struct constructor_stack *constructor_stack; + +/* This stack represents designators from some range designator up to + the last designator in the list. */ + +struct constructor_range_stack +{ + struct constructor_range_stack *next, *prev; + struct constructor_stack *stack; + largest_int range_start; + largest_int index; + largest_int range_end; + bool has_end; + field_declaration fields; +}; + +struct constructor_range_stack *constructor_range_stack; + +/* This stack records separate initializers that are nested. + Nested initializers can't happen in ANSI C, but GNU C allows them + in cases like { ... (struct foo) { ... } ... }. */ + +struct initializer_stack +{ + struct initializer_stack *next; + data_declaration decl; + struct constructor_stack *constructor_stack; + struct constructor_range_stack *constructor_range_stack; + struct spelling *spelling; + struct spelling *spelling_base; + int spelling_size; + char require_constant_value; +}; + +struct initializer_stack *initializer_stack; + +static type pop_init_level(void); + +static void pop_implicit_level(void) +{ + assert(constructor_stack->implicit); + pop_init_level(); + process_init_element(NULL); +} + +static void pop_all_implicit_levels(void) +{ + while (constructor_stack->implicit) + pop_implicit_level(); +} + +static void pop_exhausted_levels(void) +{ + /* If we've exhausted any levels that didn't have braces, + pop them now. */ + while (constructor_stack->implicit && + ((constructor_kind == c_aggregate && constructor_fields == 0) || + (constructor_kind == c_array && constructor_max_index < constructor_index))) + pop_implicit_level(); +} + +/* Prepare to parse and output the initializer for variable DECL. */ + +void start_init(declaration decl, nesc_attribute attr) +/* decl is really a variable_decl */ +{ + const char *locus; + struct initializer_stack *p + = (struct initializer_stack *) xmalloc (sizeof (struct initializer_stack)); + + p->decl = constructor_decl; + p->require_constant_value = require_constant_value; + p->constructor_stack = constructor_stack; + p->constructor_range_stack = constructor_range_stack; + p->spelling = spelling; + p->spelling_base = spelling_base; + p->spelling_size = spelling_size; + p->next = initializer_stack; + initializer_stack = p; + + constructor_designated = 0; + + if (decl != 0) + { + data_declaration ddecl = CAST(variable_decl, decl)->ddecl; + + constructor_decl = ddecl; + require_constant_value = ddecl->needsmemory; + locus = ddecl->name; + } + else if (attr) + { + cstring aname = attr->word1->cstring; + + constructor_decl = NULL; + require_constant_value = !(attr->tdecl && attr->tdecl->deputy_scope); + locus = rstralloc(current.fileregion, aname.length + 2); + sprintf((char *)locus, "@%s", aname.data); + } + else + { + constructor_decl = NULL; + require_constant_value = 0; + locus = "(anonymous)"; + } + + constructor_stack = 0; + constructor_range_stack = 0; + + missing_braces_mentioned = 0; + + spelling_base = 0; + spelling_size = 0; + RESTORE_SPELLING_DEPTH (0); + + if (locus) + push_string(locus); +} + +void finish_init(void) +{ + struct initializer_stack *p = initializer_stack; + + /* Free the whole constructor stack of this initializer. */ + while (constructor_stack) + { + struct constructor_stack *q = constructor_stack; + constructor_stack = q->next; + free (q); + } + + if (constructor_range_stack) + abort (); + + /* Pop back to the data of the outer initializer (if any). */ + constructor_decl = p->decl; + require_constant_value = p->require_constant_value; + constructor_stack = p->constructor_stack; + constructor_range_stack = p->constructor_range_stack; + spelling = p->spelling; + spelling_base = p->spelling_base; + spelling_size = p->spelling_size; + initializer_stack = p->next; + free (p); +} + +/* ivalue constructors */ +ivalue new_ivalue(region r, int kind, type t) +{ + ivalue newp = ralloc(r, struct ivalue); + + newp->kind = kind; + newp->type = t; + + if (newp->kind == iv_base) + newp->u.base.value = cval_top; + + return newp; +} + +static void add_ivalue_array(ivalue to, largest_int index, ivalue element) +{ + largest_int end = index; + struct ivalue_array *newp; + + assert(to->kind == iv_array); + + /* Detect when pushing a range initialiser */ + if (constructor_range_stack && constructor_range_stack->has_end) + end = constructor_range_stack->range_end; + + newp = ralloc(parse_region, struct ivalue_array); + newp->next = to->u.array; + to->u.array = newp; + newp->from = index; + newp->to = end; + newp->value = element; +} + +static void add_ivalue_field(ivalue to, field_declaration field, ivalue element) +{ + struct ivalue_field *newp; + + assert(to->kind == iv_structured); + + newp = ralloc(parse_region, struct ivalue_field); + newp->next = to->u.structured; + to->u.structured = newp; + newp->field = field; + newp->value = element; +} + +static struct constructor_stack *push_constructor_stack(int implicit) +{ + struct constructor_stack *p + = (struct constructor_stack *) xmalloc (sizeof (struct constructor_stack)); + + p->kind = constructor_kind; + p->type = constructor_type; + p->fields = constructor_fields; + p->index = constructor_index; + p->array_size = constructor_array_size; + p->max_index = constructor_max_index; + p->value = constructor_value; + p->count = constructor_count; + p->depth = constructor_depth; + p->implicit = implicit; + p->range_stack = 0; + p->outer = 0; + p->designated = constructor_designated; + p->next = constructor_stack; + constructor_stack = p; + + constructor_depth = SPELLING_DEPTH (); + constructor_designated = 0; + constructor_count = 0; + + if (!implicit) + { + p->range_stack = constructor_range_stack; + constructor_range_stack = 0; + designator_depth = 0; + designator_erroneous = 0; + } + + return p; +} + +static bool new_constructor_type(void); + +/* Call here when we see the initializer is surrounded by braces. + This is instead of a call to push_init_level; + it is matched by a call to pop_init_level. + + TYPE is the type to initialize, for a constructor expression. + For an initializer for a decl, TYPE is zero. */ + +void really_start_incremental_init(type t) +{ + if (t == 0) + t = constructor_decl->type; + + assert(constructor_stack == 0); + push_constructor_stack(0); + + constructor_type = t; + new_constructor_type(); +} + +/* Push down into a subobject, for initialization. + If this is for an explicit set of braces, IMPLICIT is 0. + If it is because the next element belongs at a lower level, + IMPLICIT is 1 (or 2 if the push is because of designator list). */ + +void push_init_level(int implicit) +{ + struct constructor_stack *p; + + pop_exhausted_levels(); + + p = push_constructor_stack(implicit); + + /* Don't die if an entire brace-pair level is superfluous + in the containing level. */ + if (constructor_type == 0) + ; + else if (constructor_kind == c_aggregate) + { + /* Don't die if there are extra init elts at the end. */ + if (constructor_fields == 0) + constructor_type = 0; + else + { + constructor_type = constructor_fields->type; + push_member_name(constructor_fields); + constructor_depth++; + } + } + else if (constructor_kind == c_array) + { + constructor_type = type_array_of(constructor_type); + push_array_bounds(constructor_index); + constructor_depth++; + } + + if (constructor_type == 0) + { + error_init("extra brace group at end of initializer"); + } + else if (implicit == 1 && warn_missing_braces && !missing_braces_mentioned) + { + missing_braces_mentioned = 1; + warning_init ("missing braces around initializer"); + } + + if (!new_constructor_type()) + warning_init ("braces around scalar initializer"); + + switch (p->kind) + { + case c_aggregate: + add_ivalue_field(p->value, p->fields, constructor_value); + break; + case c_array: + add_ivalue_array(p->value, p->index, constructor_value); + break; + case c_scalar: + break; + default: assert(0); break; + } +} + +/* Set state for new constructor type (constructor_kind and associated state) + Return FALSE if the constructor_type is a scalar type */ +static bool new_constructor_type(void) +{ + if (!constructor_type) + { + constructor_kind = c_none; + constructor_value = NULL; + } + else if (type_aggregate(constructor_type)) + { + constructor_kind = c_aggregate; + constructor_fields = skip_unnamed_bitfields(type_fields(constructor_type)); + constructor_value = new_ivalue(parse_region, iv_structured, constructor_type); + } + else if (type_array(constructor_type)) + { + cval max = type_array_size_cval(constructor_type); + + constructor_kind = c_array; + if (cval_istop(max)) + constructor_max_index = -1; + else + constructor_max_index = cval_sint_value(max) - 1; + constructor_index = constructor_array_size = 0; + constructor_value = new_ivalue(parse_region, iv_array, constructor_type); + } + else + { + /* Handle the case of int x = {5}; */ + constructor_kind = c_scalar; + constructor_index = 0; + constructor_value = new_ivalue(parse_region, iv_base, constructor_type); + + return FALSE; + } + return TRUE; +} + +/* At the end of an implicit or explicit brace level, + finish up that level of constructor. + Return the type that this level was for */ + +static type pop_init_level(void) +{ + struct constructor_stack *p; + type ctype; + + ctype = constructor_type ? constructor_type : error_type; + + p = constructor_stack; + + /* Error for initializing a flexible array member, or a zero-length + array member in an inappropriate context. */ + if (constructor_type && constructor_fields && constructor_depth + && type_array(constructor_type) + && !type_array_size(constructor_type)) + { + /* Silently discard empty initializations. The parser will + already have pedwarned for empty brackets. */ + if (constructor_count > 0) + { + if (constructor_depth > 2) + error_init("initialization of flexible array member in a nested context"); + else if (pedantic) + pedwarn_init("initialization of a flexible array member"); + + /* We have already issued an error message for the existence + of a flexible array member not at the end of the structure. + Discard the initializer so that we do not abort later. */ + if (constructor_fields->next) + constructor_type = NULL; + } + } + +#if 0 + /* Warn when some struct elements are implicitly initialized to zero. */ + if (extra_warnings + && constructor_type + && TREE_CODE (constructor_type) == RECORD_TYPE + && constructor_unfilled_fields) + { + /* Do not warn for flexible array members or zero-length arrays. */ + while (constructor_unfilled_fields + && (! DECL_SIZE (constructor_unfilled_fields) + || integer_zerop (DECL_SIZE (constructor_unfilled_fields)))) + constructor_unfilled_fields = TREE_CHAIN (constructor_unfilled_fields); + + /* Do not warn if this level of the initializer uses member + designators; it is likely to be deliberate. */ + if (constructor_unfilled_fields && !constructor_designated) + { + push_member_name (constructor_unfilled_fields); + warning_init ("missing initializer"); + RESTORE_SPELLING_DEPTH (constructor_depth); + } + } +#endif + + if (constructor_kind == c_scalar && constructor_count == 0) + error_init("empty scalar initializer"); + + constructor_kind = p->kind; + constructor_type = p->type; + constructor_fields = p->fields; + constructor_index = p->index; + constructor_array_size = p->array_size; + constructor_max_index = p->max_index; + constructor_value = p->value; + constructor_count = p->count; + constructor_designated = p->designated; + constructor_depth = p->depth; + if (!p->implicit) + constructor_range_stack = p->range_stack; + RESTORE_SPELLING_DEPTH (constructor_depth); + + constructor_stack = p->next; + free (p); + + return ctype; +} + +/* Common handling for both array range and field name designators. + ARRAY argument is non-zero for array ranges. Returns zero for success. */ + +static bool set_designator(bool array) +{ + type subtype; + + /* Don't die if an entire brace-pair level is superfluous + in the containing level. */ + if (constructor_kind == c_none) + return TRUE; + + /* If there were errors in this designator list already, bail out silently. */ + if (designator_erroneous) + return TRUE; + + if (!designator_depth) + { + if (constructor_range_stack) + abort (); + + /* Designator list starts at the level of closest explicit + braces. */ + pop_all_implicit_levels(); + constructor_designated = 1; + return FALSE; + } + + if (constructor_kind == c_aggregate) + { + subtype = constructor_fields->type; + } + else if (constructor_kind == c_array) + { + subtype = type_array_of(constructor_type); + } + else + abort(); + + if (array && !type_array(subtype)) + { + error_init ("array index in non-array initializer"); + return TRUE; + } + else if (!array && !type_aggregate(subtype)) + { + error_init ("field name not in record or union initializer"); + return TRUE; + } + + constructor_designated = 1; + push_init_level(2); + return FALSE; +} + +/* If there are range designators in designator list, push a new designator + to constructor_range_stack. RANGE_END is end of such stack range or + NULL if there is no range designator at this level. */ + +static void push_range_stack(expression range_end) +{ + struct constructor_range_stack *p; + + p = (struct constructor_range_stack *) + xmalloc(sizeof (struct constructor_range_stack)); + p->prev = constructor_range_stack; + p->next = 0; + p->fields = constructor_fields; + p->range_start = constructor_index; + p->index = constructor_index; + p->stack = constructor_stack; + if (range_end) + { + p->range_end = constant_sint_value(range_end->cst); + p->has_end = TRUE; + } + else + p->has_end = FALSE; + if (constructor_range_stack) + constructor_range_stack->next = p; + constructor_range_stack = p; +} + +/* Within an array initializer, specify the next index to be initialized. + FIRST is that index. If LAST is nonzero, then initialize a range + of indices, running from FIRST through LAST. */ + +designator set_init_index(location loc, expression first, expression last) +{ + designator d = CAST(designator, + new_designate_index(parse_region, loc, first, last)); + + if (set_designator(TRUE)) + return d; + + designator_erroneous = 1; + + if (!(first->cst && constant_integral(first->cst))) + error_init("nonconstant array index in initializer"); + else if (last != 0 && !(last->cst && constant_integral(last->cst))) + error_init("nonconstant array index in initializer"); + else if (constructor_kind != c_array) + error_init("array index in non-array initializer"); + else if (constructor_max_index >= 0 + && constructor_max_index < constant_sint_value(first->cst)) + error_init("array index in initializer exceeds array bounds"); + else + { + largest_int fval = constant_sint_value(first->cst); + + constructor_index = fval; + + if (last) + { + largest_int lval = constant_sint_value(last->cst); + + if (fval == lval) + last = 0; + else if (lval < fval) + { + error_init("empty index range in initializer"); + last = 0; + } + else + { + if (constructor_max_index >= 0 && constructor_max_index < lval) + { + error_init("array index range in initializer exceeds array bounds"); + last = 0; + } + } + } + + designator_depth++; + designator_erroneous = 0; + if (constructor_range_stack || last) + push_range_stack(last); + } + + return d; +} + +/* Within a struct initializer, specify the next field to be initialized. */ + +designator set_init_label(location loc, cstring fieldname) +{ + designator d = CAST(designator, + new_designate_field(parse_region, loc, fieldname)); + field_declaration tail; + tag_declaration tdecl; + + if (set_designator(FALSE)) + return d; + + designator_erroneous = 1; + + if (constructor_kind != c_aggregate) + { + error_init("field name not in record or union initializer"); + return d; + } + + tdecl = type_tag(constructor_type); + tail = env_lookup(tdecl->fields, fieldname.data, TRUE); + if (tail == 0) + error("unknown field `%s' specified in initializer", fieldname.data); + else + { + constructor_fields = tail; + designator_depth++; + designator_erroneous = 0; + if (constructor_range_stack) + push_range_stack(NULL); + } + + return d; +} + +void check_init_element(expression init) +{ + known_cst c; + + if (!check_constant_once(init, cst_any)) + return; + + /* XXX: process_init_element set the ivalue to iv_base for strings used + to initialise arrays. So we need to special case here too. We don't + need to do anything, as this only happened for string constants, which + are clearly constant ;-) + + See string_flag test in that function. */ + if (is_init_list(init)) + return; + + /* Arrays are "constant" if they have a static address + (see default_conversion on arrays) - this essentially handles the + case of string constants */ + c = type_array(init->type) ? init->static_address : init->cst; + + if (!c) + { + error_init_expr(init, "initializer element is not constant"); + return; + } +#if 0 + /* This is no longer detected as constant_unknown has been recycled + for use with abstract component arguments. It could be resurrected + if we made cval more complicated, but it doesn't seem worth the + effort. */ + else if (constant_uncomputable(c)) + { + error_init_expr(init, "initializer element is not computable at load time"); + return; + } +#endif + else + { + constant_overflow_warning(c); + if (init->ivalue) + { + assert(init->ivalue->kind == iv_base); + init->ivalue->u.base.value = cval_cast(c->cval, init->ivalue->type); + } + } +} + +/* "Output" the next constructor element. + At top level, really output it to assembler code now. + Otherwise, collect it in a list from which we will make a CONSTRUCTOR. + TYPE is the data type that the containing data type wants here. + FIELD is the field (a FIELD_DECL) or the index that this element fills. + + PENDING if non-nil means output pending elements that belong + right after this element. (PENDING is normally 1; + it is 0 while outputting pending elements, to avoid recursion.) */ + +static void output_init_element(expression init, type t) +{ + assert(init->ivalue->kind == iv_base); + init->ivalue->u.base.expr = init; + init->ivalue->u.base.require_constant_value = require_constant_value; + + if (digest_init(t, init) && require_constant_value) + { + check_init_element(init); + /* If we haven't checked it yet then we'll need the spelling later + (see nesc-constants.c) */ + if (!init->cst_checked) + save_expression_spelling(init); + } +} + + +/* Add one non-braced element to the current constructor level. + This adjusts the current position within the constructor's type. + This may also start or terminate implicit levels + to handle a partly-braced initializer. + + Once this has found the correct level for the new element, + it calls output_init_element. + + If VALUE is NULL, just advance to the next element without + any error messages +*/ + +void process_init_element(expression value) +{ + bool string_flag = value && is_string(value); + + designator_depth = 0; + designator_erroneous = 0; + + /* Handle superfluous braces around string cst as in + char x[] = {"foo"}; */ + if (string_flag + && constructor_kind == c_array + && type_integer(type_array_of(constructor_type)) + && constructor_count == 0) + { + constructor_kind = c_scalar; + constructor_index = 0; + if (!type_array_size(constructor_type)) + constructor_type = constructor_value->type = + set_string_length(constructor_type, value); + /* XXX: maybe this should stay as a iv_array, and the string should + be broken down into characters? */ + constructor_value->kind = iv_base; + constructor_value->u.base.expr = NULL; + constructor_value->u.base.value = cval_top; + } + + /* Ignore elements of a brace group if it is entirely superfluous + and has already been diagnosed. */ + if (constructor_kind == c_none) + return; + + /* If we've exhausted any levels that didn't have braces, + pop them now. */ + pop_exhausted_levels(); + + tryagain: + if (value) + { + type elttype = error_type; + + switch (constructor_kind) + { + case c_aggregate: + if (constructor_fields == 0) + { + pedwarn_init("excess elements in struct or union initializer"); + break; + } + elttype = constructor_fields->type; + + /* Error for non-static initialization of a flexible array member. */ + if (type_array(elttype) + && !require_constant_value + && (type_array_size(elttype) && definite_zero(type_array_size(elttype))) + && !constructor_fields->next) + { + error_init("non-static initialization of a flexible array member"); + break; + } + push_member_name (constructor_fields); + + break; + case c_array: + if (constructor_max_index >= 0 + && constructor_max_index < constructor_index) + { + pedwarn_init("excess elements in array initializer"); + break; + } + + elttype = type_array_of(constructor_type); + push_array_bounds(constructor_index); + if (type_array(elttype) && !type_array_size(elttype)) + { + elttype = error_type; + error_init("array type has incomplete element type"); + } + break; + case c_scalar: + if (constructor_count == 0) + elttype = constructor_type; + else if (constructor_count == 1) /* Only warn once */ + pedwarn_init("excess elements in scalar initializer"); + break; + default: assert(0); break; + } + + /* Accept a string constant to initialize a subarray. */ + if (type_array(elttype) && type_integer(type_array_of(elttype)) + && string_flag) + ; + /* Otherwise, if we have come to a subaggregate, + and we don't have an element of its type, push into it. */ + else if ((constructor_kind == c_array || constructor_kind == c_aggregate) && + value->type != error_type + && !type_equal_unqualified(value->type, elttype) + && (type_aggregate(elttype) || type_array(elttype))) + { + push_init_level(1); + goto tryagain; + } + + /* This is here rather than in the previous switch because of + the tryagain ("walk-into-array-or-aggregate") case */ + if (elttype != error_type) + { + ivalue valueholder = NULL; + + switch (constructor_kind) + { + case c_aggregate: + valueholder = new_ivalue(parse_region, iv_base, elttype); + add_ivalue_field(constructor_value, constructor_fields, valueholder); + break; + case c_array: + valueholder = new_ivalue(parse_region, iv_base, elttype); + add_ivalue_array(constructor_value, constructor_index, valueholder); + break; + case c_scalar: + valueholder = constructor_value; + break; + default: assert(0); break; + } + value->ivalue = valueholder; + } + else + value->ivalue = new_ivalue(parse_region, iv_base, error_type); + + output_init_element (value, elttype); + } + + constructor_count++; + + switch (constructor_kind) + { + case c_aggregate: + if (value) + RESTORE_SPELLING_DEPTH (constructor_depth); + + if (!type_union(constructor_type)) + { + if (constructor_fields) + constructor_fields = skip_unnamed_bitfields(constructor_fields->next); + } + else + { + /* Warn that traditional C rejects initialization of unions. + We skip the warning if the value is zero. This is done + under the assumption that the zero initializer in user + code appears conditioned on e.g. __STDC__ to avoid + "missing initializer" warnings and relies on default + initialization to zero in the traditional C case. + We also skip the warning if the initializer is designated, + again on the assumption that this must be conditional on + __STDC__ anyway (and we've already complained about the + member-designator already). */ + if (value && warn_traditional && + !value->location->in_system_header && + !constructor_designated && !definite_zero(value)) + warning("traditional C rejects initialization of unions"); + + constructor_fields = 0; + } + break; + case c_array: + if (value) + RESTORE_SPELLING_DEPTH (constructor_depth); + constructor_index++; + if (constructor_index > constructor_array_size) + constructor_array_size = constructor_index; + break; + case c_scalar: /* the weird {"foo"} case above */ + break; + default: assert(0); break; + } + + /* Pop back to the level before the designator */ + if (constructor_range_stack) + { + struct constructor_range_stack *p, *range_stack; + + range_stack = constructor_range_stack; + constructor_range_stack = 0; + + /* First pop back to the level at which the designator ended */ + while (constructor_stack != range_stack->stack) + pop_implicit_level(); + + /* Then pop back up all the designators (note that the topmost one + does not have an implicit level) */ + for (p = range_stack; p->prev; p = p->prev) + pop_implicit_level(); + } + + // XXX: mem dealloc for range stack + constructor_range_stack = 0; +} + +expression make_init_specific(designator dlist, expression initval) +{ + return CAST(expression, + new_init_specific(parse_region, dlist->location, dlist, initval)); +} + +expression make_init_list(location loc, expression elist) +{ + expression ilist; + type itype; + largest_int array_size; + + /* Explicit close brace: + pop any inner levels that didn't have explicit braces. */ + pop_all_implicit_levels(); + /* Save array size (if any) */ + array_size = constructor_array_size; + + assert(!constructor_range_stack); + + ilist = CAST(expression, new_init_list(parse_region, loc, elist)); + ilist->ivalue = constructor_value; + itype = pop_init_level(); + + /* Complete array types based on the initialiser */ + if (type_array(itype) && !type_array_size(itype)) + itype = set_array_length(itype, array_size); + ilist->type = itype; + + return ilist; +} + +expression make_cast_list(location loc, asttype t, expression init) +{ + cast_list result; + + result = new_cast_list(parse_region, loc, t, init); + result->type = t->type; + /* gcc 2.x only considers this an lvalue if it's defined from constant + expressions. But 3.x always considers it an lvalue... */ + result->lvalue = TRUE; + + return CAST(expression, result); +} + +/* Code to handle simple initialisers like 'int x = '. + The variable being initialised is constructor_decl */ +void simple_init(expression expr) +{ + type tdecl = constructor_decl->type; + + if (is_string(expr) && type_array(tdecl) && !type_array_size(tdecl)) + tdecl = set_string_length(tdecl, expr); + expr->ivalue = new_ivalue(parse_region, iv_base, tdecl); + output_init_element(expr, tdecl); +} diff --git a/src/init.h b/src/init.h new file mode 100644 index 0000000..5e0ff2f --- /dev/null +++ b/src/init.h @@ -0,0 +1,76 @@ +/* Initialiser handling. + This file is part of the nesC compiler. + +This file is derived from the GNU C Compiler. It is thus + Copyright (C) 1987, 1988, 1991, 1992, 1993, 1994, 1995, 1996, 1997, + 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. +Changes for nesC are + Copyright (C) 2002, 2003 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef INIT_H +#define INIT_H + +/* Types representing a parsed initialiser. Unspecified fields and + array elements were unspecified in the initialiser. */ +struct ivalue { + enum { iv_base, iv_array, iv_structured } kind; + + type type; + + ivalue instantiation; + + union { + struct { /* for iv_base */ + expression expr; /* not an init_list */ + bool require_constant_value; + cval value; /* value if constant, cval_top otherwise */ + } base; + struct ivalue_array *array; /* for iv_array */ + struct ivalue_field *structured; /* for iv_structured */ + } u; +}; + +typedef struct ivalue_array { + struct ivalue_array *next; + largest_int from, to; + ivalue value; +} *ivalue_array; + +typedef struct ivalue_field { + struct ivalue_field *next; + field_declaration field; + ivalue value; +} *ivalue_field; + +ivalue new_ivalue(region r, int kind, type t); + +void start_init(declaration decl, nesc_attribute attr); +void finish_init(void); +void simple_init(expression expr); +void really_start_incremental_init(type t); +void push_init_level(int implicit); +designator set_init_index(location loc, expression first, expression last); +designator set_init_label(location loc, cstring fieldname); +void process_init_element(expression value); + +expression make_init_specific(designator dlist, expression initval); +expression make_init_list(location loc, expression elist); +expression make_cast_list(location loc, asttype t, expression init); + +void check_init_element(expression init); + +#endif diff --git a/src/lex.nd.c b/src/lex.nd.c new file mode 100644 index 0000000..acc12eb --- /dev/null +++ b/src/lex.nd.c @@ -0,0 +1,1655 @@ +#define yy_create_buffer nd_create_buffer +#define yy_delete_buffer nd_delete_buffer +#define yy_scan_buffer nd_scan_buffer +#define yy_scan_string nd_scan_string +#define yy_scan_bytes nd_scan_bytes +#define yy_flex_debug nd_flex_debug +#define yy_init_buffer nd_init_buffer +#define yy_flush_buffer nd_flush_buffer +#define yy_load_buffer_state nd_load_buffer_state +#define yy_switch_to_buffer nd_switch_to_buffer +#define yyin ndin +#define yyleng ndleng +#define yylex ndlex +#define yyout ndout +#define yyrestart ndrestart +#define yytext ndtext +#define yywrap ndwrap + +/* A lexical scanner generated by flex */ + +/* Scanner skeleton version: + * $Header: /cvs/root/flex/flex/skel.c,v 1.2 2004/05/07 00:28:17 jkh Exp $ + */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 5 + +#include + + +/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ +#ifdef c_plusplus +#ifndef __cplusplus +#define __cplusplus +#endif +#endif + + +#ifdef __cplusplus + +#include +#include + +/* Use prototypes in function declarations. */ +#define YY_USE_PROTOS + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +#if __STDC__ + +#define YY_USE_PROTOS +#define YY_USE_CONST + +#endif /* __STDC__ */ +#endif /* ! __cplusplus */ + +#ifdef __TURBOC__ + #pragma warn -rch + #pragma warn -use +#include +#include +#define YY_USE_CONST +#define YY_USE_PROTOS +#endif + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#endif + + +#ifdef YY_USE_PROTOS +#define YY_PROTO(proto) proto +#else +#define YY_PROTO(proto) () +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN yy_start = 1 + 2 * + +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START ((yy_start - 1) / 2) +#define YYSTATE YY_START + +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE yyrestart( yyin ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#define YY_BUF_SIZE 16384 + +typedef struct yy_buffer_state *YY_BUFFER_STATE; + +extern int yyleng; +extern FILE *yyin, *yyout; + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + +/* The funky do-while in the following #define is used to turn the definition + * int a single C statement (which needs a semi-colon terminator). This + * avoids problems with code like: + * + * if ( condition_holds ) + * yyless( 5 ); + * else + * do_something_else(); + * + * Prior to using the do-while the compiler would get upset at the + * "else" because it interpreted the "if" statement as being all + * done when it reached the ';' after the yyless() call. + */ + +/* Return all but the first 'n' matched characters back to the input stream. */ + +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + *yy_cp = yy_hold_char; \ + YY_RESTORE_YY_MORE_OFFSET \ + yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ + } \ + while ( 0 ) + +#define unput(c) yyunput( c, yytext_ptr ) + +/* The following is because we cannot portably get our hands on size_t + * (without autoconf's help, which isn't available because we want + * flex-generated scanners to compile on their own). + */ +typedef unsigned int yy_size_t; + + +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + yy_size_t yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via yyrestart()), so that the user can continue scanning by + * just pointing yyin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + }; + +static YY_BUFFER_STATE yy_current_buffer = 0; + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + */ +#define YY_CURRENT_BUFFER yy_current_buffer + + +/* yy_hold_char holds the character lost when yytext is formed. */ +static char yy_hold_char; + +static int yy_n_chars; /* number of characters read into yy_ch_buf */ + + +int yyleng; + +/* Points to current character in buffer. */ +static char *yy_c_buf_p = (char *) 0; +static int yy_init = 1; /* whether we need to initialize */ +static int yy_start = 0; /* start state number */ + +/* Flag which is used to allow yywrap()'s to do buffer switches + * instead of setting up a fresh yyin. A bit of a hack ... + */ +static int yy_did_buffer_switch_on_eof; + +void yyrestart YY_PROTO(( FILE *input_file )); + +void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); +void yy_load_buffer_state YY_PROTO(( void )); +YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size )); +void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); +void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); +void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b )); +#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer ) + +YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size )); +YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str )); +YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len )); + +static void *yy_flex_alloc YY_PROTO(( yy_size_t )); +static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t )); +static void yy_flex_free YY_PROTO(( void * )); + +#define yy_new_buffer yy_create_buffer + +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! yy_current_buffer ) \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_current_buffer->yy_is_interactive = is_interactive; \ + } + +#define yy_set_bol(at_bol) \ + { \ + if ( ! yy_current_buffer ) \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_current_buffer->yy_at_bol = at_bol; \ + } + +#define YY_AT_BOL() (yy_current_buffer->yy_at_bol) + +typedef unsigned char YY_CHAR; +FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; +typedef int yy_state_type; +extern char *yytext; +#define yytext_ptr yytext + +static yy_state_type yy_get_previous_state YY_PROTO(( void )); +static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state )); +static int yy_get_next_buffer YY_PROTO(( void )); +static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up yytext. + */ +#define YY_DO_BEFORE_ACTION \ + yytext_ptr = yy_bp; \ + yyleng = (int) (yy_cp - yy_bp); \ + yy_hold_char = *yy_cp; \ + *yy_cp = '\0'; \ + yy_c_buf_p = yy_cp; + +#define YY_NUM_RULES 6 +#define YY_END_OF_BUFFER 7 +static yyconst short int yy_accept[25] = + { 0, + 0, 0, 7, 5, 1, 2, 5, 5, 3, 3, + 5, 5, 0, 4, 5, 3, 3, 5, 4, 0, + 5, 0, 3, 0 + } ; + +static yyconst int yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 4, 5, 1, 1, 1, 4, 1, 4, + 4, 1, 1, 4, 6, 1, 1, 7, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 1, 1, 1, + 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 10, 1, 1, + 1, 11, 1, 1, 1, 1, 9, 9, 9, 9, + + 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 10, + 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 + } ; + +static yyconst int yy_meta[12] = + { 0, + 1, 2, 3, 2, 1, 1, 1, 1, 1, 1, + 1 + } ; + +static yyconst short int yy_base[30] = + { 0, + 0, 0, 17, 0, 72, 72, 10, 15, 17, 9, + 0, 26, 33, 0, 43, 0, 3, 41, 72, 0, + 0, 46, 0, 72, 57, 60, 63, 66, 69 + } ; + +static yyconst short int yy_def[30] = + { 0, + 24, 1, 24, 25, 24, 24, 26, 25, 8, 8, + 25, 26, 27, 25, 28, 9, 9, 25, 24, 29, + 12, 27, 18, 0, 24, 24, 24, 24, 24 + } ; + +static yyconst short int yy_nxt[84] = + { 0, + 4, 5, 4, 6, 7, 8, 9, 10, 4, 4, + 4, 13, 11, 13, 14, 17, 24, 24, 24, 24, + 15, 16, 17, 17, 24, 24, 18, 13, 24, 13, + 14, 24, 24, 24, 24, 24, 15, 19, 24, 24, + 24, 24, 24, 20, 22, 11, 22, 23, 23, 23, + 19, 24, 24, 24, 24, 24, 20, 11, 24, 11, + 12, 12, 12, 13, 13, 13, 21, 21, 21, 22, + 22, 3, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24 + } ; + +static yyconst short int yy_chk[84] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 7, 17, 7, 7, 10, 3, 0, 0, 0, + 7, 8, 8, 9, 0, 0, 9, 12, 0, 12, + 12, 0, 0, 0, 0, 0, 12, 13, 0, 0, + 0, 0, 0, 13, 15, 15, 15, 18, 18, 18, + 22, 0, 0, 0, 0, 0, 22, 25, 0, 25, + 26, 26, 26, 27, 27, 27, 28, 28, 28, 29, + 29, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24 + } ; + +static yy_state_type yy_last_accepting_state; +static char *yy_last_accepting_cpos; + +/* The intent behind this definition is that it'll catch + * any uses of REJECT which flex missed. + */ +#define REJECT reject_used_but_not_detected +#define yymore() yymore_used_but_not_detected +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET +char *yytext; +#line 1 "nesc-dspec.l" +#define INITIAL 0 +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ +/* Lexer for -fnesc-dump arguments (tokens are numbers, names (can be + arbitrary strings in "") and boolean operators */ +#define YY_NO_UNPUT 1 +#line 24 "nesc-dspec.l" +#include +#include +#include +#include "parser.h" +#include "nesc-dump.h" +#include "nesc-dspec.h" +#include "nesc-dspec-int.h" + +/* We never wrap into another file */ +#define YY_SKIP_YYWRAP +#define ndwrap() (1) + +#define YY_USE_PROTOS + +#undef YY_INPUT +#define YY_INPUT(buf, result, max_size) \ + { (result) = string_read((buf), (max_size)); } +static int string_read(char *buf, int max_size); +void nderror(char *err); + +#line 444 "lex.nd.c" + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int yywrap YY_PROTO(( void )); +#else +extern int yywrap YY_PROTO(( void )); +#endif +#endif + +#ifndef YY_NO_UNPUT +static void yyunput YY_PROTO(( int c, char *buf_ptr )); +#endif + +#ifndef yytext_ptr +static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int )); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen YY_PROTO(( yyconst char * )); +#endif + +#ifndef YY_NO_INPUT +#ifdef __cplusplus +static int yyinput YY_PROTO(( void )); +#else +static int input YY_PROTO(( void )); +#endif +#endif + +#if YY_STACK_USED +static int yy_start_stack_ptr = 0; +static int yy_start_stack_depth = 0; +static int *yy_start_stack = 0; +#ifndef YY_NO_PUSH_STATE +static void yy_push_state YY_PROTO(( int new_state )); +#endif +#ifndef YY_NO_POP_STATE +static void yy_pop_state YY_PROTO(( void )); +#endif +#ifndef YY_NO_TOP_STATE +static int yy_top_state YY_PROTO(( void )); +#endif + +#else +#define YY_NO_PUSH_STATE 1 +#define YY_NO_POP_STATE 1 +#define YY_NO_TOP_STATE 1 +#endif + +#ifdef YY_MALLOC_DECL +YY_MALLOC_DECL +#else +#if __STDC__ +#ifndef __cplusplus +#include +#endif +#else +/* Just try to get by without declaring the routines. This will fail + * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int) + * or sizeof(void*) != sizeof(int). + */ +#endif +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#define YY_READ_BUF_SIZE 8192 +#endif + +/* Copy whatever the last rule matched to the standard output. */ + +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) +#endif + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + if ( yy_current_buffer->yy_is_interactive ) \ + { \ + int c = '*', n; \ + for ( n = 0; n < max_size && \ + (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \ + && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) +#endif + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL int yylex YY_PROTO(( void )) +#endif + +/* Code executed at the beginning of each rule, after yytext and yyleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK break; +#endif + +#define YY_RULE_SETUP \ + YY_USER_ACTION + +YY_DECL + { + register yy_state_type yy_current_state; + register char *yy_cp, *yy_bp; + register int yy_act; + +#line 49 "nesc-dspec.l" + + +#line 598 "lex.nd.c" + + if ( yy_init ) + { + yy_init = 0; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! yy_start ) + yy_start = 1; /* first start state */ + + if ( ! yyin ) + yyin = stdin; + + if ( ! yyout ) + yyout = stdout; + + if ( ! yy_current_buffer ) + yy_current_buffer = + yy_create_buffer( yyin, YY_BUF_SIZE ); + + yy_load_buffer_state(); + } + + while ( 1 ) /* loops until end-of-file is reached */ + { + yy_cp = yy_c_buf_p; + + /* Support of yytext. */ + *yy_cp = yy_hold_char; + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = yy_start; +yy_match: + do + { + register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; + if ( yy_accept[yy_current_state] ) + { + yy_last_accepting_state = yy_current_state; + yy_last_accepting_cpos = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 25 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + ++yy_cp; + } + while ( yy_base[yy_current_state] != 72 ); + +yy_find_action: + yy_act = yy_accept[yy_current_state]; + if ( yy_act == 0 ) + { /* have to back up */ + yy_cp = yy_last_accepting_cpos; + yy_current_state = yy_last_accepting_state; + yy_act = yy_accept[yy_current_state]; + } + + YY_DO_BEFORE_ACTION; + + +do_action: /* This label is used only to access EOF actions. */ + + + switch ( yy_act ) + { /* beginning of action switch */ + case 0: /* must back up */ + /* undo the effects of YY_DO_BEFORE_ACTION */ + *yy_cp = yy_hold_char; + yy_cp = yy_last_accepting_cpos; + yy_current_state = yy_last_accepting_state; + goto yy_find_action; + +case 1: +YY_RULE_SETUP +#line 51 "nesc-dspec.l" +{ } + YY_BREAK +case 2: +YY_RULE_SETUP +#line 52 "nesc-dspec.l" +{ return ndtext[0]; } + YY_BREAK +case 3: +YY_RULE_SETUP +#line 53 "nesc-dspec.l" +{ + errno = 0; + ndlval.integer = strtoll(ndtext, NULL, 0); + if (errno) + nderror("integer constant out of bounds."); + return ND_INTEGER; + } + YY_BREAK +case 4: +YY_RULE_SETUP +#line 60 "nesc-dspec.l" +{ + char *str = rstralloc(dump_region, strlen(ndtext)); + const char *text = ndtext + 1; + + ndlval.token = str; + while (*text) + { + /* Shell-like \-processing: \ is preserved except + in front of " and \ */ + if (*text == '\\' && (text[1] == '"' || text[1] == '\\')) + text++; + *str++ = *text++; + } + str[-1] = '\0'; + return ND_TOKEN; + } + YY_BREAK +case 5: +YY_RULE_SETUP +#line 76 "nesc-dspec.l" +{ + ndlval.token = rstrdup(dump_region, ndtext); + return ND_TOKEN; + } + YY_BREAK +case 6: +YY_RULE_SETUP +#line 81 "nesc-dspec.l" +YY_FATAL_ERROR( "flex scanner jammed" ); + YY_BREAK +#line 735 "lex.nd.c" +case YY_STATE_EOF(INITIAL): + yyterminate(); + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = yy_hold_char; + YY_RESTORE_YY_MORE_OFFSET + + if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed yyin at a new source and called + * yylex(). If so, then we have to assure + * consistency between yy_current_buffer and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + yy_n_chars = yy_current_buffer->yy_n_chars; + yy_current_buffer->yy_input_file = yyin; + yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state(); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state ); + + yy_bp = yytext_ptr + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++yy_c_buf_p; + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = yy_c_buf_p; + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer() ) + { + case EOB_ACT_END_OF_FILE: + { + yy_did_buffer_switch_on_eof = 0; + + if ( yywrap() ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * yytext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + yy_c_buf_p = yytext_ptr + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + yy_c_buf_p = + yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state(); + + yy_cp = yy_c_buf_p; + yy_bp = yytext_ptr + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + yy_c_buf_p = + &yy_current_buffer->yy_ch_buf[yy_n_chars]; + + yy_current_state = yy_get_previous_state(); + + yy_cp = yy_c_buf_p; + yy_bp = yytext_ptr + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ + } /* end of yylex */ + + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ + +static int yy_get_next_buffer() + { + register char *dest = yy_current_buffer->yy_ch_buf; + register char *source = yytext_ptr; + register int number_to_move, i; + int ret_val; + + if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( yy_current_buffer->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + yy_current_buffer->yy_n_chars = yy_n_chars = 0; + + else + { + int num_to_read = + yy_current_buffer->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ +#ifdef YY_USES_REJECT + YY_FATAL_ERROR( +"input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); +#else + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = yy_current_buffer; + + int yy_c_buf_p_offset = + (int) (yy_c_buf_p - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + int new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + yy_flex_realloc( (void *) b->yy_ch_buf, + b->yy_buf_size + 2 ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = 0; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = yy_current_buffer->yy_buf_size - + number_to_move - 1; +#endif + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]), + yy_n_chars, num_to_read ); + + yy_current_buffer->yy_n_chars = yy_n_chars; + } + + if ( yy_n_chars == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + yyrestart( yyin ); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + yy_current_buffer->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + yy_n_chars += number_to_move; + yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; + yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; + + yytext_ptr = &yy_current_buffer->yy_ch_buf[0]; + + return ret_val; + } + + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + +static yy_state_type yy_get_previous_state() + { + register yy_state_type yy_current_state; + register char *yy_cp; + + yy_current_state = yy_start; + + for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp ) + { + register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + if ( yy_accept[yy_current_state] ) + { + yy_last_accepting_state = yy_current_state; + yy_last_accepting_cpos = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 25 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + } + + return yy_current_state; + } + + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + +#ifdef YY_USE_PROTOS +static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state ) +#else +static yy_state_type yy_try_NUL_trans( yy_current_state ) +yy_state_type yy_current_state; +#endif + { + register int yy_is_jam; + register char *yy_cp = yy_c_buf_p; + + register YY_CHAR yy_c = 1; + if ( yy_accept[yy_current_state] ) + { + yy_last_accepting_state = yy_current_state; + yy_last_accepting_cpos = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 25 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_is_jam = (yy_current_state == 24); + + return yy_is_jam ? 0 : yy_current_state; + } + + +#ifndef YY_NO_UNPUT +#ifdef YY_USE_PROTOS +static void yyunput( int c, register char *yy_bp ) +#else +static void yyunput( c, yy_bp ) +int c; +register char *yy_bp; +#endif + { + register char *yy_cp = yy_c_buf_p; + + /* undo effects of setting up yytext */ + *yy_cp = yy_hold_char; + + if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + { /* need to shift things up to make room */ + /* +2 for EOB chars. */ + register int number_to_move = yy_n_chars + 2; + register char *dest = &yy_current_buffer->yy_ch_buf[ + yy_current_buffer->yy_buf_size + 2]; + register char *source = + &yy_current_buffer->yy_ch_buf[number_to_move]; + + while ( source > yy_current_buffer->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + yy_current_buffer->yy_n_chars = + yy_n_chars = yy_current_buffer->yy_buf_size; + + if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + + *--yy_cp = (char) c; + + + yytext_ptr = yy_bp; + yy_hold_char = *yy_cp; + yy_c_buf_p = yy_cp; + } +#endif /* ifndef YY_NO_UNPUT */ + + +#ifdef __cplusplus +static int yyinput() +#else +static int input() +#endif + { + int c; + + *yy_c_buf_p = yy_hold_char; + + if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] ) + /* This was really a NUL. */ + *yy_c_buf_p = '\0'; + + else + { /* need more input */ + int offset = yy_c_buf_p - yytext_ptr; + ++yy_c_buf_p; + + switch ( yy_get_next_buffer() ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + yyrestart( yyin ); + + /* fall through */ + + case EOB_ACT_END_OF_FILE: + { + if ( yywrap() ) + return EOF; + + if ( ! yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(); +#else + return input(); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + yy_c_buf_p = yytext_ptr + offset; + break; + } + } + } + + c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */ + *yy_c_buf_p = '\0'; /* preserve yytext */ + yy_hold_char = *++yy_c_buf_p; + + + return c; + } + + +#ifdef YY_USE_PROTOS +void yyrestart( FILE *input_file ) +#else +void yyrestart( input_file ) +FILE *input_file; +#endif + { + if ( ! yy_current_buffer ) + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); + + yy_init_buffer( yy_current_buffer, input_file ); + yy_load_buffer_state(); + } + + +#ifdef YY_USE_PROTOS +void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) +#else +void yy_switch_to_buffer( new_buffer ) +YY_BUFFER_STATE new_buffer; +#endif + { + if ( yy_current_buffer == new_buffer ) + return; + + if ( yy_current_buffer ) + { + /* Flush out information for old buffer. */ + *yy_c_buf_p = yy_hold_char; + yy_current_buffer->yy_buf_pos = yy_c_buf_p; + yy_current_buffer->yy_n_chars = yy_n_chars; + } + + yy_current_buffer = new_buffer; + yy_load_buffer_state(); + + /* We don't actually know whether we did this switch during + * EOF (yywrap()) processing, but the only time this flag + * is looked at is after yywrap() is called, so it's safe + * to go ahead and always set it. + */ + yy_did_buffer_switch_on_eof = 1; + } + + +#ifdef YY_USE_PROTOS +void yy_load_buffer_state( void ) +#else +void yy_load_buffer_state() +#endif + { + yy_n_chars = yy_current_buffer->yy_n_chars; + yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos; + yyin = yy_current_buffer->yy_input_file; + yy_hold_char = *yy_c_buf_p; + } + + +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) +#else +YY_BUFFER_STATE yy_create_buffer( file, size ) +FILE *file; +int size; +#endif + { + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + yy_init_buffer( b, file ); + + return b; + } + + +#ifdef YY_USE_PROTOS +void yy_delete_buffer( YY_BUFFER_STATE b ) +#else +void yy_delete_buffer( b ) +YY_BUFFER_STATE b; +#endif + { + if ( ! b ) + return; + + if ( b == yy_current_buffer ) + yy_current_buffer = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + yy_flex_free( (void *) b->yy_ch_buf ); + + yy_flex_free( (void *) b ); + } + + +#ifndef YY_ALWAYS_INTERACTIVE +#ifndef YY_NEVER_INTERACTIVE +extern int isatty YY_PROTO(( int )); +#endif +#endif + +#ifdef YY_USE_PROTOS +void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) +#else +void yy_init_buffer( b, file ) +YY_BUFFER_STATE b; +FILE *file; +#endif + + + { + yy_flush_buffer( b ); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + +#if YY_ALWAYS_INTERACTIVE + b->yy_is_interactive = 1; +#else +#if YY_NEVER_INTERACTIVE + b->yy_is_interactive = 0; +#else + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; +#endif +#endif + } + + +#ifdef YY_USE_PROTOS +void yy_flush_buffer( YY_BUFFER_STATE b ) +#else +void yy_flush_buffer( b ) +YY_BUFFER_STATE b; +#endif + + { + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == yy_current_buffer ) + yy_load_buffer_state(); + } + + +#ifndef YY_NO_SCAN_BUFFER +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size ) +#else +YY_BUFFER_STATE yy_scan_buffer( base, size ) +char *base; +yy_size_t size; +#endif + { + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return 0; + + b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = 0; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + yy_switch_to_buffer( b ); + + return b; + } +#endif + + +#ifndef YY_NO_SCAN_STRING +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str ) +#else +YY_BUFFER_STATE yy_scan_string( yy_str ) +yyconst char *yy_str; +#endif + { + int len; + for ( len = 0; yy_str[len]; ++len ) + ; + + return yy_scan_bytes( yy_str, len ); + } +#endif + + +#ifndef YY_NO_SCAN_BYTES +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len ) +#else +YY_BUFFER_STATE yy_scan_bytes( bytes, len ) +yyconst char *bytes; +int len; +#endif + { + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = len + 2; + buf = (char *) yy_flex_alloc( n ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); + + for ( i = 0; i < len; ++i ) + buf[i] = bytes[i]; + + buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; + + b = yy_scan_buffer( buf, n ); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; + } +#endif + + +#ifndef YY_NO_PUSH_STATE +#ifdef YY_USE_PROTOS +static void yy_push_state( int new_state ) +#else +static void yy_push_state( new_state ) +int new_state; +#endif + { + if ( yy_start_stack_ptr >= yy_start_stack_depth ) + { + yy_size_t new_size; + + yy_start_stack_depth += YY_START_STACK_INCR; + new_size = yy_start_stack_depth * sizeof( int ); + + if ( ! yy_start_stack ) + yy_start_stack = (int *) yy_flex_alloc( new_size ); + + else + yy_start_stack = (int *) yy_flex_realloc( + (void *) yy_start_stack, new_size ); + + if ( ! yy_start_stack ) + YY_FATAL_ERROR( + "out of memory expanding start-condition stack" ); + } + + yy_start_stack[yy_start_stack_ptr++] = YY_START; + + BEGIN(new_state); + } +#endif + + +#ifndef YY_NO_POP_STATE +static void yy_pop_state() + { + if ( --yy_start_stack_ptr < 0 ) + YY_FATAL_ERROR( "start-condition stack underflow" ); + + BEGIN(yy_start_stack[yy_start_stack_ptr]); + } +#endif + + +#ifndef YY_NO_TOP_STATE +static int yy_top_state() + { + return yy_start_stack[yy_start_stack_ptr - 1]; + } +#endif + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +#ifdef YY_USE_PROTOS +static void yy_fatal_error( yyconst char msg[] ) +#else +static void yy_fatal_error( msg ) +char msg[]; +#endif + { + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); + } + + + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + yytext[yyleng] = yy_hold_char; \ + yy_c_buf_p = yytext + n; \ + yy_hold_char = *yy_c_buf_p; \ + *yy_c_buf_p = '\0'; \ + yyleng = n; \ + } \ + while ( 0 ) + + +/* Internal utility routines. */ + +#ifndef yytext_ptr +#ifdef YY_USE_PROTOS +static void yy_flex_strncpy( char *s1, yyconst char *s2, int n ) +#else +static void yy_flex_strncpy( s1, s2, n ) +char *s1; +yyconst char *s2; +int n; +#endif + { + register int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; + } +#endif + +#ifdef YY_NEED_STRLEN +#ifdef YY_USE_PROTOS +static int yy_flex_strlen( yyconst char *s ) +#else +static int yy_flex_strlen( s ) +yyconst char *s; +#endif + { + register int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; + } +#endif + + +#ifdef YY_USE_PROTOS +static void *yy_flex_alloc( yy_size_t size ) +#else +static void *yy_flex_alloc( size ) +yy_size_t size; +#endif + { + return (void *) malloc( size ); + } + +#ifdef YY_USE_PROTOS +static void *yy_flex_realloc( void *ptr, yy_size_t size ) +#else +static void *yy_flex_realloc( ptr, size ) +void *ptr; +yy_size_t size; +#endif + { + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return (void *) realloc( (char *) ptr, size ); + } + +#ifdef YY_USE_PROTOS +static void yy_flex_free( void *ptr ) +#else +static void yy_flex_free( ptr ) +void *ptr; +#endif + { + free( ptr ); + } + +#if YY_MAIN +int main() + { + yylex(); + return 0; + } +#endif +#line 81 "nesc-dspec.l" + + +static YY_BUFFER_STATE mbuf; +static const char *line; +static int length, offset; + +void nd_read(const char *str) +{ + if (mbuf) + nd_delete_buffer(mbuf); + mbuf = nd_create_buffer(stdin, YY_BUF_SIZE); + + nd_switch_to_buffer(mbuf); + line = str; + offset = 0; + length = strlen(line); +} + +static int string_read(char *abuf, int max_size) +{ + int cnt; + + cnt = max_size; + if (cnt > length - offset) cnt = length - offset; + + memcpy(abuf, line + offset, cnt); + offset += cnt; + + return cnt; +} + +void nderror(char *err) +{ + error("dump option `%s': %s", line, err); +} diff --git a/src/libcompat/Makefile.am b/src/libcompat/Makefile.am new file mode 100644 index 0000000..eea43d5 --- /dev/null +++ b/src/libcompat/Makefile.am @@ -0,0 +1,45 @@ +## Process this file with automake to produce Makefile.in -*- makefile -*- + +# This file is part of the RC compiler. +# Copyright (C) 2000-2001 The Regents of the University of California. +# +# RC 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. +# +# RC 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 RC; see the file COPYING. If not, write to +# the Free Software Foundation, 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +INCLUDES := -DNMEMDEBUG -DNDEBUG -O9 + +noinst_LIBRARIES = libregions.a + +noinst_HEADERS = \ + alloc.c \ + pages.c \ + stats.c + +if NEED_FNMATCH +INCLUDES += -Ifnmatch +FNMATCH = fnmatch.c fnmatch/fnmatch.h +endif + +if NEED_REGEX +INCLUDES += -Iregex +REGEX = regex.c regex/regex.h +endif + +libregions_a_SOURCES = \ + regions.c \ + regions.h \ + $(FNMATCH) \ + $(REGEX) + diff --git a/src/libcompat/Makefile.in b/src/libcompat/Makefile.in new file mode 100644 index 0000000..8a0134a --- /dev/null +++ b/src/libcompat/Makefile.in @@ -0,0 +1,444 @@ +# Makefile.in generated by automake 1.10 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# This file is part of the RC compiler. +# Copyright (C) 2000-2001 The Regents of the University of California. +# +# RC 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. +# +# RC 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 RC; see the file COPYING. If not, write to +# the Free Software Foundation, 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +@NEED_FNMATCH_TRUE@am__append_1 = -Ifnmatch +@NEED_REGEX_TRUE@am__append_2 = -Iregex +subdir = libcompat +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/../config-aux/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/autoconf.h +CONFIG_CLEAN_FILES = +LIBRARIES = $(noinst_LIBRARIES) +AR = ar +ARFLAGS = cru +libregions_a_AR = $(AR) $(ARFLAGS) +libregions_a_LIBADD = +am__libregions_a_SOURCES_DIST = regions.c regions.h fnmatch.c \ + fnmatch/fnmatch.h regex.c regex/regex.h +@NEED_FNMATCH_TRUE@am__objects_1 = fnmatch.$(OBJEXT) +@NEED_REGEX_TRUE@am__objects_2 = regex.$(OBJEXT) +am_libregions_a_OBJECTS = regions.$(OBJEXT) $(am__objects_1) \ + $(am__objects_2) +libregions_a_OBJECTS = $(am_libregions_a_OBJECTS) +DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ +depcomp = $(SHELL) $(top_srcdir)/../config-aux/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(libregions_a_SOURCES) +DIST_SOURCES = $(am__libregions_a_SOURCES_DIST) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +INCLUDES := -DNMEMDEBUG -DNDEBUG -O9 $(am__append_1) $(am__append_2) +noinst_LIBRARIES = libregions.a +noinst_HEADERS = \ + alloc.c \ + pages.c \ + stats.c + +@NEED_FNMATCH_TRUE@FNMATCH = fnmatch.c fnmatch/fnmatch.h +@NEED_REGEX_TRUE@REGEX = regex.c regex/regex.h +libregions_a_SOURCES = \ + regions.c \ + regions.h \ + $(FNMATCH) \ + $(REGEX) + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign libcompat/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign libcompat/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) +libregions.a: $(libregions_a_OBJECTS) $(libregions_a_DEPENDENCIES) + -rm -f libregions.a + $(libregions_a_AR) libregions.a $(libregions_a_OBJECTS) $(libregions_a_LIBADD) + $(RANLIB) libregions.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fnmatch.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regex.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regions.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LIBRARIES) $(HEADERS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-exec-am: + +install-html: install-html-am + +install-info: install-info-am + +install-man: + +install-pdf: install-pdf-am + +install-ps: install-ps-am + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-noinstLIBRARIES ctags distclean distclean-compile \ + distclean-generic distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ + uninstall-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/libcompat/alloc.c b/src/libcompat/alloc.c new file mode 100644 index 0000000..8556c45 --- /dev/null +++ b/src/libcompat/alloc.c @@ -0,0 +1,165 @@ +/* + * Copyright (c) 1999-2001 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ +/* TBD: recover unusued portions of pages for use as individual pages */ + +#include +#include "regions.h" + +static +void alloc_block(region r, struct allocator *a, struct ablock *blk, + void **p1, int s1, int a1, void **p2, int s2, int a2, + size_t blksize, int needsclear) +{ + struct page *newp; + char *mem1, *mem2; + + mem1 = PALIGN(blk->allocfrom, a1); + mem2 = PALIGN(mem1 + s1, a2); + + /* Can't use last byte of page (pointers to the byte after an object are + valid) */ + if (mem2 + s2 >= blk->end) + { + if (blksize == RPAGESIZE) + { + newp = alloc_single_page(a->pages); + a->pages = newp; + blk->allocfrom = (char *)newp + offsetof(struct page, previous); + set_region(newp, 1, r); + } + else + { + newp = alloc_pages(blksize >> RPAGELOG, a->bigpages); + a->bigpages = newp; + blk->allocfrom = (char *)newp + offsetof(struct page, previous); + set_region(newp, blksize >> RPAGELOG, r); + } + blk->end = (char *)newp + blksize; + + if (needsclear) + preclear(blk->allocfrom, blksize - (blk->allocfrom - (char *)newp)); + mem1 = PALIGN(blk->allocfrom, a1); + mem2 = PALIGN(mem1 + s1, a2); + } + + ASSERT_INUSE(blk->end - blksize, r); + blk->allocfrom = mem2 + s2; + + *p1 = mem1; + *p2 = mem2; +} + +static inline +void qalloc(region r, struct allocator *a, void **p1, int s1, int a1, + void **p2, int s2, int a2, int needsclear) +{ + struct page *p; + char *mem; + int npages; + int n = ALIGN(s1, a2) + s2; /* Yes, this is correct (see alloc_block) */ + + /* We optimise the check for the first block */ + { + char *mem1, *mem2; + + mem1 = PALIGN(a->page.allocfrom, a1); + mem2 = PALIGN(mem1 + s1, a2); + + /* Can't use last byte of page (pointers to the byte after an object are + valid) */ + if (mem2 + s2 < a->page.end) + { + ASSERT_INUSE(blk->end - blksize, r); + a->page.allocfrom = mem2 + s2; + + *p1 = mem1; + *p2 = mem2; + return; + } + } + + if (n <= RPAGESIZE / K) + { + alloc_block(r, a, &a->page, p1, s1, a1, p2, s2, a2, RPAGESIZE, + needsclear); + return; + } +#if K >= 2 + if (n <= RPAGESIZE) + { + alloc_block(r, a, &a->superpage, p1, s1, a1, p2, s2, a2, + K * RPAGESIZE, needsclear); + return; + } +#endif +#if K >= 4 + if (n <= RPAGESIZE * K) + { + alloc_block(r, a, &a->hyperpage, p1, s1, a1, p2, s2, a2, + K * K * RPAGESIZE, needsclear); + return; + } +#endif + + /* We would have - 1 after RPAGESIZE, but we need to add 1 to make the + last byte of the object live in the same region */ + npages = (n + ALIGN(offsetof(struct page, previous), a1) + RPAGESIZE) + >> RPAGELOG; + p = alloc_pages(npages, a->bigpages); + a->bigpages = p; + set_region(p, npages, r); + + mem = (char *)p + offsetof(struct page, previous); + *p1 = PALIGN(mem, a1); + *p2 = PALIGN((char *)*p1 + s1, a2); + if (needsclear) + preclear(*p2, s2); +} + +void free_all_pages(region r, struct allocator *a) +/* Assumes freepages_lock held */ +{ + struct page *p, *next; + + for (p = a->pages; p; p = next) + { + next = p->next; + free_single_page(r, p); + } + for (p = a->bigpages; p; p = next) + { + next = p->next; + free_pages(r, p); + } +} diff --git a/src/libcompat/fnmatch.c b/src/libcompat/fnmatch.c new file mode 100644 index 0000000..d0d7002 --- /dev/null +++ b/src/libcompat/fnmatch.c @@ -0,0 +1,344 @@ +/* Copyright (C) 1991-1993, 1996-1999, 2000 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#if HAVE_CONFIG_H +# include +#endif + +/* Enable GNU extensions in fnmatch.h. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#include +#include +#include +#include + +#if HAVE_STRING_H || defined _LIBC +# include +#else +# include +#endif + +#if defined STDC_HEADERS || defined _LIBC +# include +#endif + +/* For platform which support the ISO C amendement 1 functionality we + support user defined character classes. */ +#if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H) +/* Solaris 2.5 has a bug: must be included before . */ +# include +# include +#endif + +/* We need some of the locale data (the collation sequence information) + but there is no interface to get this information in general. Therefore + we support a correct implementation only in glibc. */ +#ifdef _LIBC +# include "../locale/localeinfo.h" +# include "../locale/elem-hash.h" +# include "../locale/coll-lookup.h" + +# define CONCAT(a,b) __CONCAT(a,b) +# define mbsinit __mbsinit +# define mbsrtowcs __mbsrtowcs +#endif + +/* 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__ + + +# if defined STDC_HEADERS || !defined isascii +# define ISASCII(c) 1 +# else +# define ISASCII(c) isascii(c) +# endif + +# ifdef isblank +# define ISBLANK(c) (ISASCII (c) && isblank (c)) +# else +# define ISBLANK(c) ((c) == ' ' || (c) == '\t') +# endif +# ifdef isgraph +# define ISGRAPH(c) (ISASCII (c) && isgraph (c)) +# else +# define ISGRAPH(c) (ISASCII (c) && isprint (c) && !isspace (c)) +# endif + +# define ISPRINT(c) (ISASCII (c) && isprint (c)) +# define ISDIGIT(c) (ISASCII (c) && isdigit (c)) +# define ISALNUM(c) (ISASCII (c) && isalnum (c)) +# define ISALPHA(c) (ISASCII (c) && isalpha (c)) +# define ISCNTRL(c) (ISASCII (c) && iscntrl (c)) +# define ISLOWER(c) (ISASCII (c) && islower (c)) +# define ISPUNCT(c) (ISASCII (c) && ispunct (c)) +# define ISSPACE(c) (ISASCII (c) && isspace (c)) +# define ISUPPER(c) (ISASCII (c) && isupper (c)) +# define ISXDIGIT(c) (ISASCII (c) && isxdigit (c)) + +# define STREQ(s1, s2) ((strcmp (s1, s2) == 0)) + +# if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H) +/* The GNU C library provides support for user-defined character classes + and the functions from ISO C amendement 1. */ +# ifdef CHARCLASS_NAME_MAX +# define CHAR_CLASS_MAX_LENGTH CHARCLASS_NAME_MAX +# else +/* This shouldn't happen but some implementation might still have this + problem. Use a reasonable default value. */ +# define CHAR_CLASS_MAX_LENGTH 256 +# endif + +# ifdef _LIBC +# define IS_CHAR_CLASS(string) __wctype (string) +# else +# define IS_CHAR_CLASS(string) wctype (string) +# endif + +# ifdef _LIBC +# define ISWCTYPE(WC, WT) __iswctype (WC, WT) +# else +# define ISWCTYPE(WC, WT) iswctype (WC, WT) +# endif + +# if (HAVE_MBSTATE_T && HAVE_MBSRTOWCS) || _LIBC +/* In this case we are implementing the multibyte character handling. */ +# define HANDLE_MULTIBYTE 1 +# endif + +# else +# define CHAR_CLASS_MAX_LENGTH 6 /* Namely, `xdigit'. */ + +# define IS_CHAR_CLASS(string) \ + (STREQ (string, "alpha") || STREQ (string, "upper") \ + || STREQ (string, "lower") || STREQ (string, "digit") \ + || STREQ (string, "alnum") || STREQ (string, "xdigit") \ + || STREQ (string, "space") || STREQ (string, "print") \ + || STREQ (string, "punct") || STREQ (string, "graph") \ + || STREQ (string, "cntrl") || STREQ (string, "blank")) +# endif + +/* Avoid depending on library functions or files + whose names are inconsistent. */ + +# if !defined _LIBC && !defined getenv +extern char *getenv (); +# endif + +# ifndef errno +extern int errno; +# endif + +/* This function doesn't exist on most systems. */ + +# if !defined HAVE___STRCHRNUL && !defined _LIBC +static char * +__strchrnul (s, c) + const char *s; + int c; +{ + char *result = strchr (s, c); + if (result == NULL) + result = strchr (s, '\0'); + return result; +} +# endif + +# if HANDLE_MULTIBYTE && !defined HAVE___STRCHRNUL && !defined _LIBC +static wchar_t * +__wcschrnul (s, c) + const wchar_t *s; + wint_t c; +{ + wchar_t *result = wcschr (s, c); + if (result == NULL) + result = wcschr (s, '\0'); + return result; +} +# endif + +# ifndef internal_function +/* Inside GNU libc we mark some function in a special way. In other + environments simply ignore the marking. */ +# define internal_function +# endif + +/* Note that this evaluates C many times. */ +# ifdef _LIBC +# define FOLD(c) ((flags & FNM_CASEFOLD) ? tolower (c) : (c)) +# else +# define FOLD(c) ((flags & FNM_CASEFOLD) && ISUPPER (c) ? tolower (c) : (c)) +# endif +# define CHAR char +# define UCHAR unsigned char +# define FCT internal_fnmatch +# define L(CS) CS +# ifdef _LIBC +# define BTOWC(C) __btowc (C) +# else +# define BTOWC(C) btowc (C) +# endif +# define STRCHR(S, C) strchr (S, C) +# define STRCHRNUL(S, C) __strchrnul (S, C) +# define STRCOLL(S1, S2) strcoll (S1, S2) +# include "fnmatch_loop.c" + + +# if HANDLE_MULTIBYTE +/* Note that this evaluates C many times. */ +# ifdef _LIBC +# define FOLD(c) ((flags & FNM_CASEFOLD) ? towlower (c) : (c)) +# else +# define FOLD(c) ((flags & FNM_CASEFOLD) && ISUPPER (c) ? towlower (c) : (c)) +# endif +# define CHAR wchar_t +# define UCHAR wint_t +# define FCT internal_fnwmatch +# define L(CS) L##CS +# define BTOWC(C) (C) +# define STRCHR(S, C) wcschr (S, C) +# define STRCHRNUL(S, C) __wcschrnul (S, C) +# define STRCOLL(S1, S2) wcscoll (S1, S2) +# define WIDE_CHAR_VERSION 1 + +# undef IS_CHAR_CLASS +/* We have to convert the wide character string in a multibyte string. But + we know that the character class names consist of alphanumeric characters + from the portable character set, and since the wide character encoding + for a member of the portable character set is the same code point as + its single-byte encoding, we can use a simplified method to convert the + string to a multibyte character string. */ +static wctype_t +is_char_class (const wchar_t *wcs) +{ + char s[CHAR_CLASS_MAX_LENGTH + 1]; + char *cp = s; + + do + { + /* Test for a printable character from the portable character set. */ +# ifdef _LIBC + if (*wcs < 0x20 || *wcs > 0x7e + || *wcs == 0x24 || *wcs == 0x40 || *wcs == 0x60) + return (wctype_t) 0; +# else + switch (*wcs) + { + case L' ': case L'!': case L'"': case L'#': case L'%': + case L'&': case L'\'': case L'(': case L')': case L'*': + case L'+': case L',': case L'-': case L'.': case L'/': + case L'0': case L'1': case L'2': case L'3': case L'4': + case L'5': case L'6': case L'7': case L'8': case L'9': + case L':': case L';': case L'<': case L'=': case L'>': + case L'?': + case L'A': case L'B': case L'C': case L'D': case L'E': + case L'F': case L'G': case L'H': case L'I': case L'J': + case L'K': case L'L': case L'M': case L'N': case L'O': + case L'P': case L'Q': case L'R': case L'S': case L'T': + case L'U': case L'V': case L'W': case L'X': case L'Y': + case L'Z': + case L'[': case L'\\': case L']': case L'^': case L'_': + case L'a': case L'b': case L'c': case L'd': case L'e': + case L'f': case L'g': case L'h': case L'i': case L'j': + case L'k': case L'l': case L'm': case L'n': case L'o': + case L'p': case L'q': case L'r': case L's': case L't': + case L'u': case L'v': case L'w': case L'x': case L'y': + case L'z': case L'{': case L'|': case L'}': case L'~': + break; + default: + return (wctype_t) 0; + } +# endif + + /* Avoid overrunning the buffer. */ + if (cp == s + CHAR_CLASS_MAX_LENGTH) + return (wctype_t) 0; + + *cp++ = (char) *wcs++; + } + while (*wcs != L'\0'); + + *cp = '\0'; + +# ifdef _LIBC + return __wctype (s); +# else + return wctype (s); +# endif +} +# define IS_CHAR_CLASS(string) is_char_class (string) + +# include "fnmatch_loop.c" +# endif + + +int +fnmatch (pattern, string, flags) + const char *pattern; + const char *string; + int flags; +{ +# if HANDLE_MULTIBYTE + mbstate_t ps; + size_t n; + wchar_t *wpattern; + wchar_t *wstring; + + if (MB_CUR_MAX == 1) + /* This is an optimization for 8-bit character set. */ + return internal_fnmatch (pattern, string, flags & FNM_PERIOD, flags); + + /* Convert the strings into wide characters. */ + memset (&ps, '\0', sizeof (ps)); + n = mbsrtowcs (NULL, &pattern, 0, &ps); + if (n == (size_t) -1) + /* Something wrong. + XXX Do we have to set `errno' to something which mbsrtows hasn't + already done? */ + return -1; + wpattern = (wchar_t *) alloca ((n + 1) * sizeof (wchar_t)); + assert (mbsinit (&ps)); + (void) mbsrtowcs (wpattern, &pattern, n + 1, &ps); + + assert (mbsinit (&ps)); + n = mbsrtowcs (NULL, &string, 0, &ps); + if (n == (size_t) -1) + /* Something wrong. + XXX Do we have to set `errno' to something which mbsrtows hasn't + already done? */ + return -1; + wstring = (wchar_t *) alloca ((n + 1) * sizeof (wchar_t)); + assert (mbsinit (&ps)); + (void) mbsrtowcs (wstring, &string, n + 1, &ps); + + return internal_fnwmatch (wpattern, wstring, flags & FNM_PERIOD, flags); +# else + return internal_fnmatch (pattern, string, flags & FNM_PERIOD, flags); +# endif /* mbstate_t and mbsrtowcs or _LIBC. */ +} + +#endif /* _LIBC or not __GNU_LIBRARY__. */ diff --git a/src/libcompat/fnmatch/fnmatch.h b/src/libcompat/fnmatch/fnmatch.h new file mode 100644 index 0000000..cc3ec37 --- /dev/null +++ b/src/libcompat/fnmatch/fnmatch.h @@ -0,0 +1,84 @@ +/* Copyright (C) 1991, 92, 93, 96, 97, 98, 99 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _FNMATCH_H +#define _FNMATCH_H 1 + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined __cplusplus || (defined __STDC__ && __STDC__) || defined WINDOWS32 +# if !defined __GLIBC__ || !defined __P +# undef __P +# define __P(protos) protos +# endif +#else /* Not C++ or ANSI C. */ +# undef __P +# define __P(protos) () +/* We can get away without defining `const' here only because in this file + it is used only inside the prototype for `fnmatch', which is elided in + non-ANSI C where `const' is problematical. */ +#endif /* C++ or ANSI C. */ + +#ifndef const +# if (defined __STDC__ && __STDC__) || defined __cplusplus +# define __const const +# else +# define __const +# endif +#endif + +/* We #undef these before defining them because some losing systems + (HP-UX A.08.07 for example) define these in . */ +#undef FNM_PATHNAME +#undef FNM_NOESCAPE +#undef FNM_PERIOD + +/* Bits set in the FLAGS argument to `fnmatch'. */ +#define FNM_PATHNAME (1 << 0) /* No wildcard can ever match `/'. */ +#define FNM_NOESCAPE (1 << 1) /* Backslashes don't quote special chars. */ +#define FNM_PERIOD (1 << 2) /* Leading `.' is matched only explicitly. */ + +#if !defined _POSIX_C_SOURCE || _POSIX_C_SOURCE < 2 || defined _GNU_SOURCE +# define FNM_FILE_NAME FNM_PATHNAME /* Preferred GNU name. */ +# define FNM_LEADING_DIR (1 << 3) /* Ignore `/...' after a match. */ +# define FNM_CASEFOLD (1 << 4) /* Compare without regard to case. */ +#endif + +/* Value returned by `fnmatch' if STRING does not match PATTERN. */ +#define FNM_NOMATCH 1 + +/* This value is returned if the implementation does not support + `fnmatch'. Since this is not the case here it will never be + returned but the conformance test suites still require the symbol + to be defined. */ +#ifdef _XOPEN_SOURCE +# define FNM_NOSYS (-1) +#endif + +/* Match NAME against the filename pattern PATTERN, + returning zero if it matches, FNM_NOMATCH if not. */ +extern int fnmatch __P ((__const char *__pattern, __const char *__name, + int __flags)); + +#ifdef __cplusplus +} +#endif + +#endif /* fnmatch.h */ diff --git a/src/libcompat/pages.c b/src/libcompat/pages.c new file mode 100644 index 0000000..531c47c --- /dev/null +++ b/src/libcompat/pages.c @@ -0,0 +1,620 @@ +/* + * Copyright (c) 1999-2001 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ +#include + +typedef __rcintptr pageid; + +static size_t total_page_count; /* total pages allocated */ +#define PAGE_GROUP_SIZE (1 + (total_page_count >> 7)) + +#if 0 +#define FREEPAGE ((region)-1) /* Id of a free page */ +#else +#define FREEPAGE (&zeroregion) +#endif +#ifdef NMEMDEBUG +#define ASSERT_FREE(p) +#define ASSERT_INUSE(p, r) +#else +#define ASSERT_FREE(p) assert(regionof(p) == FREEPAGE) +#ifdef DUPLICATES +#define ASSERT_INUSE(p, r) assert(regionof(p) == r->base) +#else +#define ASSERT_INUSE(p, r) assert(regionof(p) == r) +#endif +#endif + +/* Page allocator for region-based memory management */ +/* TBD: special free list for size == K ?? */ + +#define PAGECOUNTBITS (CHAR_BIT * sizeof(pageid) - 1) + +struct page +{ + /* Next page in region or in free list */ + struct page *next; + + /* Doubly linked list of pages sorted by address */ + struct page *next_address, *prev_address; + + /* number of pages in this allocation unit. Negative for free pages. */ + pageid pagecount : PAGECOUNTBITS; + + unsigned int free : 1; + + /* Only in free pages not in the single_pages list */ + struct page *previous; +}; + +/* The pages are kept in a single list sorted by address via the + next_address and prev_address fields. The first page's prev_address and + the last page's next_address fields points to pages_byaddress. + page_byaddress.next_address is the first page + page_byaddress.prev_address is the last page + + This list is used for coalescing operations. +*/ +static struct page pages_byaddress; + +struct page *alloc_single_page(struct page *next); +void free_single_page(region r, struct page *p); + +struct page *alloc_pages(int n, struct page *next); +void free_pages(region r, struct page *p); + + +/* a list of free individual pages */ +struct page *single_pages; + +/* free pages (not including those in single_pages) */ +struct page *unused_pages; + +static void init_pages(void) +{ + pages_byaddress.next_address = &pages_byaddress; + pages_byaddress.prev_address = &pages_byaddress; +} + +static void insertbefore_address(struct page *p, struct page *before) +{ + p->prev_address = before->prev_address; + p->next_address = before; + before->prev_address = p; + p->prev_address->next_address = p; +} + +static void insertafter_address(struct page *p, struct page *after) +{ + insertbefore_address(p, after->next_address); +} + +static void unlink_address(struct page *p) +{ + p->prev_address->next_address = p->next_address; + p->next_address->prev_address = p->prev_address; +} + +static void addbyaddress(struct page *p) +{ + struct page *address_scan; + static struct page *last_add; + + /* Weird performance hack: we try and guess what direction the + underlying malloc gets memory by comparing the address of p + with the previous address passed to addbyaddress. If it's greater, + we try and add from the end of the list, walking backwards. Otherwise + we try and add from the start of the list, walking forwards. */ + + if (p > last_add) + { + for (address_scan = pages_byaddress.prev_address; ; + address_scan = address_scan->prev_address) + if (p > address_scan || address_scan == &pages_byaddress) + { + last_add = p; + insertafter_address(p, address_scan); + return; + } + } + else + { + for (address_scan = pages_byaddress.next_address; ; + address_scan = address_scan->next_address) + if (p < address_scan || address_scan == &pages_byaddress) + { + last_add = p; + insertbefore_address(p, address_scan); + return; + } + } +} + +/* Doubly linked page list management */ +void addfront(struct page **list, struct page *p) +/* Effects: Adds p to the front of doubly-linked list list */ +{ + p->previous = NULL; + p->next = *list; + if (*list) (*list)->previous = p; + *list = p; +} + +void unlink_page(struct page **list, struct page *p) +/* Effects: Remove p from its doubly linked list */ +{ + if (p->previous) + p->previous->next = p->next; + else + *list = p->next; + if (p->next) + p->next->previous = p->previous; +} + +#ifdef USE_MMAP +#include +#include +#include + +#if !defined(MAP_ANONYMOUS) && defined(MAP_ANON) +#define MAP_ANONYMOUS MAP_ANON +#endif + +#ifndef __APPLE__ +#undef MAP_ANONYMOUS +#endif + +#ifndef MAP_ANONYMOUS + +static int dev_zero_fd = -1; /* Cached file descriptor for /dev/zero. */ + +#define MMAP(addr, size, prot, flags) \ + ((dev_zero_fd < 0 ? dev_zero_fd = open("/dev/zero", O_RDWR) : 0), \ + mmap((addr), (size), (prot), (flags), dev_zero_fd, 0)) + +#else + +#define MMAP(addr, size, prot, flags) \ + (mmap((addr), (size), (prot), (flags)|MAP_ANONYMOUS, -1, 0)) + +#endif + +struct page *region_get_mem(size_t s) +{ + struct page *newp; + +#if 0 + s = ALIGN(s, 65536); +#endif + + newp = (struct page *)MMAP(0, s, PROT_READ|PROT_WRITE, MAP_PRIVATE); + + if (!newp) + return NULL; + + if (PALIGN(newp, RPAGESIZE) != newp) + abort(); + + addbyaddress(newp); + + /* Add the new memory to unused_pages */ +#ifndef NMEMDEBUG + set_region_range(newp, (char *)newp + s, FREEPAGE); +#endif + total_page_count += s >> RPAGELOG; + newp->pagecount = s >> RPAGELOG; + newp->free = 1; + addfront(&unused_pages, newp); + + return newp; +} + +#else + +/* region_get_mem will never allocate less than MINIMUM_MEM_REQUEST bytes. + It wastes RPAGESIZE bytes, so there is an overhead of + RPAGESIZE / MINIMUM_MEM_REQUEST +*/ +#define MINIMUM_MEM_REQUEST (PAGE_GROUP_SIZE * K * RPAGESIZE) + +struct page *region_get_mem(size_t s) +{ + size_t request_bytes; + void *mem; + struct page *newp; + + /* Don't get less than K * RPAGESIZE extra memory (K * RPAGESIZE + is the minimum useful size for something on unused_pages) */ + if (s + K * RPAGESIZE < MINIMUM_MEM_REQUEST) + request_bytes = MINIMUM_MEM_REQUEST; + else + request_bytes = s; + + mem = malloc(request_bytes + RPAGESIZE); + if (!mem) + return NULL; + newp = PALIGN(mem, RPAGESIZE); + if (mem == newp) /* Maybe we were lucky! */ + request_bytes += RPAGESIZE; + + addbyaddress(newp); + + /* Add the new memory to unused_pages */ +#ifndef NMEMDEBUG + set_region_range(newp, (char *)newp + request_bytes, FREEPAGE); +#endif + total_page_count += request_bytes >> RPAGELOG; + newp->pagecount = request_bytes >> RPAGELOG; + newp->free = 1; + addfront(&unused_pages, newp); + + return newp; +} +#endif + +/* Page to region map management */ +/* ----------------------------- */ + +#ifndef LARGE_ADDRESSES +/* 32-bit platforms */ +region __rcregionmap[MAXPAGE]; + +static void set_page_region(pageid pagenb, region r) +{ + __rcregionmap[pagenb] = r; +} + +#define page_region(pagenb) (__rcregionmap[(pagenb)]) + +#else +/* 64-bit platforms */ + +/* This is a page table implemented as a table of indirect tables. */ +region *__regiontable[1 << MEMSLICE2]; + +void set_page_region(pageid pagenb, region r) +{ + __rcintptr offset2 = (pagenb >> MEMSLICE3) & ((1 << MEMSLICE2) - 1); + __rcintptr offset3 = pagenb & ((1 << MEMSLICE3) - 1); + region *rmap; + + rmap = __regiontable[offset2]; + if (!rmap) + { + int i; + + rmap = (region *)malloc(sizeof(region) * (1 << MEMSLICE3)); + if (!rmap) + { + if (nomem_h) + nomem_h(); + abort(); + } + __regiontable[offset2] = rmap; + for (i = 0; i < (1 << MEMSLICE3); i++) { + rmap[i] = NULL; + } + } + rmap[offset3] = r; +} + +region page_region(pageid pnb) +{ + __rcintptr offset2 = (pnb >> MEMSLICE3) & ((1 << MEMSLICE2) - 1); + __rcintptr offset3 = pnb & ((1 << MEMSLICE3) - 1); + + /* Check if indirect table is present */ + if (__regiontable[offset2]) + return __regiontable[offset2][offset3]; + else + /* If the indirect table is not there, the value is assumed to be ... */ + return NULL; +} + +#endif + +void set_region(struct page *p, int npages, region r) +{ + pageid pnb = PAGENB(p); + + while (npages-- > 0) + set_page_region(pnb++, r); +} + +/* Mark the memory range from 'from' (inclusive) to 'to' (exclusive) + as belonging to region with id 'rid' */ +void set_region_range(void *from, void *to, region r) +{ + pageid first = PAGENB(from), last = PAGENB((pageid)to - 1); + + while (first <= last) + set_page_region(first++, r); +} + +/* Multi-page allocation management */ +/* -------------------------------- */ + +struct page *alloc_split(struct page *split, int n, struct page *next) +/* Assumes freepages_lock held */ +{ +#ifndef NMEMDEBUG + /* These pages had better be free */ + pageid i, pnb = PAGENB(split); + + assert(split->pagecount >= n); + for (i = pnb; i < pnb + split->pagecount; i++) + assert(page_region(i) == FREEPAGE); +#endif + if (split->pagecount > n) + { + struct page *splitoff; + + /* Keep first part of block */ + split->pagecount -= n; + /* Return latter part of block */ + splitoff = split; + split = (struct page *)((char *)split + (split->pagecount << RPAGELOG)); + + /* Update the by adress list */ + insertbefore_address(split, splitoff->next_address); + } + else + { + /* remove split from list */ + unlink_page(&unused_pages, split); + } + split->next = next; + split->pagecount = n; + split->free = 0; + + return split; +} + +struct page *alloc_new(int n, struct page *next) +/* Assumes freepages_lock held */ +{ + struct page *newp = region_get_mem(n << RPAGELOG); + + if (!newp) + { + if (nomem_h) + nomem_h(); + abort(); + } + assert(!((long)newp & (RPAGESIZE - 1))); + + /* region_get_mem may get us more memory than we asked for */ + return alloc_split(newp, n, next); +} + +struct page *alloc_pages(int n, struct page *next) +{ + struct page *best; + int bestn; + struct page *scan; + + assert(n >= K); + + scan = unused_pages; + /* Find first fit */ + for (;;) + { + if (!scan) + return alloc_new(n, next); + + if (scan->pagecount >= n) break; + scan = scan->next; + } + + /* Now find best fit */ + best = scan; + bestn = scan->pagecount; + for (;;) + { + scan = scan->next; + if (!scan) + return alloc_split(best, n, next); + + if (scan->pagecount >=n && scan->pagecount < bestn) + { + best = scan; + bestn = scan->pagecount; + } + } +} + +static void coalesce(struct page *p) +{ + struct page *prev = p->prev_address, *next; + + p->free = 1; + + /* Coalesce with predecessor ? */ + if (prev->free && (char *)prev + (prev->pagecount << RPAGELOG) == (char *)p) + { + prev->pagecount += p->pagecount; + unlink_address(p); + p = prev; + } + else /* No, add to free pages list */ + addfront(&unused_pages, p); + + next = p->next_address; + /* Coalesce with successor ? */ + if (next->free && (char *)p + (p->pagecount << RPAGELOG) == (char *)next) + { + unlink_page(&unused_pages, next); + p->pagecount += next->pagecount; + unlink_address(next); + } +} + +void free_pages(region r, struct page *p) +/* Assumes freepages_lock held */ +{ +#ifndef NMEMDEBUG + pageid i, pnb = PAGENB(p); + + for (i = pnb; i < pnb + p->pagecount; i++) + { + assert(page_region(i) == r); + set_page_region(i, FREEPAGE); + } +#endif + + coalesce(p); +} + + +/* Single page management */ +/* ---------------------- */ + +static int single_page_count; + +static void add_single_pages(struct page *base) +/* Effects: Adds pages at base to the single_pages list */ +{ + pageid n = base->pagecount; + struct page *prev = base->prev_address, *basenext = base->next_address, + *next; + + single_page_count += n; + + for (;;) + { + ASSERT_FREE(base); + base->free = 0; /* Not free so that coalesce won't steal these back */ + base->prev_address = prev; + prev = base; + base->next = single_pages; + single_pages = base; + if (--n == 0) + break; + next = (struct page *)((char *)base + RPAGESIZE); + base->next_address = next; + base = next; + } + base->next_address = basenext; + basenext->prev_address = base; +} + +void scavenge_single_pages(int n) +{ + /* Add n pages to the single_pages list */ + struct page *scan, *best; + __rcintptr bestn; + + /* Take any group in unused_pages that is <= n or < K. + Remember smallest entry > n too. This is sortof equivalent to + a best fit where we allow partial allocations to make up a whole */ + best = NULL; + bestn = (__rcintptr)1 << (sizeof(__rcintptr) * CHAR_BIT - 2); + scan = unused_pages; + while (scan) + { + /* The pages < K can't be used for anything but single pages so we + might as well grab them even if they are a little too big */ + if (scan->pagecount <= n || scan->pagecount < K) + { + struct page *adding = scan; + + scan = scan->next; + n -= adding->pagecount; + unlink_page(&unused_pages, adding); + add_single_pages(adding); + if (n <= 0) return; + } + else + { + if (scan->pagecount < bestn) + { + bestn = scan->pagecount; + best = scan; + } + scan = scan->next; + } + } + /* Still not enough. Split the best block if there is one, allocate + new pages otherwise */ + if (!best) + add_single_pages(alloc_new(n, NULL)); + else if (best->pagecount - n < K) + { + unlink_page(&unused_pages, best); + add_single_pages(best); + } + else + add_single_pages(alloc_split(best, n, NULL)); +} + + +struct page *alloc_single_page(struct page *next) +{ + struct page *p; + + if (!single_pages) + { + scavenge_single_pages(PAGE_GROUP_SIZE); + } + ASSERT_FREE(single_pages); + p = single_pages; + single_pages = p->next; + p->next = next; + + single_page_count--; + + return p; +} + +void free_single_page(region r, struct page *p) +/* Assumes freepages_lock held */ +{ +#ifndef NMEMDEBUG + ASSERT_INUSE(p, r); + set_page_region(PAGENB(p), FREEPAGE); +#endif + + /* Don't keep too many single pages (a small fraction of total + allocated pages) */ + if (single_page_count > PAGE_GROUP_SIZE * 2) + { + p->pagecount = 1; + coalesce(p); + } + else + { + p->next = single_pages; + single_pages = p; + single_page_count++; + } +} diff --git a/src/libcompat/regex.c b/src/libcompat/regex.c new file mode 100644 index 0000000..440194a --- /dev/null +++ b/src/libcompat/regex.c @@ -0,0 +1,6271 @@ +/* Extended regular expression matching and search library, + version 0.12. + (Implements POSIX draft P1003.2/D11.2, except for some of the + internationalization features.) + Copyright (C) 1993-1999, 2000 Free Software Foundation, Inc. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* AIX requires this to be the first thing in the file. */ +#if defined _AIX && !defined REGEX_MALLOC + #pragma alloca +#endif + +#undef _GNU_SOURCE +#define _GNU_SOURCE + +#ifdef HAVE_CONFIG_H +# include +#endif + +#ifndef PARAMS +# if defined __GNUC__ || (defined __STDC__ && __STDC__) +# define PARAMS(args) args +# else +# define PARAMS(args) () +# endif /* GCC. */ +#endif /* Not PARAMS. */ + +#if defined STDC_HEADERS && !defined emacs +# include +#else +/* We need this for `regex.h', and perhaps for the Emacs include files. */ +# include +#endif + +#define WIDE_CHAR_SUPPORT (HAVE_WCTYPE_H && HAVE_WCHAR_H && HAVE_BTOWC) + +/* For platform which support the ISO C amendement 1 functionality we + support user defined character classes. */ +#if defined _LIBC || WIDE_CHAR_SUPPORT +/* Solaris 2.5 has a bug: must be included before . */ +# include +# include +#endif + +#ifdef _LIBC +/* We have to keep the namespace clean. */ +# define regfree(preg) __regfree (preg) +# define regexec(pr, st, nm, pm, ef) __regexec (pr, st, nm, pm, ef) +# define regcomp(preg, pattern, cflags) __regcomp (preg, pattern, cflags) +# define regerror(errcode, preg, errbuf, errbuf_size) \ + __regerror(errcode, preg, errbuf, errbuf_size) +# define re_set_registers(bu, re, nu, st, en) \ + __re_set_registers (bu, re, nu, st, en) +# define re_match_2(bufp, string1, size1, string2, size2, pos, regs, stop) \ + __re_match_2 (bufp, string1, size1, string2, size2, pos, regs, stop) +# define re_match(bufp, string, size, pos, regs) \ + __re_match (bufp, string, size, pos, regs) +# define re_search(bufp, string, size, startpos, range, regs) \ + __re_search (bufp, string, size, startpos, range, regs) +# define re_compile_pattern(pattern, length, bufp) \ + __re_compile_pattern (pattern, length, bufp) +# define re_set_syntax(syntax) __re_set_syntax (syntax) +# define re_search_2(bufp, st1, s1, st2, s2, startpos, range, regs, stop) \ + __re_search_2 (bufp, st1, s1, st2, s2, startpos, range, regs, stop) +# define re_compile_fastmap(bufp) __re_compile_fastmap (bufp) + +# define btowc __btowc + +/* We are also using some library internals. */ +# include +# include +# include +#endif + +/* This is for other GNU distributions with internationalized messages. */ +#if HAVE_LIBINTL_H || defined _LIBC +# include +# ifdef _LIBC +# undef gettext +# define gettext(msgid) __dcgettext ("libc", msgid, LC_MESSAGES) +# endif +#else +# define gettext(msgid) (msgid) +#endif + +#ifndef gettext_noop +/* This define is so xgettext can find the internationalizable + strings. */ +# define gettext_noop(String) String +#endif + +/* The `emacs' switch turns on certain matching commands + that make sense only in Emacs. */ +#ifdef emacs + +# include "lisp.h" +# include "buffer.h" +# include "syntax.h" + +#else /* not emacs */ + +/* If we are not linking with Emacs proper, + we can't use the relocating allocator + even if config.h says that we can. */ +# undef REL_ALLOC + +# if defined STDC_HEADERS || defined _LIBC +# include +# else +char *malloc (); +char *realloc (); +# endif + +/* When used in Emacs's lib-src, we need to get bzero and bcopy somehow. + If nothing else has been done, use the method below. */ +# ifdef INHIBIT_STRING_HEADER +# if !(defined HAVE_BZERO && defined HAVE_BCOPY) +# if !defined bzero && !defined bcopy +# undef INHIBIT_STRING_HEADER +# endif +# endif +# endif + +/* This is the normal way of making sure we have a bcopy and a bzero. + This is used in most programs--a few other programs avoid this + by defining INHIBIT_STRING_HEADER. */ +# ifndef INHIBIT_STRING_HEADER +# if defined HAVE_STRING_H || defined STDC_HEADERS || defined _LIBC +# include +# ifndef bzero +# ifndef _LIBC +# define bzero(s, n) (memset (s, '\0', n), (s)) +# else +# define bzero(s, n) __bzero (s, n) +# endif +# endif +# else +# include +# ifndef memcmp +# define memcmp(s1, s2, n) bcmp (s1, s2, n) +# endif +# ifndef memcpy +# define memcpy(d, s, n) (bcopy (s, d, n), (d)) +# endif +# endif +# endif + +/* Define the syntax stuff for \<, \>, etc. */ + +/* This must be nonzero for the wordchar and notwordchar pattern + commands in re_match_2. */ +# ifndef Sword +# define Sword 1 +# endif + +# ifdef SWITCH_ENUM_BUG +# define SWITCH_ENUM_CAST(x) ((int)(x)) +# else +# define SWITCH_ENUM_CAST(x) (x) +# endif + +#endif /* not emacs */ + +#if defined _LIBC || HAVE_LIMITS_H +# include +#endif + +#ifndef MB_LEN_MAX +# define MB_LEN_MAX 1 +#endif + +/* Get the interface, including the syntax bits. */ +#include + +/* isalpha etc. are used for the character classes. */ +#include + +/* Jim Meyering writes: + + "... Some ctype macros are valid only for character codes that + isascii says are ASCII (SGI's IRIX-4.0.5 is one such system --when + using /bin/cc or gcc but without giving an ansi option). So, all + ctype uses should be through macros like ISPRINT... If + STDC_HEADERS is defined, then autoconf has verified that the ctype + macros don't need to be guarded with references to isascii. ... + Defining isascii to 1 should let any compiler worth its salt + eliminate the && through constant folding." + Solaris defines some of these symbols so we must undefine them first. */ + +#undef ISASCII +#if defined STDC_HEADERS || (!defined isascii && !defined HAVE_ISASCII) +# define ISASCII(c) 1 +#else +# define ISASCII(c) isascii(c) +#endif + +#ifdef isblank +# define ISBLANK(c) (ISASCII (c) && isblank (c)) +#else +# define ISBLANK(c) ((c) == ' ' || (c) == '\t') +#endif +#ifdef isgraph +# define ISGRAPH(c) (ISASCII (c) && isgraph (c)) +#else +# define ISGRAPH(c) (ISASCII (c) && isprint (c) && !isspace (c)) +#endif + +#undef ISPRINT +#define ISPRINT(c) (ISASCII (c) && isprint (c)) +#define ISDIGIT(c) (ISASCII (c) && isdigit (c)) +#define ISALNUM(c) (ISASCII (c) && isalnum (c)) +#define ISALPHA(c) (ISASCII (c) && isalpha (c)) +#define ISCNTRL(c) (ISASCII (c) && iscntrl (c)) +#define ISLOWER(c) (ISASCII (c) && islower (c)) +#define ISPUNCT(c) (ISASCII (c) && ispunct (c)) +#define ISSPACE(c) (ISASCII (c) && isspace (c)) +#define ISUPPER(c) (ISASCII (c) && isupper (c)) +#define ISXDIGIT(c) (ISASCII (c) && isxdigit (c)) + +#ifdef _tolower +# define TOLOWER(c) _tolower(c) +#else +# define TOLOWER(c) tolower(c) +#endif + +#ifndef NULL +# define NULL (void *)0 +#endif + +/* We remove any previous definition of `SIGN_EXTEND_CHAR', + since ours (we hope) works properly with all combinations of + machines, compilers, `char' and `unsigned char' argument types. + (Per Bothner suggested the basic approach.) */ +#undef SIGN_EXTEND_CHAR +#if __STDC__ +# define SIGN_EXTEND_CHAR(c) ((signed char) (c)) +#else /* not __STDC__ */ +/* As in Harbison and Steele. */ +# define SIGN_EXTEND_CHAR(c) ((((unsigned char) (c)) ^ 128) - 128) +#endif + +#ifndef emacs +/* How many characters in the character set. */ +# define CHAR_SET_SIZE 256 + +# ifdef SYNTAX_TABLE + +extern char *re_syntax_table; + +# else /* not SYNTAX_TABLE */ + +static char re_syntax_table[CHAR_SET_SIZE]; + +static void +init_syntax_once () +{ + register int c; + static int done = 0; + + if (done) + return; + bzero (re_syntax_table, sizeof re_syntax_table); + + for (c = 0; c < CHAR_SET_SIZE; ++c) + if (ISALNUM (c)) + re_syntax_table[c] = Sword; + + re_syntax_table['_'] = Sword; + + done = 1; +} + +# endif /* not SYNTAX_TABLE */ + +# define SYNTAX(c) re_syntax_table[(unsigned char) (c)] + +#endif /* emacs */ + +/* Should we use malloc or alloca? If REGEX_MALLOC is not defined, we + use `alloca' instead of `malloc'. This is because using malloc in + re_search* or re_match* could cause memory leaks when C-g is used in + Emacs; also, malloc is slower and causes storage fragmentation. On + the other hand, malloc is more portable, and easier to debug. + + Because we sometimes use alloca, some routines have to be macros, + not functions -- `alloca'-allocated space disappears at the end of the + function it is called in. */ + +#ifdef REGEX_MALLOC + +# define REGEX_ALLOCATE malloc +# define REGEX_REALLOCATE(source, osize, nsize) realloc (source, nsize) +# define REGEX_FREE free + +#else /* not REGEX_MALLOC */ + +/* Emacs already defines alloca, sometimes. */ +# ifndef alloca + +/* Make alloca work the best possible way. */ +# ifdef __GNUC__ +# define alloca __builtin_alloca +# else /* not __GNUC__ */ +# if HAVE_ALLOCA_H +# include +# endif /* HAVE_ALLOCA_H */ +# endif /* not __GNUC__ */ + +# endif /* not alloca */ + +# define REGEX_ALLOCATE alloca + +/* Assumes a `char *destination' variable. */ +# define REGEX_REALLOCATE(source, osize, nsize) \ + (destination = (char *) alloca (nsize), \ + memcpy (destination, source, osize)) + +/* No need to do anything to free, after alloca. */ +# define REGEX_FREE(arg) ((void)0) /* Do nothing! But inhibit gcc warning. */ + +#endif /* not REGEX_MALLOC */ + +/* Define how to allocate the failure stack. */ + +#if defined REL_ALLOC && defined REGEX_MALLOC + +# define REGEX_ALLOCATE_STACK(size) \ + r_alloc (&failure_stack_ptr, (size)) +# define REGEX_REALLOCATE_STACK(source, osize, nsize) \ + r_re_alloc (&failure_stack_ptr, (nsize)) +# define REGEX_FREE_STACK(ptr) \ + r_alloc_free (&failure_stack_ptr) + +#else /* not using relocating allocator */ + +# ifdef REGEX_MALLOC + +# define REGEX_ALLOCATE_STACK malloc +# define REGEX_REALLOCATE_STACK(source, osize, nsize) realloc (source, nsize) +# define REGEX_FREE_STACK free + +# else /* not REGEX_MALLOC */ + +# define REGEX_ALLOCATE_STACK alloca + +# define REGEX_REALLOCATE_STACK(source, osize, nsize) \ + REGEX_REALLOCATE (source, osize, nsize) +/* No need to explicitly free anything. */ +# define REGEX_FREE_STACK(arg) + +# endif /* not REGEX_MALLOC */ +#endif /* not using relocating allocator */ + + +/* True if `size1' is non-NULL and PTR is pointing anywhere inside + `string1' or just past its end. This works if PTR is NULL, which is + a good thing. */ +#define FIRST_STRING_P(ptr) \ + (size1 && string1 <= (ptr) && (ptr) <= string1 + size1) + +/* (Re)Allocate N items of type T using malloc, or fail. */ +#define TALLOC(n, t) ((t *) malloc ((n) * sizeof (t))) +#define RETALLOC(addr, n, t) ((addr) = (t *) realloc (addr, (n) * sizeof (t))) +#define RETALLOC_IF(addr, n, t) \ + if (addr) RETALLOC((addr), (n), t); else (addr) = TALLOC ((n), t) +#define REGEX_TALLOC(n, t) ((t *) REGEX_ALLOCATE ((n) * sizeof (t))) + +#define BYTEWIDTH 8 /* In bits. */ + +#define STREQ(s1, s2) ((strcmp (s1, s2) == 0)) + +#undef MAX +#undef MIN +#define MAX(a, b) ((a) > (b) ? (a) : (b)) +#define MIN(a, b) ((a) < (b) ? (a) : (b)) + +typedef char boolean; +#define false 0 +#define true 1 + +static int re_match_2_internal PARAMS ((struct re_pattern_buffer *bufp, + const char *string1, int size1, + const char *string2, int size2, + int pos, + struct re_registers *regs, + int stop)); + +/* These are the command codes that appear in compiled regular + expressions. Some opcodes are followed by argument bytes. A + command code can specify any interpretation whatsoever for its + arguments. Zero bytes may appear in the compiled regular expression. */ + +typedef enum +{ + no_op = 0, + + /* Succeed right away--no more backtracking. */ + succeed, + + /* Followed by one byte giving n, then by n literal bytes. */ + exactn, + + /* Matches any (more or less) character. */ + anychar, + + /* Matches any one char belonging to specified set. First + following byte is number of bitmap bytes. Then come bytes + for a bitmap saying which chars are in. Bits in each byte + are ordered low-bit-first. A character is in the set if its + bit is 1. A character too large to have a bit in the map is + automatically not in the set. */ + charset, + + /* Same parameters as charset, but match any character that is + not one of those specified. */ + charset_not, + + /* Start remembering the text that is matched, for storing in a + register. Followed by one byte with the register number, in + the range 0 to one less than the pattern buffer's re_nsub + field. Then followed by one byte with the number of groups + inner to this one. (This last has to be part of the + start_memory only because we need it in the on_failure_jump + of re_match_2.) */ + start_memory, + + /* Stop remembering the text that is matched and store it in a + memory register. Followed by one byte with the register + number, in the range 0 to one less than `re_nsub' in the + pattern buffer, and one byte with the number of inner groups, + just like `start_memory'. (We need the number of inner + groups here because we don't have any easy way of finding the + corresponding start_memory when we're at a stop_memory.) */ + stop_memory, + + /* Match a duplicate of something remembered. Followed by one + byte containing the register number. */ + duplicate, + + /* Fail unless at beginning of line. */ + begline, + + /* Fail unless at end of line. */ + endline, + + /* Succeeds if at beginning of buffer (if emacs) or at beginning + of string to be matched (if not). */ + begbuf, + + /* Analogously, for end of buffer/string. */ + endbuf, + + /* Followed by two byte relative address to which to jump. */ + jump, + + /* Same as jump, but marks the end of an alternative. */ + jump_past_alt, + + /* Followed by two-byte relative address of place to resume at + in case of failure. */ + on_failure_jump, + + /* Like on_failure_jump, but pushes a placeholder instead of the + current string position when executed. */ + on_failure_keep_string_jump, + + /* Throw away latest failure point and then jump to following + two-byte relative address. */ + pop_failure_jump, + + /* Change to pop_failure_jump if know won't have to backtrack to + match; otherwise change to jump. This is used to jump + back to the beginning of a repeat. If what follows this jump + clearly won't match what the repeat does, such that we can be + sure that there is no use backtracking out of repetitions + already matched, then we change it to a pop_failure_jump. + Followed by two-byte address. */ + maybe_pop_jump, + + /* Jump to following two-byte address, and push a dummy failure + point. This failure point will be thrown away if an attempt + is made to use it for a failure. A `+' construct makes this + before the first repeat. Also used as an intermediary kind + of jump when compiling an alternative. */ + dummy_failure_jump, + + /* Push a dummy failure point and continue. Used at the end of + alternatives. */ + push_dummy_failure, + + /* Followed by two-byte relative address and two-byte number n. + After matching N times, jump to the address upon failure. */ + succeed_n, + + /* Followed by two-byte relative address, and two-byte number n. + Jump to the address N times, then fail. */ + jump_n, + + /* Set the following two-byte relative address to the + subsequent two-byte number. The address *includes* the two + bytes of number. */ + set_number_at, + + wordchar, /* Matches any word-constituent character. */ + notwordchar, /* Matches any char that is not a word-constituent. */ + + wordbeg, /* Succeeds if at word beginning. */ + wordend, /* Succeeds if at word end. */ + + wordbound, /* Succeeds if at a word boundary. */ + notwordbound /* Succeeds if not at a word boundary. */ + +#ifdef emacs + ,before_dot, /* Succeeds if before point. */ + at_dot, /* Succeeds if at point. */ + after_dot, /* Succeeds if after point. */ + + /* Matches any character whose syntax is specified. Followed by + a byte which contains a syntax code, e.g., Sword. */ + syntaxspec, + + /* Matches any character whose syntax is not that specified. */ + notsyntaxspec +#endif /* emacs */ +} re_opcode_t; + +/* Common operations on the compiled pattern. */ + +/* Store NUMBER in two contiguous bytes starting at DESTINATION. */ + +#define STORE_NUMBER(destination, number) \ + do { \ + (destination)[0] = (number) & 0377; \ + (destination)[1] = (number) >> 8; \ + } while (0) + +/* Same as STORE_NUMBER, except increment DESTINATION to + the byte after where the number is stored. Therefore, DESTINATION + must be an lvalue. */ + +#define STORE_NUMBER_AND_INCR(destination, number) \ + do { \ + STORE_NUMBER (destination, number); \ + (destination) += 2; \ + } while (0) + +/* Put into DESTINATION a number stored in two contiguous bytes starting + at SOURCE. */ + +#define EXTRACT_NUMBER(destination, source) \ + do { \ + (destination) = *(source) & 0377; \ + (destination) += SIGN_EXTEND_CHAR (*((source) + 1)) << 8; \ + } while (0) + +#ifdef DEBUG +static void extract_number _RE_ARGS ((int *dest, unsigned char *source)); +static void +extract_number (dest, source) + int *dest; + unsigned char *source; +{ + int temp = SIGN_EXTEND_CHAR (*(source + 1)); + *dest = *source & 0377; + *dest += temp << 8; +} + +# ifndef EXTRACT_MACROS /* To debug the macros. */ +# undef EXTRACT_NUMBER +# define EXTRACT_NUMBER(dest, src) extract_number (&dest, src) +# endif /* not EXTRACT_MACROS */ + +#endif /* DEBUG */ + +/* Same as EXTRACT_NUMBER, except increment SOURCE to after the number. + SOURCE must be an lvalue. */ + +#define EXTRACT_NUMBER_AND_INCR(destination, source) \ + do { \ + EXTRACT_NUMBER (destination, source); \ + (source) += 2; \ + } while (0) + +#ifdef DEBUG +static void extract_number_and_incr _RE_ARGS ((int *destination, + unsigned char **source)); +static void +extract_number_and_incr (destination, source) + int *destination; + unsigned char **source; +{ + extract_number (destination, *source); + *source += 2; +} + +# ifndef EXTRACT_MACROS +# undef EXTRACT_NUMBER_AND_INCR +# define EXTRACT_NUMBER_AND_INCR(dest, src) \ + extract_number_and_incr (&dest, &src) +# endif /* not EXTRACT_MACROS */ + +#endif /* DEBUG */ + +/* If DEBUG is defined, Regex prints many voluminous messages about what + it is doing (if the variable `debug' is nonzero). If linked with the + main program in `iregex.c', you can enter patterns and strings + interactively. And if linked with the main program in `main.c' and + the other test files, you can run the already-written tests. */ + +#ifdef DEBUG + +/* We use standard I/O for debugging. */ +# include + +/* It is useful to test things that ``must'' be true when debugging. */ +# include + +static int debug; + +# define DEBUG_STATEMENT(e) e +# define DEBUG_PRINT1(x) if (debug) printf (x) +# define DEBUG_PRINT2(x1, x2) if (debug) printf (x1, x2) +# define DEBUG_PRINT3(x1, x2, x3) if (debug) printf (x1, x2, x3) +# define DEBUG_PRINT4(x1, x2, x3, x4) if (debug) printf (x1, x2, x3, x4) +# define DEBUG_PRINT_COMPILED_PATTERN(p, s, e) \ + if (debug) print_partial_compiled_pattern (s, e) +# define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2) \ + if (debug) print_double_string (w, s1, sz1, s2, sz2) + + +/* Print the fastmap in human-readable form. */ + +void +print_fastmap (fastmap) + char *fastmap; +{ + unsigned was_a_range = 0; + unsigned i = 0; + + while (i < (1 << BYTEWIDTH)) + { + if (fastmap[i++]) + { + was_a_range = 0; + putchar (i - 1); + while (i < (1 << BYTEWIDTH) && fastmap[i]) + { + was_a_range = 1; + i++; + } + if (was_a_range) + { + printf ("-"); + putchar (i - 1); + } + } + } + putchar ('\n'); +} + + +/* Print a compiled pattern string in human-readable form, starting at + the START pointer into it and ending just before the pointer END. */ + +void +print_partial_compiled_pattern (start, end) + unsigned char *start; + unsigned char *end; +{ + int mcnt, mcnt2; + unsigned char *p1; + unsigned char *p = start; + unsigned char *pend = end; + + if (start == NULL) + { + printf ("(null)\n"); + return; + } + + /* Loop over pattern commands. */ + while (p < pend) + { +#ifdef _LIBC + printf ("%t:\t", p - start); +#else + printf ("%ld:\t", (long int) (p - start)); +#endif + + switch ((re_opcode_t) *p++) + { + case no_op: + printf ("/no_op"); + break; + + case exactn: + mcnt = *p++; + printf ("/exactn/%d", mcnt); + do + { + putchar ('/'); + putchar (*p++); + } + while (--mcnt); + break; + + case start_memory: + mcnt = *p++; + printf ("/start_memory/%d/%d", mcnt, *p++); + break; + + case stop_memory: + mcnt = *p++; + printf ("/stop_memory/%d/%d", mcnt, *p++); + break; + + case duplicate: + printf ("/duplicate/%d", *p++); + break; + + case anychar: + printf ("/anychar"); + break; + + case charset: + case charset_not: + { + register int c, last = -100; + register int in_range = 0; + + printf ("/charset [%s", + (re_opcode_t) *(p - 1) == charset_not ? "^" : ""); + + assert (p + *p < pend); + + for (c = 0; c < 256; c++) + if (c / 8 < *p + && (p[1 + (c/8)] & (1 << (c % 8)))) + { + /* Are we starting a range? */ + if (last + 1 == c && ! in_range) + { + putchar ('-'); + in_range = 1; + } + /* Have we broken a range? */ + else if (last + 1 != c && in_range) + { + putchar (last); + in_range = 0; + } + + if (! in_range) + putchar (c); + + last = c; + } + + if (in_range) + putchar (last); + + putchar (']'); + + p += 1 + *p; + } + break; + + case begline: + printf ("/begline"); + break; + + case endline: + printf ("/endline"); + break; + + case on_failure_jump: + extract_number_and_incr (&mcnt, &p); +#ifdef _LIBC + printf ("/on_failure_jump to %t", p + mcnt - start); +#else + printf ("/on_failure_jump to %ld", (long int) (p + mcnt - start)); +#endif + break; + + case on_failure_keep_string_jump: + extract_number_and_incr (&mcnt, &p); +#ifdef _LIBC + printf ("/on_failure_keep_string_jump to %t", p + mcnt - start); +#else + printf ("/on_failure_keep_string_jump to %ld", + (long int) (p + mcnt - start)); +#endif + break; + + case dummy_failure_jump: + extract_number_and_incr (&mcnt, &p); +#ifdef _LIBC + printf ("/dummy_failure_jump to %t", p + mcnt - start); +#else + printf ("/dummy_failure_jump to %ld", (long int) (p + mcnt - start)); +#endif + break; + + case push_dummy_failure: + printf ("/push_dummy_failure"); + break; + + case maybe_pop_jump: + extract_number_and_incr (&mcnt, &p); +#ifdef _LIBC + printf ("/maybe_pop_jump to %t", p + mcnt - start); +#else + printf ("/maybe_pop_jump to %ld", (long int) (p + mcnt - start)); +#endif + break; + + case pop_failure_jump: + extract_number_and_incr (&mcnt, &p); +#ifdef _LIBC + printf ("/pop_failure_jump to %t", p + mcnt - start); +#else + printf ("/pop_failure_jump to %ld", (long int) (p + mcnt - start)); +#endif + break; + + case jump_past_alt: + extract_number_and_incr (&mcnt, &p); +#ifdef _LIBC + printf ("/jump_past_alt to %t", p + mcnt - start); +#else + printf ("/jump_past_alt to %ld", (long int) (p + mcnt - start)); +#endif + break; + + case jump: + extract_number_and_incr (&mcnt, &p); +#ifdef _LIBC + printf ("/jump to %t", p + mcnt - start); +#else + printf ("/jump to %ld", (long int) (p + mcnt - start)); +#endif + break; + + case succeed_n: + extract_number_and_incr (&mcnt, &p); + p1 = p + mcnt; + extract_number_and_incr (&mcnt2, &p); +#ifdef _LIBC + printf ("/succeed_n to %t, %d times", p1 - start, mcnt2); +#else + printf ("/succeed_n to %ld, %d times", + (long int) (p1 - start), mcnt2); +#endif + break; + + case jump_n: + extract_number_and_incr (&mcnt, &p); + p1 = p + mcnt; + extract_number_and_incr (&mcnt2, &p); + printf ("/jump_n to %d, %d times", p1 - start, mcnt2); + break; + + case set_number_at: + extract_number_and_incr (&mcnt, &p); + p1 = p + mcnt; + extract_number_and_incr (&mcnt2, &p); +#ifdef _LIBC + printf ("/set_number_at location %t to %d", p1 - start, mcnt2); +#else + printf ("/set_number_at location %ld to %d", + (long int) (p1 - start), mcnt2); +#endif + break; + + case wordbound: + printf ("/wordbound"); + break; + + case notwordbound: + printf ("/notwordbound"); + break; + + case wordbeg: + printf ("/wordbeg"); + break; + + case wordend: + printf ("/wordend"); + +# ifdef emacs + case before_dot: + printf ("/before_dot"); + break; + + case at_dot: + printf ("/at_dot"); + break; + + case after_dot: + printf ("/after_dot"); + break; + + case syntaxspec: + printf ("/syntaxspec"); + mcnt = *p++; + printf ("/%d", mcnt); + break; + + case notsyntaxspec: + printf ("/notsyntaxspec"); + mcnt = *p++; + printf ("/%d", mcnt); + break; +# endif /* emacs */ + + case wordchar: + printf ("/wordchar"); + break; + + case notwordchar: + printf ("/notwordchar"); + break; + + case begbuf: + printf ("/begbuf"); + break; + + case endbuf: + printf ("/endbuf"); + break; + + default: + printf ("?%d", *(p-1)); + } + + putchar ('\n'); + } + +#ifdef _LIBC + printf ("%t:\tend of pattern.\n", p - start); +#else + printf ("%ld:\tend of pattern.\n", (long int) (p - start)); +#endif +} + + +void +print_compiled_pattern (bufp) + struct re_pattern_buffer *bufp; +{ + unsigned char *buffer = bufp->buffer; + + print_partial_compiled_pattern (buffer, buffer + bufp->used); + printf ("%ld bytes used/%ld bytes allocated.\n", + bufp->used, bufp->allocated); + + if (bufp->fastmap_accurate && bufp->fastmap) + { + printf ("fastmap: "); + print_fastmap (bufp->fastmap); + } + +#ifdef _LIBC + printf ("re_nsub: %Zd\t", bufp->re_nsub); +#else + printf ("re_nsub: %ld\t", (long int) bufp->re_nsub); +#endif + printf ("regs_alloc: %d\t", bufp->regs_allocated); + printf ("can_be_null: %d\t", bufp->can_be_null); + printf ("newline_anchor: %d\n", bufp->newline_anchor); + printf ("no_sub: %d\t", bufp->no_sub); + printf ("not_bol: %d\t", bufp->not_bol); + printf ("not_eol: %d\t", bufp->not_eol); + printf ("syntax: %lx\n", bufp->syntax); + /* Perhaps we should print the translate table? */ +} + + +void +print_double_string (where, string1, size1, string2, size2) + const char *where; + const char *string1; + const char *string2; + int size1; + int size2; +{ + int this_char; + + if (where == NULL) + printf ("(null)"); + else + { + if (FIRST_STRING_P (where)) + { + for (this_char = where - string1; this_char < size1; this_char++) + putchar (string1[this_char]); + + where = string2; + } + + for (this_char = where - string2; this_char < size2; this_char++) + putchar (string2[this_char]); + } +} + +void +printchar (c) + int c; +{ + putc (c, stderr); +} + +#else /* not DEBUG */ + +# undef assert +# define assert(e) + +# define DEBUG_STATEMENT(e) +# define DEBUG_PRINT1(x) +# define DEBUG_PRINT2(x1, x2) +# define DEBUG_PRINT3(x1, x2, x3) +# define DEBUG_PRINT4(x1, x2, x3, x4) +# define DEBUG_PRINT_COMPILED_PATTERN(p, s, e) +# define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2) + +#endif /* not DEBUG */ + +/* Set by `re_set_syntax' to the current regexp syntax to recognize. Can + also be assigned to arbitrarily: each pattern buffer stores its own + syntax, so it can be changed between regex compilations. */ +/* This has no initializer because initialized variables in Emacs + become read-only after dumping. */ +reg_syntax_t re_syntax_options; + + +/* Specify the precise syntax of regexps for compilation. This provides + for compatibility for various utilities which historically have + different, incompatible syntaxes. + + The argument SYNTAX is a bit mask comprised of the various bits + defined in regex.h. We return the old syntax. */ + +reg_syntax_t +re_set_syntax (syntax) + reg_syntax_t syntax; +{ + reg_syntax_t ret = re_syntax_options; + + re_syntax_options = syntax; +#ifdef DEBUG + if (syntax & RE_DEBUG) + debug = 1; + else if (debug) /* was on but now is not */ + debug = 0; +#endif /* DEBUG */ + return ret; +} +#ifdef _LIBC +weak_alias (__re_set_syntax, re_set_syntax) +#endif + +/* This table gives an error message for each of the error codes listed + in regex.h. Obviously the order here has to be same as there. + POSIX doesn't require that we do anything for REG_NOERROR, + but why not be nice? */ + +static const char re_error_msgid[] = + { +#define REG_NOERROR_IDX 0 + gettext_noop ("Success") /* REG_NOERROR */ + "\0" +#define REG_NOMATCH_IDX (REG_NOERROR_IDX + sizeof "Success") + gettext_noop ("No match") /* REG_NOMATCH */ + "\0" +#define REG_BADPAT_IDX (REG_NOMATCH_IDX + sizeof "No match") + gettext_noop ("Invalid regular expression") /* REG_BADPAT */ + "\0" +#define REG_ECOLLATE_IDX (REG_BADPAT_IDX + sizeof "Invalid regular expression") + gettext_noop ("Invalid collation character") /* REG_ECOLLATE */ + "\0" +#define REG_ECTYPE_IDX (REG_ECOLLATE_IDX + sizeof "Invalid collation character") + gettext_noop ("Invalid character class name") /* REG_ECTYPE */ + "\0" +#define REG_EESCAPE_IDX (REG_ECTYPE_IDX + sizeof "Invalid character class name") + gettext_noop ("Trailing backslash") /* REG_EESCAPE */ + "\0" +#define REG_ESUBREG_IDX (REG_EESCAPE_IDX + sizeof "Trailing backslash") + gettext_noop ("Invalid back reference") /* REG_ESUBREG */ + "\0" +#define REG_EBRACK_IDX (REG_ESUBREG_IDX + sizeof "Invalid back reference") + gettext_noop ("Unmatched [ or [^") /* REG_EBRACK */ + "\0" +#define REG_EPAREN_IDX (REG_EBRACK_IDX + sizeof "Unmatched [ or [^") + gettext_noop ("Unmatched ( or \\(") /* REG_EPAREN */ + "\0" +#define REG_EBRACE_IDX (REG_EPAREN_IDX + sizeof "Unmatched ( or \\(") + gettext_noop ("Unmatched \\{") /* REG_EBRACE */ + "\0" +#define REG_BADBR_IDX (REG_EBRACE_IDX + sizeof "Unmatched \\{") + gettext_noop ("Invalid content of \\{\\}") /* REG_BADBR */ + "\0" +#define REG_ERANGE_IDX (REG_BADBR_IDX + sizeof "Invalid content of \\{\\}") + gettext_noop ("Invalid range end") /* REG_ERANGE */ + "\0" +#define REG_ESPACE_IDX (REG_ERANGE_IDX + sizeof "Invalid range end") + gettext_noop ("Memory exhausted") /* REG_ESPACE */ + "\0" +#define REG_BADRPT_IDX (REG_ESPACE_IDX + sizeof "Memory exhausted") + gettext_noop ("Invalid preceding regular expression") /* REG_BADRPT */ + "\0" +#define REG_EEND_IDX (REG_BADRPT_IDX + sizeof "Invalid preceding regular expression") + gettext_noop ("Premature end of regular expression") /* REG_EEND */ + "\0" +#define REG_ESIZE_IDX (REG_EEND_IDX + sizeof "Premature end of regular expression") + gettext_noop ("Regular expression too big") /* REG_ESIZE */ + "\0" +#define REG_ERPAREN_IDX (REG_ESIZE_IDX + sizeof "Regular expression too big") + gettext_noop ("Unmatched ) or \\)") /* REG_ERPAREN */ + }; + +static const size_t re_error_msgid_idx[] = + { + REG_NOERROR_IDX, + REG_NOMATCH_IDX, + REG_BADPAT_IDX, + REG_ECOLLATE_IDX, + REG_ECTYPE_IDX, + REG_EESCAPE_IDX, + REG_ESUBREG_IDX, + REG_EBRACK_IDX, + REG_EPAREN_IDX, + REG_EBRACE_IDX, + REG_BADBR_IDX, + REG_ERANGE_IDX, + REG_ESPACE_IDX, + REG_BADRPT_IDX, + REG_EEND_IDX, + REG_ESIZE_IDX, + REG_ERPAREN_IDX + }; + +/* Avoiding alloca during matching, to placate r_alloc. */ + +/* Define MATCH_MAY_ALLOCATE unless we need to make sure that the + searching and matching functions should not call alloca. On some + systems, alloca is implemented in terms of malloc, and if we're + using the relocating allocator routines, then malloc could cause a + relocation, which might (if the strings being searched are in the + ralloc heap) shift the data out from underneath the regexp + routines. + + Here's another reason to avoid allocation: Emacs + processes input from X in a signal handler; processing X input may + call malloc; if input arrives while a matching routine is calling + malloc, then we're scrod. But Emacs can't just block input while + calling matching routines; then we don't notice interrupts when + they come in. So, Emacs blocks input around all regexp calls + except the matching calls, which it leaves unprotected, in the + faith that they will not malloc. */ + +/* Normally, this is fine. */ +#define MATCH_MAY_ALLOCATE + +/* When using GNU C, we are not REALLY using the C alloca, no matter + what config.h may say. So don't take precautions for it. */ +#ifdef __GNUC__ +# undef C_ALLOCA +#endif + +/* The match routines may not allocate if (1) they would do it with malloc + and (2) it's not safe for them to use malloc. + Note that if REL_ALLOC is defined, matching would not use malloc for the + failure stack, but we would still use it for the register vectors; + so REL_ALLOC should not affect this. */ +#if (defined C_ALLOCA || defined REGEX_MALLOC) && defined emacs +# undef MATCH_MAY_ALLOCATE +#endif + + +/* Failure stack declarations and macros; both re_compile_fastmap and + re_match_2 use a failure stack. These have to be macros because of + REGEX_ALLOCATE_STACK. */ + + +/* Number of failure points for which to initially allocate space + when matching. If this number is exceeded, we allocate more + space, so it is not a hard limit. */ +#ifndef INIT_FAILURE_ALLOC +# define INIT_FAILURE_ALLOC 5 +#endif + +/* Roughly the maximum number of failure points on the stack. Would be + exactly that if always used MAX_FAILURE_ITEMS items each time we failed. + This is a variable only so users of regex can assign to it; we never + change it ourselves. */ + +#ifdef INT_IS_16BIT + +# if defined MATCH_MAY_ALLOCATE +/* 4400 was enough to cause a crash on Alpha OSF/1, + whose default stack limit is 2mb. */ +long int re_max_failures = 4000; +# else +long int re_max_failures = 2000; +# endif + +union fail_stack_elt +{ + unsigned char *pointer; + long int integer; +}; + +typedef union fail_stack_elt fail_stack_elt_t; + +typedef struct +{ + fail_stack_elt_t *stack; + unsigned long int size; + unsigned long int avail; /* Offset of next open position. */ +} fail_stack_type; + +#else /* not INT_IS_16BIT */ + +# if defined MATCH_MAY_ALLOCATE +/* 4400 was enough to cause a crash on Alpha OSF/1, + whose default stack limit is 2mb. */ +int re_max_failures = 4000; +# else +int re_max_failures = 2000; +# endif + +union fail_stack_elt +{ + unsigned char *pointer; + int integer; +}; + +typedef union fail_stack_elt fail_stack_elt_t; + +typedef struct +{ + fail_stack_elt_t *stack; + unsigned size; + unsigned avail; /* Offset of next open position. */ +} fail_stack_type; + +#endif /* INT_IS_16BIT */ + +#define FAIL_STACK_EMPTY() (fail_stack.avail == 0) +#define FAIL_STACK_PTR_EMPTY() (fail_stack_ptr->avail == 0) +#define FAIL_STACK_FULL() (fail_stack.avail == fail_stack.size) + + +/* Define macros to initialize and free the failure stack. + Do `return -2' if the alloc fails. */ + +#ifdef MATCH_MAY_ALLOCATE +# define INIT_FAIL_STACK() \ + do { \ + fail_stack.stack = (fail_stack_elt_t *) \ + REGEX_ALLOCATE_STACK (INIT_FAILURE_ALLOC * sizeof (fail_stack_elt_t)); \ + \ + if (fail_stack.stack == NULL) \ + return -2; \ + \ + fail_stack.size = INIT_FAILURE_ALLOC; \ + fail_stack.avail = 0; \ + } while (0) + +# define RESET_FAIL_STACK() REGEX_FREE_STACK (fail_stack.stack) +#else +# define INIT_FAIL_STACK() \ + do { \ + fail_stack.avail = 0; \ + } while (0) + +# define RESET_FAIL_STACK() +#endif + + +/* Double the size of FAIL_STACK, up to approximately `re_max_failures' items. + + Return 1 if succeeds, and 0 if either ran out of memory + allocating space for it or it was already too large. + + REGEX_REALLOCATE_STACK requires `destination' be declared. */ + +#define DOUBLE_FAIL_STACK(fail_stack) \ + ((fail_stack).size > (unsigned) (re_max_failures * MAX_FAILURE_ITEMS) \ + ? 0 \ + : ((fail_stack).stack = (fail_stack_elt_t *) \ + REGEX_REALLOCATE_STACK ((fail_stack).stack, \ + (fail_stack).size * sizeof (fail_stack_elt_t), \ + ((fail_stack).size << 1) * sizeof (fail_stack_elt_t)), \ + \ + (fail_stack).stack == NULL \ + ? 0 \ + : ((fail_stack).size <<= 1, \ + 1))) + + +/* Push pointer POINTER on FAIL_STACK. + Return 1 if was able to do so and 0 if ran out of memory allocating + space to do so. */ +#define PUSH_PATTERN_OP(POINTER, FAIL_STACK) \ + ((FAIL_STACK_FULL () \ + && !DOUBLE_FAIL_STACK (FAIL_STACK)) \ + ? 0 \ + : ((FAIL_STACK).stack[(FAIL_STACK).avail++].pointer = POINTER, \ + 1)) + +/* Push a pointer value onto the failure stack. + Assumes the variable `fail_stack'. Probably should only + be called from within `PUSH_FAILURE_POINT'. */ +#define PUSH_FAILURE_POINTER(item) \ + fail_stack.stack[fail_stack.avail++].pointer = (unsigned char *) (item) + +/* This pushes an integer-valued item onto the failure stack. + Assumes the variable `fail_stack'. Probably should only + be called from within `PUSH_FAILURE_POINT'. */ +#define PUSH_FAILURE_INT(item) \ + fail_stack.stack[fail_stack.avail++].integer = (item) + +/* Push a fail_stack_elt_t value onto the failure stack. + Assumes the variable `fail_stack'. Probably should only + be called from within `PUSH_FAILURE_POINT'. */ +#define PUSH_FAILURE_ELT(item) \ + fail_stack.stack[fail_stack.avail++] = (item) + +/* These three POP... operations complement the three PUSH... operations. + All assume that `fail_stack' is nonempty. */ +#define POP_FAILURE_POINTER() fail_stack.stack[--fail_stack.avail].pointer +#define POP_FAILURE_INT() fail_stack.stack[--fail_stack.avail].integer +#define POP_FAILURE_ELT() fail_stack.stack[--fail_stack.avail] + +/* Used to omit pushing failure point id's when we're not debugging. */ +#ifdef DEBUG +# define DEBUG_PUSH PUSH_FAILURE_INT +# define DEBUG_POP(item_addr) *(item_addr) = POP_FAILURE_INT () +#else +# define DEBUG_PUSH(item) +# define DEBUG_POP(item_addr) +#endif + + +/* Push the information about the state we will need + if we ever fail back to it. + + Requires variables fail_stack, regstart, regend, reg_info, and + num_regs_pushed be declared. DOUBLE_FAIL_STACK requires `destination' + be declared. + + Does `return FAILURE_CODE' if runs out of memory. */ + +#define PUSH_FAILURE_POINT(pattern_place, string_place, failure_code) \ + do { \ + char *destination; \ + /* Must be int, so when we don't save any registers, the arithmetic \ + of 0 + -1 isn't done as unsigned. */ \ + /* Can't be int, since there is not a shred of a guarantee that int \ + is wide enough to hold a value of something to which pointer can \ + be assigned */ \ + active_reg_t this_reg; \ + \ + DEBUG_STATEMENT (failure_id++); \ + DEBUG_STATEMENT (nfailure_points_pushed++); \ + DEBUG_PRINT2 ("\nPUSH_FAILURE_POINT #%u:\n", failure_id); \ + DEBUG_PRINT2 (" Before push, next avail: %d\n", (fail_stack).avail);\ + DEBUG_PRINT2 (" size: %d\n", (fail_stack).size);\ + \ + DEBUG_PRINT2 (" slots needed: %ld\n", NUM_FAILURE_ITEMS); \ + DEBUG_PRINT2 (" available: %d\n", REMAINING_AVAIL_SLOTS); \ + \ + /* Ensure we have enough space allocated for what we will push. */ \ + while (REMAINING_AVAIL_SLOTS < NUM_FAILURE_ITEMS) \ + { \ + if (!DOUBLE_FAIL_STACK (fail_stack)) \ + return failure_code; \ + \ + DEBUG_PRINT2 ("\n Doubled stack; size now: %d\n", \ + (fail_stack).size); \ + DEBUG_PRINT2 (" slots available: %d\n", REMAINING_AVAIL_SLOTS);\ + } \ + \ + /* Push the info, starting with the registers. */ \ + DEBUG_PRINT1 ("\n"); \ + \ + if (1) \ + for (this_reg = lowest_active_reg; this_reg <= highest_active_reg; \ + this_reg++) \ + { \ + DEBUG_PRINT2 (" Pushing reg: %lu\n", this_reg); \ + DEBUG_STATEMENT (num_regs_pushed++); \ + \ + DEBUG_PRINT2 (" start: %p\n", regstart[this_reg]); \ + PUSH_FAILURE_POINTER (regstart[this_reg]); \ + \ + DEBUG_PRINT2 (" end: %p\n", regend[this_reg]); \ + PUSH_FAILURE_POINTER (regend[this_reg]); \ + \ + DEBUG_PRINT2 (" info: %p\n ", \ + reg_info[this_reg].word.pointer); \ + DEBUG_PRINT2 (" match_null=%d", \ + REG_MATCH_NULL_STRING_P (reg_info[this_reg])); \ + DEBUG_PRINT2 (" active=%d", IS_ACTIVE (reg_info[this_reg])); \ + DEBUG_PRINT2 (" matched_something=%d", \ + MATCHED_SOMETHING (reg_info[this_reg])); \ + DEBUG_PRINT2 (" ever_matched=%d", \ + EVER_MATCHED_SOMETHING (reg_info[this_reg])); \ + DEBUG_PRINT1 ("\n"); \ + PUSH_FAILURE_ELT (reg_info[this_reg].word); \ + } \ + \ + DEBUG_PRINT2 (" Pushing low active reg: %ld\n", lowest_active_reg);\ + PUSH_FAILURE_INT (lowest_active_reg); \ + \ + DEBUG_PRINT2 (" Pushing high active reg: %ld\n", highest_active_reg);\ + PUSH_FAILURE_INT (highest_active_reg); \ + \ + DEBUG_PRINT2 (" Pushing pattern %p:\n", pattern_place); \ + DEBUG_PRINT_COMPILED_PATTERN (bufp, pattern_place, pend); \ + PUSH_FAILURE_POINTER (pattern_place); \ + \ + DEBUG_PRINT2 (" Pushing string %p: `", string_place); \ + DEBUG_PRINT_DOUBLE_STRING (string_place, string1, size1, string2, \ + size2); \ + DEBUG_PRINT1 ("'\n"); \ + PUSH_FAILURE_POINTER (string_place); \ + \ + DEBUG_PRINT2 (" Pushing failure id: %u\n", failure_id); \ + DEBUG_PUSH (failure_id); \ + } while (0) + +/* This is the number of items that are pushed and popped on the stack + for each register. */ +#define NUM_REG_ITEMS 3 + +/* Individual items aside from the registers. */ +#ifdef DEBUG +# define NUM_NONREG_ITEMS 5 /* Includes failure point id. */ +#else +# define NUM_NONREG_ITEMS 4 +#endif + +/* We push at most this many items on the stack. */ +/* We used to use (num_regs - 1), which is the number of registers + this regexp will save; but that was changed to 5 + to avoid stack overflow for a regexp with lots of parens. */ +#define MAX_FAILURE_ITEMS (5 * NUM_REG_ITEMS + NUM_NONREG_ITEMS) + +/* We actually push this many items. */ +#define NUM_FAILURE_ITEMS \ + (((0 \ + ? 0 : highest_active_reg - lowest_active_reg + 1) \ + * NUM_REG_ITEMS) \ + + NUM_NONREG_ITEMS) + +/* How many items can still be added to the stack without overflowing it. */ +#define REMAINING_AVAIL_SLOTS ((fail_stack).size - (fail_stack).avail) + + +/* Pops what PUSH_FAIL_STACK pushes. + + We restore into the parameters, all of which should be lvalues: + STR -- the saved data position. + PAT -- the saved pattern position. + LOW_REG, HIGH_REG -- the highest and lowest active registers. + REGSTART, REGEND -- arrays of string positions. + REG_INFO -- array of information about each subexpression. + + Also assumes the variables `fail_stack' and (if debugging), `bufp', + `pend', `string1', `size1', `string2', and `size2'. */ + +#define POP_FAILURE_POINT(str, pat, low_reg, high_reg, regstart, regend, reg_info)\ +{ \ + DEBUG_STATEMENT (unsigned failure_id;) \ + active_reg_t this_reg; \ + const unsigned char *string_temp; \ + \ + assert (!FAIL_STACK_EMPTY ()); \ + \ + /* Remove failure points and point to how many regs pushed. */ \ + DEBUG_PRINT1 ("POP_FAILURE_POINT:\n"); \ + DEBUG_PRINT2 (" Before pop, next avail: %d\n", fail_stack.avail); \ + DEBUG_PRINT2 (" size: %d\n", fail_stack.size); \ + \ + assert (fail_stack.avail >= NUM_NONREG_ITEMS); \ + \ + DEBUG_POP (&failure_id); \ + DEBUG_PRINT2 (" Popping failure id: %u\n", failure_id); \ + \ + /* If the saved string location is NULL, it came from an \ + on_failure_keep_string_jump opcode, and we want to throw away the \ + saved NULL, thus retaining our current position in the string. */ \ + string_temp = POP_FAILURE_POINTER (); \ + if (string_temp != NULL) \ + str = (const char *) string_temp; \ + \ + DEBUG_PRINT2 (" Popping string %p: `", str); \ + DEBUG_PRINT_DOUBLE_STRING (str, string1, size1, string2, size2); \ + DEBUG_PRINT1 ("'\n"); \ + \ + pat = (unsigned char *) POP_FAILURE_POINTER (); \ + DEBUG_PRINT2 (" Popping pattern %p:\n", pat); \ + DEBUG_PRINT_COMPILED_PATTERN (bufp, pat, pend); \ + \ + /* Restore register info. */ \ + high_reg = (active_reg_t) POP_FAILURE_INT (); \ + DEBUG_PRINT2 (" Popping high active reg: %ld\n", high_reg); \ + \ + low_reg = (active_reg_t) POP_FAILURE_INT (); \ + DEBUG_PRINT2 (" Popping low active reg: %ld\n", low_reg); \ + \ + if (1) \ + for (this_reg = high_reg; this_reg >= low_reg; this_reg--) \ + { \ + DEBUG_PRINT2 (" Popping reg: %ld\n", this_reg); \ + \ + reg_info[this_reg].word = POP_FAILURE_ELT (); \ + DEBUG_PRINT2 (" info: %p\n", \ + reg_info[this_reg].word.pointer); \ + \ + regend[this_reg] = (const char *) POP_FAILURE_POINTER (); \ + DEBUG_PRINT2 (" end: %p\n", regend[this_reg]); \ + \ + regstart[this_reg] = (const char *) POP_FAILURE_POINTER (); \ + DEBUG_PRINT2 (" start: %p\n", regstart[this_reg]); \ + } \ + else \ + { \ + for (this_reg = highest_active_reg; this_reg > high_reg; this_reg--) \ + { \ + reg_info[this_reg].word.integer = 0; \ + regend[this_reg] = 0; \ + regstart[this_reg] = 0; \ + } \ + highest_active_reg = high_reg; \ + } \ + \ + set_regs_matched_done = 0; \ + DEBUG_STATEMENT (nfailure_points_popped++); \ +} /* POP_FAILURE_POINT */ + + + +/* Structure for per-register (a.k.a. per-group) information. + Other register information, such as the + starting and ending positions (which are addresses), and the list of + inner groups (which is a bits list) are maintained in separate + variables. + + We are making a (strictly speaking) nonportable assumption here: that + the compiler will pack our bit fields into something that fits into + the type of `word', i.e., is something that fits into one item on the + failure stack. */ + + +/* Declarations and macros for re_match_2. */ + +typedef union +{ + fail_stack_elt_t word; + struct + { + /* This field is one if this group can match the empty string, + zero if not. If not yet determined, `MATCH_NULL_UNSET_VALUE'. */ +#define MATCH_NULL_UNSET_VALUE 3 + unsigned match_null_string_p : 2; + unsigned is_active : 1; + unsigned matched_something : 1; + unsigned ever_matched_something : 1; + } bits; +} register_info_type; + +#define REG_MATCH_NULL_STRING_P(R) ((R).bits.match_null_string_p) +#define IS_ACTIVE(R) ((R).bits.is_active) +#define MATCHED_SOMETHING(R) ((R).bits.matched_something) +#define EVER_MATCHED_SOMETHING(R) ((R).bits.ever_matched_something) + + +/* Call this when have matched a real character; it sets `matched' flags + for the subexpressions which we are currently inside. Also records + that those subexprs have matched. */ +#define SET_REGS_MATCHED() \ + do \ + { \ + if (!set_regs_matched_done) \ + { \ + active_reg_t r; \ + set_regs_matched_done = 1; \ + for (r = lowest_active_reg; r <= highest_active_reg; r++) \ + { \ + MATCHED_SOMETHING (reg_info[r]) \ + = EVER_MATCHED_SOMETHING (reg_info[r]) \ + = 1; \ + } \ + } \ + } \ + while (0) + +/* Registers are set to a sentinel when they haven't yet matched. */ +static char reg_unset_dummy; +#define REG_UNSET_VALUE (®_unset_dummy) +#define REG_UNSET(e) ((e) == REG_UNSET_VALUE) + +/* Subroutine declarations and macros for regex_compile. */ + +static reg_errcode_t regex_compile _RE_ARGS ((const char *pattern, size_t size, + reg_syntax_t syntax, + struct re_pattern_buffer *bufp)); +static void store_op1 _RE_ARGS ((re_opcode_t op, unsigned char *loc, int arg)); +static void store_op2 _RE_ARGS ((re_opcode_t op, unsigned char *loc, + int arg1, int arg2)); +static void insert_op1 _RE_ARGS ((re_opcode_t op, unsigned char *loc, + int arg, unsigned char *end)); +static void insert_op2 _RE_ARGS ((re_opcode_t op, unsigned char *loc, + int arg1, int arg2, unsigned char *end)); +static boolean at_begline_loc_p _RE_ARGS ((const char *pattern, const char *p, + reg_syntax_t syntax)); +static boolean at_endline_loc_p _RE_ARGS ((const char *p, const char *pend, + reg_syntax_t syntax)); +static reg_errcode_t compile_range _RE_ARGS ((unsigned int range_start, + const char **p_ptr, + const char *pend, + char *translate, + reg_syntax_t syntax, + unsigned char *b)); + +/* Fetch the next character in the uncompiled pattern---translating it + if necessary. Also cast from a signed character in the constant + string passed to us by the user to an unsigned char that we can use + as an array index (in, e.g., `translate'). */ +#ifndef PATFETCH +# define PATFETCH(c) \ + do {if (p == pend) return REG_EEND; \ + c = (unsigned char) *p++; \ + if (translate) c = (unsigned char) translate[c]; \ + } while (0) +#endif + +/* Fetch the next character in the uncompiled pattern, with no + translation. */ +#define PATFETCH_RAW(c) \ + do {if (p == pend) return REG_EEND; \ + c = (unsigned char) *p++; \ + } while (0) + +/* Go backwards one character in the pattern. */ +#define PATUNFETCH p-- + + +/* If `translate' is non-null, return translate[D], else just D. We + cast the subscript to translate because some data is declared as + `char *', to avoid warnings when a string constant is passed. But + when we use a character as a subscript we must make it unsigned. */ +#ifndef TRANSLATE +# define TRANSLATE(d) \ + (translate ? (char) translate[(unsigned char) (d)] : (d)) +#endif + + +/* Macros for outputting the compiled pattern into `buffer'. */ + +/* If the buffer isn't allocated when it comes in, use this. */ +#define INIT_BUF_SIZE 32 + +/* Make sure we have at least N more bytes of space in buffer. */ +#define GET_BUFFER_SPACE(n) \ + while ((unsigned long) (b - bufp->buffer + (n)) > bufp->allocated) \ + EXTEND_BUFFER () + +/* Make sure we have one more byte of buffer space and then add C to it. */ +#define BUF_PUSH(c) \ + do { \ + GET_BUFFER_SPACE (1); \ + *b++ = (unsigned char) (c); \ + } while (0) + + +/* Ensure we have two more bytes of buffer space and then append C1 and C2. */ +#define BUF_PUSH_2(c1, c2) \ + do { \ + GET_BUFFER_SPACE (2); \ + *b++ = (unsigned char) (c1); \ + *b++ = (unsigned char) (c2); \ + } while (0) + + +/* As with BUF_PUSH_2, except for three bytes. */ +#define BUF_PUSH_3(c1, c2, c3) \ + do { \ + GET_BUFFER_SPACE (3); \ + *b++ = (unsigned char) (c1); \ + *b++ = (unsigned char) (c2); \ + *b++ = (unsigned char) (c3); \ + } while (0) + + +/* Store a jump with opcode OP at LOC to location TO. We store a + relative address offset by the three bytes the jump itself occupies. */ +#define STORE_JUMP(op, loc, to) \ + store_op1 (op, loc, (int) ((to) - (loc) - 3)) + +/* Likewise, for a two-argument jump. */ +#define STORE_JUMP2(op, loc, to, arg) \ + store_op2 (op, loc, (int) ((to) - (loc) - 3), arg) + +/* Like `STORE_JUMP', but for inserting. Assume `b' is the buffer end. */ +#define INSERT_JUMP(op, loc, to) \ + insert_op1 (op, loc, (int) ((to) - (loc) - 3), b) + +/* Like `STORE_JUMP2', but for inserting. Assume `b' is the buffer end. */ +#define INSERT_JUMP2(op, loc, to, arg) \ + insert_op2 (op, loc, (int) ((to) - (loc) - 3), arg, b) + + +/* This is not an arbitrary limit: the arguments which represent offsets + into the pattern are two bytes long. So if 2^16 bytes turns out to + be too small, many things would have to change. */ +/* Any other compiler which, like MSC, has allocation limit below 2^16 + bytes will have to use approach similar to what was done below for + MSC and drop MAX_BUF_SIZE a bit. Otherwise you may end up + reallocating to 0 bytes. Such thing is not going to work too well. + You have been warned!! */ +#if defined _MSC_VER && !defined WIN32 +/* Microsoft C 16-bit versions limit malloc to approx 65512 bytes. + The REALLOC define eliminates a flurry of conversion warnings, + but is not required. */ +# define MAX_BUF_SIZE 65500L +# define REALLOC(p,s) realloc ((p), (size_t) (s)) +#else +# define MAX_BUF_SIZE (1L << 16) +# define REALLOC(p,s) realloc ((p), (s)) +#endif + +/* Extend the buffer by twice its current size via realloc and + reset the pointers that pointed into the old block to point to the + correct places in the new one. If extending the buffer results in it + being larger than MAX_BUF_SIZE, then flag memory exhausted. */ +#if __BOUNDED_POINTERS__ +# define SET_HIGH_BOUND(P) (__ptrhigh (P) = __ptrlow (P) + bufp->allocated) +# define MOVE_BUFFER_POINTER(P) \ + (__ptrlow (P) += incr, SET_HIGH_BOUND (P), __ptrvalue (P) += incr) +# define ELSE_EXTEND_BUFFER_HIGH_BOUND \ + else \ + { \ + SET_HIGH_BOUND (b); \ + SET_HIGH_BOUND (begalt); \ + if (fixup_alt_jump) \ + SET_HIGH_BOUND (fixup_alt_jump); \ + if (laststart) \ + SET_HIGH_BOUND (laststart); \ + if (pending_exact) \ + SET_HIGH_BOUND (pending_exact); \ + } +#else +# define MOVE_BUFFER_POINTER(P) (P) += incr +# define ELSE_EXTEND_BUFFER_HIGH_BOUND +#endif +#define EXTEND_BUFFER() \ + do { \ + unsigned char *old_buffer = bufp->buffer; \ + if (bufp->allocated == MAX_BUF_SIZE) \ + return REG_ESIZE; \ + bufp->allocated <<= 1; \ + if (bufp->allocated > MAX_BUF_SIZE) \ + bufp->allocated = MAX_BUF_SIZE; \ + bufp->buffer = (unsigned char *) REALLOC (bufp->buffer, bufp->allocated);\ + if (bufp->buffer == NULL) \ + return REG_ESPACE; \ + /* If the buffer moved, move all the pointers into it. */ \ + if (old_buffer != bufp->buffer) \ + { \ + int incr = bufp->buffer - old_buffer; \ + MOVE_BUFFER_POINTER (b); \ + MOVE_BUFFER_POINTER (begalt); \ + if (fixup_alt_jump) \ + MOVE_BUFFER_POINTER (fixup_alt_jump); \ + if (laststart) \ + MOVE_BUFFER_POINTER (laststart); \ + if (pending_exact) \ + MOVE_BUFFER_POINTER (pending_exact); \ + } \ + ELSE_EXTEND_BUFFER_HIGH_BOUND \ + } while (0) + + +/* Since we have one byte reserved for the register number argument to + {start,stop}_memory, the maximum number of groups we can report + things about is what fits in that byte. */ +#define MAX_REGNUM 255 + +/* But patterns can have more than `MAX_REGNUM' registers. We just + ignore the excess. */ +typedef unsigned regnum_t; + + +/* Macros for the compile stack. */ + +/* Since offsets can go either forwards or backwards, this type needs to + be able to hold values from -(MAX_BUF_SIZE - 1) to MAX_BUF_SIZE - 1. */ +/* int may be not enough when sizeof(int) == 2. */ +typedef long pattern_offset_t; + +typedef struct +{ + pattern_offset_t begalt_offset; + pattern_offset_t fixup_alt_jump; + pattern_offset_t inner_group_offset; + pattern_offset_t laststart_offset; + regnum_t regnum; +} compile_stack_elt_t; + + +typedef struct +{ + compile_stack_elt_t *stack; + unsigned size; + unsigned avail; /* Offset of next open position. */ +} compile_stack_type; + + +#define INIT_COMPILE_STACK_SIZE 32 + +#define COMPILE_STACK_EMPTY (compile_stack.avail == 0) +#define COMPILE_STACK_FULL (compile_stack.avail == compile_stack.size) + +/* The next available element. */ +#define COMPILE_STACK_TOP (compile_stack.stack[compile_stack.avail]) + + +/* Set the bit for character C in a list. */ +#define SET_LIST_BIT(c) \ + (b[((unsigned char) (c)) / BYTEWIDTH] \ + |= 1 << (((unsigned char) c) % BYTEWIDTH)) + + +/* Get the next unsigned number in the uncompiled pattern. */ +#define GET_UNSIGNED_NUMBER(num) \ + { if (p != pend) \ + { \ + PATFETCH (c); \ + while ('0' <= c && c <= '9') \ + { \ + if (num < 0) \ + num = 0; \ + num = num * 10 + c - '0'; \ + if (p == pend) \ + break; \ + PATFETCH (c); \ + } \ + } \ + } + +#if defined _LIBC || WIDE_CHAR_SUPPORT +/* The GNU C library provides support for user-defined character classes + and the functions from ISO C amendement 1. */ +# ifdef CHARCLASS_NAME_MAX +# define CHAR_CLASS_MAX_LENGTH CHARCLASS_NAME_MAX +# else +/* This shouldn't happen but some implementation might still have this + problem. Use a reasonable default value. */ +# define CHAR_CLASS_MAX_LENGTH 256 +# endif + +# ifdef _LIBC +# define IS_CHAR_CLASS(string) __wctype (string) +# else +# define IS_CHAR_CLASS(string) wctype (string) +# endif +#else +# define CHAR_CLASS_MAX_LENGTH 6 /* Namely, `xdigit'. */ + +# define IS_CHAR_CLASS(string) \ + (STREQ (string, "alpha") || STREQ (string, "upper") \ + || STREQ (string, "lower") || STREQ (string, "digit") \ + || STREQ (string, "alnum") || STREQ (string, "xdigit") \ + || STREQ (string, "space") || STREQ (string, "print") \ + || STREQ (string, "punct") || STREQ (string, "graph") \ + || STREQ (string, "cntrl") || STREQ (string, "blank")) +#endif + +#ifndef MATCH_MAY_ALLOCATE + +/* If we cannot allocate large objects within re_match_2_internal, + we make the fail stack and register vectors global. + The fail stack, we grow to the maximum size when a regexp + is compiled. + The register vectors, we adjust in size each time we + compile a regexp, according to the number of registers it needs. */ + +static fail_stack_type fail_stack; + +/* Size with which the following vectors are currently allocated. + That is so we can make them bigger as needed, + but never make them smaller. */ +static int regs_allocated_size; + +static const char ** regstart, ** regend; +static const char ** old_regstart, ** old_regend; +static const char **best_regstart, **best_regend; +static register_info_type *reg_info; +static const char **reg_dummy; +static register_info_type *reg_info_dummy; + +/* Make the register vectors big enough for NUM_REGS registers, + but don't make them smaller. */ + +static +regex_grow_registers (num_regs) + int num_regs; +{ + if (num_regs > regs_allocated_size) + { + RETALLOC_IF (regstart, num_regs, const char *); + RETALLOC_IF (regend, num_regs, const char *); + RETALLOC_IF (old_regstart, num_regs, const char *); + RETALLOC_IF (old_regend, num_regs, const char *); + RETALLOC_IF (best_regstart, num_regs, const char *); + RETALLOC_IF (best_regend, num_regs, const char *); + RETALLOC_IF (reg_info, num_regs, register_info_type); + RETALLOC_IF (reg_dummy, num_regs, const char *); + RETALLOC_IF (reg_info_dummy, num_regs, register_info_type); + + regs_allocated_size = num_regs; + } +} + +#endif /* not MATCH_MAY_ALLOCATE */ + +static boolean group_in_compile_stack _RE_ARGS ((compile_stack_type + compile_stack, + regnum_t regnum)); + +/* `regex_compile' compiles PATTERN (of length SIZE) according to SYNTAX. + Returns one of error codes defined in `regex.h', or zero for success. + + Assumes the `allocated' (and perhaps `buffer') and `translate' + fields are set in BUFP on entry. + + If it succeeds, results are put in BUFP (if it returns an error, the + contents of BUFP are undefined): + `buffer' is the compiled pattern; + `syntax' is set to SYNTAX; + `used' is set to the length of the compiled pattern; + `fastmap_accurate' is zero; + `re_nsub' is the number of subexpressions in PATTERN; + `not_bol' and `not_eol' are zero; + + The `fastmap' and `newline_anchor' fields are neither + examined nor set. */ + +/* Return, freeing storage we allocated. */ +#define FREE_STACK_RETURN(value) \ + return (free (compile_stack.stack), value) + +static reg_errcode_t +regex_compile (pattern, size, syntax, bufp) + const char *pattern; + size_t size; + reg_syntax_t syntax; + struct re_pattern_buffer *bufp; +{ + /* We fetch characters from PATTERN here. Even though PATTERN is + `char *' (i.e., signed), we declare these variables as unsigned, so + they can be reliably used as array indices. */ + register unsigned char c, c1; + + /* A random temporary spot in PATTERN. */ + const char *p1; + + /* Points to the end of the buffer, where we should append. */ + register unsigned char *b; + + /* Keeps track of unclosed groups. */ + compile_stack_type compile_stack; + + /* Points to the current (ending) position in the pattern. */ + const char *p = pattern; + const char *pend = pattern + size; + + /* How to translate the characters in the pattern. */ + RE_TRANSLATE_TYPE translate = bufp->translate; + + /* Address of the count-byte of the most recently inserted `exactn' + command. This makes it possible to tell if a new exact-match + character can be added to that command or if the character requires + a new `exactn' command. */ + unsigned char *pending_exact = 0; + + /* Address of start of the most recently finished expression. + This tells, e.g., postfix * where to find the start of its + operand. Reset at the beginning of groups and alternatives. */ + unsigned char *laststart = 0; + + /* Address of beginning of regexp, or inside of last group. */ + unsigned char *begalt; + + /* Place in the uncompiled pattern (i.e., the {) to + which to go back if the interval is invalid. */ + const char *beg_interval; + + /* Address of the place where a forward jump should go to the end of + the containing expression. Each alternative of an `or' -- except the + last -- ends with a forward jump of this sort. */ + unsigned char *fixup_alt_jump = 0; + + /* Counts open-groups as they are encountered. Remembered for the + matching close-group on the compile stack, so the same register + number is put in the stop_memory as the start_memory. */ + regnum_t regnum = 0; + +#ifdef DEBUG + DEBUG_PRINT1 ("\nCompiling pattern: "); + if (debug) + { + unsigned debug_count; + + for (debug_count = 0; debug_count < size; debug_count++) + putchar (pattern[debug_count]); + putchar ('\n'); + } +#endif /* DEBUG */ + + /* Initialize the compile stack. */ + compile_stack.stack = TALLOC (INIT_COMPILE_STACK_SIZE, compile_stack_elt_t); + if (compile_stack.stack == NULL) + return REG_ESPACE; + + compile_stack.size = INIT_COMPILE_STACK_SIZE; + compile_stack.avail = 0; + + /* Initialize the pattern buffer. */ + bufp->syntax = syntax; + bufp->fastmap_accurate = 0; + bufp->not_bol = bufp->not_eol = 0; + + /* Set `used' to zero, so that if we return an error, the pattern + printer (for debugging) will think there's no pattern. We reset it + at the end. */ + bufp->used = 0; + + /* Always count groups, whether or not bufp->no_sub is set. */ + bufp->re_nsub = 0; + +#if !defined emacs && !defined SYNTAX_TABLE + /* Initialize the syntax table. */ + init_syntax_once (); +#endif + + if (bufp->allocated == 0) + { + if (bufp->buffer) + { /* If zero allocated, but buffer is non-null, try to realloc + enough space. This loses if buffer's address is bogus, but + that is the user's responsibility. */ + RETALLOC (bufp->buffer, INIT_BUF_SIZE, unsigned char); + } + else + { /* Caller did not allocate a buffer. Do it for them. */ + bufp->buffer = TALLOC (INIT_BUF_SIZE, unsigned char); + } + if (!bufp->buffer) FREE_STACK_RETURN (REG_ESPACE); + + bufp->allocated = INIT_BUF_SIZE; + } + + begalt = b = bufp->buffer; + + /* Loop through the uncompiled pattern until we're at the end. */ + while (p != pend) + { + PATFETCH (c); + + switch (c) + { + case '^': + { + if ( /* If at start of pattern, it's an operator. */ + p == pattern + 1 + /* If context independent, it's an operator. */ + || syntax & RE_CONTEXT_INDEP_ANCHORS + /* Otherwise, depends on what's come before. */ + || at_begline_loc_p (pattern, p, syntax)) + BUF_PUSH (begline); + else + goto normal_char; + } + break; + + + case '$': + { + if ( /* If at end of pattern, it's an operator. */ + p == pend + /* If context independent, it's an operator. */ + || syntax & RE_CONTEXT_INDEP_ANCHORS + /* Otherwise, depends on what's next. */ + || at_endline_loc_p (p, pend, syntax)) + BUF_PUSH (endline); + else + goto normal_char; + } + break; + + + case '+': + case '?': + if ((syntax & RE_BK_PLUS_QM) + || (syntax & RE_LIMITED_OPS)) + goto normal_char; + handle_plus: + case '*': + /* If there is no previous pattern... */ + if (!laststart) + { + if (syntax & RE_CONTEXT_INVALID_OPS) + FREE_STACK_RETURN (REG_BADRPT); + else if (!(syntax & RE_CONTEXT_INDEP_OPS)) + goto normal_char; + } + + { + /* Are we optimizing this jump? */ + boolean keep_string_p = false; + + /* 1 means zero (many) matches is allowed. */ + char zero_times_ok = 0, many_times_ok = 0; + + /* If there is a sequence of repetition chars, collapse it + down to just one (the right one). We can't combine + interval operators with these because of, e.g., `a{2}*', + which should only match an even number of `a's. */ + + for (;;) + { + zero_times_ok |= c != '+'; + many_times_ok |= c != '?'; + + if (p == pend) + break; + + PATFETCH (c); + + if (c == '*' + || (!(syntax & RE_BK_PLUS_QM) && (c == '+' || c == '?'))) + ; + + else if (syntax & RE_BK_PLUS_QM && c == '\\') + { + if (p == pend) FREE_STACK_RETURN (REG_EESCAPE); + + PATFETCH (c1); + if (!(c1 == '+' || c1 == '?')) + { + PATUNFETCH; + PATUNFETCH; + break; + } + + c = c1; + } + else + { + PATUNFETCH; + break; + } + + /* If we get here, we found another repeat character. */ + } + + /* Star, etc. applied to an empty pattern is equivalent + to an empty pattern. */ + if (!laststart) + break; + + /* Now we know whether or not zero matches is allowed + and also whether or not two or more matches is allowed. */ + if (many_times_ok) + { /* More than one repetition is allowed, so put in at the + end a backward relative jump from `b' to before the next + jump we're going to put in below (which jumps from + laststart to after this jump). + + But if we are at the `*' in the exact sequence `.*\n', + insert an unconditional jump backwards to the ., + instead of the beginning of the loop. This way we only + push a failure point once, instead of every time + through the loop. */ + assert (p - 1 > pattern); + + /* Allocate the space for the jump. */ + GET_BUFFER_SPACE (3); + + /* We know we are not at the first character of the pattern, + because laststart was nonzero. And we've already + incremented `p', by the way, to be the character after + the `*'. Do we have to do something analogous here + for null bytes, because of RE_DOT_NOT_NULL? */ + if (TRANSLATE (*(p - 2)) == TRANSLATE ('.') + && zero_times_ok + && p < pend && TRANSLATE (*p) == TRANSLATE ('\n') + && !(syntax & RE_DOT_NEWLINE)) + { /* We have .*\n. */ + STORE_JUMP (jump, b, laststart); + keep_string_p = true; + } + else + /* Anything else. */ + STORE_JUMP (maybe_pop_jump, b, laststart - 3); + + /* We've added more stuff to the buffer. */ + b += 3; + } + + /* On failure, jump from laststart to b + 3, which will be the + end of the buffer after this jump is inserted. */ + GET_BUFFER_SPACE (3); + INSERT_JUMP (keep_string_p ? on_failure_keep_string_jump + : on_failure_jump, + laststart, b + 3); + pending_exact = 0; + b += 3; + + if (!zero_times_ok) + { + /* At least one repetition is required, so insert a + `dummy_failure_jump' before the initial + `on_failure_jump' instruction of the loop. This + effects a skip over that instruction the first time + we hit that loop. */ + GET_BUFFER_SPACE (3); + INSERT_JUMP (dummy_failure_jump, laststart, laststart + 6); + b += 3; + } + } + break; + + + case '.': + laststart = b; + BUF_PUSH (anychar); + break; + + + case '[': + { + boolean had_char_class = false; + unsigned int range_start = 0xffffffff; + + if (p == pend) FREE_STACK_RETURN (REG_EBRACK); + + /* Ensure that we have enough space to push a charset: the + opcode, the length count, and the bitset; 34 bytes in all. */ + GET_BUFFER_SPACE (34); + + laststart = b; + + /* We test `*p == '^' twice, instead of using an if + statement, so we only need one BUF_PUSH. */ + BUF_PUSH (*p == '^' ? charset_not : charset); + if (*p == '^') + p++; + + /* Remember the first position in the bracket expression. */ + p1 = p; + + /* Push the number of bytes in the bitmap. */ + BUF_PUSH ((1 << BYTEWIDTH) / BYTEWIDTH); + + /* Clear the whole map. */ + bzero (b, (1 << BYTEWIDTH) / BYTEWIDTH); + + /* charset_not matches newline according to a syntax bit. */ + if ((re_opcode_t) b[-2] == charset_not + && (syntax & RE_HAT_LISTS_NOT_NEWLINE)) + SET_LIST_BIT ('\n'); + + /* Read in characters and ranges, setting map bits. */ + for (;;) + { + if (p == pend) FREE_STACK_RETURN (REG_EBRACK); + + PATFETCH (c); + + /* \ might escape characters inside [...] and [^...]. */ + if ((syntax & RE_BACKSLASH_ESCAPE_IN_LISTS) && c == '\\') + { + if (p == pend) FREE_STACK_RETURN (REG_EESCAPE); + + PATFETCH (c1); + SET_LIST_BIT (c1); + range_start = c1; + continue; + } + + /* Could be the end of the bracket expression. If it's + not (i.e., when the bracket expression is `[]' so + far), the ']' character bit gets set way below. */ + if (c == ']' && p != p1 + 1) + break; + + /* Look ahead to see if it's a range when the last thing + was a character class. */ + if (had_char_class && c == '-' && *p != ']') + FREE_STACK_RETURN (REG_ERANGE); + + /* Look ahead to see if it's a range when the last thing + was a character: if this is a hyphen not at the + beginning or the end of a list, then it's the range + operator. */ + if (c == '-' + && !(p - 2 >= pattern && p[-2] == '[') + && !(p - 3 >= pattern && p[-3] == '[' && p[-2] == '^') + && *p != ']') + { + reg_errcode_t ret + = compile_range (range_start, &p, pend, translate, + syntax, b); + if (ret != REG_NOERROR) FREE_STACK_RETURN (ret); + range_start = 0xffffffff; + } + + else if (p[0] == '-' && p[1] != ']') + { /* This handles ranges made up of characters only. */ + reg_errcode_t ret; + + /* Move past the `-'. */ + PATFETCH (c1); + + ret = compile_range (c, &p, pend, translate, syntax, b); + if (ret != REG_NOERROR) FREE_STACK_RETURN (ret); + range_start = 0xffffffff; + } + + /* See if we're at the beginning of a possible character + class. */ + + else if (syntax & RE_CHAR_CLASSES && c == '[' && *p == ':') + { /* Leave room for the null. */ + char str[CHAR_CLASS_MAX_LENGTH + 1]; + + PATFETCH (c); + c1 = 0; + + /* If pattern is `[[:'. */ + if (p == pend) FREE_STACK_RETURN (REG_EBRACK); + + for (;;) + { + PATFETCH (c); + if ((c == ':' && *p == ']') || p == pend) + break; + if (c1 < CHAR_CLASS_MAX_LENGTH) + str[c1++] = c; + else + /* This is in any case an invalid class name. */ + str[0] = '\0'; + } + str[c1] = '\0'; + + /* If isn't a word bracketed by `[:' and `:]': + undo the ending character, the letters, and leave + the leading `:' and `[' (but set bits for them). */ + if (c == ':' && *p == ']') + { +#if defined _LIBC || WIDE_CHAR_SUPPORT + boolean is_lower = STREQ (str, "lower"); + boolean is_upper = STREQ (str, "upper"); + wctype_t wt; + int ch; + + wt = IS_CHAR_CLASS (str); + if (wt == 0) + FREE_STACK_RETURN (REG_ECTYPE); + + /* Throw away the ] at the end of the character + class. */ + PATFETCH (c); + + if (p == pend) FREE_STACK_RETURN (REG_EBRACK); + + for (ch = 0; ch < 1 << BYTEWIDTH; ++ch) + { +# ifdef _LIBC + if (__iswctype (__btowc (ch), wt)) + SET_LIST_BIT (ch); +# else + if (iswctype (btowc (ch), wt)) + SET_LIST_BIT (ch); +# endif + + if (translate && (is_upper || is_lower) + && (ISUPPER (ch) || ISLOWER (ch))) + SET_LIST_BIT (ch); + } + + had_char_class = true; +#else + int ch; + boolean is_alnum = STREQ (str, "alnum"); + boolean is_alpha = STREQ (str, "alpha"); + boolean is_blank = STREQ (str, "blank"); + boolean is_cntrl = STREQ (str, "cntrl"); + boolean is_digit = STREQ (str, "digit"); + boolean is_graph = STREQ (str, "graph"); + boolean is_lower = STREQ (str, "lower"); + boolean is_print = STREQ (str, "print"); + boolean is_punct = STREQ (str, "punct"); + boolean is_space = STREQ (str, "space"); + boolean is_upper = STREQ (str, "upper"); + boolean is_xdigit = STREQ (str, "xdigit"); + + if (!IS_CHAR_CLASS (str)) + FREE_STACK_RETURN (REG_ECTYPE); + + /* Throw away the ] at the end of the character + class. */ + PATFETCH (c); + + if (p == pend) FREE_STACK_RETURN (REG_EBRACK); + + for (ch = 0; ch < 1 << BYTEWIDTH; ch++) + { + /* This was split into 3 if's to + avoid an arbitrary limit in some compiler. */ + if ( (is_alnum && ISALNUM (ch)) + || (is_alpha && ISALPHA (ch)) + || (is_blank && ISBLANK (ch)) + || (is_cntrl && ISCNTRL (ch))) + SET_LIST_BIT (ch); + if ( (is_digit && ISDIGIT (ch)) + || (is_graph && ISGRAPH (ch)) + || (is_lower && ISLOWER (ch)) + || (is_print && ISPRINT (ch))) + SET_LIST_BIT (ch); + if ( (is_punct && ISPUNCT (ch)) + || (is_space && ISSPACE (ch)) + || (is_upper && ISUPPER (ch)) + || (is_xdigit && ISXDIGIT (ch))) + SET_LIST_BIT (ch); + if ( translate && (is_upper || is_lower) + && (ISUPPER (ch) || ISLOWER (ch))) + SET_LIST_BIT (ch); + } + had_char_class = true; +#endif /* libc || wctype.h */ + } + else + { + c1++; + while (c1--) + PATUNFETCH; + SET_LIST_BIT ('['); + SET_LIST_BIT (':'); + range_start = ':'; + had_char_class = false; + } + } + else if (syntax & RE_CHAR_CLASSES && c == '[' && *p == '=') + { + unsigned char str[MB_LEN_MAX + 1]; +#ifdef _LIBC + uint32_t nrules = + _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES); +#endif + + PATFETCH (c); + c1 = 0; + + /* If pattern is `[[='. */ + if (p == pend) FREE_STACK_RETURN (REG_EBRACK); + + for (;;) + { + PATFETCH (c); + if ((c == '=' && *p == ']') || p == pend) + break; + if (c1 < MB_LEN_MAX) + str[c1++] = c; + else + /* This is in any case an invalid class name. */ + str[0] = '\0'; + } + str[c1] = '\0'; + + if (c == '=' && *p == ']' && str[0] != '\0') + { + /* If we have no collation data we use the default + collation in which each character is in a class + by itself. It also means that ASCII is the + character set and therefore we cannot have character + with more than one byte in the multibyte + representation. */ +#ifdef _LIBC + if (nrules == 0) +#endif + { + if (c1 != 1) + FREE_STACK_RETURN (REG_ECOLLATE); + + /* Throw away the ] at the end of the equivalence + class. */ + PATFETCH (c); + + /* Set the bit for the character. */ + SET_LIST_BIT (str[0]); + } +#ifdef _LIBC + else + { + /* Try to match the byte sequence in `str' against + those known to the collate implementation. + First find out whether the bytes in `str' are + actually from exactly one character. */ + const int32_t *table; + const unsigned char *weights; + const unsigned char *extra; + const int32_t *indirect; + int32_t idx; + const unsigned char *cp = str; + int ch; + + /* This #include defines a local function! */ +# include + + table = (const int32_t *) + _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB); + weights = (const unsigned char *) + _NL_CURRENT (LC_COLLATE, _NL_COLLATE_WEIGHTMB); + extra = (const unsigned char *) + _NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAMB); + indirect = (const int32_t *) + _NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTMB); + + idx = findidx (&cp); + if (idx == 0 || cp < str + c1) + /* This is no valid character. */ + FREE_STACK_RETURN (REG_ECOLLATE); + + /* Throw away the ] at the end of the equivalence + class. */ + PATFETCH (c); + + /* Now we have to go throught the whole table + and find all characters which have the same + first level weight. + + XXX Note that this is not entirely correct. + we would have to match multibyte sequences + but this is not possible with the current + implementation. */ + for (ch = 1; ch < 256; ++ch) + /* XXX This test would have to be changed if we + would allow matching multibyte sequences. */ + if (table[ch] > 0) + { + int32_t idx2 = table[ch]; + size_t len = weights[idx2]; + + /* Test whether the lenghts match. */ + if (weights[idx] == len) + { + /* They do. New compare the bytes of + the weight. */ + size_t cnt = 0; + + while (cnt < len + && (weights[idx + 1 + cnt] + == weights[idx2 + 1 + cnt])) + ++len; + + if (cnt == len) + /* They match. Mark the character as + acceptable. */ + SET_LIST_BIT (ch); + } + } + } +#endif + had_char_class = true; + } + else + { + c1++; + while (c1--) + PATUNFETCH; + SET_LIST_BIT ('['); + SET_LIST_BIT ('='); + range_start = '='; + had_char_class = false; + } + } + else if (syntax & RE_CHAR_CLASSES && c == '[' && *p == '.') + { + unsigned char str[128]; /* Should be large enough. */ +#ifdef _LIBC + uint32_t nrules = + _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES); +#endif + + PATFETCH (c); + c1 = 0; + + /* If pattern is `[[='. */ + if (p == pend) FREE_STACK_RETURN (REG_EBRACK); + + for (;;) + { + PATFETCH (c); + if ((c == '.' && *p == ']') || p == pend) + break; + if (c1 < sizeof (str)) + str[c1++] = c; + else + /* This is in any case an invalid class name. */ + str[0] = '\0'; + } + str[c1] = '\0'; + + if (c == '.' && *p == ']' && str[0] != '\0') + { + /* If we have no collation data we use the default + collation in which each character is the name + for its own class which contains only the one + character. It also means that ASCII is the + character set and therefore we cannot have character + with more than one byte in the multibyte + representation. */ +#ifdef _LIBC + if (nrules == 0) +#endif + { + if (c1 != 1) + FREE_STACK_RETURN (REG_ECOLLATE); + + /* Throw away the ] at the end of the equivalence + class. */ + PATFETCH (c); + + /* Set the bit for the character. */ + SET_LIST_BIT (str[0]); + range_start = ((const unsigned char *) str)[0]; + } +#ifdef _LIBC + else + { + /* Try to match the byte sequence in `str' against + those known to the collate implementation. + First find out whether the bytes in `str' are + actually from exactly one character. */ + int32_t table_size; + const int32_t *symb_table; + const unsigned char *extra; + int32_t idx; + int32_t elem; + int32_t second; + int32_t hash; + + table_size = + _NL_CURRENT_WORD (LC_COLLATE, + _NL_COLLATE_SYMB_HASH_SIZEMB); + symb_table = (const int32_t *) + _NL_CURRENT (LC_COLLATE, + _NL_COLLATE_SYMB_TABLEMB); + extra = (const unsigned char *) + _NL_CURRENT (LC_COLLATE, + _NL_COLLATE_SYMB_EXTRAMB); + + /* Locate the character in the hashing table. */ + hash = elem_hash (str, c1); + + idx = 0; + elem = hash % table_size; + second = hash % (table_size - 2); + while (symb_table[2 * elem] != 0) + { + /* First compare the hashing value. */ + if (symb_table[2 * elem] == hash + && c1 == extra[symb_table[2 * elem + 1]] + && memcmp (str, + &extra[symb_table[2 * elem + 1] + + 1], + c1) == 0) + { + /* Yep, this is the entry. */ + idx = symb_table[2 * elem + 1]; + idx += 1 + extra[idx]; + break; + } + + /* Next entry. */ + elem += second; + } + + if (symb_table[2 * elem] == 0) + /* This is no valid character. */ + FREE_STACK_RETURN (REG_ECOLLATE); + + /* Throw away the ] at the end of the equivalence + class. */ + PATFETCH (c); + + /* Now add the multibyte character(s) we found + to the accept list. + + XXX Note that this is not entirely correct. + we would have to match multibyte sequences + but this is not possible with the current + implementation. Also, we have to match + collating symbols, which expand to more than + one file, as a whole and not allow the + individual bytes. */ + c1 = extra[idx++]; + if (c1 == 1) + range_start = extra[idx]; + while (c1-- > 0) + { + SET_LIST_BIT (extra[idx]); + ++idx; + } + } +#endif + had_char_class = false; + } + else + { + c1++; + while (c1--) + PATUNFETCH; + SET_LIST_BIT ('['); + SET_LIST_BIT ('.'); + range_start = '.'; + had_char_class = false; + } + } + else + { + had_char_class = false; + SET_LIST_BIT (c); + range_start = c; + } + } + + /* Discard any (non)matching list bytes that are all 0 at the + end of the map. Decrease the map-length byte too. */ + while ((int) b[-1] > 0 && b[b[-1] - 1] == 0) + b[-1]--; + b += b[-1]; + } + break; + + + case '(': + if (syntax & RE_NO_BK_PARENS) + goto handle_open; + else + goto normal_char; + + + case ')': + if (syntax & RE_NO_BK_PARENS) + goto handle_close; + else + goto normal_char; + + + case '\n': + if (syntax & RE_NEWLINE_ALT) + goto handle_alt; + else + goto normal_char; + + + case '|': + if (syntax & RE_NO_BK_VBAR) + goto handle_alt; + else + goto normal_char; + + + case '{': + if (syntax & RE_INTERVALS && syntax & RE_NO_BK_BRACES) + goto handle_interval; + else + goto normal_char; + + + case '\\': + if (p == pend) FREE_STACK_RETURN (REG_EESCAPE); + + /* Do not translate the character after the \, so that we can + distinguish, e.g., \B from \b, even if we normally would + translate, e.g., B to b. */ + PATFETCH_RAW (c); + + switch (c) + { + case '(': + if (syntax & RE_NO_BK_PARENS) + goto normal_backslash; + + handle_open: + bufp->re_nsub++; + regnum++; + + if (COMPILE_STACK_FULL) + { + RETALLOC (compile_stack.stack, compile_stack.size << 1, + compile_stack_elt_t); + if (compile_stack.stack == NULL) return REG_ESPACE; + + compile_stack.size <<= 1; + } + + /* These are the values to restore when we hit end of this + group. They are all relative offsets, so that if the + whole pattern moves because of realloc, they will still + be valid. */ + COMPILE_STACK_TOP.begalt_offset = begalt - bufp->buffer; + COMPILE_STACK_TOP.fixup_alt_jump + = fixup_alt_jump ? fixup_alt_jump - bufp->buffer + 1 : 0; + COMPILE_STACK_TOP.laststart_offset = b - bufp->buffer; + COMPILE_STACK_TOP.regnum = regnum; + + /* We will eventually replace the 0 with the number of + groups inner to this one. But do not push a + start_memory for groups beyond the last one we can + represent in the compiled pattern. */ + if (regnum <= MAX_REGNUM) + { + COMPILE_STACK_TOP.inner_group_offset = b - bufp->buffer + 2; + BUF_PUSH_3 (start_memory, regnum, 0); + } + + compile_stack.avail++; + + fixup_alt_jump = 0; + laststart = 0; + begalt = b; + /* If we've reached MAX_REGNUM groups, then this open + won't actually generate any code, so we'll have to + clear pending_exact explicitly. */ + pending_exact = 0; + break; + + + case ')': + if (syntax & RE_NO_BK_PARENS) goto normal_backslash; + + if (COMPILE_STACK_EMPTY) + { + if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD) + goto normal_backslash; + else + FREE_STACK_RETURN (REG_ERPAREN); + } + + handle_close: + if (fixup_alt_jump) + { /* Push a dummy failure point at the end of the + alternative for a possible future + `pop_failure_jump' to pop. See comments at + `push_dummy_failure' in `re_match_2'. */ + BUF_PUSH (push_dummy_failure); + + /* We allocated space for this jump when we assigned + to `fixup_alt_jump', in the `handle_alt' case below. */ + STORE_JUMP (jump_past_alt, fixup_alt_jump, b - 1); + } + + /* See similar code for backslashed left paren above. */ + if (COMPILE_STACK_EMPTY) + { + if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD) + goto normal_char; + else + FREE_STACK_RETURN (REG_ERPAREN); + } + + /* Since we just checked for an empty stack above, this + ``can't happen''. */ + assert (compile_stack.avail != 0); + { + /* We don't just want to restore into `regnum', because + later groups should continue to be numbered higher, + as in `(ab)c(de)' -- the second group is #2. */ + regnum_t this_group_regnum; + + compile_stack.avail--; + begalt = bufp->buffer + COMPILE_STACK_TOP.begalt_offset; + fixup_alt_jump + = COMPILE_STACK_TOP.fixup_alt_jump + ? bufp->buffer + COMPILE_STACK_TOP.fixup_alt_jump - 1 + : 0; + laststart = bufp->buffer + COMPILE_STACK_TOP.laststart_offset; + this_group_regnum = COMPILE_STACK_TOP.regnum; + /* If we've reached MAX_REGNUM groups, then this open + won't actually generate any code, so we'll have to + clear pending_exact explicitly. */ + pending_exact = 0; + + /* We're at the end of the group, so now we know how many + groups were inside this one. */ + if (this_group_regnum <= MAX_REGNUM) + { + unsigned char *inner_group_loc + = bufp->buffer + COMPILE_STACK_TOP.inner_group_offset; + + *inner_group_loc = regnum - this_group_regnum; + BUF_PUSH_3 (stop_memory, this_group_regnum, + regnum - this_group_regnum); + } + } + break; + + + case '|': /* `\|'. */ + if (syntax & RE_LIMITED_OPS || syntax & RE_NO_BK_VBAR) + goto normal_backslash; + handle_alt: + if (syntax & RE_LIMITED_OPS) + goto normal_char; + + /* Insert before the previous alternative a jump which + jumps to this alternative if the former fails. */ + GET_BUFFER_SPACE (3); + INSERT_JUMP (on_failure_jump, begalt, b + 6); + pending_exact = 0; + b += 3; + + /* The alternative before this one has a jump after it + which gets executed if it gets matched. Adjust that + jump so it will jump to this alternative's analogous + jump (put in below, which in turn will jump to the next + (if any) alternative's such jump, etc.). The last such + jump jumps to the correct final destination. A picture: + _____ _____ + | | | | + | v | v + a | b | c + + If we are at `b', then fixup_alt_jump right now points to a + three-byte space after `a'. We'll put in the jump, set + fixup_alt_jump to right after `b', and leave behind three + bytes which we'll fill in when we get to after `c'. */ + + if (fixup_alt_jump) + STORE_JUMP (jump_past_alt, fixup_alt_jump, b); + + /* Mark and leave space for a jump after this alternative, + to be filled in later either by next alternative or + when know we're at the end of a series of alternatives. */ + fixup_alt_jump = b; + GET_BUFFER_SPACE (3); + b += 3; + + laststart = 0; + begalt = b; + break; + + + case '{': + /* If \{ is a literal. */ + if (!(syntax & RE_INTERVALS) + /* If we're at `\{' and it's not the open-interval + operator. */ + || (syntax & RE_NO_BK_BRACES)) + goto normal_backslash; + + handle_interval: + { + /* If got here, then the syntax allows intervals. */ + + /* At least (most) this many matches must be made. */ + int lower_bound = -1, upper_bound = -1; + + beg_interval = p - 1; + + if (p == pend) + { + if (!(syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES)) + goto unfetch_interval; + else + FREE_STACK_RETURN (REG_EBRACE); + } + + GET_UNSIGNED_NUMBER (lower_bound); + + if (c == ',') + { + GET_UNSIGNED_NUMBER (upper_bound); + if ((!(syntax & RE_NO_BK_BRACES) && c != '\\') + || ((syntax & RE_NO_BK_BRACES) && c != '}')) + FREE_STACK_RETURN (REG_BADBR); + + if (upper_bound < 0) + upper_bound = RE_DUP_MAX; + } + else + /* Interval such as `{1}' => match exactly once. */ + upper_bound = lower_bound; + + if (lower_bound < 0 || upper_bound > RE_DUP_MAX + || lower_bound > upper_bound) + { + if (!(syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES)) + goto unfetch_interval; + else + FREE_STACK_RETURN (REG_BADBR); + } + + if (!(syntax & RE_NO_BK_BRACES)) + { + if (c != '\\') FREE_STACK_RETURN (REG_EBRACE); + + PATFETCH (c); + } + + if (c != '}') + { + if (!(syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES)) + goto unfetch_interval; + else + FREE_STACK_RETURN (REG_BADBR); + } + + /* We just parsed a valid interval. */ + + /* If it's invalid to have no preceding re. */ + if (!laststart) + { + if (syntax & RE_CONTEXT_INVALID_OPS) + FREE_STACK_RETURN (REG_BADRPT); + else if (syntax & RE_CONTEXT_INDEP_OPS) + laststart = b; + else + goto unfetch_interval; + } + + /* If the upper bound is zero, don't want to succeed at + all; jump from `laststart' to `b + 3', which will be + the end of the buffer after we insert the jump. */ + if (upper_bound == 0) + { + GET_BUFFER_SPACE (3); + INSERT_JUMP (jump, laststart, b + 3); + b += 3; + } + + /* Otherwise, we have a nontrivial interval. When + we're all done, the pattern will look like: + set_number_at + set_number_at + succeed_n + + jump_n + (The upper bound and `jump_n' are omitted if + `upper_bound' is 1, though.) */ + else + { /* If the upper bound is > 1, we need to insert + more at the end of the loop. */ + unsigned nbytes = 10 + (upper_bound > 1) * 10; + + GET_BUFFER_SPACE (nbytes); + + /* Initialize lower bound of the `succeed_n', even + though it will be set during matching by its + attendant `set_number_at' (inserted next), + because `re_compile_fastmap' needs to know. + Jump to the `jump_n' we might insert below. */ + INSERT_JUMP2 (succeed_n, laststart, + b + 5 + (upper_bound > 1) * 5, + lower_bound); + b += 5; + + /* Code to initialize the lower bound. Insert + before the `succeed_n'. The `5' is the last two + bytes of this `set_number_at', plus 3 bytes of + the following `succeed_n'. */ + insert_op2 (set_number_at, laststart, 5, lower_bound, b); + b += 5; + + if (upper_bound > 1) + { /* More than one repetition is allowed, so + append a backward jump to the `succeed_n' + that starts this interval. + + When we've reached this during matching, + we'll have matched the interval once, so + jump back only `upper_bound - 1' times. */ + STORE_JUMP2 (jump_n, b, laststart + 5, + upper_bound - 1); + b += 5; + + /* The location we want to set is the second + parameter of the `jump_n'; that is `b-2' as + an absolute address. `laststart' will be + the `set_number_at' we're about to insert; + `laststart+3' the number to set, the source + for the relative address. But we are + inserting into the middle of the pattern -- + so everything is getting moved up by 5. + Conclusion: (b - 2) - (laststart + 3) + 5, + i.e., b - laststart. + + We insert this at the beginning of the loop + so that if we fail during matching, we'll + reinitialize the bounds. */ + insert_op2 (set_number_at, laststart, b - laststart, + upper_bound - 1, b); + b += 5; + } + } + pending_exact = 0; + beg_interval = NULL; + } + break; + + unfetch_interval: + /* If an invalid interval, match the characters as literals. */ + assert (beg_interval); + p = beg_interval; + beg_interval = NULL; + + /* normal_char and normal_backslash need `c'. */ + PATFETCH (c); + + if (!(syntax & RE_NO_BK_BRACES)) + { + if (p > pattern && p[-1] == '\\') + goto normal_backslash; + } + goto normal_char; + +#ifdef emacs + /* There is no way to specify the before_dot and after_dot + operators. rms says this is ok. --karl */ + case '=': + BUF_PUSH (at_dot); + break; + + case 's': + laststart = b; + PATFETCH (c); + BUF_PUSH_2 (syntaxspec, syntax_spec_code[c]); + break; + + case 'S': + laststart = b; + PATFETCH (c); + BUF_PUSH_2 (notsyntaxspec, syntax_spec_code[c]); + break; +#endif /* emacs */ + + + case 'w': + if (syntax & RE_NO_GNU_OPS) + goto normal_char; + laststart = b; + BUF_PUSH (wordchar); + break; + + + case 'W': + if (syntax & RE_NO_GNU_OPS) + goto normal_char; + laststart = b; + BUF_PUSH (notwordchar); + break; + + + case '<': + if (syntax & RE_NO_GNU_OPS) + goto normal_char; + BUF_PUSH (wordbeg); + break; + + case '>': + if (syntax & RE_NO_GNU_OPS) + goto normal_char; + BUF_PUSH (wordend); + break; + + case 'b': + if (syntax & RE_NO_GNU_OPS) + goto normal_char; + BUF_PUSH (wordbound); + break; + + case 'B': + if (syntax & RE_NO_GNU_OPS) + goto normal_char; + BUF_PUSH (notwordbound); + break; + + case '`': + if (syntax & RE_NO_GNU_OPS) + goto normal_char; + BUF_PUSH (begbuf); + break; + + case '\'': + if (syntax & RE_NO_GNU_OPS) + goto normal_char; + BUF_PUSH (endbuf); + break; + + case '1': case '2': case '3': case '4': case '5': + case '6': case '7': case '8': case '9': + if (syntax & RE_NO_BK_REFS) + goto normal_char; + + c1 = c - '0'; + + if (c1 > regnum) + FREE_STACK_RETURN (REG_ESUBREG); + + /* Can't back reference to a subexpression if inside of it. */ + if (group_in_compile_stack (compile_stack, (regnum_t) c1)) + goto normal_char; + + laststart = b; + BUF_PUSH_2 (duplicate, c1); + break; + + + case '+': + case '?': + if (syntax & RE_BK_PLUS_QM) + goto handle_plus; + else + goto normal_backslash; + + default: + normal_backslash: + /* You might think it would be useful for \ to mean + not to translate; but if we don't translate it + it will never match anything. */ + c = TRANSLATE (c); + goto normal_char; + } + break; + + + default: + /* Expects the character in `c'. */ + normal_char: + /* If no exactn currently being built. */ + if (!pending_exact + + /* If last exactn not at current position. */ + || pending_exact + *pending_exact + 1 != b + + /* We have only one byte following the exactn for the count. */ + || *pending_exact == (1 << BYTEWIDTH) - 1 + + /* If followed by a repetition operator. */ + || *p == '*' || *p == '^' + || ((syntax & RE_BK_PLUS_QM) + ? *p == '\\' && (p[1] == '+' || p[1] == '?') + : (*p == '+' || *p == '?')) + || ((syntax & RE_INTERVALS) + && ((syntax & RE_NO_BK_BRACES) + ? *p == '{' + : (p[0] == '\\' && p[1] == '{')))) + { + /* Start building a new exactn. */ + + laststart = b; + + BUF_PUSH_2 (exactn, 0); + pending_exact = b - 1; + } + + BUF_PUSH (c); + (*pending_exact)++; + break; + } /* switch (c) */ + } /* while p != pend */ + + + /* Through the pattern now. */ + + if (fixup_alt_jump) + STORE_JUMP (jump_past_alt, fixup_alt_jump, b); + + if (!COMPILE_STACK_EMPTY) + FREE_STACK_RETURN (REG_EPAREN); + + /* If we don't want backtracking, force success + the first time we reach the end of the compiled pattern. */ + if (syntax & RE_NO_POSIX_BACKTRACKING) + BUF_PUSH (succeed); + + free (compile_stack.stack); + + /* We have succeeded; set the length of the buffer. */ + bufp->used = b - bufp->buffer; + +#ifdef DEBUG + if (debug) + { + DEBUG_PRINT1 ("\nCompiled pattern: \n"); + print_compiled_pattern (bufp); + } +#endif /* DEBUG */ + +#ifndef MATCH_MAY_ALLOCATE + /* Initialize the failure stack to the largest possible stack. This + isn't necessary unless we're trying to avoid calling alloca in + the search and match routines. */ + { + int num_regs = bufp->re_nsub + 1; + + /* Since DOUBLE_FAIL_STACK refuses to double only if the current size + is strictly greater than re_max_failures, the largest possible stack + is 2 * re_max_failures failure points. */ + if (fail_stack.size < (2 * re_max_failures * MAX_FAILURE_ITEMS)) + { + fail_stack.size = (2 * re_max_failures * MAX_FAILURE_ITEMS); + +# ifdef emacs + if (! fail_stack.stack) + fail_stack.stack + = (fail_stack_elt_t *) xmalloc (fail_stack.size + * sizeof (fail_stack_elt_t)); + else + fail_stack.stack + = (fail_stack_elt_t *) xrealloc (fail_stack.stack, + (fail_stack.size + * sizeof (fail_stack_elt_t))); +# else /* not emacs */ + if (! fail_stack.stack) + fail_stack.stack + = (fail_stack_elt_t *) malloc (fail_stack.size + * sizeof (fail_stack_elt_t)); + else + fail_stack.stack + = (fail_stack_elt_t *) realloc (fail_stack.stack, + (fail_stack.size + * sizeof (fail_stack_elt_t))); +# endif /* not emacs */ + } + + regex_grow_registers (num_regs); + } +#endif /* not MATCH_MAY_ALLOCATE */ + + return REG_NOERROR; +} /* regex_compile */ + +/* Subroutines for `regex_compile'. */ + +/* Store OP at LOC followed by two-byte integer parameter ARG. */ + +static void +store_op1 (op, loc, arg) + re_opcode_t op; + unsigned char *loc; + int arg; +{ + *loc = (unsigned char) op; + STORE_NUMBER (loc + 1, arg); +} + + +/* Like `store_op1', but for two two-byte parameters ARG1 and ARG2. */ + +static void +store_op2 (op, loc, arg1, arg2) + re_opcode_t op; + unsigned char *loc; + int arg1, arg2; +{ + *loc = (unsigned char) op; + STORE_NUMBER (loc + 1, arg1); + STORE_NUMBER (loc + 3, arg2); +} + + +/* Copy the bytes from LOC to END to open up three bytes of space at LOC + for OP followed by two-byte integer parameter ARG. */ + +static void +insert_op1 (op, loc, arg, end) + re_opcode_t op; + unsigned char *loc; + int arg; + unsigned char *end; +{ + register unsigned char *pfrom = end; + register unsigned char *pto = end + 3; + + while (pfrom != loc) + *--pto = *--pfrom; + + store_op1 (op, loc, arg); +} + + +/* Like `insert_op1', but for two two-byte parameters ARG1 and ARG2. */ + +static void +insert_op2 (op, loc, arg1, arg2, end) + re_opcode_t op; + unsigned char *loc; + int arg1, arg2; + unsigned char *end; +{ + register unsigned char *pfrom = end; + register unsigned char *pto = end + 5; + + while (pfrom != loc) + *--pto = *--pfrom; + + store_op2 (op, loc, arg1, arg2); +} + + +/* P points to just after a ^ in PATTERN. Return true if that ^ comes + after an alternative or a begin-subexpression. We assume there is at + least one character before the ^. */ + +static boolean +at_begline_loc_p (pattern, p, syntax) + const char *pattern, *p; + reg_syntax_t syntax; +{ + const char *prev = p - 2; + boolean prev_prev_backslash = prev > pattern && prev[-1] == '\\'; + + return + /* After a subexpression? */ + (*prev == '(' && (syntax & RE_NO_BK_PARENS || prev_prev_backslash)) + /* After an alternative? */ + || (*prev == '|' && (syntax & RE_NO_BK_VBAR || prev_prev_backslash)); +} + + +/* The dual of at_begline_loc_p. This one is for $. We assume there is + at least one character after the $, i.e., `P < PEND'. */ + +static boolean +at_endline_loc_p (p, pend, syntax) + const char *p, *pend; + reg_syntax_t syntax; +{ + const char *next = p; + boolean next_backslash = *next == '\\'; + const char *next_next = p + 1 < pend ? p + 1 : 0; + + return + /* Before a subexpression? */ + (syntax & RE_NO_BK_PARENS ? *next == ')' + : next_backslash && next_next && *next_next == ')') + /* Before an alternative? */ + || (syntax & RE_NO_BK_VBAR ? *next == '|' + : next_backslash && next_next && *next_next == '|'); +} + + +/* Returns true if REGNUM is in one of COMPILE_STACK's elements and + false if it's not. */ + +static boolean +group_in_compile_stack (compile_stack, regnum) + compile_stack_type compile_stack; + regnum_t regnum; +{ + int this_element; + + for (this_element = compile_stack.avail - 1; + this_element >= 0; + this_element--) + if (compile_stack.stack[this_element].regnum == regnum) + return true; + + return false; +} + + +/* Read the ending character of a range (in a bracket expression) from the + uncompiled pattern *P_PTR (which ends at PEND). We assume the + starting character is in `P[-2]'. (`P[-1]' is the character `-'.) + Then we set the translation of all bits between the starting and + ending characters (inclusive) in the compiled pattern B. + + Return an error code. + + We use these short variable names so we can use the same macros as + `regex_compile' itself. */ + +static reg_errcode_t +compile_range (range_start_char, p_ptr, pend, translate, syntax, b) + unsigned int range_start_char; + const char **p_ptr, *pend; + RE_TRANSLATE_TYPE translate; + reg_syntax_t syntax; + unsigned char *b; +{ + unsigned this_char; + const char *p = *p_ptr; + reg_errcode_t ret; +#if _LIBC + const unsigned char *collseq; + unsigned int start_colseq; + unsigned int end_colseq; +#else + unsigned end_char; +#endif + + if (p == pend) + return REG_ERANGE; + + /* Have to increment the pointer into the pattern string, so the + caller isn't still at the ending character. */ + (*p_ptr)++; + + /* Report an error if the range is empty and the syntax prohibits this. */ + ret = syntax & RE_NO_EMPTY_RANGES ? REG_ERANGE : REG_NOERROR; + +#if _LIBC + collseq = (const unsigned char *) _NL_CURRENT (LC_COLLATE, + _NL_COLLATE_COLLSEQMB); + + start_colseq = collseq[(unsigned char) TRANSLATE (range_start_char)]; + end_colseq = collseq[(unsigned char) TRANSLATE (p[0])]; + for (this_char = 0; this_char <= (unsigned char) -1; ++this_char) + { + unsigned int this_colseq = collseq[(unsigned char) TRANSLATE (this_char)]; + + if (start_colseq <= this_colseq && this_colseq <= end_colseq) + { + SET_LIST_BIT (TRANSLATE (this_char)); + ret = REG_NOERROR; + } + } +#else + /* Here we see why `this_char' has to be larger than an `unsigned + char' -- we would otherwise go into an infinite loop, since all + characters <= 0xff. */ + range_start_char = TRANSLATE (range_start_char); + end_char = TRANSLATE (p[0]); + for (this_char = range_start_char; this_char <= end_char; ++this_char) + { + SET_LIST_BIT (TRANSLATE (this_char)); + ret = REG_NOERROR; + } +#endif + + return ret; +} + +/* re_compile_fastmap computes a ``fastmap'' for the compiled pattern in + BUFP. A fastmap records which of the (1 << BYTEWIDTH) possible + characters can start a string that matches the pattern. This fastmap + is used by re_search to skip quickly over impossible starting points. + + The caller must supply the address of a (1 << BYTEWIDTH)-byte data + area as BUFP->fastmap. + + We set the `fastmap', `fastmap_accurate', and `can_be_null' fields in + the pattern buffer. + + Returns 0 if we succeed, -2 if an internal error. */ + +int +re_compile_fastmap (bufp) + struct re_pattern_buffer *bufp; +{ + int j, k; +#ifdef MATCH_MAY_ALLOCATE + fail_stack_type fail_stack; +#endif +#ifndef REGEX_MALLOC + char *destination; +#endif + + register char *fastmap = bufp->fastmap; + unsigned char *pattern = bufp->buffer; + unsigned char *p = pattern; + register unsigned char *pend = pattern + bufp->used; + +#ifdef REL_ALLOC + /* This holds the pointer to the failure stack, when + it is allocated relocatably. */ + fail_stack_elt_t *failure_stack_ptr; +#endif + + /* Assume that each path through the pattern can be null until + proven otherwise. We set this false at the bottom of switch + statement, to which we get only if a particular path doesn't + match the empty string. */ + boolean path_can_be_null = true; + + /* We aren't doing a `succeed_n' to begin with. */ + boolean succeed_n_p = false; + + assert (fastmap != NULL && p != NULL); + + INIT_FAIL_STACK (); + bzero (fastmap, 1 << BYTEWIDTH); /* Assume nothing's valid. */ + bufp->fastmap_accurate = 1; /* It will be when we're done. */ + bufp->can_be_null = 0; + + while (1) + { + if (p == pend || *p == succeed) + { + /* We have reached the (effective) end of pattern. */ + if (!FAIL_STACK_EMPTY ()) + { + bufp->can_be_null |= path_can_be_null; + + /* Reset for next path. */ + path_can_be_null = true; + + p = fail_stack.stack[--fail_stack.avail].pointer; + + continue; + } + else + break; + } + + /* We should never be about to go beyond the end of the pattern. */ + assert (p < pend); + + switch (SWITCH_ENUM_CAST ((re_opcode_t) *p++)) + { + + /* I guess the idea here is to simply not bother with a fastmap + if a backreference is used, since it's too hard to figure out + the fastmap for the corresponding group. Setting + `can_be_null' stops `re_search_2' from using the fastmap, so + that is all we do. */ + case duplicate: + bufp->can_be_null = 1; + goto done; + + + /* Following are the cases which match a character. These end + with `break'. */ + + case exactn: + fastmap[p[1]] = 1; + break; + + + case charset: + for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--) + if (p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH))) + fastmap[j] = 1; + break; + + + case charset_not: + /* Chars beyond end of map must be allowed. */ + for (j = *p * BYTEWIDTH; j < (1 << BYTEWIDTH); j++) + fastmap[j] = 1; + + for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--) + if (!(p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH)))) + fastmap[j] = 1; + break; + + + case wordchar: + for (j = 0; j < (1 << BYTEWIDTH); j++) + if (SYNTAX (j) == Sword) + fastmap[j] = 1; + break; + + + case notwordchar: + for (j = 0; j < (1 << BYTEWIDTH); j++) + if (SYNTAX (j) != Sword) + fastmap[j] = 1; + break; + + + case anychar: + { + int fastmap_newline = fastmap['\n']; + + /* `.' matches anything ... */ + for (j = 0; j < (1 << BYTEWIDTH); j++) + fastmap[j] = 1; + + /* ... except perhaps newline. */ + if (!(bufp->syntax & RE_DOT_NEWLINE)) + fastmap['\n'] = fastmap_newline; + + /* Return if we have already set `can_be_null'; if we have, + then the fastmap is irrelevant. Something's wrong here. */ + else if (bufp->can_be_null) + goto done; + + /* Otherwise, have to check alternative paths. */ + break; + } + +#ifdef emacs + case syntaxspec: + k = *p++; + for (j = 0; j < (1 << BYTEWIDTH); j++) + if (SYNTAX (j) == (enum syntaxcode) k) + fastmap[j] = 1; + break; + + + case notsyntaxspec: + k = *p++; + for (j = 0; j < (1 << BYTEWIDTH); j++) + if (SYNTAX (j) != (enum syntaxcode) k) + fastmap[j] = 1; + break; + + + /* All cases after this match the empty string. These end with + `continue'. */ + + + case before_dot: + case at_dot: + case after_dot: + continue; +#endif /* emacs */ + + + case no_op: + case begline: + case endline: + case begbuf: + case endbuf: + case wordbound: + case notwordbound: + case wordbeg: + case wordend: + case push_dummy_failure: + continue; + + + case jump_n: + case pop_failure_jump: + case maybe_pop_jump: + case jump: + case jump_past_alt: + case dummy_failure_jump: + EXTRACT_NUMBER_AND_INCR (j, p); + p += j; + if (j > 0) + continue; + + /* Jump backward implies we just went through the body of a + loop and matched nothing. Opcode jumped to should be + `on_failure_jump' or `succeed_n'. Just treat it like an + ordinary jump. For a * loop, it has pushed its failure + point already; if so, discard that as redundant. */ + if ((re_opcode_t) *p != on_failure_jump + && (re_opcode_t) *p != succeed_n) + continue; + + p++; + EXTRACT_NUMBER_AND_INCR (j, p); + p += j; + + /* If what's on the stack is where we are now, pop it. */ + if (!FAIL_STACK_EMPTY () + && fail_stack.stack[fail_stack.avail - 1].pointer == p) + fail_stack.avail--; + + continue; + + + case on_failure_jump: + case on_failure_keep_string_jump: + handle_on_failure_jump: + EXTRACT_NUMBER_AND_INCR (j, p); + + /* For some patterns, e.g., `(a?)?', `p+j' here points to the + end of the pattern. We don't want to push such a point, + since when we restore it above, entering the switch will + increment `p' past the end of the pattern. We don't need + to push such a point since we obviously won't find any more + fastmap entries beyond `pend'. Such a pattern can match + the null string, though. */ + if (p + j < pend) + { + if (!PUSH_PATTERN_OP (p + j, fail_stack)) + { + RESET_FAIL_STACK (); + return -2; + } + } + else + bufp->can_be_null = 1; + + if (succeed_n_p) + { + EXTRACT_NUMBER_AND_INCR (k, p); /* Skip the n. */ + succeed_n_p = false; + } + + continue; + + + case succeed_n: + /* Get to the number of times to succeed. */ + p += 2; + + /* Increment p past the n for when k != 0. */ + EXTRACT_NUMBER_AND_INCR (k, p); + if (k == 0) + { + p -= 4; + succeed_n_p = true; /* Spaghetti code alert. */ + goto handle_on_failure_jump; + } + continue; + + + case set_number_at: + p += 4; + continue; + + + case start_memory: + case stop_memory: + p += 2; + continue; + + + default: + abort (); /* We have listed all the cases. */ + } /* switch *p++ */ + + /* Getting here means we have found the possible starting + characters for one path of the pattern -- and that the empty + string does not match. We need not follow this path further. + Instead, look at the next alternative (remembered on the + stack), or quit if no more. The test at the top of the loop + does these things. */ + path_can_be_null = false; + p = pend; + } /* while p */ + + /* Set `can_be_null' for the last path (also the first path, if the + pattern is empty). */ + bufp->can_be_null |= path_can_be_null; + + done: + RESET_FAIL_STACK (); + return 0; +} /* re_compile_fastmap */ +#ifdef _LIBC +weak_alias (__re_compile_fastmap, re_compile_fastmap) +#endif + +/* Set REGS to hold NUM_REGS registers, storing them in STARTS and + ENDS. Subsequent matches using PATTERN_BUFFER and REGS will use + this memory for recording register information. STARTS and ENDS + must be allocated using the malloc library routine, and must each + be at least NUM_REGS * sizeof (regoff_t) bytes long. + + If NUM_REGS == 0, then subsequent matches should allocate their own + register data. + + Unless this function is called, the first search or match using + PATTERN_BUFFER will allocate its own register data, without + freeing the old data. */ + +void +re_set_registers (bufp, regs, num_regs, starts, ends) + struct re_pattern_buffer *bufp; + struct re_registers *regs; + unsigned num_regs; + regoff_t *starts, *ends; +{ + if (num_regs) + { + bufp->regs_allocated = REGS_REALLOCATE; + regs->num_regs = num_regs; + regs->start = starts; + regs->end = ends; + } + else + { + bufp->regs_allocated = REGS_UNALLOCATED; + regs->num_regs = 0; + regs->start = regs->end = (regoff_t *) 0; + } +} +#ifdef _LIBC +weak_alias (__re_set_registers, re_set_registers) +#endif + +/* Searching routines. */ + +/* Like re_search_2, below, but only one string is specified, and + doesn't let you say where to stop matching. */ + +int +re_search (bufp, string, size, startpos, range, regs) + struct re_pattern_buffer *bufp; + const char *string; + int size, startpos, range; + struct re_registers *regs; +{ + return re_search_2 (bufp, NULL, 0, string, size, startpos, range, + regs, size); +} +#ifdef _LIBC +weak_alias (__re_search, re_search) +#endif + + +/* Using the compiled pattern in BUFP->buffer, first tries to match the + virtual concatenation of STRING1 and STRING2, starting first at index + STARTPOS, then at STARTPOS + 1, and so on. + + STRING1 and STRING2 have length SIZE1 and SIZE2, respectively. + + RANGE is how far to scan while trying to match. RANGE = 0 means try + only at STARTPOS; in general, the last start tried is STARTPOS + + RANGE. + + In REGS, return the indices of the virtual concatenation of STRING1 + and STRING2 that matched the entire BUFP->buffer and its contained + subexpressions. + + Do not consider matching one past the index STOP in the virtual + concatenation of STRING1 and STRING2. + + We return either the position in the strings at which the match was + found, -1 if no match, or -2 if error (such as failure + stack overflow). */ + +int +re_search_2 (bufp, string1, size1, string2, size2, startpos, range, regs, stop) + struct re_pattern_buffer *bufp; + const char *string1, *string2; + int size1, size2; + int startpos; + int range; + struct re_registers *regs; + int stop; +{ + int val; + register char *fastmap = bufp->fastmap; + register RE_TRANSLATE_TYPE translate = bufp->translate; + int total_size = size1 + size2; + int endpos = startpos + range; + + /* Check for out-of-range STARTPOS. */ + if (startpos < 0 || startpos > total_size) + return -1; + + /* Fix up RANGE if it might eventually take us outside + the virtual concatenation of STRING1 and STRING2. + Make sure we won't move STARTPOS below 0 or above TOTAL_SIZE. */ + if (endpos < 0) + range = 0 - startpos; + else if (endpos > total_size) + range = total_size - startpos; + + /* If the search isn't to be a backwards one, don't waste time in a + search for a pattern that must be anchored. */ + if (bufp->used > 0 && range > 0 + && ((re_opcode_t) bufp->buffer[0] == begbuf + /* `begline' is like `begbuf' if it cannot match at newlines. */ + || ((re_opcode_t) bufp->buffer[0] == begline + && !bufp->newline_anchor))) + { + if (startpos > 0) + return -1; + else + range = 1; + } + +#ifdef emacs + /* In a forward search for something that starts with \=. + don't keep searching past point. */ + if (bufp->used > 0 && (re_opcode_t) bufp->buffer[0] == at_dot && range > 0) + { + range = PT - startpos; + if (range <= 0) + return -1; + } +#endif /* emacs */ + + /* Update the fastmap now if not correct already. */ + if (fastmap && !bufp->fastmap_accurate) + if (re_compile_fastmap (bufp) == -2) + return -2; + + /* Loop through the string, looking for a place to start matching. */ + for (;;) + { + /* If a fastmap is supplied, skip quickly over characters that + cannot be the start of a match. If the pattern can match the + null string, however, we don't need to skip characters; we want + the first null string. */ + if (fastmap && startpos < total_size && !bufp->can_be_null) + { + if (range > 0) /* Searching forwards. */ + { + register const char *d; + register int lim = 0; + int irange = range; + + if (startpos < size1 && startpos + range >= size1) + lim = range - (size1 - startpos); + + d = (startpos >= size1 ? string2 - size1 : string1) + startpos; + + /* Written out as an if-else to avoid testing `translate' + inside the loop. */ + if (translate) + while (range > lim + && !fastmap[(unsigned char) + translate[(unsigned char) *d++]]) + range--; + else + while (range > lim && !fastmap[(unsigned char) *d++]) + range--; + + startpos += irange - range; + } + else /* Searching backwards. */ + { + register char c = (size1 == 0 || startpos >= size1 + ? string2[startpos - size1] + : string1[startpos]); + + if (!fastmap[(unsigned char) TRANSLATE (c)]) + goto advance; + } + } + + /* If can't match the null string, and that's all we have left, fail. */ + if (range >= 0 && startpos == total_size && fastmap + && !bufp->can_be_null) + return -1; + + val = re_match_2_internal (bufp, string1, size1, string2, size2, + startpos, regs, stop); +#ifndef REGEX_MALLOC +# ifdef C_ALLOCA + alloca (0); +# endif +#endif + + if (val >= 0) + return startpos; + + if (val == -2) + return -2; + + advance: + if (!range) + break; + else if (range > 0) + { + range--; + startpos++; + } + else + { + range++; + startpos--; + } + } + return -1; +} /* re_search_2 */ +#ifdef _LIBC +weak_alias (__re_search_2, re_search_2) +#endif + +/* This converts PTR, a pointer into one of the search strings `string1' + and `string2' into an offset from the beginning of that string. */ +#define POINTER_TO_OFFSET(ptr) \ + (FIRST_STRING_P (ptr) \ + ? ((regoff_t) ((ptr) - string1)) \ + : ((regoff_t) ((ptr) - string2 + size1))) + +/* Macros for dealing with the split strings in re_match_2. */ + +#define MATCHING_IN_FIRST_STRING (dend == end_match_1) + +/* Call before fetching a character with *d. This switches over to + string2 if necessary. */ +#define PREFETCH() \ + while (d == dend) \ + { \ + /* End of string2 => fail. */ \ + if (dend == end_match_2) \ + goto fail; \ + /* End of string1 => advance to string2. */ \ + d = string2; \ + dend = end_match_2; \ + } + + +/* Test if at very beginning or at very end of the virtual concatenation + of `string1' and `string2'. If only one string, it's `string2'. */ +#define AT_STRINGS_BEG(d) ((d) == (size1 ? string1 : string2) || !size2) +#define AT_STRINGS_END(d) ((d) == end2) + + +/* Test if D points to a character which is word-constituent. We have + two special cases to check for: if past the end of string1, look at + the first character in string2; and if before the beginning of + string2, look at the last character in string1. */ +#define WORDCHAR_P(d) \ + (SYNTAX ((d) == end1 ? *string2 \ + : (d) == string2 - 1 ? *(end1 - 1) : *(d)) \ + == Sword) + +/* Disabled due to a compiler bug -- see comment at case wordbound */ +#if 0 +/* Test if the character before D and the one at D differ with respect + to being word-constituent. */ +#define AT_WORD_BOUNDARY(d) \ + (AT_STRINGS_BEG (d) || AT_STRINGS_END (d) \ + || WORDCHAR_P (d - 1) != WORDCHAR_P (d)) +#endif + +/* Free everything we malloc. */ +#ifdef MATCH_MAY_ALLOCATE +# define FREE_VAR(var) if (var) REGEX_FREE (var); var = NULL +# define FREE_VARIABLES() \ + do { \ + REGEX_FREE_STACK (fail_stack.stack); \ + FREE_VAR (regstart); \ + FREE_VAR (regend); \ + FREE_VAR (old_regstart); \ + FREE_VAR (old_regend); \ + FREE_VAR (best_regstart); \ + FREE_VAR (best_regend); \ + FREE_VAR (reg_info); \ + FREE_VAR (reg_dummy); \ + FREE_VAR (reg_info_dummy); \ + } while (0) +#else +# define FREE_VARIABLES() ((void)0) /* Do nothing! But inhibit gcc warning. */ +#endif /* not MATCH_MAY_ALLOCATE */ + +/* These values must meet several constraints. They must not be valid + register values; since we have a limit of 255 registers (because + we use only one byte in the pattern for the register number), we can + use numbers larger than 255. They must differ by 1, because of + NUM_FAILURE_ITEMS above. And the value for the lowest register must + be larger than the value for the highest register, so we do not try + to actually save any registers when none are active. */ +#define NO_HIGHEST_ACTIVE_REG (1 << BYTEWIDTH) +#define NO_LOWEST_ACTIVE_REG (NO_HIGHEST_ACTIVE_REG + 1) + +/* Matching routines. */ + +#ifndef emacs /* Emacs never uses this. */ +/* re_match is like re_match_2 except it takes only a single string. */ + +int +re_match (bufp, string, size, pos, regs) + struct re_pattern_buffer *bufp; + const char *string; + int size, pos; + struct re_registers *regs; +{ + int result = re_match_2_internal (bufp, NULL, 0, string, size, + pos, regs, size); +# ifndef REGEX_MALLOC +# ifdef C_ALLOCA + alloca (0); +# endif +# endif + return result; +} +# ifdef _LIBC +weak_alias (__re_match, re_match) +# endif +#endif /* not emacs */ + +static boolean group_match_null_string_p _RE_ARGS ((unsigned char **p, + unsigned char *end, + register_info_type *reg_info)); +static boolean alt_match_null_string_p _RE_ARGS ((unsigned char *p, + unsigned char *end, + register_info_type *reg_info)); +static boolean common_op_match_null_string_p _RE_ARGS ((unsigned char **p, + unsigned char *end, + register_info_type *reg_info)); +static int bcmp_translate _RE_ARGS ((const char *s1, const char *s2, + int len, char *translate)); + +/* re_match_2 matches the compiled pattern in BUFP against the + the (virtual) concatenation of STRING1 and STRING2 (of length SIZE1 + and SIZE2, respectively). We start matching at POS, and stop + matching at STOP. + + If REGS is non-null and the `no_sub' field of BUFP is nonzero, we + store offsets for the substring each group matched in REGS. See the + documentation for exactly how many groups we fill. + + We return -1 if no match, -2 if an internal error (such as the + failure stack overflowing). Otherwise, we return the length of the + matched substring. */ + +int +re_match_2 (bufp, string1, size1, string2, size2, pos, regs, stop) + struct re_pattern_buffer *bufp; + const char *string1, *string2; + int size1, size2; + int pos; + struct re_registers *regs; + int stop; +{ + int result = re_match_2_internal (bufp, string1, size1, string2, size2, + pos, regs, stop); +#ifndef REGEX_MALLOC +# ifdef C_ALLOCA + alloca (0); +# endif +#endif + return result; +} +#ifdef _LIBC +weak_alias (__re_match_2, re_match_2) +#endif + +/* This is a separate function so that we can force an alloca cleanup + afterwards. */ +static int +re_match_2_internal (bufp, string1, size1, string2, size2, pos, regs, stop) + struct re_pattern_buffer *bufp; + const char *string1, *string2; + int size1, size2; + int pos; + struct re_registers *regs; + int stop; +{ + /* General temporaries. */ + int mcnt; + unsigned char *p1; + + /* Just past the end of the corresponding string. */ + const char *end1, *end2; + + /* Pointers into string1 and string2, just past the last characters in + each to consider matching. */ + const char *end_match_1, *end_match_2; + + /* Where we are in the data, and the end of the current string. */ + const char *d, *dend; + + /* Where we are in the pattern, and the end of the pattern. */ + unsigned char *p = bufp->buffer; + register unsigned char *pend = p + bufp->used; + + /* Mark the opcode just after a start_memory, so we can test for an + empty subpattern when we get to the stop_memory. */ + unsigned char *just_past_start_mem = 0; + + /* We use this to map every character in the string. */ + RE_TRANSLATE_TYPE translate = bufp->translate; + + /* Failure point stack. Each place that can handle a failure further + down the line pushes a failure point on this stack. It consists of + restart, regend, and reg_info for all registers corresponding to + the subexpressions we're currently inside, plus the number of such + registers, and, finally, two char *'s. The first char * is where + to resume scanning the pattern; the second one is where to resume + scanning the strings. If the latter is zero, the failure point is + a ``dummy''; if a failure happens and the failure point is a dummy, + it gets discarded and the next next one is tried. */ +#ifdef MATCH_MAY_ALLOCATE /* otherwise, this is global. */ + fail_stack_type fail_stack; +#endif +#ifdef DEBUG + static unsigned failure_id; + unsigned nfailure_points_pushed = 0, nfailure_points_popped = 0; +#endif + +#ifdef REL_ALLOC + /* This holds the pointer to the failure stack, when + it is allocated relocatably. */ + fail_stack_elt_t *failure_stack_ptr; +#endif + + /* We fill all the registers internally, independent of what we + return, for use in backreferences. The number here includes + an element for register zero. */ + size_t num_regs = bufp->re_nsub + 1; + + /* The currently active registers. */ + active_reg_t lowest_active_reg = NO_LOWEST_ACTIVE_REG; + active_reg_t highest_active_reg = NO_HIGHEST_ACTIVE_REG; + + /* Information on the contents of registers. These are pointers into + the input strings; they record just what was matched (on this + attempt) by a subexpression part of the pattern, that is, the + regnum-th regstart pointer points to where in the pattern we began + matching and the regnum-th regend points to right after where we + stopped matching the regnum-th subexpression. (The zeroth register + keeps track of what the whole pattern matches.) */ +#ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global. */ + const char **regstart, **regend; +#endif + + /* If a group that's operated upon by a repetition operator fails to + match anything, then the register for its start will need to be + restored because it will have been set to wherever in the string we + are when we last see its open-group operator. Similarly for a + register's end. */ +#ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global. */ + const char **old_regstart, **old_regend; +#endif + + /* The is_active field of reg_info helps us keep track of which (possibly + nested) subexpressions we are currently in. The matched_something + field of reg_info[reg_num] helps us tell whether or not we have + matched any of the pattern so far this time through the reg_num-th + subexpression. These two fields get reset each time through any + loop their register is in. */ +#ifdef MATCH_MAY_ALLOCATE /* otherwise, this is global. */ + register_info_type *reg_info; +#endif + + /* The following record the register info as found in the above + variables when we find a match better than any we've seen before. + This happens as we backtrack through the failure points, which in + turn happens only if we have not yet matched the entire string. */ + unsigned best_regs_set = false; +#ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global. */ + const char **best_regstart, **best_regend; +#endif + + /* Logically, this is `best_regend[0]'. But we don't want to have to + allocate space for that if we're not allocating space for anything + else (see below). Also, we never need info about register 0 for + any of the other register vectors, and it seems rather a kludge to + treat `best_regend' differently than the rest. So we keep track of + the end of the best match so far in a separate variable. We + initialize this to NULL so that when we backtrack the first time + and need to test it, it's not garbage. */ + const char *match_end = NULL; + + /* This helps SET_REGS_MATCHED avoid doing redundant work. */ + int set_regs_matched_done = 0; + + /* Used when we pop values we don't care about. */ +#ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global. */ + const char **reg_dummy; + register_info_type *reg_info_dummy; +#endif + +#ifdef DEBUG + /* Counts the total number of registers pushed. */ + unsigned num_regs_pushed = 0; +#endif + + DEBUG_PRINT1 ("\n\nEntering re_match_2.\n"); + + INIT_FAIL_STACK (); + +#ifdef MATCH_MAY_ALLOCATE + /* Do not bother to initialize all the register variables if there are + no groups in the pattern, as it takes a fair amount of time. If + there are groups, we include space for register 0 (the whole + pattern), even though we never use it, since it simplifies the + array indexing. We should fix this. */ + if (bufp->re_nsub) + { + regstart = REGEX_TALLOC (num_regs, const char *); + regend = REGEX_TALLOC (num_regs, const char *); + old_regstart = REGEX_TALLOC (num_regs, const char *); + old_regend = REGEX_TALLOC (num_regs, const char *); + best_regstart = REGEX_TALLOC (num_regs, const char *); + best_regend = REGEX_TALLOC (num_regs, const char *); + reg_info = REGEX_TALLOC (num_regs, register_info_type); + reg_dummy = REGEX_TALLOC (num_regs, const char *); + reg_info_dummy = REGEX_TALLOC (num_regs, register_info_type); + + if (!(regstart && regend && old_regstart && old_regend && reg_info + && best_regstart && best_regend && reg_dummy && reg_info_dummy)) + { + FREE_VARIABLES (); + return -2; + } + } + else + { + /* We must initialize all our variables to NULL, so that + `FREE_VARIABLES' doesn't try to free them. */ + regstart = regend = old_regstart = old_regend = best_regstart + = best_regend = reg_dummy = NULL; + reg_info = reg_info_dummy = (register_info_type *) NULL; + } +#endif /* MATCH_MAY_ALLOCATE */ + + /* The starting position is bogus. */ + if (pos < 0 || pos > size1 + size2) + { + FREE_VARIABLES (); + return -1; + } + + /* Initialize subexpression text positions to -1 to mark ones that no + start_memory/stop_memory has been seen for. Also initialize the + register information struct. */ + for (mcnt = 1; (unsigned) mcnt < num_regs; mcnt++) + { + regstart[mcnt] = regend[mcnt] + = old_regstart[mcnt] = old_regend[mcnt] = REG_UNSET_VALUE; + + REG_MATCH_NULL_STRING_P (reg_info[mcnt]) = MATCH_NULL_UNSET_VALUE; + IS_ACTIVE (reg_info[mcnt]) = 0; + MATCHED_SOMETHING (reg_info[mcnt]) = 0; + EVER_MATCHED_SOMETHING (reg_info[mcnt]) = 0; + } + + /* We move `string1' into `string2' if the latter's empty -- but not if + `string1' is null. */ + if (size2 == 0 && string1 != NULL) + { + string2 = string1; + size2 = size1; + string1 = 0; + size1 = 0; + } + end1 = string1 + size1; + end2 = string2 + size2; + + /* Compute where to stop matching, within the two strings. */ + if (stop <= size1) + { + end_match_1 = string1 + stop; + end_match_2 = string2; + } + else + { + end_match_1 = end1; + end_match_2 = string2 + stop - size1; + } + + /* `p' scans through the pattern as `d' scans through the data. + `dend' is the end of the input string that `d' points within. `d' + is advanced into the following input string whenever necessary, but + this happens before fetching; therefore, at the beginning of the + loop, `d' can be pointing at the end of a string, but it cannot + equal `string2'. */ + if (size1 > 0 && pos <= size1) + { + d = string1 + pos; + dend = end_match_1; + } + else + { + d = string2 + pos - size1; + dend = end_match_2; + } + + DEBUG_PRINT1 ("The compiled pattern is:\n"); + DEBUG_PRINT_COMPILED_PATTERN (bufp, p, pend); + DEBUG_PRINT1 ("The string to match is: `"); + DEBUG_PRINT_DOUBLE_STRING (d, string1, size1, string2, size2); + DEBUG_PRINT1 ("'\n"); + + /* This loops over pattern commands. It exits by returning from the + function if the match is complete, or it drops through if the match + fails at this starting point in the input data. */ + for (;;) + { +#ifdef _LIBC + DEBUG_PRINT2 ("\n%p: ", p); +#else + DEBUG_PRINT2 ("\n0x%x: ", p); +#endif + + if (p == pend) + { /* End of pattern means we might have succeeded. */ + DEBUG_PRINT1 ("end of pattern ... "); + + /* If we haven't matched the entire string, and we want the + longest match, try backtracking. */ + if (d != end_match_2) + { + /* 1 if this match ends in the same string (string1 or string2) + as the best previous match. */ + boolean same_str_p = (FIRST_STRING_P (match_end) + == MATCHING_IN_FIRST_STRING); + /* 1 if this match is the best seen so far. */ + boolean best_match_p; + + /* AIX compiler got confused when this was combined + with the previous declaration. */ + if (same_str_p) + best_match_p = d > match_end; + else + best_match_p = !MATCHING_IN_FIRST_STRING; + + DEBUG_PRINT1 ("backtracking.\n"); + + if (!FAIL_STACK_EMPTY ()) + { /* More failure points to try. */ + + /* If exceeds best match so far, save it. */ + if (!best_regs_set || best_match_p) + { + best_regs_set = true; + match_end = d; + + DEBUG_PRINT1 ("\nSAVING match as best so far.\n"); + + for (mcnt = 1; (unsigned) mcnt < num_regs; mcnt++) + { + best_regstart[mcnt] = regstart[mcnt]; + best_regend[mcnt] = regend[mcnt]; + } + } + goto fail; + } + + /* If no failure points, don't restore garbage. And if + last match is real best match, don't restore second + best one. */ + else if (best_regs_set && !best_match_p) + { + restore_best_regs: + /* Restore best match. It may happen that `dend == + end_match_1' while the restored d is in string2. + For example, the pattern `x.*y.*z' against the + strings `x-' and `y-z-', if the two strings are + not consecutive in memory. */ + DEBUG_PRINT1 ("Restoring best registers.\n"); + + d = match_end; + dend = ((d >= string1 && d <= end1) + ? end_match_1 : end_match_2); + + for (mcnt = 1; (unsigned) mcnt < num_regs; mcnt++) + { + regstart[mcnt] = best_regstart[mcnt]; + regend[mcnt] = best_regend[mcnt]; + } + } + } /* d != end_match_2 */ + + succeed_label: + DEBUG_PRINT1 ("Accepting match.\n"); + + /* If caller wants register contents data back, do it. */ + if (regs && !bufp->no_sub) + { + /* Have the register data arrays been allocated? */ + if (bufp->regs_allocated == REGS_UNALLOCATED) + { /* No. So allocate them with malloc. We need one + extra element beyond `num_regs' for the `-1' marker + GNU code uses. */ + regs->num_regs = MAX (RE_NREGS, num_regs + 1); + regs->start = TALLOC (regs->num_regs, regoff_t); + regs->end = TALLOC (regs->num_regs, regoff_t); + if (regs->start == NULL || regs->end == NULL) + { + FREE_VARIABLES (); + return -2; + } + bufp->regs_allocated = REGS_REALLOCATE; + } + else if (bufp->regs_allocated == REGS_REALLOCATE) + { /* Yes. If we need more elements than were already + allocated, reallocate them. If we need fewer, just + leave it alone. */ + if (regs->num_regs < num_regs + 1) + { + regs->num_regs = num_regs + 1; + RETALLOC (regs->start, regs->num_regs, regoff_t); + RETALLOC (regs->end, regs->num_regs, regoff_t); + if (regs->start == NULL || regs->end == NULL) + { + FREE_VARIABLES (); + return -2; + } + } + } + else + { + /* These braces fend off a "empty body in an else-statement" + warning under GCC when assert expands to nothing. */ + assert (bufp->regs_allocated == REGS_FIXED); + } + + /* Convert the pointer data in `regstart' and `regend' to + indices. Register zero has to be set differently, + since we haven't kept track of any info for it. */ + if (regs->num_regs > 0) + { + regs->start[0] = pos; + regs->end[0] = (MATCHING_IN_FIRST_STRING + ? ((regoff_t) (d - string1)) + : ((regoff_t) (d - string2 + size1))); + } + + /* Go through the first `min (num_regs, regs->num_regs)' + registers, since that is all we initialized. */ + for (mcnt = 1; (unsigned) mcnt < MIN (num_regs, regs->num_regs); + mcnt++) + { + if (REG_UNSET (regstart[mcnt]) || REG_UNSET (regend[mcnt])) + regs->start[mcnt] = regs->end[mcnt] = -1; + else + { + regs->start[mcnt] + = (regoff_t) POINTER_TO_OFFSET (regstart[mcnt]); + regs->end[mcnt] + = (regoff_t) POINTER_TO_OFFSET (regend[mcnt]); + } + } + + /* If the regs structure we return has more elements than + were in the pattern, set the extra elements to -1. If + we (re)allocated the registers, this is the case, + because we always allocate enough to have at least one + -1 at the end. */ + for (mcnt = num_regs; (unsigned) mcnt < regs->num_regs; mcnt++) + regs->start[mcnt] = regs->end[mcnt] = -1; + } /* regs && !bufp->no_sub */ + + DEBUG_PRINT4 ("%u failure points pushed, %u popped (%u remain).\n", + nfailure_points_pushed, nfailure_points_popped, + nfailure_points_pushed - nfailure_points_popped); + DEBUG_PRINT2 ("%u registers pushed.\n", num_regs_pushed); + + mcnt = d - pos - (MATCHING_IN_FIRST_STRING + ? string1 + : string2 - size1); + + DEBUG_PRINT2 ("Returning %d from re_match_2.\n", mcnt); + + FREE_VARIABLES (); + return mcnt; + } + + /* Otherwise match next pattern command. */ + switch (SWITCH_ENUM_CAST ((re_opcode_t) *p++)) + { + /* Ignore these. Used to ignore the n of succeed_n's which + currently have n == 0. */ + case no_op: + DEBUG_PRINT1 ("EXECUTING no_op.\n"); + break; + + case succeed: + DEBUG_PRINT1 ("EXECUTING succeed.\n"); + goto succeed_label; + + /* Match the next n pattern characters exactly. The following + byte in the pattern defines n, and the n bytes after that + are the characters to match. */ + case exactn: + mcnt = *p++; + DEBUG_PRINT2 ("EXECUTING exactn %d.\n", mcnt); + + /* This is written out as an if-else so we don't waste time + testing `translate' inside the loop. */ + if (translate) + { + do + { + PREFETCH (); + if ((unsigned char) translate[(unsigned char) *d++] + != (unsigned char) *p++) + goto fail; + } + while (--mcnt); + } + else + { + do + { + PREFETCH (); + if (*d++ != (char) *p++) goto fail; + } + while (--mcnt); + } + SET_REGS_MATCHED (); + break; + + + /* Match any character except possibly a newline or a null. */ + case anychar: + DEBUG_PRINT1 ("EXECUTING anychar.\n"); + + PREFETCH (); + + if ((!(bufp->syntax & RE_DOT_NEWLINE) && TRANSLATE (*d) == '\n') + || (bufp->syntax & RE_DOT_NOT_NULL && TRANSLATE (*d) == '\000')) + goto fail; + + SET_REGS_MATCHED (); + DEBUG_PRINT2 (" Matched `%d'.\n", *d); + d++; + break; + + + case charset: + case charset_not: + { + register unsigned char c; + boolean not = (re_opcode_t) *(p - 1) == charset_not; + + DEBUG_PRINT2 ("EXECUTING charset%s.\n", not ? "_not" : ""); + + PREFETCH (); + c = TRANSLATE (*d); /* The character to match. */ + + /* Cast to `unsigned' instead of `unsigned char' in case the + bit list is a full 32 bytes long. */ + if (c < (unsigned) (*p * BYTEWIDTH) + && p[1 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH))) + not = !not; + + p += 1 + *p; + + if (!not) goto fail; + + SET_REGS_MATCHED (); + d++; + break; + } + + + /* The beginning of a group is represented by start_memory. + The arguments are the register number in the next byte, and the + number of groups inner to this one in the next. The text + matched within the group is recorded (in the internal + registers data structure) under the register number. */ + case start_memory: + DEBUG_PRINT3 ("EXECUTING start_memory %d (%d):\n", *p, p[1]); + + /* Find out if this group can match the empty string. */ + p1 = p; /* To send to group_match_null_string_p. */ + + if (REG_MATCH_NULL_STRING_P (reg_info[*p]) == MATCH_NULL_UNSET_VALUE) + REG_MATCH_NULL_STRING_P (reg_info[*p]) + = group_match_null_string_p (&p1, pend, reg_info); + + /* Save the position in the string where we were the last time + we were at this open-group operator in case the group is + operated upon by a repetition operator, e.g., with `(a*)*b' + against `ab'; then we want to ignore where we are now in + the string in case this attempt to match fails. */ + old_regstart[*p] = REG_MATCH_NULL_STRING_P (reg_info[*p]) + ? REG_UNSET (regstart[*p]) ? d : regstart[*p] + : regstart[*p]; + DEBUG_PRINT2 (" old_regstart: %d\n", + POINTER_TO_OFFSET (old_regstart[*p])); + + regstart[*p] = d; + DEBUG_PRINT2 (" regstart: %d\n", POINTER_TO_OFFSET (regstart[*p])); + + IS_ACTIVE (reg_info[*p]) = 1; + MATCHED_SOMETHING (reg_info[*p]) = 0; + + /* Clear this whenever we change the register activity status. */ + set_regs_matched_done = 0; + + /* This is the new highest active register. */ + highest_active_reg = *p; + + /* If nothing was active before, this is the new lowest active + register. */ + if (lowest_active_reg == NO_LOWEST_ACTIVE_REG) + lowest_active_reg = *p; + + /* Move past the register number and inner group count. */ + p += 2; + just_past_start_mem = p; + + break; + + + /* The stop_memory opcode represents the end of a group. Its + arguments are the same as start_memory's: the register + number, and the number of inner groups. */ + case stop_memory: + DEBUG_PRINT3 ("EXECUTING stop_memory %d (%d):\n", *p, p[1]); + + /* We need to save the string position the last time we were at + this close-group operator in case the group is operated + upon by a repetition operator, e.g., with `((a*)*(b*)*)*' + against `aba'; then we want to ignore where we are now in + the string in case this attempt to match fails. */ + old_regend[*p] = REG_MATCH_NULL_STRING_P (reg_info[*p]) + ? REG_UNSET (regend[*p]) ? d : regend[*p] + : regend[*p]; + DEBUG_PRINT2 (" old_regend: %d\n", + POINTER_TO_OFFSET (old_regend[*p])); + + regend[*p] = d; + DEBUG_PRINT2 (" regend: %d\n", POINTER_TO_OFFSET (regend[*p])); + + /* This register isn't active anymore. */ + IS_ACTIVE (reg_info[*p]) = 0; + + /* Clear this whenever we change the register activity status. */ + set_regs_matched_done = 0; + + /* If this was the only register active, nothing is active + anymore. */ + if (lowest_active_reg == highest_active_reg) + { + lowest_active_reg = NO_LOWEST_ACTIVE_REG; + highest_active_reg = NO_HIGHEST_ACTIVE_REG; + } + else + { /* We must scan for the new highest active register, since + it isn't necessarily one less than now: consider + (a(b)c(d(e)f)g). When group 3 ends, after the f), the + new highest active register is 1. */ + unsigned char r = *p - 1; + while (r > 0 && !IS_ACTIVE (reg_info[r])) + r--; + + /* If we end up at register zero, that means that we saved + the registers as the result of an `on_failure_jump', not + a `start_memory', and we jumped to past the innermost + `stop_memory'. For example, in ((.)*) we save + registers 1 and 2 as a result of the *, but when we pop + back to the second ), we are at the stop_memory 1. + Thus, nothing is active. */ + if (r == 0) + { + lowest_active_reg = NO_LOWEST_ACTIVE_REG; + highest_active_reg = NO_HIGHEST_ACTIVE_REG; + } + else + highest_active_reg = r; + } + + /* If just failed to match something this time around with a + group that's operated on by a repetition operator, try to + force exit from the ``loop'', and restore the register + information for this group that we had before trying this + last match. */ + if ((!MATCHED_SOMETHING (reg_info[*p]) + || just_past_start_mem == p - 1) + && (p + 2) < pend) + { + boolean is_a_jump_n = false; + + p1 = p + 2; + mcnt = 0; + switch ((re_opcode_t) *p1++) + { + case jump_n: + is_a_jump_n = true; + case pop_failure_jump: + case maybe_pop_jump: + case jump: + case dummy_failure_jump: + EXTRACT_NUMBER_AND_INCR (mcnt, p1); + if (is_a_jump_n) + p1 += 2; + break; + + default: + /* do nothing */ ; + } + p1 += mcnt; + + /* If the next operation is a jump backwards in the pattern + to an on_failure_jump right before the start_memory + corresponding to this stop_memory, exit from the loop + by forcing a failure after pushing on the stack the + on_failure_jump's jump in the pattern, and d. */ + if (mcnt < 0 && (re_opcode_t) *p1 == on_failure_jump + && (re_opcode_t) p1[3] == start_memory && p1[4] == *p) + { + /* If this group ever matched anything, then restore + what its registers were before trying this last + failed match, e.g., with `(a*)*b' against `ab' for + regstart[1], and, e.g., with `((a*)*(b*)*)*' + against `aba' for regend[3]. + + Also restore the registers for inner groups for, + e.g., `((a*)(b*))*' against `aba' (register 3 would + otherwise get trashed). */ + + if (EVER_MATCHED_SOMETHING (reg_info[*p])) + { + unsigned r; + + EVER_MATCHED_SOMETHING (reg_info[*p]) = 0; + + /* Restore this and inner groups' (if any) registers. */ + for (r = *p; r < (unsigned) *p + (unsigned) *(p + 1); + r++) + { + regstart[r] = old_regstart[r]; + + /* xx why this test? */ + if (old_regend[r] >= regstart[r]) + regend[r] = old_regend[r]; + } + } + p1++; + EXTRACT_NUMBER_AND_INCR (mcnt, p1); + PUSH_FAILURE_POINT (p1 + mcnt, d, -2); + + goto fail; + } + } + + /* Move past the register number and the inner group count. */ + p += 2; + break; + + + /* \ has been turned into a `duplicate' command which is + followed by the numeric value of as the register number. */ + case duplicate: + { + register const char *d2, *dend2; + int regno = *p++; /* Get which register to match against. */ + DEBUG_PRINT2 ("EXECUTING duplicate %d.\n", regno); + + /* Can't back reference a group which we've never matched. */ + if (REG_UNSET (regstart[regno]) || REG_UNSET (regend[regno])) + goto fail; + + /* Where in input to try to start matching. */ + d2 = regstart[regno]; + + /* Where to stop matching; if both the place to start and + the place to stop matching are in the same string, then + set to the place to stop, otherwise, for now have to use + the end of the first string. */ + + dend2 = ((FIRST_STRING_P (regstart[regno]) + == FIRST_STRING_P (regend[regno])) + ? regend[regno] : end_match_1); + for (;;) + { + /* If necessary, advance to next segment in register + contents. */ + while (d2 == dend2) + { + if (dend2 == end_match_2) break; + if (dend2 == regend[regno]) break; + + /* End of string1 => advance to string2. */ + d2 = string2; + dend2 = regend[regno]; + } + /* At end of register contents => success */ + if (d2 == dend2) break; + + /* If necessary, advance to next segment in data. */ + PREFETCH (); + + /* How many characters left in this segment to match. */ + mcnt = dend - d; + + /* Want how many consecutive characters we can match in + one shot, so, if necessary, adjust the count. */ + if (mcnt > dend2 - d2) + mcnt = dend2 - d2; + + /* Compare that many; failure if mismatch, else move + past them. */ + if (translate + ? bcmp_translate (d, d2, mcnt, translate) + : memcmp (d, d2, mcnt)) + goto fail; + d += mcnt, d2 += mcnt; + + /* Do this because we've match some characters. */ + SET_REGS_MATCHED (); + } + } + break; + + + /* begline matches the empty string at the beginning of the string + (unless `not_bol' is set in `bufp'), and, if + `newline_anchor' is set, after newlines. */ + case begline: + DEBUG_PRINT1 ("EXECUTING begline.\n"); + + if (AT_STRINGS_BEG (d)) + { + if (!bufp->not_bol) break; + } + else if (d[-1] == '\n' && bufp->newline_anchor) + { + break; + } + /* In all other cases, we fail. */ + goto fail; + + + /* endline is the dual of begline. */ + case endline: + DEBUG_PRINT1 ("EXECUTING endline.\n"); + + if (AT_STRINGS_END (d)) + { + if (!bufp->not_eol) break; + } + + /* We have to ``prefetch'' the next character. */ + else if ((d == end1 ? *string2 : *d) == '\n' + && bufp->newline_anchor) + { + break; + } + goto fail; + + + /* Match at the very beginning of the data. */ + case begbuf: + DEBUG_PRINT1 ("EXECUTING begbuf.\n"); + if (AT_STRINGS_BEG (d)) + break; + goto fail; + + + /* Match at the very end of the data. */ + case endbuf: + DEBUG_PRINT1 ("EXECUTING endbuf.\n"); + if (AT_STRINGS_END (d)) + break; + goto fail; + + + /* on_failure_keep_string_jump is used to optimize `.*\n'. It + pushes NULL as the value for the string on the stack. Then + `pop_failure_point' will keep the current value for the + string, instead of restoring it. To see why, consider + matching `foo\nbar' against `.*\n'. The .* matches the foo; + then the . fails against the \n. But the next thing we want + to do is match the \n against the \n; if we restored the + string value, we would be back at the foo. + + Because this is used only in specific cases, we don't need to + check all the things that `on_failure_jump' does, to make + sure the right things get saved on the stack. Hence we don't + share its code. The only reason to push anything on the + stack at all is that otherwise we would have to change + `anychar's code to do something besides goto fail in this + case; that seems worse than this. */ + case on_failure_keep_string_jump: + DEBUG_PRINT1 ("EXECUTING on_failure_keep_string_jump"); + + EXTRACT_NUMBER_AND_INCR (mcnt, p); +#ifdef _LIBC + DEBUG_PRINT3 (" %d (to %p):\n", mcnt, p + mcnt); +#else + DEBUG_PRINT3 (" %d (to 0x%x):\n", mcnt, p + mcnt); +#endif + + PUSH_FAILURE_POINT (p + mcnt, NULL, -2); + break; + + + /* Uses of on_failure_jump: + + Each alternative starts with an on_failure_jump that points + to the beginning of the next alternative. Each alternative + except the last ends with a jump that in effect jumps past + the rest of the alternatives. (They really jump to the + ending jump of the following alternative, because tensioning + these jumps is a hassle.) + + Repeats start with an on_failure_jump that points past both + the repetition text and either the following jump or + pop_failure_jump back to this on_failure_jump. */ + case on_failure_jump: + on_failure: + DEBUG_PRINT1 ("EXECUTING on_failure_jump"); + + EXTRACT_NUMBER_AND_INCR (mcnt, p); +#ifdef _LIBC + DEBUG_PRINT3 (" %d (to %p)", mcnt, p + mcnt); +#else + DEBUG_PRINT3 (" %d (to 0x%x)", mcnt, p + mcnt); +#endif + + /* If this on_failure_jump comes right before a group (i.e., + the original * applied to a group), save the information + for that group and all inner ones, so that if we fail back + to this point, the group's information will be correct. + For example, in \(a*\)*\1, we need the preceding group, + and in \(zz\(a*\)b*\)\2, we need the inner group. */ + + /* We can't use `p' to check ahead because we push + a failure point to `p + mcnt' after we do this. */ + p1 = p; + + /* We need to skip no_op's before we look for the + start_memory in case this on_failure_jump is happening as + the result of a completed succeed_n, as in \(a\)\{1,3\}b\1 + against aba. */ + while (p1 < pend && (re_opcode_t) *p1 == no_op) + p1++; + + if (p1 < pend && (re_opcode_t) *p1 == start_memory) + { + /* We have a new highest active register now. This will + get reset at the start_memory we are about to get to, + but we will have saved all the registers relevant to + this repetition op, as described above. */ + highest_active_reg = *(p1 + 1) + *(p1 + 2); + if (lowest_active_reg == NO_LOWEST_ACTIVE_REG) + lowest_active_reg = *(p1 + 1); + } + + DEBUG_PRINT1 (":\n"); + PUSH_FAILURE_POINT (p + mcnt, d, -2); + break; + + + /* A smart repeat ends with `maybe_pop_jump'. + We change it to either `pop_failure_jump' or `jump'. */ + case maybe_pop_jump: + EXTRACT_NUMBER_AND_INCR (mcnt, p); + DEBUG_PRINT2 ("EXECUTING maybe_pop_jump %d.\n", mcnt); + { + register unsigned char *p2 = p; + + /* Compare the beginning of the repeat with what in the + pattern follows its end. If we can establish that there + is nothing that they would both match, i.e., that we + would have to backtrack because of (as in, e.g., `a*a') + then we can change to pop_failure_jump, because we'll + never have to backtrack. + + This is not true in the case of alternatives: in + `(a|ab)*' we do need to backtrack to the `ab' alternative + (e.g., if the string was `ab'). But instead of trying to + detect that here, the alternative has put on a dummy + failure point which is what we will end up popping. */ + + /* Skip over open/close-group commands. + If what follows this loop is a ...+ construct, + look at what begins its body, since we will have to + match at least one of that. */ + while (1) + { + if (p2 + 2 < pend + && ((re_opcode_t) *p2 == stop_memory + || (re_opcode_t) *p2 == start_memory)) + p2 += 3; + else if (p2 + 6 < pend + && (re_opcode_t) *p2 == dummy_failure_jump) + p2 += 6; + else + break; + } + + p1 = p + mcnt; + /* p1[0] ... p1[2] are the `on_failure_jump' corresponding + to the `maybe_finalize_jump' of this case. Examine what + follows. */ + + /* If we're at the end of the pattern, we can change. */ + if (p2 == pend) + { + /* Consider what happens when matching ":\(.*\)" + against ":/". I don't really understand this code + yet. */ + p[-3] = (unsigned char) pop_failure_jump; + DEBUG_PRINT1 + (" End of pattern: change to `pop_failure_jump'.\n"); + } + + else if ((re_opcode_t) *p2 == exactn + || (bufp->newline_anchor && (re_opcode_t) *p2 == endline)) + { + register unsigned char c + = *p2 == (unsigned char) endline ? '\n' : p2[2]; + + if ((re_opcode_t) p1[3] == exactn && p1[5] != c) + { + p[-3] = (unsigned char) pop_failure_jump; + DEBUG_PRINT3 (" %c != %c => pop_failure_jump.\n", + c, p1[5]); + } + + else if ((re_opcode_t) p1[3] == charset + || (re_opcode_t) p1[3] == charset_not) + { + int not = (re_opcode_t) p1[3] == charset_not; + + if (c < (unsigned char) (p1[4] * BYTEWIDTH) + && p1[5 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH))) + not = !not; + + /* `not' is equal to 1 if c would match, which means + that we can't change to pop_failure_jump. */ + if (!not) + { + p[-3] = (unsigned char) pop_failure_jump; + DEBUG_PRINT1 (" No match => pop_failure_jump.\n"); + } + } + } + else if ((re_opcode_t) *p2 == charset) + { + /* We win if the first character of the loop is not part + of the charset. */ + if ((re_opcode_t) p1[3] == exactn + && ! ((int) p2[1] * BYTEWIDTH > (int) p1[5] + && (p2[2 + p1[5] / BYTEWIDTH] + & (1 << (p1[5] % BYTEWIDTH))))) + { + p[-3] = (unsigned char) pop_failure_jump; + DEBUG_PRINT1 (" No match => pop_failure_jump.\n"); + } + + else if ((re_opcode_t) p1[3] == charset_not) + { + int idx; + /* We win if the charset_not inside the loop + lists every character listed in the charset after. */ + for (idx = 0; idx < (int) p2[1]; idx++) + if (! (p2[2 + idx] == 0 + || (idx < (int) p1[4] + && ((p2[2 + idx] & ~ p1[5 + idx]) == 0)))) + break; + + if (idx == p2[1]) + { + p[-3] = (unsigned char) pop_failure_jump; + DEBUG_PRINT1 (" No match => pop_failure_jump.\n"); + } + } + else if ((re_opcode_t) p1[3] == charset) + { + int idx; + /* We win if the charset inside the loop + has no overlap with the one after the loop. */ + for (idx = 0; + idx < (int) p2[1] && idx < (int) p1[4]; + idx++) + if ((p2[2 + idx] & p1[5 + idx]) != 0) + break; + + if (idx == p2[1] || idx == p1[4]) + { + p[-3] = (unsigned char) pop_failure_jump; + DEBUG_PRINT1 (" No match => pop_failure_jump.\n"); + } + } + } + } + p -= 2; /* Point at relative address again. */ + if ((re_opcode_t) p[-1] != pop_failure_jump) + { + p[-1] = (unsigned char) jump; + DEBUG_PRINT1 (" Match => jump.\n"); + goto unconditional_jump; + } + /* Note fall through. */ + + + /* The end of a simple repeat has a pop_failure_jump back to + its matching on_failure_jump, where the latter will push a + failure point. The pop_failure_jump takes off failure + points put on by this pop_failure_jump's matching + on_failure_jump; we got through the pattern to here from the + matching on_failure_jump, so didn't fail. */ + case pop_failure_jump: + { + /* We need to pass separate storage for the lowest and + highest registers, even though we don't care about the + actual values. Otherwise, we will restore only one + register from the stack, since lowest will == highest in + `pop_failure_point'. */ + active_reg_t dummy_low_reg, dummy_high_reg; + unsigned char *pdummy; + const char *sdummy; + + DEBUG_PRINT1 ("EXECUTING pop_failure_jump.\n"); + POP_FAILURE_POINT (sdummy, pdummy, + dummy_low_reg, dummy_high_reg, + reg_dummy, reg_dummy, reg_info_dummy); + } + /* Note fall through. */ + + unconditional_jump: +#ifdef _LIBC + DEBUG_PRINT2 ("\n%p: ", p); +#else + DEBUG_PRINT2 ("\n0x%x: ", p); +#endif + /* Note fall through. */ + + /* Unconditionally jump (without popping any failure points). */ + case jump: + EXTRACT_NUMBER_AND_INCR (mcnt, p); /* Get the amount to jump. */ + DEBUG_PRINT2 ("EXECUTING jump %d ", mcnt); + p += mcnt; /* Do the jump. */ +#ifdef _LIBC + DEBUG_PRINT2 ("(to %p).\n", p); +#else + DEBUG_PRINT2 ("(to 0x%x).\n", p); +#endif + break; + + + /* We need this opcode so we can detect where alternatives end + in `group_match_null_string_p' et al. */ + case jump_past_alt: + DEBUG_PRINT1 ("EXECUTING jump_past_alt.\n"); + goto unconditional_jump; + + + /* Normally, the on_failure_jump pushes a failure point, which + then gets popped at pop_failure_jump. We will end up at + pop_failure_jump, also, and with a pattern of, say, `a+', we + are skipping over the on_failure_jump, so we have to push + something meaningless for pop_failure_jump to pop. */ + case dummy_failure_jump: + DEBUG_PRINT1 ("EXECUTING dummy_failure_jump.\n"); + /* It doesn't matter what we push for the string here. What + the code at `fail' tests is the value for the pattern. */ + PUSH_FAILURE_POINT (NULL, NULL, -2); + goto unconditional_jump; + + + /* At the end of an alternative, we need to push a dummy failure + point in case we are followed by a `pop_failure_jump', because + we don't want the failure point for the alternative to be + popped. For example, matching `(a|ab)*' against `aab' + requires that we match the `ab' alternative. */ + case push_dummy_failure: + DEBUG_PRINT1 ("EXECUTING push_dummy_failure.\n"); + /* See comments just above at `dummy_failure_jump' about the + two zeroes. */ + PUSH_FAILURE_POINT (NULL, NULL, -2); + break; + + /* Have to succeed matching what follows at least n times. + After that, handle like `on_failure_jump'. */ + case succeed_n: + EXTRACT_NUMBER (mcnt, p + 2); + DEBUG_PRINT2 ("EXECUTING succeed_n %d.\n", mcnt); + + assert (mcnt >= 0); + /* Originally, this is how many times we HAVE to succeed. */ + if (mcnt > 0) + { + mcnt--; + p += 2; + STORE_NUMBER_AND_INCR (p, mcnt); +#ifdef _LIBC + DEBUG_PRINT3 (" Setting %p to %d.\n", p - 2, mcnt); +#else + DEBUG_PRINT3 (" Setting 0x%x to %d.\n", p - 2, mcnt); +#endif + } + else if (mcnt == 0) + { +#ifdef _LIBC + DEBUG_PRINT2 (" Setting two bytes from %p to no_op.\n", p+2); +#else + DEBUG_PRINT2 (" Setting two bytes from 0x%x to no_op.\n", p+2); +#endif + p[2] = (unsigned char) no_op; + p[3] = (unsigned char) no_op; + goto on_failure; + } + break; + + case jump_n: + EXTRACT_NUMBER (mcnt, p + 2); + DEBUG_PRINT2 ("EXECUTING jump_n %d.\n", mcnt); + + /* Originally, this is how many times we CAN jump. */ + if (mcnt) + { + mcnt--; + STORE_NUMBER (p + 2, mcnt); +#ifdef _LIBC + DEBUG_PRINT3 (" Setting %p to %d.\n", p + 2, mcnt); +#else + DEBUG_PRINT3 (" Setting 0x%x to %d.\n", p + 2, mcnt); +#endif + goto unconditional_jump; + } + /* If don't have to jump any more, skip over the rest of command. */ + else + p += 4; + break; + + case set_number_at: + { + DEBUG_PRINT1 ("EXECUTING set_number_at.\n"); + + EXTRACT_NUMBER_AND_INCR (mcnt, p); + p1 = p + mcnt; + EXTRACT_NUMBER_AND_INCR (mcnt, p); +#ifdef _LIBC + DEBUG_PRINT3 (" Setting %p to %d.\n", p1, mcnt); +#else + DEBUG_PRINT3 (" Setting 0x%x to %d.\n", p1, mcnt); +#endif + STORE_NUMBER (p1, mcnt); + break; + } + +#if 0 + /* The DEC Alpha C compiler 3.x generates incorrect code for the + test WORDCHAR_P (d - 1) != WORDCHAR_P (d) in the expansion of + AT_WORD_BOUNDARY, so this code is disabled. Expanding the + macro and introducing temporary variables works around the bug. */ + + case wordbound: + DEBUG_PRINT1 ("EXECUTING wordbound.\n"); + if (AT_WORD_BOUNDARY (d)) + break; + goto fail; + + case notwordbound: + DEBUG_PRINT1 ("EXECUTING notwordbound.\n"); + if (AT_WORD_BOUNDARY (d)) + goto fail; + break; +#else + case wordbound: + { + boolean prevchar, thischar; + + DEBUG_PRINT1 ("EXECUTING wordbound.\n"); + if (AT_STRINGS_BEG (d) || AT_STRINGS_END (d)) + break; + + prevchar = WORDCHAR_P (d - 1); + thischar = WORDCHAR_P (d); + if (prevchar != thischar) + break; + goto fail; + } + + case notwordbound: + { + boolean prevchar, thischar; + + DEBUG_PRINT1 ("EXECUTING notwordbound.\n"); + if (AT_STRINGS_BEG (d) || AT_STRINGS_END (d)) + goto fail; + + prevchar = WORDCHAR_P (d - 1); + thischar = WORDCHAR_P (d); + if (prevchar != thischar) + goto fail; + break; + } +#endif + + case wordbeg: + DEBUG_PRINT1 ("EXECUTING wordbeg.\n"); + if (WORDCHAR_P (d) && (AT_STRINGS_BEG (d) || !WORDCHAR_P (d - 1))) + break; + goto fail; + + case wordend: + DEBUG_PRINT1 ("EXECUTING wordend.\n"); + if (!AT_STRINGS_BEG (d) && WORDCHAR_P (d - 1) + && (!WORDCHAR_P (d) || AT_STRINGS_END (d))) + break; + goto fail; + +#ifdef emacs + case before_dot: + DEBUG_PRINT1 ("EXECUTING before_dot.\n"); + if (PTR_CHAR_POS ((unsigned char *) d) >= point) + goto fail; + break; + + case at_dot: + DEBUG_PRINT1 ("EXECUTING at_dot.\n"); + if (PTR_CHAR_POS ((unsigned char *) d) != point) + goto fail; + break; + + case after_dot: + DEBUG_PRINT1 ("EXECUTING after_dot.\n"); + if (PTR_CHAR_POS ((unsigned char *) d) <= point) + goto fail; + break; + + case syntaxspec: + DEBUG_PRINT2 ("EXECUTING syntaxspec %d.\n", mcnt); + mcnt = *p++; + goto matchsyntax; + + case wordchar: + DEBUG_PRINT1 ("EXECUTING Emacs wordchar.\n"); + mcnt = (int) Sword; + matchsyntax: + PREFETCH (); + /* Can't use *d++ here; SYNTAX may be an unsafe macro. */ + d++; + if (SYNTAX (d[-1]) != (enum syntaxcode) mcnt) + goto fail; + SET_REGS_MATCHED (); + break; + + case notsyntaxspec: + DEBUG_PRINT2 ("EXECUTING notsyntaxspec %d.\n", mcnt); + mcnt = *p++; + goto matchnotsyntax; + + case notwordchar: + DEBUG_PRINT1 ("EXECUTING Emacs notwordchar.\n"); + mcnt = (int) Sword; + matchnotsyntax: + PREFETCH (); + /* Can't use *d++ here; SYNTAX may be an unsafe macro. */ + d++; + if (SYNTAX (d[-1]) == (enum syntaxcode) mcnt) + goto fail; + SET_REGS_MATCHED (); + break; + +#else /* not emacs */ + case wordchar: + DEBUG_PRINT1 ("EXECUTING non-Emacs wordchar.\n"); + PREFETCH (); + if (!WORDCHAR_P (d)) + goto fail; + SET_REGS_MATCHED (); + d++; + break; + + case notwordchar: + DEBUG_PRINT1 ("EXECUTING non-Emacs notwordchar.\n"); + PREFETCH (); + if (WORDCHAR_P (d)) + goto fail; + SET_REGS_MATCHED (); + d++; + break; +#endif /* not emacs */ + + default: + abort (); + } + continue; /* Successfully executed one pattern command; keep going. */ + + + /* We goto here if a matching operation fails. */ + fail: + if (!FAIL_STACK_EMPTY ()) + { /* A restart point is known. Restore to that state. */ + DEBUG_PRINT1 ("\nFAIL:\n"); + POP_FAILURE_POINT (d, p, + lowest_active_reg, highest_active_reg, + regstart, regend, reg_info); + + /* If this failure point is a dummy, try the next one. */ + if (!p) + goto fail; + + /* If we failed to the end of the pattern, don't examine *p. */ + assert (p <= pend); + if (p < pend) + { + boolean is_a_jump_n = false; + + /* If failed to a backwards jump that's part of a repetition + loop, need to pop this failure point and use the next one. */ + switch ((re_opcode_t) *p) + { + case jump_n: + is_a_jump_n = true; + case maybe_pop_jump: + case pop_failure_jump: + case jump: + p1 = p + 1; + EXTRACT_NUMBER_AND_INCR (mcnt, p1); + p1 += mcnt; + + if ((is_a_jump_n && (re_opcode_t) *p1 == succeed_n) + || (!is_a_jump_n + && (re_opcode_t) *p1 == on_failure_jump)) + goto fail; + break; + default: + /* do nothing */ ; + } + } + + if (d >= string1 && d <= end1) + dend = end_match_1; + } + else + break; /* Matching at this starting point really fails. */ + } /* for (;;) */ + + if (best_regs_set) + goto restore_best_regs; + + FREE_VARIABLES (); + + return -1; /* Failure to match. */ +} /* re_match_2 */ + +/* Subroutine definitions for re_match_2. */ + + +/* We are passed P pointing to a register number after a start_memory. + + Return true if the pattern up to the corresponding stop_memory can + match the empty string, and false otherwise. + + If we find the matching stop_memory, sets P to point to one past its number. + Otherwise, sets P to an undefined byte less than or equal to END. + + We don't handle duplicates properly (yet). */ + +static boolean +group_match_null_string_p (p, end, reg_info) + unsigned char **p, *end; + register_info_type *reg_info; +{ + int mcnt; + /* Point to after the args to the start_memory. */ + unsigned char *p1 = *p + 2; + + while (p1 < end) + { + /* Skip over opcodes that can match nothing, and return true or + false, as appropriate, when we get to one that can't, or to the + matching stop_memory. */ + + switch ((re_opcode_t) *p1) + { + /* Could be either a loop or a series of alternatives. */ + case on_failure_jump: + p1++; + EXTRACT_NUMBER_AND_INCR (mcnt, p1); + + /* If the next operation is not a jump backwards in the + pattern. */ + + if (mcnt >= 0) + { + /* Go through the on_failure_jumps of the alternatives, + seeing if any of the alternatives cannot match nothing. + The last alternative starts with only a jump, + whereas the rest start with on_failure_jump and end + with a jump, e.g., here is the pattern for `a|b|c': + + /on_failure_jump/0/6/exactn/1/a/jump_past_alt/0/6 + /on_failure_jump/0/6/exactn/1/b/jump_past_alt/0/3 + /exactn/1/c + + So, we have to first go through the first (n-1) + alternatives and then deal with the last one separately. */ + + + /* Deal with the first (n-1) alternatives, which start + with an on_failure_jump (see above) that jumps to right + past a jump_past_alt. */ + + while ((re_opcode_t) p1[mcnt-3] == jump_past_alt) + { + /* `mcnt' holds how many bytes long the alternative + is, including the ending `jump_past_alt' and + its number. */ + + if (!alt_match_null_string_p (p1, p1 + mcnt - 3, + reg_info)) + return false; + + /* Move to right after this alternative, including the + jump_past_alt. */ + p1 += mcnt; + + /* Break if it's the beginning of an n-th alternative + that doesn't begin with an on_failure_jump. */ + if ((re_opcode_t) *p1 != on_failure_jump) + break; + + /* Still have to check that it's not an n-th + alternative that starts with an on_failure_jump. */ + p1++; + EXTRACT_NUMBER_AND_INCR (mcnt, p1); + if ((re_opcode_t) p1[mcnt-3] != jump_past_alt) + { + /* Get to the beginning of the n-th alternative. */ + p1 -= 3; + break; + } + } + + /* Deal with the last alternative: go back and get number + of the `jump_past_alt' just before it. `mcnt' contains + the length of the alternative. */ + EXTRACT_NUMBER (mcnt, p1 - 2); + + if (!alt_match_null_string_p (p1, p1 + mcnt, reg_info)) + return false; + + p1 += mcnt; /* Get past the n-th alternative. */ + } /* if mcnt > 0 */ + break; + + + case stop_memory: + assert (p1[1] == **p); + *p = p1 + 2; + return true; + + + default: + if (!common_op_match_null_string_p (&p1, end, reg_info)) + return false; + } + } /* while p1 < end */ + + return false; +} /* group_match_null_string_p */ + + +/* Similar to group_match_null_string_p, but doesn't deal with alternatives: + It expects P to be the first byte of a single alternative and END one + byte past the last. The alternative can contain groups. */ + +static boolean +alt_match_null_string_p (p, end, reg_info) + unsigned char *p, *end; + register_info_type *reg_info; +{ + int mcnt; + unsigned char *p1 = p; + + while (p1 < end) + { + /* Skip over opcodes that can match nothing, and break when we get + to one that can't. */ + + switch ((re_opcode_t) *p1) + { + /* It's a loop. */ + case on_failure_jump: + p1++; + EXTRACT_NUMBER_AND_INCR (mcnt, p1); + p1 += mcnt; + break; + + default: + if (!common_op_match_null_string_p (&p1, end, reg_info)) + return false; + } + } /* while p1 < end */ + + return true; +} /* alt_match_null_string_p */ + + +/* Deals with the ops common to group_match_null_string_p and + alt_match_null_string_p. + + Sets P to one after the op and its arguments, if any. */ + +static boolean +common_op_match_null_string_p (p, end, reg_info) + unsigned char **p, *end; + register_info_type *reg_info; +{ + int mcnt; + boolean ret; + int reg_no; + unsigned char *p1 = *p; + + switch ((re_opcode_t) *p1++) + { + case no_op: + case begline: + case endline: + case begbuf: + case endbuf: + case wordbeg: + case wordend: + case wordbound: + case notwordbound: +#ifdef emacs + case before_dot: + case at_dot: + case after_dot: +#endif + break; + + case start_memory: + reg_no = *p1; + assert (reg_no > 0 && reg_no <= MAX_REGNUM); + ret = group_match_null_string_p (&p1, end, reg_info); + + /* Have to set this here in case we're checking a group which + contains a group and a back reference to it. */ + + if (REG_MATCH_NULL_STRING_P (reg_info[reg_no]) == MATCH_NULL_UNSET_VALUE) + REG_MATCH_NULL_STRING_P (reg_info[reg_no]) = ret; + + if (!ret) + return false; + break; + + /* If this is an optimized succeed_n for zero times, make the jump. */ + case jump: + EXTRACT_NUMBER_AND_INCR (mcnt, p1); + if (mcnt >= 0) + p1 += mcnt; + else + return false; + break; + + case succeed_n: + /* Get to the number of times to succeed. */ + p1 += 2; + EXTRACT_NUMBER_AND_INCR (mcnt, p1); + + if (mcnt == 0) + { + p1 -= 4; + EXTRACT_NUMBER_AND_INCR (mcnt, p1); + p1 += mcnt; + } + else + return false; + break; + + case duplicate: + if (!REG_MATCH_NULL_STRING_P (reg_info[*p1])) + return false; + break; + + case set_number_at: + p1 += 4; + + default: + /* All other opcodes mean we cannot match the empty string. */ + return false; + } + + *p = p1; + return true; +} /* common_op_match_null_string_p */ + + +/* Return zero if TRANSLATE[S1] and TRANSLATE[S2] are identical for LEN + bytes; nonzero otherwise. */ + +static int +bcmp_translate (s1, s2, len, translate) + const char *s1, *s2; + register int len; + RE_TRANSLATE_TYPE translate; +{ + register const unsigned char *p1 = (const unsigned char *) s1; + register const unsigned char *p2 = (const unsigned char *) s2; + while (len) + { + if (translate[*p1++] != translate[*p2++]) return 1; + len--; + } + return 0; +} + +/* Entry points for GNU code. */ + +/* re_compile_pattern is the GNU regular expression compiler: it + compiles PATTERN (of length SIZE) and puts the result in BUFP. + Returns 0 if the pattern was valid, otherwise an error string. + + Assumes the `allocated' (and perhaps `buffer') and `translate' fields + are set in BUFP on entry. + + We call regex_compile to do the actual compilation. */ + +const char * +re_compile_pattern (pattern, length, bufp) + const char *pattern; + size_t length; + struct re_pattern_buffer *bufp; +{ + reg_errcode_t ret; + + /* GNU code is written to assume at least RE_NREGS registers will be set + (and at least one extra will be -1). */ + bufp->regs_allocated = REGS_UNALLOCATED; + + /* And GNU code determines whether or not to get register information + by passing null for the REGS argument to re_match, etc., not by + setting no_sub. */ + bufp->no_sub = 0; + + /* Match anchors at newline. */ + bufp->newline_anchor = 1; + + ret = regex_compile (pattern, length, re_syntax_options, bufp); + + if (!ret) + return NULL; + return gettext (re_error_msgid + re_error_msgid_idx[(int) ret]); +} +#ifdef _LIBC +weak_alias (__re_compile_pattern, re_compile_pattern) +#endif + +/* Entry points compatible with 4.2 BSD regex library. We don't define + them unless specifically requested. */ + +#if defined _REGEX_RE_COMP || defined _LIBC + +/* BSD has one and only one pattern buffer. */ +static struct re_pattern_buffer re_comp_buf; + +char * +#ifdef _LIBC +/* Make these definitions weak in libc, so POSIX programs can redefine + these names if they don't use our functions, and still use + regcomp/regexec below without link errors. */ +weak_function +#endif +re_comp (s) + const char *s; +{ + reg_errcode_t ret; + + if (!s) + { + if (!re_comp_buf.buffer) + return gettext ("No previous regular expression"); + return 0; + } + + if (!re_comp_buf.buffer) + { + re_comp_buf.buffer = (unsigned char *) malloc (200); + if (re_comp_buf.buffer == NULL) + return (char *) gettext (re_error_msgid + + re_error_msgid_idx[(int) REG_ESPACE]); + re_comp_buf.allocated = 200; + + re_comp_buf.fastmap = (char *) malloc (1 << BYTEWIDTH); + if (re_comp_buf.fastmap == NULL) + return (char *) gettext (re_error_msgid + + re_error_msgid_idx[(int) REG_ESPACE]); + } + + /* Since `re_exec' always passes NULL for the `regs' argument, we + don't need to initialize the pattern buffer fields which affect it. */ + + /* Match anchors at newlines. */ + re_comp_buf.newline_anchor = 1; + + ret = regex_compile (s, strlen (s), re_syntax_options, &re_comp_buf); + + if (!ret) + return NULL; + + /* Yes, we're discarding `const' here if !HAVE_LIBINTL. */ + return (char *) gettext (re_error_msgid + re_error_msgid_idx[(int) ret]); +} + + +int +#ifdef _LIBC +weak_function +#endif +re_exec (s) + const char *s; +{ + const int len = strlen (s); + return + 0 <= re_search (&re_comp_buf, s, len, 0, len, (struct re_registers *) 0); +} + +#endif /* _REGEX_RE_COMP */ + +/* POSIX.2 functions. Don't define these for Emacs. */ + +#ifndef emacs + +/* regcomp takes a regular expression as a string and compiles it. + + PREG is a regex_t *. We do not expect any fields to be initialized, + since POSIX says we shouldn't. Thus, we set + + `buffer' to the compiled pattern; + `used' to the length of the compiled pattern; + `syntax' to RE_SYNTAX_POSIX_EXTENDED if the + REG_EXTENDED bit in CFLAGS is set; otherwise, to + RE_SYNTAX_POSIX_BASIC; + `newline_anchor' to REG_NEWLINE being set in CFLAGS; + `fastmap' to an allocated space for the fastmap; + `fastmap_accurate' to zero; + `re_nsub' to the number of subexpressions in PATTERN. + + PATTERN is the address of the pattern string. + + CFLAGS is a series of bits which affect compilation. + + If REG_EXTENDED is set, we use POSIX extended syntax; otherwise, we + use POSIX basic syntax. + + If REG_NEWLINE is set, then . and [^...] don't match newline. + Also, regexec will try a match beginning after every newline. + + If REG_ICASE is set, then we considers upper- and lowercase + versions of letters to be equivalent when matching. + + If REG_NOSUB is set, then when PREG is passed to regexec, that + routine will report only success or failure, and nothing about the + registers. + + It returns 0 if it succeeds, nonzero if it doesn't. (See regex.h for + the return codes and their meanings.) */ + +int +regcomp (preg, pattern, cflags) + regex_t *preg; + const char *pattern; + int cflags; +{ + reg_errcode_t ret; + reg_syntax_t syntax + = (cflags & REG_EXTENDED) ? + RE_SYNTAX_POSIX_EXTENDED : RE_SYNTAX_POSIX_BASIC; + + /* regex_compile will allocate the space for the compiled pattern. */ + preg->buffer = 0; + preg->allocated = 0; + preg->used = 0; + + /* Try to allocate space for the fastmap. */ + preg->fastmap = (char *) malloc (1 << BYTEWIDTH); + + if (cflags & REG_ICASE) + { + unsigned i; + + preg->translate + = (RE_TRANSLATE_TYPE) malloc (CHAR_SET_SIZE + * sizeof (*(RE_TRANSLATE_TYPE)0)); + if (preg->translate == NULL) + return (int) REG_ESPACE; + + /* Map uppercase characters to corresponding lowercase ones. */ + for (i = 0; i < CHAR_SET_SIZE; i++) + preg->translate[i] = ISUPPER (i) ? TOLOWER (i) : i; + } + else + preg->translate = NULL; + + /* If REG_NEWLINE is set, newlines are treated differently. */ + if (cflags & REG_NEWLINE) + { /* REG_NEWLINE implies neither . nor [^...] match newline. */ + syntax &= ~RE_DOT_NEWLINE; + syntax |= RE_HAT_LISTS_NOT_NEWLINE; + /* It also changes the matching behavior. */ + preg->newline_anchor = 1; + } + else + preg->newline_anchor = 0; + + preg->no_sub = !!(cflags & REG_NOSUB); + + /* POSIX says a null character in the pattern terminates it, so we + can use strlen here in compiling the pattern. */ + ret = regex_compile (pattern, strlen (pattern), syntax, preg); + + /* POSIX doesn't distinguish between an unmatched open-group and an + unmatched close-group: both are REG_EPAREN. */ + if (ret == REG_ERPAREN) ret = REG_EPAREN; + + if (ret == REG_NOERROR && preg->fastmap) + { + /* Compute the fastmap now, since regexec cannot modify the pattern + buffer. */ + if (re_compile_fastmap (preg) == -2) + { + /* Some error occurred while computing the fastmap, just forget + about it. */ + free (preg->fastmap); + preg->fastmap = NULL; + } + } + + return (int) ret; +} +#ifdef _LIBC +weak_alias (__regcomp, regcomp) +#endif + + +/* regexec searches for a given pattern, specified by PREG, in the + string STRING. + + If NMATCH is zero or REG_NOSUB was set in the cflags argument to + `regcomp', we ignore PMATCH. Otherwise, we assume PMATCH has at + least NMATCH elements, and we set them to the offsets of the + corresponding matched substrings. + + EFLAGS specifies `execution flags' which affect matching: if + REG_NOTBOL is set, then ^ does not match at the beginning of the + string; if REG_NOTEOL is set, then $ does not match at the end. + + We return 0 if we find a match and REG_NOMATCH if not. */ + +int +regexec (preg, string, nmatch, pmatch, eflags) + const regex_t *preg; + const char *string; + size_t nmatch; + regmatch_t pmatch[]; + int eflags; +{ + int ret; + struct re_registers regs; + regex_t private_preg; + int len = strlen (string); + boolean want_reg_info = !preg->no_sub && nmatch > 0; + + private_preg = *preg; + + private_preg.not_bol = !!(eflags & REG_NOTBOL); + private_preg.not_eol = !!(eflags & REG_NOTEOL); + + /* The user has told us exactly how many registers to return + information about, via `nmatch'. We have to pass that on to the + matching routines. */ + private_preg.regs_allocated = REGS_FIXED; + + if (want_reg_info) + { + regs.num_regs = nmatch; + regs.start = TALLOC (nmatch * 2, regoff_t); + if (regs.start == NULL) + return (int) REG_NOMATCH; + regs.end = regs.start + nmatch; + } + + /* Perform the searching operation. */ + ret = re_search (&private_preg, string, len, + /* start: */ 0, /* range: */ len, + want_reg_info ? ®s : (struct re_registers *) 0); + + /* Copy the register information to the POSIX structure. */ + if (want_reg_info) + { + if (ret >= 0) + { + unsigned r; + + for (r = 0; r < nmatch; r++) + { + pmatch[r].rm_so = regs.start[r]; + pmatch[r].rm_eo = regs.end[r]; + } + } + + /* If we needed the temporary register info, free the space now. */ + free (regs.start); + } + + /* We want zero return to mean success, unlike `re_search'. */ + return ret >= 0 ? (int) REG_NOERROR : (int) REG_NOMATCH; +} +#ifdef _LIBC +weak_alias (__regexec, regexec) +#endif + + +/* Returns a message corresponding to an error code, ERRCODE, returned + from either regcomp or regexec. We don't use PREG here. */ + +size_t +regerror (errcode, preg, errbuf, errbuf_size) + int errcode; + const regex_t *preg; + char *errbuf; + size_t errbuf_size; +{ + const char *msg; + size_t msg_size; + + if (errcode < 0 + || errcode >= (int) (sizeof (re_error_msgid_idx) + / sizeof (re_error_msgid_idx[0]))) + /* Only error codes returned by the rest of the code should be passed + to this routine. If we are given anything else, or if other regex + code generates an invalid error code, then the program has a bug. + Dump core so we can fix it. */ + abort (); + + msg = gettext (re_error_msgid + re_error_msgid_idx[errcode]); + + msg_size = strlen (msg) + 1; /* Includes the null. */ + + if (errbuf_size != 0) + { + if (msg_size > errbuf_size) + { +#if defined HAVE_MEMPCPY || defined _LIBC + *((char *) __mempcpy (errbuf, msg, errbuf_size - 1)) = '\0'; +#else + memcpy (errbuf, msg, errbuf_size - 1); + errbuf[errbuf_size - 1] = 0; +#endif + } + else + memcpy (errbuf, msg, msg_size); + } + + return msg_size; +} +#ifdef _LIBC +weak_alias (__regerror, regerror) +#endif + + +/* Free dynamically allocated space used by PREG. */ + +void +regfree (preg) + regex_t *preg; +{ + if (preg->buffer != NULL) + free (preg->buffer); + preg->buffer = NULL; + + preg->allocated = 0; + preg->used = 0; + + if (preg->fastmap != NULL) + free (preg->fastmap); + preg->fastmap = NULL; + preg->fastmap_accurate = 0; + + if (preg->translate != NULL) + free (preg->translate); + preg->translate = NULL; +} +#ifdef _LIBC +weak_alias (__regfree, regfree) +#endif + +#endif /* not emacs */ diff --git a/src/libcompat/regex/regex.h b/src/libcompat/regex/regex.h new file mode 100644 index 0000000..91a3560 --- /dev/null +++ b/src/libcompat/regex/regex.h @@ -0,0 +1,560 @@ +/* Definitions for data structures and routines for the regular + expression library, version 0.12. + Copyright (C) 1985,1989-1993,1995-1998, 2000 Free Software Foundation, Inc. + + This file is part of the GNU C Library. Its master source is NOT part of + the C library, however. The master source lives in /gd/gnu/lib. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _REGEX_H +#define _REGEX_H 1 + +/* Allow the use in C++ code. */ +#ifdef __cplusplus +extern "C" { +#endif + +/* POSIX says that must be included (by the caller) before + . */ + +#if !defined _POSIX_C_SOURCE && !defined _POSIX_SOURCE && defined VMS +/* VMS doesn't have `size_t' in , even though POSIX says it + should be there. */ +# include +#endif + +/* The following two types have to be signed and unsigned integer type + wide enough to hold a value of a pointer. For most ANSI compilers + ptrdiff_t and size_t should be likely OK. Still size of these two + types is 2 for Microsoft C. Ugh... */ +typedef long int s_reg_t; +typedef unsigned long int active_reg_t; + +/* The following bits are used to determine the regexp syntax we + recognize. The set/not-set meanings are chosen so that Emacs syntax + remains the value 0. The bits are given in alphabetical order, and + the definitions shifted by one from the previous bit; thus, when we + add or remove a bit, only one other definition need change. */ +typedef unsigned long int reg_syntax_t; + +/* If this bit is not set, then \ inside a bracket expression is literal. + If set, then such a \ quotes the following character. */ +#define RE_BACKSLASH_ESCAPE_IN_LISTS ((unsigned long int) 1) + +/* If this bit is not set, then + and ? are operators, and \+ and \? are + literals. + If set, then \+ and \? are operators and + and ? are literals. */ +#define RE_BK_PLUS_QM (RE_BACKSLASH_ESCAPE_IN_LISTS << 1) + +/* If this bit is set, then character classes are supported. They are: + [:alpha:], [:upper:], [:lower:], [:digit:], [:alnum:], [:xdigit:], + [:space:], [:print:], [:punct:], [:graph:], and [:cntrl:]. + If not set, then character classes are not supported. */ +#define RE_CHAR_CLASSES (RE_BK_PLUS_QM << 1) + +/* If this bit is set, then ^ and $ are always anchors (outside bracket + expressions, of course). + If this bit is not set, then it depends: + ^ is an anchor if it is at the beginning of a regular + expression or after an open-group or an alternation operator; + $ is an anchor if it is at the end of a regular expression, or + before a close-group or an alternation operator. + + This bit could be (re)combined with RE_CONTEXT_INDEP_OPS, because + POSIX draft 11.2 says that * etc. in leading positions is undefined. + We already implemented a previous draft which made those constructs + invalid, though, so we haven't changed the code back. */ +#define RE_CONTEXT_INDEP_ANCHORS (RE_CHAR_CLASSES << 1) + +/* If this bit is set, then special characters are always special + regardless of where they are in the pattern. + If this bit is not set, then special characters are special only in + some contexts; otherwise they are ordinary. Specifically, + * + ? and intervals are only special when not after the beginning, + open-group, or alternation operator. */ +#define RE_CONTEXT_INDEP_OPS (RE_CONTEXT_INDEP_ANCHORS << 1) + +/* If this bit is set, then *, +, ?, and { cannot be first in an re or + immediately after an alternation or begin-group operator. */ +#define RE_CONTEXT_INVALID_OPS (RE_CONTEXT_INDEP_OPS << 1) + +/* If this bit is set, then . matches newline. + If not set, then it doesn't. */ +#define RE_DOT_NEWLINE (RE_CONTEXT_INVALID_OPS << 1) + +/* If this bit is set, then . doesn't match NUL. + If not set, then it does. */ +#define RE_DOT_NOT_NULL (RE_DOT_NEWLINE << 1) + +/* If this bit is set, nonmatching lists [^...] do not match newline. + If not set, they do. */ +#define RE_HAT_LISTS_NOT_NEWLINE (RE_DOT_NOT_NULL << 1) + +/* If this bit is set, either \{...\} or {...} defines an + interval, depending on RE_NO_BK_BRACES. + If not set, \{, \}, {, and } are literals. */ +#define RE_INTERVALS (RE_HAT_LISTS_NOT_NEWLINE << 1) + +/* If this bit is set, +, ? and | aren't recognized as operators. + If not set, they are. */ +#define RE_LIMITED_OPS (RE_INTERVALS << 1) + +/* If this bit is set, newline is an alternation operator. + If not set, newline is literal. */ +#define RE_NEWLINE_ALT (RE_LIMITED_OPS << 1) + +/* If this bit is set, then `{...}' defines an interval, and \{ and \} + are literals. + If not set, then `\{...\}' defines an interval. */ +#define RE_NO_BK_BRACES (RE_NEWLINE_ALT << 1) + +/* If this bit is set, (...) defines a group, and \( and \) are literals. + If not set, \(...\) defines a group, and ( and ) are literals. */ +#define RE_NO_BK_PARENS (RE_NO_BK_BRACES << 1) + +/* If this bit is set, then \ matches . + If not set, then \ is a back-reference. */ +#define RE_NO_BK_REFS (RE_NO_BK_PARENS << 1) + +/* If this bit is set, then | is an alternation operator, and \| is literal. + If not set, then \| is an alternation operator, and | is literal. */ +#define RE_NO_BK_VBAR (RE_NO_BK_REFS << 1) + +/* If this bit is set, then an ending range point collating higher + than the starting range point, as in [z-a], is invalid. + If not set, then when ending range point collates higher than the + starting range point, the range is ignored. */ +#define RE_NO_EMPTY_RANGES (RE_NO_BK_VBAR << 1) + +/* If this bit is set, then an unmatched ) is ordinary. + If not set, then an unmatched ) is invalid. */ +#define RE_UNMATCHED_RIGHT_PAREN_ORD (RE_NO_EMPTY_RANGES << 1) + +/* If this bit is set, succeed as soon as we match the whole pattern, + without further backtracking. */ +#define RE_NO_POSIX_BACKTRACKING (RE_UNMATCHED_RIGHT_PAREN_ORD << 1) + +/* If this bit is set, do not process the GNU regex operators. + If not set, then the GNU regex operators are recognized. */ +#define RE_NO_GNU_OPS (RE_NO_POSIX_BACKTRACKING << 1) + +/* If this bit is set, turn on internal regex debugging. + If not set, and debugging was on, turn it off. + This only works if regex.c is compiled -DDEBUG. + We define this bit always, so that all that's needed to turn on + debugging is to recompile regex.c; the calling code can always have + this bit set, and it won't affect anything in the normal case. */ +#define RE_DEBUG (RE_NO_GNU_OPS << 1) + +/* This global variable defines the particular regexp syntax to use (for + some interfaces). When a regexp is compiled, the syntax used is + stored in the pattern buffer, so changing this does not affect + already-compiled regexps. */ +extern reg_syntax_t re_syntax_options; + +/* Define combinations of the above bits for the standard possibilities. + (The [[[ comments delimit what gets put into the Texinfo file, so + don't delete them!) */ +/* [[[begin syntaxes]]] */ +#define RE_SYNTAX_EMACS 0 + +#define RE_SYNTAX_AWK \ + (RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DOT_NOT_NULL \ + | RE_NO_BK_PARENS | RE_NO_BK_REFS \ + | RE_NO_BK_VBAR | RE_NO_EMPTY_RANGES \ + | RE_DOT_NEWLINE | RE_CONTEXT_INDEP_ANCHORS \ + | RE_UNMATCHED_RIGHT_PAREN_ORD | RE_NO_GNU_OPS) + +#define RE_SYNTAX_GNU_AWK \ + ((RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DEBUG) \ + & ~(RE_DOT_NOT_NULL | RE_INTERVALS | RE_CONTEXT_INDEP_OPS)) + +#define RE_SYNTAX_POSIX_AWK \ + (RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS \ + | RE_INTERVALS | RE_NO_GNU_OPS) + +#define RE_SYNTAX_GREP \ + (RE_BK_PLUS_QM | RE_CHAR_CLASSES \ + | RE_HAT_LISTS_NOT_NEWLINE | RE_INTERVALS \ + | RE_NEWLINE_ALT) + +#define RE_SYNTAX_EGREP \ + (RE_CHAR_CLASSES | RE_CONTEXT_INDEP_ANCHORS \ + | RE_CONTEXT_INDEP_OPS | RE_HAT_LISTS_NOT_NEWLINE \ + | RE_NEWLINE_ALT | RE_NO_BK_PARENS \ + | RE_NO_BK_VBAR) + +#define RE_SYNTAX_POSIX_EGREP \ + (RE_SYNTAX_EGREP | RE_INTERVALS | RE_NO_BK_BRACES) + +/* P1003.2/D11.2, section 4.20.7.1, lines 5078ff. */ +#define RE_SYNTAX_ED RE_SYNTAX_POSIX_BASIC + +#define RE_SYNTAX_SED RE_SYNTAX_POSIX_BASIC + +/* Syntax bits common to both basic and extended POSIX regex syntax. */ +#define _RE_SYNTAX_POSIX_COMMON \ + (RE_CHAR_CLASSES | RE_DOT_NEWLINE | RE_DOT_NOT_NULL \ + | RE_INTERVALS | RE_NO_EMPTY_RANGES) + +#define RE_SYNTAX_POSIX_BASIC \ + (_RE_SYNTAX_POSIX_COMMON | RE_BK_PLUS_QM) + +/* Differs from ..._POSIX_BASIC only in that RE_BK_PLUS_QM becomes + RE_LIMITED_OPS, i.e., \? \+ \| are not recognized. Actually, this + isn't minimal, since other operators, such as \`, aren't disabled. */ +#define RE_SYNTAX_POSIX_MINIMAL_BASIC \ + (_RE_SYNTAX_POSIX_COMMON | RE_LIMITED_OPS) + +#define RE_SYNTAX_POSIX_EXTENDED \ + (_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \ + | RE_CONTEXT_INDEP_OPS | RE_NO_BK_BRACES \ + | RE_NO_BK_PARENS | RE_NO_BK_VBAR \ + | RE_CONTEXT_INVALID_OPS | RE_UNMATCHED_RIGHT_PAREN_ORD) + +/* Differs from ..._POSIX_EXTENDED in that RE_CONTEXT_INDEP_OPS is + removed and RE_NO_BK_REFS is added. */ +#define RE_SYNTAX_POSIX_MINIMAL_EXTENDED \ + (_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \ + | RE_CONTEXT_INVALID_OPS | RE_NO_BK_BRACES \ + | RE_NO_BK_PARENS | RE_NO_BK_REFS \ + | RE_NO_BK_VBAR | RE_UNMATCHED_RIGHT_PAREN_ORD) +/* [[[end syntaxes]]] */ + +/* Maximum number of duplicates an interval can allow. Some systems + (erroneously) define this in other header files, but we want our + value, so remove any previous define. */ +#ifdef RE_DUP_MAX +# undef RE_DUP_MAX +#endif +/* If sizeof(int) == 2, then ((1 << 15) - 1) overflows. */ +#define RE_DUP_MAX (0x7fff) + + +/* POSIX `cflags' bits (i.e., information for `regcomp'). */ + +/* If this bit is set, then use extended regular expression syntax. + If not set, then use basic regular expression syntax. */ +#define REG_EXTENDED 1 + +/* If this bit is set, then ignore case when matching. + If not set, then case is significant. */ +#define REG_ICASE (REG_EXTENDED << 1) + +/* If this bit is set, then anchors do not match at newline + characters in the string. + If not set, then anchors do match at newlines. */ +#define REG_NEWLINE (REG_ICASE << 1) + +/* If this bit is set, then report only success or fail in regexec. + If not set, then returns differ between not matching and errors. */ +#define REG_NOSUB (REG_NEWLINE << 1) + + +/* POSIX `eflags' bits (i.e., information for regexec). */ + +/* If this bit is set, then the beginning-of-line operator doesn't match + the beginning of the string (presumably because it's not the + beginning of a line). + If not set, then the beginning-of-line operator does match the + beginning of the string. */ +#define REG_NOTBOL 1 + +/* Like REG_NOTBOL, except for the end-of-line. */ +#define REG_NOTEOL (1 << 1) + + +/* If any error codes are removed, changed, or added, update the + `re_error_msg' table in regex.c. */ +typedef enum +{ +#ifdef _XOPEN_SOURCE + REG_ENOSYS = -1, /* This will never happen for this implementation. */ +#endif + + REG_NOERROR = 0, /* Success. */ + REG_NOMATCH, /* Didn't find a match (for regexec). */ + + /* POSIX regcomp return error codes. (In the order listed in the + standard.) */ + REG_BADPAT, /* Invalid pattern. */ + REG_ECOLLATE, /* Not implemented. */ + REG_ECTYPE, /* Invalid character class name. */ + REG_EESCAPE, /* Trailing backslash. */ + REG_ESUBREG, /* Invalid back reference. */ + REG_EBRACK, /* Unmatched left bracket. */ + REG_EPAREN, /* Parenthesis imbalance. */ + REG_EBRACE, /* Unmatched \{. */ + REG_BADBR, /* Invalid contents of \{\}. */ + REG_ERANGE, /* Invalid range end. */ + REG_ESPACE, /* Ran out of memory. */ + REG_BADRPT, /* No preceding re for repetition op. */ + + /* Error codes we've added. */ + REG_EEND, /* Premature end. */ + REG_ESIZE, /* Compiled pattern bigger than 2^16 bytes. */ + REG_ERPAREN /* Unmatched ) or \); not returned from regcomp. */ +} reg_errcode_t; + +/* This data structure represents a compiled pattern. Before calling + the pattern compiler, the fields `buffer', `allocated', `fastmap', + `translate', and `no_sub' can be set. After the pattern has been + compiled, the `re_nsub' field is available. All other fields are + private to the regex routines. */ + +#ifndef RE_TRANSLATE_TYPE +# define RE_TRANSLATE_TYPE char * +#endif + +struct re_pattern_buffer +{ +/* [[[begin pattern_buffer]]] */ + /* Space that holds the compiled pattern. It is declared as + `unsigned char *' because its elements are + sometimes used as array indexes. */ + unsigned char *buffer; + + /* Number of bytes to which `buffer' points. */ + unsigned long int allocated; + + /* Number of bytes actually used in `buffer'. */ + unsigned long int used; + + /* Syntax setting with which the pattern was compiled. */ + reg_syntax_t syntax; + + /* Pointer to a fastmap, if any, otherwise zero. re_search uses + the fastmap, if there is one, to skip over impossible + starting points for matches. */ + char *fastmap; + + /* Either a translate table to apply to all characters before + comparing them, or zero for no translation. The translation + is applied to a pattern when it is compiled and to a string + when it is matched. */ + RE_TRANSLATE_TYPE translate; + + /* Number of subexpressions found by the compiler. */ + size_t re_nsub; + + /* Zero if this pattern cannot match the empty string, one else. + Well, in truth it's used only in `re_search_2', to see + whether or not we should use the fastmap, so we don't set + this absolutely perfectly; see `re_compile_fastmap' (the + `duplicate' case). */ + unsigned can_be_null : 1; + + /* If REGS_UNALLOCATED, allocate space in the `regs' structure + for `max (RE_NREGS, re_nsub + 1)' groups. + If REGS_REALLOCATE, reallocate space if necessary. + If REGS_FIXED, use what's there. */ +#define REGS_UNALLOCATED 0 +#define REGS_REALLOCATE 1 +#define REGS_FIXED 2 + unsigned regs_allocated : 2; + + /* Set to zero when `regex_compile' compiles a pattern; set to one + by `re_compile_fastmap' if it updates the fastmap. */ + unsigned fastmap_accurate : 1; + + /* If set, `re_match_2' does not return information about + subexpressions. */ + unsigned no_sub : 1; + + /* If set, a beginning-of-line anchor doesn't match at the + beginning of the string. */ + unsigned not_bol : 1; + + /* Similarly for an end-of-line anchor. */ + unsigned not_eol : 1; + + /* If true, an anchor at a newline matches. */ + unsigned newline_anchor : 1; + +/* [[[end pattern_buffer]]] */ +}; + +typedef struct re_pattern_buffer regex_t; + +/* Type for byte offsets within the string. POSIX mandates this. */ +typedef int regoff_t; + + +/* This is the structure we store register match data in. See + regex.texinfo for a full description of what registers match. */ +struct re_registers +{ + unsigned num_regs; + regoff_t *start; + regoff_t *end; +}; + + +/* If `regs_allocated' is REGS_UNALLOCATED in the pattern buffer, + `re_match_2' returns information about at least this many registers + the first time a `regs' structure is passed. */ +#ifndef RE_NREGS +# define RE_NREGS 30 +#endif + + +/* POSIX specification for registers. Aside from the different names than + `re_registers', POSIX uses an array of structures, instead of a + structure of arrays. */ +typedef struct +{ + regoff_t rm_so; /* Byte offset from string's start to substring's start. */ + regoff_t rm_eo; /* Byte offset from string's start to substring's end. */ +} regmatch_t; + +/* Declarations for routines. */ + +/* To avoid duplicating every routine declaration -- once with a + prototype (if we are ANSI), and once without (if we aren't) -- we + use the following macro to declare argument types. This + unfortunately clutters up the declarations a bit, but I think it's + worth it. */ + +#if __STDC__ + +# define _RE_ARGS(args) args + +#else /* not __STDC__ */ + +# define _RE_ARGS(args) () + +#endif /* not __STDC__ */ + +/* Sets the current default syntax to SYNTAX, and return the old syntax. + You can also simply assign to the `re_syntax_options' variable. */ +extern reg_syntax_t re_set_syntax _RE_ARGS ((reg_syntax_t syntax)); + +/* Compile the regular expression PATTERN, with length LENGTH + and syntax given by the global `re_syntax_options', into the buffer + BUFFER. Return NULL if successful, and an error string if not. */ +extern const char *re_compile_pattern + _RE_ARGS ((const char *pattern, size_t length, + struct re_pattern_buffer *buffer)); + + +/* Compile a fastmap for the compiled pattern in BUFFER; used to + accelerate searches. Return 0 if successful and -2 if was an + internal error. */ +extern int re_compile_fastmap _RE_ARGS ((struct re_pattern_buffer *buffer)); + + +/* Search in the string STRING (with length LENGTH) for the pattern + compiled into BUFFER. Start searching at position START, for RANGE + characters. Return the starting position of the match, -1 for no + match, or -2 for an internal error. Also return register + information in REGS (if REGS and BUFFER->no_sub are nonzero). */ +extern int re_search + _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string, + int length, int start, int range, struct re_registers *regs)); + + +/* Like `re_search', but search in the concatenation of STRING1 and + STRING2. Also, stop searching at index START + STOP. */ +extern int re_search_2 + _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1, + int length1, const char *string2, int length2, + int start, int range, struct re_registers *regs, int stop)); + + +/* Like `re_search', but return how many characters in STRING the regexp + in BUFFER matched, starting at position START. */ +extern int re_match + _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string, + int length, int start, struct re_registers *regs)); + + +/* Relates to `re_match' as `re_search_2' relates to `re_search'. */ +extern int re_match_2 + _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1, + int length1, const char *string2, int length2, + int start, struct re_registers *regs, int stop)); + + +/* Set REGS to hold NUM_REGS registers, storing them in STARTS and + ENDS. Subsequent matches using BUFFER and REGS will use this memory + for recording register information. STARTS and ENDS must be + allocated with malloc, and must each be at least `NUM_REGS * sizeof + (regoff_t)' bytes long. + + If NUM_REGS == 0, then subsequent matches should allocate their own + register data. + + Unless this function is called, the first search or match using + PATTERN_BUFFER will allocate its own register data, without + freeing the old data. */ +extern void re_set_registers + _RE_ARGS ((struct re_pattern_buffer *buffer, struct re_registers *regs, + unsigned num_regs, regoff_t *starts, regoff_t *ends)); + +#if defined _REGEX_RE_COMP || defined _LIBC +# ifndef _CRAY +/* 4.2 bsd compatibility. */ +extern char *re_comp _RE_ARGS ((const char *)); +extern int re_exec _RE_ARGS ((const char *)); +# endif +#endif + +/* GCC 2.95 and later have "__restrict"; C99 compilers have + "restrict", and "configure" may have defined "restrict". */ +#ifndef __restrict +# if ! (2 < __GNUC__ || (2 == __GNUC__ && 95 <= __GNUC_MINOR__)) +# if defined restrict || 199901L <= __STDC_VERSION__ +# define __restrict restrict +# else +# define __restrict +# endif +# endif +#endif +/* For now unconditionally define __restrict_arr to expand to nothing. + Ideally we would have a test for the compiler which allows defining + it to restrict. */ +#define __restrict_arr + +/* POSIX compatibility. */ +extern int regcomp _RE_ARGS ((regex_t *__restrict __preg, + const char *__restrict __pattern, + int __cflags)); + +extern int regexec _RE_ARGS ((const regex_t *__restrict __preg, + const char *__restrict __string, size_t __nmatch, + regmatch_t __pmatch[__restrict_arr], + int __eflags)); + +extern size_t regerror _RE_ARGS ((int __errcode, const regex_t *__preg, + char *__errbuf, size_t __errbuf_size)); + +extern void regfree _RE_ARGS ((regex_t *__preg)); + + +#ifdef __cplusplus +} +#endif /* C++ */ + +#endif /* regex.h */ + +/* +Local variables: +make-backup-files: t +version-control: t +trim-versions-without-asking: nil +End: +*/ diff --git a/src/libcompat/regions.c b/src/libcompat/regions.c new file mode 100644 index 0000000..d96c9c2 --- /dev/null +++ b/src/libcompat/regions.c @@ -0,0 +1,429 @@ +/* + * Copyright (c) 1999-2001 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ +/* Idea: clear on page alloc rather than individual alloc + Turns out not so good (on lcc at least, seems a wash on mudlle): + logically should be bad for small regions (less than a few pages) +*/ +#undef PRECLEAR + +#include "../autoconf.h" +/*#include "stats.c"*/ + +#include "regions.h" +#include +#include +#include + +#if SIZEOF_VOID_P > 4 +#define LARGE_ADDRESSES +#endif + +#if HAVE_MMAP +#define USE_MMAP +#endif + +#ifdef LARGE_ADDRESSES +/* This supports up to 49 bit virtual addresses. If you have larger + virtual addresses, you will need to decrease MEMSLICE1 and + possibly adjust MEMSLICE2 */ +#define MAXMEMBITS 64 +#define MEMSLICE1 15 +#define MEMSLICE2 18 +#define MEMSLICE3 (MAXMEMBITS - RPAGELOG - MEMSLICE2 - MEMSLICE2) +#else +#define MAXMEMBITS 32 +#endif + + + +#define RPAGESIZE (1 << RPAGELOG) +#define K 2 +#define MAXPAGE (1 << (MAXMEMBITS - RPAGELOG)) + +#define PAGENB(x) ((__rcintptr)(x) >> RPAGELOG) + +#define ALIGN(x, n) (((x) + ((n) - 1)) & ~((n) - 1)) +#define PALIGN(x, n) ((void *)ALIGN((__rcintptr)(x), n)) +#ifdef __GNUC__ +#define RALIGNMENT __alignof(double) +#define PTRALIGNMENT __alignof(void *) +#define ALIGNMENT_LONG __alignof(unsigned long) +#else +#define RALIGNMENT 8 +#define PTRALIGNMENT 4 +#define ALIGNMENT_LONG 4 +#endif + +typedef unsigned long __rcintptr; + +struct ablock { + char *end, *allocfrom; +}; + +struct allocator { + struct ablock page; + struct ablock superpage; + struct ablock hyperpage; + struct page *pages; + struct page *bigpages; +}; + +struct region_ { + struct allocator normal; + region parent, sibling, children; +}; + +nomem_handler nomem_h; + +region permanent; + +static inline void clear(void *start, __rcintptr size) +{ + long *clear, *clearend; + + clear = (long *)start; + clearend = (long *)((char *)start + size); + do *clear++ = 0; + while (clear < clearend) ; +} + +#ifdef PRECLEAR +#define preclear clear +#define postclear(s, e) +#else +#define preclear(s, e) +#define postclear clear +#endif + +#include "pages.c" +#include "alloc.c" + +static void nochildren(region r) +{ + if (r->children) + abort(); +} + +static void unlink_region(region r) +{ + region *scan; + + scan = &r->parent->children; + while (*scan != r) + scan = &(*scan)->sibling; + *scan = (*scan)->sibling; +} + +static void link_region(region r, region parent) +{ + r->sibling = parent->children; + r->parent = parent; + parent->children = r; +} + +static int rstart; + +void initregion(region r) +{ + char *first = + (char *)r - rstart - offsetof(struct page, previous); + + /* Start using page with region header as a pointer-containing page */ + r->normal.page.end = first + RPAGESIZE; + r->normal.page.allocfrom = (char *)(r + 1); + + /* Guarantee failure for all other blocks */ + r->normal.superpage.allocfrom = (char *)(K * RPAGESIZE + 1); + r->normal.hyperpage.allocfrom = (char *)(K * K * RPAGESIZE + 1); + + /* Remember that r owns this page. */ + r->normal.pages = (struct page *)first; + set_region(r->normal.pages, 1, r); +} + +region newregion(void) +{ + return newsubregion(permanent); +} + +region newsubregion(region parent) +{ + char *first; + region r; + + first = (char *)alloc_single_page(NULL); + preclear(first + offsetof(struct page, pagecount), RPAGESIZE - offsetof(struct page, pagecount)); + + /* stagger regions across cache lines a bit */ + rstart += 64; +#if RPAGESIZE < 1024 +#error RPAGESIZE must be at least 1024, or change the next if. +#endif + if (rstart >= 16 * 64) rstart = 0; + r = (region)(first + rstart + offsetof(struct page, previous)); + postclear(r, sizeof *r); + initregion(r); + + if (parent) + link_region(r, parent); + + return r; +} + +inline char *rstralloc(region r, size_t size) +{ + void *mem, *dummy; + + qalloc(r, &r->normal, &dummy, 0, 1, &mem, size, RALIGNMENT, 0); + + return mem; +} + +inline char *rstralloc0(region r, size_t size) +{ + char *mem; + + mem = rstralloc(r, size); + clear(mem, size); + + return mem; +} + +char *rstrdup(region r, const char *s) +{ + char *news = rstralloc(r, strlen(s) + 1); + + strcpy(news, s); + + return news; +} + +inline static +char *internal_rstrextend(region r, const char *old, size_t newsize, + int needsclear) +{ + /* For now we don't attempt to extend the old storage area */ + void *newmem, *hdr; + unsigned long *oldhdr, oldsize; + + qalloc(r, &r->normal, &hdr, sizeof(unsigned long), ALIGNMENT_LONG, + &newmem, newsize, RALIGNMENT, 0); + + /* If we don't do this we can't find the header: */ + hdr = (char *)newmem - sizeof(unsigned long); + + *(unsigned long *)hdr = newsize; + + if (old) + { + oldhdr = (unsigned long *)(old - ALIGNMENT_LONG); + oldsize = *oldhdr; + + if (oldsize > newsize) + oldsize = newsize; + else if (needsclear) + clear((char *)newmem + oldsize, newsize - oldsize); + memcpy(newmem, old, oldsize); + } + else if (needsclear) + clear(newmem, newsize); + + return newmem; +} + +inline +char *rstrextend(region r, const char *old, size_t newsize) +{ + return internal_rstrextend(r, old, newsize, 0); +} + +inline +char *rstrextend0(region r, const char *old, size_t newsize) +{ + return internal_rstrextend(r, old, newsize, 1); +} + +inline void *typed_ralloc(region r, size_t size, type_t t) +{ + return rstralloc0(r, size); +} + +void *__rcralloc_small0(region r, size_t size) +{ + char *mem2; + + mem2 = PALIGN(r->normal.page.allocfrom, RALIGNMENT); + if (mem2 + size >= r->normal.page.end) + return typed_ralloc(r, size, 0); + + r->normal.page.allocfrom = mem2 + size; + postclear(mem2, size); + + return mem2; +} + +void *typed_rarrayextend(region r, void *old, size_t n, size_t size, type_t t) +{ + return rstrextend0(r, old, n * size); +} + +void *typed_rarrayalloc(region r, size_t n, size_t size, type_t t) +{ + return typed_ralloc(r, n * size, t); +} + +void typed_rarraycopy(void *to, void *from, size_t n, size_t size, type_t type) +{ + memcpy(to, from, n * size); +} + +static void delregion(region r) +{ + nochildren(r); + free_all_pages(r, &r->normal); +} + +void deleteregion(region r) +{ + unlink_region(r); + delregion(r); +} + +void deleteregion_ptr(region *r) +{ + region tmp = *r; + + *r = NULL; + deleteregion(tmp); +} + +void deleteregion_array(int n, region *regions) +{ + int i; + + for (i = 0; i < n; i++) + unlink_region(regions[i]); + + for (i = 0; i < n; i++) + { + delregion(regions[i]); + regions[i] = NULL; + } +} + +region regionof(void *ptr) +{ + return page_region(PAGENB(ptr)); +} + +void region_init(void) +{ + rstart = -64; /* Save 64 bytes of memory! (sometimes ;-)) */ + init_pages(); + permanent = newregion(); +#ifdef DEBUG_RALLOC + if (getenv("REGIONSTATS")) + benchmark_init(); + atexit(memusage); +#endif +} + +nomem_handler set_nomem_handler(nomem_handler newhandler) +{ + nomem_handler oldh = nomem_h; + + nomem_h = newhandler; + + return oldh; +} + +#ifndef NO_REGION_MAIN +int region_main(int argc, char **argv, char **envp); + +int main(int argc, char **argv, char **envp) +{ + region_init(); + return region_main(argc, argv, envp); +} +#endif + + +/* Debugging support */ + +static FILE *out; + +static void printref(void *x) +{ +#ifndef LARGE_ADDRESSES + if (x >= (void *)__rcregionmap && x < (void *)&__rcregionmap[MAXPAGE]) + return; +#endif + + fprintf(out, "info symbol 0x%p\n", x); +} + +void findrefs(region r, void *from, void *to) +{ + char *f; + + if (!out) + out = fopen("/dev/tty", "w"); + + for (f = PALIGN(from, PTRALIGNMENT); f < (char *)to; f += PTRALIGNMENT) + if (regionof(*(void **)f) == r) + printref(f); + + fflush(out); +} + +#if defined(__GNUC__) && defined(sparc) +/* This code breaks some version of sun's cc at least */ +extern void _DYNAMIC, _end; + +void findgrefs(region r) +{ + findrefs(r, &_DYNAMIC, &_end); +} +#endif + +void findrrefs(region r, region from) +{ + struct page *p; + + for (p = from->normal.pages; p; p = p->next) + findrefs(r, (char *)&p->previous, (char *)p + RPAGESIZE); + + for (p = r->normal.bigpages; p; p = p->next) + findrefs(r, (char *)&p->previous, (char *)p + p->pagecount * RPAGESIZE); +} diff --git a/src/libcompat/regions.h b/src/libcompat/regions.h new file mode 100644 index 0000000..99fe95d --- /dev/null +++ b/src/libcompat/regions.h @@ -0,0 +1,96 @@ +/* + * Copyright (c) 1999-2001 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ +#ifndef REGIONS_H +#define REGIONS_H + +#define deletes +//#define traditional +#define sameregion +#define parentptr + +#define RPAGELOG 12 + +typedef struct region_ *region; +extern region permanent; + +#include + +void region_init(void); + +region newregion(void); +region newsubregion(region parent); + +typedef int type_t; +#define rctypeof(type) 0 + +/* Low-level alloc with dynamic type info */ +void *typed_ralloc(region r, size_t size, type_t type); +void *typed_rarrayalloc(region r, size_t n, size_t size, type_t type); +void *typed_rarrayextend(region r, void *old, size_t n, size_t size, type_t type); +void typed_rarraycopy(void *to, void *from, size_t n, size_t size, type_t type); + +void *__rcralloc_small0(region r, size_t size); + +/* In theory, the test at the start of qalloc should give the same benefit. + In practice, it doesn't (gcc, at least, generates better code for + __rcralloc_small0 than the equivalent path through typed_ralloc */ +#define ralloc(r, type) (sizeof(type) < (1 << (RPAGELOG - 3)) ? __rcralloc_small0((r), sizeof(type)) : typed_ralloc((r), sizeof(type), rctypeof(type))) +#define rarrayalloc(r, n, type) typed_rarrayalloc((r), (n), sizeof(type), rctypeof(type)) +#define rarrayextend(r, old, n, type) typed_rarrayextend((r), (old), (n), sizeof(type), rctypeof(type)) +#define rarraycopy(to, from, n, type) typed_rarraycopy((to), (from), (n), sizeof(type), rctypeof(type)) + +char *rstralloc(region r, size_t size); +char *rstralloc0(region r, size_t size); +char *rstrdup(region r, const char *s); + +/* rstrextend is used to extend an old string. The string MUST have been + initially allocated by a call to rstrextend with old == NULL (you cannot + initially allocate the string with rstralloc) */ +char *rstrextend(region r, const char *old, size_t newsize); +char *rstrextend0(region r, const char *old, size_t newsize); + +void deleteregion(region r); +void deleteregion_ptr(region *r); +void deleteregion_array(int n, region *regions); +region regionof(void *ptr); + +typedef void (*nomem_handler)(void); +nomem_handler set_nomem_handler(nomem_handler newhandler); + +/* Debugging support */ +void findrefs(region r, void *from, void *to); +void findgrefs(region r); +void findrrefs(region r, region from); + +#endif diff --git a/src/libcompat/stats.c b/src/libcompat/stats.c new file mode 100644 index 0000000..f30ff98 --- /dev/null +++ b/src/libcompat/stats.c @@ -0,0 +1,98 @@ +#include +#include +#include +#include +#include + +#if 0 +#ifdef sparc +#include +#include + +/* Actually this can break if we're unlucky (context switch between + rd tick and srlx */ +#ifdef __GNUC__ +register unsigned long long tscr asm("%o0"); +#define tsc() ({ \ + __asm__ __volatile__("rd %%tick,%%o1; srlx %%o1,32,%%o0" \ + : : : "%o0", "%o1"); \ + tscr; }) +#else +#define tsc() 0 +#endif + +static double proc_frequency(void) +{ + processor_info_t pinfo; + + processor_info(0, &pinfo); + return pinfo.pi_clock * 1e6; +} +#endif + +#ifdef i386 +#include + +#define tsc() ({unsigned long long x; rdtscll(x); x; }) +#define rdpmcll(counter,x) \ + __asm__ __volatile__("rdpmc" \ + : "=A" (x) \ + : "c" (counter)) +#define pmc0() ({unsigned long long x; rdpmcll(0, x); x; }) +#define pmc1() ({unsigned long long x; rdpmcll(1, x); x; }) + +double proc_frequency(void) { return 550e6; } +#endif + + +static struct tms s, e; +unsigned long long start_ticks, end_ticks; + +static double ll_to_double(unsigned long long x) +{ + return 4294967296.0 * (unsigned long)(x >> 32) + (unsigned long)x; +} + +static void print_memory_usage(void) +{ +#if 0 + fprintf(stderr, "blocks alloced: %lu, %.1f%% 8K\n", + (unsigned long)(total_8kblocks + total_otherblocks), + (100.0 * total_8kblocks) / (total_8kblocks + total_otherblocks)); + + fprintf(stderr, "system bytes(kB): %lu\n", + ((unsigned long)total_system_bytes + 512) / 1024); + fprintf(stderr, "overhead: %.1f%%\n", + total_system_bytes * 100.0 / bytes.max - 100); + +#endif + { extern void malloc_stats(void); malloc_stats(); } + fflush(stderr); +} + +static void print_benchmark(void) +{ + double tt, pfreq; + + end_ticks = tsc(); + times(&e); + pfreq = proc_frequency(); + + tt = ll_to_double(end_ticks - start_ticks) / pfreq; + + fprintf(stderr, "runtime: %.3f\n", tt); + fprintf(stderr, "cputime: %.2f\n", (e.tms_utime - s.tms_utime) / 100.0); + print_memory_usage(); +} + +static void benchmark_init(void) +{ + fputs("heap: compat regions\n", stderr); + times(&s); + start_ticks = tsc(); + atexit(print_benchmark); +} +#else +static void benchmark_init(void) {} + +#endif diff --git a/src/machine.c b/src/machine.c new file mode 100644 index 0000000..91ce780 --- /dev/null +++ b/src/machine.c @@ -0,0 +1,68 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include "parser.h" +#include "machine.h" +#include "errors.h" +#include "c-parse.tab.h" +#undef yystype +#include "c-parse.h" +#include "semantics.h" +#include "nesc-gcc.h" + +#include "machine/avr.c" +#include "machine/self.c" +#include "machine/keil.c" +#include "machine/sdcc.c" +#include "machine/msp430.c" +#include "machine/env_machine.c" + +static machine_spec *machines[] = { + &avr_machine, + &self_machine, + &keil_machine, + &sdcc_machine, + &msp430_machine, + &env_machine, + NULL +}; + +machine_spec *target = &self_machine; +const char *target_compiler = "gcc"; + +bool select_target(const char *targetname) +{ + machine_spec **scan; + + for (scan = machines; *scan; scan++) + if (!strcmp(targetname, (*scan)->machine_name)) + { + if (*scan == &env_machine && + scan_env_machine(&env_machine, "NESC_MACHINE") == FALSE) + { + error("invalid target described in env NESC_MACHINE"); + return FALSE; + } + target = *scan; + return TRUE; + } + + error("unknown target %s", targetname); + return FALSE; +} + + diff --git a/src/machine.h b/src/machine.h new file mode 100644 index 0000000..23c5e96 --- /dev/null +++ b/src/machine.h @@ -0,0 +1,58 @@ +#ifndef MACHINE_H +#define MACHINE_H + +typedef struct { + size_t size, align; +} machine_type_spec; + +struct yystype; + +typedef struct { + const char *machine_name; + + void (*handle_option)(const char *opt); + + bool big_endian, pcc_bitfield_type_matters; + size_t empty_field_boundary, structure_size_boundary; + + size_t word_size; + machine_type_spec tptr, tfloat, tdouble, tlong_double, tshort, tint, + tlong, tlong_long; + size_t int1_align, int2_align, int4_align, int8_align; + size_t wchar_t_size, size_t_size; + bool char_signed, wchar_t_signed; + + cval (*adjust_field_align)(field_declaration fdecl, cval alignment); + + bool (*decl_attribute)(gcc_attribute attr, data_declaration ddecl); + bool (*tag_attribute)(gcc_attribute attr, tag_declaration tdecl); + bool (*field_attribute)(gcc_attribute attr, field_declaration fdecl); + bool (*type_attribute)(gcc_attribute attr, type *t); + + void (*preinit)(void); /* Immediately after target selection */ + void (*init)(void); /* After everything else is setup */ + int (*token)(const char *word, int length, struct yystype *lvalp); + + /* A Keil C for 8051 special... */ + declaration (*keilc_definition)(location loc, cstring keyword, cstring name, + expression address); + + /* Called once when compilation starts. Should: + - setup system-specific include paths + - return name of a file definining system-specific macros + Targets using gcc can set this field to gcc_global_cpp_init + */ + const char *(*global_cpp_init)(void); + + /* Called just before preprocessing each file. Modify current.lex.finput + as needed (eg, add pragma handlers). Can be NULL. */ + void (*file_cpp_init)(void); + +} machine_spec; + +extern machine_spec *target; +extern const char *target_compiler; + +bool select_target(const char *targetname); + +#endif diff --git a/src/machine/avr.c b/src/machine/avr.c new file mode 100644 index 0000000..a2bc1a1 --- /dev/null +++ b/src/machine/avr.c @@ -0,0 +1,51 @@ +static bool avr_decl_attribute(gcc_attribute attr, data_declaration ddecl) +{ + const char *name = attr->word1->cstring.data; + + if (!strcmp(name, "signal")) + { + ddecl->async = TRUE; + ddecl->spontaneous = c_call_atomic; + return TRUE; + } + else if (!strcmp(name, "interrupt")) + { + ddecl->async = TRUE; + ddecl->spontaneous = c_call_nonatomic; + return TRUE; + } + return FALSE; +} + +/* Basic pointer sizes and alignments for the AVR */ +static machine_spec avr_machine = { + "avr", + gcc_save_machine_options, + FALSE, /* big_endian */ + FALSE, /* pcc_bitfield_type_matters */ + 8, /* empty field boundary - in bits */ + 8, /* structure size boundary - in bits */ + 1, /* word size */ + { 2, 1 }, /* pointer type */ + { 4, 1 }, /* float */ + { 4, 1 }, /* double */ + { 4, 1 }, /* long double */ + { 2, 1 }, /* short */ + { 2, 1 }, /* int */ + { 4, 1 }, /* long */ + { 8, 1 }, /* long long (unsupported in avr-gcc) */ + 1, 1, 1, 1, /* int1/2/4/8 align */ + 2, 2, /* wchar_t, size_t size */ + TRUE, TRUE, /* char, wchar_t signed */ + + NULL, /* adjust_field_align */ + + avr_decl_attribute, /* Attribute handling: declarations */ + NULL, NULL, NULL, /* Attribute handling: tag, field, type */ + NULL, NULL, /* preint, init */ + NULL, /* token */ + NULL, /* keil special */ + gcc_global_cpp_init, /* global cpp support */ + NULL /* per-file cpp support */ +}; + diff --git a/src/machine/env_machine.c b/src/machine/env_machine.c new file mode 100644 index 0000000..529840b --- /dev/null +++ b/src/machine/env_machine.c @@ -0,0 +1,296 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2004 The Regents of the University of California. + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +//$Id: env_machine.c,v 1.10 2008/06/03 21:20:22 idgay Exp $ +//@author Cory Sharp + +/* Basic pointer sizes and alignments for a machine set in the environment + * variable NESC_MACHINE of the form: + * + * export NESC_MACHINE="long_double=8,4 gcc=some-other-gcc" + * + * Particular order of the keynames is not necessary. The defaults below + * are taken for otherwise unspecified values. + */ + +#include + +static machine_spec env_machine = { + "env", + gcc_save_machine_options, + /* [default] */ /* [keyname] */ + FALSE, /* big_endian */ + FALSE, /* pcc_bitfield_type_matters */ + 8, /* empty_field_boundary */ + 8, /* structure_size_boundary */ + 1, /* word size */ + {2, 1}, /* pointer */ + {4, 1}, /* float */ + {4, 1}, /* double */ + {4, 1}, /* long_double */ + {2, 1}, /* short */ + {2, 1}, /* int */ + {4, 1}, /* long */ + {8, 1}, /* long_long */ + 1, 1, 1, 1, /* int1248_align */ + 2, 2, /* wchar_size_size */ + TRUE, TRUE, /* char_wchar_signed */ + + NULL, /* adjust_field_align */ + + NULL, NULL, NULL, NULL, /* Attributes: need some way to specify this */ + NULL, NULL, /* preinit, init */ + NULL, /* token */ + NULL, /* keil special */ + gcc_global_cpp_init, /* global cpp support */ + NULL /* per-file cpp support */ +}; + +static const char *find_char(const char *str, const char *strend, char ch) +{ + while (str != strend && *str != ch) + str++; + return str; +} + +static const char *find_not_char(const char *str, const char *strend, char ch) +{ + while (str != strend && *str == ch) + str++; + return str; +} + +static bool is_literali(const char *literal, const char *str, const char *strend) +{ + int n = strlen(literal); + if (n == (strend - str) && strncasecmp(literal, str, n) == 0) + return TRUE; + return FALSE; +} + +static int scan_boolean(const char *str, const char *strend) +{ + if (is_literali("false", str, strend)) + return 0; + if (is_literali("true", str, strend)) + return 1; + return -1; +} + +static bool scan_intlist(const char *str, const char *strend, int *intlist, + int count) +{ + while (count-- > 0) + { + if (str == strend) + return FALSE; + *intlist++ = atoi(str); + str = find_not_char(find_char(str, strend, ','), strend, ','); + } + if (str != strend) + return FALSE; + return TRUE; +} + +static bool scan_env_machine(machine_spec * machine, const char *envname) +{ + const char *begin = getenv(envname); + const char *end = begin; + int n_errors = 0; + + struct { + const char *name; + machine_type_spec *spec; + } typespecs[] = { + { "pointer", &(machine->tptr) }, + { "float", &(machine->tfloat) }, + { "double", &(machine->tdouble) }, + { "long_double", &(machine->tlong_double) }, + { "short", &(machine->tshort) }, + { "int", &(machine->tint) }, + { "long", &(machine->tlong) }, + { "long_long", &(machine->tlong_long) }, + { NULL, NULL } + }; + + if (begin == NULL) + { + error("environment variable %s is undefined", envname); + return FALSE; + } + + end = begin + strlen(begin); + while (begin != end) + { + const char *space = find_char(begin, end, ' '); + const char *equal = find_char(begin, space, '='); + const char *value = find_not_char(equal, space, '='); + const char *name = "(unknown)"; + int intlist[4] = { 0, 0, 0, 0 }; + + if (is_literali(name = "pcc_bitfield_type_matters", begin, equal)) + { + int b = scan_boolean(value, space); + if (b != -1) + { + machine->pcc_bitfield_type_matters = b ? TRUE : FALSE; + } + else + { + error("%s.%s, expected 'false' or 'true'", envname, name); + n_errors++; + } + } + else if (is_literali(name = "big_endian", begin, equal)) + { + int b = scan_boolean(value, space); + if (b != -1) + { + machine->big_endian = b ? TRUE : FALSE; + } + else + { + error("%s.%s, expected 'false' or 'true'", envname, name); + n_errors++; + } + } + else if (is_literali(name = "empty_field_boundary", begin, equal)) + { + if (scan_intlist(value, space, intlist, 1) == TRUE) + { + machine->empty_field_boundary = intlist[0]; + } + else + { + error("%s.%s, expected one int", envname, name); + n_errors++; + } + } + else if (is_literali(name = "structure_size_boundary", begin, equal)) + { + if (scan_intlist(value, space, intlist, 1) == TRUE) + { + machine->structure_size_boundary = intlist[0]; + } + else + { + error("%s.%s, expected one int", envname, name); + n_errors++; + } + } + else if (is_literali(name = "word_size", begin, equal)) + { + if (scan_intlist(value, space, intlist, 1) == TRUE) + { + machine->word_size = intlist[0]; + } + else + { + error("%s.%s, expected one int", envname, name); + n_errors++; + } + } + else if (is_literali(name = "int1248_align", begin, equal)) + { + if (scan_intlist(value, space, intlist, 4) == TRUE) + { + machine->int1_align = intlist[0]; + machine->int2_align = intlist[1]; + machine->int4_align = intlist[2]; + machine->int8_align = intlist[3]; + } + else + { + error("%s.%s, expected 4 ints", envname, name); + n_errors++; + } + } + else if (is_literali(name = "wchar_size_size", begin, equal)) + { + if (scan_intlist(value, space, intlist, 2) == TRUE) + { + machine->wchar_t_size = intlist[0]; + machine->size_t_size = intlist[1]; + } + else + { + error("%s.%s, expected 2 ints, wchar_t size and size_t size", + envname, name); + n_errors++; + } + } + else if (is_literali(name = "char_wchar_signed", begin, equal)) + { + const char *comma = find_char(value, space, ','); + if (comma != space) + { + int b1 = scan_boolean(value, comma); + int b2 = + scan_boolean(find_not_char(comma, space, ','), space); + if (b1 != -1 && b2 != -1) + { + machine->char_signed = b1 ? TRUE : FALSE; + machine->wchar_t_signed = b2 ? TRUE : FALSE; + } + else + { + error("%s.%s, bools must be 'false' or 'true'", envname, + name); + n_errors++; + } + } + else + { + error("%s.%s, expected 2 bools, char and wchar signed", + envname, name); + n_errors++; + } + } + else + { + int i = 0; + for (i = 0; typespecs[i].name != NULL; i++) + { + if (is_literali(name = typespecs[i].name, begin, equal)) + { + if (scan_intlist(value, space, intlist, 2) == TRUE) + { + typespecs[i].spec->size = intlist[0]; + typespecs[i].spec->align = intlist[1]; + break; + } + else + { + error("%s.%s, expected 2 ints, size and align", + envname, name); + n_errors++; + } + } + } + + if (typespecs[i].name == NULL) + { + error("%s, unknown field name starting at %s", envname, begin); + n_errors++; + } + } + + begin = find_not_char(space, end, ' '); + } + + return (n_errors == 0) ? TRUE : FALSE; +} diff --git a/src/machine/keil-gperf.h b/src/machine/keil-gperf.h new file mode 100644 index 0000000..53ff6d6 --- /dev/null +++ b/src/machine/keil-gperf.h @@ -0,0 +1,174 @@ +/* C code produced by gperf version 3.0.1 */ +/* Command-line: gperf -j1 -t -E -H keil_hash -N is_keil_word -k'1,3,$' machine/keil.gperf */ + +#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ + && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ + && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ + && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ + && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ + && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ + && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ + && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ + && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ + && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ + && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ + && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ + && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ + && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ + && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ + && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ + && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ + && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ + && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ + && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ + && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ + && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ + && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) +/* The character set is not based on ISO-646. */ +error "gperf generated tables don't work with this execution character set. Please report a bug to ." +#endif + +#line 1 "machine/keil.gperf" + +/* This file is part of the nesC compiler. + Copyright (C) 2007 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + + +#line 21 "machine/keil.gperf" +struct keilword { char *name; int token; }; +/* maximum key range = 20, duplicates = 0 */ + +#ifdef __GNUC__ +__inline +#else +#ifdef __cplusplus +inline +#endif +#endif +static unsigned int +keil_hash (str, len) + register const char *str; + register unsigned int len; +{ + static unsigned char asso_values[] = + { + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 12, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 0, 23, 0, 15, 0, + 13, 5, 0, 7, 23, 0, 23, 23, 2, 11, + 11, 23, 10, 23, 0, 4, 0, 7, 23, 23, + 8, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23 + }; + return len + asso_values[(unsigned char)str[2]] + asso_values[(unsigned char)str[0]] + asso_values[(unsigned char)str[len - 1]]; +} + +#ifdef __GNUC__ +__inline +#endif +struct keilword * +is_keil_word (str, len) + register const char *str; + register unsigned int len; +{ + enum + { + TOTAL_KEYWORDS = 20, + MIN_WORD_LENGTH = 3, + MAX_WORD_LENGTH = 10, + MIN_HASH_VALUE = 3, + MAX_HASH_VALUE = 22 + }; + + static struct keilword wordlist[] = + { + {""}, {""}, {""}, +#line 29 "machine/keil.gperf" + {"far", TARGET_ATTRIBUTE0}, +#line 23 "machine/keil.gperf" + {"_at_", TARGET_ATTRIBUTE1}, +#line 30 "machine/keil.gperf" + {"idata", TARGET_ATTRIBUTE0}, +#line 40 "machine/keil.gperf" + {"_task_", TARGET_ATTRIBUTE1}, +#line 37 "machine/keil.gperf" + {"sfr", TARGET_DEF}, +#line 36 "machine/keil.gperf" + {"sbit", TARGET_DEF}, +#line 31 "machine/keil.gperf" + {"interrupt", TARGET_ATTRIBUTE1}, +#line 34 "machine/keil.gperf" + {"_priority_", TARGET_ATTRIBUTE1}, +#line 39 "machine/keil.gperf" + {"small", TARGET_ATTRIBUTE0}, +#line 32 "machine/keil.gperf" + {"large", TARGET_ATTRIBUTE0}, +#line 42 "machine/keil.gperf" + {"xdata", TARGET_ATTRIBUTE0}, +#line 35 "machine/keil.gperf" + {"reentrant", TARGET_ATTRIBUTE0}, +#line 33 "machine/keil.gperf" + {"pdata", TARGET_ATTRIBUTE0}, +#line 24 "machine/keil.gperf" + {"alien", TARGET_ATTRIBUTE0}, +#line 28 "machine/keil.gperf" + {"data", TARGET_ATTRIBUTE0}, +#line 27 "machine/keil.gperf" + {"compact", TARGET_ATTRIBUTE0}, +#line 41 "machine/keil.gperf" + {"using", TARGET_ATTRIBUTE1}, +#line 25 "machine/keil.gperf" + {"bdata", TARGET_ATTRIBUTE0}, +#line 38 "machine/keil.gperf" + {"sfr16", TARGET_DEF}, +#line 26 "machine/keil.gperf" + {"code", TARGET_ATTRIBUTE0} + }; + + if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) + { + register int key = keil_hash (str, len); + + if (key <= MAX_HASH_VALUE && key >= 0) + { + register const char *s = wordlist[key].name; + + if (*str == *s && !strcmp (str + 1, s + 1)) + return &wordlist[key]; + } + } + return 0; +} diff --git a/src/machine/keil.c b/src/machine/keil.c new file mode 100644 index 0000000..27b9ef2 --- /dev/null +++ b/src/machine/keil.c @@ -0,0 +1,107 @@ +/* Partial model for supporting Keil C (original version based on work + by David Patnode (dpatnode@bradley.edu) for this file). + + Maps the address space keywords into attributes (see keil_token). + Maps using, interrupt, etc into attributes (see keil_token). + + Defines typedefs for bit. The magic + sfr/sfr16/sbit name = address + Keil extension is rewritten to + sfr __attribute((keil_address(address))) name + using predefined typedefs for sbit, sfr and sfr16. This rewrite depends + on the special Keil hack in the parser (look for TARGET_DEF in c-parse.y). + + Does not: + - compute pointer size correctly (assumes they are all 2 bytes); + could improve by writing attribute handling functions to compute + the correct pointer size based on the address space attributes... + (note the default pointer size should be 2 bytes anyway, because that + size is used to size ptrdiff_t_type and intptr_type, and those will be + unhappy if there's no integer type of the same size as the pointer size) + - check any of the semantic restrictions associated with all these extensions + +*/ + +#include "machine/keil-gperf.h" + +static data_declaration keil_sbit_ddecl, keil_sfr_ddecl, keil_sfr16_ddecl; + +static void keil_init(void) +{ + declare_builtin_type("bit", unsigned_char_type); + + keil_sbit_ddecl = declare_builtin_type("sbit", unsigned_char_type); + keil_sfr_ddecl = declare_builtin_type("sfr", unsigned_char_type); + keil_sfr16_ddecl = declare_builtin_type("sfr16", unsigned_short_type); +} + +static int keil_token(const char *token, int len, struct yystype *lvalp) +{ + struct keilword *keyword = is_keil_word(token, len); + + if (keyword) + return keyword->token; + + return IDENTIFIER; +} + +declaration keil_special(location loc, cstring keyword, cstring name, + expression address) +{ + /* I just love this kind of code. */ + region r = parse_region; + /* Build __attribute__((keil_address(address))) */ + word aword = new_word(r, loc, str2cstring(r, "keil_address")); + gcc_attribute address_attr = new_gcc_attribute(r, loc, aword, address); + + /* Build a declaration for name */ + declarator d = make_identifier_declarator(loc, name); + data_declaration type_ddecl; + type_element elems; + declaration vd; + data_decl dd; + + /* Pick appropriate fake typedef for name based on keyword */ + if (!strcmp(keyword.data, "sbit")) + type_ddecl = keil_sbit_ddecl; + else if (!strcmp(keyword.data, "sfr")) + type_ddecl = keil_sfr_ddecl; + else + type_ddecl = keil_sfr16_ddecl; + + elems = CAST(type_element, new_typename(r, loc, type_ddecl)); + vd = start_decl(d, NULL, elems, FALSE, CAST(attribute, address_attr)); + finish_decl(vd, NULL); + dd = new_data_decl(r, loc, elems, vd); + + return CAST(declaration, dd); +} + +/* Basic pointer sizes and alignments for the 8051's compiled w/ Keil C51 */ +static machine_spec keil_machine = { + "keil", NULL, + TRUE, /* big_endian */ + FALSE, /* pcc_bitfield_type_matters */ + 8, /* empty field boundary - in bits */ + 8, /* structure size boundary - in bits */ + 1, /* word size */ + { 2, 1 }, /* pointer type */ + { 4, 1 }, /* float */ + { 4, 1 }, /* double */ + { 4, 1 }, /* long double */ + { 2, 1 }, /* short */ + { 2, 1 }, /* int */ + { 4, 1 }, /* long */ + { 8, 1 }, /* long long (unsupported in avr-gcc) */ + 1, 1, 1, 1, /* int1/2/4/8 align */ + 2, 2, /* wchar_t, size_t size */ + TRUE, TRUE, /* char, wchar_t signed */ + + NULL, /* adjust_field_align function */ + NULL, NULL, NULL, NULL, /* attribute handling functions */ + NULL, keil_init, + keil_token, + keil_special, /* Keil C special */ + NULL, /* global cpp support */ + NULL /* per-file cpp support */ +}; diff --git a/src/machine/keil.gperf b/src/machine/keil.gperf new file mode 100644 index 0000000..ae21d39 --- /dev/null +++ b/src/machine/keil.gperf @@ -0,0 +1,42 @@ +%{ +/* This file is part of the nesC compiler. + Copyright (C) 2007 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + + +%} +struct keilword { char *name; int token; }; +%% +_at_, TARGET_ATTRIBUTE1 +alien, TARGET_ATTRIBUTE0 +bdata, TARGET_ATTRIBUTE0 +code, TARGET_ATTRIBUTE0 +compact, TARGET_ATTRIBUTE0 +data, TARGET_ATTRIBUTE0 +far, TARGET_ATTRIBUTE0 +idata, TARGET_ATTRIBUTE0 +interrupt, TARGET_ATTRIBUTE1 +large, TARGET_ATTRIBUTE0 +pdata, TARGET_ATTRIBUTE0 +_priority_, TARGET_ATTRIBUTE1 +reentrant, TARGET_ATTRIBUTE0 +sbit, TARGET_DEF +sfr, TARGET_DEF +sfr16, TARGET_DEF +small, TARGET_ATTRIBUTE0 +_task_, TARGET_ATTRIBUTE1 +using, TARGET_ATTRIBUTE1 +xdata, TARGET_ATTRIBUTE0 diff --git a/src/machine/msp430.c b/src/machine/msp430.c new file mode 100644 index 0000000..6e6dff4 --- /dev/null +++ b/src/machine/msp430.c @@ -0,0 +1,52 @@ +static bool msp430_decl_attribute(gcc_attribute attr, data_declaration ddecl) +{ + const char *name = attr->word1->cstring.data; + + /* Different from the AVR! */ + if (!strcmp(name, "signal")) + { + ddecl->spontaneous = c_call_nonatomic; + return TRUE; + } + else if (!strcmp(name, "interrupt")) + { + ddecl->async = TRUE; + /* The signal attribute may have come first */ + if (ddecl->spontaneous != c_call_nonatomic) + ddecl->spontaneous = c_call_atomic; + return TRUE; + } + return FALSE; +} + +/* Basic pointer sizes and alignments for the TI MSP430 */ +static machine_spec msp430_machine = { + "msp430", + gcc_save_machine_options, + FALSE, /* big_endian */ + FALSE, /* pcc_bitfield_type_matters */ + 16, /* empty field boundary - in bits */ + 8, /* structure size boundary - in bits */ + 2, /* word size */ + { 2, 2 }, /* pointer type */ + { 4, 2 }, /* float */ + { 4, 2 }, /* double */ + { 4, 2 }, /* long double */ + { 2, 2 }, /* short */ + { 2, 2 }, /* int */ + { 4, 2 }, /* long */ + { 8, 2 }, /* long long */ + 1, 2, 2, 2, /* int1/2/4/8 align */ + 2, 2, /* wchar_t, size_t size */ + TRUE, TRUE, /* char, wchar_t signed */ + + NULL, /* adjust_field_align */ + + msp430_decl_attribute, /* Attribute handling: declarations */ + NULL, NULL, NULL, /* Attribute handling: tag, field, type */ + NULL, NULL, /* preint, init */ + NULL, /* token */ + NULL, /* keil special */ + gcc_global_cpp_init, /* global cpp support */ + NULL /* per-file cpp support */ +}; diff --git a/src/machine/sdcc-gperf.h b/src/machine/sdcc-gperf.h new file mode 100644 index 0000000..9ef4b17 --- /dev/null +++ b/src/machine/sdcc-gperf.h @@ -0,0 +1,187 @@ +/* C code produced by gperf version 3.0.1 */ +/* Command-line: gperf -j1 -t -E -H sdcc_hash -N is_sdcc_word -k1,3 machine/sdcc.gperf */ + +#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ + && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ + && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ + && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ + && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ + && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ + && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ + && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ + && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ + && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ + && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ + && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ + && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ + && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ + && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ + && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ + && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ + && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ + && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ + && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ + && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ + && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ + && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) +/* The character set is not based on ISO-646. */ +error "gperf generated tables don't work with this execution character set. Please report a bug to ." +#endif + +#line 1 "machine/sdcc.gperf" + +/* This file is part of the nesC compiler. + Copyright (C) 2007 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + + +#line 21 "machine/sdcc.gperf" +struct sdccword { char *name; int token; }; +/* maximum key range = 21, duplicates = 0 */ + +#ifdef __GNUC__ +__inline +#else +#ifdef __cplusplus +inline +#endif +#endif +static unsigned int +sdcc_hash (str, len) + register const char *str; + register unsigned int len; +{ + static unsigned char asso_values[] = + { + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 0, 23, 0, 23, 14, + 3, 23, 13, 23, 23, 0, 23, 23, 23, 23, + 13, 23, 9, 23, 6, 23, 6, 5, 23, 23, + 1, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23 + }; + register int hval = len; + + switch (hval) + { + default: + hval += asso_values[(unsigned char)str[2]]; + /*FALLTHROUGH*/ + case 2: + case 1: + hval += asso_values[(unsigned char)str[0]]; + break; + } + return hval; +} + +#ifdef __GNUC__ +__inline +#endif +struct sdccword * +is_sdcc_word (str, len) + register const char *str; + register unsigned int len; +{ + enum + { + TOTAL_KEYWORDS = 20, + MIN_WORD_LENGTH = 2, + MAX_WORD_LENGTH = 11, + MIN_HASH_VALUE = 2, + MAX_HASH_VALUE = 22 + }; + + static struct sdccword wordlist[] = + { + {""}, {""}, +#line 40 "machine/sdcc.gperf" + {"at", TARGET_ATTRIBUTE1}, + {""}, +#line 30 "machine/sdcc.gperf" + {"__at", TARGET_ATTRIBUTE1}, +#line 37 "machine/sdcc.gperf" + {"idata", TARGET_ATTRIBUTE0}, +#line 35 "machine/sdcc.gperf" + {"xdata", TARGET_ATTRIBUTE0}, +#line 27 "machine/sdcc.gperf" + {"__idata", TARGET_ATTRIBUTE0}, +#line 25 "machine/sdcc.gperf" + {"__xdata", TARGET_ATTRIBUTE0}, +#line 23 "machine/sdcc.gperf" + {"__data", TARGET_ATTRIBUTE0}, +#line 42 "machine/sdcc.gperf" + {"using", TARGET_ATTRIBUTE1}, +#line 31 "machine/sdcc.gperf" + {"__interrupt", TARGET_ATTRIBUTE1}, +#line 32 "machine/sdcc.gperf" + {"__using", TARGET_ATTRIBUTE1}, +#line 33 "machine/sdcc.gperf" + {"data", TARGET_ATTRIBUTE0}, +#line 38 "machine/sdcc.gperf" + {"pdata", TARGET_ATTRIBUTE0}, +#line 41 "machine/sdcc.gperf" + {"interrupt", TARGET_ATTRIBUTE1}, +#line 28 "machine/sdcc.gperf" + {"__pdata", TARGET_ATTRIBUTE0}, +#line 34 "machine/sdcc.gperf" + {"near", TARGET_ATTRIBUTE0}, +#line 26 "machine/sdcc.gperf" + {"__far", TARGET_ATTRIBUTE0}, +#line 24 "machine/sdcc.gperf" + {"__near", TARGET_ATTRIBUTE0}, +#line 29 "machine/sdcc.gperf" + {"__code", TARGET_ATTRIBUTE0}, +#line 39 "machine/sdcc.gperf" + {"code", TARGET_ATTRIBUTE0}, +#line 36 "machine/sdcc.gperf" + {"far", TARGET_ATTRIBUTE0} + }; + + if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) + { + register int key = sdcc_hash (str, len); + + if (key <= MAX_HASH_VALUE && key >= 0) + { + register const char *s = wordlist[key].name; + + if (*str == *s && !strcmp (str + 1, s + 1)) + return &wordlist[key]; + } + } + return 0; +} diff --git a/src/machine/sdcc.c b/src/machine/sdcc.c new file mode 100644 index 0000000..dbc732d --- /dev/null +++ b/src/machine/sdcc.c @@ -0,0 +1,76 @@ +/* Based on keil.c */ +/* Basic pointer sizes and alignments for the 8051's compiled w/ SDCC */ + +/* Partial model for supporting SDCC. + + Maps the address space keywords into attributes (see sdcc_token). + Maps __at, __using, __interrupt, etc into attributes (see sdcc_token). + Defines typedefs for bit, sbit, sfr, sfr16 and sfr32. + + Does not: + - allow you to say (e.g.) "signed bit", or "unsigned bit"; this applies to + bit, sbit, sfr, sfr16 and sfr32. + - compute pointer size correctly (assumes they are all 2 bytes); + could improve by writing attribute handling functions to compute + the correct pointer size based on the address space attributes... + (note the default pointer size should be 2 bytes anyway, because that + size is used to size ptrdiff_t_type and intptr_type, and those will be + unhappy if there's no integer type of the same size as the pointer size) + - check any of the semantic restrictions associated with all these extensions + +*/ + + +#include "machine/sdcc-gperf.h" + +static void sdcc_init(void) +{ + declare_builtin_type("bit", unsigned_char_type); + declare_builtin_type("sbit", unsigned_char_type); + declare_builtin_type("sfr", unsigned_char_type); + declare_builtin_type("sfr16", unsigned_short_type); + declare_builtin_type("sfr32", unsigned_long_type); + declare_builtin_type("__bit", unsigned_char_type); + declare_builtin_type("__sbit", unsigned_char_type); + declare_builtin_type("__sfr", unsigned_char_type); + declare_builtin_type("__sfr16", unsigned_short_type); + declare_builtin_type("__sfr32", unsigned_long_type); +} + +static int sdcc_token(const char *token, int len, struct yystype *lvalp) +{ + struct sdccword *keyword = is_sdcc_word(token, len); + + if (keyword) + return keyword->token; + + return IDENTIFIER; +} + +static machine_spec sdcc_machine = { + "sdcc", NULL, + FALSE, /* big_endian */ + FALSE, /* pcc_bitfield_type_matters */ + 8, /* empty field boundary - in bits */ + 8, /* structure size boundary - in bits */ + 1, /* word size */ + { 2, 1 }, /* pointer type */ + { 4, 1 }, /* float */ + { 4, 1 }, /* double */ + { 4, 1 }, /* long double */ + { 2, 1 }, /* short */ + { 2, 1 }, /* int */ + { 4, 1 }, /* long */ + { 8, 1 }, /* long long */ + 1, 1, 1, 1, /* int1/2/4/8 align */ + 2, 2, /* wchar_t, size_t size */ + TRUE, TRUE, /* char, wchar_t signed */ + + NULL, /* adjust_field_align function */ + NULL, NULL, NULL, NULL, /* attribute handling functions */ + NULL, sdcc_init, + sdcc_token, + NULL, /* Keil C special */ + NULL, /* global cpp support */ + NULL /* per-file cpp support */ +}; diff --git a/src/machine/sdcc.gperf b/src/machine/sdcc.gperf new file mode 100644 index 0000000..0c93766 --- /dev/null +++ b/src/machine/sdcc.gperf @@ -0,0 +1,42 @@ +%{ +/* This file is part of the nesC compiler. + Copyright (C) 2007 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + + +%} +struct sdccword { char *name; int token; }; +%% +__data, TARGET_ATTRIBUTE0 +__near, TARGET_ATTRIBUTE0 +__xdata, TARGET_ATTRIBUTE0 +__far, TARGET_ATTRIBUTE0 +__idata, TARGET_ATTRIBUTE0 +__pdata, TARGET_ATTRIBUTE0 +__code, TARGET_ATTRIBUTE0 +__at, TARGET_ATTRIBUTE1 +__interrupt, TARGET_ATTRIBUTE1 +__using, TARGET_ATTRIBUTE1 +data, TARGET_ATTRIBUTE0 +near, TARGET_ATTRIBUTE0 +xdata, TARGET_ATTRIBUTE0 +far, TARGET_ATTRIBUTE0 +idata, TARGET_ATTRIBUTE0 +pdata, TARGET_ATTRIBUTE0 +code, TARGET_ATTRIBUTE0 +at, TARGET_ATTRIBUTE1 +interrupt, TARGET_ATTRIBUTE1 +using, TARGET_ATTRIBUTE1 diff --git a/src/machine/self.c b/src/machine/self.c new file mode 100644 index 0000000..21a82c0 --- /dev/null +++ b/src/machine/self.c @@ -0,0 +1,111 @@ +#include + +/* Basic pointer sizes and alignments for this machine */ + +/* GCC is broken (could be a broken design issue ;-)), so need the + typedefs (rather than using the types directly in the calls + to alignof) */ +typedef int __attribute__ ((mode(__word__))) myword; +typedef int __attribute__ ((mode(__byte__))) myint1; +typedef int __attribute__ ((mode(__HI__))) myint2; +typedef int __attribute__ ((mode(__SI__))) myint4; +typedef int __attribute__ ((mode(__DI__))) myint8; + +/* Find out how big the smallest struct is. Assume this tells us to + what multiples structs are rounded. */ +struct self_smallest { + char x; +}; + +/* Find out to what multiple 0-bit bitfields round thingg */ +struct self_efb { + char x : 1; + char : 0; +}; + +/* Detect if bitfield type influences the struct */ +struct self_pcc1 { + int x : 1; +}; +struct self_pcc2 { + char x : 1; +}; + +static void self_preinit(void); + +#ifdef __i386__ +#define SELF_ADJUST_FIELD_ALIGN self_adjust_field_align +#define SELF_HANDLE_OPTION self_handle_option + +static bool align_double; + +static cval self_adjust_field_align(field_declaration fdecl, cval alignment) +{ + if (!align_double && type_arithmetic(type_array_of_base(fdecl->type))) + alignment = cval_min(make_cval_unsigned(32, size_t_type), alignment); + return alignment; +} + +static void self_handle_option(const char *arg) +{ + if (!strcmp(arg, "-malign-double")) + align_double = TRUE; + else if (!strcmp(arg, "-mnoalign-double")) + align_double = FALSE; + gcc_save_machine_options(arg); +} + +#else +#define SELF_ADJUST_FIELD_ALIGN NULL +#define SELF_HANDLE_OPTION gcc_save_machine_options + +#endif + +static machine_spec self_machine = { + "pc", SELF_HANDLE_OPTION, + + FALSE, /* big_endian, set in preinit */ + + /* pcc_bitfield_type_matters */ + sizeof(struct self_pcc1) != sizeof(struct self_pcc2), + + /* empty field boundary */ + sizeof(struct self_efb) * BITSPERBYTE, + + /* structure size boundary */ + sizeof(struct self_smallest) * BITSPERBYTE, + + sizeof(myword), /* word size */ + { sizeof(void *), __alignof__(void *) }, /* pointer type */ + { sizeof(float), __alignof__(float) }, /* float */ + { sizeof(double), __alignof__(double) }, /* double */ + { sizeof(long double), __alignof__(long double) }, /* long double */ + { sizeof(short), __alignof__(short) }, /* short */ + { sizeof(int), __alignof__(int) }, /* int */ + { sizeof(long), __alignof__(long) }, /* long */ + { sizeof(long long), __alignof__(long long) }, /* long long */ + __alignof__(myint1), __alignof__(myint2), + __alignof__(myint4), __alignof__(myint8), /* int1/2/4/8 align */ + sizeof(wchar_t), sizeof(size_t), /* wchar_t, size_t size */ + (char)-1 < 0, (wchar_t)-1 < 0, /* char, wchar_t signed */ + + SELF_ADJUST_FIELD_ALIGN, /* adjust_field_align */ + + NULL, NULL, NULL, NULL, /* No special attributes */ + self_preinit, NULL, /* init */ + NULL, /* token */ + NULL, /* keil special */ + gcc_global_cpp_init, /* global cpp support */ + NULL /* per-file cpp support */ +}; + +static void self_preinit(void) +{ + union { + uint8_t a; + uint16_t b; + } endian; + + endian.b = 1; + self_machine.big_endian = endian.a != 1; +} diff --git a/src/nconfig.h b/src/nconfig.h new file mode 100644 index 0000000..54323e4 --- /dev/null +++ b/src/nconfig.h @@ -0,0 +1,86 @@ +/* This file is part of the nesC compiler. + +This file is derived from the RC Compiler. It is thus + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef NCONFIG_H +#define NCONFIG_H + +/* autoconf/configure options */ +#include "autoconf.h" +#undef PACKAGE +#undef PACKAGE_NAME +#undef PACKAGE_STRING +#undef PACKAGE_TARNAME +#undef PACKAGE_BUGREPORT +#undef PACKAGE_VERSION + +/* Target type structure information. + This setup assumes that we are compiling on self, with gcc +*/ + +#include +#define BITSPERBYTE CHAR_BIT + +/* Largest signed and unsigned int types (for constants and constant folding) */ +typedef long long largest_int; +typedef unsigned long long largest_uint; + +#define LARGEST_UINTBITS (SIZEOF_LONG_LONG * BITSPERBYTE) + +/* Miscellaneous config */ + +typedef unsigned char bool; + +#include "cstring.h" + +#ifndef NULL +#define NULL ((void *)0) +#endif + +#define TRUE 1 +#define FALSE 0 + +#define SUCCESS_EXIT_CODE 0 +#define FATAL_EXIT_CODE 33 + +#ifdef HAVE_ALLOCA_H +#include +#else +#ifdef __GNUC__ +#define alloca __builtin_alloca +void *alloca(size_t n); +#else +#error need alloca +#endif +#endif + +#if __GNUC__ >= 3 && __GNUC_MINOR__ >= 1 +#define USE_UNNAMED_UNION +#endif + +/* The number of non-significant low-order bits in pointer addresses + (typically log2 of the alignment of allocations) */ +#define ALIGNMENT_BITS 3 + +#ifdef WIN32 +#define DIR_SEPARATOR '\\' +#endif + +#endif diff --git a/src/nesc-abstract.c b/src/nesc-abstract.c new file mode 100644 index 0000000..2ffc824 --- /dev/null +++ b/src/nesc-abstract.c @@ -0,0 +1,1423 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include "parser.h" +#include "nesc-cg.h" +#include "nesc-c.h" +#include "nesc-abstract.h" +#include "c-parse.h" +#include "nesc-component.h" +#include "nesc-semantics.h" +#include "nesc-configuration.h" +#include "AST_walk.h" +#include "semantics.h" +#include "constants.h" +#include "nesc-constants.h" +#include "c-lex.h" +#include "expr.h" +#include "nesc-env.h" +#include "init.h" +#include "attributes.h" +#include "nesc-attributes.h" +#include "unparse.h" + +static AST_walker clone_walker; + +/* data_declaration in: + oldidentifier_decl: ignored as illegal in modules + string + + enumerator + function_decl + identifier + component_deref + interface_deref + typename + variable_decl + type_parm_decl +*/ + +/* tag_declaration in: + tag_ref + types + */ + +/* field_declaration in: + field_ref + field_decl + tag_declaration + */ + +/* types in: + (ignoring declared_type, currently unused) + expression + asttype + field_declaration + data_declaration + (reptype in tag_declaration does not need instantiating) + */ + +/* typelist in: + data_declaration (gparms, can ignore oldstyle_args as not allowed in + modules) +*/ + +static void *clone(region r, void *vn) +{ + struct location l; + node *n = vn; + node new = AST_clone(r, *n); + + (*n)->instantiation = new; + new->instantiation = NULL; + *n = new; + + /* Update location to include the container (so we can print instance + names in error messages) */ + l = *new->location; + l.container = current.container; + new->location = make_location(l); + + return new; +} + +static void forward(data_declaration *dd) +{ + data_declaration ddecl = *dd; + + if (ddecl->instantiation) + *dd = ddecl->instantiation; +} + +static void instantiate_ddecl_types(data_declaration ddecl) +{ + /* type's in declarations come from the source code, so cannot be unknown */ + ddecl->type = instantiate_type(ddecl->type); + if (ddecl->kind == decl_interface_ref && ddecl->gparms) + ddecl->gparms = instantiate_typelist(ddecl->gparms); +} + +static data_declaration hack_interface; +static int hack_required; + +static void clone_ddecl(data_declaration ddecl) +{ + data_declaration copy; + + /* If already cloned, return. */ + if (ddecl->instantiation && + (!hack_interface || ddecl->instantiation->interface == hack_interface)) + { + /* If the instantiation's context matches the current one, the + instantiation was already done. */ + if (ddecl->container && + ddecl->instantiation->container == current.container) + return; + if (ddecl->container_function && + ddecl->instantiation->container_function == current.function_decl->ddecl) + return; + } + + /* Copy module functions (incl. tasks) and variables */ + + if (!(ddecl->kind == decl_variable || ddecl->kind == decl_function || + ddecl->kind == decl_constant || ddecl->kind == decl_typedef || + ddecl->kind == decl_interface_ref)) + return; + + /* Instantiate decls in modules */ + if (!(ddecl->container || + (ddecl->container_function && ddecl->container_function->container))) + return; + + copy = declare(current.env, ddecl, TRUE); + /* We don't have a proper environment, so the container and + container_function fields are bogus. Set them correctly. */ + if (ddecl->container) /* module level */ + { + copy->container = current.container; + copy->container_function = NULL; + } + else /* local */ + { + copy->container = NULL; + copy->container_function = current.function_decl->ddecl; + } + + ddecl->instantiation = copy; + copy->instantiation = NULL; + copy->fn_uses = NULL; + copy->nuses = NULL; + copy->instanceof = ddecl; + copy->interface = hack_interface; + /* This hack_required thing is ugly. It's used when instantiating + generic interfaces, to match the used/provides at the particular + instantiation. */ + if (ddecl_is_command_or_event(copy) && hack_required) + copy->defined = (copy->ftype == function_command) ^ (hack_required - 1); + instantiate_ddecl_types(copy); +} + +static void copy_fields(region r, tag_declaration copy, tag_declaration orig) +{ + field_declaration ofield, *nextfield; + + copy->fields = new_env(r, NULL); + nextfield = ©->fieldlist; + + for (ofield = orig->fieldlist; ofield; ofield = ofield->next) + { + field_declaration cfield = ralloc(r, struct field_declaration); + + *cfield = *ofield; + ofield->instantiation = cfield; + cfield->instantiation = NULL; + if (cfield->name) + env_add(copy->fields, cfield->name, cfield); + *nextfield = cfield; + nextfield = &cfield->next; + } +} + +static void forward_tdecl(region r, tag_ref tref) +{ + tag_declaration tdecl = tref->tdecl, copy; + + /* Ignore non-module tags */ + if (!(tdecl->container || + (tdecl->container_function && tdecl->container_function->container))) + return; + + /* If already cloned, use instance & return */ + if (tdecl->instantiation) + { + /* If the instantiation's context matches the current one, the + instantiation was already done. */ + tref->tdecl = tdecl->instantiation; + if (tdecl->container && + tdecl->instantiation->container == current.container) + return; + if (tdecl->container_function && + tdecl->instantiation->container_function == current.function_decl->ddecl) + return; + } + + copy = declare_tag(tref); + /* We don't have a proper environment, so the container and + container_function fields are bogus. Set them correctly. */ + if (tdecl->container) /* module level */ + { + copy->container = current.container; + copy->container_function = NULL; + } + else /* local */ + { + copy->container = NULL; + copy->container_function = current.function_decl->ddecl; + } + + + tref->tdecl = copy; + tdecl->instantiation = copy; + + copy->reptype = tdecl->reptype; + if (tdecl->defined) + copy_fields(r, copy, tdecl); + copy->instanceof = tdecl; + copy->defined = tdecl->defined; + copy->fields_const = tdecl->fields_const; + copy->fields_volatile = tdecl->fields_volatile; + copy->transparent_union = tdecl->transparent_union; + copy->collapsed = tdecl->collapsed; + copy->container = current.container; +} + +static ivalue instantiate_ivalue(region r, ivalue value); + +static void instantiate_ivalue_array(region r, ivalue copy, ivalue value) +{ + ivalue_array elem, *new_elems = ©->u.array; + + for (elem = value->u.array; elem; elem = elem->next) + { + ivalue_array copy_elem = ralloc(r, struct ivalue_array); + + *new_elems = copy_elem; + new_elems = ©_elem->next; + + copy_elem->from = elem->from; + copy_elem->to = elem->to; + copy_elem->value = instantiate_ivalue(r, elem->value); + } +} + +static void instantiate_ivalue_structured(region r, ivalue copy, ivalue value) +{ + ivalue_field field, *new_fields = ©->u.structured; + + for (field = value->u.structured; field; field = field->next) + { + ivalue_field copy_field = ralloc(r, struct ivalue_field); + + *new_fields = copy_field; + new_fields = ©_field->next; + + if (field->field->instantiation) + copy_field->field = field->field->instantiation; + else + copy_field->field = field->field; + copy_field->value = instantiate_ivalue(r, field->value); + } +} + +static ivalue instantiate_ivalue(region r, ivalue value) +{ + ivalue copy; + + // If already instantiated on this pass, return instantiation + if (value->instantiation) + return value->instantiation; + + /* type's in ivalues come from the source code, so cannot be unknown */ + copy = new_ivalue(r, value->kind, instantiate_type(value->type)); + value->instantiation = copy; + switch (value->kind) + { + case iv_base: + copy->u.base.require_constant_value = value->u.base.require_constant_value; + break; + case iv_array: instantiate_ivalue_array(r, copy, value); break; + case iv_structured: instantiate_ivalue_structured(r, copy, value); break; + default: assert(0); + } + return copy; +} + +static void clear_ivalue_instantiations(ivalue value); + +static void clear_ivalue_array(ivalue value) +{ + ivalue_array elem; + + for (elem = value->u.array; elem; elem = elem->next) + clear_ivalue_instantiations(elem->value); +} + +static void clear_ivalue_structured(ivalue value) +{ + ivalue_field field; + + for (field = value->u.structured; field; field = field->next) + clear_ivalue_instantiations(field->value); +} + +static void clear_ivalue_instantiations(ivalue value) +{ + // We've cleared here and beneath if instantiation is already NULL. + if (!value->instantiation) + return; + value->instantiation = NULL; + + switch (value->kind) + { + case iv_base: break; + case iv_array: clear_ivalue_array(value); break; + case iv_structured: clear_ivalue_structured(value); break; + default: assert(0); + } +} + +static type unary_type(unary e) +{ + switch (e->kind) + { + case kind_unary_plus: + case kind_unary_minus: + case kind_bitnot: + return type_default_conversion(e->type); + case kind_realpart: case kind_imagpart: { + type etype = type_default_conversion(e->type); + + return type_complex(etype) ? make_base_type(etype) : etype; + } + default: /* ++, --, cast, address of, dereference, field ref, + component deref, not, sizeof expr, alignof expr */ + return instantiate_type(e->type); + } +} + +static type binary_type(binary e) +{ + switch(e->kind) + { + case kind_plus: case kind_minus: case kind_times: case kind_divide: + case kind_modulo: case kind_bitand: case kind_bitor: case kind_bitxor: + case kind_lshift: case kind_rshift: + case kind_plus_assign: case kind_minus_assign: case kind_times_assign: + case kind_divide_assign: case kind_modulo_assign: case kind_bitand_assign: + case kind_bitor_assign: case kind_bitxor_assign: case kind_lshift_assign: + case kind_rshift_assign: { + type t1 = type_default_conversion(e->arg1->type); + type t2 = type_default_conversion(e->arg2->type); + + /* Detect the various pointer arithmetic cases. These cannot lead to + an unknown type, and don't want to be passed to common type */ + if (type_pointer(t1) || type_pointer(t2)) + return instantiate_type(e->type); + else + return common_type(t1, t2); + } + case kind_leq: case kind_geq: case kind_lt: case kind_gt: + case kind_eq: case kind_ne: + case kind_andand: case kind_oror: + case kind_array_ref: case kind_assign: + return instantiate_type(e->type); + + default: assert(0); return NULL; + } +} + +static type conditional_type(conditional e) +{ + type rtype = NULL; + type ttype = type_default_conversion(e->arg1->type); + type ftype = type_default_conversion(e->arg2->type); + + if (type_equal(ttype, ftype)) + rtype = ttype; + else if (type_equal_unqualified(ttype, ftype)) + rtype = make_qualified_type(ttype, no_qualifiers); + else if (type_real(ttype) && type_real(ftype)) + /* This should probably be type_arithmetic. See complex3.c/C9X */ + rtype = common_type(ttype, ftype); + else if (type_void(ttype) || type_void(ftype)) + rtype = void_type; + else if (type_pointer(ttype) && type_pointer(ftype)) + { + type tpointsto = type_points_to(ttype), fpointsto = type_points_to(ftype); + + if (type_compatible_unqualified(tpointsto, fpointsto)) + rtype = common_type(tpointsto, fpointsto); + else if (definite_null(e->arg1) && type_void(tpointsto)) + rtype = fpointsto; + else if (definite_null(e->arg2) && type_void(fpointsto)) + rtype = tpointsto; + else if (type_void(tpointsto)) + rtype = tpointsto; /* void * result */ + else if (type_void(fpointsto)) + rtype = fpointsto; /* void * result */ + else + /* Slight difference from GCC: I qualify the result type with + the appropriate qualifiers */ + rtype = void_type; + + /* Qualifiers depend on both types */ + rtype = make_pointer_type(qualify_type2(rtype, tpointsto, fpointsto)); + } + else if (type_pointer(ttype) && type_integer(ftype)) + rtype = ttype; + else if (type_pointer(ftype) && type_integer(ttype)) + rtype = ftype; + else if (flag_cond_mismatch) + rtype = void_type; + else + assert(0); + + /* Qualifiers depend on both types */ + return qualify_type2(rtype, ttype, ftype); +} + +static type expression_type(expression e) +{ + switch (e->kind) + { + default: + if (is_binary(e)) + return binary_type(CAST(binary, e)); + if (is_unary(e)) + return unary_type(CAST(unary, e)); + /* constants, label address, sizeof type, alignof type, identifier, + function call: these cannot be unknown type */ + return instantiate_type(e->type); + + case kind_comma: + return last_comma(CAST(comma, e))->type; + + case kind_conditional: + return conditional_type(CAST(conditional, e)); + /* ick */ + break; + } +} + +static AST_walker_result clone_expression(AST_walker spec, void *data, + expression *n) +{ + expression new = clone(data, n); + ivalue old_ivalue = NULL; + + if (new->ivalue) + { + ivalue copy = instantiate_ivalue(data, new->ivalue); + + old_ivalue = new->ivalue; + new->ivalue = copy; + if (copy->kind == iv_base) + copy->u.base.expr = new; + } + + AST_walk_children(spec, data, CAST(node, new)); + + // clear instantiation field in ivalues to be ready for next + // instantiation attempt + if (old_ivalue) + clear_ivalue_instantiations(old_ivalue); + + /* A few nodes (related to initialisation) don't have types */ + if (new->type) + new->type = expression_type(new); + + return aw_done; +} + +static AST_walker_result clone_stmt(AST_walker spec, void *data, statement *n) +{ + statement new = clone(data, n); + + /* Update containing_atomic and parent_loop */ + if (new->containing_atomic) + new->containing_atomic = CAST(atomic_stmt, new->containing_atomic->instantiation); + if (new->parent_loop) + new->parent_loop = CAST(statement, new->parent_loop->instantiation); + + return aw_walk; +} + +static AST_walker_result clone_asttype(AST_walker spec, void *data, asttype *n) +{ + asttype new = clone(data, n); + + /* type's in asttype come from the source code, so cannot be unknown */ + new->type = instantiate_type(new->type); + + return aw_walk; +} + +static AST_walker_result clone_function_decl(AST_walker spec, void *data, + function_decl *n) +{ + declaration old = CAST(declaration, *n); + function_decl new = clone(data, n); + + clone_ddecl(new->ddecl); + + if (new->ddecl->instantiation) + { + data_declaration instance = new->ddecl->instantiation; + + /* We need to forward the ddecl *and* update the definition field in + the instantiated data_declaration. */ + instance->definition = CAST(declaration, new); + /* We update the ast field if it pointed to this function_decl + (note that command and event data_declarations assume that the + ast field points to the original variable_decl) */ + if (instance->ast == old) + instance->ast = CAST(declaration, new); + new->ddecl = instance; + } + + current.function_decl = new; + current.env->fdecl = new; + AST_walk_children(spec, data, CAST(node, new)); + current.function_decl = NULL; + current.env->fdecl = NULL; + + return aw_done; +} + +static AST_walker_result clone_identifier(AST_walker spec, void *data, + identifier *n) +{ + clone_expression(spec, data, CASTPTR(expression, n)); + forward(&(*n)->ddecl); + + return aw_done; +} + +static AST_walker_result clone_interface_deref(AST_walker spec, void *data, + interface_deref *n) +{ + clone_expression(spec, data, CASTPTR(expression, n)); + forward(&(*n)->ddecl); + + return aw_done; +} + +static AST_walker_result clone_component_deref(AST_walker spec, void *data, + component_deref *n) +{ + component_deref new = clone(data, n); + + new->type = instantiate_type(new->type); + forward(&new->ddecl); + + return aw_walk; +} + +static AST_walker_result clone_variable_decl(AST_walker spec, void *data, + variable_decl *n) +{ + declaration old = CAST(declaration, *n); + variable_decl new = clone(data, n); + + if (new->ddecl) + { + clone_ddecl(new->ddecl); + + if (new->ddecl->instantiation) + { + data_declaration instance = new->ddecl->instantiation; + + /* Forward the ddecl and update the ast and definition fields */ + if (instance->definition == old) + instance->definition = CAST(declaration, new); + if (instance->ast == old) + instance->ast = CAST(declaration, new); + new->ddecl = instance; + } + } + + return aw_walk; +} + +static AST_walker_result clone_type_parm_decl(AST_walker spec, void *data, + type_parm_decl *n) +{ + type_parm_decl new = clone(data, n); + data_declaration instance; + + clone_ddecl(new->ddecl); + instance = new->ddecl->instantiation; + instance->definition = CAST(declaration, new); + instance->ast = CAST(declaration, new); + new->ddecl = instance; + + return aw_walk; +} + +static AST_walker_result clone_typename(AST_walker spec, void *data, + typename *n) +{ + typename new = clone(data, n); + + forward(&new->ddecl); + + return aw_walk; +} + +static AST_walker_result clone_enumerator(AST_walker spec, void *data, + enumerator *n) +{ + enumerator new = clone(data, n); + + clone_ddecl(new->ddecl); + + if (new->ddecl->instantiation) + { + data_declaration instance = new->ddecl->instantiation; + + /* Forward the ddecl and update the ast and definition fields */ + instance->definition = CAST(declaration, new); + instance->ast = CAST(declaration, new); + new->ddecl = instance; + } + + return aw_walk; +} + +static AST_walker_result clone_tag_ref(AST_walker spec, void *data, + tag_ref *n) +{ + tag_ref new = clone(data, n); + + forward_tdecl(data, new); + if (new->defined) + new->tdecl->definition = new; + AST_walk_children(spec, data, CAST(node, new)); + + return aw_done; +} + +static AST_walker_result clone_field_decl(AST_walker spec, void *data, + field_decl *n) +{ + field_decl new = clone(data, n); + + AST_walk_children(spec, data, CAST(node, new)); + new->fdecl = new->fdecl->instantiation; + new->fdecl->type = instantiate_type(new->fdecl->type); + new->fdecl->ast = new; + + return aw_done; +} + +static AST_walker_result clone_field_ref(AST_walker spec, void *data, + field_ref *n) +{ + field_ref new; + + clone_expression(spec, data, CASTPTR(expression, n)); + new = *n; + if (new->fdecl->instantiation) + new->fdecl = new->fdecl->instantiation; + + return aw_done; +} + +static void set_ddecl_instantiation1(data_declaration fndecl, void *data) +{ + data_declaration orig; + + instantiate_ddecl_types(fndecl); + + /* Here we make the copy of the fndecl created during parsing + (the copy from the actual interface type) point to fndecl. + We may have to go two deep for abstract modules in abstract + configurations (but don't get fooled by generic interfaces) */ + orig = fndecl->instanceof; + if (orig->instanceof && orig->instanceof->container->kind == l_component) + orig = orig->instanceof; + + orig->instantiation = fndecl; +} + +static void set_env_instantiations(environment env) +{ + const char *name; + void *entry; + env_scanner scan; + + env_scan(env->id_env, &scan); + while (env_next(&scan, &name, &entry)) + set_ddecl_instantiation1(entry, NULL); +} + +static void set_specification_instantiations(nesc_declaration component) +/* Effects: Set the instantiation pointers in the data_declarations of + the original abstract component from which component is derived to + the copies in component (in preparation for cloning component's + AST and pointing to component's decls) + + Also instantiate the types in the copies + + The original data_declarations can be found by following the + instanceof fields. We may have to follow these one deep (abstract + modules in configurations) or two deep (abstract modules in + abstract configurations)... +*/ +{ + component_spec_iterate(component, set_ddecl_instantiation1, NULL, TRUE); +} + +static void set_ddecl_instantiation2(data_declaration fndecl, void *data) +{ + /* We just make the decl fndecl is a copy of point back to fndecl */ + fndecl->instanceof->instantiation = fndecl; +} + +static void set_specification_instantiations_shallow(nesc_declaration component) +/* Effects: Set the instantiation pointers in the data_declarations of + the original abstract component from which component is derived to + the copies in component (in preparation for cloning component's + AST and pointing to component's decls) + + The original data_declarations can be found by following the + shadowed fields. We may have to follow these one deep (abstract + modules in configurations) or two deep (abstract modules in + abstract configurations)... +*/ +{ + component_spec_iterate(component, set_ddecl_instantiation2, NULL, TRUE); +} + +static declaration instantiate_parameters(region r, declaration orig_parms) +/* Effects: Makes a new list of declarations for an abstract componnent +*/ +{ + AST_walk_list(clone_walker, r, CASTPTR(node, &orig_parms)); + AST_set_parents(CAST(node, orig_parms)); + + return CAST(declaration, orig_parms); +} + +static void instantiate_endp(endp ep) +/* Effects: Modifies ep based on instantiated ddecls + */ +{ + /* The component does not get instantiated and is ignored anyway */ + if (ep->interface && ep->interface->instantiation) + ep->interface = ep->interface->instantiation; + if (ep->function && ep->function->instantiation) + ep->function = ep->function->instantiation; + if (ep->args_node) + ep->args_node = CAST(expression, ep->args_node->instantiation); +} + +static void instantiate_cg(cgraph copy, cgraph original) +/* Effects: Copies the original graph into copy, with endpoints based + on the instantiations specified in the function and interface ddecls +*/ +{ + ggraph orig_g = cgraph_graph(original); + gnode n; + gedge connection; + + /* Add all edges from original to copy, but with updated ddecls */ + graph_scan_nodes (n, orig_g) + { + struct endp from = *NODE_GET(endp, n); + gnode cfrom; + + instantiate_endp(&from); + cfrom = endpoint_lookup(copy, &from); + + graph_scan_out (connection, n) + { + struct endp to = *NODE_GET(endp, graph_edge_to(connection)); + gnode cto; + + instantiate_endp(&to); + cto = endpoint_lookup(copy, &to); + + graph_add_edge(cfrom, cto, NULL); + } + } +} + +static AST_walker_result clone_component_ref(AST_walker spec, void *data, + component_ref *n) +{ + component_ref new = clone(data, n); + + /* Instantiate any further abstract components inside this abstract + configuration. */ + if (new->cdecl->abstract) + { + new->cdecl = specification_copy(data, new, FALSE); + set_specification_instantiations_shallow(new->cdecl); + } + + return aw_walk; +} + +static AST_walker_result clone_interface_ref(AST_walker spec, void *data, + interface_ref *n) +{ + interface_ref new = clone(data, n); + + AST_walk_children(spec, data, CAST(node, new)); + + clone_ddecl(new->ddecl); + new->ddecl = new->ddecl->instantiation; + + if (new->ddecl->itype->abstract) + { + new->ddecl->itype = interface_copy(data, new, current.container->abstract); + new->ddecl->functions = new->ddecl->itype->env; + } + else + copy_interface_functions(data, current.container, + new->ddecl, new->ddecl->functions); + + return aw_done; +} + +static AST_walker_result clone_implementation(AST_walker spec, void *data, + implementation *n) +{ + implementation new = clone(data, n); + nesc_declaration comp = current.container, orig = original_component(comp); + + /* Copy the components and connections (configurations) or the + declarations (modules) */ + AST_walk_children(spec, data, CAST(node, new)); + + /* Copy the local_statics list for nido by following the instantiation + links in the original list */ + if (orig->local_statics) + { + dd_list_pos scan; + region r = regionof(comp->local_statics); + + dd_scan (scan, orig->local_statics) + { + data_declaration localsd = DD_GET(data_declaration, scan); + + dd_add_last(r, comp->local_statics, localsd->instantiation); + } + } + + /* Copy the connection graph + (note that comp->connections was initialised to an "empty" graph */ + instantiate_cg(comp->connections, orig->connections); + instantiate_cg(comp->user_connections, orig->user_connections); + + return aw_done; +} + +static AST_walker_result clone_ast(AST_walker spec, void *data, node *n) +{ + clone(data, n); + return aw_walk; +} + +static void init_clone(void) +{ + clone_walker = new_AST_walker(permanent); + AST_walker_handle(clone_walker, kind_node, clone_ast); + + AST_walker_handle(clone_walker, kind_expression, clone_expression); + AST_walker_handle(clone_walker, kind_field_ref, clone_field_ref); + AST_walker_handle(clone_walker, kind_identifier, clone_identifier); + AST_walker_handle(clone_walker, kind_interface_deref, clone_interface_deref); + AST_walker_handle(clone_walker, kind_component_deref, clone_component_deref); + + AST_walker_handle(clone_walker, kind_statement, clone_stmt); + + AST_walker_handle(clone_walker, kind_asttype, clone_asttype); + AST_walker_handle(clone_walker, kind_function_decl, clone_function_decl); + AST_walker_handle(clone_walker, kind_variable_decl, clone_variable_decl); + AST_walker_handle(clone_walker, kind_type_parm_decl, clone_type_parm_decl); + AST_walker_handle(clone_walker, kind_typename, clone_typename); + AST_walker_handle(clone_walker, kind_enumerator, clone_enumerator); + AST_walker_handle(clone_walker, kind_implementation, clone_implementation); + AST_walker_handle(clone_walker, kind_component_ref, clone_component_ref); + AST_walker_handle(clone_walker, kind_interface_ref, clone_interface_ref); + AST_walker_handle(clone_walker, kind_tag_ref, clone_tag_ref); + AST_walker_handle(clone_walker, kind_field_decl, clone_field_decl); +} + +void set_parameter_values(nesc_declaration cdecl, expression args) +{ + declaration parm; + + /* We know args is the same length as parameters (earlier error if not) */ + scan_declaration (parm, cdecl->parameters) + { + if (is_data_decl(parm)) + { + variable_decl vd = CAST(variable_decl, CAST(data_decl, parm)->decls); + cst_kind k = type_real(vd->ddecl->type) ? + cst_numerical : cst_address; + + if (!args) + { + vd->ddecl->value = make_unknown_cst(k == cst_numerical ? + cval_unknown_number : + cval_unknown_address, + vd->ddecl->type); + continue; + } + + if (!is_type_argument(args) && check_constant_once(args, k)) + { + location l = args->location; + + /* We can assume the type is arithmetic (for now at least) + (see declare_template_parameter) */ + if (!args->cst) + { + /* avoid duplicate error messages */ + if (args->type != error_type) + error_with_location(l, "component arguments must be constants"); + } + else if (type_integer(vd->ddecl->type)) + { + if (!constant_integral(args->cst)) + error_with_location(l, "integer constant expected"); + else if (!cval_inrange(args->cst->cval, vd->ddecl->type)) + error_with_location(l, "constant out of range for argument type"); + } + else if (type_floating(vd->ddecl->type)) + { + if (!constant_float(args->cst)) + error_with_location(l, "floating-point constant expected"); + } + else if (type_charstar(vd->ddecl->type)) + { + /* Check that it's an actual string */ + data_declaration sym; + bool ok = FALSE; + + if (constant_address(args->cst)) + { + sym = cval_ddecl(args->cst->cval); + /* We don't want any offset to the string either + (could lift this restriction) */ + ok = sym && sym->kind == decl_magic_string && + cval_knownbool(args->cst->cval); + } + if (!ok) + error_with_location(l, "string argument expected"); + } + } + + vd->ddecl->value = args->cst; + } + else /* type */ + { + type_parm_decl td = CAST(type_parm_decl, parm); + + if (!args) + { + td->ddecl->type = error_type; + continue; + } + + td->ddecl->type = args->type; + td->ddecl->initialiser = args; + } + + args = CAST(expression, args->next); + } +} + +node instantiate_ast_list(region r, node n) +{ + AST_walk_list(clone_walker, r, &n); + AST_set_parents(n); + + return n; +} + +node instantiate_ast(region r, node n) +{ + AST_walk(clone_walker, r, &n); + AST_set_parents(n); + + return n; +} + +dd_list instantiate_dd_list(region r, dd_list l) +{ + dd_list copy; + dd_list_pos scan; + + if (!l) + return NULL; + + copy = dd_new_list(r); + dd_scan (scan, l) + dd_add_last(r, copy, instantiate_ast(r, DD_GET(node, scan))); + + return copy; +} + +void instantiate(nesc_declaration component, expression arglist) +/* Effects: Actually instantiate an abstract component + For modules: copy module's AST, declarations, etc + For configurations: make new shallow copies of included abstract + components, and copy connection graph (using the new shallow + copies) +*/ +{ + region r = parse_region; + + assert(component->kind == l_component && component->original); + current.container = component; + + /* We don't copy the component itself as we're handling the specification + specially (not copied). So we just copy the parameters and the + implementation. */ + + set_env_instantiations(component->parameter_env); + set_specification_instantiations(component); + + /* A new dummy env for all instantiations in the implementation */ + current.env = new_environment(r, NULL, TRUE, FALSE); + component->impl = CAST(implementation, + instantiate_ast_list(r, CAST(node, original_component(component)->impl))); +} + +/* Component stack handling, for error message and loop detection */ + +struct instance_stack +{ + struct instance_stack *next; + nesc_declaration component; +}; + +static struct instance_stack *stack, *avail; + +static struct instance_stack *new_instance_stack(void) +/* Returns: a new, cleared, instance_stack + */ +{ + struct instance_stack *new; + + if (avail) + { + new = avail; + avail = avail->next; + new->next = NULL; + } + else + new = ralloc(permanent, struct instance_stack); + + return new; +} + +static void free_instance_stack(struct instance_stack *is) +{ + is->next = avail; + is->component = NULL; + avail = is; +} + +void push_instance(nesc_declaration component) +/* Effects: push (concrete) component on the stack and set its full instance + name. +*/ +{ + struct instance_stack *new = new_instance_stack(); + + assert(!component->abstract); + if (component->original) + { + /* Instantiated component names is parent name (currently at the top + of the stack) . name-in-configuration (currently in instance_name) */ + const char *oldname = component->instance_name; + const char *parentname = stack->component->instance_name; + int namelen = strlen(parentname) + strlen(oldname) + 2; + char *newname; + + newname = rstralloc(parse_region, namelen); + sprintf(newname, "%s.%s", parentname, oldname); + component->instance_name = newname; + } + + new->next = stack; + stack = new; + new->component = component; + + current.container = component; +} + +nesc_declaration abstract_recursion(void) +/* Returns: If the instance stack indicates the programmer has + created an instantiation loop, i.e., component Y (instance of + abstract component X) has caused the instantiation of the top-most + component (another instance of X). + Return Y if this is the case, NULL if not. +*/ +{ + struct instance_stack *i; + nesc_declaration component = stack->component; + + /* The case where component is not an instance falls through + naturally */ + component = original_component(component); + + for (i = stack->next; i; i = i->next) + { + /* If we hit a non-instance component there isn't a loop */ + if (!i->component->original) + return NULL; + + if (original_component(i->component) == component) + return i->component; + } + return NULL; +} + +void pop_instance(void) +{ + struct instance_stack *top = stack; + + stack = stack->next; + free_instance_stack(top); + + if (stack) + current.container = stack->component; + else + current.container = NULL; +} + +static void check_cg(cgraph connections) +/* Effects: Checks constants used in the connections graph + */ +{ + ggraph g = cgraph_graph(connections); + gnode n; + + graph_scan_nodes (n, g) + { + endp ep = NODE_GET(endp, n); + + if (ep->args_node) + check_generic_arguments(ep->args_node, endpoint_args(ep)); + } +} + +static bool fold_components(nesc_declaration cdecl, int pass) +{ + bool done; + declaration spec; + dd_list_pos attr; + + if (cdecl->folded == pass) + return TRUE; + cdecl->folded = pass; + + spec = CAST(component, cdecl->ast)->decls; + done = fold_constants_list(CAST(node, spec), pass); + if (cdecl->attributes) + dd_scan (attr, cdecl->attributes) + done = fold_constants_list(DD_GET(node, attr), pass) && done; + done = fold_constants_list(CAST(node, cdecl->impl), pass) && done; + + if (cdecl->configuration) + { + declaration d; + configuration c = CAST(configuration, cdecl->impl); + + check_cg(cdecl->connections); + + scan_declaration (d, c->decls) + if (is_component_ref(d)) + { + component_ref comp = CAST(component_ref, d); + + set_parameter_values(comp->cdecl, comp->args); + done = fold_components(comp->cdecl, pass) && done; + } + } + return done; +} + +void fold_program(nesc_declaration program, nesc_declaration scheduler) +{ + int pass = 1; + bool done; + + do + { + done = fold_constants_list(CAST(node, all_cdecls), pass); + if (program) + done = fold_components(program, pass) && done; + if (scheduler) + done = fold_components(scheduler, pass) && done; + pass++; + } + while (!done); + + current.container = NULL; +} + +void check_abstract_arguments(const char *kind, data_declaration ddecl, + declaration parms, expression arglist) +{ + location loc = ddecl->ast->location; + int parmnum = 1; + + while (parms && arglist) + { + const char *errmsg = NULL; + + if (arglist->type == error_type) + ; + else if (is_data_decl(parms)) + { + variable_decl vparm = CAST(variable_decl, CAST(data_decl, parms)->decls); + type parmtype = vparm->ddecl->type; + + if (type_incomplete(parmtype)) + errmsg = "type of formal parameter %d is incomplete"; + else if (is_type_argument(arglist)) + errmsg = "formal parameter %d must be a value"; + else + { + set_error_location(arglist->location); + check_assignment(parmtype, arglist->type, arglist, NULL, + ddecl, parmnum); + } + } + else /* type argument */ + { + type_parm_decl tparm = CAST(type_parm_decl, parms); + + if (!is_type_argument(arglist)) + errmsg = "formal parameter %d must be a type"; + else switch (tparm->ddecl->typevar_kind) + { + case typevar_normal: + /* These tests ensure the type can be used in assignments + and as a function argument. */ + if (type_array(arglist->type)) + errmsg = "type parameter cannot be an array type (parameter %d)"; + else if (type_function(arglist->type)) + errmsg = "type parameter cannot be a function type (parameter %d)"; + else if (type_incomplete(arglist->type)) + errmsg = "type parameter %d is an incomplete type"; + break; + case typevar_integer: + if (!type_integer(arglist->type)) + errmsg = "parameter %d must be an integer type"; + break; + case typevar_number: + if (!type_real(arglist->type)) + errmsg = "parameter %d must be a numerical type"; + break; + default: assert(0); break; + } + } + if (errmsg) + error_with_location(loc, errmsg, parmnum); + parmnum++; + arglist = CAST(expression, arglist->next); + parms = CAST(declaration, parms->next); + } + clear_error_location(); + + if (parms) + error_with_location(loc, "too few arguments to %s `%s'", + kind, ddecl->name); + else if (arglist) + error_with_location(loc, "too many arguments to %s `%s'", + kind, ddecl->name); +} + +static nesc_declaration +nesc_declaration_copy(region r, nesc_declaration old, expression args, + bool copy_is_abstract, data_declaration ddecl) +{ + nesc_declaration copy; + + copy = new_nesc_declaration(r, old->kind, old->name); + copy->configuration = old->configuration; + copy->doc = old->doc; + copy->abstract = copy_is_abstract; + copy->original = old; + + /* Copy the parameters into new env, make new top-level env */ + copy->parameter_env = current.env = new_environment(r, NULL, TRUE, FALSE); + copy->env = new_environment(r, copy->parameter_env, TRUE, FALSE); + hack_interface = ddecl; + current.container = ddecl ? ddecl->container : copy; + copy->parameters = instantiate_parameters(r, old->parameters); + copy->arguments = args; + set_parameter_values(copy, args); + copy->attributes = instantiate_dd_list(r, old->attributes); + + current.env = copy->env; + //current.container = copy; + + return copy; +} + +nesc_declaration interface_copy(region r, interface_ref iref, + bool copy_is_abstract) +/* Returns: A copy of abstract interface intf, instantiated with arguments + in arglist. +*/ +{ + nesc_declaration intf = iref->ddecl->itype, copy; + struct semantic_state old = current; + + assert(intf->kind == l_interface); + + copy = nesc_declaration_copy(r, intf, iref->args, copy_is_abstract, + iref->ddecl); + hack_required = 1 + iref->ddecl->required; + copy->ast = CAST(nesc_decl, instantiate_ast_list(r, CAST(node, intf->ast))); + hack_required = 0; + hack_interface = NULL; + current = old; + + return copy; +} + +nesc_declaration specification_copy(region r, component_ref cref, + bool copy_is_abstract) +/* Returns: A copy of the parameters and specification of the + component specified by cref, with arguments specified by cref +*/ +{ + component spec; + nesc_declaration comp = cref->cdecl, copy; + struct semantic_state old = current; + + assert(comp->kind == l_component); + + copy = nesc_declaration_copy(r, comp, cref->args, copy_is_abstract, NULL); + copy->instance_name = (cref->word2 ? cref->word2 : cref->word1)->cstring.data; + if (!copy_is_abstract) + { + /* Give it a new name */ + /* component may itself be a copy of the real original abstract + component */ + nesc_declaration abs_comp = comp->original ? comp->original : comp; + char *newname = rstralloc(r, strlen(copy->name) + 20); + + copy->instance_number = abs_comp->instance_count++; + sprintf(newname, "%s%s%d", copy->name, get_function_separator(), + copy->instance_number); + copy->name = newname; + } + + copy->ast = comp->ast; + clone(r, ©->ast); + + /* Copy the specification into the copy's env */ + spec = CAST(component, copy->ast); + spec->decls = CAST(declaration, + instantiate_ast_list(r, CAST(node, spec->decls))); + current = old; + + /* Give the copy an "empty" specification graph */ + build_external_graph(r, copy); + + return copy; +} + +static void typevar_attr(nesc_attribute attr, data_declaration ddecl, + int kind) +{ + if (ddecl->typevar_kind != typevar_normal) + ignored_nesc_attribute(attr); + else + ddecl->typevar_kind = kind; +} + +static void handle_integer_decl(nesc_attribute attr, data_declaration ddecl) +{ + typevar_attr(attr, ddecl, typevar_integer); +} + +static void handle_number_decl(nesc_attribute attr, data_declaration ddecl) +{ + typevar_attr(attr, ddecl, typevar_number); +} + +void init_abstract(void) +{ + init_clone(); + define_internal_attribute("integer", NULL, handle_integer_decl, NULL, NULL, + NULL, NULL); + define_internal_attribute("number", NULL, handle_number_decl, NULL, NULL, + NULL, NULL); +} diff --git a/src/nesc-abstract.h b/src/nesc-abstract.h new file mode 100644 index 0000000..4cc6a43 --- /dev/null +++ b/src/nesc-abstract.h @@ -0,0 +1,63 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef NESC_ABSTRACT_H +#define NESC_ABSTRACT_H + +void instantiate(nesc_declaration component, expression arglist); +/* Effects: Actually instantiate an abstract component. + For modules: temp noop + For configurations: make new shallow copies of included abstract + components, and copy connection graph (using the new shallow + copies) +*/ + +void push_instance(nesc_declaration component); +/* Effects: push (concrete) component on the stack and set its full instance + name. +*/ + +nesc_declaration abstract_recursion(void); +/* Returns: If the instance stack indicates the programmer has + created an instantiation loop, i.e., component Y (instance of + abstract component X) has caused the instantiation of the top-most + component (another instance of X). + Return Y if this is the case, NULL if not. +*/ + +void fold_program(nesc_declaration program, nesc_declaration scheduler); + +void pop_instance(void); + +void init_abstract(void); + +void check_abstract_arguments(const char *kind, data_declaration ddecl, + declaration parms, expression arglist); + +nesc_declaration interface_copy(region r, interface_ref iref, + bool copy_is_abstract); +/* Returns: A copy of abstract interface intf, instantiated with arguments + in arglist. +*/ + +nesc_declaration specification_copy(region r, component_ref cref, + bool copy_is_abstract); +/* Returns: A copy of the parameters and specification of the + component specified by cref, with arguments specified by cref +*/ + +#endif diff --git a/src/nesc-atomic.c b/src/nesc-atomic.c new file mode 100644 index 0000000..91e9d11 --- /dev/null +++ b/src/nesc-atomic.c @@ -0,0 +1,470 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002-2006 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include "parser.h" +#include "AST_walk.h" +#include "nesc-cg.h" +#include "constants.h" +#include "nesc-atomic.h" + +static atomic_t aseq(atomic_t a1, atomic_t a2) +{ + if (a1 == NOT_ATOMIC || a2 == NOT_ATOMIC) + return NOT_ATOMIC; + if (a2 == ATOMIC_ANY) + return a1; + if (a1 == ATOMIC_ANY) + return a2; + return NOT_ATOMIC; +} + +static atomic_t aalt(atomic_t a1, atomic_t a2) +{ + if (a1 == NOT_ATOMIC || a2 == NOT_ATOMIC) + return NOT_ATOMIC; + if (a1 == ATOMIC_SINGLE || a2 == ATOMIC_SINGLE) + return ATOMIC_SINGLE; + return ATOMIC_ANY; +} + +static atomic_t amany(atomic_t a) +{ + if (a == ATOMIC_SINGLE) + return NOT_ATOMIC; + else + return a; +} + +static atomic_t aaccess(type t) +{ + /* Single byte values have atomic read/write */ + if (type_size_cc(t)) + { + cval tsize = type_size(t); + + if (cval_isinteger(tsize) && cval_uint_value(tsize) == 1) + return ATOMIC_SINGLE; + } + return NOT_ATOMIC; +} + +static atomic_t avar(data_declaration ddecl, context this_use) +{ + context bad_contexts; + + if (ddecl->kind != decl_variable) + return ATOMIC_ANY; + + /* Special-case locals: we don't set async_access on locals even if their + address is taken (see nesc-concurrency.c). So the test below is not + reliable. */ + if (ddecl->islocal) + return ddecl->use_summary & c_addressed ? NOT_ATOMIC : ATOMIC_ANY; + + if (!ddecl->async_access) + return ATOMIC_ANY; + + /* Figure out dangerous accesses: If there are no writes in async + contexts, then reads need not be protected */ + bad_contexts = c_write; + if (ddecl->async_write) + bad_contexts |= c_read; + + if (this_use & bad_contexts) + return aaccess(ddecl->type); + else + return ATOMIC_ANY; +} + +/** + * This code computes a conservative approximation of statements whose + * execution is guaranteed to be atomic, allowing optimisation of + * simple atomic statements. + * + * Currently it assumes that the only memory accesses that are atomic are + * single-byte read/writes. It could be extended with platform-specific + * knowledge of larger atomic r/w units. Platform-specific knowledge would + * also allow optimisation of statements such as atomic x |= 4 if it is + * known that this maps to a single instruction. + */ + +/* An AST walker that isatomics all reachable expressions and statements */ +static AST_walker isatomic_walker; + +static bool dirty; +static cgraph callgraph; + +static atomic_t isatomic_stmt(statement stmt); + +static atomic_t isatomic_children(void *n) +{ + atomic_t a = ATOMIC_ANY; + + AST_walk_children(isatomic_walker, &a, CAST(node, n)); + + return a; +} + +static atomic_t acall1(data_declaration ddecl) +{ + if (ddecl->definition) + return CAST(function_decl, ddecl->definition)->stmt->isatomic; + else + return NOT_ATOMIC; +} + +/* Return atomicness of possible targets of a command or event. + This could be more accurate if we considered which things are + dispatched vs multiply wired. But those cases seem unlikely to be + atomic, so... */ +static atomic_t acall_connected(data_declaration ddecl) +{ + gedge called; + atomic_t a = ATOMIC_ANY; + + /* The nodes connected from a command or event node include all the + possible targets of that command or event. They also include any + things called or used from any default handler for the command or + event */ + graph_scan_out (called, fn_lookup(callgraph, ddecl)) + if (EDGE_GET(use, called)->c & c_fncall) + a = aseq(a, acall1(NODE_GET(endp, graph_edge_to(called))->function)); + + return a; +} + +/* Return atomicness of calls to 'ddecl' */ +static atomic_t acall(data_declaration ddecl) +{ + atomic_t a; + + if (ddecl->kind != decl_function) + return NOT_ATOMIC; + + if ((ddecl->ftype == function_command || ddecl->ftype == function_event) && + !ddecl->defined) + { + a = acall_connected(ddecl); + if (!ddecl->definition || ddecl->suppress_definition) /* no default */ + return a; + } + else + a = ATOMIC_ANY; + + return aalt(a, acall1(ddecl)); +} + +static atomic_t isatomic_expr(expression expr) +{ + atomic_t a = NOT_ATOMIC; /* Default to not-atomic */ + + if (!expr) + return ATOMIC_ANY; + + /* A read of an array-type expression actually takes the address + of the container */ + if ((expr->type && type_array(expr->type) && expr->static_address) || + expr->cst) + a = ATOMIC_ANY; + else switch (expr->kind) + { + case kind_realpart: case kind_imagpart: case kind_unary_minus: + case kind_unary_plus: case kind_conjugate: case kind_bitnot: + case kind_not: case kind_plus: case kind_minus: case kind_times: + case kind_divide: case kind_modulo: case kind_lshift: case kind_rshift: + case kind_leq: case kind_geq: case kind_lt: case kind_gt: case kind_eq: + case kind_ne: case kind_bitand: case kind_bitor: case kind_bitxor: + case kind_andand: case kind_oror: case kind_assign: case kind_comma: + case kind_extension_expr: case kind_compound_expr: case kind_cast: + case kind_generic_call: + a = isatomic_children(expr); + break; + + case kind_identifier: + a = avar(CAST(identifier, expr)->ddecl, expr->context); + break; + + case kind_field_ref: { + field_ref fref = CAST(field_ref, expr); + + a = isatomic_expr(fref->arg1); + /* Bit field r/w's are not atomic. Could try and be more + optimistic (e.g., non-byte-boundary crossing bitfield reads + are presumably atomic) */ + if (!cval_istop(fref->fdecl->bitwidth)) + a = NOT_ATOMIC; + break; + } + case kind_interface_deref: + a = ATOMIC_ANY; + break; + + case kind_conditional: { + conditional ce = CAST(conditional, expr); + atomic_t ac, a1, a2; + + ac = isatomic_expr(ce->condition); + a1 = isatomic_expr(ce->arg1); + a2 = isatomic_expr(ce->arg2); + + if (ce->condition->cst) + { + if (definite_zero(ce->condition)) + a = a2; + else + a = a1; + } + else + a = aseq(ac, aalt(a1, a2)); + break; + } + + case kind_array_ref: { + array_ref are = CAST(array_ref, expr); + atomic_t a1, a2; + + a1 = isatomic_expr(are->arg1); + a2 = isatomic_expr(are->arg2); + a = aseq(a1, aseq(a2, aaccess(are->type))); + break; + } + case kind_dereference: + a = aseq(isatomic_children(expr), aaccess(expr->type)); + break; + + case kind_address_of: { + expression arg = CAST(unary, expr)->arg1; + + /* Some heuristics for atomicity of & */ + while (is_field_ref(arg) || is_extension_expr(arg)) + arg = CAST(unary, arg)->arg1; + + if (is_dereference(arg)) + a = isatomic_expr(CAST(dereference, arg)->arg1); + else if (is_identifier(arg)) + a = ATOMIC_ANY; + else + a = isatomic_expr(arg); + break; + } + + case kind_preincrement: case kind_postincrement: + case kind_predecrement: case kind_postdecrement: { + atomic_t a1 = isatomic_expr(CAST(increment, expr)->arg1); + + a = aseq(a1, a1); + break; + } + case kind_plus_assign: case kind_minus_assign: + case kind_times_assign: case kind_divide_assign: case kind_modulo_assign: + case kind_bitand_assign: case kind_bitor_assign: case kind_bitxor_assign: + case kind_lshift_assign: case kind_rshift_assign: { + assign aexpr = CAST(assignment, expr); + atomic_t a1, a2; + + a1 = isatomic_expr(aexpr->arg1); + a2 = isatomic_expr(aexpr->arg2); + a = aseq(a2, aseq(a1, a1)); + break; + } + case kind_function_call: { + function_call fce = CAST(function_call, expr); + expression called = fce->arg1; + + if (is_generic_call(called)) + called = CAST(generic_call, called)->arg1; + + if (is_identifier(called)) + a = acall(CAST(identifier, called)->ddecl); + else if (is_interface_deref(called)) + a = acall(CAST(interface_deref, called)->ddecl); + else + a = NOT_ATOMIC; + + a = aseq(a, isatomic_children(expr)); + break; + } + default: + /* Just check children. Current statement not atomic. */ + isatomic_children(expr); + break; + } + + if (expr->isatomic != a) + { + expr->isatomic = a; + dirty = TRUE; + } + + return a; +} + +static atomic_t isatomic_stmt(statement stmt) +{ + atomic_t a = NOT_ATOMIC; /* Default to not-atomic */ + + if (!stmt) + return ATOMIC_ANY; + + switch (stmt->kind) + { + case kind_compound_stmt: + case kind_labeled_stmt: + case kind_expression_stmt: + case kind_atomic_stmt: + case kind_break_stmt: + case kind_continue_stmt: + case kind_goto_stmt: + case kind_computed_goto_stmt: + case kind_empty_stmt: + case kind_return_stmt: + a = isatomic_children(stmt); + break; + + case kind_if_stmt: { + if_stmt is = CAST(if_stmt, stmt); + atomic_t ac, a1, a2; + + ac = isatomic_expr(is->condition); + a1 = isatomic_stmt(is->stmt1); + a2 = isatomic_stmt(is->stmt2); + + if (is->condition->cst) + { + if (definite_zero(is->condition)) + a = a2; + else + a = a1; + } + else + a = aseq(ac, aalt(a1, a2)); + break; + } + case kind_while_stmt: case kind_dowhile_stmt: case kind_switch_stmt: { + conditional_stmt cs = CAST(conditional_stmt, stmt); + atomic_t ac, as; + + ac = isatomic_expr(cs->condition); + as = isatomic_stmt(cs->stmt); + + if (cs->condition->cst && stmt->kind == kind_while_stmt && + definite_zero(cs->condition)) + a = ATOMIC_ANY; + else + a = amany(aseq(ac, as)); + break; + } + case kind_for_stmt: { + for_stmt fs = CAST(for_stmt, stmt); + atomic_t a1, a2, a3, as; + + a1 = isatomic_expr(fs->arg1); + a2 = isatomic_expr(fs->arg2); + a3 = isatomic_expr(fs->arg3); + as = isatomic_stmt(fs->stmt); + + if (fs->arg2 && fs->arg2->cst && definite_zero(fs->arg2)) + a = ATOMIC_ANY; + else + a = amany(aseq(a2, aseq(as, a3))); + + a = aseq(a1, a); + break; + } + + default: + /* Just check children. Current statement not atomic. */ + isatomic_children(stmt); + break; + } + + if (stmt->isatomic != a) + { + stmt->isatomic = a; + dirty = TRUE; + } + + return a; +} + +static AST_walker_result isatomic_ast_expr(AST_walker spec, void *data, + expression *e) +{ + atomic_t *a = data; + *a = aseq(*a, isatomic_expr(*e)); + return aw_done; +} + +static AST_walker_result isatomic_ast_stmt(AST_walker spec, void *data, + statement *s) +{ + atomic_t *a = data; + *a = aseq(*a, isatomic_stmt(*s)); + return aw_done; +} + +static AST_walker_result isatomic_ast_vdecl(AST_walker spec, void *data, + variable_decl *vdp) +{ + variable_decl vd = *vdp; + atomic_t *a = data, ainit; + + if (vd->arg1 && vd->ddecl->islocal) + { + ainit = isatomic_expr(vd->arg1); + *a = aseq(*a, aseq(ainit, avar(vd->ddecl, c_write))); + } + return aw_done; +} + +void isatomic(cgraph g) +{ + ggraph cg = cgraph_graph(g); + gnode n; + + if (!nesc_optimise_atomic) + return; + + callgraph = g; + + /* Fixed point search for function-atomicity */ + graph_scan_nodes (n, cg) + { + data_declaration fn = NODE_GET(endp, n)->function; + if (fn->definition) + CAST(function_decl, fn->definition)->stmt->isatomic = ATOMIC_ANY; + } + do + { + dirty = FALSE; + graph_scan_nodes (n, cg) + { + data_declaration fn = NODE_GET(endp, n)->function; + if (fn->definition) + isatomic_stmt(CAST(function_decl, fn->definition)->stmt); + } + } + while (dirty); +} + +void init_isatomic(void) +{ + isatomic_walker = new_AST_walker(permanent); + AST_walker_handle(isatomic_walker, kind_expression, isatomic_ast_expr); + AST_walker_handle(isatomic_walker, kind_statement, isatomic_ast_stmt); + AST_walker_handle(isatomic_walker, kind_variable_decl, isatomic_ast_vdecl); +} diff --git a/src/nesc-atomic.h b/src/nesc-atomic.h new file mode 100644 index 0000000..6465467 --- /dev/null +++ b/src/nesc-atomic.h @@ -0,0 +1,26 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2006 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef NESC_ATOMIC_H +#define NESC_ATOMIC_H + +/* atomic_t is defined in AST.h */ + +void isatomic(cgraph callgraph); +void init_isatomic(void); + +#endif diff --git a/src/nesc-attributes.c b/src/nesc-attributes.c new file mode 100644 index 0000000..b95c8f9 --- /dev/null +++ b/src/nesc-attributes.c @@ -0,0 +1,252 @@ +#include "parser.h" +#include "init.h" +#include "c-parse.h" +#include "semantics.h" +#include "nesc-attributes.h" +#include "env.h" +#include "edit.h" +#include "attributes.h" + +typedef struct internal_attribute +{ + const char *name; + + void (*handle_ndecl)(nesc_attribute attr, + nesc_declaration ndecl); + void (*handle_decl)(nesc_attribute attr, + data_declaration ddecl); + void (*handle_tag)(nesc_attribute attr, + tag_declaration tdecl); + void (*handle_field)(nesc_attribute attr, + field_declaration fdecl); + void (*handle_type)(nesc_attribute attr, + type *t); +} *iattr; + +static env internal_attributes; + +/* Return a reference to attribute tag + (different from xref_tag because there is no implicit declaration) */ +tag_ref lookup_attribute(word tag) +{ + tag_ref tref = newkind_tag_ref(parse_region, kind_attribute_ref, + tag->location, tag, NULL, NULL, FALSE); + tag_declaration tdecl = lookup_tag(tref, FALSE); + + if (!tdecl) + error_with_location(tag->location, "unknown attribute `%s'", + tag->cstring.data); + tref->tdecl = tdecl; + + return tref; +} + +nesc_attribute start_attribute_use(word name) +{ + /* Prepare to read an initialiser for the attribute definition + specified by name */ + nesc_attribute attr = new_nesc_attribute(parse_region, name->location, name, + NULL); + tag_ref aref = lookup_attribute(name); /* XXX: aref leaks */ + type atype = error_type; + + /* Create new environment so that we can track whether this is a + deputy scope or not. Using an environment makes it easy to + recover parsing errors: we just call poplevel in the appropriate + error production (see nattrib rules in c-parse.y). */ + pushlevel(FALSE); + + attr->tdecl = aref->tdecl; + if (aref->tdecl) + { + atype = make_tagged_type(aref->tdecl); + if (aref->tdecl->deputy_scope) + current.env->deputy_scope = TRUE; + } + + start_init(NULL, attr); + really_start_incremental_init(atype); + + return attr; +} + +attribute finish_attribute_use(nesc_attribute attr, expression init) +{ + attr->arg1 = make_init_list(attr->word1->location, init); + finish_init(); + poplevel(); + + return CAST(attribute, attr); +} + +void define_internal_attribute(const char *name, + void (*handle_ndecl)(nesc_attribute attr, + nesc_declaration ndecl), + void (*handle_decl)(nesc_attribute attr, + data_declaration ddecl), + void (*handle_tag)(nesc_attribute attr, + tag_declaration tdecl), + void (*handle_field)(nesc_attribute attr, + field_declaration fdecl), + void (*handle_type)(nesc_attribute attr, + type *t), + ...) +{ + va_list args; + field_declaration *next_field; + word attr_word; + type_element attr_tag; + tag_declaration attr_decl; + struct internal_attribute *iattr; + + /* Build and declare the attribute */ + current.env = global_env; + attr_word = build_word(parse_region, name); + attr_tag = start_struct(dummy_location, kind_attribute_ref, attr_word); + attr_decl = CAST(tag_ref, attr_tag)->tdecl; + attr_decl->fields = new_env(parse_region, NULL); + next_field = &attr_decl->fieldlist; + + /* Fields. A fieldname, fieldtype argument list, terminated with a + null fieldname. We build a semi-fake struct for these. + */ + va_start(args, handle_type); + for (;;) + { + const char *field_name = va_arg(args, const char *); + field_declaration field; + + if (!field_name) + break; + field = ralloc(parse_region, struct field_declaration); + field->containing_tag = attr_decl; + *next_field = field; + next_field = &field->next; + field->name = field_name; + field->type = va_arg(args, type); + field->bitwidth = field->offset = cval_unknown_number; + + env_add(attr_decl->fields, field_name, field); + } + va_end(args); + + /* Add to internal attributes table */ + iattr = ralloc(permanent, struct internal_attribute); + iattr->name = name; + iattr->handle_ndecl = handle_ndecl; + iattr->handle_decl = handle_decl; + iattr->handle_tag = handle_tag; + iattr->handle_field = handle_field; + iattr->handle_type = handle_type; + env_add(internal_attributes, name, iattr); +} + +ivalue lookup_attribute_field(nesc_attribute attr, const char *name) +/* Returns: The initialiser for field name in attr, or NULL if it's not + found +*/ +{ + ivalue init = attr->arg1->ivalue; + ivalue_field ifields; + + assert(init->kind == iv_structured); + for (ifields = init->u.structured; ifields; ifields = ifields->next) + if (!strcmp(ifields->field->name, name)) + return ifields->value; + + return NULL; +} + +static iattr internal_lookup(nesc_attribute attr) +{ + return env_lookup(internal_attributes, attr->word1->cstring.data, TRUE); +} + +static void save_user_attribute(nesc_attribute attr, dd_list *alist) +{ + if (!*alist) + *alist = dd_new_list(parse_region); + dd_add_last(parse_region, *alist, attr); +} + +void handle_nesc_type_attribute(nesc_attribute attr, type *t) +{ + iattr handler = internal_lookup(attr); + + if (handler) + { + if (handler->handle_type) + handler->handle_type(attr, t); + else + ignored_nesc_attribute(attr); + } + /* In the future, we might want to record the attribute on the type, + and support dumping this information in nesc-dump.c. For now, + though, attributes on types are only useful if they are @macro() + attributes */ +} + +void handle_nesc_decl_attribute(nesc_attribute attr, data_declaration ddecl) +{ + iattr handler = internal_lookup(attr); + + if (handler) + { + if (handler->handle_decl) + handler->handle_decl(attr, ddecl); + else + ignored_nesc_attribute(attr); + } + else + save_user_attribute(attr, &ddecl->attributes); +} + +void handle_nesc_field_attribute(nesc_attribute attr, field_declaration fdecl) +{ + iattr handler = internal_lookup(attr); + + if (handler) + { + if (handler->handle_field) + handler->handle_field(attr, fdecl); + else + ignored_nesc_attribute(attr); + } + else + save_user_attribute(attr, &fdecl->attributes); +} + +void handle_nesc_tag_attribute(nesc_attribute attr, tag_declaration tdecl) +{ + iattr handler = internal_lookup(attr); + + if (handler) + { + if (handler->handle_tag) + handler->handle_tag(attr, tdecl); + else + ignored_nesc_attribute(attr); + } + else + save_user_attribute(attr, &tdecl->attributes); +} + +void handle_nesc_nescdecl_attribute(nesc_attribute attr, nesc_declaration ndecl) +{ + iattr handler = internal_lookup(attr); + + if (handler) + { + if (handler->handle_ndecl) + handler->handle_ndecl(attr, ndecl); + else + ignored_nesc_attribute(attr); + } + else + save_user_attribute(attr, &ndecl->attributes); +} + +void init_nesc_attributes(void) +{ + internal_attributes = new_env(permanent, NULL); +} diff --git a/src/nesc-attributes.h b/src/nesc-attributes.h new file mode 100644 index 0000000..d1d3074 --- /dev/null +++ b/src/nesc-attributes.h @@ -0,0 +1,42 @@ +#ifndef NESC_ATTIBUTES_H +#define NESC_ATTIBUTES_H + +void init_nesc_attributes(void); + +nesc_attribute start_attribute_use(word name); +attribute finish_attribute_use(nesc_attribute attr, expression init); + +void define_internal_attribute(const char *name, + void (*handle_ndecl)(nesc_attribute attr, + nesc_declaration ndecl), + void (*handle_decl)(nesc_attribute attr, + data_declaration ddecl), + void (*handle_tag)(nesc_attribute attr, + tag_declaration tdecl), + void (*handle_field)(nesc_attribute attr, + field_declaration fdecl), + void (*handle_type)(nesc_attribute attr, + type *t), + ...); +/* Effects: Declare an internal (compiler) @-style attribute called 'name', + handled by the handle functions. Functions can be NULL if the + attribute cannot be used on that kind of entity. + Arguments to the attribute are specified by an + fieldname, fieldtype argument list + terminated with a null fieldname. + Example: the @integer() attribute is declared with + define_internal_attribute("integer", handle_integer_attribute, NULL); +*/ + +ivalue lookup_attribute_field(nesc_attribute attr, const char *name); +/* Returns: The initialiser for field name in attr, or NULL if it's not + found +*/ + +void handle_nesc_type_attribute(nesc_attribute attr, type *t); +void handle_nesc_decl_attribute(nesc_attribute attr, data_declaration ddecl); +void handle_nesc_field_attribute(nesc_attribute attr, field_declaration fdecl); +void handle_nesc_tag_attribute(nesc_attribute attr, tag_declaration tdecl); +void handle_nesc_nescdecl_attribute(nesc_attribute attr, nesc_declaration ndecl); + +#endif diff --git a/src/nesc-c.c b/src/nesc-c.c new file mode 100644 index 0000000..b039de2 --- /dev/null +++ b/src/nesc-c.c @@ -0,0 +1,36 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include "parser.h" +#include "nesc-c.h" +#include "nesc-paths.h" +#include "nesc-semantics.h" +#include "c-parse.h" +#include "nesc-cpp.h" + +declaration all_cdecls; + +void add_cdecls(declaration cdecls) +{ + all_cdecls = declaration_chain(all_cdecls, CAST(declaration, cdecls)); +} + +void load_c(location l, const char *name, bool name_is_path) +{ + node cdecls = compile(l, NULL, name, name_is_path); + add_cdecls(CAST(declaration, cdecls)); +} diff --git a/src/nesc-c.h b/src/nesc-c.h new file mode 100644 index 0000000..7085926 --- /dev/null +++ b/src/nesc-c.h @@ -0,0 +1,26 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef NESC_C_H +#define NESC_C_H + +extern declaration all_cdecls; + +void load_c(location l, const char *name, bool name_is_path); +void add_cdecls(declaration cdecls); + +#endif diff --git a/src/nesc-cg.c b/src/nesc-cg.c new file mode 100644 index 0000000..b793051 --- /dev/null +++ b/src/nesc-cg.c @@ -0,0 +1,92 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +/* A connection graph */ +#include "parser.h" +#include "nesc-cg.h" +#include "utils.h" + +struct cgraph +{ + ggraph sameregion g; + dhash_table sameregion ep_table; +}; + +typedef struct ep_table_entry +{ + struct endp ep; /* ep.function is the key */ + gnode n; +} *ep_table_entry; + +static int ep_compare(void *e1, void *e2) +{ + ep_table_entry ep1 = e1, ep2 = e2; + + return ep1->ep.function == ep2->ep.function && + ep1->ep.interface == ep2->ep.interface && + ep1->ep.args_node == ep2->ep.args_node; +} + +static unsigned long ep_hash(void *e) +{ + ep_table_entry ep = e; + + return hash_ptr(ep->ep.interface) ^ hash_ptr(ep->ep.function) ^ hash_ptr(ep->ep.args_node); +} + +cgraph new_cgraph(region r) +{ + cgraph cg = ralloc(r, struct cgraph); + + cg->g = new_graph(r); + cg->ep_table = new_dhash_table(r, 64, ep_compare, ep_hash); + + return cg; +} + +gnode endpoint_lookup(cgraph cg, endp ep) +{ + ep_table_entry gep; + + gep = dhlookup(cg->ep_table, ep); + + if (gep) + return gep->n; + + gep = ralloc(regionof(cg), struct ep_table_entry); + gep->ep = *ep; + + dhadd(cg->ep_table, gep); + return gep->n = graph_add_node(cg->g, &gep->ep); +} + +gnode fn_lookup(cgraph cg, data_declaration fndecl) +{ + struct endp ep; + + ep.component = NULL; + ep.interface = fndecl->interface; + ep.function = fndecl; + ep.args_node = NULL; + return endpoint_lookup(cg, &ep); +} + +ggraph cgraph_graph(cgraph cg) +{ + return cg->g; +} + diff --git a/src/nesc-cg.h b/src/nesc-cg.h new file mode 100644 index 0000000..8906ccd --- /dev/null +++ b/src/nesc-cg.h @@ -0,0 +1,46 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef NESC_CG_H +#define NESC_CG_H + +/* A connection graph */ + +struct endp +{ + data_declaration component, interface, function; + + /* args_node is the list of args for the interface if not NULL. + If no errors have been reported, then + constant_integral(e->cst) || constant_unknown(e->cst) + for all expressions e in the list + */ + expression args_node; +}; + +typedef struct endp *endp; + +typedef struct cgraph *cgraph; + +cgraph new_cgraph(region r); + +gnode endpoint_lookup(cgraph ch, endp ep); +gnode fn_lookup(cgraph cg, data_declaration fndecl); + +ggraph cgraph_graph(cgraph cg); + +#endif diff --git a/src/nesc-compile b/src/nesc-compile new file mode 100755 index 0000000..b02b5ba --- /dev/null +++ b/src/nesc-compile @@ -0,0 +1,206 @@ +#!/usr/bin/perl +# This file is part of the nesC compiler. +# Copyright (C) 2002 Intel Corporation +# +# The attached "nesC" software is provided to you under the terms and +# conditions of the GNU General Public License Version 2 as published by the +# Free Software Foundation. +# +# nesC 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 nesC; see the file COPYING. If not, write to +# the Free Software Foundation, 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +use File::Basename; + +for ($i = 0; $i <= $#ARGV; $i++) { + $_ = $ARGV[$i]; + + if (/^-_ASM$/) { + # magic marker for assembler options + $for_assembler = 1; + } + elsif ($for_assembler) { + push @gcc_args, "-Wa,$_"; + } + elsif (/^-/) { + if (/^-fsyntax-only$/) { + $nocompile = 1; + } + + if (/^-_?fnesc-conly$/) { + $conly = 1; + } + + if (/^-[_WwvpfmD]/ || /^-pedantic$/ || /^-ansi$/) { + push @nesc_args, $_ unless /^-_?fnesc-.*cfile=/; + $verbose = 1 if /^-v/; + } + + if (/^-I/) { + ($i, $idir) = &extractarg($i); + push @nesc_args, "-I$idir"; + } + elsif (/^-o/) { + ($i, $objtarget) = &extractarg($i); + } + elsif (/^--param$/) { + ($i, $param) = &nextarg($i); + push @gcc_args, "--param"; + push @gcc_args, $param; + } + elsif (/^-S$/) { + $asmonly = 1; + } + elsif (/^-_?fnesc-/) { + if (/^-_?fnesc-cfile=(.*)$/) { + $ctarget = $1; + } + if (/^-_?fnesc-tmpcfile=(.*)$/) { + $ctarget = $1; + $delcfile = 1; + } + if (/^-_?fnesc-gcc=(.*)$/) { + $gcc = $1; + } + if (/^-_?fnesc-deputy$/) { + $deputy = 1; + } + if (/^-_?fnesc-deputy-args=(.*)$/) { + @deputy_args = split(" ", $1); + } + } + elsif (!(/^-D/)) { + if (!(/^-_?W(no-)?nesc/)) { + push @gcc_args, $_; + } + } + } + else { + if ($source ne "") { + printf STDERR "two source files specified ($source and $_)\n"; + exit 2; + } + $source = $_; + } +} + +if ($source eq "") { + printf STDERR "no source file specified\n"; + exit 2; +} + + +if ($ctarget eq "") { + if ($conly) { + $ctarget = $source; + $ctarget =~ s/\.nc$/.c/; + } + elsif ($ENV{TMP}) { + $ctarget = "$ENV{TMP}/nesc.$$.c"; + } + else { + $ctarget = "/tmp/nesc.$$.c"; + } + $delcfile = 1; +} + +if ($objtarget eq "") { + $objtarget = $source; + $objtarget =~ s/\.nc$/.o/ unless $asmonly; + $objtarget =~ s/\.nc$/.s/ if $asmonly; +} + +# Deputy annotations +if($deputy) { + unshift @nesc_args, "-fnesc-include=deputy_stage1"; + unshift @nesc_args, "-fnesc-genprefix=#include \"$ENV{NCDIR}/deputy_stage2.h\""; +} +else { + unshift @nesc_args, "-fnesc-include=deputy_nodeputy"; +} + +push @nesc_args, $source; +push @nesc_args, "-o"; +if ($nocompile && !$conly) { + push @nesc_args, "/dev/null"; +} else { + push @nesc_args, $ctarget; +} + +# Check for gcc 4.0.x, which don't tell us about the __STDC__ #define +unshift @nesc_args, "-D__STDC__" if isgcc40($gcc); + +unshift @nesc_args, "nesc1"; + +&vsystem(@nesc_args); +if ($? != 0) { + unlink $ctarget; + exit 2; +} +exit 0 if $nocompile || $conly; + +if($deputy) { + push @deputy_args, "--gcc=$gcc"; + push @gcc_args, @deputy_args; + $gcc = "deputy"; +} + +push @gcc_args, "-o"; +push @gcc_args, $objtarget; +push @gcc_args, "-S" if $asmonly; +push @gcc_args, "-c" unless $asmonly; +push @gcc_args, "-fdollars-in-identifiers"; +push @gcc_args, $ctarget; +unshift @gcc_args, "-B$ENV{NCDIR}"; +unshift @gcc_args, $gcc; +&vsystem(@gcc_args); +unlink $ctarget if $delcfile; + +exit 2 if $?; +exit 0; + +sub vsystem() { + print STDERR join(" ", @_), "\n" if $verbose; + system @_; +} + +sub extractarg { + my ($i) = @_; + + if (length($ARGV[$i]) == 2) { + return &nextarg($i); + } + else { + $arg = substr($ARGV[$i], 2); + return ($i, $arg); + } +} + +sub nextarg { + my ($i) = @_; + + if ($i < $#ARGV) { + $arg = $ARGV[++$i]; + } + else { + printf STDERR "missing argument to $ARGV[$i]\n"; + exit 2; + } + return ($i, $arg); +} + +sub isgcc40 { + my ($gcc) = @_; + + die "gcc $gcc fails" unless open(GCCV, "$gcc -v 2>&1|"); + while () { + return 1 if /^gcc version 4\.0/; + } + return 0; +} diff --git a/src/nesc-component.c b/src/nesc-component.c new file mode 100644 index 0000000..b991342 --- /dev/null +++ b/src/nesc-component.c @@ -0,0 +1,306 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include "parser.h" +#include "nesc-component.h" +#include "nesc-semantics.h" +#include "nesc-interface.h" +#include "nesc-configuration.h" +#include "nesc-module.h" +#include "nesc-decls.h" +#include "nesc-paths.h" +#include "nesc-env.h" +#include "nesc-cg.h" +#include "semantics.h" +#include "c-parse.h" +#include "edit.h" +#include "nesc-abstract.h" +#include "attributes.h" + +bool generic_used; + +void interface_scan(data_declaration iref, env_scanner *scan) +{ + env_scan(iref->functions->id_env, scan); +} + +data_declaration interface_lookup(data_declaration iref, const char *name) +{ + return env_lookup(iref->functions->id_env, name, FALSE); +} + +void component_spec_iterate(nesc_declaration c, + void (*iterator)(data_declaration fndecl, + void *data), + void *data, + bool interfaces) +{ + const char *ifname; + void *ifentry; + env_scanner scanifs; + + env_scan(c->env->id_env, &scanifs); + while (env_next(&scanifs, &ifname, &ifentry)) + { + data_declaration idecl = ifentry; + + if (!(idecl->kind == decl_interface_ref || + idecl->kind == decl_function)) + continue; + + if (idecl->kind != decl_interface_ref || interfaces) + iterator(idecl, data); + + if (idecl->kind == decl_interface_ref) + { + env_scanner scanfns; + const char *fnname; + void *fnentry; + + interface_scan(idecl, &scanfns); + while (env_next(&scanfns, &fnname, &fnentry)) + iterator(fnentry, data); + } + } +} + +void component_functions_iterate(nesc_declaration c, + void (*iterator)(data_declaration fndecl, + void *data), + void *data) +{ + component_spec_iterate(c, iterator, data, FALSE); +} + +static typelist make_gparm_typelist(declaration gparms) +{ + declaration gparm; + typelist gtypes = new_typelist(parse_region); + + scan_declaration (gparm, gparms) + if (is_data_decl(gparm)) + { + data_decl gd = CAST(data_decl, gparm); + variable_decl gv = CAST(variable_decl, gd->decls); + + typelist_append(gtypes, gv->ddecl->type); + } + + return gtypes; +} + +void copy_interface_functions(region r, nesc_declaration container, + data_declaration iref, environment fns) +{ + environment icopy = new_environment(r, NULL, TRUE, FALSE); + env_scanner scanif; + const char *fnname; + void *fnentry; + + env_scan(fns->id_env, &scanif); + while (env_next(&scanif, &fnname, &fnentry)) + { + data_declaration fndecl = fnentry, fncopy; + + /* Strings acquire a magic_string decl which we don't care about + legal example: + command int (*init())[sizeof "aa"]; + */ + if (fndecl->kind == decl_magic_string) + continue; + + fncopy = declare(icopy, fndecl, FALSE); + fncopy->fn_uses = NULL; + fncopy->nuses = NULL; + fncopy->instanceof = fndecl; + fncopy->container = container; + fncopy->interface = iref; + /* required events and provided commands are defined */ + fncopy->defined = (fncopy->ftype == function_command) ^ iref->required; + } + + iref->functions = icopy; +} + +void set_interface_functions_gparms(environment fns, typelist gparms) +{ + env_scanner scanif; + const char *fnname; + void *fnentry; + + env_scan(fns->id_env, &scanif); + while (env_next(&scanif, &fnname, &fnentry)) + { + data_declaration fndecl = fnentry; + + /* Push generic args onto fn type and decl */ + fndecl->gparms = gparms; + fndecl->type = make_generic_type(fndecl->type, gparms); + } +} + +void declare_interface_ref(interface_ref iref, declaration gparms, + environment env, attribute attribs) +{ + const char *iname = (iref->word2 ? iref->word2 : iref->word1)->cstring.data; + nesc_declaration idecl = + require(l_interface, iref->location, iref->word1->cstring.data); + struct data_declaration tempdecl; + data_declaration old_decl, ddecl; + + init_data_declaration(&tempdecl, CAST(declaration, iref), iname, void_type); + tempdecl.kind = decl_interface_ref; + tempdecl.type = NULL; + tempdecl.itype = idecl; + tempdecl.container = current.container; + tempdecl.required = current.spec_section == spec_uses; + tempdecl.gparms = gparms ? make_gparm_typelist(gparms) : NULL; + + handle_decl_attributes(attribs, &tempdecl); + + old_decl = env_lookup(env->id_env, iname, TRUE); + if (old_decl) + error("redefinition of `%s'", iname); + ddecl = declare(env, &tempdecl, FALSE); + iref->attributes = attribs; + iref->ddecl = ddecl; + + if (idecl->abstract) + { + generic_used = TRUE; + + check_abstract_arguments("interface", ddecl, + idecl->parameters, iref->args); + ddecl->itype = interface_copy(parse_region, iref, + current.container->abstract); + ddecl->functions = ddecl->itype->env; + } + else + { + copy_interface_functions(parse_region, current.container, ddecl, + ddecl->itype->env); + if (iref->args) + error("unexpected type arguments"); + } + + /* We don't make the interface type generic. Instead, we push the generic + type into each function in copy_interface_functions. This is because + the syntax for invoking or defining a function on a generic interface + is interfacename.functionname[generic args](...) */ + if (gparms) + set_interface_functions_gparms(ddecl->functions, ddecl->gparms); + ddecl->type = make_interface_type(ddecl); +} + +void check_interface_parameter_types(declaration parms) +{ + declaration parm; + + scan_declaration (parm, parms) + { + data_decl dd = CAST(data_decl, parm); + variable_decl vd = CAST(variable_decl, dd->decls); + + if (!vd->ddecl) + { + error_with_location(vd->location, + "integral type required for generic parameter"); + vd->ddecl = bad_decl; + } + else if (!type_integral(vd->ddecl->type)) + { + error_with_location(vd->location, + "integral type required for generic parameter `%s'", + vd->ddecl->name); + vd->ddecl->type = int_type; + } + } +} + +struct beg_data +{ + cgraph cg; + cgraph userg; +}; + +void beg_iterator(data_declaration ddecl, void *data) +{ + struct beg_data *d = data; + struct endp node; + + node.component = NULL; + node.args_node = NULL; + + /* The real connection graph contains all functions. + The user connection graph contains all interfaces + the + functions which are not in an interface */ + if (ddecl->kind == decl_interface_ref) + { + node.interface = ddecl; + node.function = NULL; + endpoint_lookup(d->userg, &node); + } + else + { + node.interface = ddecl->interface; + node.function = ddecl; + endpoint_lookup(d->cg, &node); + if (!node.interface) + endpoint_lookup(d->userg, &node); + } +} + +void build_external_graph(region r, nesc_declaration cdecl) +{ + struct beg_data d; + + /* A very simple graph, with single unconnected nodes for each endpoint + of cdecl */ + d.cg = new_cgraph(r); + d.userg = new_cgraph(r); + component_spec_iterate(cdecl, beg_iterator, &d, TRUE); + + cdecl->connections = d.cg; + cdecl->user_connections = d.userg; +} + +void build_component(region r, nesc_declaration cdecl) +{ + component the_component = CAST(component, cdecl->ast); + + the_component->implementation->cdecl = cdecl; + cdecl->impl = the_component->implementation; + + AST_set_parents(CAST(node, cdecl->ast)); + + /* Build the default connection graph (just nodes for the external + endpoints) */ + build_external_graph(r, cdecl); + + if (is_configuration(cdecl->impl)) + process_configuration(CAST(configuration, cdecl->impl)); + else if (is_module(cdecl->impl)) + process_module(CAST(module, cdecl->impl)); +} + +environment start_implementation(void) +{ + start_semantics(l_implementation, current.container, + new_environment(parse_region, current.env, TRUE, FALSE)); + + return current.env; +} diff --git a/src/nesc-component.h b/src/nesc-component.h new file mode 100644 index 0000000..a61770a --- /dev/null +++ b/src/nesc-component.h @@ -0,0 +1,64 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef NESC_COMPONENT_H + +void build_component(region r, nesc_declaration cdecl); + +void declare_interface_ref(interface_ref iref, declaration gparms, + environment genv, attribute attribs); + +void make_implicit_interface(data_declaration fndecl, + function_declarator fdeclarator); + +void check_interface_parameter_types(declaration parms); + +environment start_implementation(void); + +void interface_scan(data_declaration iref, env_scanner *scan); +data_declaration interface_lookup(data_declaration iref, const char *name); + +void component_spec_iterate(nesc_declaration c, + void (*iterator)(data_declaration fndecl, + void *data), + void *data, + bool interfaces); + +void component_functions_iterate(nesc_declaration c, + void (*iterator)(data_declaration fndecl, + void *data), + void *data); + +nesc_declaration specification_copy(region r, component_ref cref, + bool copy_is_abstract); +/* Effects: Make a "shallow" copy of component specified by `cref' in region r, + i.e., identical to cref->cdecl except that it has a copy of the + specification (including a copy of each interface instance) + The copy's instance_name is set to the name specified in cref (word2) + Returns: The shallow copy +*/ + +void build_external_graph(region r, nesc_declaration cdecl); + +void copy_interface_functions(region r, nesc_declaration container, + data_declaration iref, environment fns); + + +extern bool generic_used; /* Hack to prevent doc generation until + new doc system built */ + +#endif diff --git a/src/nesc-concurrency.c b/src/nesc-concurrency.c new file mode 100644 index 0000000..3d33631 --- /dev/null +++ b/src/nesc-concurrency.c @@ -0,0 +1,245 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include "parser.h" +#include "nesc-cg.h" +#include "nesc-concurrency.h" +#include "nesc-semantics.h" + +static inline bool is_call_edge(gedge e) +{ + return (EDGE_GET(use, e)->c & c_fncall) != 0; +} + +static void rec_async(gnode n, bool async_caller) +{ + gedge edge; + data_declaration fn = NODE_GET(endp, n)->function; + bool async = fn->async || fn->actual_async || async_caller; + + + if (async == fn->actual_async) + return; + fn->actual_async = async; + + /* We don't pass async through commands or events that are not + declared async to avoid reporting errors for the fns called + by the "async but not so declared" command or event */ + if (ddecl_is_command_or_event(fn)) + async = fn->async; + + graph_scan_out (edge, n) + if (is_call_edge(edge)) + rec_async(graph_edge_to(edge), async); +} + +void async_violation(gnode n) +{ + data_declaration fn = NODE_GET(endp, n)->function; + gedge edge; + + graph_scan_in (edge, n) + if (is_call_edge(edge)) + { + use u = EDGE_GET(use, edge); + data_declaration caller = NODE_GET(endp, graph_edge_from(edge))->function; + + if (caller->actual_async) + nesc_warning_with_location(u->l, "`%s' called asynchronously from `%s'", + decl_printname(fn), decl_printname(caller)); + } +} + + +void check_async(cgraph callgraph) +{ + ggraph cg = cgraph_graph(callgraph); + gnode n; + + /* Find least fixed point of async w/ recursive graph walk */ + graph_scan_nodes (n, cg) + rec_async(n, FALSE); + + /* Report violations of async. We force async warnings when detecting + data races. */ + if (warn_async || warn_data_race) + graph_scan_nodes (n, cg) + { + data_declaration fn = NODE_GET(endp, n)->function; + + if (ddecl_is_command_or_event(fn) && fn->actual_async && !fn->async) + async_violation(n); + } +} + +static dd_list find_async_variables(region r, cgraph callgraph) +{ + ggraph cg = cgraph_graph(callgraph); + gnode n; + dd_list avars = dd_new_list(r); + + /* Set async_access in all global or static variables that are accessed + (r, w) in an async function. Return list of all such variables */ + + /* XXX: aliasing issues ignored for now. */ + + graph_scan_nodes (n, cg) + { + data_declaration fn = NODE_GET(endp, n)->function; + dd_list_pos use; + + if (fn->actual_async && fn->fn_uses) + dd_scan (use, fn->fn_uses) + { + iduse i = DD_GET(iduse, use); + data_declaration id = i->id; + context c = i->u->c; + + if (id->kind == decl_variable && !id->islocal && + c & (c_read | c_write)) + { + if (!id->async_access) + { + id->async_access = TRUE; + dd_add_last(r, avars, id); + } + if (c & c_write) + id->async_write = TRUE; + } + } + } + return avars; +} + +static void rec_contexts(gnode n, int call_contexts) +{ + gedge edge; + data_declaration fn = NODE_GET(endp, n)->function; + int new_context = fn->call_contexts | fn->extra_contexts | + call_contexts | fn->spontaneous; + + if (new_context == fn->call_contexts) + return; + fn->call_contexts = new_context; + + graph_scan_out (edge, n) + { + use u = EDGE_GET(use, edge); + int cc = new_context; + + if (u->c & c_fncall) + { + if (u->c & c_atomic) + cc = c_call_atomic; + } + else /* Non-call use. Conservatively assume that there may be + atomic and non-atomic calls if this value ends up used as + a function pointer */ + cc = c_call_atomic | c_call_nonatomic; + rec_contexts(graph_edge_to(edge), cc); + } +} + +static void find_fn_contexts(cgraph callgraph) +{ + ggraph cg = cgraph_graph(callgraph); + gnode n; + + /* Find least fixed point of call_contexts w/ recursive graph walk */ + graph_scan_nodes (n, cg) + rec_contexts(n, 0); +} + +static void check_async_vars(dd_list avars) +{ + dd_list_pos avar; + + dd_scan (avar, avars) + { + data_declaration v = DD_GET(data_declaration, avar); + dd_list_pos ause; + bool first = TRUE; + + if (!v->norace) + dd_scan (ause, v->nuses) + { + use u = DD_GET(use, ause); + context bad_contexts = c_write; + + /* If there are no writes in async contexts, then reads + need not be protected */ + if (v->async_write) + bad_contexts |= c_read; + + /* Bad uses are uses that are both: + - outside atomic statements (and fns only called from atomic + statements) + - uses specified by bad_contexts + u->fn can be NULL in weird cases which don't correspond to + executable code. + */ + if (u->fn && + !(u->c & c_atomic || + !(u->fn->call_contexts & c_call_nonatomic)) + && u->c & bad_contexts) + { + const char *cname; + + if (first) + { + location vloc = + v->definition ? v->definition->location : v->ast->location; + first = FALSE; + nesc_warning_with_location + (vloc, "non-atomic accesses to shared variable `%s':", + v->name); + } + + if ((u->c & (c_read | c_write)) == (c_read | c_write) && + v->async_write) + cname = "r/w"; + else if (u->c & c_read) + cname = "read"; + else + cname = "write"; + nesc_warning_with_location(u->l, " non-atomic %s", cname); + } + } + } +} + +void check_races(cgraph callgraph) +{ + region r = newregion(); + dd_list avars; + + /* First we mark all variables which are accessed in an async function. + Then, we issue a warning for all uses of such variables which are not + in an atomic context. To do that, we first need to know which contexts + (atomic vs non-atomic) each function is called in. + Exception: read-only variables do not need warnings. + */ + + avars = find_async_variables(r, callgraph); + find_fn_contexts(callgraph); + + if (warn_data_race) + check_async_vars(avars); + + deleteregion(r); +} + diff --git a/src/nesc-concurrency.h b/src/nesc-concurrency.h new file mode 100644 index 0000000..fd4e556 --- /dev/null +++ b/src/nesc-concurrency.h @@ -0,0 +1,23 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef NESC_CONCURRENCY_H + +void check_async(cgraph callgraph); +void check_races(cgraph callgraph); + +#endif diff --git a/src/nesc-configuration.c b/src/nesc-configuration.c new file mode 100644 index 0000000..6b6fcfe --- /dev/null +++ b/src/nesc-configuration.c @@ -0,0 +1,738 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include "parser.h" +#include "nesc-configuration.h" +#include "nesc-component.h" +#include "nesc-env.h" +#include "nesc-cg.h" +#include "semantics.h" +#include "constants.h" +#include "c-parse.h" +#include "expr.h" +#include "nesc-abstract.h" + +/* define this to forbid linking a single function from an interface + independently of the whole interface */ +#define NO_FUNCTION_INTERFACE_MATCHING + +/* define this to forbid the implicit multiple matches from + component -> component connections */ +#define NO_COMPONENT_MATCHING + +void component_scan(data_declaration cref, env_scanner *scan) +{ + env_scan(cref->ctype->env->id_env, scan); +} + +static void connect_userg(location l, cgraph userg, struct endp from, struct endp to) +{ + gnode gfrom = endpoint_lookup(userg, &from), gto = endpoint_lookup(userg, &to); + + graph_add_edge(gfrom, gto, l); +} + +static void connect_cg(cgraph cg, struct endp from, struct endp to) +{ + gnode gfrom = endpoint_lookup(cg, &from), gto = endpoint_lookup(cg, &to); + + graph_add_edge(gfrom, gto, NULL); + /* If an endpoint has args, we must also connect the node w/o args */ + if (from.args_node) + graph_add_edge(fn_lookup(cg, from.function), gfrom, NULL); + if (to.args_node) + graph_add_edge(gto, fn_lookup(cg, to.function), NULL); +} + +static void connect_function(location l, cgraph cg, cgraph userg, + struct endp from, struct endp to) +{ + connect_cg(cg, from, to); + connect_userg(l, userg, from, to); +} + +static type endpoint_type(endp p) +{ + type t = NULL; + + if (p->args_node) + { + if (p->function) + t = type_function_return_type(p->function->type); + else if (p->interface) + t = p->interface->type; + } + else + { + if (p->function) + t = p->function->type; + else if (p->interface) + { + t = p->interface->type; + + /* We don't normally include the generic parameters in the + interface's type, but we do here to allow correct matching */ + if (p->interface->gparms) + t = make_generic_type(t, p->interface->gparms); + } + } + return t; +} + +typelist endpoint_args(endp p) +{ + if (p->function) + { + type t = p->function->type; + + if (type_generic(t)) + return type_function_arguments(t); + } + else if (p->interface) + return p->interface->gparms; + + return NULL; +} + +void connect_interface(location l, cgraph cg, cgraph userg, + struct endp from, struct endp to, + bool reverse) +{ + env_scanner scanfns; + const char *fnname; + void *fnentry; + + if (to.interface->required ^ reverse) + connect_userg(l, userg, to, from); + else + connect_userg(l, userg, from, to); + + assert(!from.function && !to.function + /*&& from.interface->itype == to.interface->itype*/); + + /* All functions */ + interface_scan(to.interface, &scanfns); + while (env_next(&scanfns, &fnname, &fnentry)) + { + data_declaration fndecl = fnentry; + + assert(fndecl->kind == decl_function); + to.function = fndecl; + from.function = env_lookup(from.interface->functions->id_env, fndecl->name, TRUE); + if (fndecl->defined ^ reverse) + connect_cg(cg, from, to); + else + connect_cg(cg, to, from); + } +} + + +int match_endpoints(endp p1, endp p2, endp amatch) +{ + /* Should this be type_equal ? unclear + (only real diff, given that we will forbid old style parameter lists, + is transparent union handling) */ + if (type_compatible(endpoint_type(p1), endpoint_type(p2))) + { + if (amatch) + *amatch = *p2; + return 1; + } + else + return 0; +} + +int match_function_interface(bool eqconnection, + struct endp f, struct endp i, endp amatch) +{ +#ifdef NO_FUNCTION_INTERFACE_MATCHING + return 0; +#else + env_scanner scanfns; + const char *fnname; + void *fnentry; + int matched = 0; + bool want_defined; + + assert(f.function && !i.function); + + want_defined = f.function->defined ^ !eqconnection; + + /* Check all functions */ + interface_scan(i.interface, &scanfns); + while (env_next(&scanfns, &fnname, &fnentry)) + { + i.function = fnentry; + if (i.function->defined == want_defined) + matched += match_endpoints(&f, &i, amatch); + } + + return matched; +#endif +} + +int match_interface_component(bool eqconnection, + struct endp i, struct endp c, endp amatch) +{ + const char *ifname; + void *ifentry; + int matched = 0; + env_scanner scanifs; + bool want_required; + + assert(i.interface && !c.interface); + + want_required = i.interface->required ^ !eqconnection; + + component_scan(c.component, &scanifs); + while (env_next(&scanifs, &ifname, &ifentry)) + { + data_declaration idecl = ifentry; + + if (idecl->kind == decl_interface_ref) + { + c.interface = idecl; + if (c.interface->required == want_required) + matched += match_endpoints(&i, &c, amatch); + } + } + return matched; +} + +int match_function_component(bool eqconnection, + struct endp f, struct endp c, endp amatch) +{ + const char *ifname; + void *ifentry; + int matched = 0; + env_scanner scanifs; + bool want_defined; + + assert(f.function && !c.interface && !c.function); + + want_defined = f.function->defined ^ !eqconnection; + + component_scan(c.component, &scanifs); + while (env_next(&scanifs, &ifname, &ifentry)) + { + data_declaration idecl = ifentry; + + c.function = c.interface = NULL; + if (idecl->kind == decl_interface_ref) + { + c.interface = idecl; + matched += match_function_interface(want_defined ^ idecl->required, + f, c, amatch); + } + else + { + c.function = idecl; + if (c.function->defined == want_defined) + matched += match_endpoints(&f, &c, amatch); + } + } + return matched; +} + + +void check_generic_arguments(expression args, typelist gparms) +{ + expression arg; + typelist_scanner scan_gparms; + + typelist_scan(gparms, &scan_gparms); + scan_expression (arg, args) + { + location l = arg->location; + type gparm_type = typelist_next(&scan_gparms); + + if (!gparm_type) + { + error_with_location(l, "too many arguments"); + return; + } + + if (arg->type == error_type || !check_constant_once(arg, cst_numerical)) + continue; + + if (!arg->cst || !constant_integral(arg->cst)) + error_with_location(l, "constant expression expected"); + else + { + if (!cval_inrange(arg->cst->cval, gparm_type)) + error_with_location(l, "constant out of range for argument type"); + } + } + if (typelist_next(&scan_gparms)) + error_with_location(args->location, "too few arguments"); +} + +static bool lookup_endpoint(environment configuration_env, endpoint ep, + endp lep) +{ + parameterised_identifier pid; + environment lookup_env = configuration_env; + + lep->component = lep->interface = lep->function = NULL; + lep->args_node = NULL; + + scan_parameterised_identifier (pid, ep->ids) + { + const char *idname = pid->word1->cstring.data; + location l = pid->location; + + if (!lookup_env) + error_with_location(l, "unexpected identifier `%s'", idname); + else + { + expression args = pid->args; + data_declaration d = env_lookup(lookup_env->id_env, idname, TRUE); + + if (!d) + { + /* This is a bit hacky: lookup in parent env, but not if + it's the global env. We want to check a configuration's + env, and it's parent component's env, but not the global + env. */ + if (lookup_env->parent && lookup_env->parent != global_env) + d = env_lookup(lookup_env->parent->id_env, idname, TRUE); + if (!d) + { + error_with_location(l, "cannot find `%s'", idname); + return FALSE; /* prevent cascading error messages */ + } + } + + if (args) + { + if (pid->next) + error_with_location(l, "arguments must be specified last"); + lep->args_node = pid->args; + } + + switch (d->kind) + { + default: + error_with_location(l, "cannot find `%s'", idname); + return FALSE; /* prevent cascading error messages */ + + case decl_component_ref: + assert(!lep->component); + lep->component = d; + lookup_env = d->ctype->env; + break; + case decl_interface_ref: + assert(!lep->interface); + lep->interface = d; + +#ifdef NO_FUNCTION_INTERFACE_MATCHING + /* Can't lookup a function inside an interface (no partial interface + connections) */ + lookup_env = NULL; +#else + /* Get next environment */ + lookup_env = d->itype->decls; +#endif + break; + case decl_function: + lep->function = d; + lookup_env = NULL; + break; + } + } + } + + /* Check generic arguments */ + if (lep->args_node) + { + typelist gparms = endpoint_args(lep); + + if (gparms) + check_generic_arguments(lep->args_node, gparms); + else + error_with_location(ep->location, "endpoint is not a parameterised interface"); + } + + return TRUE; +} + + +static void process_interface_connection(cgraph cg, cgraph userg, connection conn, + struct endp p1, struct endp p2) +{ + location l = conn->location; + + if (is_eq_connection(conn)) /* p1 = p2 */ + { + if (!p1.component && !p2.component) + { + if (p1.interface->required == p2.interface->required) + error_with_location(l, "external to external connections must be between provided and used interfaces"); + else + connect_interface(l, cg, userg, p1, p2, TRUE); + } + else + { + if (p1.interface->required != p2.interface->required) + error_with_location(l, "external to internal connections must be both provided or both used"); + else if (!p1.component) + connect_interface(l, cg, userg, p1, p2, FALSE); + else + connect_interface(l, cg, userg, p2, p1, FALSE); + /* Note: connect_interface takes care of choosing the right edge + direction. There are two cases: + - the interface is provided: then we want edges from outside in, + so from = the outside interface + - the interface is required: then we want edges from inside out, + but connect_interface will reverse them because the interface + is required. So we also pick from = the outside interface. + */ + } + } + else /* p1 <- p2 */ + { + if (p1.interface->required) + error_with_location(l, "target of '<-' interface must be provided"); + else if (!p2.interface->required) + error_with_location(l, "source of '<-' interface must be required"); + else connect_interface(l, cg, userg, p2, p1, FALSE); + } +} + +static void process_function_connection(cgraph cg, cgraph userg, connection conn, + struct endp p1, struct endp p2) +{ + location l = conn->location; + bool p1def = (p1.interface && !p1.interface->required) ^ p1.function->defined; + bool p2def = (p2.interface && !p2.interface->required) ^ p2.function->defined; + + if (is_eq_connection(conn)) /* p1 = p2 */ + { + if (!p1.component && !p2.component) + { + if (p1def == p2def) + error_with_location(l, "external to external connections must be between provided and used functions"); + else if (p1def) + connect_function(l, cg, userg, p1, p2); /* from provided to used */ + else + connect_function(l, cg, userg, p2, p1); + } + else + { + if (p1def != p2def) + error_with_location(l, "external to internal connections must be both provided or both used"); + else if ((!p1.component && !p1def) || (p1.component && p1def)) + connect_function(l, cg, userg, p2, p1); + else + connect_function(l, cg, userg, p1, p2); + } + } + else /* p1 <- p2 */ + { + if (!p1def) + error_with_location(l, "target of '<-' function must be defined"); + else if (p2def) + error_with_location(l, "source of '<-' function must be used"); + else connect_function(l, cg, userg, p2, p1); + } +} + +static void process_actual_connection(cgraph cg, cgraph userg, connection conn, + struct endp p1, struct endp p2) +{ + location l = conn->location; + + if (is_eq_connection(conn)) /* p1 = p2 */ + { + if (p1.component && p2.component) + error_with_location(l, "there must be at least one external interface in an '=' connection"); + } + else /* p1 <- p2 */ + { + if (!p1.component || !p2.component) + error_with_location(l, "external interfaces cannot be connected with `<-' or `->'"); + } + + if (p1.function) + process_function_connection(cg, userg, conn, p1, p2); + else + process_interface_connection(cg, userg, conn, p1, p2); +} + +static void process_connection(cgraph cg, cgraph userg, connection conn, + struct endp p1, struct endp p2) +{ + int matches; + bool eqconnection = is_eq_connection(conn); + + if (p1.function) /* f X ... */ + { + if (p2.function) /* f X f */ + matches = match_endpoints(&p1, &p2, NULL); + else if (p2.interface) /* f X i */ + matches = match_function_interface(eqconnection, p1, p2, &p2); + else /* f X c */ + matches = match_function_component(eqconnection, p1, p2, &p2); + } + else if (p1.interface) /* i X ... */ + { + if (p2.function) /* i X f */ + matches = match_function_interface(eqconnection, p2, p1, &p1); + else if (p2.interface) /* i X i */ + matches = match_endpoints(&p1, &p2, NULL); + else /* i X c */ + matches = match_interface_component(eqconnection, p1, p2, &p2); + } + else /* c X ... */ + { + if (p2.function) /* c X f */ + matches = match_function_component(eqconnection, p2, p1, &p1); + else /* c X i */ + matches = match_interface_component(eqconnection, p2, p1, &p1); + } + + if (matches == 0) + error_with_location(conn->location, "no match"); + else if (matches > 1) + error_with_location(conn->location, "ambiguous match"); + else + process_actual_connection(cg, userg, conn, p1, p2); +} + +static void process_component_connection(cgraph cg, cgraph userg, connection conn, + struct endp p1, struct endp p2) +{ +#ifndef NO_COMPONENT_MATCHING + /* c X c, the only list case */ + const char *ifname; + void *ifentry; + int total_matches = 0; + env_scanner scanifs; + bool eqconnection = is_eq_connection(conn); + + component_scan(p1.component, &scanifs); + while (env_next(&scanifs, &ifname, &ifentry)) + { + data_declaration idecl = ifentry; + int matches; + + p1.interface = p1.function = p2.interface = p2.function = NULL; + if (idecl->kind == decl_interface_ref) + { + p1.interface = idecl; + matches = match_interface_component(eqconnection, p1, p2, &p2); + } + else + { + p1.function = idecl; + matches = match_function_component(eqconnection, p1, p2, &p2); + } + + total_matches += matches; + if (matches > 1) + { + error_with_location(conn->location, "ambiguous match"); + break; + } + else if (matches == 1) + process_actual_connection(cg, userg, conn, p1, p2); + } + if (total_matches == 0) +#endif + error_with_location(conn->location, "no match"); +} + +static void process_connections(configuration c) +{ + declaration decl; + struct endp p1, p2; + cgraph cg = c->cdecl->connections; + cgraph userg = c->cdecl->user_connections; + + scan_declaration (decl, c->decls) + if (is_connection(decl)) + { + connection conn = CAST(connection, decl); + + if (lookup_endpoint(c->ienv, conn->ep1, &p1) && + lookup_endpoint(c->ienv, conn->ep2, &p2)) + { + /* There are a lot of kinds of connections here. + lookup_endpoint has already resolved pseudo-interfaces to functions + (c is component, i is interface, f is function, X is = or <-) + c X c, c X i, i X c, c X f, f X c, i X i, i X f, f X i, f X f + + We first resolve the c X c case, which can lead to multiple + connections, then handle all remaining cases in process_connection + */ + if (!p1.interface && !p2.interface && !p1.function && !p2.function) + process_component_connection(cg, userg, conn, p1, p2); + else + process_connection(cg, userg, conn, p1, p2); + } + } +} + +component_ref require_component(component_ref comp, word as) +{ + struct data_declaration tempdecl; + data_declaration old_decl, ddecl; + const char *cname = comp->word1->cstring.data; + const char *asname = (as ? as : comp->word1)->cstring.data; + + comp->word2 = as; + + comp->cdecl = require(l_component, comp->location, cname); + + init_data_declaration(&tempdecl, CAST(declaration, comp), asname, + void_type); + tempdecl.kind = decl_component_ref; + + /* Avoid duplicates in implementation *or* specification env */ + old_decl = lookup_id(asname, TRUE); + if (!old_decl) + old_decl = env_lookup(current.env->parent->id_env, asname, TRUE); + if (old_decl) + error_with_location(comp->location, "redefinition of `%s'", asname); + ddecl = declare(current.env, &tempdecl, FALSE); + + /* If the component is abstract, we make a copy of its specification + so that we produce an accurate connection graph. We don't + actually instantiate the component until later. + This copy is "abstract" (will need further copying) if we are + processing an abstract configuration */ + if (comp->cdecl->abstract) + { + generic_used = TRUE; + + comp->cdecl = specification_copy(parse_region, comp, + current.container->abstract); + /* give copy a nice instance name if it is inside a generic + configuration */ + if (current.container->abstract) + { + size_t inamelen = strlen(current.container->name) + + strlen(comp->cdecl->instance_name) + 2; + char *iname = rstralloc(parse_region, inamelen); + + sprintf(iname, "%s.%s", current.container->name, comp->cdecl->instance_name); + comp->cdecl->instance_name = iname; + } + + if (!comp->abstract) + error_with_location(comp->location, "generic component `%s' requires instantiation arguments", cname); + else + check_abstract_arguments("component", ddecl, comp->cdecl->parameters, comp->args); + } + else + { + if (comp->abstract) + error_with_location(comp->location, "component `%s' is not generic", cname); + } + + ddecl->type = make_component_type(ddecl); + ddecl->ctype = comp->cdecl; + + return comp; +} + +expression make_component_deref(location loc, expression object, cstring field) +{ + expression result; + data_declaration cref = type_cref(object->type); + data_declaration fdecl = env_lookup(cref->ctype->env->id_env, field.data, TRUE); + if (!fdecl) + { + error("component's specification has no element named `%s'", field.data); + fdecl = bad_decl; + } + result = CAST(expression, new_component_deref(parse_region, loc, object, field, fdecl)); + result->type = fdecl->type; + result->cst = fold_identifier(result, fdecl, 0); + + return CAST(expression, result); +} + +struct cfc_data +{ + location loc; + cgraph cg; + data_declaration intf_last_error; +}; + +/* Check that function fndecl (from the configuration's external interface) + is connected, i.e.: + - if defined there is an outgoing edge + - if used there is an incoming edge +*/ +static void check_function_connected(data_declaration fndecl, void *data) +{ + struct cfc_data *d = data; + gnode epnode; + data_declaration idecl = fndecl->interface; + + assert(fndecl->kind == decl_function); + +#ifdef NO_FUNCTION_INTERFACE_MATCHING + /* Avoid duplicate error messages: if one function not connected in + an interface, then none are */ + if (idecl == d->intf_last_error) + return; +#endif + + epnode = fn_lookup(d->cg, fndecl); + + if ((fndecl->defined && !graph_first_edge_out(epnode)) || + (!fndecl->defined && !graph_first_edge_in(epnode))) + { + d->intf_last_error = idecl; + + if (idecl) +#ifdef NO_FUNCTION_INTERFACE_MATCHING + error_with_location(d->loc, "`%s' not connected", idecl->name); +#else + error_with_location(d->loc, "`%s.%s' not connected", + idecl->name, fndecl->name); +#endif + else + error_with_location(d->loc, "`%s' not connected", fndecl->name); + } +} + +/* Checks that all external interfaces/functions of the configuration + are connected somewhere in cg */ +static void check_complete_connection(configuration c) +{ + struct cfc_data d; + + d.intf_last_error = NULL; + d.loc = c->location; + d.cg = c->cdecl->connections; + component_functions_iterate(c->cdecl, check_function_connected, &d); +} + +void process_configuration(configuration c) +{ + int old_errorcount = errorcount; + + process_connections(c); + + /* Don't give error messages for missing connections if we found + errors in the connections (to avoid duplicate errors) */ + if (old_errorcount == errorcount) + check_complete_connection(c); +} diff --git a/src/nesc-configuration.h b/src/nesc-configuration.h new file mode 100644 index 0000000..6c1faec --- /dev/null +++ b/src/nesc-configuration.h @@ -0,0 +1,36 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef NESC_CONFIGURATION_H +#define NESC_CONFIGURATION_H + +#include "nesc-cg.h" + +void process_configuration(configuration c); + +component_ref require_component(component_ref comp, word as); +expression make_component_deref(location loc, expression object, cstring field);; +void check_generic_arguments(expression args, typelist gparms); +struct endp; +typelist endpoint_args(struct endp *p); +void component_scan(data_declaration cref, env_scanner *scan); + +void connect_interface(location l, cgraph cg, cgraph userg, + struct endp from, struct endp to, + bool reverse); + +#endif diff --git a/src/nesc-constants.c b/src/nesc-constants.c new file mode 100644 index 0000000..b8c9c64 --- /dev/null +++ b/src/nesc-constants.c @@ -0,0 +1,256 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include "parser.h" +#include "nesc-cg.h" +#include "nesc-abstract.h" +#include "c-parse.h" +#include "nesc-component.h" +#include "nesc-semantics.h" +#include "AST_walk.h" +#include "semantics.h" +#include "constants.h" +#include "init.h" +#include "stmt.h" + +static AST_walker folder_walker; + +struct folder_data { + bool *done; + int pass; +}; + +static AST_walker_result folder_expression(AST_walker spec, void *data, + expression *n) +{ + struct folder_data *d = data; + expression e = *n; + known_cst c = NULL, sa = NULL; + + /* Constant-fold children first */ + AST_walk_children(spec, data, CAST(node, e)); + + /* XXX: default_conversion */ + + switch (e->kind) + { + case kind_lexical_cst: case kind_string: case kind_extension_expr: + /* We preserve the constants in lexical_cst's and strings */ + /* XXX: should we allow string arguments to components to + be merged into strings (e.g. "aa" foo "bb", where foo + is a `char *' component arg)? + (If so: the ddecl for the args should be classified as + a decl_magic_string, and make_string and this function must be + modified accordingly) */ + c = e->cst; + sa = e->static_address; + break; + case kind_label_address: + c = fold_label_address(e); + break; + case kind_sizeof_expr: + c = fold_sizeof(e, CAST(sizeof_expr, e)->arg1->type); + break; + case kind_sizeof_type: + c = fold_sizeof(e, CAST(sizeof_type, e)->asttype->type); + break; + case kind_alignof_expr: + c = fold_alignof(e, CAST(alignof_expr, e)->arg1->type); + break; + case kind_alignof_type: + c = fold_alignof(e, CAST(alignof_type, e)->asttype->type); + break; + case kind_cast: + c = fold_cast(e); + sa = CAST(cast, e)->arg1->static_address; + break; + case kind_conditional: + c = fold_conditional(e); + break; + case kind_function_call: + c = fold_function_call(e, d->pass); + break; + case kind_identifier: + c = fold_identifier(e, CAST(identifier, e)->ddecl, d->pass); + sa = foldaddress_identifier(e, CAST(identifier, e)->ddecl); + break; + case kind_field_ref: + sa = foldaddress_field_ref(e); + break; + case kind_dereference: + sa = CAST(dereference, e)->arg1->cst; + break; + case kind_address_of: + c = CAST(address_of, e)->arg1->static_address; + break; + case kind_array_ref: { + array_ref aref = CAST(array_ref, e); + type atype; + + /* Find the array type */ + if (type_integer(aref->arg1->type)) + atype = aref->arg2->type; + else + atype = aref->arg1->type; + + sa = fold_binary(type_default_conversion(atype), e); + break; + } + case kind_comma: { + expression sub;; + + scan_expression (sub, CAST(comma, e)->arg1) + if (!sub->cst) + break; + else if (!sub->next) + { + /* (e1, ..., en) is a constant expression if all ei are constant + expressions. Weird? (see cst10.c) */ + c = sub->cst; + } + break; + } + case kind_component_deref: + c = fold_identifier(e, CAST(component_deref, e)->ddecl, d->pass); + break; + default: + if (is_binary(e)) + c = fold_binary(e->type, e); + else if (is_unary(e)) + c = fold_unary(e); + break; + } + e->cst = c; + e->static_address = sa; + + /* Handle default conversions to pointers */ + if (e->converted_to_pointer) + e->cst = sa; + + /* Notice unknown csts */ + if ((sa && constant_unknown(sa)) || (c && constant_unknown(c))) + *d->done = FALSE; + + if (e->ivalue && e->ivalue->kind == iv_base && + e->ivalue->u.base.require_constant_value) + check_init_element(e); + + return aw_done; +} + +bool fold_constants_list(node n, int pass) +/* Effects: Folds constants and lays out types in AST n + Returns: FALSE if any constant folding op returned an unknown cst, TRUE + otherwise + */ +{ + struct folder_data d; + bool done = TRUE; + + d.done = &done; + d.pass = pass; + + AST_walk_list(folder_walker, &d, CASTPTR(node, &n)); + + return done; +} + +static AST_walker_result folder_array_declarator(AST_walker spec, void *data, + array_declarator *n) +{ + expression size = (*n)->arg1; + + AST_walk_children(spec, data, CAST(node, *n)); + + if (size) + check_array_size(size, nice_declarator_name((*n)->declarator)); + + return aw_done; +} + +static AST_walker_result folder_enum_ref(AST_walker spec, void *data, + enum_ref *n) +{ + if (!(*n)->defined) + return aw_walk; + + layout_enum_start((*n)->tdecl); + AST_walk_children(spec, data, CAST(node, *n)); + layout_enum_end((*n)->tdecl); + + return aw_done; +} + +static AST_walker_result folder_enumerator(AST_walker spec, void *data, + enumerator *n) +{ + enumerator e = *n; + + AST_walk_children(spec, data, CAST(node, e)); + e->ddecl->value = layout_enum_value(e); + + return aw_done; +} + +static AST_walker_result folder_tag_ref(AST_walker spec, void *data, + tag_ref *n) +{ + if (!(*n)->defined) + return aw_walk; + + AST_walk_children(spec, data, CAST(node, *n)); + layout_struct((*n)->tdecl); + + return aw_done; +} + +static AST_walker_result folder_case_label(AST_walker spec, void *data, + case_label *n) +{ + case_label label = *n; + + AST_walk_children(spec, data, CAST(node, *n)); + check_case_value(label->arg1); + if (label->arg2) + check_case_value(label->arg2); + + return aw_done; +} + +static AST_walker_result folder_function_decl(AST_walker spec, void *data, + function_decl *n) +{ + function_decl fd = *n, old = current.function_decl; + + current.function_decl = fd; + AST_walk_children(spec, data, CAST(node, *n)); + current.function_decl = old; + + return aw_done; +} + +void init_nesc_constants(void) +{ + folder_walker = new_AST_walker(permanent); + AST_walker_handle(folder_walker, kind_expression, folder_expression); + AST_walker_handle(folder_walker, kind_array_declarator, folder_array_declarator); + AST_walker_handle(folder_walker, kind_tag_ref, folder_tag_ref); + AST_walker_handle(folder_walker, kind_enum_ref, folder_enum_ref); + AST_walker_handle(folder_walker, kind_enumerator, folder_enumerator); + AST_walker_handle(folder_walker, kind_case_label, folder_case_label); + AST_walker_handle(folder_walker, kind_function_decl, folder_function_decl); +} diff --git a/src/nesc-constants.h b/src/nesc-constants.h new file mode 100644 index 0000000..ded3baf --- /dev/null +++ b/src/nesc-constants.h @@ -0,0 +1,12 @@ +#ifndef NESC_CONSTANTS_H +#define NESC_CONSTANTS_H + +bool fold_constants_list(node n, int pass); +/* Effects: Folds constants and lays out types in AST list n + pass is the current constant folding pass number (starts at 1, 0 + is reserved for parse-time constant folding) + */ + +void init_nesc_constants(void); + +#endif diff --git a/src/nesc-cpp.c b/src/nesc-cpp.c new file mode 100644 index 0000000..f4ea5be --- /dev/null +++ b/src/nesc-cpp.c @@ -0,0 +1,433 @@ +/* This file is part of the nesC compiler. + + This file is derived in part from the GNU C Compiler. It is thus + Copyright (C) 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 + Changes for nesC are + Copyright (C) 2002-2008 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include "parser.h" +#include "nesc-cpp.h" + +#include +#include +#include +#include +#include +#include "nesc-paths.h" +#include "machine.h" +#include "flags.h" +#include "semantics.h" +#include "c-parse.h" + +#include "gcc-cpp.h" + +struct cpp_option { + struct cpp_option *next; + const char *opt, *arg; +}; + +struct macro_def { + const unsigned char *name; + const unsigned char *def; +}; + +static region opt_region; +static char *cpp_save_dir; +static dhash_table current_macros; +static struct cpp_option *saved_options; + +static void account_for_newlines (const unsigned char *, size_t); +static void print_line (source_location, const char *); +static void maybe_print_line (source_location); +static void save_pp_define(cpp_reader *pfile, source_location line, + cpp_hashnode *node); +static void save_pp_undef(source_location line, cpp_hashnode *node); + +void save_cpp_option(const char *option, const char *arg) +{ + struct cpp_option *newopt; + + if (!opt_region) + opt_region = newregion(); + + newopt = ralloc(opt_region, struct cpp_option); + newopt->opt = option; + newopt->arg = arg; + newopt->next = saved_options; + saved_options = newopt; +} + +static int macro_compare(void *entry1, void *entry2) +{ + struct macro_def *e1 = entry1, *e2 = entry2; + + return !strcmp((const char *)e1->name, (const char *)e2->name); +} + +static unsigned long macro_hash(void *entry) +{ + struct macro_def *e = entry; + + return hash_str((const char *)e->name); +} + +static void macro_set(const unsigned char *name, const unsigned char *value) +{ + struct macro_def fake = { name, NULL }; + struct macro_def *old_value = dhlookup(current_macros, &fake); + + if (!old_value) + { + old_value = ralloc(permanent, struct macro_def); + old_value->name = (unsigned char *)rstrdup(permanent, (char *)name); + dhadd(current_macros, old_value); + } + old_value->def = value; +} + +void preprocess_init(void) +{ + struct cpp_option *opt; + cpp_callbacks *cpp_cbacks; + cpp_reader *reader; + cpp_options *cpp_opts; + const char *builtin_macros_file; + + current_macros = new_dhash_table(permanent, 512, macro_compare, macro_hash); + + builtin_macros_file = target->global_cpp_init(); + init_nesc_paths_end(); + current.fileregion = newregion(); + if (!builtin_macros_file || !start_lex(l_c, builtin_macros_file)) + { + error("internal error: couldn't define builtin macros - exiting"); + exit(2); + } + + reader = current.lex.finput; + cpp_opts = cpp_get_options(reader); + cpp_cbacks = cpp_get_callbacks(reader); + cpp_opts->warn_unused_macros = 0; + if (!flag_undef) + cpp_scan_nooutput(reader); + + /* Process saved options */ + cpp_cbacks->file_change(reader, linemap_add(current.lex.line_map, LC_RENAME, 0, + "", 0)); + + for (opt = saved_options; opt; opt = opt->next) + { + if (opt->opt[0] == 'D') + cpp_define(reader, opt->arg); + else if (opt->opt[0] == 'U') + cpp_undef(reader, opt->arg); + else if (opt->opt[0] == 'A') + { + if (opt->arg[0] == '-') + cpp_unassert(reader, opt->arg + 1); + else + cpp_assert(reader, opt->arg); + } + } + end_lex(); + current.lex.input = NULL; + deleteregion_ptr(¤t.fileregion); +} + +static void cb_define(cpp_reader *reader, source_location loc, + cpp_hashnode *macro) +{ + char *def = rstrdup(permanent, (char *)cpp_macro_definition(reader, macro)); + char *firstspace = strchr(def, ' '); + + /* Massage def into cpp_define's format (same as -D) */ + *firstspace = '='; + macro_set(NODE_NAME(macro), (const unsigned char *)def); + + save_pp_define(reader, loc, macro); +} + +static void cb_undef(cpp_reader *reader, source_location loc, + cpp_hashnode *macro) +{ + macro_set(NODE_NAME(macro), NULL); + save_pp_undef(loc, macro); +} + +void start_macro_saving(void) +{ + cpp_reader *reader = current.lex.finput; + cpp_callbacks *cbacks = cpp_get_callbacks(reader); + dhash_scan existing_macros; + struct macro_def *macro; + + /* Start by defining the current macros */ + existing_macros = dhscan(current_macros); + while ((macro = dhnext(&existing_macros))) + if (macro->def) /* Ignore undef'ed macros - see cb_undef */ + cpp_define(reader, (const char *)macro->def); + + /* And set the include chain stuff */ + + cbacks->define = cb_define; + cbacks->undef = cb_undef; + if (target->file_cpp_init) + target->file_cpp_init(); +} + +void end_macro_saving(void) +{ + cpp_reader *reader = current.lex.finput; + cpp_callbacks *cbacks = cpp_get_callbacks(reader); + + cbacks->define = NULL; + cbacks->undef = NULL; +} + +void save_pp_dir(const char *dir) +{ + struct stat dbuf; + int l = strlen(dir); + + cpp_save_dir = xstrdup(dir); + + /* Remove trailing slashes */ + while (l > 1 && cpp_save_dir[l - 1] == '/') + cpp_save_dir[--l] = '\0'; + + mkdir(cpp_save_dir, 0777); + if (stat(cpp_save_dir, &dbuf) < 0 || !S_ISDIR(dbuf.st_mode)) + { + /* Just give up on saving preprocessed output */ + fprintf(stderr, "Couldn't create directory `%s'\n", cpp_save_dir); + cpp_save_dir = NULL; + } +} + +void save_pp_file_start(const char *path) +{ + if (!cpp_save_dir) + return; + + const char *fname = lbasename(path); + char *pp_path = rstralloc(current.fileregion, + strlen(cpp_save_dir) + strlen(fname) + 2); + + sprintf(pp_path, "%s/%s", cpp_save_dir, fname); + current.lex.pp.outf = fopen(pp_path, "w"); + if (!current.lex.pp.outf) + { + static int first = 1; + + if (first) + warning("cannot create preprocessed output file `%s'", pp_path); + first = FALSE; + return; + } + + /* Initialize the print structure. Setting current.lex.pp.src_line to -1 here is + a trick to guarantee that the first token of the file will cause + a linemarker to be output by maybe_print_line. */ + current.lex.pp.src_line = -1; + current.lex.pp.printed = 0; + current.lex.pp.prev = 0; + current.lex.pp.first_time = 1; + current.lex.pp.avoid_paste = 0; + current.lex.pp.source = NULL; +} + +void save_pp_file_end(void) +{ + if (!current.lex.pp.outf) + return; + + /* Flush any pending output. */ + if (current.lex.pp.printed) + putc('\n', current.lex.pp.outf); + fclose(current.lex.pp.outf); + current.lex.pp.outf = NULL; +} + +void save_pp_token(const cpp_token *token) +{ + cpp_reader *pfile = current.lex.finput; + + if (!current.lex.pp.outf) + return; + + if (token->type == CPP_PADDING) + { + current.lex.pp.avoid_paste = true; + if (current.lex.pp.source == NULL + || (!(current.lex.pp.source->flags & PREV_WHITE) + && token->val.source == NULL)) + current.lex.pp.source = token->val.source; + return; + } + + if (token->type == CPP_EOF) + return; + + /* Subtle logic to output a space if and only if necessary. */ + if (current.lex.pp.avoid_paste) + { + if (current.lex.pp.source == NULL) + current.lex.pp.source = token; + if (current.lex.pp.source->flags & PREV_WHITE + || (current.lex.pp.prev + && cpp_avoid_paste(pfile, current.lex.pp.prev, token)) + || (current.lex.pp.prev == NULL && token->type == CPP_HASH)) + putc(' ', current.lex.pp.outf); + } + else if (token->flags & PREV_WHITE) + putc(' ', current.lex.pp.outf); + + current.lex.pp.avoid_paste = false; + current.lex.pp.source = NULL; + current.lex.pp.prev = token; + cpp_output_token(token, current.lex.pp.outf); + + if(token->type == CPP_COMMENT) + account_for_newlines(token->val.str.text, token->val.str.len); +} + +/* Adjust current.lex.pp.src_line for newlines embedded in output. */ +static void account_for_newlines(const unsigned char *str, size_t len) +{ + while (len--) + if (*str++ == '\n') + current.lex.pp.src_line++; +} + +/* If the token read on logical line LINE needs to be output on a + different line to the current one, output the required newlines or + a line marker, and return 1. Otherwise return 0. */ +static void maybe_print_line(source_location src_loc) +{ + const struct line_map *map = linemap_lookup(current.lex.line_map, src_loc); + int src_line = SOURCE_LINE(map, src_loc); + /* End the previous line of text. */ + if (current.lex.pp.printed) + { + putc('\n', current.lex.pp.outf); + current.lex.pp.src_line++; + current.lex.pp.printed = 0; + } + + if (src_line >= current.lex.pp.src_line && src_line < current.lex.pp.src_line + 8) + { + while (src_line > current.lex.pp.src_line) + { + putc('\n', current.lex.pp.outf); + current.lex.pp.src_line++; + } + } + else + print_line(src_loc, ""); +} + +/* Output a line marker for logical line LINE. Special flags are "1" + or "2" indicating entering or leaving a file. */ +static void print_line(source_location src_loc, const char *special_flags) +{ + /* End any previous line of text. */ + if (current.lex.pp.printed) + putc('\n', current.lex.pp.outf); + current.lex.pp.printed = 0; + + /*if (!flag_no_line_commands)*/ + { + const struct line_map *map = linemap_lookup(current.lex.line_map, src_loc); + + size_t to_file_len = strlen(map->to_file); + unsigned char *to_file_quoted = + (unsigned char *) alloca(to_file_len * 4 + 1); + unsigned char *p; + + current.lex.pp.src_line = SOURCE_LINE(map, src_loc); + + /* cpp_quote_string does not nul-terminate, so we have to do it + ourselves. */ + p = cpp_quote_string(to_file_quoted, + (unsigned char *) map->to_file, to_file_len); + *p = '\0'; + fprintf(current.lex.pp.outf, "# %u \"%s\"%s", + current.lex.pp.src_line == 0 ? 1 : current.lex.pp.src_line, + to_file_quoted, special_flags); + + if (map->sysp == 2) + fputs(" 3 4", current.lex.pp.outf); + else if (map->sysp == 1) + fputs(" 3", current.lex.pp.outf); + + putc('\n', current.lex.pp.outf); + } +} + +/* Called when a line of output is started. TOKEN is the first token + of the line, and at end of file will be CPP_EOF. */ +void save_pp_line_change(cpp_reader *pfile, const cpp_token *token) +{ + if (!current.lex.pp.outf) + return; + + source_location src_loc = token->src_loc; + + maybe_print_line(src_loc); + current.lex.pp.prev = 0; + current.lex.pp.source = 0; + + /* Supply enough spaces to put this token in its original column, + one space per column greater than 2, since scan_translation_unit + will provide a space if PREV_WHITE. Don't bother trying to + reconstruct tabs; we can't get it right in general, and nothing + ought to care. Some things do care; the fault lies with them. */ + /*if (!CPP_OPTION(pfile, traditional))*/ + { + const struct line_map *map = linemap_lookup(current.lex.line_map, src_loc); + int spaces = SOURCE_COLUMN(map, src_loc) - 2; + current.lex.pp.printed = 1; + + while (-- spaces >= 0) + putc(' ', current.lex.pp.outf); + } +} + +static void save_pp_define(cpp_reader *pfile, source_location line, + cpp_hashnode *node) +{ + if (!current.lex.pp.outf) + return; + + maybe_print_line (line); + + fprintf(current.lex.pp.outf, "#define %s\n", + (const char *)cpp_macro_definition(pfile, node)); + + if (linemap_lookup(current.lex.line_map, line)->to_line != 0) + current.lex.pp.src_line++; +} + +static void save_pp_undef(source_location line, cpp_hashnode *node) +{ + if (!current.lex.pp.outf) + return; + + maybe_print_line(line); + fprintf(current.lex.pp.outf, "#undef %s\n", NODE_NAME(node)); + current.lex.pp.src_line++; +} diff --git a/src/nesc-cpp.h b/src/nesc-cpp.h new file mode 100644 index 0000000..bc51a50 --- /dev/null +++ b/src/nesc-cpp.h @@ -0,0 +1,38 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef NESC_CPP_H +#define NESC_CPP_H + +#include "parser.h" + +void save_cpp_option(const char *option, const char *arg); +void preprocess_init(void); + +void start_macro_saving(void); +void end_macro_saving(void); + +struct cpp_token; +struct cpp_reader; + +void save_pp_dir(const char *dir); +void save_pp_file_start(const char *path); +void save_pp_file_end(void); +void save_pp_token(const struct cpp_token *tok); +void save_pp_line_change(struct cpp_reader *pfile, const struct cpp_token *token); + +#endif diff --git a/src/nesc-decls.h b/src/nesc-decls.h new file mode 100644 index 0000000..94626a9 --- /dev/null +++ b/src/nesc-decls.h @@ -0,0 +1,69 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef NESC_DECLS_H +#define NESC_DECLS_H + +typedef struct nesc_declaration { + source_language kind; /* l_interface or l_component */ + /* For source components, name and instance_name are the actual component + name. + For concrete instances of abstract components, name is the + name to used in generated code, and instance_name is a + user-friendly name (indicating the path through configurations that + led to this instance). + + instance_name is used for error messages */ + const char *name; + const char *instance_name; + int instance_number; + nesc_decl ast; + struct environment *env; + struct docstring doc; + + bool abstract; /* true for abstract components and + generic interfaces */ + bool dumped; /* true if already added to dump list */ + bool printed; /* true if declarations already printed */ + declaration parameters; /* Parameters for generic components and + interfaces */ + expression arguments; /* Arguments for instantiations of generic + components and interfaces */ + struct environment *parameter_env; + struct nesc_declaration *original; /* For instances: the "original" component + or interface */ + /* All '@'-style attributes attached to this declaration */ + dd_list/*nesc_attribute*/ attributes; + + /* for components */ + /* Binary components are mostly treated like modules. */ + + bool configuration; /* TRUE for configurations, FALSE for modules + (needed before impl is set) and binary + components. */ + bool safe; /* TRUE if safety checks should be performed in here */ + implementation impl; + struct cgraph *connections; + struct cgraph *user_connections; /* interfaces are not expanded */ + dd_list local_statics; /* Local static variables (for nido) */ + size_t instance_count; /* For abstract components, the + instance count (used to give each + instance a unique name) */ + int folded; /* number of last constant folding pass */ +} *nesc_declaration; + +#endif diff --git a/src/nesc-deputy.c b/src/nesc-deputy.c new file mode 100644 index 0000000..989cd23 --- /dev/null +++ b/src/nesc-deputy.c @@ -0,0 +1,250 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2008 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include "parser.h" +#include "nesc-deputy.h" +#include "nesc-attributes.h" +#include "AST_walk.h" +#include "AST_utils.h" + +static AST_walker deputy_walker; + +struct deputy_data +{ + bool deputy_scope; + tag_declaration in_struct; + environment env; +}; + +static void dwalk(struct deputy_data *dd, void *p) +{ + if (p) + AST_walk(deputy_walker, dd, CASTPTR(node, &p)); +} + +static AST_walker_result deputy_identifier(AST_walker unused, void *data, + identifier *p) +{ + identifier id = *p; + struct deputy_data *dd = data; + + if (dd->deputy_scope) + { + const char *name = id->cstring.data; + data_declaration realdecl = NULL; + + /* not doing make_identifier's error message suppression */ + + if (dd->in_struct && + env_lookup(dd->in_struct->fields, name, TRUE)) + realdecl = bad_decl; /* prevent renaming of field refs */ + if (!realdecl) + realdecl = env_lookup(dd->env->id_env, name, FALSE); + + if (realdecl) + id->ddecl = realdecl; + else + error_with_location(id->location, "`%s' undeclared", name); + } + return aw_done; +} + +static AST_walker_result deputy_nesc_attribute(AST_walker unused, void *data, + nesc_attribute *p) +{ + nesc_attribute na = *p; + struct deputy_data ndd = *(struct deputy_data *)data; + + ndd.deputy_scope = na->tdecl->deputy_scope; + AST_walk_children(deputy_walker, &ndd, CAST(node, na)); + + return aw_done; +} + +static AST_walker_result deputy_tag_ref(AST_walker unused, void *data, + tag_ref *p) +{ + tag_ref tref = *p; + struct deputy_data ndd = *(struct deputy_data *)data; + + ndd.in_struct = tref->kind != kind_enum_ref ? tref->tdecl : NULL; + dwalk(data, tref->attributes); + dwalk(&ndd, tref->fields); + + return aw_done; +} + +static AST_walker_result deputy_fdeclarator(AST_walker unused, void *data, + function_declarator *p) +{ + function_declarator fd = *p; + struct deputy_data ndd = *(struct deputy_data *)data; + + /* strangely or not, the parameters are no longer in scope within + (from the AST perspective) the fdeclarator's declarator */ + ndd.env = fd->env->parent; + dwalk(&ndd, fd->declarator); + dwalk(data, fd->return_type); + dwalk(data, fd->parms); + dwalk(data, fd->gparms); + dwalk(data, fd->qualifiers); + + return aw_done; +} + +static AST_walker_result deputy_function_decl(AST_walker unused, void *data, + function_decl *p) +{ + function_decl fdecl = *p; + function_declarator fd = get_fdeclarator(fdecl->declarator); + struct deputy_data ndd; + + /* The parameters are in scope for the result type too ... */ + ndd.deputy_scope = FALSE; + ndd.env = fd->env; + ndd.in_struct = NULL; + dwalk(&ndd, fdecl->declarator); + dwalk(&ndd, fdecl->modifiers); + dwalk(&ndd, fdecl->attributes); + dwalk(data, fdecl->stmt); + + return aw_done; +} + +static AST_walker_result deputy_data_decl(AST_walker unused, void *data, + data_decl *p) +{ + data_decl dd = *p; + declaration first; + variable_decl vd; + function_declarator fd; + struct deputy_data ndd; + + /* We only get deputy behaviour if there's a single variable + declaration (variable_decl) with a function_delarator inside it. */ + if (!dd->decls || dd->decls->next) + return aw_walk; + first = ignore_extensions(dd->decls); + if (!is_variable_decl(first)) + return aw_walk; + vd = CAST(variable_decl, first); + fd = get_fdeclarator(vd->declarator); + if (!fd || !vd->ddecl) + return aw_walk; + + /* The parameters are in scope for the result type too ... */ + ndd.deputy_scope = FALSE; + ndd.env = fd->env; + ndd.in_struct = NULL; + dwalk(&ndd, dd->modifiers); + dwalk(&ndd, dd->decls); + + return aw_done; +} + +static AST_walker_result deputy_compound_stmt(AST_walker unused, void *data, + compound_stmt *p) +{ + compound_stmt cs = *p; + struct deputy_data ndd; + + ndd.deputy_scope = FALSE; + ndd.env = cs->env; + ndd.in_struct = NULL; + AST_walk_children(deputy_walker, &ndd, CAST(node, cs)); + + return aw_done; +} + +static AST_walker_result deputy_implementation(AST_walker unused, void *data, + implementation *p) +{ + implementation impl = *p; + struct deputy_data ndd; + + ndd.deputy_scope = FALSE; + ndd.env = impl->ienv; + ndd.in_struct = NULL; + AST_walk_children(deputy_walker, &ndd, CAST(node, impl)); + + return aw_done; +} + +void resolve_deputy_scopes(nesc_decl ast) +{ + struct deputy_data ndd; + + ndd.deputy_scope = FALSE; + ndd.in_struct = NULL; + ndd.env = ast->cdecl->env; + + dwalk(&ndd, ast); +} + +static void attr_dscope_tdecl(nesc_attribute attr, tag_declaration tdecl) +{ + if (tdecl->kind == kind_attribute_ref) + tdecl->deputy_scope = TRUE; + else + error_with_location(attr->location, "@deputy_scope() can only be applied to attribute declarations"); +} + +static void attr_ndecl_safe(nesc_attribute attr, nesc_declaration ndecl) +{ + if (ndecl->kind == l_component) + ndecl->safe = TRUE; + else + warning_with_location(attr->location, "@safe() attribute ignored"); +} + +static void attr_decl_safe(nesc_attribute attr, data_declaration ddecl) +{ + ddecl->safe = TRUE; +} + +static void attr_ndecl_unsafe(nesc_attribute attr, nesc_declaration ndecl) +{ + if (ndecl->kind == l_component) + ndecl->safe = FALSE; + else + warning_with_location(attr->location, "@unsafe() attribute ignored"); +} + +static void attr_decl_unsafe(nesc_attribute attr, data_declaration ddecl) +{ + ddecl->safe = FALSE; +} + +void init_deputy(void) +{ + define_internal_attribute("deputy_scope", NULL, NULL, attr_dscope_tdecl, NULL, + NULL, NULL); + define_internal_attribute("safe", attr_ndecl_safe, attr_decl_safe, NULL, + NULL, NULL, NULL); + define_internal_attribute("unsafe", attr_ndecl_unsafe, attr_decl_unsafe, NULL, + NULL, NULL, NULL); + + deputy_walker = new_AST_walker(permanent); + AST_walker_handle(deputy_walker, kind_identifier, deputy_identifier); + AST_walker_handle(deputy_walker, kind_nesc_attribute, deputy_nesc_attribute); + AST_walker_handle(deputy_walker, kind_tag_ref, deputy_tag_ref); + AST_walker_handle(deputy_walker, kind_function_declarator, deputy_fdeclarator); + AST_walker_handle(deputy_walker, kind_function_decl, deputy_function_decl); + AST_walker_handle(deputy_walker, kind_data_decl, deputy_data_decl); + AST_walker_handle(deputy_walker, kind_compound_stmt, deputy_compound_stmt); + AST_walker_handle(deputy_walker, kind_implementation, deputy_implementation); +} diff --git a/src/nesc-deputy.h b/src/nesc-deputy.h new file mode 100644 index 0000000..4a8e1b9 --- /dev/null +++ b/src/nesc-deputy.h @@ -0,0 +1,25 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2008 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef NESC_DEPUTY_H +#define NESC_DEPUTY_H + +void resolve_deputy_scopes(nesc_decl ast); +void init_deputy(void); + +#endif + diff --git a/src/nesc-dfilter.c b/src/nesc-dfilter.c new file mode 100644 index 0000000..9cab189 --- /dev/null +++ b/src/nesc-dfilter.c @@ -0,0 +1,388 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include +#include +#include +#include "parser.h" +#include "nesc-dump.h" +#include "nesc-dspec.h" +#include "nesc-dspec-int.h" +#include "nesc-semantics.h" + +/* Filters for XML dump requests. Current filters: + file(globexp): match containing file name (unix-style file matching) + name(regexp): match by item name (regular expression matching) + attribute(namelist): match items containing one of the attributes + in the namelist + component(cname): match containing component name + global(): match items from the global (C) scope + instance(): match items in instances of generic components + abstract(): match items that are not fully instantiated + !global() && !abstract() && !instances(): "in a non-generic component" + abstract() && !instance(): "in a generic component" + !abstract() && instance(): "in a fully instantiated generic + component (i.e., shows up in the generated C code)" + abstract() && instance(): "a partially instantiated generic component, + i.e., a generic component instantiated within a + generic configuration" + + Filters can be combined with and, or, not. +*/ + +/* Implementation of filters is OOish, see the filter_op structure. + Filters can be applied to nesc/tag/data_declaration objects (separate + method for each). + + Each filter has an argument specification string of the form: + - a sequence of n and t's for token and int arguments (in order) + - "*t" or "*n" for an arbitrary list of tokens or numbers. + See check_arg, make_ndf_op to extend this. +*/ + +static bool filter_file(ndf_op filter, location loc) +{ + return !fnmatch(nd_tokenval(filter->args), loc->filename, 0); +} + +static bool filter_name(ndf_op filter, const char *name) +{ + return name && !regexec(filter->info, name, 0, NULL, 0); +} + +static bool filter_attribute(ndf_op filter, dd_list/*nesc_attribute*/ attrs) +{ + nd_arg reqattr; + dd_list_pos actualattr; + + if (!attrs) + return FALSE; + + /* return true if intersection of attributes in filter and attrs is + non-empty */ + scan_nd_arg (reqattr, filter->args) + { + const char *reqname = nd_tokenval(reqattr); + + dd_scan (actualattr, attrs) + { + nesc_attribute a = DD_GET(nesc_attribute, actualattr); + + if (!strcmp(a->word1->cstring.data, reqname)) + return TRUE; + } + } + return FALSE; +} + +static bool filter_component(ndf_op filter, nesc_declaration container) +{ + return container && + !strcmp(nd_tokenval(filter->args), container->instance_name); +} + + + +static bool fddecl_file(ndf_op op, data_declaration ddecl) +{ + return filter_file(op, ddecl->definition ? ddecl->definition->location : ddecl->ast->location); +} + +static bool fndecl_file(ndf_op op, nesc_declaration ndecl) +{ + return filter_file(op, ndecl->ast->location); +} + +static bool ftdecl_file(ndf_op op, tag_declaration tdecl) +{ + return tdecl->definition && filter_file(op, tdecl->definition->location); +} + +static bool fddecl_attribute(ndf_op op, data_declaration ddecl) +{ + return filter_attribute(op, ddecl->attributes); +} + +static bool fndecl_attribute(ndf_op op, nesc_declaration ndecl) +{ + return filter_attribute(op, ndecl->attributes); +} + +static bool ftdecl_attribute(ndf_op op, tag_declaration tdecl) +{ + return filter_attribute(op, tdecl->attributes); +} + +static void fcompile_name(ndf_op op) +{ + int err; + + op->info = ralloc(dump_region, regex_t); + err = regcomp(op->info, nd_tokenval(op->args), REG_EXTENDED); + if (err) + { + char errmsg[200]; + + regerror(err, op->info, errmsg, sizeof errmsg); + nderror(errmsg); + } + } + +static bool fddecl_name(ndf_op op, data_declaration ddecl) +{ + return filter_name(op, ddecl->name); +} + +static bool fndecl_name(ndf_op op, nesc_declaration ndecl) +{ + return filter_name(op, ndecl->instance_name); +} + +static bool ftdecl_name(ndf_op op, tag_declaration tdecl) +{ + return filter_name(op, tdecl->name); +} + +static bool fddecl_component(ndf_op op, data_declaration ddecl) +{ + return filter_component(op, ddecl->container); +} + +static bool fndecl_component(ndf_op op, nesc_declaration ndecl) +{ + /* XXX: should this do something obvious w/ instantiated + abstract components? */ + return FALSE; +} + +static bool ftdecl_component(ndf_op op, tag_declaration tdecl) +{ + return filter_component(op, tdecl->container); +} + +static bool fddecl_global(ndf_op op, data_declaration ddecl) +{ + return !ddecl->container && !ddecl->container_function; +} + +static bool fndecl_global(ndf_op op, nesc_declaration ndecl) +{ + /* XXX: see fndecl_component comment */ + return TRUE; +} + +static bool ftdecl_global(ndf_op op, tag_declaration tdecl) +{ + return !tdecl->container /* && !tdecl->container_function*/; +} + +static bool is_instance(nesc_declaration ndecl) +{ + return ndecl && ndecl->arguments; +} + +static bool fddecl_instance(ndf_op op, data_declaration ddecl) +{ + return is_instance(ddecl_container(ddecl)); +} + +static bool fndecl_instance(ndf_op op, nesc_declaration ndecl) +{ + return is_instance(ndecl); +} + +static bool ftdecl_instance(ndf_op op, tag_declaration tdecl) +{ + return is_instance(tdecl_container(tdecl)); +} + +static bool is_abstract(nesc_declaration ndecl) +{ + return ndecl && ndecl->abstract; +} + +static bool fddecl_abstract(ndf_op op, data_declaration ddecl) +{ + return is_abstract(ddecl_container(ddecl)); +} + +static bool fndecl_abstract(ndf_op op, nesc_declaration ndecl) +{ + return is_abstract(ndecl); +} + +static bool ftdecl_abstract(ndf_op op, tag_declaration tdecl) +{ + return is_abstract(tdecl_container(tdecl)); +} + +static struct filter_op { + const char *name; + const char *args; /* Argument specification (see top) */ + + /* (optional) filter "compilation" (eg for regexps) */ + void (*compile)(ndf_op op); + + /* Execute filter op on Xdecl */ + bool (*execute_ddecl)(ndf_op op, data_declaration ddecl); + bool (*execute_ndecl)(ndf_op op, nesc_declaration ndecl); + bool (*execute_tdecl)(ndf_op op, tag_declaration tdecl); +} ops[] = { + { "file", "t", NULL, fddecl_file, fndecl_file, ftdecl_file }, + { "name", "t", fcompile_name, fddecl_name, fndecl_name, ftdecl_name }, + { "component", "t", NULL, fddecl_component, fndecl_component, ftdecl_component }, + { "global", "", NULL, fddecl_global, fndecl_global, ftdecl_global }, + { "instance", "", NULL, fddecl_instance, fndecl_instance, ftdecl_instance }, + { "abstract", "", NULL, fddecl_abstract, fndecl_abstract, ftdecl_abstract }, + { "attribute", "*t", NULL, fddecl_attribute, fndecl_attribute, ftdecl_attribute } +}; + +static void check_arg(nd_arg arg, int kind) +{ + bool ok; + + switch (kind) + { + default: ok = TRUE; + case 't': ok = is_nd_token(arg); break; + case 'n': ok = is_nd_int(arg); break; + } + if (!ok) + nderror("wrong argument type"); +} + +nd_filter make_ndf_op(region r, const char *name, nd_arg args) +{ + int nargs = nd_arg_length(args); + ndf_op op = new_ndf_op(r, name, args, nargs); + int i; + + for (i = 0; i < sizeof ops / sizeof *ops; i++) + if (!strcmp(name, ops[i].name)) + { + const char *argspec = ops[i].args; + nd_arg arg; + int old_ec = errorcount; + + op->filter_index = i; + + /* Check arguments */ + if (argspec[0] == '*') + scan_nd_arg (arg, args) + check_arg(arg, argspec[1]); + else + { + scan_nd_arg (arg, args) + { + if (!*argspec) + nderror("too many arguments"); + else + check_arg(arg, *argspec++); + } + if (*argspec) + nderror("not enough arguments"); + } + + if (errorcount == old_ec && ops[i].compile) + ops[i].compile(op); + + return CAST(nd_filter, op); + } + nderror("unknown filter operator"); + + return CAST(nd_filter, op); +} + +/* The current filter, applied by dump_filter_Xdecl */ +static nd_filter current_filter; + +enum { filter_ddecl, filter_ndecl, filter_tdecl }; + +static bool dofilter(int op, nd_filter f, void *decl) +{ + switch (f->kind) + { + case kind_ndf_and: { + ndf_and f1 = CAST(ndf_and, f); + return dofilter(op, f1->filter1, decl) && dofilter(op, f1->filter2, decl); + } + case kind_ndf_or: { + ndf_or f1 = CAST(ndf_or, f); + return dofilter(op, f1->filter1, decl) || dofilter(op, f1->filter2, decl); + } + case kind_ndf_not: { + ndf_not f1 = CAST(ndf_not, f); + return !dofilter(op, f1->filter1, decl); + } + case kind_ndf_op: { + ndf_op f1 = CAST(ndf_op, f); + struct filter_op *fop = &ops[f1->filter_index]; + + switch (op) + { + case filter_ddecl: return fop->execute_ddecl(f1, decl); + case filter_ndecl: return fop->execute_ndecl(f1, decl); + case filter_tdecl: return fop->execute_tdecl(f1, decl); + default: assert(0); return FALSE; + } + } + default: + assert(0); return FALSE; + } +} + +bool dump_filter_ddecl(data_declaration ddecl) +{ + return !current_filter || dofilter(filter_ddecl, current_filter, ddecl); +} + +bool dump_filter_ndecl(nesc_declaration ndecl) +{ + return !current_filter || dofilter(filter_ndecl, current_filter, ndecl); +} + +bool dump_filter_tdecl(tag_declaration tdecl) +{ + return !current_filter || dofilter(filter_tdecl, current_filter, tdecl); +} + +void dump_set_filter(nd_option opt) +{ + nd_arg *optargs = &opt->args; + nd_filter extracted = NULL; + + /* Extract filters from opt, build current filter. If multiple filters, + just and them together. */ + while (*optargs) + if (!is_nd_filter(*optargs)) + optargs = &(*optargs)->next; + else + { + nd_filter f = CAST(nd_filter, *optargs); + *optargs = (*optargs)->next; + + if (extracted) + { + ndf_and x = new_ndf_and(dump_region, extracted, f); + extracted = CAST(nd_filter, x); + } + else + extracted = f; + } + + current_filter = extracted; +} diff --git a/src/nesc-dfilter.h b/src/nesc-dfilter.h new file mode 100644 index 0000000..9430182 --- /dev/null +++ b/src/nesc-dfilter.h @@ -0,0 +1,35 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef NESC_DFILTER_H +#define NESC_DFILTER_H + +nd_filter make_ndf_op(region r, const char *name, nd_arg args); +/* Returns: a new filter op for filter 'name' with arguments 'args' + */ + +void dump_set_filter(nd_option opt); +/* Effects: Sets current filter to the and of all filters found in option + list opt. */ + +/* Returns: TRUE if argument passes current filter. */ +bool dump_filter_ddecl(data_declaration ddecl); +bool dump_filter_ndecl(nesc_declaration ndecl); +bool dump_filter_tdecl(tag_declaration tdecl); + +#endif + diff --git a/src/nesc-doc.c b/src/nesc-doc.c new file mode 100644 index 0000000..cc26b9e --- /dev/null +++ b/src/nesc-doc.c @@ -0,0 +1,2832 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 UC Berkeley + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +/* + Author: J. Robert von Behren + Created: 7/4/2002 + Modified: 7/8/2002 + + This file contains routines for generating documentation from nesC + source code. The basic format for documentation is similar to + Javadoc. For specifics, look + + + + Modified: 8/14/2002 by Phil Levis + - Changed symlink code to unlink symlink before linking (else + EEXIST occurs when repeating). + - Removed color map elements -- default graphviz doesn't include + language cmap. + + Modified 8/15/2002 by Phil Levis + - Chase down pointer_declarators for functions properly now. + + Modified 8/21/2002 by Rob von Behren + - add back cmap - requires newer graphviz, but makes for prettier HTML output + + +*/ +#include +#include +#include +#include +#include +#include +#include +#include + +#include "dhash.h" +#include "parser.h" +#include "c-parse.h" +#include "nesc-doc.h" +#include "nesc-component.h" +#include "nesc-semantics.h" +#include "nesc-c.h" +#include "unparse.h" +#include "AST_utils.h" +#include "edit.h" +#include "semantics.h" +#include "constants.h" +#include "sd_list.h" +#include "nesc-cg.h" +#include "graph.h" +#include "nesc-env.h" +#include "regions.h" +#include "unparse.h" +#include "errors.h" + + + +static region doc_region = NULL; + +#ifdef WIN32 +#define mkdir(a, b) mkdir((a)) +#endif + +////////////////////////////////////////////////////////////////////// +// +// file name munging +// +////////////////////////////////////////////////////////////////////// + +// separator character for directory paths +static char dirsep = '/'; +static char dirsep_string[2] = "/"; + +// "package name" to prepend to files in the current directory +static const char *currdir_prefix = NULL; + +// full name of original working directory +static char original_wd[1024]; + +// directory info to strip from the generated docs file names +#define MAX_TOPDIRS 100 +static const char *topdir[MAX_TOPDIRS]; +static int num_topdirs = 0; + +// output directory for generated docs +static const char *docdir = NULL; + +// flag, to determine whether or not to use graphviz +static bool use_graphviz = FALSE; + +// flag, to determine whether or not to generate the app pages +static bool is_app = FALSE; + +/** + * Initialize the memory region for the doc tools + **/ +static void init_doc_region() +{ + if(doc_region == NULL) + doc_region = newregion(); +} + + +/** + * Set the graphviz flag + **/ +void doc_use_graphviz(const bool use) +{ + use_graphviz = use; +} + + +/** + * Set the app flag + **/ +void doc_is_app(const bool val) +{ + is_app = val; +} + + +/** + * Set the doc dir + **/ +void doc_set_outdir(const char *dir) +{ + assert(dir); + docdir = dir; +} + +/** + * Add a top level source directory + **/ +void doc_add_topdir(const char *dir) +{ + char realdir[PATH_MAX+1]; + char *temp; + + init_doc_region(); + + assert(dir); + if (num_topdirs >= MAX_TOPDIRS) + fatal("ERROR: Too many `topdirs' (-fnesc-topdir) directories specified.\n"); + + // canonicalize the path + if(realpath(dir, realdir) == NULL) { + perror("realpath"); + fatal("ERROR: Bad nesc-topdir option:\n '%s'\n",dir); + } + temp = rstralloc( doc_region, strlen(realdir)+1 ); + assert( temp ); + strcpy(temp, realdir); + + topdir[num_topdirs] = temp; + num_topdirs++; +} + + +/** + * Set the directory separator - used for cygwin? + **/ +void doc_set_dirsep(const char c) +{ + dirsep = c; + dirsep_string[0] = c; +} + + + +/** + * Initialize directory info. + **/ +static void find_currdir_prefix(const char *ocwd) +{ + int i; + char *cwd = rstrdup(doc_region, ocwd); + + unixify_path(cwd); + + // filename generation won't work if we don't know the top directories. + if( num_topdirs <= 0 ) { + fatal("ERROR: Documentation generation requires specifying\n -nesc-topdir arguments.\n"); + } + + // look for the topdir that is above the cwd. + for(i=0; iast); + + assert(iface->location != dummy_location); + + return doc_filename(iface->location->filename); +} + + +static char *component_docfile_name(const char *component_name) { + nesc_declaration cdecl; + component comp; + + cdecl = require(l_component, NULL /* location */, component_name); + comp = CAST(component, cdecl->ast); + + assert(comp->location != dummy_location); + + return doc_filename(comp->location->filename); +} + + +static bool copy_file(const char *srcfile, const char *destfile) +{ + char buf[1024 * 4]; + FILE *in = fopen(srcfile, "r"); + FILE *out = fopen(destfile, "w"); + size_t nread; + size_t nwritten; + + if( !in ) { + warning("Can't read from source file '%s'", srcfile); + return FALSE; + } + if( !out ) { + warning("Can't write to file '%s'", destfile); + return FALSE; + } + + + while( !feof(in) ) { + nread = fread(buf, 1, sizeof(buf), in); + if( ferror(in) ) { + warning("error copying '%s' to '%s'. can't read source", srcfile, destfile); + fclose(in); fclose(out); return FALSE; + } + assert( !ferror(in) ); + if(nread > 0) { + nwritten = fwrite(buf, 1, nread, out); + if( ferror(out) || nwritten != nread ) { + warning("error copying '%s' to '%s'. can't write dest", srcfile, destfile); + fclose(in); fclose(out); return FALSE; + } + } + } + + fclose(in); + fclose(out); + return TRUE; +} + +static void add_source_symlink(const char *orig_src_filename, const char *linkname) +{ +#ifdef WIN32 + char buf[PATH_MAX+1]; + char *srcfile; + + assert(chdir(original_wd) == 0); + if(realpath(orig_src_filename, buf) == NULL) { + perror("realpath"); + fatal("error expanding path for '%s'\n", orig_src_filename); + } + srcfile = buf; + assert(chdir(docdir) == 0); + + unlink(linkname); + if( !copy_file(srcfile, linkname) ) { + warning("can't copy source file '%s'", srcfile); + } +#else + bool cygwin = FALSE; + char buf[PATH_MAX+1]; + char *srcfile; + + // remove symlinks, etc. We do this from the original working + // directory, so that relative paths will be resolved correctly. + assert(chdir(original_wd) == 0); + if(realpath(orig_src_filename, buf) == NULL) { + perror("realpath"); + fatal("error expanding path for '%s'\n", orig_src_filename); + } + srcfile = buf; + assert(chdir(docdir) == 0); + + // determine whether or not we are running under cygwin + { + char *ostype = getenv("OSTYPE"); + if(ostype != NULL && !strcmp(ostype,"cygwin")) + cygwin = TRUE; + } + + unlink(linkname); + if( !cygwin ) { + if(symlink(srcfile, linkname) != 0) { + perror("symlink"); + warning("can't create symlink to source file %s",srcfile); + } + } else { + if( !copy_file(srcfile, linkname) ) { + warning("can't copy source file '%s'", srcfile); + } + } +#endif +} + + +////////////////////////////////////////////////////////////////////// +// +// output functions +// +////////////////////////////////////////////////////////////////////// +static FILE *current_doc_outfile; + +static FILE *open_outfile(const char *outfile) { + + unlink(outfile); + + current_doc_outfile = fopen(outfile,"w"); + if( !current_doc_outfile ) + fatal("can't write to output file '%s'",outfile); + + // set up unparse routines + unparse_start(current_doc_outfile, NULL); + disable_line_directives(); + set_function_separator("."); + enable_documentation_mode(); + + return current_doc_outfile; +} + +static void close_outfile(FILE *doc_outfile) { + fclose(doc_outfile); + unparse_end(); +} + +////////////////////////////////////////////////////////////////////// +// +// External information cache +// +////////////////////////////////////////////////////////////////////// + +typedef struct { + char **comp; + int num; + int slots; +} implementor_list; + +typedef struct { + char *desc; + bool is_iface; + implementor_list r_list; + implementor_list p_list; +} ic_entry; + + +static env ic_env; +static implementor_list ic_empty_implementor_list; + +#if 0 +static void ic_print() +{ + env_scanner scanner; + const char *name; + ic_entry *entry; + char *desc, *pos; + + // scan throug + env_scan(ic_env, &scanner); + while( env_next(&scanner, &name, (void **)&entry) ) { + assert(entry); + desc = entry->desc; + if(desc == NULL) desc = ""; + + // kill weird whitespace in the description + pos = desc; + while( 1 ) { + pos += strcspn(pos,"\r\n\t"); + if(*pos == '\0') break; + *pos = ' '; + } + + printf("%s %d %s\n",name, entry->is_iface, desc); + } + printf("\n\n"); +} +#endif + +static void ilist_add(implementor_list *list, char *name) +{ + int i; + char *temp; + + // skip duplicates + for(i=0; inum; i++) { + if(strcmp(name, list->comp[i]) == 0) return; + if(strcmp(name, list->comp[i]) < 0) break; + } + + // first allocation + if(list->comp == NULL) { + list->comp = rarrayextend(doc_region, NULL, 10, char*); + list->slots = 10; + list->num = 0; + } + + // expand, if necessary + if(list->num == list->slots) { + list->comp = rarrayextend(doc_region, list->comp, list->slots+10, char*); + list->slots += 10; + } + + // add the item, and shift the rest up + while( i <= list->num ) { + temp = list->comp[i]; + list->comp[i] = name; + name = temp; + i++; + } + + list->num++; +} + +static ic_entry* ic_get_entry(char *key) +{ + char *end; + char save; + ic_entry *entry; + + // remove extra suffix stuff from the key + end = strstr(key,".nc"); + if(end == NULL) + return NULL; // should never happen + end += strlen(".nc"); + save = *end; + *end = '\0'; + + // check the index + entry = env_lookup(ic_env, key, TRUE); + *end = save; + + return entry; +} + + +static void ic_read() +{ + FILE *f; + char key[1024]; + int is_iface, nreq, nprov, i, ret; + char desc[4096]; + ic_entry *entry; + + + ic_env = new_env(doc_region, NULL); + ic_empty_implementor_list.num = 0; + + // FIXME: we should really lock the file, so we don't get garbage if + // there are multiple concurrent compiles + + // open the existing file, if any + f = fopen("info.idx","r"); + if(f == NULL) return; + + // parse the file + while( !feof(f) ) { + key[0] = desc[0] = '\0'; + is_iface = nreq = nprov = 0; + ret = fscanf(f, "%s%d%d%d%*[ ]%[^\n]\n", key, &is_iface, &nreq, &nprov, desc); + if(ret == -1 && feof(f)) + break; + if(ret != 4 && ret != 5) { + warning("invalid data in info.idx - ignoring remainder of file\n"); + fclose(f); + return; + } + + entry = ic_get_entry(key); + if(entry == NULL) { + entry = ralloc(doc_region, ic_entry); + memset(entry, 0, sizeof(ic_entry)); + env_add(ic_env, rstrdup(doc_region,key), entry); + } + + if(strlen(desc) > 0) + entry->desc = rstrdup(doc_region, desc); + if(is_iface == 1) + entry->is_iface = TRUE; + + // read interfaces + for(i=0; ir_list), rstrdup(doc_region,desc)); + } + for(i=0; ip_list), rstrdup(doc_region,desc)); + } + } + + // close the file + fclose(f); +} + + +static void ic_write() +{ + FILE *f; + env_scanner scanner; + const char *name; + ic_entry *entry; + char *desc, *pos; + int i; + + // open the output file + f = fopen("info.idx", "w"); + if(f == NULL) { + warning("can't write to cache file 'info.idx'.\n"); + return; + } + + // scan throug + env_scan(ic_env, &scanner); + while( env_next(&scanner, &name, (void **)&entry) ) { + assert(entry); + desc = entry->desc; + if(desc == NULL) desc = ""; + + // kill weird whitespace in the description + pos = desc; + while( 1 ) { + pos += strcspn(pos,"\r\n\t"); + if(*pos == '\0') break; + *pos = ' '; + } + + // write the file + fprintf(f,"%s %d %d %d %s\n", name, entry->is_iface?1:0, entry->r_list.num, entry->p_list.num, desc); + + // write interfaces + for(i=0; ir_list.num; i++) + fprintf(f, " %s", entry->r_list.comp[i]); + for(i=0; ip_list.num; i++) + fprintf(f, " %s", entry->p_list.comp[i]); + if(entry->r_list.num > 0 || entry->p_list.num > 0) + fprintf(f,"\n"); + } + + // close the file + fclose(f); + + + // FIXME: should unlock the file now +} + + +static char *ic_make_iface_key(const char *interface_name) +{ + nesc_declaration idecl; + interface iface; + + idecl = require(l_interface, &doc_empty_location, interface_name); + iface = CAST(interface, idecl->ast); + + return doc_filename_with_ext(iface->location->filename,""); +} + +static void ic_scan_rplist(nesc_declaration cdecl, char *name) +{ + component comp = CAST(component, cdecl->ast); + declaration dlist, decl; + + interface_ref iref; + ic_entry *entry; + implementor_list *list; + char *ifname; + + scan_declaration(dlist, comp->decls) { + if (is_rp_interface(dlist)) { + rp_interface rp = CAST(rp_interface, dlist); + + scan_declaration(decl, rp->decls) { + if( is_interface_ref(decl) ) { + iref = CAST(interface_ref,decl); + ifname = ic_make_iface_key(iref->word1->cstring.data); + } else { + continue; + } + + entry = ic_get_entry( ifname ); + if(entry == NULL) { + entry = ralloc(doc_region, ic_entry); + memset(entry, 0, sizeof(ic_entry)); + env_add(ic_env, ifname, entry); + } + + // pick the list + if( rp->required ) + list = &(entry->r_list); + else + list = &(entry->p_list); + + // add to the list + ilist_add(list, name); + } + } + } +} + + + + +static void ic_add_entry(nesc_declaration cdecl) +{ + ic_entry *entry; + char *key; + + // create the local key + { + nesc_decl d = CAST(nesc_decl, cdecl->ast); + key = doc_filename_with_ext(d->location->filename,""); + } + + // get an existing entry + entry = ic_get_entry(key); + if(entry == NULL) { + entry = ralloc(doc_region, ic_entry); + memset(entry, 0, sizeof(ic_entry)); + env_add(ic_env, key, entry); + } + + // fill in the entry + if( cdecl->kind == l_interface ) + entry->is_iface = TRUE; + else + entry->is_iface = FALSE; + + // docstring + entry->desc = (char *)cdecl->doc.short_s; + + // implementor list + if( cdecl->kind == l_component ) { + ic_scan_rplist(cdecl, key); + } +} + +static char *ic_get_desc(char *key) +{ + ic_entry *entry = ic_get_entry(key); + if(entry == NULL) return NULL; + return entry->desc; +} + +static bool ic_is_iface(char *key) +{ + ic_entry *entry = ic_get_entry(key); + if(entry == NULL) return FALSE; + return entry->is_iface; +} + + +////////////////////////////////////////////////////////////////////// +// +// Docstring command parsing +// +////////////////////////////////////////////////////////////////////// + +/** + * Try to figure out if a given '@' sign is actually part of an email + * address. If so, beg is assigned the position of the first + * character of the address, and end is assigned the position of the + * first whitespace character after the address. + * + * The heuristic that is used is as follows: + * + * 1. The string has non-whitespace characters, ended by + * ".[a-zA-Z][a-zA-Z][a-zA-Z]? " + * + * 2. The string has no other + * + **/ +static bool check_email_address(const char *docstring, char *pos, char **beg, char **end) +{ + char *b, *e; + char c; + + // find the beginning of the address + b = pos-1; + while( 1 ) { + // beyond the start of the string + if(b < docstring) break; + + // not a valid character, so quit + c = *b; + if( !((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') + || c == '_' || c == '-' || c == '.')) + break; + + b--; + } + b++; + + // find the end of the address + e = pos+1; + while( 1 ) { + c = *e; + + // at the end of the string + if( c == '\0' ) break; + + // not a valid character + if( !((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') + || c == '_' || c == '-' || c == '.')) + break; + + e++; + } + e--; + + if(b < pos && e > pos) { + *beg = b; + *end = e; + return TRUE; + } else { + return FALSE; + } +} + + +typedef enum { + in_main, + in_return, + in_param, + in_author, + in_version, + in_modified, + in_signals, + in_see_also +} docstring_context; + +static void output_docstring(char *docstring, location loc) +{ + char *pos = docstring; + char *at, *space; + int len; + docstring_context context = in_main; + static char *whitespace = " \t\r\n"; + + while( 1 ) { + // find the next @ directive + at = strchr(pos,'@'); + + // output the rest, if there are no more @ directives + if(at == NULL) { + output_string(pos); + if(context == in_param) output("\n"); + if(context != in_main) + output("\n"); + return; + } + + // directives must be preceeded by whitespace or an open paren + space = at-1; + if(space >= docstring && (*space==' ' || *space=='\t' || *space=='\n' || *space=='\r' || *space=='(') ) + { + // output up to the @ + *at='\0'; output_string(pos); *at='@'; + pos = at+1; + + // do some formatting, based on the command + len = strcspn(pos, whitespace); + + if( len==strlen("return") && !strncasecmp("return",pos,len) ) { + pos += len; + if(context == in_param) output("\n"); + if(context == in_main) output("\n"); + else output("\n"); + + if(context != in_return) { + output("\n\n
Returns:"); + context = in_return; + } else { + output("
 "); + } + } + + else if( len==strlen("param") && !strncasecmp("param",pos,len) ) { + pos += len; + + //if(context == in_param) output("\n"); + if(context == in_main) output("\n"); + + if(context != in_param) { + output("\n"); + output("\n\n\n

Parameters:
"); + output("

"); + context = in_param; + } else { + //output("

 "); + //output("
 "); + output("

"); + } + + // print out the parameter name, plus a separator + pos += strspn(pos, whitespace); + len = strcspn(pos, whitespace); + // Null terminate the name + *(pos + len) = '\0'; + + //output("

"); + output("%*s",len,pos); + output(" - "); + // Restore to spaced text. + *(pos + len) = ' '; + pos += len; + } + + else if( len==strlen("author") && !strncasecmp("author",pos,len) ) { + pos += len; + + if(context == in_param) output("\n"); + if(context == in_main) output("\n"); + else output("\n"); + + if(context != in_author) { + output("\n
Author:\n"); + context = in_author; + } else { + output("
 "); + } + } + + else if( len==strlen("version") && !strncasecmp("version",pos,len) ) { + pos += len; + + if(context == in_param) output("\n"); + if(context == in_main) output("\n"); + else output("\n"); + + if(context != in_version) { + output("\n
Version:\n"); + context = in_version; + } else { + output("
 "); + } + } + + else if( len==strlen("modified") && !strncasecmp("modified",pos,len) ) { + pos += len; + + if(context == in_param) output("\n"); + if(context == in_main) output("\n"); + else output("\n"); + + if(context != in_modified) { + output("\n
Modified:\n"); + context = in_modified; + } else { + output("
 "); + } + } + + else if( len==strlen("signals") && !strncasecmp("signals",pos,len) ) { + pos += len; + + if(context == in_param) output("\n"); + if(context == in_main) output("\n"); + else output("\n"); + + if(context != in_signals) { + output("\n
Events signaled:\n"); + context = in_signals; + } else { + output("
 "); + } + + // FIXME: should print warnings for things (a) not mentioned + // or (b) extraneously mentioned + + // FIXME: should add hrefs to the events (?) + } + + else if( len==strlen("see") && !strncasecmp("see",pos,len) ) { + pos += len; + + if(context == in_param) output("\n"); + if(context == in_main) output("\n"); + else output("\n"); + + if(context != in_see_also) { + output("\n
See also:\n"); + context = in_see_also; + } else { + output("
 "); + } + + // FIXME: should add hrefs when possible + } + + // output a warning, and print the bogus directive as-is + else { + warning("%s:%ld: Unknown documentation directive '@%.*s'\n", + loc->filename, loc->lineno, len, pos); + output("@"); + } + } + + // found an @ that isn't preceded by whitespace or '('. Don't print a warning. + else { + char *begin, *end; + char save; + + // do a quick check to see if it might be an email address, and format it nicely if so. + if( check_email_address(docstring, at, &begin, &end) ) { + // output to the beginning of the address + save=*begin; *begin='\0'; output_string(pos); *begin=save; + + // print the mailto: URL and the address + end++; + save=*end; *end='\0'; + output("%s",begin,begin); + *end = save; + + // set the position + pos=end; + } + + // not an email address, just output normally + else { + *at='\0'; output_string(pos); *at='@'; + pos = at+1; + output("@"); + } + + } + + + } + +} + + + + +////////////////////////////////////////////////////////////////////// +// +// HTML generation functions +// +////////////////////////////////////////////////////////////////////// + +typedef enum { + NAV_APP, + NAV_COMP, + NAV_INT, + NAV_ALL, + NAV_TREE, + NAV_OTHER +} navbar_mode; + +static void print_navbar(FILE *f, navbar_mode mode, const char *srcfile, const char *srctext) +{ + char *spaces = "   "; + + + if(srcfile) { + fprintf(f, "\n"); + fprintf(f, "\n"); + fprintf(f,"
\n"); + } + + fprintf(f,"\n"); + + if(mode == NAV_APP) fprintf(f,"Apps\n"); + else fprintf(f,"Apps\n"); + fprintf(f, "%s\n", spaces); + + if(mode == NAV_COMP) fprintf(f,"Components\n"); + else fprintf(f, "Components\n"); + fprintf(f, "%s\n", spaces); + + if(mode == NAV_INT) fprintf(f,"Interfaces\n"); + else fprintf(f, "Interfaces\n"); + fprintf(f, "%s\n", spaces); + + if(mode == NAV_ALL) fprintf(f,"All Files\n"); + else fprintf(f, "All Files\n"); + fprintf(f, "%s\n", spaces); + + if(mode == NAV_TREE) fprintf(f,"Source Tree\n"); + else fprintf(f, "Source Tree\n"); + fprintf(f, "%s\n", spaces); + + fprintf(f, "\n"); + + if(srcfile) { + fprintf(f,"\n"); + fprintf(f,"\n"); + fprintf(f,"source: %s\n", srcfile, srctext); + fprintf(f, "\n"); + fprintf(f,"
\n"); + } + + fprintf(f, "
\n"); +} + + +static void print_short_variable_html(data_decl ddecl, variable_decl vd) { + output("
  • "); + //prt_declarator(d->declarator, d->qualifiers, d->attributes, d->ddecl, psd_skip_container); + + + // FIXME: did this fix the variable declaration printing? + prt_type_elements(ddecl->modifiers, 0); + + prt_declarator(vd->declarator, NULL, vd->attributes, vd->ddecl, psd_skip_container); + + // NOTE: these lines copied from unparse.c - not sure I want/need them. + { + //if (d->asm_stmt) + // prt_asm_stmt_plain(d->asm_stmt); + + if (vd->arg1) { + output(" = "); + prt_expression(vd->arg1, P_ASSIGN); + } + } + output("\n"); + + // show the description, if any + if( vd->ddecl->doc.short_s ) { + output("
    "); + output_docstring((char *)vd->ddecl->doc.short_s, vd->ddecl->doc.loc); + output("\n"); + } + +} + + +static inline void check_print_func_args(function_decl fd, data_decl dd, variable_decl vd, + function_declarator *fdr, data_declaration *ddecl) { + if( fd ) { + assert(dd==NULL); + assert(vd==NULL); + if(fdr) *fdr = CAST(function_declarator, fd->fdeclarator); + if(ddecl) *ddecl = fd->ddecl; + } + else { + assert(fd==NULL); + assert(dd); + assert(vd); + if (is_function_declarator(vd->declarator)) { + if(fdr) *fdr = CAST(function_declarator, vd->declarator); + if(ddecl) *ddecl = vd->ddecl; + } + // Chase down pointers if necessary. + else if (is_pointer_declarator(vd->declarator)) { + function_declarator fdcl = get_fdeclarator(vd->declarator); + if(fdr) *fdr = fdcl; + if(ddecl) *ddecl = vd->ddecl; + } + else { + if(ddecl) *ddecl = vd->ddecl; + } + } +} + +/** + * print function return type & modifiers + **/ +static void print_func_return(function_decl fd, data_decl dd, variable_decl vd) +{ + check_print_func_args(fd, dd, vd, NULL, NULL); + if(fd) { + prt_declarator(NULL, fd->modifiers, fd->attributes, fd->ddecl, psd_skip_container); + } else { + prt_type_elements(dd->modifiers, psd_skip_command_event); + } +} + +/** + * print function name + **/ +static void print_func_name(function_decl fd, data_decl dd, variable_decl vd) +{ + function_declarator fdr; + data_declaration ddecl; + + check_print_func_args(fd, dd, vd, &fdr, &ddecl); + prt_simple_declarator(fdr->declarator, ddecl, psd_skip_container | psd_need_paren_for_star | psd_need_paren_for_qual); + +} + +/** + * print function arguments + **/ +// FIXME: this should allow an option to print only arg types, and not +// names - necessary to canonicalize anchors and hrefs. +static void print_func_args(function_decl fd, data_decl dd, variable_decl vd) +{ + function_declarator fdr; + data_declaration ddecl; + + check_print_func_args(fd, dd, vd, &fdr, &ddecl); + prt_parameters(fdr->gparms ? fdr->gparms : + ddecl ? ddecl_get_gparms(ddecl) : NULL, + fdr->parms, + psd_skip_container); + +} + + +/** + * print the entire header for a function - return name(args) + **/ +static void print_function_header(function_decl fd, data_decl dd, variable_decl vd) +{ + print_func_return(fd, dd, vd); + print_func_name(fd, dd, vd); + print_func_args(fd, dd, vd); +} + + +/** + * Check to see if a function has a long description + **/ +static bool has_long_desc(function_decl fd, data_decl dd, variable_decl vd) +{ + if( fd ) { + return (fd->ddecl->doc.long_s != NULL); + } else { + return (vd->ddecl->doc.long_s != NULL); + } +} + + +/** + * generate the text for a stand-alone function declaration. This + * occurs when functions are listed on requires/provides lines in + * components, or in uses/defines lines in interfaces. + * + * FIXME: For "provides", we should really use the actual declaration + * of the function, since that will have the descriptive text. For + * "requires", there probably won't be any(?) + * + * NOTE: for interfaces, the descriptive text should be with this + * variable_decl (there's nowhere else for it to be). + **/ +typedef enum { + short_desc = 0x0001, + long_desc = 0, + + in_component = 0x0002, + in_interface = 0, +} function_flag; + +static void print_function_html(function_decl fd, data_decl dd, variable_decl vd, function_flag flags) +{ + char *sdoc = NULL; + char *ldoc = NULL; + char *ifile = NULL; + location loc = NULL; + + // set up the description pointers + if( fd ) { + sdoc = (char *)fd->ddecl->doc.short_s; + ldoc = (char *)fd->ddecl->doc.long_s; + loc = fd->ddecl->doc.loc; + } else { + sdoc = (char *)vd->ddecl->doc.short_s; + ldoc = (char *)vd->ddecl->doc.long_s; + loc = vd->ddecl->doc.loc; + } + + + // if we're not in the interface, fetch the name of the interface file, for external refs + if( flags & in_component ) { + if( fd ) { + if( fd->ddecl->interface ) + ifile = interface_docfile_name(fd->ddecl->interface->itype->name); + } else { + // NOTE: if( !in_interface && !fd ), then this is a function + // from a requires/provides line in a component. In this case, + // there is no interface anyway, so we should leave this blank. + } + } + + // short desc: if there is a long description, link to it. Otherwise, link to the interface + if( flags & short_desc ) { + output("
  • \n"); + + + output(" "); print_func_return(fd,dd,vd); + + if(ldoc) {output(" \n");} + else if(ifile) {output(" \n");} + output(""); print_func_name(fd,dd,vd); output(""); + if(ldoc || ifile) output(" \n"); + + print_func_args(fd,dd,vd); output("\n"); + + if(sdoc) { + output(""); + output_docstring(sdoc,loc); + output("

    \n"); + } + output("\n"); + } + + // long desc: print the anchor. if we're in the component file, also link to the interface. + else { + output(" \n"); + + output("

    "); print_func_name(fd,dd,vd); output("

    \n"); + + output(" "); print_func_return(fd,dd,vd); + if(ifile) {output(" ");} + output(""); print_func_name(fd,dd,vd); output(""); + if(ifile) output(" \n"); + print_func_args(fd,dd,vd); + + assert(ldoc); // should have checked in the caller + output("

    "); + output_docstring(ldoc,loc); + output(""); + //output("


    \n"); + } + +} + + + +/** + * Print a nicer looking HTML banner + **/ +static inline void start_html_banner() { + output("\n"); + output("
    \n"); +} + +static inline void end_html_banner() { + output("
    \n"); +} +static void print_html_banner(const char *text) { + start_html_banner(); + output("%s",text); + end_html_banner(); +} + + +////////////////////////////////////////////////////////////////////// +// +// Connection graph functions +// +////////////////////////////////////////////////////////////////////// + + + +////////////////////////////////////////////////// +// tools for checking uniqueness of edges +// in the interface connection graph +////////////////////////////////////////////////// + +typedef struct iface_graph_entry { + endp req; + endp prov; +} *iface_graph_entry; + +#define iface_node_name( ep ) \ + ( ep->component ? \ + ep->component->ctype->name : \ + ( ep->function->container ? \ + ep->function->container->name : \ + ep->function->ast->location->filename)) + +static int iface_graph_compare(void *entry1, void *entry2) +{ + int ret; + iface_graph_entry e1 = (iface_graph_entry) entry1; + iface_graph_entry e2 = (iface_graph_entry) entry2; + + ret = strcmp(iface_node_name(e1->req), iface_node_name(e2->req)); + if(ret) return 0; + + ret = strcmp(iface_node_name(e1->prov), iface_node_name(e2->prov)); + if(ret) return 0; + + ret = strcmp(e1->req->interface->name, e2->req->interface->name); + return !ret; +} + +static unsigned long iface_graph_hash(void *entry) +{ + unsigned long rhash, phash, ihash; + iface_graph_entry e = (iface_graph_entry) entry; + + assert( iface_node_name(e->req) ); + assert( iface_node_name(e->prov) ); + assert( e->req->interface->name ); + + rhash = hash_str( iface_node_name(e->req) ); + phash = hash_str( iface_node_name(e->prov) ); + ihash = hash_str( e->req->interface->name ); + + return rhash ^ (phash<<1) ^ ihash; +} + + + + +static dhash_table new_iface_graph_table() { + return new_dhash_table(newregion(), 10, iface_graph_compare, iface_graph_hash); +} + + + + + +//static int fixme_graph_num = 1; + +static bool connection_already_printed(dhash_table table, + endp ep1, endp ep2, + endp *req, endp *prov) +{ + // FIXME: kludge, to try to get things working with parameterized interfaces + if(!ep1->component && !ep1->interface && ep1->function->interface) + ep1->interface = ep1->function->interface; + if(!ep2->component && !ep2->interface && ep2->function->interface) + ep2->interface = ep2->function->interface; + + + // sort out which is the "requires" side, and which is the "provides" side + // For interfaces: ep1 is req, ep2 is prov if connecting a command, + // the other way round if connecting an event + // For functions: the direction in the graph is always the one we want + if (ep1->interface) + { + if (ep1->function->ftype == function_command) + { + *req = ep1; + *prov = ep2; + } + else + { + *req = ep2; + *prov = ep1; + } + } + else + { + *req = ep1; + *prov = ep2; + } + + // special case: if the interface is empty, we always show the connection + if((*prov)->interface == NULL) { + assert( (*req)->interface == NULL ); + return FALSE; + } + + // special case: skip loopback edges, created by parameterized interfaces + if( !strcmp(iface_node_name(ep1),iface_node_name(ep2)) ) { + return TRUE; + } + + // see if this one has already been printed. This is done by checking a hashtable for the tripple of req,prov,iface + { + // create a table entry + iface_graph_entry e = ralloc(regionof(table), struct iface_graph_entry); + e->req = *req; + e->prov = *prov; + + // do the lookup + if( dhlookup(table,e) ) + return TRUE; + + // add the new item to the table + dhadd(table, e); + return FALSE; + } + +} + + + +/** + * Display the nodes in the graph, along w/ info on edges + **/ +static void print_cg_html(const char *component_name, const char *component_file_name, cgraph cg, bool app_graph) { + gnode n; + dhash_table table = NULL; + char *iface_dot, *func_dot; + char *iface_gif, *func_gif; + char *iface_cmap, *func_cmap; + FILE *iface_file, *func_file; + + char *text_only_name; + FILE *text_file; + + bool do_func_graph = FALSE; // FIXME: disable the function graph for now + + + // FIXME: increment graph num for debugging + /* + fixme_graph_num++; + fprintf(stderr, "%d.\n", fixme_graph_num); + */ + + // create filenames + if( app_graph ) { + iface_dot = doc_filename_with_ext(component_file_name,".app.if.dot"); + iface_gif = doc_filename_with_ext(component_file_name,".app.if.gif"); + iface_cmap = doc_filename_with_ext(component_file_name,".app.if.cmap"); + } else { + iface_dot = doc_filename_with_ext(component_file_name,".if.dot"); + iface_gif = doc_filename_with_ext(component_file_name,".if.gif"); + iface_cmap = doc_filename_with_ext(component_file_name,".if.cmap"); + } + + if( do_func_graph ) { + if( app_graph ) { + func_dot = doc_filename_with_ext(component_file_name,".app.func.dot"); + func_gif = doc_filename_with_ext(component_file_name,".app.func.gif"); + func_cmap = doc_filename_with_ext(component_file_name,".app.func.cmap"); + } else { + func_dot = doc_filename_with_ext(component_file_name,".func.dot"); + func_gif = doc_filename_with_ext(component_file_name,".func.gif"); + func_cmap = doc_filename_with_ext(component_file_name,".func.cmap"); + } + } + + text_only_name = doc_filename_with_ext(component_file_name,".text.html"); + + + // start the text output + { + text_file = fopen(text_only_name, "w"); + if( !text_file ) fatal("can't write text connection graph file '%s'", text_file); + + // print some additional HTML stuff, if we are linking in to this file externally + if( use_graphviz ) { + fprintf(text_file, "\n"); + fprintf(text_file, "Text Connection Graph: %s\n", component_name); + fprintf(text_file, "\n"); + fprintf(text_file, "

    Text Connection Graph: %s

    \n", component_name); + fprintf(text_file, "\n"); + } + + // start the output table + fprintf(text_file, "
    \n\n"); + } + + // start the dot output + if( use_graphviz ) { + char *graphviz_opts = "\n\ + rankdir=LR;\n\ + ratio=compress;\n\ + margin=\"0,0\";\n\ + ranksep=0.0005; \n\ + nodesep=0.1; \n\ + node [shape=ellipse style=filled fillcolor=\"#e0e0e0\"];\n\ + node [fontsize=10 height=.1 width=.1];\n\ + edge [fontsize=9 arrowsize=.8];\n\ +"; + + iface_file = fopen(iface_dot, "w"); + if( !iface_file ) fatal("can't write to dot file '%s'", iface_dot); + fprintf(iface_file, "digraph \"%s_if\" {%s", component_name, graphviz_opts); + fprintf(iface_file, " node [fontcolor=blue];\n"); + fprintf(iface_file, " edge [fontcolor=blue];\n"); + fprintf(iface_file, "\n"); + + if( do_func_graph ) { + func_file = fopen(func_dot, "w"); assert(func_file); + if( !func_file ) fatal("can't write to dot file '%s'", func_dot); + fprintf(func_file, "digraph \"%s_func\" {%s\n\n", component_name, graphviz_opts); + fprintf(func_file, " node [fontcolor=blue];\n"); + fprintf(func_file, " edge [fontcolor=blue];\n"); + fprintf(func_file, "\n"); + } + + } + + + // examine connections + graph_scan_nodes(n, cgraph_graph(cg)) + { + gedge e; + endp ep1, ep2; + ep1 = NODE_GET(endp, n); + + // out edges + graph_scan_out(e,n) { + ep2 = NODE_GET(endp, graph_edge_to(e)); + // assertions already done above + + // connection graph - all functions (input for /usr/bin/dot) + if( do_func_graph ) + { + // graphviz stuff + if( use_graphviz ) + { + // FIXME: print the node info (ie URLs) + + // print the edge info + fprintf(func_file, " %s -> %s [label = \"%s.%s\"];\n", + ep1->component ? ep1->component->ctype->name : "C_code", + ep2->component ? ep2->component->ctype->name : "C_code", + ep2->interface ? ep2->interface->itype->name : "C_code", + ep2->function->name); + } + + // text stuff + { + // FIXME: should we bother with text function graph? + } + } + + // connection graph - interfaces (input for /usr/bin/dot) + { + endp req, prov; + + // allocate a new hashtable for removing duplicates + if(table == NULL) { + table = new_iface_graph_table(); + } + + if( !connection_already_printed(table, ep1, ep2, &req, &prov) ) + { + // graphviz stuff + if( use_graphviz ) + { + // print the node info (ie URLs) + fprintf(iface_file, " %s [URL=\"%s\"];\n", + iface_node_name(req), + component_docfile_name( iface_node_name(req) )); + fprintf(iface_file, " %s [URL=\"%s\"];\n", + iface_node_name(prov), + component_docfile_name( iface_node_name(prov) )); + + // edge info + fprintf(iface_file, " %s -> %s [", + iface_node_name( req ), + iface_node_name( prov )); + if(req->interface) { + if(prov->interface && req->interface->required == prov->interface->required) + fprintf(iface_file, " style=dashed"); + fprintf(iface_file, " label=\"%s\" URL=\"%s\"", + prov->interface->itype->name, + interface_docfile_name(prov->interface->itype->name)); + } else { + fprintf(iface_file, " label=\"func:%s\" fontcolor=black", prov->function->name); + } + fprintf(iface_file, " ];\n"); + } + + // text stuff + // + // FIXME: probably better to sort these in some nice way. + // Perhaps a topological ordering startig from the main + // component, with a breadth-first display? + { + // row start + fprintf(text_file, "\n"); + + // requires side + fprintf(text_file, " \n"); + + // arrow + if(prov->interface && req->interface->required == prov->interface->required) + fprintf(text_file, " \n"); + else + fprintf(text_file, " \n"); + + // provides side + fprintf(text_file, " \n"); + + // row end + fprintf(text_file, "\n"); + } + + } + } + + + } + } + + // clean up the region + if(table) + deleteregion( regionof(table) ); + + + // finish up the graphviz output + if( use_graphviz ) { + // finish if file + fprintf(iface_file, "}\n"); + fclose(iface_file); + + + // finish func file + if( do_func_graph ) { + fprintf(func_file, "}\n"); + fclose(func_file); + } + + } + + // finish up the text output + { + fprintf(text_file, "
    %s.", + component_docfile_name( iface_node_name(req) ), + iface_node_name(req)); + if(req->interface) + fprintf(text_file, "%s", + interface_docfile_name(req->interface->itype->name), + req->interface->itype->name); + else + fprintf(text_file, "%s",req->function->name); + fprintf(text_file, " =  -> %s.", + component_docfile_name( iface_node_name(prov) ), + iface_node_name(prov)); + if(req->interface) + fprintf(text_file, "%s", + interface_docfile_name(prov->interface->itype->name), + prov->interface->itype->name); + else + fprintf(text_file, "%s",prov->function->name); + fprintf(text_file, "
    \n
    \n\n"); + fprintf(text_file, "
    Generated by nesdoc
    \n"); + if( use_graphviz ) { + fprintf(text_file, "\n"); + fprintf(text_file, "\n"); + } + fclose(text_file); + } + + + // use dot to generate output + if( use_graphviz ) + { + char cmd[1024]; + int ret; + memset(cmd, 0, sizeof(cmd)); + + // FIXME: error handling could be better here + ret = snprintf(cmd,sizeof(cmd)-1,"dot -Tgif -o%s %s", iface_gif, iface_dot); assert(ret > 0); + ret = system(cmd); + if(ret == -1) + fatal("ERROR: error running graphviz - please check your graphviz and font installations..\n"); + ret = snprintf(cmd,sizeof(cmd)-1,"dot -Tcmap -o%s %s", iface_cmap, iface_dot); assert(ret > 0); + ret = system(cmd); + if(ret == -1) fatal("error running graphviz command:\n %s\n",cmd); + + if( do_func_graph ) { + ret = snprintf(cmd,sizeof(cmd)-1,"dot -Tgif -o%s %s", func_gif, func_dot); assert(ret > 0); + ret = system(cmd); assert(ret != -1); + if(ret == -1) + fatal("ERROR: error running graphviz - please check your graphviz and font installations..\n"); + ret = snprintf(cmd,sizeof(cmd)-1,"dot -Tcmap -o%s %s", func_cmap, func_dot); assert(ret > 0); + ret = system(cmd); + if(ret == -1) fatal("error running graphviz command:\n %s\n",cmd); + } + } + + // add the HTML + if( use_graphviz ) { + start_html_banner(); + output("

    Component Graph   "); + output("(text version,",text_only_name); + output("   help)

    \n"); + end_html_banner(); + + // FIXME: add a link to the function graph page here. + output("
    \n"); + + output("\n"); + copy_file_to_output(iface_cmap); + output("\n"); + output("
    \n", iface_gif); + } + else { + // just copy in the text output, if we aren't generating graphs + print_html_banner("

    Component Graph

    "); + output("
    \n"); + copy_file_to_output(text_only_name); + unlink(text_only_name); + output("
    \n"); + } + + if( do_func_graph ) { + // FIXME: this stuff should all go to a seperate function graph HTML page + print_html_banner("

    Component Function Graph

    "); + + output("\n"); + copy_file_to_output(func_cmap); + output("\n"); + output("
    \n", func_gif); + } + + // remove temp files + //unlink(iface_dot); + unlink(iface_cmap); + //unlink(func_dot); + unlink(func_cmap); + +} + + + + + + + +////////////////////////////////////////////////////////////////////// +// +// Main routine for creating docs for a component +// +////////////////////////////////////////////////////////////////////// + +static void generate_component_html(nesc_declaration cdecl) +{ + FILE *outfile; + component comp = CAST(component, cdecl->ast); + + // open the appropriate output file + outfile = open_outfile( component_docfile_name(cdecl->name) ); + + + // start the HTML + { + char *sourcelink = doc_filename_with_ext(cdecl->ast->location->filename, ".source"); + char *sourcetext = doc_filename_with_ext(cdecl->ast->location->filename, ""); + + add_source_symlink(cdecl->ast->location->filename, sourcelink); + + output("\n\ +\n\ +\n\ +Component: %s\n\ +\n\ +\n\ +", cdecl->name); + + print_navbar(outfile, NAV_OTHER, sourcelink, sourcetext); + + output("\n\ +

    Component: %s

    \n\ +", cdecl->name); + } + + // print the overview documentation + if( cdecl->doc.short_s ) { + output("

    \n"); + if(cdecl->doc.long_s) output_docstring((char *)cdecl->doc.long_s, cdecl->ast->location); + else output_docstring((char *)cdecl->doc.short_s, cdecl->ast->location); + output("\n

    \n\n"); + } + + + // module declaration (requires / provides stuff) + if( comp->decls ) + { + rp_interface rp; + declaration dlist, decl; + interface_ref iref; + bool header_printed = FALSE; + + + // requires + scan_declaration(dlist, comp->decls) { + if(is_rp_interface(dlist) && + (rp = CAST(rp_interface, dlist))->required ) { + + scan_declaration(decl,rp->decls) { + // commands / events + if( is_data_decl(decl) ) { + data_decl dd = CAST(data_decl, decl); + variable_decl vd; + scan_variable_decl(vd, CAST(variable_decl,dd->decls)) { + if(!header_printed) {print_html_banner("

    Require Interfaces

    "); output("
      \n"); header_printed=TRUE;} + print_function_html(NULL, dd, vd, short_desc|in_component); + } + } + + // interfaces + else if( is_interface_ref(decl) ) { + if(!header_printed) {print_html_banner("

      Required Interfaces

      "); output("
        \n"); header_printed=TRUE;} + iref = CAST(interface_ref,decl); + output("
      • %s %s\n", + interface_docfile_name(iref->word1->cstring.data), + iref->word1->cstring.data, + iref->word2 ? iref->word2->cstring.data : ""); + } + + // everything else is an error + else { + AST_print( CAST(node,cdecl->ast) ); + assert(0); + } + } + } + } + if(header_printed) output("
      \n\n"); + + // provides + header_printed = FALSE; + scan_declaration(dlist, comp->decls) { + if(is_rp_interface(dlist) && + !(rp = CAST(rp_interface, dlist))->required ) { + scan_declaration(decl,rp->decls) { + // commands / events + if( is_data_decl(decl) ) { + data_decl dd = CAST(data_decl, decl); + variable_decl vd; + scan_variable_decl(vd, CAST(variable_decl,dd->decls)) { + if(!header_printed) {print_html_banner("

      Provided Interfaces

      "); output("
        \n"); header_printed=TRUE;} + print_function_html(NULL, dd, vd, short_desc|in_component); + } + } + + // interfaces + else if( is_interface_ref(decl) ) { + if(!header_printed) {print_html_banner("

        Provided Interfaces

        "); output("
          \n"); header_printed=TRUE;} + iref = CAST(interface_ref,decl); + output("
        • %s %s\n", + interface_docfile_name(iref->word1->cstring.data), + iref->word1->cstring.data, + iref->word2 ? iref->word2->cstring.data : ""); + } + + // everything else is an error + else { + AST_print( CAST(node,cdecl->ast) ); + assert(0); + } + } + } + } + if(header_printed) output("
        \n\n"); + + } + + + // configuration (aka wiring) + if( is_configuration(cdecl->impl) ) + { + print_cg_html(cdecl->name, + CAST(component, cdecl->ast)->location->filename, + cdecl->connections, + FALSE); + } + + // otherwise, we have a module (aka function defs) + else if (is_module(cdecl->impl)) + { + module mod = CAST(module, cdecl->impl); + declaration decl; + bool printed_heading; + bool first; + + // print variable descriptions + printed_heading = FALSE; + scan_declaration(decl, mod->decls) { + // deal with single variable decls - I don't know if this ever happens.... + if( is_variable_decl(decl) ) + //print_short_variable_html( CAST(variable_decl,decl) ); + assert(0); + + // deal with lists of variable decls + else if( is_data_decl(decl) ) { + data_decl dd = CAST(data_decl,decl); + declaration d2; + scan_declaration(d2, dd->decls) + if( is_variable_decl(d2) ) { + if(!printed_heading) {print_html_banner("

        Variables

        "); output("
          \n"); printed_heading=TRUE;} + print_short_variable_html( dd, CAST(variable_decl,d2) ); + } + } + } + if(printed_heading) output("
        \n\n"); + + + + // print short function descriptions + printed_heading = FALSE; + scan_declaration(decl, mod->decls) { + if( is_function_decl(decl) ) { + if(!printed_heading) {print_html_banner("

        Function Index

        "); output("
          \n"); printed_heading=TRUE;} + print_function_html(CAST(function_decl,decl), NULL, NULL, in_component|short_desc); + } + } + if(printed_heading) output("
        \n\n"); + + + // print long function descriptions + printed_heading = FALSE; + first = TRUE; + scan_declaration(decl, mod->decls) { + if( is_function_decl(decl) && has_long_desc(CAST(function_decl,decl),NULL,NULL) ) { + if(!printed_heading) {print_html_banner("

        Function Descriptions

        \n"); printed_heading=TRUE;} + if( !first ) output("
        \n"); + print_function_html(CAST(function_decl,decl), NULL, NULL, in_component|long_desc); + first = FALSE; + } + } + + } + + + close_outfile(outfile); +} + + +static void generate_intf_function_list(const char *heading, + nesc_declaration idecl, + int kind, int flags) +{ + declaration funcs = CAST(interface, idecl->ast)->decls; + declaration f; + bool printed_heading = FALSE; + + // commands + scan_declaration(f,funcs) { + data_decl dd = CAST(data_decl, f); + variable_decl vd; + + scan_variable_decl(vd, CAST(variable_decl,dd->decls)) { + if( vd->ddecl->ftype == kind ) { + if( flags & short_desc || has_long_desc(NULL,dd,vd) ) { + if(!printed_heading) { + print_html_banner(heading); + if(flags & short_desc) output("
          \n"); + printed_heading=TRUE; + } else { + if( !(flags & short_desc) ) + output("
          \n"); + } + print_function_html(NULL,dd,vd,in_interface|flags); + } + } + } + } + if(printed_heading && flags & short_desc) output("
        \n"); +} + +////////////////////////////////////////////////// +// generate HTML for an interface file +////////////////////////////////////////////////// +static void generate_interface_html(nesc_declaration idecl) +{ + FILE *outfile; + + // open the output file + outfile = open_outfile( interface_docfile_name(idecl->name) ); + + + // start the HTML + { + char *sourcelink = doc_filename_with_ext(idecl->ast->location->filename, ".source"); + char *sourcetext = doc_filename_with_ext(idecl->ast->location->filename, ""); + + add_source_symlink(idecl->ast->location->filename, sourcelink); + + output("\n\ +\n\ +\n\ +Interface: %s\n\ +\n\ +\n\ +", idecl->name); + + print_navbar(outfile, NAV_OTHER, sourcelink, sourcetext); + + output("\n\ +

        Interface: %s

        \n\ +", idecl->name); + } + if( idecl->doc.short_s ) { + output("

        \n"); + if(idecl->doc.long_s) output_docstring((char *)idecl->doc.long_s, idecl->ast->location); + else output_docstring((char *)idecl->doc.short_s, idecl->ast->location); + output("\n

        \n\n"); + } + + // print cross refs + { + int i; + char *name, *end; + ic_entry *entry = ic_get_entry( ic_make_iface_key(idecl->name) ); + assert(entry); + if(entry->p_list.num > 0) { + output("

        \n
        Components providing this interface:\n
        \n"); + for(i=0; ip_list.num; i++) { + name = entry->p_list.comp[i]; + output(" ",name); + end = strstr(name,".nc"); assert(end); + *end = '\0'; + output("%s
        \n",name); + *end = '.'; + } + output("

        \n\n"); + } + if(entry->r_list.num > 0) { + output("

        \n
        Components requiring this interface:\n
        \n"); + for(i=0; ir_list.num; i++) { + name = entry->r_list.comp[i]; + output(" ",name); + end = strstr(name,".nc"); assert(end); + *end = '\0'; + output("%s
        \n",name); + *end = '.'; + } + output("

        \n\n"); + } + } + + // summary + generate_intf_function_list("

        Commands

        ", + idecl, function_command, short_desc); + generate_intf_function_list("

        Events

        ", + idecl, function_event, short_desc); + + // detailed descriptions + generate_intf_function_list("

        Commands - Details

        ", + idecl, function_command, long_desc); + generate_intf_function_list("

        Events - Details

        ", + idecl, function_event, long_desc); + + close_outfile(outfile); +} + + +////////////////////////////////////////////////// +// Create index files +////////////////////////////////////////////////// + +typedef struct _index_entry { + char *name; + char *path; + char *fname; // for interfaces: path.name.ti.html + // for components: path.name.td.html + // for apps: name.app.html +} index_entry; + + +typedef struct { + int num; + index_entry *ent; +} file_index; + + +/** + * compare two entries - used by qsort + **/ +static int index_entry_comparator_short(const void *va, const void *vb) { + int ret; + index_entry *a = (index_entry*) va; + index_entry *b = (index_entry*) vb; + + ret = strcmp(a->name, b->name); + if(ret) return ret; + + return strcmp(a->path, b->path); +} +static int index_entry_comparator_full(const void *va, const void *vb) { + int ret; + index_entry *a = (index_entry*) va; + index_entry *b = (index_entry*) vb; + + ret = strcmp(a->path, b->path); + if(ret) return ret; + + return strcmp(a->name, b->name); +} + + +/** + * add an entry to the list + **/ +static void insert_entry(file_index *fi, char *docfile, char *suffix) { + char *p; + index_entry *e = &( fi->ent[fi->num++] ); + + // path + e->path = rstralloc(doc_region, strlen(docfile)+1); + strcpy(e->path, docfile); + + // chop off the suffix + p = e->path + strlen(e->path) - strlen(suffix); + assert( *p == '.' ); + *p = '\0'; p--; + + // separate out the name. We special case for common source file extensions. + while(p > e->path && *p != '.') p--; + if( !strcmp(p,".nc") || !strcmp(p,".td") || !strcmp(p,".ti") || !strcmp(p,".h") || !strcmp(p,".c") ) { + p--; + while(p > e->path && *p != '.') p--; + } + + if(p == e->path) + e->name = e->path; + else { + *p = '\0'; + e->name = p+1; + } + + // file name + e->fname = rstralloc(doc_region, strlen(docfile)+1); + strcpy(e->fname, docfile); +} + + +/** + * generate the index file + **/ +typedef enum { + SORT_FILE = 1, + SORT_PATH = 2 +} index_sort_type; + +static void print_index_file(navbar_mode nmode, index_sort_type sort, file_index *ind) +{ + int i; + FILE *f; + char *filename; + char *title, *indexname, *sort_heading; + + // set up some shorthand, based on mode + if(nmode == NAV_INT) { + indexname = "interfaces"; + title = "Interface Index"; + sort_heading = "interface"; + } else if(nmode == NAV_COMP) { + indexname = "components"; + title = "Component Index"; + sort_heading = "component"; + } else if(nmode == NAV_APP) { + indexname = "apps"; + title = "Application Index"; + sort_heading = "app"; + } else if(nmode == NAV_ALL) { + indexname = "allfiles"; + title = "All File Index"; + sort_heading = "file"; + } else { + assert(0); + } + + + // create the file name, & open the file + filename = rstralloc(doc_region, strlen(indexname) + strlen("_f.html") + 1); + assert(filename); + strcpy(filename, indexname); + if( sort == SORT_FILE ) + strcat(filename, "_f.html"); + else + strcat(filename, "_p.html"); + + // open the file + f = fopen(filename, "w"); + if( !f ) fatal("can't write to index file '%s'",f); + + // start the HTML + fprintf(f, "\n"); + fprintf(f, "%s\n", title); + fprintf(f, "\n"); + + + // add a navigation banner + print_navbar(f, nmode, NULL, NULL); + + + // title, and table tags + fprintf(f, "

        %s

        \n", title); + fprintf(f, "
        \n"); + fprintf(f, "\n"); + + + // add the sorting links + fprintf(f, "\n"); + if(sort == SORT_FILE) { + fprintf(f, "\n", indexname); + fprintf(f, "\n"); + fprintf(f, "\n", sort_heading); + fprintf(f, "\n"); + fprintf(f, "\n"); + } else { + fprintf(f, "\n"); + fprintf(f, "\n"); + fprintf(f, "\n", indexname, sort_heading); + fprintf(f, "\n"); + fprintf(f, "\n"); + } + fprintf(f, "\n"); + + + // blank line + fprintf(f, "\n"); + fprintf(f, " \n"); + fprintf(f, " \n"); + fprintf(f, " \n"); + fprintf(f, " \n"); + fprintf(f, " \n"); + fprintf(f, "\n"); + + // index + for(i=0; inum; i++) { + char *desc = ic_get_desc(ind->ent[i].fname); + if(desc==NULL) desc = " "; + if(sort == SORT_FILE) { + fprintf(f, "\n"); + fprintf(f, " \n", ind->ent[i].fname, ind->ent[i].path); + fprintf(f, " \n"); + fprintf(f, " \n", ind->ent[i].name); + fprintf(f, " \n"); + fprintf(f, " \n",desc); + fprintf(f, "\n"); + } else { + // new path - print a blank line for all but the 'apps' page + if(i>0 && strcmp(ind->ent[i].path, ind->ent[i-1].path) && nmode!=NAV_APP) { + fprintf(f, "\n"); + fprintf(f, " \n"); + fprintf(f, " \n"); + fprintf(f, " \n"); + fprintf(f, " \n"); + fprintf(f, " \n"); + fprintf(f, "\n"); + } + fprintf(f, "\n"); + fprintf(f, " \n", (i>0 && !strcmp(ind->ent[i].path, ind->ent[i-1].path)) ? " " : ind->ent[i].path); + fprintf(f, " \n"); + fprintf(f, " \n", ind->ent[i].fname, ind->ent[i].name); + fprintf(f, " \n"); + fprintf(f, " \n",desc); + fprintf(f, "\n"); + } + } + + + // cleanup + fprintf(f, "
        path   %s   descriptionpath   %s   description
             
        %s %s %s
             
        %s %s %s
        \n"); + fprintf(f, "
        \n"); + fprintf(f, "
        Generated by nesdoc
        \n"); + fprintf(f, "\n"); + fprintf(f, "\n"); + fclose(f); +} + + +static void print_hierarchical_index_file(const char *filename, file_index *ind) +{ + FILE *f = fopen(filename,"w"); + char *title = "Source Tree"; + char *prevdir; + int i,j,level; + + if( !f ) fatal("can't write to hierarchical index file '%s'",filename); + + fprintf(f, "\n"); + fprintf(f, "%s\n", title); + fprintf(f, "\n"); + + // add a navigation banner + print_navbar(f, NAV_TREE, NULL, NULL); + + // title, and table tags + fprintf(f, "

        %s

        \n", title); + fprintf(f, "
        \n"); + fprintf(f, "\n"); + + + // listing + prevdir = ""; + for(i=0; inum; i++) { + // print directory info, if necessary + if( strcmp(prevdir,ind->ent[i].path) ) { + char *a, *b, *dot; + + // find the common prefix + level = 0; + a = prevdir; + b = ind->ent[i].path; + while(*a == *b) { + a++; + b++; + if(*b == '.') level++; + } + while(b > ind->ent[i].path && *b != '.') b--; + if(*b == '.') b++; + + // print the dir headers + do { + dot = strchr(b,'.'); + if(dot != NULL) *dot = '\0'; + + fprintf(f, "\n"); + + if(dot != NULL) *dot = '.'; + b = dot+1; + level++; + } while(dot != NULL); + + prevdir = ind->ent[i].path; + } + + // print the link + fprintf(f, "\n"); + } + + + // cleanup + fprintf(f, "
        \n"); + for(j=0; j\n", b); + fprintf(f, "
        \n"); + for(j=0; j%s\n", ind->ent[i].fname, ind->ent[i].name); + fprintf(f, "
        \n"); + fprintf(f, "
        \n"); + fprintf(f, "
        Generated by nesdoc
        \n"); + fprintf(f, "\n"); + fprintf(f, "\n"); + fclose(f); +} + + + +/** + * Read through the doc directory, and generate appropriate index + * files. The indices are sorted by the base interface or component + * name. In cases in which there are multiple versions of a file (ie, + * for different hardware), seperate links are given for each path. + **/ + + +static void generate_index_html() { + file_index comp, iface, app, allfiles; + + // read the directory, and sort the entries + { + DIR *dir; + + // open the dir + dir = opendir("."); + if( !dir ) fatal("can't open directory '.'"); + + // allocate space + { + int nument = 0; + while( readdir(dir) ) nument++; + rewinddir(dir); + + iface.ent = rarrayalloc(doc_region, nument, index_entry); + comp.ent = rarrayalloc(doc_region, nument, index_entry); + app.ent = rarrayalloc(doc_region, nument, index_entry); + allfiles.ent = rarrayalloc(doc_region, nument, index_entry); + + iface.num = 0; + comp.num = 0; + app.num = 0; + allfiles.num = 0; + } + + // scan dir + { + struct dirent *dent; + + while( (dent=readdir(dir)) != NULL ) { + char *p; + + // find the second from the last "." + p = dent->d_name + strlen(dent->d_name) - 1; + while(p > dent->d_name && *p != '.') p--; + p--; + while(p > dent->d_name && *p != '.') p--; + + // add to the appropriate list + if( !strcmp(p,".nc.html") ) { + if( ic_is_iface(dent->d_name) ) + insert_entry(&iface, dent->d_name, ".nc.html"); + else + insert_entry(&comp, dent->d_name, ".nc.html"); + insert_entry(&allfiles, dent->d_name, ".html"); + continue; + } + + // scan back one more, for app files + p--; + while(p > dent->d_name && *p != '.') p--; + if( !strcmp(p,".nc.app.html") ) { + insert_entry(&app, dent->d_name, ".nc.app.html"); + } + } + } + } + + // Generate index files, sorted by short name + { + // sort + qsort(iface.ent, iface.num, sizeof(index_entry), index_entry_comparator_short); + qsort(comp.ent, comp.num, sizeof(index_entry), index_entry_comparator_short); + qsort(app.ent, app.num, sizeof(index_entry), index_entry_comparator_short); + qsort(allfiles.ent, allfiles.num, sizeof(index_entry), index_entry_comparator_short); + + // index files + print_index_file(NAV_INT, SORT_FILE, &iface); + print_index_file(NAV_COMP, SORT_FILE, &comp); + print_index_file(NAV_APP, SORT_FILE, &app); + print_index_file(NAV_ALL, SORT_FILE, &allfiles); + } + + // generate index files, sorted by long name + { + // sort + qsort(iface.ent, iface.num, sizeof(index_entry), index_entry_comparator_full); + qsort(comp.ent, comp.num, sizeof(index_entry), index_entry_comparator_full); + qsort(app.ent, app.num, sizeof(index_entry), index_entry_comparator_full); + qsort(allfiles.ent, allfiles.num, sizeof(index_entry), index_entry_comparator_full); + + // index files + print_index_file(NAV_INT, SORT_PATH, &iface); + print_index_file(NAV_COMP, SORT_PATH, &comp); + print_index_file(NAV_APP, SORT_PATH, &app); + print_index_file(NAV_ALL, SORT_PATH, &allfiles); + } + + + // hierarchical, top-level index file + qsort(allfiles.ent, allfiles.num, sizeof(index_entry), index_entry_comparator_full); + print_hierarchical_index_file("index.html", &allfiles); + +} + + + +////////////////////////////////////////////////// +// Create whole-app description page +////////////////////////////////////////////////// +static void generate_app_page(const char *filename, cgraph cg) +{ + char *appname, *p; + char *fname; + FILE *f; + + // return if app file generation wasn't explicity requested + if( !is_app ) + return; + + // return, if the component is NULL + if( cg == NULL ) + return; + + // figure out the app name from the main file name + appname = doc_filename_with_ext(filename, ""); + p = appname + strlen(appname) - 1; + while(p > appname && *p != '.') p--; + *p = '\0'; + while(p > appname && *p != '.') p--; + if(*p == '.') p++; + appname = p; + + + // generate the file + fname = doc_filename_with_ext(filename, ".app.html"); + f = open_outfile(fname); + + fprintf(f, "\n"); + fprintf(f, "App: %s\n", appname); + fprintf(f, "\n"); + + print_navbar(f, NAV_OTHER, NULL, NULL); + + fprintf(f, "

        App: %s

        \n", appname); + + + + + print_cg_html(appname, filename, cg, TRUE); + fprintf(f, "
        Generated by nesdoc
        \n"); + fprintf(f, "\n"); + fprintf(f, "\n"); + + close_outfile(f); + +} + + +////////////////////////////////////////////////// +// Generate connection graph help page +////////////////////////////////////////////////// +#include "cg_help.c" +static void generate_cg_help_page() +{ + FILE *f; + + // open the gif file + f = fopen("cg_help.gif", "w"); + if( !f ) { + warning("can't write to cg_help.gif - no help generated"); + return; + } + fwrite(cg_help_gif, 1, sizeof(cg_help_gif), f); + fclose(f); + + + // open the HTML file + f = fopen("cg_help.html", "w"); + if( !f ) { + warning("can't write to cg_help.gif - no help generated"); + return; + } + + // markmark + fprintf(f, "\n"); + fprintf(f, "Connection Graph Help\n"); + fprintf(f, "\n"); + print_navbar(f, NAV_OTHER, NULL, NULL); + fprintf(f, "

        Connection Graph Help

        \n"); + + fprintf(f, "\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +
        \n\ +\n\ +   \n\ +\n\ +
          \n\ +\n\ +
        • A requires interface I, B provides I, and A and B are wired\n\ +together.

          \n\ +\n\ +

        • C and D both require or both provide J. The direction of the\n\ +arrow indicates that the original wiring is \"C = D\".

          \n\ +\n\ +

        • E requires function f, and F provides function f.

          \n\ +\n\ +

        \n\ +
        \n\ +

        \n\ +\n\ +\n\ +\n\ +"); + fclose(f); + +} + + +////////////////////////////////////////////////// +// Generate all docs +////////////////////////////////////////////////// + +bool docs_requested(void) +{ + return docdir != NULL; +} + +void generate_docs(const char *ofilename, cgraph cg) +{ + char *filename = rstrdup(doc_region, ofilename); + + unixify_path(filename); + + // if no docdir is specified, then the user didn't request doc generation + // Initialization + { + // create the region + init_doc_region(); + + // get the current working directory + assert(getcwd(original_wd, sizeof(original_wd))); + + // set up dir info + find_currdir_prefix(original_wd); + + // cd to the docdir + { + char *pos=strchr(docdir, dirsep); + if(pos == docdir) pos=strchr(docdir+1, dirsep); // skip the first '/' of an absolute path + while(pos != NULL) { + *pos = '\0'; + +#ifndef ENOMEDIUM + /* Ignore ENOMEDIUM on systems that don't have it */ +#define ENOMEDIUM EEXIST +#endif + + if(mkdir(docdir, 0755) != 0 && errno != EEXIST && errno != ENOMEDIUM) { + perror("mkdir"); + fatal("error making ancestor directory of docdir '%s'. errno=%d\n", docdir,errno); + } + *pos = dirsep; + pos = strchr(pos+1, dirsep); + } + } + if(mkdir(docdir, 0755) != 0 && errno != EEXIST && errno != ENOMEDIUM) { + perror("mkdir"); + fatal("error making parent directory of docdir '%s'. errno=%d\n", docdir,errno); + } + if(chdir(docdir) != 0) { + perror("chdir"); + fatal("error changing directory to docdir '%s'\n", docdir); + } + + // read the information cache + ic_read(); + } + + // generate the connection graph help file + generate_cg_help_page(); + + + // update information cache with all loaded components + { + env_scanner scanner; + const char *name; + nesc_declaration decl; + + env_scan(get_nesc_env(), &scanner); + while( env_next(&scanner, &name, (void **)&decl) ) + ic_add_entry(decl); + + // write the information cache + ic_write(); + } + + + // walk through the list of all components, and generate docs + { + env_scanner scanner; + const char *name; + nesc_declaration cdecl; + + if (flag_verbose) printf("\n Generating component docs\n"); + env_scan(get_nesc_env(), &scanner); + while( env_next(&scanner, &name, (void **)&cdecl) ) + if (cdecl->kind == l_component) { + if (flag_verbose) printf(" %s\n", cdecl->name); + generate_component_html(cdecl); + } + } + + // generate docs for all interfaces + { + env_scanner scanner; + const char *name; + nesc_declaration idecl; + + if (flag_verbose) printf("\n Generating interface docs\n"); + env_scan(get_nesc_env(), &scanner); + while( env_next(&scanner, &name, (void **)&idecl) ) + if (idecl->kind == l_interface) { + if (flag_verbose) printf(" %s\n", idecl->name); + generate_interface_html(idecl); + } + } + + // generate whole-app wiring page + generate_app_page(filename,cg); + + + // generate index files + generate_index_html(); + + + // cleanup + { + // kill the region + // NOTE: using the region this way makes this module non-reentrant + deleteregion(doc_region); + doc_region = NULL; + + assert(chdir(original_wd) == 0); + } +} diff --git a/src/nesc-doc.h b/src/nesc-doc.h new file mode 100644 index 0000000..238dcb7 --- /dev/null +++ b/src/nesc-doc.h @@ -0,0 +1,44 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 UC Berkeley + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef NESC_DOC_H +#define NESC_DOC_H + +#include "nesc-cg.h" + + +/* set the output dir */ +void doc_set_outdir(const char *dir); + +/* Add a top level source directory */ +void doc_add_topdir(const char *dir); + +/* Set the directory separator - used for cygwin? */ +void doc_set_dirsep(const char c); + +/* set the use_graphviz flag */ +void doc_use_graphviz(const bool use); + +bool docs_requested(void); + +/* actually generate docs */ +void generate_docs(const char *filename, cgraph cg); + +/* tell the doc generation to create the whole-app page */ +void doc_is_app(const bool val); + +#endif diff --git a/src/nesc-dspec-int.h b/src/nesc-dspec-int.h new file mode 100644 index 0000000..d03a409 --- /dev/null +++ b/src/nesc-dspec-int.h @@ -0,0 +1,41 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef NESC_DSPEC_INT_H +#define NESC_DSPEC_INT_H + +/* Internal definitions for dump specification parsing */ + +struct ndstype { + largest_int integer; + union { + const char *token; + nd_arg nd_arg; + nd_filter nd_filter; + }; +}; + +#define YYSTYPE struct ndstype + +void nd_read(const char *str); +void nderror(char *err); + +#include "nesc-dspec.tab.h" + +int ndlex(void); + +#endif diff --git a/src/nesc-dspec.def b/src/nesc-dspec.def new file mode 100644 index 0000000..da8f486 --- /dev/null +++ b/src/nesc-dspec.def @@ -0,0 +1,60 @@ +;; -*- lisp -*- + +; This file is part of the nesC compiler. +; Copyright (C) 2004-2005 Intel Corporation +; +; The attached "nesC" software is provided to you under the terms and +; conditions of the GNU General Public License Version 2 as published by the +; Free Software Foundation. +; +; nesC 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 nesC; see the file COPYING. If not, write to +; the Free Software Foundation, 59 Temple Place - Suite 330, +; Boston, MA 02111-1307, USA. + +(deffield name "const char *" (init)) +(deffield str "const char *" (init)) +(deffield val largest_int (init)) +(deffield count int (init)) +(deffield args nd_arg (init tree)) +(deffield next nd_arg ()) +(deffield filter1 nd_filter (init tree)) +(deffield filter2 nd_filter (init tree)) +(deffield info "void *" ()) +(deffield filter_index int ()) + +(deftype nd_option nil (name args count) + "the dump option NAME(ARGS). +ARGS may be NULL +COUNT is the number of elements in ARGS") + +(deftype nd_arg nil (next) + "supertype for arguments") + +(deftype nd_int nd_arg (val) + "an integer argument VAL") + +(deftype nd_token nd_arg (str) + "some token argument STR") + +(deftype nd_filter nd_arg () + "a filter") + +(deftype ndf_and nd_filter (filter1 filter2) + "FILTER1 & FILTER2") + +(deftype ndf_or nd_filter (filter1 filter2) + "FILTER1 | FILTER2") + +(deftype ndf_not nd_filter (filter1) + "!FILTER1") + +(deftype ndf_op nd_filter (name args count info filter_index) + "the basic filter NAME(ARGS). +COUNT is the number of elements in ARGS (>= 1) +INFO can be used to save extra information (e.g., compiled regexp info)") diff --git a/src/nesc-dspec.h b/src/nesc-dspec.h new file mode 100644 index 0000000..c94f5a2 --- /dev/null +++ b/src/nesc-dspec.h @@ -0,0 +1,35 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef NESC_DSPEC_H +#define NESC_DSPEC_H + +#include "ND_types.h" +#include "ND_list_nd_arg.h" +#include "ND_defs.h" + +nd_option nd_parse(const char *what); +/* Effects: parses -fnesc-dump option argument 'what', + Return: the corresponding dump tree (see nesc-dspec.def) +*/ + +const char *nd_tokenval(nd_arg arg); +/* Requires: nd_arg is an nd_token + Returns: the token's string value +*/ + +#endif diff --git a/src/nesc-dspec.l b/src/nesc-dspec.l new file mode 100644 index 0000000..fae9a1d --- /dev/null +++ b/src/nesc-dspec.l @@ -0,0 +1,115 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +/* Lexer for -fnesc-dump arguments (tokens are numbers, names (can be + arbitrary strings in "") and boolean operators */ + +%option nounput + +%{ +#include +#include +#include +#include "parser.h" +#include "nesc-dump.h" +#include "nesc-dspec.h" +#include "nesc-dspec-int.h" + +/* We never wrap into another file */ +#define YY_SKIP_YYWRAP +#define ndwrap() (1) + +#define YY_USE_PROTOS + +#undef YY_INPUT +#define YY_INPUT(buf, result, max_size) \ + { (result) = string_read((buf), (max_size)); } +static int string_read(char *buf, int max_size); +void nderror(char *err); + +%} + +DIGIT [0-9] +HEXDIGIT [0-9a-fA-F] + +%% + +[ \t] { } +[,()|&!] { return ndtext[0]; } +-?({DIGIT}+|0[xX]{HEXDIGIT}+) { + errno = 0; + ndlval.integer = strtoll(ndtext, NULL, 0); + if (errno) + nderror("integer constant out of bounds."); + return ND_INTEGER; + } +\"([^\\"]*(\\.)?)+\" { + char *str = rstralloc(dump_region, strlen(ndtext)); + const char *text = ndtext + 1; + + ndlval.token = str; + while (*text) + { + /* Shell-like \-processing: \ is preserved except + in front of " and \ */ + if (*text == '\\' && (text[1] == '"' || text[1] == '\\')) + text++; + *str++ = *text++; + } + str[-1] = '\0'; + return ND_TOKEN; + } +[^, \t()|&!]+ { + ndlval.token = rstrdup(dump_region, ndtext); + return ND_TOKEN; + } + +%% + +static YY_BUFFER_STATE mbuf; +static const char *line; +static int length, offset; + +void nd_read(const char *str) +{ + if (mbuf) + nd_delete_buffer(mbuf); + mbuf = nd_create_buffer(stdin, YY_BUF_SIZE); + + nd_switch_to_buffer(mbuf); + line = str; + offset = 0; + length = strlen(line); +} + +static int string_read(char *abuf, int max_size) +{ + int cnt; + + cnt = max_size; + if (cnt > length - offset) cnt = length - offset; + + memcpy(abuf, line + offset, cnt); + offset += cnt; + + return cnt; +} + +void nderror(char *err) +{ + error("dump option `%s': %s", line, err); +} diff --git a/src/nesc-dspec.tab.c b/src/nesc-dspec.tab.c new file mode 100644 index 0000000..94c4b93 --- /dev/null +++ b/src/nesc-dspec.tab.c @@ -0,0 +1,1626 @@ +/* A Bison parser, made by GNU Bison 2.3. */ + +/* Skeleton implementation for Bison's Yacc-like parsers in C + + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 + 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., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ + +/* As a special exception, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + +/* C LALR(1) parser skeleton written by Richard Stallman, by + simplifying the original so-called "semantic" parser. */ + +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +/* Identify Bison output. */ +#define YYBISON 1 + +/* Bison version. */ +#define YYBISON_VERSION "2.3" + +/* Skeleton name. */ +#define YYSKELETON_NAME "yacc.c" + +/* Pure parsers. */ +#define YYPURE 0 + +/* Using locations. */ +#define YYLSP_NEEDED 0 + +/* Substitute the variable and function names. */ +#define yyparse ndparse +#define yylex ndlex +#define yyerror nderror +#define yylval ndlval +#define yychar ndchar +#define yydebug nddebug +#define yynerrs ndnerrs + + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + ND_TOKEN = 258, + ND_INTEGER = 259 + }; +#endif +/* Tokens. */ +#define ND_TOKEN 258 +#define ND_INTEGER 259 + + + + +/* Copy the first part of user declarations. */ +#line 29 "nesc-dspec.y" + +#include "parser.h" +#include "nesc-dump.h" +#include "nesc-dspec.h" +#include "nesc-dspec-int.h" +#include "nesc-dfilter.h" + +static nd_option opt; + + +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE 0 +#endif + +/* Enabling the token table. */ +#ifndef YYTOKEN_TABLE +# define YYTOKEN_TABLE 0 +#endif + +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +typedef int YYSTYPE; +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 +#endif + + + +/* Copy the second part of user declarations. */ + + +/* Line 216 of yacc.c. */ +#line 132 "nesc-dspec.tab.c" + +#ifdef short +# undef short +#endif + +#ifdef YYTYPE_UINT8 +typedef YYTYPE_UINT8 yytype_uint8; +#else +typedef unsigned char yytype_uint8; +#endif + +#ifdef YYTYPE_INT8 +typedef YYTYPE_INT8 yytype_int8; +#elif (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +typedef signed char yytype_int8; +#else +typedef short int yytype_int8; +#endif + +#ifdef YYTYPE_UINT16 +typedef YYTYPE_UINT16 yytype_uint16; +#else +typedef unsigned short int yytype_uint16; +#endif + +#ifdef YYTYPE_INT16 +typedef YYTYPE_INT16 yytype_int16; +#else +typedef short int yytype_int16; +#endif + +#ifndef YYSIZE_T +# ifdef __SIZE_TYPE__ +# define YYSIZE_T __SIZE_TYPE__ +# elif defined size_t +# define YYSIZE_T size_t +# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# else +# define YYSIZE_T unsigned int +# endif +#endif + +#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) + +#ifndef YY_ +# if YYENABLE_NLS +# if ENABLE_NLS +# include /* INFRINGES ON USER NAME SPACE */ +# define YY_(msgid) dgettext ("bison-runtime", msgid) +# endif +# endif +# ifndef YY_ +# define YY_(msgid) msgid +# endif +#endif + +/* Suppress unused-variable warnings by "using" E. */ +#if ! defined lint || defined __GNUC__ +# define YYUSE(e) ((void) (e)) +#else +# define YYUSE(e) /* empty */ +#endif + +/* Identity function, used to suppress warnings about constant conditions. */ +#ifndef lint +# define YYID(n) (n) +#else +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static int +YYID (int i) +#else +static int +YYID (i) + int i; +#endif +{ + return i; +} +#endif + +#if ! defined yyoverflow || YYERROR_VERBOSE + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# ifdef YYSTACK_USE_ALLOCA +# if YYSTACK_USE_ALLOCA +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# elif defined __BUILTIN_VA_ARG_INCR +# include /* INFRINGES ON USER NAME SPACE */ +# elif defined _AIX +# define YYSTACK_ALLOC __alloca +# elif defined _MSC_VER +# include /* INFRINGES ON USER NAME SPACE */ +# define alloca _alloca +# else +# define YYSTACK_ALLOC alloca +# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +# include /* INFRINGES ON USER NAME SPACE */ +# ifndef _STDLIB_H +# define _STDLIB_H 1 +# endif +# endif +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's `empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) +# ifndef YYSTACK_ALLOC_MAXIMUM + /* The OS might guarantee only one guard page at the bottom of the stack, + and a page size can be as small as 4096 bytes. So we cannot safely + invoke alloca (N) if N exceeds 4096. Use a slightly smaller number + to allow for a few compiler-allocated temporary stack slots. */ +# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ +# endif +# else +# define YYSTACK_ALLOC YYMALLOC +# define YYSTACK_FREE YYFREE +# ifndef YYSTACK_ALLOC_MAXIMUM +# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM +# endif +# if (defined __cplusplus && ! defined _STDLIB_H \ + && ! ((defined YYMALLOC || defined malloc) \ + && (defined YYFREE || defined free))) +# include /* INFRINGES ON USER NAME SPACE */ +# ifndef _STDLIB_H +# define _STDLIB_H 1 +# endif +# endif +# ifndef YYMALLOC +# define YYMALLOC malloc +# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# ifndef YYFREE +# define YYFREE free +# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +void free (void *); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# endif +#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ + + +#if (! defined yyoverflow \ + && (! defined __cplusplus \ + || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + yytype_int16 yyss; + YYSTYPE yyvs; + }; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + + YYSTACK_GAP_MAXIMUM) + +/* Copy COUNT objects from FROM to TO. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined __GNUC__ && 1 < __GNUC__ +# define YYCOPY(To, From, Count) \ + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +# else +# define YYCOPY(To, From, Count) \ + do \ + { \ + YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (To)[yyi] = (From)[yyi]; \ + } \ + while (YYID (0)) +# endif +# endif + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack, Stack, yysize); \ + Stack = &yyptr->Stack; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (YYID (0)) + +#endif + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 4 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 26 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 11 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 7 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 16 +/* YYNRULES -- Number of states. */ +#define YYNSTATES 28 + +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +#define YYUNDEFTOK 2 +#define YYMAXUTOK 259 + +#define YYTRANSLATE(YYX) \ + ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + +/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +static const yytype_uint8 yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 7, 2, 2, 2, 2, 6, 2, + 8, 9, 2, 2, 10, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 5, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 3, 4 +}; + +#if YYDEBUG +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +static const yytype_uint8 yyprhs[] = +{ + 0, 0, 3, 5, 10, 12, 13, 15, 19, 21, + 23, 25, 27, 31, 35, 38, 42 +}; + +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const yytype_int8 yyrhs[] = +{ + 12, 0, -1, 13, -1, 13, 8, 14, 9, -1, + 3, -1, -1, 15, -1, 14, 10, 16, -1, 16, + -1, 3, -1, 4, -1, 17, -1, 17, 5, 17, + -1, 17, 6, 17, -1, 7, 17, -1, 8, 17, + 9, -1, 3, 8, 14, 9, -1 +}; + +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +static const yytype_uint8 yyrline[] = +{ + 0, 52, 52, 53, 56, 59, 60, 64, 65, 69, + 70, 71, 75, 76, 77, 78, 79 +}; +#endif + +#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE +/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "$end", "error", "$undefined", "ND_TOKEN", "ND_INTEGER", "'|'", "'&'", + "'!'", "'('", "')'", "','", "$accept", "option", "name", "args", "args1", + "arg", "filter", 0 +}; +#endif + +# ifdef YYPRINT +/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to + token YYLEX-NUM. */ +static const yytype_uint16 yytoknum[] = +{ + 0, 256, 257, 258, 259, 124, 38, 33, 40, 41, + 44 +}; +# endif + +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const yytype_uint8 yyr1[] = +{ + 0, 11, 12, 12, 13, 14, 14, 15, 15, 16, + 16, 16, 17, 17, 17, 17, 17 +}; + +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +static const yytype_uint8 yyr2[] = +{ + 0, 2, 1, 4, 1, 0, 1, 3, 1, 1, + 1, 1, 3, 3, 2, 3, 4 +}; + +/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state + STATE-NUM when YYTABLE doesn't specify something else to do. Zero + means the default is an error. */ +static const yytype_uint8 yydefact[] = +{ + 0, 4, 0, 2, 1, 5, 9, 10, 0, 0, + 0, 6, 8, 11, 5, 0, 14, 0, 3, 0, + 0, 0, 0, 15, 7, 12, 13, 16 +}; + +/* YYDEFGOTO[NTERM-NUM]. */ +static const yytype_int8 yydefgoto[] = +{ + -1, 2, 3, 10, 11, 12, 13 +}; + +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF -9 +static const yytype_int8 yypact[] = +{ + 2, -9, 21, 14, -9, -1, 15, -9, 1, 1, + 6, -9, -9, 12, -1, 15, -9, 5, -9, -1, + 1, 1, 10, -9, -9, 18, -9, -9 +}; + +/* YYPGOTO[NTERM-NUM]. */ +static const yytype_int8 yypgoto[] = +{ + -9, -9, -9, 11, -9, 7, -8 +}; + +/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule which + number is the opposite. If zero, do what YYDEFACT says. + If YYTABLE_NINF, syntax error. */ +#define YYTABLE_NINF -1 +static const yytype_uint8 yytable[] = +{ + 16, 17, 6, 7, 15, 1, 8, 9, 8, 9, + 20, 21, 25, 26, 23, 18, 19, 20, 21, 27, + 19, 4, 5, 14, 21, 22, 24 +}; + +static const yytype_uint8 yycheck[] = +{ + 8, 9, 3, 4, 3, 3, 7, 8, 7, 8, + 5, 6, 20, 21, 9, 9, 10, 5, 6, 9, + 10, 0, 8, 8, 6, 14, 19 +}; + +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const yytype_uint8 yystos[] = +{ + 0, 3, 12, 13, 0, 8, 3, 4, 7, 8, + 14, 15, 16, 17, 8, 3, 17, 17, 9, 10, + 5, 6, 14, 9, 16, 17, 17, 9 +}; + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY (-2) +#define YYEOF 0 + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab + + +/* Like YYERROR except do call yyerror. This remains here temporarily + to ease the transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. */ + +#define YYFAIL goto yyerrlab + +#define YYRECOVERING() (!!yyerrstatus) + +#define YYBACKUP(Token, Value) \ +do \ + if (yychar == YYEMPTY && yylen == 1) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + yytoken = YYTRANSLATE (yychar); \ + YYPOPSTACK (1); \ + goto yybackup; \ + } \ + else \ + { \ + yyerror (YY_("syntax error: cannot back up")); \ + YYERROR; \ + } \ +while (YYID (0)) + + +#define YYTERROR 1 +#define YYERRCODE 256 + + +/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. + If N is 0, then set CURRENT to the empty location which ends + the previous symbol: RHS[0] (always defined). */ + +#define YYRHSLOC(Rhs, K) ((Rhs)[K]) +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + do \ + if (YYID (N)) \ + { \ + (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ + (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ + (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ + (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ + } \ + else \ + { \ + (Current).first_line = (Current).last_line = \ + YYRHSLOC (Rhs, 0).last_line; \ + (Current).first_column = (Current).last_column = \ + YYRHSLOC (Rhs, 0).last_column; \ + } \ + while (YYID (0)) +#endif + + +/* YY_LOCATION_PRINT -- Print the location on the stream. + This macro was not mandated originally: define only if we know + we won't break user code: when these are the locations we know. */ + +#ifndef YY_LOCATION_PRINT +# if YYLTYPE_IS_TRIVIAL +# define YY_LOCATION_PRINT(File, Loc) \ + fprintf (File, "%d.%d-%d.%d", \ + (Loc).first_line, (Loc).first_column, \ + (Loc).last_line, (Loc).last_column) +# else +# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +# endif +#endif + + +/* YYLEX -- calling `yylex' with the right arguments. */ + +#ifdef YYLEX_PARAM +# define YYLEX yylex (YYLEX_PARAM) +#else +# define YYLEX yylex () +#endif + +/* Enable debugging if requested. */ +#if YYDEBUG + +# ifndef YYFPRINTF +# include /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (YYID (0)) + +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yy_symbol_print (stderr, \ + Type, Value); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (YYID (0)) + + +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +/*ARGSUSED*/ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) +#else +static void +yy_symbol_value_print (yyoutput, yytype, yyvaluep) + FILE *yyoutput; + int yytype; + YYSTYPE const * const yyvaluep; +#endif +{ + if (!yyvaluep) + return; +# ifdef YYPRINT + if (yytype < YYNTOKENS) + YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +# else + YYUSE (yyoutput); +# endif + switch (yytype) + { + default: + break; + } +} + + +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) +#else +static void +yy_symbol_print (yyoutput, yytype, yyvaluep) + FILE *yyoutput; + int yytype; + YYSTYPE const * const yyvaluep; +#endif +{ + if (yytype < YYNTOKENS) + YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); + else + YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); + + yy_symbol_value_print (yyoutput, yytype, yyvaluep); + YYFPRINTF (yyoutput, ")"); +} + +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (included). | +`------------------------------------------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) +#else +static void +yy_stack_print (bottom, top) + yytype_int16 *bottom; + yytype_int16 *top; +#endif +{ + YYFPRINTF (stderr, "Stack now"); + for (; bottom <= top; ++bottom) + YYFPRINTF (stderr, " %d", *bottom); + YYFPRINTF (stderr, "\n"); +} + +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (YYID (0)) + + +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_reduce_print (YYSTYPE *yyvsp, int yyrule) +#else +static void +yy_reduce_print (yyvsp, yyrule) + YYSTYPE *yyvsp; + int yyrule; +#endif +{ + int yynrhs = yyr2[yyrule]; + int yyi; + unsigned long int yylno = yyrline[yyrule]; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", + yyrule - 1, yylno); + /* The symbols being reduced. */ + for (yyi = 0; yyi < yynrhs; yyi++) + { + fprintf (stderr, " $%d = ", yyi + 1); + yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], + &(yyvsp[(yyi + 1) - (yynrhs)]) + ); + fprintf (stderr, "\n"); + } +} + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (yyvsp, Rule); \ +} while (YYID (0)) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !YYDEBUG */ + + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ + +#ifndef YYMAXDEPTH +# define YYMAXDEPTH 10000 +#endif + + + +#if YYERROR_VERBOSE + +# ifndef yystrlen +# if defined __GLIBC__ && defined _STRING_H +# define yystrlen strlen +# else +/* Return the length of YYSTR. */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static YYSIZE_T +yystrlen (const char *yystr) +#else +static YYSIZE_T +yystrlen (yystr) + const char *yystr; +#endif +{ + YYSIZE_T yylen; + for (yylen = 0; yystr[yylen]; yylen++) + continue; + return yylen; +} +# endif +# endif + +# ifndef yystpcpy +# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static char * +yystpcpy (char *yydest, const char *yysrc) +#else +static char * +yystpcpy (yydest, yysrc) + char *yydest; + const char *yysrc; +#endif +{ + char *yyd = yydest; + const char *yys = yysrc; + + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; +} +# endif +# endif + +# ifndef yytnamerr +/* Copy to YYRES the contents of YYSTR after stripping away unnecessary + quotes and backslashes, so that it's suitable for yyerror. The + heuristic is that double-quoting is unnecessary unless the string + contains an apostrophe, a comma, or backslash (other than + backslash-backslash). YYSTR is taken from yytname. If YYRES is + null, do not copy; instead, return the length of what the result + would have been. */ +static YYSIZE_T +yytnamerr (char *yyres, const char *yystr) +{ + if (*yystr == '"') + { + YYSIZE_T yyn = 0; + char const *yyp = yystr; + + for (;;) + switch (*++yyp) + { + case '\'': + case ',': + goto do_not_strip_quotes; + + case '\\': + if (*++yyp != '\\') + goto do_not_strip_quotes; + /* Fall through. */ + default: + if (yyres) + yyres[yyn] = *yyp; + yyn++; + break; + + case '"': + if (yyres) + yyres[yyn] = '\0'; + return yyn; + } + do_not_strip_quotes: ; + } + + if (! yyres) + return yystrlen (yystr); + + return yystpcpy (yyres, yystr) - yyres; +} +# endif + +/* Copy into YYRESULT an error message about the unexpected token + YYCHAR while in state YYSTATE. Return the number of bytes copied, + including the terminating null byte. If YYRESULT is null, do not + copy anything; just return the number of bytes that would be + copied. As a special case, return 0 if an ordinary "syntax error" + message will do. Return YYSIZE_MAXIMUM if overflow occurs during + size calculation. */ +static YYSIZE_T +yysyntax_error (char *yyresult, int yystate, int yychar) +{ + int yyn = yypact[yystate]; + + if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) + return 0; + else + { + int yytype = YYTRANSLATE (yychar); + YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); + YYSIZE_T yysize = yysize0; + YYSIZE_T yysize1; + int yysize_overflow = 0; + enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; + char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; + int yyx; + +# if 0 + /* This is so xgettext sees the translatable formats that are + constructed on the fly. */ + YY_("syntax error, unexpected %s"); + YY_("syntax error, unexpected %s, expecting %s"); + YY_("syntax error, unexpected %s, expecting %s or %s"); + YY_("syntax error, unexpected %s, expecting %s or %s or %s"); + YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); +# endif + char *yyfmt; + char const *yyf; + static char const yyunexpected[] = "syntax error, unexpected %s"; + static char const yyexpecting[] = ", expecting %s"; + static char const yyor[] = " or %s"; + char yyformat[sizeof yyunexpected + + sizeof yyexpecting - 1 + + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) + * (sizeof yyor - 1))]; + char const *yyprefix = yyexpecting; + + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = YYLAST - yyn + 1; + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; + int yycount = 1; + + yyarg[0] = yytname[yytype]; + yyfmt = yystpcpy (yyformat, yyunexpected); + + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) + { + yycount = 1; + yysize = yysize0; + yyformat[sizeof yyunexpected - 1] = '\0'; + break; + } + yyarg[yycount++] = yytname[yyx]; + yysize1 = yysize + yytnamerr (0, yytname[yyx]); + yysize_overflow |= (yysize1 < yysize); + yysize = yysize1; + yyfmt = yystpcpy (yyfmt, yyprefix); + yyprefix = yyor; + } + + yyf = YY_(yyformat); + yysize1 = yysize + yystrlen (yyf); + yysize_overflow |= (yysize1 < yysize); + yysize = yysize1; + + if (yysize_overflow) + return YYSIZE_MAXIMUM; + + if (yyresult) + { + /* Avoid sprintf, as that infringes on the user's name space. + Don't have undefined behavior even if the translation + produced a string with the wrong number of "%s"s. */ + char *yyp = yyresult; + int yyi = 0; + while ((*yyp = *yyf) != '\0') + { + if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) + { + yyp += yytnamerr (yyp, yyarg[yyi++]); + yyf += 2; + } + else + { + yyp++; + yyf++; + } + } + } + return yysize; + } +} +#endif /* YYERROR_VERBOSE */ + + +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +/*ARGSUSED*/ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) +#else +static void +yydestruct (yymsg, yytype, yyvaluep) + const char *yymsg; + int yytype; + YYSTYPE *yyvaluep; +#endif +{ + YYUSE (yyvaluep); + + if (!yymsg) + yymsg = "Deleting"; + YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); + + switch (yytype) + { + + default: + break; + } +} + + +/* Prevent warnings from -Wmissing-prototypes. */ + +#ifdef YYPARSE_PARAM +#if defined __STDC__ || defined __cplusplus +int yyparse (void *YYPARSE_PARAM); +#else +int yyparse (); +#endif +#else /* ! YYPARSE_PARAM */ +#if defined __STDC__ || defined __cplusplus +int yyparse (void); +#else +int yyparse (); +#endif +#endif /* ! YYPARSE_PARAM */ + + + +/* The look-ahead symbol. */ +int yychar; + +/* The semantic value of the look-ahead symbol. */ +YYSTYPE yylval; + +/* Number of syntax errors so far. */ +int yynerrs; + + + +/*----------. +| yyparse. | +`----------*/ + +#ifdef YYPARSE_PARAM +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +int +yyparse (void *YYPARSE_PARAM) +#else +int +yyparse (YYPARSE_PARAM) + void *YYPARSE_PARAM; +#endif +#else /* ! YYPARSE_PARAM */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +int +yyparse (void) +#else +int +yyparse () + +#endif +#endif +{ + + int yystate; + int yyn; + int yyresult; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + /* Look-ahead token as an internal (translated) token number. */ + int yytoken = 0; +#if YYERROR_VERBOSE + /* Buffer for error messages, and its allocated size. */ + char yymsgbuf[128]; + char *yymsg = yymsgbuf; + YYSIZE_T yymsg_alloc = sizeof yymsgbuf; +#endif + + /* Three stacks and their tools: + `yyss': related to states, + `yyvs': related to semantic values, + `yyls': related to locations. + + Refer to the stacks thru separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + yytype_int16 yyssa[YYINITDEPTH]; + yytype_int16 *yyss = yyssa; + yytype_int16 *yyssp; + + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs = yyvsa; + YYSTYPE *yyvsp; + + + +#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) + + YYSIZE_T yystacksize = YYINITDEPTH; + + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + + + /* The number of symbols on the RHS of the reduced rule. + Keep to zero when no symbol should be popped. */ + int yylen = 0; + + YYDPRINTF ((stderr, "Starting parse\n")); + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + + /* Initialize stack pointers. + Waste one element of value and location stack + so that they stay on the same level as the state stack. + The wasted elements are never initialized. */ + + yyssp = yyss; + yyvsp = yyvs; + + goto yysetstate; + +/*------------------------------------------------------------. +| yynewstate -- Push a new state, which is found in yystate. | +`------------------------------------------------------------*/ + yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. So pushing a state here evens the stacks. */ + yyssp++; + + yysetstate: + *yyssp = yystate; + + if (yyss + yystacksize - 1 <= yyssp) + { + /* Get the current used size of the three stacks, in elements. */ + YYSIZE_T yysize = yyssp - yyss + 1; + +#ifdef yyoverflow + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + yytype_int16 *yyss1 = yyss; + + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow (YY_("memory exhausted"), + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), + + &yystacksize); + + yyss = yyss1; + yyvs = yyvs1; + } +#else /* no yyoverflow */ +# ifndef YYSTACK_RELOCATE + goto yyexhaustedlab; +# else + /* Extend the stack our own way. */ + if (YYMAXDEPTH <= yystacksize) + goto yyexhaustedlab; + yystacksize *= 2; + if (YYMAXDEPTH < yystacksize) + yystacksize = YYMAXDEPTH; + + { + yytype_int16 *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyexhaustedlab; + YYSTACK_RELOCATE (yyss); + YYSTACK_RELOCATE (yyvs); + +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif +#endif /* no yyoverflow */ + + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; + + + YYDPRINTF ((stderr, "Stack size increased to %lu\n", + (unsigned long int) yystacksize)); + + if (yyss + yystacksize - 1 <= yyssp) + YYABORT; + } + + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + + goto yybackup; + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: + + /* Do appropriate processing given the current state. Read a + look-ahead token if we need one and don't already have one. */ + + /* First try to decide what to do without reference to look-ahead token. */ + yyn = yypact[yystate]; + if (yyn == YYPACT_NINF) + goto yydefault; + + /* Not known => get a look-ahead token if don't already have one. */ + + /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ + if (yychar == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token: ")); + yychar = YYLEX; + } + + if (yychar <= YYEOF) + { + yychar = yytoken = YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else + { + yytoken = YYTRANSLATE (yychar); + YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); + } + + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) + goto yydefault; + yyn = yytable[yyn]; + if (yyn <= 0) + { + if (yyn == 0 || yyn == YYTABLE_NINF) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + + if (yyn == YYFINAL) + YYACCEPT; + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + /* Shift the look-ahead token. */ + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); + + /* Discard the shifted token unless it is eof. */ + if (yychar != YYEOF) + yychar = YYEMPTY; + + yystate = yyn; + *++yyvsp = yylval; + + goto yynewstate; + + +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; + + +/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/ +yyreduce: + /* yyn is the number of a rule to reduce with. */ + yylen = yyr2[yyn]; + + /* If YYLEN is nonzero, implement the default value of the action: + `$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + + + YY_REDUCE_PRINT (yyn); + switch (yyn) + { + case 2: +#line 52 "nesc-dspec.y" + { opt = new_nd_option(dump_region, (yyvsp[(1) - (1)].token), NULL, 0); ;} + break; + + case 3: +#line 53 "nesc-dspec.y" + { opt = new_nd_option(dump_region, (yyvsp[(1) - (4)].token), (yyvsp[(3) - (4)].nd_arg), nd_arg_length((yyvsp[(3) - (4)].nd_arg))); ;} + break; + + case 5: +#line 59 "nesc-dspec.y" + { (yyval.nd_arg) = NULL; ;} + break; + + case 7: +#line 64 "nesc-dspec.y" + { (yyval.nd_arg) = nd_arg_chain((yyvsp[(1) - (3)].nd_arg), (yyvsp[(3) - (3)].nd_arg)); ;} + break; + + case 9: +#line 69 "nesc-dspec.y" + { (yyval.nd_arg) = CAST(nd_arg, new_nd_token(dump_region, (yyvsp[(1) - (1)].token))); ;} + break; + + case 10: +#line 70 "nesc-dspec.y" + { (yyval.nd_arg) = CAST(nd_arg, new_nd_int(dump_region, (yyvsp[(1) - (1)].integer))); ;} + break; + + case 11: +#line 71 "nesc-dspec.y" + { (yyval.nd_arg) = CAST(nd_arg, (yyvsp[(1) - (1)].nd_filter)); ;} + break; + + case 12: +#line 75 "nesc-dspec.y" + { (yyval.nd_filter) = CAST(nd_filter, new_ndf_or(dump_region, (yyvsp[(1) - (3)].nd_filter), (yyvsp[(3) - (3)].nd_filter))); ;} + break; + + case 13: +#line 76 "nesc-dspec.y" + { (yyval.nd_filter) = CAST(nd_filter, new_ndf_and(dump_region, (yyvsp[(1) - (3)].nd_filter), (yyvsp[(3) - (3)].nd_filter))); ;} + break; + + case 14: +#line 77 "nesc-dspec.y" + { (yyval.nd_filter) = CAST(nd_filter, new_ndf_not(dump_region, (yyvsp[(2) - (2)].nd_filter))); ;} + break; + + case 15: +#line 78 "nesc-dspec.y" + { (yyval.nd_filter) = (yyvsp[(2) - (3)].nd_filter); ;} + break; + + case 16: +#line 79 "nesc-dspec.y" + { + (yyval.nd_filter) = make_ndf_op(dump_region, (yyvsp[(1) - (4)].token), (yyvsp[(3) - (4)].nd_arg)); + ;} + break; + + +/* Line 1267 of yacc.c. */ +#line 1393 "nesc-dspec.tab.c" + default: break; + } + YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); + + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + + *++yyvsp = yyval; + + + /* Now `shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; + if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTOKENS]; + + goto yynewstate; + + +/*------------------------------------. +| yyerrlab -- here on detecting error | +`------------------------------------*/ +yyerrlab: + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) + { + ++yynerrs; +#if ! YYERROR_VERBOSE + yyerror (YY_("syntax error")); +#else + { + YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); + if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) + { + YYSIZE_T yyalloc = 2 * yysize; + if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) + yyalloc = YYSTACK_ALLOC_MAXIMUM; + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); + yymsg = (char *) YYSTACK_ALLOC (yyalloc); + if (yymsg) + yymsg_alloc = yyalloc; + else + { + yymsg = yymsgbuf; + yymsg_alloc = sizeof yymsgbuf; + } + } + + if (0 < yysize && yysize <= yymsg_alloc) + { + (void) yysyntax_error (yymsg, yystate, yychar); + yyerror (yymsg); + } + else + { + yyerror (YY_("syntax error")); + if (yysize != 0) + goto yyexhaustedlab; + } + } +#endif + } + + + + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse look-ahead token after an + error, discard it. */ + + if (yychar <= YYEOF) + { + /* Return failure if at end of input. */ + if (yychar == YYEOF) + YYABORT; + } + else + { + yydestruct ("Error: discarding", + yytoken, &yylval); + yychar = YYEMPTY; + } + } + + /* Else will try to reuse look-ahead token after shifting the error + token. */ + goto yyerrlab1; + + +/*---------------------------------------------------. +| yyerrorlab -- error raised explicitly by YYERROR. | +`---------------------------------------------------*/ +yyerrorlab: + + /* Pacify compilers like GCC when the user code never invokes + YYERROR and the label yyerrorlab therefore never appears in user + code. */ + if (/*CONSTCOND*/ 0) + goto yyerrorlab; + + /* Do not reclaim the symbols of the rule which action triggered + this YYERROR. */ + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + yystate = *yyssp; + goto yyerrlab1; + + +/*-------------------------------------------------------------. +| yyerrlab1 -- common code for both syntax error and YYERROR. | +`-------------------------------------------------------------*/ +yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ + + for (;;) + { + yyn = yypact[yystate]; + if (yyn != YYPACT_NINF) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; + + + yydestruct ("Error: popping", + yystos[yystate], yyvsp); + YYPOPSTACK (1); + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); + } + + if (yyn == YYFINAL) + YYACCEPT; + + *++yyvsp = yylval; + + + /* Shift the error token. */ + YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); + + yystate = yyn; + goto yynewstate; + + +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturn; + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturn; + +#ifndef yyoverflow +/*-------------------------------------------------. +| yyexhaustedlab -- memory exhaustion comes here. | +`-------------------------------------------------*/ +yyexhaustedlab: + yyerror (YY_("memory exhausted")); + yyresult = 2; + /* Fall through. */ +#endif + +yyreturn: + if (yychar != YYEOF && yychar != YYEMPTY) + yydestruct ("Cleanup: discarding lookahead", + yytoken, &yylval); + /* Do not reclaim the symbols of the rule which action triggered + this YYABORT or YYACCEPT. */ + YYPOPSTACK (yylen); + YY_STACK_PRINT (yyss, yyssp); + while (yyssp != yyss) + { + yydestruct ("Cleanup: popping", + yystos[*yyssp], yyvsp); + YYPOPSTACK (1); + } +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); +#endif +#if YYERROR_VERBOSE + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); +#endif + /* Make sure YYID is used. */ + return YYID (yyresult); +} + + +#line 84 "nesc-dspec.y" + + +nd_option nd_parse(const char *what) +{ + opt = NULL; + nd_read(what); + if (ndparse()) + return NULL; + return opt; +} + +#include "ND_types.c" +#include "ND_list_nd_arg.c" + +const char *nd_tokenval(nd_arg arg) +{ + return CAST(nd_token, arg)->str; +} + + diff --git a/src/nesc-dspec.tab.h b/src/nesc-dspec.tab.h new file mode 100644 index 0000000..aee4cce --- /dev/null +++ b/src/nesc-dspec.tab.h @@ -0,0 +1,61 @@ +/* A Bison parser, made by GNU Bison 2.3. */ + +/* Skeleton interface for Bison's Yacc-like parsers in C + + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 + 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., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ + +/* As a special exception, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + ND_TOKEN = 258, + ND_INTEGER = 259 + }; +#endif +/* Tokens. */ +#define ND_TOKEN 258 +#define ND_INTEGER 259 + + + + +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +typedef int YYSTYPE; +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 +#endif + +extern YYSTYPE ndlval; + diff --git a/src/nesc-dspec.y b/src/nesc-dspec.y new file mode 100644 index 0000000..49078b8 --- /dev/null +++ b/src/nesc-dspec.y @@ -0,0 +1,102 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +/* Parser for -fnesc-dump option arguments. General forms are: + NAME + NAME(arguments) + where NAME describes a particular dump request (see nesc-dump.c) + and the optional arguments describe the request in more detail. + + The arguments are a list of tokens (arbitrary strings), numbers and + filters (see nesc-dfilter.c). The meaning of these depends on the + dump request. +*/ + +%{ +#include "parser.h" +#include "nesc-dump.h" +#include "nesc-dspec.h" +#include "nesc-dspec-int.h" +#include "nesc-dfilter.h" + +static nd_option opt; +%} + +%token ND_TOKEN +%token ND_INTEGER +%type name +%type args args1 arg +%type filter + +%left '|' +%left '&' +%nonassoc '!' + +%% + +option: + name { opt = new_nd_option(dump_region, $1, NULL, 0); } + | name '(' args ')' { opt = new_nd_option(dump_region, $1, $3, nd_arg_length($3)); } + ; + +name: ND_TOKEN ; + +args: + /* empty */ { $$ = NULL; } + | args1 + ; + +args1: + args ',' arg { $$ = nd_arg_chain($1, $3); } + | arg + ; + +arg: + ND_TOKEN { $$ = CAST(nd_arg, new_nd_token(dump_region, $1)); } + | ND_INTEGER { $$ = CAST(nd_arg, new_nd_int(dump_region, $1)); } + | filter { $$ = CAST(nd_arg, $1); } + ; + +filter: + filter '|' filter { $$ = CAST(nd_filter, new_ndf_or(dump_region, $1, $3)); } + | filter '&' filter { $$ = CAST(nd_filter, new_ndf_and(dump_region, $1, $3)); } + | '!' filter { $$ = CAST(nd_filter, new_ndf_not(dump_region, $2)); } + | '(' filter ')' { $$ = $2; } + | ND_TOKEN '(' args ')' { + $$ = make_ndf_op(dump_region, $1, $3); + } + ; + +%% + +nd_option nd_parse(const char *what) +{ + opt = NULL; + nd_read(what); + if (ndparse()) + return NULL; + return opt; +} + +#include "ND_types.c" +#include "ND_list_nd_arg.c" + +const char *nd_tokenval(nd_arg arg) +{ + return CAST(nd_token, arg)->str; +} + diff --git a/src/nesc-dump.c b/src/nesc-dump.c new file mode 100644 index 0000000..8cb4126 --- /dev/null +++ b/src/nesc-dump.c @@ -0,0 +1,844 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +/* The internal nesC dump information system. + Current allowable requests: + - components, interfaces, interfacedefs, tags: + extract lists of the specified internal objects + managed via the lists[] array (see below) + support filter arguments (see nesc-dfiler.c) + - referenced(): + implicitly dump any referenced item of the specified kind, e.g., + referenced(interfacedefs) will dump all interface definitions referred + to from other XML elements + - wiring: dump wiring graph + wiring(functions) dumps the function-level graph (but this is currently + in a somewhat different form than the regular graph, so should probably + not be used) +*/ + +#include "parser.h" +#include "nesc-dump.h" +#include "nesc-env.h" +#include "nesc-dspec.h" +#include "nesc-dfilter.h" +#include "nesc-xml.h" +#include "nesc-cg.h" +#include "semantics.h" +#include "nesc-semantics.h" +#include "nesc-component.h" +#include "constants.h" + +/* The current set of dump requests */ +static dd_list/*nd_option*/ opts; +region dump_region; /* for dump request allocations */ +static const char *dumpfile; + +/* What to output */ +enum { wiring_none, wiring_user, wiring_functions } wiring = wiring_none; +bool configuration_wiring; +bool component_declarations; + +/* More OOish stuff to manage dump requests of concrete nesC internal + objects (components, tags, etc). The lists array contains the currently + supported list. + + Each of these concrete requests supports filters (and does not have any + other options). +*/ +static bool tdecl_addfilter(void *entry); +static bool ndecl_addfilter(void *entry); +static bool ddecl_addfilter(void *entry); + +static void dump_component(void *entry); +static void dump_ddecl_void(void *entry); +static void dump_interfacedef(void *entry); +static void dump_tag(void *entry); + +static void select_components(xml_list l, nd_option opt, dd_list comps); +static void select_interfaces(xml_list l, nd_option opt, dd_list comps); +static void select_variables(xml_list l, nd_option opt, dd_list comps); +static void select_constants(xml_list l, nd_option opt, dd_list comps); +static void select_functions(xml_list l, nd_option opt, dd_list comps); +static void select_typedefs(xml_list l, nd_option opt, dd_list comps); +static void select_interfacedefs(xml_list l, nd_option opt, dd_list comps); +static void select_tags(xml_list l, nd_option opt, dd_list comps); + +/* lists */ +static struct { + const char *name; + + /* Return TRUE if entry has not yet been added to its dump list */ + bool (*addfilter)(void *entry); + + /* Add entries selected by 'opt' to list 'l'. 'comps' is the list of the + program's components. */ + void (*select)(xml_list l, nd_option opt, dd_list comps); + + /* Dump a single entry in XML */ + void (*dump)(void *entry); + + /* The list of referenced items of, e.g., components is created by + adding entries to a global variable (xl_components in this case) holding + an xml_list (see xml_list_add in nesc-xml.c). By default this variable + is NULL, so nothing happens. The 'referenced' dump request sets this + variable to point to the list l (see next field) to track, e.g., + referenced components. The 'referenced' field contains the address of + this global variable. */ + xml_list *referenced; + + xml_list l; /* The list of entries of this kind */ +} lists[] = { + { "components", ndecl_addfilter, select_components, dump_component, &xl_components }, + { "interfaces", ddecl_addfilter, select_interfaces, dump_ddecl_void, &xl_interfaces }, + { "interfacedefs", ndecl_addfilter, select_interfacedefs, dump_interfacedef, &xl_interfacedefs }, + { "tags", tdecl_addfilter, select_tags, dump_tag, &xl_tags }, + { "variables", ddecl_addfilter, select_variables, dump_ddecl_void, &xl_variables }, + { "constants", ddecl_addfilter, select_constants, dump_ddecl_void, &xl_constants }, + { "functions", ddecl_addfilter, select_functions, dump_ddecl_void, &xl_functions }, + { "typedefs", ddecl_addfilter, select_typedefs, dump_ddecl_void, &xl_typedefs } +}; + +#define NLISTS (sizeof lists / sizeof *lists) + +static bool tdecl_addfilter(void *entry) +{ + tag_declaration decl = entry; + + if (decl->dumped) + return FALSE; + decl->dumped = TRUE; + return TRUE; +} + +static bool ndecl_addfilter(void *entry) +{ + nesc_declaration decl = entry; + + if (decl->dumped) + return FALSE; + decl->dumped = TRUE; + return TRUE; +} + +static bool ddecl_addfilter(void *entry) +{ + data_declaration decl = entry; + + if (decl->dumped) + return FALSE; + decl->dumped = TRUE; + return TRUE; +} + +/* Actual XML dump functions. See doc/dump for the corresponding DSD schemas. + The dump functions are found partially here (for high-level elements), + in nesc-xml.c (low-level elements and basic functions) and types.c (for + types). */ + +static void dump_attributes(dd_list/*nesc_attribute*/ attributes) +{ + dd_list_pos scan; + + if (!attributes) + return; + + dd_scan (scan, attributes) + { + nesc_attribute attr = DD_GET(nesc_attribute, scan); + + indentedtag("attribute-value"); + nxml_tdecl_ref(attr->tdecl); + nxml_value(attr->arg1->ivalue); + indentedtag_pop(); + } +} + +static void dump_parameters(const char *name, declaration parms); + +void dump_ddecl(data_declaration ddecl) +{ + switch (ddecl->kind) + { + case decl_variable: indentedtag_start("variable"); break; + case decl_constant: + indentedtag_start("constant"); + if (ddecl->value) /* generic components args are constants, but have + no value */ + xml_attr_cval("cst", ddecl->value->cval); + break; + case decl_function: + indentedtag_start("function"); + switch (ddecl->ftype) + { + case function_event: + xml_attr_noval("event"); + xml_attr_int("provided", ddecl->defined); + break; + case function_command: + xml_attr_noval("command"); + xml_attr_int("provided", ddecl->defined); + break; + default: break; + } + xml_attr_bool("safe", ddecl->safe); + break; + case decl_typedef: indentedtag_start("typedef"); break; + case decl_interface_ref: + indentedtag_start("interface"); + xml_attr_int("provided", !ddecl->required); + break; + case decl_component_ref: indentedtag_start("internal-component"); break; + default: assert(0); + } + if (ddecl->name) /* Parameter names may be omitted in declarations */ + xml_attr("name", ddecl->name); + xml_attr_ptr("ref", ddecl); + xml_attr_loc((ddecl->definition ? ddecl->definition : ddecl->ast)->location); + xml_tag_end(); + + /* Symbols have either a nesC container, a containing function, containing + interface or none of these (global symbols) */ + xstartline(); + nxml_doc(&ddecl->doc); + + if (ddecl->container) + nxml_ndecl_ref(ddecl->container); + if (ddecl->container_function) + nxml_ddecl_ref(ddecl->container_function); + + nxml_type(ddecl->type); + dump_attributes(ddecl->attributes); + + switch (ddecl->kind) + { + case decl_interface_ref: + { + env_scanner fns; + const char *fnname; + void *fnentry; + + nxml_instance(ddecl->itype); + if (ddecl->gparms) + nxml_typelist("interface-parameters", ddecl->gparms); + + indentedtag("interface-functions"); + interface_scan(ddecl, &fns); + while (env_next(&fns, &fnname, &fnentry)) + { + xstartline(); + nxml_ddecl_ref(fnentry); + } + indentedtag_pop(); + break; + } + case decl_function: + { + if (ddecl->interface) + nxml_ddecl_ref(ddecl->interface); + /* Builtin functions have no real AST */ + if (!is_error_decl(ddecl->ast)) + { + function_declarator fdecl = ddecl_get_fdeclarator(ddecl); + + if (fdecl->parms) /* absent in old-style functions */ + dump_parameters("parameters", fdecl->parms); + if (fdecl->gparms) + dump_parameters("instance-parameters", fdecl->gparms); + } + break; + } + default: break; + } + + indentedtag_pop(); +} + +static void dump_parameter(declaration parm) +{ + data_declaration pdecl = NULL; + + /* (void) parameters have a NULL ddecl, so will be ignored */ + if (is_data_decl(parm)) /* regular parameter */ + { + data_decl data = CAST(data_decl, parm); + variable_decl vdecl = CAST(variable_decl, data->decls); + + pdecl = vdecl->ddecl; + } + else if (is_ellipsis_decl(parm)) + { + xml_qtag("varargs"); + xnewline(); + } + else if (is_type_parm_decl(parm)) + { + type_parm_decl tp = CAST(type_parm_decl, parm); + + pdecl = tp->ddecl; + } + if (pdecl) + dump_ddecl(pdecl); +} + +static void dump_parameters(const char *name, declaration parms) +{ + declaration parm; + + indentedtag(name); + scan_declaration (parm, parms) + dump_parameter(parm); + indentedtag_pop(); +} + +static void dump_endp(const char *tag, endp ep) +{ + xstartline(); + xml_tag(tag); + nxml_ddecl_ref(ep->function ? ep->function : ep->interface); + if (ep->args_node) + nxml_arguments(ep->args_node); + xml_pop(); +} + +static void dump_wire(location l, gnode from, gnode to) +{ + endp fdata = NODE_GET(endp, from), tdata = NODE_GET(endp, to); + + indentedtag_start("wire"); + if (l) + xml_attr_loc(l); + xml_tag_end(); + dump_endp("from", fdata); + dump_endp("to", tdata); + indentedtag_pop(); +} + +static void dump_wiring(cgraph cg) +{ + gnode from; + gedge wire; + + /* Print a wiring graph */ + indentedtag("wiring"); + graph_scan_nodes (from, cgraph_graph(cg)) + { + graph_scan_out (wire, from) + dump_wire(EDGE_GET(location, wire), from, graph_edge_to(wire)); + } + indentedtag_pop(); +} + +static void dump_ndecl_doc(nesc_declaration ndecl) +{ + nxml_doc(&ndecl->doc); +} + +static void do_wiring(int wiring, cgraph cg, cgraph userg) +{ + if (wiring == wiring_functions) + dump_wiring(cg); + if (wiring == wiring_user) + dump_wiring(userg); +} + +static void dump_component(void *entry) +{ + nesc_declaration comp = entry; + /* Partially instantiated components (i.e., generic components created + inside generic configurations) need some special handling */ + bool partially_instantiated = comp->original && comp->abstract; + + indentedtag_start("component"); + xml_attr("qname", comp->instance_name); + xml_attr_loc(comp->ast->location); + xml_attr_bool("abstract", comp->abstract); + xml_attr_bool("safe", comp->safe); + xml_tag_end(); + xnewline(); + + dump_ndecl_doc(comp); + + if (comp->original) + nxml_instance(comp); + else if (comp->abstract) /* not for partially instantiated components */ + dump_parameters("parameters", comp->parameters); + xml_qtag(comp->configuration ? "configuration" : "module"); + dump_attributes(comp->attributes); + + if (comp->configuration && configuration_wiring && !partially_instantiated) + do_wiring(wiring_user, comp->connections, comp->user_connections); + + if (component_declarations && !partially_instantiated) + { + } + + indentedtag_pop(); +} + +static void dump_ddecl_void(void *entry) +{ + dump_ddecl(entry); +} + +static void dump_interfacedef(void *entry) +{ + nesc_declaration idef = entry; + env_scanner fns; + const char *fnname; + void *fnentry; + + indentedtag_start("interfacedef"); + xml_attr("qname", idef->name); + xml_attr_loc(idef->ast->location); + xml_tag_end(); + + dump_ndecl_doc(idef); + + if (idef->abstract) + dump_parameters("parameters", idef->parameters); + dump_attributes(idef->attributes); + + env_scan(idef->env->id_env, &fns); + while (env_next(&fns, &fnname, &fnentry)) + { + data_declaration fndecl = fnentry; + + if (fndecl->kind != decl_magic_string) + dump_ddecl(fnentry); + } + + indentedtag_pop(); +} + +static void dump_field(field_declaration field) +{ + indentedtag_start("field"); + xml_attr("name", field->name); + xml_attr_ptr("ref", field); /* collapsing structs into their parent can + cause duplicate names */ + xml_attr_bool("packed", field->packed); + xml_attr_cval("bit-offset", field->offset); + if (cval_istop(field->bitwidth)) + xml_attr_cval("size", type_size_cc(field->type) ? + type_size(field->type) : cval_top); + else + xml_attr_cval("bit-size", field->bitwidth); + xml_tag_end(); + nxml_type(field->type); + dump_attributes(field->attributes); + indentedtag_pop(); +} + +static void dump_tag(void *entry) +{ + tag_declaration tdecl = entry; + + indentedtag_start(tagkind_name(tdecl->kind)); + if (tdecl->name) + xml_attr("name", tdecl->name); + if (tdecl->definition) + xml_attr_loc(tdecl->definition->location); + xml_attr_ptr("ref", tdecl); + xml_attr_bool("defined", tdecl->defined); + xml_attr_bool("packed", tdecl->packed); + xml_attr_bool("scoped", !!tdecl->container/* || tdecl->container_function*/); + xml_attr_cval("size", tdecl->size); + xml_attr_cval("alignment", tdecl->alignment); + xml_tag_end(); + xnewline(); + + if (tdecl->container) + { + nxml_ndecl_ref(tdecl->container); + xnewline(); + } +#if 0 + if (tdecl->containing_function) + { + nxml_ddecl_ref(tdecl->containing_function); + xnewline(); + } +#endif + dump_attributes(tdecl->attributes); + + if (tdecl->kind == kind_enum_ref) + nxml_type(tdecl->reptype); + else + { + field_declaration fields; + + for (fields = tdecl->fieldlist; fields; fields = fields->next) + if (fields->name) /* skip unnamed fields */ + dump_field(fields); + } + + indentedtag_pop(); +} + +static void dump_list(const char *name, xml_list l, + void (*dump)(void *entry)) +{ + dd_list latest = xml_list_latest(l); + dd_list_pos elem; + + if (!latest) + return; + + indentedtag(name); + dd_scan (elem, latest) + dump(DD_GET(void *, elem)); + indentedtag_pop(); +} + +static void source_ndecl_iterate(int kind, int processkind, xml_list l, void (*process)(int kind, xml_list l, nesc_declaration ndecl)) +{ + env_scanner scanenv; + const char *name; + void *val; + + env_scan(get_nesc_env(), &scanenv); + while (env_next(&scanenv, &name, &val)) + { + nesc_declaration ndecl = val; + + if (ndecl->kind == kind) + process(processkind, l, ndecl); + } +} + +static void add_ddecls_from_env(int kind, xml_list l, struct environment *env) +{ + env_scanner scan; + const char *name; + void *decl; + + env_scan(env->id_env, &scan); + while (env_next(&scan, &name, &decl)) + { + data_declaration ddecl = decl; + + if (ddecl->kind == kind && dump_filter_ddecl(ddecl)) + xml_list_add(l, ddecl); + } +} + +static void add_ddecls_from_component(int kind, xml_list l, nesc_declaration comp) +{ + add_ddecls_from_env(kind, l, comp->env); + add_ddecls_from_env(kind, l, comp->impl->ienv); +} + +static void select_ddecls(int kind, xml_list l, dd_list comps) +{ + dd_list_pos scan; + + add_ddecls_from_env(kind, l, global_env); + + if (comps) + dd_scan (scan, comps) + add_ddecls_from_component(kind, l, DD_GET(nesc_declaration, scan)); + + source_ndecl_iterate(l_component, kind, l, add_ddecls_from_component); +} + +/* The toplevel requests supported by -fnesc-dump */ +/* ---------------------------------------------- */ +/* Most of these are handled via the lists system (see above) */ + +static void add_component(int dummy, xml_list l, nesc_declaration comp) +{ + if (dump_filter_ndecl(comp)) + xml_list_add(l, comp); +} + +static void select_components(xml_list l, nd_option opt, dd_list comps) +{ + dd_list_pos scan_components; + nd_arg arg; + + scan_nd_arg (arg, opt->args) + if (is_nd_token(arg)) + { + const char *req = nd_tokenval(arg); + + if (!strcmp(req, "wiring")) + configuration_wiring = TRUE; + else + error("unknown components option `%s'", req); + } + else + error("bad components option"); + + if (comps) + dd_scan (scan_components, comps) + add_component(0, l, DD_GET(nesc_declaration, scan_components)); + + source_ndecl_iterate(l_component, 0, l, add_component); +} + +static void add_interfacedef(int dummy, xml_list l, nesc_declaration ndecl) +{ + if (dump_filter_ndecl(ndecl)) + xml_list_add(l, ndecl); +} + +static void select_interfacedefs(xml_list l, nd_option opt, dd_list comps) +{ + source_ndecl_iterate(l_interface, 0, l, add_interfacedef); +} + +static void select_interfaces(xml_list l, nd_option opt, dd_list comps) +{ + select_ddecls(decl_interface_ref, l, comps); +} + +static void select_variables(xml_list l, nd_option opt, dd_list comps) +{ + select_ddecls(decl_variable, l, comps); +} + +static void select_constants(xml_list l, nd_option opt, dd_list comps) +{ + select_ddecls(decl_constant, l, comps); +} + +static void select_functions(xml_list l, nd_option opt, dd_list comps) +{ + select_ddecls(decl_function, l, comps); +} + +static void select_typedefs(xml_list l, nd_option opt, dd_list comps) +{ + select_ddecls(decl_typedef, l, comps); +} + +static void add_tags_from_env(xml_list l, struct environment *env) +{ + env_scanner scan; + const char *name; + void *decl; + + env_scan(env->tag_env, &scan); + while (env_next(&scan, &name, &decl)) + { + tag_declaration tdecl = decl; + + if (dump_filter_tdecl(tdecl)) + xml_list_add(l, tdecl); + } +} + +static void add_tags_from_component(int dummy, xml_list l, nesc_declaration comp) +{ + add_tags_from_env(l, comp->env); + add_tags_from_env(l, comp->impl->ienv); +} + +static void select_tags(xml_list l, nd_option opt, dd_list comps) +{ + dd_list_pos scan_components; + + add_tags_from_env(l, global_env); + + if (comps) + dd_scan (scan_components, comps) + add_tags_from_component(0, l, DD_GET(nesc_declaration, scan_components)); + + source_ndecl_iterate(l_component, 0, l, add_tags_from_component); +} + +static void select_wiring(nd_option opt, dd_list comps) +{ + nd_arg arg; + + if (!comps) + { + error("wiring can only be requested on an actual program"); + return; + } + wiring = wiring_user; + + scan_nd_arg (arg, opt->args) + if (is_nd_token(arg)) + { + const char *req = nd_tokenval(arg); + + if (!strcmp(req, "functions")) + wiring = wiring_functions; + else + error("unknown wiring request for `%s'", req); + } + else + error("bad argument to wiring"); +} + +static void select_referenced(nd_option opt) +{ + nd_arg arg; + + scan_nd_arg (arg, opt->args) + if (is_nd_token(arg)) + { + const char *req = nd_tokenval(arg); + int i; + + for (i = 0; i < NLISTS; i++) + if (!strcmp(req, lists[i].name)) + { + *lists[i].referenced = lists[i].l; + break; + } + if (i == NLISTS) + error("unknown referenced request for `%s'", req); + } + else + error("bad argument to referenced"); +} + +void select_dump(char *what) +{ + nd_option opt; + + if (!dump_region) + dump_region = permanent; + + opt = nd_parse(what); + + if (opt) + { +#if 0 + nd_arg arg; + int i = 0; + + fprintf(stderr, "opt %s, %d args\n", opt->name, opt->count); + scan_nd_arg (arg, opt->args) + if (is_nd_int(arg)) + fprintf(stderr, " arg %d int %ld\n", ++i, + (long)ND_CAST(nd_int, arg)->val); + else + fprintf(stderr, " arg %d token %s\n", ++i, + ND_CAST(nd_token, arg)->str); +#endif + + if (!opts) + opts = dd_new_list(dump_region); + dd_add_last(dump_region, opts, opt); + } +} + +void select_dumpfile(char *name) +{ + dumpfile = name; +} + +bool dump_selected(void) +{ + return opts != NULL; +} + +static void do_lists(void) +{ + int i; + + for (i = 0; i < NLISTS; i++) + dump_list(lists[i].name, lists[i].l, lists[i].dump); +} + +void dump_info(nesc_declaration program, cgraph cg, cgraph userg, + dd_list modules, dd_list comps) +{ + dd_list_pos scan_opts; + bool list_change = FALSE; + int i; + FILE *dumpf = NULL; + + for (i = 0; i < NLISTS; i++) + lists[i].l = new_xml_list(dump_region, &list_change, lists[i].addfilter); + + /* Process options to find out what is selected */ + dd_scan (scan_opts, opts) + { + nd_option opt = DD_GET(nd_option, scan_opts); + int i; + + dump_set_filter(opt); + + for (i = 0; i < NLISTS; i++) + if (!strcmp(opt->name, lists[i].name)) + { + lists[i].select(lists[i].l, opt, comps); + break; + } + + if (i < NLISTS) + ; + else if (!strcmp(opt->name, "wiring")) + select_wiring(opt, comps); + else if (!strcmp(opt->name, "referenced")) + select_referenced(opt); + else + error("unknown dump request `%s'", opt->name); + } + + /* Repeatedly dump selected information (w/o performing any actual I/O). + This will collect all items selected by the 'referenced' request. + This repeated collection of items is supported by the xml_list type + (from nesc-xml.c) */ + xml_start_dummy(); + do_wiring(wiring, cg, userg); + for (;;) + { + do_lists(); + if (!list_change) + break; + list_change = FALSE; + } + + /* All information now collected. Reset the lists and dump the information + for real. */ + for (i = 0; i < NLISTS; i++) + xml_list_reset(lists[i].l); + + if (!dumpfile) + xml_start(stdout); + else + { + dumpf = fopen(dumpfile, "w"); + if (!dumpf) + { + perror("couldn't create dump file"); + return; + } + xml_start(dumpf); + } + indentedtag_start("nesc"); + xml_attr("xmlns", "http://www.tinyos.net/nesC"); + xml_tag_end(); xnewline(); + + do_wiring(wiring, cg, userg); + do_lists(); + + indentedtag_pop(); + xml_end(); + + if (dumpf) + fclose(dumpf); + + /* Nothing should have been added to the lists in the actual output pass */ + assert(!list_change); +} diff --git a/src/nesc-dump.h b/src/nesc-dump.h new file mode 100644 index 0000000..6d7f6c7 --- /dev/null +++ b/src/nesc-dump.h @@ -0,0 +1,50 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef NESC_DUMP_H +#define NESC_DUMP_H + +/* The internal nesC dump information system. Dumps information in XML + according to the DSD schema which can be found in doc/dump (see the + README there for more details). + + Java code to parse this schema into a programmer-friendly form is + in the net.tinyos.nesc.dump package (found under tools/java). */ + +#include "nesc-cg.h" + +extern region dump_region; + +void select_dump(char *what); +/* Effects: Register a new -fnesc-dump request 'what' + Errors are signaled through the usual 'error' call. + */ + +void select_dumpfile(char *name); +/* Effects: Select target file for dump + */ + +bool dump_selected(void); +/* Effects: Return true if any calls to select_dump where made. + */ + +void dump_info(nesc_declaration program, cgraph cg, cgraph userg, + dd_list modules, dd_list components); +/* Effects: Dump selected information. + */ + +#endif diff --git a/src/nesc-env.c b/src/nesc-env.c new file mode 100644 index 0000000..afe4147 --- /dev/null +++ b/src/nesc-env.c @@ -0,0 +1,113 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include "parser.h" +#include "nesc-env.h" +#include "env.h" +#include "nesc-interface.h" +#include "nesc-component.h" +#include "nesc-c.h" +#include "nesc-decls.h" +#include "nesc-semantics.h" +#include "c-parse.h" +#include "semantics.h" + +/* Top-level nesc environment. Keeps track of loaded interfaces and + components, loads them on demand */ + +/* The environments for components and interfaces */ +static env nesc_env, nesc_c_env; + + +/* hack, to give the doc generation an easy way to list interfaces & components */ +env get_nesc_env(void) +{ + return nesc_env; +} + +void init_nesc_env(region r) +{ + nesc_env = new_env(r, NULL); + nesc_c_env = new_env(r, NULL); +} + +nesc_declaration new_nesc_declaration(region r, source_language kind, + const char *name) +{ + nesc_declaration new = ralloc(r, struct nesc_declaration); + + new->kind = kind; + new->name = new->instance_name = name; + if (kind == l_component && use_nido) + new->local_statics = dd_new_list(r); + new->env = new_environment(r, global_env, TRUE, FALSE); + new->safe = flag_default_safe; + + return new; +} + +void nesc_declare(nesc_declaration d) +{ + check_name(d->name); + env_add(nesc_env, d->name, d); +} + +nesc_declaration nesc_lookup(const char *name) +{ + return env_lookup(nesc_env, name, FALSE); +} + +void preload(source_language sl, location l, const char *name) +{ + if (!nesc_lookup(name)) + load(sl, l, name, FALSE); +} + +nesc_declaration require(source_language sl, location l, const char *name) +{ + nesc_declaration d = nesc_lookup(name); + + if (!d) + d = load(sl, l, name, FALSE); + + if (sl != d->kind) + { + /* Make a dummy declaration to make everyone happy */ + nesc_decl nd; + + d = new_nesc_declaration(parse_region, sl, name); + nd = dummy_nesc_decl(l, d); + + error_with_location(l, "expected %s `%s', but got %s %s", + language_name(sl), name, + d->kind == l_interface ? "an" : "a", + language_name(d->kind)); + } + return d; +} + +void require_c(location l, const char *name) +{ + static int dummy; + int *present = env_lookup(nesc_c_env, name, FALSE); + + if (!present) + { + env_add(nesc_c_env, name, &dummy); + load_c(l, name, FALSE); + } +} diff --git a/src/nesc-env.h b/src/nesc-env.h new file mode 100644 index 0000000..950dddf --- /dev/null +++ b/src/nesc-env.h @@ -0,0 +1,35 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef NESC_ENV_H +#define NESC_ENV_H + +/* Top-level nesc environment. Keeps track of loaded interfaces and + components, loads them on demand */ + +nesc_declaration new_nesc_declaration(region r, source_language kind, + const char *name); + +void init_nesc_env(region r); +env get_nesc_env(void); +void nesc_declare(nesc_declaration d); +nesc_declaration nesc_lookup(const char *name); +void preload(source_language sl, location l, const char *name); +nesc_declaration require(source_language sl, location l, const char *name); +void require_c(location l, const char *name); + +#endif diff --git a/src/nesc-gcc.c b/src/nesc-gcc.c new file mode 100644 index 0000000..ee5225b --- /dev/null +++ b/src/nesc-gcc.c @@ -0,0 +1,394 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include "parser.h" +#include "nesc-cpp.h" + +#include +#include +#include +#include +#include +#include "nesc-paths.h" +#include "machine.h" +#include "flags.h" +#include "semantics.h" +#include "c-parse.h" + +#include "gcc-cpp.h" + +/* Some extra options for gcc */ + +struct extra_option { + struct extra_option *next; + const char *opt; +}; + +static struct extra_option *extra_options; +static int extra_options_count; + +void add_gcc_option(const char *option) +{ + struct extra_option *newopt; + + newopt = ralloc(permanent, struct extra_option); + newopt->opt = option; + newopt->next = extra_options; + extra_options = newopt; + extra_options_count++; +} + +static char *mktempfile(region r, const char *name) +{ + char *newname; + +#ifdef WIN32 + if (!strncmp(name, "/tmp/", 5)) + { + char *tmpenv = getenv("TMP"); + + if (!tmpenv) + { + fprintf(stderr, "You must define the TMP environment variable to point to a directory\n"); + fprintf(stderr, "for temporary files.\n"); + exit(2); + } + newname = rstralloc(r, strlen(tmpenv) + strlen(name)); + sprintf(newname, "%s/%s", tmpenv, name + 5); + } + else + newname = rstrdup(r, name); + if (!mktemp(newname)) + { + perror("couldn't create temporary file"); + exit(2); + } + +#else + int fd; + + newname = rstrdup(r, name); + fd = mkstemp(newname); + + if (fd < 0) + { + perror("couldn't create temporary file"); + exit(2); + } + + close(fd); +#endif + + return newname; +} + +#if defined(__CYGWIN__) || defined(WIN32) +#include +#ifndef WIN32 +#include +#endif + +static bool safe_dup(int from, int to, int save) +{ + if (dup2(to, save) < 0) + return FALSE; + + return dup2(from, to) >= 0; +} + +static void dup_restore(int to, int save) +{ + if (dup2(save, to) < 0) + { + perror("internal problem - canot restore file descriptor"); + exit(2); + } +} + +static bool +exec_gcc(char *gcc_output_template, bool mkotmp, char **gcc_output_file, + char *gcc_error_template, bool mketmp, char **gcc_error_file, + int nargs, void (*setargs)(void *data, const char **argv), void *data) +{ + int gcc_stat, res, outputfd, errorfd; + const char **argv; + static int tmpfd1 = -1, tmpfd2 = -1; + char *outputf, *errorf; + + argv = alloca((nargs + 2) * sizeof *argv); + argv[0] = target_compiler; + setargs(data, argv + 1); + + /* It's really spammy with this on */ + if (flag_verbose >= 2) + { + int i; + + for (i = 0; argv[i]; i++) + fprintf(stderr, "%s ", argv[i]); + fprintf(stderr, "\n"); + } + + if (tmpfd1 < 0 || tmpfd2 < 0) + { + tmpfd1 = open(DEVNULL, O_RDONLY); + tmpfd2 = open(DEVNULL, O_RDONLY); + + if (tmpfd1 < 0 || tmpfd2 < 0) + { + fprintf(stderr, "Internal error (can't open " DEVNULL "!?)\n"); + exit(2); + } + } + + if (mkotmp) + outputf = mktempfile(permanent, gcc_output_template); + else + outputf = gcc_output_template; + *gcc_output_file = outputf; + + if (mketmp) + errorf = mktempfile(permanent, gcc_error_template); + else + errorf = gcc_error_template; + *gcc_error_file = errorf; + + outputfd = creat(outputf, 0666); + errorfd = creat(errorf, 0666); + + if (outputfd < 0 || errorfd < 0) + { + if (outputfd >= 0) + close(outputfd); + if (errorfd >= 0) + close(errorfd); + + return FALSE; + } + + if (!safe_dup(outputfd, 1, tmpfd1)) + return FALSE; + + if (!safe_dup(errorfd, 2, tmpfd2)) + { + dup_restore(1, tmpfd1); + return FALSE; + } + + close(outputfd); + close(errorfd); + + gcc_stat = spawnvp(_P_WAIT, target_compiler, argv); +#ifdef WIN32 + res = gcc_stat == 0 ? 0 : 2; +#else + if (WIFEXITED(gcc_stat)) + res = WEXITSTATUS(gcc_stat); + else + res = 2; +#endif + + dup_restore(1, tmpfd1); + dup_restore(2, tmpfd2); + + return res == 0; +} +#else +#include + +static bool +exec_gcc(char *gcc_output_template, bool mkotmp, char **gcc_output_file, + char *gcc_error_template, bool mketmp, char **gcc_error_file, + int nargs, void (*setargs)(void *data, const char **argv), void *data) +{ + int gcc_pid, gcc_stat, res; + char *outputf, *errorf; + + if (mkotmp) + outputf = mktempfile(permanent, gcc_output_template); + else + outputf = gcc_output_template; + *gcc_output_file = outputf; + + if (mketmp) + errorf = mktempfile(permanent, gcc_error_template); + else + errorf = gcc_error_template; + *gcc_error_file = errorf; + + if ((gcc_pid = fork()) == 0) + { + const char **argv; + int outputfd = creat(outputf, 0666); + int errorfd = creat(errorf, 0666); + + argv = alloca((nargs + 2) * sizeof *argv); + argv[0] = target_compiler; + setargs(data, argv + 1); + + /* It's really spammy with this on */ + if (flag_verbose >= 2) + { + int i; + + for (i = 0; argv[i]; i++) + fprintf(stderr, "%s ", argv[i]); + fprintf(stderr, "\n"); + } + + if (outputfd < 0 || dup2(outputfd, 1) < 0 || + errorfd < 0 || dup2(errorfd, 2) < 0) + exit(2); + + close(outputfd); + close(errorfd); + + execvp(target_compiler, (char **)argv); + exit(2); + } + + for (;;) + { + int pid = wait(&gcc_stat); + + if (pid == -1) + { + if (errno == EINTR) + continue; + else + { + res = 2; + break; + } + } + + if (pid == gcc_pid) + { + if (WIFEXITED(gcc_stat)) + res = WEXITSTATUS(gcc_stat); + else + res = 2; + break; + } + } + + return res == 0; +} +#endif + +#define LINELEN 160 + +/* Make a copy of path with leading+trailing whitespace removed */ +static char *sanitize_path(region r, const char *path) +{ + char *pcopy; + int l; + + while (ISSPACE(*path)) + path++; + pcopy = rstrdup(r, path); + l = strlen(pcopy); + while (l > 0 && ISSPACE(pcopy[l - 1])) + pcopy[--l] = '\0'; + + return pcopy; +} + +static void gcc_preprocess_init_setargs(void *data, const char **argv) +{ + int opt = 0, i; + struct extra_option *extras; + + argv[opt++] = "-v"; + argv[opt++] = "-x"; + argv[opt++] = "c"; + if (flag_mingw_gcc) + argv[opt++] = "nul:"; + else + argv[opt++] = "/dev/null"; + argv[opt++] = "-E"; + argv[opt++] = "-dM"; + if (flag_nostdinc) + argv[opt++] = "-nostdinc"; + + /* The saved options are reversed */ + for (extras = extra_options, i = extra_options_count; extras; + extras = extras->next) + argv[opt + --i] = extras->opt; + opt += extra_options_count; + + argv[opt++] = NULL; +} + +static char *gcc_builtin_macros_file; + +static void gcc_cpp_cleanup(void) +{ + if (gcc_builtin_macros_file) + unlink(gcc_builtin_macros_file); +} + +const char *gcc_global_cpp_init(void) +{ + static char tbuiltins[] = "/tmp/nesccppbXXXXXX"; + static char tincludes[] = "/tmp/nesccppiXXXXXX"; + char *includes; + FILE *incf; + char line[LINELEN]; + bool quote_includes = FALSE, bracket_includes = FALSE; + + atexit(gcc_cpp_cleanup); + + /* Execute gcc to get builtin macros and include search path */ + if (!exec_gcc(tbuiltins, TRUE, &gcc_builtin_macros_file, + tincludes, TRUE, &includes, + 7 + extra_options_count, gcc_preprocess_init_setargs, NULL)) + return NULL; + + /* Read gcc error output to get search path */ + incf = fopen(includes, "r"); + if (!incf) + { + unlink(includes); + return NULL; + } + + while (fgets(line, LINELEN - 1, incf)) + { + if (!strncmp(line, "#include \"...\"", 14)) + quote_includes = TRUE; + else if (!strncmp(line, "#include <...>", 14)) + bracket_includes = TRUE; + else if (!strncmp(line, "End of search list.", 19)) + break; + else if (bracket_includes) + add_nesc_dir(sanitize_path(permanent, line), CHAIN_SYSTEM); + else if (quote_includes) + add_nesc_dir(sanitize_path(permanent, line), CHAIN_QUOTE); + } + fclose(incf); + unlink(includes); + + return gcc_builtin_macros_file; +} + +void gcc_save_machine_options(const char *opt) +{ + if (opt[1] == 'm') + add_gcc_option(opt); +} + diff --git a/src/nesc-gcc.h b/src/nesc-gcc.h new file mode 100644 index 0000000..703e1c0 --- /dev/null +++ b/src/nesc-gcc.h @@ -0,0 +1,25 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002-2008 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef NESC_GCC_H +#define NESC_GCC_H + +const char *gcc_global_cpp_init(void); +void add_gcc_option(const char *option); +void gcc_save_machine_options(const char *opt); + +#endif diff --git a/src/nesc-generate.c b/src/nesc-generate.c new file mode 100644 index 0000000..890dd1a --- /dev/null +++ b/src/nesc-generate.c @@ -0,0 +1,1379 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include "parser.h" +#include "c-parse.h" +#include "nesc-generate.h" +#include "nesc-inline.h" +#include "nesc-component.h" +#include "nesc-semantics.h" +#include "nesc-c.h" +#include "unparse.h" +#include "AST_utils.h" +#include "edit.h" +#include "semantics.h" +#include "constants.h" +#include "nesc-concurrency.h" +#include "nesc-uses.h" +#include "nesc-network.h" +#include "nesc-atomic.h" +#include "nesc-cpp.h" + +static void prt_nesc_function_hdr(data_declaration fn_decl, + psd_options options) +/* Effects: prints the C function declaration for fn_decl +*/ +{ + /* We print the declaration from the interface rather than that of fn_decl + itself, as this latter may use not-yet-defined typedefs. + prt_declarator will use the name from fn_decl in its output. */ + variable_decl ifn_vd = CAST(variable_decl, fn_decl->ast); + data_decl fn_dd = CAST(data_decl, ifn_vd->parent); + psd_options opts; + function_declarator fd; + asttype ret; + + prt_diff_info(fn_decl); + set_location(fn_dd->location); + if (!is_binary_component(fn_decl->container->impl)) + output("static "); + + /* Functions returning a network type should return the base type + instead */ + if (is_function_declarator(ifn_vd->declarator)) + opts = psd_rewrite_nxbase; + else + opts = 0; + options |= psd_rename_parameters; + + fd = get_fdeclarator(ifn_vd->declarator); + /* Handle nesdoc-overridden return type */ + if (fd && (ret = fd->return_type)) + { + prt_attribute_elements(fn_dd->modifiers); + prt_type_elements(ret->qualifiers, opts); + prt_declarator(ret->declarator, NULL, ifn_vd->attributes, fn_decl, + options | psd_print_ddecl_fdeclarator); + } + else + { + prt_type_elements(fn_dd->modifiers, opts); + prt_declarator(ifn_vd->declarator, NULL, ifn_vd->attributes, fn_decl, + options); + } +} + +void prt_nesc_function_declaration(data_declaration fndecl, void *data) +{ + if (fndecl->definition && fndecl->isused && !fndecl->suppress_definition) + { + prt_nesc_function_hdr(fndecl, psd_print_default); + outputln(";"); + } +} + +void prt_nesc_function_declarations(nesc_declaration mod) +{ + component_functions_iterate(mod, prt_nesc_function_declaration, NULL); +} + +/* A description of the target functions a used function is connected to */ +typedef struct full_connection +{ + endp ep; + expression cond; + expression args; +} *full_connection; + + +struct connections +{ + /* Connection being sought */ + region r; + cgraph cg; + data_declaration called; + + /* the list of targets which are called generically (with generic arguments + passed through unchanged). NULL if 'called' is not generic. + Both 'cond' and 'args' are NULL for generic_calls */ + dd_list/**/ generic_calls; + + /* normal_calls is the list of all other targets. + + If 'called' is generic, 'cond' is the expression list that must match + the generic parameters of 'called' for the call to 'ep' to + take place. 'args' is the expression list to add to the arguments + if 'ep' is generic. */ + dd_list/**/ normal_calls; + + /* The combiner function used, if any */ + data_declaration combiner; +}; + +static full_connection new_full_connection(region r, endp ep, expression cond, + expression args) +{ + full_connection c = ralloc(r, struct full_connection); + + c->ep = ep; + c->cond = cond; + c->args = args; + + return c; +} + +static type function_return_type(data_declaration fndecl) +{ + return type_function_return_type(get_actual_function_type(fndecl->type)); +} + +void prt_ncf_header(struct connections *c, type return_type) +{ + if (c->called->makeinline && flag_no_inline < 2) + output("inline "); + prt_nesc_function_hdr(c->called, 0); + outputln("{"); + indent(); + if (!type_void(return_type)) + { + prt_data_decl(build_declaration(parse_region, NULL, return_type, "result", NULL, NULL)); + newline(); + } +} + +void prt_ncf_trailer(type return_type) +{ + if (!type_void(return_type)) + { + newline(); + outputln("return result;"); + } + unindent(); + outputln("}"); +} + +static bool prt_arguments(declaration parms, bool first, bool rename) +/* Effects: prints argument list composed of the variables declared in 'parms'. + 'first' must be TRUE iff no arguments have yet been printed. + Returns: TRUE iff 'first' and no arguments printed +*/ +{ + declaration parm; + + scan_declaration (parm, parms) + { + /* Not supporting ... here for now. Fix requires different approach */ + data_decl dd = CAST(data_decl, parm); + variable_decl vd = CAST(variable_decl, dd->decls); + + if (!vd->ddecl) /* empty (void) parameter list */ + break; + + if (!first) + output(", "); + first = FALSE; + + if (rename || !vd->ddecl->name) + output("arg_%p", vd->ddecl); + else + output((char *)vd->ddecl->name); + } + return first; +} + +void prt_ncf_direct_call(struct connections *c, + full_connection ccall, + bool first_call, + psd_options options, + type return_type, + function_declarator called_fd) +/* Effects: prints call to 'calls' in a connection function. + Assigns result if last_call is TRUE. +*/ +{ + bool first_arg = TRUE; + data_declaration combiner = type_combiner(return_type); + bool calling_combiner = FALSE; + + if (!type_void(return_type)) + { + output("result = "); + + /* Combine w/ the combiner on subsequent calls */ + if (!first_call && combiner) + { + output("%s(result, ", combiner->name); + calling_combiner = TRUE; + } + } + + prt_ddecl_full_name(ccall->ep->function, options); + output("("); + if (ccall->ep->function->gparms) + { + if (ccall->args) + { + /* Non-generic calling generic, add arguments */ + prt_expressions(ccall->args, first_arg); + first_arg = FALSE; + } + else + { + /* Generic calling generic, pass arguments through */ + first_arg = prt_arguments(ddecl_get_gparms(c->called), first_arg, TRUE); + } + } + else + assert(!ccall->args); + + prt_arguments(called_fd->parms, first_arg, FALSE); + + if (calling_combiner) + output(")"); + + outputln(");"); +} + +void prt_ncf_default_call(struct connections *c, + type return_type, + function_declarator called_fd) +{ + struct full_connection default_target; + struct endp default_ep; + + default_target.ep = &default_ep; + default_target.cond = default_target.args = NULL; + default_ep.function = c->called; + + prt_ncf_direct_call(c, &default_target, TRUE, psd_print_default, + return_type, called_fd); +} + +bool prt_ncf_direct_calls(struct connections *c, + dd_list/**/ calls, + type return_type) +/* Effects: prints calls to 'calls' in a connection function. +*/ +{ + dd_list_pos call; + bool first_call = TRUE; + function_declarator called_fd = ddecl_get_fdeclarator(c->called); + + dd_scan (call, calls) + { + full_connection ccall = DD_GET(full_connection, call); + + assert(!ccall->cond); + + prt_ncf_direct_call(c, ccall, first_call, 0, return_type, called_fd); + first_call = FALSE; + } + + return first_call; +} + +static int constant_expression_list_compare(expression arg1, expression arg2) +{ + while (arg1) + { + largest_int uval1, uval2; + + uval1 = cval_sint_value(arg1->cst->cval); + uval2 = cval_sint_value(arg2->cst->cval); + + /* Can't use - as might overflow and mod down to 0 */ + if (uval1 < uval2) + return -1; + else if (uval1 > uval2) + return 1; + + arg1 = CAST(expression, arg1->next); + arg2 = CAST(expression, arg2->next); + } + assert(!arg2); + + return 0; +} + +static int condition_compare(const void *p1, const void *p2) +{ + struct full_connection *const *c1 = p1, *const *c2 = p2; + + return constant_expression_list_compare((*c1)->cond, (*c2)->cond); +} + +static void prt_ncf_condition(struct connections *c, expression cond) +{ + declaration gparm; + bool first = TRUE; + + scan_declaration (gparm, ddecl_get_gparms(c->called)) + { + data_decl dd = CAST(data_decl, gparm); + variable_decl vd = CAST(variable_decl, dd->decls); + + if (first) + output("if ("); + else + output(" && "); + first = FALSE; + + output("arg_%p == ", vd->ddecl); + prt_expression(cond, P_REL); + + cond = CAST(expression, cond->next); + } + output(") "); +} + +static void prt_ncf_conditional_calls(struct connections *c, bool first_call, type return_type) +{ + dd_list_pos call; + int i, j, ncalls = dd_length(c->normal_calls); + full_connection *cond_eps = + rarrayalloc(c->r, ncalls, full_connection); + function_declarator called_fd = ddecl_get_fdeclarator(c->called); + bool one_arg = FALSE; + + /* No work to do */ + if (ncalls == 0 && !dd_is_empty(c->generic_calls)) + return; + + /* Sort calls so we can find connections with the same conditions */ + i = 0; + dd_scan (call, c->normal_calls) + cond_eps[i++] = DD_GET(full_connection, call); + qsort(cond_eps, ncalls, sizeof(full_connection), condition_compare); + + if (ncalls > 0 && !cond_eps[0]->cond->next) + { + /* use switch rather than cascaded ifs (gcc generate better code) */ + one_arg = TRUE; + output("switch ("); + prt_arguments(ddecl_get_gparms(c->called), TRUE, TRUE); + outputln(") {"); + indent(); + } + + /* output the calls */ + i = 0; + while (i < ncalls) + { + expression cond = cond_eps[i]->cond; + bool first_cond_call = first_call; + + /* output latest condition */ + if (one_arg) + { + output("case "); + prt_expression(cond, P_ASSIGN); + outputln(":"); + } + else + { + if (i != 0) + output("else "); + prt_ncf_condition(c, cond); + outputln("{"); + } + indent(); + + /* find last target with same condition */ + j = i; + while (++j < ncalls && condition_compare(&cond_eps[i], &cond_eps[j]) == 0) + ; + + /* print them, setting result for the last one */ + while (i < j) + { + prt_ncf_direct_call(c, cond_eps[i], first_cond_call, 0, + return_type, called_fd); + first_cond_call = FALSE; + i++; + } + + if (one_arg) + outputln("break;"); + unindent(); + if (!one_arg) + outputln("}"); + } + /* output call to default if there are no non-conditional calls */ + if (first_call) + { + if (ncalls > 0) + { + if (one_arg) + outputln("default:"); + else + outputln("else"); + } + indent(); + prt_ncf_default_call(c, return_type, called_fd); + unindent(); + if (ncalls > 0 && one_arg) + { + outputln(" break;"); + outputln("}"); + unindent(); + } + } + else if (one_arg) + { + unindent(); + outputln("}"); + } +} + +static void prt_nesc_connection_function(struct connections *c) +{ + type return_type = function_return_type(c->called); + + set_fixed_location(c->called->ast->location); + + if (type_network_base_type(return_type)) + return_type = type_network_platform_type(return_type); + + prt_ncf_header(c, return_type); + + if (c->called->gparms) + { + bool first_call; + + first_call = prt_ncf_direct_calls(c, c->generic_calls, return_type); + prt_ncf_conditional_calls(c, first_call, return_type); + } + else + { + if (dd_is_empty(c->normal_calls)) + prt_ncf_default_call(c, return_type, + ddecl_get_fdeclarator(c->called)); + else + prt_ncf_direct_calls(c, c->normal_calls, return_type); + } + + prt_ncf_trailer(return_type); + + clear_fixed_location(); +} + +void prt_nesc_called_function_hdr(data_declaration fndecl, void *data) +{ + if (!(fndecl->defined || fndecl->uncallable) && fndecl->isused) + { + prt_nesc_function_hdr(fndecl, 0); + outputln(";"); + } + /* This is a handy place to check that all binary entry points are + callable */ + if (!fndecl->defined && fndecl->uncallable && + is_binary_component(fndecl->container->impl)) + error("binary entry point %s%s%s.%s is not fully wired", + fndecl->container->instance_name, + fndecl->interface ? "." : "", + fndecl->interface ? fndecl->interface->name : "", + fndecl->name); +} + +void prt_nesc_called_function_headers(cgraph cg, nesc_declaration mod) +{ + component_functions_iterate(mod, prt_nesc_called_function_hdr, NULL); +} + +void prt_nesc_module(cgraph cg, nesc_declaration mod) +{ + prt_nesc_called_function_headers(cg, mod); + + if (is_binary_component(mod->impl)) + return; + + prt_toplevel_declarations(CAST(module, mod->impl)->decls); + + /* Make local static variables gloabal when nido is used. + Note: this raises several issues (aka problems): + - local static variables are named mod$fn$x rather than just x + (mildly confusing when debugging) + - the generated code will have errors (or worse, incorrect + behaviour) if the local static declaration relied on local + declarations inside fn (e.g., typedefs, enums, structs). + There's no really nice fix to this except renaming and + extracting all such entities (maybe this can be done when + we have our own version of gdb and preserving symbol names + is less important) + */ + if (use_nido) + { + dd_list_pos scan; + + dd_scan (scan, mod->local_statics) + { + data_declaration localsvar = DD_GET(data_declaration, scan); + variable_decl localsvd; + data_decl localsdd; + + if (!localsvar->isused) + continue; + + localsvd = CAST(variable_decl, localsvar->ast); + localsdd = CAST(data_decl, localsvd->parent); + /* Note: we don't print the elements with pte_duplicate as we + don't (easily) know here if the elements will be printed + several times. If the type elements define a new type we most + likely have a problem anyway (see discussion above) */ + prt_variable_decl(localsdd->modifiers, localsvd, 0); + outputln(";"); + } + } +} + +static bool find_reachable_functions(struct connections *c, gnode n, + expression gcond, expression gargs) +{ + endp ep = NODE_GET(endp, n); + + if (ep->args_node) + { + /* First set of arguments is a condition if 'called' is generic */ + if (c->called->gparms && !gcond) + gcond = ep->args_node; + else if (gargs) + { + /* We already have some arguments, so this is a condition again. + If the condition doesn't match gargs, then the call is + filtered out. If they do match, we set gargs to null (we're + back to a non-parameterised call) */ + if (constant_expression_list_compare(gargs, ep->args_node) != 0) + return FALSE; + gargs = NULL; + } + else + { + assert(!gargs); + gargs = ep->args_node; + } + } + if (graph_node_markedp(n)) + return TRUE; + else if (!ep->args_node && ep->function->defined && + !ep->function->container->configuration) + { + full_connection target = new_full_connection(c->r, ep, gcond, gargs); + + assert(!graph_first_edge_out(n)); + + dd_add_last(c->r, + c->called->gparms && !gcond ? + c->generic_calls : c->normal_calls, + target); + } + else + { + gedge out; + + graph_mark_node(n); + graph_scan_out (out, n) + if (find_reachable_functions(c, graph_edge_to(out), gcond, gargs)) + return TRUE; + graph_unmark_node(n); + } + return FALSE; +} + +static void find_connected_functions(struct connections *c) +{ + gnode called_fn_node; + + graph_clear_all_marks(cgraph_graph(c->cg)); + called_fn_node = fn_lookup(c->cg, c->called); + assert(!graph_first_edge_in(called_fn_node)); + if (find_reachable_functions(c, called_fn_node, NULL, NULL)) + error_with_location(c->called->ast->location, + "cycle in configuration (for %s%s%s.%s)", + c->called->container->name, + c->called->interface ? "." : "", + c->called->interface ? c->called->interface->name : "", + c->called->name); +} + +static void combine_warning(struct connections *c) +{ + if (warn_no_combiner) + { + /* Warnings to be enabled when result_t gets defined correctly */ + if (c->called->interface) + nesc_warning("calls to %s.%s in %s fan out, but there is no combine function specified for the return type", + c->called->interface->name, + c->called->name, + c->called->container->name); + else + nesc_warning("calls to %s in %s fan out, but there is no combine function specified for the return type" , + c->called->name, c->called->container->name); + } +} + +static bool combiner_used; + +static bool cicn_direct_calls(dd_list/**/ calls) +{ + dd_list_pos first = dd_first(calls); + + if (dd_is_end(first)) + return TRUE; + + if (!dd_is_end(dd_next(first))) + combiner_used = TRUE; + + return FALSE; +} + +static void cicn_conditional_calls(struct connections *c, bool first_call) +{ + dd_list_pos call; + int i, j, ncalls = dd_length(c->normal_calls); + full_connection *cond_eps = + rarrayalloc(c->r, ncalls, full_connection); + + /* Sort calls so we can find connections with the same conditions */ + i = 0; + dd_scan (call, c->normal_calls) + cond_eps[i++] = DD_GET(full_connection, call); + qsort(cond_eps, ncalls, sizeof(full_connection), condition_compare); + + /* output the calls */ + i = 0; + while (i < ncalls) + { + /* find last target with same condition */ + j = i; + while (++j < ncalls && condition_compare(&cond_eps[i], &cond_eps[j]) == 0) + ; + + if (i + first_call < j) + combiner_used = TRUE; + i = j; + } +} + +static void check_if_combiner_needed(struct connections *c) +{ + /* To see if a combiner is needed, we follow (a simplified form of) the + logic used in printing the connection function (see + prt_nesc_connection_function) */ + type return_type = function_return_type(c->called); + + if (type_void(return_type)) /* No combiner needed */ + return; + + combiner_used = FALSE; + + if (c->called->gparms) + { + bool first_call; + + first_call = cicn_direct_calls(c->generic_calls); + cicn_conditional_calls(c, first_call); + } + else + cicn_direct_calls(c->normal_calls); + + if (combiner_used) + { + c->combiner = type_combiner(return_type); + if (!c->combiner) + combine_warning(c); + } +} + +void find_function_connections(data_declaration fndecl, void *data) +{ + cgraph cg = data; + + if (!fndecl->defined) + { + region r = parse_region; + struct connections *connections; + + fndecl->connections = connections = ralloc(r, struct connections); + connections->r = r; + connections->cg = cg; + connections->called = fndecl; + + connections->generic_calls = dd_new_list(r); + connections->normal_calls = dd_new_list(r); + + find_connected_functions(connections); + + /* a function is uncallable if it has no default definition and + non-generic: no connections + generic: no generic connections + */ + if (!(fndecl->definition || + !dd_is_empty(connections->generic_calls) || + (!fndecl->gparms && !dd_is_empty(connections->normal_calls)))) + fndecl->uncallable = TRUE; + else + fndecl->suppress_definition = + !dd_is_empty(fndecl->gparms ? connections->generic_calls : + connections->normal_calls); + + check_if_combiner_needed(connections); + } +} + +void find_connections(cgraph cg, nesc_declaration mod) +{ + component_functions_iterate(mod, find_function_connections, cg); +} + +static void mark_reachable_function(cgraph cg, + data_declaration caller, + data_declaration ddecl, + use caller_use); + +static void mark_connected_function_list(cgraph cg, + data_declaration caller, + dd_list/*full_connection*/ calls) +{ + dd_list_pos connected; + + dd_scan (connected, calls) + { + full_connection conn = DD_GET(full_connection, connected); + + mark_reachable_function(cg, caller, conn->ep->function, + new_use(dummy_location, caller, c_executable | c_fncall)); + } +} + +static void mark_reachable_function(cgraph cg, + data_declaration caller, + data_declaration ddecl, + use caller_use) +{ + dd_list_pos use; + + if (caller && ddecl->kind == decl_function) + graph_add_edge(fn_lookup(cg, caller), fn_lookup(cg, ddecl), caller_use); + + /* Hack because ALLCODE env variable adds task decl's to spontaneous_calls */ + if (type_task(ddecl->type) && ddecl->interface) + return; + + if (ddecl->isused) + return; + ddecl->isused = TRUE; + + if (ddecl->kind != decl_function || + (ddecl->container && + !(ddecl->container->kind == l_component && + !ddecl->container->configuration))) + return; + + if ((ddecl->ftype == function_command || ddecl->ftype == function_event) && + !ddecl->defined) + { + struct connections *conn = ddecl->connections; + + /* Call to a command or event not defined in this module. + Mark all connected functions */ + mark_connected_function_list(cg, ddecl, conn->generic_calls); + mark_connected_function_list(cg, ddecl, conn->normal_calls); + if (conn->combiner) + mark_reachable_function(cg, ddecl, conn->combiner, + new_use(dummy_location, caller, c_executable | c_fncall)); + + /* Don't process body of suppressed default defs */ + if (ddecl->suppress_definition) + return; + } + + /* Make sure ddecl gets a node in the graph even if it doesn't call + anything */ + fn_lookup(cg, ddecl); + + if (ddecl->fn_uses) + dd_scan (use, ddecl->fn_uses) + { + iduse i = DD_GET(iduse, use); + + mark_reachable_function(cg, ddecl, i->id, i->u); + } +} + +static declaration dummy_function(data_declaration ddecl) +{ + empty_stmt body = new_empty_stmt(parse_region, dummy_location); + function_decl fd = + new_function_decl(parse_region, dummy_location, NULL, NULL, NULL, NULL, + CAST(statement, body), NULL, NULL); + + fd->ddecl = ddecl; + + return CAST(declaration, fd); +} + +static void mark_binary_reachable(data_declaration fndecl, void *data) +{ + if (fndecl->defined) + { + fndecl->definition = dummy_function(fndecl); + fndecl->noinlinep = TRUE; + } + else + mark_reachable_function(data, NULL, fndecl, NULL); +} + +static cgraph mark_reachable_code(dd_list modules) +{ + dd_list_pos used, mod; + cgraph cg = new_cgraph(parse_region); + + /* We use the connection graph type to represent our call graph */ + + dd_scan (used, spontaneous_calls) + mark_reachable_function(cg, NULL, DD_GET(data_declaration, used), NULL); + dd_scan (used, nglobal_uses) + mark_reachable_function(cg, NULL, DD_GET(iduse, used)->id, NULL); + + /* All used functions from binary components are entry points */ + dd_scan (mod, modules) + { + nesc_declaration m = DD_GET(nesc_declaration, mod); + + if (is_binary_component(m->impl)) + component_functions_iterate(m, mark_binary_reachable, cg); + } + + return cg; +} + +static void prt_nesc_function(data_declaration fn) +{ + assert(fn->kind == decl_function); + + if (fn->definition && !fn->suppress_definition && + !(fn->container && is_binary_component(fn->container->impl))) + prt_function_body(CAST(function_decl, fn->definition)); + + /* if this is a connection function, print it now */ + if ((fn->ftype == function_command || fn->ftype == function_event) && + !fn->defined && !fn->uncallable) + prt_nesc_connection_function(fn->connections); +} + +static bool isinlined(data_declaration fn) +{ + return fn->isinline || fn->makeinline; +} + +static void topological_prt(gnode gep, bool force) +{ + gedge out; + data_declaration fn; + + fn = NODE_GET(endp, gep)->function; + if (isinlined(fn) || force) + { + if (graph_node_markedp(gep)) + return; + + graph_mark_node(gep); + + graph_scan_out (out, gep) + topological_prt(graph_edge_to(out), FALSE); + + prt_nesc_function(fn); + } +} +static void prt_inline_functions(cgraph callgraph) +{ + gnode fns; + + graph_clear_all_marks(cgraph_graph(callgraph)); + graph_scan_nodes (fns, cgraph_graph(callgraph)) + { + data_declaration fn = NODE_GET(endp, fns)->function; + if (isinlined(fn)) + { + gedge callers; + bool inlinecallers = FALSE; + + graph_scan_in (callers, fns) + { + data_declaration caller = + NODE_GET(endp, graph_edge_from(callers))->function; + + if (isinlined(caller)) + { + inlinecallers = TRUE; + break; + } + } + + if (!inlinecallers) + topological_prt(fns, FALSE); + } + } +} + +static void prt_noninline_functions(cgraph callgraph) +{ + gnode fns; + graph_scan_nodes (fns, cgraph_graph(callgraph)) + { + data_declaration fn = NODE_GET(endp, fns)->function; + + if (!isinlined(fn)) + { + /* There may be some inlined functions which were not printed + earlier, because they were: + a) recursive (possibly indirectly), with explicit inline + keywords + b) not called from another inline function + So we use topological_prt here to ensure they are printed + before any calls to them from non-inlined functions + */ + topological_prt(fns, TRUE); + } + } +} + +static void suppress_function(const char *name) +{ + data_declaration d = lookup_global_id(name); + + if (d && d->kind == decl_function && d->definition) + d->suppress_definition = TRUE; +} + +static void prt_ddecl_for_init(region r, data_declaration ddecl) +{ + type_quals dquals = type_qualifiers(ddecl->type); + if (dquals & const_qualifier) + { + /* We need to cast the const away */ + type nonconst; + declarator nc_decl; + type_element nc_mods; + asttype nc_type; + + output("*("); + nonconst = make_qualified_type(ddecl->type, dquals & ~const_qualifier); + type2ast(r, dummy_location, make_pointer_type(nonconst), NULL, + &nc_decl, &nc_mods); + nc_type = new_asttype(r, dummy_location, nc_decl, nc_mods); + prt_asttype(nc_type); + output(")&"); + } + prt_plain_ddecl(ddecl, 0); + output("[__nesc_mote]"); +} + +static void prt_nido_initializer(region r, variable_decl vd) +{ + data_declaration ddecl = vd->ddecl; + expression init; + + if (!ddecl || !ddecl->isused || ddecl->kind != decl_variable) + return; /* Don't print if not referenced */ + + init = vd->arg1; + + if (!init) + { + output("memset((void *)&"); + prt_ddecl_for_init(r, ddecl); + output(", 0, sizeof "); + prt_ddecl_for_init(r, ddecl); + output(")"); + } + else if (is_init_list(init)) + { + declarator vtype; + type_element vmods; + + output("memcpy((void *)&"); + prt_ddecl_for_init(r, ddecl); + + output(", (void *)&"); + type2ast(parse_region, dummy_location, ddecl->type, NULL, + &vtype, &vmods); + output("("); + prt_declarator(vtype, vmods, NULL, NULL, 0); + output(")"); + prt_expression(init, P_ASSIGN); + + output(", sizeof "); + prt_ddecl_for_init(r, ddecl); + output(")"); + } + else + { + prt_ddecl_for_init(r, ddecl); + output(" = "); + prt_expression(init, P_ASSIGN); + } + outputln(";"); +} + +static void prt_nido_initializations(nesc_declaration mod) +{ + declaration dlist; + declaration d; + dd_list_pos lscan; + region r; + + /* binary component? */ + if (!is_module(mod->impl)) + return; + + r = newregion(); + dlist = CAST(module, mod->impl)->decls; + outputln("/* Module %s */", mod->name); + + /* Static variables */ + scan_declaration (d, dlist) + { + declaration reald = ignore_extensions(d); + variable_decl vd; + + if (reald->kind != kind_data_decl) + continue; + + scan_variable_decl (vd, CAST(variable_decl, CAST(data_decl, d)->decls)) + prt_nido_initializer(r, vd); + } + + /* Local static variables */ + dd_scan (lscan, mod->local_statics) + { + data_declaration localsd = DD_GET(data_declaration, lscan); + + prt_nido_initializer(r, CAST(variable_decl, localsd->ast)); + } + deleteregion(r); + newline(); +} + +static void prt_nido_initialize(dd_list modules) +{ + dd_list_pos mod; + + nido_mote_number = "__nesc_mote"; + outputln("/* Invoke static initialisers for mote '__nesc_mote' */\n"); + outputln("static void __nesc_nido_initialise(int __nesc_mote)"); + outputln("{"); + indent(); + + dd_scan (mod, modules) + prt_nido_initializations(DD_GET(nesc_declaration, mod)); + + unindent(); + outputln("}"); +} + +static void prt_typedefs(nesc_declaration comp) +{ + declaration parm; + + scan_declaration (parm, comp->parameters) + if (is_type_parm_decl(parm)) + { + type_parm_decl td = CAST(type_parm_decl, parm); + asttype arg = CAST(type_argument, td->ddecl->initialiser)->asttype; + + output("typedef "); + prt_declarator(arg->declarator, arg->qualifiers, NULL, td->ddecl, + psd_print_ddecl); + outputln(";"); + } +} + +void prt_nesc_interface_typedefs(nesc_declaration comp) +{ + const char *ifname; + void *ifentry; + env_scanner scanifs; + + env_scan(comp->env->id_env, &scanifs); + while (env_next(&scanifs, &ifname, &ifentry)) + { + data_declaration idecl = ifentry; + + if (idecl->kind == decl_interface_ref) + prt_typedefs(idecl->itype); + } +} + +void prt_nesc_typedefs(nesc_declaration comp); + +void prt_configuration_declarations(declaration dlist) +{ + declaration d; + + scan_declaration (d, dlist) + if (is_component_ref(d)) + prt_nesc_typedefs(CAST(component_ref, d)->cdecl); + else + prt_toplevel_declaration(d); +} + +void prt_nesc_typedefs(nesc_declaration comp) +{ + assert(!comp->abstract); + if (comp->printed) + return; + comp->printed = TRUE; + if (comp->original) + prt_typedefs(comp); + + /* Print declarations in specification */ + prt_toplevel_declarations(CAST(component, comp->ast)->decls); + + /* Only module interface type arguments are used in output */ + if (!comp->configuration) + prt_nesc_interface_typedefs(comp); + else + /* Recursively print declarations found in configurations */ + prt_configuration_declarations(CAST(configuration, comp->impl)->decls); +} + +static void prt_nido_resolver(region r, variable_decl vd) +{ + data_declaration ddecl = vd->ddecl; + expression init; + + if (!ddecl || !ddecl->isused || ddecl->kind != decl_variable) + return; /* Don't print if not referenced */ + + init = vd->arg1; + + output("if (!strcmp(varname, \""); + prt_plain_ddecl(ddecl, 0); + outputln("\"))"); + outputln("{"); + indent(); + output("*addr = (uintptr_t)&"); + prt_ddecl_for_init(r, ddecl); + outputln(";"); + output("*size = sizeof("); + prt_ddecl_for_init(r, ddecl); + outputln(");"); + outputln("return 0;"); + unindent(); + outputln("}"); +} + +static void prt_nido_resolvers(nesc_declaration mod) +{ + declaration dlist; + declaration d; + region r; + + /* binary component? */ + if (!is_module(mod->impl)) + return; + + r = newregion(); + dlist = CAST(module, mod->impl)->decls; + outputln("/* Module %s */", mod->name); + + /* Static variables */ + scan_declaration (d, dlist) + { + declaration reald = ignore_extensions(d); + variable_decl vd; + + if (reald->kind != kind_data_decl) + continue; + + scan_variable_decl (vd, CAST(variable_decl, CAST(data_decl, d)->decls)) + prt_nido_resolver(r, vd); + } + deleteregion(r); + + newline(); +} + +static void prt_nido_resolver_function(dd_list modules) +{ + dd_list_pos mod; + + outputln("/* Nido variable resolver function */\n"); + outputln("static int __nesc_nido_resolve(int __nesc_mote,"); + outputln(" char* varname,"); + outputln(" uintptr_t* addr, size_t* size)"); + outputln("{"); + indent(); + + dd_scan (mod, modules) + prt_nido_resolvers(DD_GET(nesc_declaration, mod)); + + outputln("return -1;"); + + unindent(); + outputln("}"); +} + +static void include_support_functions(void) +{ + static char *fns[] = { + "__nesc_atomic_start", + "__nesc_atomic_end", + "__nesc_enable_interrupt", + "__nesc_disable_interrupt", + "__nesc_nido_initialise", + "__nesc_nido_resolve" + }; + int i; + + for (i = 0; i < sizeof fns / sizeof *fns; i++) + { + data_declaration fndecl = lookup_global_id(fns[i]); + + /* Adding the function to spontaneous_calls w/o setting the + spontaneous field makes the function stay static */ + if (fndecl && fndecl->kind == decl_function && !fndecl->spontaneous) + dd_add_last(parse_region, spontaneous_calls, fndecl); + } +} + +void generate_c_code(const char *target_name, nesc_declaration program, + cgraph cg, dd_list modules, dd_list components) +{ + dd_list_pos mod; + cgraph callgraph; + FILE *output = NULL, *diff_file = NULL; + + if (target_name) + { + output = fopen(target_name, "w"); + if (!output) + { + perror("couldn't create output file"); + exit(2); + } + } + + if (diff_output) + { + char *diffname = rstralloc(permanent, strlen(diff_output) + 9); + + if (use_nido) + { + /* There's no use for nido+diffs, and it would complicate + things somewhat (nido changes rules for symbols, etc) */ + error("diff output is not supported with simulation"); + exit(1); + } + sprintf(diffname, "%s/symbols", diff_output); + diff_file = fopen(diffname, "w"); + if (!diff_file) + { + fprintf(stderr, "couldn't create diff output file %s: ", diffname); + perror(NULL); + exit(2); + } + } + + include_support_functions(); + + unparse_start(output ? output : stdout, diff_file); + disable_line_directives(); + + /* define nx_struct as struct and nx_union as union (simplifies + prt_tag) */ + outputln("#define nx_struct struct"); + outputln("#define nx_union union"); + + /* suppress debug functions if necessary */ + if (flag_no_debug) + { + suppress_function("dbg"); + suppress_function("dbg_clear"); + suppress_function("dbg_active"); + outputln("#define dbg(mode, format, ...) ((void)0)"); + outputln("#define dbg_clear(mode, format, ...) ((void)0)"); + outputln("#define dbg_active(mode) 0"); + } + + /* We start by finding each module's identifier uses and connections + and marking uncallable functions */ + collect_uses(all_cdecls); + handle_network_types(all_cdecls); + dd_scan (mod, modules) + { + nesc_declaration m = DD_GET(nesc_declaration, mod); + + if (is_module(m->impl)) + { + declaration body = CAST(module, m->impl)->decls; + + collect_uses(body); + handle_network_types(body); + } + + find_connections(cg, m); + } + + /* Then we set the 'isused' bit on all functions that are reachable + from spontaneous_calls or global_uses */ + callgraph = mark_reachable_code(modules); + + check_async(callgraph); + check_races(callgraph); + isatomic(callgraph); + + inline_functions(callgraph); + + /* Then we print the code. */ + /* The C declarations first */ + enable_line_directives(); + prt_toplevel_declarations(all_cdecls); + disable_line_directives(); + + /* Typedefs for abstract module type arguments. This relies on the fact + that abstract configurations are present in the components list ahead + of the abstract modules that they instantiate */ + if (program) + prt_nesc_typedefs(program); + + enable_line_directives(); + + dd_scan (mod, modules) + prt_nesc_function_declarations(DD_GET(nesc_declaration, mod)); + + dd_scan (mod, modules) + prt_nesc_module(cg, DD_GET(nesc_declaration, mod)); + + prt_inline_functions(callgraph); + prt_noninline_functions(callgraph); + + if (use_nido) + { + prt_nido_resolver_function(modules); + disable_line_directives(); + prt_nido_initialize(modules); + } + + unparse_end(); + + if (output) + fclose(output); + if (diff_file) + fclose(diff_file); +} diff --git a/src/nesc-generate.h b/src/nesc-generate.h new file mode 100644 index 0000000..76ca45e --- /dev/null +++ b/src/nesc-generate.h @@ -0,0 +1,26 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef NESC_GENERATE_H +#define NESC_GENERATE_H + +#include "nesc-cg.h" + +void generate_c_code(const char *target_name, nesc_declaration program, + cgraph cg, dd_list modules, dd_list components); + +#endif diff --git a/src/nesc-inline.c b/src/nesc-inline.c new file mode 100644 index 0000000..b3897bc --- /dev/null +++ b/src/nesc-inline.c @@ -0,0 +1,432 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include "parser.h" +#include "nesc-inline.h" +#include "constants.h" +#include "flags.h" + +enum { + base_inlineable_size = 9, + inline_per_arg = 2 +}; + +struct inline_node +{ + data_declaration fn; + size_t size; + bool uninlinable; +}; + +static void ig_add_fn(region r, ggraph ig, data_declaration fn, size_t size) +{ + struct inline_node *n = ralloc(r, struct inline_node); + + n->fn = fn; + n->size = size; + fn->ig_node = graph_add_node(ig, n); +} + +static void ig_add_edge(data_declaration from, data_declaration to) +{ + graph_add_edge(from->ig_node, to->ig_node, NULL); + + /* Recursion - mark as uninlinable */ + if (from == to) + { + struct inline_node *n = NODE_GET(struct inline_node *, from->ig_node); + + n->uninlinable = TRUE; + } +} + +static size_t statement_size(statement stmt, bool inatomic); +static size_t expression_size(expression expr, bool inatomic); + +static size_t elist_size(expression elist, bool inatomic) +{ + expression e; + size_t sum = 0; + + scan_expression (e, elist) + sum += expression_size(e, inatomic); + + return sum; +} + + +static size_t expression_size(expression expr, bool inatomic) +{ + size_t sum = 0; + + if (!expr) + return 0; + + if (expr->cst || is_string(expr)) + return 1; + + switch (expr->kind) + { + case kind_identifier: + sum += 1; + break; + + case kind_comma: + sum += elist_size(CAST(comma, expr)->arg1, inatomic); + break; + + case kind_cast_list: { + sum += expression_size(CAST(cast_list, expr)->init_expr, inatomic); + break; + } + case kind_init_specific: { + init_specific init = CAST(init_specific, expr); + + sum += expression_size(init->init_expr, inatomic); + break; + } + case kind_init_list: { + sum += elist_size(CAST(init_list, expr)->args, inatomic); + break; + } + case kind_conditional: { + conditional ce = CAST(conditional, expr); + + if (ce->condition->cst) + { + if (definite_zero(ce->condition)) + sum += expression_size(ce->arg2, inatomic); + else + sum += expression_size(ce->arg1, inatomic); + } + else + { + sum += 2 + expression_size(ce->condition, inatomic); + sum += expression_size(ce->arg1, inatomic); + sum += expression_size(ce->arg2, inatomic); + } + break; + } + case kind_compound_expr: + sum += statement_size(CAST(compound_expr, expr)->stmt, inatomic); + break; + + case kind_function_call: { + function_call fce = CAST(function_call, expr); + + sum += 1 + expression_size(fce->arg1, inatomic); + sum += elist_size(fce->args, inatomic); + break; + } + case kind_generic_call: { + generic_call fce = CAST(generic_call, expr); + + sum += 1 + expression_size(fce->arg1, inatomic); + sum += elist_size(fce->args, inatomic); + break; + } + case kind_extension_expr: + sum += expression_size(CAST(unary, expr)->arg1, inatomic); + break; + + default: + if (is_unary(expr)) + sum += 1 + expression_size(CAST(unary, expr)->arg1, inatomic); + else if (is_binary(expr)) + { + binary be = CAST(binary, expr); + + sum += 1 + expression_size(be->arg1, inatomic); + sum += expression_size(be->arg2, inatomic); + } + else + assert(0); + break; + } + + return sum; +} + +static size_t statement_size(statement stmt, bool inatomic) +{ + size_t sum = 0; + + if (!stmt) + return 0; + + switch (stmt->kind) + { + case kind_asm_stmt: { + sum += 1; /* A guess. Hard to count asm instructions. */ + break; + } + case kind_compound_stmt: { + compound_stmt cs = CAST(compound_stmt, stmt); + statement s; + declaration d; + + scan_declaration (d, cs->decls) + if (is_data_decl(d)) + { + variable_decl vd; + + /* Include size of initialisers of non-static variables */ + scan_variable_decl (vd, CAST(variable_decl, + CAST(data_decl, d)->decls)) + if (vd->ddecl->kind == decl_variable && + vd->ddecl->vtype != variable_static) + sum += 1 + expression_size(vd->arg1, inatomic); + } + + scan_statement (s, cs->stmts) + sum += statement_size(s, inatomic); + break; + } + case kind_if_stmt: { + if_stmt is = CAST(if_stmt, stmt); + + if (is->condition->cst) + { + if (definite_zero(is->condition)) + sum += statement_size(is->stmt2, inatomic); + else + sum += statement_size(is->stmt1, inatomic); + } + else + { + sum += 2 + expression_size(is->condition, inatomic); + sum += statement_size(is->stmt1, inatomic); + sum += statement_size(is->stmt2, inatomic); + } + break; + } + case kind_labeled_stmt: { + labeled_stmt ls = CAST(labeled_stmt, stmt); + + sum += statement_size(ls->stmt, inatomic); + break; + } + case kind_atomic_stmt: { + atomic_stmt ls = CAST(atomic_stmt, stmt); + + sum += statement_size(ls->stmt, inatomic); + if (!inatomic) + sum += 6; + break; + } + case kind_expression_stmt: { + expression_stmt es = CAST(expression_stmt, stmt); + + sum += expression_size(es->arg1, inatomic); + break; + } + case kind_while_stmt: case kind_dowhile_stmt: case kind_switch_stmt: { + conditional_stmt cs = CAST(conditional_stmt, stmt); + + if (cs->condition->cst && stmt->kind != kind_switch_stmt && + definite_zero(cs->condition)) + { + /* do s while (0): just include size of s + while (0) s: size is 0 */ + if (stmt->kind == kind_dowhile_stmt) + sum += statement_size(cs->stmt, inatomic); + break; + } + sum += 2 + expression_size(cs->condition, inatomic); + sum += statement_size(cs->stmt, inatomic); + break; + } + case kind_for_stmt: { + for_stmt fs = CAST(for_stmt, stmt); + + sum += 2 + statement_size(fs->stmt, inatomic); + sum += expression_size(fs->arg1, inatomic); + sum += expression_size(fs->arg2, inatomic); + sum += expression_size(fs->arg3, inatomic); + break; + } + case kind_break_stmt: case kind_continue_stmt: case kind_goto_stmt: + sum += 1; + break; + + case kind_empty_stmt: + break; + + case kind_computed_goto_stmt: { + computed_goto_stmt cgs = CAST(computed_goto_stmt, stmt); + + sum += 1 + expression_size(cgs->arg1, inatomic); + break; + } + case kind_return_stmt: { + return_stmt rs = CAST(return_stmt, stmt); + + sum += 1 + expression_size(rs->arg1, inatomic); + break; + } + default: assert(0); + } + + return sum; +} + +static size_t function_size(function_decl fd) +{ + return statement_size(fd->stmt, fd->ddecl->call_contexts == c_call_atomic); +} + +static size_t typelist_length(typelist tl) +{ + typelist_scanner tls; + size_t count = 0; + + if (!tl) + return 0; + + typelist_scan(tl, &tls); + while (typelist_next(&tls)) + count++; + + return count; +} + +static size_t function_argcount(data_declaration ddecl) +{ + size_t count = typelist_length(type_function_arguments(ddecl->type)); + + if (type_generic(ddecl->type)) + count += typelist_length(type_function_arguments(type_function_return_type(ddecl->type))); + + return count; +} + +static ggraph make_ig(region r, cgraph callgraph) +{ + ggraph cg = cgraph_graph(callgraph); + ggraph ig = new_graph(r); + gnode n; + + graph_scan_nodes (n, cg) + { + /* Size should be at least 1 (because of the -1 in inline_function) */ + data_declaration fn = NODE_GET(endp, n)->function; + size_t fnsize = 1; + + if (fn->definition) + fnsize = function_size(CAST(function_decl, fn->definition)); + + if (fn->interface && !fn->defined) + { + /* stub function. size is based on number of outgoing edges and + number of parameters (first outgoing edge counted as "free") */ + gedge e; + int edgecount = 0; + + graph_scan_out (e, n) + edgecount++; + /* use size of default definition (already computed above) if no + outgoing edges */ + if (edgecount > 0) + fnsize = (edgecount - 1) * (2 + function_argcount(fn)) + 1; + } + + ig_add_fn(r, ig, fn, fnsize); + } + graph_scan_nodes (n, cg) + { + data_declaration fn = NODE_GET(endp, n)->function; + gedge e; + + graph_scan_out (e, n) + ig_add_edge(fn, NODE_GET(endp, graph_edge_to(e))->function); + } + return ig; +} + +static void inline_function(gnode n, struct inline_node *in) +{ + gedge call_edge, called_edge, next_edge; + + if (in->uninlinable || in->fn->noinlinep || in->fn->spontaneous) + return; + + in->fn->makeinline = TRUE; + /* Add callgraph edges implied by this inlining and update caller + sizes */ + graph_scan_in (call_edge, n) + { + gnode caller = graph_edge_from(call_edge); + struct inline_node *caller_in = NODE_GET(struct inline_node *, caller); + + caller_in->size += in->size - 1; + + graph_scan_out (called_edge, n) + { + gnode called = graph_edge_to(called_edge); + + ig_add_edge(caller_in->fn, + NODE_GET(struct inline_node *, called)->fn); + } + } + + /* Remove edges leaving inlined function + (we don't bother removing incoming edges as we won't look at them + again) */ + called_edge = graph_first_edge_out(n); + while (called_edge) + { + next_edge = graph_next_edge_out(called_edge); + graph_remove_edge(called_edge); + called_edge = next_edge; + } +} + +void inline_functions(cgraph callgraph) +{ + region igr = newregion(); + ggraph ig = make_ig(igr, callgraph); + gnode n; + int bis = base_inlineable_size, ipa = inline_per_arg; + + if (getenv("NESC_BIS")) + bis = atoi(getenv("NESC_BIS")); + if (getenv("NESC_IPA")) + ipa = atoi(getenv("NESC_IPA")); + + if (flag_no_inline) + return; + + /* Inline small fns and single-call fns */ + graph_scan_nodes (n, ig) + { + struct inline_node *in = NODE_GET(struct inline_node *, n); + + if (!in->fn->isinline && !in->fn->makeinline) + { + gedge e; + size_t edgecount = 0; + + graph_scan_in (e, n) + edgecount++; + + if (edgecount == 1 || + (bis >=0 && in->size <= bis + function_argcount(in->fn) * ipa)) + inline_function(n, in); + } + } + deleteregion(igr); +} diff --git a/src/nesc-inline.h b/src/nesc-inline.h new file mode 100644 index 0000000..611b1d7 --- /dev/null +++ b/src/nesc-inline.h @@ -0,0 +1,25 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef NESC_INLINE_H +#define NESC_INLINE_H + +#include "nesc-cg.h" + +void inline_functions(cgraph callgraph); + +#endif diff --git a/src/nesc-interface.c b/src/nesc-interface.c new file mode 100644 index 0000000..6a888d3 --- /dev/null +++ b/src/nesc-interface.c @@ -0,0 +1,31 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include "parser.h" +#include "nesc-interface.h" +#include "nesc-semantics.h" +#include "nesc-decls.h" +#include "nesc-paths.h" +#include "nesc-env.h" +#include "semantics.h" +#include "c-parse.h" +#include "edit.h" + +void build_interface(region r, nesc_declaration idecl) +{ + AST_set_parents(CAST(node, idecl->ast)); +} diff --git a/src/nesc-interface.h b/src/nesc-interface.h new file mode 100644 index 0000000..8b0373c --- /dev/null +++ b/src/nesc-interface.h @@ -0,0 +1,23 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef NESC_INTERFACE_H +#define NESC_INTERFACE_H + +void build_interface(region r, nesc_declaration idecl); + +#endif diff --git a/src/nesc-keywords.h b/src/nesc-keywords.h new file mode 100644 index 0000000..e5db993 --- /dev/null +++ b/src/nesc-keywords.h @@ -0,0 +1,24 @@ +K(abstract, ABSTRACT, RID_NESC) +K(as, AS, RID_NESC) +K(async, SCSPEC, RID_ASYNC | RID_NESC) +K(call, CALL, RID_NESC) +K(command, SCSPEC, RID_COMMAND | RID_NESC) +K(components, COMPONENTS, RID_NESC) +K(event, SCSPEC, RID_EVENT | RID_NESC) +K(extends, EXTENDS, RID_NESC) +K(implementation, IMPLEMENTATION, RID_NESC) +K(new, NEW, RID_NESC) +K(post, POST, RID_NESC) +K(provides, PROVIDES, RID_NESC) +K(signal, SIGNAL, RID_NESC) +K(task, SCSPEC, RID_TASK | RID_NESC) +K(uses, USES, RID_NESC) + +K(atomic, ATOMIC, NORID) +K(component, COMPONENT, NORID) +K(configuration, CONFIGURATION, NORID) +K(generic, GENERIC, NORID) +K(includes, INCLUDES, NORID) +K(interface, INTERFACE, NORID) +K(module, MODULE, NORID) +K(norace, SCSPEC, RID_NORACE) diff --git a/src/nesc-magic.c b/src/nesc-magic.c new file mode 100644 index 0000000..8bb4590 --- /dev/null +++ b/src/nesc-magic.c @@ -0,0 +1,209 @@ +#include + +#include "parser.h" +#include "nesc-magic.h" +#include "semantics.h" +#include "AST_utils.h" +#include "c-parse.h" +#include "constants.h" +#include "unparse.h" + +data_declaration magic_unique, magic_uniqueN, magic_uniqueCount; + +static data_declaration +declare_magic(const char *name, type return_type, typelist argument_types, + known_cst (*magic_fold)(function_call fcall, int pass)) +{ + struct data_declaration tempdecl; + type ftype = make_function_type(return_type, argument_types, FALSE, FALSE); + + init_data_declaration(&tempdecl, new_error_decl(parse_region, dummy_location), name, ftype); + tempdecl.kind = decl_magic_function; + tempdecl.magic_fold = magic_fold; + tempdecl.ftype = function_normal; + + return declare(global_env, &tempdecl, FALSE); +} + +data_declaration get_magic(function_call fcall) +/* Returns: magic function called by fcall if it's a magic function call, + NULL otherwise +*/ +{ + if (is_identifier(fcall->arg1)) + { + identifier called = CAST(identifier, fcall->arg1); + + if (called->ddecl->kind == decl_magic_function) + return called->ddecl; + } + return NULL; +} + + +known_cst fold_magic(function_call fcall, int pass) +{ + data_declaration called = get_magic(fcall); + + if (called) + { + /* we can assume arguments are of valid type and number, + check that they are constants in the parse phase */ + + if (pass == 0) + { + bool all_constant = TRUE; + expression arg; + int argn = 1; + + scan_expression (arg, fcall->args) + { + if (!arg->cst) + { + error("argument %d to magic function `%s' is not constant", + argn, called->name); + all_constant = FALSE; + } + argn++; + } + + if (!all_constant) + return NULL; + } + + return called->magic_fold(fcall, pass); + } + return NULL; +} + +static env unique_env; +static region unique_region; + +static unsigned int *unique_parse(const char *uname, function_call fcall) +{ + data_declaration name_ddecl = string_ddecl(fcall->args); + unsigned int *lastval; + char *name_str; + location loc = fcall->location; + + if (!name_ddecl) + { + error_with_location(loc, "argument to `%s' must be a string", uname); + return NULL; + } + + name_str = ddecl2str(current.fileregion, name_ddecl); + if (!name_str) + { + error_with_location(loc, "can't handle this string as argument to `%s'", uname); + return NULL; + } + + lastval = env_lookup(unique_env, name_str, FALSE); + if (!lastval) + { + lastval = ralloc(unique_region, int); + name_str = rstrdup(unique_region, name_str); + env_add(unique_env, name_str, lastval); + } + + return lastval; +} + +static known_cst unique_fold(function_call fcall, int pass) +{ + unsigned int *lastval; + + /* On pass 0, we don't know the value (and we can't even look for + lastval yet, as we may be in a generic component passing a + string argument to unique) + On pass 1, we look for lastval and pick a value + On subsequent passes, we stick to our choice + */ + if (pass == 0) + return make_unknown_cst(cval_unknown_number, unsigned_int_type); + + lastval = unique_parse("unique", fcall); + if (!lastval) + return NULL; + + if (pass == 1) + return make_unsigned_cst((*lastval)++, unsigned_int_type); + else + return fcall->cst; +} + +static known_cst uniqueN_fold(function_call fcall, int pass) +{ + unsigned int *lastval; + + /* On pass 0, we don't know the value (and we can't even look for + lastval yet, as we may be in a generic component passing a + string argument to unique) + On pass 1, we look for lastval and pick a value + On subsequent passes, we stick to our choice + */ + if (pass == 0) + return make_unknown_cst(cval_unknown_number, unsigned_int_type); + + lastval = unique_parse("uniqueN", fcall); + if (!lastval) + return NULL; + + if (pass == 1) + { + known_cst n = CAST(expression, fcall->args->next)->cst; + unsigned int val = *lastval; + + *lastval += constant_uint_value(n); + + return make_unsigned_cst(val, unsigned_int_type); + } + else + return fcall->cst; +} + +static known_cst uniqueCount_fold(function_call fcall, int pass) +{ + unsigned int *lastval; + + /* On pass 0, we don't know the value (and we can't even look for + lastval yet, as we may be in a generic component passing a + string argument to uniqueCount) + On pass 1, we still don't know (haven't seen all uniques) + On pass 2 and subsequent, we get the value from the unique env + */ + + if (pass < 2) + return make_unknown_cst(cval_unknown_number, unsigned_int_type); + + lastval = unique_parse("uniqueCount", fcall); + if (!lastval) + return NULL; + + return make_unsigned_cst(*lastval, unsigned_int_type); +} + +static void unique_init(void) +{ + typelist string_args, string_int_args; + + string_args = new_typelist(parse_region); + typelist_append(string_args, make_pointer_type(char_type)); + magic_unique = declare_magic("unique", unsigned_int_type, string_args, + unique_fold); + string_int_args = new_typelist(parse_region); + typelist_append(string_int_args, make_pointer_type(char_type)); + typelist_append(string_int_args, unsigned_int_type); + magic_uniqueN = declare_magic("uniqueN", unsigned_int_type, string_int_args, + uniqueN_fold); + magic_uniqueCount = declare_magic("uniqueCount", unsigned_int_type, + string_args, uniqueCount_fold); + unique_region = newregion(); + unique_env = new_env(unique_region, NULL); +} + +void init_magic_functions(void) +{ + unique_init(); +} diff --git a/src/nesc-magic.h b/src/nesc-magic.h new file mode 100644 index 0000000..e03c3cd --- /dev/null +++ b/src/nesc-magic.h @@ -0,0 +1,22 @@ +/* Magic function support. Magic functions are constant folded at compile-time, + all their arguments must be constants (or string constants). + + They are used to pick unique numbers for generic interfaces, lookup + active message types, etc +*/ + +#ifndef NESC_MAGIC_H +#define NESC_MAGIC_H + +extern data_declaration magic_unique, magic_uniqueCount; + +void init_magic_functions(void); + +data_declaration get_magic(function_call fcall); +/* Returns: magic function called by fcall if it's a magic function call, + NULL otherwise +*/ + +known_cst fold_magic(function_call fcall, int pass); + +#endif diff --git a/src/nesc-main.c b/src/nesc-main.c new file mode 100644 index 0000000..072767a --- /dev/null +++ b/src/nesc-main.c @@ -0,0 +1,429 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include +#include +#include + +#include "parser.h" +#include "semantics.h" +#include "nesc-env.h" +#include "nesc-decls.h" +#include "nesc-cg.h" +#include "nesc-paths.h" +#include "nesc-c.h" +#include "nesc-interface.h" +#include "nesc-component.h" +#include "c-parse.h" +#include "nesc-generate.h" +#include "nesc-doc.h" +#include "nesc-semantics.h" +#include "nesc-cpp.h" +#include "nesc-msg.h" +#include "nesc-magic.h" +#include "nesc-uses.h" +#include "nesc-abstract.h" +#include "nesc-attributes.h" +#include "nesc-constants.h" +#include "nesc-dump.h" +#include "nesc-network.h" +#include "nesc-task.h" +#include "nesc-deputy.h" +#include "edit.h" +#include "machine.h" +#include "nesc-atomic.h" +#include "unparse.h" + +/* The set of C files to require before loading the main component */ +struct ilist +{ + struct ilist *next; + char *name; +}; + +static struct ilist *includelist, **includelist_end = &includelist; +static region includeregion; + +void add_nesc_include(const char *name) +{ + struct ilist *np; + + if (!includeregion) + includeregion = newregion(); + + np = ralloc(includeregion, struct ilist); + np->next = NULL; + np->name = rstrdup(includeregion, name); + + *includelist_end = np; + includelist_end = &np->next; +} + +/* Adds the component graph 'component' to the whole program graph 'master' */ +static void connect_graph(cgraph master, cgraph component) +{ + ggraph cg = cgraph_graph(component); + gnode n; + gedge connection; + + /* Add all edges from component to master */ + graph_scan_nodes (n, cg) + { + endp from = NODE_GET(endp, n); + gnode mfrom = endpoint_lookup(master, from); + + graph_scan_out (connection, n) + { + endp to = NODE_GET(endp, graph_edge_to(connection)); + gnode mto = endpoint_lookup(master, to); + + graph_add_edge(mfrom, mto, EDGE_GET(location, connection)); + } + } +} + +static void connect(location loc, nesc_declaration cdecl, cgraph cg, + cgraph userg, dd_list modules, dd_list components) +{ + nesc_declaration loop; + + if ((loop = abstract_recursion())) + { + /* We can help the programmer find the loop by showing the + instantiation path that causes it. loop's instance name is a prefix + of cdecl's, the looping path is loop's abstract component name + followed by the difference between loop's and cdecl's instance name. + */ + error_with_location(loc, "component instantiation loop `%s%s'", + original_component(loop)->name, + cdecl->instance_name + strlen(loop->instance_name)); + } + else if (!dd_find(components, cdecl)) + { + dd_add_last(regionof(components), components, cdecl); + connect_graph(cg, cdecl->connections); + connect_graph(userg, cdecl->user_connections); + + if (!cdecl->configuration) + dd_add_last(regionof(modules), modules, cdecl); + else + { + configuration c = CAST(configuration, cdecl->impl); + declaration d; + + scan_declaration (d, c->decls) + if (is_component_ref(d)) + { + component_ref comp = CAST(component_ref, d); + + push_instance(comp->cdecl); + if (comp->cdecl->original) + instantiate(comp->cdecl, comp->args); + connect(comp->location, comp->cdecl, cg, userg, modules, components); + pop_instance(); + } + } + } +} + +static void connect_graphs(region r, nesc_declaration program, nesc_declaration scheduler, + cgraph *cg, cgraph *userg, dd_list *modules, dd_list *components) +{ + *cg = new_cgraph(r); + *userg = new_cgraph(r); + *modules = dd_new_list(r); + *components = dd_new_list(r); + + push_instance(program); + connect(toplevel_location, program, *cg, *userg, *modules, *components); + if (scheduler) + connect(toplevel_location, scheduler, *cg, *userg, *modules, *components); + pop_instance(); +} + +int nesc_option(char *p) +{ + if (p[0] != '-') + return FALSE; + + /* Skip optional (make gcc 3.x happy) initial _ added by ncc */ + if (p[1] == '_') + p += 2; + else + p += 1; + + /* Yes, using here strlen is evil. But who *really* cares? */ + if (!strncmp (p, "fnesc-nido-tosnodes=", strlen("fnesc-nido-tosnodes="))) + { + nido_num_nodes = p + strlen("fnesc-nido-tosnodes="); + } + else if (!strncmp (p, "fnesc-nido-motenumber=", strlen("fnesc-nido-motenumber="))) + { + nido_mote_number = p + strlen("fnesc-nido-motenumber="); + } + else if (!strncmp (p, "fnesc-include=", strlen("fnesc-include="))) + { + add_nesc_include(p + strlen("fnesc-include=")); + } + else if (!strncmp (p, "fnesc-path=", strlen("fnesc-path="))) + { + add_nesc_path(p + strlen("fnesc-path="), CHAIN_BRACKET); + } + else if (!strncmp (p, "fnesc-msg=", strlen("fnesc-msg="))) + { + select_nesc_msg(p + strlen("fnesc-msg=")); + } + else if (!strcmp (p, "fnesc-csts")) + { + select_nesc_csts(); + } + else if (!strncmp (p, "fnesc-dump=", strlen("fnesc-dump="))) + { + select_dump(p + strlen("fnesc-dump=")); + } + else if (!strncmp (p, "fnesc-dumpfile=", strlen("fnesc-dumpfile="))) + { + select_dumpfile(p + strlen("fnesc-dumpfile=")); + } + else if (!strncmp (p, "fnesc-target=", strlen("fnesc-target="))) + { + select_target(p + strlen("fnesc-target=")); + } + else if (!strcmp (p, "fnesc-simulate")) + { + use_nido = TRUE; + } + else if (!strncmp (p, "fnesc-gcc=", strlen("fnesc-gcc="))) + { + target_compiler = p + strlen("fnesc-gcc="); + } + else if (!strcmp (p, "fnesc-mingw-gcc")) + { + flag_mingw_gcc = 1; + } + else if (!strcmp (p, "fnesc-no-debug")) + { + flag_no_debug = 1; + } + else if (!strcmp (p, "fnesc-no-inline")) + { + flag_no_inline++; + } + else if (!strcmp (p, "fnesc-verbose")) + { + flag_verbose = 2; + } + else if (!strcmp (p, "fnesc-save-macros")) + { + flag_save_macros = 1; + } + else if (!strncmp (p, "fnesc-scheduler=", strlen("fnesc-scheduler="))) + { + set_scheduler(p + strlen("fnesc-scheduler=")); + } + else if (!strncmp (p, "fnesc-docdir=", strlen("fnesc-docdir="))) + { + doc_set_outdir(p + strlen("fnesc-docdir=")); + } + else if (!strncmp (p, "fnesc-topdir=", strlen("fnesc-topdir="))) + { + doc_add_topdir(p + strlen("fnesc-topdir=")); + } + else if (!strncmp (p, "fnesc-is-app", strlen("fnesc-is-app"))) + { + doc_is_app(TRUE); + } + else if (!strncmp (p, "fnesc-docs-use-graphviz", strlen("fnesc-docs-use-graphviz"))) + { + doc_use_graphviz(TRUE); + } + else if (!strcmp (p, "fnesc-optimize-atomic")) + nesc_optimise_atomic = 1; + else if (!strncmp (p, "fnesc-genprefix=", strlen("fnesc-genprefix="))) + unparse_prefix(p + strlen("fnesc-genprefix=")); + else if (!strcmp (p, "fnesc-deputy")) + flag_deputy = 1; + else if (!strcmp (p, "fnesc-no-deputy")) + flag_deputy = 0; + else if (!strcmp (p, "fnesc-default-safe")) + flag_default_safe = 1; + else if (!strcmp (p, "fnesc-default-unsafe")) + flag_default_safe = 0; + else if (!strcmp (p, "Wnesc-docstring")) + warn_unexpected_docstring = 1; + else if (!strcmp (p, "Wno-nesc-docstring")) + warn_unexpected_docstring = 0; + else if (!strcmp (p, "Wnesc-fnptr")) + warn_fnptr = 1; + else if (!strcmp (p, "Wno-nesc-fnptr")) + warn_fnptr = 0; + else if (!strcmp (p, "Wnesc-data-race")) + warn_data_race = 1; + else if (!strcmp (p, "Wno-nesc-data-race")) + warn_data_race = 0; + else if (!strcmp (p, "Wnesc-async")) + warn_async = 1; + else if (!strcmp (p, "Wno-nesc-async")) + warn_async = 0; + else if (!strcmp (p, "Wnesc-combine")) + warn_no_combiner = 1; + else if (!strcmp (p, "Wno-nesc-combine")) + warn_no_combiner = 0; + else if (!strcmp (p, "Wnesc-all")) + warn_data_race = warn_fnptr = warn_async = warn_no_combiner = 1; + else if (!strcmp (p, "Wnesc-error")) + nesc_error = TRUE; + else if (!strncmp(p, "fnesc-diff=", strlen("fnesc-diff="))) + { + char *dirs = p + 11, *comma = strchr(dirs, ','); + + /* , or only for original */ + if (comma) + { + diff_input = rstralloc(permanent, comma - dirs + 1); + strncpy(diff_input, dirs, comma - dirs); + diff_input[comma - dirs] = '\0'; + diff_output = comma + 1; + } + else + diff_output = dirs; + } + else if (!strncmp(p, "fnesc-separator=", strlen("fnesc-separator="))) + set_function_separator(p + 16); + else if (!strncmp(p, "fnesc-cppdir=", strlen("fnesc-cppdir="))) + save_pp_dir(p + 13); + else + return FALSE; + + return TRUE; +} + +static void destroy_target(const char *name) +{ + if (name) + { + /* unlink would be nicer, but would have nasty consequences for + -o /dev/null when run by root... */ + int fd = creat(name, 0666); + + if (fd < 0) + { + fprintf(stderr, "%s: ", name); + perror("failed to truncate target"); + } + else + close(fd); + } + +} + +void nesc_compile(const char *filename, const char *target_name) +{ + struct ilist *includes; + nesc_declaration program = NULL; + bool gencode = FALSE; + cgraph cg = NULL, userg = NULL; + dd_list modules = NULL, components = NULL; + + if (filename == NULL) + { + fprintf(stderr, "usage: nesc1 \n"); + return; + } + + parse_region = newregion(); + preprocess_init(); + init_nesc_attributes(); + cval_init(); + init_types(); + init_lex(); + init_semantics(); + init_nesc_env(parse_region); + init_magic_functions(); + init_uses(); + init_abstract(); + init_nesc_constants(); + init_network(); + init_internal_nesc_attributes(); + init_isatomic(); + init_deputy(); + if (target->init) + target->init(); + + for (includes = includelist; includes; includes = includes->next) + require_c(toplevel_location, includes->name); + + if (flag_use_scheduler) + load_scheduler(); + + if (nesc_filename(filename)) + /* We need to assume some language - it will get fixed once we + see the actual file */ + program = load(l_any, toplevel_location, filename, TRUE); + else + { + flag_c = TRUE; + load_c(toplevel_location, filename, TRUE); + } + + if (errorcount) + return; + + if (program && program->kind == l_component && !program->abstract) + { + connect_graphs(parse_region, program, scheduler, &cg, &userg, &modules, &components); + if (errorcount) + return; + current.container = NULL; + fold_program(program, scheduler); + gencode = TRUE; + } + else + /* The "program" is a C file, interface or abstract component */ + fold_program(NULL, NULL); + + if (errorcount) + return; + + /* Destroy target in all circumstances (prevents surprises + when "compiling" interfaces) */ + destroy_target(target_name); + + if (docs_requested()) + { + if (generic_used) + error("documentation system does not yet support generic components and interfaces"); + else if (program) + generate_docs(filename, cg); + else + error("documentation requested on a C file "); + gencode = FALSE; + } + if (layout_requested()) + { + dump_msg_layout(); + gencode = FALSE; + } + if (dump_selected()) + dump_info(program, cg, userg, modules, components); + if (gencode) + generate_c_code(target_name, program, cg, modules, components); + else if (flag_c) + generate_c_code(target_name, NULL, + new_cgraph(permanent), dd_new_list(permanent), + dd_new_list(permanent)); +} diff --git a/src/nesc-main.h b/src/nesc-main.h new file mode 100644 index 0000000..1ef9b63 --- /dev/null +++ b/src/nesc-main.h @@ -0,0 +1,29 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef NESC_MAIN_H +#define NESC_MAIN_H + +void add_nesc_include(const char *name); +void nesc_compile(const char *component_name, const char *target_name); + +bool nesc_option(char *p); +/* Effects: If p is a nesC option, set flags appropriately. + Returns: TRUE iff p was a nesC option +*/ + +#endif diff --git a/src/nesc-module.c b/src/nesc-module.c new file mode 100644 index 0000000..218e1fe --- /dev/null +++ b/src/nesc-module.c @@ -0,0 +1,104 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include "parser.h" +#include "nesc-module.h" +#include "nesc-configuration.h" +#include "nesc-component.h" +#include "c-parse.h" +#include "expr.h" +#include "semantics.h" +#include "nesc-semantics.h" +#include "nesc-task.h" + +expression make_generic_call(location loc, expression iref, expression args) +{ + expression result = CAST(expression, new_generic_call(parse_region, loc, iref, args)); + + check_arguments(iref->type, args, get_function_ddecl(iref), TRUE); + result->type = type_function_return_type(iref->type); + + return result; +} + +word make_word(location l, cstring s) +{ + return new_word(parse_region, l, s); +} + +declarator make_interface_ref_declarator(location l, cstring w1, cstring w2) +{ + identifier_declarator id = + new_identifier_declarator(parse_region, l, w2); + + return CAST(declarator, + new_interface_ref_declarator(parse_region, l, + CAST(declarator, id), + make_word(l, w1))); +} + +expression make_interface_deref(location loc, expression object, cstring field) +{ + interface_deref result; + data_declaration iref = type_iref(object->type); + data_declaration fdecl = interface_lookup(iref, field.data); + + result = new_interface_deref(parse_region, loc, object, field, fdecl); + if (!fdecl) + { + error("interface has no command or event named `%s'", field.data); + result->type = error_type; + } + else + result->type = fdecl->type; + + return CAST(expression, result); +} + +/* Check that function fndecl (from the module's external interface) + is implemented. +*/ +static void check_function_implemented(data_declaration fndecl, void *data) +{ + location *loc = data; + data_declaration idecl = fndecl->interface; + + assert(fndecl->kind == decl_function); + + if (fndecl->defined && !fndecl->definition) + { + if (idecl) + error_with_location(*loc, "`%s.%s' not implemented", + idecl->name, fndecl->name); + else + error_with_location(*loc, "`%s' not implemented", fndecl->name); + } +} + +/* Checks that all defined functions of the modules are implemented */ +static void check_complete_implementation(module m) +{ + component_functions_iterate(m->cdecl, check_function_implemented, + &m->location); +} + +void process_module(module m) +{ + check_complete_implementation(m); + /* Add wires to graph for tasks */ + wire_scheduler(m); +} diff --git a/src/nesc-module.h b/src/nesc-module.h new file mode 100644 index 0000000..8a456b2 --- /dev/null +++ b/src/nesc-module.h @@ -0,0 +1,28 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef NESC_MODULE_H +#define NESC_MODULE_H + +expression make_generic_call(location loc, expression iref, expression args); + +declarator make_interface_ref_declarator(location l, cstring w1, cstring w2); +expression make_interface_deref(location loc, expression object, cstring field); + +void process_module(module c); + +#endif diff --git a/src/nesc-msg.c b/src/nesc-msg.c new file mode 100644 index 0000000..09e0108 --- /dev/null +++ b/src/nesc-msg.c @@ -0,0 +1,239 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include + +#include "parser.h" +#include "nesc-msg.h" +#include "semantics.h" +#include "constants.h" +#include "c-parse.h" +#include "AST_utils.h" + +static const char *selected_type; +static bool print_csts; + +void select_nesc_msg(const char *name) +{ + selected_type = name; +} + +void select_nesc_csts(void) +{ + print_csts = TRUE; +} + +static void dump_type(type t) +{ + if (type_complex(t)) + { + printf("C"); + t = make_base_type(t); + } + + if (type_network_base_type(t)) + printf("N%s", type_networkdef(t)->name); + /* Enums treated as ints for now */ + else if (type_integer(t)) + if (type_unsigned(t)) + printf("U"); + else + printf("I"); + else if (type_float(t)) + printf("F"); + else if (type_double(t)) + printf("D"); + else if (type_long_double(t)) + printf("LD"); + else if (type_union(t)) + if (type_network(t)) + printf("ANU"); + else + printf("AU"); + else if (type_struct(t)) + if (type_network(t)) + printf("ANS"); + else + printf("AS"); + else if (type_pointer(t)) + printf("U"); + else + assert(0); +} + +static void dump_fields(region r, const char *prefix, field_declaration fields) +{ + while (fields) + { + if (fields->name) /* skip anon fields */ + { + type t = fields->type; + + printf(" %s%s ", prefix, fields->name); + while (type_array(t)) + { + type base = type_array_of(t); + expression size = type_array_size(t); + + printf("[%lu]", (unsigned long)constant_uint_value(size->cst)); + t = base; + } + dump_type(t); + + assert(cval_isinteger(fields->offset)); + printf(" %lu %lu\n", (unsigned long)cval_uint_value(fields->offset), + (unsigned long) + (!cval_istop(fields->bitwidth) ? + cval_uint_value(fields->bitwidth) : + BITSPERBYTE * cval_uint_value(type_size(t)))); + + if (type_aggregate(t)) + { + tag_declaration tdecl = type_tag(t); + char *newprefix = rarrayalloc(r, strlen(prefix) + strlen(fields->name) + 2, char); + + sprintf(newprefix, "%s%s.", prefix, fields->name); + dump_fields(r, newprefix, tdecl->fieldlist); + printf(" %s%s AX\n", prefix, fields->name); + } + } + fields = fields->next; + } +} + +static known_cst constant_value(const char *name) +{ + data_declaration decl; + static struct known_cst bad_value; + + decl = lookup_global_id(name); + + if (decl && decl->kind == decl_constant) + return decl->value; + + bad_value.type = error_type; + return &bad_value; +} + +static int am_type(region r, tag_declaration tdecl) +{ + char *am_name = rarrayalloc(r, strlen(tdecl->name) + 4, char), *s; + known_cst am_val; + + sprintf(am_name, "AM_%s", tdecl->name); + for (s = am_name; *s; s++) + *s = toupper(*s); + + am_val = constant_value(am_name); + + if (type_integer(am_val->type) && cval_knownvalue(am_val->cval)) + return constant_sint_value(am_val); + + fprintf(stderr, "warning: Cannot determine AM type for %s\n", selected_type); + fprintf(stderr, " (Looking for definition of %s)\n", am_name); + return -1; +} + +static void dump_layout(tag_declaration tdecl) +{ + region r = newregion(); + + + printf("%s %s %lu %d\n", tagkind_name(tdecl->kind), + tdecl->name, + (unsigned long)cval_uint_value(tdecl->size), + am_type(r, tdecl)); + + dump_fields(r, "", tdecl->fieldlist); + + deleteregion(r); +} + +bool layout_requested(void) +{ + return selected_type || print_csts; +} + + +void dump_msg_layout(void) +{ + tag_declaration tdecl; + + /* We look for a tagged type with name selected_type in the global + environment, and dump the layout in a perl-friendly format. + We also dump any requested constants. */ + + if (selected_type) + { + tdecl = env_lookup(global_env->tag_env, selected_type, FALSE); + + if (!tdecl) + { + fprintf(stderr, "error: tag %s not found\n", selected_type); + exit(1); + } + + if (tdecl->kind == kind_enum_ref) + { + fprintf(stderr, "error: %s is an enum\n", selected_type); + exit(1); + } + + if (cval_istop(tdecl->size)) + { + fprintf(stderr, "error: %s is variable size\n", selected_type); + exit(1); + } + + if (type_contains_pointers(make_tagged_type(tdecl))) + { + fprintf(stderr, "warning: %s contains pointers\n", selected_type); + } + + dump_layout(tdecl); + + } + + if (print_csts) + { + env_scanner scan_global; + const char *name; + void *vdecl; + + env_scan(global_env->id_env, &scan_global); + while (env_next(&scan_global, &name, &vdecl)) + { + data_declaration ddecl = vdecl; + + if (ddecl->kind == decl_constant) + { + known_cst val = ddecl->value; + + printf("%s \"%s\" ", name, ddecl->definition->location->filename); + dump_type(val->type); + putchar(' '); + + if (cval_knownvalue(val->cval)) + cval_print(stdout, val->cval); + else + puts(" UNKNOWN"); + putchar('\n'); + } + } + } +} + diff --git a/src/nesc-msg.h b/src/nesc-msg.h new file mode 100644 index 0000000..bd3d2e4 --- /dev/null +++ b/src/nesc-msg.h @@ -0,0 +1,27 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef NESC_MSG_H +#define NESC_MSG_H + +void select_nesc_msg(const char *name); +void select_nesc_csts(void); +bool layout_requested(void); + +void dump_msg_layout(void); + +#endif diff --git a/src/nesc-ndoc.c b/src/nesc-ndoc.c new file mode 100644 index 0000000..4eb2c23 --- /dev/null +++ b/src/nesc-ndoc.c @@ -0,0 +1,410 @@ +#include + +#include "parser.h" +#include "nesc-ndoc.h" +#include "c-parse.h" +#include "semantics.h" +#include "AST_utils.h" + +static char *rmakestr(region r, char *s, char *e) +{ + int l = e - s; + char *news = rstralloc(r, l + 1); + + news[l] = '\0'; + memcpy(news, s, l); + + return news; +} + +static void save_doctag(location loc, region entries_r, dd_list *entries, + char *tag_s, char *tag_e, + char *arg_s, char *arg_e, + int lineno) +{ + if (entries) + { + struct doctag *dtag = typed_ralloc(entries_r, sizeof(struct doctag) + sizeof(const char *), rctypeof(struct doctag)); + + dtag->lineno = lineno; + dtag->tag = rmakestr(entries_r, tag_s, tag_e); + dtag->args[0] = rmakestr(entries_r, arg_s, arg_e); + dd_add_last(entries_r, *entries, dtag); + } + else + { + /* warn about ignored quoted arguments that normally have + semantic significance */ + struct location here = *loc; + + here.lineno += lineno; + warning_with_location(&here, "@%s argument ignored", + rmakestr(current.fileregion, tag_s, tag_e)); + } +} + +bool get_latest_docstring(struct docstring *doc, region tags_r, dd_list *tags) +{ + enum { s_linestart, s_normal, s_doctag, s_docarg_start, s_docarg } state; + const char *raw, *r; + char *parsed, *p, *short_end, *doctag, *doctag_end, *docarg; + bool cpp_comment; + int lineno; + char c; + location loc; + + if (!get_raw_docstring(&raw, &loc)) + return FALSE; + + if (warn_unexpected_docstring && doc->short_s) + { + warning_with_location(loc, "duplicate documentation string"); + warning_with_location(doc->loc, "(this is the location of the previous documentation string)"); + } + doc->loc = loc; + doc->long_s = NULL; + + if (tags) + *tags = dd_new_list(tags_r); + parsed = alloca(strlen(raw) + 1); + + /* Prepare to parse raw */ + cpp_comment = raw[1] == '/'; + if (cpp_comment) + r = raw; + else + r = raw + 2; + p = parsed; + lineno = 0; + state = s_linestart; + short_end = NULL; + while ((c = *r++)) + { + if (state == s_linestart) + { + if (isspace(c) || (cpp_comment && c == '/')) + continue; + state = s_normal; + /* Skip one * in C-style comments (we've cleared line_start, so + won't do this twice) */ + if (!cpp_comment && c == '*') + continue; + } + + if (c == '\r' || c == '\n') + { + if (state == s_docarg) + { + /* warn about broken quoted arguments, as they have semantic + significance */ + struct location here = *loc; + + here.lineno += lineno; + warning_with_location(&here, "unterminated @%s argument ignored", + rmakestr(current.fileregion, doctag, doctag_end)); + } + + *p++ = '\n'; + lineno++; + state = s_linestart; + continue; + } + + /* Skip trailing / in C-style comments */ + if (!cpp_comment && c == '/' && !*r) + break; + + *p++ = c; + + /* Space after . or space before @ indicates end of short doc string */ + if (!short_end) + { + if (c == '.' && isspace(*r)) + short_end = p; + else if (c == '@' && p - 2 >= parsed && isspace(p[-2])) + short_end = p - 1; + + if (short_end) + doc->short_s = rmakestr(parse_region, parsed, short_end); + } + + /* Extract tags with a fun state machine */ + redo: + switch (state) + { + case s_normal: + if (c == '@' && p - 2 >= parsed && isspace(p[-2])) + { + doctag = p; + state = s_doctag; + } + break; + case s_doctag: + if (!isalpha(c)) /* doctag keyword done, decide if we like it */ + { + /* Currently we like all non-empty doctags and assume + they might have up to one quoted argument - filtering + is left to our caller. This might want to change if + we get into fancier syntax for doctag arguments with + semantic significance */ + if (p - 1 > doctag) /* not empty */ + { + doctag_end = p - 1; + state = s_docarg_start; + } + else + state = s_normal; + goto redo; + } + break; + case s_docarg_start: + if (isspace(c)) + ; + else if (c == '\'') + { + docarg = p; + state = s_docarg; + } + else + { + state = s_normal; + goto redo; + } + break; + case s_docarg: + if (c == '\'') + { + save_doctag(loc, tags_r, tags, + doctag, doctag_end, docarg, p - 1, lineno); + state = s_normal; + } + break; + default: + assert(0); + break; + } + } + + if (short_end) + { + /* if there's only whitespace after short_end, then there's no long + string */ + while (*short_end && isspace(*short_end)) + short_end++; + if (*short_end) + doc->long_s = rmakestr(parse_region, parsed, p); + } + else /* only a short string */ + doc->short_s = rmakestr(parse_region, parsed, p); + + return TRUE; +} + +static void update_parameters(function_declarator fd) +{ + node *parm = CASTPTR(node, &fd->parms); + + while (*parm) + { + if (is_data_decl(*parm)) /* skip errors */ + { + /* The ddecl points to the variable_decl of the new + definition. New variable_decls have a parent field + pointing to their containing data_decl (from the call to + AST_set_parents below). Use this to update the + declaration list. */ + data_decl pd = CAST(data_decl, *parm); + variable_decl vd = CAST(variable_decl, pd->decls); + + if (vd->ddecl) + { + node newdecl = vd->ddecl->ast->parent; + + /* We also ignore forward parameter declarations (gcc ext) */ + if (!vd->forward && newdecl) + { + newdecl->next = (*parm)->next; + *parm = CAST(node, newdecl); + } + } + } + parm = &(*parm)->next; + } +} + +static void enforce_redeclaration(node newdecl) +{ + if (is_data_decl(newdecl)) + { + variable_decl vd = CAST(variable_decl, CAST(data_decl, newdecl)->decls); + + if (vd->ddecl->definition == vd->ddecl->ast) + error("%s is not a function parameter", vd->ddecl->name); + } +} + +void ignored_doctag(location docloc, struct doctag *tag) +{ + struct location tagloc = *docloc; + + tagloc.lineno += tag->lineno; + warning_with_location(&tagloc, "@%s tag ignored", tag->tag); +} + +void ignored_doctags(location docloc, dd_list tags) +{ + dd_list_pos stags; + + dd_scan (stags, tags) + ignored_doctag(docloc, DD_GET(struct doctag *, stags)); +} + +void handle_ddecl_doc_tags(location docloc, data_declaration ddecl, + dd_list tags) +{ + declarator d; + declaration ast; + + if (!tags) + return; + + if (!type_functional(ddecl->type)) + { + ignored_doctags(docloc, tags); + return; + } + + ast = ddecl->ast; + if (is_function_decl(ast)) + d = CAST(function_decl, ast)->declarator; + else + d = CAST(variable_decl, ast)->declarator; + + handle_fdecl_doc_tags(docloc, ddecl, get_fdeclarator(d), tags); +} + +void handle_fdecl_doc_tags(location docloc, data_declaration ddecl, + function_declarator fd, dd_list tags) +{ + struct semantic_state old; + struct location cloc; + dd_list_pos stags; + + if (!tags || !fd) + return; + + old = current; + cloc = current.lex.input->l; + + current.env = fd->env; + allow_parameter_redeclaration(fd->parms, FALSE); + dd_scan (stags, tags) + { + struct doctag *tag = DD_GET(struct doctag *, stags); + struct location tagloc = *docloc; + node parsed; + + tagloc.lineno += tag->lineno; + if (!strcmp(tag->tag, "param")) + { + int old_errorcount = errorcount; + + start_lex_string(l_parameter, tag->args[0]); + set_lex_location(&tagloc); + parsed = parse(); + AST_set_parents(parsed); + /* Type errors in redeclaration confuse the redeclaration check, + and we've already failed compilation anyway */ + if (errorcount == old_errorcount) + enforce_redeclaration(parsed); + end_lex(); + } + else if (!strcmp(tag->tag, "return")) + { + if (fd->return_type) + warning_with_location(&tagloc, "duplicate @return tag ignored"); + else + { + start_lex_string(l_type, tag->args[0]); + set_lex_location(&tagloc); + parsed = parse(); + end_lex(); + if (parsed) + { + fd->return_type = CAST(asttype, parsed); + if (!type_equal(type_function_return_type(ddecl->type), + fd->return_type->type)) + error("inconsistent return type in @return tag"); + } + } + } + else + ignored_doctag(docloc, tag); + } + update_parameters(fd); + + current = old; + set_lex_location(&cloc); +} + +#ifdef TESTING +char doc_string[65536]; + +struct location dummy = { "", NULL, 1 }; + +bool get_raw_docstring(const char **docs, location *docl) +{ + *docs = doc_string; + *docl = &dummy; + return TRUE; +} + +region parse_region; + +/* Report warning msg at l */ +void vwarning_with_location(location l, const char *format, va_list args) +{ + fprintf(stderr, "%s:%lu: ", l->filename, l->lineno); + fprintf(stderr, "warning: "); + vfprintf(stderr, format, args); + putc('\n', stderr); +} + +/* Report warning msg at l */ +void warning_with_location(location l, const char *format, ...) +{ + va_list args; + + va_start(args, format); + vwarning_with_location(l, format, args); + va_end(args); +} + +struct semantic_state current; +int warn_unexpected_docstring; + +int region_main(int argc, char **argv) +{ + struct docstring doc = { NULL, NULL, NULL }; + dd_list tags; + dd_list_pos e; + + if (argc != 1) + return 2; + + current.fileregion = parse_region = newregion(); + fread(doc_string, sizeof doc_string, 1, stdin); + get_latest_docstring(&doc, permanent, &tags); + printf("short: %s\n", doc.short_s); + printf("long: %s\n", doc.long_s ? doc.long_s : ""); + + dd_scan (e, tags) + { + struct doctag *dtag = DD_GET(struct doctag *, e); + + printf("at %d: %s is %s\n", dtag->lineno, dtag->tag, dtag->args[0]); + } + + return 0; +} +#endif diff --git a/src/nesc-ndoc.h b/src/nesc-ndoc.h new file mode 100644 index 0000000..32c3dd3 --- /dev/null +++ b/src/nesc-ndoc.h @@ -0,0 +1,49 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2008 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef NESC_NDOC_H +#define NESC_NDOC_H + +struct docstring +{ + const char *short_s, *long_s; + location loc; +}; + +struct doctag +{ + int lineno; /* relative to start of string, first line=0 */ + const char *tag; /* @param, @result, etc */ + const char *args[]; /* arguments to key: + @param(1): parameter name or declaration + @result(1): result type or empty string + */ +}; + +bool get_latest_docstring(struct docstring *doc, region tags_r, dd_list *tags); + +struct data_declaration; +struct AST_function_declarator; +void handle_ddecl_doc_tags(location docloc, struct data_declaration *ddecl, + dd_list tags); +void handle_fdecl_doc_tags(location docloc, struct data_declaration *ddecl, + struct AST_function_declarator *fd, dd_list tags); + +void ignored_doctag(location docloc, struct doctag *tag); +void ignored_doctags(location docloc, dd_list tags); + +#endif diff --git a/src/nesc-network.c b/src/nesc-network.c new file mode 100644 index 0000000..0ecf2e7 --- /dev/null +++ b/src/nesc-network.c @@ -0,0 +1,560 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include "parser.h" +#include "constants.h" +#include "nesc-network.h" +#include "nesc-semantics.h" +#include "AST_utils.h" +#include "AST_walk.h" +#include "c-parse.h" +#include "edit.h" +#include "unparse.h" +#include "nesc-uses.h" + +static type uchar_ptr_type; + +static bool network_bitfield(expression e) +{ + if (is_field_ref(e) && type_network_base_type(e->type)) + { + field_ref fref = CAST(field_ref, e); + field_declaration fdecl = fref->fdecl; + + return !cval_istop(fdecl->bitwidth); + } + return FALSE; +} + +static void xtox_used(data_declaration transcoderfn, function_decl fn) +{ + data_declaration fdecl = fn ? fn->ddecl : NULL; + + ddecl_used(transcoderfn, new_use(dummy_location, fdecl, c_executable | c_fncall)); +} + +static void hton_used(expression e, function_decl fn) +{ + data_declaration ntdef = type_networkdef(e->type); + + if (network_bitfield(e)) + xtox_used(ntdef->bf_encoder, fn); + else + xtox_used(ntdef->encoder, fn); +} + +static void ntoh_used(expression e, function_decl fn) +{ + data_declaration ntdef = type_networkdef(e->type); + + if (network_bitfield(e)) + xtox_used(ntdef->bf_decoder, fn); + else + xtox_used(ntdef->decoder, fn); +} + +static void validate_network_lvalue(expression e) +{ + conditional cond; + + if ((cond = conditional_lvalue(e)) && + (type_network_base_type(cond->arg1->type) || + type_network_base_type(cond->arg2->type))) + error_with_location(e->location, + "Conditional assignment not supported for network types"); +} + +/* Check if expression e is of network base type. Parameters whose address + is not taken are actually of the base type (this should be extended to + all local vars whose address is not taken, but currently isn't) */ +static bool really_network_base(expression e) +{ + if (is_identifier(e)) + { + identifier id = CAST(identifier, e); + data_declaration ddecl = id->ddecl; + + if (ddecl->kind == decl_variable && ddecl->isparameter && + !(ddecl->use_summary & c_addressed)) + return FALSE; + } + return e->type && type_network_base_type(e->type); +} + +static data_declaration add_network_temporary(function_decl fn, type t) +{ + /* See Weird hack comment in prt_network_assignment */ + if (fn) + return add_temporary(parse_region, CAST(compound_stmt, fn->stmt), t); + else + return NULL; +} + +static AST_walker_result network_expression(AST_walker spec, void *data, + expression *n) +{ + expression e = *n; + function_decl fn = data; + + if (really_network_base(e) && + (e->context & c_read) && !(e->context & c_write)) + ntoh_used(e, fn); + + return aw_walk; +} + +static AST_walker_result network_assignment(AST_walker spec, void *data, + assignment *n) +{ + assignment a = *n; + function_decl fn = data; + + if (really_network_base(a->arg1)) + { + if (a->kind != kind_assign) /* op= reads too */ + { + ntoh_used(a->arg1, fn); + /* See problem/ugly hack comment in network_increment */ + /* op= needs a temp */ + if (!a->temp1) + a->temp1 = add_network_temporary(fn, uchar_ptr_type); + } + hton_used(a->arg1, fn); + } + + validate_network_lvalue(a->arg1); + + return aw_walk; +} + +static AST_walker_result network_increment(AST_walker spec, void *data, + increment *n) +{ + increment i = *n; + function_decl fn = data; + + if (really_network_base(i->arg1)) + { + ntoh_used(i->arg1, fn); + hton_used(i->arg1, fn); + + /* Problem: adding the declarations for the temporaries changes the + AST as we're walking through it. If we add a temporary while + walking through the first declaration, we'll revisit this + declaration. Oops. Ugly hack fix: don't create the temporaries if + they've already been created. Note that this could lead to + duplicate error messages from validate_network_lvalue, but that's + for use of a deprecated gcc feature which is going away soon. */ + if (!i->temp1) + { + /* we use 2 temps */ + i->temp1 = add_network_temporary(fn, uchar_ptr_type); + i->temp2 = add_network_temporary(fn, type_network_platform_type(i->type)); + } + } + + validate_network_lvalue(i->arg1); + + return aw_walk; +} + +static AST_walker_result network_fdecl(AST_walker spec, void *data, + function_decl *fd) +{ + AST_walk_children(spec, *fd, CAST(node, *fd)); + return aw_done; +} + +/* An AST walker that does network type processing on the AST */ +static AST_walker network_walker; + +static void init_network_walker(void) +{ + network_walker = new_AST_walker(parse_region); + AST_walker_handle(network_walker, kind_expression, network_expression); + AST_walker_handle(network_walker, kind_increment, network_increment); + AST_walker_handle(network_walker, kind_assignment, network_assignment); + AST_walker_handle(network_walker, kind_function_decl, network_fdecl); +} + +void handle_network_types(declaration decls) +{ + node n = CAST(node, decls); + + AST_walk_list(network_walker, NULL, &n); +} + +static void output_hton(type t) +{ + output_string(type_networkdef(t)->encoder->name); +} + +static void output_ntoh(type t) +{ + output_string(type_networkdef(t)->decoder->name); +} + +static void output_hton_bf(type t) +{ + output_string(type_networkdef(t)->bf_encoder->name); +} + +static void output_ntoh_bf(type t) +{ + output_string(type_networkdef(t)->bf_decoder->name); +} + +static void output_hton_expr(expression e) +{ + if (network_bitfield(e)) + output_hton_bf(e->type); + else + output_hton(e->type); +} + +static void output_ntoh_expr(expression e) +{ + if (network_bitfield(e)) + output_ntoh_bf(e->type); + else + output_ntoh(e->type); +} + +/* Print a network lvalue, return TRUE if it's a bitfield (in which + case the field name is not printed) */ +static bool prt_network_lvalue(expression e) +{ + bool isbf = network_bitfield(e); + + if (isbf) + { + /* Network bitfields have no name in the generated code. Just + print the structure. We'll add the offset and size later. */ + output("(unsigned char *)&"); + prt_expression(CAST(field_ref, e)->arg1, P_CALL); + } + else + { + prt_expression_helper(e, P_CALL); + output(".data"); + } + + return isbf; +} + +static void prt_network_bitfield_info(expression e) +{ + field_ref fref = CAST(field_ref, e); + field_declaration fdecl = fref->fdecl; + + output(", %llu, %llu", + cval_uint_value(fdecl->offset), cval_uint_value(fdecl->bitwidth)); +} + +static void prt_network_full_lvalue(expression e) +{ + if (prt_network_lvalue(e)) + prt_network_bitfield_info(e); +} + +static bool prt_network_assignment(expression e) +{ + char *selfassign = NULL; + assignment a; + + if (!(is_assignment(e) && really_network_base((CAST(assignment, e))->arg1))) + return FALSE; + + a = CAST(assignment, e); + + switch (e->kind) + { + case kind_plus_assign: selfassign = "+"; break; + case kind_minus_assign: selfassign = "-"; break; + case kind_times_assign: selfassign = "*"; break; + case kind_divide_assign: selfassign = "/"; break; + case kind_lshift_assign: selfassign = "<<"; break; + case kind_rshift_assign: selfassign = ">>"; break; + case kind_bitand_assign: selfassign = "&"; break; + case kind_bitor_assign: selfassign = "|"; break; + case kind_bitxor_assign: selfassign = "^"; break; + default: break; + } + + /* Weird hack: when temp1 is not set, this op= is outside + a function, i.e., in something like a sizeof. We can just + pretend it's a regular assignment. */ + if (selfassign && !a->temp1) + selfassign = NULL; + + set_location(e->location); + if (selfassign) + { + const char *temp = a->temp1->name; + bool bitfield; + + output("(%s = ", temp); + bitfield = prt_network_lvalue(a->arg1); + output(", "); + output_hton_expr(a->arg1); + output("(%s", temp); + if (bitfield) + prt_network_bitfield_info(a->arg1); + output(", "); + output_ntoh_expr(a->arg1); + output("(%s", temp); + if (bitfield) + prt_network_bitfield_info(a->arg1); + output(") %s ", selfassign); + prt_expression(a->arg2, P_TIMES); + output("))"); + } + else + { + output_hton_expr(a->arg1); + output("("); + prt_network_full_lvalue(a->arg1); + output(", "); + prt_expression(a->arg2, P_ASSIGN); + output(")"); + } + return TRUE; +} + +static bool prt_network_increment(expression e) +{ + increment i; + const char *temp; + char incop; + bool bitfield; + + if (!(is_increment(e) && really_network_base((CAST(increment, e))->arg1))) + return FALSE; + + i = CAST(increment, e); + temp = i->temp1->name; + incop = i->kind == kind_preincrement || i->kind == kind_postincrement ? '+' : '-'; + + /* pre-op: (t1 = &e, HTON(t1, (t2 = NTOH(t1) +/- 1)), t2) + post-op: (t1 = &e, HTON(t1, (t2 = NTOH(t1)) +/- 1), t2) */ + set_location(i->location); + output("(%s = ", temp); + bitfield = prt_network_lvalue(i->arg1); + output(", "); + output_hton_expr(i->arg1); + output("(%s", temp); + if (bitfield) + prt_network_bitfield_info(i->arg1); + output(", "); + + output("(%s = ", i->temp2->name); + output_ntoh_expr(i->arg1); + output("(%s", temp); + if (bitfield) + prt_network_bitfield_info(i->arg1); + if (i->kind == kind_postincrement || i->kind == kind_postdecrement) + output(")) %c 1)", incop); + else + output(") %c 1))", incop); + + output(", %s)", i->temp2->name); + + return TRUE; +} + +static bool prt_network_read(expression e) +{ + if (!(really_network_base(e) && + (e->context & c_read) && !(e->context & c_write))) + return FALSE; + + output_ntoh_expr(e); + output("("); + prt_network_full_lvalue(e); + output(")"); + + return TRUE; +} + +bool prt_network_expression(expression e) +{ + return + prt_network_read(e) || + prt_network_assignment(e) || + prt_network_increment(e); +} + +bool prt_network_typedef(data_decl d, variable_decl vd) +{ + if (vd->ddecl->kind == decl_typedef && vd->ddecl->basetype) + { + /* A Network base type typedef */ + type basetype = vd->ddecl->basetype; + + if (!type_size_cc(basetype) && cval_isinteger(type_size(basetype))) + error_with_location(vd->location, "network base type `%s' is of unknown size", vd->ddecl->name); + else + { + set_location(vd->location); + output("typedef struct { unsigned char data[%d]; } __attribute__((packed)) %s;", + (int)type_size_int(basetype), vd->ddecl->name); + } + return TRUE; + } + return FALSE; +} + +static bool prt_network_parameter_copy(declaration parm, bool copies, + bool init) +{ + if (is_data_decl(parm)) + { + data_decl dd = CAST(data_decl, parm); + variable_decl vd = CAST(variable_decl, dd->decls); + data_declaration ddecl = vd->ddecl; + + if (ddecl && type_network_base_type(ddecl->type) && + (ddecl->use_summary & c_addressed)) + { + /* We need a real network type copy. */ + if (!init) + { + if (!copies) + { + outputln("{"); + indent(); + } + prt_data_decl(dd); + } + else + { + output_hton(ddecl->type); + outputln("(%s.data, %s%s);", ddecl->name, NXBASE_PREFIX, ddecl->name); + } + + return TRUE; + } + } + return copies; +} + +/* Network base type parameters are passed as their underlying type. Thus + we need to copy them to a real network base type variable if their + address is taken */ +bool prt_network_parameter_copies(function_decl fn) +{ + function_declarator fd = get_fdeclarator(fn->declarator); + declaration d; + bool copies = FALSE; + + scan_declaration (d, fd->gparms) + copies = prt_network_parameter_copy(d, copies, FALSE); + scan_declaration (d, fd->parms) + copies = prt_network_parameter_copy(d, copies, FALSE); + + scan_declaration (d, fd->gparms) + prt_network_parameter_copy(d, copies, TRUE); + scan_declaration (d, fd->parms) + prt_network_parameter_copy(d, copies, TRUE); + + return copies; +} + +static unsigned long filler_count; + +struct network_state +{ + size_t offset; + bool isextension; +}; + +static void network_align_to(largest_uint offset, struct network_state *ns) +{ + if (ns->offset < offset) /* There's a gap. Fill it. */ + outputln("unsigned char __nesc_filler%lu[%llu];", + filler_count++, offset - ns->offset); +} + +void prt_network_field_data_decl(data_decl d, struct network_state *ns) +{ + declaration fd; + psd_options opts = 0; + + scan_declaration (fd, d->decls) + { + field_decl fdd = CAST(field_decl, fd); + field_declaration fdecl = fdd->fdecl; + + /* bitfields just show up as filler */ + if (cval_istop(fdecl->bitwidth)) + { + if (!cval_isinteger(fdecl->offset)) + error_with_location(fdd->location, "unsupported network type"); + else + { + largest_uint offset = cval_uint_value(fdecl->offset) / BITSPERBYTE; + + network_align_to(offset, ns); + if (type_size_cc(fdecl->type)) + ns->offset = offset + type_size_int(fdecl->type); + } + + if (ns->isextension) + output("__extension__ "); + prt_type_elements(d->modifiers, opts); + opts |= psd_duplicate; + prt_field_decl(fdd); + outputln(";"); + } + } + if (!(opts & psd_duplicate)) + prt_interesting_elements(d->modifiers, opts); +} + +void prt_network_field_declaration(declaration d, struct network_state *ns) +{ + ns->isextension = FALSE; + while (is_extension_decl(d)) + { + ns->isextension = TRUE; + d = CAST(extension_decl, d)->decl; + } + prt_network_field_data_decl(CAST(data_decl, d), ns); +} + +void prt_network_fields(tag_ref tref) +{ + declaration d; + struct network_state ns = { 0, FALSE }; + + output(" {"); + indent(); + startline(); + scan_declaration (d, tref->fields) + prt_network_field_declaration(d, &ns); + if (cval_isinteger(tref->tdecl->size)) + network_align_to(cval_uint_value(tref->tdecl->size), &ns); + unindent(); + startline(); + output("} __attribute__((packed))"); +} + +void init_network(void) +{ + init_network_walker(); + uchar_ptr_type = make_pointer_type(unsigned_char_type); +} diff --git a/src/nesc-network.h b/src/nesc-network.h new file mode 100644 index 0000000..fedb271 --- /dev/null +++ b/src/nesc-network.h @@ -0,0 +1,32 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef NESC_NETWORK_H + +/* Prefix for non-network version of network base types */ +#define NXBASE_PREFIX "__nesc_nxbase_" + +void handle_network_types(declaration decls); +void init_network(void); + +void prt_network_fields(tag_ref tref); +void prt_network_routines(void); +bool prt_network_expression(expression e); +bool prt_network_typedef(data_decl d, variable_decl vd); +bool prt_network_parameter_copies(function_decl fn); + +#endif diff --git a/src/nesc-paths.c b/src/nesc-paths.c new file mode 100644 index 0000000..51d3dcc --- /dev/null +++ b/src/nesc-paths.c @@ -0,0 +1,230 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002-2008 Intel Corporation + + This file also includes code from gcc that is + Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, + 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 + Free Software Foundation, Inc. + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include "parser.h" +#include +#include +#include "nesc-paths.h" +#include "semantics.h" + +#include "gcc-cpp.h" + +/* Locate components/interfaces from their name */ + +static region pathregion; +/* Include chains heads and tails. */ +static struct cpp_dir *heads[4]; +static struct cpp_dir *tails[4]; +static bool include_current_dir; +static int maxdirlen; + +static char *canonicalise(region r, const char *path, int len) +{ + int newlen = len + 1; + char *cp; + + if (len == 0) + return ""; + + if (path[len - 1] != '/' +#ifdef DIR_SEPARATOR + && path[len - 1] != DIR_SEPARATOR +#endif + ) + newlen++; + + cp = rarrayalloc(r, newlen, char); + memcpy(cp, path, len); + cp[newlen - 2] = '/'; /* make sure last char is / */ + cp[newlen - 1] = '\0'; /* null terminate */ + + unixify_path(cp); + + return cp; +} + +/* Handle -I- */ +static void add_minus(region r) +{ + if (!include_current_dir) + error("-I- specified twice"); + include_current_dir = FALSE; + + heads[CHAIN_QUOTE] = heads[CHAIN_BRACKET]; + tails[CHAIN_QUOTE] = tails[CHAIN_BRACKET]; + heads[CHAIN_BRACKET] = NULL; + tails[CHAIN_BRACKET] = NULL; +} + +static void add_dir(region r, const char *path, int len, int chain) +{ + cpp_dir *np = ralloc(r, struct cpp_dir); + int l; + + np->next = NULL; + np->name = canonicalise(r, path, len);; + np->sysp = chain == CHAIN_SYSTEM || chain == CHAIN_AFTER; + np->construct = 0; + np->user_supplied_p = 1; /* appears unused */ + + if (tails[chain]) + tails[chain]->next = np; + else + heads[chain] = np; + tails[chain] = np; + + l = strlen(np->name); + if (l > maxdirlen) + maxdirlen = l; +} + +void add_nesc_dir(const char *path, int chain) +{ + if (!strcmp(path, "-")) + add_minus(pathregion); + else + add_dir(pathregion, path, strlen(path), chain); +} + +static bool file_exists(const char *fullname) +{ + struct stat sbuf; + return stat(fullname, &sbuf) == 0 && S_ISREG(sbuf.st_mode); +} + +static const char *find_file(char *filename) +{ + char *fullname = alloca(maxdirlen + strlen(filename) + 1); + struct cpp_dir *p; + + if (include_current_dir && file_exists(filename)) + return ""; + for (p = heads[CHAIN_QUOTE]; p; p = p->next) + { + sprintf(fullname, "%s%s", p->name, filename); + if (file_exists(fullname)) + return p->name; + } + return NULL; +} + +static void build_search_path(region r, const char *pathlist, int chain) +{ + if (pathlist) + { + char *colon; + + while ((colon = strchr(pathlist, ':'))) + { + *colon = '\0'; + add_dir(r, pathlist, colon - pathlist, chain); + pathlist = colon + 1; + } + add_dir(r, pathlist, strlen(pathlist), chain); + } +} + +void init_nesc_paths_start(region r) +{ + include_current_dir = TRUE; + maxdirlen = 0; + pathregion = r; +} + +void add_nesc_path(const char *path, int chain) +{ + build_search_path(pathregion, path, chain); +} + +static void join(int c1, int c2) +{ + if (heads[c1]) + tails[c1]->next = heads[c2]; + else + heads[c1] = heads[c2]; +} + +void init_nesc_paths_end(void) +{ + add_nesc_path(getenv("NESCPATH"), CHAIN_BRACKET); + + join(CHAIN_SYSTEM, CHAIN_AFTER); + join(CHAIN_BRACKET, CHAIN_SYSTEM); + join(CHAIN_QUOTE, CHAIN_BRACKET); + + /* If verbose, print the list of dirs to search. */ + if (flag_verbose) + { + struct cpp_dir *p; + + fprintf (stderr, "#include \"...\" and component search starts here:\n"); + for (p = heads[CHAIN_QUOTE];; p = p->next) + { + if (p == heads[CHAIN_BRACKET]) + fprintf (stderr, "#include <...> search starts here:\n"); + if (!p) + break; + fprintf (stderr, " %s\n", p->name); + } + fprintf (stderr, "End of search list.\n"); + } +} + +void set_cpp_include_path(void) +{ + cpp_reader *reader = current.lex.finput; + + cpp_set_include_chains(reader, heads[CHAIN_QUOTE], heads[CHAIN_BRACKET], + !include_current_dir); +} + +#define MAX_EXT_LEN 2 + +const char *find_nesc_file(region r, source_language l, const char *name) +{ + int filename_len = strlen(name) + MAX_EXT_LEN + 2; + char *filename = alloca(filename_len); + const char *dirname; + int fullname_len; + char *fullname; + + strcpy(filename, name); + switch (l) + { + case l_interface: strcat(filename, ".nc"); break; + case l_component: strcat(filename, ".nc"); break; + case l_c: strcat(filename, ".h"); break; + default: assert(0); break; + } + + dirname = find_file(filename); + + if (!dirname) + return NULL; + + fullname_len = strlen(dirname) + filename_len; + fullname = rarrayalloc(r, fullname_len, char); + + sprintf(fullname, "%s%s", dirname, filename); + + return fullname; +} diff --git a/src/nesc-paths.h b/src/nesc-paths.h new file mode 100644 index 0000000..3c8a5de --- /dev/null +++ b/src/nesc-paths.h @@ -0,0 +1,32 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef NESC_PATHS_H +#define NESC_PATHS_H +/* Locate components/interfaces from their name */ + +enum { CHAIN_QUOTE, CHAIN_BRACKET, CHAIN_SYSTEM, CHAIN_AFTER }; + +void init_nesc_paths_start(region r); +void add_nesc_path(const char *path, int chain); +void add_nesc_dir(const char *path, int chain); +void init_nesc_paths_end(void); + +void set_cpp_include_path(void); +const char *find_nesc_file(region r, source_language l, const char *name); + +#endif diff --git a/src/nesc-semantics.c b/src/nesc-semantics.c new file mode 100644 index 0000000..a239510 --- /dev/null +++ b/src/nesc-semantics.c @@ -0,0 +1,777 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include "parser.h" +#include "nesc-semantics.h" +#include "semantics.h" +#include "nesc-decls.h" +#include "c-parse.h" +#include "AST_utils.h" +#include "nesc-paths.h" +#include "nesc-cpp.h" +#include "nesc-env.h" +#include "nesc-component.h" +#include "nesc-interface.h" +#include "edit.h" +#include "c-parse.h" +#include "semantics.h" +#include "nesc-attributes.h" +#include "attributes.h" +#include "init.h" +#include "unparse.h" +#include "nesc-deputy.h" + +#include +#include + +bool nesc_attributep(gcc_attribute a) +/* Returns: TRUE if a is a nesc-specific attribute + */ +{ + const char *name = a->word1->cstring.data; + + return !strcmp(name, "C") || + !strcmp(name, "spontaneous") || + !strcmp(name, "combine") || + !strcmp(name, "nx_base") || + !strcmp(name, "nx_base_le") || + !strcmp(name, "nx_base_be") || + !strcmp(name, "hwevent") || + !strcmp(name, "atomic_hwevent"); +} + +type get_actual_function_type(type t) +/* Returns: The actual function type for a (possibly generic) type t + representing the type of a function/command/event + */ +{ + if (type_generic(t)) + return type_function_return_type(t); + else + return t; +} + +function_declarator ddecl_get_fdeclarator(data_declaration fndecl) +/* Effects: Returns fndecl's function_declarator + Requires: fndecl represent a function or function pointer +*/ +{ + declarator fd; + + if (is_variable_decl(fndecl->ast)) + fd = CAST(variable_decl, fndecl->ast)->declarator; + else + fd = CAST(function_decl, fndecl->ast)->declarator; + + return get_fdeclarator(fd); +} + +declaration ddecl_get_gparms(data_declaration fndecl) +/* Effects: Returns the declaration list for fndecl's generic parameters + Requires: fndecl represent a function or function pointer +*/ +{ + /* For functions in interfaces we get them from the interface ref */ + if (fndecl->kind == decl_function && fndecl->interface) + return CAST(interface_ref, fndecl->interface->ast)->gparms; + + /* Otherwise we get them from the function's declarator */ + return ddecl_get_fdeclarator(fndecl)->gparms; +} + +bool ddecl_is_command_or_event(data_declaration decl) +{ + return decl->kind == decl_function && + (decl->ftype == function_event || decl->ftype == function_command); +} + +bool nesc_filename(const char *name) +{ + char *dot = strrchr(lbasename(name), '.'); + + if (dot) + { + if (!strcmp(dot, ".nc")) + return TRUE; + } + return FALSE; /* C by default */ +} + +const char *element_name(region r, const char *path) +/* Returns: Return the "identifier part" + of path, i.e., remove any directory and extension + The returned string is allocated in region r. +*/ +{ + const char *base, *dot; + + base = lbasename(path); + dot = strrchr(base, '.'); + + if (dot) + { + /* Extract id */ + char *copy = rarrayalloc(r, dot - base + 1, char); + + memcpy(copy, base, dot - base); + copy[dot - base] = '\0'; + + return copy; + } + else + return rstrdup(r, base); +} + +const char *language_name(source_language l) +{ + switch (l) + { + case l_interface: return "interface"; + case l_component: case l_implementation: return "component"; + case l_c: return "C file"; + case l_any: return ""; + default: assert(0); return "BUG"; + } +} + +node compile(location loc, nesc_declaration container, + const char *name, bool name_is_path) +{ + source_language l = container ? container->kind : l_c; + const char *path = + name_is_path ? name : find_nesc_file(parse_region, l, name); + node parse_tree = NULL; + struct semantic_state old_semantic_state = current; + bool ok; + + if (!path) + error_with_location(loc, "%s %s not found", language_name(l), name); + else + { + if (flag_verbose) + fprintf(stderr, "preprocessing %s\n", path); + + current.file = container; + current.fileregion = newregion(); + start_semantics(l_c, NULL, global_env); + ok = start_lex(l, path); + save_pp_file_start(path); + if (!ok) + error_with_location(loc, "failed to preprocess %s", path); + else + parse_tree = parse(); + deleteregion_ptr(¤t.fileregion); + end_lex(); + save_pp_file_end(); + } + + current = old_semantic_state; + + return parse_tree; +} + +nesc_decl dummy_nesc_decl(location loc, nesc_declaration d) +{ + word wname = build_word(parse_region, d->name); + nesc_decl nd; + + switch (d->kind) + { + case l_component: { + environment env = new_environment(parse_region, global_env, TRUE, FALSE); + implementation impl = CAST(implementation, + new_module(parse_region, loc, env, NULL)); + nd = CAST(nesc_decl, + new_component(parse_region, dummy_location, wname, NULL, FALSE, NULL, NULL, impl)); + break; + } + case l_interface: + nd = CAST(nesc_decl, + new_interface(parse_region, loc, wname, NULL, NULL)); + break; + default: + assert(0); + nd = NULL; + break; + } + d->ast = nd; + nd->cdecl = d; + + build(nd); + + return nd; +} + +void build(nesc_decl ast) +{ + struct semantic_state old_semantic_state = current; + nesc_declaration decl = ast->cdecl; + + current.container = decl; + + resolve_deputy_scopes(ast); + + switch (decl->kind) + { + case l_interface: + build_interface(parse_region, decl); + break; + case l_component: + build_component(parse_region, decl); + break; + default: + assert(0); + } + + current = old_semantic_state; +} + +nesc_declaration load(source_language sl, location l, + const char *name, bool name_is_path) +{ + /* The l_any stuff is a bit of a hack. It's for use from nesc-main.c + only, to allow loading something whose "kind" is not yet known. + When using l_any, the global environment will record "name" as being + a component, but the returned declaration may be a component or + interface. */ + const char *element = name_is_path ? element_name(parse_region, name) : name; + const char *actual_name; + node ptree; + nesc_decl ast = NULL; + nesc_declaration decl = + new_nesc_declaration(parse_region, sl == l_any ? l_component : sl, element); + + /* We don't get duplicates as we only load on demand */ + nesc_declare(decl); + + ptree = compile(l, decl, name, name_is_path); + if (ptree) + { + bool badkind; + + ast = CAST(nesc_decl, ptree); + build(ast); + + actual_name = ast->word1->cstring.data; + badkind = sl != l_any && ast->cdecl->kind != sl; + if (badkind || strcmp(element, actual_name)) + warning_or_error_with_location(!badkind, ast->location, + "expected %s `%s', but got %s '%s'", + language_name(sl), element, + language_name(ast->cdecl->kind), actual_name); + + /* Force creation of dummy AST if we get wrong kind (this avoids + a duplicate error message in require) */ + if (badkind) + ast = NULL; + } + + if (!ast) + ast = dummy_nesc_decl(new_location(name, 0), decl); + + return ast->cdecl; /* can be different from decl when sl == l_any */ +} + +nesc_declaration start_nesc_entity(source_language sl, word name) +{ + nesc_declaration decl; + + /* If the kind of entity in the file matches the expected kind + (passed to load), reuse the existing declaration. Otherwise + make a temporary one to use while loading the file + */ + if (sl == current.file->kind) + decl = current.file; + else + decl = new_nesc_declaration(parse_region, sl, name->cstring.data); + + get_latest_docstring(&decl->doc, permanent, NULL); + + start_semantics(sl, decl, decl->env); + + return decl; +} + +bool is_module_local_static(data_declaration ddecl) +{ + return ddecl->kind == decl_variable && + (ddecl->vtype == variable_static && ddecl->container_function && + ddecl->container_function->container); +} + +bool is_module_variable(data_declaration ddecl) +{ + return ddecl->kind == decl_variable && + ddecl->Cname == FALSE && + /* top-level module var or local static module var */ + (ddecl->container || is_module_local_static(ddecl)); +} + +nesc_declaration ddecl_container(data_declaration ddecl) +{ + while (ddecl->container_function) + ddecl = ddecl->container_function; + + return ddecl->container; +} + +nesc_declaration tdecl_container(tag_declaration tdecl) +{ +#if 0 + if (tdecl->container_function) + return ddecl_container(tdecl->container_function); + else +#endif + return tdecl->container; +} + +const char *make_intf_printname(const char *iname, const char *fname) +/* Returns: string "iname.fname" allocated in current.fileregion + */ +{ + size_t ilen = strlen(iname); + size_t dlen = strlen(fname); + char *fullname = rstralloc(current.fileregion, ilen + dlen + 2); + + memcpy(fullname, iname, ilen); + fullname[ilen] = '.'; + strcpy(fullname + ilen + 1, fname); + + return fullname; +} + +const char *decl_printname(data_declaration ddecl) +{ + if (ddecl_is_command_or_event(ddecl) && ddecl->interface) + return make_intf_printname(ddecl->interface->name, ddecl->name); + else + return ddecl->name; +} + +data_declaration get_function_ddecl(expression e) +/* Returns: If e denotes a specific function, return its data_declaration + Otherwise return NULL +*/ +{ + if (is_identifier(e)) + { + identifier id = CAST(identifier, e); + + if (id->ddecl->kind == decl_function) + return id->ddecl; + } + else if (is_interface_deref(e)) + return CAST(interface_deref, e)->ddecl; + + return NULL; +} + +data_declaration declare_function(location loc, const char *name, type signature) +/* Effects: If 'name' is already declared, check that it is a function with + the specified signature. + If it isn't declared, declare it as a function with the specified + signature. + Returns: data_declaration for the function, or NULL if an error was + reported to the user. +*/ +{ + data_declaration fdecl; + bool ok = FALSE; + + /* If function already declared, declaration should match signature. + If not, we declare it with given signature */ + fdecl = lookup_id(name, FALSE); + if (fdecl) + { + if (fdecl->kind != decl_function || + !(fdecl->ftype == function_normal || fdecl->ftype == function_static)) + error_with_location(loc, "function `%s' is not a C function", + name); + else if (!type_compatible_unqualified(fdecl->type, signature)) + error_with_location(loc, "function `%s' does not have the right signature", + name); + else + ok = TRUE; + } + else + { + struct data_declaration tempdecl; + declaration dummy = make_error_decl(); + + /* Declare function */ + dummy->location = loc; + init_data_declaration(&tempdecl, dummy, name, signature); + tempdecl.kind = decl_function; + tempdecl.ftype = function_normal; + tempdecl.isexternalscope = tempdecl.isfilescoperef = TRUE; + fdecl = declare(current.env, &tempdecl, FALSE); + + ok = TRUE; + } + return ok ? fdecl : NULL; +} + +void handle_combine_attribute(location loc, const char *combiner, type *t) +{ + data_declaration cdecl = + declare_function(loc, combiner, + build_function_type(parse_region, *t, *t, *t, NULL)); + + if (cdecl) + *t = make_combiner_type(*t, cdecl); +} + +void handle_nxbase_attribute(location loc, bool be, bool allow_bf, const char *basename, + data_declaration ddecl) +{ + region r = parse_region; + char *encoder_name, *decoder_name; + type t = ddecl->type; + + encoder_name = rstralloc(r, strlen(basename) + 13); + sprintf(encoder_name, "__nesc_hton_%s", basename); + decoder_name = rstralloc(r, strlen(basename) + 13); + sprintf(decoder_name, "__nesc_ntoh_%s", basename); + + ddecl->encoder = /* takes buffer and original value. returns original value */ + declare_function(loc, encoder_name, + build_function_type(r, t, ptr_void_type, t, NULL)); + + ddecl->decoder = /* takes buffer and returns decoded value */ + declare_function(loc, decoder_name, + build_function_type(r, t, const_ptr_void_type, NULL)); + + if (allow_bf) + { + encoder_name = rstralloc(r, strlen(basename) + 15); + sprintf(encoder_name, "__nesc_htonbf_%s", basename); + decoder_name = rstralloc(r, strlen(basename) + 15); + sprintf(decoder_name, "__nesc_ntohbf_%s", basename); + + /* bitfields take additional offset, length fields */ + ddecl->bf_encoder = + declare_function(loc, encoder_name, + build_function_type(r, t, ptr_void_type, unsigned_int_type, unsigned_char_type, t, NULL)); + + ddecl->bf_decoder = + declare_function(loc, decoder_name, + build_function_type(r, t, const_ptr_void_type, unsigned_int_type, unsigned_char_type, NULL)); + } + ddecl->isbe = be; + + /* We do this even if we got an error, to ensure ddecl gets treated as + a network type. */ + ddecl->basetype = t; +} + +/* Create definition for template parameter 'elements d' with attributes + attributes. + Returns the declaration for the parameter. +*/ +declaration declare_template_parameter(declarator d, type_element elements, + attribute attributes) +{ + /* There must be at least a declarator or some form of type specification */ + location l = d ? d->location : elements->location; + variable_decl vd = + new_variable_decl(parse_region, l, d, attributes, NULL, NULL, NULL); + data_decl dd = + new_data_decl(parse_region, l, elements, CAST(declaration, vd)); + data_declaration ddecl = NULL, old_decl = NULL; + struct data_declaration tempdecl; + dd_list extra_attr; + int class; + scflags scf; + const char *name; + bool defaulted_int; + type parm_type; + + parse_declarator(elements, vd->declarator, FALSE, FALSE, + &class, &scf, NULL, &name, &parm_type, + &defaulted_int, NULL, &extra_attr); + vd->declared_type = parm_type; + + /* Storage class checks */ + if (class) + { + /* Detect "typedef t", to declare a type parameter */ + if (class == RID_TYPEDEF && defaulted_int && + is_identifier_declarator(d)) + return declare_type_parameter(d->location, + CAST(identifier_declarator, d)->cstring, + attributes, extra_attr); + else if (class == RID_TYPEDEF && d == NULL) + { + /* Recognise "typedef TYPENAME", and declare TYPENAME as a + type parameter (i.e., we're shadowing a global typedef) */ + type_element elem; + typename tname; + bool ok = TRUE; + + /* Check there's only a typedef and a typename */ + scan_type_element (elem, elements) + if (is_typename(elem)) + tname = CAST(typename, elem); + else if (!(is_attribute(elem) || + (is_rid(elem) && CAST(rid, elem)->id == RID_TYPEDEF))) + ok = FALSE; + + if (ok && tname) + { + cstring cname = make_cstring(parse_region, tname->ddecl->name, + strlen(tname->ddecl->name)); + return + declare_type_parameter(l, cname, attributes, extra_attr); + } + } + } + + if (!name) + error("no name specified for parameter"); + else if (class) + error("storage class specified for parameter `%s'", name); + + check_variable_scflags(scf, vd->location, "parameter", name); + +/* Allow real, integral and string types. Not allowing complex for now, + though it would be a trivial extension */ + if (!(type_real(parm_type) || type_chararray(parm_type, TRUE))) + error("only char [] and arithmetic types allowed as component arguments"); + + if (type_array(parm_type)) + /* Transfer const-ness of array into that of type pointed to. */ + parm_type = + make_pointer_type(qualify_type1(type_array_of(parm_type), parm_type)); + + init_data_declaration(&tempdecl, CAST(declaration, vd), name, parm_type); + tempdecl.kind = decl_constant; + tempdecl.substitute = TRUE; + tempdecl.definition = tempdecl.ast; + + old_decl = lookup_id(tempdecl.name, TRUE); + if (old_decl && duplicate_decls(&tempdecl, old_decl, FALSE, FALSE)) + ddecl = old_decl; + else + ddecl = declare(current.env, &tempdecl, FALSE); + vd->ddecl = ddecl; + + ignored_dd_attributes(extra_attr); + ignored_attributes(attributes); + + return CAST(declaration, dd); +} + +declaration declare_type_parameter(location l, cstring id, attribute attribs, + dd_list extra_attr) +{ + type_parm_decl d = new_type_parm_decl(parse_region, l, id, NULL); + data_declaration ddecl; + + if ((ddecl = lookup_id(id.data, TRUE))) + error("duplicate parameter name `%s' in parameter list", id.data); + else + { + struct data_declaration tempdecl; + + init_data_declaration(&tempdecl, CAST(declaration, d), id.data, + error_type); + tempdecl.kind = decl_typedef; + tempdecl.typevar_kind = typevar_normal; + tempdecl.definition = tempdecl.ast; + handle_decl_attributes(attribs, &tempdecl); + handle_decl_dd_attributes(extra_attr, &tempdecl); + ddecl = declare(current.env, &tempdecl, FALSE); + ddecl->type = make_variable_type(ddecl); + } + d->ddecl = ddecl; + + return CAST(declaration, d); +} + +expression make_type_argument(asttype t) +{ + type_argument e = new_type_argument(parse_region, t->location, t); + + e->type = t->type; + + return CAST(expression, e); +} + +nesc_declaration original_component(nesc_declaration c) +{ + while (c->original) + c = c->original; + + return c; +} + +static void attr_C_tdecl(nesc_attribute attr, tag_declaration tdecl) +{ + if (tdecl->container_function) + error_with_location(attr->location, "`@C()' is for symbols with external scope only"); + else if (current.container && current.container->abstract) + error_with_location(attr->location, "@C() cannot be used inside generic components"); + else + tdecl->Cname = TRUE; +} + +static void attr_C_decl(nesc_attribute attr, data_declaration ddecl) +{ + if (!ddecl->isexternalscope) + error_with_location(attr->location, "`@C()' is for symbols with external scope only"); + else if (current.container && current.container->abstract) + error_with_location(attr->location, "@C() cannot be used inside generic components"); + else + ddecl->Cname = TRUE; +} + +static bool require_function(nesc_attribute attr, data_declaration ddecl) +{ + if (ddecl->kind == decl_function && ddecl->ftype == function_normal) + return TRUE; + + error_with_location(attr->location, "`@%s()' is for external functions only", attr->word1->cstring.data); + return FALSE; +} + +static void attr_hwevent_decl(nesc_attribute attr, data_declaration ddecl) +{ + if (require_function(attr, ddecl)) + { + ddecl->async = TRUE; + ddecl->spontaneous = c_call_nonatomic; + } +} + +static void attr_atomic_hwevent_decl(nesc_attribute attr, data_declaration ddecl) +{ + if (require_function(attr, ddecl)) + { + ddecl->async = TRUE; + ddecl->spontaneous = c_call_atomic; + } +} + + +static void attr_spontaneous_decl(nesc_attribute attr, data_declaration ddecl) +{ + if (require_function(attr, ddecl)) + { + /* The test avoids overriding the effect of atomic_hwevent */ + if (!ddecl->spontaneous) + ddecl->spontaneous = c_call_nonatomic; + } +} + +static void attr_combine_decl(nesc_attribute attr, data_declaration ddecl) +{ + ivalue fn_init = lookup_attribute_field(attr, "fn"); + data_declaration fn_name_ddecl; + char *fn_name; + + if (fn_init && fn_init->kind == iv_base && + (fn_name_ddecl = string_ddecl(fn_init->u.base.expr)) && + (fn_name = ddecl2str(parse_region, fn_name_ddecl))) + { + if (ddecl->kind == decl_typedef) + handle_combine_attribute(attr->location, fn_name, &ddecl->type); + else + error_with_location(attr->location, "@combine(\"function-name\") can only be used with typedef"); + } + else + error_with_location(attr->location, "usage is @combine(\"function-name\")"); +} + +static void attr_macro_tdecl(nesc_attribute attr, tag_declaration tdecl) +{ + ivalue macro_name_init = lookup_attribute_field(attr, "macro_name"); + data_declaration macro_name_ddecl; + char *macro_name, *m; + + if (tdecl->kind != kind_attribute_ref) + { + error_with_location(attr->location, "@macro() can only be applied to attribute declarations"); + return; + } + + if (!(macro_name_init && macro_name_init->kind == iv_base && + (macro_name_ddecl = string_ddecl(macro_name_init->u.base.expr)) && + (macro_name = ddecl2str(parse_region, macro_name_ddecl)))) + goto bad; + + /* Check that the symbol name is a valid macro name (C symbol) */ + if (!(isalpha(macro_name[0]) || macro_name[0] == '_')) + goto bad; + + for (m = macro_name + 1; *m; m++) + if (!(isalnum(*m) || *m == '_')) + goto bad; + + tdecl->macro_name = macro_name; + return; + + bad: + error_with_location(attr->location, "usage is @macro(\"macro-name\")"); +} + +void init_internal_nesc_attributes(void) +{ + define_internal_attribute("C", NULL, attr_C_decl, attr_C_tdecl, NULL, NULL, + NULL); + define_internal_attribute("hwevent", NULL, attr_hwevent_decl, NULL, NULL, + NULL, NULL); + define_internal_attribute("atomic_hwevent", NULL, attr_atomic_hwevent_decl, + NULL, NULL, NULL, NULL); + define_internal_attribute("spontaneous", NULL, attr_spontaneous_decl, NULL, + NULL, NULL, NULL); + define_internal_attribute("combine", NULL, attr_combine_decl, NULL, NULL, + NULL, + "fn", make_pointer_type(char_type), NULL); + define_internal_attribute("macro", NULL, NULL, attr_macro_tdecl, NULL, NULL, + "macro_name", make_pointer_type(char_type), NULL); +} + +void check_name(const char *name) +{ + const char *occ, *sep = get_function_separator(); + int lsep = strlen(sep); + + /* Ignore leading instances of the separator */ + while (!strncmp(name, sep, lsep)) + name++; + + occ = strstr(name, sep); + if (!occ) + return; + + /* Ignore trailing instances of the separator */ + while (occ[lsep] && !strncmp(occ + 1, sep, lsep)) + occ++; + if (occ[lsep]) + { + static int first = 1; + + warning("symbol `%s' contains the separator `%s' used in generated code", + name, sep); + if (first) + { + warning("This can cause bugs or compile errors when the C code"); + warning("generated by nesC is passed to the underlying C compiler"); + first = FALSE; + } + } +} diff --git a/src/nesc-semantics.h b/src/nesc-semantics.h new file mode 100644 index 0000000..a0e6a0b --- /dev/null +++ b/src/nesc-semantics.h @@ -0,0 +1,140 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef NESC_SEMANTICS_H +#define NESC_SEMANTICS_H + +struct environment; + +#include "nesc-decls.h" + +void init_internal_nesc_attributes(void); +/* Effects: Define internal nesC @-style attributes + */ + +bool nesc_filename(const char *name); + +const char *element_name(region r, const char *path); +/* Returns: Return the "identifier part" + of path, i.e., remove any directory and extension + The returned string is allocated in region r. +*/ + +node compile(location loc, nesc_declaration container, + const char *name, bool name_is_path); + +nesc_declaration load(source_language sl, location l, + const char *name, bool name_is_path); + +type get_actual_function_type(type t); +/* Returns: The actual function type for a (possibly generic) type t + representing the type of a function/command/event + */ + +function_declarator ddecl_get_fdeclarator(data_declaration fndecl); +/* Effects: Returns fndecl's function_declarator + Requires: fndecl represent a function +*/ + +declaration ddecl_get_gparms(data_declaration fndecl); +/* Effects: Returns the declaration list for fndecl's generic parameters + Requires: fndecl represent a function +*/ + +bool ddecl_is_command_or_event(data_declaration decl); + +bool nesc_attributep(gcc_attribute a); +/* Returns: TRUE if a is a nesc-specific attribute + */ + +const char *language_name(source_language l); + +nesc_decl dummy_nesc_decl(location loc, nesc_declaration ndecl); +void build(nesc_decl ast); +nesc_declaration start_nesc_entity(source_language sl, word name); + +bool is_module_variable(data_declaration ddecl); +/* Returns: TRUE if ddecl is a module variable + (this includes is_module_local_static) + */ + +bool is_module_local_static(data_declaration ddecl); +/* Returns: TRUE if ddecl is a local static variable inside a module + */ + +const char *make_intf_printname(const char *iname, const char *fname); +/* Returns: string "iname.fname" allocated in current.fileregion + */ + +const char *decl_printname(data_declaration ddecl); +/* Returns: The printable name for ddecl + (interface.name for commands or events in interfaces, + just the name otherwise) + Any necessary memory is allocated in current.fileregion +*/ + +data_declaration get_function_ddecl(expression e); +/* Returns: If e denotes a specific function, return its data_declaration + Otherwise return NULL +*/ + +void handle_combine_attribute(location loc, const char *combiner, type *t); +/* Effects: handle combine attribute specifying function 'combiner', + modifying *t as appropriate + */ + +void handle_nxbase_attribute(location loc, bool be, bool allow_bf, + const char *fnbasename, data_declaration ddecl); +/* Effects: handle network type attribute specifying functions + ntoh_fnbasename and hton_fnbasename as the decoding and encoding + functions respectively. + If allow_bf is true, then ntohbf_fnbasename and htonbf_fnbasename + are the bitfield decoding and encoding functions repsectively. + If be is true, this is a big endian type (transitions between + big and little-endian bitfields cause alignemnt to the next byte + inside a struct). + Modifies ddecl to reflect it's status as a base network type. + */ + +declaration declare_template_parameter(declarator d, type_element elements, + attribute attributes); +declaration declare_type_parameter(location l, cstring id, attribute attribs, + dd_list extra_attr); + +expression make_type_argument(asttype t); + +nesc_declaration original_component(nesc_declaration c); + +/* Some macros to make nesc_error easier to deal with */ +#define nesc_warning (nesc_error ? error : warning) +#define nesc_warning_with_location (nesc_error ? error_with_location : warning_with_location) + +data_declaration declare_function(location loc, const char *name, type signature); +/* Effects: If 'name' is already declared, check that it is a function with + the specified signature. + If it isn't declared, declare it as a function with the specified + signature. + Returns: data_declaration for the function, or NULL if an error was + reported to the user. +*/ + +nesc_declaration ddecl_container(data_declaration ddecl); +nesc_declaration tdecl_container(tag_declaration tdecl); + +void check_name(const char *name); + +#endif diff --git a/src/nesc-task.c b/src/nesc-task.c new file mode 100644 index 0000000..5d36bb6 --- /dev/null +++ b/src/nesc-task.c @@ -0,0 +1,383 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include "parser.h" +#include "constants.h" +#include "nesc-task.h" +#include "nesc-semantics.h" +#include "nesc-component.h" +#include "nesc-configuration.h" +#include "semantics.h" +#include "AST_utils.h" +#include "c-parse.h" +#include "nesc-cg.h" +#include "nesc-c.h" +#include "nesc-magic.h" +#include "edit.h" +#include "expr.h" + +static char *scheduler_name; +static char *scheduler_unique_name; +static char *scheduler_interface_name; +static char *scheduler_interfacedef_name; +static char *scheduler_run_name; +static char *scheduler_post_name; + +nesc_declaration scheduler; +static data_declaration scheduler_interface; +declaration all_tasks; + +static word make_scheduler_interfacedef_name(location l) +{ + static bool alloc; + static cstring ascstring; + + if (!alloc) + { + alloc = TRUE; + ascstring = str2cstring(permanent, scheduler_interfacedef_name); + } + + return new_word(parse_region, l, ascstring); +} + +static cstring make_scheduler_run_name(void) +{ + static bool alloc; + static cstring ascstring; + + if (!alloc) + { + alloc = TRUE; + ascstring = str2cstring(permanent, scheduler_run_name); + } + + return ascstring; +} + +static cstring make_scheduler_post_name(void) +{ + static bool alloc; + static cstring ascstring; + + if (!alloc) + { + alloc = TRUE; + ascstring = str2cstring(permanent, scheduler_post_name); + } + + return ascstring; +} + +static void declare_scheduler_interface(data_declaration task_decl) +{ + region r = parse_region; + location loc = task_decl->ast->location; + word task_name; + interface_ref task_interface; + rp_interface task_uses; + int osection; + + /* We save the task's replacement interface in its interface field... */ + if (task_decl->interface) + return; + + /* Build the (uses) 'interface Scheduler as X' ast, declare the interface. */ + /* This specific AST structure is assumed in wire_scheduler below */ + task_name = new_word(r, loc, str2cstring(r, task_decl->name)); + task_interface = new_interface_ref(r, loc, make_scheduler_interfacedef_name(loc), + NULL, task_name, NULL, NULL, NULL); + osection = current.spec_section; + current.spec_section = spec_uses; + declare_interface_ref(task_interface, NULL, current.container->env, NULL); + current.spec_section = osection; + task_decl->interface = task_interface->ddecl; + + /* Build the 'uses ' AST, add it to the component */ + task_uses = new_rp_interface(r, loc, TRUE, CAST(declaration, task_interface)); + all_tasks = declaration_chain(CAST(declaration, task_uses), all_tasks); +} + +static void replace_task_with_event(type_element modifiers) +{ + type_element modifier; + + scan_type_element (modifier, modifiers) + if (is_rid(modifier)) + { + rid keyword = CAST(rid, modifier); + + if (keyword->id == RID_TASK) + keyword->id = RID_EVENT; + } +} + +void handle_post(function_call fcall) +{ + identifier task = CAST(identifier, fcall->arg1); + + interface_deref scheduler_post; + data_declaration postdecl; + + postdecl = interface_lookup(task->ddecl->interface, scheduler_post_name); + if (!postdecl || postdecl->ftype != function_command) + { + static int oneerror; + + if (!oneerror) + { + oneerror = TRUE; + error("task interface `%s' has no command named `%s'", + scheduler_interface_name, scheduler_post_name); + } + return; + } + + /* Rewrite post foo() to call foo.post() */ + fcall->call_kind = command_call; + task->ddecl = task->ddecl->interface; + task->type = task->ddecl->type; + scheduler_post = new_interface_deref(parse_region, task->location, + CAST(expression, task), + make_scheduler_post_name(), postdecl); + scheduler_post->type = postdecl->type; + fcall->arg1 = CAST(expression, scheduler_post); +} + +void handle_task_definition(function_decl fdecl) +{ + function_declarator fd; + + declare_scheduler_interface(fdecl->ddecl); + replace_task_with_event(fdecl->modifiers); + + /* Replace foo with foo.run. We only bother doing this if the declarator + is a valid task declarator (function_declarator with nested + identifier_declarator) - if it isn't, we have an error in the form of + a misdeclared task. */ + /* (we only get here for something which really is a function declaration) */ + fd = CAST(function_declarator, fdecl->declarator); + if (is_identifier_declarator(fd->declarator)) + { + data_declaration rundecl; + identifier_declarator oldd = CAST(identifier_declarator, fd->declarator); + identifier_declarator rund = + new_identifier_declarator(parse_region, fd->location, + make_scheduler_run_name()); + interface_ref_declarator ird = + new_interface_ref_declarator(parse_region, fd->location, + CAST(declarator, rund), + new_word(parse_region, fd->location, oldd->cstring)); + fd->declarator = CAST(declarator, ird); + + /* Update task's declaration object */ + rundecl = interface_lookup(fdecl->ddecl->interface, scheduler_run_name); + if (!rundecl || rundecl->ftype != function_event) + { + static int oneerror; + + if (!oneerror) + { + oneerror = TRUE; + error("task interface `%s' has no event named `%s'", + scheduler_interface_name, scheduler_run_name); + } + } + else + { + /* Don't lose safe flag */ + rundecl->safe = fdecl->ddecl->safe; + fdecl->ddecl = rundecl; + rundecl->definition = CAST(declaration, fdecl); + } + } +} + +void handle_task_declaration(variable_decl vdecl) +{ + declare_scheduler_interface(vdecl->ddecl); + /* This declaration will be suppressed in unparsing, as you can't + declare events anyway. So no further work needed. */ +} + +void load_scheduler(void) +{ + scheduler = load(l_component, toplevel_location, scheduler_name, FALSE); + if (scheduler_name) + { + data_declaration intf = env_lookup(scheduler->env->id_env, + scheduler_interface_name, TRUE); + + /* Check interface for validity. It must be the provided, have a + single parameter and be the right interface type. + Also, no generic interfaces please. */ + if (intf && intf->kind == decl_interface_ref && !intf->required && + intf->gparms && !intf->itype->abstract && + !strcmp(intf->itype->name, scheduler_interfacedef_name)) + { + typelist_scanner dummy; + + typelist_scan(intf->gparms, &dummy); + if (typelist_next(&dummy) && !typelist_next(&dummy)) + scheduler_interface = intf; + } + if (!scheduler_interface) + error_with_location(toplevel_location, + "Scheduler `%s' has no scheduling interface named `%s'", + scheduler_name, scheduler_interface_name); + } +} + +static expression build_taskid(module m, data_declaration taskdecl) +{ + /* Build a unique identifier for a task whose declaration is taskdecl, + in module m. + Method: we add enum { m$taskdecl = unique("task-unique-string") }; + to all_cdecls + and return an identifier-expression referring to m$taskdecl + */ + + location loc = taskdecl->ast->location; + region r = parse_region; + cstring idname; + enumerator idast; + struct data_declaration tempdecl; + enum_ref idenum; + tag_declaration enumdecl; + data_decl iddecl; + expression unique_id, unique_fn, unique_args, use_id; + cstring silly_name; + identifier_declarator silly_id; + declarator silly_d; + type_element silly_modifiers; + rid silly_typedef; + type silly_type; + variable_decl silly_vd; + data_decl silly_decl; + + /* Build unique("task-unique-string") */ + unique_fn = build_identifier(r, loc, magic_unique); + unique_args = build_string(r, loc, scheduler_unique_name); + default_conversion(unique_args); + unique_id = build_function_call(r, loc, unique_fn, unique_args); + + /* Build, declare enumerator taskdecl */ + idname = str2cstring(r, taskdecl->name); + idast = new_enumerator(r, loc, idname, unique_id, NULL); + init_data_declaration(&tempdecl, CAST(declaration, idast), idname.data, + int_type); + tempdecl.kind = decl_constant; + tempdecl.definition = tempdecl.ast; + tempdecl.value = unique_id->cst; + idast->ddecl = declare(m->ienv, &tempdecl, FALSE); + + /* Build the enum declaration */ + idenum = new_enum_ref(r, loc, NULL, NULL, NULL, TRUE); + idenum->fields = CAST(declaration, idast); + idenum->tdecl = enumdecl = declare_tag(idenum); + layout_enum_start(enumdecl); + enumdecl->definition = idenum; + enumdecl->defined = TRUE; + layout_enum_end(enumdecl); + + /* Build the expression we will use in the wiring. */ + use_id = build_identifier(r, loc, idast->ddecl); + + /* Hack: the use_id expression needs to be in the module's AST so + that we do instantiation and constant folding on it. We build + a silly typedef for that purpose: + typedef int __nesc_sillytask_taskdecl[use_id] + */ + silly_name = alloc_cstring(r, strlen(taskdecl->name) + 17); + sprintf(silly_name.data, "__nesc_sillytask_%s", taskdecl->name); + silly_id = new_identifier_declarator(r, loc, silly_name); + silly_type = make_array_type(int_type, use_id); + type2ast(r, loc, silly_type, CAST(declarator, silly_id), + &silly_d, &silly_modifiers); + + silly_typedef = new_rid(r, loc, RID_TYPEDEF); + + silly_vd = new_variable_decl(r, loc, silly_d, NULL, NULL, NULL, + NULL/*ddecl*/); + init_data_declaration(&tempdecl, CAST(declaration, silly_vd), + silly_name.data, silly_type); + tempdecl.kind = decl_typedef; + tempdecl.definition = tempdecl.ast; + silly_vd->ddecl = declare(m->ienv, &tempdecl, FALSE); + silly_vd->declared_type = silly_type; + silly_decl = + new_data_decl(r, loc, type_element_chain(CAST(type_element, silly_typedef), + silly_modifiers), + CAST(declaration, silly_vd)); + m->decls = declaration_chain(CAST(declaration, silly_decl), m->decls); + + /* Build the declaration and add it to the module's decls */ + iddecl = new_data_decl(r, loc, CAST(type_element, idenum), NULL); + m->decls = declaration_chain(CAST(declaration, iddecl), m->decls); + + return use_id; +} + + +void wire_scheduler(module m) +{ + rp_interface taskuse; + cgraph cg = m->cdecl->connections, userg = m->cdecl->user_connections; + struct endp m_end, scheduler_end; + + if (!scheduler_interface) + return; + + m_end.component = NULL; + m_end.function = NULL; + m_end.args_node = NULL; + + scheduler_end.component = NULL; + scheduler_end.interface = scheduler_interface; + scheduler_end.function = NULL; + + /* This matches the structure created in declare_scheduler_interface */ + scan_rp_interface (taskuse, CAST(rp_interface, all_tasks)) + { + interface_ref task = CAST(interface_ref, taskuse->decls); + location loc = task->location; + expression args = build_taskid(m, task->ddecl); + + /* Create m.task -> scheduler.tasks[unique("task-unique-string")] */ + m_end.interface = task->ddecl; + scheduler_end.args_node = args; + connect_interface(loc, cg, userg, m_end, scheduler_end, FALSE); + } +} + +void set_scheduler(char *spec) +{ + scheduler_name = strtok(spec, ","); + scheduler_unique_name = strtok(NULL, ","); + scheduler_interface_name = strtok(NULL, ","); + scheduler_interfacedef_name = strtok(NULL, ","); + scheduler_run_name = strtok(NULL, ","); + scheduler_post_name = strtok(NULL, ","); + + if (scheduler_post_name && !strtok(NULL, ",")) + flag_use_scheduler = TRUE; + else + { + flag_use_scheduler = FALSE; + error("invalid arguments to -fnesc-scheduler"); + } +} diff --git a/src/nesc-task.h b/src/nesc-task.h new file mode 100644 index 0000000..02be538 --- /dev/null +++ b/src/nesc-task.h @@ -0,0 +1,31 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef NESC_TASK_H +#define NESC_TASK_H + +extern nesc_declaration scheduler; +extern declaration all_tasks; + +void set_scheduler(char *spec); +void load_scheduler(void); +void wire_scheduler(module m); +void handle_post(function_call fcall); +void handle_task_definition(function_decl fdecl); +void handle_task_declaration(variable_decl vdecl); + +#endif diff --git a/src/nesc-uses.c b/src/nesc-uses.c new file mode 100644 index 0000000..bf45059 --- /dev/null +++ b/src/nesc-uses.c @@ -0,0 +1,538 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include "parser.h" +#include "constants.h" +#include "nesc-uses.h" +#include "nesc-semantics.h" +#include "AST_utils.h" +#include "AST_walk.h" +#include "c-parse.h" + +static region rr; +dd_list nglobal_uses; +data_declaration enable_interrupt; + +/* IDEAS: track fields of structs + */ + +context exe_context(context c) +{ + return c & (c_atomic | c_executable | c_constant); +} + +static context access_context(context c) +{ + /* Something that came via a deref is really just a read */ + if (c & c_deref) + c = exe_context(c) | c_read; + + /* Constant contexts don't read or write. But they might address... */ + if (c & c_constant) + c &= ~(c_read | c_write); + + return c; +} + +static context use_context(context c) +{ + /* Non-executable contexts do not actually "do" anything. So + don't set those bits in the 'use' context */ + if (!(c & c_executable)) + return 0; + + return access_context(c); +} + +use new_use(location l, data_declaration fn, context c) +{ + use u = ralloc(rr, struct use); + + u->l = l; + u->fn = fn; + u->c = use_context(c); + + return u; +} + +static iduse new_iduse(data_declaration id, use u) +{ + iduse i = ralloc(rr, struct iduse); + + i->id = id; + i->u = u; + + return i; +} + +void ddecl_used(data_declaration id, use u) +{ + iduse i = new_iduse(id, u); + + if (!id->nuses) + id->nuses = dd_new_list(rr); + dd_add_last(rr, id->nuses, u); + id->use_summary |= u->c; + + if (u->fn) + { + if (!u->fn->fn_uses) + u->fn->fn_uses = dd_new_list(rr); + dd_add_last(rr, u->fn->fn_uses, i); + } + else + dd_add_last(rr, nglobal_uses, i); +} + +static void identifier_used(identifier id, data_declaration fn, context c) +{ + ddecl_used(id->ddecl, new_use(id->location, fn, c)); +} + +static void interface_used(interface_deref iref, data_declaration fn, context c) +{ + ddecl_used(iref->ddecl, new_use(iref->location, fn, c)); +} + +static void collect_uses_ast(void *n, data_declaration fn, context c); +static void collect_uses_children(void *n, data_declaration fn, context c); +static void collect_uses_stmt(statement stmt, data_declaration fn, context c); +static void collect_uses_expr(expression expr, data_declaration fn, context c); + + +static void collect_uses_deref(expression expr, expression dereferenced, + data_declaration fn, context c) +{ + c = use_context(c); + + if (c & c_addressed) /* &*x is just x, not a pointer deref */ + c &= ~c_addressed; + else + { + c |= c_deref; + /*pointer_use(expr, c);*/ + } + collect_uses_expr(dereferenced, fn, c); +} + +static void collect_uses_expr(expression expr, data_declaration fn, context c) +{ + context exe_c = exe_context(c); + + if (!expr) + return; + + /* A read of an array-type expression actually takes the address + of the container + XXX: test on type needed because we have some unhandled nodes such + as init_list (Note: these may not have a type in the future too. They + probably shouldn't be expressions anyway) */ + if (expr->type && type_array(expr->type)) + { + /* A dereference of an array type means that the context operation + is being applied to the array. + If not in a dereference, a read of an array returns its address, + so is an address-taking context + */ + if (c & c_deref) + c &= ~c_deref; + else if (c & c_read) + c = (c & ~c_read) | c_addressed; + } + else if (expr->cst) + c |= c_constant; + + switch (expr->kind) + { + case kind_identifier: + expr->context = access_context(c); + identifier_used(CAST(identifier, expr), fn, c); + break; + + case kind_interface_deref: + interface_used(CAST(interface_deref, expr), fn, c); + break; + + case kind_comma: { + expression e; + + scan_expression (e, CAST(comma, expr)->arg1) + if (e->next) + collect_uses_expr(e, fn, exe_c); + else + collect_uses_expr(e, fn, c); + break; + } + case kind_extension_expr: + collect_uses_expr(CAST(unary, expr)->arg1, fn, c); + break; + + case kind_conditional: { + conditional ce = CAST(conditional, expr); + context true_c = c, false_c = c; + + if (ce->condition->cst) + { + if (definite_zero(ce->condition)) + true_c &= ~c_executable; + else + false_c &= ~c_executable; + } + + collect_uses_expr(ce->condition, fn, exe_c | c_read); + collect_uses_expr(ce->arg1, fn, true_c); + collect_uses_expr(ce->arg2, fn, false_c); + break; + } + case kind_compound_expr: + collect_uses_stmt(CAST(compound_expr, expr)->stmt, fn, c); + break; + + case kind_function_call: { + function_call fce = CAST(function_call, expr); + expression e; + + // tasks posts are a "read" of the task + if (fce->call_kind == post_task) + collect_uses_expr(fce->arg1, fn, exe_c | c_read); + // C named fn calls, commands and events are c_fncall, + // otherwise its c_read (and a warning about fn ptr use) + else if (!(is_interface_deref(fce->arg1) || + is_generic_call(fce->arg1) || + (is_identifier(fce->arg1) && + (CAST(identifier, fce->arg1)->ddecl->kind == decl_function || + CAST(identifier, fce->arg1)->ddecl->kind == decl_magic_function)) || + fce->va_arg_call)) + { + /* We allow a function pointer calls in C code on the assumption + that this represents runtime implementation stuff (e.g., + the task scheduler, or tossim stuff) */ + if (warn_fnptr && + (!fn || fn->container)) + nesc_warning_with_location(fce->location, "call via function pointer"); + collect_uses_expr(fce->arg1, fn, exe_c | c_read); + } + else + collect_uses_expr(fce->arg1, fn, exe_c | c_fncall); + + scan_expression (e, fce->args) + collect_uses_expr(e, fn, exe_c | c_read); + break; + } + case kind_generic_call: { + generic_call fce = CAST(generic_call, expr); + expression e; + + collect_uses_expr(fce->arg1, fn, exe_c | c_fncall); + scan_expression (e, fce->args) + collect_uses_expr(e, fn, exe_c | c_read); + break; + } + + case kind_array_ref: { + array_ref are = CAST(array_ref, expr); + expression arg1 = are->arg1, arg2 = are->arg2, arg; + + /* When presented with something like 1[a], switch args to ensure that + arg1 is the pointer or array, arg2 the index */ + if (type_integer(arg1->type)) + { + arg = arg1; arg1 = arg2; arg2 = arg; + } + + collect_uses_deref(expr, arg1, fn, c); + collect_uses_expr(arg2, fn, exe_c | c_read); + expr->context = access_context(c); + break; + } + case kind_dereference: + expr->context = access_context(c); + collect_uses_deref(expr, CAST(dereference, expr)->arg1, fn, c); + break; + + case kind_address_of: { + expression arg = CAST(unary, expr)->arg1; + + if (c & c_deref) /* *&x is just x */ + c &= ~c_deref; + else + c = exe_c | c_addressed; + + collect_uses_expr(arg, fn, c); + break; + } + case kind_field_ref: { + expr->context = access_context(c); + collect_uses_expr(CAST(field_ref, expr)->arg1, fn, c); + break; + } + case kind_preincrement: case kind_postincrement: + case kind_predecrement: case kind_postdecrement: { + unary ue = CAST(unary, expr); + + collect_uses_expr(ue->arg1, fn, exe_c | c_read | c_write); + break; + } + case kind_assign: { + binary be = CAST(binary, expr); + + collect_uses_expr(be->arg1, fn, exe_c | c_write); + collect_uses_expr(be->arg2, fn, exe_c | c_read); + break; + } + case kind_plus_assign: case kind_minus_assign: + case kind_times_assign: case kind_divide_assign: case kind_modulo_assign: + case kind_bitand_assign: case kind_bitor_assign: case kind_bitxor_assign: + case kind_lshift_assign: case kind_rshift_assign: { + binary be = CAST(binary, expr); + collect_uses_expr(be->arg1, fn, exe_c | c_read | c_write); + collect_uses_expr(be->arg2, fn, exe_c | c_read); + break; + } + case kind_sizeof_expr: case kind_alignof_expr: + collect_uses_expr(CAST(unary, expr)->arg1, fn, 0); + break; + + case kind_cast: { + cast ce = CAST(cast, expr); + + collect_uses_ast(ce->asttype, fn, c); + collect_uses_expr(ce->arg1, fn, c); + } + default: + if (is_unary(expr)) + collect_uses_expr(CAST(unary,expr)->arg1, fn, c); + else if (is_binary(expr)) + { + binary be = CAST(binary, expr); + + collect_uses_expr(be->arg1, fn, exe_c | c_read); + collect_uses_expr(be->arg2, fn, exe_c | c_read); + } + else + /* A default catch-all for + sizeof_type, alignof_type, label_address, cast_list, + init_list, init_index, init_field, lexical_cst, + string_cst, string + Embeddded expressions are compile-time constants or read-only, + so the default collect_uses_ast_expr is valid. */ + collect_uses_children(expr, fn, c); + break; + } +} + +static void collect_uses_asm_operands(asm_operand operands, + data_declaration fn, context exe_c) +{ + asm_operand aop; + + scan_asm_operand (aop, operands) + { + int mode = asm_rwmode(aop->string); + context c = exe_c; + + /* = is write, + is r/w, everything else is read */ + if (mode == '=' || mode == '+') + c |= c_write; + if (mode != '=') + c |= c_read; + + collect_uses_expr(aop->arg1, fn, c); + } +} + + +static void collect_uses_stmt(statement stmt, data_declaration fn, context c) +{ + context exe_c = exe_context(c); + + if (!stmt) + return; + + switch (stmt->kind) + { + case kind_compound_stmt: { + compound_stmt cs = CAST(compound_stmt, stmt); + statement s; + + collect_uses_ast(cs->id_labels, fn, c); + collect_uses_ast(cs->decls, fn, c); + + /* The last statement is possiblt read (in compound_expr) */ + scan_statement (s, cs->stmts) + if (s->next) + collect_uses_stmt(s, fn, exe_c); + else + collect_uses_stmt(s, fn, c); + + break; + } + case kind_if_stmt: { + if_stmt is = CAST(if_stmt, stmt); + context true_c = exe_c, false_c = exe_c; + + if (is->condition->cst) + { + if (definite_zero(is->condition)) + true_c &= ~c_executable; + else + false_c &= ~c_executable; + } + + collect_uses_expr(is->condition, fn, exe_c | c_read); + collect_uses_stmt(is->stmt1, fn, true_c); + collect_uses_stmt(is->stmt2, fn, false_c); + break; + } + case kind_while_stmt: case kind_dowhile_stmt: case kind_switch_stmt: { + conditional_stmt cs = CAST(conditional_stmt, stmt); + context body_c = exe_c; + + if (cs->condition->cst && stmt->kind == kind_while_stmt && + definite_zero(cs->condition)) + body_c &= ~c_executable; + collect_uses_expr(cs->condition, fn, exe_c | c_read); + collect_uses_stmt(cs->stmt, fn, body_c); + break; + } + case kind_for_stmt: { + for_stmt fs = CAST(for_stmt, stmt); + context body_c = exe_c; + + if (fs->arg2 && fs->arg2->cst && definite_zero(fs->arg2)) + body_c &= ~c_executable; + collect_uses_expr(fs->arg1, fn, exe_c | c_read); + collect_uses_expr(fs->arg2, fn, exe_c | c_read); + collect_uses_expr(fs->arg3, fn, body_c | c_read); + collect_uses_stmt(fs->stmt, fn, body_c); + break; + } + case kind_labeled_stmt: + collect_uses_ast(CAST(labeled_stmt, stmt)->label, fn, c); + collect_uses_stmt(CAST(labeled_stmt, stmt)->stmt, fn, c); + break; + + case kind_expression_stmt: + collect_uses_expr(CAST(expression_stmt, stmt)->arg1, fn, c); + break; + + case kind_atomic_stmt: + collect_uses_stmt(CAST(atomic_stmt,stmt)->stmt, fn, exe_c | c_atomic); + break; + + case kind_asm_stmt: { + asm_stmt as = CAST(asm_stmt, stmt); + + collect_uses_expr(as->arg1, fn, exe_c | c_read); + collect_uses_asm_operands(as->asm_operands1, fn, exe_c); + collect_uses_asm_operands(as->asm_operands2, fn, exe_c); + break; + } + default: + /* for break_stmt, continue_stmt, goto_stmt, computed_goto_stmt, + empty_stmt, return_stmt */ + collect_uses_children(stmt, fn, c); + break; + } +} + +/* An AST walker that collect_usess all reachable expressions */ +static AST_walker collect_uses_walker; + +struct uses_data +{ + context c; + data_declaration function; +}; + +static AST_walker_result collect_uses_ast_expr(AST_walker spec, void *data, + expression *e) +{ + struct uses_data *ud = data; + collect_uses_expr(*e, ud->function, exe_context(ud->c) | c_read); + return aw_done; +} + +static AST_walker_result collect_uses_ast_stmt(AST_walker spec, void *data, + statement *s) +{ + struct uses_data *ud = data; + collect_uses_stmt(*s, ud->function, exe_context(ud->c)); + return aw_done; +} + +static AST_walker_result collect_uses_ast_fdecl(AST_walker spec, void *data, + function_decl *fd) +{ + struct uses_data *ud = data; + struct uses_data new_ud = *ud; + + new_ud.function = (*fd)->ddecl; + AST_walk_children(spec, &new_ud, CAST(node, *fd)); + + return aw_done; +} + +static void init_collect_uses_walker(void) +{ + collect_uses_walker = new_AST_walker(rr); + AST_walker_handle(collect_uses_walker, kind_expression, + collect_uses_ast_expr); + AST_walker_handle(collect_uses_walker, kind_statement, + collect_uses_ast_stmt); + AST_walker_handle(collect_uses_walker, kind_function_decl, + collect_uses_ast_fdecl); +} + +static void collect_uses_ast(void *n, data_declaration fn, context c) +{ + node nn = CAST(node, n); + struct uses_data new_ud; + + new_ud.c = c; + new_ud.function = fn; + + AST_walk_list(collect_uses_walker, &new_ud, &nn); +} + +static void collect_uses_children(void *n, data_declaration fn, context c) +{ + struct uses_data new_ud; + + new_ud.c = c; + new_ud.function = fn; + + AST_walk_children(collect_uses_walker, &new_ud, CAST(node, n)); +} + +void collect_uses(declaration decls) +{ + collect_uses_ast(decls, NULL, c_executable); +} + +void init_uses(void) +{ + type ei_type; + + rr = parse_region; + nglobal_uses = dd_new_list(rr); + init_collect_uses_walker(); + + ei_type = build_function_type(parse_region, void_type, NULL); + enable_interrupt = + declare_function(dummy_location, "__nesc_enable_interrupt", ei_type); +} diff --git a/src/nesc-uses.h b/src/nesc-uses.h new file mode 100644 index 0000000..062220e --- /dev/null +++ b/src/nesc-uses.h @@ -0,0 +1,72 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef NESC_USES_H +#define NESC_USES_H + +typedef enum { + c_atomic = 1, + c_executable = 2, + c_read = 4, + c_write = 8, + c_fncall = 16, + c_addressed = 32, + c_deref = 64, + c_constant = 128 +} context; + +typedef struct use +{ + location l; + data_declaration fn; /* function containing use */ + context c; +} *use; + +typedef struct iduse +{ + data_declaration id; + use u; +} *iduse; + +extern dd_list nglobal_uses; + +/* Declaration of __nesc_enable_interrupt function. Data-race detection + and duplicate atomic suppression needs to be aware of these calls to + function correctly. + + The current implementation is simplistic (conservative and unsafe): + If function X calls __nesc_enable_interrupt, we assume that: + - there are non-atomic calls to X + - calls made from inside an atomic statement in X are still atomic + (i.e., we assume there is no way to reach a statement inside 'atomic' + from the __nesc_enable_interrupt() call. We do issue a warning when + __nesc_enable_interrupt() is called from within an atomic statement). + + The proper behaviour would be to analyse X's control flow graph. +*/ +extern data_declaration enable_interrupt; + +void collect_uses(declaration decls); + +context exe_context(context c); + +void init_uses(void); + +use new_use(location l, data_declaration fn, context c); +void ddecl_used(data_declaration id, use u); + +#endif diff --git a/src/nesc-xml.c b/src/nesc-xml.c new file mode 100644 index 0000000..bf0fc44 --- /dev/null +++ b/src/nesc-xml.c @@ -0,0 +1,570 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include +#include "parser.h" +#include "nesc-xml.h" +#include "semantics.h" +#include "nesc-semantics.h" +#include "constants.h" +#include "init.h" + +/* Pick an indentation amount */ +#define INDENT 2 + +static region xml_region; +static FILE *xml_file; +static int indent_level; +static dd_list tags; +static bool at_line_start; + +void xindent(void) +{ + indent_level += INDENT; +} + +void xunindent(void) +{ + indent_level -= INDENT; +} + +void xputc(char c) +{ + if (xml_file) + putc(c, xml_file); +} + +static void output_indentation(void) +{ + int i; + + if (xml_file) + for (i = 0; i < indent_level; i++) putc(' ', xml_file); +} + +static void output_indent_if_needed(void) +{ + if (at_line_start) + { + at_line_start = FALSE; + output_indentation(); + } +} + +void xnewline(void) +{ + xputc('\n'); + at_line_start = TRUE; +} + +void xstartline(void) +{ + if (!at_line_start) xnewline(); +} + +void xstartline_noindent(void) +{ + xstartline(); + at_line_start = FALSE; +} + +void xvprintf(char *format, va_list args) +{ + if (xml_file) + { + output_indent_if_needed(); + vfprintf(xml_file, format, args); + } +} + +void xprintf(char *format, ...) +{ + va_list args; + + va_start(args, format); + xvprintf(format, args); + va_end(args); +} + +/* Output an arbitrary C character in an XML-friendly way. Control + characters are remapped to 0x2400, except CR, LF and Tab */ +void xqputc(int c) +{ + /* Ahh, the joys of XML. The control characters are lurking + from 0x2400 onwards, except for CR, LF and Tab which exist + at their usual value. Furthermore, ", < and & need to be quoted */ + /* Some characters show up as small numbers */ + if (c == '"' || c == '<' || c == '&' || + c == '\r' || c == '\n' || c == '\t') + xprintf("&#%d;", c); + /* Regular ASCII chars show up as themselves */ + else if ((unsigned char)c == c && isprint(c)) + putc(c, xml_file); + else + { + /* Everything else shows up on the 0x24xx page */ + c += 0x2400; + xprintf("&#%d;", c); + } +} + +/* Output a string quoted to match XML AttValue rules */ +void xqputs(const char *s) +{ + if (!xml_file) + return; + + while (*s) + xqputc(*s++); +} + +/* Output a wide-char string quoted to match XML AttValue rules */ +void xqputcs(const cstring s) +{ + int i; + + if (!xml_file) + return; + + for (i = 0; i < s.length; i++) + xqputc(s.data[i]); +} + + +void xputs(const char *s) +{ + if (!xml_file) + return; + + output_indent_if_needed(); + fputs(s, xml_file); +} + + +/* Leaks until xml_end. */ +static void push_tag(const char *tag) +{ + if (tags) + dd_add_first(xml_region, tags, (char *)tag); +} + +static const char *pop_tag(void) +{ + dd_list_pos top; + const char *tag; + + if (!tags) + return NULL; + + top = dd_first(tags); + tag = DD_GET(const char *, top); + dd_remove(top); + + return tag; +} + +void xml_tag_start(const char *tag) +{ + push_tag(tag); + xprintf("<%s", tag); +} + +void xml_tag(const char *tag) +{ + xml_tag_start(tag); + xml_tag_end(); +} + +void xml_tag_end(void) +{ + xputs(">"); +} + +void xml_qtag(const char *tag) +{ + xprintf("<%s/>", tag); +} + +void xml_tag_end_pop(void) +{ + pop_tag(); + xputs("/>"); +} + +void xml_pop(void) +{ + xprintf("", pop_tag()); +} + +void xml_attr(const char *name, const char *val) +{ + xprintf(" %s=\"", name); + xqputs(val); + xputs("\""); +} + +void xml_attr_int(const char *name, largest_int val) +{ + xprintf(" %s=\"%lld\"", name, val); +} + +void xml_attr_ptr(const char *name, void *val) +{ + xprintf(" %s=\"%p\"", name, val); +} + +void xml_attr_noval(const char *name) +{ + xprintf(" %s=\"\"", name); +} + +void xml_attr_bool(const char *name, bool val) +{ + if (val) + xml_attr_noval(name); +} + +void xml_attr_cval(const char *name, cval val) +{ + bool unknown = FALSE; + + xprintf(" %s=\"", name); + + if (cval_isunsigned(val)) + xprintf("I:%llu", cval_uint_value(val)); + else if (cval_isinteger(val)) + xprintf("I:%lld", cval_sint_value(val)); + else if (cval_isunknown(val)) + unknown = TRUE; + else if (cval_isfloating(val)) + /* XXX: hacky version */ + xprintf("F:%.20Le", cval_float_value(val)); + else if (cval_isaddress(val)) + { + data_declaration ddecl = cval_ddecl(val); + + /* XXX: We don't (yet) support strings with an offset */ + if (ddecl && ddecl->kind == decl_magic_string && cval_knownbool(val)) + { + /* Wide strings are printed as their byte-by-byte rep. FIXME */ + xputs("S:"); + xqputcs(ddecl->schars); + } + else + unknown = TRUE; + } + else if (cval_istop(val)) + xputs("V:"); + else + unknown = TRUE; + + if (unknown) + xputs("U:"); + xputc('"'); +} + +void xml_attr_loc(location loc) +{ + if (loc == dummy_location) + { + xprintf(" loc=\"NONE\""); + return; + } + xprintf(" loc=\"%d", loc->lineno); + if (loc->container) + { + xputc('('); + xqputs(loc->container->instance_name); + xputc(')'); + } + xputc(':'); + xqputs(loc->filename); + xputc('"'); +} + + +void xml_start_dummy(void) +{ + xml_file = NULL; + indent_level = 0; + at_line_start = TRUE; + tags = NULL; +} + +void xml_start(FILE *f) +{ + xml_region = newregion(); + xml_file = f; + indent_level = 0; + at_line_start = TRUE; + tags = dd_new_list(xml_region); +} + +void xml_end(void) +{ + deleteregion_ptr(&xml_region); + xml_file = NULL; + tags = NULL; +} + +/* Convenient shortcuts */ + +void indentedtag_start(const char *name) +{ + xstartline(); + xml_tag_start(name); + xindent(); +} + +void indentedtag(const char *name) +{ + xstartline(); + xml_tag(name); + xindent(); + xnewline(); +} + +void indentedtag_pop(void) +{ + xstartline(); + xunindent(); + xml_pop(); + xnewline(); +} + +/* Standard nesC xml elements */ +xml_list xl_variables, xl_constants, xl_functions, xl_typedefs, + xl_interfaces, xl_icomponents, xl_interfacedefs, xl_components, xl_tags; + +void nxml_simple_value(type t, cval val) +{ + indentedtag_start("value"); + xml_attr_cval("cst", val); /* val can be cval_top */ + xml_tag_end(); + nxml_type(t); + indentedtag_pop(); +} + +void nxml_ddecl_ref(data_declaration ddecl) +{ + xml_list l = NULL; + + switch (ddecl->kind) + { + case decl_variable: xml_tag_start("variable-ref"); l = xl_variables; break; + case decl_constant: xml_tag_start("constant-ref"); l = xl_constants; break; + case decl_function: xml_tag_start("function-ref"); l = xl_functions; break; + case decl_typedef: xml_tag_start("typedef-ref"); l = xl_typedefs; break; + case decl_interface_ref: xml_tag_start("interface-ref"); l = xl_interfaces; break; + case decl_component_ref: xml_tag_start("internal-component-ref"); l = xl_icomponents; break; + default: assert(0); + } + xml_list_add(l, ddecl); + xml_attr("name", ddecl->name); + if (ddecl->container || ddecl->container_function) + xml_attr_noval("scoped"); + xml_attr_ptr("ref", ddecl); + xml_tag_end_pop(); +} + +void nxml_ndecl_ref(nesc_declaration ndecl) +{ + if (ndecl->kind == l_interface) + { + xml_tag_start("interfacedef-ref"); + xml_list_add(xl_interfacedefs, ndecl); + } + else + { + xml_list_add(xl_components, ndecl); + xml_tag_start("component-ref"); + } + xml_attr("qname", ndecl->instance_name); + //xml_attr_ptr("ref", ndecl); + xml_tag_end_pop(); +} + +void nxml_arguments(expression arguments) +{ + expression arg; + + indentedtag("arguments"); + scan_expression (arg, arguments) + { + if (is_type_argument(arg)) + nxml_type(CAST(type_argument, arg)->asttype->type); + else + nxml_simple_value(arg->type, arg->cst ? arg->cst->cval : cval_top); + } + indentedtag_pop(); +} + +void nxml_instance(nesc_declaration ndecl) +{ + nesc_declaration orig = original_component(ndecl); + + indentedtag_start("instance"); + if (ndecl->kind == l_component && ndecl->original && !ndecl->abstract) + xml_attr_int("number", ndecl->instance_number); + xml_tag_end(); xnewline(); + + nxml_ndecl_ref(orig); + if (ndecl->arguments) + nxml_arguments(ndecl->arguments); + + indentedtag_pop(); +} + +void nxml_tdecl_ref(tag_declaration tdecl) +{ + char tag[20]; + + xml_list_add(xl_tags, tdecl); + sprintf(tag, "%s-ref", tagkind_name(tdecl->kind)); + xml_tag_start(tag); + if (tdecl->name) + xml_attr("name", tdecl->name); + xml_attr_bool("scoped", !!tdecl->container/* || tdecl->container_function*/); + xml_attr_ptr("ref", tdecl); + xml_tag_end_pop(); +} + +static void nxml_value_base(ivalue value) +{ + nxml_simple_value(value->type, value->u.base.value); +} + +static void nxml_value_array(ivalue value) +{ + ivalue_array elem; + + indentedtag("value-array"); + nxml_type(value->type); + for (elem = value->u.array; elem; elem = elem->next) + { + indentedtag_start("array-element"); + xml_attr_int("from", elem->from); + xml_attr_int("to", elem->to); + xml_tag_end(); + nxml_value(elem->value); + indentedtag_pop(); + } + indentedtag_pop(); +} + +static void nxml_value_structured(ivalue value) +{ + ivalue_field field; + + indentedtag("value-structured"); + nxml_type(value->type); + for (field = value->u.structured; field; field = field->next) + { + indentedtag_start("structured-element"); + xml_attr("field", field->field->name); + xml_attr_ptr("ref", field->field); + xml_tag_end(); + nxml_value(field->value); + indentedtag_pop(); + } + indentedtag_pop(); +} + +void nxml_value(ivalue value) +{ + switch (value->kind) + { + case iv_base: nxml_value_base(value); break; + case iv_array: nxml_value_array(value); break; + case iv_structured: nxml_value_structured(value); break; + default: assert(0); + } +} + +void nxml_doc(struct docstring *doc) +{ + if (!doc->short_s) + return; + indentedtag_start("documentation"); + xml_attr_loc(doc->loc); + xml_tag_end(); + xnewline(); + xml_tag("short"); + xqputs(doc->short_s); + xml_pop(); + xnewline(); + if (doc->long_s) + { + xml_tag("long"); + xqputs(doc->long_s); + xml_pop(); + xnewline(); + } + indentedtag_pop(); +} + + +/* Incremental list creation support */ + +struct xml_list +{ + region r; + dd_list all; + dd_list latest; + bool *changed; + bool (*addfilter)(void *entry); +}; + +xml_list new_xml_list(region r, bool *changed, bool (*addfilter)(void *entry)) +{ + xml_list l = ralloc(r, struct xml_list); + + l->r = r; + l->all = dd_new_list(l->r); + l->changed = changed; + l->addfilter = addfilter; + + return l; +} + +void xml_list_add(xml_list l, void *entry) +{ + if (!l || !l->addfilter(entry)) + return; + + if (!l->latest) + l->latest = dd_new_list(l->r); + dd_add_last(l->r, l->latest, entry); + dd_add_last(l->r, l->all, entry); + *l->changed = TRUE; +} + +dd_list xml_list_latest(xml_list l) +{ + dd_list latest = l->latest; + l->latest = NULL; + return latest; +} + +void xml_list_reset(xml_list l) +{ + l->latest = l->all; +} + + + + diff --git a/src/nesc-xml.h b/src/nesc-xml.h new file mode 100644 index 0000000..e25dbdc --- /dev/null +++ b/src/nesc-xml.h @@ -0,0 +1,83 @@ +/* This file is part of the nesC compiler. + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ +#ifndef NESC_XML_H +#define NESC_XML_H + +#include "parser.h" +#include "nesc-xml.h" + +typedef struct xml_list *xml_list; + +/* Low-level text output functions */ +void xindent(void); +void xunindent(void); +void xnewline(void); +void xstartline(void); +void xstartline_noindent(void); +void xvprintf(char *format, va_list args); +void xprintf(char *format, ...); +void xqputs(const char *s); +void xqputcs(cstring cs); +void xputs(const char *s); + +/* Tag/attribute handling */ +void xml_tag_start(const char *tag); +void xml_tag(const char *tag); +void xml_tag_end(void); +void xml_qtag(const char *tag); +void xml_tag_end_pop(void); +void xml_pop(void); +void xml_attr(const char *name, const char *val); +void xml_attr_int(const char *name, largest_int val); +void xml_attr_ptr(const char *name, void *val); +void xml_attr_noval(const char *name); +void xml_attr_bool(const char *name, bool val); +void xml_attr_cval(const char *name, cval val); +void xml_attr_loc(location loc); + +void xml_start_dummy(void); +void xml_start(FILE *f); +void xml_end(void); + +/* Convenient shortcuts */ +void indentedtag_start(const char *name); +void indentedtag(const char *name); +void indentedtag_pop(void); + +/* Standard nesC xml elements */ + +/* Lists to which nxml_[dtn]decl_ref arguments should be added. + (could be a call to some function in nesc-dump.c, but doesn't + seem worth the bother) */ +extern xml_list xl_variables, xl_constants, xl_functions, xl_typedefs, + xl_interfaces, xl_icomponents, xl_interfacedefs, xl_components, xl_tags; + +void nxml_ddecl_ref(data_declaration ddecl); +void nxml_tdecl_ref(tag_declaration tdecl); +void nxml_ndecl_ref(nesc_declaration ndecl); +void nxml_value(ivalue value); +void nxml_arguments(expression arguments); +void nxml_instance(nesc_declaration ndecl); +void nxml_doc(struct docstring *doc); + +/* Incremental list creation support */ +xml_list new_xml_list(region r, bool *changed, bool (*addfilter)(void *entry)); +void xml_list_add(xml_list l, void *entry); +dd_list xml_list_latest(xml_list l); +void xml_list_reset(xml_list l); + +#endif diff --git a/src/nodetypes.def b/src/nodetypes.def new file mode 100644 index 0000000..63b9e03 --- /dev/null +++ b/src/nodetypes.def @@ -0,0 +1,707 @@ +;; -*- lisp -*- + +; This file is part of the nesC compiler. +; +; This file is derived from the RC Compiler. It is thus +; Copyright (C) 2000-2001 The Regents of the University of California. +; Changes for nesC are +; Copyright (C) 2002 Intel Corporation +; +; The attached "nesC" software is provided to you under the terms and +; conditions of the GNU General Public License Version 2 as published by the +; Free Software Foundation. +; +; nesC 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 nesC; see the file COPYING. If not, write to +; the Free Software Foundation, 59 Temple Place - Suite 330, +; Boston, MA 02111-1307, USA. + +;; AST definition + +;; (deffield FIELD-NAME C-TYPE (ATTRIBUTES)) +;; (deftype TYPE-NAME SUPER-TYPE (FIELDS) "DOCUMENTATION") +;; (defnode NODE-NAME TYPE-NAME "DOCUMENTATION") + +;; deffield: +;; Define field FIELD-NAME with type C-TYPE. The attributes listed are +;; interpreted by the various generators, attributes are either symbols, +;; or lists whose first element is a symbol + +;; Current attributes: +;; init: field is an argument to the constructing function for the types +;; that contain it +;; tree: "part of" the abstract syntax tree. this means that +;; generated functions that walk the tree (XXX_walk, XXX_print) +;; will follow this field recursively +;; nodump: field is not marshalled/unmarshalled +;; noprint: field is not printed as part of AST +;; dump-special: call dump_FIELD-NAME to marshall/unmarshall this node +;; print-special: call print_FIELD-NAME to print node + + + +(deffield temp int (nodump noprint (default "23"))) ; a random int field with default value 23 + +(deffield type type ()) +(deffield declared_type type ()) +(deffield name "const char *" ()) +(deffield location location (init)) +(deffield next "node sameregion" ()) +(deffield asttype asttype (init tree)) +(deffield condition expression (init tree)) +(deffield arg1 expression (init tree)) +(deffield arg2 expression (init tree)) +(deffield arg3 expression (init tree)) +(deffield stmt statement (init tree)) +(deffield stmt1 statement (init tree)) +(deffield stmt2 statement (init tree)) +(deffield stmts statement (init tree)) +(deffield asm_stmt asm_stmt (init tree)) +(deffield extension bool ()) +(deffield label label (init tree)) +(deffield labels label (init tree)) +(deffield id_label id_label (init tree)) +(deffield id_labels id_label (init tree)) +(deffield cstring cstring (init)) +(deffield word1 word (init tree)) +(deffield word2 word (init tree)) +(deffield strings string_cst (init tree)) +(deffield args expression (init tree)) +(deffield modifiers type_element (init tree)) +(deffield qualifiers type_element (init tree)) +(deffield init_expr expression (init tree)) +(deffield parms declaration (init tree)) +(deffield gparms declaration (init tree)) +(deffield decl declaration (init tree)) +(deffield decls declaration (init tree)) +(deffield asm_operands1 asm_operand (init tree)) +(deffield asm_operands2 asm_operand (init tree)) +(deffield asm_clobbers string (init tree)) +(deffield doublecst "long double" (init)) +(deffield id "enum rid" (init)) +(deffield declarator declarator (init tree)) +(deffield string string (init tree)) +(deffield fields declaration (init tree)) +(deffield defined bool (init)) +(deffield parent_function function_decl (init)) +(deffield env environment (init)) +(deffield ddecl data_declaration (init)) +(deffield ident identifier (init)) +(deffield incrementrc bool (init)) +(deffield old_parms declaration (init)) +(deffield attributes attribute (init tree)) +(deffield length size_t (init)) +(deffield cval cval (init)) +(deffield va_arg_call asttype (init)) + +(deffield parent "node sameregion" ()) +(deffield parent_ptr "node sameregion *sameregion" ()) +(deffield tdecl tag_declaration ()) +(deffield context context ()) +(deffield fdeclarator function_declarator ()) +(deffield lvalue bool ()) +(deffield bitfield bool ()) +(deffield isregister bool ()) +(deffield side_effects bool ()) +(deffield cst known_cst ()) +(deffield static_address known_cst ()) +(deffield undeclared_variables env ()) +(deffield base_labels env ()) +(deffield scoped_labels env ()) +(deffield ldecl label_declaration ()) +(deffield parent_loop statement ()) +(deffield current_loop statement ()) +(deffield next_label label ()) +(deffield nlocals int ()) +(deffield break_dest node ()) +(deffield continue_dest node ()) +(deffield forward bool ()) +(deffield converted_to_pointer bool ()) +(deffield fdecl field_declaration ()) +(deffield cst_checked bool ()) +(deffield instantiation node ()) +(deffield spelling "const char *" ()) +(deffield parens bool ()) +(deffield ivalue ivalue ()) + +;; nesc fields +(deffield call_kind nesc_call_kind (init)) +(deffield implementation implementation (init tree)) +(deffield required bool (init)) +(deffield ep1 endpoint (init tree)) +(deffield ep2 endpoint (init tree)) +(deffield ids parameterised_identifier (init tree)) +(deffield external bool (init)) +(deffield ienv environment (init)) +(deffield designator designator (init tree)) +(deffield abstract bool (init)) +(deffield containing_atomic atomic_stmt ()) +(deffield type_checked bool ()) +(deffield isatomic atomic_t ((default "NOT_ATOMIC"))) +(deffield return_type asttype (tree)) + +(deffield cdecl nesc_declaration ()) +(deffield temp1 data_declaration ()) +(deffield temp2 data_declaration ()) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Base types +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(deftype node nil (location next parent parent_ptr instantiation) + "The common supertype of all AST nodes") + +(deftype declaration node () + "The common type of all definitions") + +(deftype statement node (parent_loop containing_atomic isatomic) + "The common type of all statements +PARENT_LOOP: + - for break and continue: the containing for/while/do-while/switch + statement they escape from + - for for/while/do-while: the containing for/while/do-while/switch + statement +CONTAINING_ATOMIC + - for return statement: their containing atomic statement + - for labels and looping statements, their containing atomic statement +(or NULL for none). Used to check that break, continue and goto do not +break in or out of an atomic statement. +(Note: for nested atomic statements, CONTAINING_ATOMIC will point to a +dangling node as we drop these nested statements from the AST) +ISATOMIC is + ATOMIC_ANY if the statement does not involve any shared variable accesses + ATOMIC_SINGLE if the statement involves a single access to a shared + variable, and that access is guaranteed to be atomic (e.g., a single byte) + NOT_ATOMIC otherwise") + +(deftype expression node (lvalue side_effects cst bitfield isregister + type static_address converted_to_pointer + cst_checked spelling parens ivalue context + isatomic) + "Expression nodes are subtypes of this type. +LVALUE is true if this expression can be used in a context requiring an lvalue. +BITFIELD is true if this lvalue is a bitfield. +ISREGISTER is true if this lvalue is (declared to be) in a register. +SIDE_EFFECTS is true if the expression has side effects. +CST is non-null (and points to an appropriate constant) if this expression is +constant. +STATIC_ADDRESS is true for lvalues whose address is a constant expression +CONVERTED_TO_POINTER is true for expressions which default_conversion +indicates need converting to pointer type (note that these nodes did not have +their type changed) +CST_CHECKED is set to true once we've successfully checked this expression's +constantness, and associated constant value (used to avoid duplicate error +messages in repeated constant folding passes) +SPELLING saves the `spelling' (a user-friendly name) of expressions used +in initialisers. +PARENS is TRUE if the expression is in parentheses +IVALUE is a pointer to an ivalue (see init.h) holding the value of an + initialiser expression. On an init_list or in an expression used as + a simple initialiser (e.g., '3 + 2' in 'int x = 3 + 2'), this is the + value of the initialiser. Inside these initialisers, ivalue points into + the ivalue structure of the containing initialiser. +CONTEXT is the usage context for this expression (see nesc-uses.h) +ISATOMIC is + ATOMIC_ANY if the statement does not involve any shared variable accesses + ATOMIC_SINGLE if the statement involves a single access to a shared + variable, and that access is guaranteed to be atomic (e.g., a single byte) + NOT_ATOMIC otherwise") + +(deftype type_element node () + "A common super-type for all type-building elements (qualifiers, etc)") + +(deftype declarator node () + "A common super-type for all declarator elements") + +(deftype label node (next_label) + "A common super-type for all labels. +NEXT_LABEL points to the next case or default label of a switch +(for case or default labels only)") + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Declarations +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defnode error_decl declaration "Placeholder for erroneous declarations") + +(deftype asm_decl declaration (asm_stmt) + "Asm statement STMT at the top level of a file (GCC)") + +(deftype data_decl declaration (modifiers decls) + "The declaration MODIFIERS DECLS; +DECLS is a list") + +(deftype extension_decl declaration (decl) + "__extension__ DECL; (GCC)") + +(deftype ellipsis_decl declaration () + "A pseudo-declaration to represent ... in a function argument list") + +(deftype enumerator declaration (cstring arg1 ddecl) + "The enumeration element CSTRING = ARG1. CSTRING is optional") + +(deftype oldidentifier_decl declaration (cstring ddecl) + "CSTRING in an old-style parameter list") + +(deftype function_decl declaration (declarator modifiers attributes old_parms stmt + parent_function ddecl fdeclarator + declared_type undeclared_variables + base_labels scoped_labels current_loop + nlocals) + "A function declaration with body STMT +OLD_PARMS is the old-style parameter declaration list.") + +(deftype implicit_decl declaration (ident) + "Used as the AST node for implicit declarations. IDENT points to the +identifier node that implicitly declared the function") + +(deftype variable_decl declaration (declarator attributes arg1 asm_stmt + ddecl declared_type forward) + "Declaration of DECLARATOR ASM_STMT ATTRIBUTES = ARG1. +ATTRIBUTES is a list. ASM_STMT is optional (GCC specific). +ARG1 is an optional initialiser. +DDECL points to the declaration for this item. +DECLARED_TYPE is the type in this declaration (which may be different than that +in DDECL->TYPE) +FORWARD is true for parameters that are forward declarations") + +(deftype field_decl declaration (declarator attributes arg1 type_checked fdecl) + "Declaration of field DECLARATOR ATTRIBUTES : ARG1. +QUALIFIERS and ATTRIBUTEES are lists. ARG1 is an optional bitfield specifier +TYPE_CHECKED is set to true once it has been checked that this field is of + network type (inside network structures) +FDECL is this field's declaration") + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Types and type elements +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(deftype asttype node (declarator qualifiers type) + "The source-level type QUALIFIERS DECLARATOR") + +(deftype typename type_element (ddecl) + "typedef-type with declaration DDECL. The name is ddecl->name") + +(deftype typeof_expr type_element (arg1) + "typeof ARG1") + +(deftype typeof_type type_element (asttype) + "typeof(ASTTYPE)") + +(deftype attribute type_element (word1) + "base type for gcc and nesc attributes") + +(deftype gcc_attribute attribute (args) + "The (gcc) attribute WORD1(ARGS). args can be empty, and may not be +semantically valid") + +(deftype rid type_element (id) + "Storage class specifier, type specifier or type qualifier ID (see RID_xxx)") + +(deftype qualifier type_element (id) + "Type or function qualifier ID (see qualifiers.h and type_quals in types.h)") + +(deftype tag_ref type_element (word1 attributes fields defined + tdecl) + "struct/union/enum WORD1 { FIELDS; } ATTRIBUTES +ATTRIBUTES and FIELDS are lists. +ATTRIBUTES is GCC specific. WORD1 is optional. +DEFINED is TRUE if this declaration defines the struct/union/enum. +DEFINED == FALSE => FIELDS == NULL + +TDECL points to the internal declaration node for this type") + +(deftype struct_ref tag_ref () "A struct") +(defnode attribute_ref tag_ref "An attribute definition") +(deftype union_ref tag_ref () "A union") +(defnode enum_ref tag_ref "An enum") + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Declarators +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; The last DECLARATOR in a chain is: +;; NULL_NODE in absolute declarations +;; an identifier_decl otherwise + +(deftype nested_declarator declarator (declarator) + "A common supertype for function/pointer/array declarator which includes +the nested DECLARATOR") + +(deftype function_declarator nested_declarator (parms gparms qualifiers env + return_type) + "Function declarator DECLARATOR(PARMS). PARMS is a list of declarations. +ENV is the environment for parms +GPARMS is the list of declarations of generic parameters (commands, events only) +RETURN_TYPE (optional) contains an overridden return type from nesdoc") + +(deftype pointer_declarator nested_declarator () + "Pointer declarator *DECLARATOR") + +(deftype qualified_declarator nested_declarator (modifiers) + "Declarator MODIFIERS DECLARATOR. The MODIFIERS are qualifiers +or attributes. +Note: MODIFIERS is never NULL") + +(deftype array_declarator nested_declarator (arg1) + "Array declarator DECLARATOR[ARG1]. ARG1 is optional") + +(deftype identifier_declarator declarator (cstring) + "Declaration of CSTRING") + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Statements +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defnode error_stmt statement "Placeholder for erroneous statements") + +(deftype asm_stmt statement (arg1 asm_operands1 asm_operands2 asm_clobbers qualifiers) + "The statement asm QUALIFIERS (ARG1 : ASM_OPERANDS1 : ASM_OPERANDS2 : ASM_CLOBBERS) +where ASM_OPERANDS1, ASM_OPERANDS2, QUALIFIERS are optional, ASM_CLOBBERS is a list (GCC)") + +(deftype compound_stmt statement (id_labels decls stmts env) + "{ ID_LABELS DECLS STMTS }. The ID_LABELS are GCC-specific. ID_LABELS, DECLS, +STMTS are lists +ENV is the environment for the block") + +(deftype if_stmt statement (condition stmt1 stmt2) + "IF (CONDITION) STMT1 ELSE STMT2. STMT2 is optional") + +(deftype labeled_stmt statement (label stmt) + "LABEL: STMT") + +(deftype expression_stmt statement (arg1) + "EXPR;") + + +(deftype conditional_stmt statement (condition stmt) + "Basic type for all conditional statements") +(defnode while_stmt conditional_stmt "WHILE (CONDITION) STMT") +(defnode dowhile_stmt conditional_stmt "DO STMT WHILE (CONDITION") +(deftype switch_stmt conditional_stmt (next_label) + "SWITCH (CONDITION) STMT. +NEXT_LABEL points to the switches first label") + +(deftype for_stmt statement (arg1 arg2 arg3 stmt) + "FOR (ARG1; ARG2; ARG3) STMT. ARG1, ARG2, ARG3 are optional") + +(deftype break_stmt statement () + "BREAK;") + +(deftype continue_stmt statement () + "CONTINUE;") + +(deftype return_stmt statement (arg1) + "RETURN ARG1. ARG1 is optional") + +(deftype goto_stmt statement (id_label) + "GOTO ID_LABEL") + +(deftype computed_goto_stmt statement (arg1) + "GOTO *ARG1 (GCC)") + +(deftype empty_stmt statement () + ";") + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Expressions +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defnode error_expr expression "Placeholder for erroneous expressions") + +(deftype unary expression (arg1) + "Unary expression nodes, kind defines operator") + +(deftype binary expression (arg1 arg2) + "Binary expression nodes, kind defines operator") + +(deftype comma expression (arg1) + "A comma separated list of expressions ARG1") + +(deftype sizeof_type expression (asttype) + "sizeof (ASTTYPE)") + +(deftype alignof_type expression (asttype) + "__alignof (ASTTYPE) (GCC)") + +(deftype label_address expression (id_label) + "&&ID_LABEL (GCC)") + +(deftype cast unary (asttype) + "(ASTTYPE)ARG1") + +(deftype cast_list expression (asttype init_expr) + "(ASTTYPE){INIT_EXPR} (GCC)") + +(deftype conditional expression (condition arg1 arg2) + "CONDITION ? ARG1 : ARG2 + GCC specific: ARG1 is optional") + +(deftype identifier expression (cstring ddecl) + "The identrifier CSTRING +DEAD_USE is true for identifiers used as the target of a regular assignment") + +(deftype compound_expr expression (stmt) + "({stmt}) (GCC)") + +(deftype function_call expression (arg1 args va_arg_call call_kind) + "ARG1(ARGS). ARGS is a list of expressions +If VA_ARG_CALL is non-null, this is actually a call to the pseudo-function +__builtin_va_arg(args, va_arg_call) (where va_arg_call is a type). In +this case arg1 is a dummy identifier. +CALL_KIND is one of normal_call, post_task, command_call or event_signal.") + +(defnode array_ref binary "ARG1[ARG2]") + +(deftype field_ref unary (cstring fdecl) + "ARG1.CSTRING +The field_declaration is saved in FDECL") + +(defnode dereference unary "*ARG1") +(defnode extension_expr unary "__extension__ ARG1 (GCC)") +(defnode sizeof_expr unary "sizeof ARG1") +(defnode alignof_expr unary "__alignof ARG1 (GCC)") +(defnode realpart unary "__real ARG1 (GCC)") +(defnode imagpart unary "__imag ARG1 (GCC)") +(defnode address_of unary "&ARG1") +(defnode unary_minus unary "-ARG1") +(defnode unary_plus unary "+ARG1") +(defnode conjugate unary "~ARG1 on complex arguments") +(defnode bitnot unary "~ARG1") +(defnode not unary "!ARG1") + +(deftype increment unary (temp1 temp2) + "parent for increment nodes") +(defnode preincrement increment "++ARG1") +(defnode predecrement increment "--ARG1") +(defnode postincrement increment "ARG1++") +(defnode postdecrement increment "ARG1--") + +(defnode plus binary "ARG1 + ARG2") +(defnode minus binary "ARG1 - ARG2") +(defnode times binary "ARG1 * ARG2") +(defnode divide binary "ARG1 / ARG2") +(defnode modulo binary "ARG1 % ARG2") +(defnode lshift binary "ARG1 << ARG2") +(defnode rshift binary "ARG1 >> ARG2") + +(deftype comparison binary () "binary comparison ops") +(defnode leq comparison "ARG1 <= ARG2") +(defnode geq comparison "ARG1 >= ARG2") +(defnode lt comparison "ARG1 < ARG2") +(defnode gt comparison "ARG1 > ARG2") +(defnode eq comparison "ARG1 == ARG2") +(defnode ne comparison "ARG1 != ARG2") + +(defnode bitand binary "ARG1 & ARG2") +(defnode bitor binary "ARG1 | ARG2") +(defnode bitxor binary "ARG1 ^ ARG2") +(defnode andand binary "ARG1 && ARG2") +(defnode oror binary "ARG1 || ARG2") + +(deftype assignment binary (temp1) "ARG1 ARG2") +(defnode assign assignment "ARG1 = ARG2") +(defnode plus_assign assignment "ARG1 += ARG2") +(defnode minus_assign assignment "ARG1 -= ARG2") +(defnode times_assign assignment "ARG1 *= ARG2") +(defnode divide_assign assignment "ARG1 /= ARG2") +(defnode modulo_assign assignment "ARG1 %= ARG2") +(defnode lshift_assign assignment "ARG1 <<= ARG2") +(defnode rshift_assign assignment "ARG1 >>= ARG2") +(defnode bitand_assign assignment "ARG1 &= ARG2") +(defnode bitor_assign assignment "ARG1 |= ARG2") +(defnode bitxor_assign assignment "ARG1 ^= ARG2") + +;; Initialiser expressions (not allowed in most contexts) + +(deftype init_list expression (args) + "{ ARGS }. ARGS is a list of expressions +The type of the init_list is the type of the initialised entity. +If this entity is an incomplete array type, the type of the init_list +is the actual array size deduced from the initialiser.") + +(deftype init_specific expression (designator init_expr) + "DESIGNATOR = INIT_EXPR in an init_list. +DESIGNATOR is a list +The type is not set in init_specific nodes") + +(deftype designator node () + "Base type for designators") + +(deftype designate_field designator (cstring) + ". CSTRING in an initialisation designator") + +(deftype designate_index designator (arg1 arg2) + "[ARG1] or [ARG1 ... ARG2] in a designator. ARG2 is optional. +ARG2 is a GCC extension") + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Constants +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(deftype lexical_cst expression (cstring) + "A constant represented as in its unparsed lexical form CSTRING. These +appear in the AST.") + +(deftype string_cst lexical_cst () + "A single lexical string - a sequence of these gets concatenated to +form a string. The source form of the constant can be found in +CSTRING.") + +(deftype string expression (strings ddecl) + "A list of STRINGS forming a single string constant. +DDECL is the magic_string declaration for this string.") + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Labels +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(deftype id_label label (cstring ldecl) + "The label CSTRING:") + +(deftype case_label label (arg1 arg2) + "CASE ARG1 ... ARG2: ARG2 is optional, it's presence is GCC-specific") + +(deftype default_label label () + "DEFAULT:") + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Miscellaneous +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(deftype word node (cstring) + "The identifier CSTRING used uninterpreted") + +(deftype asm_operand node (word1 string arg1) + "STRING(EXPR) or [WORD1] STRING(EXPR) (GCC)") + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; nesc extensions +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; the different kinds of files +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(deftype nesc_decl declaration (word1 attributes cdecl) + "a supertype for interface/component declarations of WORD1 +CDECL is the declaration for this interface/component +ATTRIBUTES are its attributes") + +(deftype interface nesc_decl (decls) + "interface WORD1 { DECLS }") + +(deftype component nesc_decl (abstract parms decls implementation) + "ABSTRACT configuration/module WORD1 PARMS { DECLS } IMPLEMENTATION +If ABSTRACT is true, this is a generic component, and PARMS is its +parameters.") + +(deftype implementation node (ienv cdecl) + "a base type for module and configuration implementations +IENV is the implementation's environment +CDECL is the declaration for this component") + +(deftype configuration implementation (decls) + "configuration implementation { DECLS } +where DECLS include regular declarations, component_refs and connections") + +(deftype module implementation (decls) + "module implementation { DECLS }'") + +(deftype binary_component implementation () + "binary component implementation placeholder") + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; component definition types +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(deftype rp_interface declaration (required decls) + "a required or provided function or interface declaration (DECL is +either a data_decl or an interface_ref). REQUIRED is true for 'requires', +false for 'provides' clauses") + +(deftype interface_ref declaration (word1 args word2 gparms attributes ddecl) + "an interface which is required or provided by a component: +interface WORD1 < ARGS > WORD2 [ GPARMS ] ATTRIBUTES +ARGS is a list of type_arguments for template interfaces +WORD2 is optional, GPARMS, ARGS, ATTRIBUTES are optional") + +(deftype component_ref declaration (word1 word2 abstract args cdecl) + "a reference to component WORD1 'as' WORD2 +WORD2 is optional +ABSTRACT is true for abstract component instantiations, false otherwise +ARGS is the argument list for abstract component instantiations +CDECL is filled in to point to the loaded component") + +(deftype connection declaration (ep1 ep2) + "A connection between interfaces EP1 and EP2") + +(defnode rp_connection connection + "EP1 (required) <- EP2 (provided) +Legal if EP1 and EP2 are both interfaces of the component, or if +neither EP1 and EP2 are interfaces of the component") + +(defnode eq_connection connection + "EP1 = EP2, where both interfaces are either required or provided. +Legal if exactly one of EP1 and EP2 are interfaces of the component") + +(deftype endpoint node (ids) + "a list of parameterised_identifier in IDS") + +(deftype parameterised_identifier node (word1 args) + "WORD1[ARGS] if ARGS != null, just WORD1 otherwise") + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; types for extensions to the regular C syntax +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(deftype generic_declarator declarator (declarator parms) + "parameterised declaration DECLARATOR [ PARMS ]") + +(deftype generic_call expression (arg1 args) + "ARG1[ARGS]. ARGS is a list of expressions, ARG1 is a generic function") + +(deftype interface_ref_declarator nested_declarator (word1) + "WORD1 . DECLARATOR in a declarator (for defining commands, events in component +implementations +For now at least, DECLARATOR is always an identifier_declarator") + +(deftype interface_deref unary (cstring ddecl) + "ARG1.CSTRING where ARG1 is an interface_ref. +DDECL is the command or event's declaration") + +(deftype component_deref unary (cstring ddecl) + "ARG1.CSTRING where ARG1 is a component_ref. +component_deref is *not* used for references to typedefed types in components. +DDECL is the specification element's declaration") + +(deftype component_typeref typename (cstring) + "CSTRING . typedef-name, a typedef-from-component-type +with declaration DDECL. The typedef-name is in ddecl->name") + +(deftype atomic_stmt statement (stmt) + "ATOMIC stmt +An atomic_stmt is not made for lexically nested atomic statements") + +(defnode nx_struct_ref struct_ref "A network struct") +(defnode nx_union_ref union_ref "A network union") + +(deftype nesc_attribute attribute (arg1 tdecl) + "@WORD1(ARG1), a nesC attribute. ARG1 is an init_list. +TDECL is the reference to the declaration of attribute WORD1") + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; types for the polymorphic extensions +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(deftype type_parm_decl declaration (cstring ddecl) + "A declaration of type parameter CSTRING") + +(deftype type_argument expression (asttype) + "ASTTYPE used as a template argument") diff --git a/src/parser.h b/src/parser.h new file mode 100644 index 0000000..425ea7f --- /dev/null +++ b/src/parser.h @@ -0,0 +1,40 @@ +/* This file is part of the nesC compiler. + +This file is derived from the RC Compiler. It is thus + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef PARSER_H +#define PARSER_H + +#include +#include +#include +#include +#include +#include +#include + +#include "nconfig.h" +#include "array.h" +#include "utils.h" +#include "AST.h" +#include "flags.h" +#include "errors.h" + +#endif diff --git a/src/qualifiers.h b/src/qualifiers.h new file mode 100644 index 0000000..d4eceb0 --- /dev/null +++ b/src/qualifiers.h @@ -0,0 +1,3 @@ +Q(const, TYPE_QUAL, const_qualifier, 2) +Q(volatile, TYPE_QUAL, volatile_qualifier, 4) +Q(__restrict, TYPE_QUAL, restrict_qualifier, 8) diff --git a/src/sd_list.c b/src/sd_list.c new file mode 100644 index 0000000..22c319e --- /dev/null +++ b/src/sd_list.c @@ -0,0 +1,99 @@ +/* This file is part of the nesC compiler. + +This file is derived from the RC Compiler. It is thus + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include +#include "sd_list.h" + +/* static doubly-linked list */ + +struct sd_list +{ + struct sd_list_pos *first; + struct sd_list_pos *null; + struct sd_list_pos *last; +}; + +sd_list sd_new_list(region r) +{ + sd_list new = ralloc(r, struct sd_list); + + new->first = (sd_list_pos)&new->null; + new->null = NULL; + new->last = (sd_list_pos)new; + + return new; +} + +void sd_del_list(sd_list l) +{ +} + +void sd_add_first(sd_list l, sd_list_pos data) +{ + sd_insert_after((sd_list_pos)l, data); +} + +void sd_add_last(sd_list l, sd_list_pos data) +{ + sd_insert_before((sd_list_pos)&l->null, data); +} + +void sd_insert_before(sd_list_pos where, sd_list_pos data) +{ + data->previous = where->previous; + data->next = where; + where->previous->next = data; + where->previous = data; +} + +void sd_insert_after(sd_list_pos where, sd_list_pos data) +{ + data->previous = where; + data->next = where->next; + where->next->previous = data; + where->next = data; +} + +void sd_remove(sd_list_pos what) +{ + what->previous->next = what->next; + what->next->previous = what->previous; +} + +sd_list_pos sd_first(sd_list l) +{ + return l->first; +} + +sd_list_pos sd_last(sd_list l) +{ + return l->last; +} + +unsigned long sd_length(sd_list l) +{ + sd_list_pos scan; + unsigned long len = 0; + + sd_scan (scan, l) len++; + + return len; +} diff --git a/src/sd_list.h b/src/sd_list.h new file mode 100644 index 0000000..dd83bb7 --- /dev/null +++ b/src/sd_list.h @@ -0,0 +1,57 @@ +/* This file is part of the nesC compiler. + +This file is derived from the RC Compiler. It is thus + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef SD_LIST_H +#define SD_LIST_H + +/* static doubly-linked list */ + +typedef struct sd_list *sd_list; +typedef struct sd_list_pos +{ + struct sd_list_pos *next; + struct sd_list_pos *previous; +} *sd_list_pos; + +sd_list sd_new_list(region r); +void sd_del_list(sd_list l); /* XXX: a noop */ + +void sd_add_first(sd_list l, sd_list_pos data); +void sd_add_last(sd_list l, sd_list_pos data); +void sd_insert_before(sd_list_pos where, sd_list_pos data); +void sd_insert_after(sd_list_pos where, sd_list_pos data); +void sd_remove(sd_list_pos what); + +sd_list_pos sd_first(sd_list l); +sd_list_pos sd_last(sd_list l); + +#define sd_is_beginning(l) (!(l)->previous) +#define sd_is_end(l) (!(l)->next) +#define sd_next(l) ((l)->next) +#define sd_previous(l) ((l)->previous) + +#define SD_GET(type, where) ((type)(where)) + +#define sd_scan(var, list) for (var = sd_first((list)); !sd_is_end(var); var = sd_next(var)) + +unsigned long sd_length(sd_list l); + +#endif diff --git a/src/semantics.c b/src/semantics.c new file mode 100644 index 0000000..d769c66 --- /dev/null +++ b/src/semantics.c @@ -0,0 +1,3764 @@ +/* This file is part of the nesC compiler. + +This file is derived from RC and the GNU C Compiler. It is thus + Copyright (C) 1987, 88, 89, 92-7, 1998 Free Software Foundation, Inc. + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include "parser.h" +#include "semantics.h" +#include "flags.h" +#include "c-parse.h" +#include "c-lex.h" +#include "env.h" +#include "expr.h" +#include "stmt.h" +#include "AST_utils.h" +#include "constants.h" +#include "nesc-component.h" +#include "nesc-interface.h" +#include "nesc-semantics.h" +#include "nesc-doc.h" +#include "nesc-cpp.h" +#include "machine.h" +#include "attributes.h" +#include "nesc-task.h" + +/* Predefined __builtin_va_list type */ +type builtin_va_list_type; +data_declaration builtin_va_arg_decl; +data_declaration builtin_constant_p; + +/* The current semantic state */ +struct semantic_state current; + +dd_list spontaneous_calls; + +data_declaration bad_decl; + +static type implicit_function_type, dummy_function_type; + +static function_declarator dummy_function_declarator; + +/* The global environment */ +environment global_env; + +static known_cst onecst, zerocst; +static expression oneexpr; + +environment new_environment(region r, environment parent, + bool global_level, bool parm_level) +{ + environment env = ralloc(r, struct environment); + +#if 0 + env->fdecl = NULL; +#endif + env->parent = parent; + env->parm_level = parm_level; + env->global_level = global_level; + env->deputy_scope = FALSE; + if (parent) + { + env->fdecl = parent->fdecl; + env->id_env = new_env(r, parent->id_env); + /* ANSI C is weird */ + if (parent->parm_level) + env->tag_env = parent->tag_env; + else + env->tag_env = new_env(r, parent->tag_env); + } + else + { + env->id_env = new_env(r, NULL); + env->tag_env = new_env(r, NULL); + } + + return env; +} + +void init_data_declaration(data_declaration dd, declaration ast, + const char *name, type t) +{ + dd->kind = 0; + dd->name = name; + dd->type = t; + dd->attributes = NULL; + dd->safe = flag_default_safe; + + dd->shadowed = NULL; + dd->ast = ast; + dd->definition = NULL; + dd->isexternalscope = FALSE; + dd->isfilescoperef = FALSE; + dd->needsmemory = FALSE; + dd->isused = FALSE; + dd->in_system_header = ast->location->in_system_header; + dd->ftype = 0; + dd->isinline = FALSE; + dd->noinlinep = FALSE; + dd->isexterninline = FALSE; + dd->oldstyle_args = NULL; + dd->vtype = 0; + dd->islocal = FALSE; + dd->isparameter = FALSE; + dd->islimbo = FALSE; + dd->value = NULL; + dd->schars.data = NULL; + dd->schars.length = 0; + dd->id = 0; + dd->defined = FALSE; + dd->suppress_definition = FALSE; + dd->uncallable = FALSE; + dd->async = FALSE; + dd->actual_async = FALSE; + dd->required = FALSE; + dd->itype = NULL; + dd->gparms = NULL; + dd->ctype = NULL; + dd->container = NULL; + dd->interface = NULL; + dd->Cname = FALSE; + dd->nuses = NULL; + dd->fn_uses = NULL; + dd->connections = NULL; + dd->spontaneous = 0; + dd->magic_fold = NULL; + dd->substitute = FALSE; + dd->makeinline = FALSE; + dd->container_function = NULL; + dd->use_summary = 0; + dd->async_access = dd->async_write = FALSE; + dd->norace = FALSE; + dd->instantiation = NULL; + dd->instanceof = NULL; + dd->call_contexts = dd->extra_contexts = 0; + dd->printed = FALSE; + dd->dumped = FALSE; + dd->encoder = dd->decoder = NULL; + dd->bf_encoder = dd->bf_decoder = NULL; + dd->basetype = NULL; + dd->typevar_kind = typevar_none; + dd->doc.short_s = dd->doc.long_s = NULL; + dd->doc.loc = NULL; +} + +data_declaration lookup_id(const char *s, bool this_level_only) +{ + return env_lookup(current.env->id_env, s, this_level_only); +} + +data_declaration lookup_global_id(const char *s) +{ + return env_lookup(global_env->id_env, s, TRUE); +} + +data_declaration declare(environment b, data_declaration from, + bool ignore_shadow) +{ + data_declaration dd = ralloc(parse_region, struct data_declaration); + + *dd = *from; + + if (dd->name) + { + check_name(dd->name); + + /* In PCC-compatibility mode, extern decls of vars with no current decl + take effect at top level no matter where they are. */ + /* We don't do the GCC "type exists at global scope" check because + it's mostly meaningless. + XXX: review if I start freeing mem earlier */ + if (!b->global_level) + { + /* Here to install a non-global value. */ + data_declaration shadowed = lookup_id(dd->name, FALSE); + char *warnstring = 0; + + /* Warn if shadowing an argument at the top level of the body. */ + if (shadowed && shadowed->islocal + /* This warning doesn't apply to the parms of a nested fcn. */ + && !b->parm_level + /* Check that this is one level down from the parms. */ + && b->parent->parm_level + /* Check that the decl exists in the parm level */ + && env_lookup(b->parent->id_env, dd->name, TRUE)) + { + if (shadowed->isparameter) + warnstring = "declaration of `%s' shadows a parameter"; + else + warnstring = "declaration of `%s' shadows a symbol from the parameter list"; + } + /* Maybe warn if shadowing something else. */ + else if (warn_shadow && !ignore_shadow) + { + + if (dd->isparameter + && b->parent->parm_level) + /* Don't warn about the parm names in function declarator + within a function declarator. + It would be nice to avoid warning in any function + declarator in a declaration, as opposed to a definition, + but there is no way to tell it's not a definition. */ + ; + else if (shadowed && shadowed->isparameter) + warnstring = "declaration of `%s' shadows a parameter"; + else if (shadowed && shadowed->islocal) + warnstring = "declaration of `%s' shadows previous local"; + else if (shadowed) + warnstring = "declaration of `%s' shadows global declaration"; + + } + if (warnstring) + { + (error_shadow ? error : warning)(warnstring, dd->name); + (error_shadow ? error_with_location : warning_with_location)(shadowed->ast->location, "location of shadowed declaration"); + } + } + + /* Parameters are declared before the function_decl is created + (and may be declared in several places). The id's of parameters + are set in start_function */ + if (dd->kind == decl_variable && dd->islocal && !dd->isparameter) + dd->id = b->fdecl->nlocals++; + + } + assert(!dd->islimbo); + + if (b->global_level) + dd->container = current.container; + if (current.function_decl) + dd->container_function = current.function_decl->ddecl; + + env_add(b->id_env, dd->name, dd); + if (!dd->container || (dd->container && !dd->container->abstract)) + { + /* C names go all the way to the top... */ + if (dd->Cname) + env_add(global_env->id_env, dd->name, dd); + if (!dd->container_function && flag_c && !dd->spontaneous) + dd->spontaneous = c_call_nonatomic; + if (dd->spontaneous || (getenv("ALLCODE") && dd->kind == decl_function)) + dd_add_last(parse_region, spontaneous_calls, dd); + } + + return dd; +} + +tag_declaration declare_tag_env(environment env, tag_ref t) +{ + tag_declaration tdecl = ralloc(parse_region, struct tag_declaration); + const char *name = t->word1 ? t->word1->cstring.data : NULL; + + tdecl->kind = t->kind; + tdecl->name = name; + tdecl->size = tdecl->alignment = tdecl->user_alignment = cval_top; +#if 0 + /* ralloc guarantees 0 / NULL */ + tdecl->fields = NULL; + tdecl->fieldlist = NULL; + tdecl->defined = tdecl->being_defined = FALSE; + tdecl->fields_const = tdecl->fields_volatile = FALSE; + tdecl->transparent_union = FALSE; + tdecl->collapsed = FALSE; + tdecl->size_cc = FALSE; + tdecl->container = NULL; + tdecl->dumped = FALSE; + tdecl->instanceof = NULL; + tdecl->Cname = FALSE; + tdecl->macro_name = NULL; + tdecl->deputy_scope = FALSE; +#endif + + if (name) + { + tdecl->shadowed = env_lookup(env->tag_env, name, FALSE); + if (tdecl->shadowed && warn_shadow) + (error_shadow ? error : warning) + ("tag %s shadows enclosing struct/union/enum", name); + } + else + tdecl->shadowed = NULL; + + if (env->global_level) + tdecl->container = current.container; + if (current.function_decl) + tdecl->container_function = current.function_decl->ddecl; + + /* We register all tags in the environment, even unnamed ones. */ + env_add(env->tag_env, name, tdecl); + + return tdecl; +} + +tag_declaration lookup_tag_env(environment env, tag_ref t, bool this_level_only) +{ + tag_declaration found = + env_lookup(env->tag_env, t->word1->cstring.data, this_level_only); + + /* Check if wrong kind */ + if (found && found->kind != t->kind) + current.pending_invalid_xref = t; + + return found; +} + +tag_declaration declare_tag(tag_ref t) +{ + return declare_tag_env(current.env, t); +} + +tag_declaration lookup_tag(tag_ref t, bool this_level_only) +{ + return lookup_tag_env(current.env, t, this_level_only); +} + +tag_declaration declare_global_tag(tag_ref t) +{ + return declare_tag_env(global_env, t); +} + +tag_declaration lookup_global_tag(tag_ref t) +{ + return lookup_tag_env(global_env, t, TRUE); +} + +/* If elements is 'struct foo' shadow tag foo in the current environment */ +void shadow_tag(type_element elements) +{ + shadow_tag_warned(elements, 0); +} + +/* Like shadow_tag, but warned is: 1 => we have done a pedwarn; + 2 => we have done a warning, but no pedwarn. */ +void shadow_tag_warned(type_element elements, int warned) +{ + type_element elem; + int found_tag = 0; + + current.pending_invalid_xref = 0; + + scan_type_element (elem, elements) + { + if (is_tag_ref(elem)) + { + tag_ref tag = CAST(tag_ref, elem); + word name = tag->word1; + + found_tag++; + + if (name == 0) + { + if (warned != 1 && !is_enum_ref(elem)) + /* Empty unnamed enum OK */ + { + pedwarn ("unnamed struct/union that defines no instances"); + warned = 1; + } + } + else + { + void *tagdecl = lookup_tag(tag, TRUE); + + if (tagdecl == 0) + declare_tag(tag); + else + pending_xref_error(); + } + } + else + { + if (!warned && ! current.lex.input->l.in_system_header) + { + warning("useless keyword or type name in empty declaration"); + warned = 2; + } + } + } + + if (found_tag > 1) + error("two types specified in one empty declaration"); + + if (warned != 1) + { + if (found_tag == 0) + pedwarn("empty declaration"); + } +} + +/* Print an error message now + for a recent invalid struct, union or enum cross reference. + We don't print them immediately because they are not invalid + when used in the `struct foo;' construct for shadowing. */ + +void pending_xref_error(void) +{ + if (current.pending_invalid_xref != 0) + { + error_with_location(current.pending_invalid_xref->location, + "`%s' defined as wrong kind of tag", + current.pending_invalid_xref->word1->cstring.data); + current.pending_invalid_xref = 0; + } +} + +declaration make_void_parm(location loc) +{ + region r = parse_region; + rid rvoid = new_rid(r, loc, RID_VOID); + variable_decl vdvoid = new_variable_decl(r, loc, NULL, NULL, NULL, NULL, NULL); + data_decl ddvoid = new_data_decl(r, loc, CAST(type_element, rvoid), + CAST(declaration, vdvoid)); + + return CAST(declaration, ddvoid); +} + +/* At end of parameter list, warn about any struct, union or enum tags + defined within. Do so because these types cannot ever become complete. */ +static void parmlist_tags_warning(environment parm_env) +{ + env_scanner scan_tags; + const char *tagname; + tag_declaration tagdecl; + static bool already = FALSE; + + env_scan(parm_env->tag_env, &scan_tags); + + while (env_next(&scan_tags, &tagname, (void **)&tagdecl)) + { + int kind = tagdecl->kind; + const char *kindname = tagkind_name(kind); + + /* An anonymous union parm type is meaningful as a GNU extension. + So don't warn for that. */ + if (kind == kind_union_ref && !tagname && !pedantic) + continue; + + if (tagname) + warning("`%s %s' declared inside parameter list", kindname, + tagname); + else + warning("anonymous %s declared inside parameter list", kindname); + + if (!already) + { + warning("its scope is only this definition or declaration,"); + warning("which is probably not what you want."); + already = TRUE; + } + } +} + +typelist make_arg_types(bool definition, declaration parameters, bool *varargs) +{ + declaration parameter; + typelist arg_types = new_typelist(parse_region); + + *varargs = FALSE; + if (!is_void_parms(parameters)) + scan_declaration (parameter, parameters) + if (is_ellipsis_decl(parameter)) + *varargs = TRUE; + else if (is_error_decl(parameter)) + { + /* Make an "accept everything" signature for arg lists with + error_decls */ + *varargs = TRUE; + arg_types = new_typelist(parse_region); + typelist_append(arg_types, error_type); + + return arg_types; + } + else + { + data_decl dp = CAST(data_decl, parameter); + variable_decl vp = CAST(variable_decl, dp->decls); + + assert(!vp->next); + if (!vp->ddecl->name && definition) + error_with_decl(dp->decls, "parameter name omitted"); + typelist_append(arg_types, vp->ddecl->type); + } + + return arg_types; +} + +bool new_style(declaration parameters) +{ + return parameters && !is_oldidentifier_decl(parameters); +} + +static dd_list push_attribute(dd_list al, attribute attr) +{ + /* pstate.ds_region would be good, but isn't quite accessible */ + if (!al) + al = dd_new_list(parse_region); + dd_add_last(parse_region, al, attr); + + return al; +} + +static void check_duplicate_rid(int specbits, rid rspec) +{ + if (specbits & 1 << rspec->id) + pedwarn_with_location(rspec->location, "duplicate `%s'", rid_name(rspec)); +} + +static void check_duplicate_qualifiers1(location l, type_quals new1, type_quals old) +{ + if (old & new1) + pedwarn_with_location(l, "duplicate `%s'", qualifier_name(new1)); +} + +static void check_duplicate_qualifiers(location l, type_quals new, type_quals old) +{ + type_quals qual; + + for (qual = 1; qual < last_qualifier; qual <<= 1) + if (new & qual) + check_duplicate_qualifiers1(l, qual, old); +} + +static void check_legal_qualifiers(location l, type_quals quals) +{ + /* Placeholder for checks for any extra qualifiers */ +} + +static type parse_qualifiers(type t, location l, type_element qlist, + dd_list *oattributes) +{ + type_element q; + type_quals tqs = no_qualifiers; + + scan_type_element (q, qlist) + if (is_qualifier(q)) + { + qualifier qq = CAST(qualifier, q); + + check_duplicate_qualifiers1(qq->location, qq->id, tqs); + tqs |= qq->id; + } + else if (is_attribute(q)) + { + /* Filter out type-only attributes */ + if (!handle_type_attribute(CAST(attribute, q), &t)) + *oattributes = push_attribute(*oattributes, CAST(attribute, q)); + } + check_legal_qualifiers(l, tqs); + return make_qualified_type(t, tqs); +} + +static type make_nesc_function_type(int class, type returns, typelist argtypes, + bool varargs) +{ + switch (class) + { + case RID_TASK: return make_task_type(returns, argtypes, varargs); + case RID_EVENT: return make_event_type(returns, argtypes, varargs); + case RID_COMMAND: return make_command_type(returns, argtypes, varargs); + default: return make_function_type(returns, argtypes, varargs, FALSE); + } +} + +scflags parse_scflags(int specbits) +{ + scflags scf = 0; + + if (specbits & 1 << RID_INLINE) + scf |= scf_inline; + if (specbits & 1 << RID_DEFAULT) + scf |= scf_default; + if (specbits & 1 << RID_ASYNC) + scf |= scf_async; + if (specbits & 1 << RID_NORACE) + scf |= scf_norace; + + return scf; +} + +void check_variable_scflags(scflags scf, + location l, const char *kind, const char *name) +{ + const char *badqual = NULL; + void (*msg)(location l, const char *format, ...) = error_with_location; + + /* default already covered in parse_declarator */ + if (scf & scf_inline) + { + badqual = "inline"; + msg = pedwarn_with_location; /* this is what gcc does */ + } + if (scf & scf_async) + badqual = "async"; + + if (badqual) + msg(l, "%s `%s' declared `%s'", kind, name, badqual); +} + +void check_array_size(expression size, const char *printname) +{ + if (!check_constant_once(size, cst_numerical)) + return; + + if (size->cst && constant_integral(size->cst)) + { + if (pedantic) + { + constant_overflow_warning(size->cst); + if (definite_zero(size)) + pedwarn_with_location + (size->location, "ANSI C forbids zero-size array `%s'", printname); + } + + if (cval_intcompare(size->cst->cval, cval_zero) < 0) + error_with_location(size->location, + "size of array `%s' is negative", printname); + } + else if (!(current.function_decl || current.env->parm_level)) + { + if (size->cst) + error_with_location(size->location, "type size can't be explicitly evaluated"); + else + error_with_location(size->location, "variable-size type declared outside of any function"); + } + else if (pedantic) + { + if (size->cst) + pedwarn_with_location(size->location, "ANSI C forbids array `%s' whose size can't be evaluated", printname); + else + pedwarn_with_location(size->location, "ANSI C forbids variable-size array `%s'", printname); + } +} + +void parse_declarator(type_element modifiers, declarator d, bool bitfield, + bool require_parm_names, + int *oclass, scflags *oscf, + const char **ointf, const char **oname, + type *ot, bool *owarn_defaulted_int, + function_declarator *ofunction_declarator, + dd_list *oattributes) +{ + location loc = d ? d->location : modifiers->location; + int specbits = 0, nclasses = 0; + type_quals specquals = no_qualifiers; + bool longlong = FALSE; + const char *printname, *iname; + type_element spec; + type t = NULL; + bool modified; + dd_list attributes = NULL; + + *owarn_defaulted_int = FALSE; + + /* We get the name now so that we have a name for error messages */ + if (ointf) + *ointf = NULL; + declarator_name(d, oname, &iname); + printname = nice_declarator_name(d); + + *oclass = 0; + + scan_type_element (spec, modifiers) + { + type newtype = NULL; + + switch (spec->kind) + { + case kind_rid: + { + rid rspec = CAST(rid, spec); + int id = rspec->id; + + switch (id) + { + case RID_INT: newtype = int_type; break; + case RID_CHAR: newtype = char_type; break; + case RID_FLOAT: newtype = float_type; break; + case RID_DOUBLE: newtype = double_type; break; + case RID_VOID: newtype = void_type; break; + case RID_AUTO: case RID_STATIC: case RID_EXTERN: + case RID_REGISTER: case RID_TYPEDEF: case RID_COMMAND: + case RID_EVENT: case RID_TASK: + *oclass = id; + nclasses++; + break; + + case RID_LONG: /* long long detection */ + if (specbits & 1 << RID_LONG) + { + if (longlong) + error_with_location(spec->location, + "`long long long' is too long for GCC"); + else + { + if (pedantic && !current.lex.input->l.in_system_header) + pedwarn_with_location(spec->location, + "ANSI C does not support `long long'"); + longlong = TRUE; + } + break; + } + /* Fall through */ + default: + check_duplicate_rid(specbits, rspec); + break; + } + specbits |= 1 << id; + break; + } + case kind_qualifier: + { + qualifier q = CAST(qualifier, spec); + int id = q->id; + + check_duplicate_qualifiers1(loc, id, specquals); + specquals |= id; + break; + } + case kind_typename: case kind_component_typeref: + newtype = CAST(typename, spec)->ddecl->type; + break; + case kind_typeof_type: + newtype = CAST(typeof_type, spec)->asttype->type; + break; + case kind_typeof_expr: + newtype = CAST(typeof_expr, spec)->arg1->type; + if (type_generic(newtype) || + (type_functional(newtype) && !type_function(newtype))) + { + error_with_location(spec->location, + "expression does not have a valid type"); + newtype = error_type; + } + else if (type_unknown(newtype)) + { + error_with_location(spec->location, + "typeof an expression based on an @integer() or @number() type not supported"); + newtype = error_type; + } + break; + case kind_struct_ref: case kind_union_ref: case kind_enum_ref: + case kind_nx_struct_ref: case kind_nx_union_ref: + newtype = make_tagged_type(CAST(tag_ref, spec)->tdecl); + break; + case kind_attribute_ref: + error_with_location(spec->location, + "attributes cannot be used as types"); + newtype = error_type; + break; + case kind_gcc_attribute: case kind_nesc_attribute: + attributes = push_attribute(attributes, CAST(attribute, spec)); + break; + default: assert(0); break; + } + + if (newtype) + { + if (t) + error_with_location(spec->location, + "two or more data types in declaration of `%s'", printname); + else + t = newtype; + } + } + + /* Long double is a special combination. */ + if ((specbits & 1 << RID_LONG) && !longlong && (specbits & 1 << RID_DOUBLE)) + { + specbits &= ~(1 << RID_LONG); + t = long_double_type; + } + + modified = !!(specbits & (1 << RID_LONG | 1 << RID_SHORT | + 1 << RID_SIGNED | 1 << RID_UNSIGNED)); + + /* No type at all: default to `int', or `double' (if complex specified + and no long/short/signed/unsigned) */ + if (!t) + { + if (specbits & 1 << RID_COMPLEX) + { + if (!modified) + { + specbits |= 1 << RID_DOUBLE; + t = double_type; + } + else + { + specbits |= 1 << RID_INT; + t = int_type; + } + } + else + { + /* Defer defaulted int warning to caller (msg depends on context) */ + if (!modified) + *owarn_defaulted_int = TRUE; + + specbits |= 1 << RID_INT; + t = int_type; + } + } + + if (nclasses > 1) + error_with_location(loc, "multiple storage classes in declaration of `%s'", printname); + + /* Now process the modifiers that were specified + and check for invalid combinations. */ + + /* Check all other uses of type modifiers. */ + if (modified) + { + int ok = 0; + + if ((specbits & 1 << RID_LONG) && (specbits & 1 << RID_SHORT)) + error_with_location(loc, "both long and short specified for `%s'", printname); + else if ((specbits & 1 << RID_SHORT) && !(specbits & 1 << RID_INT)) + { + static int already = 0; + + error_with_location(loc, "short invalid for `%s'", printname); + if (!already && !pedantic) + { + error_with_location(loc, "short is only valid with int"); + already = 1; + } + } + else if ((specbits & 1 << RID_LONG) && !(specbits & 1 << RID_INT)) + { + static int already = 0; + + error_with_location(loc, "long invalid for `%s'", printname); + if (!already && !pedantic) + { + error_with_location(loc, "long is only valid with int or double"); + already = 1; + } + } + else if ((specbits & 1 << RID_SIGNED) && (specbits & 1 << RID_UNSIGNED)) + error_with_location(loc, "both signed and unsigned specified for `%s'", printname); + else if (((specbits & 1 << RID_SIGNED) || (specbits & 1 << RID_UNSIGNED)) + && !(specbits & (1 << RID_INT | 1 << RID_CHAR))) + error_with_location(loc, "signed or unsigned invalid for `%s'", printname); + else + ok = 1; + + /* Discard the type modifiers if they are invalid. */ + if (! ok) + { + specbits &= ~(1 << RID_LONG | 1 << RID_SHORT + | 1 << RID_UNSIGNED | 1 << RID_SIGNED); + longlong = 0; + } + } + + if ((specbits & 1 << RID_COMPLEX) && !(type_integral(t) || type_floating(t))) + { + error_with_location(loc, "complex invalid for `%s'", printname); + specbits &= ~(1 << RID_COMPLEX); + } + + /* Decide whether an integer type is signed or not. + Optionally treat bitfields as signed by default. */ + if ((specbits & 1 << RID_UNSIGNED) + /* Traditionally, all bitfields are unsigned. */ + || (bitfield && flag_traditional + && (/*!explicit_flag_signed_bitfields ||*/ !flag_signed_bitfields)) + || (bitfield && !flag_signed_bitfields + && ((specbits & 1 << RID_INT) || (specbits & 1 << RID_CHAR)) + && !(specbits & 1 << RID_SIGNED))) + { + if (longlong) + t = unsigned_long_long_type; + else if (specbits & 1 << RID_LONG) + t = unsigned_long_type; + else if (specbits & 1 << RID_SHORT) + t = unsigned_short_type; + else if (t == char_type) + t = unsigned_char_type; + else + t = unsigned_int_type; + } + else if ((specbits & 1 << RID_SIGNED) && (specbits & 1 << RID_CHAR)) + t = signed_char_type; + else if (longlong) + t = long_long_type; + else if (specbits & 1 << RID_LONG) + t = long_type; + else if (specbits & 1 << RID_SHORT) + t = short_type; + + if (specbits & 1 << RID_COMPLEX) + t = make_complex_type(t); + + /* Check for qualifiers redundant with base type */ + check_duplicate_qualifiers(loc, specquals, type_qualifiers(t)); + + specquals |= type_qualifiers(t); + check_legal_qualifiers(loc, specquals); + + t = make_qualified_type(t, specquals); + + *oscf = parse_scflags(specbits); + if ((*oscf & scf_default) && + !(*oclass == RID_EVENT || *oclass == RID_COMMAND)) + { + *oscf &= ~scf_default; + error_with_location(loc, "default can only be specified for events or commands"); + } + + if (pedantic && type_function(t) && (type_const(t) || type_volatile(t)) && + !current.lex.input->l.in_system_header) + pedwarn_with_location(loc, "ANSI C forbids const or volatile function types"); + + /* Now figure out the structure of the declarator proper. + Descend through it, creating more complex types, until we reach + the declared identifier (or NULL, in an abstract declarator). */ + + while (d && d->kind != kind_identifier_declarator) + { + switch (d->kind) + { + case kind_array_declarator: + { + array_declarator ad = CAST(array_declarator, d); + expression size = ad->arg1; + + d = ad->declarator; + + /* Check for some types that there cannot be arrays of. */ + if (type_void(t)) + { + error_with_location(ad->location, + "declaration of `%s' as array of voids", printname); + t = error_type; + } + + if (type_function(t)) + { + error_with_location(ad->location, + "declaration of `%s' as array of functions", printname); + t = error_type; + } + + if (size && is_error_expr(size)) + t = error_type; + + if (t == error_type) + continue; + + if (size) + { + if (!type_integer(size->type)) + { + error_with_location(ad->location, + "size of array `%s' has non-integer type", printname); + size = oneexpr; + } + else + check_array_size(size, printname); + } + + /* Build the array type itself, then merge any constancy or + volatility */ + t = make_array_type(t, size); + break; + } + + case kind_function_declarator: + { + function_declarator fd = CAST(function_declarator, d); + bool newstyle; + + d = fd->declarator; + if (ofunction_declarator) + *ofunction_declarator = fd; + + /* Declaring a function type. + Make sure we have a valid type for the function to return. */ + if (t == error_type) + t = int_type; + + /* Warn about some types functions can't return. */ + if (type_function(t)) + { + error_with_location(fd->location, + "`%s' declared as function returning a function", + printname); + t = int_type; + } + if (type_array(t)) + { + error_with_location(fd->location, + "`%s' declared as function returning an array", + printname); + t = int_type; + } + +#ifndef TRADITIONAL_RETURN_FLOAT + /* Traditionally, declaring return type float means double. */ + if (flag_traditional && type_float(t)) + t = qualify_type1(double_type, t); +#endif /* TRADITIONAL_RETURN_FLOAT */ + + /* Require new-style declarations */ + if (current.language != l_c) + { + /* Force empty parameter lists to void */ + if (!fd->parms) + fd->parms = make_void_parm(fd->location); + newstyle = !is_oldidentifier_decl(fd->parms); + if (!newstyle) + error("old-style parameter lists not supported"); + } + else + newstyle = new_style(fd->parms); + + if (newstyle) + { + bool definition = require_parm_names && + d && d->kind == kind_identifier_declarator; + bool varargs; + typelist argtypes = make_arg_types(definition, fd->parms, + &varargs); + + if (*oclass == RID_TASK) + { + if (!is_void_parms(fd->parms)) + error_with_location(fd->location, + "`%s' declared as a task with parameters", printname); + if (!type_void(t)) + error_with_location(fd->location, + "task `%s' must return void", printname); + } + + t = make_nesc_function_type(*oclass, t, argtypes, varargs); + + if (fd->gparms) + { + argtypes = make_arg_types(definition, fd->gparms, &varargs); + t = make_generic_type(t, argtypes); + } + } + else /* Old-style function */ + t = make_function_type(t, NULL, FALSE, TRUE); + + t = parse_qualifiers(t, fd->location, fd->qualifiers, NULL); + break; + } + + case kind_pointer_declarator: + { + pointer_declarator pd = CAST(pointer_declarator, d); + + d = pd->declarator; + t = make_pointer_type(t); + break; + } + + case kind_qualified_declarator: + { + qualified_declarator qd = CAST(qualified_declarator, d); + + d = qd->declarator; + t = parse_qualifiers(t, qd->location, qd->modifiers, &attributes); + break; + } + + case kind_interface_ref_declarator: + { + interface_ref_declarator id = CAST(interface_ref_declarator, d); + + d = id->declarator; + if (ointf) + *ointf = id->word1->cstring.data; + else + error_with_location(id->location, + "unexpected interface reference in declaration of `%s'", + printname); + break; + } + + default: assert(0); + } + } + + *ot = t; + *oattributes = attributes; +} + +static declarator finish_function_declarator(function_declarator fd) +{ + declaration parm; + environment penv = poplevel(); + + fd->env = penv; + + if (new_style(fd->parms) && !is_void_parms(fd->parms)) + scan_declaration (parm, fd->parms) + if (!is_ellipsis_decl(parm) && !is_error_decl(parm)) + { + variable_decl vp = CAST(variable_decl, CAST(data_decl, parm)->decls); + + if (!vp->ddecl) + { + error_with_location(fd->location, "parameter declared void"); + vp->ddecl = bad_decl; + } + else if (!vp->ddecl->isused) + { + /* ok, so it's not really a field */ + const char *pname = nice_field_name(vp->ddecl->name); + + error_with_location(fd->location, + "parameter `%s' has just a forward declaration", pname); + } + } + + parmlist_tags_warning(penv); + + return CAST(declarator, fd); +} + +declarator finish_array_or_fn_declarator(declarator nested, nested_declarator d) +{ + d->declarator = nested; + + if (is_function_declarator(d)) + return finish_function_declarator(CAST(function_declarator, d)); + else + return CAST(declarator, d); +} + + +/* Return zero if the declaration NEWDECL is valid + when the declaration OLDDECL (assumed to be for the same name and kind + of declaration) has already been seen. + Otherwise return an error message format string with a %s + where the identifier should go. */ + +static char *redeclaration_error_message(data_declaration newdecl, + data_declaration olddecl, + bool newinitialised) +{ + if (olddecl->islimbo) + return 0; + + if (newdecl->kind == decl_typedef) + { + if (flag_traditional && type_compatible(newdecl->type, olddecl->type)) + return 0; + /* This gets a warning later */ + if (olddecl->in_system_header || newdecl->in_system_header) + return 0; + return "redefinition of `%s'"; + } + else if (newdecl->kind == decl_function) + { + /* Declarations of functions can insist on internal linkage + but they can't be inconsistent with internal linkage, + so there can be no error on that account. + However defining the same name twice is no good. */ + if (olddecl->definition && newdecl->definition + /* However, defining once as extern inline and a second + time in another way is ok. */ + && !(olddecl->isexterninline && !newdecl->isexterninline)) + return "redefinition of `%s'"; + return 0; + } + else if (newdecl->kind == decl_constant) + return "redefinition of `%s'"; + else if (current.env->global_level) + { + /* Objects declared at top level: */ + /* If at least one is a reference, it's ok. */ + if (newdecl->isfilescoperef || olddecl->isfilescoperef) + return 0; + /* Reject two definitions with initialisation. */ + if (newinitialised && olddecl->initialiser) + return "redefinition of `%s'"; + /* Now we have two tentative defs, or one tentative and one real def. */ + /* Insist that the linkage match. */ + if (olddecl->isexternalscope != newdecl->isexternalscope) + return "conflicting declarations of `%s'"; + return 0; + } + else + { + /* Newdecl has block scope. If olddecl has block scope also, then + reject two definitions, and reject a definition together with an + external reference. Otherwise, it is OK, because newdecl must + be an extern reference to olddecl. */ + if (!(newdecl->isexternalscope && olddecl->isexternalscope)) +#if 0 + Why check the context ? + && DECL_CONTEXT (newdecl) == DECL_CONTEXT (olddecl) +#endif + return "redeclaration of `%s'"; + return 0; + } +} + +/* Return TRUE if t1 looks like a modern declaration for malloc (&friends) and + t2 looks like an oldstyle declaration thereof */ +static bool looks_like_malloc_redeclaration(type t1, type t2) +{ + type t1return = type_function_return_type(t1); + type t2return = type_function_return_type(t2); + + return + type_function_oldstyle(t1) && + type_pointer(t1return) && type_pointer(t2return) && + type_void(type_points_to(t2return)) && + type_char(type_points_to(t1return)) && + self_promoting_args(t2); +} + +void show_previous_decl(void (*message)(declaration d, const char *format, ...), + data_declaration olddecl) +{ + if (olddecl->kind == decl_function && olddecl->ftype == function_implicit) + message(olddecl->ast, "previous implicit declaration of `%s'", olddecl->name); + else if (ddecl_is_command_or_event(olddecl) && olddecl->definition) + message(olddecl->definition, "previous declaration of `%s'", + decl_printname(olddecl)); + else + message(olddecl->ast, "previous declaration of `%s'", + decl_printname(olddecl)); +} + +/* Handle when a new declaration NEWDECL + has the same name as an old one OLDDECL + in the same binding contour. + Prints an error message if appropriate. + + If safely possible, alter OLDDECL to look like NEWDECL, and return 1. + Otherwise, return 0. + + When DIFFERENT_BINDING_LEVEL is true, NEWDECL is an external declaration, + and OLDDECL is in an outer binding level and should thus not be changed. */ + +int duplicate_decls(data_declaration newdecl, data_declaration olddecl, + bool different_binding_level, bool newinitialised) +{ + type oldtype = olddecl->type; + type newtype = newdecl->type; + char *errmsg = 0; + void (*previous_message)(declaration d, const char *format, ...) = NULL; + bool types_match; + + assert(!(newdecl->kind == decl_function && + newdecl->ftype == function_implicit)); + + /* New decl is completely inconsistent with the old one => + tell caller to replace the old one. This is an error, + except if traditional and in different binding levels */ + if (newdecl->kind != olddecl->kind) + { + bool iswarning = + (flag_traditional && different_binding_level) || olddecl->islimbo; + + warning_or_error(iswarning, + "`%s' redeclared as different kind of symbol", decl_printname(olddecl)); + show_previous_decl(iswarning ? warning_with_decl : error_with_decl, olddecl); + newdecl->shadowed = olddecl; + return 0; + } + + if (newtype == error_type || oldtype == error_type) + types_match = FALSE; + else + types_match = type_compatible_unqualified(newtype, oldtype); + + /* For real parm decl following a forward decl, or a declaration of an old + style parameter (oldtype == void) return 1 so old decl will be reused. */ + if ((oldtype == void_type || types_match) && newdecl->isparameter && + !olddecl->isused) + { + /* Point to the latest declaration */ + olddecl->ast = newdecl->ast; + return 1; + } + + /* The new declaration is the same kind of object as the old one. + The declarations may partially match. Print warnings if they don't + match enough. Ultimately, copy most of the information from the new + decl to the old one, and keep using the old one. */ + + if (flag_traditional && olddecl->kind == decl_function + && olddecl->ftype == function_implicit) + /* If -traditional, avoid error for redeclaring fcn + after implicit decl. */ + ; + /* Permit char *foo () to match void *foo (...) if not pedantic, + if one of them came from a system header file. */ + else if (!types_match && olddecl->kind == decl_function + && (olddecl->in_system_header || newdecl->in_system_header) + && (looks_like_malloc_redeclaration(oldtype, newtype) || + looks_like_malloc_redeclaration(newtype, oldtype))) + { + if (pedantic) + pedwarn_with_decl(newdecl->ast, "conflicting types for `%s'", decl_printname(olddecl)); + /* Make sure we keep void * as ret type, not char *. */ + if (type_void(type_points_to(type_function_return_type(oldtype)))) + newdecl->type = newtype = oldtype; + + /* Set IN_SYSTEM_HEADER, so that if we see another declaration + we will come back here again. */ + newdecl->in_system_header = TRUE; + } + else if (!types_match + /* Permit char *foo (int, ...); followed by char *foo (); + if not pedantic. */ + && !(olddecl->kind == decl_function && !pedantic + && type_function_oldstyle(newtype) + /* Return types must still match. */ + && type_compatible(type_function_return_type(oldtype), + type_function_return_type(newtype)))) + { + void (*message)(const char *format, ...) = + olddecl->islimbo ? warning : error; + + previous_message = + olddecl->islimbo ? warning_with_decl : error_with_decl; + + message("conflicting types for `%s'", decl_printname(olddecl)); + /* Check for function type mismatch + involving an empty arglist vs a nonempty one. */ + if (newdecl->kind == decl_function + && type_compatible(type_function_return_type(oldtype), + type_function_return_type(newtype)) + && ((type_function_oldstyle(oldtype) && !olddecl->definition) + || (type_function_oldstyle(newtype) && !newdecl->definition))) + { + /* Classify the problem further. */ + if (type_function_varargs(newtype) || type_function_varargs(oldtype)) + { + message("A parameter list with an ellipsis can't match"); + message("an empty parameter name list declaration."); + } + else + { + typelist_scanner scanargs; + type t; + typelist args = type_function_arguments(oldtype); + + if (!args) + args = type_function_arguments(newtype); + + typelist_scan(args, &scanargs); + while ((t = typelist_next(&scanargs))) + if (!type_self_promoting(t)) + { + message("An argument type that has a default promotion"); + message("can't match an empty parameter name list declaration."); + break; + } + } + } + } + else + { + errmsg = redeclaration_error_message(newdecl, olddecl, newinitialised); + if (errmsg) + { + error_with_decl(newdecl->ast, errmsg, decl_printname(olddecl)); + previous_message = error_with_decl; + } + else if (newdecl->kind == decl_typedef && + (olddecl->in_system_header || newdecl->in_system_header)) + { + warning_with_decl(newdecl->ast, "redefinition of `%s'", decl_printname(olddecl)); + previous_message = warning_with_decl; + } + else if (olddecl->kind == decl_function + && olddecl->oldstyle_args + && !type_function_oldstyle(newtype)) + { + int nargs; + typelist_scanner oldparms, newparms; + /* Prototype decl follows defn w/o prototype. */ + + typelist_scan(olddecl->oldstyle_args, &oldparms); + typelist_scan(type_function_arguments(newtype), &newparms); + nargs = 1; + errmsg = NULL; + for (;;) + { + type oldparm = typelist_next(&oldparms); + type newparm = typelist_next(&newparms); + + if (!oldparm && !newparm) + break; + + if (!oldparm || !newparm) + { + errmsg = "prototype for `%s' follows and number of arguments"; + break; + } + /* Type for passing arg must be consistent + with that declared for the arg. */ + if (!type_compatible(oldparm, newparm) + /* If -traditional, allow `unsigned int' instead of `int' + in the prototype. */ + && !(flag_traditional + && type_equal_unqualified(oldparm, int_type) + && type_equal_unqualified(newparm, unsigned_int_type))) + { + errmsg = "prototype for `%s' follows and argument %d"; + break; + } + nargs++; + } + if (errmsg) + { + warning_or_error_with_decl(olddecl->islimbo, newdecl->ast, + errmsg, decl_printname(olddecl), nargs); + warning_or_error_with_decl(olddecl->islimbo, olddecl->ast, + "doesn't match non-prototype definition here"); + } + else + { + warning_with_decl(newdecl->ast, "prototype for `%s' follows", + decl_printname(olddecl)); + warning_with_decl(olddecl->ast, "non-prototype definition here"); + } + } + /* Warn about mismatches in various flags. */ + else if (newdecl->kind == decl_function) + { + /* Warn if function is now inline + but was previously declared not inline and has been called. */ + if (!olddecl->isinline && newdecl->isinline) + { + if (olddecl->isused) + { + warning("`%s' declared inline after being called", decl_printname(olddecl)); + previous_message = warning_with_decl; + } + if (olddecl->definition) + { + warning("`%s' declared inline after its definition", decl_printname(olddecl)); + previous_message = warning_with_decl; + } + } + + /* Warn for static following external */ + if (newdecl->ftype == function_static && + olddecl->ftype == function_implicit) + { + pedwarn("`%s' was declared implicitly `extern' and later `static'", decl_printname(olddecl)); + previous_message = pedwarn_with_decl; + } + else if (newdecl->ftype == function_static && + olddecl->ftype == function_normal) + { + pedwarn("static declaration for `%s' follows non-static", decl_printname(olddecl)); + previous_message = pedwarn_with_decl; + } + + /* Warn for mismatched async */ + if (newdecl->async != olddecl->async) + { + error("`%s': async mismatch with declaration", + decl_printname(olddecl)); + previous_message = error_with_decl; + } + } + else if (newdecl->kind == decl_variable) + { + /* If pedantic, warn when static declaration follows a non-static + declaration. */ + if (pedantic && + olddecl->isexternalscope && !newdecl->isexternalscope) + { + pedwarn("static declaration for `%s' follows non-static", decl_printname(olddecl)); + previous_message = pedwarn_with_decl; + } + /* Warn when const declaration follows a non-const declaration */ + if (!type_const(oldtype) && type_const(newtype)) + warning("const declaration for `%s' follows non-const", decl_printname(olddecl)); + /* These bits are logically part of the type, for variables. */ + else if (pedantic && + (type_const(oldtype) != type_const(newtype) + || type_volatile(oldtype) != type_volatile(newtype))) + { + pedwarn("type qualifiers for `%s' conflict with previous decl", + decl_printname(olddecl)); + previous_message = pedwarn_with_decl; + } + } + } + + /* Optionally warn about more than one declaration for the same name. */ + /* Let's try a different test than GCC */ + if (errmsg == 0 && warn_redundant_decls && !olddecl->islimbo && + !(olddecl->isfilescoperef && !newdecl->isfilescoperef)) + { + warning_with_decl(newdecl->ast, "redundant redeclaration of `%s' in same scope", decl_printname(olddecl)); + previous_message = warning_with_decl; + } + + if (previous_message) + show_previous_decl(previous_message, olddecl); + + + /* Copy all the DECL_... slots specified in the new decl + except for any that we copy here from the old type. */ + + /* If either decl says `inline', this fn is inline, + unless its definition was passed already. */ + if (newdecl->isinline && !olddecl->definition) + olddecl->isinline = TRUE; + newdecl->isinline = olddecl->isinline; + + /* If either of the decls says noinline, make sure that none of the + declerations are made inline. */ + if (newdecl->noinlinep || olddecl->noinlinep) + newdecl->noinlinep = olddecl->noinlinep = TRUE; + + if (different_binding_level) + { + /* newdecl must be a reference to something at file scope */ + assert(newdecl->isfilescoperef && !newdecl->needsmemory); + assert(!(newdecl->kind == decl_variable && + newdecl->vtype == variable_static)); + assert(!(newdecl->kind == decl_function && + (newdecl->ftype == function_implicit || + newdecl->ftype == function_nested))); + + /* We copy some info over to the newdecl which will shadow olddecl */ + newdecl->shadowed = olddecl; + newdecl->definition = olddecl->definition; + newdecl->isinline = olddecl->isinline; + newdecl->isexterninline = olddecl->isexterninline; + newdecl->oldstyle_args = olddecl->oldstyle_args; + if (olddecl->in_system_header) + newdecl->in_system_header = TRUE; + + newdecl->isexternalscope = olddecl->isexternalscope; + + /* We don't copy the type */ + + return 0; + } + + /* newdecl should be too new to have any oldstyle args yet */ + assert(!newdecl->oldstyle_args); + + /* Merge the data types specified in the two decls. */ + if (types_match) + olddecl->type = common_type(newtype, oldtype); + else if (newtype != error_type) + /* GCC keeps the old type. I think it makes more sense to keep the new + one. And it means I can examine the decl in current.function_decl + and find the type of the current function, not something random */ + olddecl->type = newtype; + olddecl->islimbo = FALSE; + + if (newdecl->definition) + olddecl->definition = newdecl->definition; + + olddecl->isexternalscope &= newdecl->isexternalscope; + olddecl->isfilescoperef &= newdecl->isfilescoperef; + olddecl->needsmemory |= newdecl->needsmemory; + + olddecl->Cname |= newdecl->Cname; + if (newdecl->spontaneous && !olddecl->spontaneous) + { + olddecl->spontaneous = newdecl->spontaneous; + dd_add_last(parse_region, spontaneous_calls, olddecl); + } + olddecl->norace |= newdecl->norace; + + /* For functions, static overrides non-static. */ + if (newdecl->kind == decl_function) + { + if (olddecl->ftype != function_static) + olddecl->ftype = newdecl->ftype; + + /* Also set isexterninline correctly */ + if ((olddecl->definition && !olddecl->isexterninline) || + (newdecl->definition && !newdecl->isexterninline)) + olddecl->isexterninline = FALSE; + else if (olddecl->isexterninline || newdecl->isexterninline) + olddecl->isexterninline = TRUE; + /* the last case is 2 non-inline externs, so isexterninline is correct */ + } + else if (newdecl->kind == decl_variable) + { + /* static overrides extern (the combinations with register + are errors anyway) */ + if (olddecl->vtype != variable_static) + olddecl->vtype = variable_static; + } + + olddecl->in_system_header = newdecl->in_system_header = + olddecl->in_system_header || newdecl->in_system_header; + + /* Point to the latest declaration (except for commands and events) */ + if (!ddecl_is_command_or_event(olddecl)) + olddecl->ast = newdecl->ast; + + return 1; +} + +static void transparent_union_argument(data_declaration ddecl) +{ + ddecl->type = make_qualified_type + (ddecl->type, type_qualifiers(ddecl->type) | transparent_qualifier); +} + +bool is_doublecharstar(type t) +{ + return type_pointer(t) && type_charstar(type_points_to(t)); +} + +void check_function(data_declaration dd, declaration fd, int class, + scflags scf, const char *name, type function_type, + bool nested, bool isdeclaration, bool defaulted_int) +{ + type return_type, actual_function_type; + + if (defaulted_int && (warn_implicit_int || warn_return_type)) + warning("return-type defaults to `int'"); + + if (scf & scf_norace) + error("norace is for variables only"); + + actual_function_type = type_generic(function_type) ? + type_function_return_type(function_type) : function_type; + return_type = type_function_return_type(actual_function_type); + + /* XXX: Does this volatile/const stuff actually work with my imp ? */ + if (pedantic && type_void(return_type) && + (type_const(return_type) || type_volatile(return_type)) && + !current.lex.input->l.in_system_header) + pedwarn("ANSI C forbids const or volatile void function return type"); + + if (type_volatile(function_type) && !type_void(return_type)) + warning("`noreturn' function returns non-void value"); + + /* Record presence of `inline', if it is reasonable. */ + if (scf & scf_inline && !strcmp(name, "main") && !nested) + { + warning("cannot inline function `main'"); + scf &= ~scf_inline; + } + + if (nested && (class == RID_COMMAND || class == RID_EVENT)) + error("commands and events cannot be declared inside functions"); + + /* Warn for unlikely, improbable, or stupid declarations of `main'. */ + if (current.language == l_c && warn_main && !strcmp("main", name) && !nested) + { + if (!type_equal_unqualified(return_type, int_type)) + pedwarn("return type of `%s' is not `int'", name); + + /* Just being "bug"-compatible w/ GCC here */ + if (!type_function_oldstyle(function_type)) + { + typelist_scanner scanargs; + type argtype; + int argct = 0; + + typelist_scan(type_function_arguments(function_type), &scanargs); + while ((argtype = typelist_next(&scanargs))) + { + ++argct; + switch (argct) + { + case 1: + if (!type_equal_unqualified(argtype, int_type)) + pedwarn("first argument of `%s' should be `int'", name); + break; + + case 2: + if (!is_doublecharstar(argtype)) + pedwarn("second argument of `%s' should be `char **'", + name); + break; + + case 3: + if (!is_doublecharstar(argtype)) + pedwarn("third argument of `%s' should probably be `char **'", + name); + break; + } + } + + /* It is intentional that this message does not mention the third + argument, which is warned for only pedantically, because it's + blessed by mention in an appendix of the standard. */ + if (argct > 0 && (argct < 2 || argct > 3)) + pedwarn("`%s' takes only zero or two arguments", name); + + if (argct == 3 && pedantic) + pedwarn("third argument of `%s' is deprecated", name); + + if (class == RID_STATIC) + pedwarn("`%s' is normally a non-static function", name); + } + } + + init_data_declaration(dd, fd, name, function_type); + dd->kind = decl_function; + dd->isexternalscope = FALSE; + if (nested) + dd->ftype = function_nested; + else if (class == RID_STATIC) + dd->ftype = function_static; + else if (class == RID_COMMAND) + dd->ftype = function_command; + else if (class == RID_EVENT) + dd->ftype = function_event; + else + { + dd->ftype = function_normal; + dd->isexternalscope = TRUE; + } + /* XXX: Should probably be FALSE for extern inline */ + dd->needsmemory = !isdeclaration; + dd->isinline = (scf & scf_inline) != 0; + dd->isexterninline = dd->isinline && class == RID_EXTERN; + dd->isfilescoperef = dd->isexterninline || isdeclaration; + if (scf & scf_async) + { + if (dd->ftype == function_command || dd->ftype == function_event) + dd->async = TRUE; + else + error("`async' is for commands and events only"); + } +} + +data_declaration declare_string(const char *name, cstring value, bool wide) +{ + struct data_declaration tempdecl; + expression expr_l = build_uint_constant(parse_region, dummy_location, size_t_type, value.length + 1); + type value_type = make_array_type(wide ? wchar_type : char_type, expr_l); + + init_data_declaration(&tempdecl, new_error_decl(parse_region, dummy_location), + name, value_type); + tempdecl.kind = decl_magic_string; + tempdecl.needsmemory = TRUE; + tempdecl.in_system_header = TRUE; + tempdecl.vtype = variable_static; + tempdecl.schars = value; + + return declare(current.env, &tempdecl, TRUE); +} + +static void declare_magic_string(const char *name, const char *value) +{ + declare_string(name, str2cstring(parse_region, value), FALSE); +} + +bool builtin_declaration(data_declaration dd) +/* Returns: TRUE if dd is a declaration for something builtin (i.e., + starts with __builtin_ +*/ +{ + return strncmp(dd->name, "__builtin_", 10) == 0; +} + +data_declaration declare_builtin_type(const char *name, type t) +{ + struct data_declaration tempdecl; + + init_data_declaration(&tempdecl, new_error_decl(parse_region, dummy_location), + name, t); + tempdecl.kind = decl_typedef; + tempdecl.in_system_header = TRUE; + + return declare(current.env, &tempdecl, TRUE); +} + +static tag_declaration make_anonymous_struct(void) +{ + tag_ref tref = newkind_tag_ref(parse_region, kind_struct_ref, dummy_location, + NULL, NULL, NULL, TRUE); + + return declare_global_tag(tref); +} + +static void declare_builtin_types(void) +{ + builtin_va_list_type = + make_pointer_type(make_tagged_type(make_anonymous_struct())); + declare_builtin_type("__builtin_va_list", builtin_va_list_type); +} + +static data_declaration declare_builtin(const char *name, data_kind kind, type t) +{ + struct data_declaration tempdecl; + + init_data_declaration(&tempdecl, new_error_decl(parse_region, dummy_location), + name, t); + tempdecl.kind = kind; + tempdecl.needsmemory = TRUE; + tempdecl.in_system_header = TRUE; + tempdecl.vtype = variable_static; + + return declare(global_env, &tempdecl, TRUE); +} + +data_declaration declare_builtin_identifier(const char *name, type t) +{ + return declare_builtin(name, decl_variable, t); +} + +data_declaration declare_builtin_function(const char *name, type t) +{ + return declare_builtin(name, decl_function, t); +} + +static void declare_builtin_identifiers(void) +{ + typelist emptylist = new_typelist(parse_region); + type default_function_type = make_function_type(int_type, emptylist, FALSE, TRUE); + + /* Use = as a suffix for this "dummy" identifier (used in function_call + nodes that represent calls to __builtin_va_arg) */ + builtin_va_arg_decl = declare_builtin_identifier("=va_arg", int_type); + + builtin_constant_p = + declare_builtin_function("__builtin_constant_p", default_function_type); +} + +static void declare_function_name(void) +{ + const char *name, *printable_name; + + if (current.function_decl == NULL) + { + name = ""; + printable_name = "top level"; + } + else + { + name = current.function_decl->ddecl->name; + printable_name = name; + } + + declare_magic_string("__FUNCTION__", name); + declare_magic_string("__PRETTY_FUNCTION__", printable_name); +} + +static void error_assert(bool ok) +{ + if (!ok) + { + error("confused by earlier errors - bailing out"); + exit(FATAL_EXIT_CODE); + } +} + +static void detect_bogus_env(void) +{ + /* We should not come here with the current env as parm level and not + in a function. If we do, it's because the error recovery productions + failed to pop some levels. So do it now. */ + while (!current.function_decl && current.env->parm_level) + { + /* This should only be possible after a (parse) error. Ensure that + we aren't confused... */ + assert(errorcount > 0); + poplevel(); + } + +} + +/* Start definition of function 'elements d' with attributes attribs. + nested is true for nested function definitions. + Returns false in case of error. + Sets current.function_decl to the declaration for this function */ +bool start_function(type_element elements, declarator d, attribute attribs, + bool nested) +{ + int class; + scflags scf; + const char *name, *intf; + type function_type, actual_function_type; + bool defaulted_int, old_decl_has_prototype, normal_function; + data_declaration old_decl, ddecl; + function_decl fdecl; + function_declarator fdeclarator; + struct data_declaration tempdecl; + env_scanner scan; + const char *id; + void *idval; + dd_list doc_tags = NULL; + dd_list extra_attr; + + detect_bogus_env(); + + if (!nested) + error_assert(current.env->global_level && current.function_decl == NULL); + + parse_declarator(elements, d, FALSE, TRUE, &class, &scf, + &intf, &name, &function_type, &defaulted_int, &fdeclarator, + &extra_attr); + + actual_function_type = type_generic(function_type) ? + type_function_return_type(function_type) : function_type; + + if (!type_functional(actual_function_type)) + return FALSE; + + /* We don't set current.function_decl yet so that error messages do not + say "In function " as we're not "in" the function yet */ + fdecl = new_function_decl(parse_region, d->location, d, elements, attribs, + NULL, NULL, current.function_decl, NULL); + fdecl->declared_type = function_type; + fdecl->undeclared_variables = new_env(parse_region, NULL); + fdecl->current_loop = NULL; + + if (class == RID_AUTO) + { + if (pedantic || !nested) + pedwarn("function definition declared `auto'"); + class = 0; + } + else if (class == RID_REGISTER) + { + error("function definition declared `register'"); + class = 0; + } + else if (class == RID_TYPEDEF) + { + error("function definition declared `typedef'"); + class = 0; + } + else if (class == RID_EXTERN && nested) + { + error("nested function `%s' declared `extern'", name); + class = 0; + } + else if ((class == RID_STATIC || scf & scf_inline) && nested) + { + if (pedantic) + pedwarn("invalid storage class for function `%s'", name); + class = 0; + } + + if (class == RID_COMMAND || class == RID_EVENT || class == RID_TASK) + { + if (nested) + { + error("commands, events or tasks cannot be nested"); + class = 0; + } + else if (current.language == l_c) + { + error("commands, events or tasks not allowed in C files"); + class = 0; + } + } + + if (fdeclarator->gparms && !(class == RID_COMMAND || class == RID_EVENT)) + { + error("generic parameters only allowed on commands and events"); + fdeclarator->gparms = NULL; + } + + if (!type_void(type_function_return_type(actual_function_type)) && + type_incomplete(type_function_return_type(actual_function_type))) + { + type t; + + error("return-type is an incomplete type"); + + /* Yuck */ + t = make_function_type(void_type, + type_function_arguments(actual_function_type), + type_function_varargs(actual_function_type), + type_function_oldstyle(actual_function_type)); + if (type_generic(function_type)) + t = make_generic_type(t, type_function_arguments(function_type)); + + function_type = qualify_type1(t, function_type); + } + + check_function(&tempdecl, CAST(declaration, fdecl), class, scf, + name, function_type, nested, FALSE, defaulted_int); + tempdecl.definition = tempdecl.ast; + if (current.container) + tempdecl.safe = current.container->safe; + + handle_decl_attributes(attribs, &tempdecl); + handle_decl_dd_attributes(extra_attr, &tempdecl); + + if (intf) + { + data_declaration iref = lookup_id(intf, FALSE); + + old_decl = NULL; + if (!iref || iref->kind != decl_interface_ref) + error("unknown interface `%s'", intf); + else + { + old_decl = interface_lookup(iref, name); + if (!old_decl) + error("`%s' is not in interface `%s'", name, intf); + } + } + else if (class == RID_COMMAND || class == RID_EVENT) + { + old_decl = lookup_id(name, FALSE); + if (!old_decl) + error("unknown command or event `%s'", name); + } + else + old_decl = lookup_id(name, !tempdecl.Cname); + + if (old_decl) + { + if (((class == RID_COMMAND || class == RID_EVENT) && !old_decl->defined) + ^ ((scf & scf_default) != 0)) + { + if (scf & scf_default) + { + error("`%s' is defined, not used, in this component", name); + error("(default implementations are only for used commands or events)"); + } + else + error("`%s' is used, not defined, in this component", name); + } + } + else + scf &= ~scf_default; + + old_decl_has_prototype = old_decl && old_decl->kind == decl_function && + !type_function_oldstyle(old_decl->type); + + normal_function = !nested && class != RID_STATIC; + /* Optionally warn of old-fashioned def with no previous prototype. */ + if (warn_strict_prototypes + && type_function_oldstyle(function_type) + && !old_decl_has_prototype) + warning("function declaration isn't a prototype"); + /* Optionally warn of any global def with no previous prototype. */ + else if (warn_missing_prototypes + && normal_function && !old_decl_has_prototype + && strcmp("main", name)) + warning("no previous prototype for `%s'", name); + /* Optionally warn of any def with no previous prototype + if the function has already been used. */ + else if (warn_missing_prototypes + && old_decl && old_decl->ftype == function_implicit) + warning("`%s' was used with no prototype before its definition", name); + /* Optionally warn of any global def with no previous declaration. */ + else if (warn_missing_declarations + && normal_function && !old_decl && strcmp("main", name)) + warning("no previous declaration for `%s'", name); + /* Optionally warn of any def with no previous declaration + if the function has already been used. */ + else if (warn_missing_declarations + && old_decl && old_decl->ftype == function_implicit) + warning("`%s' was used with no declaration before its definition", name); + + /* If return types match and old declaraton has a prototype and new + declaration hasn't, borrow the prototype. We will check for errors + in store_parm_decls. */ + if (old_decl_has_prototype && type_function_oldstyle(function_type) && + type_compatible(type_function_return_type(old_decl->type), + type_function_return_type(function_type))) + { + function_type = qualify_type1 + (make_function_type(type_function_return_type(function_type), + type_function_arguments(old_decl->type), + type_function_varargs(old_decl->type), + FALSE), old_decl->type); + + tempdecl.type = function_type; + } + + if (old_decl && duplicate_decls(&tempdecl, old_decl, FALSE, FALSE)) + { + ddecl = old_decl; + /* Safety annotation from implementation is the only one that counts */ + ddecl->safe = tempdecl.safe; + } + else + ddecl = declare(current.env, &tempdecl, FALSE); + + fdecl->base_labels = fdecl->scoped_labels = + new_env(parse_region, + current.function_decl ? current.function_decl->scoped_labels : NULL); + fdecl->ddecl = ddecl; + fdecl->fdeclarator = fdeclarator; + + get_latest_docstring(&ddecl->doc, current.fileregion, &doc_tags); + handle_fdecl_doc_tags(ddecl->doc.loc, ddecl, fdeclarator, doc_tags); + + /* If requested, replace post/task by references to an interface */ + if (type_task(ddecl->type) && flag_use_scheduler) + handle_task_definition(fdecl); + + /* save environments */ + current.env = fdeclarator->env; + current.env->fdecl = current.function_decl = fdecl; + + /* Set id of parameters (done here rather than in declare because parameters + of a given function may be declared several times) */ + env_scan(current.env->id_env, &scan); + while (env_next(&scan, &id, &idval)) + { + data_declaration iddecl = idval; + + if (iddecl->kind == decl_variable) + { + assert(iddecl->isparameter); + iddecl->id = current.function_decl->nlocals++; + } + } + + return TRUE; +} + +void implicit_decl_warning(data_declaration ddecl) +{ + if (builtin_declaration(ddecl)) + return; + + if (current.language != l_c || mesg_implicit_function_declaration == 2) + error("implicit declaration of function `%s'", ddecl->name); + else if (mesg_implicit_function_declaration == 1) + warning("implicit declaration of function `%s'", ddecl->name); +} + +data_declaration implicitly_declare(identifier fnid) +{ + struct data_declaration tempdecl; + declaration pseudo_ast = + CAST(declaration, new_implicit_decl(parse_region, fnid->location, fnid)); + + init_data_declaration(&tempdecl, pseudo_ast, + fnid->cstring.data, implicit_function_type); + tempdecl.kind = decl_function; + tempdecl.isexternalscope = TRUE; + tempdecl.isfilescoperef = TRUE; + tempdecl.ftype = function_implicit; + /* Point to the limbo version of any previous implicit declaration */ + tempdecl.shadowed = lookup_global_id(tempdecl.name); + + if (!tempdecl.shadowed) /* warn once only */ + implicit_decl_warning(&tempdecl); + + return declare(current.env, &tempdecl, FALSE); +} + +/* Declare parameters, either from new style declarations in the + declarator, or from old_parms */ +void store_parm_decls(declaration old_parms) +{ + if (!oldstyle_function(current.function_decl)) + { + /* This case is when the function was defined with an ANSI prototype. + The parms already have decls, so we need not do anything here + except record them as in effect + and complain if any redundant old-style parm decls were written. */ + if (old_parms) + error_with_decl(CAST(declaration, current.function_decl), + "parm types given both in parmlist and separately"); + } + else + { + oldidentifier_decl parm, parms; + + current.function_decl->old_parms = old_parms; + /* Need to either: + - compare arg types to previous prototype + - or build pseudo-prototype for this function + */ + parms = CAST(oldidentifier_decl, + current.function_decl->fdeclarator->parms); + scan_oldidentifier_decl (parm, parms) + /* If no declaration given, default to int. */ + if (parm->ddecl->type == void_type) + { + parm->ddecl->type = int_type; + if (extra_warnings) + warning_with_decl(CAST(declaration, parm), + "type of `%s' defaults to `int'", + parm->cstring.data); + } + } + + /* Declare __FUNCTION__ and __PRETTY_FUNCTION__ for this function. */ + declare_function_name(); +} + +/* End definition of current function, furnishing it it's body. */ +declaration finish_function(statement body) +{ + declaration fn = CAST(declaration, current.function_decl); + + current.function_decl->stmt = body; + error_assert(current.env->parm_level); + poplevel(); /* Pop parameter level */ + check_labels(); + current.function_decl = current.function_decl->parent_function; + + return fn; +} + +/* Start a new scope */ +void pushlevel(bool parm_level) +{ + current.env = new_environment(parse_region, current.env, FALSE, parm_level); +} + +/* Pop back to enclosing scope */ +environment poplevel(void) +{ + environment old = current.env; + + current.env = current.env->parent; + + return old; +} + +void push_label_level(void) +{ + current.function_decl->scoped_labels = + new_env(parse_region, current.function_decl->scoped_labels); +} + +void pop_label_level(void) +{ + check_labels(); + current.function_decl->scoped_labels = + env_parent(current.function_decl->scoped_labels); + assert(current.function_decl->scoped_labels); +} + +void declarator_name(declarator d, const char **oname, const char **iname) +{ + *oname = *iname = NULL; + while (d) + { + switch (d->kind) + { + case kind_identifier_declarator: + *oname = CAST(identifier_declarator, d)->cstring.data; + return; + case kind_interface_ref_declarator: + *iname = CAST(interface_ref_declarator, d)->word1->cstring.data; + /* fall through */ + default: + d = CAST(nested_declarator, d)->declarator; + break; + } + } +} + +const char *nice_declarator_name(declarator d) +/* Returns: a user-friendly name for declarator d, allocated in + current.fileregion if necessary +*/ +{ + const char *name, *iname; + + declarator_name(d, &name, &iname); + if (!name) + return "type name"; + else if (iname) + return make_intf_printname(iname, name); + else + return name; +} + +dd_list check_parameter(data_declaration dd, + type_element elements, variable_decl vd) +/* Returns: Attributes found while parsing the declarator */ +{ + int class; + scflags scf; + const char *name, *printname; + bool defaulted_int; + type parm_type; + dd_list extra_attr; + + parse_declarator(elements, vd->declarator, FALSE, FALSE, + &class, &scf, NULL, &name, &parm_type, + &defaulted_int, NULL, &extra_attr); + vd->declared_type = parm_type; + printname = name ? name : "type name"; + + /* Storage class checks */ + if (class && class != RID_REGISTER) + { + error("storage class specified for parameter `%s'", printname); + class = 0; + } + + check_variable_scflags(scf, vd->location, "parameter", printname); + + /* A parameter declared as an array of T is really a pointer to T. + One declared as a function is really a pointer to a function. */ + if (type_array(parm_type)) + /* Transfer const-ness of array into that of type pointed to. */ + parm_type = + make_pointer_type(qualify_type1(type_array_of(parm_type), parm_type)); + else if (type_function(parm_type)) + parm_type = make_pointer_type(parm_type); + + init_data_declaration(dd, CAST(declaration, vd), name, parm_type); + dd->kind = decl_variable; + dd->definition = dd->ast; + dd->isexternalscope = FALSE; + dd->isfilescoperef = FALSE; + dd->needsmemory = FALSE; + dd->isused = TRUE; + dd->vtype = class == RID_REGISTER ? variable_register : variable_normal; + dd->islocal = dd->isparameter = TRUE; + dd->norace = (scf & scf_norace) != 0; + + return extra_attr; +} + +static bool error_signature(type fntype) +/* Returns: TRUE if fntype is the "error in function declaration" + type signature (varargs with one argument of type error_type) +*/ +{ + typelist tl; + typelist_scanner stl; + + if (!type_function_varargs(fntype)) + return FALSE; + + tl = type_function_arguments(fntype); + + if (!tl || empty_typelist(tl)) + return FALSE; + + typelist_scan(tl, &stl); + return typelist_next(&stl) == error_type && !typelist_next(&stl); +} + +/* Start definition of variable 'elements d' with attributes attributes, + asm specification astmt. + If initialised is true, the variable has an initialiser. + Returns the declaration for the variable. +*/ +declaration start_decl(declarator d, asm_stmt astmt, type_element elements, + bool initialised, attribute attributes) +{ + variable_decl vd = + new_variable_decl(parse_region, d->location, d, attributes, NULL, + astmt, NULL); + dd_list extra_attr; + struct data_declaration tempdecl; + data_declaration ddecl = NULL, old_decl; + dd_list doc_tags = NULL; + + detect_bogus_env(); + + if (current.env->parm_level) + { + extra_attr = check_parameter(&tempdecl, elements, vd); + + handle_decl_attributes(attributes, &tempdecl); + handle_decl_dd_attributes(extra_attr, &tempdecl); + + if (type_void(tempdecl.type)) + { + error("parameter `%s' declared void", tempdecl.name); + tempdecl.type = int_type; + } + + /* Update environment for old-style declarations only if function + doesn't have a prototype. We will report an error message later + for arguments specified for functions with prototypes. */ + if (oldstyle_function(current.function_decl)) + { + /* Traditionally, a parm declared float is actually a double. */ + if (flag_traditional && + type_equal_unqualified(tempdecl.type, float_type)) + tempdecl.type = qualify_type1(double_type, tempdecl.type); + + old_decl = lookup_id(tempdecl.name, TRUE); + + if (old_decl && duplicate_decls(&tempdecl, old_decl, FALSE, FALSE)) + { + /* Don't allow more than one "real" duplicate + of a forward parm decl. */ + ddecl = old_decl; + ddecl->type = tempdecl.type; + ddecl->ast = CAST(declaration, vd); + ddecl->isused = TRUE; + } + else + { + error("declaration for parameter `%s' but no such parameter", + tempdecl.name); + ddecl = declare(current.env, &tempdecl, FALSE); + } + } + else + /* Make a dummy decl to keep everyone happy */ + ddecl = declare(current.env, &tempdecl, FALSE); + + if (initialised) + error("parameter `%s' is initialized", + vd->ddecl ? vd->ddecl->name : "type name"); + } + else + { + int class; + scflags scf; + const char *name, *printname; + bool defaulted_int; + type var_type; + bool different_binding_level = FALSE; + function_declarator fdeclarator = NULL; + + parse_declarator(elements, d, FALSE, FALSE, + &class, &scf, NULL, &name, &var_type, + &defaulted_int, &fdeclarator, &extra_attr); + vd->declared_type = var_type; + printname = name ? name : "type name"; + + if (current.language == l_interface) + { + if (!(type_command(var_type) || type_event(var_type))) + { + error("only commands and events can be defined in interfaces"); + class = RID_COMMAND; + var_type = dummy_function_type; + fdeclarator = dummy_function_declarator; + } + } + else if (current.language == l_component) + { + if (type_command(var_type) || type_event(var_type)) + { + if (current.spec_section == spec_normal) + error("commands/events must be provided or used"); + } + else if (class == RID_TYPEDEF) + { + if (current.spec_section != spec_normal) + error("typedefs cannot be provided or used"); + } + else + { + error("variables and functions cannot be declared in component specifications"); + var_type = error_type; + } + } + else if (current.language == l_implementation && + current.container->configuration) + { + if (class != RID_TYPEDEF) + error("only types and constants can be declared in configurations"); + } + else if (class == RID_COMMAND || class == RID_EVENT) + { + if (current.language == l_implementation) + error("commands or events can only be defined, not declared"); + else + error("commands or events not allowed in C files"); + class = 0; + } + + if (warn_implicit_int && defaulted_int && !type_function(var_type)) + warning("type defaults to `int' in declaration of `%s'", printname); + + init_data_declaration(&tempdecl, CAST(declaration, vd), name, var_type); + + /* The fun begins */ + + /* `extern' with initialization is invalid if not at top level. */ + if (class == RID_EXTERN && initialised) + { + if (current.env->global_level) + warning("`%s' initialized and declared `extern'", printname); + else + error("`%s' has both `extern' and initializer", printname); + } + + if (class == RID_AUTO && current.env->global_level) + { + error("top-level declaration of `%s' specifies `auto'", printname); + class = 0; + } + + if (class == RID_TYPEDEF) + { + /* typedef foo = bar means give foo the same type as bar. + We haven't parsed bar yet, so `finish_decl' will fix that up. + Any other case of an initialization in a TYPE_DECL is an error. */ + if (initialised && (pedantic || elements->next)) + error("typedef `%s' is initialized", printname); + + tempdecl.kind = decl_typedef; + tempdecl.definition = tempdecl.ast; + tempdecl.isexternalscope = FALSE; + tempdecl.isfilescoperef = FALSE; + tempdecl.needsmemory = FALSE; + + /* XXX: should give errors for silly values of scf + (but gcc doesn't even complain about + inline typedef int foo;) */ + } + else if (type_functional(var_type) || type_generic(var_type)) + { + /* Note: type_generic here can only be for generic functions + (generic interfaces only show up in components), and use + declare_interface_ref */ + bool nested = !current.env->global_level && class == RID_AUTO; + + if (initialised) + error("function `%s' is initialized like a variable", + printname); + + if (class == RID_AUTO && pedantic) + pedwarn("invalid storage class for function `%s'", name); + if (class == RID_REGISTER) + { + error("invalid storage class for function `%s'", name); + class = 0; + } + /* Function declaration not at top level. + Storage classes other than `extern' are not allowed + and `extern' makes no difference. */ + if (!current.env->global_level && pedantic + && (class == RID_STATIC || class == RID_INLINE)) + pedwarn("invalid storage class for function `%s'", name); + + if (fdeclarator && fdeclarator->gparms) + { + if (current.language == l_interface) + error("generic parameters not allowed in interfaces"); + else if (!(class == RID_COMMAND || class == RID_EVENT)) + error("generic parameters not allowed on functions"); + } + + if ((type_command(var_type) || type_event(var_type)) && + type_function_varargs(var_type) && !error_signature(var_type)) + error("varargs commands and events are not supported"); + + check_function(&tempdecl, CAST(declaration, vd), class, scf, + name, var_type, nested, TRUE, defaulted_int); + } + else + { + int extern_ref = !initialised && class == RID_EXTERN; + + if (type_void(var_type) && + !(class == RID_EXTERN || + (current.env->global_level && + !(class == RID_STATIC || class == RID_REGISTER)))) + { + error("variable `%s' declared void", printname); + var_type = int_type; + } + + /* It's a variable. */ + check_variable_scflags(scf, d->location, "variable", printname); +#if 0 + /* Don't allow initializations for incomplete types + except for arrays which might be completed by the initialization. */ + if (TYPE_SIZE (TREE_TYPE (decl)) != 0) + { + /* A complete type is ok if size is fixed. */ + + if (TREE_CODE (TYPE_SIZE (TREE_TYPE (decl))) != INTEGER_CST + || C_DECL_VARIABLE_SIZE (decl)) + { + error ("variable-sized object may not be initialized"); + initialised = 0; + } + } + else if (TREE_CODE (TREE_TYPE (decl)) != ARRAY_TYPE) + { + error ("variable `%s' has initializer but incomplete type", + IDENTIFIER_POINTER (DECL_NAME (decl))); + initialised = 0; + } + else if (TYPE_SIZE (TREE_TYPE (TREE_TYPE (decl))) == 0) + { + error ("elements of array `%s' have incomplete type", + IDENTIFIER_POINTER (DECL_NAME (decl))); + initialised = 0; + } +#endif + tempdecl.kind = decl_variable; + tempdecl.vtype = + class == RID_REGISTER ? variable_register : + class == RID_STATIC ? variable_static : + variable_normal; + tempdecl.isfilescoperef = extern_ref; + if (!extern_ref) + tempdecl.definition = tempdecl.ast; + if (current.env->global_level) + { + tempdecl.isexternalscope = + class != RID_STATIC && class != RID_REGISTER; + tempdecl.needsmemory = !extern_ref; + tempdecl.islocal = FALSE; + } + else + { + tempdecl.isexternalscope = extern_ref; + tempdecl.needsmemory = class == RID_STATIC; + tempdecl.islocal = !(extern_ref || class == RID_STATIC); + } + tempdecl.norace = (scf & scf_norace) != 0; + } + + if (warn_nested_externs && tempdecl.isfilescoperef && + !current.env->global_level && !tempdecl.in_system_header) + warning("nested extern declaration of `%s'", printname); + + handle_decl_attributes(attributes, &tempdecl); + handle_decl_dd_attributes(extra_attr, &tempdecl); + + old_decl = lookup_id(name, !tempdecl.Cname); + + if ((current.language == l_interface || current.language == l_component) + && current.env->global_level) + { + if (old_decl) + error("redefinition of `%s'", printname); + old_decl = NULL; + } + else if (!old_decl && tempdecl.isfilescoperef) + { + /* Check the global environment if declaring something with file + scope */ + old_decl = lookup_global_id(name); + /* global typedefs don't count */ + if (old_decl && old_decl->kind == decl_typedef) + old_decl = NULL; + if (old_decl) + different_binding_level = TRUE; + } + + if (old_decl && + duplicate_decls(&tempdecl, old_decl, different_binding_level, initialised)) + ddecl = old_decl; + else + ddecl = declare(current.env, &tempdecl, FALSE); + + ddecl->defined = current.spec_section == spec_provides; + } + assert(ddecl); + vd->ddecl = ddecl; + + /* If requested, replace post/task by references to an interface */ + if (type_task(ddecl->type) && flag_use_scheduler) + handle_task_declaration(vd); + + if (ddecl->kind == decl_typedef) + set_typedef_type(ddecl, ddecl->basetype != NULL); + + get_latest_docstring(&ddecl->doc, current.fileregion, &doc_tags); + handle_ddecl_doc_tags(ddecl->doc.loc, ddecl, doc_tags); + + return CAST(declaration, vd); +} + +/* Finish definition of decl, furnishing the optional initialiser init. + Returns decl */ +declaration finish_decl(declaration decl, expression init) +{ + variable_decl vd = CAST(variable_decl, decl); + data_declaration dd = vd->ddecl; + + vd->arg1 = init; + dd->initialiser = init; + + if (init) + { + if (dd->kind == decl_typedef) + dd->type = init->type; + else if (type_array(dd->type)) + { + /* Incomplete array types get their size from the initialiser + (this is set correctly for both strings and init_lists) */ + if (!type_array_size(dd->type)) + dd->type = init->type; + } + else if (type_network_base_type(dd->type)) + error_with_decl(decl, "initialisation of network base types not yet supported"); + } + /* Check for a size */ + if (type_array(dd->type)) + { + /* Don't you love gcc code? */ + int do_default + = (dd->needsmemory + /* Even if pedantic, an external linkage array + may have incomplete type at first. */ + ? pedantic && !dd->isexternalscope + : !dd->isfilescoperef); + + if (!type_array_size(dd->type)) + { + if (do_default) + error_with_decl(decl, "array size missing in `%s'", + decl_printname(dd)); + /* This is what gcc has to say about the next line + (see comment/question above): + If a `static' var's size isn't known, + make it extern as well as static, so it does not get + allocated. + If it is not `static', then do not mark extern; + finish_incomplete_decl will give it a default size + and it will get allocated. */ + else if (!pedantic && dd->needsmemory && !dd->isexternalscope) + dd->isfilescoperef = 1; + } + } + + if (is_module_local_static(dd) && use_nido) + dd_add_last(regionof(current.container->local_statics), + current.container->local_statics, dd); + + return decl; +} + +/* Create definition of function parameter 'elements d' with attributes + attributes. + Returns the declaration for the parameter. +*/ +declaration declare_parameter(declarator d, type_element elements, + attribute attributes) +{ + /* There must be at least a declarator or some form of type specification */ + location l = + d ? d->location : elements->location; + variable_decl vd = + new_variable_decl(parse_region, l, d, attributes, NULL, NULL, NULL); + data_decl dd = + new_data_decl(parse_region, l, elements, CAST(declaration, vd)); + data_declaration ddecl = NULL, old_decl = NULL; + struct data_declaration tempdecl; + dd_list extra_attr; + + extra_attr = check_parameter(&tempdecl, elements, vd); + + if (tempdecl.name) + old_decl = lookup_id(tempdecl.name, TRUE); + + if (old_decl && duplicate_decls(&tempdecl, old_decl, FALSE, FALSE)) + { + /* Don't allow more than one "real" duplicate + of a forward parm decl. */ + ddecl = old_decl; + ddecl->isused = TRUE; + } + else if (!type_void(tempdecl.type)) + ddecl = declare(current.env, &tempdecl, FALSE); + + if (ddecl) + { + /* Forward transparent union property from union to parameter */ + if (type_union(ddecl->type) && type_tag(ddecl->type)->transparent_union) + transparent_union_argument(ddecl); + + handle_decl_attributes(attributes, ddecl); + handle_decl_dd_attributes(extra_attr, ddecl); + } + else + { + ignored_dd_attributes(extra_attr); + ignored_attributes(attributes); + } + + vd->ddecl = ddecl; + + return CAST(declaration, dd); +} + +void allow_parameter_redeclaration(declaration parms, bool mark_forward) +{ + declaration parm; + + /* We could walk the parameter env instead, but this will break some code + I'm currently writing... */ + + scan_declaration (parm, parms) + if (is_data_decl(parm)) /* skip errors */ + { + data_decl pd = CAST(data_decl, parm); + variable_decl vd = CAST(variable_decl, pd->decls); + + if (mark_forward) + vd->forward = TRUE; + if (vd->ddecl) + { + vd->ddecl->isused = FALSE; + /* This being non-NULL is used to detect redeclarations + in handle_fdecl_doc_tags - it being non-NULL is an indication + that we're not working on a "fresh" (just-parsed) AST */ + assert(vd->ddecl->ast->parent == NULL); + } + } +} + +declaration declare_old_parameter(location l, cstring id) +{ + oldidentifier_decl d = new_oldidentifier_decl(parse_region, l, id, NULL); + data_declaration ddecl; + + if ((ddecl = lookup_id(id.data, TRUE))) + error("duplicate parameter name `%s' in parameter list", id.data); + else + { + struct data_declaration tempdecl; + + /* The void type indicates that this is an old-style declaration */ + /* Note that isused is left FALSE to allow one declaration */ + init_data_declaration(&tempdecl, CAST(declaration, d), id.data, + void_type); + tempdecl.kind = decl_variable; + tempdecl.definition = tempdecl.ast; + tempdecl.isexternalscope = FALSE; + tempdecl.isfilescoperef = FALSE; + tempdecl.needsmemory = FALSE; + tempdecl.vtype = variable_normal; + tempdecl.islocal = tempdecl.isparameter = TRUE; + ddecl = declare(current.env, &tempdecl, FALSE); + } + d->ddecl = ddecl; + + return CAST(declaration, d); +} + +/* Start definition of struct/union (indicated by skind) type tag. */ +type_element start_struct(location l, AST_kind skind, word tag) +{ + tag_ref tref = newkind_tag_ref(parse_region, skind, l, tag, NULL, NULL, TRUE); + tag_declaration tdecl = tag ? lookup_tag(tref, TRUE) : NULL; + + pending_xref_error(); + + if (tdecl && tdecl->kind == skind) + { + if (tdecl->defined || tdecl->being_defined) + { + error("redefinition of `%s %s'", + tagkind_name(skind), tag->cstring.data); + tdecl = declare_tag(tref); + } + } + else + tdecl = declare_tag(tref); + + tref->tdecl = tdecl; + tdecl->definition = tref; + tdecl->being_defined = TRUE; + tdecl->packed |= flag_pack_struct; + + return CAST(type_element, tref); +} + +static field_declaration *declare_field(tag_declaration tdecl, + field_declaration fdecl, + location floc, + field_declaration *nextfield) +{ + type field_type = fdecl->type; + const char *name = fdecl->name; + + fdecl->containing_tag = tdecl; + + if (!tdecl->fields_const) + { + type base_field_type = type_base(field_type); + if (type_const(base_field_type) || + ((type_struct(base_field_type) || type_union(base_field_type)) && + type_tag(base_field_type)->fields_const)) + tdecl->fields_const = TRUE; + } + + /* XXX: Surely we should do the same as for const here ? */ + if (type_volatile(field_type)) + tdecl->fields_volatile = TRUE; + + if (name) + { + if (env_lookup(tdecl->fields, name, TRUE)) + error_with_location(floc, "duplicate member `%s'", name); + env_add(tdecl->fields, name, fdecl); + } + +#if 0 + fdecl->next = NULL; +#endif + + *nextfield = fdecl; + return &fdecl->next; +} + +cval check_bitfield_width(field_declaration fdecl) +{ + expression w = fdecl->ast->arg1; + known_cst cwidth = w->cst; + cval bitwidth = cval_top; + bool printmsg; + const char *errormsg = NULL; + + printmsg = check_constant_once(w, cst_numerical); + + if (cwidth && constant_unknown(cwidth)) + bitwidth = cval_unknown_number; + else if (!(cwidth && constant_integral(cwidth))) + errormsg = "bit-field `%s' width not an integer constant"; + else + { + largest_uint width = constant_uint_value(cwidth); + + if (pedantic && printmsg) + constant_overflow_warning(cwidth); + + /* Detect and ignore out of range field width. */ + if (!type_unsigned(cwidth->type) && constant_sint_value(cwidth) < 0) + errormsg = "negative width in bit-field `%s'"; + else if (width > type_size_int(fdecl->type) * BITSPERBYTE) + errormsg = "width of `%s' exceeds its type"; + else if (width == 0 && fdecl->name) + errormsg = "zero width for bit-field `%s'"; + else + bitwidth = cval_cast(cwidth->cval, size_t_type); + } + + if (printmsg && errormsg) + error_with_location(w->location, errormsg, nice_field_name(fdecl->name)); + + return bitwidth; +} + +static bool is_nx_tag(tag_declaration tdecl) +{ + return tdecl->kind == kind_nx_struct_ref || tdecl->kind == kind_nx_union_ref; +} + +/* Finish definition of struct/union furnishing the fields and attribs. + Computes size and alignment of struct/union (see ASSUME: comments). + Returns t */ +void layout_struct(tag_declaration tdecl) +{ + cval offset, alignment, size; + bool isunion = tdecl->kind == kind_union_ref || tdecl->kind == kind_nx_union_ref; + field_declaration fdecl; + declaration dlist; + field_decl flist; + bool isnetwork = is_nx_tag(tdecl); + bool lastbitfield_be = FALSE; + + offset = size = make_type_cval(0); + alignment = cval_bitsperbyte; + + // We scan all the fields of the struct (field), but we also need to scan + // the declaration of the struct to handle anonymous struct/union + // boundaries (maybe we should have saved markers?). To do the latter, + // we use fdecl/flist, where flist is the "current" list of fields + // (corresponding to, e.g., `int x, y, z;' in a struct) and fdecl is + // the declaration following the one being used in flist + + /* ASSUME: This code attempts to replicate gcc's struct layout rules for + the target, based on it's pcc_bitfield_type_matters, + structure_size_boundary and empty_field_boundary fields. See the gcc + internal (`info gccint') documentation for the meaning of these + fields. + */ + fdecl = tdecl->fieldlist; + dlist = tdecl->definition->fields; + flist = NULL; + for (;;) + { + cval fsize, falign; + + // Get the next data_decl in the struct + if (!flist) + { + data_decl decl; + + if (!dlist) + break; + + decl = CAST(data_decl, ignore_extensions(dlist)); + dlist = CAST(declaration, dlist->next); + + // Is this a struct/union we should merge in? + if (decl->decls) + flist = CAST(field_decl, decl->decls); // No. + else + { + tag_declaration anon_tdecl = get_unnamed_tag_decl(decl); + field_declaration anon_field; + + // No? + if (!anon_tdecl || !anon_tdecl->defined || anon_tdecl->name) + continue; + + // Yes. Get size, alignment of struct/union + fsize = cval_times(anon_tdecl->size, cval_bitsperbyte); + falign = cval_times(anon_tdecl->alignment, cval_bitsperbyte); + + /* Adjust copied anonymous fields */ + offset = cval_align_to(offset, falign); + for (anon_field = anon_tdecl->fieldlist; anon_field; + anon_field = anon_field->next, fdecl = fdecl->next) + fdecl->offset = cval_add(anon_field->offset, offset); + } + } + + if (flist) + { + /* decode field_decl field */ + type field_type = fdecl->type; + cval bitwidth = cval_top; + + if (flist->arg1) + bitwidth = check_bitfield_width(fdecl); + + /* Check for network type fields in network structures once + the type is known. Avoid duplicate error messages. */ + if (isnetwork && !flist->type_checked && !type_variable(field_type)) + { + flist->type_checked = TRUE; + if (!type_network(field_type)) + error_with_location(flist->location, "field `%s' must be a network type", + fdecl->name); + } + + fdecl->bitwidth = bitwidth; + + if (type_size_cc(field_type)) + fsize = cval_times(type_size(field_type), cval_bitsperbyte); + else + fsize = cval_top; + + /* don't care about alignment if no size (type_incomplete(field_type) + is true, so we got an error above */ + if (fdecl->packed || tdecl->packed) + falign = cval_bitsperbyte; + else + falign = cval_times + (type_has_size(field_type) ? type_alignment(field_type) : cval_top, + cval_bitsperbyte); + + if (target->adjust_field_align && !type_realigned(field_type)) + falign = target->adjust_field_align(fdecl, falign); + + if (cval_istop(bitwidth)) /* regular field */ + offset = cval_align_to(offset, falign); + else if (cval_isunknown(bitwidth)) + { + if (!cval_istop(offset)) + offset = cval_unknown_number; + } + else if (!cval_boolvalue(bitwidth)) /* ie, 0 */ + { + if (target->pcc_bitfield_type_matters || isnetwork) + { + offset = cval_align_to(offset, falign); + falign = make_type_cval(1); /* No structure alignment implications */ + } + else + { + /* I'm not to blame for gcc's weirdness. */ + if (!type_realigned(field_type)) + falign = make_type_cval(1); + falign = cval_lcm(falign, make_cval_unsigned(target->empty_field_boundary, size_t_type)); + offset = cval_align_to(offset, falign); + } + fsize = bitwidth; + } + else + { + assert(cval_intcompare(bitwidth, cval_zero) > 0); + if (target->pcc_bitfield_type_matters && !isnetwork) + { + /* skip to next unit on crossing falign-sized boundary. + align struct to falign (note the inconsistency with + the 0-width bitfield). */ + + /* This tests + ((offset + bitwidth + falign - 1) / falign - + offset / falign) > fsize / falign + */ + cval val1 = cval_sub(cval_add(cval_add(offset, bitwidth), + falign), + make_type_cval(1)); + cval val2 = cval_sub(cval_divide(val1, falign), + cval_divide(offset, falign)); + + // if falign or offset are top or unknown, this will + // contaminate val2 as appropriate + if (!cval_knownvalue(val2)) + offset = val2; + else if (cval_intcompare(val2, cval_divide(fsize, falign)) > 0) + offset = cval_align_to(offset, falign); + } + else + { + /* More network type bitfield fun: when switching between + big and little-endian bitfields, we align to the next + byte boundary (otherwise we could start filling bytes + from opposing ends, which would be very confusing) */ + if (isnetwork && type_network_base_type(field_type)) + { + bool isbe = type_networkdef(field_type)->isbe; + + if (isbe != lastbitfield_be) + offset = cval_align_to(offset, cval_bitsperbyte); + lastbitfield_be = isbe; + } + + // more gcc fun + if (type_realigned(field_type)) + offset = cval_align_to(offset, falign); + else // don't align, don't affect struct alignment + falign = cval_bitsperbyte; + } + + fsize = bitwidth; + } + + fdecl->offset = offset; + + flist = CAST(field_decl, flist->next); + fdecl = fdecl->next; + } + + if (!isunion) + { + offset = cval_add(offset, fsize); + size = offset; + } + else + size = cval_max(fsize, size); + + alignment = cval_lcm(alignment, falign); + } + if (!isnetwork) + alignment = cval_lcm(alignment, make_cval_unsigned(target->structure_size_boundary, size_t_type)); + if (!cval_istop(tdecl->user_alignment)) + alignment = cval_lcm(alignment, cval_times(tdecl->user_alignment, cval_bitsperbyte)); + + tdecl->size = cval_divide(cval_align_to(size, alignment), cval_bitsperbyte); + tdecl->alignment = cval_divide(alignment, cval_bitsperbyte); +} + +/* Finish definition of struct/union furnishing the fields and attribs. + Computes size and alignment of struct/union (see ASSUME: comments). + Returns t */ +type_element finish_struct(type_element t, declaration fields, + attribute attribs) +{ + tag_ref s = CAST(tag_ref, t); + tag_declaration tdecl = s->tdecl; + bool hasmembers = FALSE; + field_declaration *nextfield = &tdecl->fieldlist; + declaration fdecl; + bool isnetwork = is_nx_tag(tdecl); + + s->fields = fields; + s->attributes = attribs; + handle_tag_attributes(attribs, tdecl); + tdecl->fields = new_env(parse_region, NULL); + + scan_declaration (fdecl, fields) + { + /* Get real list of fields */ + data_decl flist = CAST(data_decl, ignore_extensions(fdecl)); + field_decl field; + + if (!flist->decls) /* possibly a struct/union we should merge in */ + { + tag_declaration anon_tdecl = get_unnamed_tag_decl(flist); + field_declaration anon_field; + location floc = flist->location; + + if (!anon_tdecl) + error_with_location(floc, + "unnamed fields of type other than struct or union are not allowed"); + else if (!anon_tdecl->defined) + error_with_location(floc, "anonymous field has incomplete type"); + else if (anon_tdecl->name) + warning_with_location(floc, "declaration does not declare anything"); + else if (isnetwork && !is_nx_tag(anon_tdecl)) + error_with_location(floc, "field `%s' must be a network type", + nice_field_name(NULL)); + else + { + /* Process alignment to this struct/union in "main" loop below */ + anon_tdecl->collapsed = TRUE; + + /* Copy fields */ + for (anon_field = anon_tdecl->fieldlist; anon_field; + anon_field = anon_field->next) + { + field_declaration fdecl = ralloc(parse_region, struct field_declaration); + + *fdecl = *anon_field; + fdecl->ast = NULL; + nextfield = declare_field(tdecl, fdecl, floc, nextfield); + if (fdecl->name) + hasmembers = TRUE; + } + } + } + else + scan_field_decl (field, CAST(field_decl, flist->decls)) + { + /* decode field_decl field */ + field_declaration fdecl; + type field_type; + const char *name; + int class; + scflags scf; + const char *printname; + bool defaulted_int; + type tmpft; + location floc = field->location; + dd_list extra_attr; + + fdecl = ralloc(parse_region, struct field_declaration); + + parse_declarator(flist->modifiers, field->declarator, + field->arg1 != NULL, FALSE, + &class, &scf, NULL, &name, &tmpft, + &defaulted_int, NULL, &extra_attr); + field_type = tmpft; + + /* Grammar doesn't allow scspec: */ + assert(scf == 0 && class == 0); + + printname = nice_field_name(name); + + /* Support "flexible arrays" (y[] as field member) -- + simply make the size 0 which we already handle */ + if (type_array(field_type) && !type_array_size(field_type)) + field_type = make_array_type(type_array_of(field_type), + build_zero(parse_region, dummy_location)); + + if (type_function(field_type)) + { + error_with_location(floc, "field `%s' declared as a function", printname); + field_type = make_pointer_type(field_type); + } + else if (type_void(field_type)) + { + error_with_location(floc, "field `%s' declared void", printname); + field_type = error_type; + } + else if (type_incomplete(field_type)) + { + error_with_location(floc, "field `%s' has incomplete type", printname); + field_type = error_type; + } + + fdecl->type = field_type; + handle_field_attributes(field->attributes, fdecl); + handle_field_dd_attributes(extra_attr, fdecl); + field_type = fdecl->type; /* attributes might change type */ + + if (field->arg1) + { + const char *errmsg = NULL; + + if (!type_integer(field_type)) + errmsg = "bit-field `%s' has invalid type"; + else if (!(type_integer(field->arg1->type))) + errmsg = "bit-field `%s' width not an integer constant"; + else if (type_network_base_type(field_type)) + { + if (!type_networkdef(field_type)->bf_encoder) + errmsg = "type of `%s' cannot be used as a bit-field"; + else if (!isnetwork) + errmsg = "bit-field `%s' of network type used inside non-network type"; + } + + if (errmsg) + { + error_with_location(floc, errmsg, printname); + field->arg1 = NULL; + } + } + + fdecl->ast = field; + field->fdecl = fdecl; + fdecl->name = name; + nextfield = declare_field(tdecl, fdecl, floc, nextfield); + if (name) + hasmembers = TRUE; + } + } + + if (pedantic && !is_attribute_ref(s) && !hasmembers) + pedwarn("%s has no %smembers", tagkind_name(s->kind), + (fields ? "named " : "")); + + tdecl->defined = TRUE; + tdecl->being_defined = FALSE; + + layout_struct(tdecl); + + return t; +} + +/* Return a reference to struct/union/enum (indicated by skind) type tag */ +type_element xref_tag(location l, AST_kind skind, word tag) +{ + tag_ref tref = newkind_tag_ref(parse_region, skind, l, tag, NULL, NULL, FALSE); + tag_declaration tdecl = lookup_tag(tref, FALSE); + + if (!tdecl) + tdecl = declare_tag(tref); + + tref->tdecl = tdecl; + + return CAST(type_element, tref); +} + +static known_cst last_enum_value; + +void layout_enum_start(tag_declaration tdecl) +{ + last_enum_value = NULL; +} + +void layout_enum_end(tag_declaration tdecl) +{ + declaration names = tdecl->definition->fields; + cval smallest, largest; + bool enum_isunsigned; + type type_smallest, type_largest, enum_reptype; + enumerator v, values = CAST(enumerator, names); + + /* Pick a representation type for this enum, if not already done. */ + if (tdecl->reptype && !type_unknown_int(tdecl->reptype)) + return; + + /* First, find largest and smallest values defined in this enum. */ + if (!names) + smallest = largest = cval_zero; + else + { + smallest = largest = value_of_enumerator(values); + + if (!cval_isunknown(smallest)) + scan_enumerator (v, CAST(enumerator, values->next)) + { + cval vv = value_of_enumerator(v); + + if (cval_isunknown(vv)) + { + smallest = vv; + break; + } + if (cval_intcompare(vv, largest) > 0) + largest = vv; + if (cval_intcompare(vv, smallest) < 0) + smallest = vv; + } + } + + if (cval_isunknown(smallest)) + enum_reptype = unknown_int_type; + else + { + /* Pick a type that will hold the smallest and largest values. */ + enum_isunsigned = cval_intcompare(smallest, cval_zero) >= 0; + type_smallest = type_for_cval(smallest, enum_isunsigned); + type_largest = type_for_cval(largest, enum_isunsigned); + assert(type_smallest); + if (!type_largest) + { + assert(!enum_isunsigned); + warning("enumeration values exceed range of largest integer"); + type_largest = long_long_type; + } + if (type_size_int(type_smallest) > type_size_int(type_largest)) + enum_reptype = type_smallest; + else + enum_reptype = type_largest; + + /* We use int as the enum type if that fits, except if both: + - the values fit in a (strictly) smaller type + - the packed attribute was specified + */ + if (cval_inrange(smallest, int_type) && cval_inrange(largest, int_type) && + !(tdecl->packed && type_size_int(enum_reptype) < type_size_int(int_type))) + enum_reptype = int_type; + } + + tdecl->reptype = enum_reptype; + tdecl->size = type_size(enum_reptype); + tdecl->alignment = type_alignment(enum_reptype); + + /* Change type of all enum constants to enum_reptype */ + scan_enumerator (v, values) + v->ddecl->value = cast_constant(v->ddecl->value, enum_reptype); +} + +known_cst layout_enum_value(enumerator e) +{ + const char *name = e->cstring.data; + expression value = e->arg1; + known_cst cst = NULL; + + // We're already done if we have a non-unknown type for e's value + if (e->ddecl && !type_unknown_int(e->ddecl->value->type)) + return e->ddecl->value; + + if (value) + { + cst = value->cst; + if (check_constant_once(value, cst_numerical)) + { + if (!value->cst || !constant_integral(value->cst)) + { + error("enumerator value for `%s' not integer constant", name); + cst = NULL; + } + } + } + + if (!cst) + { + /* Last value + 1 */ + if (last_enum_value) + { + /* No clear logic anywhere to specify which type we should use + (ANSI C must specify int, cf warning below) */ + type addtype = type_unsigned(last_enum_value->type) ? + unsigned_long_long_type : long_long_type; + + cst = fold_add(addtype, last_enum_value, onecst); + } + else + cst = zerocst; + } + + if (constant_integral(cst)) + { + if (pedantic && !cval_inrange(cst->cval, int_type)) + { + pedwarn("ANSI C restricts enumerator values to range of `int'"); + cst = zerocst; + } + + if (type_size_int(cst->type) < type_size_int(int_type)) + cst->type = + type_for_size(type_size(int_type), + flag_traditional && type_unsigned(cst->type)); + } + last_enum_value = cst; + + return cst; +} + +/* Start definition of struct/union (indicated by skind) type tag. */ +type_element start_enum(location l, word tag) +{ + enum_ref tref = new_enum_ref(parse_region, l, tag, NULL, NULL, TRUE); + tag_declaration tdecl = tag ? lookup_tag(tref, TRUE) : NULL; + + pending_xref_error(); + + if (tdecl && tdecl->kind == kind_enum_ref) + { + if (tdecl->defined) + error("redefinition of `enum %s'", tag->cstring.data); + } + else + tdecl = declare_tag(tref); + + tref->tdecl = tdecl; + tdecl->definition = tref; + tdecl->being_defined = TRUE; + tdecl->packed = flag_short_enums; + layout_enum_start(tdecl); + + return CAST(type_element, tref); +} + +/* Finish definition of enum furnishing the names and attribs. + Returns t */ +type_element finish_enum(type_element t, declaration names, + attribute attribs) +{ + tag_ref s = CAST(tag_ref, t); + tag_declaration tdecl = s->tdecl; + + s->fields = names; + s->attributes = attribs; + handle_tag_attributes(attribs, tdecl); + tdecl->fields = 0; + tdecl->defined = TRUE; + tdecl->being_defined = FALSE; + + layout_enum_end(tdecl); + + return t; +} + +declaration make_enumerator(location loc, cstring id, expression value) +{ + declaration ast; + struct data_declaration tempdecl; + data_declaration ddecl, old_decl; + environment env = current.env; + + if (value && !type_integer(value->type)) + { + error("enumerator value for `%s' not integer constant", id.data); + value = NULL; + } + + ast = CAST(declaration, new_enumerator(parse_region, loc, id, value, NULL)); + init_data_declaration(&tempdecl, ast, id.data, int_type); + tempdecl.kind = decl_constant; + tempdecl.definition = ast; + tempdecl.value = layout_enum_value(CAST(enumerator, ast)); + + if (current.language == l_interface) + { + error("only commands and events can be defined in interfaces"); + /* We don't want the symbol in the interface's env, so give + it it's own private home! */ + env = new_environment(parse_region, NULL, FALSE, FALSE); + } + + old_decl = env_lookup(env->id_env, id.data, TRUE); + + if (old_decl && duplicate_decls(&tempdecl, old_decl, FALSE, FALSE)) + ddecl = old_decl; + else + ddecl = declare(env, &tempdecl, FALSE); + + CAST(enumerator, ast)->ddecl = ddecl; + + return ast; +} + +/* Create declaration of field 'elements d : bitfield' with attributes + attributes. + d can be NULL, bitfield can be NULL, but not both at the same time. + Returns the declaration for the field. +*/ +declaration make_field(declarator d, expression bitfield, + type_element elements, attribute attributes) +{ + /* We get at least one of a declarator or a bitfield */ + location l = d ? d->location : bitfield->location; + + return + CAST(declaration, + new_field_decl(parse_region, l, d, attributes, bitfield)); +} + + +/* Create and return type 'elements d' where d is an absolute declarator */ +asttype make_type(type_element elements, declarator d) +{ + location l = elements ? elements->location : d->location; + int class; + scflags scf; + const char *name; + bool defaulted_int; + asttype t = new_asttype(parse_region, l, d, elements); + dd_list extra_attr; + + parse_declarator(t->qualifiers, t->declarator, FALSE, FALSE, + &class, &scf, NULL, &name, + &t->type, &defaulted_int, NULL, &extra_attr); + assert(t->type && !(class || scf || name)); + + return t; +} + + +/* Returns name of r */ +static char *rid_name_int(int id) +{ + switch (id) + { + case RID_INT: return "int"; + case RID_CHAR: return "char"; + case RID_FLOAT: return "float"; + case RID_DOUBLE: return "double"; + case RID_VOID: return "void"; + case RID_UNSIGNED: return "unsigned"; + case RID_SHORT: return "short"; + case RID_LONG: return "long"; + case RID_AUTO: return "auto"; + case RID_STATIC: return "static"; + case RID_EXTERN: return "extern"; + case RID_REGISTER: return "register"; + case RID_TYPEDEF: return "typedef"; + case RID_SIGNED: return "signed"; + case RID_INLINE: return "__inline"; + case RID_COMPLEX: return "__complex"; + case RID_COMMAND: return "command"; + case RID_EVENT: return "event"; + case RID_ASYNC: return "async"; + case RID_TASK: return "task"; + case RID_DEFAULT: return "default"; + case RID_NORACE: return "norace"; + default: assert(0); return NULL; + } +} + +/* Returns name of r */ +char *rid_name(rid r) +{ + return rid_name_int(r->id); +} + +/* If statement list l1 ends with an unfinished label, attach l2 to that + label. Otherwise attach l2 to the end of l1 */ +statement chain_with_labels(statement l1, statement l2) +{ + node last, last_label; + + if (!l1) return l2; + if (!l2) return l1; + + last_label = last = last_node(CAST(node, l1)); + /* There may be an unfinished sub-label due to 'a: b:' */ + while (last_label->kind == kind_labeled_stmt) + { + labeled_stmt ls = CAST(labeled_stmt, last_label); + + if (!ls->stmt) /* An unfinished labeled statement */ + { + ls->stmt = l2; + return l1; + } + last_label = CAST(node, ls->stmt); + } + + last->next = CAST(node, l2); + + return l1; +} + +void init_semantics(void) +{ + current.fileregion = parse_region; + + spontaneous_calls = dd_new_list(parse_region); + + global_env = current.env = new_environment(parse_region, NULL, TRUE, FALSE); + + bad_decl = ralloc(parse_region, struct data_declaration); + bad_decl->kind = decl_error; + bad_decl->name = "undeclared"; + bad_decl->type = error_type; + bad_decl->ast = new_error_decl(parse_region, dummy_location); + + dummy_function_declarator = + new_function_declarator(parse_region, dummy_location, NULL, NULL, NULL, NULL, NULL); + + implicit_function_type = make_function_type(int_type, NULL, FALSE, TRUE); + dummy_function_type = make_function_type(int_type, new_typelist(parse_region), FALSE, FALSE); + + /* Create the global bindings for __FUNCTION__ and __PRETTY_FUNCTION__. */ + declare_function_name (); + + /* Declare builtin type __builtin_va_list */ + declare_builtin_types(); + declare_builtin_identifiers(); + + onecst = make_signed_cst(1, int_type); + zerocst = make_signed_cst(0, int_type); + oneexpr = build_uint_constant(parse_region, dummy_location, size_t_type, 1); +} + +void start_semantics(source_language l, nesc_declaration container, + environment env) +{ + current.env = env; + current.language = l; + current.function_decl = NULL; + current.pending_invalid_xref = NULL; + current.container = container; + current.in_atomic = NULL; + current.spec_section = spec_normal; +} + +static bool samekind(type t1, type t2) +{ + return (type_integer(t1) && type_integer(t2)) || + (type_floating(t1) && type_floating(t2)); +} + +bool handle_mode_attribute(location loc, data_declaration ddecl, const char *mode) +{ + type tm, t = ddecl->type; + + /* Simplified mode attribute support. We're missing: + - support for multiple pointer sizes (see comment below) + - the vector modes + */ + + if (!(ddecl->kind == decl_variable || ddecl->kind == decl_typedef)) + return FALSE; + + tm = type_for_mode(mode, type_unsigned(t)); + + if (!tm) + { + error_with_location(loc, "unknown machine mode `%s'", mode); + return TRUE; + } + + if (type_pointer(t)) + { + /* Simplified pointer handling. We only allow modes that specify + the pointer size (in which case we do nothing). In all other + cases, we'll report an error. Most targets do not support more + than one pointer mode (the exceptions seem to be s390 and mips, + that allow both 32 and 64 bit pointers) */ + if (type_size_int(t) != type_size_int(tm)) + error("invalid pointer mode `%s'", mode); + } + else if (samekind(t, tm) || + (type_complex(t) && type_complex(tm) && + samekind(make_base_type(t), make_base_type(tm)))) + /* If this is a valid resizing, set type. We lose enum-ness here + but that shouldn't matter. (If it does, add changing-size support + in types.c) */ + ddecl->type = tm; + else + error_with_location(loc, "mode `%s' applied to inappropriate type", mode); + + return TRUE; +} + +/* Make "word" argument of attributes into an expression */ +expression make_attr_args(location loc, cstring id, expression args) +{ + identifier result = new_identifier(parse_region, loc, id, bad_decl); + + result->type = error_type; + result->next = CAST(node, args); + + return CAST(expression, result); +} diff --git a/src/semantics.h b/src/semantics.h new file mode 100644 index 0000000..c9bb384 --- /dev/null +++ b/src/semantics.h @@ -0,0 +1,243 @@ +/* This file is part of the nesC compiler. + +This file is derived from RC and the GNU C Compiler. It is thus + Copyright (C) 1987, 88, 89, 92-7, 1998 Free Software Foundation, Inc. + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef SEMANTICS_H +#define SEMANTICS_H + +/* Storage specifier "flags" (inline, e.g.) */ +typedef enum { + scf_inline = 1, + scf_default = 2, + scf_async = 4, + scf_norace = 8 +} scflags; + +/* Predefined __builtin_va_list type */ +extern type builtin_va_list_type; +extern data_declaration builtin_va_arg_decl; +extern data_declaration builtin_constant_p; + +#include "cstring.h" +#include "decls.h" +#include "c-lex-state.h" + +/* Print an error message now + for a recent invalid struct, union or enum cross reference. + We don't print them immediately because they are not invalid + when used in the `struct foo;' construct for shadowing. */ +void pending_xref_error(void); + +extern environment global_env; + +data_declaration lookup_id(const char *s, bool this_level_only); +data_declaration lookup_global_id(const char *s); + +/* If elements is 'struct foo' shadow tag foo in the current environment */ +void shadow_tag(type_element elements); + +/* Like shadow_tag, but a pedwarn has already been issued if warned == 1 */ +void shadow_tag_warned(type_element elements, int warned); + + +declarator finish_array_or_fn_declarator(declarator nested, nested_declarator d); + +/* Start definition of function 'elements d' with attributes attribs. + nested is true for nested function definitions. + Returns false in case of error. + Sets current.function_decl to the declaration for this function */ +bool start_function(type_element elements, declarator d, attribute attribs, + bool nested); + +/* Add old-style parameter declarations old_parms to the current function */ +void store_parm_decls(declaration old_parms); + +/* End definition of current function, furnishing it it's body. */ +declaration finish_function(statement body); + + +/* Start a new scope */ +void pushlevel(bool parm_level); + +/* Pop back to enclosing scope */ +environment poplevel(void); + + +/* Categories of variable declarations */ +enum { var_typedef, var_register, var_normal, var_static, var_extern }; + +/* Start definition of variable 'elements d' with attributes + extra_attributes and attributes, asm specification astmt. + If initialised is true, the variable has an initialiser. + Returns the declaration for the variable. +*/ +declaration start_decl(declarator d, asm_stmt astmt, type_element elements, + bool initialised, attribute attributes); + +/* Finish definition of decl, furnishing the optional initialiser init. + Returns decl */ +declaration finish_decl(declaration decl, expression init); + +/* Create definition of function parameter 'elements d' with attributes + extra_attributes and attributes. + Returns the declaration for the parameter. +*/ +declaration declare_parameter(declarator d, type_element elements, + attribute attributes); + +/* Allow parameters to be redeclared. mark_forward should be TRUE + if these are "forward" parameter declarations (gcc extension) */ +void allow_parameter_redeclaration(declaration parms, bool mark_forward); + +declaration declare_old_parameter(location l, cstring id); + + +/* Start definition of struct/union (indicated by skind) type tag. */ +type_element start_struct(location l, AST_kind skind, word tag); + +/* Finish definition of struct/union furnishing the fields and attribs. + Returns t */ +type_element finish_struct(type_element t, declaration fields, + attribute attribs); + +/* Return a reference to struct/union/enum (indicated by skind) type tag */ +type_element xref_tag(location l, AST_kind skind, word tag); + +/* Start definition of struct/union (indicated by skind) type tag. */ +type_element start_enum(location l, word tag); + +/* Finish definition of enum furnishing the names and attribs. + Returns t */ +type_element finish_enum(type_element t, declaration names, + attribute attribs); + +/* Create declaration of field 'elements d : bitfield' with attributes + extra_attributes and attributes. + d can be NULL, bitfield can be NULL, but not both at the same time. + Returns the declaration for the field. +*/ +declaration make_field(declarator d, expression bitfield, + type_element elements, attribute attributes); + +declaration make_enumerator(location loc, cstring id, expression value); + + +/* Create and return type 'elements d' where d is an absolute declarator */ +asttype make_type(type_element elements, declarator d); + +/* Returns name of r */ +char *rid_name(rid r); + +/* If statement list l1 ends with an unfinished label, attach l2 to that + label. Otherwise attach l2 to the end of l1 */ +statement chain_with_labels(statement l1, statement l2); + +void declarator_name(declarator d, const char **oname, const char **iname); +const char *nice_declarator_name(declarator d); +/* Returns: a user-friendly name for declarator d, allocated in + current.fileregion if necessary +*/ + +data_declaration lookup_id(const char *s, bool this_level_only); + +data_declaration implicitly_declare(identifier fnid); + +void push_label_level(void); +void pop_label_level(void); + +void init_data_declaration(data_declaration dd, declaration ast, + const char *name, type t); +data_declaration declare(environment env, data_declaration from, + bool ignore_shadow); + +/* Build a declaration object for a string */ +data_declaration declare_string(const char *name, cstring value, bool wide); + +environment new_environment(region r, environment parent, + bool global_level, bool parm_level); + +tag_declaration declare_tag(tag_ref t); +tag_declaration lookup_tag(tag_ref t, bool this_level_only); +tag_declaration declare_global_tag(tag_ref t); +tag_declaration lookup_global_tag(tag_ref t); + +void init_semantics(void); +void start_semantics(source_language l, nesc_declaration container, + environment parent_env); + +struct semantic_state +{ + region fileregion; /* A per-file region. + "Renewed" at the start of each file and + of each implementation section */ + source_language language; /* The current language */ + environment env; /* The current environment */ + nesc_declaration file; /* The nesC entity of the file being compiled + (different from container while dealing + with C declarations at the beginning of + the file) */ + nesc_declaration container; /* The nesC entity being compiled (NULL for C) */ + function_decl function_decl; /* The function currently being defined */ + tag_ref pending_invalid_xref; /* Internal use */ + enum { /* Within a component specification, are we: */ + spec_normal, /* - neither in provides or in uses */ + spec_provides, /* - in a provides section */ + spec_uses /* - in a uses section */ + } spec_section; + + atomic_stmt in_atomic; /* The lexically containing atomic statement + (NULL for none) */ + char *preprocessed_file; /* Temp file holding preprocessor output */ + struct lex_state lex; +}; + +extern struct semantic_state current; + +extern dd_list spontaneous_calls; +/* List of spontaneously-called functions */ + +void check_variable_scflags(scflags scf, + location l, const char *kind, const char *name); + +void parse_declarator(type_element modifiers, declarator d, bool bitfield, + bool require_parm_names, + int *oclass, scflags *oscf, + const char **ointf, const char **oname, + type *ot, bool *owarn_defaulted_int, + function_declarator *ofunction_declarator, + dd_list *oattributes); + +int duplicate_decls(data_declaration newdecl, data_declaration olddecl, + bool different_binding_level, bool newinitialised); + +void check_array_size(expression size, const char *printname); + +void layout_enum_start(tag_declaration tdecl); +void layout_enum_end(tag_declaration tdecl); +known_cst layout_enum_value(enumerator e); +void layout_struct(tag_declaration tdecl); +const char *tagkind_name(int tagkind); +bool handle_mode_attribute(location loc, data_declaration ddecl, const char *mode); +/* Make "word" argument of attributes into an expression */ +expression make_attr_args(location loc, cstring id, expression args); +data_declaration declare_builtin_type(const char *name, type t); + +#endif diff --git a/src/stmt.c b/src/stmt.c new file mode 100644 index 0000000..b185cd2 --- /dev/null +++ b/src/stmt.c @@ -0,0 +1,359 @@ +/* This file is part of the nesC compiler. + +This file is derived from RC and the GNU C Compiler. It is thus + Copyright (C) 1987, 88, 89, 92-7, 1998 Free Software Foundation, Inc. + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include "parser.h" +#include "stmt.h" +#include "semantics.h" +#include "expr.h" +#include "c-parse.h" +#include "constants.h" +#include "edit.h" +#include "AST_utils.h" + +void fail_in_atomic(const char *context) +{ + if (current.in_atomic) + error("%s not allowed in atomic statements", context); +} + +void fail_different_atomic(atomic_stmt target) +{ + if (target != current.in_atomic) + error("control transfer crosses atomic statement boundary"); +} + +void check_condition(const char *context, expression e) +{ + type etype = default_conversion(e); + + if (etype != error_type && !type_scalar(etype)) + error("%s condition must be scalar", context); + if (warn_parentheses && is_assignment(e) && !e->parens) + warning("suggest parentheses around assignment used as truth value"); +} + +void check_switch(expression e) +{ + if (e->type != error_type && !type_integer(e->type)) + error("switch quantity not an integer"); +} + +static type current_return_type(void) +{ + type fntype = current.function_decl->ddecl->type; + + if (type_generic(fntype)) + fntype = type_function_return_type(fntype); + + if (type_volatile(fntype)) + warning("function declared `noreturn' has a `return' statement"); + + return type_function_return_type(fntype); +} + +void check_void_return(void) +{ + type ret = current_return_type(); + + if (warn_return_type && ret != error_type && !type_void(ret)) + warning("`return' with no value, in function returning non-void"); +} + +statement make_void_return(location loc) +{ + statement ret = CAST(statement, new_return_stmt(parse_region, loc, NULL)); + + ret->containing_atomic = current.in_atomic; + check_void_return(); + + return ret; +} + +void check_return(expression e) +{ + type ret = current_return_type(); + + if (type_void(ret)) + { + if (pedantic || !type_void(e->type)) + warning("`return' with a value, in function returning void"); + } + else + { + check_assignment(ret, default_conversion_for_assignment(e), e, "return", NULL, 0); + /* XXX: Missing warning about returning address of local var */ + } +} + +statement make_return(location loc, expression arg) +{ + declaration temp = NULL; + statement ret; + + if (arg->type != error_type && current.in_atomic) + { + data_declaration ddecl; + + pushlevel(FALSE); + temp = CAST(declaration, + build_declaration(parse_region, current.env, current_return_type(), + "__nesc_temp", arg, &ddecl)); + arg = build_identifier(parse_region, loc, ddecl); + } + + ret = CAST(statement, new_return_stmt(parse_region, loc, arg)); + ret->containing_atomic = current.in_atomic; + check_return(arg); + + if (temp) + ret = CAST(statement, + new_compound_stmt(parse_region, loc, NULL, temp, ret, poplevel())); + + return ret; +} + +void check_computed_goto(expression e) +{ + /* Rather weak check (same as gcc) */ + check_conversion(ptr_void_type, e->type); +} + +label_declaration new_label_declaration(region r, const char *name, id_label firstuse) +{ + label_declaration ldecl = ralloc(r, struct label_declaration); + + ldecl->name = name; + ldecl->explicitly_declared = FALSE; + ldecl->firstuse = firstuse; + ldecl->definition = NULL; + ldecl->containing_function = current.function_decl; + /* The label "belongs" to the atomic statement in force the first time + it's mentioned */ + ldecl->containing_atomic = current.in_atomic; + + return ldecl; +} + +void lookup_label(id_label label) +{ + label_declaration ldecl; + + if (!current.function_decl) + { + error ("label %s referenced outside of any function", + label->cstring.data); + /* A dummy decl to make everybody happy. */ + label->ldecl = new_label_declaration(parse_region, label->cstring.data, label); + return; + } + + ldecl = env_lookup(current.function_decl->scoped_labels, label->cstring.data, + FALSE); + + /* Only explicitly declared labels are visible in nested functions */ + if (ldecl && !ldecl->explicitly_declared && + ldecl->containing_function != current.function_decl) + ldecl = NULL; + + if (!ldecl) /* new label */ + { + ldecl = new_label_declaration(parse_region, label->cstring.data, label); + env_add(current.function_decl->base_labels, label->cstring.data, ldecl); + } + else + if (ldecl->containing_atomic != current.in_atomic) + error("label %s is referenced in different atomic statements", + label->cstring.data); + + label->ldecl = ldecl; +} + +void use_label(id_label label) +{ + lookup_label(label); + label->ldecl->used = TRUE; +} + +static void duplicate_label_error(id_label label) +{ + error("duplicate label declaration `%s'", label->cstring.data); + error_with_location(label->ldecl->definition ? + label->ldecl->definition->location : + label->ldecl->firstuse->location, + "this is a previous declaration"); +} + +void define_label(id_label label) +{ + lookup_label(label); + if (label->ldecl->definition) + duplicate_label_error(label); + else + label->ldecl->definition = label; +} + +void declare_label(id_label label) +{ + label_declaration ldecl = + env_lookup(current.function_decl->scoped_labels, label->cstring.data, TRUE); + + if (ldecl) + { + label->ldecl = ldecl; + duplicate_label_error(label); + } + else + { + ldecl = new_label_declaration(parse_region, label->cstring.data, label); + env_add(current.function_decl->scoped_labels, label->cstring.data, ldecl); + } + ldecl->explicitly_declared = TRUE; +} + +void check_labels(void) +{ + env_scanner scan_labels; + void *ld; + const char *lname; + + env_scan(current.function_decl->scoped_labels, &scan_labels); + while (env_next(&scan_labels, &lname, &ld)) + { + label_declaration ldecl = ld; + + if (!ldecl->definition) + error_with_location(ldecl->firstuse->location, + "label `%s' used but not defined", lname); + else if (!ldecl->used && warn_unused) + warning_with_location(ldecl->firstuse->location, + "label `%s' defined but not used", lname); + } +} + +void push_loop(statement loop_statement) +{ + loop_statement->parent_loop = current.function_decl->current_loop; + current.function_decl->current_loop = loop_statement; + loop_statement->containing_atomic = current.in_atomic; +} + +void pop_loop(void) +{ + current.function_decl->current_loop = + current.function_decl->current_loop->parent_loop; +} + +static statement containing_switch(label l) +{ + statement sw = current.function_decl->current_loop; + + /* Find a switch */ + while (sw && !is_switch_stmt(sw)) + sw = sw->parent_loop; + + if (sw) + { + /* Chain the label */ + /* XXX: n^2 algo */ + label *last = &CAST(switch_stmt, sw)->next_label; + bool lisdefault = is_default_label(l); + + /* XXX: no duplicate case check */ + while (*last) + { + if (is_default_label(*last) && lisdefault) + { + error("multiple default labels in one switch"); + error_with_location((*last)->location, + "this is the first default label"); + lisdefault = FALSE; /* Only one error */ + } + last = &(*last)->next_label; + } + + fail_different_atomic(sw->containing_atomic); + + *last = l; + } + + return sw; +} + +void check_case_value(expression e) +{ + if (check_constant_once(e, cst_numerical)) + if (!e->cst || !(e->type == error_type || type_integer(e->type))) + error_with_location(e->location, + "case label does not reduce to an integer constant"); +} + +void check_case(label label0) +{ + statement sw = containing_switch(label0); + case_label label = CAST(case_label, label0); + + if (!sw) + error("case label not within a switch statement"); + + check_case_value(label->arg1); + if (label->arg2) + check_case_value(label->arg2); + /* XXX: no range check (compared to switched type), no empty range check */ + /* XXX: no check for unreachable code */ +} + +void check_default(label default_label) +{ + statement sw = containing_switch(default_label); + + if (!sw) + error("default label not within a switch statement"); + /* XXX: no check for unreachable code */ +} + +void check_break(statement break_statement) +{ + statement current_loop = current.function_decl->current_loop; + + if (!current_loop) + error("break statement not within loop or switch"); + else + fail_different_atomic(current_loop->containing_atomic); + + break_statement->parent_loop = current_loop; +} + +void check_continue(statement continue_statement) +{ + statement loop = current.function_decl->current_loop; + + /* Find a loop */ + while (loop && is_switch_stmt(loop)) + loop = loop->parent_loop; + + if (!loop) + error("continue statement not within a loop"); + else + fail_different_atomic(loop->containing_atomic); + + continue_statement->parent_loop = loop; +} diff --git a/src/stmt.h b/src/stmt.h new file mode 100644 index 0000000..7d72e4f --- /dev/null +++ b/src/stmt.h @@ -0,0 +1,54 @@ +/* This file is part of the nesC compiler. + +This file is derived from RC and the GNU C Compiler. It is thus + Copyright (C) 1987, 88, 89, 92-7, 1998 Free Software Foundation, Inc. + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef STMT_H +#define STMT_H + +void check_condition(const char *context, expression e); +void check_switch(expression e); +void check_void_return(void); +void check_return(expression e); +void check_computed_goto(expression e); +statement make_return(location loc, expression arg); +statement make_void_return(location loc); + +void lookup_label(id_label label); +void use_label(id_label label); +void define_label(id_label label); +void declare_label(id_label label); + +void check_labels(void); + +void check_case(label case_label); +void check_case_value(expression e); +void check_default(label default_label); +void check_break(statement break_statement); +void check_continue(statement continue_statement); +void fail_in_atomic(const char *context); + +void push_loop(statement loop_statement); +void pop_loop(void); + +label_declaration new_label_declaration(region r, const char *name, id_label firstuse); + +#endif + diff --git a/src/tdspecs b/src/tdspecs new file mode 100644 index 0000000..418229b --- /dev/null +++ b/src/tdspecs @@ -0,0 +1,4 @@ +.nc: @nesc + +@nesc: +perl -S nesc-compile %{_*} %{m*} %{D*&U*&A*} %{I*} %{undef} %{trigraphs} %{i*} %{nostdinc} %{a*} %{g*} %{O*} %{W*} %{w} %{S} %{pedantic*} %{std*} %{ansi} %{traditional} %{v} %{p*} %{f*} %{!fsyntax-only:%{!fnesc-cfile=*:%{!_fnesc-cfile=*:-fnesc-tmpcfile=%g.c}} %{S:%W{o*}%{!o*:-o %b.s}}%{!S:%{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}}} %{fsyntax-only:-o %j} %{-param*} %i -_ASM %Y diff --git a/src/toplev.c b/src/toplev.c new file mode 100644 index 0000000..5938ddb --- /dev/null +++ b/src/toplev.c @@ -0,0 +1,374 @@ +/* This file is part of the nesC compiler. + +This file is derived from RC and the GNU C Compiler. It is thus + Copyright (C) 1987, 88, 89, 92-7, 1998 Free Software Foundation, Inc. + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include +#include +#include + +#include "parser.h" +#include "c-parse.h" +#include "unparse.h" +#include "semantics.h" +#include "machine.h" +#include "nesc-main.h" +#include "nesc-paths.h" +#include "nesc-cpp.h" +#include "nesc-msg.h" +#include "nesc-doc.h" + +#if HAVE_POLL +#include +#endif + +/* Table of language-independent -f and -W options. + STRING is the option name. VARIABLE is the address of the variable. + ON_VALUE is the value to store in VARIABLE + if `-fSTRING' is seen as an option. + (If `-fno-STRING' is seen as an option, the opposite value is stored.) */ + +static struct { char c; char *string; int *variable; int on_value;} fW_options[] = +{ + { 'f', "syntax-only", &flag_syntax_only, 1 }, + { 'f', "parse-only", &flag_parse_only, 1 }, + { 'f', "pack-struct", &flag_pack_struct, 1 }, + { 'f', "allow-single-precision", &flag_allow_single_precision, 1 }, + { 'f', "signed-char", &flag_signed_char, 1 }, + { 'f', "unsigned-char", &flag_signed_char, 0 }, + { 'f', "signed-bitfields", &flag_signed_bitfields, 1 }, + { 'f', "unsigned-bitfields", &flag_signed_bitfields, 0 }, + { 'f', "short-enums", &flag_short_enums, 1 }, + { 'f', "cond-mismatch", &flag_cond_mismatch, 1 }, + { 'f', "asm", &flag_no_asm, 0 }, + + { 'W', "unused", &warn_unused, 1 }, + { 'W', "error", &warnings_are_errors, 1 }, + { 'W', "shadow", &warn_shadow, 1 }, + { 'W', "switch", &warn_switch, 1 }, + { 'W', "aggregate-return", &warn_aggregate_return, 1 }, + { 'W', "cast-align", &warn_cast_align, 1 }, + { 'W', "uninitialized", &warn_uninitialized, 1 }, + { 'W', "inline", &warn_inline, 1 }, + { 'W', "error-implicit-function-declaration", &mesg_implicit_function_declaration, 2 }, + { 'W', "implicit-function-declaration", &mesg_implicit_function_declaration, 1 }, + { 'W', "implicit-int", &warn_implicit_int, 1 }, + { 'W', "write-strings", &warn_write_strings, 1 }, + { 'W', "cast-qual", &warn_cast_qual, 1 }, + { 'W', "bad-function-cast", &warn_bad_function_cast, 1 }, + { 'W', "pointer-arith", &warn_pointer_arith, 1 }, + { 'W', "strict-prototypes", &warn_strict_prototypes, 1 }, + { 'W', "missing-prototypes", &warn_missing_prototypes, 1 }, + { 'W', "missing-declarations", &warn_missing_declarations, 1 }, + { 'W', "redundant-decls", &warn_redundant_decls, 1 }, + { 'W', "nested-externs", &warn_nested_externs, 1 }, + { 'W', "traditional", &warn_traditional, 1 }, + { 'W', "format", &warn_format, 1 }, + { 'W', "char-subscripts", &warn_char_subscripts, 1 }, + { 'W', "conversion", &warn_conversion, 1 }, + { 'W', "parentheses", &warn_parentheses, 1 }, + { 'W', "return-type", &warn_return_type, 1 }, + { 'W', "missing-braces", &warn_missing_braces, 1 }, + { 'W', "main", &warn_main, 1 }, + { 'W', "sign-compare", &warn_sign_compare, 1 }, + { 'W', "multichar", &warn_multichar, 1 }, + { 'W', "comment", &warn_comments, 1 }, + { 'W', "comments", &warn_comments, 1 }, + { 'W', "trigraphs", &warn_trigraphs, 1 }, + { 'W', "unused-macros", &warn_unused_macros, 1 }, + { 'W', "endif-labels", &warn_endif_labels, 1 }, + { 'W', "system-headers", &warn_system_headers, 1 }, + { 'W', "undef", &warn_undef, 1 }, + { 'W', "missing-include-dirs", &warn_missing_include_dirs, 1 }, + { 'W', "multichar", &warn_multichar, 1 } +}; + +/* Options with arguments */ +#define OPTS_WITH_ARGS "DUAIo" + +const char *opts_with_args[] = +{ + "include", + "imacros", + "idirafter", + "iprefix", + "iwithprefix", + "iwithprefixbefore", + "isystem", + "iquote" +}; + +#ifdef SIGPIPE +/* Handler for SIGPIPE. */ +static void pipe_closed (int signo) +{ + fatal("output pipe has been closed"); +} +#endif + +/* Print a fatal error message. NAME is the text. + Also include a system error message based on `errno'. */ + + +/* Decode the string P as a language-specific option for C. */ +static bool c_option(char *p) +{ + if (!strcmp (p, "-v")) + flag_verbose = 1; + else if (!strcmp (p, "-traditional")) + flag_traditional = 1; + else if (!strcmp (p, "-trigraphs")) + flag_trigraphs = 1; + else if (!strcmp (p, "-ansi")) + flag_no_asm = 1; + else if (!strcmp (p, "-pedantic")) + pedantic = 1; + else if (!strcmp (p, "-pedantic-errors")) + flag_pedantic_errors = pedantic = 1; + else if (!strcmp (p, "-nostdinc")) + flag_nostdinc = 1; + else if (!strcmp (p, "-undef")) + flag_undef = 1; + else if (!strcmp (p, "-fdollars-in-identifiers")) + fprintf(stderr, "nesC does not support $ in identifiers"); + else if (!strcmp (p, "-fno-dollars-in-identifiers")) + dollars_in_ident = 0; + else if (!strcmp (p, "-w")) + inhibit_warnings = 1; + else if (!strcmp (p, "-Wimplicit")) + { + warn_implicit_int = 1; + if (mesg_implicit_function_declaration != 2) + mesg_implicit_function_declaration = 1; + } + else if (!strcmp (p, "-Wno-implicit")) + warn_implicit_int = 0, mesg_implicit_function_declaration = 0; + else if (!strcmp (p, "-W")) + { + extra_warnings = 1; + /* We save the value of warn_uninitialized, since if they put + -Wuninitialized on the command line, we need to generate a + warning about not using it without also specifying -O. */ + if (warn_uninitialized != 1) + warn_uninitialized = 2; + } + else if (!strcmp (p, "-Wall")) + { + /* We save the value of warn_uninitialized, since if they put + -Wuninitialized on the command line, we need to generate a + warning about not using it without also specifying -O. */ + if (warn_uninitialized != 1) + warn_uninitialized = 2; + warn_implicit_int = 1; + mesg_implicit_function_declaration = 1; + warn_return_type = 1; + warn_unused = 1; + warn_switch = 1; + warn_format = 1; + warn_char_subscripts = 1; + warn_parentheses = 1; + warn_missing_braces = 1; + /* We set this to 2 here, but 1 in -Wmain, so -ffreestanding can turn + it off only if it's not explicit. */ + warn_main = 2; + + warn_trigraphs = 1; + warn_comments = 1; + } + else + return FALSE; + + return TRUE; +} + +static void rcc_aborting(int s) +{ + location where; + + signal(SIGABRT, 0); + fprintf(stderr, "nesC: Internal error. Please send a bug report to the nesC bug mailing list\nat nescc-bugs@lists.sourceforge.net\n"); + where = current_location(); + if (where != dummy_location) + fprintf(stderr, "Current location (guess): %s:%lu\n", where->filename, where->lineno); + if (getenv("RCCDEBUG")) + abort(); + else + exit(FATAL_EXIT_CODE); +} + +/* Entry point of cc1/c++. Decode command args, then call compile_file. + Exit code is 35 if can't open files, 34 if fatal error, + 33 if had nonfatal errors, else success. */ + +static void outofmemory(void) +{ + fprintf(stderr, "Out of memory - exiting\n"); + exit(FATAL_EXIT_CODE); +} + +int region_main(int argc, char **argv) deletes +{ + int i; + char *filename = 0; + char *targetfile = 0; + char *p; + +#if HAVE_POLL + char* waitforgdb; + /* + * Check for an environment variable NCCGDB, and if set, block + * calling poll(). When gdb attaches, it sends us a signal which + * causes poll to return with EINTR, and we continue on our merry + * way. + */ + waitforgdb = getenv("NCCGDB"); + if (waitforgdb) + { + fprintf(stderr, "ncc pid %d waiting for gdb attach\n", getpid()); + poll(0, 0, -1); // should return with EINTR + } +#endif + + signal(SIGABRT, rcc_aborting); + signal(SIGSEGV, rcc_aborting); +#ifdef SIGBUS + signal(SIGBUS, rcc_aborting); +#endif + set_nomem_handler(outofmemory); + + init_nesc_paths_start(newregion()); + + p = argv[0] + strlen (argv[0]); + while (p != argv[0] && p[-1] != '/' +#ifdef DIR_SEPARATOR + && p[-1] != DIR_SEPARATOR +#endif + ) + --p; + progname = p; + +#ifdef SIGPIPE + signal (SIGPIPE, pipe_closed); +#endif + + flag_signed_char = 2; /* Detect if user specifies a value */ + + for (i = 1; i < argc; ) + { + int j; + + if (c_option(argv[i]) || nesc_option(argv[i])) + i++; + else if (argv[i][0] == '-' && argv[i][1] != 0) + { + char *str = argv[i++] + 1; + char *arg = NULL; + + if (strchr(OPTS_WITH_ARGS, str[0])) + { + if (!str[1]) + if (i < argc) + arg = argv[i++]; + else + { + str = ""; + error("argument to `-%c' is missing", str[0]); + } + else + arg = str + 1; + } + + for (j = 0; j < sizeof opts_with_args / sizeof *opts_with_args; j++) + if (!strcmp(str, opts_with_args[j])) + { + if (i < argc) + arg = argv[i++]; + else + { + str = ""; + error("argument to `-%s' is missing", str); + } + break; + } + + if (str[0] == 'o') + targetfile = arg; + else if (str[0] == 'I') + add_nesc_dir(arg, CHAIN_BRACKET); + else if (str[0] == 'D' || str[0] == 'U' || str[0] == 'A') + save_cpp_option(str, arg); + else if (str[0] == 'f' || str[0] == 'W') + { + char kind = str[0]; + char *p = &str[1]; + + /* Some kind of -f or -W option. + p's value is the option sans -f/W. + Search for it in the table of options. */ + for (j = 0; + j < sizeof (fW_options) / sizeof (fW_options[0]); + j++) + { + if (kind == fW_options[j].c && + !strcmp (p, fW_options[j].string)) + { + *fW_options[j].variable = fW_options[j].on_value; + break; + } + if (kind == fW_options[j].c && + p[0] == 'n' && p[1] == 'o' && p[2] == '-' && + !strcmp (p+3, fW_options[j].string)) + { + *fW_options[j].variable = ! fW_options[j].on_value; + break; + } + } + } + } + else + filename = argv[i++]; + } + + /* Pass options on to the target too (this a bit hacky, but fine so far) */ + if (target->handle_option) + for (i = 1; i < argc; i++) + if (argv[i][0] == '-' && argv[i][1] != 0) + target->handle_option(argv[i]); + + if (target->preinit) + target->preinit(); + + if (flag_signed_char == 2) /* not set by user */ + flag_signed_char = target->char_signed; + + if (filename) + nesc_compile (filename, targetfile); + else + { + fprintf(stderr, "usage: %s [options] \n", argv[0]); + exit(FATAL_EXIT_CODE); + } + + if (errorcount) + exit (FATAL_EXIT_CODE); + else + exit (SUCCESS_EXIT_CODE); + return 0; +} diff --git a/src/types.c b/src/types.c new file mode 100644 index 0000000..3ef2157 --- /dev/null +++ b/src/types.c @@ -0,0 +1,2734 @@ +/* This file is part of the nesC compiler. + +This file is derived from RC and the GNU C Compiler. It is thus + Copyright (C) 1987, 88, 89, 92-7, 1998 Free Software Foundation, Inc. + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include "parser.h" +#include "types.h" +#include "constants.h" +#include "c-parse.h" +#include "machine.h" +#include "nesc-semantics.h" +#include "nesc-xml.h" +#include "AST_utils.h" + +#include +#include + +struct type +{ + enum { tk_primitive, tk_complex, tk_tagged, tk_error, tk_void, + tk_pointer, tk_function, tk_array, tk_iref, tk_variable, + tk_cref } kind; + type_quals qualifiers; + enum { nx_no, nx_base, nx_derived } network; + data_declaration combiner, basedecl, typedefdecl; + + /* size is not used for aggregate types + (as the values may be discovered after the type is created) + or for arrays (as they may be arrays of aggregates) + alignment is used for aggregates and arrays only if it is non-zero + (indicating an alignment overridden by an attribute) + */ + cval size; + cval alignment; + bool user_align; + + union { + /* tk_primtive and tk_complex. + The order reflects promotion order (for an arbitrary machine, + see common_primitive_type) */ + enum { /* The elements of this enum must be ordered as follows: + - all integral types before tp_first_floating + - do not change the floating type order + - the integral types are ordered by "rank" (see c9x std) and + unsignedness (unsigned > signed) (common_primitive_type + relies on this order) + - The tp_[u]int types must be before tp_char (for the + assert in common_primitive_type). These types are only + used when the corresponding size is not available amongst + short/int/long/long long + If this frontend followed c9x, these types would always exist + and be special integer types distinct from the regular ones + (see the rank stuff), but we're following gcc so they + aren't. If this changes, common_primitive_type, + default_conversion and type_default_conversion need revising. + */ + tp_error, + + tp_int2, tp_uint2, tp_int4, tp_uint4, tp_int8, tp_uint8, + + tp_char, + tp_signed_char, tp_unsigned_char, + tp_short, tp_unsigned_short, + tp_int, tp_unsigned_int, + tp_long, tp_unsigned_long, + tp_long_long, tp_unsigned_long_long, + /* Used as the rep type of enums whose constants are derived + from template arguments and whose size is hence unknown. + The unknown int type has the highest rank (its unsignedness + is unknown, we assume its signed). */ + tp_unknown_int, + + tp_first_floating, + tp_float = tp_first_floating, tp_double, tp_long_double, + + /* Like tp_unknown_int, but might be a real or integer */ + tp_unknown_number, + tp_last + } primitive; + + /* tk_tagged */ + tag_declaration tag; + + /* tk_pointer */ + type pointsto; + + /* tk_function */ + struct { + type returns; + typelist argtypes; + bool varargs; + bool oldstyle; + enum { tkf_c, tkf_event, tkf_command, tkf_task, tkf_generic } fkind; + } fn; + + /* tk_array */ + struct { + type arrayof; + expression size; + /* If size is a known constant, it is guaranteed >= 0 */ + } array; + + /* tk_iref */ + data_declaration iref; + + /* tk_cref */ + data_declaration cref; + + /* tk_variable */ + data_declaration tdecl; + } u; +}; + +#ifdef RC_ADJUST +static void rc_update_type(struct type *old, struct type *new) +{ + regionid base = regionidof(old); + + switch (old->kind) + { + case tk_tagged: + RC_UPDATE(base, old->u.tag, new->u.tag); + break; + case tk_pointer: + RC_UPDATE(base, old->u.pointsto, new->u.pointsto); + break; + case tk_function: + RC_UPDATE(base, old->u.fn.returns, new->u.fn.returns); + RC_UPDATE(base, old->u.fn.argtypes, new->u.fn.argtypes); + break; + case tk_array: + RC_UPDATE(base, old->u.array.arrayof, new->u.array.arrayof); + RC_UPDATE(base, old->u.array.size, new->u.array.size); + break; + default: + break; + } +} + +static size_t rc_adjust_type(void *x, int by) +{ + struct type *p = x; + RC_ADJUST_PREAMBLE; + + switch (p->kind) + { + case tk_tagged: + RC_ADJUST(p->u.tag, by); + break; + case tk_pointer: + RC_ADJUST(p->u.pointsto, by); + break; + case tk_function: + RC_ADJUST(p->u.fn.returns, by); + RC_ADJUST(p->u.fn.argtypes, by); + break; + case tk_array: + RC_ADJUST(p->u.array.arrayof, by); + RC_ADJUST(p->u.array.size, by); + break; + default: + break; + } + + return sizeof *p; +} +#endif + +static region types_region; + +static type primitive_types[tp_last]; +static type complex_types[tp_last]; + +type float_type, double_type, long_double_type, + int_type, unsigned_int_type, long_type, unsigned_long_type, + long_long_type, unsigned_long_long_type, short_type, unsigned_short_type, + char_type, char_array_type, wchar_type, wchar_array_type, + unsigned_char_type, signed_char_type, void_type, ptr_void_type, + const_ptr_void_type, + size_t_type, ptrdiff_t_type, intptr_type, + int2_type, uint2_type, int4_type, uint4_type, int8_type, uint8_type, + unknown_int_type, unknown_number_type, error_type; + +static type copy_type(type t) +{ + type nt = ralloc(types_region, struct type); + *nt = *t; + return nt; +} + +static type new_type(int kind) +{ + type nt = ralloc(types_region, struct type); + + nt->kind = kind; + /*nt->qualifiers = 0; + nt->network = nx_no; + nt->user_align = FALSE; + nt->combiner = nt->basedecl = nt->typedefdecl = NULL;*/ + nt->size = nt->alignment = cval_top; + return nt; +} + +/* Return the 'complex t' version of basic type t (one of the integral or + floating-point types) */ +type make_complex_type(type t) +{ + assert(t->kind == tk_primitive); + + return qualify_type1(complex_types[t->u.primitive], t); +} + +/* Return the base type of complex type t (one of the integral or + floating-point types) */ +type make_base_type(type t) +{ + assert(t->kind == tk_complex); + + return primitive_types[t->u.primitive]; +} + +/* Return the type t with it's qualifiers set to tq (old qualifiers are + ignored). This is illegal for function types. For arrays, the qualifiers + get pushed down to the base type. */ +type make_qualified_type(type t, type_quals qualifiers) +{ + /* Push const or volatile down to base type */ + if (t->kind == tk_array) + return make_array_type(make_qualified_type(t->u.array.arrayof, qualifiers), + t->u.array.size); + else + { + type nt = copy_type(t); + + nt->qualifiers = qualifiers; + + return nt; + } +} + +/* Return type 'pointer to t' (unqualified) */ +type make_pointer_type(type t) +{ + type nt = new_type(tk_pointer); + nt->u.pointsto = t; + + /* ASSUME: all pointers are the same */ + nt->size = make_type_cval(target->tptr.size); + nt->alignment = make_type_cval(target->tptr.align); + + return nt; +} + +/* Return type 'array [size] of t'. size is optional */ +type make_array_type(type t, expression size) +{ + type nt = new_type(tk_array); + + nt->u.array.arrayof = t; + nt->u.array.size = size; + nt->network = t->network != nx_no ? nx_derived : nx_no; + + return nt; +} + +/* Return type 'function with argument types argtypes returning t'. + If oldstyle is true, this is an oldstyle function type and + argtypes is NULL */ +type make_function_type(type t, typelist argtypes, bool varargs, + bool oldstyle) +{ + type nt = new_type(tk_function); + nt->u.fn.fkind = tkf_c; + nt->u.fn.returns = t; + nt->u.fn.argtypes = argtypes; + nt->u.fn.varargs = varargs; + nt->u.fn.oldstyle = oldstyle; + nt->size = nt->alignment = make_type_cval(1); + return nt; +} + +type build_function_type(region r, type returns, ...) +{ + va_list args; + typelist argtypes; + + va_start(args, returns); + argtypes = new_typelist(r); + + for (;;) + { + type onearg = va_arg(args, type); + + if (!onearg) + break; + typelist_append(argtypes, onearg); + } + + return make_function_type(returns, argtypes, FALSE, FALSE); +} + + +/* Return the tagged type whose declaration is d */ +type make_tagged_type(tag_declaration d) +{ + type nt = new_type(tk_tagged); + + nt->u.tag = d; + if (d->kind == kind_nx_struct_ref || d->kind == kind_nx_union_ref) + nt->network = nx_derived; + + return nt; +} + +bool type_network(type t) +{ + return t->network != nx_no; +} + +/* Make the single instance of pk, with specified size and alignment + (Note that we may make copies if this single instance for different alignments) + Requires: must be called at most once for each pk, from types_init +*/ + +static type make_primitive0(int pk, cval size, cval alignment, + cval complex_size) +{ + type nt = new_type(tk_primitive), ct; + + nt->u.primitive = pk; + nt->size = size; + nt->alignment = alignment; + primitive_types[pk] = nt; + + ct = new_type(tk_complex); + ct->u.primitive = pk; + ct->size = complex_size; /* can't compute as types not available yet */ + ct->alignment = nt->alignment; /* ASSUME: alignof(complex t) == alignof(t) */ + complex_types[pk] = ct; + + return nt; +} + +static type make_primitive(int pk, int size, int alignment) +{ + return make_primitive0(pk, make_type_cval(size), make_type_cval(alignment), + make_type_cval(size * 2)); +} + +static type make_unknown_primitive(int pk) +{ + return make_primitive0(pk, cval_unknown_number, cval_unknown_number, + cval_unknown_number); +} + +static type lookup_primitive(int default_kind, int size, int alignment, + bool isunsigned) +{ + int i; + + for (i = tp_signed_char; i < tp_unknown_int; i++) + if (cval_uint_value(primitive_types[i]->size) == size && + type_unsigned(primitive_types[i]) == isunsigned) + return primitive_types[i]; + + return make_primitive(default_kind, size, alignment); +} + +static type lookup_float(int size) +{ + int i; + + for (i = tp_first_floating; i < tp_unknown_number; i++) + if (cval_uint_value(primitive_types[i]->size) == size) + return primitive_types[i]; + + return error_type; +} + +/* Return the integral type of size 'size', unsigned if 'isunsigned' is true */ +type type_for_size(cval size, bool isunsigned) +{ + type t; + + if (cval_isunknown(size)) + return unknown_int_type; + + t = lookup_primitive(tp_error, cval_sint_value(size), 0, isunsigned); + assert(t->u.primitive != tp_error); + return t; +} + +static type type_for_size_int(int size, bool isunsigned) +{ + type t = lookup_primitive(tp_error, size, 0, isunsigned); + assert(t->u.primitive != tp_error); + return t; +} + +type type_for_cval(cval c, bool isunsigned) +{ + int i; + + if (cval_isunknown(c)) + return unknown_int_type; + + for (i = tp_signed_char; i < tp_unknown_int; i++) + if (type_unsigned(primitive_types[i]) == isunsigned && + cval_inrange(c, primitive_types[i])) + return primitive_types[i]; + + return NULL; +} + +void init_types(void) +{ + types_region = newregion(); + + float_type = make_primitive + (tp_float, target->tfloat.size, target->tfloat.align); + double_type = make_primitive + (tp_double, target->tdouble.size, target->tdouble.align); + long_double_type = make_primitive + (tp_long_double, target->tlong_double.size, target->tlong_double.align); + + short_type = make_primitive + (tp_short, target->tshort.size, target->tshort.align); + unsigned_short_type = make_primitive + (tp_unsigned_short, target->tshort.size, target->tshort.align); + + int_type = make_primitive + (tp_int, target->tint.size, target->tint.align); + unsigned_int_type = make_primitive + (tp_unsigned_int, target->tint.size, target->tint.align); + + long_type = make_primitive + (tp_long, target->tlong.size, target->tlong.align); + unsigned_long_type = make_primitive + (tp_unsigned_long, target->tlong.size, target->tlong.align); + + long_long_type = make_primitive + (tp_long_long, target->tlong_long.size, target->tlong_long.align); + unsigned_long_long_type = make_primitive + (tp_unsigned_long_long, target->tlong_long.size, target->tlong_long.align); + + signed_char_type = make_primitive(tp_signed_char, 1, target->int1_align); + unsigned_char_type = make_primitive(tp_unsigned_char, 1, target->int1_align); + char_type = make_primitive(tp_char, 1, target->int1_align); + + int2_type = lookup_primitive(tp_int2, 2, target->int2_align, FALSE); + uint2_type = lookup_primitive(tp_uint2, 2, target->int2_align, TRUE); + int4_type = lookup_primitive(tp_int4, 4, target->int4_align, FALSE); + uint4_type = lookup_primitive(tp_uint4, 4, target->int4_align, TRUE); + int8_type = lookup_primitive(tp_int8, 8, target->int8_align, FALSE); + uint8_type = lookup_primitive(tp_uint8, 8, target->int8_align, TRUE); + + unknown_int_type = make_unknown_primitive(tp_unknown_int); + unknown_number_type = make_unknown_primitive(tp_unknown_number); + + char_array_type = make_array_type(char_type, NULL); + error_type = new_type(tk_error); + error_type->size = error_type->alignment = make_type_cval(1); + void_type = new_type(tk_void); + void_type->size = void_type->alignment = make_type_cval(1); + ptr_void_type = make_pointer_type(void_type); + const_ptr_void_type = + make_pointer_type(make_qualified_type(void_type, const_qualifier)); + + wchar_type = type_for_size_int(target->wchar_t_size, !target->wchar_t_signed); + wchar_array_type = make_array_type(wchar_type, NULL); + size_t_type = type_for_size_int(target->size_t_size, TRUE); + ptrdiff_t_type = type_for_size_int(target->tptr.size, FALSE); + intptr_type = type_for_size_int(target->tptr.size, TRUE); +} + +struct typelist +{ + region sameregion r; + struct typelist_element *sameregion first; +}; + +struct typelist_element +{ + struct typelist_element *sameregion next; + type t; +}; + +typelist new_typelist(region r) +{ + typelist tl = ralloc(r, struct typelist); + tl->r = r; + tl->first = NULL; + return tl; +} + +void typelist_append(typelist tl, type t) +{ + struct typelist_element *nte = ralloc(tl->r, struct typelist_element); + struct typelist_element *sameregion *last; + + nte->t = t; + last = &tl->first; + while (*last) + last = &(*last)->next; + *last = nte; +} + +bool empty_typelist(typelist tl) +{ + return tl->first == NULL; +} + +void typelist_scan(typelist tl, typelist_scanner *scanner) +{ + *scanner = tl->first; +} + +type typelist_next(typelist_scanner *scanner) +{ + type t; + + if (!*scanner) + return NULL; + t = (*scanner)->t; + *scanner = (*scanner)->next; + return t; +} + +type_quals type_qualifiers(type t) +{ + /* Arrays don't have qualifiers */ + while (t->kind == tk_array) + t = t->u.array.arrayof; + return t->qualifiers; +} + +#define Q(name, kind, tq, val) \ +bool type_ ## name(type t) \ +{ \ + return (type_qualifiers(t) & tq) != 0; \ +} +#include "qualifiers.h" +#undef Q + +bool type_transparent(type t) +{ + return (type_qualifiers(t) & transparent_qualifier) != 0; +} + +bool type_readonly(type t) +{ + return type_const(t) || (type_tagged(t) && type_tag(t)->fields_const); +} + +bool type_integral(type t) /* Does not include enum's */ +{ + return t->kind == tk_primitive && t->u.primitive < tp_first_floating; +} + +bool type_smallerthanint(type t) +{ + return t->kind == tk_primitive && t->u.primitive < tp_unknown_int && + cval_intcompare(t->size, int_type->size) < 0; +} + +bool type_unsigned(type t) +{ + if (t->kind == tk_primitive) + switch (t->u.primitive) + { + case tp_char: return !flag_signed_char; + case tp_unsigned_char: + case tp_unsigned_short: + case tp_unsigned_int: + case tp_unsigned_long: + case tp_unsigned_long_long: + case tp_uint2: case tp_uint4: case tp_uint8: + return TRUE; + default: break; + } + return FALSE; +} + +bool type_floating(type t) +{ + return t->kind == tk_primitive && t->u.primitive >= tp_first_floating && + t->u.primitive < tp_unknown_number; +} + +bool type_plain_char(type t) +{ + return t->kind == tk_primitive && t->u.primitive == tp_char; +} + +bool type_signed_char(type t) +{ + return t->kind == tk_primitive && t->u.primitive == tp_signed_char; +} + +bool type_unsigned_char(type t) +{ + return t->kind == tk_primitive && t->u.primitive == tp_unsigned_char; +} + +bool type_short(type t) +{ + return t->kind == tk_primitive && t->u.primitive == tp_short; +} + +bool type_unsigned_short(type t) +{ + return t->kind == tk_primitive && t->u.primitive == tp_unsigned_short; +} + +bool type_int(type t) +{ + return t->kind == tk_primitive && t->u.primitive == tp_int; +} + +bool type_unsigned_int(type t) +{ + return t->kind == tk_primitive && t->u.primitive == tp_unsigned_int; +} + +bool type_long(type t) +{ + return t->kind == tk_primitive && t->u.primitive == tp_long; +} + +bool type_unsigned_long(type t) +{ + return t->kind == tk_primitive && t->u.primitive == tp_unsigned_long; +} + +bool type_long_long(type t) +{ + return t->kind == tk_primitive && t->u.primitive == tp_long_long; +} + +bool type_unsigned_long_long(type t) +{ + return t->kind == tk_primitive && t->u.primitive == tp_unsigned_long_long; +} + +bool type_unknown_int(type t) +{ + return t->kind == tk_primitive && t->u.primitive == tp_unknown_int; +} + +bool type_float(type t) +{ + return t->kind == tk_primitive && t->u.primitive == tp_float; +} + +bool type_double(type t) +{ + return t->kind == tk_primitive && t->u.primitive == tp_double; +} + +bool type_long_double(type t) +{ + return t->kind == tk_primitive && t->u.primitive == tp_long_double; +} + +bool type_unknown_number(type t) +{ + return t->kind == tk_primitive && t->u.primitive == tp_unknown_number; +} + +bool type_unknown(type t) /* unknown_int or unknown_number */ +{ + return type_unknown_int(t) || type_unknown_number(t); +} + +bool type_char(type t) +{ + return t->kind == tk_primitive && + (t->u.primitive == tp_char || t->u.primitive == tp_unsigned_char || + t->u.primitive == tp_signed_char); +} + +bool type_void(type t) +{ + return t->kind == tk_void; +} + +bool type_function(type t) +{ + return t->kind == tk_function && t->u.fn.fkind == tkf_c; +} + +bool type_array(type t) +{ + return t->kind == tk_array; +} + +bool type_pointer(type t) +{ + return t->kind == tk_pointer; +} + +bool type_complex(type t) +{ + return t->kind == tk_complex; +} + +bool type_enum(type t) +{ + return t->kind == tk_tagged && t->u.tag->kind == kind_enum_ref; +} + +bool type_tagged(type t) +{ + return t->kind == tk_tagged; +} + +bool type_struct(type t) +{ + return t->kind == tk_tagged && + (t->u.tag->kind == kind_struct_ref || t->u.tag->kind == kind_nx_struct_ref); +} + +bool type_attribute(type t) +{ + return t->kind == tk_tagged && t->u.tag->kind == kind_attribute_ref; +} + +bool type_union(type t) +{ + return t->kind == tk_tagged && + (t->u.tag->kind == kind_union_ref || t->u.tag->kind == kind_nx_union_ref); +} + +type type_function_return_type(type t) +{ + assert(t->kind == tk_function); + return t->u.fn.returns; +} + +typelist type_function_arguments(type t) +{ + assert(t->kind == tk_function); + return t->u.fn.argtypes; +} + +bool type_function_varargs(type t) +{ + assert(t->kind == tk_function); + return t->u.fn.varargs; +} + +bool type_function_oldstyle(type t) +{ + assert(t->kind == tk_function); + return t->u.fn.oldstyle; +} + +type type_points_to(type t) +{ + assert(t->kind == tk_pointer); + return t->u.pointsto; +} + +type type_array_of(type t) +{ + assert(t->kind == tk_array); + return t->u.array.arrayof; +} + +type type_array_of_base(type t) +{ + while (t->kind == tk_array) + t = t->u.array.arrayof; + + return t; +} + +expression type_array_size(type t) +{ + assert(t->kind == tk_array); + return t->u.array.size; +} + +cval type_array_size_cval(type t) +/* Returns: number of elements in array type t if known, cval_top otherwise */ +{ + known_cst s; + + if (t->u.array.size && (s = t->u.array.size->cst) && + (constant_integral(s) || constant_unknown(s))) + return cval_cast(s->cval, size_t_type); + + return cval_top; +} + +tag_declaration type_tag(type t) +{ + assert(t->kind == tk_tagged); + return t->u.tag; +} + +bool type_incomplete(type t) +{ + return t->kind == tk_void || + (t->kind == tk_tagged && !t->u.tag->defined) || + (t->kind == tk_array && + (type_incomplete(t->u.array.arrayof) || !t->u.array.size)); +} + +/* Return TRUE if two type lists are equal */ +static bool type_lists_equal(typelist al1, typelist al2) +{ + struct typelist_element *args1 = al1->first, *args2 = al2->first; + + for (;;) + { + if (args1 == 0 && args2 == 0) + return TRUE; + /* If one list is shorter than the other, + they fail to match. */ + if (args1 == 0 || args2 == 0) + return FALSE; + + if (!type_equal(args1->t, args2->t)) + return FALSE; + + args1 = args1->next; + args2 = args2->next; + } +} + +/* Return TRUE if two function types F1 and F2 are equal. */ +bool function_equal(type t1, type t2) +{ + /* Function kinds and return types must match */ + if (!(t1->u.fn.fkind == t2->u.fn.fkind && + type_equal(t1->u.fn.returns, t2->u.fn.returns))) + return FALSE; + + if (!t1->u.fn.oldstyle && !t2->u.fn.oldstyle) + return t1->u.fn.varargs == t2->u.fn.varargs && + type_lists_equal(t1->u.fn.argtypes, t2->u.fn.argtypes); + else + return t1->u.fn.oldstyle == t2->u.fn.oldstyle; +} + +bool type_equal(type t1, type t2) +{ + return t1->qualifiers == t2->qualifiers && type_equal_unqualified(t1, t2); +} + +static bool array_sizes_match(type t1, type t2) +/* Return: TRUE if we think the array sizes of t1, t2 match + */ +{ + known_cst s1 = t1->u.array.size ? t1->u.array.size->cst : NULL; + known_cst s2 = t2->u.array.size ? t2->u.array.size->cst : NULL; + + // Non-constant array sizes match everything + // Unknown array sizes match everything too + // (XXX: we should check again after instantiation, but we'll leave + // that to the backend C compiler) + if (!s1 || !constant_integral(s1) || !s2 || !constant_integral(s2)) + return TRUE; + + return cval_intcompare(s1->cval, s2->cval) == 0; +} + +bool type_equal_unqualified(type t1, type t2) +{ + if (t1 == error_type || t2 == error_type) + return TRUE; + + /* The unknown types are actually not equal to themselves... */ + if (type_unknown_int(t1) || type_unknown_number(t1)) + return FALSE; + + /* Short-circuit easy case */ + if (t1 == t2) + return TRUE; + + /* Different classes of types can't be compatible. */ + if (t1->kind != t2->kind) + return FALSE; + + /* sameregion, traditional and parentptr qualifiers must always match */ + if ((t1->qualifiers & ~(const_qualifier | volatile_qualifier | restrict_qualifier | transparent_qualifier)) != + (t2->qualifiers & ~(const_qualifier | volatile_qualifier | restrict_qualifier | transparent_qualifier))) + return FALSE; + + /* Network base types are identified by their declaration */ + if (type_network_base_type(t1) || type_network_base_type(t2)) + return t1->basedecl == t2->basedecl; + + switch (t1->kind) + { + case tk_primitive: case tk_complex: + return t1->u.primitive == t2->u.primitive; + + case tk_void: + return TRUE; + + case tk_tagged: + return t1->u.tag == t2->u.tag; + + case tk_pointer: + return type_equal(t1->u.pointsto, t2->u.pointsto); + + case tk_function: + return function_equal(t1, t2); + + case tk_array: + return type_equal(t1->u.array.arrayof, t2->u.array.arrayof) && + array_sizes_match(t1, t2); + + case tk_variable: + return t1->u.tdecl == t2->u.tdecl; + + default: assert(0); return FALSE; + } +} + +/* Return TRUE if T is not affected by default promotions. */ +bool type_self_promoting(type t) +{ + if (t->kind != tk_primitive) + return TRUE; + + switch (t->u.primitive) + { + case tp_float: case tp_char: case tp_unsigned_char: case tp_signed_char: + case tp_short: case tp_unsigned_short: + return FALSE; + default: + return TRUE; + } +} + +/* Return TRUE if function type FNTYPE specifies a fixed number of parameters + and none of their types is affected by default promotions. + TRUE for oldstyle functions */ +bool self_promoting_args(type fntype) +{ + struct typelist_element *parms; + + if (type_function_varargs(fntype)) + return FALSE; + + if (type_function_oldstyle(fntype)) + return TRUE; + + for (parms = type_function_arguments(fntype)->first; parms; + parms = parms->next) + if (!type_self_promoting(parms->t)) + return FALSE; + + return TRUE; +} + +/* Allow wait (union {union wait *u; int *i}) + and wait (union wait *) to be compatible. */ +static bool weird_parameter_match(type t1, type t2) +{ + tag_declaration t1decl; + + if (type_union(t1) + && (!(t1decl = type_tag(t1))->name || t1decl->transparent_union) + && type_size_cc(t1) && type_size_cc(t2)) + { + cval s1 = type_size(t1), s2 = type_size(t2); + + /* We don't do this for types of unknown size */ + if (cval_isinteger(s1) && cval_isinteger(s2) && + cval_intcompare(s1, s2) == 0) + { + field_declaration field; + + for (field = t1decl->fieldlist; field; field = field->next) + if (type_compatible(field->type, t2)) + return TRUE; + } + } + return FALSE; +} + +static type weird_common_parameter(type t1, type t2) +{ + /* Given wait (union {union wait *u; int *i} *) + and wait (union wait *), + prefer union wait * as type of parm. */ + if (weird_parameter_match(t1, t2)) + { + if (pedantic) + pedwarn("function types not truly compatible in ANSI C"); + return t2; + } + return NULL; +} + +/* Check two lists of types for compatibility, + returning 0 for incompatible, 1 for compatible, + or 2 for compatible with warning. */ +static int type_lists_compatible(typelist al1, typelist al2) +{ + /* 1 if no need for warning yet, 2 if warning cause has been seen. */ + int val = 1; + int newval = 0; + struct typelist_element *args1 = al1->first, *args2 = al2->first; + + while (1) + { + if (args1 == 0 && args2 == 0) + return val; + /* If one list is shorter than the other, + they fail to match. */ + if (args1 == 0 || args2 == 0) + return 0; + + if (!(newval = type_compatible_unqualified(args1->t, args2->t))) + { + if (!weird_parameter_match(args1->t, args2->t) && + !weird_parameter_match(args2->t, args1->t)) + return 0; + } + + /* type_compatible said ok, but record if it said to warn. */ + if (newval > val) + val = newval; + + args1 = args1->next; + args2 = args2->next; + } +} + +/* Return 1 if two function types F1 and F2 are compatible. + If either type specifies no argument types, + the other must specify a fixed number of self-promoting arg types. + Otherwise, if one type specifies only the number of arguments, + the other must specify that number of self-promoting arg types. + Otherwise, the argument types must match. */ +int function_compatible(type t1, type t2) +{ + typelist args1, args2; + + /* 1 if no need for warning yet, 2 if warning cause has been seen. */ + int val = 1; + + /* Kinds and return types must match */ + if (!(t1->u.fn.fkind == t2->u.fn.fkind && + type_compatible(t1->u.fn.returns, t2->u.fn.returns))) + return 0; + + args1 = t1->u.fn.argtypes; + args2 = t2->u.fn.argtypes; + + /* An unspecified parmlist matches any specified parmlist + whose argument types don't need default promotions. */ + + if (t1->u.fn.oldstyle) + { + if (args2 && !self_promoting_args(t2)) + return 0; +#if 0 + /* If one of these types comes from a non-prototype fn definition, + compare that with the other type's arglist. + If they don't match, ask for a warning (but no error). */ + if (TYPE_ACTUAL_ARG_TYPES (f1) + && 1 != type_lists_compatible(args2, TYPE_ACTUAL_ARG_TYPES (f1))) + val = 2; +#endif + return val; + } + if (t2->u.fn.oldstyle) + { + if (args1 && !self_promoting_args(t1)) + return 0; +#if 0 + if (TYPE_ACTUAL_ARG_TYPES (f2) + && 1 != type_lists_compatible(args1, TYPE_ACTUAL_ARG_TYPES (f2))) + val = 2; +#endif + return val; + } + + if (t1->u.fn.varargs != t2->u.fn.varargs) + return 0; + + /* Both types have argument lists: compare them and propagate results. */ + return type_lists_compatible(args1, args2); +} + +static bool interface_equal(nesc_declaration i1, nesc_declaration i2) +/* Returns: TRUE if the interface types are equal, i.e., they have the + same type arguments to the same base interface +*/ +{ + type_parm_decl p1 = CAST(type_parm_decl, i1->parameters), + p2 = CAST(type_parm_decl, i2->parameters); + + if (original_component(i1) != original_component(i2)) + return FALSE; + + while (p1 && p2) + { + if (!type_equal(p1->ddecl->type, p2->ddecl->type)) + return FALSE; + + p1 = CAST(type_parm_decl, p1->next); + p2 = CAST(type_parm_decl, p2->next); + } + + return p1 == NULL && p2 == NULL; /* or p1 == p2 ;-) */ +} + +bool type_compatible_unqualified(type t1, type t2) +{ + if (t1 == error_type || t2 == error_type) + return 1; + + /* The unknown types are actually not compatible with themselves... */ + if (type_unknown_int(t1) || type_unknown_number(t1)) + return FALSE; + + /* Short-circuit easy case */ + if (t1 == t2) + return 1; + + /* Different classes of types can't be compatible. */ + if (t1->kind != t2->kind) + return 0; + +#if 0 + /* The combiners must match too */ + if (t1->combiner != t2->combiner) + return 0; +#endif + + /* sameregion, traditional and parentptr qualifiers must always match */ + if ((t1->qualifiers & ~(const_qualifier | volatile_qualifier | restrict_qualifier | transparent_qualifier)) != + (t2->qualifiers & ~(const_qualifier | volatile_qualifier | restrict_qualifier | transparent_qualifier))) + return 0; + + /* Network base types are identified by their declaration */ + if (type_network_base_type(t1) || type_network_base_type(t2)) + return t1->basedecl == t2->basedecl; + + switch (t1->kind) + { + case tk_primitive: case tk_complex: + return t1->u.primitive == t2->u.primitive; + + case tk_void: + return 1; + + case tk_tagged: + return t1->u.tag == t2->u.tag; + + case tk_pointer: + return type_compatible(t1->u.pointsto, t2->u.pointsto); + + case tk_function: + return function_compatible(t1, t2); + + case tk_array: + return type_compatible(t1->u.array.arrayof, t2->u.array.arrayof) && + array_sizes_match(t1, t2); + + case tk_iref: + return interface_equal(t1->u.iref->itype, t2->u.iref->itype); + + case tk_cref: + return t1->u.cref == t2->u.cref; + + case tk_variable: + return t1->u.tdecl == t2->u.tdecl; + + default: assert(0); return 0; + } +} + +bool type_compatible(type t1, type t2) +{ + /* Qualifiers must match. */ + /* GCC appears to allow changes to restrict (see /usr/include/sys/stat.h + and the decls/defs of stat/lstat in redhat linux 7) */ + /* XXX: investigate more. */ + if ((t1->qualifiers & ~restrict_qualifier) != (t2->qualifiers & ~restrict_qualifier)) + return 0; + else + return type_compatible_unqualified(t1, t2); +} + +type qualify_type1(type t, type t1) +{ + return make_qualified_type(t, type_qualifiers(t1)); +} + +type qualify_type2(type t, type t1, type t2) +{ + return make_qualified_type(t, type_qualifiers(t1) | type_qualifiers(t2)); +} + +type align_type(type t, cval new_alignment) +{ + type nt = copy_type(t); + + nt->alignment = new_alignment; + nt->user_align = TRUE; + + return nt; +} + +bool type_realigned(type t) +{ + return t->user_align; +} + +static int common_primitive_type(type t1, type t2) +{ + int pk1 = t1->u.primitive, pk2 = t2->u.primitive; + int pk = pk1 < pk2 ? pk2 : pk1; + + /* Note: the results of this function depend on the relative sizes of + char, short, int, long and long long. The results are only correct + for a version of C that has types that match those set by types_init + (which uses those from the C compiler that compiles this file) + */ + if (pk1 < tp_first_floating && pk2 < tp_first_floating) + { + largest_uint s1, s2; + + /* The simple cases */ + if (pk1 == tp_unknown_int || pk2 == tp_unknown_int) + return tp_unknown_int; + + s1 = cval_uint_value(t1->size); + s2 = cval_uint_value(t2->size); + if (s1 < s2) + return pk2; + else if (s1 > s2) + return pk1; + + /* The pain starts, see 6.3.1.8 of c9x */ + /* If the sizes are the same, then we can't have a tp_[u]int or a + tp_char/short/int/long/etc pair (as we only have tp_[u]int if there + is no corresponding integer type of the same size. So we can compare rank + by comparing pk1 and pk2 */ + assert(!((pk1 < tp_char && pk2 >= tp_char) || + (pk1 >= tp_char && pk2 < tp_char))); + + /* the higher rank wins, and if either of the types is unsigned, the + result is unsigned (thus unsigned short + int == unsigned int if + sizeof(short) == sizeof(int) */ + if ((type_unsigned(t1) || type_unsigned(t2)) && !type_unsigned(primitive_types[pk])) + /* A bit inefficient, admittedly */ + pk = make_unsigned_type(primitive_types[pk])->u.primitive; + + return pk; + } + + /* Floating point types follow the order specified in the enum and win + over all integral types. This includes unknown_number winning over + everybody. */ + return pk; +} + +/* Return the common type of two types. + + This is used in two cases: + - when type_compatible(t1, t2) is true, to pick a merged type for + declarations + - to merge two types that are compatible in some expressions (e.g. ?:, + arithmetic) */ +type common_type(type t1, type t2) +{ + type rtype; + data_declaration combiner; + + /* Save time if the two types are the same. */ + if (t1 == t2) + return t1; + + /* If one type is nonsense, use the other. */ + if (t1 == error_type) + return t2; + if (t2 == error_type) + return t1; + + combiner = NULL; + if (t1->combiner == t2->combiner) + combiner = t1->combiner; + + /* Special enum handling: if same enum, just merge qualifiers. otherwise + treat an enum type as the unsigned integer type of the same width. + Note that gcc does not check for the same enum. Some weird behaviour... + (see enum2.c) + */ + if (type_enum(t1)) + { + if (type_equal_unqualified(t1, t2)) + return make_combiner_type(qualify_type2(t1, t1, t2), combiner); + t1 = qualify_type1(type_for_size(type_size(t1), TRUE), t1); + } + if (type_enum(t2)) + t2 = qualify_type1(type_for_size(type_size(t1), TRUE), t2); + + /* If one type is complex, form the common type of the non-complex + components, then make that complex. */ + if (type_complex(t1) || type_complex(t2)) + { + int pk = common_primitive_type(t1, t2); + assert((t1->kind == tk_primitive || t1->kind == tk_complex) && + (t2->kind == tk_primitive || t2->kind == tk_complex)); + rtype = complex_types[pk]; + } + else + switch (t1->kind) + { + case tk_primitive: + /* We need to preserve equivalent network base types because + common_type is used for redeclarations */ + if (type_network_base_type(t1) && type_network_base_type(t2) && + t1->basedecl == t2->basedecl) + rtype = make_qualified_type(t1, 0); + else + { + int pk = common_primitive_type(t1, t2); + assert(t2->kind == tk_primitive); + rtype = primitive_types[pk]; + + break; + } + + case tk_void: case tk_tagged: case tk_variable: + rtype = t1; + break; + + case tk_pointer: + rtype = make_pointer_type(common_type(t1->u.pointsto, t2->u.pointsto)); + break; + + case tk_array: + { + /* Merge the element types, and have a size if either arg has one. */ + type element_type = + common_type(t1->u.array.arrayof, t2->u.array.arrayof); + expression size1 = t1->u.array.size, size2 = t2->u.array.size; + + rtype = make_array_type(element_type, size1 ? size1 : size2); + break; + } + + case tk_function: + /* Function types: prefer the one that specified arg types. + If both do, merge the arg types. Also merge the return types. */ + { + type valtype = common_type(t1->u.fn.returns, t2->u.fn.returns); + typelist args; + bool oldstyle, varargs; + + if (t1->u.fn.oldstyle && t2->u.fn.oldstyle) + { + args = NULL; + oldstyle = TRUE; + varargs = FALSE; + } + else if (t1->u.fn.oldstyle) + { + args = t2->u.fn.argtypes; + oldstyle = FALSE; + varargs = t2->u.fn.varargs; + } + else if (t2->u.fn.oldstyle) + { + args = t1->u.fn.argtypes; + oldstyle = FALSE; + varargs = t1->u.fn.varargs; + } + else + { + /* If both args specify argument types, we must merge the two + lists, argument by argument. */ + struct typelist_element *args1 = t1->u.fn.argtypes->first; + struct typelist_element *args2 = t2->u.fn.argtypes->first; + type argtype; + + oldstyle = FALSE; + varargs = t1->u.fn.varargs; + args = new_typelist(t1->u.fn.argtypes->r); + + while (args1) + { + (void) ((argtype = weird_common_parameter(args1->t, args2->t)) || + (argtype = weird_common_parameter(args2->t, args1->t)) || + (argtype = common_type(args1->t, args2->t))); + typelist_append(args, argtype); + + args1 = args1->next; + args2 = args2->next; + } + + } + rtype = make_function_type(valtype, args, varargs, oldstyle); + /* Hack up the function kind */ + rtype->u.fn.fkind = t1->u.fn.fkind; + break; + } + + default: + assert(0); return NULL; + } + + rtype = qualify_type2(rtype, t1, t2); + + return make_combiner_type(rtype, combiner); +} + + +type type_base(type t) +{ + while (t->kind == tk_array) + t = t->u.array.arrayof; + + return t; +} + +bool type_integer(type t) +{ + return type_integral(t) || type_enum(t) || + (type_variable(t) && type_variable_decl(t)->typevar_kind == typevar_integer); +} + +bool type_real(type t) +{ + return type_integer(t) || type_floating(t) || type_unknown_number(t) || + (type_variable(t) && type_variable_decl(t)->typevar_kind == typevar_number); +} + +bool type_arithmetic(type t) +{ + return type_real(t) || type_complex(t); +} + +bool type_scalar(type t) +{ + return type_arithmetic(t) || type_pointer(t); +} + +bool type_aggregate(type t) +{ + return type_struct(t) || type_union(t) || type_attribute(t); +} + +type make_unsigned_type(type t) +{ + if (t->kind != tk_primitive) + return t; + + switch (t->u.primitive) + { + case tp_char: case tp_signed_char: + return qualify_type1(unsigned_char_type, t); + case tp_short: return qualify_type1(unsigned_short_type, t); + case tp_int: return qualify_type1(unsigned_int_type, t); + case tp_long: return qualify_type1(unsigned_long_type, t); + case tp_long_long: return qualify_type1(unsigned_long_long_type, t); + case tp_int2: return qualify_type1(uint2_type, t); + case tp_int4: return qualify_type1(uint4_type, t); + case tp_int8: return qualify_type1(uint8_type, t); + default: break; + } + assert(type_unknown_int(t) || type_unknown_number(t) || type_unsigned(t)); + + return t; +} + +static type_element rid2ast(region r, location loc, int keyword, type_element rest) +{ + type_element ast = CAST(type_element, new_rid(r, loc, keyword)); + ast->next = CAST(node, rest); + return ast; +} + +static type_element qualifier2ast(region r, location loc, int keyword, type_element rest) +{ + type_element ast = CAST(type_element, new_qualifier(r, loc, keyword)); + ast->next = CAST(node, rest); + return ast; +} + +static type_element qualifiers2ast(region r, location loc, type_quals quals, + type_element rest) +{ + if (quals & volatile_qualifier) + rest = qualifier2ast(r, loc, volatile_qualifier, rest); + if (quals & const_qualifier) + rest = qualifier2ast(r, loc, const_qualifier, rest); + return rest; +} + +static type_element primitive2ast(region r, location loc, int primitive, + type_element rest) +{ + bool isunsigned = FALSE; + int keyword; + + switch (primitive) + { + case tp_unsigned_char: + isunsigned = TRUE; + case tp_char: + keyword = RID_CHAR; + break; + case tp_signed_char: + return rid2ast(r, loc, RID_SIGNED, rid2ast(r, loc, RID_CHAR, rest)); + case tp_unsigned_short: + isunsigned = TRUE; + case tp_short: + keyword = RID_SHORT; + break; + case tp_unsigned_int: + isunsigned = TRUE; + case tp_int: + keyword = RID_INT; + break; + case tp_unsigned_long: + isunsigned = TRUE; + case tp_long: + keyword = RID_LONG; + break; + case tp_unsigned_long_long: + isunsigned = TRUE; + case tp_long_long: + keyword = RID_LONG; + rest = rid2ast(r, loc, RID_LONG, rest); + break; + case tp_float: + keyword = RID_FLOAT; + break; + case tp_double: + keyword = RID_DOUBLE; + break; + case tp_long_double: + keyword = RID_DOUBLE; + rest = rid2ast(r, loc, RID_LONG, rest); + break; + default: + assert(0); + keyword = RID_INT; break; + } + + rest = rid2ast(r, loc, keyword, rest); + if (isunsigned) + rest = rid2ast(r, loc, RID_UNSIGNED, rest); + + return rest; +} + +#define UNNAMED_STRUCT_PREFIX "__nesc_unnamed" + +void name_tag(tag_declaration tag) +{ + /* Name unnamed structs, unions or enums */ + if (!tag->name) + { + static long nextid = 4242; + char tagname[sizeof(UNNAMED_STRUCT_PREFIX) + 20]; + + sprintf(tagname, UNNAMED_STRUCT_PREFIX "%ld", nextid++); + tag->definition->word1 = new_word(parse_region, dummy_location, + str2cstring(parse_region, tagname)); + tag->name = tag->definition->word1->cstring.data; + } +} + +static type_element tag2ast(region r, location loc, tag_declaration tag, + type_element rest) +{ + tag_ref tr; + + name_tag(tag); + tr = newkind_tag_ref(r, tag->kind, loc, + new_word(r, loc, str2cstring(r, tag->name)), + NULL, NULL, FALSE); + + tr->tdecl = tag; + tr->next = CAST(node, rest); + + /* creating a type naming a tag that shadows another is tricky as + the placement of the type affects its meaning. + + The current use of type2ast is for declaring temporaries. These are + placed at the start of the closest enclosing block. This is correct as + long as the temporary does not rely on a tag declared in the same + block that shadows a tag in an enclosing scope (as the temporary would + then erroneously refer to the enclosing tag). The simplest check which + detects this situation is any use of a shadowed tag (which I am + assuming are very rare anyway). + + The correct solution is that if the type of temporary x refers to tags + t1...tn declared in the current block, then x should be placed just + before the declaration of the latest of ti, the tag in t1...tn which + was declared latest, and the declaration of x should be preceded by + 'struct/union/enum ti;'. This is somewhat painful. + + To avoid any problems, compile with error_shadow = warn_shadow = 1 + (this is what RC does) */ + + assert(!tag->shadowed); + + return CAST(type_element, tr); +} + +static type_element typevar2ast(region r, location loc, data_declaration tvar, + type_element rest) +{ + type_element tname; + + /* Unlike with tags, we don't need to worry about whether the type variable + is shadowed, as type variables are always replaced by their value in + generated code... + If we were to re-output nesC code, we could run into problems. */ + tname = CAST(type_element, new_typename(r, loc, tvar)); + tname->next = CAST(node, rest); + + return tname; +} + +static declaration parameter2ast(region r, location loc, type t) +{ + variable_decl vd; + data_decl dd; + declarator tdeclarator; + type_element tmodifiers; + + /* Build AST for the declaration */ + type2ast(r, loc, t, NULL, &tdeclarator, &tmodifiers); + vd = new_variable_decl(r, loc, tdeclarator, NULL, NULL, NULL, NULL); + vd->declared_type = t; + dd = new_data_decl(r, loc, tmodifiers, CAST(declaration, vd)); + + return CAST(declaration, dd); +} + +/* Build AST nodes such that "MODIFIERS D" represents the declaration of + "T INSIDE", at location loc, allocating in region r */ +void type2ast(region r, location loc, type t, declarator inside, + declarator *d, type_element *modifiers) +{ + /* XXX: De-recursify */ + type_element qualifiers = qualifiers2ast(r, loc, t->qualifiers, NULL); + + /* A network base type uses its typedef name (it is effectively a new + type, not a typedef) */ + if (type_network_base_type(t)) + { + typename tname = new_typename(r, loc, t->basedecl); + + tname->next = CAST(node, qualifiers); + *d = inside; + *modifiers = CAST(type_element, tname); + return; + } + + switch (t->kind) + { + case tk_primitive: + *modifiers = primitive2ast(r, loc, t->u.primitive, qualifiers); + *d = inside; + break; + case tk_complex: + *modifiers = + rid2ast(r, loc, RID_COMPLEX, + primitive2ast(r, loc, t->u.primitive, qualifiers)); + *d = inside; + break; + case tk_tagged: + *modifiers = tag2ast(r, loc, t->u.tag, qualifiers); + *d = inside; + break; + case tk_void: + *modifiers = rid2ast(r, loc, RID_VOID, qualifiers); + *d = inside; + break; + case tk_pointer: + if (qualifiers) + inside = CAST(declarator, + new_qualified_declarator(r, loc, inside, qualifiers)); + inside = CAST(declarator, + new_pointer_declarator(r, loc, inside)); + type2ast(r, loc, t->u.pointsto, inside, d, modifiers); + break; + case tk_array: + assert(qualifiers == NULL); + inside = CAST(declarator, + new_array_declarator(r, loc, inside, t->u.array.size)); + type2ast(r, loc, t->u.array.arrayof, inside, d, modifiers); + break; + case tk_function: { + declaration parms; + + assert(t->u.fn.fkind == tkf_c); /* XXX: not done for nesC stuff yet + (not needed yet) */ + /* XXX: doesn't rebuild fn qualifiers. Are we generating C here + or not ? */ + /* XXX: Should build environment for parameters */ + if (t->u.fn.oldstyle) + parms = NULL; + else if (empty_typelist(t->u.fn.argtypes)) + parms = parameter2ast(r, loc, void_type); + else + { + struct typelist_element *args = t->u.fn.argtypes->first; + declaration *lastparm = &parms; + + while (args) + { + *lastparm = parameter2ast(r, loc, args->t); + lastparm = (declaration *)&(*lastparm)->next; + args = args->next; + } + if (t->u.fn.varargs) + { + *lastparm = CAST(declaration, new_ellipsis_decl(r, loc)); + lastparm = (declaration *)&(*lastparm)->next; + } + *lastparm = NULL; + } + inside = CAST(declarator, + new_function_declarator(r, loc, inside, parms, NULL, NULL, NULL)); + type2ast(r, loc, t->u.fn.returns, inside, d, modifiers); + break; + } + case tk_variable: + *modifiers = typevar2ast(r, loc, t->u.tdecl, qualifiers); + *d = inside; + break; + default: assert(0); break; + } +} + +bool type_contains_pointers(type t) +{ + field_declaration field; + + if (type_pointer(t)) + return TRUE; + + if (type_array(t)) + return type_contains_pointers(type_array_of(t)); + + if (!type_aggregate(t)) + return FALSE; + + for (field = type_tag(t)->fieldlist; field; field = field->next) + if (type_contains_pointers(field->type)) + return TRUE; + + return FALSE; +} + +bool type_contains_union_with_pointers(type t) +{ + field_declaration field; + + if (type_array(t)) + return type_contains_union_with_pointers(type_array_of(t)); + + if (type_union(t)) + return type_contains_pointers(t); + + if (!type_struct(t)) + return FALSE; + + for (field = type_tag(t)->fieldlist; field; field = field->next) + if (type_contains_union_with_pointers(field->type)) + return TRUE; + + return FALSE; +} + +type type_default_conversion(type from) +{ + if (type_enum(from)) + from = type_tag(from)->reptype; + + if (type_smallerthanint(from)) + { + /* Traditionally, unsignedness is preserved in default promotions. */ + if (flag_traditional && type_unsigned(from)) + return unsigned_int_type; + else + return int_type; + } + /* Note: if we had a type of same size as int, but of lesser rank, we should be + returning one of int/unsigned int here, but we don't support that kind of + type */ + + if (flag_traditional && !flag_allow_single_precision && type_float(from)) + return double_type; + + if (type_function(from)) + return make_pointer_type(from); + + if (type_array(from)) + return make_pointer_type(type_array_of(from)); + + if (type_variable(from)) + { + data_declaration vdecl = type_variable_decl(from); + + switch (vdecl->typevar_kind) + { + case typevar_integer: return unknown_int_type; + case typevar_number: return unknown_number_type; + default: break; + } + } + + return from; +} + +/* would be called type_default_function_array_conversion in gcc 3.x */ +type type_default_conversion_for_assignment(type from) +{ + if (type_array(from) || type_function(from)) + return type_default_conversion(from); + else + return from; +} + +type function_call_type(function_call fcall) +{ + type fntype = fcall->arg1->type; + + if (type_pointer(fntype)) + fntype = type_points_to(fntype); + + assert(type_functional(fntype)); + + return fntype; +} + +cval type_size(type t) +/* Requires: type_size_cc(t) + Returns: size of type t in a cval. The cval is either unknown (for types + derived in some way from template arguments) or an unsigned number +*/ +{ + assert(type_size_cc(t)); + + if (type_tagged(t)) + return t->u.tag->size; + + if (type_array(t)) + return cval_times(type_array_size_cval(t), type_size(t->u.array.arrayof)); + + return t->size; +} + +largest_uint type_size_int(type t) +/* Requires: type_size_cc(t) && cval_isinteger(type_size(t)) + (i.e., t not variable or unknown size) + Returns: size of t +*/ +{ + return cval_uint_value(type_size(t)); +} + +cval type_alignment(type t) +{ + assert(type_has_size(t)); + + if (!cval_istop(t->alignment)) /* Possibly overridden alignment */ + return t->alignment; + + if (type_tagged(t)) + return t->u.tag->alignment; + + if (type_array(t)) + return type_alignment(t->u.array.arrayof); + + /* We should never get here (all types have non-zero alignment) */ + assert(0); + + return t->alignment; +} + +/* True if the sizeof of t is a compile-time constant (known or unknown) + */ +bool type_size_cc(type t) +{ + if (!type_has_size(t)) + return FALSE; + + if (type_tagged(t)) + return !cval_istop(t->u.tag->size); + + if (type_array(t)) + return !cval_istop(type_array_size_cval(t)) && + type_size_cc(t->u.array.arrayof); + + return TRUE; +} + +bool type_has_size(type t) +{ + /* Similar, but not identical to, type_incomplete */ + return type_void(t) || !type_incomplete(t); +} + + +char *qualifier_name(type_quals q) +{ + switch (q) + { + default: abort(); return NULL; +#define Q(name, kind, tq, val) case tq: return #name; +#include "qualifiers.h" +#undef Q + } +} + +/* nesc types */ +bool type_command(type t) +{ + return t->kind == tk_function && t->u.fn.fkind == tkf_command; +} + +bool type_event(type t) +{ + return t->kind == tk_function && t->u.fn.fkind == tkf_event; +} + +bool type_task(type t) +{ + return t->kind == tk_function && t->u.fn.fkind == tkf_task; +} + +bool type_generic(type t) +{ + return t->kind == tk_function && t->u.fn.fkind == tkf_generic; +} + +type make_command_type(type t, typelist argtypes, bool varargs) +{ + type newt = make_function_type(t, argtypes, varargs, FALSE); + newt->u.fn.fkind = tkf_command; + return newt; +} + +type make_event_type(type t, typelist argtypes, bool varargs) +{ + type newt = make_function_type(t, argtypes, varargs, FALSE); + newt->u.fn.fkind = tkf_event; + return newt; +} + +type make_task_type(type t, typelist argtypes, bool varargs) +{ + type newt = make_function_type(t, argtypes, varargs, FALSE); + newt->u.fn.fkind = tkf_task; + return newt; +} + +type make_generic_type(type t, typelist argtypes) +{ + type newt = make_function_type(t, argtypes, FALSE, FALSE); + newt->u.fn.fkind = tkf_generic; + return newt; +} + +type make_interface_type(data_declaration itype) +{ + type nt = new_type(tk_iref); + nt->u.iref = itype; + + /* These are not yet stored, but I'll assume they might be like + pointers some day... */ + /* ASSUME: all pointers are the same */ + nt->size = make_type_cval(target->tptr.size); + nt->alignment = make_type_cval(target->tptr.align); + + return nt; +} + +bool type_interface(type t) +{ + return t->kind == tk_iref; +} + +data_declaration type_iref(type t) +{ + assert(type_interface(t)); + return t->u.iref; +} + +type make_component_type(data_declaration ctype) +{ + type nt = new_type(tk_cref); + nt->u.cref = ctype; + + /* These are not yet stored, but I'll assume they might be like + pointers some day... */ + /* ASSUME: all pointers are the same */ + nt->size = make_type_cval(target->tptr.size); + nt->alignment = make_type_cval(target->tptr.align); + + return nt; +} + +bool type_component(type t) +{ + return t->kind == tk_cref; +} + +data_declaration type_cref(type t) +{ + assert(type_component(t)); + return t->u.cref; +} + +bool type_functional(type t) +{ + return t->kind == tk_function && t->u.fn.fkind != tkf_generic; +} + +type make_combiner_type(type t, data_declaration combiner) +{ + type nt; + + if (!combiner) + return t; + + nt = copy_type(t); + nt->combiner = combiner; + + return nt; +} + +data_declaration type_combiner(type t) +{ + return t->combiner; +} + +void set_typedef_type(data_declaration def, bool network) +/* Requires: def->kind == decl_typedef + Effects: Sets def's type to remember the typedef it comes from + If network is true, the type becomes a network base type +*/ +{ + type nt = copy_type(def->type); + + if (network) + { + nt->network = nx_base; + nt->alignment = make_type_cval(1); + nt->basedecl = def; + } + nt->typedefdecl = def; + + def->type = nt; +} + +data_declaration type_typedef(type t) +/* Returns: the typedef t comes from, or NULL if none +*/ +{ + return t->typedefdecl; +} + +data_declaration type_networkdef(type t) +/* Requires: type_network_base_type(t) + Returns: the network base type definition for t +*/ +{ + assert(type_network_base_type(t)); + return t->basedecl; +} + +bool type_network_base_type(type t) +{ + return t->network == nx_base; +} + +type type_network_platform_type(type t) +/* Requires: type_network_base_type(t) + Returns: t's non-network base type +*/ +{ + return type_networkdef(t)->basetype; +} + +/* Type variables */ +type make_variable_type(data_declaration tdecl) +/* Requires: tdecl->kind == decl_typedef. +*/ +{ + type nt = new_type(tk_variable); + nt->u.tdecl = tdecl; + + /* Type variables have unknown size and alignment */ + nt->size = nt->alignment = cval_unknown_number; + + return nt; +} + +bool type_variable(type t) +{ + return t->kind == tk_variable; +} + +data_declaration type_variable_decl(type t) +{ + assert(type_variable(t)); + return t->u.tdecl; +} + +typelist instantiate_typelist(typelist old) +/* Returns: An instantiated copy of typelist old, allocated in the same + region +*/ +{ + typelist new = new_typelist(old->r); + struct typelist_element *scan = old->first; + + while (scan) + { + typelist_append(new, instantiate_type(scan->t)); + scan = scan->next; + } + + return new; +} + +type instantiate_type(type t) +/* Effects: Instantiate a type with type variables based on the instantiation + of the variables and tag declarations. These are found in + type_variable_decl(vartype)->instantiation->type for variables + type_tag(tagtype)->instantiation for tags + Returns: The instantiated type +*/ +{ + type newt = NULL; + + /* Instantiating an unknown type is not possible (we don't know what + type to produce) */ + assert(!type_unknown(t)); + + switch (t->kind) + { + case tk_tagged: + if (t->u.tag->instantiation) + newt = make_tagged_type(t->u.tag->instantiation); + break; + + case tk_pointer: + newt = make_pointer_type(instantiate_type(t->u.pointsto)); + break; + + case tk_function: { + type ret = instantiate_type(t->u.fn.returns); + typelist args = NULL; + + if (t->u.fn.argtypes) + args = instantiate_typelist(t->u.fn.argtypes); + + newt = make_function_type(ret, args, t->u.fn.varargs, t->u.fn.oldstyle); + newt->u.fn.fkind = t->u.fn.fkind; + break; + } + case tk_array: + newt = make_array_type(instantiate_type(t->u.array.arrayof), + !t->u.array.size ? NULL : + CAST(expression, t->u.array.size->instantiation)); + break; + + case tk_iref: + if (t->u.iref->instantiation) + newt = make_interface_type(t->u.iref->instantiation); + break; + + case tk_cref: + if (t->u.cref->instantiation) + newt = make_component_type(t->u.cref->instantiation); + break; + + case tk_variable: + if (t->u.tdecl->instantiation) + newt = t->u.tdecl->instantiation->type; + break; + + default: + break; + } + + if (newt) + return make_qualified_type(newt, t->qualifiers); + else + return t; +} + +static char *primname[] = { + NULL, /* error */ + "int16_t", + "uint16_t", + "int32_t", + "uint32_t", + "int64_t", + "uint64_t", + "char", + "signed char", + "unsigned char", + "short", + "unsigned short", + "int", + "unsigned int", + "long", + "unsigned long", + "long long", + "unsigned long long", + "unknown int", + "float", + "double", + "long double", + "unknown number" +}; + +static const char *rconcat(region r, const char *s1, const char *s2) +{ + int l = strlen(s1) + strlen(s2) + 1; + char *s = rstralloc(r, l); + + strcpy(s, s1); + strcat(s, s2); + + return s; +} + +static const char *add_qualifiers(region r, type_quals qs, const char *to) +{ + type_quals q; + + for (q = 1; q < last_qualifier; q <<= 1) + if (qs & q) + { + to = rconcat(r, " ", to); + to = rconcat(r, qualifier_name(q), to); + } + + return to; +} + +static const char *add_parens(region r, const char *to) +{ + to = rconcat(r, "(", to); + to = rconcat(r, to, ")"); + return to; +} + +static void split_type_name(region r, type t, const char **prefix, + const char **decls, bool decls_is_star) +{ + const char *basic; + + switch (t->kind) + { + case tk_primitive: + basic = primname[t->u.primitive]; + basic = add_qualifiers(r, t->qualifiers, basic); + break; + case tk_complex: + basic = rconcat(r, "complex ", primname[t->u.primitive]); + basic = add_qualifiers(r, t->qualifiers, basic); + break; + case tk_void: + basic = "void"; + basic = add_qualifiers(r, t->qualifiers, basic); + break; + case tk_pointer: + *decls = add_qualifiers(r, t->qualifiers, *decls); + *decls = rconcat(r, "*", *decls); + split_type_name(r, t->u.pointsto, &basic, decls, TRUE); + break; + case tk_array: + /* can't have qualifiers here - see make_qualified_type */ + if (decls_is_star) + *decls = add_parens(r, *decls); + *decls = rconcat(r, *decls, "[]"); + split_type_name(r, t->u.array.arrayof, &basic, decls, FALSE); + break; + case tk_function: { + const char *args= ""; + + if (!t->u.fn.oldstyle) + { + typelist_scanner scanargs; + type argt; + bool first = TRUE; + + typelist_scan(t->u.fn.argtypes, &scanargs); + while ((argt = typelist_next(&scanargs))) + { + if (!first) + args = rconcat(r, args, ", "); + args = rconcat(r, args, type_name(r, argt)); + first = FALSE; + } + if (t->u.fn.varargs) + args = rconcat(r, args, ", ..."); + } + + if (decls_is_star) + *decls = add_parens(r, *decls); + + if (t->qualifiers) + /* This isn't legal C syntax, but seems the reasonable rep */ + *decls = add_parens(r, add_qualifiers(r, t->qualifiers, *decls)); + + *decls = rconcat(r, *decls, add_parens(r, args)); + + split_type_name(r, t->u.fn.returns, &basic, decls, FALSE); + break; + } + case tk_tagged: { + tag_declaration tdecl = t->u.tag; + + basic = rconcat(r, tagkind_name(tdecl->kind), " "); + + if (tdecl->container) + { + basic = rconcat(r, basic, tdecl->container->name); + basic = rconcat(r, basic, "."); + } + if (tdecl->name) + basic = rconcat(r, basic, tdecl->name); + else + basic = rconcat(r, basic, "/*anon*/"); + basic = add_qualifiers(r, t->qualifiers, basic); + break; + } + default: /* for bugs, tk_error tk_iref tk_cref */ + basic = "error"; + break; + } + + *prefix = basic; +} + +const char *type_name(region r, type t) +{ + const char *prefix, *decls; + + decls = ""; + split_type_name(r, t, &prefix, &decls, FALSE); + + if (decls[0]) + return rconcat(r, prefix, rconcat(r, " ", decls)); + else + return prefix; +} + +static void nxml_typedef(data_declaration tdef) +{ + xindent(); + xstartline(); + xml_tag("typename"); + nxml_ddecl_ref(tdef); + xml_pop(); + xnewline(); + xunindent(); +} + +void nxml_type(type t) +{ + type_quals quals = type_qualifiers(t) & (const_qualifier | volatile_qualifier | restrict_qualifier); + data_declaration tdef = type_typedef(t); + + xstartline(); + + if (quals) + { + indentedtag_start("type-qualified"); +#define Q(name, kind, tq, val) \ + if (quals & val) xml_attr_noval(# name); +#include "qualifiers.h" +#undef Q + xml_tag_end(); + xnewline(); + if (tdef) + { + nxml_typedef(tdef); + tdef = NULL; + } + } + + switch (t->kind) + { + case tk_primitive: + if (t->u.primitive < tp_first_floating) + xml_tag_start("type-int"); + else + xml_tag_start("type-float"); + xml_attr("cname", primname[t->u.primitive]); + xml_attr_bool("unsigned", type_unsigned(t)); + break; + case tk_complex: + if (t->u.primitive < tp_first_floating) + { + xml_tag_start("type-complex-int"); + xml_attr_bool("unsigned", type_unsigned(primitive_types[t->u.primitive])); + } + else + xml_tag_start("type-complex-float"); + xml_attr("cname", primname[t->u.primitive]); + break; + case tk_void: + xml_tag_start("type-void"); + break; + case tk_pointer: + xml_tag_start("type-pointer"); + break; + case tk_array: + xml_tag_start("type-array"); + xml_attr_cval("elements", type_array_size_cval(t)); + break; + case tk_function: + xml_tag_start("type-function"); + xml_attr_bool("oldstyle", t->u.fn.oldstyle); + xml_attr_bool("varargs", t->u.fn.varargs); + break; + case tk_tagged: + xml_tag_start("type-tag"); + break; + case tk_iref: + xml_tag_start("type-interface"); + break; + case tk_cref: + xml_tag_start("type-component"); + break; + case tk_variable: + xml_tag_start("type-var"); + break; + default: /* for bugs */ + xml_tag_start("type-error"); + break; + } + + xml_attr_cval("size", type_size_cc(t) ? type_size(t) : cval_top); + xml_attr_cval("alignment", type_has_size(t) ? type_alignment(t) : cval_top); + if (t->network == nx_base) + xml_attr("network", t->basedecl->name); + + switch (t->kind) + { + default: + xml_tag_end(); + break; + + case tk_pointer: + xml_tag_end(); + xnewline(); xindent(); + nxml_type(t->u.pointsto); + xunindent(); + break; + case tk_array: + xml_tag_end(); + xnewline(); xindent(); + nxml_type(t->u.array.arrayof); + xunindent(); + break; + case tk_function: + xml_tag_end(); + xnewline(); xindent(); + nxml_type(t->u.fn.returns); + if (!t->u.fn.oldstyle) + nxml_typelist("function-parameters", t->u.fn.argtypes); + xunindent(); + break; + case tk_tagged: + xml_tag_end(); + nxml_tdecl_ref(t->u.tag); + break; + case tk_iref: + xml_tag_end(); + nxml_ddecl_ref(t->u.iref); + break; + case tk_cref: + xml_tag_end(); + nxml_ddecl_ref(t->u.cref); + break; + case tk_variable: + xml_tag_end(); + nxml_ddecl_ref(t->u.tdecl); + break; + } + if (tdef) + nxml_typedef(tdef); + xml_pop(); + xnewline(); + + if (quals) + indentedtag_pop(); +} + +void nxml_typelist(const char *name, typelist types) +{ + typelist_scanner scantypes; + type t; + + indentedtag(name); + typelist_scan(types, &scantypes); + while ((t = typelist_next(&scantypes))) + nxml_type(t); + indentedtag_pop(); +} + + + +enum { + TYPE_HASH_PRIMITIVE = 1, + TYPE_HASH_COMPLEX = TYPE_HASH_PRIMITIVE + tp_last, + TYPE_HASH_ERROR = TYPE_HASH_COMPLEX + tp_last, + TYPE_HASH_VOID, + TYPE_HASH_FUNCTION +}; + + +/* Return a hash value to distinguish types. Note that we are much + less careful here than in type_equal, since hash collisions only + effect performance. */ +unsigned long type_hash(type t) +{ + switch (t->kind) + { + case tk_error: + return TYPE_HASH_ERROR; + + case tk_primitive: + return TYPE_HASH_PRIMITIVE + t->u.primitive; + + case tk_complex: + return TYPE_HASH_COMPLEX + t->u.primitive; + + case tk_void: + return TYPE_HASH_VOID; + + case tk_tagged: + return hash_ptr(t->u.tag); + + case tk_pointer: + return (type_hash(t->u.pointsto) << 1) ^ 0x51353157; + + case tk_function: + return TYPE_HASH_FUNCTION; + + case tk_array: + return (type_hash(t->u.array.arrayof) << 1) ^ 0x40142453 ; + + default: + assert(0); return 0; + } +} + + +/* True if an assignment to type child could modify a value of type parent + according to the ANSI C rules. + Note: child cannot be an array type (assignments to arrays do not exist + in C) +*/ +bool type_contains(type parent, type child) +{ + assert(!type_array(child)); + + /* Short-circuit easy case */ + if (parent == child) + return TRUE; + + /* Char writes can be used on any value */ + if (type_char(child)) + return TRUE; + + switch (parent->kind) + { + default: + /* for primitive, void, function */ + return type_equal_unqualified(parent, child); + + case tk_complex: + /* true if child is primitive or complex and same base primitive type */ + return (child->kind == tk_primitive || child->kind == tk_complex) && + parent->u.primitive == child->u.primitive; + + case tk_tagged: { + /* Same tags -> yes. Otherwise, for structs, unions: true if parent + has a field type that contains child */ + field_declaration field; + + if (child->kind == tk_tagged && parent->u.tag == child->u.tag) + return TRUE; + + if (parent->u.tag->kind == kind_enum_ref) + return FALSE; + + for (field = parent->u.tag->fieldlist; field; field = field->next) + if (type_contains(field->type, child)) + return TRUE; + + return FALSE; + } + + case tk_pointer: + /* base types must match, but can have different qualifiers + (this is different from type_equal) */ + return + child->kind == tk_pointer && + type_equal_unqualified(parent->u.pointsto, child->u.pointsto); + + case tk_array: { + type base_parent = parent; + + while (base_parent->kind == tk_array) + base_parent = base_parent->u.array.arrayof; + + return type_contains(base_parent, child); + } + } +} + +bool type_charstar(type t) +{ + return type_pointer(t) && type_char(type_points_to(t)); +} + +bool type_chararray(type t, bool no_size_allowed) +{ + return t == char_array_type || /* check for easy, common case first */ + (type_array(t) && type_char(type_array_of(t)) && + !(no_size_allowed && type_array_size(t))); +} + +bool type_wchararray(type t, bool no_size_allowed) +{ + return t == wchar_array_type || /* check for easy, common case first */ + (type_array(t) && type_equal(wchar_type, type_array_of(t)) && + !(no_size_allowed && type_array_size(t))); +} + +/* See gcc's machmode.def for the source of this mode data. This is a very + simplified form. +*/ +typedef enum { + m_int, m_float, m_cint, m_cfloat +} machmode_t; + +type type_for_mode(const char *mode, bool isunsigned) +/* Returns: type (unsigned if 'unsigned' is TRUE) corresponding to the + specified mode +*/ +{ + int i; + static struct { char *name; size_t s; machmode_t m; } modes[] = { + { "byte", 1, m_int }, + { "word", 0, m_int }, + { "pointer", 0, m_int }, + { "QI", 1, m_int }, + { "HI", 2, m_int }, + { "SI", 4, m_int }, + { "DI", 8, m_int }, + { "TI", 16, m_int }, + { "OI", 32, m_int }, + { "QF", 1, m_float }, + { "HF", 2, m_float }, + { "TQF", 3, m_float }, + { "SF", 4, m_float }, + { "DF", 8, m_float }, + { "XF", 12, m_float }, + { "TF", 16, m_float }, + { "QC", 1, m_cfloat }, + { "HC", 2, m_cfloat }, + { "SC", 4, m_cfloat }, + { "DC", 8, m_cfloat }, + { "XC", 12, m_cfloat }, + { "TC", 16, m_cfloat }, + { "CQI", 1, m_cint }, + { "CHI", 2, m_cint }, + { "CSI", 4, m_cint, }, + { "CDI", 8, m_int }, + { "CTI", 16, m_cint }, + { "COI", 32, m_cint } + }; + + modes[1].s = target->word_size; + modes[2].s = target->tptr.size; + + for (i = 0; i < sizeof modes / sizeof *modes; i++) + if (is_attr_name(mode, modes[i].name)) + { + type t; + + switch (modes[i].m) + { + case m_int: case m_cint: + t = lookup_primitive(tp_error, modes[i].s, 0, isunsigned); + break; + case m_float: case m_cfloat: + t = lookup_float(modes[i].s); + break; + } + if (t->u.primitive == tp_error) + return NULL; + if (modes[i].m == m_cint || modes[i].m == m_cfloat) + t = make_complex_type(t); + return t; + } + return NULL; +} diff --git a/src/types.h b/src/types.h new file mode 100644 index 0000000..34fcfa9 --- /dev/null +++ b/src/types.h @@ -0,0 +1,318 @@ +/* This file is part of the nesC compiler. + +This file is derived from RC and the GNU C Compiler. It is thus + Copyright (C) 1987, 88, 89, 92-7, 1998 Free Software Foundation, Inc. + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef TYPES_H +#define TYPES_H + +/* Type sizes, alignments and offsets are represented as cvals, and can be + one of: + - top: variable-sized types + - unknown: derived from a template argument + - an unsigned number (preferably created with make_type_cval) + (note: must be a cval_uint!) + + These numbers represent bytes, except in field offsets which use bits +*/ + +#include "cval.h" + +#include "decls.h" + +typedef enum +{ + no_qualifiers = 0, + transparent_qualifier = 1, +#define Q(name, kind, qual, val) qual = val, +#include "qualifiers.h" +#undef Q + last_qualifier +} type_quals; + +extern type float_type, double_type, long_double_type, + int_type, unsigned_int_type, long_type, unsigned_long_type, + long_long_type, unsigned_long_long_type, short_type, unsigned_short_type, + char_type, char_array_type, wchar_type, wchar_array_type, + unsigned_char_type, signed_char_type, void_type, ptr_void_type, + size_t_type, ptrdiff_t_type, intptr_type, unknown_int_type, + unknown_number_type, const_ptr_void_type; + +extern type error_type; + +void init_types(void); + +void set_typedef_type(data_declaration def, bool network); +/* Requires: def->kind == decl_typedef + Effects: Sets def's type to remember the typedef it comes from + If network is true, the type becomes a network base type +*/ + +data_declaration type_typedef(type t); +/* Returns: the typedef t comes from, or NULL if none +*/ + +data_declaration type_networkdef(type t); +/* Requires: type_network_base_type(t) + Returns: the network base type definition for t +*/ + +/* Build types */ + +/* Return the 'complex t' version of basic type t (one of the integral or + floating-point types) */ +type make_complex_type(type t); + +/* Return the base type of complex type t (one of the integral or + floating-point types) */ +type make_base_type(type t); + +/* Return the type t with it's qualifiers set to qualifiers (old qualifiers + are ignored). This is illegal for array types */ +type make_qualified_type(type t, type_quals qualifiers); +type qualify_type1(type t, type t1); +type qualify_type2(type t, type t1, type t2); + +/* Return 't' modified to have alignment 'new_alignment' */ +type align_type(type t, cval new_alignment); + +/* Return TRUE if t's alignment was changed with align_type */ +bool type_realigned(type t); + +/* Return type 'pointer to t' (unqualified) */ +type make_pointer_type(type t); + +/* Return type 'array [size] of t'. size is optional */ +type make_array_type(type t, expression size); + +/* Return type 'function with argument types argtypes returning t'. + If oldstyle is true, this is an oldstyle function type and + argtypes is NULL */ +type make_function_type(type t, typelist argtypes, bool varargs, bool oldstyle); + +type build_function_type(region r, type returns, ...); + +/* Return the tagged type whose declaration is d */ +type make_tagged_type(tag_declaration d); + +typelist new_typelist(region r); +void typelist_append(typelist l, type t); + +bool empty_typelist(typelist l); + +/* Scanning */ +typedef struct typelist_element *typelist_scanner; +void typelist_scan(typelist tl, typelist_scanner *scanner); +type typelist_next(typelist_scanner *scanner); + +/* Size and alignment */ +cval type_size(type t); /* Requires: type_size_cc(t) */ +cval type_alignment(type t); +largest_uint type_size_int(type t); +/* Requires: type_size_cc(t) && cval_isinteger(type_size(t)) + (i.e., t not variable or unknown size) + Returns: size of t +*/ + +/* True if t has a size (void or not incomplete) */ +bool type_has_size(type t); +/* True if the sizeof of t is a compile-time constant */ +bool type_size_cc(type t); +/* Note: type_size_cc => type_has_size */ + +type common_type(type t1, type t2); + +bool type_equal(type t1, type t2); +bool type_equal_unqualified(type t1, type t2); +bool type_compatible(type t1, type t2); +bool type_compatible_unqualified(type t1, type t2); + +/* Return TRUE if T is not affected by default promotions. */ +bool type_self_promoting(type t); + +bool type_incomplete(type t); + +/* Return name of qualifier q (must not be a qualifier set) */ +char *qualifier_name(type_quals q); + +type_quals type_qualifiers(type t); +#define Q(name, kind, tq, val) bool type_ ## name(type t); +#include "qualifiers.h" +#undef Q +bool type_transparent(type t); +bool type_readonly(type t); + +bool type_plain_char(type t); +bool type_signed_char(type t); +bool type_unsigned_char(type t); +bool type_short(type t); +bool type_unsigned_short(type t); +bool type_int(type t); +bool type_unsigned_int(type t); +bool type_long(type t); +bool type_unsigned_long(type t); +bool type_long_long(type t); +bool type_unsigned_long_long(type t); +bool type_unknown_int(type t); +bool type_long_double(type t); +bool type_unknown_number(type t); +bool type_unknown(type t); /* unknown_int or unknown_number */ + +bool type_tagged(type t); +bool type_integral(type t); /* Does not include enum's */ +bool type_floating(type t); +bool type_complex(type t); +bool type_float(type t); +bool type_double(type t); +bool type_void(type t); +bool type_char(type t); +bool type_function(type t); +bool type_array(type t); +bool type_pointer(type t); +bool type_enum(type t); +bool type_struct(type t); +bool type_attribute(type t); /* For internal use for @attributes */ +bool type_union(type t); +bool type_integer(type t); /* Does include enum's */ +bool type_unsigned(type t); +bool type_smallerthanint(type t); +bool type_real(type t); +bool type_arithmetic(type t); +bool type_scalar(type t); +bool type_aggregate(type t); /* struct or union */ + +type make_unsigned_type(type t); + +type type_function_return_type(type t); +typelist type_function_arguments(type t); +bool type_function_varargs(type t); +bool type_function_oldstyle(type t); + +/* Return TRUE if function type FNTYPE specifies a fixed number of parameters + and none of their types is affected by default promotions. */ +bool self_promoting_args(type fntype); + +type type_points_to(type t); +type type_array_of(type t); +type type_array_of_base(type t); +expression type_array_size(type t); +cval type_array_size_cval(type t); +/* Returns: number of elements in array type t if known, cval_top otherwise */ +tag_declaration type_tag(type t); +type type_base(type t); + +/* Build AST nodes such that "MODIFIERS D" represents the declaration of + "T INSIDE", at location loc, allocating in region r */ +void type2ast(region r, location loc, type t, declarator inside, + declarator *d, type_element *modifiers); + +bool type_contains_pointers(type t); +bool type_contains_cross_pointers(type t); +bool type_contains_qualified_pointers(type t); /* True if any sameregion/traditional ptrs */ +bool type_contains_union_with_pointers(type t); + +type type_default_conversion(type from); +type type_default_conversion_for_assignment(type from); +type function_call_type(function_call fcall); + +void name_tag(tag_declaration tag); + +/* Return the integral type of size 'size', unsigned if 'isunsigned' is true */ +type type_for_size(cval size, bool isunsigned); + +type type_for_cval(cval c, bool isunsigned); + +/* nesc type extensions */ +type make_interface_type(data_declaration itype); +bool type_interface(type t); +data_declaration type_iref(type t); + +type make_component_type(data_declaration ctype); +bool type_component(type t); +data_declaration type_cref(type t); + +/* Similar to functions, but different to avoid surprising behaviour... */ +bool type_command(type t); +bool type_event(type t); +bool type_task(type t); +bool type_functional(type t); /* all of the above, and type_function */ + +bool type_generic(type t); /* for generic interfaces */ + +type make_command_type(type t, typelist argtypes, bool varargs); +type make_event_type(type t, typelist argtypes, bool varargs); +type make_task_type(type t, typelist argtypes, bool varargs); +type make_generic_type(type t, typelist argtypes); + +type make_combiner_type(type t, data_declaration combiner); +data_declaration type_combiner(type t); + +bool type_network_base_type(type t); +bool type_network(type t); +type type_network_platform_type(type t); +/* Requires: type_network_base_type(t) + Returns: A non-network type with the same size and signedness as t + Note that such a type is platform-dependent +*/ + +/* Type variables */ +type make_variable_type(data_declaration tdecl); +/* Requires: tdecl->kind == decl_typedef. +*/ + +bool type_variable(type t); +data_declaration type_variable_decl(type t); + +type instantiate_type(type t); +/* Effects: Instantiate a type with type variables based on the instantiation + of the variables and tag declarations. These are found in + type_variable_decl(vartype)->instantiation->type for variables + type_tag(tagtype)->instantiation for tags + Returns: The instantiated type +*/ + +typelist instantiate_typelist(typelist old); +/* Returns: An instantiated copy of typelist old, allocated in the same + region +*/ + +const char *type_name(region r, type t); + +unsigned long type_hash(type t); + +bool type_contains(type parent, type child); + +bool type_charstar(type t); +bool type_chararray(type t, bool no_size_allowed); +bool type_wchararray(type t, bool no_size_allowed); + +void nxml_type(type t); +/* Effects: Outputs XML representation of type t. +*/ +void nxml_typelist(const char *name, typelist types); +/* Effects: Outputs XML representartion of typelist types wrapped in tag 'name' +*/ + +type type_for_mode(const char *mode, bool isunsigned); +/* Returns: type (unsigned if 'unsigned' is TRUE) corresponding to the + specified mode +*/ + +#endif diff --git a/src/unparse.c b/src/unparse.c new file mode 100644 index 0000000..432ae96 --- /dev/null +++ b/src/unparse.c @@ -0,0 +1,2429 @@ +/* This file is part of the nesC compiler. + +This file is derived from the RC Compiler. It is thus + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include +#include +#include + +#include "parser.h" +#include "unparse.h" +#include "semantics.h" +#include "constants.h" +#include "AST_utils.h" +#include "errors.h" +#include "nesc-semantics.h" +#include "nesc-magic.h" +#include "nesc-network.h" + +/* Set this to 1 to avoid warnings from gcc about paren use with + -Wparentheses */ +#define CONSERVATIVE_PARENS 1 + +/* Pick an indentation amount */ +#define INDENT 2 + +/* The output file for unparsing */ +static FILE *of; +static FILE *symf; /* for symbol info */ +static bool no_line_directives; +static int indent_level; +static struct location output_loc; +static location fixed_location; +static bool at_line_start; + +/* separator used between module name and function name */ +static char *function_separator = "$"; + +/* modify behavior of low-level functions when printing docs */ +static bool documentation_mode; + +/* List of lines to output at start of file */ +static dd_list unparse_header; + +typedef struct prt_closure { + void (*fn)(struct prt_closure *closure); + + const char *name; + struct prt_closure *parent; +} *prt_closure; + +void indent(void) +{ + indent_level += INDENT; +} + +void unindent(void) +{ + indent_level -= INDENT; +} + +static void output_indentation(void) +{ + int i; + + for (i = 0; i < indent_level; i++) putc(' ', of); +} + +void newline(void) +{ + putc('\n', of); + at_line_start = TRUE; + if (fixed_location) + fprintf(of, "#line %lu\n", fixed_location->lineno); + else + output_loc.lineno++; +} + +void startline(void) +{ + if (!at_line_start) newline(); +} + +void startline_noindent(void) +{ + startline(); + at_line_start = FALSE; +} + +static void output_indent_if_needed(void) +{ + if (at_line_start) + { + at_line_start = FALSE; + output_indentation(); + } +} + +static void voutput(char *format, va_list args) +{ + output_indent_if_needed(); + vfprintf(of, format, args); +} + +void output(char *format, ...) +{ + va_list args; + + va_start(args, format); + voutput(format, args); + va_end(args); +} + +void outputln(char *format, ...) +{ + va_list args; + + va_start(args, format); + voutput(format, args); + va_end(args); + + newline(); +} + +void output_quoted(const char *s) +{ + /* Output a string which may contain newlines, \ and " */ + while (*s) + { + if (*s == '\n') /* don't confuse the line numbers */ + fputs("\\n", of); + else + { + if (*s == '\\' || *s == '"') + putc('\\', of); + putc(*s, of); + } + s++; + } +} + + +void output_quoted_cs(cstring s) +{ + /* Output a string which may contain newlines, \ and " */ + int i; + + for (i = 0; i < s.length; i++) + { + char c = s.data[i]; + + if (c == '\n') /* don't confuse the line numbers */ + fputs("\\n", of); + else if ((unsigned char)c == c && isprint(c)) + { + if (c == '\\' || c == '"') + putc('\\', of); + putc(c, of); + } + else + /* The "" at the end avoids confusion if the next character + is '0'-'9', 'a'-'f' or 'A'-'F' */ + output("\\x%lx\"\"", (unsigned long)c); + } +} + + +/** + * copy a file to the output stream. + **/ +void copy_file_to_output(char *filename) +{ + char buf[1024 * 4]; + FILE *infile = fopen(filename, "r"); + size_t nread; + size_t nwritten; + assert(infile); + + while( !feof(infile) ) { + nread = fread(buf, 1, sizeof(buf), infile); + assert( !ferror(infile) ); + if(nread > 0) { + nwritten = fwrite(buf, 1, nread, of); + assert( !ferror(of) ); + assert(nwritten == nread); + } + } + + fclose(infile); +} + +#define STRIP_PREFIX "__nesc_keyword_" +#define STRIP_PREFIX_LEN (sizeof(STRIP_PREFIX) - 1) + +void output_stripped_cstring(cstring s) +{ + output_indent_if_needed(); + if (strncmp(s.data, STRIP_PREFIX, STRIP_PREFIX_LEN) == 0) + fwrite(s.data + STRIP_PREFIX_LEN, s.length - STRIP_PREFIX_LEN, 1, of); + else + fwrite(s.data, s.length, 1, of); +} + +void output_cstring(cstring s) +{ + output_indent_if_needed(); + fwrite(s.data, s.length, 1, of); +} + +void output_string(const char *s) +{ + output_indent_if_needed(); + fwrite(s, strlen(s), 1, of); +} + +void print_stripped_string(FILE *f, const char *s) +{ + if (strncmp(s, STRIP_PREFIX, STRIP_PREFIX_LEN) == 0) + fputs(s + STRIP_PREFIX_LEN, f); + else + fputs(s, f); +} + +void output_stripped_string(const char *s) +{ + output_indent_if_needed(); + print_stripped_string(of, s); +} + +void output_stripped_string_dollar(const char *s) +{ + output_stripped_string(s); + output_string(function_separator); +} + +static void output_line_directive(location l, bool include_filename) +{ + if (fixed_location) + return; + + startline_noindent(); + if (include_filename) + { + output("# %lu \"", l->lineno); + output_quoted(l->filename); + outputln("\"%s", l->in_system_header ? " 3" : ""); + } + else + outputln("#line %lu", l->lineno); + + output_loc = *l; +} + +void set_location(location l) +{ + /* Ignore dummy locations */ + if (l->filename == dummy_location->filename || no_line_directives) + return; + + if ((l->filename != output_loc.filename && + strcmp(l->filename, output_loc.filename)) || + l->in_system_header != output_loc.in_system_header) + output_line_directive(l, TRUE); + else if (output_loc.lineno != l->lineno) + { + /* Just send some newlines for small changes */ + if (!fixed_location && + output_loc.lineno < l->lineno && output_loc.lineno + 10 >= l->lineno) + { + while (output_loc.lineno != l->lineno) + newline(); + } + else + output_line_directive(l, FALSE); + } +} + +void set_fixed_location(location l) +{ + assert(l->filename != dummy_location->filename); + + set_location(l); + fixed_location = l; +} + +void clear_fixed_location(void) +{ + fixed_location = NULL; +} + +struct location output_location(void) +{ + return output_loc; +} + +static void output_complex(known_cst c) +{ + assert(0); +} + +void output_constant(known_cst c) +/* Requires: (constant_integral(c) || constant_float(c)) && + type_arithmetic(c->type) + or c denotes a string constant && type_chararray(c->type, FALSE) + Effects: prints a parsable representable of c to f + */ +{ + type t = c->type; + + if (type_complex(t)) + { + output_complex(c); + return; + } + + if (type_floating(t)) + { + /* XXX: hacky version */ + output("%.20Le", constant_float_value(c)); + } + else if (type_chararray(t, FALSE)) + { + data_declaration ddecl = cval_ddecl(c->cval); + + assert(ddecl && ddecl->kind == decl_magic_string); + output("\""); + /* FIXME we ignore wide char issues, just outputting the raw bytes - + this should be ok for now as we don't actually allow wide-char + strings as arguments to generics anyway */ + output_quoted_cs(ddecl->schars); + output("\""); + } + else + { + assert(type_integral(t)); + + if (type_unsigned(t)) + output("%llu", constant_uint_value(c)); + else + output("%lld", constant_sint_value(c)); + + if (type_size_int(t) <= type_size_int(int_type)) + { + if (type_unsigned(t)) + output("U"); + } + else if (type_long(t)) + output("L"); + else if (type_unsigned_long(t)) + output("UL"); + else if (type_long_long(t)) + output("LL"); + else if (type_unsigned_long_long(t)) + output("ULL"); + else + assert(0); + } +} + +void prt_toplevel_declarations(declaration dlist); +void prt_toplevel_declaration(declaration d); +void prt_asm_decl(asm_decl d); +void prt_extension_decl(extension_decl d); +void prt_data_decl(data_decl d); +void prt_ellipsis_decl(ellipsis_decl d); +void prt_function_decl(function_decl d); +void prt_variable_decl(type_element modifier, variable_decl d, + psd_options options); +void prt_interesting_elements(type_element elements, psd_options options); +void prt_type_elements(type_element elements, psd_options options); +bool prt_type_element(type_element em, psd_options options); +void prt_attribute_elements(type_element elements); +bool prt_attribute_element(type_element em); +void prt_typename(typename tname, psd_options options); +void prt_typeof_expr(typeof_expr texpr); +void prt_typeof_type(typeof_type ttype); +void prt_gcc_attribute(gcc_attribute a); +void prt_nesc_attribute(nesc_attribute a); +void prt_rid(rid r, psd_options options); +void prt_qualifier(qualifier q); +void prt_tag_ref(tag_ref sr, psd_options options); +void prt_fields(declaration flist); +void prt_enumerators(declaration elist, tag_declaration ddecl); +void prt_field_declaration(declaration d); +void prt_field_extension_decl(extension_decl d); +void prt_field_data_decl(data_decl d); +void prt_field_decl(field_decl fd); +void prt_enumerator(enumerator ed, tag_declaration ddecl); +void prt_asttype(asttype t); +void prt_word(word w); + +void prt_expressions(expression elist, bool isfirst); +void prt_expression(expression e, int context_priority); +void prt_comma(comma e, int context_priority); +void prt_sizeof_type(sizeof_type e, int context_priority); +void prt_alignof_type(alignof_type e, int context_priority); +void prt_label_address(label_address e, int context_priority); +void prt_cast(cast e, int context_priority); +void prt_cast_list(cast_list e, int context_priority); +void prt_conditional(conditional e, int context_priority); +void prt_identifier(identifier e, int context_priority); +void prt_compound_expr(compound_expr e, int context_priority); +void prt_function_call(function_call e, int context_priority); +void prt_generic_call(generic_call e, int context_priority); +void prt_array_ref(array_ref e, int context_priority); +void prt_interface_deref(interface_deref e, int context_priority); +void prt_field_ref(field_ref e, int context_priority); +void prt_unary(unary e, int context_priority); +void prt_binary(binary e, int context_priority); +void prt_init_list(init_list e, int context_priority); +void prt_init_specific(init_specific e, int context_priority); +void prt_lexical_cst(lexical_cst e, int context_priority); +void prt_string(string e, int context_priority); +void prt_parameter_declarations(declaration dlist); +void prt_parameter_declaration(declaration d); + +void prt_statement(statement s); +void prt_compound_stmt(compound_stmt s, bool trusted); +void prt_compound_declarations(declaration dlist); +void prt_compound_declaration(declaration d); +void prt_asm_stmt(asm_stmt s); +void prt_asm_stmt_plain(asm_stmt s); +void prt_asm_operands(asm_operand olist); +void prt_asm_operand(asm_operand o); +void prt_if_stmt(if_stmt s); +void prt_labeled_stmt(labeled_stmt s); +void prt_expression_stmt(expression_stmt s); +void prt_while_stmt(while_stmt s); +void prt_dowhile_stmt(while_stmt s); +void prt_switch_stmt(switch_stmt s); +void prt_for_stmt(for_stmt s); +void prt_break_stmt(break_stmt s); +void prt_continue_stmt(continue_stmt s); +void prt_return_stmt(return_stmt s); +void prt_goto_stmt(goto_stmt s); +void prt_computed_goto_stmt(computed_goto_stmt s); +void prt_empty_stmt(empty_stmt s); +void prt_atomic_stmt(atomic_stmt s); + +void prt_label(label l); +void prt_id_label(id_label l); +void prt_case_label(case_label l); +void prt_default_label(default_label l); + +void prt_regionof(expression e); + +region unparse_region; + +void unparse_start(FILE *to, FILE *symbols) +{ + dd_list_pos header_line; + + of = to; + symf = symbols; + output_loc = *dummy_location; + at_line_start = TRUE; + no_line_directives = FALSE; + documentation_mode = FALSE; + indent_level = 0; + unparse_region = newregion(); + + if (unparse_header) + dd_scan (header_line, unparse_header) + { + output_string(DD_GET(const char *, header_line)); + newline(); + } +} + +void unparse_end(void) deletes +{ + deleteregion_ptr(&unparse_region); +} + +void unparse(FILE *to, declaration program) deletes +{ + unparse_start(to, NULL); + prt_toplevel_declarations(program); + unparse_end(); +} + +void unparse_prefix(const char *line) +{ + if (!unparse_header) + unparse_header = dd_new_list(permanent); + + dd_add_last(permanent, unparse_header, (char *)line); +} + +void enable_line_directives(void) +{ + if (no_line_directives) + { + no_line_directives = FALSE; + /* Force #line on next output of some location */ + output_loc = *dummy_location; + } +} + +void disable_line_directives(void) +{ + no_line_directives = TRUE; +} + +void set_function_separator(char *sep) +{ + function_separator = sep; +} + +const char *get_function_separator(void) +{ + return function_separator; +} + +FILE *set_unparse_outfile(FILE *newout) +{ + FILE *temp = of; + + of = newout; + return temp; +} + +void enable_documentation_mode(void) +{ + documentation_mode = TRUE; +} + +void disable_documentation_mode(void) +{ + documentation_mode = FALSE; +} + +void prt_toplevel_declarations(declaration dlist) +{ + declaration d; + + scan_declaration (d, dlist) + prt_toplevel_declaration(d); +} + +#define PRTCASE(type, x) case kind_ ## type: prt_ ## type(CAST(type, (x))); return + +void prt_toplevel_declaration(declaration d) +{ + startline(); + switch (d->kind) + { + PRTCASE(asm_decl, d); + PRTCASE(data_decl, d); + PRTCASE(function_decl, d); + PRTCASE(extension_decl, d); + case kind_rp_interface: return; + case kind_component_ref: return; + case kind_eq_connection: return; + case kind_rp_connection: return; + default: assert(0); break; + } +} + +/* Invariant: all declarations end with ; */ +void prt_asm_decl(asm_decl d) +{ + prt_asm_stmt(d->asm_stmt); +} + +void prt_extension_decl(extension_decl d) +{ + set_location(d->location); + output("__extension__ "); + prt_toplevel_declaration(d->decl); +} + +void prt_ellipsis_decl(ellipsis_decl d) +{ + set_location(d->location); + output("..."); +} + +static type_element interesting_element(type_element elems) +{ + type_element elem; + + scan_type_element (elem, elems) + if (is_tag_ref(elem)) + return elem; + + return NULL; +} + +static void prt_prefix(location loc, data_declaration ddecl, + type_element modifiers) +{ + bool pinline = FALSE, pstatic = FALSE; + type_element em; + + set_location(loc); + /* Hack to add static and inline where necessary */ + if (ddecl && ddecl->kind == decl_function && !ddecl->isexterninline && + !ddecl->spontaneous && ddecl->definition) + { + if (ddecl->ftype != function_static) + { + output("static "); + pstatic = TRUE; + } + if (ddecl->makeinline && flag_no_inline < 2) + { + output("inline "); + pinline = TRUE; + } + } + + scan_type_element (em, modifiers) + if (is_rid(em)) + { + rid r = CAST(rid, em); + + /* Filter-out rids that should not be printed by calling continue */ + switch (r->id) + { + default: + continue; + case RID_EXTERN: case RID_STATIC: + if (pstatic) + continue; + break; + case RID_INLINE: + if (pinline) + continue; + break; + case RID_REGISTER: case RID_TYPEDEF: + break; + } + set_location(r->location); + output("%s ", rid_name(r)); + } +} + + +void prt_symbol_name(FILE *f, data_declaration ddecl) +{ + if (!ddecl->Cname) + { + if (ddecl->container) + { + print_stripped_string(f, ddecl->container->name); + fputs(function_separator, f); + } + if (ddecl->kind == decl_function && ddecl->interface) + { + print_stripped_string(f, ddecl->interface->name); + fputs(function_separator, f); + } + if (!ddecl->defined && ddecl_is_command_or_event(ddecl)) + fprintf(f, "default%s", function_separator); + } + + print_stripped_string(f, ddecl->name); +} + +void prt_attribute_for(data_declaration ddecl) +{ + output("__attribute__((section(\".nesc."); + prt_symbol_name(of, ddecl); + output("\"))) "); +} + +void prt_symbol_info(data_declaration ddecl) +{ + if (!ddecl->printed) + { + ddecl->printed = TRUE; + prt_symbol_name(symf, ddecl); + + if (ddecl->kind == decl_function) + { + if (ddecl->makeinline || ddecl->isinline || ddecl->isexterninline) + fprintf(symf, " FNINLINE\n"); + else + fprintf(symf, " FN\n"); + } + else + { + assert(ddecl->kind == decl_variable); + if (ddecl->initialiser) + fprintf(symf, " DATA\n"); + else + fprintf(symf, " BSS\n"); + } + } +} + +void prt_diff_info(data_declaration ddecl) +{ + if (symf && ddecl && ddecl->needsmemory) + { + prt_attribute_for(ddecl); + prt_symbol_info(ddecl); + } +} + +void prt_data_decl(data_decl d) +{ + declaration vd; + psd_options opts = 0; + + scan_declaration (vd, d->decls) + { + variable_decl vdd = CAST(variable_decl, vd); + data_declaration vdecl = vdd->ddecl; + psd_options vopts = opts; + + if (vdecl) /* because build_declaration does not make a + data_declaration */ + { + /* Ignore unused non-local declarations + (local ones might have an initialiser which must still be + executed) */ + if (((vdecl->kind == decl_function || vdecl->kind == decl_variable) + && !vdecl->isused && !vdecl->islocal)) + continue; + if (use_nido && is_module_local_static(vdecl)) + continue; + + if (prt_network_typedef(d, vdd)) + vopts |= psd_prefix_nxbase; + + if (type_task(vdecl->type) && vdecl->interface) + continue; + } + + prt_diff_info(vdecl); + + prt_variable_decl(d->modifiers, vdd, vopts); + opts |= psd_duplicate; + outputln(";"); + } + + if (!(opts & psd_duplicate)) + prt_interesting_elements(d->modifiers, opts); +} + + +void prt_parameter_declarations(declaration dlist) +{ + declaration d; + + scan_declaration (d, dlist) + prt_parameter_declaration(d); +} + +void prt_parameter_declaration(declaration d) +{ + startline(); + switch (d->kind) + { + PRTCASE(data_decl, d); + PRTCASE(ellipsis_decl, d); + default: assert(0); break; + } +} + +void prt_function_decl(function_decl d) +{ + if (d->ddecl->isused && !d->ddecl->suppress_definition) + { + function_declarator fd = get_fdeclarator(d->declarator); + asttype ret = fd->return_type; + + prt_diff_info(d->ddecl); + prt_prefix(d->location, d->ddecl, d->modifiers); + if (ret) + { + prt_attribute_elements(d->modifiers); + prt_declarator(ret->declarator, ret->qualifiers, NULL, d->ddecl, + psd_print_default | psd_print_ddecl_fdeclarator); + } + else + prt_declarator(d->declarator, d->modifiers, NULL, d->ddecl, + psd_print_default); + if (d->attributes) + { + output(" "); + prt_type_elements(CAST(type_element, d->attributes), 0); + } + outputln(";"); + } +} + +void prt_function_body(function_decl d) +{ + if (d->ddecl->isused && !d->ddecl->suppress_definition) + { + function_declarator fd = get_fdeclarator(d->declarator); + asttype ret = fd->return_type; + bool extrablock; + + /* We set current.function_decl because unparsing may produce error + messages */ + current.function_decl = d; + current.container = d->ddecl->container; + + prt_diff_info(d->ddecl); + prt_prefix(d->location, d->ddecl, d->modifiers); + /* gcc wants the attributes here */ + prt_type_elements(CAST(type_element, d->attributes), 0); + + if (ret) + { + prt_attribute_elements(d->modifiers); + prt_declarator(ret->declarator, ret->qualifiers, NULL, d->ddecl, + psd_print_default | psd_print_ddecl_fdeclarator); + } + else + prt_declarator(d->declarator, d->modifiers, NULL, d->ddecl, + psd_print_default); + + startline(); + prt_parameter_declarations(d->old_parms); + extrablock = prt_network_parameter_copies(d); + assert(is_compound_stmt(d->stmt)); + prt_compound_stmt(CAST(compound_stmt, d->stmt), !d->ddecl->safe); + newline(); + if (extrablock) + { + unindent(); + outputln("}"); + } + + current.function_decl = d->parent_function; + } +} + +void prt_variable_decl(type_element modifiers, variable_decl d, + psd_options options) +{ + function_declarator fd = get_fdeclarator(d->declarator); + asttype ret; + + prt_prefix(d->location, d->ddecl, modifiers); + + /* Handle nesdoc-overridden return type */ + if (fd && (ret = fd->return_type)) + { + prt_attribute_elements(modifiers); + prt_declarator(ret->declarator, ret->qualifiers, NULL, d->ddecl, + options | psd_print_ddecl_fdeclarator); + } + else + prt_declarator(d->declarator, modifiers, NULL, d->ddecl, options); + + if (d->attributes) + { + output(" "); + prt_type_elements(CAST(type_element, d->attributes), 0); + } + + if (d->asm_stmt) + prt_asm_stmt_plain(d->asm_stmt); + + if (d->arg1 && !(use_nido && is_module_variable(d->ddecl))) + { + output(" = "); + prt_expression(d->arg1, P_ASSIGN); + } +} + +void prt_declarator(declarator d, type_element elements, attribute attributes, + data_declaration ddecl, psd_options options) +{ + psd_options te_opts = options & (psd_duplicate | psd_rewrite_nxbase); + + if (d && is_function_declarator(d)) + te_opts |= psd_rewrite_nxbase; + prt_type_elements(elements, te_opts); + + options |= psd_need_paren_for_qual; + options &= ~psd_need_paren_for_star; + prt_simple_declarator(d, ddecl, options); + if (attributes) + { + output(" "); + prt_type_elements(CAST(type_element, attributes), 0); + } +} + +void prt_container(nesc_declaration container) +{ + if (container->original) + /* Put actual container name in a comment for human readers */ + output("/*%s*/", container->instance_name); + output_stripped_string_dollar(container->name); +} + +void prt_plain_ddecl(data_declaration ddecl, psd_options options) +{ + if (!ddecl->Cname) + { + if (ddecl->container && !(options & psd_skip_container)) + prt_container(ddecl->container); + if (/*ddecl->kind == decl_function &&*/ ddecl->interface) + output_stripped_string_dollar(ddecl->interface->name); + if ((options & psd_print_default) && + !ddecl->defined && ddecl_is_command_or_event(ddecl)) + { + output("default"); + output_string(function_separator); + } + } + + /* static local module variables are printed as fn$var in nido */ + if (use_nido && is_module_local_static(ddecl)) + { + prt_plain_ddecl(ddecl->container_function, 0); + output_string(function_separator); + } + + if (options & psd_prefix_nxbase) + output(NXBASE_PREFIX); + + output_stripped_string(ddecl->name); +} + +void prt_ddecl_full_name(data_declaration ddecl, psd_options options) +{ + prt_plain_ddecl(ddecl, options); + if (use_nido && is_module_variable(ddecl)) + output("[%s]", nido_num_nodes); +} + +/* The return value is TRUE iff d is an identifier_declarator possibly + prefixed with qualified_declarators */ +bool prt_simple_declarator(declarator d, data_declaration ddecl, + psd_options options) +{ + if (!d) + { + if (options & psd_print_ddecl_fdeclarator) + { + if (is_function_decl(ddecl->ast)) + d = CAST(function_decl, ddecl->ast)->declarator; + else + d = CAST(variable_decl, ddecl->ast)->declarator; + d = CAST(declarator, get_fdeclarator(d)); + options &= ~psd_print_ddecl_fdeclarator; + } + else + { + if (options & psd_print_ddecl) + prt_ddecl_full_name(ddecl, options); + else if (options & psd_rename_identifier) + output("arg_%p", ddecl); + + return FALSE; + } + } + + switch (d->kind) + { + case kind_function_declarator: + { + function_declarator fd = CAST(function_declarator, d); + + prt_simple_declarator(fd->declarator, ddecl, + options | psd_need_paren_for_star | + psd_need_paren_for_qual); + prt_parameters(fd->gparms ? fd->gparms : + ddecl ? ddecl_get_gparms(ddecl) : NULL, + fd->parms, options & psd_rename_parameters); + break; + } + case kind_array_declarator: + { + array_declarator ad = CAST(array_declarator, d); + bool is_id; + + is_id = prt_simple_declarator(ad->declarator, ddecl, + options | psd_need_paren_for_star | + psd_need_paren_for_qual); + if (!ad->arg1) + { + /* The array-type test is necessary because char x[] in a + parameter declaration is really a pointer declaration */ + if (ddecl && is_id && type_array(ddecl->type)) + { + /* This is a declaration of an incomplete array type. + The type of ddecl contains the size of the array if + it is known. + We need to print the size because of tossim + (a declaration like 'char foo[TOSNODES][]' would + be illegal) + */ + expression dsize = type_array_size(ddecl->type); + + if (dsize) + output("[%lu]", + (unsigned long)constant_uint_value(dsize->cst)); + else /* we never found the size */ + output("[]"); + } + else + output("[]"); + } + else + { + set_location(ad->arg1->location); + output("["); + prt_expression(ad->arg1, P_TOP); + output("]"); + } + break; + } + case kind_qualified_declarator: + { + qualified_declarator qd = CAST(qualified_declarator, d); + bool is_id; + + set_location(qd->modifiers->location); + if (options & psd_need_paren_for_qual) + output("("); + prt_type_elements(qd->modifiers, 0); + is_id = prt_simple_declarator(qd->declarator, ddecl, + options & ~psd_need_paren_for_qual); + if (options & psd_need_paren_for_qual) + output(")"); + return is_id; + } + case kind_pointer_declarator: + { + pointer_declarator pd = CAST(pointer_declarator, d); + + if (options & psd_need_paren_for_star) + output("("); + output("*"); + prt_simple_declarator(pd->declarator, ddecl, + options & ~(psd_need_paren_for_star | + psd_need_paren_for_qual)); + if (options & psd_need_paren_for_star) + output(")"); + break; + } + case kind_identifier_declarator: + set_location(d->location); + if (options & psd_rename_identifier) + output("arg_%p", ddecl); + else if (ddecl) + { + prt_ddecl_full_name(ddecl, options); + /* check that we printed the symbol info (too late if we get + here) */ + assert(!(symf && ddecl->needsmemory && !ddecl->printed)); + } + else + output_stripped_cstring(CAST(identifier_declarator, d)->cstring); + return TRUE; + + case kind_interface_ref_declarator: + prt_simple_declarator(CAST(interface_ref_declarator, d)->declarator, + ddecl, options | psd_need_paren_for_star | + psd_need_paren_for_qual); + break; + + default: assert(0); break; + } + return FALSE; +} + +void prt_type_elements(type_element elements, psd_options options) +{ + type_element em; + + scan_type_element (em, elements) + { + if (prt_type_element(em, options)) + output(" "); + } +} + +void prt_attribute_elements(type_element elements) +{ + type_element em; + + scan_type_element (em, elements) + { + if (prt_attribute_element(em)) + output(" "); + } +} + +void prt_interesting_elements(type_element elements, psd_options options) +{ + type_element interesting = interesting_element(elements); + + if (interesting) + { + prt_type_element(interesting, options); + outputln(";"); + } +} + +bool prt_type_element(type_element em, psd_options options) +{ + switch (em->kind) + { + case kind_component_typeref: /* fall through to prt_typename */ + case kind_typename: prt_typename(CAST(typename, em), options); break; + case kind_typeof_expr: prt_typeof_expr(CAST(typeof_expr, em)); break; + case kind_typeof_type: prt_typeof_type(CAST(typeof_type, em)); break; + case kind_gcc_attribute: prt_gcc_attribute(CAST(gcc_attribute, em)); break; + case kind_nesc_attribute: prt_nesc_attribute(CAST(nesc_attribute, em)); break; + case kind_qualifier: prt_qualifier(CAST(qualifier, em)); break; + case kind_rid: + { + rid r = CAST(rid, em); + + if (!documentation_mode && r->id >= RID_LASTTYPE) + return FALSE; + prt_rid(r, options); + break; + } + default: + if (is_tag_ref(em)) + prt_tag_ref(CAST(tag_ref, em), options); + else + assert(0); + break; + } + return TRUE; +} + +bool prt_attribute_element(type_element em) +{ + switch (em->kind) + { + case kind_gcc_attribute: + prt_gcc_attribute(CAST(gcc_attribute, em)); + return TRUE; + case kind_nesc_attribute: + prt_nesc_attribute(CAST(nesc_attribute, em)); + return TRUE; + default: + return FALSE; + } +} + +void prt_typename(typename tname, psd_options options) +{ + data_declaration tdecl = tname->ddecl; + psd_options newopts = 0; + + set_location(tname->location); + if (type_network_base_type(tdecl->type) && (options & psd_rewrite_nxbase)) + newopts |= psd_prefix_nxbase; + prt_plain_ddecl(tdecl, newopts); +} + +void prt_typeof_expr(typeof_expr texpr) +{ + set_location(texpr->location); + output("typeof("); + prt_expression(texpr->arg1, P_TOP); + output(")"); +} + +void prt_typeof_type(typeof_type ttype) +{ + set_location(ttype->location); + output("typeof("); + prt_asttype(ttype->asttype); + output(")"); +} + +void prt_gcc_attribute(gcc_attribute a) +{ + if (!nesc_attributep(a)) + { + set_location(a->location); + output("__attribute(("); + prt_word(a->word1); + if (a->args) + { + output("("); + prt_expressions(a->args, TRUE); + output(")"); + } + output("))"); + } +} + +void prt_nesc_attribute(nesc_attribute a) +{ + /* If the attribute has a macro_name, then print attribute like + a macro call. If not, just ignore the attribute. */ + if (a->tdecl->macro_name) + { + init_list args = CAST(init_list, a->arg1); + expression e; + int count = 0, field_count = 0; + field_declaration field; + + /* This code checks that the attribute can be printed as a + macro call, i.e., that complex initializers are not used + and that all fields have an initializer - this is done here + because it seems easier than enforcing these rules elsewhere + */ + set_location(a->location); + output("%s(", a->tdecl->macro_name); + + /* Like prt_expressions, but check that we can rewrite what was + a structure initializer as arguments to a macro */ + scan_expression (e, args->args) + { + if (count > 0) output(", "); + count++; + if (is_init_list(e) || is_init_specific(e)) + error_with_location(e->location, "complex initializers not allowed with @macro() attributes"); + prt_expression(e, P_ASSIGN); /* priority is that of assignment */ + } + + output(")"); + + /* Check that all arguments are specified, so that the macro + gets the same argument count on all uses. Could extend to + "at least enough" arguments to allow the case of a variably-sized + array at the end of the attribute, and a variable-argument macro + */ + for (field = a->tdecl->fieldlist; field; field = field->next) + field_count++; + if (field_count != count) + error_with_location(a->location, "incorrect argument count to @macro() attribute"); + } +} + +void prt_rid(rid r, psd_options options) +{ + switch (r->id) + { + case RID_COMMAND: case RID_EVENT: case RID_TASK: case RID_ASYNC: + case RID_NORACE: + // show these in documenation mode, but not otherwise + if (documentation_mode && !(options & psd_skip_command_event)) + output("%s", rid_name(r)); + break; + case RID_DEFAULT: + break; + case RID_EXTERN: + if (options & psd_noextern) + return; + /* FALLTHROUGH */ + default: + set_location(r->location); + output("%s", rid_name(r)); + break; + } +} + +void prt_qualifier(qualifier q) +{ + set_location(q->location); + output("%s", qualifier_name(q->id)); +} + +void prt_tag_ref(tag_ref tr, psd_options options) +{ + /* We must not name anonymous struct/unions (those which are collapsed + into a containing struct/union) as that would make them non-anonymous + (in gcc 3.3 and following) */ + if (!tr->tdecl->collapsed) + name_tag(tr->tdecl); + + /* We just print attributes as structs, with a prefix on the name + (__nesc_attr_). They will be ignored by the C compiler. */ + set_location(tr->location); + /* There's a #define for nx_struct, nx_union in the header (this is not + an issue as these are keywords) */ + if (tr->kind == kind_attribute_ref) + output("struct "); + else + output("%s ", tagkind_name(tr->kind)); + + if (tr->word1) + { + if (tr->tdecl && tr->tdecl->container && !tr->tdecl->Cname) + prt_container(tr->tdecl->container); + if (tr->kind == kind_attribute_ref) + output("__nesc_attr_"); + prt_word(tr->word1); + } + if (!(options & psd_duplicate) && tr->defined) + { + if (tr->kind == kind_enum_ref) + prt_enumerators(tr->fields, tr->tdecl); + else if (type_network(make_tagged_type(tr->tdecl))) + prt_network_fields(tr); + else + prt_fields(tr->fields); + } + if (tr->attributes) + { + output(" "); + prt_type_elements(CAST(type_element, tr->attributes), 0); + } +} + +void prt_enumerators(declaration elist, tag_declaration tdecl) +{ + declaration d; + + output(" {"); + indent(); + startline(); + scan_declaration (d, elist) + { + prt_enumerator(CAST(enumerator, d), tdecl); + if (d->next) + output(", "); + } + unindent(); + startline(); + output("}"); +} + +void prt_fields(declaration flist) +{ + declaration d; + + output(" {"); + indent(); + startline(); + scan_declaration (d, flist) + prt_field_declaration(d); + unindent(); + startline(); + output("}"); +} + +void prt_field_declaration(declaration d) +{ + if (is_extension_decl(d)) + prt_field_extension_decl(CAST(extension_decl, d)); + else + prt_field_data_decl(CAST(data_decl, d)); +} + +void prt_field_extension_decl(extension_decl d) +{ + set_location(d->location); + output("__extension__ "); + prt_field_declaration(d->decl); +} + +void prt_field_data_decl(data_decl d) +{ + declaration fd; + + prt_type_elements(d->modifiers, 0); + + scan_declaration (fd, d->decls) + { + prt_field_decl(CAST(field_decl, fd)); + if (fd->next) + output(", "); + } + outputln(";"); +} + +void prt_field_decl(field_decl fd) +{ + prt_declarator(fd->declarator, NULL, fd->attributes, NULL, 0); + if (fd->arg1) + { + output(" : "); + prt_expression(fd->arg1, P_TOP); + } +} + +void prt_enumerator(enumerator ed, tag_declaration tdecl) +{ + set_location(ed->location); + + if (tdecl && tdecl->container) + output_stripped_string_dollar(tdecl->container->name); + + output_stripped_cstring(ed->cstring); + if (ed->arg1) + { + output(" = "); + prt_expression(ed->arg1, P_ASSIGN); + } +} + +void prt_parameters(declaration gparms, declaration parms, psd_options options) +{ + declaration d; + bool forward = FALSE; + bool first = TRUE; + + /* If asked to rename parameters, ask prt_parameter to rename identifiers + when calling prt_declarator */ + if (options & psd_rename_parameters) + options = psd_rename_identifier; + else + options = 0; + + output("("); + scan_declaration (d, gparms) + { + prt_parameter(d, first, FALSE, options); + first = FALSE; + } + if (!(gparms && is_void_parms(parms))) + scan_declaration (d, parms) + { + forward = prt_parameter(d, first, forward, 0); + first = FALSE; + } + output(")"); +} + +bool prt_parameter(declaration parm, bool first, bool lastforward, + psd_options options) +{ + switch (parm->kind) + { + case kind_oldidentifier_decl: + if (!first) + output(", "); + set_location(parm->location); + output_stripped_cstring(CAST(oldidentifier_decl, parm)->cstring); + return FALSE; + case kind_ellipsis_decl: + if (!first) + output(", "); + set_location(parm->location); + output("..."); + return FALSE; + case kind_data_decl: + { + data_decl dd = CAST(data_decl, parm); + variable_decl vd = CAST(variable_decl, dd->decls); + + if (lastforward && !vd->forward) + output("; "); + else if (!first) + output(", "); + if (vd->ddecl && type_network_base_type(vd->ddecl->type)) + { + options |= psd_rewrite_nxbase; + /* If addressed, we need a real network type copy. This is + added by prt_network_parameter_copies, so we rename + the actual parameter */ + if (vd->ddecl->use_summary & c_addressed) + options |= psd_prefix_nxbase; + } + /* Force a name for the parameter when none is given */ + if (vd->ddecl && !vd->ddecl->name) + options |= psd_rename_identifier; + prt_declarator(vd->declarator, dd->modifiers, vd->attributes, + vd->ddecl, options); + + return vd->forward; + } + default: assert(0); return FALSE; + } +} + +void prt_asttype(asttype t) +{ + prt_declarator(t->declarator, t->qualifiers, NULL, NULL, 0); +} + +void prt_word(word w) +{ + set_location(w->location); + output_stripped_cstring(w->cstring); +} + +void prt_expressions(expression elist, bool isfirst) +{ + expression e; + + scan_expression (e, elist) + { + if (!isfirst) output(", "); + isfirst = FALSE; + prt_expression(e, P_ASSIGN); /* priority is that of assignment */ + } +} + +#define PRTEXPR(type, x) case kind_ ## type: prt_ ## type(CAST(type, (x)), context_priority); return + +/* Context priorities are that of the containing operator, starting at 0 + for , going up to 14 for ->, . See the symbolic P_XX constants + P_TOP (-1) is used for contexts with no priority restrictions. */ + +void prt_expression_helper(expression e, int context_priority) +{ +#if 0 + /* Turned on for debugging sometimes. */ + if (e->cst && constant_integral(e->cst) && type_integral(e->cst->type)) + { + output_constant(e->cst); + return; + } +#endif + switch (e->kind) + { + PRTEXPR(comma, e); + PRTEXPR(sizeof_type, e); + PRTEXPR(alignof_type, e); + PRTEXPR(label_address, e); + PRTEXPR(cast, e); + PRTEXPR(cast_list, e); + PRTEXPR(conditional, e); + PRTEXPR(identifier, e); + PRTEXPR(compound_expr, e); + PRTEXPR(function_call, e); + PRTEXPR(generic_call, e); + PRTEXPR(array_ref, e); + PRTEXPR(field_ref, e); + PRTEXPR(interface_deref, e); + PRTEXPR(init_list, e); + PRTEXPR(init_specific, e); + case kind_string_cst: + PRTEXPR(lexical_cst, e); + PRTEXPR(string, e); + default: + if (is_unary(e)) + { + prt_unary(CAST(unary, e), context_priority); + return; + } + assert(is_binary(e)); + prt_binary(CAST(binary, e), context_priority); + return; + } +} + +void prt_expression(expression e, int context_priority) +{ + if (!prt_network_expression(e)) + prt_expression_helper(e, context_priority); +} + +#define OPEN(pri) \ + if (pri < context_priority) \ + output("(") + +#define CLOSE(pri) \ + if (pri < context_priority) \ + output(")") + +void prt_comma(comma e, int context_priority) +{ + OPEN(P_COMMA); + prt_expressions(e->arg1, TRUE); + CLOSE(P_COMMA); +} + +void prt_sizeof_type(sizeof_type e, int context_priority) +{ + set_location(e->location); + output("sizeof("); + prt_asttype(e->asttype); + output(")"); +} + +void prt_alignof_type(alignof_type e, int context_priority) +{ + set_location(e->location); + output("__alignof__("); + prt_asttype(e->asttype); + output(")"); +} + +void prt_label_address(label_address e, int context_priority) +{ + set_location(e->location); + output("&&"); + prt_id_label(e->id_label); +} + +void prt_asttype_cast(asttype t) +{ + /* Casts to a network base type are replaced by casts to the + correspondingly sized base type */ + if (type_network_base_type(t->type)) + { + declarator d; + type_element qualifiers; + type2ast(unparse_region, t->location, + qualify_type1(type_network_platform_type(t->type), t->type), + NULL, &d, &qualifiers); + + t = new_asttype(unparse_region, t->location, d, qualifiers); + } + prt_asttype(t); +} + +void prt_cast(cast e, int context_priority) +{ + OPEN(P_CAST); + set_location(e->location); + output("("); + prt_asttype_cast(e->asttype); + output(")"); + prt_expression(e->arg1, P_CAST); + CLOSE(P_CAST); +} + +void prt_cast_list(cast_list e, int context_priority) +{ + OPEN(P_CAST); + set_location(e->location); + output("("); + prt_asttype_cast(e->asttype); + output(")"); + prt_init_list(CAST(init_list, e->init_expr), P_ASSIGN); + CLOSE(P_CAST); +} + +void prt_conditional(conditional e, int context_priority) +{ + OPEN(P_COND); + prt_expression(e->condition, P_OR); + output(" ? "); + if (e->arg1) + prt_expression(e->arg1, P_COND); + output(" : "); + prt_expression(e->arg2, P_COND); + CLOSE(P_COND); +} + +void prt_identifier(identifier e, int context_priority) +{ + data_declaration decl = e->ddecl; + + if (decl->kind == decl_function && decl->uncallable) + error_with_location(e->location, "%s not connected", e->cstring.data); + + set_location(e->location); + if (decl->kind == decl_constant && decl->substitute) + output_constant(decl->value); + else if (decl->kind == decl_error) /* attributes have bad code... */ + output_cstring(e->cstring); + else + prt_plain_ddecl(decl, 0); + + if (use_nido && is_module_variable(decl)) + output("[%s]", nido_mote_number); +} + +void prt_compound_expr(compound_expr e, int context_priority) +{ + set_location(e->location); + output("("); + prt_compound_stmt(CAST(compound_stmt, e->stmt), FALSE); + output(")"); +} + +void prt_function_call(function_call e, int context_priority) +{ + switch (e->call_kind) + { + case post_task: + set_location(e->arg1->location); + output("TOS_post("); + prt_expression(e->arg1, P_ASSIGN); + output(")"); + break; + default: + if (e->va_arg_call) + { + /* The extra parentheses are added because gcc 2.96 (aka redhat 7's + gcc) has a broken syntax for __builtin_va_arg */ + output("(__builtin_va_arg("); + prt_expression(e->args, P_ASSIGN); + output(", "); + prt_asttype(e->va_arg_call); + output("))"); + } + else if (get_magic(e)) + output_constant(e->cst); + else + { + prt_expression(e->arg1, P_CALL); + /* Generic calls have already started the argument list. + See prt_generic_call */ + if (is_generic_call(e->arg1)) + prt_expressions(e->args, FALSE); + else + { + output("("); + prt_expressions(e->args, TRUE); + } + output(")"); + } + break; + } +} + +void prt_generic_call(generic_call e, int context_priority) +{ + prt_expression(e->arg1, P_CALL); + /* function_call will finish the argument list. See prt_function_call */ + output("("); + prt_expressions(e->args, TRUE); + + /* This is a convenient place to do this check. We can't easily do it + in make_generic_call as we don't (yet) know our parent. */ + if (!is_function_call(e->parent)) + error_with_location(e->location, "generic arguments can only be used in command/event calls"); +} + +void prt_array_ref(array_ref e, int context_priority) +{ + prt_expression(e->arg1, P_CALL); + output("["); + prt_expression(e->arg2, P_TOP); + output("]"); +} + +void prt_field_ref(field_ref e, int context_priority) +{ + /* Reconstruct -> for nicer output */ + if (is_dereference(e->arg1)) + { + prt_expression(CAST(dereference, e->arg1)->arg1, P_CALL); + output("->"); + } + else + { + prt_expression(e->arg1, P_CALL); + output("."); + } + output_stripped_cstring(e->cstring); +} + +void prt_interface_deref(interface_deref e, int context_priority) +{ + data_declaration decl = e->ddecl; + + if (decl->kind == decl_function && decl->uncallable) + error_with_location(e->location, "%s.%s not connected", + CAST(identifier, e->arg1)->cstring.data, + e->cstring.data); + + prt_expression(e->arg1, P_CALL); + output_string(function_separator); + output_stripped_cstring(e->cstring); +} + +void prt_unary(unary e, int context_priority) +{ + char *op = NULL, *postop = NULL; + int pri = 0; + + /* Yuck. Evil hack because gcc is broken (breaks the a[i] == *(a+i) + rule when a is a non-lvalue array). So we undo our earlier rewrite + (from fix.c) of a[i] as *(a+i). Note that gcc doesn't allow i[a] in + this case (bozos at work?) */ + if (is_dereference(e) && is_plus(e->arg1)) + { + plus derefed = CAST(plus, e->arg1); + + if (type_array(derefed->arg1->type)) + { + prt_array_ref(derefed, context_priority); + return; + } + } + + set_location(e->location); + + switch (e->kind) + { + case kind_dereference: op = "*"; break; + case kind_extension_expr: op = "__extension__ "; break; + /* Higher priority for sizeof/alignof expr because we must + add parens around sizeof cast_expr (e.g. sizeof((char)x), not + sizeof (char)x */ + case kind_sizeof_expr: op = "sizeof "; pri = P_CALL; break; + case kind_alignof_expr: op = "__alignof__ "; pri = P_CALL; break; + case kind_realpart: op = "__real__ "; break; + case kind_imagpart: op = "__imag__ "; break; + case kind_address_of: op = "&"; break; + case kind_unary_minus: op = "-"; break; + case kind_unary_plus: op = "+"; break; + case kind_preincrement: op = "++"; break; + case kind_predecrement: op = "--"; break; + case kind_postincrement: postop = "++"; break; + case kind_postdecrement: postop = "--"; break; + case kind_conjugate: case kind_bitnot: op = "~"; break; + case kind_not: op = "!"; break; + case kind_component_deref: + prt_plain_ddecl(CAST(component_deref, e)->ddecl, 0); + return; + default: assert(0); return; + } + + OPEN(P_CAST); + if (op) + { + output_string(op); + if (is_unary(e->arg1)) + output(" "); /* Catch weirdness such as - - x */ + if (!pri) + pri = P_CAST; + } + prt_expression(e->arg1, pri ? pri : P_CALL); + if (postop) + output_string(postop); + CLOSE(P_CAST); +} + +const char *binary_op_name(AST_kind kind) +{ + switch (kind) + { + case kind_plus: return "+"; + case kind_minus: return "-"; + case kind_times: return "*"; + case kind_divide: return "/"; + case kind_modulo: return "%"; + case kind_lshift: return "<<"; + case kind_rshift: return ">>"; + case kind_leq: return "<="; + case kind_geq: return ">="; + case kind_lt: return "<"; + case kind_gt: return ">"; + case kind_eq: return "=="; + case kind_ne: return "!="; + case kind_bitand: return "&"; + case kind_bitor: return "|"; + case kind_bitxor: return "^"; + case kind_andand: return "&&"; + case kind_oror: return "||"; + case kind_assign: return "="; + case kind_plus_assign: return "+="; + case kind_minus_assign: return "-="; + case kind_times_assign: return "*="; + case kind_divide_assign: return "/="; + case kind_modulo_assign: return "%="; + case kind_lshift_assign: return "<<="; + case kind_rshift_assign: return ">>="; + case kind_bitand_assign: return "&="; + case kind_bitor_assign: return "|="; + case kind_bitxor_assign: return "^="; + default: assert(0); return ""; + } +} + +void prt_binary(binary e, int context_priority) +{ + int pri, lpri, rpri; + const char *op = binary_op_name(e->kind); + + switch (e->kind) + { + case kind_times: case kind_divide: case kind_modulo: + lpri = P_TIMES; pri = P_TIMES; rpri = P_CAST; break; + case kind_plus: case kind_minus: + lpri = P_PLUS; pri = P_PLUS; rpri = P_TIMES; break; + case kind_lshift: case kind_rshift: + pri = P_SHIFT; + if (CONSERVATIVE_PARENS) + lpri = rpri = P_TIMES; + else + { + lpri = P_SHIFT; rpri = P_PLUS; + } + break; + case kind_leq: case kind_geq: case kind_lt: case kind_gt: + lpri = P_REL; pri = P_REL; rpri = P_SHIFT; break; + case kind_eq: case kind_ne: + lpri = P_EQUALS; pri = P_EQUALS; rpri = P_REL; break; + case kind_bitand: + pri = P_BITAND; + if (CONSERVATIVE_PARENS) + lpri = rpri = P_TIMES; + else + { + lpri = P_BITAND; rpri = P_EQUALS; + } + break; + case kind_bitxor: + pri = P_BITXOR; + if (CONSERVATIVE_PARENS) + lpri = rpri = P_TIMES; + else + { + lpri = P_BITXOR; rpri = P_BITAND; + } + break; + case kind_bitor: + pri = P_BITOR; + if (CONSERVATIVE_PARENS) + lpri = rpri = P_TIMES; + else + { + lpri = P_BITOR; rpri = P_BITXOR; + } + break; + case kind_andand: + lpri = P_AND; pri = P_AND; rpri = P_BITOR; break; + case kind_oror: + pri = P_OR; + if (CONSERVATIVE_PARENS) + lpri = rpri = P_BITOR; + else + { + lpri = P_OR; rpri = P_AND; + } + break; + case kind_assign: case kind_plus_assign: case kind_minus_assign: + case kind_times_assign: case kind_divide_assign: case kind_modulo_assign: + case kind_lshift_assign: case kind_rshift_assign: case kind_bitand_assign: + case kind_bitor_assign: case kind_bitxor_assign: + lpri = P_CAST; pri = P_ASSIGN; rpri = P_ASSIGN; break; + default: assert(0); return; + } + + OPEN(pri); + prt_expression(e->arg1, lpri); + set_location(e->location); + output(" %s ", op); + prt_expression(e->arg2, rpri); + CLOSE(pri); +} + +void prt_lexical_cst(lexical_cst e, int context_priority) +{ + set_location(e->location); + output_cstring(e->cstring); +} + +void prt_string(string e, int context_priority) +{ + lexical_cst s; + + scan_lexical_cst (s, CAST(lexical_cst, e->strings)) + prt_lexical_cst(s, P_TOP); +} + +void prt_init_list(init_list e, int context_priority) +{ + set_location(e->location); + output("{ "); + prt_expressions(e->args, TRUE); + output(" }"); +} + +void prt_designator(designator dl) +{ + designator d; + + scan_designator (d, dl) + switch (d->kind) + { + case kind_designate_field: { + designate_field df = CAST(designate_field, d); + + output("."); + output_cstring(df->cstring); + break; + } + case kind_designate_index: { + designate_index di = CAST(designate_index, d); + + output("["); + prt_expression(di->arg1, P_ASSIGN); + if (di->arg2) + { + output(" ... "); + prt_expression(di->arg2, P_ASSIGN); + } + output("] "); + break; + } + default: assert(0); + } +} + +void prt_init_specific(init_specific e, int context_priority) +{ + set_location(e->location); + prt_designator(e->designator); + output(" = "); + prt_expression(e->init_expr, P_ASSIGN); +} + +void prt_statement(statement s) +{ + switch (s->kind) + { + PRTCASE(asm_stmt, s); + PRTCASE(if_stmt, s); + PRTCASE(labeled_stmt, s); + PRTCASE(expression_stmt, s); + PRTCASE(while_stmt, s); + PRTCASE(dowhile_stmt, s); + PRTCASE(switch_stmt, s); + PRTCASE(for_stmt, s); + PRTCASE(break_stmt, s); + PRTCASE(continue_stmt, s); + PRTCASE(return_stmt, s); + PRTCASE(goto_stmt, s); + PRTCASE(computed_goto_stmt, s); + PRTCASE(empty_stmt, s); + PRTCASE(atomic_stmt, s); + + case kind_compound_stmt: + prt_compound_stmt(CAST(compound_stmt, s), FALSE); + return; + default: assert(0); return; + } +} + +static void prt_as_compound(statement s) +{ + if (!is_compound_stmt(s)) + outputln("{"); + prt_statement(s); + if (!is_compound_stmt(s)) + { + startline(); + outputln("}"); + } +} + +void prt_compound_stmt(compound_stmt s, bool trusted) +{ + statement s1; + + set_location(s->location); + if (trusted && flag_deputy) + outputln("{ __DEPUTY_TRUSTEDBLOCK"); + else + outputln("{"); + indent(); + if (s->id_labels) + { + id_label l; + + output("__label__ "); + scan_id_label (l, s->id_labels) + { + prt_id_label(l); + if (l->next) + output(", "); + } + outputln(";"); + } + if (s->decls) + { + prt_compound_declarations(s->decls); + newline(); + } + + scan_statement (s1, s->stmts) + prt_statement(s1); + + unindent(); + outputln("}"); +} + +void prt_compound_declarations(declaration dlist) +{ + declaration d; + + scan_declaration (d, dlist) + prt_compound_declaration(d); +} + +void prt_compound_declaration(declaration d) +{ + startline(); + switch (d->kind) + { + PRTCASE(data_decl, d); + PRTCASE(extension_decl, d); + PRTCASE(function_decl, d); + default: assert(0); break; + } +} + +void prt_asm_stmt(asm_stmt s) +{ + prt_asm_stmt_plain(s); + output(";"); +} + +void prt_asm_stmt_plain(asm_stmt s) +{ + set_location(s->location); + output(" __asm "); + if (s->qualifiers) + prt_type_elements(s->qualifiers, 0); + output("("); + prt_expression(s->arg1, P_TOP); + if (s->asm_operands1 || s->asm_operands2 || s->asm_clobbers) + { + output(" : "); + prt_asm_operands(s->asm_operands1); + + if (s->asm_operands2 || s->asm_clobbers) + { + output(" : "); + prt_asm_operands(s->asm_operands2); + + if (s->asm_clobbers) + { + output(" : "); + prt_expressions(CAST(expression, s->asm_clobbers), TRUE); + } + } + } + output(")"); +} + +void prt_asm_operands(asm_operand olist) +{ + asm_operand o; + + scan_asm_operand (o, olist) + { + prt_asm_operand(o); + if (o->next) + output(", "); + } +} + +void prt_asm_operand(asm_operand o) +{ + set_location(o->location); + if (o->word1) + { + output("["); + prt_word(o->word1); + output("] "); + } + + prt_string(o->string, P_TOP); + output("("); + prt_expression(o->arg1, P_TOP); + output(")"); +} + +void prt_if_stmt(if_stmt s) +{ +#if 0 + if (s->condition->cst && constant_knownbool(s->condition->cst)) + { + if (constant_boolvalue(s->condition->cst)) + prt_statement(s->stmt1); + else if (s->stmt2) + prt_statement(s->stmt2); + else + outputln(";"); + return; + } +#endif + + set_location(s->location); + output("if ("); + /* CONSERVATIVE_PARENS: force parens around assignment within if */ + prt_expression(s->condition, CONSERVATIVE_PARENS ? P_COND : P_TOP); + output(") "); + indent(); + prt_as_compound(s->stmt1); + unindent(); + if (s->stmt2) + { + startline(); + output("else "); + indent(); + prt_as_compound(s->stmt2); + unindent(); + } +} + +void prt_labeled_stmt(labeled_stmt s) +{ + prt_label(s->label); + output(": "); + indent(); + prt_statement(s->stmt); + unindent(); +} + +void prt_expression_stmt(expression_stmt s) +{ + prt_expression(s->arg1, P_TOP); + outputln(";"); +} + +void prt_while_stmt(while_stmt s) +{ + set_location(s->location); + output("while ("); + /* CONSERVATIVE_PARENS: force parens around assignment within while */ + prt_expression(s->condition, CONSERVATIVE_PARENS ? P_COND : P_TOP); + output(") "); + indent(); + prt_statement(s->stmt); + unindent(); +} + +void prt_dowhile_stmt(while_stmt s) +{ +#if 0 + /* Elide do ... while (0) */ + if (s->condition->cst && + constant_knownbool(s->condition->cst) && + !constant_boolvalue(s->condition->cst)) + { + prt_statement(s->stmt); + return; + } +#endif + + set_location(s->location); + output("do "); + indent(); + prt_statement(s->stmt); + unindent(); + startline(); + output("while ("); + /* CONSERVATIVE_PARENS: force parens around assignment within do while */ + prt_expression(s->condition, CONSERVATIVE_PARENS ? P_COND : P_TOP); + outputln(");"); +} + +void prt_switch_stmt(switch_stmt s) +{ + set_location(s->location); + output("switch ("); + /* CONSERVATIVE_PARENS: force parens around assignment within switch */ + prt_expression(s->condition, CONSERVATIVE_PARENS ? P_COND : P_TOP); + output(") "); + indent(); + prt_statement(s->stmt); + unindent(); +} + +void prt_for_stmt(for_stmt s) +{ + set_location(s->location); + output("for ("); + if (s->arg1) + prt_expression(s->arg1, P_TOP); + output("; "); + if (s->arg2) + prt_expression(s->arg2, P_TOP); + output("; "); + if (s->arg3) + prt_expression(s->arg3, P_TOP); + output(") "); + indent(); + prt_statement(s->stmt); + unindent(); +} + +void prt_break_stmt(break_stmt s) +{ + set_location(s->location); + outputln("break;"); +} + +void prt_continue_stmt(continue_stmt s) +{ + set_location(s->location); + outputln("continue;"); +} + +void prt_return_stmt(return_stmt s) +{ + bool inatomic = FALSE; + + if (s->containing_atomic && + s->containing_atomic->isatomic == NOT_ATOMIC && + current.function_decl->ddecl->call_contexts != c_call_atomic) + { + /* We rewrote return statemnts within atomic to return a local + variable in stmt.c. So we can just end the atomic section now. */ + outputln("{"); + indent(); + set_location(s->location); + if (current.function_decl->ddecl->call_contexts == c_call_nonatomic && + nesc_optimise_atomic) + outputln("__nesc_enable_interrupt(); "); + else + outputln("__nesc_atomic_end(__nesc_atomic); "); + inatomic = TRUE; + } + + set_location(s->location); + if (s->arg1) + { + output("return "); + prt_expression(s->arg1, P_TOP); + outputln(";"); + } + else + outputln("return;"); + + if (inatomic) + { + unindent(); + outputln("}"); + } +} + +void prt_goto_stmt(goto_stmt s) +{ + set_location(s->location); + output("goto "); + prt_id_label(s->id_label); + outputln(";"); +} + +void prt_computed_goto_stmt(computed_goto_stmt s) +{ + set_location(s->location); + output("goto *"); + prt_expression(s->arg1, P_TOP); + outputln(";"); +} + +void prt_empty_stmt(empty_stmt s) +{ + set_location(s->location); + outputln(";"); +} + +void prt_atomic_stmt(atomic_stmt s) +{ + struct location hack; + + /* If the function's context is c_call_atomic, we can remove this atomic. */ + if (current.function_decl->ddecl->call_contexts == c_call_atomic) + { + outputln("/* atomic removed: atomic calls only */"); + prt_statement(s->stmt); + return; + } + + /* If the body of the atomic is atomic, we don't need to do anything */ + if (s->isatomic != NOT_ATOMIC) + { + outputln("/* atomic removed: %s */", + s->isatomic == ATOMIC_ANY ? "no shared variable access" : + "single single-byte shared variable access"); + prt_statement(s->stmt); + return; + } + + set_location(s->location); + if (current.function_decl->ddecl->call_contexts == c_call_nonatomic && + nesc_optimise_atomic) + outputln("{ __nesc_disable_interrupt();"); + else + outputln("{ __nesc_atomic_t __nesc_atomic = __nesc_atomic_start();"); + indent(); + prt_statement(s->stmt); + + /* The hack is to make debugging nicer: we make this new line appear + to be part of the previous line */ + hack = output_loc; + hack.lineno--; + set_location(&hack); + if (current.function_decl->ddecl->call_contexts == c_call_nonatomic && + nesc_optimise_atomic) + outputln("__nesc_enable_interrupt(); }"); + else + outputln("__nesc_atomic_end(__nesc_atomic); }"); + unindent(); +} + +void prt_label(label l) +{ + switch (l->kind) + { + PRTCASE(id_label, l); + PRTCASE(case_label, l); + PRTCASE(default_label, l); + default: assert(0); return; + } +} + +void prt_id_label(id_label l) +{ + set_location(l->location); + output_stripped_cstring(l->cstring); +} + +void prt_case_label(case_label l) +{ + set_location(l->location); + output("case "); + prt_expression(l->arg1, P_ASSIGN); + if (l->arg2) + { + output(" ... "); + prt_expression(l->arg2, P_ASSIGN); + } +} + +void prt_default_label(default_label l) +{ + set_location(l->location); + output("default"); +} diff --git a/src/unparse.h b/src/unparse.h new file mode 100644 index 0000000..26aa370 --- /dev/null +++ b/src/unparse.h @@ -0,0 +1,127 @@ +/* This file is part of the nesC compiler. + +This file is derived from the RC Compiler. It is thus + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef UNPARSE_H +#define UNPARSE_H + +/* string which accesses current mote number in nido */ +extern char *nido_mote_number; + +/* temporary region which can be used during unparsing */ +extern region unparse_region; + +void unparse(FILE *to, declaration program) deletes; +void unparse_start(FILE *to, FILE *symbols); +void unparse_end(void) deletes; +void unparse_prefix(const char *line); +void enable_line_directives(void); +void disable_line_directives(void); +void set_function_separator(char *sep); +const char *get_function_separator(void); +FILE *set_unparse_outfile(FILE *newout); +void enable_documentation_mode(void); +void disable_documentation_mode(void); + +void set_location(location l); +void set_fixed_location(location l); +void clear_fixed_location(void); +struct location output_location(void); +void output(char *format, ...) __attribute__((format (printf, 1, 2))); +void outputln(char *format, ...) __attribute__((format (printf, 1, 2))); +void output_stripped_cstring(cstring s); +void output_string(const char *s); +void output_cstring(cstring s); +void output_stripped_string(const char *s); +void output_stripped_string_dollar(const char *s); +void output_quoted_cs(cstring cs); +void copy_file_to_output(char *filename); +void newline(void); +void indent(void); +void unindent(void); +void startline(void); +void startline_noindent(void); + +const char *binary_op_name(AST_kind kind); + +/* Precedence levels */ +#define P_TOP -1 +#define P_COMMA 0 +#define P_ASSIGN 1 +#define P_COND 2 +#define P_OR 3 +#define P_AND 4 +#define P_BITOR 5 +#define P_BITXOR 6 +#define P_BITAND 7 +#define P_EQUALS 8 +#define P_REL 9 +#define P_SHIFT 10 +#define P_PLUS 11 +#define P_TIMES 12 +#define P_CAST 13 +#define P_CALL 14 + +void prt_asttype(asttype t); +void prt_data_decl(data_decl d); +void prt_toplevel_declarations(declaration d); +void prt_toplevel_declaration(declaration d); +void prt_nelements(expression array); +void prt_expressions(expression elist, bool isfirst); +void prt_expression(expression e, int context_priority); +void prt_expression_helper(expression e, int context_priority); + +typedef enum { + psd_need_paren_for_star = 1, + psd_need_paren_for_qual = 2, + psd_rename_parameters = 4, + psd_rename_identifier = 8, + psd_print_default = 16, + psd_skip_container = 32, + psd_print_ddecl = 64, /* print ddecl as the name inside a declarator */ + psd_prefix_nxbase = 128, /* add the __nesc_nxbase_ prefix to declared names */ + psd_rewrite_nxbase = 256, /* add the __nesc_nxbase_ prefix to base type */ + psd_print_ddecl_fdeclarator = 512, /* print innermost fdeclarator from ddecl */ + psd_duplicate = 1024, + psd_noextern = 2048, + psd_skip_command_event = 4096 +} psd_options; + +void prt_type_elements(type_element elements, psd_options options); +void prt_attribute_elements(type_element elements); +void prt_interesting_elements(type_element elements, psd_options options); + +void prt_variable_decl(type_element modifiers, variable_decl d, + psd_options dopts); +void prt_declarator(declarator d, type_element elements, attribute attributes, + data_declaration ddecl, psd_options options); +bool prt_simple_declarator(declarator d, data_declaration ddecl, + psd_options options); +void prt_parameters(declaration gparms, declaration parms, psd_options options); +bool prt_parameter(declaration parm, bool first, bool lastforward, psd_options options); +void prt_ddecl_full_name(data_declaration ddecl, psd_options options); +void prt_plain_ddecl(data_declaration ddecl, psd_options options); +void prt_field_decl(field_decl fd); + +void prt_function_body(function_decl d); + +void prt_diff_info(data_declaration ddecl); + +#endif diff --git a/src/utils.c b/src/utils.c new file mode 100644 index 0000000..c5d1bd0 --- /dev/null +++ b/src/utils.c @@ -0,0 +1,410 @@ +/* This file is part of the nesC compiler. + +This file is derived from the RC Compiler. It is thus + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation +It also includes + Public domain code from Pat Rankin +and code from libiberty that is + Copyright (C) 2001, 2002 Free Software Foundation, Inc. + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include "parser.h" +#include "utils.h" +#include + +void renew_region(region *r) +/* Effects: Delete region *r (if not null), allocate a new region in *r */ +{ + if (*r) + deleteregion_ptr(r); + *r = newregion(); +} + +void *xmalloc(size_t size) +{ +#ifdef BWGC + void *x = GC_malloc(size); +#else + void *x = malloc(size); +#endif + + if (!x) abort(); + + return x; +} + +void *xcalloc(size_t count, size_t size) +{ +#ifdef BWGC + void *x = GC_calloc(count, size); +#else + void *x = calloc(count, size); +#endif + + if (!x) abort(); + + return x; +} + +void *xrealloc(void *p, size_t newsize) +{ +#ifdef BWGC + void *x = GC_realloc(p, newsize); +#else + void *x = realloc(p, newsize); +#endif + + if (!x) abort(); + + return x; +} + +char *xstrdup(const char *s) +{ + char *t = strdup(s); + + if (!t) abort(); + + return t; +} + +void *xmemdup(const void *from, size_t s, size_t nsize) +{ + void *x = xcalloc(1, nsize); + + return memcpy(x, from, s); +} + +#define ERRSTR_FMT "undocumented error #%d" +static char xstrerror_buf[sizeof ERRSTR_FMT + 20]; + +/* Like strerror, but result is never a null pointer. */ +char *xstrerror (int errnum) +{ + char *errstr; +#ifdef VMS + char *(*vmslib_strerror) (int,...); + + /* Override any possibly-conflicting declaration from system header. */ + vmslib_strerror = (char *(*) (int,...)) strerror; + /* Second argument matters iff first is EVMSERR, but it's simpler to + pass it unconditionally. `vaxc$errno' is declared in + and maintained by the run-time library in parallel to `errno'. + We assume that `errnum' corresponds to the last value assigned to + errno by the run-time library, hence vaxc$errno will be relevant. */ + errstr = (*vmslib_strerror) (errnum, vaxc$errno); +#else + errstr = strerror (errnum); +#endif + + /* If `errnum' is out of range, result might be NULL. We'll fix that. */ + if (!errstr) + { + sprintf (xstrerror_buf, ERRSTR_FMT, errnum); + errstr = xstrerror_buf; + } + return errstr; +} + +/* Make a new unintialised cstring of length l */ +cstring alloc_cstring(region r, int l) +{ + cstring cs; + + cs.data = rstralloc(r, l + 1); + cs.data[l] = '\0'; + cs.length = l; + + return cs; +} + +/* Make a new cstring with a copy of s, length l */ +cstring make_cstring(region r, const char *s, int l) +{ + cstring cs = alloc_cstring(r, l); + + memcpy(cs.data, s, l); + + return cs; +} + +/* Make a new cstring with a copy of regular C string s */ +cstring str2cstring(region r, const char *s) +{ + return make_cstring(r, s, strlen(s)); +} + +/* Make a new C string with a copy of cstring s */ +char *cstring2str(region r, cstring s) +{ + int len = s.length + 1; + char *str = rstralloc(r, len); + + memcpy(str, s.data, len); + + return str; +} + +unsigned long align_to(unsigned long n, unsigned long alignment) +{ + int count = (n + alignment - 1) / alignment; + + return count * alignment; +} + +unsigned long gcd(unsigned long x, unsigned long y) +{ + unsigned long z; + + for (;;) + { + if (y == 0) + return x; + + z = x % y; x = y; y = z; + } +} + +unsigned long lcm(unsigned long x, unsigned long y) +{ + /* ignoring risk of overflow (used for alignments which are typically <= 16) */ + return (x * y) / gcd(x, y); +} + +int ilog2(largest_uint x) +{ + /* slow version */ + largest_uint v = 1; + int log2 = 0; + + while (v < x) + { + v <<= 1; + log2++; + if (!v) + return -1; + } + + return v == x ? log2 : -1; +} + +DEFINE_ARRAY(char_array, char) + +/* For some obscure reason, there's no standard function for this + (Linux's wctombs does it, but it's not standard) */ +int wcs_mb_size(const wchar_t *wstr) +/* Returns: number of bytes to be allocated for a C string buffer + that will successfully hold the result of wcstombs(buffer, wstr, ?), + or -1 if wstr cannot be converted +*/ +{ + size_t len = 0; + char tmp[MB_CUR_MAX]; + + wctomb(NULL, 0); + while (*wstr) + { + int mblen = wctomb(tmp, *wstr++); + + if (mblen < 0) + return -1; + len += mblen; + } + + return len + 1; +} + +unsigned long hash_ptr(void *p) +/* Returns: a reasonable hash for a pointer value + */ +{ + return (unsigned long)p >> ALIGNMENT_BITS; +} + +int compare_ptr(void *entry1, void *entry2) +/* Returns: entry1 == entry2 (use with new_dhash_table) */ +{ + return entry1 == entry2; +} + +unsigned long hash_str(const char *s) +/* Returns: a reasonable hash for a character string. + FIXME: the return value is only effected by the final 32 characters + in the string. + */ +{ + register unsigned long code = 0; + + if( !s ) + return 0x57954317; + + while (*s) + { + code = ((code << 1) + *s) ^ 0x57954317; + s++; + } + + return code; +} + +/* On machines with DIR_SEPARATOR defined, replace all DIR_SEPARATOR's + by / */ +void unixify_path(char *path) +{ +#ifdef DIR_SEPARATOR + while ((path = strchr(path, DIR_SEPARATOR))) + *path++ = '/'; +#endif +} + +/* TRUE if path is absolute, false otherwise */ +bool absolute_path(char *path) +{ +#ifndef WIN32 + if (path[0] == '/') + return TRUE; +#endif + +#if defined(WIN32) || defined(__CYGWIN32__) + if (isalpha(path[0]) && path[1] == ':' && + (path[2] == '/' || path[2] == '\\')) + return TRUE; +#endif + + return FALSE; +} + +#if !HAVE_REALPATH +#ifdef WIN32 +#include + +static bool pathcat(char *base, const char *add) +{ + int l = strlen(base); + + if (l + strlen(add) + 2 >= PATH_MAX) + return FALSE; /* doesn't fit */ + + base[l] = '/'; + strcpy(base + l + 1, add); + return TRUE; +} + +char *realpath(const char *path, char *resolved_path) +{ + char *slash, *last; + + /* This version doesn't support a NULL resolved_path. We don't + use it that way anyway */ + + if (isalpha(path[0]) && path[1] == ':') + if (path[2] == '/' || path[2] == '\\') + { + if (strlen(path) >= PATH_MAX - 1) + return NULL; + strcpy(resolved_path, path); /* absolute path */ + } + else + { + /* drive relative path */ + if (!_getdcwd(tolower(path[0] - 'a' + 1), resolved_path, PATH_MAX)) + return NULL; + if (!pathcat(resolved_path, path + 2)) + return NULL; + } + else + { + /* fully relative path */ + if (!getcwd(resolved_path, PATH_MAX)) + return NULL; + if (!pathcat(resolved_path, path)) + return NULL; + } + + if (!absolute_path(resolved_path)) + return NULL; /* this could be an assert */ + + unixify_path(resolved_path); + + /* Then, we remove all duplicate /'s, and . and .. directory + references. No attempt to avoid n^2 like behaviour. */ + last = resolved_path + 2; + do + { + /* Find next slash or end of path */ + slash = last + 1; + while (*slash != '/' && *slash) + slash++; + + if (slash == last + 1 || /* empty dir spec */ + (slash == last + 2 && last[1] == '.')) /* or . */ + memmove(last, slash, strlen(slash) + 1); + else if (slash == last + 3 && + last[1] == '.' && last[2] == '.') /* .. */ + { + /* look backwards for directory to squash */ + while (last >= resolved_path + 2 && *--last != '/') + ; + memmove(last, slash, strlen(slash) + 1); + } + else + last = slash; + } + while (*last); + + /* If we have x:, make it into x:/ */ + if (!resolved_path[2]) + { + resolved_path[2] = '/'; + resolved_path[3] = '\0'; + } + + return resolved_path; +} +#else +#error "realpath missing" +#endif +#endif + +#ifdef TEST_REALPATH +void tr(char *path) +{ + char rp[PATH_MAX]; + + if (realpath(path, rp)) + printf("%s -> %s\n", path, rp); + else + printf("%s fails\n", path); +} + +int region_main() +{ + tr("aa"); + tr("n:xx"); + tr("n:\\xx"); + tr("n:\\\\aa\\\\b\\.\\c"); + tr("c:/"); + tr("c:/foo/"); + tr("c:/foo/.."); + tr("c:/../foo"); + tr("c:///////////"); + tr("n:../fun"); + tr("../.././a"); + return 0; +} +#endif diff --git a/src/utils.h b/src/utils.h new file mode 100644 index 0000000..f67592c --- /dev/null +++ b/src/utils.h @@ -0,0 +1,79 @@ +/* This file is part of the nesC compiler. + +This file is derived from the RC Compiler. It is thus + Copyright (C) 2000-2001 The Regents of the University of California. +Changes for nesC are + Copyright (C) 2002 Intel Corporation + +The attached "nesC" software is provided to you under the terms and +conditions of the GNU General Public License Version 2 as published by the +Free Software Foundation. + +nesC 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 nesC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef UTILS_H +#define UTILS_H + +#include "array.h" +#include "cstring.h" + +void renew_region(region *r); +/* Effects: Delete region *r (if not null), allocate a new region in *r */ + +void *xmalloc(size_t size); +void *xrealloc(void *p, size_t newsize); + +unsigned long align_to(unsigned long n, unsigned long alignment); + +int ilog2(largest_uint x); + +/* least common multiple */ +unsigned long lcm(unsigned long x, unsigned long y); + +#define MAX(a, b) ((a) > (b) ? (a) : (b)) +#define MIN(a, b) ((a) < (b) ? (a) : (b)) + +DECLARE_ARRAY(wchar_array, wchar_t) +DECLARE_ARRAY(char_array, char) + +int wcs_mb_size(const wchar_t *wstr); +/* Returns: number of bytes to be allocated for a C string buffer + that will successfully hold the result of wcstombs(buffer, wstr, ?), + or -1 if wstr cannot be converted +*/ + +/* Some basic hash functions, that are re-used in a number of places */ +unsigned long hash_ptr(void *p); +int compare_ptr(void *entry1, void *entry2); + +unsigned long hash_str(const char *); + +#if !HAVE_REALPATH +char *realpath(const char *path, char *resolved_path); +#endif + +/* From libiberty */ +extern const char *lbasename (const char *); + +/* On machines with DIR_SEPARATOR defined, replace all DIR_SEPARATOR's + by / */ +void unixify_path(char *path); + +/* TRUE if path is absolute, false otherwise */ +bool absolute_path(char *path); + +#ifdef WIN32 +#define DEVNULL "nul:" +#else +#define DEVNULL "/dev/null" +#endif + +#endif diff --git a/tools/Makefile.am b/tools/Makefile.am new file mode 100644 index 0000000..339bd94 --- /dev/null +++ b/tools/Makefile.am @@ -0,0 +1,78 @@ +# This file is part of the nesC compiler. +# Copyright (C) 2002 Intel Corporation +# +# The attached "nesC" software is provided to you under the terms and +# conditions of the GNU General Public License Version 2 as published by the +# Free Software Foundation. +# +# nesC 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 nesC; see the file COPYING. If not, write to +# the Free Software Foundation, 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +AUTOMAKE_OPTIONS = foreign + +SUBDIRS = java + +ncclibdir=$(libdir)/ncc +nccdatadir=$(datadir)/ncc +editordir=$(nccdatadir)/editor-modes +emacsdir=$(editordir)/emacs +vimdir=$(editordir)/vim +kdedir=$(editordir)/kde +geditdir=$(editordir)/gedit + +bin_SCRIPTS = nescc-mig nescc-ncg nescc nescc-wiring + +ncclib_DATA = deputy_nodeputy.h \ + deputy_stage1.h \ + deputy_stage2.h \ + genjava.pm \ + gencstjava.pm \ + gencsharp.pm \ + genc.pm \ + gencstc.pm \ + genpython.pm \ + gencstpython.pm \ + migdecode.pm \ + nesc_nx.h + +nodist_ncclib_DATA = nesc.jar + +emacs_DATA = \ + editor-modes/emacs/nesc.el \ + editor-modes/emacs/new-nesc.el \ + editor-modes/emacs/old-nesc.el \ + editor-modes/emacs/readme.txt +vim_DATA = \ + editor-modes/vim/nesc.vim \ + editor-modes/vim/filetype.vim \ + editor-modes/emacs/readme.txt +kde_DATA = \ + editor-modes/kde/nesc.xml \ + editor-modes/kde/readme.txt +gedit_DATA = \ + editor-modes/gedit/ncc.lang \ + editor-modes/gedit/readme.txt + +EXTRA_DIST = \ + $(ncclib_DATA) \ + $(emacs_DATA) \ + $(vim_DATA) \ + $(kde_DATA) \ + $(gedit_DATA) + +NESC_JAR_DEPS = $(shell find java -name '*.java') + +nesc.jar: $(NESC_JAR_DEPS) + (cd java && $(MAKE)) + (cd java && jar cf ../$@ `find . -name '*.class'`) + +FORCE: + +.phony: FORCE diff --git a/tools/Makefile.in b/tools/Makefile.in new file mode 100644 index 0000000..7613c02 --- /dev/null +++ b/tools/Makefile.in @@ -0,0 +1,689 @@ +# Makefile.in generated by automake 1.10 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# This file is part of the nesC compiler. +# Copyright (C) 2002 Intel Corporation +# +# The attached "nesC" software is provided to you under the terms and +# conditions of the GNU General Public License Version 2 as published by the +# Free Software Foundation. +# +# nesC 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 nesC; see the file COPYING. If not, write to +# the Free Software Foundation, 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +subdir = tools +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(srcdir)/nescc-diff.in $(srcdir)/nescc-mig.in \ + $(srcdir)/nescc-ncg.in $(srcdir)/nescc-wiring.in \ + $(srcdir)/nescc.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/config-aux/mkinstalldirs +CONFIG_CLEAN_FILES = nescc-mig nescc-ncg nescc nescc-diff nescc-wiring +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(emacsdir)" \ + "$(DESTDIR)$(geditdir)" "$(DESTDIR)$(kdedir)" \ + "$(DESTDIR)$(ncclibdir)" "$(DESTDIR)$(ncclibdir)" \ + "$(DESTDIR)$(vimdir)" +binSCRIPT_INSTALL = $(INSTALL_SCRIPT) +SCRIPTS = $(bin_SCRIPTS) +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +emacsDATA_INSTALL = $(INSTALL_DATA) +geditDATA_INSTALL = $(INSTALL_DATA) +kdeDATA_INSTALL = $(INSTALL_DATA) +ncclibDATA_INSTALL = $(INSTALL_DATA) +nodist_ncclibDATA_INSTALL = $(INSTALL_DATA) +vimDATA_INSTALL = $(INSTALL_DATA) +DATA = $(emacs_DATA) $(gedit_DATA) $(kde_DATA) $(ncclib_DATA) \ + $(nodist_ncclib_DATA) $(vim_DATA) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EXEEXT = @EXEEXT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build_alias = @build_alias@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host_alias = @host_alias@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pathperl = @pathperl@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +subdirs = @subdirs@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = foreign +SUBDIRS = java +ncclibdir = $(libdir)/ncc +nccdatadir = $(datadir)/ncc +editordir = $(nccdatadir)/editor-modes +emacsdir = $(editordir)/emacs +vimdir = $(editordir)/vim +kdedir = $(editordir)/kde +geditdir = $(editordir)/gedit +bin_SCRIPTS = nescc-mig nescc-ncg nescc nescc-wiring +ncclib_DATA = deputy_nodeputy.h \ + deputy_stage1.h \ + deputy_stage2.h \ + genjava.pm \ + gencstjava.pm \ + gencsharp.pm \ + genc.pm \ + gencstc.pm \ + genpython.pm \ + gencstpython.pm \ + migdecode.pm \ + nesc_nx.h + +nodist_ncclib_DATA = nesc.jar +emacs_DATA = \ + editor-modes/emacs/nesc.el \ + editor-modes/emacs/new-nesc.el \ + editor-modes/emacs/old-nesc.el \ + editor-modes/emacs/readme.txt + +vim_DATA = \ + editor-modes/vim/nesc.vim \ + editor-modes/vim/filetype.vim \ + editor-modes/emacs/readme.txt + +kde_DATA = \ + editor-modes/kde/nesc.xml \ + editor-modes/kde/readme.txt + +gedit_DATA = \ + editor-modes/gedit/ncc.lang \ + editor-modes/gedit/readme.txt + +EXTRA_DIST = \ + $(ncclib_DATA) \ + $(emacs_DATA) \ + $(vim_DATA) \ + $(kde_DATA) \ + $(gedit_DATA) + +NESC_JAR_DEPS = $(shell find java -name '*.java') +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tools/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign tools/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +nescc-mig: $(top_builddir)/config.status $(srcdir)/nescc-mig.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +nescc-ncg: $(top_builddir)/config.status $(srcdir)/nescc-ncg.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +nescc: $(top_builddir)/config.status $(srcdir)/nescc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +nescc-diff: $(top_builddir)/config.status $(srcdir)/nescc-diff.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +nescc-wiring: $(top_builddir)/config.status $(srcdir)/nescc-wiring.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +install-binSCRIPTS: $(bin_SCRIPTS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_SCRIPTS)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + if test -f $$d$$p; then \ + f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ + echo " $(binSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(bindir)/$$f'"; \ + $(binSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(bindir)/$$f"; \ + else :; fi; \ + done + +uninstall-binSCRIPTS: + @$(NORMAL_UNINSTALL) + @list='$(bin_SCRIPTS)'; for p in $$list; do \ + f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ + echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ + rm -f "$(DESTDIR)$(bindir)/$$f"; \ + done +install-emacsDATA: $(emacs_DATA) + @$(NORMAL_INSTALL) + test -z "$(emacsdir)" || $(MKDIR_P) "$(DESTDIR)$(emacsdir)" + @list='$(emacs_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(emacsDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(emacsdir)/$$f'"; \ + $(emacsDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(emacsdir)/$$f"; \ + done + +uninstall-emacsDATA: + @$(NORMAL_UNINSTALL) + @list='$(emacs_DATA)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(emacsdir)/$$f'"; \ + rm -f "$(DESTDIR)$(emacsdir)/$$f"; \ + done +install-geditDATA: $(gedit_DATA) + @$(NORMAL_INSTALL) + test -z "$(geditdir)" || $(MKDIR_P) "$(DESTDIR)$(geditdir)" + @list='$(gedit_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(geditDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(geditdir)/$$f'"; \ + $(geditDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(geditdir)/$$f"; \ + done + +uninstall-geditDATA: + @$(NORMAL_UNINSTALL) + @list='$(gedit_DATA)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(geditdir)/$$f'"; \ + rm -f "$(DESTDIR)$(geditdir)/$$f"; \ + done +install-kdeDATA: $(kde_DATA) + @$(NORMAL_INSTALL) + test -z "$(kdedir)" || $(MKDIR_P) "$(DESTDIR)$(kdedir)" + @list='$(kde_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(kdeDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(kdedir)/$$f'"; \ + $(kdeDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(kdedir)/$$f"; \ + done + +uninstall-kdeDATA: + @$(NORMAL_UNINSTALL) + @list='$(kde_DATA)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(kdedir)/$$f'"; \ + rm -f "$(DESTDIR)$(kdedir)/$$f"; \ + done +install-ncclibDATA: $(ncclib_DATA) + @$(NORMAL_INSTALL) + test -z "$(ncclibdir)" || $(MKDIR_P) "$(DESTDIR)$(ncclibdir)" + @list='$(ncclib_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(ncclibDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(ncclibdir)/$$f'"; \ + $(ncclibDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(ncclibdir)/$$f"; \ + done + +uninstall-ncclibDATA: + @$(NORMAL_UNINSTALL) + @list='$(ncclib_DATA)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(ncclibdir)/$$f'"; \ + rm -f "$(DESTDIR)$(ncclibdir)/$$f"; \ + done +install-nodist_ncclibDATA: $(nodist_ncclib_DATA) + @$(NORMAL_INSTALL) + test -z "$(ncclibdir)" || $(MKDIR_P) "$(DESTDIR)$(ncclibdir)" + @list='$(nodist_ncclib_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(nodist_ncclibDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(ncclibdir)/$$f'"; \ + $(nodist_ncclibDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(ncclibdir)/$$f"; \ + done + +uninstall-nodist_ncclibDATA: + @$(NORMAL_UNINSTALL) + @list='$(nodist_ncclib_DATA)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(ncclibdir)/$$f'"; \ + rm -f "$(DESTDIR)$(ncclibdir)/$$f"; \ + done +install-vimDATA: $(vim_DATA) + @$(NORMAL_INSTALL) + test -z "$(vimdir)" || $(MKDIR_P) "$(DESTDIR)$(vimdir)" + @list='$(vim_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(vimDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(vimdir)/$$f'"; \ + $(vimDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(vimdir)/$$f"; \ + done + +uninstall-vimDATA: + @$(NORMAL_UNINSTALL) + @list='$(vim_DATA)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(vimdir)/$$f'"; \ + rm -f "$(DESTDIR)$(vimdir)/$$f"; \ + done + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + distdir=`$(am__cd) $(distdir) && pwd`; \ + top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$top_distdir" \ + distdir="$$distdir/$$subdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile $(SCRIPTS) $(DATA) +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(emacsdir)" "$(DESTDIR)$(geditdir)" "$(DESTDIR)$(kdedir)" "$(DESTDIR)$(ncclibdir)" "$(DESTDIR)$(ncclibdir)" "$(DESTDIR)$(vimdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +info: info-recursive + +info-am: + +install-data-am: install-emacsDATA install-geditDATA install-kdeDATA \ + install-ncclibDATA install-nodist_ncclibDATA install-vimDATA + +install-dvi: install-dvi-recursive + +install-exec-am: install-binSCRIPTS + +install-html: install-html-recursive + +install-info: install-info-recursive + +install-man: + +install-pdf: install-pdf-recursive + +install-ps: install-ps-recursive + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-binSCRIPTS uninstall-emacsDATA \ + uninstall-geditDATA uninstall-kdeDATA uninstall-ncclibDATA \ + uninstall-nodist_ncclibDATA uninstall-vimDATA + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ + install-strip + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic ctags \ + ctags-recursive distclean distclean-generic distclean-tags \ + distdir dvi dvi-am html html-am info info-am install \ + install-am install-binSCRIPTS install-data install-data-am \ + install-dvi install-dvi-am install-emacsDATA install-exec \ + install-exec-am install-geditDATA install-html install-html-am \ + install-info install-info-am install-kdeDATA install-man \ + install-ncclibDATA install-nodist_ncclibDATA install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + install-vimDATA installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags \ + tags-recursive uninstall uninstall-am uninstall-binSCRIPTS \ + uninstall-emacsDATA uninstall-geditDATA uninstall-kdeDATA \ + uninstall-ncclibDATA uninstall-nodist_ncclibDATA \ + uninstall-vimDATA + + +nesc.jar: $(NESC_JAR_DEPS) + (cd java && $(MAKE)) + (cd java && jar cf ../$@ `find . -name '*.class'`) + +FORCE: + +.phony: FORCE +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/tools/deputy_nodeputy.h b/tools/deputy_nodeputy.h new file mode 100644 index 0000000..9510c60 --- /dev/null +++ b/tools/deputy_nodeputy.h @@ -0,0 +1,33 @@ +#ifndef DEPUTY_STAGE1_INCLUDED +#define DEPUTY_STAGE1_INCLUDED + +#include + +#define __DEPUTY_UNUSED__ __attribute__((unused)) + +struct @nonnull @deputy_scope() { }; +struct @bnd @deputy_scope() { void *lo, *hi; }; +struct @bnd_nok @deputy_scope() { void *lo, *hi; }; +struct @count @deputy_scope() { int n; }; +struct @count_nok @deputy_scope() { int n; }; +struct @one @deputy_scope() { }; +struct @one_nok @deputy_scope() { }; +struct @dmemset @deputy_scope() { int a1, a2, a3; }; +struct @dmemcpy @deputy_scope() { int a1, a2, a3; }; +struct @nts @deputy_scope() { }; + +#define NONNULL @nonnull() +#define BND(x,y) @bnd(x,y) +#define BND_NOK(x,y) @bnd_nok(x,y) +#define COUNT(x) @count(x) +#define COUNT_NOK(x) @count_nok(x) +#define ONE @one() +#define ONE_NOK @one_nok() +#define DMEMSET(x,y,z) @dmemset(x,y,z) +#define DMEMCPY(x,y,z) @dmemcpy(x,y,z) +#define TRUSTEDBLOCK @unsafe() +#define NTS @nts() + +#define TCAST(__type,__expr) ((__type)(__expr)) + +#endif diff --git a/tools/deputy_stage1.h b/tools/deputy_stage1.h new file mode 100644 index 0000000..18e3f0a --- /dev/null +++ b/tools/deputy_stage1.h @@ -0,0 +1,40 @@ +#ifndef DEPUTY_STAGE1_INCLUDED +#define DEPUTY_STAGE1_INCLUDED + +#include + +#define __DEPUTY_UNUSED__ __attribute__((unused)) + +struct @nonnull @deputy_scope() @macro("__DEPUTY_NONNULL") { }; +struct @bnd @deputy_scope() @macro("__DEPUTY_BND") { void *lo, *hi; }; +struct @bnd_nok @deputy_scope() @macro("__DEPUTY_BND_NOK") { void *lo, *hi; }; +struct @count @deputy_scope() @macro("__DEPUTY_COUNT") { int n; }; +struct @count_nok @deputy_scope() @macro("__DEPUTY_COUNT_NOK") { int n; }; +struct @one @deputy_scope() @macro("__DEPUTY_ONE") { }; +struct @one_nok @deputy_scope() @macro("__DEPUTY_ONE_NOK") { }; +struct @dmemset @deputy_scope() @macro("__DEPUTY_DMEMSET") { int a1, a2, a3; }; +struct @dmemcpy @deputy_scope() @macro("__DEPUTY_DMEMCPY") { int a1, a2, a3; }; +struct @nts @deputy_scope() @macro("__DEPUTY_NTS") { }; + +#define NONNULL @nonnull() +#define BND(x,y) @bnd(x,y) +#define BND_NOK(x,y) @bnd_nok(x,y) +#define COUNT(x) @count(x) +#define COUNT_NOK(x) @count_nok(x) +#define ONE @one() +#define ONE_NOK @one_nok() +#define DMEMSET(x,y,z) @dmemset(x,y,z) +#define DMEMCPY(x,y,z) @dmemcpy(x,y,z) +#define TRUSTEDBLOCK @unsafe() +#define NTS @nts() + +#define __DEPUTY_TRUSTED __attribute__((trusted)) +#define __DEPUTY_COPYTYPE __attribute__((copytype)) + +#define TCAST(__type,__expr) ((__type)((void * __DEPUTY_TRUSTED __DEPUTY_COPYTYPE)(__expr))) + +void * (DMEMSET(1, 2, 3) memset)(void*, int, size_t); +void * (DMEMCPY(1, 2, 3) memcpy)(void*, const void*, size_t); +void * (DMEMCPY(1, 2, 3) memmove)(void*, const void*, size_t); + +#endif diff --git a/tools/deputy_stage2.h b/tools/deputy_stage2.h new file mode 100644 index 0000000..af6db24 --- /dev/null +++ b/tools/deputy_stage2.h @@ -0,0 +1,11 @@ +#define __DEPUTY_NONNULL(__n) __attribute__((nonnull)) +#define __DEPUTY_BND_NOK(__lo,__hi) __attribute__((bounds((__lo),(__hi)))) +#define __DEPUTY_BND(__lo,__hi) __DEPUTY_NONNULL(__n) __DEPUTY_BND_NOK(__lo,__hi) +#define __DEPUTY_COUNT_NOK(__n) __DEPUTY_BND_NOK(__this, __this + (__n)) +#define __DEPUTY_COUNT(__n) __DEPUTY_NONNULL(__n) __DEPUTY_COUNT_NOK(__n) +#define __DEPUTY_ONE_NOK(__n) __DEPUTY_COUNT_NOK(1) +#define __DEPUTY_ONE(__n) __DEPUTY_NONNULL(__n) __DEPUTY_ONE_NOK(__n) +#define __DEPUTY_NTS(__n) __attribute__((nullterm)) __DEPUTY_COUNT_NOK(0) +#define __DEPUTY_TRUSTEDBLOCK __blockattribute__((trusted)) +#define __DEPUTY_DMEMSET(x,y,z) __attribute__((dmemset((x),(y),(z)))) +#define __DEPUTY_DMEMCPY(x,y,z) __attribute__((dmemcpy((x),(y),(z)))) diff --git a/tools/editor-modes/emacs/nesc.el b/tools/editor-modes/emacs/nesc.el new file mode 100644 index 0000000..67fd228 --- /dev/null +++ b/tools/editor-modes/emacs/nesc.el @@ -0,0 +1,163 @@ +;;; necs.el --- nesC mode + +;; Author: David Gay +;; Keywords: c, languages + +;; This file is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License Version 2 +;; as published by the Free Software Foundation. + +;; This file 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 GNU Emacs; see the file COPYING. If not, write to +;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. + +(require 'cc-mode) + +;; Load appropriate version of nesC emacs mode +(if (string-match "^5.2[0-9]" c-version) + (load-library "old-nesc.el") + (load-library "new-nesc.el")) + +;; c-font-lock-declarators has a bug (spams a warning message) when +;; editing enum's with '=' in font-lock-mode, in 5.30.9. Redefine it. +(if (string-equal c-version "5.30.9") + (defun c-font-lock-declarators (limit list types) + ;; Assuming the point is at the start of a declarator in a + ;; declaration, fontify it. If LIST is non-nil, fontify also all + ;; following declarators in a comma separated list (e.g. "foo" and + ;; "bar" in "int foo = 17, bar;"). Stop at LIMIT. If TYPES is + ;; non-nil, fontify all identifiers as types. Nil is always + ;; returned. + + ;;(message "c-font-lock-declarators from %s to %s" (point) limit) + (c-fontify-types-and-refs + ((pos (point)) next-pos id-start id-end + paren-depth + id-face got-init + c-last-identifier-range + (separator-prop (if types 'c-decl-type-start 'c-decl-id-start))) + + (while (and + pos + (< (point) limit) + + (let (got-identifier) + (setq paren-depth 0) + ;; Skip over type decl prefix operators. (Note similar + ;; code in `c-font-lock-declarations'.) + (while (and (looking-at c-type-decl-prefix-key) + (if (and (c-major-mode-is 'c++-mode) + (match-beginning 2)) + ;; If the second submatch matches in C++ then + ;; we're looking at an identifier that's a + ;; prefix only if it specifies a member pointer. + (progn + (setq id-start (point)) + (c-forward-name) + (if (looking-at "\\(::\\)") + ;; We only check for a trailing "::" and + ;; let the "*" that should follow be + ;; matched in the next round. + t + ;; It turned out to be the real identifier, + ;; so flag that and stop. + (setq got-identifier t) + nil)) + t)) + (if (eq (char-after) ?\() + (progn + (setq paren-depth (1+ paren-depth)) + (forward-char)) + (goto-char (match-end 1))) + (c-forward-syntactic-ws)) + + ;; If we didn't pass the identifier above already, do it now. + (unless got-identifier + (setq id-start (point)) + (c-forward-name)) + (setq id-end (point)) + + (/= id-end pos)) + + ;; Skip out of the parens surrounding the identifier. + (or (= paren-depth 0) + (c-safe (goto-char (scan-lists (point) 1 paren-depth)))) + + (<= (point) limit) + + ;; Search syntactically to the end of the declarator (";", + ;; ",", a closen paren, eob etc) or to the beginning of an + ;; initializer or function prototype ("=" or "\\s\("). + ;; Note that the open paren will match array specs in + ;; square brackets, and we treat them as initializers too. + (c-syntactic-re-search-forward + "[;,]\\|\\s)\\|\\'\\|\\(=\\|\\s(\\)" limit t t)) + + (setq next-pos (match-beginning 0) + id-face (if (eq (char-after next-pos) ?\() + 'font-lock-function-name-face + 'font-lock-variable-name-face) + got-init (and (match-beginning 1) + (char-after (match-beginning 1)))) + + (if types + ;; Register and fontify the identifer as a type. + (let ((c-promote-possible-types t)) + (goto-char id-start) + (c-forward-type)) + ;; Fontify the last symbol in the identifier if it isn't fontified + ;; already. The check is necessary only in certain cases where this + ;; function is used "sloppily", e.g. in `c-simple-decl-matchers'. + (when (and c-last-identifier-range + (not (get-text-property (car c-last-identifier-range) + 'face))) + (c-put-font-lock-face (car c-last-identifier-range) + (cdr c-last-identifier-range) + id-face))) + + (goto-char next-pos) + (setq pos nil) + (when list + ;; Jump past any initializer or function prototype to see if + ;; there's a ',' to continue at. + + (cond ((eq id-face 'font-lock-function-name-face) + ;; Skip a parenthesized initializer (C++) or a function + ;; prototype. + (if (c-safe (c-forward-sexp 1) t) + (c-forward-syntactic-ws limit) + (goto-char limit))) + + (got-init + ;; Skip an initializer expression. If we're at a '=' + ;; then accept a brace list directly after it to cope + ;; with array initializers. Otherwise stop at braces + ;; to avoid going past full function and class blocks. + (and (if (and (eq got-init ?=) + (= (c-forward-token-2 nil nil limit) 0) + (looking-at "{")) + (c-safe + (let ((p (point))) + (c-forward-sexp) + (if (> (point) limit) + (goto-char p))) + t) + t) + (c-syntactic-re-search-forward "[;,{]" limit 'move t) + (backward-char))) + + (t (c-forward-syntactic-ws limit))) + + ;; If a ',' is found we set pos to the next declarator and iterate. + (when (and (< (point) limit) (looking-at ",")) + (c-put-char-property (point) 'c-type separator-prop) + (forward-char) + (c-forward-syntactic-ws limit) + (setq pos (point)))))) + nil)) diff --git a/tools/editor-modes/emacs/new-nesc.el b/tools/editor-modes/emacs/new-nesc.el new file mode 100644 index 0000000..a3dd801 --- /dev/null +++ b/tools/editor-modes/emacs/new-nesc.el @@ -0,0 +1,183 @@ +;; necs.el --- nesC mode + +;; Copyright (C) 2004 Intel Corporation + +;; Author: 2002 Martin Stjernholm +;; 2004 David Gay +;; Maintainer: David Gay +;; Created: March 2004 + +;; This file is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License Version 2 +;; as published by the Free Software Foundation. +;; +;; 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; see the file COPYING. If not, write to +;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. + +;;; Code: + +(require 'cc-mode) + +(if (string-match "^5.2[0-9]" c-version) + (error "cc-mode 5.30 or later required by this file")) + +;; These are only required at compile time to get the sources for the +;; language constants. (The cc-fonts require and the font-lock +;; related constants could additionally be put inside an +;; (eval-after-load "font-lock" ...) but then some trickery is +;; necessary to get them compiled.) +(eval-when-compile + (require 'cc-langs) + (require 'cc-fonts)) + +(eval-and-compile + ;; Make our mode known to the language constant system. Use C + ;; mode as the fallback for the constants we don't change here. + ;; This needs to be done also at compile time since the language + ;; constants are evaluated then. + (c-add-language 'nesc-mode 'c-mode) + ;; cc-mode 5.30.8 is buggy: + (if (not (get 'nesc-mode 'c-fallback-mode)) + (put 'nesc-mode 'c-fallback-mode 'c-mode))) + +(c-lang-defconst c-class-decl-kwds + nesc (append '("interface" "implementation" "nx_struct" "nx_union") + (c-lang-const c-class-decl-kwds))) + +(c-lang-defconst c-type-prefix-kwds + nesc (append '("nx_struct" "nx_union") + (c-lang-const c-type-prefix-kwds))) + +(c-lang-defconst c-block-decls-with-vars + nesc (append '("nx_struct" "nx_union") + (c-lang-const c-block-decls-with-vars))) + +(c-lang-defconst c-brace-list-decl-kwds + nesc (append '("module" "configuration" "provides" "uses") + (c-lang-const c-brace-list-decl-kwds))) + +(c-lang-defconst c-typeless-decl-kwds + nesc (append '("as" "components" "interface") + (c-lang-const c-typeless-decl-kwds))) + +(c-lang-defconst c-modifier-kwds + nesc (append '("command" "event" "task" "norace" "async") + (c-lang-const c-modifier-kwds))) + +(c-lang-defconst c-other-decl-kwds + nesc (append '("includes") (c-lang-const c-other-decl-kwds))) + +(c-lang-defconst c-other-kwds + nesc (append '("new") (c-lang-const c-other-kwds))) + +(c-lang-defconst c-block-stmt-1-kwds + nesc (append '("atomic") (c-lang-const c-block-stmt-1-kwds))) + +(c-lang-defconst c-recognize-knr-p nesc nil) + +;; This gives post, call, signal a slightly incorrect priority +(c-lang-defconst c-operators + nesc (append '((prefix "post" "call" "signal")) + ;; Note: need to ask specifically for the C operators + ;; as there are explicit tests for the C name in the + ;; c-operators constant specification... + (c-lang-const c-operators c))) + +(c-lang-defconst c-other-kwds + nesc (cons "abstract" (c-lang-const c-other-kwds))) + + +(defcustom nesc-font-lock-extra-types '("result_t" "bool" + "int8_t" "uint8_t" + "int16_t" "uint16_t" + "int32_t" "uint32_t") + "*List of extra types (aside from the type keywords) to recognize in nesC mode. +Each list item should be a regexp matching a single identifier.") + +(defconst nesc-font-lock-keywords-1 (c-lang-const c-matchers-1 nesc) + "Minimal highlighting for nesC mode.") + +(defconst nesc-font-lock-keywords-2 (c-lang-const c-matchers-2 nesc) + "Fast normal highlighting for nesC mode.") + +(defconst nesc-font-lock-keywords-3 (c-lang-const c-matchers-3 nesc) + "Accurate normal highlighting for nesC mode.") + +(defvar nesc-font-lock-keywords nesc-font-lock-keywords-3 + "Default expressions to highlight in nesC mode.") + +(defvar nesc-mode-syntax-table nil + "Syntax table used in nesc-mode buffers.") +(or nesc-mode-syntax-table + (setq nesc-mode-syntax-table + (funcall (c-lang-const c-make-mode-syntax-table nesc)))) + +(defvar nesc-mode-abbrev-table nil + "Abbreviation table used in nesc-mode buffers.") +(c-define-abbrev-table 'nesc-mode-abbrev-table + ;; Keywords that if they occur first on a line might alter the + ;; syntactic context, and which therefore should trig reindentation + ;; when they are completed. + '(("else" "else" c-electric-continued-statement 0) + ("while" "while" c-electric-continued-statement 0))) + +(defvar nesc-mode-map (let ((map (c-make-inherited-keymap))) + ;; Add bindings which are only useful for nesC + map) + "Keymap used in nesc-mode buffers.") + +(easy-menu-define nesc-menu nesc-mode-map "nesC Mode Commands" + ;; Can use `nesc' as the language for `c-mode-menu' + ;; since its definition covers any language. In + ;; this case the language is used to adapt to the + ;; nonexistence of a cpp pass and thus removing some + ;; irrelevant menu alternatives. + (cons "nesC" (c-lang-const c-mode-menu nesc))) + +;;;###autoload +(add-to-list 'auto-mode-alist '("\\.nc\\'" . nesc-mode)) + +;;;###autoload +(defun nesc-mode () + "Major mode for editing nesC (pronounced \"nes-see\") code. + +The hook `c-mode-common-hook' is run with no args at mode +initialization, then `nesc-mode-hook'. + +Key bindings: +\\{nesc-mode-map}" + (interactive) + (kill-all-local-variables) + (c-initialize-cc-mode t) + (set-syntax-table nesc-mode-syntax-table) + (setq major-mode 'nesc-mode + mode-name "nesC" + local-abbrev-table nesc-mode-abbrev-table + abbrev-mode t) + (use-local-map c-mode-map) + ;; `c-init-language-vars' is a macro that is expanded at compile + ;; time to a large `setq' with all the language variables and their + ;; customized values for our language. + (c-init-language-vars nesc-mode) + ;; `c-common-init' initializes most of the components of a CC Mode + ;; buffer, including setup of the mode menu, font-lock, etc. + ;; There's also a lower level routine `c-basic-common-init' that + ;; only makes the necessary initialization to get the syntactic + ;; analysis and similar things working. + (c-common-init 'nesc-mode) + (easy-menu-add nesc-menu) + (run-hooks 'c-mode-common-hook) + (run-hooks 'nesc-mode-hook) + (c-update-modeline)) + + +(provide 'nesc-mode) + +;;; new-nesc.el ends here diff --git a/tools/editor-modes/emacs/old-nesc.el b/tools/editor-modes/emacs/old-nesc.el new file mode 100644 index 0000000..747c477 --- /dev/null +++ b/tools/editor-modes/emacs/old-nesc.el @@ -0,0 +1,124 @@ +;;; necs.el --- nesC mode + +;; Copyright (C) 1985-2002 by Free Software Foundation, Inc. +;; Copyright (C) 2004 Intel Corporation + +;; Author: Dennis Haney +;; David Gay +;; Maintainer: David Gay +;; Keywords: c, languages + +;; This file is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License Version 2 +;; as published by the Free Software Foundation. + +;; This file 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 GNU Emacs; see the file COPYING. If not, write to +;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. + +;;; Commentary: + +;; + +;;; Code: + +(require 'cc-mode) + +(if (not (string-match "^5.2[0-9]" c-version)) + (error "cc-mode 5.30 and later not supported by this file")) + +(require 'font-lock) + +(defconst nesc-keywords + (eval-when-compile + (regexp-opt + '("abstract" "as" "atomic" "async" + "call" "command" "components" "configuration" + "event" "implementation" "interface" "includes" + "module" "norace" "nx_struct" "nx_union" "post" "provides" + "signal" "task" "uses" ) t))) + +(setq nesc-font-lock-keywords-1 + (list + `(eval . + (cons (concat "\\<" (,@ nesc-keywords) "\\>") 'font-lock-keyword-face)))) + +(defconst nesc-font-lock-keywords + (append nesc-font-lock-keywords-1 + c++-font-lock-keywords-2)) + +(defvar nesc-mode-abbrev-table nil + "Abbreviation table used in nesc-mode buffers.") +(define-abbrev-table 'nesc-mode-abbrev-table + '(("else" "else" c-electric-continued-statement 0) + ("while" "while" c-electric-continued-statement 0))) + +(defvar nesc-mode-map () + "Keymap used in nesc-mode buffers.") +(if nesc-mode-map + nil + (setq nesc-mode-map (c-make-inherited-keymap)) + ;; add bindings which are only useful for nesC + ) + +(easy-menu-define c-nesc-menu nesc-mode-map "nesC Mode Commands" + (c-mode-menu "nesC")) + +(defvar nesc-mode-syntax-table nil + "Syntax table used in nesc-mode buffers.") +(if nesc-mode-syntax-table + () + (setq nesc-mode-syntax-table (make-syntax-table)) + (c-populate-syntax-table nesc-mode-syntax-table)) + +(defconst c-nesC-comment-start-regexp c-C++-comment-start-regexp) +(defconst c-nesC-class-kwds "nx_struct\\|nx_union\\|struct\\|union\\|implementation") +(defconst c-nesC-class-key (c-paren-re c-nesC-class-kwds)) + +(defvar cc-imenu-nesc-generic-expression + cc-imenu-c-generic-expression + "Imenu generic expression for nesC mode. See `imenu-generic-expression'.") + +(defun nesc-mode () + "Major mode for editing nesC code." + (interactive) + (c-initialize-cc-mode) + (kill-all-local-variables) + (set-syntax-table nesc-mode-syntax-table) + (setq major-mode 'nesc-mode + mode-name "nesC" + local-abbrev-table nesc-mode-abbrev-table + abbrev-mode t + ; we have javadoc-style comments + c-append-paragraph-start c-Java-javadoc-paragraph-start) + (use-local-map nesc-mode-map) + (c-common-init) + (setq comment-start "// " + comment-end "" + c-keywords (c-identifier-re (concat c-C-keywords "\\|" nesc-keywords)) + c-conditional-key c-C-conditional-key + c-comment-start-regexp c-nesC-comment-start-regexp + c-class-key c-nesC-class-key + c-method-key nil + c-baseclass-key nil + c-recognize-knr-p nil + c-inexpr-class-key nil + ;defun-prompt-regexp c-nesC-defun-prompt-regexp + ) + (cc-imenu-init cc-imenu-nesc-generic-expression) + (make-local-variable 'font-lock-defaults) + (setq font-lock-defaults + '(nesc-font-lock-keywords nil t)) + (run-hooks 'c-mode-common-hook) + (run-hooks 'nesc-mode-hook) + (c-update-modeline)) + +(provide 'nesc-mode) + +;;; necs.el ends here diff --git a/tools/editor-modes/emacs/readme.txt b/tools/editor-modes/emacs/readme.txt new file mode 100644 index 0000000..7a90b68 --- /dev/null +++ b/tools/editor-modes/emacs/readme.txt @@ -0,0 +1,15 @@ +This nesC mode supports both cc-mode 5.28 and 5.30.x, so should work with +both emacs and xemacs. Send bug reports (with full emacs and cc-mode version +details) to dgay@intel-research.net. The cc-mode version can be found +by executing `M-x c-version'. + +To use this nesC mode for emacs, you need to: +- copy *nesc.el to some directory X (I use ~/lib/emacs/lisp) +- add the following to your .emacs file: + +(setq load-path (cons (expand-file-name "X") load-path)) +(autoload 'nesc-mode "nesc.el") +(add-to-list 'auto-mode-alist '("\\.nc\\'" . nesc-mode)) + +David Gay +dgay@intel-research.net diff --git a/tools/editor-modes/gedit/ncc.lang b/tools/editor-modes/gedit/ncc.lang new file mode 100644 index 0000000..6203f8f --- /dev/null +++ b/tools/editor-modes/gedit/ncc.lang @@ -0,0 +1,87 @@ + + + + + application/x-netcdf;text/x-chdr;text/x-csrc;text/plain + *.nc + // + /* + */ + + + +